commit 44f31f8b9f700d50b885122ec9a1cf7bcd493c80 Author: Danil Kovtonyuk Date: Fri Apr 22 13:05:56 2022 +1000 init diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..84c2e57 --- /dev/null +++ b/.babelrc @@ -0,0 +1,16 @@ +{ + "env": { + "test": { + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "current" + } + } + ] + ] + } + } +} diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..434d682 --- /dev/null +++ b/.env.example @@ -0,0 +1,15 @@ +PINATA_API_KEY= +PINATA_SECRET_API_KEY= + +INFURA_KEY= + +ALCHEMY_MAINNET_KEY= +ALCHEMY_POLYGON_KEY= +ALCHEMY_OPTIMISM_KEY= +ALCHEMY_ARBITRUM_KEY= +ALCHEMY_GOERLI_KEY= + +WC_BRIDGE= + +STORE_NAME= +APP_ENS_NAME= diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..3b63a4a --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,20 @@ +module.exports = { + root: true, + env: { + browser: true, + node: true, + es2020: true + }, + parserOptions: { + parser: 'babel-eslint' + }, + extends: ['@nuxtjs', 'plugin:nuxt/recommended', 'plugin:prettier/recommended', 'prettier', 'prettier/vue'], + plugins: ['prettier'], + // add your custom rules here + rules: { + 'prettier/prettier': ['error', { printWidth: 110 }], + 'no-async-promise-executor': 'off', + 'vue/comment-directive': 'off', + 'no-console': 'off' + } +} diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml new file mode 100644 index 0000000..8b02d5d --- /dev/null +++ b/.github/workflows/nodejs.yml @@ -0,0 +1,142 @@ +# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + branches: [master] + +jobs: + cleanup: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Remove old artifacts + uses: c-hive/gha-remove-artifacts@v1 + with: + age: 0 days + skip-tags: true + skip-recent: 2 + + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 14 + - run: yarn install + - name: Linting JS + run: yarn lint + - name: Build + run: yarn generate + env: + INFURA_KEY: ${{ secrets.INFURA_KEY }} + ALCHEMY_MAINNET_KEY: ${{ secrets.ALCHEMY_MAINNET_KEY }} + ALCHEMY_POLYGON_KEY: ${{ secrets.ALCHEMY_POLYGON_KEY }} + ALCHEMY_OPTIMISM_KEY: ${{ secrets.ALCHEMY_OPTIMISM_KEY }} + ALCHEMY_ARBITRUM_KEY: ${{ secrets.ALCHEMY_ARBITRUM_KEY }} + ALCHEMY_GOERLI_KEY: ${{ secrets.ALCHEMY_GOERLI_KEY }} + WC_BRIDGE: ${{ secrets.WC_BRIDGE }} + OLD_STORE_NAME: ${{ secrets.OLD_STORE_NAME }} + STORE_NAME: ${{ secrets.STORE_NAME }} + APP_ENS_NAME: ${{ secrets.APP_ENS_NAME }} + - name: Upload artefact + uses: actions/upload-artifact@v1.0.0 + with: + name: dist + path: dist + + deploy-minified: + runs-on: ubuntu-latest + needs: build + steps: + - name: Download artifact `dist` + uses: actions/download-artifact@v1 + with: + name: dist + - name: Add SSH key + uses: webfactory/ssh-agent@v0.2.0 + env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + - name: Add git remote + run: | + git init + git config --local user.email "actions@github.com" + git config --local user.name "GitHub" + echo dist > .gitignore && git add .gitignore && git commit -m push-dir + git remote add ui git@github.com:tornadocash/ui-minified.git + - name: Deploying... + run: npx push-dir --dir=dist --branch=master --cleanup --remote=ui + + deploy-docker: + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@v2 + - name: Download artifact `dist` + uses: actions/download-artifact@v1 + with: + name: dist + - name: Build and push Docker image + uses: docker/build-push-action@v1.1.0 + with: + path: dist + dockerfile: Dockerfile + repository: tornadocash/ui + tags: latest + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_TOKEN }} + + deploy-ipfs: + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 14 + - run: yarn install + - name: Download artifact `dist` + uses: actions/download-artifact@v1 + with: + name: dist + - name: Upload to IPFS + id: upload + run: yarn ipfsUpload dist + env: + PINATA_API_KEY: ${{ secrets.PINATA_API_KEY }} + PINATA_SECRET_API_KEY: ${{ secrets.PINATA_SECRET_API_KEY }} + + notify: + runs-on: ubuntu-latest + if: always() + needs: + - deploy-minified + - deploy-docker + - deploy-ipfs + steps: + # ${{ env.WORKFLOW_CONCLUSION }} # neutral, success, cancelled, timed_out, failure + - uses: technote-space/workflow-conclusion-action@v2 + - name: Set short SHA + id: vars + run: echo "::set-output name=sha_short::$(echo ${GITHUB_SHA:0:7})" + - name: Telegram Message Notify + uses: appleboy/telegram-action@v0.1.1 + if: ${{ env.WORKFLOW_CONCLUSION == 'success' }} + with: + to: ${{ secrets.TELEGRAM_CHAT_ID }} + token: ${{ secrets.TELEGRAM_BOT_TOKEN}} + message: 🚀 Deployed commit [${{ steps.vars.outputs.sha_short }}](https://github.com/tornadocash/tornado-cash-ui/commit/${{ github.sha }}) of tornado.cash UI + format: markdown + - name: Telegram Failure Notification + uses: appleboy/telegram-action@v0.1.1 + if: ${{ env.WORKFLOW_CONCLUSION == 'failure' || env.WORKFLOW_CONCLUSION == 'timed_out' || env.WORKFLOW_CONCLUSION == 'neutral' }} + with: + message: ❗ Build failed for [${{ github.repository }}](https://github.com/${{ github.repository }}/actions) because of ${{ github.actor }} + format: markdown + to: ${{ secrets.TELEGRAM_CHAT_ID }} + token: ${{ secrets.TELEGRAM_BOT_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8d22b19 --- /dev/null +++ b/.gitignore @@ -0,0 +1,89 @@ +# Created by .ignore support plugin (hsz.mobi) +### Node template +# Logs +.vscode +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# Nuxt generate +dist + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + +# IDE / Editor +.idea +.editorconfig + +# Service worker +sw.* + +# Mac OSX +.DS_Store diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..8351c19 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +14 diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..19d94ee --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "arrowParens": "always", + "singleQuote": true, + "printWidth": 110 +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..466058f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,3 @@ +FROM nginx:alpine +RUN rm /usr/share/nginx/html/* +COPY . /usr/share/nginx/html diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7e5cbe5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Tornado Cash + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..313e104 --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# tornadocash ui + +> UI for non-custodial Ethereum Privacy solution + +## Build Setup + +```bash +# install dependencies +$ yarn install + +# serve with hot reload at localhost:3000 +$ yarn dev + +# build for production and launch server +$ yarn build +$ yarn start + +# generate static project +$ yarn generate +``` + +For detailed explanation on how things work, checkout [Nuxt.js docs](https://nuxtjs.org). diff --git a/abis/Aggregator.abi.json b/abis/Aggregator.abi.json new file mode 100644 index 0000000..9f5c24c --- /dev/null +++ b/abis/Aggregator.abi.json @@ -0,0 +1,208 @@ +[ + { + "inputs": [], + "name": "ensRegistry", + "outputs": [ + { + "internalType": "contract ENSRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract Governance", + "name": "governance", + "type": "address" + } + ], + "name": "getAllProposals", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "forVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "againstVotes", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "executed", + "type": "bool" + }, + { + "internalType": "bool", + "name": "extended", + "type": "bool" + }, + { + "internalType": "enum Governance.ProposalState", + "name": "state", + "type": "uint8" + } + ], + "internalType": "struct GovernanceAggregator.Proposal[]", + "name": "proposals", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract Governance", + "name": "governance", + "type": "address" + }, + { + "internalType": "address[]", + "name": "accs", + "type": "address[]" + } + ], + "name": "getGovernanceBalances", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract Governance", + "name": "governance", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getUserData", + "outputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "latestProposalId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "latestProposalIdState", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timelock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "delegatee", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "relayerRegistry", + "outputs": [ + { + "internalType": "contract RelayerRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_relayers", + "type": "bytes32[]" + }, + { + "internalType": "string[]", + "name": "_subdomains", + "type": "string[]" + } + ], + "name": "relayersData", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isRegistered", + "type": "bool" + }, + { + "internalType": "string[20]", + "name": "records", + "type": "string[20]" + } + ], + "internalType": "struct Relayer[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/abis/ENS.abi.json b/abis/ENS.abi.json new file mode 100644 index 0000000..aaa475f --- /dev/null +++ b/abis/ENS.abi.json @@ -0,0 +1,681 @@ +[ + { + "constant": true, + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceID", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "internalType": "string", + "name": "value", + "type": "string" + } + ], + "name": "setText", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "bytes4", + "name": "interfaceID", + "type": "bytes4" + } + ], + "name": "interfaceImplementer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "contentTypes", + "type": "uint256" + } + ], + "name": "ABI", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "x", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "y", + "type": "bytes32" + } + ], + "name": "setPubkey", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "hash", + "type": "bytes" + } + ], + "name": "setContenthash", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + } + ], + "name": "addr", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "bool", + "name": "isAuthorised", + "type": "bool" + } + ], + "name": "setAuthorisation", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "key", + "type": "string" + } + ], + "name": "text", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "contentType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "setABI", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + } + ], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "setName", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "coinType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "a", + "type": "bytes" + } + ], + "name": "setAddr", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + } + ], + "name": "contenthash", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + } + ], + "name": "pubkey", + "outputs": [ + { + "internalType": "bytes32", + "name": "x", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "y", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "a", + "type": "address" + } + ], + "name": "setAddr", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "bytes4", + "name": "interfaceID", + "type": "bytes4" + }, + { + "internalType": "address", + "name": "implementer", + "type": "address" + } + ], + "name": "setInterface", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "coinType", + "type": "uint256" + } + ], + "name": "addr", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "authorisations", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ENS", + "name": "_ens", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isAuthorised", + "type": "bool" + } + ], + "name": "AuthorisationChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "indexedKey", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "key", + "type": "string" + } + ], + "name": "TextChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "x", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "y", + "type": "bytes32" + } + ], + "name": "PubkeyChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "NameChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes4", + "name": "interfaceID", + "type": "bytes4" + }, + { + "indexed": false, + "internalType": "address", + "name": "implementer", + "type": "address" + } + ], + "name": "InterfaceChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "hash", + "type": "bytes" + } + ], + "name": "ContenthashChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "a", + "type": "address" + } + ], + "name": "AddrChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "coinType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "newAddress", + "type": "bytes" + } + ], + "name": "AddressChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "contentType", + "type": "uint256" + } + ], + "name": "ABIChanged", + "type": "event" + } +] diff --git a/abis/ERC20.abi.json b/abis/ERC20.abi.json new file mode 100644 index 0000000..0e474b5 --- /dev/null +++ b/abis/ERC20.abi.json @@ -0,0 +1,228 @@ +[ + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "_totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "who", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "owner", "type": "address" }, + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" }, + { "internalType": "uint256", "name": "deadline", "type": "uint256" }, + { "internalType": "uint8", "name": "v", "type": "uint8" }, + { "internalType": "bytes32", "name": "r", "type": "bytes32" }, + { "internalType": "bytes32", "name": "s", "type": "bytes32" } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/abis/Governance.abi.json b/abis/Governance.abi.json new file mode 100644 index 0000000..2bd3a40 --- /dev/null +++ b/abis/Governance.abi.json @@ -0,0 +1,422 @@ +[ + { + "inputs": [ + { "internalType": "address", "name": "_gasCompLogic", "type": "address" }, + { "internalType": "address", "name": "_userVault", "type": "address" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "to", "type": "address" } + ], + "name": "Delegated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, + { "indexed": true, "internalType": "address", "name": "proposer", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "target", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "indexed": false, "internalType": "string", "name": "description", "type": "string" } + ], + "name": "ProposalCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": true, "internalType": "uint256", "name": "proposalId", "type": "uint256" }], + "name": "ProposalExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "from", "type": "address" } + ], + "name": "Undelegated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "uint256", "name": "proposalId", "type": "uint256" }, + { "indexed": true, "internalType": "address", "name": "voter", "type": "address" }, + { "indexed": true, "internalType": "bool", "name": "support", "type": "bool" }, + { "indexed": false, "internalType": "uint256", "name": "votes", "type": "uint256" } + ], + "name": "Voted", + "type": "event" + }, + { + "inputs": [], + "name": "CLOSING_PERIOD", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXECUTION_DELAY", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXECUTION_EXPIRATION", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PROPOSAL_THRESHOLD", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "QUORUM_VOTES", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VOTE_EXTEND_TIME", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VOTING_DELAY", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VOTING_PERIOD", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "bytes32[]", "name": "domains", "type": "bytes32[]" }], + "name": "bulkResolve", + "outputs": [{ "internalType": "address[]", "name": "result", "type": "address[]" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "canWithdrawAfter", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address[]", "name": "from", "type": "address[]" }, + { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, + { "internalType": "bool", "name": "support", "type": "bool" } + ], + "name": "castDelegatedVote", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, + { "internalType": "bool", "name": "support", "type": "bool" } + ], + "name": "castVote", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "proposalId", "type": "uint256" }], + "name": "checkIfQuorumReached", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "to", "type": "address" }], + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "delegatedTo", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "proposalId", "type": "uint256" }], + "name": "execute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "gasCompensationVault", + "outputs": [{ "internalType": "contract IGasCompensationVault", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, + { "internalType": "address", "name": "voter", "type": "address" } + ], + "name": "getReceipt", + "outputs": [ + { + "components": [ + { "internalType": "bool", "name": "hasVoted", "type": "bool" }, + { "internalType": "bool", "name": "support", "type": "bool" }, + { "internalType": "uint256", "name": "votes", "type": "uint256" } + ], + "internalType": "struct Governance.Receipt", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, + { "internalType": "address", "name": "account", "type": "address" } + ], + "name": "hasAccountVoted", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "bytes32", "name": "_torn", "type": "bytes32" }], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "latestProposalIds", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "owner", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" }, + { "internalType": "uint256", "name": "deadline", "type": "uint256" }, + { "internalType": "uint8", "name": "v", "type": "uint8" }, + { "internalType": "bytes32", "name": "r", "type": "bytes32" }, + { "internalType": "bytes32", "name": "s", "type": "bytes32" } + ], + "name": "lock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], + "name": "lockWithApproval", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "lockedBalance", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proposalCount", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "name": "proposals", + "outputs": [ + { "internalType": "address", "name": "proposer", "type": "address" }, + { "internalType": "address", "name": "target", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "forVotes", "type": "uint256" }, + { "internalType": "uint256", "name": "againstVotes", "type": "uint256" }, + { "internalType": "bool", "name": "executed", "type": "bool" }, + { "internalType": "bool", "name": "extended", "type": "bool" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "target", "type": "address" }, + { "internalType": "string", "name": "description", "type": "string" } + ], + "name": "propose", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "target", "type": "address" }, + { "internalType": "string", "name": "description", "type": "string" } + ], + "name": "proposeByDelegate", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "bytes32", "name": "node", "type": "bytes32" }], + "name": "resolve", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "returnMultisigAddress", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "closingPeriod", "type": "uint256" }], + "name": "setClosingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "executionDelay", "type": "uint256" }], + "name": "setExecutionDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "executionExpiration", "type": "uint256" }], + "name": "setExecutionExpiration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "gasCompensationsLimit", "type": "uint256" }], + "name": "setGasCompensations", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "proposalThreshold", "type": "uint256" }], + "name": "setProposalThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "quorumVotes", "type": "uint256" }], + "name": "setQuorumVotes", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "voteExtendTime", "type": "uint256" }], + "name": "setVoteExtendTime", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "votingDelay", "type": "uint256" }], + "name": "setVotingDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "votingPeriod", "type": "uint256" }], + "name": "setVotingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "proposalId", "type": "uint256" }], + "name": "state", + "outputs": [{ "internalType": "enum Governance.ProposalState", "name": "", "type": "uint8" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "torn", + "outputs": [{ "internalType": "contract TORN", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { "inputs": [], "name": "undelegate", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], + "name": "unlock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "userVault", + "outputs": [{ "internalType": "contract ITornadoVault", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], + "name": "withdrawFromHelper", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { "stateMutability": "payable", "type": "receive" } +] diff --git a/abis/Instance.abi.json b/abis/Instance.abi.json new file mode 100644 index 0000000..0f5a18e --- /dev/null +++ b/abis/Instance.abi.json @@ -0,0 +1,519 @@ +[ + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_newOperator", + "type": "address" + } + ], + "name": "changeOperator", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "nullifierHashes", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_root", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_nullifierHash", + "type": "bytes32" + }, + { + "internalType": "address payable", + "name": "_recipient", + "type": "address" + }, + { + "internalType": "address payable", + "name": "_relayer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_refund", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "verifier", + "outputs": [ + { + "internalType": "contract IVerifier", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "_left", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_right", + "type": "bytes32" + } + ], + "name": "hashLeftRight", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "FIELD_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "levels", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "operator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "_root", + "type": "bytes32" + } + ], + "name": "isKnownRoot", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "commitments", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "denomination", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "currentRootIndex", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_newVerifier", + "type": "address" + } + ], + "name": "updateVerifier", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_nullifierHashes", + "type": "bytes32[]" + } + ], + "name": "isSpentArray", + "outputs": [ + { + "internalType": "bool[]", + "name": "spent", + "type": "bool[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "bytes32", + "name": "_commitment", + "type": "bytes32" + } + ], + "name": "deposit", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getLastRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "roots", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "ROOT_HISTORY_SIZE", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "_nullifierHash", + "type": "bytes32" + } + ], + "name": "isSpent", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "zeros", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "ZERO_VALUE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "filledSubtrees", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "nextIndex", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVerifier", + "name": "_verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_denomination", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "_merkleTreeHeight", + "type": "uint32" + }, + { + "internalType": "address", + "name": "_operator", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "commitment", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "leafIndex", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "nullifierHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + } +] \ No newline at end of file diff --git a/abis/Multicall.json b/abis/Multicall.json new file mode 100644 index 0000000..b2720f3 --- /dev/null +++ b/abis/Multicall.json @@ -0,0 +1,86 @@ +[ + { + "constant": true, + "inputs": [], + "name": "getCurrentBlockTimestamp", + "outputs": [{ "name": "timestamp", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "components": [ + { "name": "target", "type": "address" }, + { "name": "callData", "type": "bytes" } + ], + "name": "calls", + "type": "tuple[]" + } + ], + "name": "aggregate", + "outputs": [ + { "name": "blockNumber", "type": "uint256" }, + { "name": "returnData", "type": "bytes[]" } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getLastBlockHash", + "outputs": [{ "name": "blockHash", "type": "bytes32" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "addr", "type": "address" }], + "name": "getEthBalance", + "outputs": [{ "name": "balance", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getCurrentBlockDifficulty", + "outputs": [{ "name": "difficulty", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getCurrentBlockGasLimit", + "outputs": [{ "name": "gaslimit", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getCurrentBlockCoinbase", + "outputs": [{ "name": "coinbase", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "blockNumber", "type": "uint256" }], + "name": "getBlockHash", + "outputs": [{ "name": "blockHash", "type": "bytes32" }], + "payable": false, + "stateMutability": "view", + "type": "function" + } +] diff --git a/abis/OffchainOracle.abi.json b/abis/OffchainOracle.abi.json new file mode 100644 index 0000000..57b2d2a --- /dev/null +++ b/abis/OffchainOracle.abi.json @@ -0,0 +1,181 @@ +[ + { + "inputs": [ + { "internalType": "contract MultiWrapper", "name": "_multiWrapper", "type": "address" }, + { "internalType": "contract IOracle[]", "name": "existingOracles", "type": "address[]" }, + { "internalType": "enum OffchainOracle.OracleType[]", "name": "oracleTypes", "type": "uint8[]" }, + { "internalType": "contract IERC20[]", "name": "existingConnectors", "type": "address[]" }, + { "internalType": "contract IERC20", "name": "wBase", "type": "address" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract IERC20", "name": "connector", "type": "address" } + ], + "name": "ConnectorAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract IERC20", "name": "connector", "type": "address" } + ], + "name": "ConnectorRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract MultiWrapper", "name": "multiWrapper", "type": "address" } + ], + "name": "MultiWrapperUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract IOracle", "name": "oracle", "type": "address" }, + { + "indexed": false, + "internalType": "enum OffchainOracle.OracleType", + "name": "oracleType", + "type": "uint8" + } + ], + "name": "OracleAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract IOracle", "name": "oracle", "type": "address" }, + { + "indexed": false, + "internalType": "enum OffchainOracle.OracleType", + "name": "oracleType", + "type": "uint8" + } + ], + "name": "OracleRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [{ "internalType": "contract IERC20", "name": "connector", "type": "address" }], + "name": "addConnector", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "contract IOracle", "name": "oracle", "type": "address" }, + { "internalType": "enum OffchainOracle.OracleType", "name": "oracleKind", "type": "uint8" } + ], + "name": "addOracle", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "connectors", + "outputs": [{ "internalType": "contract IERC20[]", "name": "allConnectors", "type": "address[]" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "contract IERC20", "name": "srcToken", "type": "address" }, + { "internalType": "contract IERC20", "name": "dstToken", "type": "address" }, + { "internalType": "bool", "name": "useWrappers", "type": "bool" } + ], + "name": "getRate", + "outputs": [{ "internalType": "uint256", "name": "weightedRate", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "contract IERC20", "name": "srcToken", "type": "address" }, + { "internalType": "bool", "name": "useSrcWrappers", "type": "bool" } + ], + "name": "getRateToEth", + "outputs": [{ "internalType": "uint256", "name": "weightedRate", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "multiWrapper", + "outputs": [{ "internalType": "contract MultiWrapper", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "oracles", + "outputs": [ + { "internalType": "contract IOracle[]", "name": "allOracles", "type": "address[]" }, + { "internalType": "enum OffchainOracle.OracleType[]", "name": "oracleTypes", "type": "uint8[]" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "contract IERC20", "name": "connector", "type": "address" }], + "name": "removeConnector", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "contract IOracle", "name": "oracle", "type": "address" }, + { "internalType": "enum OffchainOracle.OracleType", "name": "oracleKind", "type": "uint8" } + ], + "name": "removeOracle", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "contract MultiWrapper", "name": "_multiWrapper", "type": "address" }], + "name": "setMultiWrapper", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/abis/RelayerRegistry.abi.json b/abis/RelayerRegistry.abi.json new file mode 100644 index 0000000..6886afb --- /dev/null +++ b/abis/RelayerRegistry.abi.json @@ -0,0 +1,670 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_torn", + "type": "address" + }, + { + "internalType": "address", + "name": "_governance", + "type": "address" + }, + { + "internalType": "address", + "name": "_ens", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_staking", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_feeManager", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "minStakeAmount", + "type": "uint256" + } + ], + "name": "MinimumStakeAmount", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "relayer", + "type": "address" + } + ], + "name": "RelayerBalanceNullified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "relayer", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "ensName", + "type": "string" + }, + { + "indexed": false, + "internalType": "address", + "name": "relayerAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakedAmount", + "type": "uint256" + } + ], + "name": "RelayerRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "tornadoRouter", + "type": "address" + } + ], + "name": "RouterRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountStakeAdded", + "type": "uint256" + } + ], + "name": "StakeAddedToRelayer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountBurned", + "type": "uint256" + } + ], + "name": "StakeBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "worker", + "type": "address" + } + ], + "name": "WorkerRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "worker", + "type": "address" + } + ], + "name": "WorkerUnregistered", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "domains", + "type": "bytes32[]" + } + ], + "name": "bulkResolve", + "outputs": [ + { + "internalType": "address[]", + "name": "result", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "internalType": "contract ITornadoInstance", + "name": "pool", + "type": "address" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ens", + "outputs": [ + { + "internalType": "contract IENS", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feeManager", + "outputs": [ + { + "internalType": "contract FeeManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayer", + "type": "address" + } + ], + "name": "getRelayerBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayer", + "type": "address" + } + ], + "name": "getRelayerEnsHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "governance", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_tornadoRouter", + "type": "bytes32" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "toResolve", + "type": "address" + } + ], + "name": "isRelayer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "internalType": "address", + "name": "toResolve", + "type": "address" + } + ], + "name": "isRelayerRegistered", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayer", + "type": "address" + } + ], + "name": "nullifyBalance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "ensName", + "type": "string" + }, + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "workersToRegister", + "type": "address[]" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "ensName", + "type": "string" + }, + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "workersToRegister", + "type": "address[]" + }, + { + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "registerPermit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "internalType": "address", + "name": "worker", + "type": "address" + } + ], + "name": "registerWorker", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "relayers", + "outputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "ensHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minAmount", + "type": "uint256" + } + ], + "name": "setMinStakeAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tornadoRouterAddress", + "type": "address" + } + ], + "name": "setTornadoRouter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + } + ], + "name": "stakeToRelayer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "stakeToRelayerPermit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "staking", + "outputs": [ + { + "internalType": "contract ITornadoStakingRewards", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "torn", + "outputs": [ + { + "internalType": "contract TORN", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "tornadoRouter", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "worker", + "type": "address" + } + ], + "name": "unregisterWorker", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "workers", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/abis/SanctionsList.abi.json b/abis/SanctionsList.abi.json new file mode 100644 index 0000000..d6f009c --- /dev/null +++ b/abis/SanctionsList.abi.json @@ -0,0 +1,92 @@ +[ + { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, + { + "anonymous": false, + "inputs": [{ "indexed": true, "internalType": "address", "name": "addr", "type": "address" }], + "name": "NonSanctionedAddress", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": true, "internalType": "address", "name": "addr", "type": "address" }], + "name": "SanctionedAddress", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address[]", "name": "addrs", "type": "address[]" }], + "name": "SanctionedAddressesAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address[]", "name": "addrs", "type": "address[]" }], + "name": "SanctionedAddressesRemoved", + "type": "event" + }, + { + "inputs": [{ "internalType": "address[]", "name": "newSanctions", "type": "address[]" }], + "name": "addToSanctionsList", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }], + "name": "isSanctioned", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }], + "name": "isSanctionedVerbose", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address[]", "name": "removeSanctions", "type": "address[]" }], + "name": "removeFromSanctionsList", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/abis/TornadoProxy.abi.json b/abis/TornadoProxy.abi.json new file mode 100644 index 0000000..8e6a9a9 --- /dev/null +++ b/abis/TornadoProxy.abi.json @@ -0,0 +1,237 @@ +[ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_tornadoTrees", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_governance", + "type": "bytes32" + }, + { + "internalType": "bytes32[]", + "name": "_instances", + "type": "bytes32[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "encryptedNote", + "type": "bytes" + } + ], + "name": "EncryptedNote", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "domains", + "type": "bytes32[]" + } + ], + "name": "bulkResolve", + "outputs": [ + { + "internalType": "address[]", + "name": "result", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "governance", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITornadoInstance", + "name": "", + "type": "address" + } + ], + "name": "instances", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "tornadoTrees", + "outputs": [ + { + "internalType": "contract ITornadoTrees", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITornadoInstance", + "name": "_tornado", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_commitment", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_encryptedNote", + "type": "bytes" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITornadoInstance", + "name": "_instance", + "type": "address" + }, + { + "internalType": "bool", + "name": "_update", + "type": "bool" + } + ], + "name": "updateInstance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITornadoInstance", + "name": "_tornado", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_root", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_nullifierHash", + "type": "bytes32" + }, + { + "internalType": "address payable", + "name": "_recipient", + "type": "address" + }, + { + "internalType": "address payable", + "name": "_relayer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_refund", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "_token", + "type": "address" + }, + { + "internalType": "address payable", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_balance", + "type": "uint256" + } + ], + "name": "rescueTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/abis/TornadoStakingRewards.abi.json b/abis/TornadoStakingRewards.abi.json new file mode 100644 index 0000000..c28d5bf --- /dev/null +++ b/abis/TornadoStakingRewards.abi.json @@ -0,0 +1,272 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "governanceAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "tornAddress", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_relayerRegistry", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rewardsClaimed", + "type": "uint256" + } + ], + "name": "RewardsClaimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "name": "RewardsUpdated", + "type": "event" + }, + { + "inputs": [], + "name": "Governance", + "outputs": [ + { + "internalType": "contract ITornadoGovernance", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "accumulatedRewardPerTorn", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "accumulatedRewardRateOnLastUpdate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "accumulatedRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "addBurnRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "domains", + "type": "bytes32[]" + } + ], + "name": "bulkResolve", + "outputs": [ + { + "internalType": "address[]", + "name": "result", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "checkReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ratioConstant", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "relayerRegistry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "torn", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountLockedBeforehand", + "type": "uint256" + } + ], + "name": "updateRewardsOnLockedBalanceChange", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawTorn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/app.html b/app.html new file mode 100644 index 0000000..f1c0947 --- /dev/null +++ b/app.html @@ -0,0 +1,39 @@ + + + + + {{ HEAD }} + + + {{ APP }} + + diff --git a/assets/README.md b/assets/README.md new file mode 100644 index 0000000..34766f9 --- /dev/null +++ b/assets/README.md @@ -0,0 +1,7 @@ +# ASSETS + +**This directory is not required, you can delete it if you don't want to use it.** + +This directory contains your un-compiled assets such as LESS, SASS, or JavaScript. + +More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#webpacked). diff --git a/assets/fonts/PTMono-Bold.woff2 b/assets/fonts/PTMono-Bold.woff2 new file mode 100644 index 0000000..ba69997 Binary files /dev/null and b/assets/fonts/PTMono-Bold.woff2 differ diff --git a/assets/fonts/PTMono-Regular.woff2 b/assets/fonts/PTMono-Regular.woff2 new file mode 100644 index 0000000..f602488 Binary files /dev/null and b/assets/fonts/PTMono-Regular.woff2 differ diff --git a/assets/img/ethereum.svg b/assets/img/ethereum.svg new file mode 100644 index 0000000..89593bd --- /dev/null +++ b/assets/img/ethereum.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/img/flags/cn.svg b/assets/img/flags/cn.svg new file mode 100644 index 0000000..d220c3d --- /dev/null +++ b/assets/img/flags/cn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/flags/es.svg b/assets/img/flags/es.svg new file mode 100644 index 0000000..72d4aec --- /dev/null +++ b/assets/img/flags/es.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/flags/fr.svg b/assets/img/flags/fr.svg new file mode 100644 index 0000000..66958f0 --- /dev/null +++ b/assets/img/flags/fr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/flags/gb.svg b/assets/img/flags/gb.svg new file mode 100644 index 0000000..8c99653 --- /dev/null +++ b/assets/img/flags/gb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/flags/ru.svg b/assets/img/flags/ru.svg new file mode 100644 index 0000000..b59ecab --- /dev/null +++ b/assets/img/flags/ru.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/flags/tr.svg b/assets/img/flags/tr.svg new file mode 100644 index 0000000..f4c325d --- /dev/null +++ b/assets/img/flags/tr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/flags/uk.svg b/assets/img/flags/uk.svg new file mode 100644 index 0000000..ccd0a81 --- /dev/null +++ b/assets/img/flags/uk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/icons/account.svg b/assets/img/icons/account.svg new file mode 100644 index 0000000..013125d --- /dev/null +++ b/assets/img/icons/account.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/img/icons/account/balance.svg b/assets/img/icons/account/balance.svg new file mode 100644 index 0000000..4f8006d --- /dev/null +++ b/assets/img/icons/account/balance.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/img/icons/account/file.svg b/assets/img/icons/account/file.svg new file mode 100644 index 0000000..c4321b8 --- /dev/null +++ b/assets/img/icons/account/file.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/assets/img/icons/account/key.svg b/assets/img/icons/account/key.svg new file mode 100644 index 0000000..2e11770 --- /dev/null +++ b/assets/img/icons/account/key.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/img/icons/account/notes.svg b/assets/img/icons/account/notes.svg new file mode 100644 index 0000000..8893dba --- /dev/null +++ b/assets/img/icons/account/notes.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/img/icons/account/raw.svg b/assets/img/icons/account/raw.svg new file mode 100644 index 0000000..89bfcc9 --- /dev/null +++ b/assets/img/icons/account/raw.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/img/icons/account/recover.svg b/assets/img/icons/account/recover.svg new file mode 100644 index 0000000..5cad9c7 --- /dev/null +++ b/assets/img/icons/account/recover.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/img/icons/account/remove.svg b/assets/img/icons/account/remove.svg new file mode 100644 index 0000000..17926d5 --- /dev/null +++ b/assets/img/icons/account/remove.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/img/icons/account/rpc.svg b/assets/img/icons/account/rpc.svg new file mode 100644 index 0000000..473094f --- /dev/null +++ b/assets/img/icons/account/rpc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/img/icons/account/setup.svg b/assets/img/icons/account/setup.svg new file mode 100644 index 0000000..561baee --- /dev/null +++ b/assets/img/icons/account/setup.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/img/icons/account/wallet.svg b/assets/img/icons/account/wallet.svg new file mode 100644 index 0000000..af64015 --- /dev/null +++ b/assets/img/icons/account/wallet.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/img/icons/alert.svg b/assets/img/icons/alert.svg new file mode 100644 index 0000000..e2c8f0e --- /dev/null +++ b/assets/img/icons/alert.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/arbitrum.svg b/assets/img/icons/arbitrum.svg new file mode 100644 index 0000000..0cd76cb --- /dev/null +++ b/assets/img/icons/arbitrum.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/arrow-down.svg b/assets/img/icons/arrow-down.svg new file mode 100644 index 0000000..86ea66d --- /dev/null +++ b/assets/img/icons/arrow-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/arrow-left.svg b/assets/img/icons/arrow-left.svg new file mode 100644 index 0000000..2e67d17 --- /dev/null +++ b/assets/img/icons/arrow-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/arrow-up-down.svg b/assets/img/icons/arrow-up-down.svg new file mode 100644 index 0000000..73a2892 --- /dev/null +++ b/assets/img/icons/arrow-up-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/arrow-up.svg b/assets/img/icons/arrow-up.svg new file mode 100644 index 0000000..ba9eb81 --- /dev/null +++ b/assets/img/icons/arrow-up.svg @@ -0,0 +1 @@ + diff --git a/assets/img/icons/arrow.svg b/assets/img/icons/arrow.svg new file mode 100644 index 0000000..4e2fb14 --- /dev/null +++ b/assets/img/icons/arrow.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/img/icons/astronaut.svg b/assets/img/icons/astronaut.svg new file mode 100644 index 0000000..b835103 --- /dev/null +++ b/assets/img/icons/astronaut.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/img/icons/avalanche.svg b/assets/img/icons/avalanche.svg new file mode 100644 index 0000000..694674b --- /dev/null +++ b/assets/img/icons/avalanche.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/binance.svg b/assets/img/icons/binance.svg new file mode 100644 index 0000000..1484d30 --- /dev/null +++ b/assets/img/icons/binance.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/img/icons/check.svg b/assets/img/icons/check.svg new file mode 100644 index 0000000..5490ff0 --- /dev/null +++ b/assets/img/icons/check.svg @@ -0,0 +1,4 @@ + + + diff --git a/assets/img/icons/checkbox.svg b/assets/img/icons/checkbox.svg new file mode 100644 index 0000000..9edaecb --- /dev/null +++ b/assets/img/icons/checkbox.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/chevron-up.svg b/assets/img/icons/chevron-up.svg new file mode 100644 index 0000000..b4fd179 --- /dev/null +++ b/assets/img/icons/chevron-up.svg @@ -0,0 +1 @@ + diff --git a/assets/img/icons/close.svg b/assets/img/icons/close.svg new file mode 100644 index 0000000..f606c27 --- /dev/null +++ b/assets/img/icons/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/copy.svg b/assets/img/icons/copy.svg new file mode 100644 index 0000000..83b37aa --- /dev/null +++ b/assets/img/icons/copy.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/img/icons/decrypt.svg b/assets/img/icons/decrypt.svg new file mode 100644 index 0000000..4b0d638 --- /dev/null +++ b/assets/img/icons/decrypt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/icons/ethereum.svg b/assets/img/icons/ethereum.svg new file mode 100644 index 0000000..46c22c2 --- /dev/null +++ b/assets/img/icons/ethereum.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/img/icons/eye.svg b/assets/img/icons/eye.svg new file mode 100644 index 0000000..0a81814 --- /dev/null +++ b/assets/img/icons/eye.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/gnosis.svg b/assets/img/icons/gnosis.svg new file mode 100644 index 0000000..1ed3e37 --- /dev/null +++ b/assets/img/icons/gnosis.svg @@ -0,0 +1 @@ + diff --git a/assets/img/icons/goerli.svg b/assets/img/icons/goerli.svg new file mode 100644 index 0000000..1fb561a --- /dev/null +++ b/assets/img/icons/goerli.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/info.svg b/assets/img/icons/info.svg new file mode 100644 index 0000000..f62f040 --- /dev/null +++ b/assets/img/icons/info.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/link.svg b/assets/img/icons/link.svg new file mode 100644 index 0000000..43b02ef --- /dev/null +++ b/assets/img/icons/link.svg @@ -0,0 +1 @@ + diff --git a/assets/img/icons/lock.svg b/assets/img/icons/lock.svg new file mode 100644 index 0000000..b5b514d --- /dev/null +++ b/assets/img/icons/lock.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/metamask.svg b/assets/img/icons/metamask.svg new file mode 100644 index 0000000..b5657d2 --- /dev/null +++ b/assets/img/icons/metamask.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/more.svg b/assets/img/icons/more.svg new file mode 100644 index 0000000..f61596a --- /dev/null +++ b/assets/img/icons/more.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/notice/close.svg b/assets/img/icons/notice/close.svg new file mode 100644 index 0000000..0a6eac9 --- /dev/null +++ b/assets/img/icons/notice/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/notice/danger.svg b/assets/img/icons/notice/danger.svg new file mode 100644 index 0000000..1bdf62a --- /dev/null +++ b/assets/img/icons/notice/danger.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/notice/success.svg b/assets/img/icons/notice/success.svg new file mode 100644 index 0000000..264d8da --- /dev/null +++ b/assets/img/icons/notice/success.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/notice/warning.svg b/assets/img/icons/notice/warning.svg new file mode 100644 index 0000000..3ced70b --- /dev/null +++ b/assets/img/icons/notice/warning.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/open-book.svg b/assets/img/icons/open-book.svg new file mode 100644 index 0000000..938c468 --- /dev/null +++ b/assets/img/icons/open-book.svg @@ -0,0 +1 @@ + diff --git a/assets/img/icons/optimism.svg b/assets/img/icons/optimism.svg new file mode 100644 index 0000000..3bdc1bd --- /dev/null +++ b/assets/img/icons/optimism.svg @@ -0,0 +1,12 @@ + + + diff --git a/assets/img/icons/plus.svg b/assets/img/icons/plus.svg new file mode 100644 index 0000000..2a06447 --- /dev/null +++ b/assets/img/icons/plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/polygon.svg b/assets/img/icons/polygon.svg new file mode 100644 index 0000000..c05814b --- /dev/null +++ b/assets/img/icons/polygon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/icons/refresh.svg b/assets/img/icons/refresh.svg new file mode 100644 index 0000000..bc315bb --- /dev/null +++ b/assets/img/icons/refresh.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/icons/remove.svg b/assets/img/icons/remove.svg new file mode 100644 index 0000000..49a72c3 --- /dev/null +++ b/assets/img/icons/remove.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/save.svg b/assets/img/icons/save.svg new file mode 100644 index 0000000..7c6968d --- /dev/null +++ b/assets/img/icons/save.svg @@ -0,0 +1 @@ + diff --git a/assets/img/icons/tool.svg b/assets/img/icons/tool.svg new file mode 100644 index 0000000..e8bb0d2 --- /dev/null +++ b/assets/img/icons/tool.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/icons/warning.svg b/assets/img/icons/warning.svg new file mode 100644 index 0000000..d70c508 --- /dev/null +++ b/assets/img/icons/warning.svg @@ -0,0 +1 @@ + diff --git a/assets/img/info-line.svg b/assets/img/info-line.svg new file mode 100644 index 0000000..6202330 --- /dev/null +++ b/assets/img/info-line.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/line.svg b/assets/img/line.svg new file mode 100644 index 0000000..fd0145f --- /dev/null +++ b/assets/img/line.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/logo.svg b/assets/img/logo.svg new file mode 100644 index 0000000..a15b7b1 --- /dev/null +++ b/assets/img/logo.svg @@ -0,0 +1 @@ + diff --git a/assets/img/metamask-fox.svg b/assets/img/metamask-fox.svg new file mode 100755 index 0000000..583fd24 --- /dev/null +++ b/assets/img/metamask-fox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/tornado_black.png b/assets/img/tornado_black.png new file mode 100644 index 0000000..d448456 Binary files /dev/null and b/assets/img/tornado_black.png differ diff --git a/assets/img/tornado_mark.png b/assets/img/tornado_mark.png new file mode 100644 index 0000000..22f6766 Binary files /dev/null and b/assets/img/tornado_mark.png differ diff --git a/assets/img/walletConnect.svg b/assets/img/walletConnect.svg new file mode 100644 index 0000000..2af274b --- /dev/null +++ b/assets/img/walletConnect.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/styles/app.scss b/assets/styles/app.scss new file mode 100644 index 0000000..aec040a --- /dev/null +++ b/assets/styles/app.scss @@ -0,0 +1,193 @@ +html { + @media print { + background-color: #fff !important; + } +} + +body { + @media print { + color: #000; + } +} + +.wrapper { + display: flex; + flex-direction: column; + min-height: 100vh; + + @media print { + background: none; + } + + > .main-content { + flex: 1; + + .is-centered-main-content & { + display: flex; + align-items: center; + } + } +} + +@import 'components/fonts'; +@import 'components/base'; + +@import 'components/header'; +@import 'components/button'; +@import 'components/tabs'; +@import 'components/box'; +@import 'components/footer'; +@import 'components/txs'; +@import 'components/checkbox'; +@import 'components/radio'; +@import 'components/loading'; +@import 'components/fieldset'; +@import 'components/video'; +@import 'components/wallets'; +@import 'components/steps'; +@import 'components/dropdown'; +@import 'components/field'; +@import 'components/deposit'; +@import 'components/withdraw-data'; +@import 'components/modal'; +@import 'components/has-eth-purchase'; +@import 'components/notification'; +@import 'components/icon'; +@import 'components/tab-with-corner'; +@import 'components/label'; +@import 'components/notice'; +@import 'components/flag'; +@import 'components/compliance'; +@import 'components/textarea'; +@import 'components/info'; +@import 'components/proposals'; +@import 'components/slider'; +@import 'components/account'; + +.b-tooltip { + align-items: center; + + .tooltip-trigger { + display: inline-flex; + } +} + +.dialog { + .modal-card { + border: 1px solid #393939; + border-radius: 6px; + + &-foot { + .button { + flex: 1 1 auto; + } + } + } +} + +.input { + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; + + &.hide-spinner { + &::-webkit-inner-spin-button, + &::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; + } + + -moz-appearance: textfield; + } +} + +.select:not(.is-multiple):not(.is-loading)::after { + border-width: 1px; + border-radius: 1px; + margin-top: -0.4375rem; +} + +.notices .toast { + @include until(375px) { + font-size: 0.85rem; + } +} + +.geofence { + .footer .footer-address, + .break, + .dropdown-langs { + display: none; + } +} + +.label-with-value { + margin-top: -0.25rem; + margin-bottom: 1rem; + line-height: 1.75; + + span { + color: $primary; + } + + a { + color: $primary; + + &:hover { + text-decoration: underline; + } + } +} + +.label { + font-size: 1rem; +} + +.tag:not(body) { + font-weight: 700; + font-size: 0.857rem; + min-width: 70px; + height: 30px; +} + +.progress { + height: 0.571rem; +} + +.delete { + background-color: transparent; + + &::before, + &::after { + background-color: #6b6b6b; + transition: background-color 0.15s ease-in-out; + } + + &::before { + height: 1px; + width: 18px; + } + + &::after { + height: 18px; + width: 1px; + } + + &:hover, + &:focus { + background-color: transparent; + + &::before, + &::after { + background-color: #fff; + } + } +} + +%arrow { + @include arrow; + width: 0; + height: 0; + border-radius: 0; + border-style: solid; + border-width: 8px 0 0 8px; + border-color: transparent transparent transparent $white; +} diff --git a/assets/styles/components/_account.scss b/assets/styles/components/_account.scss new file mode 100644 index 0000000..64434e4 --- /dev/null +++ b/assets/styles/components/_account.scss @@ -0,0 +1,221 @@ +.account { + max-width: 720px; + margin: 0 auto; + + .title { + color: $white; + display: flex; + align-items: center; + justify-content: center; + font-size: 2.5rem; + margin-bottom: 2.857rem; + + > .icon { + margin-right: 1.143rem; + } + } + + &-box { + margin: 1.25rem 0; + background-color: #171717; + border-radius: 6px; + transition: box-shadow 0.5s linear; + + .address { + border-radius: 6px; + background: #1f1f1f; + padding: 1rem 1.429rem; + + &-item { + .label { + font-size: 0.929rem; + } + + .value { + font-size: 1.286rem; + color: $primary; + word-break: break-all; + + &.is-small { + font-size: 0.929rem; + } + } + + + .address-item { + margin-top: 1rem; + } + } + } + + .action { + padding: 0 1.429rem; + + &-item { + display: flex; + align-items: center; + position: relative; + padding: 1.429rem 0; + + .icon { + margin-right: 1.429rem; + } + + .desc { + margin-right: auto; + max-width: 346px; + font-size: 0.929rem; + line-height: 1.714rem; + + span { + color: $primary; + } + } + + .balance { + display: inline-flex; + flex-wrap: wrap; + + &-item { + white-space: nowrap; + + &:not(:last-child) { + margin-right: 0.5em; + } + } + } + + &:not(:last-child) { + border-bottom: 1px solid #353535; + } + + .switch { + margin-left: 1.429rem; + margin-right: 0; + + .control-label { + display: none; + } + + input[type='checkbox'] { + + .check { + background-color: #313131; + box-shadow: none; + } + + &:checked + .check { + &:before { + background-color: $primary; + } + } + } + } + + @include mobile { + flex-wrap: wrap; + align-items: flex-start; + + &.has-switch { + min-height: 136px; + } + + .desc { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0%; + } + + > .button, + > .b-tooltip { + margin-top: 1.5rem; + width: 100%; + + .button { + width: 100%; + } + } + + .switch { + margin-left: 0; + top: 6.378rem; + position: absolute; + } + } + + @include tablet { + .button { + margin-left: 1.429rem; + } + } + } + } + } + + .note-account { + .title { + padding-top: 1.857rem; + } + + &.is-active { + .account-box { + box-shadow: 0 0 20px $primary; + } + } + } + + &-decrypt-info { + .item { + display: flex; + align-items: center; + justify-content: space-between; + position: relative; + padding: 0.75rem 0; + + .desc { + margin-right: auto; + max-width: 346px; + } + + &:not(:last-child) { + border-bottom: 1px solid #353535; + } + + .switch { + margin-left: 1.429rem; + margin-right: 0; + + .control-label { + display: none; + } + } + + @include mobile { + flex-wrap: wrap; + min-height: 136px; + align-items: flex-start; + + .desc { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0%; + } + + .button { + margin-top: 1.5rem; + width: 100%; + } + + .switch { + margin-left: 0; + top: 6.378rem; + position: absolute; + } + } + + @include tablet { + .button { + margin-left: 1.429rem; + } + } + } + } +} diff --git a/assets/styles/components/_base.scss b/assets/styles/components/_base.scss new file mode 100644 index 0000000..b78c440 --- /dev/null +++ b/assets/styles/components/_base.scss @@ -0,0 +1,251 @@ +$control-height: 2.857em; +$control-border-width: 1px; +$control-padding-vertical: calc(0.429em - #{$control-border-width}); +$control-padding-horizontal: calc(1.25em - #{$control-border-width}); + +$white: #eee; +$primary: #94febf; +$primary-invert: #000403; +$warning: #ff8a00; +$black: #2c4538; +$danger: #ff0658; +$danger-invert: #000403; +$dark: #171717; +$dark-invert: $primary; +$info: $primary-invert; +$info-invert: $white; +$violet: #865ff3; +$gray: #6b6b6b; +$grey-lighter: #393939; +$dark-tooltip: #313131; +$custom-colors: ( + 'black': ( + $black, + $primary-invert + ), + 'violet': ( + $violet, + $white + ), + 'gray': ( + $gray, + $white + ), + 'dark-tooltip': ( + $dark-tooltip, + $gray + ) +); + +@import '~bulma/sass/utilities/_all'; + +$body-family: 'PT Mono', monospace; +$body-background-color: $primary-invert; +$body-color: $white; +$body-size: 14px; +$body-min-width: 320px; + +$navbar-background-color: transparent; +$navbar-item-color: $white; +$navbar-item-hover-color: $primary; +$navbar-item-hover-background-color: transparent; +$navbar-item-active-color: $primary; +$navbar-breakpoint: $tablet; + +$label-color: $white; +$label-weight: $weight-normal; + +$button-background-color: #181818; +$button-border-color: #666; +$button-color: $white; +$button-hover-border-color: $primary; +$button-focus-border-color: $primary; +$button-focus-color: $primary; +$button-focus-box-shadow-color: rgba($primary, 0.25); + +$button-active-border-color: darken($primary, 10%); +$button-active-color: darken($primary, 10%); + +$button-text-color: $primary; +$button-text-hover-background-color: $primary; +$button-text-hover-color: $primary-invert; + +$button-disabled-background-color: #000; +$button-disabled-border-color: #393939; + +$input-color: $white; +$input-background-color: transparent; +$input-border-color: #393939; +$input-hover-border-color: $white; +$input-hover-color: $white; +$input-focus-border-color: $primary; +$input-placeholder-color: #393939; +$input-focus-box-shadow-size: 0 0 0; + +$input-disabled-background-color: #181818; +$input-disabled-border-color: #222222; +$input-disabled-color: #5e5e5e; + +$radio-size: 1.5rem; + +$link: $white; +$link-hover: $primary; +$link-invert: $primary; + +$tabs-border-bottom-width: 0; +$tabs-link-color: $link; +$tabs-link-active-color: $primary; +$tabs-link-hover-color: $primary; + +$box-background-color: $primary-invert; +$box-shadow: none; +$box-color: #fefefe; +$box-padding: 1.5rem; + +$title-size: 1.5rem; +$title-line-height: 1; +$title-color: $primary; +$subtitle-color: $white; + +$footer-background-color: transparent; +$footer-padding: 2rem; + +$modal-background-background-color: rgba(#050505, 0.86); +$modal-card-title-color: $primary; +$modal-card-head-background-color: $primary-invert; +$modal-card-head-border-bottom: none; +$modal-card-foot-border-top: none; +$modal-card-body-background-color: $primary-invert; +$modal-card-foot-radius: 0; +$modal-card-head-radius: 0; +$modal-card-body-padding: 0 1.5rem; +$modal-card-head-padding: 1.5rem; + +$input-arrow: #393939; +$radius-small: 4px; + +$steps-default-color: $primary; +$steps-marker-default-border: 0.2em solid $primary; +$steps-maker-default-color: $primary-invert; +$steps-previous-color: $primary-invert; + +$hr-background-color: #1e3629; +$hr-height: 1px; +$hr-margin: 0.5rem 0; + +$dropdown-item-color: $white; +$dropdown-content-shadow: 0 0 0 1px $primary, 0 6px 12px rgba(0, 0, 0, 0.3); +$dropdown-content-background-color: $primary-invert; +$dropdown-item-hover-background-color: #0e1f17; +$dropdown-item-hover-color: $primary; + +$dropdown-item-active-background-color: $primary; +$dropdown-item-active-color: $primary-invert; + +$dropdown-content-padding-bottom: 0; +$dropdown-content-padding-top: 0; + +$dropdown-background-color: $modal-background-background-color; + +$widescreen-enabled: false; +$fullhd-enabled: false; + +$navbar-dropdown-arrow: $primary; +$navbar-dropdown-background-color: $primary-invert; +$navbar-dropdown-border-top: 2px solid $primary; +$navbar-dropdown-item-hover-background-color: $dropdown-item-hover-background-color; +$navbar-dropdown-item-hover-color: $dropdown-item-hover-color; +$navbar-dropdown-item-active-background-color: $dropdown-item-active-background-color; +$navbar-dropdown-item-active-color: $dropdown-item-active-color; +$navbar-dropdown-boxed-shadow: $dropdown-content-shadow; + +$button-static-color: #6b6b6b; +$button-static-background-color: $input-background-color; +$button-static-border-color: $input-border-color; + +$tag-background-color: #1c1c1c; +$tag-color: #6b6b6b; + +$progress-bar-background-color: #393939; + +$strong-color: #6b6b6b; +$strong-weight: 400; + +$notification-background-color: #1f1f1f; +$notification-radius: 6px; + +$button-text-color: #6b6b6b; +$button-text-hover-background-color: transparent; +$button-text-hover-color: #6b6b6b; + +$textarea-padding: 0.75rem; + +$icon-dimensions-large: 3.429rem; + +.column { + @include from(576px) { + &.is-half-small { + flex: none; + width: 50%; + } + + &.is-full-small { + flex: none; + width: 100%; + } + } + + @include mobile { + &.is-order-1-mobile { + order: 1; + } + + &.is-order-2-mobile { + order: 2; + } + + &.is-order-3-mobile { + order: 3; + } + } + + @include tablet { + &.is-none { + flex: none; + } + } +} + +@import '~bulma/sass/base/_all'; +@import '~bulma/sass/helpers/_all'; +@import '~bulma/sass/elements/_all'; +@import '~bulma/sass/components/_all'; +@import '~bulma/sass/form/_all'; +@import '~bulma/sass/grid/_all'; +@import '~bulma/sass/layout/_all'; +@import '~buefy/src/scss/buefy'; + +@mixin noWrap { + white-space: nowrap; + overflow: hidden; + max-width: 100%; + position: relative; + text-overflow: ellipsis; +} + +.columns { + @include from(576px) { + &.is-small { + display: flex; + } + } +} + +.column { + @media screen and (min-width: 576px) and (max-width: $tablet - 1px) { + &.is-half-small-only { + flex: none; + width: 50%; + } + } +} diff --git a/assets/styles/components/_box.scss b/assets/styles/components/_box.scss new file mode 100644 index 0000000..763e2fc --- /dev/null +++ b/assets/styles/components/_box.scss @@ -0,0 +1,189 @@ +.box { + border: 1px solid #393939; + position: relative; + z-index: 2; + + &-stats { + height: 100%; + + @include tablet { + max-width: 440px; + margin-left: auto; + } + + .box { + border-top-left-radius: 0; + margin-bottom: 0; + } + + .tab-with-corner.is-left-top { + display: inline-flex; + align-items: center; + font-weight: 700; + font-size: 1.35rem; + + @include until(375px) { + font-size: 1.135rem; + } + + &:after { + right: -1.8rem; + + @include until(375px) { + right: -1.5rem; + } + } + } + + span.selected { + border-radius: 4px; + font-size: 0.75rem; + background-color: #0d1f16; + border: 1px solid $primary; + color: $primary; + padding: calc(0.375em - 1px) 0.75em; + height: 2.25em; + display: inline-flex; + margin-left: 1rem; + + > span { + padding-right: 0.5em; + } + } + + .deposits { + font-size: 0.82rem; + width: 100%; + display: flex; + flex-direction: column; + + .row { + display: flex; + height: 27px; + + &:nth-child(odd) { + background-color: #171717; + } + } + + .value { + padding-top: 0.375rem; + padding-bottom: 0.375rem; + padding-left: 0.625rem; + padding-right: 0.3125rem; + white-space: nowrap; + padding-right: 0.25rem; + text-align: right; + } + + .data { + width: 100%; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + padding-right: 0.625rem; + color: $primary; + @include noWrap; + } + + .b-skeleton { + &-item { + height: 1.429rem; + } + + + .b-skeleton { + margin-top: 0.625rem; + } + } + } + + @include until(375px) { + .b-tooltip.is-top.is-multiline.is-large:after { + width: 100%; + } + } + + .box-ip { + display: flex; + justify-content: flex-end; + } + } + + &-modal { + max-width: 440px; + overflow-y: auto; + + &.has-delete { + .delete { + position: absolute; + right: 1.5rem; + top: 1.571rem; + } + + .b-tabs.is-modal { + .tabs { + margin-top: -0.5em; + margin-right: 2.143rem; + overflow: hidden; + overflow-x: auto; + + ul { + @include tablet { + flex-wrap: wrap; + flex-shrink: 1; + } + } + } + } + } + + &-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 1.5rem; + + &.is-spaced { + margin-bottom: 0.475rem; + } + + .delete { + margin-left: auto; + } + } + + &-title { + font-size: 1.143rem; + font-weight: 700; + } + + .note { + margin-bottom: 1rem; + } + + .znote { + color: $primary; + word-break: break-all; + margin-bottom: 1rem; + } + + .checkbox { + margin-bottom: 1.5rem; + } + + .buttons { + .b-tooltip { + margin-bottom: 0.5rem; + + .button { + margin-bottom: 0; + } + } + } + + .p { + font-size: 0.929rem; + margin-top: 0.25rem; + margin-bottom: 1rem; + } + } +} diff --git a/assets/styles/components/_button.scss b/assets/styles/components/_button.scss new file mode 100644 index 0000000..d5782c4 --- /dev/null +++ b/assets/styles/components/_button.scss @@ -0,0 +1,326 @@ +.button { + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; + font-weight: $weight-bold; + + .trnd { + background-color: #eee; + } + + svg { + & + span { + margin-left: 0.75em; + } + } + + &.is-text { + text-decoration: none; + + .trnd { + background-color: $button-text-color; + } + + &:focus:not(:active), + &.is-focused:not(:active) { + box-shadow: none; + } + } + + &.max-content { + max-width: max-content; + } + + &.has-icon { + padding: 0; + width: 16px; + height: 16px; + + .icon { + height: 8px; + width: 8px; + + &.icon-info { + background-size: 6px 8px; + } + } + .icon-link { + height: 12px; + width: 12px; + } + } + &.is-icon { + padding: 0; + width: 24px; + height: 24px; + background-color: transparent; + border: none; + + .trnd { + width: 100%; + height: 100%; + background-color: #6b6b6b; + } + + svg { + height: 100%; + width: 100%; + } + + &:hover { + path:not(.no-hover) { + fill: #87feb7; + transition: fill 0.15s ease-out; + } + } + + &:focus:not(:active) { + box-shadow: none; + } + } + &.is-loading { + &::after { + border-radius: 100%; + } + } + &.is-black { + path { + fill: $primary; + } + } + &.is-primary { + path { + fill: $primary-invert; + } + + .trnd { + background-color: $primary-invert; + } + + &:hover { + background-color: #3bf0a1; + } + + &[disabled] { + background-color: $primary; + } + + &.is-outlined { + background-color: #0e1f17; + + .trnd { + background-color: $primary; + } + + &:hover, + &:focus, + &.is-hovered, + &.is-focused { + .trnd { + background-color: $primary-invert; + } + } + + &[disabled] { + .trnd { + background-color: $primary; + } + } + } + } + + &.is-danger { + &.is-outlined { + background-color: #1c080d; + + .trnd { + background-color: $danger; + } + + &:hover, + &:focus { + .trnd { + background-color: $danger-invert; + } + } + + &[disabled] { + .trnd { + background-color: $danger; + } + } + } + } + + &.is-dark { + path { + fill: $primary; + } + + .trnd { + background-color: $primary; + } + } + + &.is-primary-link { + color: $primary; + height: auto; + background-color: transparent; + border: none; + border-radius: 0; + font-size: 0.85rem; + line-height: 1; + + &:hover { + span { + text-decoration: underline; + } + } + + &:focus:not(:active) { + box-shadow: none; + } + + &.is-underlined { + display: block; + margin: 0 auto; + + span { + text-decoration: underline; + } + + &:hover { + span { + text-decoration: none; + } + } + } + } + + .icon { + &:first-child:not(:last-child) { + margin-left: 0; + margin-right: 0.5em; + } + &:last-child:not(:first-child) { + margin-left: 0.5em; + margin-right: 0; + } + &:first-child:last-child { + margin-left: 0; + margin-right: 0; + } + } + + &:not(.is-small):not(.is-primary-text) { + span:not(.icon):not(.b-tooltip):first-child:last-child { + padding: 0 0.5rem; + } + } + + &.is-nav-icon { + width: 2.857rem; + padding: 0; + cursor: default; + background-color: #242424; + border-color: #4f4f4f; + + .trnd { + background-color: #595959; + } + + &:focus:not(:active) { + box-shadow: none; + } + + &.walletConnect { + background-color: #07141e; + border-color: #3b99fc; + + .trnd { + background-color: #3b99fc; + } + } + + &.metamask { + background-color: #2d2419; + border-color: #f89c35; + + .trnd { + background-color: #f89c35; + } + } + + &.tornado { + background-color: #0e1f17; + border-color: $primary; + + .trnd { + background-color: $primary; + } + } + + &.network { + background-color: darken($primary, 80); + border-color: $primary; + + .trnd { + background-color: $primary; + } + } + } + + &.hide-icon-desktop { + @include desktop { + span.icon { + display: none; + } + } + } +} + +.buttons { + &__social { + .button { + background-color: transparent; + border-color: transparent; + color: $primary; + + .icon { + width: 24px; + height: 24px; + } + } + } + + &__halfwidth { + flex-wrap: nowrap; + + .button, + .b-skeleton { + flex: 1 1 calc(50% - 0.5rem); + + &:last-child { + margin-left: 0.5rem; + } + } + + .b-skeleton { + margin-bottom: 0.5rem; + + &:first-child { + margin-right: 0.5rem; + } + + + .b-skeleton { + margin-top: 0; + } + } + } + + .break { + margin: 0 1rem 0.5rem 0.5rem; + width: 1px; + align-self: stretch; + background-color: $primary; + } +} diff --git a/assets/styles/components/_checkbox.scss b/assets/styles/components/_checkbox.scss new file mode 100644 index 0000000..6a13828 --- /dev/null +++ b/assets/styles/components/_checkbox.scss @@ -0,0 +1,39 @@ +.b-checkbox { + &.checkbox { + input[type=checkbox] { + + .check { + border-radius: 2px; + border: 1px solid $primary; + position: relative; + width: 1.5rem; + height: 1.5rem; + + &:before { + content: ''; + display: flex; + position: absolute; + left: 50%; + margin-left: calc(-1.5rem/2); + bottom: 50%; + margin-bottom: calc(-1.5rem/2); + width: 1.5rem; + height: 1.5rem; + transition: transform .15s ease-out; + transform: scale(0); + background-color: $primary; + border-radius: 1px; + } + } + &:checked + .check { + background: none; + + &:before { + transform: scale(.4); + } + } + } + .control-label { + padding-left: 0.75rem; + } + } +} diff --git a/assets/styles/components/_compliance.scss b/assets/styles/components/_compliance.scss new file mode 100644 index 0000000..9f41618 --- /dev/null +++ b/assets/styles/components/_compliance.scss @@ -0,0 +1,354 @@ +.compliance { + @media print { + margin-top: -2rem; + } + .title { + color: #fff; + text-align: center; + + span { + color: $primary; + } + .print { + display: none; + } + @media print { + .not-print { + display: none; + } + .print { + display: inline-block; + } + font-size: 2.5rem !important; + font-weight: 700; + color: #000; + text-align: left; + + span { + color: #000; + font-weight: 400; + } + } + } + + .label { + @media print { + color: #000; + } + } + + .subtitle { + text-align: center; + } + + .p { + font-size: 0.857rem; + margin-bottom: 2rem; + text-align: center; + + @media print { + display: none; + } + } + + .field { + margin-bottom: 1.5rem; + + .input { + @media print { + display: none; + } + } + + .print-help { + display: none; + + @media print { + display: block; + word-break: break-all; + word-wrap: break-word; + font-weight: 700; + color: #000; + } + } + } + + .columns { + margin-top: 1.5rem; + + &-blocks { + @include touch { + margin: 1rem 0; + } + + @include desktop { + .column { + &.is-5-desktop { + width: calc(50% - 40px); + } + &.is-2-desktop { + width: 80px; + } + } + } + + @media print { + display: flex; + .column { + &.is-5-desktop { + flex: none; + width: 50%; + + &:first-child { + padding-right: 1rem !important; + } + + &:last-child { + margin-left: 1rem !important; + } + } + } + } + } + + &.has-verified { + @include touch { + display: flex; + flex-direction: column-reverse; + } + } + } + + .block { + height: 100%; + display: flex; + flex-direction: column; + + &-withdrawal { + @include mobile { + margin-top: 1rem; + } + } + + &-item { + display: flex; + justify-content: space-between; + + span { + color: $primary; + + @media print { + color: #000; + } + } + + &--title { + font-size: 1.25rem; + line-height: 1.25; + + @media print { + margin-bottom: 0.5rem; + color: #000; + + span { + font-weight: 700; + } + } + } + + &--status { + color: #616161; + margin-bottom: 2rem; + + &.is-success { + color: $primary; + } + + &.is-warning { + color: $warning; + } + + .fee { + color: #616161; + } + + @media print { + color: #000 !important; + font-size: 0.85rem; + + .fee { + color: #000; + } + } + } + + &--data { + font-size: 0.9rem; + + @include mobile { + flex-direction: column; + } + + .label { + font-size: inherit; + width: 106px; + flex: none; + } + + .value { + text-overflow: ellipsis; + overflow: hidden; + color: $primary; + margin-left: 1rem; + flex-grow: 1; + + @include mobile { + margin-left: 0; + text-align: left; + word-break: break-all; + overflow: visible; + margin-bottom: 1rem; + } + + @include touch { + &[data-value] { + font: 0/0 a; + color: transparent; + + &::after { + display: block; + font-size: 0.9rem; + line-height: 1.5; + font-family: 'PT Mono'; + color: $primary; + content: attr(data-value); + } + } + } + + &.copy { + cursor: pointer; + } + } + + @media print { + flex-direction: column; + margin-bottom: 1rem; + + .value { + overflow: visible; + word-break: break-all; + text-align: left; + margin-left: 0; + color: #000; + font-weight: 700; + + &[data-value] { + font: 0/0 a; + color: transparent; + + &::after { + display: block; + font-size: 0.9rem; + line-height: 1.5; + font-weight: 700; + font-family: 'PT Mono', monospace; + color: #000; + content: attr(data-value); + } + } + } + } + } + } + } + + .arrow { + height: 100%; + width: 100%; + background-size: 46px 41px; + background-repeat: no-repeat; + background-position: center; + background-image: url('../img/icons/arrow.svg'); + + @include touch { + background-size: 41px 46px; + width: 41px; + height: 46px; + transform: rotate(90deg); + margin: 0 auto; + } + } + + .verified { + margin: 1rem 0 1rem auto; + height: 100px; + width: 100px; + display: block; + + @include touch { + margin-top: 1rem; + margin-left: auto; + margin-right: auto; + } + + .stroke { + fill: none; + fill-rule: evenodd; + stroke: #94febf; + } + + .fill { + fill: #94febf; + fill-rule: evenodd; + } + + @media print { + .stroke { + stroke: #000; + } + + .fill { + fill: #000; + } + margin-top: -2rem; + } + } + + .generate { + &-container { + position: relative; + text-align: center; + margin: 2rem 0 !important; + + @media print { + display: none; + } + } + + @include desktop { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + } + } + + .print { + display: none; + + @media print { + display: block; + color: #000; + } + + &-title { + font-size: 1.25rem; + margin-bottom: 0.5rem; + } + + &-p { + font-size: 0.9rem; + } + } +} diff --git a/assets/styles/components/_deposit.scss b/assets/styles/components/_deposit.scss new file mode 100644 index 0000000..c96ed4e --- /dev/null +++ b/assets/styles/components/_deposit.scss @@ -0,0 +1,33 @@ +.deposit { + &-buttons.field { + .button { + width: 90px; + } + + @include until($desktop) { + justify-content: space-between; + + .control { + flex-basis: calc(50% - .75rem); + + &:not(:last-child) { + margin-right: 0; + } + } + + .button { + width: 100%; + } + } + + + + .deposit-buttons.field { + margin-bottom: .25rem; + } + } + + &-p { + margin-bottom: 1rem; + font-size: .85rem; + } +} diff --git a/assets/styles/components/_dropdown.scss b/assets/styles/components/_dropdown.scss new file mode 100644 index 0000000..ecc3ede --- /dev/null +++ b/assets/styles/components/_dropdown.scss @@ -0,0 +1,108 @@ + +.dropdown.is-mobile-modal { + .dropdown-trigger { + .control { + .input { + &::after { + border: 2px solid $primary; + border-radius: 2px; + border-right: 0; + border-top: 0; + content: " "; + display: block; + margin-top: -0.5em; + pointer-events: none; + position: absolute; + top: 50%; + transform: rotate(-45deg); + transform-origin: center; + height: .625em; + width: .625em; + right: 1.125em; + transition: border-color .15s ease-in-out; + } + + &:hover { + &::after { + border-color: $white; + } + } + } + + &.is-loading { + .input { + &::after { + opacity: 0; + visibility: hidden; + } + } + + &::after { + height: 1.143rem; + width: 1.143rem; + right: .86rem; + top: .86rem; + border-radius: 1.143rem; + } + } + } + } + + &.is-expanded .dropdown-menu{ + @include touch { + max-width: 460px; + } + } + + .dropdown-menu { + > .dropdown-content { + overflow: hidden; + margin: 1px; + + > .dropdown-item { + font-size: 1rem; + padding: 0.675rem 1.25rem; + transition: color .15s ease-in-out, background-color .15s ease-in-out; + } + } + } + + &.is-active { + .dropdown-trigger { + .control { + .input { + border-color: $primary; + + &::after { + border-color: $primary; + } + } + } + } + } +} + +.dropdown-langs { + margin-bottom: .5rem; + + .dropdown-menu { + min-width: auto; + padding-top: 0; + padding-bottom: 4px; + } + + &.is-mobile-modal { + .dropdown-menu { + max-width: 100px; + } + } + + a.dropdown-item { + padding-right: 1rem; + line-height: 24px; + } + + .button { + margin-bottom: 0; + } +} diff --git a/assets/styles/components/_field.scss b/assets/styles/components/_field.scss new file mode 100644 index 0000000..81fd165 --- /dev/null +++ b/assets/styles/components/_field.scss @@ -0,0 +1,196 @@ +.field { + &:not(:last-child) { + margin-bottom: 1.25rem; + } + + .control { + &.has-icons-right { + .input { + padding-right: calc(1.25em - 1px); + + + .icon.is-right { + display: none; + } + } + } + } + + .label-with-buttons { + display: flex; + align-items: center; + + .label { + margin-right: auto; + + .b-tooltip { + .button { + margin-bottom: 0; + } + } + } + + .button { + margin-bottom: 0.5em; + + &.is-icon { + width: 20px; + height: 20px; + } + + @include touch { + .b-tooltip { + &:before, + &:after { + content: none; + } + } + } + + + .button { + margin-left: 0.75rem; + } + + &.is-primary-text { + color: $primary; + padding: 0; + height: auto; + background-color: transparent; + border: none; + border-bottom: 1px dotted $primary; + border-radius: 0; + font-size: 0.85rem; + line-height: 1; + + &:focus:not(:active) { + box-shadow: none; + } + } + } + } + + &.has-custom-field { + margin-top: -0.65rem; + + + .help { + margin-top: -1rem; + } + } + + &-withdraw { + margin-top: -0.6rem; + } + + &.has-addons { + .input { + border-right: 0; + } + + .control { + &.has-text { + border: 1px solid #393939; + transition: border-color 0.15s ease-in-out; + border-left: 0; + display: inline-flex; + align-items: center; + + span { + color: #6b6b6b; + font-size: 0.929rem; + } + + &:not(:last-child) { + border-right: 0; + padding-right: 0.643rem; + } + + &:last-child { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; + padding-right: 0.643rem; + } + } + + &.has-button { + display: inline-flex; + align-items: center; + transition: border-color 0.15s ease-in-out; + border: 1px solid #393939; + border-left: 0; + padding-right: 0.357rem; + + .button { + padding: 0.25rem 0.5rem; + font-size: 0.929rem; + height: 28px; + border-bottom-right-radius: 2px; + border-top-right-radius: 2px; + } + + &:not(:last-child) { + border-right: 0; + padding-right: 0.643rem; + } + + &:last-child { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; + + &:not(:only-child) .button { + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; + } + } + + &:not(:first-child):not(:last-child) .button { + border-radius: 2px; + } + } + } + + &:hover { + .input, + .control { + border-color: $input-hover-border-color; + } + } + + &:focus, + &:focus-within { + .input, + .control { + border-color: $input-focus-border-color; + } + } + } + + &.is-warning { + .has-addons { + .input, + .control { + border-color: $warning; + } + } + } + + &.is-grouped { + @include mobile { + flex-wrap: wrap; + + > .field.is-expanded { + &:not(:last-child) { + margin-right: 0; + margin-bottom: 1.25rem; + } + + flex: none; + width: 100%; + } + } + } + + & > .field { + + .help { + margin-top: -1rem; + } + } +} diff --git a/assets/styles/components/_fieldset.scss b/assets/styles/components/_fieldset.scss new file mode 100644 index 0000000..c773bab --- /dev/null +++ b/assets/styles/components/_fieldset.scss @@ -0,0 +1,73 @@ +fieldset[disabled] { + cursor: not-allowed; + position: relative; + filter: grayscale(70%); + color: #5e5e5e; + + .tooltip { + &:after { + position: absolute; + opacity: 0; + visibility: hidden; + pointer-events: none; + content: attr(data-label); + padding: 1rem 2rem; + border-radius: $radius-large; + font-size: 0.85rem; + font-weight: $weight-normal; + box-shadow: 0px 1px 2px 1px rgba(0, 1, 0, 0.2); + z-index: 888; + display: flex-block; + text-align: center; + width: 240px; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: #393939; + color: #eee; + } + + &:not([data-label=""]):after { + transition-delay: inherit; + opacity: 1; + visibility: visible; + } + } + + .notice { + position: relative; + border-color: #5c4d3c; + color: #5e5e5e; + } + + .label { + @include unselectable; + color: #5e5e5e; + + &.is-primary { + color: #558b6b; + } + } + + .b-radio { + &.radio { + &:focus { + input[type=radio] { + + .check { + box-shadow: none; + } + } + } + + input[type=radio] { + + .check { + cursor: not-allowed; + } + } + } + } + + .withdraw-data-item span { + color: #4f5e57; + } +} diff --git a/assets/styles/components/_flag.scss b/assets/styles/components/_flag.scss new file mode 100644 index 0000000..4bbabab --- /dev/null +++ b/assets/styles/components/_flag.scss @@ -0,0 +1,24 @@ +.flag-icon { + background-size: contain; + background-position: 50%; + background-repeat: no-repeat; + position: relative; + display: inline-block; + height: 24px; + width: 24px; + &:before { + content: '\00a0'; + } +} + +// https://github.com/HatScripts/circle-flags/ + +@mixin flag-icon($country) { + .flag-icon-#{$country} { + background-image: url('../img/flags/#{$country}.svg'); + } +} +$countries: es fr gb ru tr uk cn; +@each $country in $countries { + @include flag-icon($country); +} diff --git a/assets/styles/components/_fonts.scss b/assets/styles/components/_fonts.scss new file mode 100644 index 0000000..be419e8 --- /dev/null +++ b/assets/styles/components/_fonts.scss @@ -0,0 +1,14 @@ +@font-face { + font-family: 'PT Mono'; + src: local('PT Mono'), local('PTMono-Regular'), url('../fonts/PTMono-Regular.woff2') format('woff2'); + font-display: swap; + font-weight: 400; + font-style: normal; +} +@font-face { + font-family: 'PT Mono'; + src: local('PT Mono Bold'), local('PTMono-Bold'), url('../fonts/PTMono-Bold.woff2') format('woff2'); + font-display: swap; + font-weight: 700; + font-style: normal; +} diff --git a/assets/styles/components/_footer.scss b/assets/styles/components/_footer.scss new file mode 100644 index 0000000..b7a348a --- /dev/null +++ b/assets/styles/components/_footer.scss @@ -0,0 +1,144 @@ +.footer { + font-size: 0.7rem; + line-height: 2; + + @media print { + display: none; + } + + .level { + &-item { + &.is-column { + flex-direction: column; + } + } + + &-subitem { + display: flex; + + @include mobile { + justify-content: center; + + & + .level-subitem { + margin-top: 5px; + } + } + } + + &-left { + .level-item { + &.is-column { + @include tablet { + align-items: flex-start; + } + } + } + + & + .level-right { + @include mobile { + margin-top: 5px; + } + } + } + + &-right { + .level-item { + &.is-column { + @include tablet { + align-items: flex-end; + } + } + } + } + } + + @include tablet-only { + .level { + &-left { + .footer-address__name { + padding-right: 5px; + } + } + + &-right { + .footer-address { + flex-direction: column; + align-items: flex-end; + } + } + } + } + + &-address { + flex-wrap: wrap; + + &__name { + @include desktop { + padding-right: 5px; + } + } + + &__value { + color: $primary; + + @include mobile { + width: 100%; + @include noWrap; + text-align: center; + } + &:hover { + text-decoration: underline; + } + } + + .b-tooltip { + @include mobile { + flex-direction: column; + } + } + } + + .footer-version__value { + color: $primary; + padding-left: 5px; + + @include mobile { + margin-bottom: 5px; + } + } + + .buttons { + .button.is-icon:not(:last-child):not(.is-fullwidth) { + margin-right: 1.286rem; + } + + .break { + margin-left: 0; + margin-right: 1.286rem; + background-color: #2a2a2a; + } + + .icon, + .trnd { + width: 1.714rem; + height: 1.714rem; + } + + @include until(425px) { + justify-content: center; + max-width: 200px; + + .button.is-icon:not(:last-child):not(.is-fullwidth) { + margin: 0.5rem 0.7145rem; + } + + .break { + margin: 0.5rem 0.7145rem; + } + + .dropdown-langs { + margin: 0.5rem 0.7145rem; + } + } + } +} diff --git a/assets/styles/components/_has-eth-purchase.scss b/assets/styles/components/_has-eth-purchase.scss new file mode 100644 index 0000000..94ba2d0 --- /dev/null +++ b/assets/styles/components/_has-eth-purchase.scss @@ -0,0 +1,145 @@ +.field.has-eth-purchase { + border: $button-border-width solid $button-border-color; + border-radius: 4px; + background-color: $button-background-color; + padding: 1.28rem; + position: relative; + overflow: hidden; + transition: border-color 0.15s ease-in-out; + + .columns { + margin-left: -1.28rem; + margin-right: -1.28rem; + margin-top: -1.28rem; + } + + .columns:last-child { + margin-bottom: -1.28rem; + } + + .column { + padding: 1.28rem; + + &:first-child { + padding-right: 0.64rem; + } + + &:last-child { + padding-left: 0.64rem; + } + } + + .input { + border-color: transparent; + background-color: $primary-invert; + text-align: center; + font-size: 2rem; + align-items: center; + justify-content: center; + padding: 0; + height: 3.57rem; + box-shadow: none; + transition: color 0.15s ease-in-out; + + @include until(375px) { + font-size: 1.6rem; + } + } + + .control.has-icons-right { + .input { + padding-right: 0; + } + } + + .currency { + font-size: 1.125rem; + text-align: right; + line-height: 1; + margin-bottom: 0.78rem; + transition: color 0.15s ease-in-out; + } + + .withdraw-data { + margin-top: 0.78rem; + } + + .is-inverted { + background: $primary-invert; + + .currency { + color: $primary; + } + } + + .arrow-container { + padding: 0; + flex: none; + width: 30px; + margin: -1px -2px; + position: relative; + + .arrow { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + width: 100%; + height: 100%; + + .arrow-border { + transition: fill 0.15s ease-in-out; + } + } + } + + &.is-warning { + border-color: $warning; + + .is-light { + .currency { + color: $warning; + } + + .input { + color: $warning; + } + } + + .arrow-container { + .arrow { + .arrow-border { + fill: $warning; + } + } + } + } + + &.is-primary { + border-color: $primary; + + .is-light { + .currency { + color: $primary; + } + + .input { + color: $primary; + } + } + + .arrow-container { + .arrow { + .arrow-border { + fill: $primary; + } + } + } + } + + &.is-disabled { + cursor: not-allowed; + opacity: 0.5; + } +} diff --git a/assets/styles/components/_header.scss b/assets/styles/components/_header.scss new file mode 100644 index 0000000..9b350b4 --- /dev/null +++ b/assets/styles/components/_header.scss @@ -0,0 +1,136 @@ +.header { + padding-top: 20px; + padding-left: 0.75rem; + padding-right: 0.75rem; + + @include tablet { + padding-left: 1.5rem; + padding-right: 1.5rem; + } + + @media (min-width: 769px) and (max-width: 900px) { + > .container { + flex-direction: column; + + .navbar-brand { + align-self: center; + } + } + } + + @include desktop { + > .container { + .navbar-brand { + margin-left: 0; + + .navbar-item { + padding-left: 0; + } + } + } + } + + @media print { + padding-top: 0; + } + + .navbar-brand { + align-items: center; + } + + .logo { + height: 40px; + + @media print { + path { + fill: #000; + } + } + } + + .navbar-end { + @include tablet { + display: flex; + align-items: center; + justify-content: center; + } + } + + .navbar-item { + &.has-tag { + display: flex; + align-items: center; + } + + &--tag { + margin-left: 0.05rem; + margin-top: -0.55rem; + width: 4px; + height: 4px; + background-color: $primary; + border-radius: 100%; + box-shadow: 0 0 1px 1px $primary; + } + } + + .navbar-link { + &:not(.is-arrowless) { + padding-right: 2rem; + + &::after { + right: 0.714rem; + } + } + } + + @include mobile { + .navbar-dropdown.is-boxed { + visibility: visible; + } + } + + @include tablet { + .navbar-dropdown { + padding: 0; + overflow: hidden; + + a.navbar-item.is-active:not(:focus):not(:hover) { + background-color: $dropdown-item-active-background-color; + } + } + } + + @include tablet-only { + .buttons > .button:not(.network-button) { + span:first-child:not(:last-child) { + margin-right: 0; + } + + span:not(.icon) { + display: none; + } + } + } + + .buttons { + .b-tooltip { + margin-right: 0.714rem; + + .tooltip-content { + text-align: center; + top: 100%; + display: block !important; + pointer-events: none; + opacity: 0; + transition: opacity $speed-slow $easing; + } + + &:hover { + .tooltip-content { + opacity: 1; + pointer-events: all; + } + } + } + } +} diff --git a/assets/styles/components/_icon.scss b/assets/styles/components/_icon.scss new file mode 100644 index 0000000..df7a92f --- /dev/null +++ b/assets/styles/components/_icon.scss @@ -0,0 +1,400 @@ +.icon { + background-position: center; + background-repeat: no-repeat; + background-size: contain; + + &-info { + background-image: url('../img/icons/info.svg'); + } + &-update { + background-image: url('../img/icons/refresh.svg'); + } + &-eye { + background-image: url('../img/icons/eye.svg'); + } + &-copy { + background-image: url('../img/icons/copy.svg'); + } + &-save { + background-image: url('../img/icons/save.svg'); + } + &-close { + background-image: url('../img/icons/close.svg'); + } + &-link { + background-image: url('../img/icons/link.svg'); + } + + &.information { + background-image: url('../img/icons/warning.svg'); + } + + &.alert { + background-image: url('../img/icons/alert.svg'); + } + + &-chevron-up { + background-image: url('../img/icons/chevron-up.svg'); + } + + &-arrow-up { + background-image: url('../img/icons/arrow-up.svg'); + } + + &.is-desc { + transform: rotate(180deg); + } +} + +.trnd { + height: 1.286rem; + width: 1.286rem; + background-color: $primary; + mask-position: center; + mask-size: contain; + mask-repeat: no-repeat; + transition: background-color 0.15s ease-in-out; + + .has-text-warning & { + background-color: $warning; + } + + .has-text-danger & { + background-color: $danger; + } + + &.trnd-36px { + height: 2.286rem; + width: 2.286rem; + } + + .trnd-48px { + height: 2.286rem; + width: 2.286rem; + } + + &.trnd-48px { + height: 3.429rem; + width: 3.429rem; + } + + &-settings { + mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 0C5.44769 0 5 0.447716 5 1V3C5 3.55228 5.44769 4 6 4C6.55231 4 7 3.55228 7 3H17C17.5523 3 18 2.55228 18 2C18 1.44772 17.5523 1 17 1H7C7 0.447716 6.55231 0 6 0Z' fill='%230E1633'/%3E%3Cpath d='M0 2C0 1.44772 0.447693 1 1 1H3V3H1C0.447693 3 0 2.55228 0 2Z' fill='%230E1633'/%3E%3Cpath d='M0 9C0 8.44772 0.447693 8 1 8H7V10H1C0.447693 10 0 9.55228 0 9Z' fill='%230E1633'/%3E%3Cpath d='M17 8H11C11 7.44772 10.5523 7 10 7C9.44769 7 9 7.44772 9 8V10C9 10.5523 9.44769 11 10 11C10.5523 11 11 10.5523 11 10H17C17.5523 10 18 9.55228 18 9C18 8.44772 17.5523 8 17 8Z' fill='%230E1633'/%3E%3Cpath d='M1 15C0.447693 15 0 15.4477 0 16C0 16.5523 0.447693 17 1 17H11V15H1Z' fill='%230E1633'/%3E%3Cpath d='M15 15H17C17.5523 15 18 15.4477 18 16C18 16.5523 17.5523 17 17 17H15C15 17.5523 14.5523 18 14 18C13.4477 18 13 17.5523 13 17V15C13 14.4477 13.4477 14 14 14C14.5523 14 15 14.4477 15 15Z' fill='%230E1633'/%3E%3C/svg%3E%0A"); + } + + &-wallet { + mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 10C10.4477 10 10 10.4477 10 11C10 11.5523 10.4477 12 11 12H13C13.5523 12 14 11.5523 14 11C14 10.4477 13.5523 10 13 10H11Z' fill='%230E1633'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 0C1.79083 0 0 1.79086 0 4V14C0 16.2091 1.79083 18 4 18H14C16.2092 18 18 16.2091 18 14V8C18 5.79086 16.2092 4 14 4H12C12 1.79086 10.2092 0 8 0H4ZM2 6V14C2 15.1046 2.89545 16 4 16H14C15.1046 16 16 15.1046 16 14V8C16 6.89543 15.1046 6 14 6H2ZM2 4C2 2.89543 2.89545 2 4 2H8C9.10455 2 10 2.89543 10 4H2Z' fill='%230E1633'/%3E%3C/svg%3E"); + } + + &-logout { + mask-image: url("data:image/svg+xml,%3Csvg width='19' height='18' viewBox='0 0 19 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 0C1.79083 0 0 1.79086 0 4V14C0 16.2091 1.79083 18 4 18H10C10.5523 18 11 17.5523 11 17C11 16.4477 10.5523 16 10 16H4C2.89545 16 2 15.1046 2 14V4C2 2.89543 2.89545 2 4 2H10C10.5523 2 11 1.55228 11 1C11 0.447716 10.5523 0 10 0H4Z' fill='%230E1633'/%3E%3Cpath d='M15.1213 5.70708C14.7308 5.31655 14.0976 5.31655 13.7071 5.70708C13.3165 6.0976 13.3165 6.73077 13.7071 7.12129L14.5858 7.99997H6C5.44769 7.99997 5 8.44769 5 8.99997C5 9.55225 5.44769 9.99997 6 9.99997H14.6406L13.707 10.9336C13.3165 11.3241 13.3165 11.9571 13.707 12.3476C14.0975 12.7381 14.7306 12.7381 15.1211 12.3476L17.7148 9.75388C17.9575 9.51125 18.0494 9.17508 17.9905 8.86153C17.9597 8.63882 17.8555 8.43955 17.7031 8.28889L15.1213 5.70708Z' fill='%230E1633'/%3E%3C/svg%3E%0A"); + } + + &-arrow-down { + mask-image: url('../img/icons/arrow-down.svg'); + } + + &-arrow-up { + transform: rotate(180deg); + mask-image: url('../img/icons/arrow-down.svg'); + } + + &-arrow-up-down { + mask-image: url('../img/icons/arrow-up-down.svg'); + } + + &-tool { + mask-image: url('../img/icons/tool.svg'); + } + + &-alert { + mask-image: url('../img/icons/warning.svg'); + } + + &-plus { + mask-image: url('../img/icons/plus.svg'); + } + + &-close { + mask-image: url('../img/icons/close.svg'); + } + + &-check { + mask-image: url('../img/icons/check.svg'); + } + + &-arrow-left { + mask-image: url('../img/icons/arrow-left.svg'); + } + + &-arrow-right { + mask-image: url('../img/icons/arrow-left.svg'); + transform: rotate(-180deg); + } + + &-logo { + mask-image: url('../img/logo.svg'); + } + + &-loading { + &.trnd-48px { + height: 2.286rem; + width: 2.286rem; + } + background: conic-gradient(from 180deg at 50% 50%, $primary 0deg, rgba(255, 255, 255, 0) 360deg); + animation: spin 2s linear infinite; + position: relative; + border-radius: 100%; + + &:after { + content: ''; + position: absolute; + height: 22px; + width: 22px; + background: $notification-background-color; + left: calc(50% - 11px); + top: calc(50% - 11px); + border-radius: 100%; + } + + .is-small & { + height: 1rem; + width: 1rem; + + &:after { + height: 8px; + width: 8px; + left: calc(50% - 4px); + top: calc(50% - 4px); + } + } + } + + &-info { + &.trnd-48px { + height: 2.286rem; + width: 2.286rem; + } + background-image: url('../img/icons/info.svg'); + background-position: center; + background-repeat: no-repeat; + border-radius: 100%; + } + &-success { + &.trnd-48px { + height: 2.286rem; + width: 2.286rem; + } + background-image: url('../img/icons/notice/success.svg'); + background-position: center; + background-repeat: no-repeat; + border-radius: 100%; + } + &-warning { + &.trnd-48px { + height: 2.286rem; + width: 2.286rem; + } + background-image: url('../img/icons/notice/warning.svg'); + background-position: center; + background-repeat: no-repeat; + border-radius: 100%; + background-color: $warning; + } + &-danger { + &.trnd-48px { + height: 2.286rem; + width: 2.286rem; + } + background-image: url('../img/icons/notice/danger.svg'); + background-position: center; + background-repeat: no-repeat; + border-radius: 100%; + background-color: $danger; + } + + &-more { + mask-image: url('../img/icons/more.svg'); + } + + &-copy { + mask-image: url('../img/icons/copy.svg'); + } + + &-decrypt { + mask-image: url('../img/icons/decrypt.svg'); + } + + &-remove { + mask-image: url('../img/icons/remove.svg'); + } + + &-account { + mask-image: url('../img/icons/account.svg'); + } + + &-astronaut { + mask-image: url('../img/icons/astronaut.svg'); + } + + &-account-key { + mask-image: url('../img/icons/account/key.svg'); + } + + &-account-notes { + mask-image: url('../img/icons/account/notes.svg'); + } + + &-account-raw { + mask-image: url('../img/icons/account/raw.svg'); + } + + &-account-recover { + mask-image: url('../img/icons/account/recover.svg'); + } + + &-account-remove { + mask-image: url('../img/icons/account/remove.svg'); + } + + &-account-rpc { + mask-image: url('../img/icons/account/rpc.svg'); + } + + &-account-setup { + mask-image: url('../img/icons/account/setup.svg'); + } + + &-account-wallet { + mask-image: url('../img/icons/account/wallet.svg'); + } + + &-stats { + mask-image: url("data:image/svg+xml,%3Csvg width='22' height='24' viewBox='0 0 22 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13 0C12.4477 0 12 0.447693 12 1V19C12 19.5523 12.4477 20 13 20C13.5523 20 14 19.5523 14 19V1C14 0.447693 13.5523 0 13 0Z' fill='%23838BAD'/%3E%3Cpath d='M8 6C8 5.44769 8.44769 5 9 5C9.55231 5 10 5.44769 10 6V19C10 19.5523 9.55231 20 9 20C8.44769 20 8 19.5523 8 19V6Z' fill='%23838BAD'/%3E%3Cpath d='M5 8C4.44769 8 4 8.44769 4 9V19C4 19.5523 4.44769 20 5 20C5.55231 20 6 19.5523 6 19V9C6 8.44769 5.55231 8 5 8Z' fill='%23838BAD'/%3E%3Cpath d='M0 13C0 12.4477 0.447693 12 1 12C1.55231 12 2 12.4477 2 13V19C2 19.5523 1.55231 20 1 20C0.447693 20 0 19.5523 0 19V13Z' fill='%23838BAD'/%3E%3Cpath d='M0 23C0 22.4477 0.447693 22 1 22H21C21.5523 22 22 22.4477 22 23C22 23.5523 21.5523 24 21 24H1C0.447693 24 0 23.5523 0 23Z' fill='%23838BAD'/%3E%3Cpath d='M16 9C16 8.44769 16.4477 8 17 8C17.5523 8 18 8.44769 18 9V19C18 19.5523 17.5523 20 17 20C16.4477 20 16 19.5523 16 19V9Z' fill='%23838BAD'/%3E%3Cpath d='M21 5C20.4477 5 20 5.44769 20 6V19C20 19.5523 20.4477 20 21 20C21.5523 20 22 19.5523 22 19V6C22 5.44769 21.5523 5 21 5Z' fill='%23838BAD'/%3E%3C/svg%3E%0A"); + } + + &-twitter { + mask-image: url("data:image/svg+xml,%3Csvg width='24' height='20' viewBox='0 0 24 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M24 2.3037C23.1075 2.69439 22.1565 2.95335 21.165 3.07909C22.185 2.47135 22.9635 1.51634 23.3295 0.365239C22.3785 0.93106 21.3285 1.33073 20.2095 1.55376C19.3065 0.594262 18.0195 0 16.6155 0C13.8915 0 11.6985 2.2064 11.6985 4.91127C11.6985 5.30046 11.7315 5.67468 11.8125 6.03094C7.722 5.83185 4.1025 3.87543 1.671 0.895135C1.2465 1.6301 0.9975 2.47135 0.9975 3.37696C0.9975 5.07742 1.875 6.58478 3.183 7.45746C2.3925 7.44249 1.617 7.21347 0.96 6.85272C0.96 6.86769 0.96 6.88715 0.96 6.90661C0.96 9.29264 2.6655 11.2745 4.902 11.7311C4.5015 11.8403 4.065 11.8927 3.612 11.8927C3.297 11.8927 2.979 11.8748 2.6805 11.8089C3.318 13.7533 5.127 15.1829 7.278 15.2293C5.604 16.536 3.4785 17.3234 1.1775 17.3234C0.774 17.3234 0.387 17.3054 0 17.2561C2.1795 18.6586 4.7625 19.4595 7.548 19.4595C16.602 19.4595 21.552 11.9751 21.552 5.48757C21.552 5.27052 21.5445 5.06096 21.534 4.85289C22.5105 4.16133 23.331 3.29763 24 2.3037Z' fill='%23838BAD'/%3E%3C/svg%3E%0A"); + } + + &-telegram { + mask-image: url("data:image/svg+xml,%3Csvg width='24' height='20' viewBox='0 0 24 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.4174 13.1813L9.0204 18.7653C9.58841 18.7653 9.83441 18.5213 10.1294 18.2283L12.7925 15.6833L18.3106 19.7243C19.3226 20.2883 20.0357 19.9913 20.3087 18.7933L23.9308 1.8214L23.9318 1.8204C24.2528 0.324404 23.3907 -0.260593 22.4047 0.106405L1.1142 8.25736C-0.33883 8.82136 -0.31683 9.63136 0.867199 9.99835L6.31033 11.6913L18.9536 3.78039C19.5486 3.38639 20.0897 3.60439 19.6446 3.99839L9.4174 13.1813Z' fill='%23838BAD'/%3E%3C/svg%3E%0A"); + } + + &-github { + mask-image: url("data:image/svg+xml,%3Csvg width='24' height='23' viewBox='0 0 24 23' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 0C5.37 0 0 5.28 0 11.792C0 17.003 3.438 21.422 8.205 22.98C8.805 23.091 9.025 22.726 9.025 22.413C9.025 22.133 9.015 21.391 9.01 20.408C5.672 21.119 4.968 18.826 4.968 18.826C4.422 17.465 3.633 17.101 3.633 17.101C2.546 16.37 3.717 16.385 3.717 16.385C4.922 16.467 5.555 17.6 5.555 17.6C6.625 19.403 8.364 18.882 9.05 18.581C9.158 17.818 9.467 17.299 9.81 17.004C7.145 16.709 4.344 15.695 4.344 11.177C4.344 9.89 4.809 8.838 5.579 8.013C5.444 7.715 5.039 6.516 5.684 4.892C5.684 4.892 6.689 4.576 8.984 6.101C9.944 5.839 10.964 5.709 11.984 5.703C13.004 5.709 14.024 5.839 14.984 6.101C17.264 4.576 18.269 4.892 18.269 4.892C18.914 6.516 18.509 7.715 18.389 8.013C19.154 8.838 19.619 9.89 19.619 11.177C19.619 15.707 16.814 16.704 14.144 16.994C14.564 17.348 14.954 18.071 14.954 19.176C14.954 20.754 14.939 22.022 14.939 22.405C14.939 22.714 15.149 23.083 15.764 22.965C20.565 21.417 24 16.995 24 11.792C24 5.28 18.627 0 12 0Z' fill='%23838BAD'/%3E%3C/svg%3E%0A"); + } + + &-discord { + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath d='M297.216 243.2c0 15.616-11.52 28.416-26.112 28.416-14.336 0-26.112-12.8-26.112-28.416s11.52-28.416 26.112-28.416c14.592 0 26.112 12.8 26.112 28.416zm-119.552-28.416c-14.592 0-26.112 12.8-26.112 28.416s11.776 28.416 26.112 28.416c14.592 0 26.112-12.8 26.112-28.416.256-15.616-11.52-28.416-26.112-28.416zM448 52.736V512c-64.494-56.994-43.868-38.128-118.784-107.776l13.568 47.36H52.48C23.552 451.584 0 428.032 0 398.848V52.736C0 23.552 23.552 0 52.48 0h343.04C424.448 0 448 23.552 448 52.736zm-72.96 242.688c0-82.432-36.864-149.248-36.864-149.248-36.864-27.648-71.936-26.88-71.936-26.88l-3.584 4.096c43.52 13.312 63.744 32.512 63.744 32.512-60.811-33.329-132.244-33.335-191.232-7.424-9.472 4.352-15.104 7.424-15.104 7.424s21.248-20.224 67.328-33.536l-2.56-3.072s-35.072-.768-71.936 26.88c0 0-36.864 66.816-36.864 149.248 0 0 21.504 37.12 78.08 38.912 0 0 9.472-11.52 17.152-21.248-32.512-9.728-44.8-30.208-44.8-30.208 3.766 2.636 9.976 6.053 10.496 6.4 43.21 24.198 104.588 32.126 159.744 8.96 8.96-3.328 18.944-8.192 29.44-15.104 0 0-12.8 20.992-46.336 30.464 7.68 9.728 16.896 20.736 16.896 20.736 56.576-1.792 78.336-38.912 78.336-38.912z'%3E%3C/path%3E%3C/svg%3E"); + } + + &-discourse { + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath d='M225.9 32C103.3 32 0 130.5 0 252.1 0 256 .1 480 .1 480l225.8-.2c122.7 0 222.1-102.3 222.1-223.9C448 134.3 348.6 32 225.9 32zM224 384c-19.4 0-37.9-4.3-54.4-12.1L88.5 392l22.9-75c-9.8-18.1-15.4-38.9-15.4-61 0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128z'%3E%3C/path%3E%3C/svg%3E"); + } + + &-medium { + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M71.5 142.3c.6-5.9-1.7-11.8-6.1-15.8L20.3 72.1V64h140.2l108.4 237.7L364.2 64h133.7v8.1l-38.6 37c-3.3 2.5-5 6.7-4.3 10.8v272c-.7 4.1 1 8.3 4.3 10.8l37.7 37v8.1H307.3v-8.1l39.1-37.9c3.8-3.8 3.8-5 3.8-10.8V171.2L241.5 447.1h-14.7L100.4 171.2v184.9c-1.1 7.8 1.5 15.6 7 21.2l50.8 61.6v8.1h-144v-8L65 377.3c5.4-5.6 7.9-13.5 6.5-21.2V142.3z'%3E%3C/path%3E%3C/svg%3E"); + } + + &-account { + mask-image: url('../img/icons/account.svg'); + } + + &-astronaut { + mask-image: url('../img/icons/astronaut.svg'); + } + + &-ethereum-mainnet { + mask-image: url('../img/icons/ethereum.svg'); + } + + &-ethereum-goerli { + mask-image: url('../img/icons/goerli.svg'); + } + + &-optimism { + mask-image: url('../img/icons/optimism.svg'); + } + + &-arbitrum-one { + mask-image: url('../img/icons/arbitrum.svg'); + } + + &-binance-smart-chain { + mask-image: url('../img/icons/binance.svg'); + } + + &-polygon-matic-network { + mask-image: url('../img/icons/polygon.svg'); + } + + &-gnosis-chain { + mask-image: url('../img/icons/gnosis.svg'); + } + + &-avalanche-mainnet { + mask-image: url('../img/icons/avalanche.svg'); + } + + &-account-key { + mask-image: url('../img/icons/account/key.svg'); + } + + &-account-notes { + mask-image: url('../img/icons/account/notes.svg'); + } + + &-account-raw { + mask-image: url('../img/icons/account/raw.svg'); + } + + &-account-recover { + mask-image: url('../img/icons/account/recover.svg'); + } + + &-account-remove { + mask-image: url('../img/icons/account/remove.svg'); + } + + &-account-rpc { + mask-image: url('../img/icons/account/rpc.svg'); + } + + &-account-setup { + mask-image: url('../img/icons/account/setup.svg'); + } + + &-account-wallet { + mask-image: url('../img/icons/account/wallet.svg'); + } + + &-account-file { + mask-image: url('../img/icons/account/file.svg'); + } + + &-account-balance { + mask-image: url('../img/icons/account/balance.svg'); + } + + &-metamask { + mask-image: url('../img/icons/metamask.svg'); + } + + &-walletConnect { + mask-image: url('../img/walletConnect.svg'); + } + + &-open-book { + mask-image: url('../img/icons/open-book.svg'); + } +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + to { + transform: rotate(-1turn); + } +} diff --git a/assets/styles/components/_info.scss b/assets/styles/components/_info.scss new file mode 100644 index 0000000..b7a7fb9 --- /dev/null +++ b/assets/styles/components/_info.scss @@ -0,0 +1,45 @@ +.info { + &-name { + font-size: 0.929rem; + } + + &-value { + font-size: 1.429rem; + color: $primary; + font-weight: 700; + + &.has-tooltip { + display: flex; + align-items: center; + + .b-tooltip { + margin-left: 0.75rem; + + .tooltip-trigger { + height: 18px; + } + } + + @include mobile { + justify-content: center; + } + } + } + + &-line { + display: none; + + @include desktop { + width: 192px; + height: 42px; + display: inline-block; + position: relative; + background-image: url('../img/info-line.svg'); + margin-top: -0.643rem; + + .column:last-child & { + transform: scaleX(-1); + } + } + } +} diff --git a/assets/styles/components/_label.scss b/assets/styles/components/_label.scss new file mode 100644 index 0000000..af03c08 --- /dev/null +++ b/assets/styles/components/_label.scss @@ -0,0 +1,14 @@ +.label { + font-size: 1.125rem; + display: flex; + align-items: center; + flex-wrap: wrap; + + .b-tooltip { + margin: 0 .45rem; + } + + &.is-primary { + color: $primary; + } +} diff --git a/assets/styles/components/_loading.scss b/assets/styles/components/_loading.scss new file mode 100644 index 0000000..71d59cc --- /dev/null +++ b/assets/styles/components/_loading.scss @@ -0,0 +1,55 @@ +.loading-overlay { + &.is-full-page { + .loading-background { + background:rgba(0,0,0,0.85); + } + } + .loading-container { + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + .loading-tornado { + &:after { + content: ''; + display: block; + height: 60px; + width: 60px; + background-image: url('../img/logo.svg'); + animation: spinAroundReverse 2000ms infinite linear; + } + } + + .loading-message { + padding-top: .5rem; + color: $primary; + text-align: center; + + + .button { + margin-top: .5rem; + } + } + .loading-alert { + padding-top: 1.5rem; + color: $primary; + font-size: 0.8rem; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; + .button { + margin-top: 1rem; + font-size: 0.8rem; + } + } + } +} + +@keyframes spinAroundReverse { + from { + transform: rotate(359deg); } + to { + transform: rotate(0deg); } +} diff --git a/assets/styles/components/_modal.scss b/assets/styles/components/_modal.scss new file mode 100644 index 0000000..053f717 --- /dev/null +++ b/assets/styles/components/_modal.scss @@ -0,0 +1,62 @@ +.modal.is-pinned { + justify-content: flex-start; + + .animation-content { + margin-top: 4rem; + } + + @include desktop { + @media screen and (max-height: 720px - 1px) { + .dropdown { + .background { + display: block; + } + + .dropdown-menu { + position: fixed; + width: calc(100vw - 40px); + max-width: 460px; + max-height: calc(100vh - 120px); + top: 25% !important; + left: 50% !important; + bottom: auto !important; + right: auto !important; + transform: translate3d(-50%, -25%, 0); + white-space: normal; + overflow-y: auto; + z-index: 50; + } + } + } + + @media screen and (min-height: 720px) { + .box-modal { + position: static; + } + + .animation-content { + position: relative; + } + + .b-tabs .tab-content { + position: static; + } + + .dropdown { + position: static; + + .dropdown-menu { + padding: 0px 1.5rem; + margin-top: calc(2.857em + 4px); + top: initial; + + > .dropdown-content { + overflow-y: auto; + max-height: calc(100vh - 20rem); + margin: 2px; + } + } + } + } + } +} diff --git a/assets/styles/components/_notice.scss b/assets/styles/components/_notice.scss new file mode 100644 index 0000000..5693a6d --- /dev/null +++ b/assets/styles/components/_notice.scss @@ -0,0 +1,42 @@ +.notice { + border-radius: 4px; + border: 1px solid $white; + color: $white; + padding: 0.75rem; + + &:not(:last-child) { + margin-bottom: 1.25rem; + } + + &__h { + margin-bottom: 0.75rem; + } + + &.is-primary { + border-color: $primary; + + .notice__h { + color: $primary; + } + } + + &.is-warning { + border-color: $warning; + + .notice__h { + color: $warning; + } + } + + a { + text-decoration: underline; + text-transform: lowercase; + color: $primary; + } + + &.is-recovery-key { + border-color: $input-border-color; + color: $primary; + word-break: break-all; + } +} diff --git a/assets/styles/components/_notification.scss b/assets/styles/components/_notification.scss new file mode 100644 index 0000000..7603fbc --- /dev/null +++ b/assets/styles/components/_notification.scss @@ -0,0 +1,166 @@ +.notification { + &.main-notification { + padding: 0; + border: solid 1px #393939; + overflow: hidden; + + .modal & { + overflow: initial; + } + + &:not(:last-child) { + margin-bottom: 2rem; + } + + @include until(375px) { + font-size: 0.85rem; + } + + .media { + align-items: center; + + .media-left { + position: relative; + align-self: stretch; + display: inline-flex; + align-items: center; + + + .media-content { + padding: 0.5rem 2rem 0.5rem 0.5rem; + } + + &:after { + content: ''; + position: absolute; + transform: skewX(20deg); + background-color: #1d1d1d; + border-right: 1px solid #393939; + top: -1px; + bottom: -1px; + border-top-right-radius: 2px; + left: -50%; + right: -0.2rem; + } + + > .icon { + position: relative; + z-index: 1; + } + + @media print { + display: none; + } + } + + &-content { + text-align: center; + padding: 0.5rem 2rem 0.5rem 1rem; + + span { + @media print { + font-weight: bold; + } + } + } + } + + .delete { + top: 50%; + margin-top: -10px; + + &::before, + &::after { + background-color: #393939; + } + } + + &.is-primary { + background-color: #000403; + color: #eee; + border-color: $primary; + max-width: 500px; + margin: 0 auto; + + .media { + .media-left { + &:after { + background-color: #1a1203; + border-right: 1px solid $primary; + } + } + .media-content { + strong { + color: $primary; + } + } + } + } + + &.is-warning { + background-color: #000403; + color: #eee; + border-color: $warning; + + .media { + .media-left { + &:after { + background-color: #1a1203; + border-right: 1px solid $warning; + } + } + .media-content { + strong { + color: $warning; + } + } + } + } + + @media print { + border-color: #000 !important; + color: #000 !important; + + .media-content { + span { + color: #000 !important; + } + } + } + } +} + +.notices { + .notification { + width: 290px; + pointer-events: auto; + padding: 1.071rem 3.214rem 1.071rem 1.071em; + font-size: 0.929rem; + + a:not(.button):not(.dropdown-item) { + color: $primary; + display: block; + margin-top: 0.15rem; + text-decoration: none; + font-size: 0.857rem; + + &:hover { + text-decoration: underline; + } + } + + .media { + align-items: center; + + &-content { + b { + white-space: nowrap; + } + } + } + + .delete { + right: 1rem; + top: calc(50% - 10px); + } + } +} diff --git a/assets/styles/components/_proposals.scss b/assets/styles/components/_proposals.scss new file mode 100644 index 0000000..05462b4 --- /dev/null +++ b/assets/styles/components/_proposals.scss @@ -0,0 +1,377 @@ +.proposals { + &-list { + &--header { + display: flex; + align-items: center; + margin-bottom: 2rem; + + .title { + color: #fff; + font-size: 1.714rem; + margin-bottom: 0; + flex: 1; + } + + .field { + margin-bottom: 0; + + &-btn { + flex: 1; + text-align: right; + } + } + + .b-radio.button { + border-radius: 0; + color: #6b6b6b; + background-color: #000403; + border-left: none; + border-right: none; + border-top: none; + border-bottom: 3px solid #2a2a2a; + padding-left: 1.75rem; + padding-right: 1.75rem; + min-width: 100px; + + &:focus:not(:active), + &.is-focused:not(:active) { + box-shadow: none; + } + + &:hover, + &.is-primary { + color: $primary; + border-bottom-color: $primary; + } + } + + @include mobile { + flex-direction: column; + + .title { + order: 1; + margin-top: 1.5rem; + margin-bottom: 1.5rem; + } + + .field { + &.field-tabs { + order: 3; + } + + &.field-btn { + order: 2; + margin-bottom: 1.5rem; + } + } + } + } + } + + &-box { + margin: 1.25rem 0; + padding: 1.429rem; + background: #1f1f1f; + border-radius: 6px; + cursor: pointer; + + .title { + color: #fff; + font-size: 1.143rem; + margin-bottom: 1rem; + line-height: 1.286; + } + + &--info { + display: flex; + + @include until(576px) { + flex-wrap: wrap; + } + + @include from(576px) { + align-items: center; + } + + .b-skeleton { + width: auto; + } + } + + &--id { + @include until(576px) { + margin-bottom: 0.5rem; + } + + margin-right: 0.714rem; + + .tag { + color: #fff; + background: #363636; + min-width: 30px; + } + } + + .date { + @include until(576px) { + margin-top: 0.5rem; + width: 100%; + } + + @include from(576px) { + margin-left: 1.5rem; + } + + span { + color: #6b6b6b; + } + } + + .results { + background-color: #1a1a1a; + border-radius: 6px; + padding: 1.429rem; + + @include mobile { + margin-top: 1rem; + } + + @include tablet { + margin-top: -0.7145rem; + margin-bottom: -0.7145rem; + margin-right: -0.7145rem; + } + + .result { + + .result { + margin-top: 0.7145rem; + } + + display: flex; + justify-content: space-between; + align-items: center; + + span.has-text-primary, + span.has-text-danger { + display: inline-flex; + align-items: center; + font-weight: 700; + } + + span.icon { + margin-right: 0.5rem; + } + + .b-skeleton { + width: auto; + } + } + } + } +} + +.button.is-back { + margin-bottom: 1.5rem; + padding-left: 0; + padding-right: 0; + background-color: transparent; + border-color: transparent; + color: #94febf; + + &:hover, + &:focus { + background-color: transparent; + } + + &:focus:not(:active) { + box-shadow: none; + } + + .trnd { + background-color: $primary; + } +} + +.proposal { + .title { + color: #fff; + font-size: 1.714rem; + margin-bottom: 2.5rem; + line-height: 1.286; + } + + a { + color: $primary; + } + + .description { + p { + line-height: 1.7; + + &:not(:last-child) { + margin-bottom: 2rem; + } + } + } + + &-block { + background-color: #1a1a1a; + border-radius: 6px; + padding: 1.429rem; + + .b-tooltip.fit-content { + width: 100%; + + &:not(:last-child) { + margin-bottom: 1rem; + } + + .buttons__halfwidth { + width: 100%; + } + } + + @include mobile { + margin-top: 1.5rem; + } + + + .proposal-block { + @include tablet { + margin-top: 1.5rem; + } + } + + .title { + font-size: 1.143rem; + + &:not(:last-child) { + margin-bottom: 1.25rem; + } + } + + .label { + .percent { + margin-left: auto; + padding-left: 0.5rem; + } + + .b-skeleton { + width: auto; + } + } + + strong { + display: block; + } + + .columns { + &.has-countdown { + .column { + &:not(:last-child) { + padding-bottom: 0; + } + } + } + + &:not(.has-countdown) { + .column { + @include until(576px) { + &:not(:last-child) { + padding-bottom: 0; + } + } + + @include from(576px) { + &:not(:nth-last-child(-n + 2)) { + padding-bottom: 0; + } + } + } + } + } + + .column { + display: flex; + flex-direction: column; + + .value { + display: flex; + align-items: center; + flex-grow: 1; + font-size: 0.929rem; + margin-top: 0.35rem; + + .address { + font-size: 0.75rem; + line-height: 1.5; + @include noWrap; + } + + .tag { + height: 1.714rem; + padding-left: 0.5rem; + padding-right: 0.5rem; + min-width: auto; + font-size: 0.714rem; + } + } + } + } +} + +.governance-head { + position: relative; + padding: 0 2.143rem 1.786rem; + margin-bottom: 4.85rem; + + border: 1px solid #2a2a2a; + border-top-width: 0; + + border-bottom-left-radius: 25px; + border-bottom-right-radius: 25px; + + .column { + &:first-child { + @include mobile { + padding-top: 0; + } + } + + @include tablet { + padding-top: 0; + + .info-value.without-label { + padding-top: 1.394rem; + } + } + + @include touch { + text-align: center; + + .info-value.has-tooltip { + justify-content: center; + } + } + + button.is-text { + border-width: 0; + padding-left: 0; + padding-right: 0; + color: $primary; + height: 2.143rem; + + .trnd { + background-color: $primary; + } + + &:hover { + text-decoration: underline; + } + + &.is-loading::after { + border-left-color: $primary; + border-bottom-color: $primary; + } + } + } +} diff --git a/assets/styles/components/_radio.scss b/assets/styles/components/_radio.scss new file mode 100644 index 0000000..15e3ddc --- /dev/null +++ b/assets/styles/components/_radio.scss @@ -0,0 +1,31 @@ +.b-radio { + &.radio { + input[type=radio] { + + .check { + border-color: $primary; + } + + &:checked { + + .check { + &:before { + transform: scale(.6); + } + } + } + } + + + .radio { + margin-left: 1rem; + } + + .control-label { + display: flex; + align-items: center; + color: $white; + + .button { + margin-left: .45rem; + } + } + } +} diff --git a/assets/styles/components/_slider.scss b/assets/styles/components/_slider.scss new file mode 100644 index 0000000..8448ad5 --- /dev/null +++ b/assets/styles/components/_slider.scss @@ -0,0 +1,87 @@ +.field-slider { + .label { + margin-bottom: 0; + display: flex; + justify-content: space-between; + align-items: center; + } + + .input { + font-size: 0.857rem; + padding-left: 0.643rem; + padding-right: 0.643rem; + text-align: center; + } + + .control.has-text { + font-size: 0.857rem; + } + + .b-slider.is-primary { + margin: 0.429em 0 0; + padding-top: 8px; + + .b-slider-track { + height: 2px; + border-radius: 0; + } + + .b-slider-tick { + height: 2px; + width: 2px; + + .b-slider-tick-label { + margin-top: 5px; + user-select: none; + } + + &.is-tick-hidden { + &[style*='left: 0%'] { + .b-slider-tick-label { + left: 0; + transform: none; + } + } + &[style*='left: 100%'] { + .b-slider-tick-label { + left: auto; + right: 0; + transform: none; + } + } + } + } + + .b-slider-thumb-wrapper { + &[style*='left: 0%'] { + transform: translate(0%, -50%); + } + &[style*='left: 100%'] { + transform: translate(-100%, -50%); + } + } + + .b-slider-fill { + background-color: transparent !important; + } + + .b-slider-thumb { + height: 16px; + width: 16px; + border-color: $primary; + background-color: $primary; + position: relative; + + &::after { + content: ''; + position: absolute; + width: 6px; + height: 6px; + background: #0e1633; + left: calc(50% - 3px); + top: calc(50% - 3px); + border-radius: 6px; + } + } + } +} diff --git a/assets/styles/components/_steps.scss b/assets/styles/components/_steps.scss new file mode 100644 index 0000000..f841118 --- /dev/null +++ b/assets/styles/components/_steps.scss @@ -0,0 +1,146 @@ +.b-steps { + margin-bottom: 1.25rem; + + .steps { + + .step-content { + display: none; + } + + .step-items { + .step-item { + .step-details { + margin-top: 1rem; + + @include until(375px) { + word-spacing: 100px; + } + } + + .step-link { + transition: color .15s ease-in-out; + + &:not(.is-clickable) { + color: #393939; + + .step-marker { + border-color: #393939; + + &:before { + background-color: #393939; + } + } + } + } + + .step-marker { + position: relative; + + &:before { + content: ""; + display: flex; + position: absolute; + left: 50%; + margin-left: calc(-1.5rem/2); + bottom: 50%; + margin-bottom: calc(-1.5rem/2); + width: 1.5rem; + height: 1.5rem; + transition: transform 150ms ease-out; + border-radius: 50%; + transform: scale(0); + background-color: $primary; + } + } + + &:not(:first-child) { + &::before { + content: none; + } + + .step-link { + &::before { + content: ''; + display: block; + position: absolute; + background-color: $primary; + height: .2em; + width: 100%; + left: -50%; + bottom: 0; + top: .7rem; + } + + &:not(.is-clickable) { + &::before { + background-color: #393939; + } + } + } + } + + &:first-child, &:last-child { + .step-link { + &::after { + content: ''; + display: block; + position: absolute; + background: $primary; + height: .2em; + width: 50%; + bottom: 0; + top: .7rem; + } + + &:not(.is-clickable) { + &::after { + background: #393939; + } + } + } + } + + &:first-child { + .step-link { + &::after { + left: 0; + } + } + } + + &:last-child { + .step-link { + &::after { + right: 0; + } + } + } + + &.is-active { + .step-link { + color: $primary; + + &:not(.is-clickable) { + color: #393939; + } + + .step-marker { + background-color: $primary-invert; + + &:before { + transform: scale(0.6); + } + } + } + } + + &:not(.is-active) { + display: block; + } + + &::before, &::after { + content: none; + } + } + } + } +} diff --git a/assets/styles/components/_tab-with-corner.scss b/assets/styles/components/_tab-with-corner.scss new file mode 100644 index 0000000..642d673 --- /dev/null +++ b/assets/styles/components/_tab-with-corner.scss @@ -0,0 +1,114 @@ +.tab-with-corner { + border: 1px solid #393939; + display: inline-flex; + padding: 0.68rem .625rem; + position: relative; + z-index: 1; + background-color: $primary-invert; + + &:before, &:after { + position: absolute; + border: 1px solid #393939; + transform-origin: bottom left; + width: 2.5em; + top: 0; + bottom: 0; + background-color: $primary-invert; + z-index: -1; + } + + span.is-small { + font-size: .7rem; + line-height: 2.9; + + @include until(375px) { + font-size: .6rem; + line-height: 2.8; + } + } + + &.is-left-bottom { + padding-left: 1.75rem; + border-top-width: 0; + border-right-width: 0; + margin-right: 1.75rem; + border-bottom-left-radius: 4px; + + @include until(375px) { + padding-left: 1.5rem; + padding-right: .75rem; + } + + &:after { + content: ''; + right: -1rem; + transform: skewX(-20deg); + border-bottom-right-radius: 4px; + border-top-width: 0; + border-left-width: 0; + bottom: -1px; + } + } + + &.is-right-bottom { + margin-left: auto; + padding-right: 1.75rem; + border-top-width: 0; + border-left-width: 0; + border-bottom-right-radius: 4px; + + @include until(375px) { + padding-right: 1.5rem; + padding-left: .75rem; + } + + &:before { + content: ''; + left: -1rem; + transform: skewX(20deg); + border-bottom-left-radius: 4px; + border-right-width: 0; + border-top-width: 0; + bottom: -1px; + + @include until(375px) { + left: -.5rem; + } + } + } + + &.is-left-top { + padding-left: 1.75rem; + border-bottom-width: 0; + border-right-width: 0; + margin-right: 1.75rem; + border-top-left-radius: 4px; + + @include until(375px) { + padding-left: 1.5rem; + padding-right: .75rem; + } + + &:after { + content: ''; + right: -1rem; + transform: skewX(20deg); + border-top-right-radius: 4px; + border-left-width: 0; + border-bottom-width: 0; + top: -1px; + + @include until(375px) { + right: -.5rem; + } + } + } + + &.is-primary { + border-color: $primary; + + &:before, &:after { + border-color: $primary; + } + } +} diff --git a/assets/styles/components/_tabs.scss b/assets/styles/components/_tabs.scss new file mode 100644 index 0000000..886786b --- /dev/null +++ b/assets/styles/components/_tabs.scss @@ -0,0 +1,251 @@ +.b-tabs.is-tornado { + display: flex; + flex-direction: column; + margin-bottom: 0; + + @include tablet { + max-width: 440px; + } + + .tabs { + font-size: 1.35rem; + min-height: 3.3483rem; + + @include until(375px) { + font-size: 1.135rem; + min-height: 3.074rem; + } + + ul { + justify-content: space-between; + + li { + a { + color: $primary; + font-weight: $weight-bold; + position: relative; + z-index: 1; + border: 1px solid $primary; + border-bottom-width: 0; + background-color: #0e1f17; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out; + padding: 0.68rem 1.25rem; + + &:after, + &:before { + position: absolute; + background-color: #0e1f17; + transform-origin: bottom left; + width: 1.5rem; + border: 1px solid $primary; + border-bottom-width: 0; + top: -1px; + bottom: 0; + transition: background-color 0.15s ease-in-out; + } + + &:hover { + background-color: lighten(#0e1f17, 10%); + + &:after, + &:before { + background-color: lighten(#0e1f17, 10%); + } + } + } + + &:first-child { + a { + margin-right: 1.75rem; + border-top-left-radius: 4px; + border-right-width: 0; + padding-left: 1.75rem; + + @include until(375px) { + padding-left: 1.5rem; + padding-right: 0.75rem; + } + + &:after { + content: ''; + right: -1.5rem; + transform: skewX(20deg); + border-left: none; + border-top-right-radius: 4px; + } + } + } + + &:last-child { + a { + margin-left: 1.75rem; + border-top-right-radius: 4px; + border-left-width: 0; + padding-right: 1.75rem; + + @include until(375px) { + padding-right: 1.5rem; + padding-left: 0.75rem; + } + + &:before { + content: ''; + left: -1.5rem; + transform: skewX(-20deg); + border-right: none; + border-top-left-radius: 4px; + } + } + } + + &.is-active { + a { + color: $primary-invert; + background-color: $primary; + + &:after, + &:before { + background-color: $primary; + } + } + } + } + } + } + + .tab-content { + background-color: $primary-invert; + padding: 1.5rem 1.5rem 2rem; + border: 1px solid $primary; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + min-height: 19.536rem; + + .help { + a { + color: $primary; + white-space: nowrap; + } + } + + .relayer-network { + margin: 1.5rem 0; + } + + .withdraw-radio { + @include mobile { + .b-tooltip { + &:after { + width: 200px; + } + } + + .radio-relayer { + .b-tooltip { + &:before, + &:after { + top: auto; + right: auto; + bottom: calc(100% + #{$tooltip-arrow-size} + #{$tooltip-arrow-margin}); + left: 50%; + transform: translateX(-50%); + margin-left: 0.25rem; + } + &:before { + border-top: 5px solid $primary; + border-right: 5px solid transparent; + border-left: 5px solid transparent; + border-bottom: 0; + bottom: calc(100% + 2px); + } + } + } + + .radio-metamask { + .b-tooltip { + &:before, + &:after { + top: 50%; + right: calc(100% + #{$tooltip-arrow-size} + #{$tooltip-arrow-margin}); + bottom: auto; + left: auto; + transform: translateY(-50%); + } + &:before { + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid $primary; + border-right: 0; + right: calc(100% + 2px); + } + } + } + } + } + + .withdraw-address { + margin-bottom: 1.95rem; + + + .field { + margin-top: -0.1rem; + margin-bottom: 1.35rem; + } + + .label { + .fee { + margin-left: auto; + color: #7b7b7b; + } + } + } + fieldset[disabled] { + .withdraw-address { + .fee { + color: darken(#7b7b7b, 20%); + } + } + } + } +} + +.b-tabs.is-modal { + &:not(:last-child) { + margin-bottom: 1.25rem; + } + + .tabs { + overflow: initial; + + ul { + li { + flex: 1 1 auto; + + a { + transition: border-color 0.15s ease-in-out; + border-bottom: 2px solid #767676; + + &:hover { + border-bottom-color: $primary; + } + + .b-tooltip { + margin: 0 0.45rem; + } + + .is-manage-box & { + padding: 0.5em; + } + } + + &.is-active { + a { + border-bottom: 2px solid $primary; + } + } + } + } + } + .tab-content { + padding: 1rem 0 0; + } +} diff --git a/assets/styles/components/_textarea.scss b/assets/styles/components/_textarea.scss new file mode 100644 index 0000000..5950f0b --- /dev/null +++ b/assets/styles/components/_textarea.scss @@ -0,0 +1,6 @@ +.is-disabled-resize { + .textarea { + height: 4.393rem; + resize: none; + } +} diff --git a/assets/styles/components/_txs.scss b/assets/styles/components/_txs.scss new file mode 100644 index 0000000..b48bb94 --- /dev/null +++ b/assets/styles/components/_txs.scss @@ -0,0 +1,382 @@ +.txs { + padding-top: 0.75rem; + font-size: 0.85rem; + + .tx-filters { + @include tablet { + margin-bottom: 0; + } + + @include mobile { + justify-content: center; + + .break { + width: 100%; + } + } + + .button { + &.is-primary.is-outlined { + &:not(.is-hovered):focus { + background-color: #0e1f17; + border-color: $primary; + color: $primary; + } + } + } + + &-title { + font-size: 0.75rem; + margin-bottom: 0.5rem; + margin-right: 1rem; + + @include mobile { + width: 100%; + text-align: center; + margin-right: 0; + } + } + + .field { + &:not(:last-child) { + margin-bottom: 0; + margin-right: 0.5rem; + } + } + } + + .tx-head { + padding: 1.5rem 1.429rem 1.5rem 2.143rem; + + @include mobile { + display: none; + } + + .columns { + .column { + display: flex; + align-items: center; + + &.is-sortable { + cursor: pointer; + + > .icon { + height: 0.786rem; + width: 0.786rem; + margin-left: 0.5rem; + flex: none; + } + + .b-tooltip { + margin-left: 0.45rem; + } + } + } + } + + &-mobile { + @include tablet { + display: none; + } + } + } + + .columns { + .column { + flex: none; + + &.is-time { + width: 15%; + } + + &.is-amount { + width: 14%; + } + + &.is-deposit { + width: 14.5%; + } + + &.is-status { + width: 12%; + } + + &.is-hash { + width: 10%; + @include desktop { + width: 12.5%; + } + + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + } + + &-buttons { + width: 145px; + display: inline-flex; + + @include tablet-only { + width: 102px; + + .button { + span { + &:not(.icon) { + display: none; + } + + &.icon { + margin-right: 0; + } + } + } + } + + > .button:last-child { + margin-left: 0.65rem; + } + } + } + } + + .box-tx { + background-color: #1f1f1f; + border: none; + padding: 1.571rem 1.429rem 1.571rem 2.143rem; + + .columns { + min-height: 3.642rem; + } + + &:before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 10px; + background-color: $primary; + border-radius: 6px 0px 0px 6px; + } + + &:not(:last-child) { + margin-bottom: 0; + } + + + .box-tx { + margin-top: 0.825rem; + } + + &.is-spent { + background-color: #111312; + color: #878887; + + &:before { + background-color: #538968; + } + } + + &.is-violet { + &:before { + background-color: $violet; + } + } + + &.is-waiting { + &:before { + background-color: #6b6b6b; + } + } + + &.is-danger { + &:before { + background-color: $danger; + } + + button.is-dark { + path { + fill: $danger; + } + } + } + + &.is-white { + color: $white; + text-align: center; + + &:before { + content: none; + } + } + + .details { + .detail { + display: flex; + + &-label { + flex: 1 0 128px; + } + + &-description { + @include noWrap; + } + + .button { + margin-left: 0.45rem; + } + + + .detail { + padding-top: 0.5rem; + } + } + } + + a { + color: $primary; + + &:hover { + text-decoration: underline; + } + } + + @include mobile { + .columns { + display: flex; + flex-wrap: wrap; + align-items: stretch; + + .column { + width: 50%; + flex: none; + + &:before { + content: attr(data-label); + display: block; + color: $white; + } + + &.is-time { + order: 1; + } + + &.is-amount { + order: 2; + } + + &.is-deposit { + order: 3; + } + + &.is-status { + order: 4; + } + + &.is-hash { + order: 5; + width: 100%; + } + + &-buttons { + order: 7; + width: 100%; + display: inline-flex; + + .b-tooltip { + flex-grow: 1; + + .button { + width: 100%; + } + } + } + } + } + } + + .status-with-loading { + display: flex; + align-items: center; + + .icon { + margin-left: 0.5rem; + } + } + + &.is-encrypted { + border: 1px solid $primary; + + .lock { + height: 30px; + width: 30px; + border-radius: 4px; + background-color: #182922; + border: 1px solid $primary; + + &:after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + margin-left: -7px; + margin-top: -7px; + background-color: $primary; + height: 14px; + width: 14px; + mask-image: url(../img/icons/lock.svg); + mask-position: center; + mask-repeat: no-repeat; + } + + &-tooltip { + position: absolute; + left: 0; + top: 50%; + transform: translate(-50%, -50%); + } + } + + &:before { + content: none; + } + + &.is-danger { + border-color: $danger; + + .lock { + background-color: #2a0c12; + border-color: $danger; + + &:after { + background-color: $danger; + } + } + } + + &.is-waiting { + border-color: #4c4c4c; + + .lock { + background-color: #1a1a1a; + border-color: #4c4c4c; + + &:after { + background-color: #4c4c4c; + } + } + } + + &.is-spent { + border-color: #538968; + + .lock { + background-color: #060a08; + border-color: #538968; + + &:after { + background-color: #538968; + } + } + } + } + } +} diff --git a/assets/styles/components/_video.scss b/assets/styles/components/_video.scss new file mode 100644 index 0000000..4e6ddc1 --- /dev/null +++ b/assets/styles/components/_video.scss @@ -0,0 +1,32 @@ +.video { + margin-left: auto; + margin-right: auto; + max-width: 640px; + position: relative; + + &.is-loading { + &:after { + @include loader; + position: absolute; + z-index: 0; + top: calc(50% - .5em); + left: calc(50% - .5em); + } + } + + &--iframe { + padding-top: 56.25%; + position: relative; + background-color: #1B3147; + display: block; + + iframe { + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 1; + } + } +} diff --git a/assets/styles/components/_wallets.scss b/assets/styles/components/_wallets.scss new file mode 100644 index 0000000..504e5af --- /dev/null +++ b/assets/styles/components/_wallets.scss @@ -0,0 +1,138 @@ +.wallets { + &.field.is-grouped.is-grouped-multiline { + margin: -0.5rem; + + > .control { + margin: 0; + + &.control-with-select { + margin: 0.5rem; + } + + &:not(.control-with-select) { + .button { + margin: 0.5rem; + } + } + } + } + + .button { + width: 120px; + flex-direction: column; + height: auto; + + &.is-black { + background-color: #559774; + + &:hover { + background-color: #94febf; + } + } + + &.is-background { + color: black; + background-color: #7ddaa9; + + &:hover { + background-color: #94febf; + } + } + + &:before { + content: ''; + height: 64px; + width: 64px; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + margin: 0.25rem 0; + } + + &.is-metamask:before { + background-image: url('../img/metamask-fox.svg'); + } + + &.is-walletConnect:before { + background-image: url('../img/walletConnect.svg'); + } + + &.is-generic:before { + background-image: url('../img/ethereum.svg'); + } + } + + .control-with-select { + display: flex; + flex-direction: column; + + .button { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-width: 0; + + &:before { + height: 38px; + } + } + + .select { + &.is-empty { + select { + color: rgba(255, 255, 255, 0.7); + } + } + + select { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top-width: 0; + border-color: #559774; + background-color: #559774; + height: 1.929rem; + color: $primary-invert; + + &:hover { + background-color: $primary; + border-color: $primary; + } + + &:focus { + border-color: #559774; + box-shadow: none; + } + } + + &:not(.is-multiple) { + height: 1.929rem; + + &:not(.is-loading) { + &::after { + border-color: $primary-invert; + } + } + } + } + } + + .network-select { + width: 120px; + overflow: hidden; + } + + /*> .control:hover { + .button { + border-color: #cdcdcd; + } + + &.control-with-select { + .button { + border-bottom-color: $black; + } + + .select select { + border-color: #cdcdcd; + } + }* + }*/ +} diff --git a/assets/styles/components/_withdraw-data.scss b/assets/styles/components/_withdraw-data.scss new file mode 100644 index 0000000..f553300 --- /dev/null +++ b/assets/styles/components/_withdraw-data.scss @@ -0,0 +1,77 @@ +.withdraw-data { + font-size: .85rem; + width: 100%; + line-height: 1; + + .b-tooltip { + .tooltip-content { + line-height: 1.5; + } + } + + &.is-spaced { + margin-top: -.75rem; + + &:not(:last-child) { + margin-bottom: 1.25rem; + } + + + .help { + margin-top: -1rem; + } + } + + &-item { + display: flex; + justify-content: space-between; + + span { + color: $primary; + margin-left: .5rem; + text-align: right; + + > span { + margin-left: 0; + } + + &.has-low-anonymity { + margin-left: 0.5rem; + + > span { + margin-left: 1.1rem; + position: relative; + border-bottom: 1px dotted $warning; + margin-bottom: -1px; + color: $warning; + + &:before { + content: ''; + position: absolute; + background-image: url("data:image/svg+xml,%3Csvg height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23ff8a00' d='m13 14h-2v-4h2m0 8h-2v-2h2m-12 5h22l-11-19z'/%3E%3C/svg%3E"); + background-size: contain; + height: 14px; + width: 14px; + left: -18px; + top: -1px; + } + } + } + + &.is-alone { + margin-left: auto; + } + } + + .b-tooltip { + flex-shrink: 0; + + &:after { + line-height: 1.5; + } + } + + + .withdraw-data-item { + margin-top: .6rem; + } + } +} diff --git a/components/ApproveModalBox.vue b/components/ApproveModalBox.vue new file mode 100644 index 0000000..1f11c00 --- /dev/null +++ b/components/ApproveModalBox.vue @@ -0,0 +1,94 @@ + + diff --git a/components/BalanceModalBox.vue b/components/BalanceModalBox.vue new file mode 100644 index 0000000..2b83996 --- /dev/null +++ b/components/BalanceModalBox.vue @@ -0,0 +1,41 @@ + + diff --git a/components/Deposit.vue b/components/Deposit.vue new file mode 100644 index 0000000..d66fa63 --- /dev/null +++ b/components/Deposit.vue @@ -0,0 +1,176 @@ + + diff --git a/components/DepositModalBox.vue b/components/DepositModalBox.vue new file mode 100644 index 0000000..bcced6e --- /dev/null +++ b/components/DepositModalBox.vue @@ -0,0 +1,148 @@ + + diff --git a/components/EncryptedTx.vue b/components/EncryptedTx.vue new file mode 100644 index 0000000..276ac43 --- /dev/null +++ b/components/EncryptedTx.vue @@ -0,0 +1,256 @@ + + diff --git a/components/Footer.vue b/components/Footer.vue new file mode 100644 index 0000000..1072fb7 --- /dev/null +++ b/components/Footer.vue @@ -0,0 +1,170 @@ + + + diff --git a/components/GasPriceSlider.vue b/components/GasPriceSlider.vue new file mode 100644 index 0000000..5e4f02f --- /dev/null +++ b/components/GasPriceSlider.vue @@ -0,0 +1,132 @@ + + + diff --git a/components/Job.vue b/components/Job.vue new file mode 100644 index 0000000..3641553 --- /dev/null +++ b/components/Job.vue @@ -0,0 +1,113 @@ + + diff --git a/components/Loaders/ApproveLoader.vue b/components/Loaders/ApproveLoader.vue new file mode 100644 index 0000000..d61a4d0 --- /dev/null +++ b/components/Loaders/ApproveLoader.vue @@ -0,0 +1,48 @@ + + diff --git a/components/Loaders/Loader.vue b/components/Loaders/Loader.vue new file mode 100644 index 0000000..7431fe9 --- /dev/null +++ b/components/Loaders/Loader.vue @@ -0,0 +1,28 @@ + + diff --git a/components/Logo.vue b/components/Logo.vue new file mode 100644 index 0000000..03e6a7c --- /dev/null +++ b/components/Logo.vue @@ -0,0 +1,9 @@ + diff --git a/components/MetamaskNavbarIcon.vue b/components/MetamaskNavbarIcon.vue new file mode 100644 index 0000000..74dbb2f --- /dev/null +++ b/components/MetamaskNavbarIcon.vue @@ -0,0 +1,64 @@ + + + diff --git a/components/Navbar.vue b/components/Navbar.vue new file mode 100644 index 0000000..ffb9cb4 --- /dev/null +++ b/components/Navbar.vue @@ -0,0 +1,71 @@ + + + diff --git a/components/NetworkModal.vue b/components/NetworkModal.vue new file mode 100644 index 0000000..ffbf834 --- /dev/null +++ b/components/NetworkModal.vue @@ -0,0 +1,147 @@ + + + diff --git a/components/NetworkNavbarIcon.vue b/components/NetworkNavbarIcon.vue new file mode 100644 index 0000000..8d3acca --- /dev/null +++ b/components/NetworkNavbarIcon.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/components/NetworkSelect.vue b/components/NetworkSelect.vue new file mode 100644 index 0000000..8792905 --- /dev/null +++ b/components/NetworkSelect.vue @@ -0,0 +1,45 @@ + + + diff --git a/components/Notices.vue b/components/Notices.vue new file mode 100644 index 0000000..bd5c1d3 --- /dev/null +++ b/components/Notices.vue @@ -0,0 +1,54 @@ + + + diff --git a/components/NumberFormat.vue b/components/NumberFormat.vue new file mode 100644 index 0000000..dc782ff --- /dev/null +++ b/components/NumberFormat.vue @@ -0,0 +1,57 @@ + + + diff --git a/components/Settings.vue b/components/Settings.vue new file mode 100644 index 0000000..69a29b4 --- /dev/null +++ b/components/Settings.vue @@ -0,0 +1,158 @@ + + diff --git a/components/Statistics.vue b/components/Statistics.vue new file mode 100644 index 0000000..15b5165 --- /dev/null +++ b/components/Statistics.vue @@ -0,0 +1,113 @@ + + diff --git a/components/Tx.vue b/components/Tx.vue new file mode 100644 index 0000000..f1b4063 --- /dev/null +++ b/components/Tx.vue @@ -0,0 +1,184 @@ + + diff --git a/components/Txs.vue b/components/Txs.vue new file mode 100644 index 0000000..c1d9787 --- /dev/null +++ b/components/Txs.vue @@ -0,0 +1,299 @@ + + + diff --git a/components/governance/CreateProposal.vue b/components/governance/CreateProposal.vue new file mode 100644 index 0000000..c2b289f --- /dev/null +++ b/components/governance/CreateProposal.vue @@ -0,0 +1,195 @@ + + diff --git a/components/governance/Metrics.vue b/components/governance/Metrics.vue new file mode 100644 index 0000000..9dc8e52 --- /dev/null +++ b/components/governance/Metrics.vue @@ -0,0 +1,108 @@ + + + diff --git a/components/governance/Proposal.vue b/components/governance/Proposal.vue new file mode 100644 index 0000000..f843e04 --- /dev/null +++ b/components/governance/Proposal.vue @@ -0,0 +1,351 @@ + + + diff --git a/components/governance/ProposalSkeleton.vue b/components/governance/ProposalSkeleton.vue new file mode 100644 index 0000000..2625255 --- /dev/null +++ b/components/governance/ProposalSkeleton.vue @@ -0,0 +1,79 @@ + diff --git a/components/governance/ProposalsList.vue b/components/governance/ProposalsList.vue new file mode 100644 index 0000000..1cadbbb --- /dev/null +++ b/components/governance/ProposalsList.vue @@ -0,0 +1,89 @@ + + + diff --git a/components/governance/ProposalsListItem.vue b/components/governance/ProposalsListItem.vue new file mode 100644 index 0000000..b5772f1 --- /dev/null +++ b/components/governance/ProposalsListItem.vue @@ -0,0 +1,89 @@ + + + diff --git a/components/governance/ProposalsListSkeleton.vue b/components/governance/ProposalsListSkeleton.vue new file mode 100644 index 0000000..ed8c6e7 --- /dev/null +++ b/components/governance/ProposalsListSkeleton.vue @@ -0,0 +1,55 @@ + + + diff --git a/components/governance/manage/ManageBox.vue b/components/governance/manage/ManageBox.vue new file mode 100644 index 0000000..9312c3b --- /dev/null +++ b/components/governance/manage/ManageBox.vue @@ -0,0 +1,60 @@ + + diff --git a/components/governance/manage/tabs/DelegateTab.vue b/components/governance/manage/tabs/DelegateTab.vue new file mode 100644 index 0000000..6bd1749 --- /dev/null +++ b/components/governance/manage/tabs/DelegateTab.vue @@ -0,0 +1,82 @@ + + + diff --git a/components/governance/manage/tabs/LockTab.vue b/components/governance/manage/tabs/LockTab.vue new file mode 100644 index 0000000..8529266 --- /dev/null +++ b/components/governance/manage/tabs/LockTab.vue @@ -0,0 +1,147 @@ + + + diff --git a/components/governance/manage/tabs/RewardTab.vue b/components/governance/manage/tabs/RewardTab.vue new file mode 100644 index 0000000..33fcb4b --- /dev/null +++ b/components/governance/manage/tabs/RewardTab.vue @@ -0,0 +1,43 @@ + + + diff --git a/components/governance/manage/tabs/UndelegateTab.vue b/components/governance/manage/tabs/UndelegateTab.vue new file mode 100644 index 0000000..d11c50c --- /dev/null +++ b/components/governance/manage/tabs/UndelegateTab.vue @@ -0,0 +1,53 @@ + + + diff --git a/components/governance/manage/tabs/UnlockTab.vue b/components/governance/manage/tabs/UnlockTab.vue new file mode 100644 index 0000000..e624fd0 --- /dev/null +++ b/components/governance/manage/tabs/UnlockTab.vue @@ -0,0 +1,137 @@ + + + diff --git a/components/governance/manage/tabs/index.js b/components/governance/manage/tabs/index.js new file mode 100644 index 0000000..aea082c --- /dev/null +++ b/components/governance/manage/tabs/index.js @@ -0,0 +1,7 @@ +import LockTab from './LockTab' +import RewardTab from './RewardTab' +import UnlockTab from './UnlockTab' +import DelegateTab from './DelegateTab' +import UndelegateTab from './UndelegateTab' + +export { LockTab, RewardTab, UndelegateTab, UnlockTab, DelegateTab } diff --git a/components/governance/mixins/quorum.js b/components/governance/mixins/quorum.js new file mode 100644 index 0000000..338b418 --- /dev/null +++ b/components/governance/mixins/quorum.js @@ -0,0 +1,30 @@ +import { mapGetters } from 'vuex' +const { toBN, fromWei, toWei } = require('web3-utils') + +export default { + computed: { + ...mapGetters('governance/gov', ['quorumVotes']), + results() { + const resultFor = toBN(toWei(this.data.results.for)) + const resultAgainst = toBN(toWei(this.data.results.against)) + return resultFor.add(resultAgainst) + }, + quorumResult() { + return fromWei(this.results) + }, + quorumVotesToWei() { + return toBN(toWei(this.quorumVotes)) + }, + isQuorumCompleted() { + return this.results.gte(this.quorumVotesToWei) + }, + quorumPercent() { + return this.isQuorumCompleted + ? 100 + : toBN('100') + .mul(this.results) + .div(this.quorumVotesToWei) + .toNumber() + } + } +} diff --git a/components/icons/Error404Icon.vue b/components/icons/Error404Icon.vue new file mode 100644 index 0000000..74c8e03 --- /dev/null +++ b/components/icons/Error404Icon.vue @@ -0,0 +1,97 @@ + + + diff --git a/components/icons/EthPurchaseArrow.vue b/components/icons/EthPurchaseArrow.vue new file mode 100644 index 0000000..879ba16 --- /dev/null +++ b/components/icons/EthPurchaseArrow.vue @@ -0,0 +1,10 @@ + diff --git a/components/icons/FlagIcon.vue b/components/icons/FlagIcon.vue new file mode 100644 index 0000000..6eb8b19 --- /dev/null +++ b/components/icons/FlagIcon.vue @@ -0,0 +1,26 @@ + + + diff --git a/components/icons/LinkIcon.vue b/components/icons/LinkIcon.vue new file mode 100644 index 0000000..d517291 --- /dev/null +++ b/components/icons/LinkIcon.vue @@ -0,0 +1,9 @@ + diff --git a/components/icons/SettingsIcon.vue b/components/icons/SettingsIcon.vue new file mode 100644 index 0000000..a1ff237 --- /dev/null +++ b/components/icons/SettingsIcon.vue @@ -0,0 +1,9 @@ + diff --git a/components/icons/Verified.vue b/components/icons/Verified.vue new file mode 100644 index 0000000..e9b897d --- /dev/null +++ b/components/icons/Verified.vue @@ -0,0 +1,34 @@ + diff --git a/components/icons/index.js b/components/icons/index.js new file mode 100644 index 0000000..5c48f3e --- /dev/null +++ b/components/icons/index.js @@ -0,0 +1,5 @@ +export { default as LinkIcon } from './LinkIcon' +export { default as SettingsIcon } from './SettingsIcon' +export { default as EthPurchaseArrow } from './EthPurchaseArrow' +export { default as FlagIcon } from './FlagIcon' +export { default as Error404Icon } from './Error404Icon' diff --git a/components/settings/EthPurchase.vue b/components/settings/EthPurchase.vue new file mode 100644 index 0000000..c9d7b77 --- /dev/null +++ b/components/settings/EthPurchase.vue @@ -0,0 +1,148 @@ + + diff --git a/components/settings/SettingsModalBox.vue b/components/settings/SettingsModalBox.vue new file mode 100644 index 0000000..f920044 --- /dev/null +++ b/components/settings/SettingsModalBox.vue @@ -0,0 +1,66 @@ + + diff --git a/components/settings/tabs/RelayerTab.vue b/components/settings/tabs/RelayerTab.vue new file mode 100644 index 0000000..f29b94e --- /dev/null +++ b/components/settings/tabs/RelayerTab.vue @@ -0,0 +1,259 @@ + + + diff --git a/components/settings/tabs/WalletTab.vue b/components/settings/tabs/WalletTab.vue new file mode 100644 index 0000000..28e0beb --- /dev/null +++ b/components/settings/tabs/WalletTab.vue @@ -0,0 +1,52 @@ + + + diff --git a/components/settings/tabs/index.js b/components/settings/tabs/index.js new file mode 100644 index 0000000..77d84d7 --- /dev/null +++ b/components/settings/tabs/index.js @@ -0,0 +1,4 @@ +import WalletTab from './WalletTab' +import RelayerTab from './RelayerTab' + +export { WalletTab, RelayerTab } diff --git a/components/web3Connect/Button.vue b/components/web3Connect/Button.vue new file mode 100644 index 0000000..5c2bddb --- /dev/null +++ b/components/web3Connect/Button.vue @@ -0,0 +1,60 @@ + + + diff --git a/components/web3Connect/Modal.vue b/components/web3Connect/Modal.vue new file mode 100644 index 0000000..e828c3a --- /dev/null +++ b/components/web3Connect/Modal.vue @@ -0,0 +1,70 @@ + + diff --git a/components/web3Connect/index.js b/components/web3Connect/index.js new file mode 100644 index 0000000..36345e0 --- /dev/null +++ b/components/web3Connect/index.js @@ -0,0 +1 @@ +export { default as ConnectButton } from './Button' diff --git a/components/withdraw/RelayerTotal.vue b/components/withdraw/RelayerTotal.vue new file mode 100644 index 0000000..80f0b73 --- /dev/null +++ b/components/withdraw/RelayerTotal.vue @@ -0,0 +1,36 @@ + + + diff --git a/components/withdraw/Withdraw.vue b/components/withdraw/Withdraw.vue new file mode 100644 index 0000000..210a548 --- /dev/null +++ b/components/withdraw/Withdraw.vue @@ -0,0 +1,526 @@ + + + diff --git a/components/withdraw/WithdrawModalBox.vue b/components/withdraw/WithdrawModalBox.vue new file mode 100644 index 0000000..323592c --- /dev/null +++ b/components/withdraw/WithdrawModalBox.vue @@ -0,0 +1,88 @@ + + diff --git a/components/withdraw/WithdrawTotal.vue b/components/withdraw/WithdrawTotal.vue new file mode 100644 index 0000000..c6bcd5f --- /dev/null +++ b/components/withdraw/WithdrawTotal.vue @@ -0,0 +1,139 @@ + + diff --git a/constants/index.js b/constants/index.js new file mode 100644 index 0000000..833ec90 --- /dev/null +++ b/constants/index.js @@ -0,0 +1 @@ +export * from './variables' diff --git a/constants/variables.js b/constants/variables.js new file mode 100644 index 0000000..5b96108 --- /dev/null +++ b/constants/variables.js @@ -0,0 +1,89 @@ +import networkConfig from '@/networkConfig' + +export const CHAIN_IDS = Object.keys(networkConfig) + +export const NETWORKS = CHAIN_IDS.map((i) => i.replace('netId', '')) + +export const LOCALES_NAMES = { + en: 'en-US', + es: 'es-ES', + 'zh-cn': 'zh-CN', + ru: 'ru-RU', + tr: 'tr-TR', + uk: 'uk-UA', + fr: 'fr-FR' +} +export const SECOND = 1000 +export const ROUNDING_PRECISION = 0.0001 + +const DEPOSIT = 'deposit' +const WITHDRAWAL = 'withdrawal' + +export const eventsType = { + DEPOSIT, + WITHDRAWAL +} + +export const CONTRACT_INSTANCES = ['0.1', '1', '10', '100', '1000'] + +export const INDEX_DB_ERROR = 'A mutation operation was attempted on a database that did not allow mutations.' + +export const ACTION = Object.freeze({ + WITHDRAW: 'WITHDRAW', + WITHDRAW_WITH_EXTRA: 'WITHDRAW_WITH_EXTRA', + ARB_WITHDRAW: 'ARB_WITHDRAW', + OP_WITHDRAW: 'OP_WITHDRAW' +}) + +// TODO unique gas limit for each token +export const ACTION_GAS = Object.freeze({ + [ACTION.WITHDRAW]: 390000, + [ACTION.WITHDRAW_WITH_EXTRA]: 550000, + [ACTION.OP_WITHDRAW]: 440000, + [ACTION.ARB_WITHDRAW]: 1900000 +}) + +export const GAS_PRICES = ['low', 'standard', 'fast'] + +export const addressType = { type: 'string', pattern: '^0x[a-fA-F0-9]{40}$' } + +// TODO auto update in yarn updateCache +export const cachedEventsLength = { + mainnet: { + ENCRYPTED_NOTES: 14550 + }, + goerli: { + ENCRYPTED_NOTES: 1350 + } +} + +export const PROVIDERS = { + walletConnect: { + name: 'WalletConnect', + isPartialSupport: true, + storageName: 'walletconnect', + listener: 'walletConnectSocketListener' + }, + metamask: { + name: 'Metamask', + isPartialSupport: false + }, + generic: { + name: 'Web3 Wallet', + isPartialSupport: true + }, + mobileWallet: { + name: 'Wallet', + isPartialSupport: true + } +} + +export const REGISTRY_DEPLOYED_BLOCK = { + 1: 14173129 +} +export const DONATIONS_ADDRESS = '0x08ec3A4e3873505D34450b0F726136E1BF0c9DF7' + +export const trees = { + PARTS_COUNT: 4, + LEVELS: 20 // const from contract +} diff --git a/ipfsUpload.js b/ipfsUpload.js new file mode 100644 index 0000000..0f53d37 --- /dev/null +++ b/ipfsUpload.js @@ -0,0 +1,75 @@ +// debug +// date +%s > dist/index.html & node ipfsUpload.js + +require('dotenv').config() +const fs = require('fs') +const axios = require('axios') +const FormData = require('form-data') +const recursive = require('recursive-fs') +const basePathConverter = require('base-path-converter') + +// it's dangerous to set MAX_PINS to 1 +const MAX_PINS = 5 + +const baseUrl = `https://api.pinata.cloud` +const src = process.argv[2] || './dist' +const headers = { + pinata_api_key: process.env.PINATA_API_KEY, + pinata_secret_api_key: process.env.PINATA_SECRET_API_KEY +} + +async function removeOldPins() { + const maxPins = MAX_PINS - 1 + + const res = await axios.get(`${baseUrl}/data/pinList?pageOffset=${maxPins}&status=pinned`, { + headers + }) + + const { count, rows } = res.data + + if (count && count > maxPins) { + for (const { ipfs_pin_hash: ipfsPinHash } of rows) { + await axios.delete(`${baseUrl}/pinning/unpin/${ipfsPinHash}`, { + headers + }) + console.log(`Successfully removed pin: ${ipfsPinHash}`) + } + } +} + +async function pinBuild() { + console.log('Make sure you have latest build. Run `npm run generate` if necessary.') + const { files } = await recursive.readdirr(src) + const data = new FormData() + files.forEach((file) => { + // for each file stream, we need to include the correct relative file path + data.append(`file`, fs.createReadStream(file), { + filepath: basePathConverter(src, file) + }) + }) + + const res = await axios.post(`${baseUrl}/pinning/pinFileToIPFS`, data, { + maxContentLength: 'Infinity', // this is needed to prevent axios from erroring out with large directories + headers: { + 'Content-Type': `multipart/form-data; boundary=${data._boundary}`, + ...headers + } + }) + + const ipfsHash = res.data.IpfsHash + + console.log(`Your site is ready! IPFS hash: ${ipfsHash}`) + console.log(`output for github-actions:`) + console.log(`::set-output name=ipfs_hash::${ipfsHash}`) + console.log(`https://gateway.pinata.cloud/ipfs/${ipfsHash}`) +} + +async function main() { + await removeOldPins() + await pinBuild() +} + +main().catch((e) => { + console.log(e) + process.exit(1) +}) diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..31abcd5 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,14 @@ +module.exports = { + moduleNameMapper: { + '^@/(.*)$': '/$1', + '^~/(.*)$': '/$1', + '^vue$': 'vue/dist/vue.common.js' + }, + moduleFileExtensions: ['js', 'vue', 'json'], + transform: { + '^.+\\.js$': 'babel-jest', + '.*\\.(vue)$': 'vue-jest' + }, + collectCoverage: true, + collectCoverageFrom: ['/components/**/*.vue', '/pages/**/*.vue'] +} diff --git a/langs/en.json b/langs/en.json new file mode 100644 index 0000000..e5ea717 --- /dev/null +++ b/langs/en.json @@ -0,0 +1,445 @@ +{ + "closeNotification": "Close notification", + "indexNotification": "Tornado.cash {link}. However, it is still an experimental software. Please use at your own risk.", + "indexNotificationLinkText": "was audited", + "binanceInternalTxsNotification": "Please, do not use Binance wallet addresses for withdrawals. Internal transactions (including Tornado.cash withdrawals) are not currently supported on Binance Exchange. If you have an issue receiving your funds, you should contact Binance support.", + "deposit": "Deposit", + "depositButton": "Deposit", + "withdraw": "Withdraw", + "withdrawButton": "Withdraw", + "waitUntilTransactionIsMined": "Wait until transaction is mined", + "enterYourDepositsNote": "Enter the note from your deposit", + "yourWallet": "Your Wallet", + "pleaseSelectYourWeb3Wallet": "Please select your Web3 compatible wallet:", + "otherWallet": "Other Wallet", + "currentNetworkIsNotSupported": "Current network is not supported", + "pleaseChangeNetwork": "App network ({network}) doesn't match the network selected in wallet.", + "docs": "Docs", + "getFreeGETH": "Get Free gETH", + "logout": "Logout", + "connect": "Connect", + "token": "Token", + "amount": "Amount", + "amountTooltip": "Each amount is a standalone Tornado Cash instance with a separate anonymity set. Check the Stats tab for more info.", + "approvalIsRequired": "Approval is required", + "inOrderToUse": "In order to use {currency} you have to enable it for Tornado.cash. Select the amount you would like to approve:", + "unlimited": "Unlimited", + "unlimitedTooltip": "The unlimited approval is more convenient if you are going to make multiple deposits.", + "enable": "Enable", + "transactionWasSuccessfullySent": "The transaction was successfully sent.", + "insufficientBalance": "Insufficient balance", + "youDontHaveEnoughTokens": "You do not have enough {currency} tokens. Your current balance is {balance} {currency}", + "close": "Close", + "yourNote": "Your private note", + "pleaseBackupYourNote": "Please back up your note. You will need it later to withdraw your deposit.", + "treatYourNote": "Treat your note as a private key - never share it with anyone, including tornado.cash developers.", + "saveAsFile": "The browser will ask to save your note as a file:", + "iBackedUpTheNote": "I backed up the note", + "iEncryptedTheNote": "Create an on-chain backup of this note with your Account {address}", + "yourNoteWontBeSaved": "Your note won't be saved in your browser. Please make sure it's backed up!", + "yourDontHaveAccount": "You can also save encrypted notes on-chain by setting up the Note Account. Create one on the {account} page.", + "sendDeposit": "Send Deposit", + "clickToCopy": "Click to copy", + "copied": "Copied!", + "preparingTransactionData": "Preparing Transaction Data", + "viewInExplorer": "View in Explorer", + "loading": "Loading", + "pleaseConfirmInWallet": "Please confirm permission to provide public key in metamask", + "pleaseConfirmTransactionInWallet": "Please confirm transaction in {wallet}", + "pleaseSignRequestInWallet": "Please sign request in {wallet}", + "waitingForTransactionConfirmation": "Waiting for transaction confirmation", + "relayerIsNowSendingYourTransaction": "Relayer is now sending your transaction. It will respond with a transaction hash soon", + "note": "Note", + "noteTooltip": "Please enter the note you received after deposit was made", + "depositTransactionOnEtherscan": "Deposit transaction on Etherscan", + "withdrawalSettings": "Withdrawal settings", + "pleaseEnterYourNote": "Please enter your note", + "turnOnWasm": "Error: Please turn on WebAssembly in your browser settings.
If you are using Tor browser, enable javascript.options.wasm in about:config", + "timePassed": "Time passed", + "timePassedTooltip": "Even if multiple deposits were made after yours, they could have been made by the same user. Therefore, we recommend waiting for at least 24 hours before withdrawing funds to ensure that multiple other users transacted via Tornado.сash during that time.", + "subsequentDeposits": "Subsequent deposits", + "subsequentDepositsTooltip": "The most likely source of a withdrawal points to recent deposits. Therefore, we recommend allowing at least 5 deposits after yours for better anonymity.", + "recipientAddress": "Recipient Address", + "donate": "Donate", + "pleasePasteAddressHere": "Please paste address here", + "noteIsInvalid": "Note is invalid", + "noteHasBeenSpent": "Note has been spent", + "gettingTheNoteData": "Getting the note data", + "noteWasAlreadySpent": "Note has already been spent", + "error": "Error", + "downloadError": "Download error", + "validationError": "Validation Error", + "recipientAddressIsInvalid": "Recipient address is invalid", + "total": "Total", + "noteBalance": "Note balance", + "relayerFee": "Relayer fee", + "ethPurchase": "{currency} Purchase", + "ethPurchaseTooltip": "Exchange some of your deposit's {currency} to {networkCurrency} during the withdrawal to pay for gas in future transactions.", + "incorrectAmount": "Incorrect amount. Please input a number.", + "amountIsHigh": "Amount is too high. Max value is {value}.", + "amountIsLow": "Amount is too low. Min value is {value}.", + "tokensToReceive": "Tokens to receive", + "relayer": "Relayer", + "relayerTooltip": "Use the relayer service to send your transaction. This option ensures better privacy since the gas fee is subtracted from the deposited funds.", + "custom": "Custom", + "pasteYourRelayerUrlorEnsRecord": "Paste your relayer URL or ENS record", + "wallet": "Wallet", + "walletTooltip": "Use your own account to initiate a withdrawal (e.g. Metamask or TrustWallet).", + "save": "Save", + "reset": "Reset", + "withdrawWalletWarning": "Make sure that {currency} used to pay for the gas fee is not linkable to ANY of your addresses. Otherwise, the anonymity of the withdrawal will be compromised. We recommend using a Relayer instead.", + "withdrawalConfirmation": "Withdrawal Confirmation", + "confirm": "Confirm", + "yourZkSnarkProofHasBeenSuccesfullyGenerated": "Your zk-Snark proof has been successfully generated! Please click Confirm to initiate the withdrawal", + "generatingProof": "Generating proof", + "statistics": "Statistics", + "anonymitySet": "Anonymity set", + "anonymitySetTooltip": "Number of deposits from which your withdrawal will potentially originate", + "latestDeposits": "Latest deposits", + "yourIP": "Your IP {ip}", + "filterBy": "Filter by", + "spent": "Spent", + "unspent": "Unspent", + "thereAreNoElements": "There are no elements that meet the filters.", + "txHash": "Tx Hash", + "status": "Status", + "copyNote": "Copy Note", + "decryptCopyNote": "Decrypt and copy note", + "v1Deposit": "v1 deposit", + "waitingForReceipt": "Waiting for receipt", + "failed": "Failed", + "withdrawn": "Withdrawn", + "deposited": "Deposited", + "removeFromCache": "Remove from cache", + "pleaseMakeSureYouHaveBackedUpYourNote": "Please make sure you have backed up your note if it has not already been spent. Do you still want to remove this transaction and the note from Browser storage?", + "remove": "Remove", + "noteHasBeenDeleted": "Note information has been deleted", + "accountHasBeenDeleted": "Account information has been deleted", + "cancelButton": "Cancel", + "donationsAddress": "Donations address:", + "rate": "Pool Rate", + "only": "Only", + "equalUserDeposit": "{only} {n} {equalUserDepositText}", + "equalUserDepositPlural": "There are no deposits | One deposit | equal user deposits", + "userDeposit": "no deposits | only 1 deposit | {n} deposits", + "gasPrice": "Gas Price", + "totalFee": "Total fee", + "networkFee": "Network fee", + "connectYourWalletFirst": "Connect your wallet first", + "changeNetwork": "Change network", + "changeNetworkNote": "Your note is from another network, please change network in the app.", + "changingNetwork": "Changing network", + "relayerShouldSupportSSL": "The relayer should support SSL", + "relayerStatusOk": "Relayer status: OK", + "proposalIsActive": "Proposal status must be active", + "canNotFetchStatusFromTheRelayer": "Cannot fetch status from the relayer", + "thisRelayerServesADifferentNetwork": "This relayer serves a different network", + "compliance": "Compliance", + "complianceTool": "compliance tool", + "complianceReport": "Compliance Report", + "complianceSubtitle": "Maintaining financial privacy is essential to preserving our freedom.{newline}However, it should not come at the cost of non-compliance. With Tornado.cash, you can always provide cryptographically verified proof of transactional history using the Ethereum address you used to deposit or withdraw funds. This might be necessary to show the source of assets held in your withdrawal address.{newline}To generate a compliance report, please enter your Tornado.сash Note below.", + "from": "From", + "to": "To", + "withdrawal": "Withdrawal", + "noteHasNotBeenSpent": "The note has not been spent", + "thereIsNoRelatedDeposit": "There is no related deposit. The note is invalid.", + "warning": "Warning", + "doNotShareYouNote": "Do not share your Note with anyone since it WILL be used to withdraw your funds!", + "date": "Date", + "transaction": "Transaction", + "commitment": "Commitment", + "nullifierHash": "Nullifier Hash", + "verified": "Verified", + "generatePdfReport": "Generate PDF report", + "compliancePrintWarning": "This Compliance Report is for informational purposes only. You should confirm the validity of this report by using Tornado’s Compliance Tool (https://tornadocash.eth.link/compliance) or via any other cryptographic software that can compute and verify the information contained herein(the \"Tornado Compliance Tool\"). Any discrepancies between information found in this report and provided by the above tool indicate that the information in this report may be inaccurate and/or fraudulent.{newline}THE COMPLIANCE REPORT IS PROVIDED \"AS IS,\" WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OF THE TORNADO.CASH COMPLIANCE TOOL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THIS COMPLIANCE REPORT.", + "relayRequestFailed": "Relayer {relayerName} is down. Please choose a different relayer.", + "selectProvider": "Select provider", + "walletDoesNotSupported": "The wallet is not supported", + "fetchGasPriceFailed": "Fetch gasPrice failed", + "networkIsNotSupported": "Network is not supported", + "failToGenerateNote": "Failed to generate note", + "invalidRoot": "Invalid Root", + "failedToFetchAllDepositEvents": "Failed to fetch all deposit events from contract", + "unknownError": "Unknown error", + "unitInvalidValue": "[ethjs-unit] while converting number {value} to wei, invalid value", + "tooManyDecimalPoints": "[ethjs-unit] while converting number {value} to wei, too many decimal points", + "tooManyDecimalPlaces": "[ethjs-unit] while converting number {value} to wei, too many decimal places", + "settings": "Settings", + "rpc": "RPC endpoint", + "rpcStatusOk": "RPC status: OK", + "rpcIsDown": "RPC is down", + "thisRpcIsForDifferentNetwork": "This RPC is for a different network", + "rpcSelectError": "All predefined RPCs are down. It's probably a network error. Please select custom RPC in Settings", + "rpcShouldSupportSSL": "The RPC should support SSL", + "customRpcPlaceholder": "Paste your RPC URL", + "customRpc": "Custom", + "enterRecoveryKey": "Please enter your recovery key", + "copy": "Copy", + "thereAreNoTransactions": "There are no transactions yet.", + "governance": "Voting", + "delegatedBalance": "Delegated balance", + "votingPower": "Voting Power", + "delegated": "Delegated", + "availableBalance": "Available balance", + "manage": "Manage", + "proposals": "Proposals", + "all": "All", + "active": "Active", + "expired": "Expired", + "pending": "Pending", + "passed": "Passed", + "timeLocked": "Time locked", + "createProposal": "Create proposal", + "startDate": "Start Date", + "endDate": "End Date", + "quorum": "Quorum", + "quorumTooltip": "A proposal's voting period lasts {days}. The proposal is passed only if majority vote and quorum of {votes} voters are reached (sum of For + Against votes is greater than {votes}).", + "for": "For", + "against": "Against", + "title": "Title", + "description": "Description", + "proposalAddress": "Proposal Address", + "lock": "Lock", + "unlock": "Unlock", + "proposalThresholdError": "Locked balance should be more or equal to {PROPOSAL_THRESHOLD} TORN", + "castYourVote": "Cast your vote", + "back": "Back", + "yourCurrentVote": "Your current vote: {vote}", + "currentResults": "Current results", + "information": "Info", + "amountToLock": "Amount to lock", + "amountToUnlock": "Amount to unlock", + "lockedBalance": "Locked balance", + "lockedBalanceError": "Your locked balance must be greater than 0", + "lockTabDesc": "In order to participate in Governance, you must lock TORN tokens. Your voting power will be equivalent to how many tokens you lock.", + "unlockTabDesc": "You can unlock your previously locked TORN here. If the proposal in which you participated is not yet completed, you may have to wait until it is in order to unlock all your TORN.", + "delegateTabDesc": "You can delegate your voting power to a delegatee. The delegatee will be able to participate in Governance on your behalf.", + "undelegateTabDesc": "You can revoke the voting power from your delegatee. Their previous proposals and cast votes will remain unchanged.", + "recipient": "Recipient", + "address": "Address", + "delegate": "Delegate", + "undelegate": "Undelegate", + "currentDelegate": "Current delegate", + "approve": "Approve", + "approved": "Approved", + "proposalTitle": "Proposal Title", + "proposalDescription": "Proposal Description", + "defeated": "Defeated", + "accountSaving": "Setting up the Note Account", + "accountSaved": "Note Account saved on chain", + "creatingProposal": "Creating proposal", + "proposalCreated": "Proposal successfully created", + "depositing": "Depositing {value}", + "withdrawing": "Withdrawing {value}", + "claiming": "Claiming {value}", + "withdrawnValue": "Withdrawn {value}", + "claimedValue": "Claimed {value}", + "depositedValue": "Deposited {value}", + "locking": "Locking", + "votingFor": "Voting For", + "votingAgainst": "Voting Against", + "votedFor": "Successfully voted for the proposal", + "votedAgainst": "Successfully voted against the proposal", + "unlocking": "Unlocking", + "unlocked": "Unlocked", + "delegating": "Delegating", + "undelegating": "Undelegating", + "undelegated": "Undelegated", + "viewOnEtherscan": "View on Etherscan", + "awaitingExecution": "Awaiting Execution", + "execute": "Execute", + "executeProposal": "Execute proposal", + "executingProposal": "Executing Proposal", + "locked": "locked", + "lockedNotice": "Locked", + "proposalExecuted": "Proposal successfully executed", + "pleaseLockBalance": "Please lock TORN tokens first in order to delegate", + "pleaseDelegate": "Delegatee has not being set", + "internalError": "Internal Error. Please refresh the page and try again", + "id": "ID", + "timerRemainingForPending": "Time remaining before voting starts", + "timerRemainingForVoting": "Time remaining for voting", + "timerRemainingForAwaitingExecution": "Time remaining before execution", + "timerRemainingForExecution": "Execution time remaining", + "accepted": "Accepted", + "sent": "Sent", + "mined": "Mined", + "confirmed": "Confirmed", + "pleaseLockTornFirst": "Please lock TORN tokens first to proceed", + "tokensLockedUntil": "Your balance is locked until {date}", + "onlyOneProposalErr": "Only one active proposal is allowed per user. Please wait until your current proposal is finished.", + "max": "Max", + "withDisconnectedWallet": "Please, connect a wallet or change the type of withdrawal", + "relayerError": "Selected relayer could not sent your tx. Please try again or choose a different relayer in settings.", + "relayerIsNotResponding": "Relayer is not responding. Please try again or choose a different relayer in settings.", + "transactionFailed": "Transaction failed", + "none": "none", + "queued": "Queued", + "proposal": { + "error": { + "address": "Value must be an address", + "contract": "The address must be a contract", + "title": "Title is required", + "description": "Description is required" + } + }, + "executed": "Executed", + "proposalDoesNotExist": "The proposal doesn't exist. Please go back to the list.", + "errorPage": { + "title": "Oooops!", + "description": "Page not found.", + "button": "Launch App" + }, + "rejectedRequest": "You rejected {description} request", + "updateCacheEvents": "Syncing deposit events. Please wait", + "notEnoughTokens": "The total fee is higher than the amount of tokens to be received. This could be due to high relayer's fee or temporary network congestion.", + "gasPriceSlider": { + "low": "Slow", + "standard": "Standard", + "fast": "Fast" + }, + "decrypt": "Decrypt", + "account": { + "title": "Note Account", + "description": "A Note Account allows to store encrypted on-chain backups of private notes. This makes safe storage of funds hassle- and stress-free with the security of the Ethereum blockchain backing each note.", + "button": "Account", + "account": "Note account", + "backedUpWith": "Backed up with", + "modals": { + "recoverAccount": { + "title": "Connect with Note Account key", + "description": "Please enter your Note Account key to import your previously setup account.", + "warning": "Invalid Note Account key.", + "connect": "Connect" + }, + "setupAccount": { + "title": "Account setup", + "label": "Note Account key", + "description": "This key is used to encrypt and store your Tornado.cash private notes on Ethereum blockchain. Please back it up and never share it with anyone.", + "setupAccount": "Setup account", + "setAccount": "Finish", + "backedUp": "I backed up the Note Account key", + "saveOnChain": "Create additional on-chain backup of your Note Account key with your wallet", + "isNotSupportedWithHw": "Please keep in mind, additional on-chain backup of your Note Account is not supported with hardware wallets or mobile wallets", + "successfulNotice": "Congratulations! You have successfully set up a Note Account. Now, you can encrypt your notes and store them on chain.", + "yourRecoveryKeyWontBeSaved": "Your recovery key won't be saved in browser cache, please make sure it's backed up." + }, + "showRecoveryKey": { + "title": "Current Note Account key", + "description": "", + "close": "Close" + }, + "checkRecoveryKey": { + "title": "Session update", + "description": "The Note Account session has been inactive for 5 minutes. Would you like to continue?", + "inactiveDescription": "You have been inactive for a long time. Your Note Account session has been terminated for security reasons.", + "no": "No", + "yes": "Yes" + }, + "decryptInfo": { + "title": "Your notes", + "description": "All notes are successfully downloaded and decrypted using your Note Account key", + "all": "Total events downloaded:", + "warning": "Notes with warning:", + "close": "Close", + "unSpent": "Your unspent notes found:", + "spent": "Your spent notes found:", + "redirect": "Main page" + }, + "removeAccount": { + "title": "Clear account information", + "description": "Remove account information from current browser's session", + "cancel": "Cancel", + "remove": "Remove" + } + }, + "wallet": { + "label": "Connected Web3 wallet", + "desc": "Connect your Web3 wallet", + "disconnect": "Disconnect from your wallet", + "rpcDesc": "Change your Ethereum RPC Provider", + "connectWeb3": "Connect Web3", + "logout": "Logout", + "changeRpc": "Change RPC" + }, + "setup": { + "decrypt": "Please confirm decrypt request in Web3 wallet.", + "setTooltip": "An account is already associated with this Web3 wallet. Please use 'Recover Account' below.", + "recTooltip": "Please set up an account. There is no account for this address.", + "desc": "Set up Note Account for storing encrypted notes on Ethereum blockchain", + "account": "Set up account", + "recoverDesc": "Recover Note Account associated with this Web3 wallet", + "recover": "Recover account", + "enterRawDesc": "Use previously set Note Account key", + "enterRaw": "Enter account key", + "accSetupDescription": "This key is used to encrypt and store your Tornado.cash private notes on Ethereum blockchain. Please back it up and never share it with anyone." + }, + "control": { + "balance": "Note account balance: {value}", + "loadAllDesc": "Load and decrypt all of your private notes with current Note Account key", + "loadAll": "Load all encrypted notes", + "showRecoveryKeyDesc": "Reveal current Note Account key", + "showRecoveryKey": "Reveal", + "removeDesc": "Remove account information from current browser's session", + "remove": "Clear account info", + "fileDesc": "Download raw private notes by default when you make a deposit" + }, + "notification": { + "text": "Tornado.cash added on-chain note backups. Setup your {note} now or {medium} info.", + "link": { + "note": "note account", + "medium": "read more" + } + } + }, + "saveNote": "Save your note", + "pleaseSetUpAccount": "To decrypt your note please provide an account", + "decryptNote": "Please confirm note decryption", + "decryptFailed": "Decryption failed. Please try to log in with a different account", + "recoverFromKeyTitle": "Current Note Account key", + "trezorNotSupported": "Trezor wallet is not currently supported", + "ledgerNotSupported": "Ledger wallet is not currently supported", + "startDecryptingNotes": "Starting note decryption", + "decryptingNotes": "Decrypting notes", + "getAndValidateEvents": "Receiving and validating {name} events", + "notConnected": "Not connected", + "regular": "Regular", + "encrypted": "Encrypted", + "notDecryptedWithBackup": "This note is encrypted by {address} note account, which is linked to {backup} metamask account. Please switch to decrypt.", + "notDecrypted": "This note is encrypted by {address} note account, please switch to it.", + "noteAccountKey": "Decryption failed. Connect to {address} metamask account for decrypting the Note Account key {noteAddress}.", + "yourEncrypted": "This note will be encrypted with {address} account.", + "lockTooltip": "This note stored on-chain is encrypted. It can be recovered by the Note Account {address}.", + "connected": "Connected", + "accountConnected": "Note Account", + "web3connected": "Web3 connected", + "haveAccountSetupWithWallet": "It looks like you already have an Account setup with current Web3 wallet. Please use 'Recover account' option", + "connectAccount": "Connect Note Account", + "fetchFile": "Cannot fetch proving keys, please check your internet connection or try to use VPN.", + "mobileWallet": { + "loading": { + "alert": "If you have not received a notification in your wallet, please reconnect your wallet", + "action": "Reconnect" + }, + "actions": { + "disabled": "This feature is currently not supported by mobile wallets." + } + }, + "missingENSSubdomain": "Missing ENS subdomain", + "dayPlural": "0 days | {n} day | {n} days", + "stakingReward": { + "title": "Staking Reward", + "label": { + "tab": "Claim", + "input": "Available staking reward" + }, + "description": "You can claim your staking reward here. Your earned reward is proportionate to your locked TORN in governance.", + "action": "Claim" + }, + "relayerTotal": { + "label": "Current Relayer", + "name": "Name", + "fee": "Fee" + }, + "withdrawalQueueIsOverloaded": "Withdrawal queue is overloaded" +} diff --git a/langs/es.json b/langs/es.json new file mode 100644 index 0000000..025cfb8 --- /dev/null +++ b/langs/es.json @@ -0,0 +1,428 @@ +{ + "closeNotification": "Cerrar notificación", + "indexNotification": "Tornado.cash {link}. No obstante, todavía es un software experimental. Por favor, úselo teniendo en cuenta el riesgo y bajo su responsabilidad.", + "indexNotificationLinkText": "ha sido auditado", + "binanceInternalTxsNotification": "Por favor, no use direcciones a monederos Binance para retiros. Las transacciones internas (incluidos los retiros de Tornado.cash) actualmente no son compatibles con el Exchange de Binance. Si tiene problemas en la recepción de sus fondos, debería contactar con el soporte de Binance.", + "deposit": "Depósito", + "depositButton": "Depósito", + "withdraw": "Retiro", + "withdrawButton": "Retiro", + "waitUntilTransactionIsMined": "Espere que la transacción se mine", + "enterYourDepositsNote": "Introduzca su ticket de depósito", + "yourWallet": "Su Monedero", + "pleaseSelectYourWeb3Wallet": "Por favor seleccione su monedero Web3 compatible:", + "otherWallet": "Otro Monedero", + "currentNetworkIsNotSupported": "La red actual no es compatible", + "pleaseChangeNetwork": "La red ({network}) de la App no coincide con la red seleccionada en el monedero.", + "docs": "Docs", + "getFreeGETH": "Obtenga gETH gratuitos", + "logout": "Cerrar sesión", + "connect": "Conectar", + "token": "Token", + "amount": "Cantidad", + "amountTooltip": "Cada cantidad es una instancia independiente de Tornado Cash del conjunto anónimo correspondiente. Consulte el apartado Estadísticas para más información.", + "approvalIsRequired": "Se requiere aprobación", + "inOrderToUse": "Para usar {currency} debe habilitarla para Tornado.cash. Seleccione la cantidad que desee aprobar:", + "unlimited": "Ilimitada", + "unlimitedTooltip": "La aprobación ilimitada resulta más conveniente si usted quiere realizar múltiples depósitos.", + "enable": "Habilitar", + "transactionWasSuccessfullySent": "La transacción se envió correctamente.", + "insufficientBalance": "Balance insuficiente", + "youDontHaveEnoughTokens": "Usted no dispone de suficientes {currency} tokens. Su balance actual es {balance} {currency}", + "close": "cerrar", + "yourNote": "Su ticket privado", + "pleaseBackupYourNote": "Por favor, guarde y asegure su ticket. Lo necesitará más adelante para recuperar su depósito.", + "treatYourNote": "Considere su ticket como una clave privada - nunca lo comparta con nadie, incluyendo desarrolladores de tornado.cash.", + "saveAsFile": "El buscador le preguntara si quiere guardar su ticket como un archivo:", + "iBackedUpTheNote": "He guardado y asegurado el ticket", + "iEncryptedTheNote": "Cree una copia segura on-chain de este ticket con su Cuenta {address}", + "yourNoteWontBeSaved": "Su ticket no quedará guardado en su buscador. Por favor, asegúrese que lo ha guardado y asegurado!", + "yourDontHaveAccount": "Usted también puede guardar tickets encriptados on-chain configurando la Cuenta de Ticket, cree una en la página {account}.", + "sendDeposit": "Enviar Depósito", + "clickToCopy": "Haga clic para copiar", + "copied": "Copiado!", + "preparingTransactionData": "Preparando Datos de Transacción", + "viewInExplorer": "Ver en explorador", + "loading": "Cargando", + "pleaseConfirmInWallet": "Por favor confirme la clave publica en Metamask", + "pleaseConfirmTransactionInWallet": "Por favor confirme la transacción en {wallet}", + "waitingForTransactionConfirmation": "Esperando la confirmación de transacción", + "relayerIsNowSendingYourTransaction": "El retransmisor esta enviando su transacción. Responderá con el hash de la transacción pronto", + "note": "Ticket", + "noteTooltip": "Por favor introduzca el ticket que recibió cuando realizó el depósito", + "depositTransactionOnEtherscan": "Transacción de depósito en Etherscan", + "withdrawalSettings": "Configuración de retiro", + "pleaseEnterYourNote": "Por favor introduzca su ticket", + "turnOnWasm": "Error: Por favor active WebAssembly en las opciones de su buscador.
Si usted utiliza el buscador Tor, habilite javascript.options.wasm en about:config", + "timePassed": "Tiempo transcurrido", + "timePassedTooltip": "Incluso si hay múltiples depósitos posteriores al suyo, podrían pertenecer a un mismo usuario. Por tanto, le recomendamos esperar un mínimo de 24 horas antes de retirar fondos para asegurar que varios usuarios hayan utilizado Tornado.cash durante ese periodo.", + "subsequentDeposits": "Depósitos subsiguientes", + "subsequentDepositsTooltip": "La fuente mas probable de un retiro son los depósitos recientes. Por tanto, recomendamos esperar un mínimo de 5 depósitos posteriores al suyo para un mayor anonimato.", + "recipientAddress": "Dirección de Recepción", + "donate": "Donar", + "pleasePasteAddressHere": "Por favor introduzca su dirección aquí", + "noteIsInvalid": "el ticket es inválido", + "noteHasBeenSpent": "El ticket se ha gastado", + "gettingTheNoteData": "Obteniendo los datos del ticket", + "noteWasAlreadySpent": "El ticket ya ha sido gastado", + "error": "Error", + "downloadError": "Error de descarga", + "validationError": "Error de validación", + "recipientAddressIsInvalid": "La dirección de destino es inválida", + "total": "Total", + "noteBalance": "Balance de tickets", + "relayerFee": "Comisión del retransmisor", + "ethPurchase": "Comprar {currency}", + "ethPurchaseTooltip": "Cambie algunos {currency} de su depósito por {networkCurrency} durante el retiro para pagar el gas de futuras transacciones.", + "incorrectAmount": "Cantidad incorrecta. Por favor introduzca un número.", + "amountIsHigh": "Cantidad demasiado elevada. El valor máximo es {value}.", + "amountIsLow": "Cantidad demasiado baja. El valor mínimo es {value}.", + "tokensToReceive": "Tokens a recibir", + "relayer": "Retransmisor", + "relayerTooltip": "Use el servicio retransmisor para enviar su transacción. Es más privado, ya que la comisión de gas se substrae de los fondos depositados.", + "custom": "Personalizado", + "pasteYourRelayerUrlorEnsRecord": "Pegue la URL del retransmisor o el registro ENS", + "wallet": "Monedero", + "walletTooltip": "Use su propia cuenta para iniciar un retiro (p.e. Metamask o TrustWallet).", + "save": "Guardar", + "reset": "Reiniciar", + "withdrawWalletWarning": "Asegúrese que los {currency} utilizados para pagar por la comisión de gas no se pueden asociar a NINGUNA de sus direcciones. Lo contrario implicaría que su anonimato está comprometido. Recomendamos usar un Retransmisor en su lugar.", + "withdrawalConfirmation": "Confirmación de Retiro", + "confirm": "Confirmar", + "yourZkSnarkProofHasBeenSuccesfullyGenerated": "Su prueba zk-SNARK se ha generado con éxito! Por favor confirme para iniciar el retiro", + "generatingProof": "Generando prueba", + "statistics": "Estadísticas", + "anonymitySet": "Anonimato", + "anonymitySetTooltip": "Número de depósitos de los que potencialmente se ha originado su retiro", + "latestDeposits": "Últimos depósitos", + "yourIP": "Su IP {ip}", + "filterBy": "Filtrar por", + "spent": "Gastado", + "unspent": "No gastado", + "thereAreNoElements": "No hay elementos que coincidan con el filtro.", + "txHash": "Tx Hash", + "status": "Estado", + "copyNote": "Copiar Ticket", + "decryptCopyNote": "Des-encriptar y copiar ticket", + "v1Deposit": "v1 depósito", + "waitingForReceipt": "Esperando recepción", + "failed": "Fallo", + "withdrawn": "Retirado", + "deposited": "Depositado", + "removeFromCache": "Quitar de cache", + "pleaseMakeSureYouHaveBackedUpYourNote": "Por favor asegúrese que ha guardado y asegurado su ticket si todavía no ha sido gastado. Esta seguro que quiere eliminar esta transacción y el ticket del archivo del Buscador?", + "remove": "Eliminar", + "noteHasBeenDeleted": "La información del ticket se ha eliminado", + "accountHasBeenDeleted": "La información de cuenta se ha eliminado", + "cancelButton": "Cancelar", + "donationsAddress": "Dirección de donaciones:", + "rate": "Tarifa de la bolsa", + "only": "Solamente", + "equalUserDeposit": "{only} {n} {equalUserDepositText}", + "equalUserDepositPlural": "No hay depósitos | Un depósito | usuarios con depósitos idénticos", + "userDeposit": "sin depósitos | solamente 1 depósito | {n} depósitos", + "gasPrice": "Precio de Gas", + "totalFee": "Comisión total", + "networkFee": "Comisión de red", + "connectYourWalletFirst": "Conecte su monedero primero", + "changeNetwork": "Cambiar red", + "changeNetworkNote": "Su ticket pertenece a otra red, por favor cambie su red en la app.", + "changingNetwork": "Cambiando red", + "relayerShouldSupportSSL": "El retransmisor debería soportar SSL", + "relayerStatusOk": "Estado del retransmisor: OK", + "proposalIsActive": "El estado de la propuesta debe ser activo", + "canNotFetchStatusFromTheRelayer": "No se puede obtener el estado de su retransmisor", + "thisRelayerServesADifferentNetwork": "Este retransmisor sirve a una red distinta", + "compliance": "Cumplimiento", + "complianceTool": "herramienta de cumplimiento legal", + "complianceReport": "Informe de cumplimiento legal", + "complianceSubtitle": "Mantener la privacidad financiera es esencial para preservar nuestra libertad.{newline}No obstante, no debería ser a costa del incumplimiento legal. Con Tornado.cash, usted siempre puede presentar una prueba criptográficamente verificada de su historial de transacciones correspondiente a la dirección Ethereum usada en depósitos o retiros de fondos. Esto puede ser necesario para demostrar el origen de los activos existentes en su dirección de retiro.{newline}Para generar un informe de cumplimiento legal, por favor introduzca su Ticket de Tornado.cash debajo.", + "from": "Desde", + "to": "A", + "withdrawal": "Retiro", + "noteHasNotBeenSpent": "El ticket no ha sido gastado", + "thereIsNoRelatedDeposit": "No hay depósitos relacionados. el ticket es inválida.", + "warning": "Atención", + "doNotShareYouNote": "No comparta su Ticket con nadie ya que ésto le PERMITIRÁ retirar sus fondos!", + "date": "Fecha", + "transaction": "Transacción", + "commitment": "Compromiso", + "nullifierHash": "Hash del Nullifier", + "verified": "Verificador", + "generatePdfReport": "Genere informe PDF", + "compliancePrintWarning": "Este Informe de Compromiso es para propósito informativo unicamente. Debería confirmar la validez de este informe utilizando la Herramienta de Cumplimiento de Tornado (https://tornadocash.eth.link/compliance) o cualquier otro software criptográfico que pueda procesar y verificar la información contenida aquí(la \"Tornado Compliance Tool\"). Cualquier discrepancia entre la información recogida en este informe y entregado por la herramienta anterior indica que este informe no es riguroso y/o fraudulento.{newline}EL INFORME DE CUMPLIMIENTO SE PRESENTA \"COMO TAL,\" SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITAMENTE, INCLUYENDO PERO NO LIMITADA A LAS GARANTÍAS MERCANTILES, ADECUADAS PARA UN PROPÓSITO PARTICULAR Y LA NO INFRACCIÓN. EN NINGÚN CASO DEBERÍAN LOS AUTORES DE LA HERRAMIENTA DE CUMPLIMIENTO DE TORNADO.CASH SER RESPONSABLES U OBJETO DE CUALQUIER RECLAMO, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN ACCIÓN CONTRACTUAL, AGRAVIADO O DE CUALQUIER OTRO MODO, DERIVADO DE, PRODUCTO DE O EN CONEXIÓN CON EL MENCIONADO INFORME DE CUMPLIMIENTO.", + "relayRequestFailed": "El retransmisor {relayerName} no responde. Por favor escoja uno diferente.", + "selectProvider": "Seleccione proveedor", + "walletDoesNotSupported": "El monedero no es compatible", + "fetchGasPriceFailed": "Fallo obteniendo gasPrice", + "networkIsNotSupported": "Red no compatible", + "failToGenerateNote": "Fallo generando ticket", + "invalidRoot": "Raíz Inválida", + "failedToFetchAllDepositEvents": "Fallo obteniendo todos los eventos de depósito del contrato", + "unknownError": "Error desconocido", + "unitInvalidValue": "[ethjs-unit] en la conversión del número {value} a wei, valor inválido", + "tooManyDecimalPoints": "[ethjs-unit] en la conversión del número {value} a wei, demasiados puntos decimales", + "tooManyDecimalPlaces": "[ethjs-unit] en la conversión del número {value} a wei, demasiados posiciones decimales", + "settings": "Configuración", + "rpc": "Dispositivo RPC", + "rpcStatusOk": "Estado RPC: OK", + "rpcIsDown": "RPC no responde", + "thisRpcIsForDifferentNetwork": "El RPC es para una red diferente", + "rpcSelectError": "Ninguno de los RPCs predefinidos responden. Probablemente se debe a un fallo de red. Por favor selecciones un RCP personalizado en Configuración", + "rpcShouldSupportSSL": "El RPC debería soportar SSL", + "customRpcPlaceholder": "Pegue la URL del RPC", + "customRpc": "Personalizado", + "enterRecoveryKey": "Por favor introduzca su clave de recuperación", + "copy": "Copiar", + "thereAreNoTransactions": "No hay transacciones todavía.", + "governance": "Voto", + "delegatedBalance": "Balance delegado", + "votingPower": "Poder de votación", + "delegated": "Delegado", + "availableBalance": "Balance disponible", + "manage": "Gestión", + "proposals": "Propuestas", + "all": "Todo", + "active": "Activo", + "expired": "Expirada", + "pending": "Pendiente", + "passed": "Aprobada", + "timeLocked": "Tiempo bloqueado", + "createProposal": "Crear propuesta", + "startDate": "Fecha Inicial", + "endDate": "Fecha Final", + "quorum": "Quórum", + "quorumTooltip": "La votación de una propuesta dura {days} y es aprobada solo en caso de mayoría Favorable y si un quórum de {votes} de los votantes es alcanzado (suma de votos Favorables + Contrarios es mayor que {votes}).", + "for": "Favorable", + "against": "Contrario", + "title": "Título", + "description": "Descripción", + "proposalAddress": "Dirección de la Propuesta", + "lock": "Bloquear", + "unlock": "Desbloquear", + "proposalThresholdError": "Los balances bloqueados deben ser mayor o igual a {PROPOSAL_THRESHOLD} TORN", + "castYourVote": "Emita su voto", + "back": "Volver", + "yourCurrentVote": "Su voto actual: {vote}", + "currentResults": "Estado actual", + "information": "Info", + "amountToLock": "Cantidad a bloquear", + "amountToUnlock": "Cantidad a desbloquear", + "lockedBalance": "Balance bloqueado", + "lockedBalanceError": "Su balance bloqueado debe ser mayor que 0", + "lockTabDesc": "Para poder participar en la Gobernanza, usted debe bloquear tokens TORN. Su poder de voto será equivalente a la cantidad de tokens que haya bloqueado.", + "unlockTabDesc": "Usted puede desbloquear tokens previamente bloqueados aquí. Si la propuesta en la que participó no se ha completado todavía, es posible que deba esperar a que se complete, para desbloquear todos sus tokens TORN.", + "delegateTabDesc": "Usted puede delegar su poder de voto en un delegado. El delegado podrá participar en la Gobernanza en su lugar.", + "undelegateTabDesc": "Usted puede revocar el poder de voto de su delegado. Las propuestas previas y los votos ya emitidos se mantendran intactos.", + "recipient": "Destinatario", + "address": "Dirección", + "delegate": "Delegar", + "undelegate": "Recuperar", + "currentDelegate": "Delegado actual", + "approve": "Aprobar", + "approved": "Aprobado", + "proposalTitle": "Título de la Propuesta", + "proposalDescription": "Descripción de la Propuesta", + "defeated": "Vencida", + "accountSaving": "Configurando la Cuenta de Tickets", + "accountSaved": "Cuenta de Tickets guardada on-chain", + "creatingProposal": "Creando propuesta", + "proposalCreated": "Propuesta creada con éxito", + "depositing": "Depositando {value}", + "withdrawing": "Retirando {value}", + "claiming": "Reclamando {value}", + "withdrawnValue": "Retirado {value}", + "claimedValue": "Reclamado {value}", + "depositedValue": "Depositado {value}", + "locking": "Bloqueando", + "votingFor": "Votando a favor", + "votingAgainst": "Votando en contra", + "votedFor": "Voto emitido a favor de la propuesta", + "votedAgainst": "Voto emitido en contra de la propuesta", + "unlocking": "Desbloqueando", + "unlocked": "Desbloqueado", + "delegating": "Delegando", + "undelegating": "Recuperando", + "undelegated": "Recuperado", + "viewOnEtherscan": "Ver en Etherscan", + "awaitingExecution": "Esperando Ejecución", + "execute": "Ejecutar", + "executeProposal": "Ejecutar propuesta", + "executingProposal": "Ejecutando propuesta", + "locked": "bloqueado", + "lockedNotice": "Bloqueado", + "proposalExecuted": "Propuesta ejecutada exitosamente", + "pleaseLockBalance": "Por favor primero bloquee tokens TORN para poder delegar", + "pleaseDelegate": "El delegado no ha sido configurado", + "internalError": "Error interno. Por favor refresque la página y pruebe de nuevo", + "id": "ID", + "timerRemainingForPending": "Tiempo restante antes del inicio de votación", + "timerRemainingForVoting": "Tiempo restante para votar", + "timerRemainingForAwaitingExecution": "Tiempo restante antes de la ejecución", + "timerRemainingForExecution": "Tiempo de ejecución restante", + "accepted": "Aceptada", + "sent": "Enviada", + "mined": "Minada", + "confirmed": "Confirmada", + "pleaseLockTornFirst": "Por favor bloquee tokens TORN antes de proceder", + "tokensLockedUntil": "Su balance permanecerá bloqueado hasta {date}", + "onlyOneProposalErr": "Solamente se permite una propuesta activa por usuario. Por favor espere hasta que su propuesta actual haya finalizado.", + "max": "Max", + "withDisconnectedWallet": "Por favor, conecte un monedero o cambie el tipo de retiro", + "relayerError": "El retransmisor seleccionado no pudo enviar su tx. Por favor pruebe de nuevo o pruebe un retransmisor diferente en configuración.", + "relayerIsNotResponding": "El retransmisor no responde. Por favor pruebe de nuevo o pruebe un retransmisor diferente en configuración.", + "transactionFailed": "Transacción fallida", + "none": "ninguno", + "queued": "En cola", + "proposal": { + "error": { + "address": "El valor debe ser una dirección", + "contract": "La dirección debe ser un contrato", + "title": "Título requerido", + "description": "Descripción requerida" + } + }, + "executed": "Ejecutada", + "proposalDoesNotExist": "La propuesta no existe. Por favor vuelva a la lista.", + "errorPage": { + "title": "Iepaaa!", + "description": "Página no encontrada.", + "button": "Iniciar App" + }, + "rejectedRequest": "Ha rechazado la petición de {description}", + "updateCacheEvents": "Sincronizando eventos de depósito. Por favor espere", + "notEnoughTokens": "La comisión total es mayor que la cantidad de tokens que se recibiran. Puede ser debido a comisiones elevadas de retransmisores o congestión temporal de la red.", + "gasPriceSlider": { + "low": "Lento", + "standard": "Estándar", + "fast": "Rápido" + }, + "decrypt": "Descifrar", + "account": { + "title": "Cuenta de Tickets", + "description": "Una Cuenta de Tickets permite guardar copias seguras encriptadas de tickets privados. Esto hace que el almacenamiento de fondos sea fácil y sin complicaciones con la tecnología blockchain de Ethereum asegurando cada ticket.", + "button": "Cuenta", + "account": "Cuenta de tickets", + "backedUpWith": "Asegurada con", + "modals": { + "recoverAccount": { + "title": "Conecte con la clave de Cuenta de Tickets", + "description": "Por favor introduzca su clave de Cuenta de Tickets para importar su cuenta previamente configurada.", + "warning": "Clave de Cuenta de Tickets inválida.", + "connect": "Conectar" + }, + "setupAccount": { + "title": "Configuración de cuenta", + "label": "Clave de Cuenta de Tickets", + "description": "Esta clave se usa para encriptar y guardar sus tickets privados de Tornado.cash en la blockchain Ethereum. Por favor haga una copia de seguridad y nunca la comparta con nadie.", + "setupAccount": "Configurar cuenta", + "setAccount": "Finalizar", + "backedUp": "He asegurado la clave de Cuenta de Tickets", + "saveOnChain": "Crear una copia segura adicional on-chain de su clave de Cuenta de Tickets con su monedero", + "isNotSupportedWithHw": "Por favor tenga en cuenta que copias seguras adicionales on-chain de su Cuenta de Tickets no es compatible con monederos hardware o monederos móviles", + "successfulNotice": "Felicidades! Ha creado exitosamente una Cuenta de Tickets. Ahora puede encriptar sus tickets y guardarlos on-chain.", + "yourRecoveryKeyWontBeSaved": "Su clave de recuperación no se guardará en la cache del buscador, por favor asegúrese de que ha realizado una copia de seguridad." + }, + "showRecoveryKey": { + "title": "Clave actual de Cuenta de Tickets", + "description": "", + "close": "Cerrar" + }, + "checkRecoveryKey": { + "title": "Actualización de sesión", + "description": "La sesión de Cuentas de Tickets ha estado inactiva por 5 minutos. Le gustaría continuar?", + "inactiveDescription": "Ha estado inactivo por tiempo prolongado. Su sesión de Cuenta de Tickets ha terminado por razones de seguridad.", + "no": "No", + "yes": "Si" + }, + "decryptInfo": { + "title": "Sus tickets", + "description": "Todos los tickets se han descargado exitosamente y descifrado usando su clave de Cuenta de Tickets", + "all": "Eventos totales descargados:", + "warning": "Tickets con advertencias:", + "close": "Cerrar", + "unSpent": "Sus tickets no gastados encontrados:", + "spent": "Sus tickets gastados encontrados:", + "redirect": "Página principal" + }, + "removeAccount": { + "title": "Borrar información de cuenta", + "description": "Elimina la información de cuenta de la sesión actual de buscador", + "cancel": "Cancelar", + "remove": "Eliminar" + } + }, + "wallet": { + "label": "Monedero Wb3 conectado", + "desc": "Conectar su monedero web3", + "disconnect": "Desconectar su monedero", + "rpcDesc": "Cambiar su proveedor RPC Ethereum", + "connectWeb3": "Conectar Web3", + "logout": "Cerrar sesión", + "changeRpc": "Cambiar RPC" + }, + "setup": { + "decrypt": "Por favor, confirme la petición de descifrado en el monedero web3.", + "setTooltip": "Ya existe una cuenta asociada con este monedero web3. Por favor use 'Recuperar Cuenta' a continuación.", + "recTooltip": "Por favor configure una cuenta, no hay cuanta para esta dirección.", + "desc": "Configurar Cuenta de Tickets para guardar tickets encriptados en la blockchain Ethereum", + "account": "Configurar cuenta", + "recoverDesc": "Recuperar Cuenta de Tickets asociada con este monedero Web3", + "recover": "Recuperar cuenta", + "enterRawDesc": "Usar la clave de Cuenta de Tickets configurada", + "enterRaw": "Introducir clave de cuenta", + "accSetupDescription": "Esta clave se usa para encriptar y guardar sus tickets privados de Tornado.cash en la blockchain Ethereum. Por favor haga una copia de seguridad y nunca la comparta con nadie." + }, + "control": { + "balance": "Balance de cuenta: {value}", + "loadAllDesc": "Cargue y desencripte todos sus tickets privados con su clave actual de Cuenta de Tickets", + "loadAll": "Cargue todos sus tickets encriptados", + "showRecoveryKeyDesc": "Mostrar clave actual de Cuenta de Tickets", + "showRecoveryKey": "Mostrar", + "removeDesc": "Eliminar información de cuenta en la sesión del buscador", + "remove": "Limpiar información de cuenta", + "fileDesc": "Descargar tickets privados en bruto por defecto cuando haga un depósito" + }, + "notification": { + "text": "Tornado.cash añadió un copia segura on-chain. Configure su {note} ahora o {medium} info.", + "link": { + "note": "cuenta de tickets", + "medium": "leer más" + } + } + }, + "saveNote": "Guarde su ticket", + "pleaseSetUpAccount": "Para descifrar su ticket por favor proporcione una cuenta", + "decryptNote": "Por favor confirme descifrado de ticket", + "decryptFailed": "Descifrado fallido. Por favor pruebe conectar con una cuenta diferente", + "recoverFromKeyTitle": "Clave de cuenta de Tickets actual", + "trezorNotSupported": "Monedero Trezor no es compatible actualmente", + "ledgerNotSupported": "Monedero Ledger no es compatible actualmente", + "startDecryptingNotes": "Iniciando descifrado de ticket", + "decryptingNotes": "Desencriptando tickets", + "getAndValidateEvents": "Recibiendo y validando eventos {name}", + "notConnected": "No conectado", + "regular": "Normal", + "encrypted": "Encriptado", + "notDecryptedWithBackup": "Este ticket está encriptado por la cuenta de tickets {address}, asociada a la cuenta de metamask {backup}, cámbiela para poder descifrarlo.", + "notDecrypted": "Este ticket esta encriptado por la cuenta de tickets {address}, por favor selecciónela.", + "noteAccountKey": "Descifrado fallido. Conecte la direccion {address} de la cuenta metamask para descifrar la clave de Cuenta de Tickets {noteAddress}.", + "yourEncrypted": "Este ticket se descifrará con la cuenta {address}.", + "lockTooltip": "Este ticket esta guardado y encriptado on-chain. Se puede recuperar con la Cuenta de Tickets {address}.", + "connected": "Conectado", + "accountConnected": "Cuenta de Tickets", + "web3connected": "Web3 conectado", + "haveAccountSetupWithWallet": "Parece que usted ya tiene una Cuenta configurada con el monedero web3 actual. Por favor use la opción 'Recuperar cuenta' ", + "connectAccount": "Conectar Cuenta de Tickets", + "fetchFile": "No se pueden obtener las claves de prueba, verifique la conexión a Internet o intente usar VPN.", + "mobileWallet": { + "loading": { + "alert": "Si no ha recibido una notificación en su monedero, por favor re-conecte su monedero", + "action": "Re-conectar" + }, + "actions": { + "disabled": "Esta característica actualmente no es compatible con los monederos móviles." + } + }, + "dayPlural": "0 días | {n} día | {n} días" +} diff --git a/langs/fr.json b/langs/fr.json new file mode 100644 index 0000000..2c12529 --- /dev/null +++ b/langs/fr.json @@ -0,0 +1,428 @@ +{ + "closeNotification": "Fermer notification", + "indexNotification": "Tornado.cash {link}. Cependant, il s'agit d'un logiciel en phase d'expérimentation. Veuillez l'utiliser à vos propres risques.", + "indexNotificationLinkText": "a été audité", + "binanceInternalTxsNotification": "Veuillez ne pas utiliser votre adresse de portefeuille Binance pour retirer vos fonds. Les transactions internes (tout comme celles effectuées par Tornado.Cash) ne sont pas supportées sur la plateforme d'échange Binance. Si vous n'avez pas reçu vos fonds sur Binance, veuillez prendre contact avec le support Binance.", + "deposit": "Déposer", + "depositButton": "Déposer", + "withdraw": "Retirer", + "withdrawButton": "Retirer", + "waitUntilTransactionIsMined": "Attendre le temps que la transaction soit minée", + "enterYourDepositsNote": "Entrer votre note d'enregistrement de dépôt", + "yourWallet": "Votre Portefeuille", + "pleaseSelectYourWeb3Wallet": "Veuillez sélectionner un portefeuille compatible Web3:", + "otherWallet": "Autre Portefeuille", + "currentNetworkIsNotSupported": "Le réseau actuel n'est pas supporté", + "pleaseChangeNetwork": "L'App réseau ({network}) ne correspond pas au réseau sélectionné avec le portefeuille.", + "docs": "Docs", + "getFreeGETH": "Obtenez gratuitement des gETH", + "logout": "Se déconnecter", + "connect": "Connecter", + "token": "Token", + "amount": "Montant", + "amountTooltip": "Chaque montant dispose d'une instance autonome de Tornado Cash avec un seuil d'anonymat distinct. Consultez l'onglet statistiques pour plus d'informations.", + "approvalIsRequired": "Une approbation est requise", + "inOrderToUse": "Afin d'utiliser cette devise: {currency} vous devez l'activer pour Tornado.cash. Sélectionnez le montant que vous souhaitez approuver:", + "unlimited": "Illimité", + "unlimitedTooltip": "L'approbation illimitée est plus pratique dans le cas où vous devez effectuer plusieurs dépôts.", + "enable": "Activer", + "transactionWasSuccessfullySent": "La transaction a été envoyée avec succès.", + "insufficientBalance": "Balance insuffisante", + "youDontHaveEnoughTokens": "Vous n'avez pas assez de ce token: {currency}. Votre balance actuelle est : {balance} {currency}", + "close": "Fermer", + "yourNote": "Votre note d'enregistrement privée", + "pleaseBackupYourNote": "Veuillez sauvegarder votre note d'enregistrement. Vous allez en avoir besoin plus tard pour retirer votre dépôt.", + "treatYourNote": "Traitez votre note d'enregistrement comme une clé privée - ne la partagez jamais avec quiconque, y compris les développeurs de tornado.cash.", + "saveAsFile": "Le navigateur va vous demander de sauvegarder votre note d'enregistrement sous forme de fichier:", + "iBackedUpTheNote": "J'ai sauvegardé ma note d'enregistrement", + "iEncryptedTheNote": "Créer une sauvegarde de cette note d'enregistrement dans la Blockchain avec votre Compte : {address}", + "yourNoteWontBeSaved": "Votre note d'enregistrement ne sera pas sauvegardée dans votre navigateur. Veuillez vous assurer de bien l'avoir sauvegardé!", + "yourDontHaveAccount": "Vous pouvez aussi encrypter vos notes d'enregistrement dans la Blockchain en créant un Compte de Notes, créez en un dans la page {account}.", + "sendDeposit": "Envoyer le dépôt", + "clickToCopy": "Cliquer pour copier", + "copied": "Copié!", + "preparingTransactionData": "Préparation des données de transaction", + "viewInExplorer": "Voir dans l'explorateur", + "loading": "Chargement", + "pleaseConfirmInWallet": "Veuillez confirmer la fourniture de votre clé publique dans metamask", + "pleaseConfirmTransactionInWallet": "Veuillez confirmer la transaction à: {wallet}", + "waitingForTransactionConfirmation": "En attente de la confirmation de transaction", + "relayerIsNowSendingYourTransaction": "Le Relais est maintenant en train d'envoyer votre transaction. Il va envoyer le hash de transaction bientôt", + "note": "Note", + "noteTooltip": "Veuillez entrer la note d'enregistrement que vous avez reçue lorsque vous avez effectué un dépôt", + "depositTransactionOnEtherscan": "Dépôt de la transaction dans l'explorateur Etherscan", + "withdrawalSettings": "Réglages de retrait", + "pleaseEnterYourNote": "Veuillez entrer votre note d'enregistrement", + "turnOnWasm": "Erreur: Veuillez activer WebAssembly dans vos réglages de navigateur.
Si vous utilisez le navigateur Tor, activez javascript.options.wasm dans about:config", + "timePassed": "Temps passé", + "timePassedTooltip": "Même s'il y a plusieurs dépôts après le vôtre, ils pourraient avoir été effectués par le même utilisateur. Par conséquent, nous vous recommandons d'attendre au moins 24 heures avant de retirer des fonds pour vous assurer que plusieurs utilisateurs ont utilisé Tornado.cash pendant cette période.", + "subsequentDeposits": "Dépôts postérieurs", + "subsequentDepositsTooltip": "La preuve la plus probable d'un retrait est celle d'un dépôt récent. De ce fait, nous vous recommandons d'attendre au moins 5 dépôts suivants le vôtre afin d'obtenir un meilleur anonymat.", + "recipientAddress": "Adresse de réception", + "donate": "Faire un don", + "pleasePasteAddressHere": "Veuillez coller l'adresse ici", + "noteIsInvalid": "La note d'enregistrement est invalide", + "noteHasBeenSpent": "La note d'enregistrement a été utilisée", + "gettingTheNoteData": "Recevoir les données de la note d'enregistrement", + "noteWasAlreadySpent": "La note d'enregistrement a déjà été utilisée", + "error": "Erreur", + "downloadError": "Erreur de téléchargement", + "validationError": "Erreur de validation", + "recipientAddressIsInvalid": "L'adresse de réception est invalide", + "total": "Total", + "noteBalance": "Balance de la note d'enregistrement", + "relayerFee": "Frais de relais", + "ethPurchase": "Achat d'{currency}", + "ethPurchaseTooltip": "Échangez une partie des {currency} de votre dépôt en {networkCurrency} pendant le retrait afin de payer le gas dans les transactions futures.", + "incorrectAmount": "Montant incorrect. Veuillez saisir un nombre.", + "amountIsHigh": "Montant trop élevé. La valeur maximale est {value}.", + "amountIsLow": "Montant trop faible. La valeur minimale est {value}.", + "tokensToReceive": "Tokens à recevoir", + "relayer": "Relais", + "relayerTooltip": "Utiliser le service de relais pour envoyer votre transaction. Cela permet une transaction plus privée, puisque les frais de gas sont soustraits des fonds déposés.", + "custom": "Personnalisé", + "pasteYourRelayerUrlorEnsRecord": "Collez votre URL de relais ou votre enregistrement ENS", + "wallet": "Portefeuille", + "walletTooltip": "Utilisez votre propre compte pour déclencher un retrait (exemple: Metamask ou TrustWallet).", + "save": "Sauvegarder", + "reset": "Réinitialiser", + "withdrawWalletWarning": "Assurez-vous que les {currency} utilisés pour payer les frais de gas ne peuvent être liés à AUCUNE de vos adresses. Sinon, l'anonymat du retrait sera compromis. Nous vous recommandons d'utiliser un relais à la place.", + "withdrawalConfirmation": "Confirmation de Retrait", + "confirm": "Confirmer", + "yourZkSnarkProofHasBeenSuccesfullyGenerated": "Votre preuve zk-Snark proof a été générée avec succès! Veuillez cliquer sur Confirmer pour lancer la procédure de retrait.", + "generatingProof": "Génération de la preuve", + "statistics": "Statistiques", + "anonymitySet": "Niveau d'anonymat", + "anonymitySetTooltip": "Nombre de dépôts pouvant être associés à votre retrait", + "latestDeposits": "Dernier dépôt", + "yourIP": "Votre IP {ip}", + "filterBy": "Filtrer par", + "spent": "Dépensée", + "unspent": "Non dépensée", + "thereAreNoElements": "Aucun élément ne correspond aux filtres choisis.", + "txHash": "Hash de transaction", + "status": "Statut", + "copyNote": "Copier Note", + "decryptCopyNote": "Décrypter et copier la note", + "v1Deposit": "Dépôt v1", + "waitingForReceipt": "En attente de réception", + "failed": "Échec", + "withdrawn": "Retiré", + "deposited": "Deposé", + "removeFromCache": "Retiré du cache", + "pleaseMakeSureYouHaveBackedUpYourNote": "Veuillez vous assurer d'avoir sauvegardé votre note d'enregistrement si elle n'est pas déjà dépensée. Voulez-vous toujours supprimer cette transaction ainsi que la note d'enregistrement du stockage de votre navigateur ?", + "remove": "Supprimer", + "noteHasBeenDeleted": "Les informations liées à la note d'enregistrement ont été supprimées", + "accountHasBeenDeleted": "Les informations liées au compte ont été supprimées", + "cancelButton": "Annuler", + "donationsAddress": "Adresse de donation:", + "rate": "Ratio de la pool", + "only": "Seulement", + "equalUserDeposit": "{only} {n} {equalUserDepositText}", + "equalUserDepositPlural": "Il n'y a pas de dépôts | Un seul dépôt | dépôts équivalents", + "userDeposit": "aucun dépôt | seulement 1 dépôt | {n} dépôts", + "gasPrice": "Prix du gas", + "totalFee": "Frais total", + "networkFee": "Frais de réseau", + "connectYourWalletFirst": "Connecter d'abord votre portefeuille", + "changeNetwork": "Changer de réseau", + "changeNetworkNote": "Votre note provient d'un autre réseau, veuillez changer de réseau dans l'application.", + "changingNetwork": "Changement du réseau", + "relayerShouldSupportSSL": "Le relais doit supporter SSL", + "relayerStatusOk": "Statut du relais : OK", + "proposalIsActive": "Le statut de la proposition doit être actif", + "canNotFetchStatusFromTheRelayer": "Impossible de récupérer le statut du relais", + "thisRelayerServesADifferentNetwork": "Ce relais sert un autre réseau", + "compliance": "Conformité", + "complianceTool": "outil de conformité", + "complianceReport": "Rapport de Conformité", + "complianceSubtitle": "Le maintien de la confidentialité financière est essentiel pour préserver nos libertés, mais il ne doit pas se faire au prix de la non-conformité. Avec Tornado.cash, vous pouvez fournir une preuve cryptographiquement vérifiée de l'historique des transactions en utilisant l'adresse Ethereum que vous avez utilisée pour déposer ou retirer des fonds. Cela peut être nécessaire pour montrer l'origine des actifs détenus dans votre adresse de retrait.{newline}Pour générer un rapport de conformité, veuillez saisir votre note d'enregistrement Tornado.cash ci-dessous.", + "from": "De", + "to": "À", + "withdrawal": "Retrait", + "noteHasNotBeenSpent": "La note d'enregistrement n'a pas été dépensée", + "thereIsNoRelatedDeposit": "Il n'y a pas de dépôt lié. La note d'enregistrement n'est pas valable.", + "warning": "Avertissement", + "doNotShareYouNote": "Ne partagez pas votre note avec qui que ce soit car elle sera utilisée pour retirer vos fonds !", + "date": "Date", + "transaction": "Transaction", + "commitment": "Engagement", + "nullifierHash": "Hash Nullifié", + "verified": "Verifié", + "generatePdfReport": "Générer un rapport PDF", + "compliancePrintWarning": "Ce rapport de conformité est uniquement destiné à des fins d'information. Vous devez confirmer la validité de ce rapport en utilisant l'outil de conformité de Tornado (https://tornadocash.eth.link/compliance) ou tout autre logiciel cryptographique capable de calculer et de vérifier les informations contenues dans ce document (l' \"Outil de Conformité Tornado\"). Toute divergence entre les informations trouvées dans ce rapport et celles fournies par l'outil susmentionné indique que les informations contenues dans ce rapport sont inexactes et/ou frauduleuses.{newline}LE RAPPORT DE CONFORMITÉ EST FOURNI \"EN L'ÉTAT\", SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE, Y COMPRIS, MAIS SANS S'Y LIMITER, LES GARANTIES DE QUALITÉ MARCHANDE, D'ADÉQUATION À UN USAGE PARTICULIER ET D'ABSENCE DE CONTREFAÇON. EN AUCUN CAS, LES AUTEURS DE L'OUTIL DE CONFORMITÉ TORNADO.CASH NE POURRONT ÊTRE TENUS RESPONSABLES DE TOUTE RÉCLAMATION, DE TOUT DOMMAGE OU DE TOUTE AUTRE RESPONSABILITÉ, QUE CE SOIT DANS LE CADRE D'UNE ACTION CONTRACTUELLE, DÉLICTUELLE OU AUTRE, DÉCOULANT DE, EN DEHORS DE OU EN RELATION AVEC CE RAPPORT DE CONFORMITÉ.", + "relayRequestFailed": "Le relais {relayerName} est en panne. Veuillez choisir un autre relais.", + "selectProvider": "Sélectionner le fournisseur", + "walletDoesNotSupported": "Le portefeuille n'est pas supporté", + "fetchGasPriceFailed": "La récupération du prix du Gas a échoué", + "networkIsNotSupported": "Réseau non supporté", + "failToGenerateNote": "Échec de la génération de la note", + "invalidRoot": "Racine invalide", + "failedToFetchAllDepositEvents": "Échec de la génération de l'ensemble des événements de dépôt du contrat", + "unknownError": "Erreur inconnue", + "unitInvalidValue": "[ethjs-unit] lors de la conversion du nombre {value} en wei, valeur invalide", + "tooManyDecimalPoints": "[ethjs-unit] lors de la conversion du nombre {value} en wei, trop de points décimaux", + "tooManyDecimalPlaces": "[ethjs-unit] lors de la conversion du nombre {value} en wei, trop de décimales", + "settings": "Réglages", + "rpc": "Point de terminaison du RPC", + "rpcStatusOk": "Statut RPC: OK", + "rpcIsDown": "RPC en panne", + "thisRpcIsForDifferentNetwork": "Le RPC est pour un réseau différent", + "rpcSelectError": "Tous les RPCs prédéfinis sont en panne. Il s'agit probablement d'une erreur de réseau. Veuillez sélectionner un RPC personnalisé dans les paramètres", + "rpcShouldSupportSSL": "Le RPC doit supporter SSL", + "customRpcPlaceholder": "Coller votre URL RPC", + "customRpc": "Personnalisé", + "enterRecoveryKey": "Veuillez entrer votre clé de récupération", + "copy": "Copier", + "thereAreNoTransactions": "Il n'y a pas encore de transactions.", + "governance": "Voter", + "delegatedBalance": "Solde délégué", + "votingPower": "Solde disponible pour le vote", + "delegated": "Délégué", + "availableBalance": "Solde disponible", + "manage": "Réglages", + "proposals": "Propositions", + "all": "Toutes", + "active": "Active", + "expired": "Expirée", + "pending": "En attente", + "passed": "Adoptée", + "timeLocked": "Verrouillé", + "createProposal": "Créer proposition", + "startDate": "Date de début", + "endDate": "Date de fin", + "quorum": "Quorum", + "quorumTooltip": "Le vote d'une proposition dure {days} et n'est adopté qu'en cas de majorité de Pour et si un quorum de {votes} votants est atteint (la somme des votes Pour + Contre est supérieure à {votes}).", + "for": "Pour", + "against": "Contre", + "title": "Titre", + "description": "Description", + "proposalAddress": "Adresse de proposition", + "lock": "Verrouiller", + "unlock": "Déverrouiller", + "proposalThresholdError": "Le solde bloqué doit être supérieur ou égal à {PROPOSAL_THRESHOLD} TORN", + "castYourVote": "Voter", + "back": "Retour en arrière", + "yourCurrentVote": "Votre vote actuel: {vote}", + "currentResults": "Résultats actuels", + "information": "Infos", + "amountToLock": "Montant à verrouiller", + "amountToUnlock": "Montant à déverrouiller", + "lockedBalance": "Solde verrouillé", + "lockedBalanceError": "Votre solde bloqué doit être supérieur à 0", + "lockTabDesc": "Afin de participer à la gouvernance, vous devez verrouiller des jetons TORN. Votre pouvoir de vote sera équivalent au nombre de jetons que vous bloquez.", + "unlockTabDesc": "Vous pouvez déverrouiller vos TORN précédemment verrouillés ici. Si la proposition à laquelle vous avez participé n'est pas encore terminée, vous devrez attendre qu'elle le soit pour débloquer tous vos TORN.", + "delegateTabDesc": "Vous pouvez déléguer votre pouvoir de vote à un délégataire. Le délégataire pourra participer à la gouvernance en votre nom.", + "undelegateTabDesc": "Vous pouvez révoquer le pouvoir de vote de votre délégué. Ses propositions précédentes et les votes déjà émis resteront inchangés.", + "recipient": "Bénéficiaire", + "address": "Adresse", + "delegate": "Déléguer", + "undelegate": "Retirer la délégation", + "currentDelegate": "Délégué actuel", + "approve": "Approuver", + "approved": "Approuvé", + "proposalTitle": "Titre de la proposition", + "proposalDescription": "Description de la proposition", + "defeated": "Échec", + "accountSaving": "Configuration du compte de Notes", + "accountSaved": "Compte de Notes sauvegardé dans la blockchain", + "creatingProposal": "Création de la proposition", + "proposalCreated": "Proposition créée avec succès", + "depositing": "Dépôt de {value}", + "withdrawing": "Retrait de {value}", + "claiming": "Réclamation de {value}", + "withdrawnValue": "Retiré: {value}", + "claimedValue": "Réclamé: {value}", + "depositedValue": "Déposé: {value}", + "locking": "Vérrouillage", + "votingFor": "Votation Pour", + "votingAgainst": "Votation contre", + "votedFor": "Vous avez voté avec succès pour la proposition", + "votedAgainst": "Vous avez voté avec succès contre la proposition", + "unlocking": "Déverrouillage", + "unlocked": "Déverrouillé", + "delegating": "Délégation", + "undelegating": "Retrait de la délégation", + "undelegated": "Délégation retirée", + "viewOnEtherscan": "Voir sur Etherscan", + "awaitingExecution": "Attente d'exécution", + "execute": "Exécuter", + "executeProposal": "Exécuter la proposition", + "executingProposal": "Exécution de la proposition", + "locked": "verrouillé", + "lockedNotice": "Verrouillé", + "proposalExecuted": "Proposition exécutée avec succès", + "pleaseLockBalance": "Veuillez au préalable verrouiller vos tokens TORN afin de déléguer", + "pleaseDelegate": "Le délégué n'a pas été défini", + "internalError": "Erreur interne. Veuillez rafraîchir la page et réessayer", + "id": "ID", + "timerRemainingForPending": "Temps restant avant le début du vote", + "timerRemainingForVoting": "Temps restant pour voter", + "timerRemainingForAwaitingExecution": "Temps restant avant exécution", + "timerRemainingForExecution": "Temps restant pour l'exécution", + "accepted": "Acceptée", + "sent": "Envoyée", + "mined": "Minée", + "confirmed": "Confirmée", + "pleaseLockTornFirst": "Veuillez verrouiller vos tokens TORN avant de procéder", + "tokensLockedUntil": "Votre solde est bloqué jusqu'à cette date: {date}", + "onlyOneProposalErr": "Seulement une proposition active est autorisée par utilisateur. Veuillez patienter jusqu'à ce que votre proposition actuelle soit terminée.", + "max": "Max", + "withDisconnectedWallet": "Veuillez, connecter un portefeuille ou changer le type de retrait", + "relayerError": "Le relais sélectionné ne peut pas envoyer votre transaction. Veuillez réessayer ou choisir un relais différent dans les réglages.", + "relayerIsNotResponding": "Le Relais ne répond pas. Veuillez réessayer ou choisir un relais différent dans les réglages.", + "transactionFailed": "Transaction échouée", + "none": "aucun", + "queued": "En attente", + "proposal": { + "error": { + "address": "La valeur doit être une adresse", + "contract": "L'adresse doit être un contrat", + "title": "Un titre est requis", + "description": "Une description est requise" + } + }, + "executed": "Exécutée", + "proposalDoesNotExist": "La proposition n'existe pas. Veuillez revenir à la liste.", + "errorPage": { + "title": "Oooups!", + "description": "Page non trouvée.", + "button": "Lancer l'app" + }, + "rejectedRequest": "Vous avez rejeté la requête {description}", + "updateCacheEvents": "Synchronisation des événements de dépôt. Veuillez patienter", + "notEnoughTokens": "Le total des frais est plus élevé que le montant des tokens à recevoir. Cela peut être dû à des frais de relais élevés ou à une congestion temporaire du réseau.", + "gasPriceSlider": { + "low": "Lent", + "standard": "Standard", + "fast": "Rapide" + }, + "decrypt": "Décrypter", + "account": { + "title": "Compte de Notes", + "description": "Un Compte de Notes permet de stocker des sauvegardes encryptées de votre note sur la chaîne. Cela permet de stocker des fonds en toute sécurité et sans stress grâce à la sécurité de la blockchain Ethereum qui protège chaque note.", + "button": "Compte", + "account": "Compte de Notes", + "backedUpWith": "Sauvegardé avec", + "modals": { + "recoverAccount": { + "title": "Connection avec la clé du compte de notes", + "description": "Veuillez entrer votre clé de compte de notes pour importer votre compte précédemment configuré.", + "warning": "Clé de compte de notes invalide.", + "connect": "Se connecter" + }, + "setupAccount": { + "title": "Configuration de compte", + "label": "Clé de Compte de Notes", + "description": "Cette clé est utilisée pour encrypter et stocker vos notes privées Tornado.cash sur la blockchain Ethereum. Veuillez la sauvegarder et ne jamais la partager avec qui que ce soit.", + "setupAccount": "Configurer compte", + "setAccount": "Terminé", + "backedUp": "J'ai sauvegardé la clé du compte de notes", + "saveOnChain": "Créer une sauvegarde additionnelle de votre clé de compte de notes dans votre portefeuille, sur la Blockchain.", + "isNotSupportedWithHw": "Veuillez garder à l'esprit que la sauvegarde supplémentaire de votre compte de notes sur la blockchain n'est pas prise en charge par les portefeuilles physiques - ou Hardware wallets ou portefeuilles mobiles.", + "successfulNotice": "Félicitations ! Vous avez réussi à configurer un compte de notes. Maintenant, vous pouvez encrypter vos notes et les stocker sur la blockchain.", + "yourRecoveryKeyWontBeSaved": "Votre clé de récupération ne sera pas enregistrée dans le cache du navigateur, assurez-vous de l'avoir sauvegardée." + }, + "showRecoveryKey": { + "title": "Clé de compte de notes actuelle", + "description": "", + "close": "Fermer" + }, + "checkRecoveryKey": { + "title": "Mise à jour de la session", + "description": "La session du compte de notes est inactive depuis 5 minutes. Voulez-vous continuer ?", + "inactiveDescription": "Vous avez été inactif pendant une longue période. Votre session de compte de notes a été interrompue pour des raisons de sécurité.", + "no": "Non", + "yes": "Oui" + }, + "decryptInfo": { + "title": "Vos notes", + "description": "Toutes les notes ont été téléchargées avec succès et décryptées à l'aide de la clé de votre compte de notes.", + "all": "Total des événements téléchargés:", + "warning": "Notes avec avertissement:", + "close": "Fermer", + "unSpent": "Vos notes non dépensées trouvées:", + "spent": "Vos notes dépensées trouvées :", + "redirect": "Page d'accueil" + }, + "removeAccount": { + "title": "Effacer les informations du compte", + "description": "Supprimer les informations du compte de la session actuelle du navigateur", + "cancel": "Annuler", + "remove": "Supprimer" + } + }, + "wallet": { + "label": "Connecter portefeuille Web3", + "desc": "Connecter votre portefeuille web3", + "disconnect": "Se déconnecter de votre votre wallet", + "rpcDesc": "Changer votre fournisseur RPC Ethereum", + "connectWeb3": "Connecter Web3", + "logout": "Déconnecter", + "changeRpc": "Changer RPC" + }, + "setup": { + "decrypt": "Veuillez confirmer la demande de décryptage du portefeuille web3.", + "setTooltip": "Un compte est déjà associé à ce portefeuille web3. Veuillez utiliser l'option 'Récupérer le compte' ci-dessous.", + "recTooltip": "Veuillez créer un compte, il n'y a pas de compte pour cette adresse.", + "desc": "Configurer un compte de notes pour stocker des notes encryptées sur la blockchain Ethereum.", + "account": "Configurer Compte", + "recoverDesc": "Récupérer le compte de notes associé à ce portefeuille Web3", + "recover": "Récupérer le compte", + "enterRawDesc": "Utiliser la clé de compte de notes précédemment définie", + "enterRaw": "Entrez la clé du compte", + "accSetupDescription": "Cette clé est utilisée pour encrypter et stocker vos notes privées Tornado.cash sur la blockchain Ethereum. Veuillez la sauvegarder et ne jamais la partager avec qui que ce soit." + }, + "control": { + "balance": "Solde du compte de notes: {value}", + "loadAllDesc": "Chargez et décryptez toutes vos notes privées avec la clé actuelle du compte de notes.", + "loadAll": "Charger toutes les notes encryptées", + "showRecoveryKeyDesc": "Révéler la clé actuelle du compte de notes", + "showRecoveryKey": "Révéler", + "removeDesc": "Supprimer les informations du compte de la session actuelle du navigateur", + "remove": "Effacer les informations du compte", + "fileDesc": "Télécharger des notes privées brutes par défaut lorsque vous effectuez un dépôt" + }, + "notification": { + "text": "Tornado.cash a ajouté la possibilité d'effectuer des sauvegardes de notes sur la blockchaîn. Configurez votre {note} maintenant et pour plus d'informations : {medium}.", + "link": { + "note": "compte de notes", + "medium": "lire plus" + } + } + }, + "saveNote": "Sauvegarder votre note", + "pleaseSetUpAccount": "Pour décypter votre note d'enregistrement, veuillez configurer un compte", + "decryptNote": "Veuillez confirmer le décryptage de la note d'enregistrement", + "decryptFailed": "Le décryptage a échoué. Veuillez réessayer en vous connectant sur un autre compte", + "recoverFromKeyTitle": "Clé de l'actuel Compte de Notes", + "trezorNotSupported": "Le portefeuille Trezor n'est pas actuellement pris en charge", + "ledgerNotSupported": "Le portefeuille Ledger n'est pas actuellement pris en charge", + "startDecryptingNotes": "Lancement du décryptage de la note", + "decryptingNotes": "Décryptage des notes d'enregistrement", + "getAndValidateEvents": "Recevoir et valider les événements {name}", + "notConnected": "Non connecté", + "regular": "Régulier", + "encrypted": "Encryptée", + "notDecryptedWithBackup": "Cette note d'enregistrement est encryptée par le compte de notes {address}, qui est lié au compte metamask {backup}. Veuillez changer de compte pour le décryptage.", + "notDecrypted": "Cette note d'enregistrement est encryptée par le compte de notes {address}, veuillez basculer sur ce compte.", + "noteAccountKey": "Le décryptage a échoué. Connectez vous au compte metamask {address} pour décryter la clé du Compte de Notes {noteAddress}", + "yourEncrypted": "Cette note d'enregistrement sera encryptée avec le compte {address}.", + "lockTooltip": "Cette note a été inscrite et encryptée sur la blockchain. Elle peut être récupérée par le Compte de Notes {address}.", + "connected": "Connecté", + "accountConnected": "Compte de Notes", + "web3connected": "Web3 connecté", + "haveAccountSetupWithWallet": "Il semblerait que vous ayez déjà un compte installé avec le portefeuille actuel Web3. Veuillez utiliser l'option 'Récupérer son compte'", + "connectAccount": "Connecter Compte de Notes", + "fetchFile": "Impossible de trouver les clés de preuve, veuillez vérifier la connexion Internet ou essayer utiliser un VPN.", + "mobileWallet": { + "loading": { + "alert": "Si vous n'avez pas reçu de notification dans votre portefeuille, veuillez reconnecter votre portefeuille", + "action": "Se reconnecter" + }, + "actions": { + "disabled": "Cette fonctionnalité n'est pas prise en charge par portefeuilles mobiles." + } + }, + "dayPlural": "0 jours | {n} jour | {n} jours" +} diff --git a/langs/index.js b/langs/index.js new file mode 100644 index 0000000..72e731c --- /dev/null +++ b/langs/index.js @@ -0,0 +1,16 @@ +import en from './en.json' +import es from './es.json' +import fr from './fr.json' +import ru from './ru.json' +import tr from './tr.json' +import uk from './uk.json' +import zh from './zh.json' +export default { + en, + es, + fr, + ru, + tr, + uk, + zh +} diff --git a/langs/ru.json b/langs/ru.json new file mode 100644 index 0000000..59f038a --- /dev/null +++ b/langs/ru.json @@ -0,0 +1,437 @@ +{ + "closeNotification": "Закрыть", + "indexNotification": "Tornado.cash {link}. Однако, это экспериментальный проект, используйте на свой страх и риск.", + "indexNotificationLinkText": "прошел аудит", + "binanceInternalTxsNotification": "Пожалуйста, не используйте адреса кошельков Binance для вывода средств. Внутренние транзакции (включая снятие средств с Tornado.cash) в настоящее время не поддерживаются на бирже Binance. Если у вас возникли проблемы с получением средств, вам следует обратиться в службу поддержки Binance.", + "deposit": "Депозит", + "depositButton": "Внести", + "withdraw": "Вывод", + "withdrawButton": "Снять", + "waitUntilTransactionIsMined": "Подождите, пока транзакция замайнится", + "enterYourDepositsNote": "Введите Note", + "yourWallet": "Подключение кошелька", + "pleaseSelectYourWeb3Wallet": "Пожалуйста, выберите Web3-совместимый кошелек:", + "otherWallet": "Другой кошелек", + "currentNetworkIsNotSupported": "Текущая сеть не поддерживается", + "pleaseChangeNetwork": "Сеть приложения ({network}) не совпадает с сетью, выбранной в кошельке.", + "docs": "Документация", + "getFreeGETH": "Получить gETH", + "logout": "Выйти", + "connect": "Подключить", + "token": "Токен", + "amount": "Сумма", + "amountTooltip": "Каждая сумма представляет собой отдельный экземпляр Tornado.cash с отдельным набором анонимности. Вы можете получить больше информации во вкладке Статистика.", + "approvalIsRequired": "Требуется разрешение", + "inOrderToUse": "Чтобы использовать {currency}, вы должны активировать его для Tornado.cash. Выберите сумму, которую хотите утвердить:", + "unlimited": "Неограниченное", + "unlimitedTooltip": "Неограниченное разрешение удобнее, если вы собираетесь сделать несколько депозитов.", + "enable": "Включить", + "transactionWasSuccessfullySent": "Транзакция была успешно отправлена.", + "insufficientBalance": "Недостаточный баланс", + "youDontHaveEnoughTokens": "Недостаточно {currency} токенов. Ваш текущий баланс {balance} {currency}", + "close": "Закрыть", + "yourNote": "Ваша приватная Note", + "pleaseBackupYourNote": "Пожалуйста, сделайте резервную копию приватной Note, расположенной ниже. Она понадобится вам позже для снятия вашего депозита.", + "treatYourNote": "Относитесь к приватной Note, как к приватному ключу - никогда и ни с кем не делитесь ею, включая разработчиков Tornado.cash.", + "saveAsFile": "Браузер предложит сохранить вашу Note как файл:", + "iBackedUpTheNote": "Я сделал резервную копию", + "iEncryptedTheNote": "Создать резервную копию этой Note в блокчейне с помощью Аккаунта {address}", + "yourNoteWontBeSaved": "Ваша Note не будет сохранена в браузере. Убедитесь, что вы сделали резервную копию!", + "yourDontHaveAccount": "Вы также можете сохранять зашифрованные Note в блокчейне, создав аккаунт для приватных Note. Создайте его на странице {account}.", + "sendDeposit": "Отправить депозит", + "clickToCopy": "Скопировать", + "copied": "Скопировано!", + "preparingTransactionData": "Подготовка данных транзакции", + "viewInExplorer": "Посмотреть транзакцию", + "loading": "Загрузка", + "pleaseConfirmInWallet": "Подтвердите предоставление открытого ключа в metamask", + "pleaseConfirmTransactionInWallet": "Подтвердите транзакцию в {wallet}", + "waitingForTransactionConfirmation": "Ожидание подтверждения транзакции", + "relayerIsNowSendingYourTransaction": "Relayer отправляет вашу транзакцию. Ожидаем хэш транзакции", + "note": "Note", + "noteTooltip": "Введите Note, которую вы получили, когда вносили депозит", + "depositTransactionOnEtherscan": "Транзакция депозита на Etherscan", + "withdrawalSettings": "Настройки вывода", + "pleaseEnterYourNote": "Введите Note", + "turnOnWasm": "Ошибка: включите WebAssembly в настройках вашего браузера.
Если вы используете браузер Tor, включите javascript.options.wasm в about:config", + "timePassed": "Время", + "timePassedTooltip": "Даже если после вас сделано несколько депозитов, они могли быть сделаны одним и тем же пользователем. Поэтому мы рекомендуем подождать не менее 24 часов, прежде чем снимать средства, чтобы убедиться, что за это время несколько пользователей использовали Tornado.cash.", + "subsequentDeposits": "Депозитов после", + "subsequentDepositsTooltip": "Наиболее вероятным источником снятия средств являются недавние депозиты. Поэтому, мы рекомендуем подождать как минимум 5 депозитов после вашего, чтобы улучшить анонимность.", + "recipientAddress": "Адрес получателя", + "donate": "Поддержать проект", + "pleasePasteAddressHere": "Вставьте адрес", + "noteIsInvalid": "Некорректная Note", + "noteHasBeenSpent": "Депозит снят", + "gettingTheNoteData": "Получение данных", + "noteWasAlreadySpent": "Note уже была потрачена", + "error": "Ошибка", + "downloadError": "Ошибка загрузки", + "validationError": "Ошибка проверки", + "recipientAddressIsInvalid": "Некорректный адрес получателя", + "total": "Итог", + "noteBalance": "Баланс Note", + "relayerFee": "Комиссия Relayer", + "ethPurchase": "Покупка {currency}", + "ethPurchaseTooltip": "Обменяйте часть {currency} из вашего депозита на {networkCurrency} во время снятия средств для оплаты газа в будущих транзакциях.", + "incorrectAmount": "Неверная сумма. Пожалуйста, введите число.", + "amountIsHigh": "Сумма слишком велика. Максимальное значение - {value}.", + "amountIsLow": "Сумма слишком мала. Минимальное значение - {value}.", + "tokensToReceive": "Получаемые токены", + "relayer": "Relayer", + "relayerTooltip": "Используйте Relayer сервис для отправки транзакции. Это более анонимно, так как плата за газ вычитается из депозита.", + "custom": "Свой Relayer", + "pasteYourRelayerUrlorEnsRecord": "Вставьте Relayer URL или ENS запись", + "wallet": "Кошелек", + "walletTooltip": "Использовать кошелек, например, Metamask или TrustWallet, для снятия депозита.", + "save": "Сохранить", + "reset": "Сбросить", + "withdrawWalletWarning": "Убедитесь, что {currency}, использованный для оплаты комиссии сети, не связан ни с одним из ваших адресов. В противном случае, транзакции депозита и вывода будут связаны. Мы рекомендуем использовать Relayer для обеспечения анонимности.", + "withdrawalConfirmation": "Подтверждение вывода средств", + "confirm": "Подтвердить", + "yourZkSnarkProofHasBeenSuccesfullyGenerated": "Ваше zk-Snark доказательство успешно сгенерировано! Нажмите Подтвердить, чтобы инициировать вывод средств", + "generatingProof": "Создание доказательства", + "statistics": "Статистика", + "anonymitySet": "Количество депозитов", + "anonymitySetTooltip": "Общее количество депозитов этой суммы в Tornado.сash. Чем больше это количество, тем лучше (анонимнее)", + "latestDeposits": "Последние депозиты", + "yourIP": "Ваш IP {ip}", + "filterBy": "Фильтр по", + "spent": "Потрачен", + "unspent": "Непотрачен", + "thereAreNoElements": "Нет элементов, которые соответствуют фильтрам.", + "txHash": "Хеш траназакции", + "status": "Состояние", + "copyNote": "Скопировать", + "decryptCopyNote": "Дешифровать и копировать", + "v1Deposit": "v1 депозит", + "waitingForReceipt": "Ожидание", + "failed": "Неудача", + "withdrawn": "Снят", + "deposited": "Внесен", + "removeFromCache": "Удаление из хранилища", + "pleaseMakeSureYouHaveBackedUpYourNote": "Пожалуйста, убедитесь, что вы сделали резервную копию Note, если она еще не была потрачена. Вы все еще хотите удалить эту транзакцию и Note из хранилища браузера?", + "remove": "Удалить", + "noteHasBeenDeleted": "Информация о Note была удалена", + "accountHasBeenDeleted": "Информация об аккаунте была удалена", + "cancelButton": "Отмена", + "donationsAddress": "Адрес для донатов:", + "rate": "Курс", + "only": "", + "equalUserDeposit": "{only} {n} {equalUserDepositText}", + "equalUserDepositPlural": "Депозиты отсутствуют | Один депозит | депозита | депозитов", + "userDeposit": "депозиты отсутствуют | 1 депозит | {n} депозита | {n} депозитов", + "gasPrice": "Цена Газа", + "totalFee": "Итоговая комиссия", + "networkFee": "Комиссия сети", + "connectYourWalletFirst": "Подключите свой кошелек", + "changeNetwork": "Сменить сеть", + "changeNetworkNote": "Ваша Note из другой сети. Смените сеть приложения, в которой она была создана.", + "changingNetwork": "Смена сети", + "relayerShouldSupportSSL": "Relayer должен поддерживать SSL", + "relayerStatusOk": "Статус Relayer: OK", + "proposalIsActive": "Предложение должно быть активным", + "canNotFetchStatusFromTheRelayer": "Невозможно получить ответ от Relayer", + "thisRelayerServesADifferentNetwork": "Этот Relayer обслуживает другую сеть", + "compliance": "Соответствие", + "complianceTool": "Проверка соответствия", + "complianceReport": "Отчет о соответствии", + "complianceSubtitle": "Конфиденциальность финансов является необходимым условием сохранения наших свобод.{newline}Однако, она не должна достигаться за счёт несоблюдения установленных правил и стандартов.{newline}С Tornado.cash вы всегда сможете получить криптографически достоверное подтверждение истории транзакций. Для этого вам понадобится лишь адрес Ethereum, который вы использовали для ввода или вывода средств. Подтверждение может быть необходимо для того, чтобы обосновать происхождение активов, хранящихся по вашему адресу.{newline}Для создания отчета о соответствии, пожалуйста, введите идентификатор вашей Tornado.cash Note ниже.", + "from": "Отправитель", + "to": "Получатель", + "withdrawal": "Вывод", + "noteHasNotBeenSpent": "Note не потрачена", + "thereIsNoRelatedDeposit": "Такого депозита не существует. Note некорректна.", + "warning": "Предупреждение", + "doNotShareYouNote": "Note является приватной информацией, обладание ею позволяет осуществить вывод депозита!", + "date": "Дата", + "transaction": "Транзакция", + "commitment": "Commitment", + "nullifierHash": "Nullifier Hash", + "verified": "Подтверждено", + "generatePdfReport": "Сгенерировать PDF отчёт", + "compliancePrintWarning": "Настоящий отчет о соответствии носит исключительно информационный характер. Вы должны подтвердить действительность этого отчета с помощью средства проверки соответствия Tornado (https://tornadocash.eth.link/compliance) или с помощью любого другого криптографического программного обеспечения, которое может обработать и проверить информацию, содержащуюся в этом отчете(\"Tornado Compliance Tool\"). Любые расхождения между информацией, приведенной в данном отчете и предоставленной вышеуказанным инструментом, указывают на то, что информация, содержащаяся в этом отчете, является неточной и/или мошеннической.{newline}ОТЧЕТ О СООТВЕТСТВИИ ПРЕДОСТАВЛЯЕТСЯ \"КАК ЕСТЬ,\" БЕЗ ГАРАНТИЙ ЛЮБОГО РОДА, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОГО КАЧЕСТВА, ПРИГОДНОСТЬЮ К КОНКРЕТНОЙ ЦЕЛИ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИНСТРУМЕНТА СООТВЕТСТВИЯ TORNADO.CASH НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УЩЕРБ ИЛИ ДРУГУЮ ОТВЕТСТВЕННОСТЬ, ОТНОСЯЩУЮСЯ К ДЕЙСТВИЮ ДОГОВОРОВ, ГРАЖДАНСКИМ ПРАВОНАРУШЕНИЯМ, А ТАКЖЕ ВЫТЕКАЮЩУЮ ИЗ НАСТОЯЩЕГО ОТЧЕТА О СООТВЕТСТВИИ ИЛИ СВЯЗАННУЮ С НИМ.", + "relayRequestFailed": "Relayer {relayerName} не отвечает. Попробуйте сменить Relayer.", + "selectProvider": "Выберите кошелёк", + "walletDoesNotSupported": "Выбранный кошелёк не поддерживается", + "fetchGasPriceFailed": "Ошибка получения стоимости газа", + "networkIsNotSupported": "Сеть не поддерживается", + "failToGenerateNote": "Ошибка генерации Note", + "invalidRoot": "Invalid Root", + "failedToFetchAllDepositEvents": "Ошибка получения данных о депозитах из контракта", + "unknownError": "Неизвестная ошибка", + "unitInvalidValue": "[ethjs-unit] недопустимое значение при преобразовании числа {value} в wei", + "tooManyDecimalPoints": "[ethjs-unit] слишком много десятичных знаков при преобразовании числа {значения} в wei", + "tooManyDecimalPlaces": "[ethjs-unit] слишком много знаков после запятой при преобразовании числа {value} в wei", + "settings": "Настройки", + "rpc": "RPC", + "rpcStatusOk": "Статус RPC: OK", + "rpcIsDown": "RPC не отвечает", + "thisRpcIsForDifferentNetwork": "Этот RPC предназначен для другой сети", + "rpcSelectError": "Все RPC по умолчанию не отвечают. Возможно, это сетевая ошибка. Вы можете выбрать свой RPC в Настройках", + "rpcShouldSupportSSL": "RPC должен поддерживать SSL", + "customRpcPlaceholder": "Вставьте RPC URL", + "customRpc": "Свой RPC", + "enterRecoveryKey": "Введите свой ключ восстановления", + "copy": "Копировать", + "thereAreNoTransactions": "Транзакции пока отсутствуют.", + "governance": "Голосование", + "delegatedBalance": "Делегированный баланс", + "votingPower": "Право голоса", + "delegated": "Делегировано", + "availableBalance": "Доступный баланс", + "manage": "Управление", + "proposals": "Предложения", + "all": "Все", + "active": "Активные", + "expired": "Истек срок", + "pending": "В процессе", + "passed": "Принято", + "timeLocked": "Заблокировано", + "createProposal": "Создание предложения", + "startDate": "Начало", + "endDate": "Окончание", + "quorum": "Кворум", + "quorumTooltip": "Голосование по предложению длится {days} и принимается только в случае, когда большинство проголосовало \"За\" и достижения кворума в {votes} голосов (сумма голосов \"За\" + \"Против\" должна быть больше {votes}).", + "for": "За", + "against": "Против", + "title": "Заголовок", + "description": "Описание", + "proposalAddress": "Адрес предложения", + "lock": "Заблокировать", + "unlock": "Разблокировать", + "proposalThresholdError": "Заблокированный баланс должен быть больше или равен {PROPOSAL_THRESHOLD} TORN", + "castYourVote": "Проголосовать", + "back": "Назад", + "yourCurrentVote": "Ваш голос: {vote}", + "currentResults": "Текущие результаты", + "information": "Инфо", + "amountToLock": "Сумма для блокировки", + "amountToUnlock": "Сумма для разблокировки", + "lockedBalance": "Заблокированный баланс", + "lockedBalanceError": "Ваш заблокированный баланс должен быть больше 0", + "lockTabDesc": "Чтобы принимать участие в управлении, вы должны заблокировать TORN токены. Ваше право голоса будет эквивалентно количеству заблокированных токенов.", + "unlockTabDesc": "Здесь вы можете разблокировать ранее заблокированные TORN. Если предложение в котором вы учавствуете еще не завершено, вам придется подождать, пока оно будет завершено, чтобы разблокировать все TORN.", + "delegateTabDesc": "Вы можете отдать свое право голоса делегату. Делегат сможет учавствовать в управлении от вашего имени.", + "undelegateTabDesc": "Вы можете отозвать право голоса у своего делегата. Их предыдущие предложения и голоса останутся неизменными.", + "recipient": "Получатель", + "address": "Адрес", + "delegate": "Отдать голос", + "undelegate": "Отозвать голос", + "currentDelegate": "Текущий делегат", + "approve": "Разрешить", + "approved": "Разрешено", + "proposalTitle": "Заголовок предложения", + "proposalDescription": "Описание предложения", + "defeated": "Отклонено", + "accountSaving": "Создание Note аккаунта", + "accountSaved": "Note aккаунт сохранен в блокчейне", + "creatingProposal": "Создание предложения", + "proposalCreated": "Предложение успешно создано", + "depositing": "Внесение {value}", + "withdrawing": "Снятие {value}", + "claiming": "Получение {value}", + "withdrawnValue": "Снято {value}", + "claimedValue": "Получено {value}", + "depositedValue": "Внесено {value}", + "locking": "Блокирование", + "votingFor": "Голосование За", + "votingAgainst": "Голосование Против", + "votedFor": "Успешно проголосовали За", + "votedAgainst": "Успешно проголосовали Против", + "unlocking": "Разблокирование", + "unlocked": "Разблокировано", + "delegating": "Передача голоса", + "undelegating": "Отзыв голоса", + "undelegated": "Голос отозван", + "viewOnEtherscan": "Посмотреть на Etherscan", + "awaitingExecution": "Ожидание исполнения", + "execute": "Исполнить", + "executeProposal": "Исполнить предложение", + "executingProposal": "Исполнение предложения", + "locked": "заблокировано", + "lockedNotice": "Заблокировано", + "proposalExecuted": "Предложение успешно исполнено", + "pleaseLockBalance": "Чтобы отдать голос, сперва заблокируйте TORN", + "pleaseDelegate": "Делегат не назначен", + "internalError": "Внутренняя ошибка. Обновите страницу и повторите попытку", + "id": "ID", + "timerRemainingForPending": "Время до начала голосования", + "timerRemainingForVoting": "Оставшееся время для голосования", + "timerRemainingForAwaitingExecution": "Оставшееся время до исполнения", + "timerRemainingForExecution": "Осталось времени на исполнение", + "accepted": "Принято", + "sent": "Отправлено", + "mined": "Замайнено", + "confirmed": "Подтверждено", + "pleaseLockTornFirst": "Чтобы продолжить, сперва заблокируйте TORN токены", + "tokensLockedUntil": "Ваш баланс заблокирован до {date}", + "onlyOneProposalErr": "Каждому пользователю разрешено только одно активное предложение. Подождите, пока ваше текущее предложение не будет завершено.", + "max": "Макс", + "withDisconnectedWallet": "Пожалуйста, смените Кошелек или метод вывода", + "relayerError": "Выбранный Relayer не может отправить транзакцию. Повторите попытку или смените Relayer в настройках.", + "relayerIsNotResponding": "Relayer не отвечает. Повторите попытку или смените Relayer в настройках.", + "transactionFailed": "Транзакция не выполнилась", + "none": "нет", + "queued": "В очереди", + "proposal": { + "error": { + "address": "Неверный адрес", + "contract": "Адрес должен быть контрактом", + "title": "Укажите заголовок", + "description": "Укажите описание" + } + }, + "executed": "Исполнено", + "proposalDoesNotExist": "Предложение не найдено. Вернитесь к списку.", + "errorPage": { + "title": "Упс!", + "description": "Страница не найдена.", + "button": "На главную" + }, + "rejectedRequest": "Вы отклонили запрос {description}", + "updateCacheEvents": "Обновление кешированых событий", + "notEnoughTokens": "Итоговая комиссия превышает количество получаемых токенов. Это может быть связано с высокой комиссией Relayer или временной перегрузкой сети.", + "gasPriceSlider": { + "low": "Медленно", + "standard": "Стандарт", + "fast": "Быстро" + }, + "decrypt": "Дешифровать", + "account": { + "title": "Note аккаунт", + "description": "Note аккаунт позволяет хранить зашифрованные резервные копии приватных Note в блокчейне. Это делает простым хранение средств, а блокчейн Ethereum обеспечивает безопасность каждой Note.", + "button": "Аккаунт", + "account": "Note аккаунт", + "backedUpWith": "Адрес привязки", + "modals": { + "recoverAccount": { + "title": "Подключение с помощью ключа", + "description": "Введите ключ, чтобы импортировать ранее созданный Note аккаунт.", + "warning": "Неправильный ключ.", + "connect": "Подключить" + }, + "setupAccount": { + "title": "Создание Note аккаунта", + "label": "Ключ Note аккаунта", + "description": "Этот ключ используется для шифрования и хранения ваших приватных Note в блокчейне Ethereum. Пожалуйста, сделайте резервную копию ключа и никогда ни с кем им не делитесь.", + "setupAccount": "Создать аккаунт", + "setAccount": "Завершить", + "backedUp": "Я сделал резервную копию ключа", + "saveOnChain": "Создать дополнительную резервную копию ключа в блокчейне с помощью кошелька", + "isNotSupportedWithHw": "Имейте в виду, что резервное копирование в блокчейн вашего Note аккаунта не поддерживается аппаратными или мобильными кошельками", + "successfulNotice": "Поздравляем! Вы успешно создали Note аккаунт. Теперь вы можете шифровать ваши Note и хранить их в блокчейне.", + "yourRecoveryKeyWontBeSaved": "Ваш ключ восстановления не будет сохранен в браузере. Убедитесь, что вы сделали резервную копию ключа." + }, + "showRecoveryKey": { + "title": "Текущий ключ", + "description": "", + "close": "Закрыть" + }, + "checkRecoveryKey": { + "title": "Обновление сессии", + "description": "Сессия Note аккаунта была неактивна в течении 5 минут. Желаете продолжить?", + "inactiveDescription": "Вы долгое время бездействовали. Сессия вашего Note аккаунта была прекращена по соображениям безопасности.", + "no": "Нет", + "yes": "Да" + }, + "decryptInfo": { + "title": "Ваши Note", + "description": "Все Note успешно загружены и дешифрованы с помощью ключа", + "all": "Загружено событий:", + "warning": "Note с предупреждением:", + "close": "Закрыть", + "unSpent": "Непотраченных Note найдено:", + "spent": "Потраченных Note найдено:", + "redirect": "На главную" + }, + "removeAccount": { + "title": "Очистить информацию об аккаунте", + "description": "Удаление данных об аккаунте из текущей сессии браузера", + "cancel": "Отмена", + "remove": "Удалить" + } + }, + "wallet": { + "label": "Подключенный Web3 кошелек", + "desc": "Подключение web3 кошелька", + "disconnect": "Отключение от кошелька", + "rpcDesc": "Смена Ethereum RPC провайдера", + "connectWeb3": "Подключить Web3", + "logout": "Выход", + "changeRpc": "Сменить RPC" + }, + "setup": { + "decrypt": "Пожалуйста, подтвердите запрос на расшифровку в web3 кошельке.", + "setTooltip": "С этим web3 кошельком уже связан аккаунт. Нажмите на кнопку \"Восстановить\".", + "recTooltip": "Вы должны создать аккаунт, поскольку для этотого адреса нет связанного аккаунта.", + "desc": "Создание аккаунта для хранения зашифрованных Note в блокчейне Ethereum", + "account": "Создать", + "recoverDesc": "Восстановление аккаунта, связанного с этим кошельком", + "recover": "Восстановить", + "enterRawDesc": "Вход с помощью ключа", + "enterRaw": "Ввести ключ аккаунта", + "accSetupDescription": "Этот ключ используется для шифрования и хранения ваших Tornado.cash Note в блокчейне Ethereum. Пожалуйста, сохраните его и никогда никому не передавайте." + }, + "control": { + "balance": "Баланс аккаунта: {value}", + "loadAllDesc": "Загрузка и дешифровка всех ваших приватных Note с помощью текущего ключа", + "loadAll": "Загрузить все зашифрованные Note", + "showRecoveryKeyDesc": "Узнать текущий ключ", + "showRecoveryKey": "Показать", + "removeDesc": "Удаление информации об аккаунте в текущем сеансе браузера", + "remove": "Удалить", + "fileDesc": "Автоматическое скачивание приватных Note по умолчанию при внесении депозита" + }, + "notification": { + "text": "Tornado.cash поддерживает резервное копирование Note в блокчейн. Создайте ваш {note} сейчас или узнать {medium}.", + "link": { + "note": "аккаунт для Note", + "medium": "больше информации" + } + } + }, + "saveNote": "Сохранить Note", + "pleaseSetUpAccount": "Для дешифровки Note необходимо подключить аккаунт", + "decryptNote": "Подтвердите дешифрование Note", + "decryptFailed": "Дешифрование не удалось. Пожалуйста, попробуйте сменить аккаунт", + "recoverFromKeyTitle": "Текущий ключ аккаунта для Note", + "trezorNotSupported": "В данный момент кошелек Trezor не поддерживается", + "ledgerNotSupported": "В данный момент кошелек Ledger не поддерживается", + "startDecryptingNotes": "Начало дешифрования", + "decryptingNotes": "Дешифровка Note", + "getAndValidateEvents": "Получение и проверка {name} событий", + "notConnected": "Не подключен", + "regular": "Обычный", + "encrypted": "Зашифрованный", + "notDecryptedWithBackup": "Эта Note зашифрована учетной записью {address}, которая привязана к {backup} metamask аккаунту. Пожалуйста, переключитесь для дешифровки.", + "notDecrypted": "Эта Note зашифрована учетной записью {address}. Пожалуйста, переключитесь на нее.", + "noteAccountKey": "Дешифровка не удалась. Подключитесь к metamask аккаунту {address} для дешифровки ключа Note аккаунта {noteAddress}.", + "yourEncrypted": "Эта Note будет зашифрована аккаунтом {address}.", + "lockTooltip": "Эта Note хранится в сети в зашифрованном виде. Ее можно восстановить с помощью Note аккаунта {address}.", + "connected": "Подключен", + "accountConnected": "Подключенный аккаунт", + "web3connected": "Web3 подключен", + "haveAccountSetupWithWallet": "Похоже, вы уже создавали аккаунт с помощью текущего web3 кошелька. Пожалуйста, восстановите аккаунт", + "connectAccount": "Подключить Note аккаунт", + "fetchFile": "Не удается получить ключи для доказательства, проверьте интернет поделючение или попробуйте использовать VPN.", + "mobileWallet": { + "loading": { + "alert": "Если вы не получили уведомление в своем кошельке, пожалуйста, повторно подключите свой кошелек", + "action": "Переподключить" + }, + "actions": { + "disabled": "Мобильные кошельки не поддерживают эту функцию в данный момент." + } + }, + "dayPlural": "0 дней | {n} день | {n} дня | {n} дней", + "stakingReward": { + "title": "Stake награда", + "label": { + "tab": "Награда", + "input": "Доступная stake награда" + }, + "description": "Здесь вы можете получить вознаграждение за stake. Ваша заработанная доля прямо пропорциональна балансу TORN токенов, заблокированных для голосования.", + "action": "Получить" + } +} diff --git a/langs/tr.json b/langs/tr.json new file mode 100644 index 0000000..31f94cf --- /dev/null +++ b/langs/tr.json @@ -0,0 +1,428 @@ +{ + "closeNotification": "Bildirimi Kapat", + "indexNotification": "Tornado.cash {link} deneysel bir yazılımdır. Lütfen riskin farkında olarak kullanın.", + "indexNotificationLinkText": "denetimden geçmiştir ve", + "binanceInternalTxsNotification": "Lütfen para çekme işlemleri için Binance cüzdanına ait adresleri kullanmayın. Dahili işlemler (Tornado.cash çekimleri dahil) şu anda Binance Exchange’de desteklenmemektedir. Paranızın hesabınıza yansıması ile ilgili sorunlarınız varsa Binance destek ile iletişime geçmelisiniz.", + "deposit": "Yatırma", + "depositButton": "Yatırma", + "withdraw": "Çekme", + "withdrawButton": "Çekme", + "waitUntilTransactionIsMined": "İşleminiz gerçekleşene kadar bekleyin", + "enterYourDepositsNote": "Yatırma notunuzu girin", + "yourWallet": "Cüzdanınız", + "pleaseSelectYourWeb3Wallet": "Lütfen Web3 uyumlu cüzdanı seçin:", + "otherWallet": "Diğer cüzdan", + "currentNetworkIsNotSupported": "Bu ağ desteklenmiyor", + "pleaseChangeNetwork": "Uygulamanın ağı ({network}) cüzdanda seçili ağı desteklemiyor.", + "docs": "Dökümanlar", + "getFreeGETH": "Ücretsiz gETH alın", + "logout": "Çıkış", + "connect": "Bağlan", + "token": "Token", + "amount": "Miktar", + "amountTooltip": "Her değer, ayrı bir anonimlik kümesine sahip bağımsız bir Tornado Cash yansımasıdır. Daha fazla bilgi için istatistikler sekmesini kontrol edin.", + "approvalIsRequired": "Onay gerekmekte", + "inOrderToUse": "{currency} kullanmak için Tornado.cash’i etkinleştirmeniz gerekir. Onaylamak istediğiniz tutarı seçin:", + "unlimited": "Limitsiz", + "unlimitedTooltip": "Birden fazla para yatırma işlemi yapacaksanız sınırsız onay daha uygundur.", + "enable": "Etkinleştir", + "transactionWasSuccessfullySent": "Gönderim başarıyla gerçekleşti.", + "insufficientBalance": "Yetersiz bakiye", + "youDontHaveEnoughTokens": "Hesabınızda yeterli token yoktur.{currency}. Bakiyeniz {balance} {currency}", + "close": "Kapat", + "yourNote": "Özel notunuz", + "pleaseBackupYourNote": "Lütfen notunuzu yedekleyin. Yüklediğiniz tokenları geri çekmek için daha sonra ihtiyacınız olacak.", + "treatYourNote": "Notunuza özel bir anahtar gibi davranın. tornado.cash geliştiricileri dahil hiç kimseyle paylaşmayın.", + "saveAsFile": "Tarayıcınız notunuzu bir dosya olarak kaydetmenizi isteyecektir:", + "iBackedUpTheNote": "Notumu yedekledim.", + "iEncryptedTheNote": "Hesabınıza ait notun zincir üzerinde yedeğini oluşturun {address}", + "yourNoteWontBeSaved": "Notunuz tarayıcınıza kaydedilmeyecek. Lütfen yedeklendiğinden emin olun!", + "yourDontHaveAccount": "Ayrıca, Not Hesabı oluşturarak şifreli notları zincire kaydedebilir, hesabınızda {account} için tane oluşturabilirsiniz.", + "sendDeposit": "Yatırdıklarımı gönder", + "clickToCopy": "Kopyalamak için tıkla", + "copied": "Kopyalandı!", + "preparingTransactionData": "İşlem bilgisi hazırlanıyor", + "viewInExplorer": "Explorer’da görüntüle", + "loading": "Yükleniyor", + "pleaseConfirmInWallet": "Lütfen Metamaskta ortak anahtarı onaylayın", + "pleaseConfirmTransactionInWallet": "Lütfen cüzdanınızda {wallet} işlemi onaylayın", + "waitingForTransactionConfirmation": "İşleminizin onaylanması bekleniyor.", + "relayerIsNowSendingYourTransaction": "Relayer işleminizi gönderdi. Yakında bir işlem hash’i ile geri dönüş yapacak.", + "note": "Not", + "noteTooltip": "Lütfen token yatırırken aldığınız notu girin", + "depositTransactionOnEtherscan": "Yükleme işlemini Etherscan’da görüntüle", + "withdrawalSettings": "Çekim ayarları", + "pleaseEnterYourNote": "Lütfen notunuzu girin", + "turnOnWasm": "Hata: Lütfen tarayıcı ayarlarınızda WebAssembly’ı açın. Tor tarayıcı kullanıyorsanız, about:config içinde javascript.options.wasm’ı etkinleştirin.", + "timePassed": "Zaman aşımı", + "timePassedTooltip": "Sizin işleminizden sonra birden fazla para yatırma işlemi olsa bile, bunlar aynı kullanıcı tarafından yapılmış olabilir. Bu nedenle, bu süre içinde Tornado.cash kullanan birden fazla kullanıcı olduğundan emin olmak için para çekmeden önce en az 24 saat beklemenizi öneririz.", + "subsequentDeposits": "Bir sonraki yükleme", + "subsequentDepositsTooltip": "En olası para çekme kaynağı, son yüklemelerdir. Bu nedenle, daha iyi anonimlik sağlamak için sizinkinden sonra en az 5 para yatırmaya izin vermenizi öneririz.", + "recipientAddress": "Alıcı adresi", + "donate": "Bağış", + "pleasePasteAddressHere": "Lütfen adresi buraya yapıştırın", + "noteIsInvalid": "Not geçerli değil", + "noteHasBeenSpent": "Not kullanılmıştır.", + "gettingTheNoteData": "Not verilerini ver", + "noteWasAlreadySpent": "Note daha önce kullanıldı.", + "error": "Hata", + "downloadError": "İndirme hatası", + "validationError": "Doğrulama hatası", + "recipientAddressIsInvalid": "Alıcı adresi geçersiz.", + "total": "Toplam", + "noteBalance": "Note bakiyesi", + "relayerFee": "Relayer ücreti", + "ethPurchase": "{currency} Alım", + "ethPurchaseTooltip": "Yüklediğiniz miktarın {currency} bir kısmını, para çekme sırasında gelecekteki işlemlerde gas ödemesi yapmak için {networkCurrency} ayırın.", + "incorrectAmount": "Geçersiz miktar. Lütfen sayı girin.", + "amountIsHigh": "Çok yüksek değer. En çok {value}.", + "amountIsLow": "Çok düşük değer. En az {value}.", + "tokensToReceive": "Alınacak token", + "relayer": "Relayer", + "relayerTooltip": "İşleminizi göndermek için relayer hizmetini kullanın. Gas ücreti yatırılan fonlardan düşüldüğü için daha özeldir.", + "custom": "Özel", + "pasteYourRelayerUrlorEnsRecord": "Relayer URL ve ENS kaydını yapıştırın.", + "wallet": "Cüzdan", + "walletTooltip": "Para çekme işlemini başlatmak için kendi hesabınızı kullanın (Örneğin Metamask veya TrustWallet).", + "save": "Kaydet", + "reset": "Baştan başlat", + "withdrawWalletWarning": "Gas ücretini ödemek için kullanılan {currency} öğesinin HİÇBİR adresinizle bağlantılı olmadığından emin olun. Aksi takdirde, para çekme işleminin anonimliği tehlikeye atılacaktır. Bunun yerine bir Relayer kullanmanızı öneririz.", + "withdrawalConfirmation": "Çekimi onaylayın", + "confirm": "Onayla", + "yourZkSnarkProofHasBeenSuccesfullyGenerated": "zk-Snark kanıtınız başarıyla oluşturulmuştur! Para çekme işlemini başlatmak için lütfen Onayla’ya tıklayın", + "generatingProof": "Kanıt oluşturma", + "statistics": "İstatistik", + "anonymitySet": "Anonimlik seti", + "anonymitySetTooltip": "Para çekme işleminizin potansiyel olarak ilişkilendirileceği mevduat sayısı", + "latestDeposits": "Son yüklemeler", + "yourIP": "IP’niz {ip}", + "filterBy": "Filtreleyici", + "spent": "Kullanıldı", + "unspent": "Kullanılmadı", + "thereAreNoElements": "Filtreleri karşılayan hiçbir öğe yok.", + "txHash": "İşlem Hash’i", + "status": "Durum", + "copyNote": "Notu Kopyala", + "decryptCopyNote": "Notun şifresini çöz ve kopyala", + "v1Deposit": "v1 yükleme", + "waitingForReceipt": "Alıcı bekleniyor", + "failed": "Başarısız", + "withdrawn": "Çekildi", + "deposited": "Yüklendi", + "removeFromCache": "Cache’leri temizle", + "pleaseMakeSureYouHaveBackedUpYourNote": "Notunuz henüz kullanılmadıysa lütfen yedeklediğinizden emin olun. Yine de bu işlemi ve notu tarayıcı hafızasından kaldırmak istiyor musunuz?", + "remove": "Kaldır", + "noteHasBeenDeleted": "Not bilgisi silindi.", + "accountHasBeenDeleted": "Hesap bilgisi silindi.", + "cancelButton": "İptal", + "donationsAddress": "Bağış hesabı:", + "rate": "Havuz oranı", + "only": "Sadece", + "equalUserDeposit": "{only} {n} {equalUserDepositText}", + "equalUserDepositPlural": "Yükleme yok | Sadece bir yükleme | Eşit kullanıcı yüklemesi", + "userDeposit": "Yükleme yok | Sadece bir yükleme | {n} yüklemeler", + "gasPrice": "Gas Ücreti", + "totalFee": "Toplam ücret", + "networkFee": "Ağ ücreti", + "connectYourWalletFirst": "Önce cüzdanınızı bağlayın", + "changeNetwork": "Ağ değiştir", + "changeNetworkNote": "Notunuz başka bir ağa ait, lütfen uygulamadaki ağı değiştirin.", + "changingNetwork": "Ağ değiştir", + "relayerShouldSupportSSL": "Relayer SSL desteklemeli.", + "relayerStatusOk": "Relayer durumu: Uygun", + "proposalIsActive": "Öneri durumu aktif", + "canNotFetchStatusFromTheRelayer": "Relayer’dan durum bilgisi alınamıyor.", + "thisRelayerServesADifferentNetwork": "Relayer farklı bir ağa hizmet ediyor.", + "compliance": "Uyumluluk", + "complianceTool": "uyumluluk aracı", + "complianceReport": "Uyumluluk Raporu", + "complianceSubtitle": "Finansal gizliliği korumak, özgürlüklerimizi korumak için çok önemlidir.{newline} Ancak bu durum kurallara uymama pahasına olmamalıdır. Tornado.cash ile, para yatırmak veya para çekmek için kullandığınız Ethereum adresini kullanarak her zaman kriptografik olarak doğrulanmış işlem geçmişi kanıtını sağlayabilirsiniz. Bu kanıt, çekim adresinizde tutulan varlıkların kaynağını göstermek için gerekli olabilir.{newline} Bir uyumluluk raporu oluşturmak için lütfen aşağıya Tornado.cash Notunuzu girin.", + "from": "Kimden", + "to": "Kime", + "withdrawal": "Çekim", + "noteHasNotBeenSpent": "Note henuz kullanılmadı.", + "thereIsNoRelatedDeposit": "Yükleme ile bağlantı bulunamadı. Not geçerlisiz.", + "warning": "Uyarı", + "doNotShareYouNote": "Notunuzu kimseyle paylaşmayın çünkü paranızı çekmek için KULLANILACAKTIR!", + "date": "Tarih", + "transaction": "İşlem", + "commitment": "Bağlantı", + "nullifierHash": "Nullifier Hash", + "verified": "Onaylanmış", + "generatePdfReport": "PDF rapora dönüştür.", + "compliancePrintWarning": "Bu Uyumluluk Raporu yalnızca bilgilendirme amaçlıdır. Bu raporun geçerliliğini Tornado’nun Uyumluluk Aracını (https://tornadocash.eth.link/compliance) veya burada yer alan bilgileri hesaplayabilen ve doğrulayabilen diğer herhangi bir şifreleme yazılımıyla (\"Tornado Uyumluluk Aracı\") kullanarak onaylamalısınız.) Bu raporda bulunan ve yukarıdaki araç tarafından sağlanan bilgiler arasındaki herhangi bir tutarsızlık, rapordaki bilgilerin yanlış ve/veya sahte olduğunu gösterir.{newline} UYGUNLUK RAPORU, HERHANGİ BİR GARANTİ OLMADAN tamamen\"OLDUĞU GİBİ\" SUNULMAKTADIR. BELİRLİ BİR AMACA UYGUNLUK VE İHLAL ETMEME GARANTİLERİ DAHİLDİR ANCAK BUNLARLA SINIRLI OLMAMAK ÜZERE ZIMNİ VEYA ZIMNİ OLARAK GEÇERLİDİR. TORNADO.CASH UYUM ARACININ YAZARLARI RAPORDAN KAYNAKLANAN, UYUMLULUKTAN KAYNAKLANAN VEYA BAĞLANTILI OLARAK SÖZLEŞME, HAKSIZ YA DA BAŞKA BİR DURUMDA OLAN HERHANGİ BİR İDDİADAN, ZARAR VEYA BAŞKA SORUMLULUKTAN SORUMLU TUTULAMAZ.", + "relayRequestFailed": "Relayer {relayerName} çöktü. lütfen başka bir relayer seçin.", + "selectProvider": "Sağlayıcı seçin", + "walletDoesNotSupported": "Bu cüzdan desteklenmiyor", + "fetchGasPriceFailed": "Fetch gasPrice getirelemedi.", + "networkIsNotSupported": "Ağ desteklenmiyor", + "failToGenerateNote": "Not dönüştürme hatası", + "invalidRoot": "Geçersiz Root", + "failedToFetchAllDepositEvents": "Sözleşme ile para yatırma gerçekleşmedi.", + "unknownError": "Bilinmeyen hata", + "unitInvalidValue": "[ethjs-unit] sayıyı {value} wei’ye dönüştürürken geçersiz değer oluştu", + "tooManyDecimalPoints": "[ethjs-unit] sayıyı {value} wei’ye dönüştürürken çok fazla ondalık oluştu", + "tooManyDecimalPlaces": "[ethjs-unit] sayıyıy {value} wei’ye dönüştürürken çok fazla ondalık oluştu.", + "settings": "Ayarlar", + "rpc": "RPC endpoint", + "rpcStatusOk": "RPC durumu: Uygun", + "rpcIsDown": "RPC çöktü", + "thisRpcIsForDifferentNetwork": "RPC farklı bir ağa ait.", + "rpcSelectError": "Önceden tanımlanmış RPC’ler çalışmıyor. Muhtemelen bir ağ hatası var. Lütfen Ayarlar’da özel RPC’yi seçin", + "rpcShouldSupportSSL": "RPC, SSL desteklemelidir.", + "customRpcPlaceholder": "RPC URL’ini yapıştırın.", + "customRpc": "Özel", + "enterRecoveryKey": "Lütfen kurtarma anahtarını girin", + "copy": "Kopyala", + "thereAreNoTransactions": "Burada henüz işlem yapılmadı.", + "governance": "Oylama", + "delegatedBalance": "Delege edilen bakiye", + "votingPower": "Oylama gücü", + "delegated": "Delege edilmiş", + "availableBalance": "Uygun bakiye", + "manage": "Yönet", + "proposals": "Öneriler", + "all": "Hepsi", + "active": "Aktif", + "expired": "Süresi geçmiş", + "pending": "Bekleyen", + "passed": "Geçen Öneriler", + "timeLocked": "Zaman kilitle", + "createProposal": "Öneri yarat", + "startDate": "Başlangıç tarihi", + "endDate": "Bitiş tarihi", + "quorum": "Quorum", + "quorumTooltip": "Bir öneri oylaması {days} sürer ve sadece çoğunluk ve yeter sayı olması {votes} durumunda kabul edilir. Geçerli oy sayısına ulaşıldı (Geçerli Oy + Aleyhte oyların toplamı {votes} değerinden büyük).", + "for": "Öneriye Katıl", + "against": "Karşı", + "title": "Başlık", + "description": "Açıklama", + "proposalAddress": "Öneri adresi", + "lock": "Kilitli", + "unlock": "Kilitsiz", + "proposalThresholdError": "Kilitli bakiye, {PROPOSAL_THRESHOLD} TORN’a eşit veya daha fazla olmalıdır", + "castYourVote": "Oyunuzu kullanın", + "back": "Geri", + "yourCurrentVote": "Mevcut oyunuz: {vote}", + "currentResults": "Mevcut durum", + "information": "Bilgi", + "amountToLock": "Kilitli miktar", + "amountToUnlock": "Kilitsiz miktar", + "lockedBalance": "Kilitli bakiye", + "lockedBalanceError": "Kilitli bakiyeniz 0’dan büyük olmalıdır.", + "lockTabDesc": "Yönetişime katılmak için TORN kilitlemeniz gerekir. Oylama gücünüz, kilitlediğiniz token sayısına eşit olacaktır.", + "unlockTabDesc": "Daha önce kilitli olan TORN’unuzun kilidini buradan açabilirsiniz. Katıldığınız teklif henüz tamamlanmadıysa, tüm TORN’unuzun kilidini açmak için tamamlanmasını beklemeniz gerekebilir.", + "delegateTabDesc": "Oy hakkınızı bir temsilciye devredebilirsiniz. Temsilci sizin adınıza Yönetişime katılabilir.", + "undelegateTabDesc": "Temsilcinizin oy verme yetkisini geri alabilirsiniz. Önceki teklifleri ve halihazırda kullanılan oylar değişmeden kalacak.", + "recipient": "Alıcı", + "address": "Adres", + "delegate": "Delege et", + "undelegate": "Delege etmeyi bırak", + "currentDelegate": "Mevcut delege", + "approve": "Onayla", + "approved": "Onaylandı", + "proposalTitle": "Öneri başlığı", + "proposalDescription": "Öneri açıklaması", + "defeated": "İptal edilmiş", + "accountSaving": "Not hesabını ayarla", + "accountSaved": "Not hesabı zincire kaydedildi", + "creatingProposal": "Öneri yarat", + "proposalCreated": "Öneri başarıyla yaratıldı", + "depositing": "Yükleme aşamasında {value}", + "withdrawing": "Çekim aşamasında {value}", + "claiming": "Talep edilen {value}", + "withdrawnValue": "Çekilen {value}", + "claimedValue": "Talep edilmiş {value}", + "depositedValue": "Yüklendi {value}", + "locking": "Kilitlenen", + "votingFor": "Öneri için oy", + "votingAgainst": "Öneriye karşı oy", + "votedFor": "Öneri için oyunuzu başarıyla kullandınız.", + "votedAgainst": "Öneriye karşı oyunuzu başarıyla kullandınız.", + "unlocking": "Kilit kaldırılıyor", + "unlocked": "Kilit kaldırıldı", + "delegating": "Temsilcili", + "undelegating": "Temsil kaldırılıyor", + "undelegated": "Temsilci kaldırıldı", + "viewOnEtherscan": "Etherscan’de görüntüle", + "awaitingExecution": "Onay bekleniyor", + "execute": "Uygula", + "executeProposal": "Öneriyi uygula", + "executingProposal": "Öneri uygulanıyor", + "locked": "Kilitlendi", + "lockedNotice": "kililendi", + "proposalExecuted": "Öneri başarıyla uygulandı.", + "pleaseLockBalance": "Yetki vermek için lütfen önce TORN kilitleyin", + "pleaseDelegate": "Temsilci belirlenemedi", + "internalError": "İç hata. Lütfen sayfayı yenileyin ve tekrar deneyin", + "id": "ID", + "timerRemainingForPending": "Oylama başlamadan önce kalan süre", + "timerRemainingForVoting": "Oylama için kalan süre", + "timerRemainingForAwaitingExecution": "Öneri uygulamaya geçmeden önce kalan süre", + "timerRemainingForExecution": "Kalan uygulama süresi", + "accepted": "Kabul edildi", + "sent": "Gönderildi", + "mined": "Kazıldı", + "confirmed": "Onaylandı", + "pleaseLockTornFirst": "Devam etmek için lütfen önce TORN kilitleyin", + "tokensLockedUntil": "Bakiyeniz tarihe {date} kadar kilitli.", + "onlyOneProposalErr": "Kullanıcı başına yalnızca bir etkin öneriye izin verilir. Lütfen mevcut öneriniz bitene kadar bekleyin.", + "max": "Maksimum", + "withDisconnectedWallet": "Lütfen bir cüzdan bağlayın veya para çekme türünü değiştirin", + "relayerError": "Seçilen relayer tx’inizi gönderemedi. Lütfen tekrar deneyin veya ayarlarda farklı bir relayer seçin.", + "relayerIsNotResponding": "Relayer yanıt vermiyor. Lütfen tekrar deneyin veya ayarlarda farklı bir relayer seçin.", + "transactionFailed": "İşlem başarısız", + "none": "Yok", + "queued": "Sıraya alındı", + "proposal": { + "error": { + "address": "Değer adreste olmalıdır", + "contract": "Adres mutlaka kontrat olmalıdır", + "title": "Başlık gerekli", + "description": "Açıklama gerekli" + } + }, + "executed": "Uygulandı", + "proposalDoesNotExist": "Öneri mevcut değil. Lütfen listeye geri dönün.", + "errorPage": { + "title": "Oooops!", + "description": "Sayfa bulunamadı.", + "button": "Uygulamayı başlat" + }, + "rejectedRequest": "{description} isteğini reddettiniz", + "updateCacheEvents": "Para yatırma senkronize ediliyor. Lütfen bekleyin", + "notEnoughTokens": "Toplam ücret, alınacak token miktarından daha yüksektir. Bunun nedeni yüksek relayer ücreti veya geçici ağ tıkanıklığı olabilir..", + "gasPriceSlider": { + "low": "Yavaş", + "standard": "Standart", + "fast": "Hızlı" + }, + "decrypt": "Şifreyi çöz", + "account": { + "title": "Not hesabı", + "description": "Not Hesabı, özel notların zincir üzerinde şifrelenmiş yedeklerinin saklanmasına izin verir. Bu, her bir notu destekleyen Ethereum ağının güvenliği ile fonların güvenli bir şekilde saklanmasını sorunsuz ve stressiz hale getirir.", + "button": "Hesap", + "account": "Not hesabı", + "backedUpWith": "ile yedekle", + "modals": { + "recoverAccount": { + "title": "Note hesabı anahtarı ile bağlan", + "description": "Önceden kurduğunuz hesabınızı içe aktarmak için lütfen Not Hesap anahtarınızı girin.", + "warning": "Geçersiz Not hesabı anahtarı.", + "connect": "Bağlan" + }, + "setupAccount": { + "title": "Hesap kurulumu", + "label": "Not hesabı anahtarı", + "description": "Bu anahtar, Tornado.cash özel notlarınızı Ethereum blok zincirinde şifrelemek ve saklamak için kullanılır. Lütfen yedekleyin ve asla kimseyle paylaşmayın.", + "setupAccount": "Hesap kurulumu", + "setAccount": "Tamamla", + "backedUp": "Not hesabı anahtarımı yedekledim", + "saveOnChain": "Cüzdanınızla Not Hesabı anahtarınızın zincir üzerinde ek yedeğini oluşturun", + "isNotSupportedWithHw": "Lütfen unutmayın! Not Hesabınızın zincir üstü yedeklemesi, donanım cüzdanları veya mobil cüzdanlarla desteklenmez.", + "successfulNotice": "Tebrikler! Bir Not hesabını başarıyla kurdunuz. Artık notlarınızı şifreleyebilir ve zincirde saklayabilirsiniz.", + "yourRecoveryKeyWontBeSaved": "Kurtarma anahtarımız tarayıcı önbelleğine kaydedilmeyecek. Lütfen yedeklendiğinden emin olun." + }, + "showRecoveryKey": { + "title": "Mevcut Not hesabı anahtarı", + "description": "", + "close": "Kapat" + }, + "checkRecoveryKey": { + "title": "Oturum güncellemesi", + "description": "Not hesabı oturumu 5 dakikadır etkin değil. Devam etmek ister misin?", + "inactiveDescription": "Uzun süredir aktif değilsiniz. Not hesabı oturumunuz güvenlik nedeniyle sonlandırıldı.", + "no": "Hayır", + "yes": "Evet" + }, + "decryptInfo": { + "title": "Notlarınız", + "description": "Tüm notlar başarıyla indirilir ve Not hesabı anahtarınız kullanılarak şifresi çözülür", + "all": "İndirilen toplam oturumlar: ", + "warning": "Uyarı içeren notlar: ", + "close": "Kapat", + "unSpent": "Kullanılmamış notlarınız bulundu.: ", + "spent": "Kullanılmış notlarınız bulundu: ", + "redirect": "Ana sayfa" + }, + "removeAccount": { + "title": "Hesap bilgilerini temizle", + "description": "Mevcut tarayıcının oturumundan hesap bilgilerini kaldır", + "cancel": "İptal", + "remove": "Kaldır" + } + }, + "wallet": { + "label": "Web3 cüzdana bağlandı", + "desc": "Web3 cüzdana bağlan", + "disconnect": "Cüzdandan bağlantıyı kes", + "rpcDesc": "Ethereum RPC Provider’ı değiştir", + "connectWeb3": "Web3’e bağlan", + "logout": "Hesaptan Çık", + "changeRpc": "RPC değiştir" + }, + "setup": { + "decrypt": "Lütfen web3 cüzdanındaki şifre çözme isteğini onaylayın.", + "setTooltip": "Bu web3 cüzdanıyla zaten bir hesap ilişkilendirilmiş. Lütfen aşağıdaki ‘Hesabı Kurtar’ seçeneğini kullanın.", + "recTooltip": "Lütfen bir hesap oluşturun. Mevcut adres için bir hesap yok.", + "desc": "Ethereum blok zincirinde şifrelenmiş notları depolamak için Not Hesabı Kurulumu", + "account": "Hesap kurulumu", + "recoverDesc": "Bu Web3 cüzdanıyla ilişkili Not Hesabını Kurtar", + "recover": "Hesabı kurtar", + "enterRawDesc": "Önceden ayarlanmış Not Hesabı anahtarını kullan", + "enterRaw": "Hesap anahtarını girin", + "accSetupDescription": "Bu anahtar, Tornado.cash özel notlarınızı Ethereum blok zincirinde şifrelemek ve saklamak için kullanılır. Lütfen yedekleyin ve asla kimseyle paylaşmayın." + }, + "control": { + "balance": "Not hesabı bakiyesi: {value}", + "loadAllDesc": "Geçerli Not Hesabı anahtarıyla tüm özel notlarınızı yükleyin ve şifresini çözün", + "loadAll": "Tüm şifreli notları yükle", + "showRecoveryKeyDesc": "Geçerli Not Hesabı anahtarını göster", + "showRecoveryKey": "Geçerli", + "removeDesc": "Mevcut tarayıcının oturumundan hesap bilgilerini kaldır", + "remove": "Hesap bilgilerini temizle", + "fileDesc": "Para yatırırken ham özel notları varsayılan olarak indirin" + }, + "notification": { + "text": "Tornado.cash, zincir üstü not yedeklemeleri ekledi. {note} veya {medium} bilgilerinizi şimdi ayarlayın.", + "link": { + "note": "Not hesabı", + "medium": "Daha fazla bilgi" + } + } + }, + "saveNote": "Notu kaydet", + "pleaseSetUpAccount": "Notunuzun şifresini çözmek için lütfen bir hesap sağlayın", + "decryptNote": "Lütfen not şifre çözme işlemini onaylayın", + "decryptFailed": "Şifre çözme başarısız oldu. Lütfen farklı bir hesapla giriş yapmayı deneyin", + "recoverFromKeyTitle": "Mevcut Not hesabı anahtarı", + "trezorNotSupported": "Trezor cüzdanı desteklenmiyor", + "ledgerNotSupported": "Ledger cüzdanı desteklenmiyor", + "startDecryptingNotes": "Not şifre çözmeyi başlat", + "decryptingNotes": "Notların şifresini çöz", + "getAndValidateEvents": "{name} olaylarını alma ve doğrulama", + "notConnected": "Bağlanmadı", + "regular": "Düzenli", + "encrypted": "Şifreli", + "notDecryptedWithBackup": "Bu not, {backup} metamask hesabına bağlı {address} not hesabı tarafından şifrelenmiştir, lütfen şifreyi çözmek için geçiş yapın.", + "notDecrypted": "Bu not {address} not hesabı tarafından şifrelenmiştir, lütfen ona geçiş yapın.", + "noteAccountKey": "Şifre çözme başarısız oldu. {noteAddress} Not Hesabı anahtarının şifresini çözmek için {address} metamask hesabına bağlanın.", + "yourEncrypted": "Bu not {address} hesabıyla şifrelenecek.", + "lockTooltip": "Bu not zincir üzerinde şifrelenmiş olarak saklanır. {address} Not Hesabı tarafından kurtarılabilir..", + "connected": "Bağlandı", + "accountConnected": "Not hesabı", + "web3connected": "Web3 bağlandı", + "haveAccountSetupWithWallet": "Mevcut web3 cüzdanıyla zaten bir Hesap kurulumunuz var gibi görünüyor. Lütfen ‘Hesabı kurtar’ seçeneğini kullanın", + "connectAccount": "Not hesabına bağlan", + "fetchFile": "Kanıtlama anahtarları alınamıyor, lütfen internet bağlantısını kontrol edin veya VPN kullanmayı deneyin.", + "mobileWallet": { + "loading": { + "alert": "Cüzdanınıza bir bildirim almadıysanız, lütfen cüzdanınızı yeniden bağlayın", + "action": "Tekrar bağlandı" + }, + "actions": { + "disabled": "Bu özellik şu anda mobil cüzdanlar tarafından desteklenmemektedir.." + } + }, + "dayPlural": "0 gün | {n} gün | {n} gün" +} diff --git a/langs/uk.json b/langs/uk.json new file mode 100644 index 0000000..3927dbb --- /dev/null +++ b/langs/uk.json @@ -0,0 +1,428 @@ +{ + "closeNotification": "Закрити повідомлення", + "indexNotification": "Tornado.Cash {link}. Однак, це експериментальний проект, використовуйте на свій страх і ризик.", + "indexNotificationLinkText": "пройшов аудит", + "binanceInternalTxsNotification": "Будь ласка, не використовуйте адреси гаманців Binance для виведення коштів. Внутрішні транзакції (включаючи зняття коштів з Tornado.cash) в даний час не підтримуються на біржі Binance. Якщо у вас виникли проблеми з отриманням коштів, вам слід звернутися в службу підтримки Binance.", + "deposit": "Депозит", + "depositButton": "Внести", + "withdraw": "Вивід", + "withdrawButton": "Зняти", + "waitUntilTransactionIsMined": "Зачекайте, поки транзакція буде здобута", + "enterYourDepositsNote": "Введіть Note", + "yourWallet": "Підключення гаманця", + "pleaseSelectYourWeb3Wallet": "Будь ласка, виберіть Web3-сумісний гаманець:", + "otherWallet": "Інший гаманець", + "currentNetworkIsNotSupported": "Поточна мережа не підтримується", + "pleaseChangeNetwork": "Мережа додатку ({network}) не відповідає мережі, обраної в гаманці.", + "docs": "Документація", + "getFreeGETH": "Отримати gETH", + "logout": "Вийти", + "connect": "Підключитися", + "token": "Токен", + "amount": "Кількість", + "amountTooltip": "Кожна сума являє собою окремий екземпляр Tornado Cash з окремим набором анонімності. Ви можете отримати більше інформації у вкладці Статистика.", + "approvalIsRequired": "Потрібен дозвіл", + "inOrderToUse": "Щоб використовувати {currency} ви повинні активувати його для Tornado.cash. Виберіть суму, яку хочете затвердити::", + "unlimited": "Необмежено", + "unlimitedTooltip": "Необмежений дозвіл зручніше, якщо ви збираєтеся зробити кілька депозитів.", + "enable": "Увімкнути", + "transactionWasSuccessfullySent": "Транзакція була успішно відправлена.", + "insufficientBalance": "Недостатній баланс", + "youDontHaveEnoughTokens": "Недостатньо {currency} токенів. Ваш поточний баланс {balance} {currency}", + "close": "Закрити", + "yourNote": "Ваша приватна Note", + "pleaseBackupYourNote": "Будь ласка, зробіть резервну копію приватної Note, розташованої нижче. Вона знадобиться вам пізніше для зняття вашого депозиту.", + "treatYourNote": "Ставтеся до приватної Note так само, як і приватному ключу - ніколи і ні з ким не діліться нею, включаючи розробників tornado.cash.", + "saveAsFile": "Браузер попросить зберегти вашу Note як файл:", + "iBackedUpTheNote": "Я зробив резервну копію", + "iEncryptedTheNote": "Створити мережеву резервну копію цієї Note за допомогою Акаунта {address}", + "yourNoteWontBeSaved": "Ваша Note не буде збережена в сховище браузера. Переконайтеся, що ви зробили резервну копію!", + "yourDontHaveAccount": "Ви також можете зберігати зашифровані Note в мережі, створивши аккаунт для приватних нотаток. Створіть її на сторінці {account}.", + "sendDeposit": "Надіслати депозит", + "clickToCopy": "Скопіювати", + "copied": "Скопійовано!", + "preparingTransactionData": "Підготовка даних транзакції", + "viewInExplorer": "Подивитися транзакцію", + "loading": "Завантаження", + "pleaseConfirmInWallet": "Підтвердіть надання відкритого ключа в metamask", + "pleaseConfirmTransactionInWallet": "Підтвердіть транзакцію в {wallet}", + "waitingForTransactionConfirmation": "Очікування підтвердження транзакції", + "relayerIsNowSendingYourTransaction": "Relayer відправляє вашу транзакцію. Очікуємо хеш транзакції", + "note": "Note", + "noteTooltip": "Введіть Note, яку ви отримали, коли вносили депозит", + "depositTransactionOnEtherscan": "Транзакція депозиту на Etherscan", + "withdrawalSettings": "Налаштування виводу", + "pleaseEnterYourNote": "Введіть Note", + "turnOnWasm": "Помилка: увімкніть WebAssembly в налаштуваннях вашого браузера.
Якщо ви використовуєте браузер Tor, включите javascript.options.wasm в about:config", + "timePassed": "Час", + "timePassedTooltip": "Навіть якщо після вас зроблено кілька депозитів, вони могли бути зроблені одним і тим же користувачем. Тому ми рекомендуємо почекати не менше 24 годин, перш ніж знімати кошти, щоб переконатися, що за цей час кілька користувачів використовували Tornado.cash.", + "subsequentDeposits": "Депозитів після", + "subsequentDepositsTooltip": "Найбільш імовірним джерелом зняття коштів є недавні депозити. Тому, ми рекомендуємо почекати як мінімум 5 депозитів після вашого, щоб поліпшити анонімність.", + "recipientAddress": "Адреса одержувача", + "donate": "Підтримати проект", + "pleasePasteAddressHere": "Вставте адрес", + "noteIsInvalid": "Некоректна Note", + "noteHasBeenSpent": "Депозит знятий", + "GettingTheNoteData": "Отримання даних", + "noteWasAlreadySpent": "Note вже була витрачена", + "error": "Помилка", + "downloadError": "Помилка завантаження", + "validationError": "Помилка перевірки", + "recipientAddressIsInvalid": "Некоректний адрес одержувача", + "total": "Підсумок", + "noteBalance": "Баланс Note", + "relayerFee": "Комісія Relayer", + "ethPurchase": "Купівля {currency}", + "ethPurchaseTooltip": "Поміняйте частину {currency} з вашого депозиту на {networkCurrency} під час зняття коштів для оплати газу в майбутніх транзакціях.", + "incorrectAmount": "Некоректна сума. Будь ласка, введіть число.", + "amountIsHigh": "Сума занадто велика. Максимальне значення: {value}.", + "amountIsLow": "Сума занадто мала. Мінімальне значення: {value}.", + "tokensToReceive": "Токени що отримуються", + "relayer": "Relayer", + "relayerTooltip": "Використовуйте сервіс Relayer для відправки транзакції. Це більш анонімно, так як плата за газ віднімається з депозиту.", + "custom": "Свій Relayer", + "pasteYourRelayerUrlorEnsRecord": "Вставте URL Relayer або ENS запис", + "wallet": "Гаманець", + "walletTooltip": "Використовувати гаманець, наприклад, Metamask або TrustWallet, для зняття депозиту.", + "save": "Зберегти", + "reset": "Скинути", + "withdrawWalletWarning": "Переконайтеся, що {currency}, використаний для плати за газ, не пов'язаний ні з одним з ваших адресів. В іншому випадку, транзакції депозиту і виведення будуть пов'язані. Ми рекомендуємо використовувати Relayer для забезпечення анонімності.", + "withdrawalConfirmation": "Підтвердження зняття", + "confirm": "Відправити", + "yourZkSnarkProofHasBeenSuccesfullyGenerated": "Ваш zk-Snark доказ успішно згенеровано! Натисніть Надіслати щоб ініціювати виведення коштів", + "generatingProof": "Створення доказу", + "statistics": "Статистика", + "anonymitySet": "Кількість депозитів", + "anonymitySetTooltip": "Загальна кількість депозитів цієї суми в Tornado.Cash. Чим більше це кількість, тим краще (анонімніше)", + "latestDeposits": "Останні депозити", + "yourIP": "Ваш IP {ip}", + "filterBy": "Фільтр по", + "spent": "Витрачений", + "unspent": "Невитрачений", + "thereAreNoElements": "Немає елементів, які відповідають фільтрам.", + "txHash": "Хеш", + "status": "Стан", + "copyNote": "Копіювати", + "decryptCopyNote": "Дешифрувати і копіювати", + "v1Deposit": "v1 депозит", + "waitingForReceipt": "Очікування отримання", + "failed": "Невдача", + "withdrawn": "Знятий", + "deposited": "Внесений", + "removeFromCache": "Видалення зі сховища", + "pleaseMakeSureYouHaveBackedUpYourNote": "Будь ласка, переконайтеся, що Ви зробили резервну копію Note, якщо вона ще не була витрачена. Ви все ще хочете видалити цю транзакцію і Note зі сховища браузера?", + "remove": "Видалити", + "noteHasBeenDeleted": "Інформація про записці була видалена", + "accountHasBeenDeleted": "Інформація про акаунт була видалена", + "cancelButton": "Скасування", + "donationsAddress": "Адрес для донатів:", + "rate": "Курс", + "only": "", + "equalUserDeposit": "{only} {n} {equalUserDepositText}", + "equalUserDepositPlural": "Депозити відсутні | Один депозит | депозиту | депозитів", + "userDeposit": "депозити відсутні | тільки 1 депозит | {n} депозиту | {n} депозитів", + "gasPrice": "Ціна Газу", + "totalFee": "Підсумкова комісія", + "networkFee": "Комісія мережі", + "connectYourWalletFirst": "Підключіть свій гаманець", + "changeNetwork": "Змінити мережу", + "changeNetworkNote": "Ваша Note належить іншій мережі. Змініть мережу додатку на ту, в якій вона була створена.", + "changingNetwork": "Зміна мережі", + "relayerShouldSupportSSL": "Relayer повинен підтримувати SSL", + "relayerStatusOk": "Статус Relayer: OK", + "proposalIsActive": "Статус пропозиції повинен бути активним", + "canNotFetchStatusFromTheRelayer": "Неможливо отримати відповідь від Relayer", + "thisRelayerServesADifferentNetwork": "Цей Relayer обслуговує іншу мережу", + "compliance": "Відповідність", + "complianceTool": "Перевірка відповідності", + "complianceReport": "Звіт про відповідність", + "complianceSubtitle": "Конфіденційність фінансів є необхідною умовою збереження наших свобод. {Newline} Однак, вона не повинна досягатися за рахунок недотримання встановлених правил і стандартів. {Newline} З Tornado.cash ви завжди зможете отримати криптографічно достовірне підтвердження історії транзакцій. Для цього вам знадобиться лише адреса Ethereum, яку ви використовували для введення або виведення коштів. Підтвердження може бути необхідно для того, щоб обґрунтувати походження активів, що зберігаються на вашу адресу. {newline} Для створення звіту про відповідність, будь ласка, введіть ідентифікатор вашої Note Tornado.cash нижче. ", + "from": "Відправник", + "to": "Одержувач", + "withdrawal": "Вивід", + "noteHasNotBeenSpent": "Note не витрачена", + "thereIsNoRelatedDeposit": "Такого депозиту не існує. Note некоректна.", + "warning": "Попередження", + "doNotShareYouNote": "Note є приватною інформацією, володіння нею дозволяє здійснити зняття депозиту!", + "date": "Дата", + "transaction": "Транзакція", + "commitment": "Commitment", + "nullifierHash": "Nullifier Hash", + "verified": "Підтверджено", + "generatePdfReport": "Отримати PDF звіт", + "compliancePrintWarning": "Справжній звіт про відповідність носить виключно інформаційний характер. Ви повинні підтвердити дійсність цього звіту за допомогою засобу перевірки відповідності Tornado (https://app.tornado.cash/compliance) чи за допомогою будь-якого іншого криптографічного програмного забезпечення, яке може обробити і перевірити інформацію, що міститься в цьому звіті (\"Tornado Compliance Tool\"). Будь-які розбіжності між інформацією, наведеною в даному звіті та наданої вищевказаним інструментом, вказують на те, що інформація, що міститься в цьому звіті, є неточною і/або шахрайської. {newline} ЗВІТ ПРО ВІДПОВІДНІСТЬ НАДАЄТЬСЯ \"ЯК Є,\" БЕЗ ГАРАНТІЇ, ПРЯМИХ АБО НЕПРЯМИХ, У ТОМУ ЧИСЛІ, АЛЕ НЕ ОБМЕЖУЮЧИСЬ ГАРАНТІЯМИ ТОВАРНОЇ ЯКОСТІ, ПРИДАТНІ ДО КОНКРЕТНОЇ МЕТИ. НІ ЗА ЯКИХ ОБСТАВИН АВТОРИ ІНСТРУМЕНТУ ВІДПОВІДНОСТІ TORNADO.CASH НЕ БУДУТЬ НЕСТИ ВІДПОВІДАЛЬНІСТЬ ЗА БУДЬ-ЯКІ ПРЕТЕНЗІЇ, ЗБИТКИ АБО ІНШУ ВІДПОВІДАЛЬНІСТЬ, ЩО ВІДНОСИТЬСЯ ДО ДІЇ ДОГОВОРІВ, ЦИВІЛЬНИХ ПРАВОПОРУШЕНЬ, А ТАКОЖ ЩО ВИНИКАЄ ВНАСЛІДОК ДО ЦЬОГО ЗВІТУ ПРО ВІДПОВІДНІСТЬ АБО ПОВ'ЯЗАНИХ З НИМ. ", + "relayRequestFailed": "Relayer {relayerName} не відповідає. Спробуйте вибрати інший.", + "selectProvider": "Виберіть гаманець", + "walletDoesNotSupported": "Ваш гаманець не підтримується", + "fetchGasPriceFailed": "Помилка отримання вартості газу", + "networkIsNotSupported": "Мережа не підтримується", + "failToGenerateNote": "Помилка генерації Note", + "invalidRoot": "Invalid Root", + "failedToFetchAllDepositEvents": "Помилка отримання даних про депозити з контракту", + "unknownError": "Невідома помилка", + "unitInvalidValue": "[ethjs-unit] неприпустиме значення при перетворенні числа {value} в wei", + "tooManyDecimalPoints": "[ethjs-unit] занадто багато десяткових знаків при перетворенні числа {значення} в wei", + "tooManyDecimalPlaces": "[ethjs-unit] занадто багато знаків після коми при перетворенні числа {value} в wei", + "settings": "Налаштування", + "rpc": "Кінцева точка RPC", + "rpcStatusOk": "RPC статус: OK", + "rpcIsDown": "RPC не відповідає", + "thisRpcIsForDifferentNetwork": "Цей RPC призначений для іншої мережі", + "rpcSelectError": "Всі RPC за замовчуванням не відповідають. Можливо, це мережева помилка. Ви можете вибрати свій RPC в Настройках", + "rpcShouldSupportSSL": "RPC повинен підтримувати SSL", + "customRpcPlaceholder": "Вставте RPC URL", + "customRpc": "Свій RPC", + "enterRecoveryKey": "Введіть свій ключ відновлення", + "copy": "Копіювати", + "thereAreNoTransactions": "Транзакцій поки немає.", + "governance": "Голосування", + "delegatedBalance": "Делегований баланс", + "votingPower": "Право голосу", + "delegated": "делеговано", + "availableBalance": "Доступний баланс", + "manage": "Управління", + "proposals": "Пропозиції", + "all": "Всі", + "active": "Активні", + "expired": "Вийшов строк", + "pending": "В процесі", + "passed": "Прийнято", + "timeLocked": "Час блокування", + "createProposal": "Створити пропозицію", + "startDate": "Початок", + "endDate": "Закінчення", + "quorum": "Кворум", + "quorumTooltip": "Голосування за пропозицією триває {days} і приймається тільки в разі, коли більшість проголосувала За і наявності кворуму в {votes} голосів (сума голосів За + Проти повинна бути більше {votes}).", + "for": "За", + "against": "Проти", + "title": "Тема", + "description": "Опис", + "proposalAddress": "Адреса пропозиції", + "lock": "Заблокувати", + "unlock": "Розблокувати", + "proposalThresholdError": "Заблокований баланс повинен бути більше або дорівнює {PROPOSAL_THRESHOLD} TORN", + "castYourVote": "Проголосувати", + "back": "Назад", + "yourCurrentVote": "Ваш голос: {vote}", + "currentResults": "Поточні результати", + "information": "Інфо", + "amountToLock": "Сума для блокування", + "amountToUnlock": "Сума для розблокування", + "lockedBalance": "Заблокований баланс", + "lockedBalanceError": "Ваш заблокований баланс повинен бути більше 0", + "lockTabDesc": "Щоб брати участь в Управлінні, ви повинні заблокувати токени TORN. Ваше право голосу буде еквівалентно кількості заблокованих токенов.", + "unlockTabDesc": "Тут ви можете розблокувати раніше заблоковані TORN. Якщо пропозиція, в якому ви берете участь, ще не завершено, вам доведеться почекати поки це не відбудеться щоб розблокувати всі TORN.", + "delegateTabDesc": "Ви можете віддати своє право голосу делегату. Делегат зможе брати участь в Управлінні від вашого імені.", + "undelegateTabDesc": "Ви можете відкликати право голосу у свого делегата. Їх попередні пропозиції і голоси залишаться незмінними.", + "recipient": "Одержувач", + "address": "Адреса", + "delegate": "Віддати голос", + "undelegate": "Забрати голос", + "currentDelegate": "Поточний делегат", + "approve": "Дозволити", + "approved": "Дозволено", + "proposalTitle": "Тема пропозиції", + "proposalDescription": "Опис пропозиції", + "defeated": "Відхилено", + "accountSaving": "Створення аккаунта для нотаток", + "accountSaved": "Note аккаунт збережений в мережі", + "creatingProposal": "Створення пропозиції", + "proposalCreated": "Пропозиція успішно створено", + "depositing": "Внесення {value}", + "withdrawing": "Зняття {value}", + "claiming": "Отримання {value}", + "withdrawnValue": "Знято {value}", + "claimedValue": "Отримано {value}", + "depositedValue": "Внесено {value}", + "locking": "Блокування", + "votingFor": "Голосування за", + "votingAgainst": "Голосування проти", + "votedFor": "Успішно проголосували за", + "votedAgainst": "Успішно проголосували проти", + "unlocking": "Розблокування", + "unlocked": "Розблоковано", + "delegating": "Передача голосу", + "undelegating": "Повернення голосу", + "undelegated": "Голос повернутий", + "viewOnEtherscan": "Подивитися на Etherscan", + "awaitingExecution": "Очікування запуску", + "execute": "Запустити", + "executeProposal": "Запустити пропозицію", + "executingProposal": "Запуск пропозиції", + "locked": "заблоковано", + "lockedNotice": "Заблоковано", + "proposalExecuted": "Пропозицію успішно запущено", + "pleaseLockBalance": "Щоб віддати голос, спершу заблокуйте TORN", + "pleaseDelegate": "Делегата не призначено", + "internalError": "Внутрішня помилка. Оновіть сторінку та повторіть спробу", + "id": "ID", + "timerRemainingForPending": "Час до початку голосування", + "timerRemainingForVoting": "Час, що залишився для голосування", + "timerRemainingForAwaitingExecution": "Час, що залишився перед запуском", + "timerRemainingForExecution": "Залишилося часу до запуску", + "accepted": "Прийнято", + "sent": "Відправлено", + "mined": "Здобуто", + "confirmed": "Підтверджено", + "pleaseLockTornFirst": "Щоб продовжити, спершу заблокуйте токени TORN", + "tokensLockedUntil": "Ваш баланс заблокований до {date}", + "onlyOneProposalErr": "Тільки одна активна пропозиція на користувача. Зачекайте, поки ваша поточна пропозиція не буде завершеною.", + "max": "Макс", + "withDisconnectedWallet": "Будь ласка, змініть гаманець або метод виведення", + "relayerError": "Обраний Relayer не може відправити транзакцію. Спробуйте ще раз або обери інший Relayer в Налаштуваннях.", + "relayerIsNotResponding": "Relayer не відповідає. Спробуйте ще раз або оберить інший Relayer в Налаштуваннях.", + "transactionFailed": "Транзакція не виконана", + "none": "немає", + "queued": "У черзі", + "proposal": { + "error": { + "address": "Значення має бути адресою.", + "contract": "Адреса повинна вказувати на контракт.", + "title": "Заголок обов'язковий", + "description": "Опис обов'язковий" + } + }, + "executed": "Прийнято", + "proposalDoesNotExist": "Ця пропозиція не існує. Повертайтеся назад до списку.", + "errorPage": { + "title": "Упс!", + "description": "Сторінку не знайдено.", + "button": "Запустити" + }, + "rejectedRequest": "Ви відхилили запит {description}", + "updateCacheEvents": "Оновлення кешированих подій", + "notEnoughTokens": "Підсумкова комісія перевищує кількість одержуваних токенов. Це може бути пов'язано з високою комісією Relayer або тимчасової перевантаженням мережі.", + "gasPriceSlider": { + "low": "Повільно", + "standard": "Стандарт", + "fast": "Швидко" + }, + "decrypt": "Дешифрувати", + "account": { + "title": "Note аккаунт", + "description": "Note аккаунт можна зберігати зашифровані резервні копії приватних Note в мережі. Це робить простим безпечне зберігання коштів завдяки безпеки блокчейна Ethereum, що зберігає кожну Note.", + "button": "Аккаунт", + "account": "Note аккаунт", + "backedUpWith": "Адреса прив'язки", + "modals": { + "recoverAccount": { + "title": "Підключення за допомогою ключа", + "description": "Введіть ключ, щоб імпортувати раніше створений Note аккаунт.", + "warning": "Неправильний ключ.", + "connect": "Підключитися" + }, + "setupAccount": { + "title": "Створення аккаунта для Note", + "label": "Ключ Акаунта для Note", + "description": "Цей ключ використовується для шифрування і зберігання ваших приватних Note Tornado.cash в блокчейне ethereum. Будь ласка, зробіть резервну копію ключа і ніколи ні з ким їм не діліться.", + "setupAccount": "Створити обліковий запис", + "setAccount": "Завершити", + "backedUp": "Я зробив резервну копію ключа", + "saveOnChain": "Створити додаткову мережну резервну копію ключа за допомогою гаманця", + "isNotSupportedWithHw": "Майте на увазі, що додаткове мережеве резервне копіювання вашого ключа не підтримується апаратними (холодними) гаманцями або мобільними гаманцями", + "successfulNotice": "Вітаємо! Ви успішно створили обліковий запис для нотаток. Тепер ви можете шифрувати ваші Note і зберігати їх в мережі.", + "yourRecoveryKeyWontBeSaved": "Ваш ключ відновлення не буде збережений в сховище браузера. Переконайтеся, що ви зробили резервну копію ключа." + }, + "showRecoveryKey": { + "title": "Поточний ключ", + "description": "", + "close": "Закрити" + }, + "checkRecoveryKey": { + "title": "Оновлення сеансу", + "description": "Сеанс аккаунта для Note був неактивний протягом 5 хвилин. Чи бажаєте ви продовжити?", + "inactiveDescription": "Ви довгий час не діяли. Сеанс вашого облікового запису було припинено з міркувань безпеки.", + "no": "Ні", + "yes": "Так" + }, + "decryptInfo": { + "title": "Ваші Note", + "description": "Всі Note успішно завантажені і дешифровані за допомогою ключа", + "all": "Завантажено подій:", + "warning": "Note з попередженням:", + "close": "Закрити", + "unSpent": "Невитрачених Note знайдено:", + "spent": "Витрачених Note знайдено:", + "redirect": "На головну" + }, + "removeAccount": { + "title": "Очистити інформацію про акаунт", + "description": "Видалення даних про акаунт з поточної сесії браузера", + "cancel": "Скасування", + "remove": "Видалити" + } + }, + "wallet": { + "label": "Підключений Web3 гаманець", + "desc": "Підключення web3 гаманця", + "disconnect": "Відключення від гаманця", + "rpcDesc": "Зміна Ethereum RPC провайдера", + "connectWeb3": "Підключити Web3", + "logout": "Вихід", + "changeRpc": "Змінити RPC" + }, + "setup": { + "decrypt": "Будь ласка, підтвердіть запит дешифрування в web3 гаманці.", + "setTooltip": "З цим web3 гаманцем уже пов'язаний аккаунт. Натисніть на кнопку 'Відновити' нижче.", + "recTooltip": "Ви повинні створити обліковий запис, оскільки ця адреса не пов'язаний з іншими акаунтами.", + "desc": "Створення аккаунта для зберігання зашифрованих Note в блокчейні Ethereum", + "account": "Створити", + "recoverDesc": "Відновлення облікового запису, пов'язаного з цим гаманцем", + "recover": "Відновити", + "enterRawDesc": "Вхід за допомогою ключа", + "enterRaw": "Ввести ключ аккаунта", + "accSetupDescription": "Цей ключ використовується для шифрування і зберігання ваших Tornado.cash Note на блокчейні ethereum. Будь ласка, зробіть резервну копію ключа і ніколи ні з ким нею не діліться." + }, + "control": { + "balance": "Баланс аккаунта: {value}", + "loadAllDesc": "Завантаження і дешифрування всіх ваших приватних Note за допомогою поточного ключа", + "loadAll": "Завантажити всі Note", + "showRecoveryKeyDesc": "Дізнатися поточний ключ", + "showRecoveryKey": "Показати", + "removeDesc": "Видалення інформації про обліковий запис в поточному сеансі браузера", + "remove": "Видалити", + "fileDesc": "Завантаження необроблених приватних поміток за замовчуванням при внесенні депозиту" + }, + "notification": { + "text": "В Tornado.cash тепер є мережеве резервне копіювання. Створіть ваш {note} зараз або дізнатися {medium}.", + "link": { + "note": "Note аккаунт", + "medium": "більше інформації" + } + } + }, + "saveNote": "Зберегти Note", + "pleaseSetUpAccount": "Для дешифрування Note необхідно створити обліковий запис", + "decryptNote": "Підтвердіть дешифрування Note", + "decryptFailed": "Дешифрування не вдалося. Будь ласка, спробуйте змінити акаунт", + "recoverFromKeyTitle": "Поточний ключ аккаунта для нотаток", + "trezorNotSupported": "В даний момент гаманець Trezor не підтримується", + "ledgerNotSupported": "В даний момент гаманець Ledger не підтримується", + "startDecryptingNotes": "В процесі дешифрування Note", + "decryptingNotes": "Дешифровка Note", + "getAndValidateEvents": "Отримання і перевірка {name} подій", + "notConnected": "Не підключений", + "regular": "Звичайний", + "encrypted": "Зашифрований", + "notDecryptedWithBackup": "Ця Note зашифрована обліковим записом {address}, яка прив'язана до {backup} metamask аккаунту. Будь ласка, перейдіть для дешифрування.", + "notDecrypted": "Ця Note зашифрована обліковим записом {address}. Будь ласка, перейдіть на неї.", + "noteAccountKey": "Дешифровка не вдалася. Підключіться до metamask аккаунту {address} для дешифрування ключа аккаунта для Note {noteAddress}.", + "yourEncrypted": "Ця Note буде зашифрована аккаунтом {address}.", + "lockTooltip": "Ця Note зберігається в мережі в зашифрованому вигляді. Її можна відновити за допомогою облікового запису для Note {address}.", + "connected": "Підключений", + "accountConnected": "Підключений аккаунт", + "web3connected": "Web3 підключений", + "haveAccountSetupWithWallet": "Схоже, ви вже створювали аккаунт за допомогою поточного web3 гаманця. Будь ласка, використовуйте кнопку 'Відновити'", + "connectAccount": "Підключити Note аккаунт ", + "fetchFile": "Не вдається отримати підтверджують ключі, перевірте підключення до Інтернету або спробуйте використовувати VPN.", + "mobileWallet": { + "loading": { + "alert": "Якщо ви не отримали повідомлення в своєму гаманці, будь ласка, повторно підключіть свій гаманець", + "action": "Перепідключити" + }, + "actions": { + "disabled": "Мобільні гаманці не підтримують цю функцію в даний момент." + } + }, + "dayPlural": "0 днів | {n} день | {n} дні | {n} днів" +} diff --git a/langs/zh.json b/langs/zh.json new file mode 100644 index 0000000..48448da --- /dev/null +++ b/langs/zh.json @@ -0,0 +1,287 @@ +{ + "closeNotification": "关闭通知", + "indexNotification": "Tornado.cash {link}。 但它仍处在实验阶段,请注意并自行承担使用风险。", + "indexNotificationLinkText": "已通过安全审计", + "binanceInternalTxsNotification": "请不要使用Binance钱包地址进行提款。Binance交易所目前不支持内部交易(包括Tornado.cash提款)。如果您有资金未收到的问题,您应该联系Binance支持。", + "deposit": "存款", + "depositButton": "存款", + "withdraw": "提款", + "withdrawButton": "提款", + "waitUntilTransactionIsMined": "等待该交易被网络确认", + "enterYourDepositsNote": "输入你的存款凭证", + "yourWallet": "你的钱包", + "pleaseSelectYourWeb3Wallet": "请选择你的 Web3 钱包:", + "otherWallet": "其它钱包", + "currentNetworkIsNotSupported": "暂不支持这个网络", + "docs": "文档", + "getFreeGETH": "获取免费的 gETH", + "logout": "退出", + "connect": "连接", + "token": "代币", + "amount": "数额", + "amountTooltip": "每个数额都具有单独的匿名设置。查看「统计数据」选项卡获取更多信息。", + "approvalIsRequired": "需要授权", + "inOrderToUse": "为了能使用 {currency},你必须进行授权。选择你希望授权的数额:", + "unlimited": "无限", + "unlimitedTooltip": "如果你希望进行多次操作,无限授权会更加方便。", + "enable": "授权", + "transactionWasSuccessfullySent": "交易已成功发送。", + "insufficientBalance": "余额不足", + "youDontHaveEnoughTokens": "没有足够的 {currency} 代币。 目前余额为 {balance} {currency}", + "close": "关闭", + "yourNote": "你的凭证", + "pleaseBackupYourNote": "请备份凭证,这很重要!如果你丢失了该凭证,你将无法找回存款!", + "treatYourNote": "将您的笔记当作私钥-切勿与任何人共享,包括 Tornado.cash 开发人员。", + "saveAsFile": "浏览器将要求将您的笔记另存为文件:", + "iBackedUpTheNote": "我已备份了凭证", + "yourNoteWontBeSaved": "你的存款凭证不会被存储在浏览器的缓存中,请确认已作好备份。", + "sendDeposit": "发送存款", + "clickToCopy": "点击复制", + "copied": "已复制!", + "preparingTransactionData": "正在准备交易数据", + "viewInExplorer": "在浏览器中查看", + "loading": "加载中", + "pleaseConfirmTransactionInWallet": "请在 {wallet} 中确认交易", + "waitingForTransactionConfirmation": "正在等待交易确认", + "relayerIsNowSendingYourTransaction": "中继者现在正在发送你的交易,操作应很快完成", + "note": "凭证", + "noteTooltip": "请输入你在存款时所获得的凭证", + "depositTransactionOnEtherscan": "在 Etherscan 查看存款交易", + "withdrawalSettings": "提款设置", + "pleaseEnterYourNote": "请输入存款凭证", + "turnOnWasm": "错误:Error: 请在浏览器设置中打开 WebAssembly。
如果你使用 Tor 浏览器,请启用 about:config 中的 javascript.options.wasm", + "timePassed": "时间", + "timePassedTooltip": "即便在你之后又多笔存款,它们也可能是由同一个用户存入的。因此,我们建议在提款之前至少等待24小时,以确保在此期间有多个用户使用了 Tornado。", + "subsequentDeposits": "后续存款", + "subsequentDepositsTooltip": "最有可能的提款来源是最近的存款,因此我们建议间隔至少 5 笔交易再进行提款操作能够保证更好的匿名性。", + "recipientAddress": "收款地址", + "donate": "捐赠", + "pleasePasteAddressHere": "请在这里粘贴地址", + "noteIsInvalid": "凭证无效", + "noteHasBeenSpent": "该凭证已使用", + "gettingTheNoteData": "正在获取凭证数据", + "noteWasAlreadySpent": "该凭证已使用", + "error": "错误", + "downloadError": "下载错误\n", + "validationError": "验证错误", + "recipientAddressIsInvalid": "收款地址不可用", + "total": "总计", + "noteBalance": "凭证余额", + "relayerFee": "中继者费用", + "ethPurchase": "{currency} 购买", + "ethPurchaseTooltip": "在提款的过程中将部分存款 {currency} 兑换成 {networkCurrency},以便在以后的交易中用于支付矿工费。", + "tokensToReceive": "接收代币", + "relayer": "中继者", + "relayerTooltip": "使用中继者服务来发送你的交易。由于矿工费是从存款中扣除的,所以匿名性更好。", + "custom": "自定义", + "pasteYourRelayerUrlorEnsRecord": "粘贴你的中继者的 URL 或者 ENS 记录", + "wallet": "钱包", + "walletTooltip": "使用你自己的账户发起提款(例如:imToken)", + "save": "保存", + "reset": "重启", + "withdrawWalletWarning": "请确保用于支付矿工费的 {currency} 不能链接到你的任何地址。否则提款的匿名性将受到影响。因此我们推荐使用中继者。", + "withdrawalConfirmation": "提款确认", + "confirm": "确认", + "yourZkSnarkProofHasBeenSuccesfullyGenerated": "你的零知识证明已经被成功生成!请点击确认发起提款操作。", + "generatingProof": "生成证明", + "statistics": "统计数据", + "anonymitySet": "合约内存款总数", + "anonymitySetTooltip": "你的提款可能来自的存款数目", + "latestDeposits": "最近存款", + "yourIP": "你的 IP 地址 {ip}", + "filterBy": "过滤至", + "spent": "已使用", + "unspent": "未使用", + "thereAreNoElements": "没有满足过滤的条件。", + "txHash": "交易 Hash", + "status": "状态", + "copyNote": "复制凭证", + "v1Deposit": "v1 存款", + "waitingForReceipt": "等待收款中", + "failed": "失败", + "withdrawn": "已提款", + "deposited": "已存款", + "removeFromCache": "从浏览器中删除", + "pleaseMakeSureYouHaveBackedUpYourNote": "如果你的凭证还没有被使用,请确认已经做好了备份。你是否确实希望从浏览器中删除这个凭证?", + "remove": "删除", + "noteHasBeenDeleted": "凭证已经被删除", + "cancelButton": "取消", + "donationsAddress": "捐赠地址:", + "rate": "Pool Rate", + "only": "只有", + "equalUserDeposit": "{only} {n} {equalUserDepositText}", + "equalUserDepositPlural": "无存款 | 一笔存款 | 笔用户存款", + "userDeposit": "无存款 | 只有 1 笔存款 | {n} 笔存款", + "gasPrice": "Gas 价格", + "totalFee": "总费用", + "networkFee": "网络费", + "connectYourWalletFirst": "首先连接你的钱包", + "relayerShouldSupportSSL": "中继者应该支持 SSL", + "relayerStatusOk": "中继者状态: OK", + "proposalIsActive": "Proposal status must be active", + "canNotFetchStatusFromTheRelayer": "连接中继者失败", + "thisRelayerServesADifferentNetwork": "此中继者不为您现在所处的网络提供服务", + "compliance": "来源证明", + "complianceTool": "来源证明工具", + "complianceReport": "来源证明报告", + "complianceSubtitle": "维护财务隐私对于保全我们的自由至关重要。{newline}。 借助Tornado.cash,您可以随时查看您的资金来源。为了显示您提款地址中持有资产的来源,这可能是必要的。{newline} 要生成来源证明报告,请您在下面输入 Tornado.cash 凭证。", + "from": "从", + "to": "到", + "withdrawal": "提款", + "noteHasNotBeenSpent": "该凭证还未被使用", + "thereIsNoRelatedDeposit": "无效凭证", + "warning": "警告", + "doNotShareYouNote": "不要与任何人分享您的凭证,它可以被用于提取您的资金", + "date": "日期", + "transaction": "交易", + "commitment": "义务", + "nullifierHash": "无效符", + "verified": "已验证", + "generatePdfReport": "生成 PDF 报告", + "compliancePrintWarning": "这本来源证明报告仅供参考的。 你应该使用Tornado的来源证明工具来确认报告 (https://tornadocash.eth.link/compliance) 的有效性,或者与可以算出和验证此处包含信息的任何其他密码学软件 (\"Tornado来源证明工具\") 一起使用。 报告中发现的信息与上述工具提供的信息之间存在任何差异,表明报告中的信息是不正确的{newline} 来源证明报告按 \"原样,\" 提供,不提供任何明示或暗示担保,包括但不限于对适销性,用途的适用性和非侵权专利的担保。 无论是出于合同要求、侵权或其他原因,由本来源证明报告引起与相关的任何索赔,损害或其他责任,Tornado.cash的作者概不负责。", + "relayRequestFailed": "中继者 {relayerName} 无法使用,请选择其他中继者。", + "selectProvider": "请选择钱包", + "walletDoesNotSupported": "此钱包不受支持", + "fetchGasPriceFailed": "无法获取 Gas 价格", + "networkIsNotSupported": "此网络不受支持", + "failToGenerateNote": "无法生成凭证", + "invalidRoot": "合约树异常", + "failedToFetchAllDepositEvents": "无法从合约中取得所有存款事件", + "unknownError": "未知错误", + "unitInvalidValue": "[ethjs-unit] 将数字 {value} 转换为 wei 时,出现无效值", + "tooManyDecimalPoints": "[ethjs-unit] 将数字 {value} 转换为 wei 时, 小数点过多", + "tooManyDecimalPlaces": "[ethjs-unit] 将数字 {value} 转换为 wei 时, 小数位数过多", + "settings": "设置", + "rpc": "节点地址", + "rpcStatusOk": "节点状态: OK", + "rpcIsDown": "无法连接此节点", + "thisRpcIsForDifferentNetwork": "此节点与您当前所处网络不符", + "rpcSelectError": "所有内置节点均无法连接,可能您的网络存在问题", + "rpcShouldSupportSSL": "节点应支持 SSL", + "customRpcPlaceholder": "粘贴您的节点地址", + "customRpc": "自定义", + "enterRecoveryKey": "请输入您的恢复密钥", + "copy": "复制", + "thereAreNoTransactions": "暂无交易", + "governance": "治理", + "delegatedBalance": "已被代理的余额", + "votingPower": "投票权", + "delegated": "已被代理", + "availableBalance": "可用余额", + "manage": "管理", + "proposals": "提案", + "all": "所有", + "active": "正在进行", + "expired": "已过期", + "pending": "正在等待", + "passed": "已通过", + "timeLocked": "锁入时间", + "createProposal": "创建提案", + "startDate": "开始时间", + "endDate": "结束时间", + "for": "赞成", + "against": "反对", + "title": "标题", + "description": "说明", + "proposalAddress": "提案地址", + "lock": "锁入", + "unlock": "解锁", + "proposalThresholdError": "锁入余额应大于等于 {PROPOSAL_THRESHOLD} TORN", + "castYourVote": "投票", + "currentResults": "当前结果", + "information": "信息", + "amountToLock": "要锁入的余额", + "amountToUnlock": "要解锁的余额", + "lockedBalance": "已锁入余额", + "lockedBalanceError": "已锁入余额必须大于 0", + "lockTabDesc": "要参加治理,您必须先锁入您的 TORN 代币。锁入的代币越多,您的投票权越大", + "unlockTabDesc": "您可以随时解锁您并取出的 TORN。如果您参加的提案尚未结束,您需要等到提案结束才能解锁所有代币。", + "delegateTabDesc": "将您的投票权委托给代表,代表将代理您参加治理。", + "undelegateTabDesc": "收回您交给代表的投票权", + "recipient": "接收者", + "address": "地址", + "delegate": "代理", + "undelegate": "取消代理", + "currentDelegate": "当前代理", + "approve": "批准", + "approved": "被认可", + "proposalTitle": "提案标题", + "proposalDescription": "提案说明", + "defeated": "伤残", + "accountSaving": "正在设立账户", + "accountSaved": "已在链上备份", + "creatingProposal": "创建提案", + "proposalCreated": "成功创建提案", + "depositing": "正在存入 {value}", + "withdrawing": "正在提取 {value}", + "claiming": "正在提取 {value}", + "withdrawnValue": "已提取 {value}", + "claimedValue": "已提取 {value}", + "depositedValue": "已存入 {value}", + "locking": "正在锁入", + "votingFor": "赞成", + "votingAgainst": "反对", + "votedFor": "赞成票", + "votedAgainst": "反对票", + "unlocking": "正在解锁", + "unlocked": "已解锁", + "delegating": "正在委托", + "undelegating": "正在取消委托", + "undelegated": "已取消委托", + "viewOnEtherscan": "在 Etherscan 上查看", + "awaitingExecution": "等待执行", + "execute": "执行", + "executingProposal": "提案正在执行", + "locked": "已锁入", + "lockedNotice": "已锁入", + "proposalExecuted": "提案已成功执行", + "pleaseLockBalance": "请先锁入余额以委托您的投票权", + "pleaseDelegate": "您还没有委托", + "internalError": "服务器错误。请刷新重试", + "id": "ID", + "timerRemainingForPending": "剩余等待时间", + "timerRemainingForVoting": "剩余投票时间", + "timerRemainingForAwaitingExecution": "剩余等待执行时间", + "timerRemainingForExecution": "剩余执行时间", + "accepted": "已通过", + "sent": "已发送", + "mined": "已开采", + "confirmed": "已确认", + "pleaseLockTornFirst": "请先存入 TORN 代币", + "tokensLockedUntil": "您的余额将被锁定直至 {date}", + "onlyOneProposalErr": "每个地址一次只能提出一个提案", + "max": "最大", + "withDisconnectedWallet": "请连接钱包或更改提款类型", + "relayerError": "此中继者无法处理您的请求,请重试或在设置中更换一个中继者", + "relayerIsNotResponding": "此中继者无法处理您的请求,请重试或在设置中更换一个中继者", + "transactionFailed": "交易失败", + "none": "无", + "queued": "正在排队", + "proposal": { + "error": { + "address": "输入必须为一个地址", + "contract": "该地址必须为一个合约地址", + "title": "标题为必填项", + "description": "说明为必填项" + } + }, + "executed": "已执行", + "proposalDoesNotExist": "此提案不存在,请返回首页", + "errorPage": { + "title": "Oooops!", + "description": "此也未找到", + "button": "启动应用" + }, + "rejectedRequest": "您拒绝了请求", + "fetchFile": "无法获取验证密钥,请检查互联网连接或尝试使用 VPN。", + "mobileWallet": { + "loading": { + "alert": "如果您的钱包没有收到通知,请重新连接您的钱包", + "action": "重新连接" + }, + "actions": { + "disabled": "手机钱包不支持此功能" + } + }, + "dayPlural": "0天 | {n}天 | {n}天" +} diff --git a/layouts/README.md b/layouts/README.md new file mode 100644 index 0000000..cad1ad5 --- /dev/null +++ b/layouts/README.md @@ -0,0 +1,7 @@ +# LAYOUTS + +**This directory is not required, you can delete it if you don't want to use it.** + +This directory contains your Application Layouts. + +More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/views#layouts). diff --git a/layouts/default.vue b/layouts/default.vue new file mode 100644 index 0000000..bce19b5 --- /dev/null +++ b/layouts/default.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/layouts/error.vue b/layouts/error.vue new file mode 100644 index 0000000..ad9bf33 --- /dev/null +++ b/layouts/error.vue @@ -0,0 +1,37 @@ + + diff --git a/layouts/geofence.vue b/layouts/geofence.vue new file mode 100644 index 0000000..ea5ad9d --- /dev/null +++ b/layouts/geofence.vue @@ -0,0 +1,32 @@ + + + diff --git a/lib/Permit.js b/lib/Permit.js new file mode 100644 index 0000000..ce5d3b1 --- /dev/null +++ b/lib/Permit.js @@ -0,0 +1,43 @@ +const { EIP712Signer } = require('@ticket721/e712') + +const Permit = [ + { name: 'owner', type: 'address' }, + { name: 'spender', type: 'address' }, + { name: 'value', type: 'uint256' }, + { name: 'nonce', type: 'uint256' }, + { name: 'deadline', type: 'uint256' } +] + +class PermitSigner extends EIP712Signer { + constructor(_domain, _permitArgs) { + super(_domain, ['Permit', Permit]) + this.permitArgs = _permitArgs + } + + // Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline) + setPermitInfo(_permitArgs) { + this.permitArgs = _permitArgs + } + + getPayload() { + return this.generatePayload(this.permitArgs, 'Permit') + } + + async getSignature(privateKey) { + const payload = this.getPayload() + const { hex, v, r, s } = await this.sign(privateKey, payload) + return { + hex, + v, + r: '0x' + r, + s: '0x' + s + } + } + + getSignerAddress(permitArgs, signature) { + const originalPayload = this.generatePayload(permitArgs, 'Permit') + return this.verify(originalPayload, signature) + } +} + +module.exports = { PermitSigner } diff --git a/middleware/README.md b/middleware/README.md new file mode 100644 index 0000000..01595de --- /dev/null +++ b/middleware/README.md @@ -0,0 +1,8 @@ +# MIDDLEWARE + +**This directory is not required, you can delete it if you don't want to use it.** + +This directory contains your application middleware. +Middleware let you define custom functions that can be run before rendering either a page or a group of pages. + +More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing#middleware). diff --git a/middleware/provider.js b/middleware/provider.js new file mode 100644 index 0000000..e73a573 --- /dev/null +++ b/middleware/provider.js @@ -0,0 +1,48 @@ +import networkConfig from '@/networkConfig' +const { hexToNumber } = require('web3-utils') + +const checkProvider = async ({ store, accounts, chainId, providerName }) => { + if (accounts.length === 0) { + // MetaMask is locked or the user has not connected any accounts + return + } + + if (!networkConfig[`netId${chainId}`]) { + await store.dispatch('metamask/checkMismatchNetwork', chainId) + return + } + + await store.dispatch('metamask/initialize', { providerName }) +} + +const providerMiddleware = async ({ store }) => { + try { + const providerName = window.localStorage.getItem('provider') + + if (providerName === 'walletConnect') { + let providerData = window.localStorage.getItem('walletconnect') + if (!providerData) { + return + } + + const { accounts, chainId } = ({ providerData } = JSON.parse(providerData)) + + await checkProvider({ store, accounts, chainId, providerName }) + return + } + + if (providerName) { + const provider = await store.getters['metamask/getEthereumProvider']() + + const accounts = await provider.request({ method: 'eth_accounts' }) + + const chainId = hexToNumber(await provider.request({ method: 'eth_chainId' })) + + await checkProvider({ store, accounts, chainId, providerName }) + } + } catch (err) { + console.error(`Provider container has error: ${err.message}`) + } +} + +export default providerMiddleware diff --git a/modules/account/Page.vue b/modules/account/Page.vue new file mode 100644 index 0000000..79af837 --- /dev/null +++ b/modules/account/Page.vue @@ -0,0 +1,17 @@ + + + diff --git a/modules/account/components/Control/Actions.vue b/modules/account/components/Control/Actions.vue new file mode 100644 index 0000000..0a2d976 --- /dev/null +++ b/modules/account/components/Control/Actions.vue @@ -0,0 +1,94 @@ + + + diff --git a/modules/account/components/Control/Control.vue b/modules/account/components/Control/Control.vue new file mode 100644 index 0000000..2e31fa0 --- /dev/null +++ b/modules/account/components/Control/Control.vue @@ -0,0 +1,23 @@ + + + diff --git a/modules/account/components/Control/Header.vue b/modules/account/components/Control/Header.vue new file mode 100644 index 0000000..efdb544 --- /dev/null +++ b/modules/account/components/Control/Header.vue @@ -0,0 +1,27 @@ + + + diff --git a/modules/account/components/Control/Statistic.vue b/modules/account/components/Control/Statistic.vue new file mode 100644 index 0000000..1d39b03 --- /dev/null +++ b/modules/account/components/Control/Statistic.vue @@ -0,0 +1,48 @@ + + + diff --git a/modules/account/components/Control/index.js b/modules/account/components/Control/index.js new file mode 100644 index 0000000..a9b9178 --- /dev/null +++ b/modules/account/components/Control/index.js @@ -0,0 +1 @@ +export { default as Control } from './Control' diff --git a/modules/account/components/Indicator/Indicator.vue b/modules/account/components/Indicator/Indicator.vue new file mode 100644 index 0000000..d01c1e0 --- /dev/null +++ b/modules/account/components/Indicator/Indicator.vue @@ -0,0 +1,52 @@ + + + diff --git a/modules/account/components/Indicator/index.js b/modules/account/components/Indicator/index.js new file mode 100644 index 0000000..082b275 --- /dev/null +++ b/modules/account/components/Indicator/index.js @@ -0,0 +1 @@ +export { default as Indicator } from './Indicator' diff --git a/modules/account/components/NoteAccount/NoteAccount.vue b/modules/account/components/NoteAccount/NoteAccount.vue new file mode 100644 index 0000000..0746b9f --- /dev/null +++ b/modules/account/components/NoteAccount/NoteAccount.vue @@ -0,0 +1,67 @@ + + + diff --git a/modules/account/components/NoteAccount/index.js b/modules/account/components/NoteAccount/index.js new file mode 100644 index 0000000..56e80c6 --- /dev/null +++ b/modules/account/components/NoteAccount/index.js @@ -0,0 +1 @@ +export { default as NoteAccount } from './NoteAccount' diff --git a/modules/account/components/Settings/Actions.vue b/modules/account/components/Settings/Actions.vue new file mode 100644 index 0000000..dc5584b --- /dev/null +++ b/modules/account/components/Settings/Actions.vue @@ -0,0 +1,46 @@ + + + diff --git a/modules/account/components/Settings/Header.vue b/modules/account/components/Settings/Header.vue new file mode 100644 index 0000000..fa6ad17 --- /dev/null +++ b/modules/account/components/Settings/Header.vue @@ -0,0 +1,18 @@ + + + diff --git a/modules/account/components/Settings/Settings.vue b/modules/account/components/Settings/Settings.vue new file mode 100644 index 0000000..3134dde --- /dev/null +++ b/modules/account/components/Settings/Settings.vue @@ -0,0 +1,23 @@ + + + diff --git a/modules/account/components/Settings/index.js b/modules/account/components/Settings/index.js new file mode 100644 index 0000000..3f46024 --- /dev/null +++ b/modules/account/components/Settings/index.js @@ -0,0 +1 @@ +export { default as Settings } from './Settings' diff --git a/modules/account/components/Setup/Actions.vue b/modules/account/components/Setup/Actions.vue new file mode 100644 index 0000000..cb4fc85 --- /dev/null +++ b/modules/account/components/Setup/Actions.vue @@ -0,0 +1,94 @@ + + + diff --git a/modules/account/components/Setup/Header.vue b/modules/account/components/Setup/Header.vue new file mode 100644 index 0000000..749549e --- /dev/null +++ b/modules/account/components/Setup/Header.vue @@ -0,0 +1,24 @@ + + + diff --git a/modules/account/components/Setup/Setup.vue b/modules/account/components/Setup/Setup.vue new file mode 100644 index 0000000..7da7cef --- /dev/null +++ b/modules/account/components/Setup/Setup.vue @@ -0,0 +1,18 @@ + + + diff --git a/modules/account/components/Setup/index.js b/modules/account/components/Setup/index.js new file mode 100644 index 0000000..bb06ada --- /dev/null +++ b/modules/account/components/Setup/index.js @@ -0,0 +1 @@ +export { default as Setup } from './Setup' diff --git a/modules/account/components/index.js b/modules/account/components/index.js new file mode 100644 index 0000000..a283745 --- /dev/null +++ b/modules/account/components/index.js @@ -0,0 +1,5 @@ +export { Setup } from './Setup' +export { Control } from './Control' +export { Settings } from './Settings' +export { Indicator } from './Indicator' +export { NoteAccount } from './NoteAccount' diff --git a/modules/account/dependencies/index.js b/modules/account/dependencies/index.js new file mode 100644 index 0000000..8c7782e --- /dev/null +++ b/modules/account/dependencies/index.js @@ -0,0 +1,4 @@ +import Settings from '@/components/Settings' +import NumberFormat from '@/components/NumberFormat' + +export { Settings, NumberFormat } diff --git a/modules/account/index.js b/modules/account/index.js new file mode 100644 index 0000000..03ebbba --- /dev/null +++ b/modules/account/index.js @@ -0,0 +1,2 @@ +export * from './shared' +export { default as AccountPage } from './Page' diff --git a/modules/account/injectors/index.js b/modules/account/injectors/index.js new file mode 100644 index 0000000..5abba7a --- /dev/null +++ b/modules/account/injectors/index.js @@ -0,0 +1,10 @@ +// components +export * from './noteInjectors' +export * from './setupInjectors' +export * from './walletInjectors' +export * from './сontrolInjectors' +export * from './indicatorInjectors' +// modals +export * from './setupAccountInjectors' +export * from './recoverAccountInjectors' +export * from './showRecoveryKeyInjectors' diff --git a/modules/account/injectors/indicatorInjectors.js b/modules/account/injectors/indicatorInjectors.js new file mode 100644 index 0000000..5d9e2bc --- /dev/null +++ b/modules/account/injectors/indicatorInjectors.js @@ -0,0 +1,10 @@ +import { mapGetters, mapActions } from 'vuex' + +export const indicatorMethods = { + ...mapActions('encryptedNote', ['highlightNoteAccount', 'redirectToAccount']) +} + +export const indicatorComputed = { + ...mapGetters('metamask', ['currency']), + ...mapGetters('encryptedNote', ['accounts', 'isSetupAccount', 'noteAccountBalance']) +} diff --git a/modules/account/injectors/noteInjectors.js b/modules/account/injectors/noteInjectors.js new file mode 100644 index 0000000..3e6a50e --- /dev/null +++ b/modules/account/injectors/noteInjectors.js @@ -0,0 +1,11 @@ +import { mapActions, mapGetters, mapState } from 'vuex' + +export const noteMethods = { + ...mapActions('encryptedNote', ['checkExistAccount', 'highlightNoteAccount']) +} + +export const noteComputed = { + ...mapGetters('encryptedNote', ['isSetupAccount']), + ...mapState('metamask', ['isInitialized', 'netId']), + ...mapGetters('encryptedNote', ['isHighlightedNoteAccount']) +} diff --git a/modules/account/injectors/recoverAccountInjectors.js b/modules/account/injectors/recoverAccountInjectors.js new file mode 100644 index 0000000..b1c4c4b --- /dev/null +++ b/modules/account/injectors/recoverAccountInjectors.js @@ -0,0 +1,7 @@ +import { mapActions, mapGetters } from 'vuex' + +export const recoverAccountMethods = mapActions('encryptedNote', ['clearState', 'recoverAccountFromKey']) + +export const recoverAccountComputed = { + ...mapGetters('encryptedNote', ['recoverAccountFromKeyRequest']) +} diff --git a/modules/account/injectors/setupAccountInjectors.js b/modules/account/injectors/setupAccountInjectors.js new file mode 100644 index 0000000..b5a1d96 --- /dev/null +++ b/modules/account/injectors/setupAccountInjectors.js @@ -0,0 +1,10 @@ +import { mapActions, mapGetters } from 'vuex' + +export const setupAccountMethods = { + ...mapActions('notice', ['addNoticeWithInterval']), + ...mapActions('encryptedNote', ['clearState', 'setupAccount']) +} + +export const setupAccountComputed = { + ...mapGetters('encryptedNote', ['setupAccountRequest']) +} diff --git a/modules/account/injectors/setupInjectors.js b/modules/account/injectors/setupInjectors.js new file mode 100644 index 0000000..8784dbc --- /dev/null +++ b/modules/account/injectors/setupInjectors.js @@ -0,0 +1,20 @@ +import { mapActions, mapGetters, mapState } from 'vuex' + +export const setupMethods = { + ...mapActions('loading', ['enable', 'disable']), + ...mapActions('notice', ['addNoticeWithInterval']), + ...mapActions('encryptedNote', [ + 'clearState', + 'decryptNotes', + 'setupAccount', + 'recoverAccountFromKey', + 'saveRecoveryKeyOnFile', + 'recoverAccountFromChain' + ]) +} + +export const setupComputed = { + ...mapState('metamask', ['isInitialized', 'providerName']), + ...mapGetters('metamask', ['isLoggedIn', 'isPartialSupport']), + ...mapGetters('encryptedNote', ['isExistAccount', 'setupAccountRequest']) +} diff --git a/modules/account/injectors/showRecoveryKeyInjectors.js b/modules/account/injectors/showRecoveryKeyInjectors.js new file mode 100644 index 0000000..d61941a --- /dev/null +++ b/modules/account/injectors/showRecoveryKeyInjectors.js @@ -0,0 +1,5 @@ +import { mapActions } from 'vuex' + +export const showRecoveryKeyMethods = { + ...mapActions('notice', ['addNoticeWithInterval']) +} diff --git a/modules/account/injectors/walletInjectors.js b/modules/account/injectors/walletInjectors.js new file mode 100644 index 0000000..87fadf4 --- /dev/null +++ b/modules/account/injectors/walletInjectors.js @@ -0,0 +1,10 @@ +import { mapGetters, mapState, mapActions } from 'vuex' + +export const walletComputed = { + ...mapState('metamask', ['ethAccount']), + ...mapGetters('metamask', ['netId', 'isLoggedIn']) +} + +export const walletActions = { + ...mapActions('metamask', ['onLogOut']) +} diff --git a/modules/account/injectors/сontrolInjectors.js b/modules/account/injectors/сontrolInjectors.js new file mode 100644 index 0000000..660bbec --- /dev/null +++ b/modules/account/injectors/сontrolInjectors.js @@ -0,0 +1,19 @@ +import { mapActions, mapGetters } from 'vuex' + +export const controlMethods = { + ...mapActions('notice', ['addNoticeWithInterval']), + ...mapActions('encryptedNote', ['decryptNotes', 'removeAccount', 'enabledSaveFile', 'getRecoveryKey']) +} + +export const controlComputed = { + ...mapGetters('encryptedNote', ['isEnabledSaveFile', 'isSetupAccount']) +} + +export const statisticComputed = { + ...mapGetters('encryptedNote', ['statistic']), + ...mapGetters('token', ['getSymbol']) +} + +export const headerComputed = { + ...mapGetters('encryptedNote', ['accounts']) +} diff --git a/modules/account/modals/DecryptInfo.vue b/modules/account/modals/DecryptInfo.vue new file mode 100644 index 0000000..27065f3 --- /dev/null +++ b/modules/account/modals/DecryptInfo.vue @@ -0,0 +1,84 @@ + + + diff --git a/modules/account/modals/RecoverAccount.vue b/modules/account/modals/RecoverAccount.vue new file mode 100644 index 0000000..cdcb2c6 --- /dev/null +++ b/modules/account/modals/RecoverAccount.vue @@ -0,0 +1,90 @@ + + + diff --git a/modules/account/modals/SessionUpdate.vue b/modules/account/modals/SessionUpdate.vue new file mode 100644 index 0000000..b10b131 --- /dev/null +++ b/modules/account/modals/SessionUpdate.vue @@ -0,0 +1,71 @@ + + + diff --git a/modules/account/modals/SetupAccount.vue b/modules/account/modals/SetupAccount.vue new file mode 100644 index 0000000..7787f8d --- /dev/null +++ b/modules/account/modals/SetupAccount.vue @@ -0,0 +1,134 @@ + + + diff --git a/modules/account/modals/ShowRecoverKey.vue b/modules/account/modals/ShowRecoverKey.vue new file mode 100644 index 0000000..c24a0f3 --- /dev/null +++ b/modules/account/modals/ShowRecoverKey.vue @@ -0,0 +1,55 @@ + + + diff --git a/modules/account/modals/index.js b/modules/account/modals/index.js new file mode 100644 index 0000000..a0b9fdb --- /dev/null +++ b/modules/account/modals/index.js @@ -0,0 +1,66 @@ +import { ModalProgrammatic, DialogProgrammatic } from 'buefy' + +import { Settings } from '../dependencies' + +import DecryptInfo from './DecryptInfo.vue' +import SetupAccount from './SetupAccount.vue' +import SessionUpdate from './SessionUpdate.vue' +import RecoverAccount from './RecoverAccount.vue' +import ShowRecoverKey from './ShowRecoverKey.vue' + +const openSettingsModal = ({ parent, ...props }) => { + createModal({ props, parent, component: Settings }) +} + +const openSetupAccountModal = ({ parent, ...props }) => { + createModal({ props, parent, component: SetupAccount, canCancel: false }) +} + +const openDecryptModal = ({ parent, ...props }) => { + createModal({ props, parent, component: DecryptInfo }) +} + +const openRecoverAccountModal = ({ parent, ...props }) => { + createModal({ props, parent, component: RecoverAccount }) +} + +const openShowRecoverKeyModal = ({ parent, ...props }) => { + createModal({ props, parent, component: ShowRecoverKey }) +} + +function createModal({ component, props, parent, ...rest }) { + ModalProgrammatic.open({ + props, + parent, + component, + width: 440, + hasModalCard: true, + customClass: 'is-pinned', + ...rest + }) +} + +const openRemoveAccountModal = ({ i18n, onConfirm }) => { + DialogProgrammatic.confirm({ + onConfirm, + title: i18n.t('account.modals.removeAccount.title'), + type: 'is-primary is-outlined', + message: i18n.t('account.modals.removeAccount.description'), + cancelText: i18n.t('account.modals.removeAccount.cancel'), + confirmText: i18n.t('account.modals.removeAccount.remove') + }) +} + +const openConfirmModal = ({ parent, ...props }) => { + createModal({ props, parent, component: SessionUpdate, customClass: 'dialog' }) +} + +export { + openDecryptModal, + openConfirmModal, + openSettingsModal, + openSetupAccountModal, + openRemoveAccountModal, + openShowRecoverKeyModal, + openRecoverAccountModal +} diff --git a/modules/account/shared/index.js b/modules/account/shared/index.js new file mode 100644 index 0000000..1ffcfba --- /dev/null +++ b/modules/account/shared/index.js @@ -0,0 +1,2 @@ +export { Indicator } from '../components' +export { openConfirmModal } from '../modals' diff --git a/modules/account/store/actions/checkExistAccount.js b/modules/account/store/actions/checkExistAccount.js new file mode 100644 index 0000000..c86d984 --- /dev/null +++ b/modules/account/store/actions/checkExistAccount.js @@ -0,0 +1,77 @@ +import { graph } from '@/services' + +export async function checkExistAccount({ getters, dispatch, rootState, rootGetters }) { + const { ethAccount, netId } = rootState.metamask + + if (!ethAccount) { + return + } + + try { + const rpc = rootGetters['settings/currentRpc'] + const web3 = this.$provider.getWeb3(rpc.url) + const currentBlockNumber = await web3.eth.getBlockNumber() + + const isExist = await getEventsFromBlockPart( + { getters, dispatch, rootState, rootGetters }, + { netId, currentBlockNumber, address: ethAccount } + ) + console.log('isExist', isExist) + + dispatch('createMutation', { + type: 'CHECK_ACCOUNT', + payload: { isExist } + }) + } catch (err) { + throw new Error(`Method checkExistAccount has error: ${err.message}`) + } +} + +async function getEventsFromBlockPart( + { getters, rootGetters, dispatch }, + { address, currentBlockNumber, netId } +) { + try { + const { events: graphEvents, lastSyncBlock } = await graph.getNoteAccounts({ address, netId }) + + const blockDifference = Math.ceil(currentBlockNumber - lastSyncBlock) + let blockRange = 1 + + if (Number(netId) === 56) { + blockRange = 4950 + } + + let numberParts = blockDifference === 0 ? 1 : Math.ceil(blockDifference / blockRange) + const part = Math.ceil(blockDifference / numberParts) + + let events = [] + + let fromBlock = lastSyncBlock + let toBlock = lastSyncBlock + part + + if (toBlock >= currentBlockNumber) { + toBlock = 'latest' + numberParts = 1 + } + + for (let i = 0; i < numberParts; i++) { + const partOfEvents = await getters.echoContract.getEvents({ + fromBlock, + toBlock, + address + }) + if (partOfEvents) { + events = events.concat(partOfEvents) + } + fromBlock = toBlock + toBlock += part + } + + events = graphEvents.concat(events) + + return Boolean(Array.isArray(events) && Boolean(events.length)) + } catch (err) { + console.log(`getEventsFromBlock has error: ${err.message}`) + return false + } +} diff --git a/modules/account/store/actions/checkRecoveryKey.js b/modules/account/store/actions/checkRecoveryKey.js new file mode 100644 index 0000000..ca1210c --- /dev/null +++ b/modules/account/store/actions/checkRecoveryKey.js @@ -0,0 +1,8 @@ +export function checkRecoveryKey({ getters, dispatch }) { + const { encrypt: address } = getters.accounts + const recoveryKey = this.$sessionStorage.getItem(address) + + if (!recoveryKey && !getters.encryptedPrivateKey) { + dispatch('removeAccount') + } +} diff --git a/modules/account/store/actions/decryptNote.js b/modules/account/store/actions/decryptNote.js new file mode 100644 index 0000000..7936850 --- /dev/null +++ b/modules/account/store/actions/decryptNote.js @@ -0,0 +1,16 @@ +import { decrypt } from 'eth-sig-util' + +import { unpackEncryptedMessage } from '@/utils' + +export async function decryptNote({ dispatch }, encryptedNote) { + try { + const recoveryKey = await dispatch('getRecoveryKey') + + const unpackedMessage = unpackEncryptedMessage(encryptedNote) + const [, note] = decrypt(unpackedMessage, recoveryKey).split('-') + + return note + } catch (err) { + console.warn(`Method decryptNote has error: ${err.message}`) + } +} diff --git a/modules/account/store/actions/decryptNotes/checkCurrentTx.js b/modules/account/store/actions/decryptNotes/checkCurrentTx.js new file mode 100644 index 0000000..f8c118c --- /dev/null +++ b/modules/account/store/actions/decryptNotes/checkCurrentTx.js @@ -0,0 +1,6 @@ +export function _checkCurrentTx({ rootGetters }, transactions) { + const currentTransactions = rootGetters['txHashKeeper/allTxsHash'] + const newTransactions = transactions.filter((event) => !currentTransactions.includes(event.txHash)) + + return newTransactions +} diff --git a/modules/account/store/actions/decryptNotes/encryptFormatTx.js b/modules/account/store/actions/decryptNotes/encryptFormatTx.js new file mode 100644 index 0000000..9050e05 --- /dev/null +++ b/modules/account/store/actions/decryptNotes/encryptFormatTx.js @@ -0,0 +1,207 @@ +import { decrypt } from 'eth-sig-util' +import { isAddress } from 'web3-utils' + +import { eventsType } from '@/constants' +import { parseHexNote, getInstanceByAddress, unpackEncryptedMessage } from '@/utils' + +export async function _encryptFormatTx({ dispatch, getters, rootGetters }, { events, privateKey }) { + let result = [] + + const netId = rootGetters['metamask/netId'] + const eventsInterface = rootGetters['application/eventsInterface'] + + dispatch('loading/changeText', { message: this.app.i18n.t('decryptingNotes') }, { root: true }) + + const encryptedEvents = decryptEvents({ events, privateKey }) + + dispatch( + 'loading/changeText', + { message: this.app.i18n.t('getAndValidateEvents', { name: this.app.i18n.t('deposit') }) }, + { root: true } + ) + + const instances = encryptedEvents.reduce((acc, curr) => { + const instance = getInstanceByAddress({ netId, address: curr.address }) + if (!instance) { + return acc + } + const name = `${instance.amount}${instance.currency}` + if (!acc[name]) { + const service = eventsInterface.getService({ netId, ...instance }) + acc[name] = { ...instance, service } + } + return acc + }, {}) + + await Promise.all( + [].concat( + Object.values(instances).map((instance) => instance.service.updateEvents(eventsType.DEPOSIT)), + Object.values(instances).map((instance) => instance.service.updateEvents(eventsType.WITHDRAWAL)) + ) + ) + + const eventBatches = getBatches(encryptedEvents) + + for await (const batch of eventBatches) { + try { + const depositPromises = batch.map((event) => { + const instance = getInstanceByAddress({ netId, address: event.address }) + if (!instance) { + return + } + const { service } = instances[`${instance.amount}${instance.currency}`] + return getDeposit({ event, netId, service, instance }) + }) + + const proceedDeposits = await Promise.all(depositPromises) + console.log({ proceedDeposits }) + + dispatch( + 'loading/changeText', + { message: this.app.i18n.t('getAndValidateEvents', { name: this.app.i18n.t('withdrawal') }) }, + { root: true } + ) + + const proceedEvents = await Promise.all( + proceedDeposits.map(([event, deposit]) => proceedEvent({ event, getters, deposit, netId, dispatch })) + ) + + result = result.concat(proceedEvents) + } catch (e) { + console.error('_encryptFormatTx', e) + } + } + + return formattingEvents(result) +} + +function decryptEvents({ privateKey, events }) { + const encryptEvents = [] + + for (const event of events) { + try { + const unpackedMessage = unpackEncryptedMessage(event.encryptedNote) + + const [address, note] = decrypt(unpackedMessage, privateKey).split('-') + encryptEvents.push({ address, note, ...event }) + } catch { + // decryption may fail for foreign notes + continue + } + } + + return encryptEvents +} + +function formattingEvents(proceedEvents) { + const result = [] + const statistic = [] + let unSpent = 0 + + proceedEvents.forEach((transaction) => { + if (transaction) { + if (!transaction.isSpent) { + unSpent += 1 + statistic.push({ + amount: transaction.amount, + currency: transaction.currency + }) + } + + result.push(transaction) + } + }) + + return { + unSpent, + statistic, + transactions: result + } +} + +async function getDeposit({ netId, event, service, instance }) { + const { commitmentHex, nullifierHex } = parseHexNote(event.note) + + const foundEvent = await service.findEvent({ + eventName: 'commitment', + eventToFind: commitmentHex, + type: eventsType.DEPOSIT + }) + + if (!foundEvent) { + return + } + + const isSpent = await service.findEvent({ + eventName: 'nullifierHash', + eventToFind: nullifierHex, + type: eventsType.WITHDRAWAL + }) + + const deposit = { + leafIndex: foundEvent.leafIndex, + timestamp: foundEvent.timestamp, + txHash: foundEvent.transactionHash, + depositBlock: foundEvent.blockNumber + } + + return [ + event, + { + nullifierHex, + commitmentHex, + amount: instance.amount, + isSpent: Boolean(isSpent), + currency: instance.currency, + prefix: `tornado-${instance.currency}-${instance.amount}-${netId}`, + ...deposit + } + ] +} + +async function proceedEvent({ dispatch, getters, deposit, netId, event: { note, address, ...event } }) { + const { encrypt, backup } = getters.accounts + + try { + const { depositBlock, ...rest } = deposit + + const transaction = { + ...rest, + netId, + status: 2, + type: 'Deposit', + txHash: event.txHash, + owner: isAddress(encrypt) ? encrypt : '', + backupAccount: isAddress(backup) ? backup : '', + index: deposit.leafIndex, + storeType: 'encryptedTxs', + blockNumber: event.blockNumber, + note: event.encryptedNote + } + + if (deposit && deposit.isSpent) { + const withdrawEvent = await dispatch( + 'application/loadWithdrawalEvent', + { withdrawNote: `${deposit.prefix}-${note}` }, + { root: true } + ) + if (withdrawEvent) { + transaction.txHash = withdrawEvent.txHash + transaction.depositBlock = depositBlock + transaction.blockNumber = withdrawEvent.blockNumber + } + } + + return transaction + } catch (err) { + console.log('err', err.message) + } +} + +function getBatches(arr, batchSize = 100) { + const batches = [] + while (arr.length) { + batches.push(arr.splice(0, batchSize)) + } + return batches +} diff --git a/modules/account/store/actions/decryptNotes/getDecryptNotes.js b/modules/account/store/actions/decryptNotes/getDecryptNotes.js new file mode 100644 index 0000000..acaa4d4 --- /dev/null +++ b/modules/account/store/actions/decryptNotes/getDecryptNotes.js @@ -0,0 +1,36 @@ +export async function decryptNotes({ commit, dispatch }) { + try { + dispatch('loading/enable', { message: this.app.i18n.t('startDecryptingNotes') }, { root: true }) + + const privateKey = await dispatch('getRecoveryKey', false) + + if (!privateKey) { + return + } + + const events = await dispatch('application/getEncryptedNotes', {}, { root: true }) + + const { transactions, statistic, unSpent } = await dispatch('_encryptFormatTx', { events, privateKey }) + + const checkedTxs = await dispatch('_checkCurrentTx', transactions) + + checkedTxs.forEach((tx) => { + commit('txHashKeeper/SAVE_TX_HASH', tx, { root: true }) + }) + + dispatch('createMutation', { type: 'SET_STATISTIC', payload: { statistic } }) + + return { + unSpent, + spent: checkedTxs.length ? checkedTxs.length - unSpent : 0, + all: events.length ? events.length - 1 : 0 + } + } catch (err) { + dispatch('createMutation', { + type: 'SET_DOMAIN_FAILED', + payload: { key: 'decryptNotes', errorMessage: err.message } + }) + } finally { + dispatch('loading/disable', {}, { root: true }) + } +} diff --git a/modules/account/store/actions/decryptNotes/index.js b/modules/account/store/actions/decryptNotes/index.js new file mode 100644 index 0000000..f8eadf1 --- /dev/null +++ b/modules/account/store/actions/decryptNotes/index.js @@ -0,0 +1,4 @@ +export { decryptNotes } from './getDecryptNotes' +// helpers +export { _checkCurrentTx } from './checkCurrentTx' +export { _encryptFormatTx } from './encryptFormatTx' diff --git a/modules/account/store/actions/enabledSaveFile.js b/modules/account/store/actions/enabledSaveFile.js new file mode 100644 index 0000000..d504750 --- /dev/null +++ b/modules/account/store/actions/enabledSaveFile.js @@ -0,0 +1,6 @@ +export function enabledSaveFile({ dispatch, getters }) { + dispatch('createMutation', { + type: 'ENABLED_SAVE_FILE', + payload: { isEnabled: !getters.isEnabledSaveFile } + }) +} diff --git a/modules/account/store/actions/getEncryptedAccount.js b/modules/account/store/actions/getEncryptedAccount.js new file mode 100644 index 0000000..23eef9e --- /dev/null +++ b/modules/account/store/actions/getEncryptedAccount.js @@ -0,0 +1,22 @@ +import { encrypt, getEncryptionPublicKey } from 'eth-sig-util' + +export function getEncryptedAccount(_, { privateKey, pubKey }) { + try { + const { address } = this.$provider.web3.eth.accounts.privateKeyToAccount(privateKey) + const keyWithOutPrefix = privateKey.slice(0, 2) === '0x' ? privateKey.replace('0x', '') : privateKey + + const publicKey = getEncryptionPublicKey(keyWithOutPrefix) + + const encryptedData = encrypt(pubKey, { data: keyWithOutPrefix }, 'x25519-xsalsa20-poly1305') + const hexPrivateKey = Buffer.from(JSON.stringify(encryptedData)).toString('hex') + + return { + address, + publicKey, + hexPrivateKey, + encryptedData + } + } catch (err) { + throw new Error(`Method getEncryptedAccount has error: ${err.message}`) + } +} diff --git a/modules/account/store/actions/getEncryptedNote.js b/modules/account/store/actions/getEncryptedNote.js new file mode 100644 index 0000000..4af0b41 --- /dev/null +++ b/modules/account/store/actions/getEncryptedNote.js @@ -0,0 +1,19 @@ +import { encrypt } from 'eth-sig-util' + +import { packEncryptedMessage } from '@/utils' + +export function getEncryptedNote({ getters }, { data }) { + try { + const encryptedPublicKey = getters.encryptedPublicKey + + if (!encryptedPublicKey) { + return + } + + const encryptedData = encrypt(encryptedPublicKey, { data }, 'x25519-xsalsa20-poly1305') + + return packEncryptedMessage(encryptedData) + } catch (err) { + throw new Error(`Method getEncryptedNote has error: ${err.message}`) + } +} diff --git a/modules/account/store/actions/getRecoveryKey.js b/modules/account/store/actions/getRecoveryKey.js new file mode 100644 index 0000000..69ba190 --- /dev/null +++ b/modules/account/store/actions/getRecoveryKey.js @@ -0,0 +1,71 @@ +import { isAddress } from 'web3-utils' +import { sliceAddress } from '@/utils' + +export async function getRecoveryKey({ dispatch, getters, rootState }, enableLoader = true) { + try { + const { encrypt: address } = getters.accounts + const recoverKey = this.$sessionStorage.getItem(address) + + if (recoverKey) { + return recoverKey.data + } + + const hasError = _checkBackupAccount({ rootState, dispatch, getters, i18n: this.app.i18n }) + + if (hasError) { + return + } + + const encryptedPrivateKey = getters.encryptedPrivateKey + dispatch('loading/enable', { message: this.app.i18n.t('decryptNote') }, { root: true }) + const privateKey = await dispatch('metamask/ethDecrypt', encryptedPrivateKey, { root: true }) + + this.$sessionStorage.setItem(address, privateKey) + + return privateKey + } catch (err) { + const isRejected = err.message.includes('MetaMask Decryption: User denied message decryption.') + + const notice = { + title: 'decryptFailed', + type: 'danger' + } + + if (isRejected) { + notice.title = 'rejectedRequest' + notice.description = rootState.metamask.walletName + } + + dispatch('notice/addNoticeWithInterval', { notice, interval: 5000 }, { root: true }) + } finally { + if (enableLoader) { + dispatch('loading/disable', {}, { root: true }) + } + } +} + +function _checkBackupAccount(ctx) { + const { ethAccount } = ctx.rootState.metamask + + if (!ethAccount) { + const { backup, encrypt } = ctx.getters.accounts + + if (isAddress(backup)) { + ctx.dispatch( + 'notice/addNoticeWithInterval', + { + notice: { + untranslatedTitle: ctx.i18n.t('noteAccountKey', { + address: sliceAddress(backup), + noteAddress: sliceAddress(encrypt) + }), + type: 'danger' + }, + interval: 10000 + }, + { root: true } + ) + return 'error' + } + } +} diff --git a/modules/account/store/actions/highlightNoteAccount.js b/modules/account/store/actions/highlightNoteAccount.js new file mode 100644 index 0000000..b5d27b6 --- /dev/null +++ b/modules/account/store/actions/highlightNoteAccount.js @@ -0,0 +1,3 @@ +export function highlightNoteAccount({ dispatch }, { isHighlighted }) { + dispatch('createMutation', { type: 'SET_HIGHLIGHT_NOTE_ACCOUNT', payload: { isHighlighted } }) +} diff --git a/modules/account/store/actions/index.js b/modules/account/store/actions/index.js new file mode 100644 index 0000000..bbeda46 --- /dev/null +++ b/modules/account/store/actions/index.js @@ -0,0 +1,51 @@ +import { decryptNote } from './decryptNote' +import { decryptNotes, _encryptFormatTx, _checkCurrentTx } from './decryptNotes' + +import { saveAccount } from './saveAccount' +import { removeAccount } from './removeAccount' +import { getRecoveryKey } from './getRecoveryKey' +import { enabledSaveFile } from './enabledSaveFile' +import { checkRecoveryKey } from './checkRecoveryKey' + +import { setupAccount, saveEncryptedAccount } from './setupAccount' +import { recoverAccountFromChain, decryptAccount, getAccountFromAddress } from './recoverAccountFromChain' + +import { checkExistAccount } from './checkExistAccount' +import { getEncryptedNote } from './getEncryptedNote' +import { getEncryptedAccount } from './getEncryptedAccount' +import { recoverAccountFromKey } from './recoverAccountFromKey' + +import { redirectToAccount } from './redirectToAccount' +import { highlightNoteAccount } from './highlightNoteAccount' +import { saveRecoveryKeyOnFile } from './saveRecoveryKeyOnFile' + +import { createMutation, clearState } from './utils' + +export const actions = { + // utils + clearState, + createMutation, + // actions + saveAccount, + decryptNote, + decryptNotes, + setupAccount, + removeAccount, + decryptAccount, + getRecoveryKey, + enabledSaveFile, + checkRecoveryKey, + getEncryptedNote, + redirectToAccount, + checkExistAccount, + getEncryptedAccount, + highlightNoteAccount, + saveEncryptedAccount, + getAccountFromAddress, + recoverAccountFromKey, + recoverAccountFromChain, + saveRecoveryKeyOnFile, + // private actions + _encryptFormatTx, + _checkCurrentTx +} diff --git a/modules/account/store/actions/recoverAccountFromChain/decryptAccount.js b/modules/account/store/actions/recoverAccountFromChain/decryptAccount.js new file mode 100644 index 0000000..c3acc32 --- /dev/null +++ b/modules/account/store/actions/recoverAccountFromChain/decryptAccount.js @@ -0,0 +1,14 @@ +import { getEncryptionPublicKey } from 'eth-sig-util' + +export async function decryptAccount({ dispatch }, encryptedAccount) { + try { + const privateKey = await dispatch('metamask/ethDecrypt', encryptedAccount, { root: true }) + const publicKey = getEncryptionPublicKey(privateKey) + + const { address } = await this.$provider.web3.eth.accounts.privateKeyToAccount(privateKey) + + return { address, publicKey, privateKey } + } catch (err) { + throw new Error(`Method decryptAccount has error: ${err.message}`) + } +} diff --git a/modules/account/store/actions/recoverAccountFromChain/getAccountFromAddress.js b/modules/account/store/actions/recoverAccountFromChain/getAccountFromAddress.js new file mode 100644 index 0000000..b185d0c --- /dev/null +++ b/modules/account/store/actions/recoverAccountFromChain/getAccountFromAddress.js @@ -0,0 +1,80 @@ +import { graph } from '@/services' +import { unpackEncryptedMessage } from '@/utils' + +export async function getAccountFromAddress({ getters, rootGetters }, address) { + try { + const netId = rootGetters['metamask/netId'] + + const rpc = rootGetters['settings/currentRpc'] + const web3 = this.$provider.getWeb3(rpc.url) + const currentBlockNumber = await web3.eth.getBlockNumber() + + const events = await getEventsFromBlockPart({ getters }, { netId, currentBlockNumber, address }) + + const [lastEvent] = events.slice(-1) + + if (!lastEvent) { + throw new Error(`Please setup account, account doesn't exist for this address`) + } + + const data = lastEvent.encryptedAccount ? lastEvent.encryptedAccount : lastEvent.returnValues.data + const backup = lastEvent.address ? lastEvent.address : lastEvent.returnValues.who + + const encryptedMessage = unpackEncryptedMessage(data) + const encryptedKey = Buffer.from(JSON.stringify(encryptedMessage)).toString('hex') + + return { + backup, + encryptedKey + } + } catch (err) { + throw new Error(`Method getAccountFromAddress has error: ${err.message}`) + } +} + +async function getEventsFromBlockPart({ getters }, { address, currentBlockNumber, netId }) { + try { + const { events: graphEvents, lastSyncBlock } = await graph.getNoteAccounts({ address, netId }) + + const blockDifference = Math.ceil(currentBlockNumber - lastSyncBlock) + + let blockRange = 1 + + if (Number(netId) === 56) { + blockRange = 4950 + } + + let numberParts = blockDifference === 0 ? 1 : Math.ceil(blockDifference / blockRange) + const part = Math.ceil(blockDifference / numberParts) + + let events = [] + + let fromBlock = lastSyncBlock + let toBlock = lastSyncBlock + part + + if (toBlock >= currentBlockNumber) { + toBlock = 'latest' + numberParts = 1 + } + + for (let i = 0; i < numberParts; i++) { + const partOfEvents = await getters.echoContract.getEvents({ + fromBlock, + toBlock, + address + }) + if (partOfEvents) { + events = events.concat(partOfEvents) + } + fromBlock = toBlock + toBlock += part + } + + events = graphEvents.concat(events) + + return events + } catch (err) { + console.log(`getEventsFromBlock has error: ${err.message}`) + return false + } +} diff --git a/modules/account/store/actions/recoverAccountFromChain/index.js b/modules/account/store/actions/recoverAccountFromChain/index.js new file mode 100644 index 0000000..468eb05 --- /dev/null +++ b/modules/account/store/actions/recoverAccountFromChain/index.js @@ -0,0 +1,3 @@ +export { decryptAccount } from './decryptAccount' +export { getAccountFromAddress } from './getAccountFromAddress' +export { recoverAccountFromChain } from './recoverAccountFromChain' diff --git a/modules/account/store/actions/recoverAccountFromChain/recoverAccountFromChain.js b/modules/account/store/actions/recoverAccountFromChain/recoverAccountFromChain.js new file mode 100644 index 0000000..5fd021e --- /dev/null +++ b/modules/account/store/actions/recoverAccountFromChain/recoverAccountFromChain.js @@ -0,0 +1,13 @@ +export async function recoverAccountFromChain({ dispatch, rootState }) { + const { ethAccount } = rootState.metamask + try { + const { encryptedKey, backup } = await dispatch('getAccountFromAddress', ethAccount) + const { address, publicKey, privateKey } = await dispatch('decryptAccount', encryptedKey) + + this.$sessionStorage.setItem(address, privateKey) + + dispatch('saveAccount', { account: { publicKey, privateKey: encryptedKey }, address, backup }) + } catch (err) { + throw new Error(`Method recoverAccountFromChain has error: ${err.message}`) + } +} diff --git a/modules/account/store/actions/recoverAccountFromKey.js b/modules/account/store/actions/recoverAccountFromKey.js new file mode 100644 index 0000000..0e9b7d3 --- /dev/null +++ b/modules/account/store/actions/recoverAccountFromKey.js @@ -0,0 +1,23 @@ +import { getEncryptionPublicKey } from 'eth-sig-util' + +export function recoverAccountFromKey({ dispatch }, { recoveryKey }) { + try { + dispatch('createMutation', { type: 'SET_DOMAIN_REQUEST', payload: { key: 'recoverAccountFromKey' } }) + + const publicKey = getEncryptionPublicKey(recoveryKey) + + const { address } = this.$provider.web3.eth.accounts.privateKeyToAccount(recoveryKey) + const keyWithOutPrefix = recoveryKey.slice(0, 2) === '0x' ? recoveryKey.replace('0x', '') : recoveryKey + + this.$sessionStorage.setItem(address, keyWithOutPrefix) + + dispatch('saveAccount', { account: { publicKey, privateKey: '' }, address }) + + dispatch('createMutation', { type: 'SET_DOMAIN_SUCCESS', payload: { key: 'recoverAccountFromKey' } }) + } catch (err) { + dispatch('createMutation', { + type: 'SET_DOMAIN_FAILED', + payload: { key: 'recoverAccountFromKey', errorMessage: err.message } + }) + } +} diff --git a/modules/account/store/actions/redirectToAccount.js b/modules/account/store/actions/redirectToAccount.js new file mode 100644 index 0000000..2f17864 --- /dev/null +++ b/modules/account/store/actions/redirectToAccount.js @@ -0,0 +1,4 @@ +export function redirectToAccount({ dispatch }) { + dispatch('highlightNoteAccount', { isHighlighted: true }) + this.$router.push({ path: '/account' }) +} diff --git a/modules/account/store/actions/removeAccount.js b/modules/account/store/actions/removeAccount.js new file mode 100644 index 0000000..c24c211 --- /dev/null +++ b/modules/account/store/actions/removeAccount.js @@ -0,0 +1,19 @@ +export function removeAccount({ dispatch }) { + try { + dispatch('createMutation', { type: 'SET_DOMAIN_REQUEST', payload: { key: 'removeAccount' } }) + + dispatch('createMutation', { type: 'REMOVE_ADDRESSES' }) + dispatch('createMutation', { type: 'REMOVE_KEY' }) + dispatch('createMutation', { type: 'ENABLED_SAVE_FILE', payload: { isEnabled: true } }) + dispatch('createMutation', { type: 'REMOVE_STATISTIC' }) + + this.$sessionStorage.clear() + + dispatch('createMutation', { type: 'SET_DOMAIN_SUCCESS', payload: { key: 'removeAccount' } }) + } catch (err) { + dispatch('createMutation', { + type: 'SET_DOMAIN_FAILED', + payload: { key: 'removeAccount', errorMessage: err.message } + }) + } +} diff --git a/modules/account/store/actions/saveAccount.js b/modules/account/store/actions/saveAccount.js new file mode 100644 index 0000000..d97b774 --- /dev/null +++ b/modules/account/store/actions/saveAccount.js @@ -0,0 +1,19 @@ +export function saveAccount({ dispatch, rootState }, { account, address, backup }) { + const { ethAccount } = rootState.metamask + + dispatch('createMutation', { + type: 'SET_ENCRYPTED_ACCOUNT', + payload: account + }) + + dispatch('createMutation', { + type: 'SET_ADDRESSES', + payload: { + addresses: { + encrypt: address, + backup: backup || '-', + connect: ethAccount + } + } + }) +} diff --git a/modules/account/store/actions/saveRecoveryKeyOnFile.js b/modules/account/store/actions/saveRecoveryKeyOnFile.js new file mode 100644 index 0000000..20e1dd4 --- /dev/null +++ b/modules/account/store/actions/saveRecoveryKeyOnFile.js @@ -0,0 +1,13 @@ +import { saveAsFile } from '@/utils' + +export function saveRecoveryKeyOnFile(_, { recoveryKey }) { + try { + const { address } = this.$provider.web3.eth.accounts.privateKeyToAccount(recoveryKey) + + const data = new Blob([`${recoveryKey}`], { type: 'text/plain;charset=utf-8' }) + + saveAsFile(data, `backup-note-account-key-${address.slice(0, 10)}.txt`) + } catch (err) { + console.error('saveFile', err.message) + } +} diff --git a/modules/account/store/actions/setupAccount/index.js b/modules/account/store/actions/setupAccount/index.js new file mode 100644 index 0000000..7af069c --- /dev/null +++ b/modules/account/store/actions/setupAccount/index.js @@ -0,0 +1,2 @@ +export { setupAccount } from './setupAccount' +export { saveEncryptedAccount } from './saveEncryptedAccount' diff --git a/modules/account/store/actions/setupAccount/saveEncryptedAccount.js b/modules/account/store/actions/setupAccount/saveEncryptedAccount.js new file mode 100644 index 0000000..f866779 --- /dev/null +++ b/modules/account/store/actions/setupAccount/saveEncryptedAccount.js @@ -0,0 +1,32 @@ +import { numberToHex } from 'web3-utils' +import { packEncryptedMessage } from '@/utils' + +export async function saveEncryptedAccount({ getters, dispatch }, { from, encryptedData, callback }) { + try { + const contract = getters.echoContract + + const data = packEncryptedMessage(encryptedData) + + const callData = contract.getCallData(data) + const gas = await contract.estimateGas({ from, data }) + + const callParams = { + method: 'eth_sendTransaction', + params: { + data: callData, + to: contract.address, + gas: numberToHex(gas + 10000) + }, + watcherParams: { + title: 'accountSaving', + successTitle: 'accountSaved', + onSuccess: callback + }, + isSaving: false + } + + await dispatch('metamask/sendTransaction', callParams, { root: true }) + } catch (err) { + throw new Error(err.message) + } +} diff --git a/modules/account/store/actions/setupAccount/setupAccount.js b/modules/account/store/actions/setupAccount/setupAccount.js new file mode 100644 index 0000000..f506695 --- /dev/null +++ b/modules/account/store/actions/setupAccount/setupAccount.js @@ -0,0 +1,62 @@ +export async function setupAccount({ dispatch, commit, getters, rootState }, { privateKey }) { + try { + dispatch('createMutation', { type: 'SET_DOMAIN_REQUEST', payload: { key: 'setupAccount' } }) + + await dispatch('checkExistAccount') + + if (getters.isExistAccount) { + throw new Error(this.app.i18n.t('haveAccountSetupWithWallet')) + } + + dispatch('loading/enable', { message: this.app.i18n.t('pleaseConfirmInWallet') }, { root: true }) + + const { ethAccount } = rootState.metamask + const pubKey = await dispatch('metamask/getEncryptionPublicKey', {}, { root: true }) + const account = await dispatch('getEncryptedAccount', { privateKey, pubKey }) + + const { address, publicKey, hexPrivateKey, encryptedData } = account + + const callback = () => { + dispatch('createMutation', { + type: 'CHECK_ACCOUNT', + payload: { isExist: true } + }) + + dispatch('saveAccount', { + address, + backup: ethAccount, + account: { publicKey, privateKey: hexPrivateKey } + }) + + dispatch( + 'notice/addNoticeWithInterval', + { + notice: { + title: 'account.modals.setupAccount.successfulNotice', + type: 'info' + }, + interval: 10000 + }, + { root: true } + ) + } + + await dispatch('saveEncryptedAccount', { + encryptedData, + from: ethAccount, + callback + }) + + this.$sessionStorage.setItem(address, privateKey) + + dispatch('createMutation', { type: 'SET_DOMAIN_SUCCESS', payload: { key: 'setupAccount' } }) + } catch (err) { + console.log('createMutation', err) + dispatch('createMutation', { + type: 'SET_DOMAIN_FAILED', + payload: { key: 'setupAccount', errorMessage: err.message } + }) + } finally { + dispatch('loading/disable', {}, { root: true }) + } +} diff --git a/modules/account/store/actions/utils.js b/modules/account/store/actions/utils.js new file mode 100644 index 0000000..94a2068 --- /dev/null +++ b/modules/account/store/actions/utils.js @@ -0,0 +1,14 @@ +function createMutation({ commit, rootState }, { type, payload }) { + const { netId } = rootState.metamask + + commit(type, { ...payload, netId }) +} + +function clearState({ dispatch }, { key }) { + dispatch('createMutation', { + type: 'CLEAR_STATE', + payload: { key } + }) +} + +export { clearState, createMutation } diff --git a/modules/account/store/getters/Contract.js b/modules/account/store/getters/Contract.js new file mode 100644 index 0000000..2c33af3 --- /dev/null +++ b/modules/account/store/getters/Contract.js @@ -0,0 +1,57 @@ +import Web3 from 'web3' + +const ABI = [ + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'who', type: 'address' }, + { indexed: false, internalType: 'bytes', name: 'data', type: 'bytes' } + ], + name: 'Echo', + type: 'event' + }, + { + inputs: [{ internalType: 'bytes', name: '_data', type: 'bytes' }], + name: 'echo', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + } +] + +export class EchoContract { + constructor({ rpcUrl, address }) { + this.web3 = new Web3(rpcUrl) + + this.contract = new this.web3.eth.Contract(ABI, address) + this.address = this.contract._address + } + + async getEvents({ address, fromBlock = 0, toBlock = 'latest' }) { + try { + return await this.contract.getPastEvents('Echo', { + toBlock, + fromBlock, + filter: { who: address } + }) + } catch (err) { + throw new Error(`Method getEvents has error: ${err.message}`) + } + } + + async estimateGas({ from, data }) { + try { + return await this.contract.methods.echo(data).estimateGas({ from }) + } catch (err) { + throw new Error(`Method estimateGas has error: ${err.message}`) + } + } + + getCallData(data) { + try { + return this.contract.methods.echo(data).encodeABI() + } catch (err) { + throw new Error(`Method getCallData has error: ${err.message}`) + } + } +} diff --git a/modules/account/store/getters/index.js b/modules/account/store/getters/index.js new file mode 100644 index 0000000..eb3200e --- /dev/null +++ b/modules/account/store/getters/index.js @@ -0,0 +1,81 @@ +import { EchoContract } from './Contract' + +import networkConfig from '@/networkConfig' + +export const getters = { + echoContract: (state, getters, rootState, rootGetters) => { + const netId = rootState.metamask.netId + const { url } = rootGetters['settings/currentRpc'] + const address = networkConfig[`netId${netId}`].echoContractAccount + + return new EchoContract({ rpcUrl: url, address }) + }, + // selectors + selectUi: (state, getters, rootState) => (key) => { + const { netId } = rootState.metamask + return state.ui[`netId${netId}`][key] + }, + selectDomain: (state, getters, rootState) => (key) => { + const { netId } = rootState.metamask + return state.domain[`netId${netId}`][key] + }, + // ui store + isExistAccount: (state, getters) => { + return getters.selectUi('isExistAccount') + }, + accounts: (state, getters) => { + return getters.selectUi('addresses') + }, + statistic: (state, getters) => { + const data = getters.selectUi('statistic') + + if (Array.isArray(data)) { + return data + } else { + return [] + } + }, + noteAccountBalance: (state, getters, rootState, rootGetters) => { + let balance = 0 + const nativeCurrency = rootGetters['metamask/nativeCurrency'] + + getters.statistic.forEach(({ currency, amount }) => { + if (currency === nativeCurrency) { + balance += Number(amount) + } + }) + + return balance + }, + isSetupAccount: (state, getters) => { + return Boolean(getters.selectUi('encryptedPublicKey')) + }, + encryptedPublicKey: (state, getters) => { + return getters.selectUi('encryptedPublicKey') + }, + encryptedPrivateKey: (state, getters) => { + return getters.selectUi('encryptedPrivateKey') + }, + isEnabledSaveFile: (state, getters) => { + return getters.selectUi('isEnabledSaveFile') + }, + isHighlightedNoteAccount: (state, getters) => { + return getters.selectUi('isHighlightedNoteAccount') + }, + // domain store + setupAccountRequest: (state, getters) => { + return getters.selectDomain('setupAccount') + }, + recoverAccountRequest: (state, getters) => { + return getters.selectDomain('recoverAccountFromChain') + }, + removeAccountRequest: (state, getters) => { + return getters.selectDomain('removeAccount') + }, + decryptNotesRequest: (state, getters) => { + return getters.selectDomain('decryptNotes') + }, + recoverAccountFromKeyRequest: (state, getters) => { + return getters.selectDomain('recoverAccountFromKey') + } +} diff --git a/modules/account/store/index.js b/modules/account/store/index.js new file mode 100644 index 0000000..cd16ee0 --- /dev/null +++ b/modules/account/store/index.js @@ -0,0 +1,6 @@ +import { state } from './state' +import { actions } from './actions' +import { getters } from './getters' +import { mutations } from './mutations' + +export { actions, mutations, getters, state } diff --git a/modules/account/store/mutations/Addresses.js b/modules/account/store/mutations/Addresses.js new file mode 100644 index 0000000..9f1e42c --- /dev/null +++ b/modules/account/store/mutations/Addresses.js @@ -0,0 +1,10 @@ +import { initialUiState } from '../state/ui' + +export const addresses = { + SET_ADDRESSES(state, { netId, addresses }) { + this._vm.$set(state.ui[`netId${netId}`], 'addresses', addresses) + }, + REMOVE_ADDRESSES(state, { netId }) { + this._vm.$set(state.ui[`netId${netId}`], 'addresses', initialUiState.addresses) + } +} diff --git a/modules/account/store/mutations/Domain.js b/modules/account/store/mutations/Domain.js new file mode 100644 index 0000000..4ed066e --- /dev/null +++ b/modules/account/store/mutations/Domain.js @@ -0,0 +1,34 @@ +export const domain = { + CLEAR_STATE(state, { netId, key }) { + this._vm.$set(state.domain[`netId${netId}`], key, { + isError: false, + isSuccess: false, + isFetching: false, + errorMessage: '' + }) + }, + SET_DOMAIN_REQUEST(state, { netId, key }) { + this._vm.$set(state.domain[`netId${netId}`], key, { + isError: false, + isSuccess: false, + isFetching: true, + errorMessage: '' + }) + }, + SET_DOMAIN_FAILED(state, { netId, key, errorMessage }) { + this._vm.$set(state.domain[`netId${netId}`], key, { + errorMessage, + isError: true, + isSuccess: false, + isFetching: false + }) + }, + SET_DOMAIN_SUCCESS(state, { netId, key }) { + this._vm.$set(state.domain[`netId${netId}`], key, { + isError: false, + isSuccess: true, + isFetching: false, + errorMessage: '' + }) + } +} diff --git a/modules/account/store/mutations/EnabledSaveFile.js b/modules/account/store/mutations/EnabledSaveFile.js new file mode 100644 index 0000000..441601d --- /dev/null +++ b/modules/account/store/mutations/EnabledSaveFile.js @@ -0,0 +1,5 @@ +export const enabledSaveFile = { + ENABLED_SAVE_FILE(state, { netId, isEnabled }) { + this._vm.$set(state.ui[`netId${netId}`], 'isEnabledSaveFile', isEnabled) + } +} diff --git a/modules/account/store/mutations/EncryptedAccount.js b/modules/account/store/mutations/EncryptedAccount.js new file mode 100644 index 0000000..90db1af --- /dev/null +++ b/modules/account/store/mutations/EncryptedAccount.js @@ -0,0 +1,16 @@ +export const encryptedAccount = { + SET_ENCRYPTED_ACCOUNT(state, { netId, publicKey, privateKey }) { + this._vm.$set(state.ui[`netId${netId}`], 'encryptedPublicKey', publicKey) + this._vm.$set(state.ui[`netId${netId}`], 'encryptedPrivateKey', privateKey) + }, + CHECK_ACCOUNT(state, { netId, isExist }) { + this._vm.$set(state.ui[`netId${netId}`], 'isExistAccount', isExist) + }, + REMOVE_KEY(state, { netId }) { + this._vm.$set(state.ui[`netId${netId}`], 'encryptedPublicKey', '') + this._vm.$set(state.ui[`netId${netId}`], 'encryptedPrivateKey', '') + }, + SET_HIGHLIGHT_NOTE_ACCOUNT(state, { netId, isHighlighted }) { + this._vm.$set(state.ui[`netId${netId}`], 'isHighlightedNoteAccount', isHighlighted) + } +} diff --git a/modules/account/store/mutations/Statistic.js b/modules/account/store/mutations/Statistic.js new file mode 100644 index 0000000..93c5744 --- /dev/null +++ b/modules/account/store/mutations/Statistic.js @@ -0,0 +1,8 @@ +export const statistic = { + SET_STATISTIC(state, { netId, statistic }) { + this._vm.$set(state.ui[`netId${netId}`], 'statistic', statistic) + }, + REMOVE_STATISTIC(state, { netId }) { + this._vm.$set(state.ui[`netId${netId}`], 'statistic', {}) + } +} diff --git a/modules/account/store/mutations/index.js b/modules/account/store/mutations/index.js new file mode 100644 index 0000000..67b904e --- /dev/null +++ b/modules/account/store/mutations/index.js @@ -0,0 +1,13 @@ +import { domain } from './Domain' +import { statistic } from './Statistic' +import { addresses } from './Addresses' +import { enabledSaveFile } from './EnabledSaveFile' +import { encryptedAccount } from './EncryptedAccount' + +export const mutations = { + ...domain, + ...addresses, + ...statistic, + ...enabledSaveFile, + ...encryptedAccount +} diff --git a/modules/account/store/state/domain.js b/modules/account/store/state/domain.js new file mode 100644 index 0000000..5b041ad --- /dev/null +++ b/modules/account/store/state/domain.js @@ -0,0 +1,18 @@ +import { createChainIdState } from '@/utils' + +const requestState = { + isError: false, + isSuccess: false, + isFetching: false, + errorMessage: '' +} + +const initialDomainState = { + setupAccount: Object.assign({}, requestState), + decryptNotes: Object.assign({}, requestState), + removeAccount: Object.assign({}, requestState), + recoverAccountFromKey: Object.assign({}, requestState), + recoverAccountFromChain: Object.assign({}, requestState) +} + +export const domain = createChainIdState(initialDomainState) diff --git a/modules/account/store/state/index.js b/modules/account/store/state/index.js new file mode 100644 index 0000000..4770ae3 --- /dev/null +++ b/modules/account/store/state/index.js @@ -0,0 +1,11 @@ +import { ui } from './ui' +import { domain } from './domain' + +export const state = () => { + return { + ui, + domain + } +} + +export * from './ui' diff --git a/modules/account/store/state/ui.js b/modules/account/store/state/ui.js new file mode 100644 index 0000000..df7008c --- /dev/null +++ b/modules/account/store/state/ui.js @@ -0,0 +1,17 @@ +import { createChainIdState } from '@/utils' + +export const initialUiState = { + addresses: { + backup: '-', + connect: '-', + encrypt: '-' + }, + isExistAccount: false, + encryptedPublicKey: '', + encryptedPrivateKey: '', + isEnabledSaveFile: true, + statistic: [], + isHighlightedNoteAccount: false +} + +export const ui = createChainIdState(initialUiState) diff --git a/modules/index.js b/modules/index.js new file mode 100644 index 0000000..79e032c --- /dev/null +++ b/modules/index.js @@ -0,0 +1 @@ +export { AccountPage } from './account' diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 0000000..9f5f574 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,6 @@ +[[redirects]] + from = "/*" + to = "/451.html" + status = 451 + force = true + conditions = {Country=["BY","CU","IR","IQ","CI","LR","KP","SD","SY","ZW"]} \ No newline at end of file diff --git a/networkConfig.js b/networkConfig.js new file mode 100644 index 0000000..2811513 --- /dev/null +++ b/networkConfig.js @@ -0,0 +1,536 @@ +const { + INFURA_KEY, + ALCHEMY_MAINNET_KEY, + ALCHEMY_POLYGON_KEY, + ALCHEMY_OPTIMISM_KEY, + ALCHEMY_ARBITRUM_KEY, + ALCHEMY_GOERLI_KEY +} = process.env + +export default { + netId1: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 80, + fast: 50, + standard: 25, + low: 8 + }, + nativeCurrency: 'eth', + currencyName: 'ETH', + explorerUrl: { + tx: 'https://etherscan.io/tx/', + address: 'https://etherscan.io/address/', + block: 'https://etherscan.io/block/' + }, + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Ethereum Mainnet', + deployedBlock: 9116966, + rpcUrls: { + Infura: { + name: 'Infura', + url: `https://mainnet.infura.io/v3/${INFURA_KEY}` + }, + Alchemy: { + name: 'Alchemy', + url: `https://eth-mainnet.alchemyapi.io/v2/${ALCHEMY_MAINNET_KEY}` + } + }, + multicall: '0xeefba1e63905ef1d7acba5a8513c70307c1ce441', + registryContract: '0x58E8dCC13BE9780fC42E8723D8EaD4CF46943dF2', + echoContractAccount: '0x9B27DD5Bb15d42DC224FCD0B7caEbBe16161Df42', + aggregatorContract: '0xE8F47A78A6D52D317D0D2FFFac56739fE14D1b49', + tokens: { + eth: { + instanceAddress: { + '0.1': '0x12D66f87A04A9E220743712cE6d9bB1B5616B8Fc', + '1': '0x47CE0C6eD5B0Ce3d3A51fdb1C52DC66a7c3c2936', + '10': '0x910Cbd523D972eb0a6f4cAe4618aD62622b39DbF', + '100': '0xA160cdAB225685dA1d56aa342Ad8841c3b53f291' + }, + symbol: 'ETH', + decimals: 18 + }, + dai: { + instanceAddress: { + '100': '0xD4B88Df4D29F5CedD6857912842cff3b20C8Cfa3', + '1000': '0xFD8610d20aA15b7B2E3Be39B396a1bC3516c7144', + '10000': '0x07687e702b410Fa43f4cB4Af7FA097918ffD2730', + '100000': '0x23773E65ed146A459791799d01336DB287f25334' + }, + tokenAddress: '0x6B175474E89094C44Da98b954EedeAC495271d0F', + symbol: 'DAI', + decimals: 18, + gasLimit: '55000' + }, + cdai: { + instanceAddress: { + '5000': '0x22aaA7720ddd5388A3c0A3333430953C68f1849b', + '50000': '0x03893a7c7463AE47D46bc7f091665f1893656003', + '500000': '0x2717c5e28cf931547B621a5dddb772Ab6A35B701', + '5000000': '0xD21be7248e0197Ee08E0c20D4a96DEBdaC3D20Af' + }, + tokenAddress: '0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643', + symbol: 'cDAI', + decimals: 8, + gasLimit: '425000' + }, + usdc: { + instanceAddress: { + '100': '0xd96f2B1c14Db8458374d9Aca76E26c3D18364307', + '1000': '0x4736dCf1b7A3d580672CcE6E7c65cd5cc9cFBa9D', + '10000': '', + '100000': '' + }, + tokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', + symbol: 'USDC', + decimals: 6, + gasLimit: '80000' + }, + usdt: { + instanceAddress: { + '100': '0x169AD27A470D064DEDE56a2D3ff727986b15D52B', + '1000': '0x0836222F2B2B24A3F36f98668Ed8F0B38D1a872f', + '10000': '', + '100000': '' + }, + tokenAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7', + symbol: 'USDT', + decimals: 6, + gasLimit: '100000' + }, + wbtc: { + instanceAddress: { + '0.1': '0x178169B423a011fff22B9e3F3abeA13414dDD0F1', + '1': '0x610B717796ad172B316836AC95a2ffad065CeaB4', + '10': '0xbB93e510BbCD0B7beb5A853875f9eC60275CF498', + '100': '' + }, + tokenAddress: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599', + symbol: 'WBTC', + decimals: 8, + gasLimit: '85000' + } + }, + ensSubdomainKey: 'mainnet-tornado', + pollInterval: 30, + constants: { + NOTE_ACCOUNT_BLOCK: 14248730, + MINING_BLOCK_TIME: 15 + }, + 'torn.contract.tornadocash.eth': '0x77777FeDdddFfC19Ff86DB637967013e6C6A116C', + 'governance.contract.tornadocash.eth': '0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce', + 'tornado-router.contract.tornadocash.eth': '0xd90e2f925DA726b50C4Ed8D0Fb90Ad053324F31b', + 'staking-rewards.contract.tornadocash.eth': '0x2FC93484614a34f26F7970CBB94615bA109BB4bf' + }, + netId56: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 5, + fast: 5, + standard: 5, + low: 5 + }, + nativeCurrency: 'bnb', + currencyName: 'BNB', + explorerUrl: { + tx: 'https://bscscan.com/tx/', + address: 'https://bscscan.com/address/', + block: 'https://bscscan.com/block/' + }, + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Binance Smart Chain', + deployedBlock: 8158799, + multicall: '0x41263cba59eb80dc200f3e2544eda4ed6a90e76c', + echoContractAccount: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', + rpcUrls: { + publicRpc1: { + name: 'BSC Public RPC 1', + url: 'https://bsc-dataseed.binance.org/' + }, + publicRpc2: { + name: 'BSC Public RPC 2', + url: 'https://bsc-dataseed1.defibit.io/' + }, + publicRpc3: { + name: 'BSC Public RPC 3', + url: 'https://bsc-dataseed1.ninicoin.io/' + } + }, + tokens: { + bnb: { + instanceAddress: { + '0.1': '0x84443CFd09A48AF6eF360C6976C5392aC5023a1F', + '1': '0xd47438C816c9E7f2E2888E060936a499Af9582b3', + '10': '0x330bdFADE01eE9bF63C209Ee33102DD334618e0a', + '100': '0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD' + }, + symbol: 'BNB', + decimals: 18 + } + }, + ensSubdomainKey: 'bsc-tornado', + pollInterval: 60, + constants: { + NOTE_ACCOUNT_BLOCK: 8159269 + }, + 'tornado-proxy-light.contract.tornadocash.eth': '0x0D5550d52428E7e3175bfc9550207e4ad3859b17' + }, + netId137: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 100, + fast: 75, + standard: 50, + low: 30 + }, + nativeCurrency: 'matic', + currencyName: 'MATIC', + explorerUrl: { + tx: 'https://polygonscan.com/tx/', + address: 'https://polygonscan.com/address/', + block: 'https://polygonscan.com/block/' + }, + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Polygon (Matic) Network', + deployedBlock: 16257962, + multicall: '0x11ce4B23bD875D7F5C6a31084f55fDe1e9A87507', + echoContractAccount: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', + rpcUrls: { + Infura: { + name: 'Infura', + url: `https://polygon-mainnet.infura.io/v3/${INFURA_KEY}` + }, + Alchemy: { + name: 'Alchemy', + url: `https://polygon-mainnet.g.alchemy.com/v2/${ALCHEMY_POLYGON_KEY}` + } + }, + tokens: { + matic: { + instanceAddress: { + '100': '0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD', + '1000': '0xdf231d99Ff8b6c6CBF4E9B9a945CBAcEF9339178', + '10000': '0xaf4c0B70B2Ea9FB7487C7CbB37aDa259579fe040', + '100000': '0xa5C2254e4253490C54cef0a4347fddb8f75A4998' + }, + symbol: 'MATIC', + decimals: 18 + } + }, + ensSubdomainKey: 'polygon-tornado', + pollInterval: 60, + constants: { + NOTE_ACCOUNT_BLOCK: 16257996 + }, + 'tornado-proxy-light.contract.tornadocash.eth': '0x0D5550d52428E7e3175bfc9550207e4ad3859b17' + }, + netId10: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 0.001, + fast: 0.001, + standard: 0.001, + low: 0.001 + }, + nativeCurrency: 'eth', + currencyName: 'ETH', + explorerUrl: { + tx: 'https://optimistic.etherscan.io/tx/', + address: 'https://optimistic.etherscan.io/address/', + block: 'https://optimistic.etherscan.io/block/' + }, + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Optimism', + deployedBlock: 2243689, + multicall: '0x35A6Cdb2C9AD4a45112df4a04147EB07dFA01aB7', + echoContractAccount: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', + rpcUrls: { + Alchemy: { + name: 'Alchemy', + url: `https://opt-mainnet.g.alchemy.com/v2/${ALCHEMY_OPTIMISM_KEY}` + }, + Infura: { + name: 'Infura', + url: `https://optimism-mainnet.infura.io/v3/${INFURA_KEY}` + } + }, + tokens: { + eth: { + instanceAddress: { + '0.1': '0x84443CFd09A48AF6eF360C6976C5392aC5023a1F', + '1': '0xd47438C816c9E7f2E2888E060936a499Af9582b3', + '10': '0x330bdFADE01eE9bF63C209Ee33102DD334618e0a', + '100': '0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD' + }, + symbol: 'ETH', + decimals: 18 + } + }, + ensSubdomainKey: 'optimism-tornado', + pollInterval: 20, + constants: { + NOTE_ACCOUNT_BLOCK: 2243694 + }, + 'tornado-proxy-light.contract.tornadocash.eth': '0x0D5550d52428E7e3175bfc9550207e4ad3859b17' + }, + netId42161: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 4, + fast: 3, + standard: 2.52, + low: 2.29 + }, + nativeCurrency: 'eth', + currencyName: 'ETH', + explorerUrl: { + tx: 'https://arbiscan.io/tx/', + address: 'https://arbiscan.io/address/', + block: 'https://arbiscan.io/block/' + }, + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Arbitrum One', + deployedBlock: 3430648, + multicall: '0x842eC2c7D803033Edf55E478F461FC547Bc54EB2', + echoContractAccount: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', + rpcUrls: { + Arbitrum: { + name: 'Arbitrum Public RPC', + url: 'https://arb1.arbitrum.io/rpc' + }, + Alchemy: { + name: 'Alchemy', + url: `https://arb-mainnet.g.alchemy.com/v2/${ALCHEMY_ARBITRUM_KEY}` + }, + Infura: { + name: 'Infura', + url: `https://arbitrum-mainnet.infura.io/v3/${INFURA_KEY}` + } + }, + tokens: { + eth: { + instanceAddress: { + '0.1': '0x84443CFd09A48AF6eF360C6976C5392aC5023a1F', + '1': '0xd47438C816c9E7f2E2888E060936a499Af9582b3', + '10': '0x330bdFADE01eE9bF63C209Ee33102DD334618e0a', + '100': '0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD' + }, + symbol: 'ETH', + decimals: 18 + } + }, + ensSubdomainKey: 'arbitrum-tornado', + pollInterval: 20, + constants: { + NOTE_ACCOUNT_BLOCK: 3430605 + }, + 'tornado-proxy-light.contract.tornadocash.eth': '0x0D5550d52428E7e3175bfc9550207e4ad3859b17' + }, + netId100: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 6, + fast: 5, + standard: 4, + low: 1 + }, + nativeCurrency: 'xdai', + currencyName: 'xDAI', + explorerUrl: { + tx: 'https://blockscout.com/xdai/mainnet/tx/', + address: 'https://blockscout.com/xdai/mainnet/address/', + block: 'https://blockscout.com/xdai/mainnet/block/' + }, + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Gnosis Chain', + deployedBlock: 17754561, + multicall: '0xb5b692a88bdfc81ca69dcb1d924f59f0413a602a', + echoContractAccount: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', + rpcUrls: { + publicRpc: { + name: 'xDAI Chain RPC', + url: 'https://rpc.xdaichain.com/tornado' + } + }, + tokens: { + xdai: { + instanceAddress: { + '100': '0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD', + '1000': '0xdf231d99Ff8b6c6CBF4E9B9a945CBAcEF9339178', + '10000': '0xaf4c0B70B2Ea9FB7487C7CbB37aDa259579fe040', + '100000': '0xa5C2254e4253490C54cef0a4347fddb8f75A4998' + }, + symbol: 'xDAI', + decimals: 18 + } + }, + ensSubdomainKey: 'gnosis-tornado', + pollInterval: 60, + constants: { + NOTE_ACCOUNT_BLOCK: 17754564 + }, + 'tornado-proxy-light.contract.tornadocash.eth': '0x0D5550d52428E7e3175bfc9550207e4ad3859b17' + }, + netId43114: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 225, + fast: 35, + standard: 25, + low: 25 + }, + nativeCurrency: 'avax', + currencyName: 'AVAX', + explorerUrl: { + tx: 'https://snowtrace.io/tx/', + address: 'https://snowtrace.io/address/', + block: 'https://snowtrace.io/block/' + }, + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Avalanche Mainnet', + deployedBlock: 4429818, + multicall: '0xe86e3989c74293Acc962156cd3F525c07b6a1B6e', + echoContractAccount: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', + rpcUrls: { + publicRpc: { + name: 'Avalanche RPC', + url: 'https://api.avax.network/ext/bc/C/rpc' + } + }, + tokens: { + avax: { + instanceAddress: { + '10': '0x330bdFADE01eE9bF63C209Ee33102DD334618e0a', + '100': '0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD', + '500': '0xaf8d1839c3c67cf571aa74B5c12398d4901147B3' + }, + symbol: 'AVAX', + decimals: 18 + } + }, + ensSubdomainKey: 'avalanche-tornado', + pollInterval: 60, + constants: { + NOTE_ACCOUNT_BLOCK: 4429813 + }, + 'tornado-proxy-light.contract.tornadocash.eth': '0x0D5550d52428E7e3175bfc9550207e4ad3859b17' + }, + netId5: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 80, + fast: 50, + standard: 25, + low: 8 + }, + nativeCurrency: 'eth', + currencyName: 'gETH', + explorerUrl: { + tx: 'https://goerli.etherscan.io/tx/', + address: 'https://goerli.etherscan.io/address/', + block: 'https://goerli.etherscan.io/block/' + }, + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Ethereum Goerli', + deployedBlock: 3781595, + multicall: '0x77dca2c955b15e9de4dbbcf1246b4b85b651e50e', + echoContractAccount: '0x37e6859804b6499d1e4a86d70a5fdd5de6a0ac65', + aggregatorContract: '0x8cb1436F64a3c33aD17bb42F94e255c4c0E871b2', + rpcUrls: { + Alchemy: { + name: 'Alchemy', + url: `https://eth-goerli.alchemyapi.io/v2/${ALCHEMY_GOERLI_KEY}` + } + }, + tokens: { + eth: { + instanceAddress: { + '0.1': '0x6Bf694a291DF3FeC1f7e69701E3ab6c592435Ae7', + '1': '0x3aac1cC67c2ec5Db4eA850957b967Ba153aD6279', + '10': '0x723B78e67497E85279CB204544566F4dC5d2acA0', + '100': '0x0E3A09dDA6B20aFbB34aC7cD4A6881493f3E7bf7' + }, + symbol: 'ETH', + decimals: 18 + }, + dai: { + instanceAddress: { + '100': '0x76D85B4C0Fc497EeCc38902397aC608000A06607', + '1000': '0xCC84179FFD19A1627E79F8648d09e095252Bc418', + '10000': '0xD5d6f8D9e784d0e26222ad3834500801a68D027D', + '100000': '0x407CcEeaA7c95d2FE2250Bf9F2c105aA7AAFB512' + }, + tokenAddress: '0xdc31Ee1784292379Fbb2964b3B9C4124D8F89C60', + symbol: 'DAI', + decimals: 18, + gasLimit: '55000' + }, + cdai: { + instanceAddress: { + '5000': '0x833481186f16Cece3f1Eeea1a694c42034c3a0dB', + '50000': '0xd8D7DE3349ccaA0Fde6298fe6D7b7d0d34586193', + '500000': '0x8281Aa6795aDE17C8973e1aedcA380258Bc124F9', + '5000000': '0x57b2B8c82F065de8Ef5573f9730fC1449B403C9f' + }, + tokenAddress: '0x822397d9a55d0fefd20F5c4bCaB33C5F65bd28Eb', + symbol: 'cDAI', + decimals: 8, + gasLimit: '425000' + }, + usdc: { + instanceAddress: { + '100': '0x05E0b5B40B7b66098C2161A5EE11C5740A3A7C45', + '1000': '0x23173fE8b96A4Ad8d2E17fB83EA5dcccdCa1Ae52', + '10000': '', + '100000': '' + }, + tokenAddress: '0xD87Ba7A50B2E7E660f678A895E4B72E7CB4CCd9C', + symbol: 'USDC', + decimals: 6, + gasLimit: '80000' + }, + usdt: { + instanceAddress: { + '100': '0x538Ab61E8A9fc1b2f93b3dd9011d662d89bE6FE6', + '1000': '0x94Be88213a387E992Dd87DE56950a9aef34b9448', + '10000': '', + '100000': '' + }, + tokenAddress: '0xb7FC2023D96AEa94Ba0254AA5Aeb93141e4aad66', + symbol: 'USDT', + decimals: 6, + gasLimit: '100000' + }, + wbtc: { + instanceAddress: { + '0.1': '0x242654336ca2205714071898f67E254EB49ACdCe', + '1': '0x776198CCF446DFa168347089d7338879273172cF', + '10': '0xeDC5d01286f99A066559F60a585406f3878a033e', + '100': '' + }, + tokenAddress: '0xC04B0d3107736C32e19F1c62b2aF67BE61d63a05', + symbol: 'WBTC', + decimals: 8, + gasLimit: '85000' + } + }, + ensSubdomainKey: 'goerli-tornado', + pollInterval: 30, + constants: { + NOTE_ACCOUNT_BLOCK: 4131375, + MINING_BLOCK_TIME: 15 + }, + 'torn.contract.tornadocash.eth': '0x77777FeDdddFfC19Ff86DB637967013e6C6A116C', + 'governance.contract.tornadocash.eth': '0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce', + 'tornado-proxy.contract.tornadocash.eth': '0x454d870a72e29d5e5697f635128d18077bd04c60' + } +} diff --git a/nuxt.config.js b/nuxt.config.js new file mode 100644 index 0000000..c70e98b --- /dev/null +++ b/nuxt.config.js @@ -0,0 +1,232 @@ +import { execSync } from 'child_process' +import webpack from 'webpack' + +const hooks = (nuxtConfig) => ({ + 'generate:page': (page) => { + page.html = modifyHtml(page.html) + }, + 'render:route': (url, page, { req, res }) => { + page.html = modifyHtml(page.html) + } +}) + +let hasSourceMaps = '#source-map' +if (process.env.NODE_ENV !== 'development') { + // eslint-disable-next-line no-console + console.log('NODE_ENV', process.env.NODE_ENV) + hasSourceMaps = false +} + +function getCurrentCommit() { + try { + return execSync('git rev-parse HEAD') + .toString() + .trim() + .substr(0, 7) + } catch (e) { + console.error('Failed to get git commit', e.message) + return 'debug' + } +} + +const modifyHtml = (html) => { + return html.replace(/data-n-head=""|data-n-head="true"/g, '') +} + +export default { + target: 'static', + ssr: false, + /* + ** Headers of the page + */ + generate: { + concurrency: 1, + fallback: true + }, + head: { + title: 'Tornado.cash', + meta: [ + { charset: 'utf-8' }, + { + name: 'viewport', + content: 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' + }, + { name: 'theme-color', content: '#000403' }, + { + hid: 'description', + name: 'description', + content: 'Non-custodial Ethereum Privacy solution.' + }, + { + hid: 'og:title', + property: 'og:title', + content: 'Tornado.Cash' + }, + { + hid: 'og:description', + property: 'og:description', + content: 'Non-custodial, trustless, serverless, private transactions on Ethereum network' + }, + { + hid: 'og:url', + property: 'og:url', + content: 'https://tornado.cash' + }, + { + hid: 'og:type', + property: 'og:type', + content: 'website' + }, + { + hid: 'og:image', + property: 'og:image', + content: 'https://tornado.cash/tw.png' + }, + { + hid: 'description', + name: 'description', + content: 'Non-custodial, trustless, serverless, private transactions on Ethereum network' + }, + { + hid: 'keywords', + name: 'keywords', + content: + 'Tornado, Ethereum, ERC20, dapp, smart contract, decentralized, metamask, zksnark, zero knowledge' + } + ], + link: [ + { rel: 'manifest', href: '/manifest.json' }, + { rel: 'shortcut icon', type: 'image/x-icon', href: '/favicon/favicon.ico' }, + { rel: 'apple-touch-icon', href: '/favicon/apple-touch-icon.png' } + ] + }, + /* + ** Customize the progress-bar color + */ + loading: { color: '#94febf', height: '5px', duration: 5000 }, + /* + ** Global CSS + */ + css: ['@/assets/styles/app.scss'], + + /* + ** Plugins to load before mounting the App + */ + plugins: [ + '~/plugins/ipfs.js', + { src: '~plugins/clipboard', ssr: false }, + { src: '~plugins/detectIPFS', ssr: false }, + { src: '~plugins/localStorage', ssr: false }, + { src: '~plugins/preventMultitabs', ssr: false }, + { src: '~plugins/idb', ssr: false }, + { src: '~plugins/vidle', ssr: false }, + { src: '~plugins/sessionStorage', ssr: false }, + '~plugins/numbro/numbro', + '~/plugins/i18n.js' + ], + /* + ** Nuxt.js modules + */ + modules: [ + // Doc: https://buefy.github.io/#/documentation + [ + 'nuxt-buefy', + { + css: false, + materialDesignIcons: false, + defaultIconPack: 'trnd', + defaultModalCanCancel: ['escape', 'button', 'outside'], + customIconPacks: { + trnd: { + sizes: { + default: 'trnd-24px', + 'is-small': null, + 'is-medium': 'trnd-36px', + 'is-large': 'trnd-48px' + }, + iconPrefix: 'trnd-' + } + } + } + ], + '@nuxtjs/eslint-module', + 'nuxt-web3-provider' + ], + router: { + linkActiveClass: '', + linkExactActiveClass: 'is-active' + }, + hooks: hooks(this), + /* + ** Build configuration + */ + build: { + /* + ** You can extend webpack config here + */ + extend(config, ctx) { + if (ctx.isClient) { + config.devtool = hasSourceMaps + } + config.module.rules.push({ + test: /\.bin$/, + use: 'arraybuffer-loader' + }) + }, + plugins: [ + new webpack.IgnorePlugin(/worker_threads/), + new webpack.DefinePlugin({ + 'process.env': JSON.stringify({ + INFURA_KEY: process.env.INFURA_KEY, + ALCHEMY_MAINNET_KEY: process.env.ALCHEMY_MAINNET_KEY, + ALCHEMY_POLYGON_KEY: process.env.ALCHEMY_POLYGON_KEY, + ALCHEMY_OPTIMISM_KEY: process.env.ALCHEMY_OPTIMISM_KEY, + ALCHEMY_ARBITRUM_KEY: process.env.ALCHEMY_ARBITRUM_KEY, + ALCHEMY_GOERLI_KEY: process.env.ALCHEMY_GOERLI_KEY, + WC_BRIDGE: process.env.WC_BRIDGE, + OLD_STORE_NAME: process.env.OLD_STORE_NAME, + STORE_NAME: process.env.STORE_NAME, + APP_ENS_NAME: process.env.APP_ENS_NAME + }) + }) + ], + html: { + minify: { + collapseWhitespace: true, // as @dario30186 mentioned + removeComments: true // 👈 add this line + } + }, + loaders: { + fontUrl: { limit: 25000 }, + imgUrl: { limit: 15000 } + }, + splitChunks: { + layouts: false, + pages: false, + commons: false + } + }, + buildModules: [ + [ + '@nuxtjs/moment', + { + defaultLocale: 'en', + locales: ['ru', 'zh-cn', 'fr', 'es', 'tr', 'uk'] + } + ] + ], + env: { + commit: getCurrentCommit() + }, + + provider: { + rpcUrl: `https://mainnet.infura.io/v3/${process.env.INFURA_KEY}` + }, + + // todo make custom loading page + loadingIndicator: { + name: 'circle', + color: '#94febf', + background: '#000' + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ce57be0 --- /dev/null +++ b/package.json @@ -0,0 +1,92 @@ +{ + "name": "tornadocash-classic-ui", + "version": "1.0.0", + "description": "Private ethereum transactions", + "author": "Tornado Cash Team", + "scripts": { + "lint": "eslint --ext .js,.vue --ignore-path .gitignore .", + "precommit": "yarn lint", + "test": "jest", + "dev": "NODE_OPTIONS='--max-old-space-size=8192' nuxt", + "build": "nuxt build", + "start": "nuxt start", + "update:encrypted": "node --experimental-json-modules updateEncryptedEvents.js", + "update:common": "node --experimental-json-modules updateEvents.js", + "update:zip": "node updateZip.js", + "updateCache": "yarn update:encrypted && yarn update:common && yarn update:zip", + "generate": "NODE_OPTIONS='--max-old-space-size=8192' nuxt generate && cp dist/404.html dist/ipfs-404.html", + "ipfsUpload": "node ipfsUpload.js", + "deploy-ipfs": "yarn generate && yarn ipfsUpload" + }, + "dependencies": { + "@apollo/client": "^3.3.20", + "@ensdomains/ensjs": "^2.1.0", + "@metamask/onboarding": "^1.0.0", + "@nuxtjs/moment": "^1.6.0", + "@ticket721/e712": "^0.4.1", + "@walletconnect/web3-provider": "1.7.7", + "ajv": "^6.10.2", + "arraybuffer-loader": "^1.0.8", + "base-path-converter": "^1.0.2", + "bignumber.js": "^9.0.0", + "bloomfilter.js": "^1.0.2", + "circomlibjs": "0.1.2", + "crypto": "^1.0.1", + "dotenv": "^8.2.0", + "eth-ens-namehash": "^2.0.8", + "eth-sig-util": "^2.5.3", + "file-saver": "^2.0.5", + "fixed-merkle-tree": "^0.7.3", + "form-data": "^3.0.0", + "gas-price-oracle": "^0.4.6", + "graphql": "^15.5.1", + "idb": "^6.0.0", + "jspdf": "^1.5.3", + "jszip": "^3.5.0", + "node-fetch": "^2.6.1", + "numbro": "^2.3.2", + "nuxt": "2.14.7", + "nuxt-buefy": "^0.4.10", + "nuxt-web3-provider": "0.1.4", + "push-dir": "^0.4.1", + "recursive-fs": "^2.1.0", + "snarkjs": "git+https://github.com/tornadocash/snarkjs.git#869181cfaf7526fe8972073d31655493a04326d5", + "v-idle": "^0.2.0", + "vue-clipboard2": "^0.3.1", + "vue-i18n": "^8.15.4", + "vuex-persistedstate": "^2.7.0", + "web3": "1.5.2", + "websnark": "git+https://github.com/tornadocash/websnark.git#4c0af6a8b65aabea3c09f377f63c44e7a58afa6d" + }, + "devDependencies": { + "@nuxtjs/eslint-config": "^1.1.2", + "@nuxtjs/eslint-module": "^1.1.0", + "@vue/test-utils": "^1.0.0-beta.27", + "axios": "^0.19.0", + "babel-cli": "^6.26.0", + "babel-core": "7.0.0-bridge.0", + "babel-eslint": "^10.0.3", + "babel-jest": "^24.9.0", + "babel-preset-es2015": "^6.24.1", + "eslint": "^6.6.0", + "eslint-config-prettier": "^6.7.0", + "eslint-config-standard": ">=14.1.0", + "eslint-plugin-import": ">=2.18.2", + "eslint-plugin-jest": ">=23.0.4", + "eslint-plugin-node": ">=10.0.0", + "eslint-plugin-nuxt": ">=0.5.0", + "eslint-plugin-prettier": "^3.1.1", + "eslint-plugin-promise": ">=4.2.1", + "eslint-plugin-standard": ">=4.0.1", + "eslint-plugin-vue": "^6.0.1", + "jest": "^24.9.0", + "node-stream-zip": "^1.15.0", + "nodemon": "^2.0.0", + "prettier": "^1.19.1", + "raw-loader": "^3.1.0", + "sass": "^1.49.9", + "sass-loader": "^8.0.0", + "vue-jest": "^3.0.5", + "zip-local": "^0.3.4" + } +} diff --git a/pages/451.vue b/pages/451.vue new file mode 100644 index 0000000..77c779d --- /dev/null +++ b/pages/451.vue @@ -0,0 +1,11 @@ + + + diff --git a/pages/account.vue b/pages/account.vue new file mode 100644 index 0000000..49cbcc8 --- /dev/null +++ b/pages/account.vue @@ -0,0 +1,13 @@ + + + diff --git a/pages/compliance.vue b/pages/compliance.vue new file mode 100644 index 0000000..ff1cdde --- /dev/null +++ b/pages/compliance.vue @@ -0,0 +1,539 @@ + + + diff --git a/pages/governance.vue b/pages/governance.vue new file mode 100644 index 0000000..31e4df2 --- /dev/null +++ b/pages/governance.vue @@ -0,0 +1,43 @@ + + + diff --git a/pages/governance/_id.vue b/pages/governance/_id.vue new file mode 100644 index 0000000..44d5cc3 --- /dev/null +++ b/pages/governance/_id.vue @@ -0,0 +1,55 @@ + + + diff --git a/pages/governance/create.vue b/pages/governance/create.vue new file mode 100644 index 0000000..6065eea --- /dev/null +++ b/pages/governance/create.vue @@ -0,0 +1,23 @@ + + + diff --git a/pages/governance/index.vue b/pages/governance/index.vue new file mode 100644 index 0000000..2cbc3ed --- /dev/null +++ b/pages/governance/index.vue @@ -0,0 +1,19 @@ + + + diff --git a/pages/index.vue b/pages/index.vue new file mode 100644 index 0000000..c981668 --- /dev/null +++ b/pages/index.vue @@ -0,0 +1,118 @@ + + diff --git a/plugins/README.md b/plugins/README.md new file mode 100644 index 0000000..ca1f9d8 --- /dev/null +++ b/plugins/README.md @@ -0,0 +1,7 @@ +# PLUGINS + +**This directory is not required, you can delete it if you don't want to use it.** + +This directory contains Javascript plugins that you want to run before mounting the root Vue.js application. + +More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/plugins). diff --git a/plugins/clipboard.js b/plugins/clipboard.js new file mode 100644 index 0000000..8ce0d97 --- /dev/null +++ b/plugins/clipboard.js @@ -0,0 +1,4 @@ +import Vue from 'vue' +import VueClipboard from 'vue-clipboard2' + +Vue.use(VueClipboard) diff --git a/plugins/detectIPFS.js b/plugins/detectIPFS.js new file mode 100644 index 0000000..ecee982 --- /dev/null +++ b/plugins/detectIPFS.js @@ -0,0 +1,25 @@ +/* eslint-disable no-console */ +export default ({ store, isHMR, app }, inject) => { + inject('isLoadedFromIPFS', main) +} +function main() { + const domainWhiteList = [ + 'tornado.cash', + 'localhost:3000', + 'stage.tornado.cash', + 'tornadocash.eth', + 'tornadocash.eth.link', + 'tornadocash.eth.limo', + 'app.tornado.cash', + 'donotshare.tornado.cash' + ] + + if (window.location.host.includes('tornadocash.netlify.app')) { + return false + } else if (!domainWhiteList.includes(window.location.host)) { + console.warn('The page has been loaded from ipfs.io. LocalStorage is disabled') + return true + } + + return false +} diff --git a/plugins/i18n.js b/plugins/i18n.js new file mode 100644 index 0000000..9314a60 --- /dev/null +++ b/plugins/i18n.js @@ -0,0 +1,173 @@ +import Vue from 'vue' +import VueI18n from 'vue-i18n' +import messages from '../langs/index' +import { LOCALES_NAMES } from '@/constants' + +Vue.use(VueI18n) + +let lang = 'en' + +if (process.browser) { + const locale = localStorage.getItem('lang') || navigator.language.substr(0, 2).toLowerCase() + lang = !messages[locale] ? 'en' : locale +} + +const dateTimeFormats = { + en: { + long: { + year: 'numeric', + month: 'long', + day: 'numeric', + weekday: 'long', + hour: 'numeric', + minute: 'numeric', + hour12: true + } + }, + es: { + long: { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: 'numeric', + minute: 'numeric' + } + }, + fr: { + long: { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: 'numeric', + minute: 'numeric' + } + }, + ru: { + long: { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: 'numeric', + minute: 'numeric' + } + }, + tr: { + long: { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: 'numeric', + minute: 'numeric' + } + }, + uk: { + long: { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: 'numeric', + minute: 'numeric' + } + }, + zh: { + long: { + year: 'numeric', + month: 'long', + day: 'numeric', + weekday: 'long', + hour: 'numeric', + minute: 'numeric', + hour12: true + } + } +} + +const numberFormats = { + en: { + compact: { + notation: 'compact' + } + }, + es: { + compact: { + notation: 'compact' + } + }, + fr: { + compact: { + notation: 'compact' + } + }, + ru: { + compact: { + notation: 'compact' + } + }, + tr: { + compact: { + notation: 'compact' + } + }, + uk: { + compact: { + notation: 'compact' + } + }, + zh: { + compact: { + notation: 'compact' + } + } +} + +function slavicPluralization(choice, choicesLength) { + /** + * @param choice {number} a choice index given by the input to $tc: `$tc('path.to.rule', choiceIndex)` + * @param choicesLength {number} an overall amount of available choices + * @returns a final choice index to select plural word by + */ + + if (choice === 0) { + return 0 + } + + const teen = choice > 10 && choice < 20 + const endsWithOne = choice % 10 === 1 + + if (choicesLength < 4) { + return !teen && endsWithOne ? 1 : 2 + } + if (!teen && endsWithOne) { + return 1 + } + if (!teen && choice % 10 >= 2 && choice % 10 <= 4) { + return 2 + } + + return choicesLength < 4 ? 2 : 3 +} + +const pluralizationRules = { + ru: slavicPluralization, + uk: slavicPluralization +} + +// Create VueI18n instance with options +export default ({ app, route, store }) => { + app.i18n = new VueI18n({ + locale: lang, + fallbackLocale: 'en', + messages, + silentFallbackWarn: true, + dateTimeFormats, + numberFormats, + pluralizationRules + }) + + if (lang === 'zh') { + lang += '-cn' + } + + app.$moment.locale(lang) + app.$numbro.setLanguage(LOCALES_NAMES[lang]) +} diff --git a/plugins/idb.js b/plugins/idb.js new file mode 100644 index 0000000..e9c5389 --- /dev/null +++ b/plugins/idb.js @@ -0,0 +1,283 @@ +import { openDB, deleteDB } from 'idb' + +import networkConfig from '@/networkConfig' +import { INDEX_DB_ERROR, NETWORKS } from '@/constants' + +// TODO method for migration, remove indexed +class IndexedDB { + constructor({ stores, dbName }) { + this.dbExists = false + this.isBlocked = false + + this.options = { + upgrade(db) { + Object.values(db.objectStoreNames).forEach((value) => { + db.deleteObjectStore(value) + }) + + stores.forEach(({ name, keyPath, indexes }) => { + const store = db.createObjectStore(name, { + keyPath, + autoIncrement: true + }) + + if (Array.isArray(indexes)) { + indexes.forEach(({ name, unique = false }) => { + store.createIndex(name, name, { unique }) + }) + } + }) + } + } + + this.dbName = dbName + } + + async initDB() { + try { + if (this.dbExists) { + return + } + + this.db = await openDB(this.dbName, 31, this.options) // version (optional): Schema version, or undefined to open the current version. + this.onEventHandler() + + this.dbExists = true + } catch (err) { + // need for private mode firefox browser + if (err.message.includes(INDEX_DB_ERROR)) { + this.isBlocked = true + return + } + + if (err.message.includes('less than the existing version')) { + await this._removeExist() + } + + console.error(`Method initDB has error: ${err.message}`) + } + } + + onEventHandler() { + this.db.addEventListener('onupgradeneeded', async () => { + await this._removeExist() + }) + } + + async _removeExist() { + await deleteDB(this.dbName) + this.dbExists = false + + await this.initDB() + } + + async getFromIndex(params) { + if (this.isBlocked) { + return + } + + try { + return await this._getFromIndex(params) + } catch (err) { + return undefined + } + } + + async _getFromIndex({ storeName, indexName, key }) { + try { + const value = await this.db.getFromIndex(storeName, indexName, key) + return value + } catch (err) { + throw new Error(`Method getFromIndex has error: ${err.message}`) + } + } + + async getAllFromIndex(params) { + if (this.isBlocked) { + return [] + } + + try { + return await this._getAllFromIndex(params) + } catch (err) { + return [] + } + } + + async _getAllFromIndex({ storeName, indexName, key, count }) { + try { + const value = await this.db.getAllFromIndex(storeName, indexName, key, count) + return value + } catch (err) { + throw new Error(`Method getAllFromIndex has error: ${err.message}`) + } + } + + async getItem({ storeName, key }) { + try { + const store = this.db.transaction(storeName).objectStore(storeName) + + const value = await store.get(key) + return value + } catch (err) { + throw new Error(`Method getItem has error: ${err.message}`) + } + } + + async addItem({ storeName, data, key = '' }) { + try { + const tx = this.db.transaction(storeName, 'readwrite') + const isExist = await tx.objectStore(storeName).get(key) + + if (!isExist) { + await tx.objectStore(storeName).add(data) + } + } catch (err) { + throw new Error(`Method addItem has error: ${err.message}`) + } + } + + async putItem({ storeName, data }) { + try { + const tx = this.db.transaction(storeName, 'readwrite') + await tx.objectStore(storeName).put(data) + } catch (err) { + throw new Error(`Method putItem has error: ${err.message}`) + } + } + + async getAll({ storeName }) { + try { + const tx = this.db.transaction(storeName, 'readonly') + const store = tx.objectStore(storeName) + + const data = await store.getAll() + return data + } catch (err) { + throw new Error(`Method getAll has error: ${err.message}`) + } + } + + async clearStore({ storeName, mode = 'readwrite' }) { + try { + const tx = this.db.transaction(storeName, mode) + + await tx.objectStore(storeName).clear() + } catch (err) { + throw new Error(`Method clearStore has error: ${err.message}`) + } + } + + async createTransactions({ storeName, data, mode = 'readwrite' }) { + try { + const tx = this.db.transaction(storeName, mode) + + await tx.objectStore(storeName).add(data) + await tx.done + } catch (err) { + throw new Error(`Method createTransactions has error: ${err.message}`) + } + } + + createMultipleTransactions({ storeName, data, index, mode = 'readwrite' }) { + try { + const tx = this.db.transaction(storeName, mode) + + data.map((item) => { + if (item) { + tx.store.put({ ...item, ...index }) + } + }) + } catch (err) { + throw new Error(`Method createMultipleTransactions has error: ${err.message}`) + } + } +} + +export default async (ctx, inject) => { + const DEPOSIT_INDEXES = [ + { name: 'instance', unique: false }, + { name: 'transactionHash', unique: false }, + { name: 'commitment', unique: true } + ] + const WITHDRAWAL_INDEXES = [ + { name: 'instance', unique: false }, + { name: 'nullifierHash', unique: true } // keys on which the index is created + ] + const LAST_EVENT_INDEXES = [{ name: 'name', unique: false }] + + // TODO: generate from config + const defaultState = [ + { + name: 'encrypted_events', + keyPath: 'transactionHash' + }, + { + name: 'withdrawals', + keyPath: 'transactionHash', + indexes: WITHDRAWAL_INDEXES + }, + { + name: 'lastEvents', + keyPath: 'name', + indexes: LAST_EVENT_INDEXES + } + ] + + const stores = [ + { + name: 'register_events', + keyPath: 'ensName' + } + ] + + NETWORKS.forEach((netId) => { + defaultState.map((item) => { + stores.push({ + ...item, + name: `${item.name}_${netId}` + }) + }) + }) + + Object.keys(networkConfig).forEach((key) => { + const { tokens, nativeCurrency } = networkConfig[key] + + const netId = key.replace('netId', '') + + Object.keys(tokens).forEach((token) => { + Object.keys(tokens[token].instanceAddress).forEach((amount) => { + if (nativeCurrency === token) { + // ToDo make good) + stores.push({ + name: `stringify_bloom_${token}_${amount}_${netId}`, + keyPath: 'hashBloom' + }) + } + + stores.push({ + name: `deposits_${token}_${amount}_${netId}`, + keyPath: 'leafIndex', // the key by which it refers to the object must be in all instances of the storage + indexes: DEPOSIT_INDEXES + }) + + stores.push({ + name: `stringify_tree_${token}_${amount}_${netId}`, + keyPath: 'hashTree' + }) + }) + }) + }) + + const options = { + stores, + dbName: 'tornado_cash' + } + + const instance = new IndexedDB(options) + + await instance.initDB() + + ctx.$indexedDB = instance + inject('indexedDB', instance) +} diff --git a/plugins/ipfs.js b/plugins/ipfs.js new file mode 100644 index 0000000..53ebd43 --- /dev/null +++ b/plugins/ipfs.js @@ -0,0 +1,17 @@ +/* eslint-disable camelcase, no-undef */ +export default (context, inject) => { + const ipfsPathRegExp = /^(\/(?:ipfs|ipns)\/[^/]+)/ + const ipfsPathPrefix = (window.location.pathname.match(ipfsPathRegExp) || [])[1] || '' + + console.log('plugin __webpack_public_path__', __webpack_public_path__) + + if (ipfsPathPrefix) { + __webpack_public_path__ = ipfsPathPrefix + '/_nuxt/' + + if (typeof window !== 'undefined') { + context.app.router.history.base = ipfsPathPrefix || window.location.host + } + } + + console.log('plugin __webpack_public_path__', __webpack_public_path__) +} diff --git a/plugins/localStorage.js b/plugins/localStorage.js new file mode 100644 index 0000000..47aeb41 --- /dev/null +++ b/plugins/localStorage.js @@ -0,0 +1,36 @@ +/* eslint-disable no-console */ +// ~/plugins/localStorage.js +import createPersistedState from 'vuex-persistedstate' + +import { isStorageAvailable } from '@/utils' + +const { OLD_STORE_NAME, STORE_NAME = 'tornadoClassicV2' } = process.env + +function migrate() { + if (isStorageAvailable('localStorage') && OLD_STORE_NAME !== STORE_NAME) { + const oldStore = localStorage[OLD_STORE_NAME] + if (oldStore) { + localStorage.setItem(STORE_NAME, oldStore) + localStorage.removeItem(OLD_STORE_NAME) + } + } +} + +export default ({ store, isHMR }) => { + if (isHMR) { + return + } + + const paths = ['metamask.netId', 'application.selectedStatistic', 'application.selectedInstance'] + + if (!store.$isLoadedFromIPFS()) { + paths.push('txHashKeeper', 'settings', 'account', 'relayer.jobs', 'encryptedNote.ui') + } + + migrate() + + createPersistedState({ + key: STORE_NAME, + paths + })(store) +} diff --git a/plugins/numbro/languages/index.js b/plugins/numbro/languages/index.js new file mode 100644 index 0000000..f3a1026 --- /dev/null +++ b/plugins/numbro/languages/index.js @@ -0,0 +1,5 @@ +import ru from './ru' +import uk from './uk' +import zh from './zh' + +export const locales = [ru, uk, zh] diff --git a/plugins/numbro/languages/ru.js b/plugins/numbro/languages/ru.js new file mode 100644 index 0000000..5df42b6 --- /dev/null +++ b/plugins/numbro/languages/ru.js @@ -0,0 +1,53 @@ +module.exports = { + languageTag: 'ru-RU', + delimiters: { + thousands: ' ', + decimal: ',' + }, + abbreviations: { + thousand: 'k', + million: 'm', + billion: 'b', + trillion: 't' + }, + ordinal() { + // not ideal, but since in Russian it can taken on + // different forms (masculine, feminine, neuter) + // this is all we can do + return '.' + }, + currency: { + symbol: 'руб.', + position: 'postfix', + code: 'RUB' + }, + currencyFormat: { + thousandSeparated: true, + totalLength: 4, + spaceSeparated: true, + average: true + }, + formats: { + fourDigits: { + totalLength: 4, + spaceSeparated: true, + average: true + }, + fullWithTwoDecimals: { + output: 'currency', + mantissa: 2, + spaceSeparated: true, + thousandSeparated: true + }, + fullWithTwoDecimalsNoCurrency: { + mantissa: 2, + thousandSeparated: true + }, + fullWithNoDecimals: { + output: 'currency', + spaceSeparated: true, + thousandSeparated: true, + mantissa: 0 + } + } +} diff --git a/plugins/numbro/languages/uk.js b/plugins/numbro/languages/uk.js new file mode 100644 index 0000000..ddbffd3 --- /dev/null +++ b/plugins/numbro/languages/uk.js @@ -0,0 +1,53 @@ +module.exports = { + languageTag: 'uk-UA', + delimiters: { + thousands: ' ', + decimal: ',' + }, + abbreviations: { + thousand: 'k', + million: 'm', + billion: 'b', + trillion: 't' + }, + ordinal: () => { + // not ideal, but since in Ukrainian it can taken on + // different forms (masculine, feminine, neuter) + // this is all we can do + return '' + }, + currency: { + symbol: '\u20B4', + position: 'postfix', + code: 'UAH' + }, + currencyFormat: { + thousandSeparated: true, + totalLength: 4, + spaceSeparated: true, + average: true + }, + formats: { + fourDigits: { + totalLength: 4, + spaceSeparated: true, + average: true + }, + fullWithTwoDecimals: { + output: 'currency', + mantissa: 2, + spaceSeparated: true, + thousandSeparated: true + }, + fullWithTwoDecimalsNoCurrency: { + mantissa: 2, + thousandSeparated: true + }, + fullWithNoDecimals: { + output: 'currency', + spaceSeparated: true, + thousandSeparated: true, + mantissa: 0 + } + } +} diff --git a/plugins/numbro/languages/zh.js b/plugins/numbro/languages/zh.js new file mode 100644 index 0000000..5ebac49 --- /dev/null +++ b/plugins/numbro/languages/zh.js @@ -0,0 +1,47 @@ +module.exports = { + languageTag: 'zh-CN', + delimiters: { + thousands: ',', + decimal: '.' + }, + abbreviations: { + thousand: '千', + million: '百万', + billion: '十亿', + trillion: '兆' + }, + ordinal() { + return '.' + }, + currency: { + symbol: '¥', + position: 'prefix', + code: 'CNY' + }, + currencyFormat: { + thousandSeparated: true, + totalLength: 4, + spaceSeparated: true, + average: true + }, + formats: { + fourDigits: { + totalLength: 4, + spaceSeparated: true, + average: true + }, + fullWithTwoDecimals: { + thousandSeparated: true, + mantissa: 2 + }, + fullWithTwoDecimalsNoCurrency: { + mantissa: 2, + thousandSeparated: true + }, + fullWithNoDecimals: { + output: 'currency', + thousandSeparated: true, + mantissa: 0 + } + } +} diff --git a/plugins/numbro/numbro.js b/plugins/numbro/numbro.js new file mode 100644 index 0000000..b62956a --- /dev/null +++ b/plugins/numbro/numbro.js @@ -0,0 +1,10 @@ +import numbro from 'numbro' +import { locales } from './languages' + +export default (ctx, inject) => { + locales.forEach((lang) => { + numbro.registerLanguage(lang) + }) + ctx.$numbro = numbro + inject('numbro', numbro) +} diff --git a/plugins/preventMultitabs.js b/plugins/preventMultitabs.js new file mode 100644 index 0000000..81f0b61 --- /dev/null +++ b/plugins/preventMultitabs.js @@ -0,0 +1,36 @@ +/* eslint-disable no-console */ +export default ({ store, isHMR, app }, inject) => { + inject('preventMultitabs', main) +} +function main(store) { + const id = Date.now() + window.id = id + window.localStorage.setItem('firstTab', id) + + const onLocalStorageEvent = function(e) { + // the second tab will write its id to this key. The first one will notice it + if (e.key === 'firstTab') { + const newID = Date.now() + console.log('Another tab detected. Setting the new page id', newID) + setTimeout(() => { + window.localStorage.secondTab = newID // this is going to be a message for the second tab + }, 200) + } + + // the second tab proccesses the message + if (e.key === 'secondTab' && window.id.toString() === window.localStorage.firstTab) { + console.log('There is another tab that already opened. We will close this one') + window.multipleTabsDetected = true + window.onbeforeunload = null + window.alert( + 'Multiple tabs opened. Your page will be closed. Please only use single instance of https://tornado.cash' + ) + window.location = 'https://twitter.com/tornadocash' + } + } + + // this event will only trigger when a window other than itself makes changes to local storage. + setTimeout(() => { + window.addEventListener('storage', onLocalStorageEvent, false) + }, 100) +} diff --git a/plugins/sessionStorage.js b/plugins/sessionStorage.js new file mode 100644 index 0000000..4c7298d --- /dev/null +++ b/plugins/sessionStorage.js @@ -0,0 +1,76 @@ +import { soliditySha3 } from 'web3-utils' + +let isSessionStorageEnabled = null + +try { + window.sessionStorage.setItem('test', 'test') + window.sessionStorage.removeItem('test') + isSessionStorageEnabled = true +} catch (e) { + isSessionStorageEnabled = false +} + +const setItem = (key, value) => { + if (isSessionStorageEnabled) { + window.sessionStorage.setItem( + soliditySha3(key), + JSON.stringify({ + data: value, + timeStamp: Date.now() + }) + ) + } +} + +const getItem = (key) => { + if (isSessionStorageEnabled) { + const value = window.sessionStorage.getItem(soliditySha3(key)) + + try { + return JSON.parse(String(value)) + } catch (err) { + return value + } + } + return undefined +} + +const removeItem = (key) => { + if (isSessionStorageEnabled) { + return window.sessionStorage.removeItem(soliditySha3(key)) + } +} + +const clear = () => { + if (isSessionStorageEnabled) { + window.sessionStorage.clear() + } +} + +const subscribe = (key, originalListener) => { + const listener = (event) => { + if (event.storageArea === window.sessionStorage && event.key === key) { + originalListener(event.newValue, event.oldValue) + } + } + window.addEventListener('storage', listener, false) + return listener +} + +const unsubscribe = (listener) => { + window.removeEventListener('storage', listener, false) +} + +export default (ctx, inject) => { + const sessionStorage = { + setItem, + getItem, + removeItem, + clear, + subscribe, + unsubscribe + } + + ctx.$sessionStorage = sessionStorage + inject('sessionStorage', sessionStorage) +} diff --git a/plugins/vidle.js b/plugins/vidle.js new file mode 100644 index 0000000..7e3c28a --- /dev/null +++ b/plugins/vidle.js @@ -0,0 +1,4 @@ +import Vue from 'vue' +import Vidle from 'v-idle' + +Vue.use(Vidle) diff --git a/services/bloom.js b/services/bloom.js new file mode 100644 index 0000000..8a00da1 --- /dev/null +++ b/services/bloom.js @@ -0,0 +1,83 @@ +import BloomFilter from 'bloomfilter.js' + +import { download } from '@/store/snark' + +class BloomService { + constructor({ amount, commitment, instanceName, fileName, fileFolder }) { + this.amount = amount + this.fileFolder = fileFolder + this.commitment = commitment + this.instanceName = instanceName + this.fileName = `${fileFolder}/${fileName}` + + this.idb = window.$nuxt.$indexedDB + } + + async downloadBloom() { + const cachedBloom = await download({ + name: this.fileName, + contentType: 'string', + eventName: this.fileFolder + }) + + if (!cachedBloom) { + throw new Error('Cant download file') + } + + return BloomFilter.deserialize(cachedBloom) + } + + async getBloomFromDB() { + try { + const stringifyCachedBloom = await this.idb.getAll({ + storeName: `stringify_bloom_${this.instanceName}` + }) + + if (!stringifyCachedBloom || !stringifyCachedBloom.length) { + return undefined + } + + const [{ tree }] = stringifyCachedBloom + + return BloomFilter.deserialize(tree) + } catch (err) { + return undefined + } + } + + async getBloomFromCache() { + try { + const bloom = await this.downloadBloom() + await this.saveBloom({ bloom }) + + return bloom + } catch (err) { + return false + } + } + + async checkBloom() { + let cachedBloom = await this.getBloomFromDB() + if (!cachedBloom) { + cachedBloom = await this.getBloomFromCache() + } + return cachedBloom.test(this.commitment) + } + + async saveBloom({ bloom }) { + try { + await this.idb.putItem({ + storeName: `stringify_bloom_${this.instanceName}`, + data: { + hashBloom: '1', // need for replace bloom + tree: bloom.serialize() + }, + key: 'hashBloom' + }) + } catch (err) { + console.error('saveBloom has error:', err.message) + } + } +} + +export const bloomService = (payload) => new BloomService(payload) diff --git a/services/events.js b/services/events.js new file mode 100644 index 0000000..55e1d9d --- /dev/null +++ b/services/events.js @@ -0,0 +1,398 @@ +import Web3 from 'web3' + +import { graph } from '@/services' +import { download } from '@/store/snark' +import networkConfig from '@/networkConfig' +import InstanceABI from '@/abis/Instance.abi.json' +import { CONTRACT_INSTANCES, eventsType } from '@/constants' +import { sleep, formatEvents, capitalizeFirstLetter } from '@/utils' + +class EventService { + constructor({ netId, amount, currency, factoryMethods }) { + this.idb = window.$nuxt.$indexedDB + + const { nativeCurrency } = networkConfig[`netId${netId}`] + + this.netId = netId + this.amount = amount + this.currency = currency + + this.factoryMethods = factoryMethods + this.contract = this.getContract({ netId, amount, currency }) + + this.isNative = nativeCurrency === this.currency + this.hasCache = this.isNative && (Number(this.netId) === 1 || Number(this.netId) === 56) + } + + getStoreNames(type) { + const instanceName = `${type}s_${this.currency}_${this.amount}` + const storeName = type === eventsType.DEPOSIT ? `${instanceName}_${this.netId}` : `${type}s_${this.netId}` + + return { instanceName, storeName } + } + + async getEvents(type) { + let cachedEvents = await this.getEventsFromDB(type) + + if (!cachedEvents && this.hasCache) { + cachedEvents = await this.getEventsFromCache(type) + } + return cachedEvents + } + async updateEvents(type) { + const { deployedBlock } = networkConfig[`netId${this.netId}`] + + const savedEvents = await this.getEvents(type) + + let fromBlock = deployedBlock + if (savedEvents) { + fromBlock = savedEvents.lastBlock + 1 + } + + const newEvents = await this.getEventsFromBlock({ + type, + fromBlock, + graphMethod: `getAll${capitalizeFirstLetter(type)}s` + }) + + const allEvents = [].concat(savedEvents?.events || [], newEvents?.events || []).sort((a, b) => { + if (a.leafIndex && b.leafIndex) { + return a.leafIndex - b.leafIndex + } + return a.blockNumber - b.blockNumber + }) + + const lastBlock = allEvents[allEvents.length - 1].blockNumber + + this.saveEvents({ events: allEvents, lastBlock, type }) + + return { + events: allEvents, + lastBlock + } + } + async findEvent({ eventName, eventToFind, type }) { + const { storeName } = this.getStoreNames(type) + + let event = await this.idb.getFromIndex({ + storeName, + indexName: eventName, + key: eventToFind + }) + + if (event) { + return event + } + + const savedEvents = await this.getEvents(type) + if (savedEvents) { + event = savedEvents.events.find((event) => event[eventName] === eventToFind) + if (event) { + return event + } + } + + const freshEvents = await this.updateEvents(type) + event = freshEvents && freshEvents?.events.find((event) => event[eventName] === eventToFind) + + return event + } + + getContract({ netId, amount, currency }) { + const config = networkConfig[`netId${netId}`] + const address = config.tokens[currency].instanceAddress[amount] + return this.factoryMethods.getContract(address) + } + + async getEventsFromCache(type) { + try { + const { instanceName } = this.getStoreNames(type) + if (!CONTRACT_INSTANCES.includes(String(this.amount))) { + console.error(`Amount doesn't includes in contract instances`) + return + } + + const module = await download({ + contentType: 'string', + name: `events/${instanceName}.json.zip` + }) + + if (module) { + const events = JSON.parse(module) + + return { + events, + lastBlock: events[events.length - 1].blockNumber + } + } + + return { + events: [], + lastBlock: '' + } + } catch (err) { + return undefined + } + } + + async getEventsFromDB(type) { + try { + const { storeName, instanceName } = this.getStoreNames(type) + + if (this.idb.isBlocked) { + await sleep(500) + return this.getEventsFromDB(type) + } + + const savedEvents = await this.idb.getAll({ storeName }) + + if (!savedEvents || !savedEvents.length) { + return undefined + } + + const event = await this.idb.getFromIndex({ + storeName: `lastEvents_${this.netId}`, + indexName: 'name', + key: instanceName + }) + + return { + events: savedEvents, + lastBlock: event.blockNumber + } + } catch (err) { + return undefined + } + } + + async getStatisticsRpc({ fromBlock, eventsCount }) { + const blockRange = 4950 + const { blockDifference, currentBlockNumber } = await this.getBlocksDiff({ fromBlock }) + + let numberParts = blockDifference === 0 ? 1 : Math.ceil(blockDifference / blockRange) + const part = Math.ceil(blockDifference / numberParts) + + let events = [] + let toBlock = currentBlockNumber + + if (fromBlock < currentBlockNumber) { + for (let i = 0; i < numberParts; i++) { + try { + await sleep(200) + const partOfEvents = await this.getEventsPartFromRpc({ + fromBlock: toBlock - part, + toBlock, + type: eventsType.DEPOSIT + }) + + if (partOfEvents) { + events = events.concat(partOfEvents.events) + if (eventsCount <= events.length) { + break + } + } + toBlock -= part + } catch { + numberParts = numberParts + 1 + } + } + if (eventsCount !== events.length) { + const savedEvents = await this.getEvents(eventsType.DEPOSIT) + events = events.concat(savedEvents?.events || []) + } + } + + return events + } + + async getEventsFromGraph({ fromBlock, methodName }) { + try { + const { events, lastSyncBlock } = await graph[methodName]({ + fromBlock, + netId: this.netId, + amount: this.amount, + currency: this.currency + }) + return { + events, + lastBlock: lastSyncBlock + } + } catch (err) { + return undefined + } + } + + async getBlocksDiff({ fromBlock }) { + const currentBlockNumber = await this.factoryMethods.getBlockNumber() + + return { + currentBlockNumber, + blockDifference: Math.ceil(currentBlockNumber - fromBlock) + } + } + + async getEventsPartFromRpc({ fromBlock, toBlock, type }) { + try { + const events = await this.contract.getPastEvents(capitalizeFirstLetter(type), { + fromBlock, + toBlock + }) + + if (!events?.length) { + return { + events: [], + lastBlock: fromBlock + } + } + return { + events: formatEvents(events, type), + lastBlock: events[events.length - 1].blockNumber + } + } catch (err) { + return undefined + } + } + + async getBatchEventsFromRpc({ fromBlock, type }) { + try { + const blockRange = 4950 + const { blockDifference, currentBlockNumber } = await this.getBlocksDiff({ fromBlock }) + + let numberParts = blockDifference === 0 ? 1 : Math.ceil(blockDifference / blockRange) + const part = Math.ceil(blockDifference / numberParts) + + let events = [] + let toBlock = fromBlock + part + + if (fromBlock < currentBlockNumber) { + if (toBlock >= currentBlockNumber) { + toBlock = 'latest' + numberParts = 1 + } + + for (let i = 0; i < numberParts; i++) { + try { + await sleep(200) + const partOfEvents = await this.getEventsPartFromRpc({ fromBlock, toBlock, type }) + if (partOfEvents) { + events = events.concat(partOfEvents.events) + } + fromBlock = toBlock + toBlock += part + } catch { + numberParts = numberParts + 1 + } + } + if (events.length) { + return { + events, + lastBlock: toBlock === 'latest' ? currentBlockNumber : toBlock + } + } + } + return undefined + } catch (err) { + return undefined + } + } + + async getEventsFromRpc({ fromBlock, type }) { + try { + let events + + if (Number(this.netId) === 56) { + const rpcEvents = await this.getBatchEventsFromRpc({ fromBlock, type }) + events = rpcEvents?.events || [] + } else { + const rpcEvents = await this.getEventsPartFromRpc({ fromBlock, toBlock: 'latest', type }) + events = rpcEvents?.events || [] + } + return events + } catch (err) { + return [] + } + } + + async getEventsFromBlock({ fromBlock, graphMethod, type }) { + try { + // ToDo think about undefined + const graphEvents = await this.getEventsFromGraph({ fromBlock, methodName: graphMethod }) + const lastSyncBlock = fromBlock > graphEvents?.lastBlock ? fromBlock : graphEvents?.lastBlock + const rpcEvents = await this.getEventsFromRpc({ fromBlock: lastSyncBlock, type }) + + const allEvents = [].concat(graphEvents?.events || [], rpcEvents || []) + if (allEvents.length) { + return { + events: allEvents, + lastBlock: allEvents[allEvents.length - 1].blockNumber + } + } + return undefined + } catch (err) { + return undefined + } + } + + async saveEvents({ events, lastBlock, type }) { + try { + if (!events || !events.length || this.idb.isBlocked) { + return + } + + const { instanceName, storeName } = this.getStoreNames(type) + + await this.idb.createMultipleTransactions({ + data: events, + index: { + instance: instanceName + }, + storeName + }) + + await this.idb.putItem({ + data: { + blockNumber: lastBlock, + name: instanceName + }, + storeName: `lastEvents_${this.netId}` + }) + } catch (err) { + console.error('saveEvents has error:', err.message) + } + } +} + +class EventsFactory { + instances = new Map() + + constructor(rpcUrl) { + this.provider = new Web3(rpcUrl).eth + } + + getBlockNumber = () => { + return this.provider.getBlockNumber() + } + + getContract = (address) => { + return new this.provider.Contract(InstanceABI, address) + } + + getService = (payload) => { + const instanceName = `${payload.currency}_${payload.amount}` + if (this.instances.has(instanceName)) { + return this.instances.get(instanceName) + } + + const instance = new EventService({ + ...payload, + factoryMethods: { + getContract: this.getContract, + getBlockNumber: this.getBlockNumber + } + }) + this.instances.set(instanceName, instance) + return instance + } +} + +export { EventsFactory } diff --git a/services/graph.js b/services/graph.js new file mode 100644 index 0000000..dc239d9 --- /dev/null +++ b/services/graph.js @@ -0,0 +1,423 @@ +import { ApolloClient, InMemoryCache, gql } from '@apollo/client/core' + +import { + _META, + GET_DEPOSITS, + GET_STATISTIC, + GET_REGISTERED, + GET_WITHDRAWALS, + GET_NOTE_ACCOUNTS, + GET_ENCRYPTED_NOTES +} from './queries' + +const isEmptyArray = (arr) => !Array.isArray(arr) || !arr.length + +const first = 1000 + +const link = ({ getContext }) => { + const { chainId } = getContext() + return CHAIN_GRAPH_URLS[chainId] +} + +const CHAIN_GRAPH_URLS = { + 1: 'https://api.thegraph.com/subgraphs/name/tornadocash/mainnet-tornado-subgraph', + 5: 'https://api.thegraph.com/subgraphs/name/tornadocash/goerli-tornado-subgraph', + 10: 'https://api.thegraph.com/subgraphs/name/tornadocash/optimism-tornado-subgraph', + 56: 'https://api.thegraph.com/subgraphs/name/tornadocash/bsc-tornado-subgraph', + 100: 'https://api.thegraph.com/subgraphs/name/tornadocash/xdai-tornado-subgraph', + 137: 'https://api.thegraph.com/subgraphs/name/tornadocash/matic-tornado-subgraph', + 42161: 'https://api.thegraph.com/subgraphs/name/tornadocash/arbitrum-tornado-subgraph', + 43114: 'https://api.thegraph.com/subgraphs/name/tornadocash/avalanche-tornado-subgraph' +} + +const defaultOptions = { + query: { + fetchPolicy: 'no-cache', + errorPolicy: 'all' + } +} + +const client = new ApolloClient({ + uri: link, + cache: new InMemoryCache(), + defaultOptions +}) + +const registryClient = new ApolloClient({ + uri: 'https://api.thegraph.com/subgraphs/name/tornadocash/tornado-relayer-registry', + cache: new InMemoryCache(), + defaultOptions +}) + +async function getStatistic({ currency, amount, netId }) { + try { + const { data } = await client.query({ + context: { + chainId: netId + }, + query: gql(GET_STATISTIC), + variables: { + currency, + first: 10, + orderBy: 'index', + orderDirection: 'desc', + amount: String(amount) + } + }) + + if (!data) { + return { + lastSyncBlock: '', + events: [] + } + } + + const { deposits } = data + + const lastSyncBlock = await getMeta({ netId }) + + const events = deposits + .map((e) => ({ + timestamp: e.timestamp, + leafIndex: Number(e.index), + blockNumber: Number(e.blockNumber) + })) + .reverse() + + const [lastEvent] = events.slice(-1) + + return { + lastSyncBlock: lastEvent?.blockNumber >= lastSyncBlock ? lastEvent.blockNumber + 1 : lastSyncBlock, + events + } + } catch { + return { + lastSyncBlock: '', + events: [] + } + } +} + +async function getAllRegisters(fromBlock) { + try { + const relayers = await getRegisters(fromBlock) + + if (!relayers) { + return { lastSyncBlock: '', events: [] } + } + + const lastSyncBlock = await getRegisteredMeta() + + return { lastSyncBlock, events: relayers } + } catch { + return { lastSyncBlock: '', events: [] } + } +} +async function getAllDeposits({ currency, amount, fromBlock, netId }) { + try { + let deposits = [] + + while (true) { + let result = await getDeposits({ currency, amount, fromBlock, netId }) + + if (isEmptyArray(result)) { + break + } + + if (result.length < 900) { + deposits = deposits.concat(result) + break + } + + const [lastEvent] = result.slice(-1) + + result = result.filter((e) => e.blockNumber !== lastEvent.blockNumber) + fromBlock = Number(lastEvent.blockNumber) + + deposits = deposits.concat(result) + } + + if (!deposits) { + return { + lastSyncBlock: '', + events: [] + } + } + + const lastSyncBlock = await getMeta({ netId }) + + const data = deposits.map((e) => ({ + ...e, + leafIndex: Number(e.index), + blockNumber: Number(e.blockNumber) + })) + + const [lastEvent] = data.slice(-1) + + return { + events: data, + lastSyncBlock: lastEvent?.blockNumber >= lastSyncBlock ? lastEvent.blockNumber + 1 : lastSyncBlock + } + } catch { + return { + lastSyncBlock: '', + events: [] + } + } +} + +async function getMeta({ netId }) { + try { + const { data } = await client.query({ + context: { + chainId: netId + }, + query: gql(_META) + }) + + if (!data) { + return undefined + } + + return data._meta.block.number + } catch { + return undefined + } +} + +async function getRegisteredMeta() { + try { + const { data } = await registryClient.query({ + context: { + chainId: 1 + }, + query: gql(_META) + }) + + if (!data) { + return undefined + } + + return data._meta.block.number + } catch { + return undefined + } +} + +async function getRegisters(fromBlock) { + const { data } = await registryClient.query({ + context: { + chainId: 1 + }, + query: gql(GET_REGISTERED), + variables: { first, fromBlock } + }) + + if (!data) { + return [] + } + + return data.relayers +} + +async function getDeposits({ currency, amount, fromBlock, netId }) { + const { data } = await client.query({ + context: { + chainId: netId + }, + query: gql(GET_DEPOSITS), + variables: { currency, amount: String(amount), first, fromBlock } + }) + + if (!data) { + return [] + } + + return data.deposits +} + +async function getAllWithdrawals({ currency, amount, fromBlock, netId }) { + try { + let withdrawals = [] + + while (true) { + let result = await getWithdrawals({ currency, amount, fromBlock, netId }) + + if (isEmptyArray(result)) { + break + } + + if (result.length < 900) { + withdrawals = withdrawals.concat(result) + break + } + + const [lastEvent] = result.slice(-1) + + result = result.filter((e) => e.blockNumber !== lastEvent.blockNumber) + fromBlock = Number(lastEvent.blockNumber) + + withdrawals = withdrawals.concat(result) + } + + if (!withdrawals) { + return { + lastSyncBlock: '', + events: [] + } + } + + const lastSyncBlock = await getMeta({ netId }) + + const data = withdrawals.map((e) => ({ + ...e, + nullifierHash: e.nullifier, + leafIndex: Number(e.index), + blockNumber: Number(e.blockNumber) + })) + + const [lastEvent] = data.slice(-1) + + return { + events: data, + lastSyncBlock: lastEvent?.blockNumber >= lastSyncBlock ? lastEvent.blockNumber + 1 : lastSyncBlock + } + } catch { + return { + lastSyncBlock: '', + events: [] + } + } +} + +async function getWithdrawals({ currency, amount, fromBlock, netId }) { + const { data } = await client.query({ + context: { + chainId: netId + }, + query: gql(GET_WITHDRAWALS), + variables: { currency, amount: String(amount), fromBlock, first } + }) + + if (!data) { + return [] + } + + return data.withdrawals +} + +async function getNoteAccounts({ address, netId }) { + try { + const { data } = await client.query({ + context: { + chainId: netId + }, + query: gql(GET_NOTE_ACCOUNTS), + variables: { address } + }) + + if (!data) { + return { + lastSyncBlock: '', + events: [] + } + } + + const lastSyncBlock = await getMeta({ netId }) + + return { + lastSyncBlock, + events: data.noteAccounts + } + } catch { + return { + lastSyncBlock: '', + events: [] + } + } +} + +async function getAllEncryptedNotes({ fromBlock, netId }) { + try { + let encryptedNotes = [] + + while (true) { + let result = await getEncryptedNotes({ fromBlock, netId }) + + if (isEmptyArray(result)) { + break + } + + if (result.length < 900) { + encryptedNotes = encryptedNotes.concat(result) + break + } + + const [lastEvent] = result.slice(-1) + + result = result.filter((e) => e.blockNumber !== lastEvent.blockNumber) + fromBlock = Number(lastEvent.blockNumber) + + encryptedNotes = encryptedNotes.concat(result) + + if (isEmptyArray(result)) { + break + } + } + + if (!encryptedNotes) { + return { + lastSyncBlock: '', + events: [] + } + } + + const lastSyncBlock = await getMeta({ netId }) + + const data = encryptedNotes.map((e) => ({ + txHash: e.transactionHash, + encryptedNote: e.encryptedNote, + transactionHash: e.transactionHash, + blockNumber: Number(e.blockNumber) + })) + + const [lastEvent] = data.slice(-1) + + return { + events: data, + lastSyncBlock: lastEvent?.blockNumber >= lastSyncBlock ? lastEvent.blockNumber + 1 : lastSyncBlock + } + } catch { + return { + lastSyncBlock: '', + events: [] + } + } +} + +async function getEncryptedNotes({ fromBlock, netId }) { + const { data } = await client.query({ + context: { + chainId: netId + }, + query: gql(GET_ENCRYPTED_NOTES), + variables: { fromBlock, first } + }) + + if (!data) { + return [] + } + + return data.encryptedNotes +} + +export default { + getDeposits, + getStatistic, + getAllDeposits, + getWithdrawals, + getNoteAccounts, + getAllRegisters, + getAllWithdrawals, + getAllEncryptedNotes +} diff --git a/services/index.js b/services/index.js new file mode 100644 index 0000000..3e136c2 --- /dev/null +++ b/services/index.js @@ -0,0 +1,14 @@ +import graph from './graph' + +export * from './mimc' +export * from './bloom' +export * from './registry' +export * from './pedersen' +export * from './merkleTree' +export * from './events' +export { default as graph } from './graph' +export { default as schema } from './schema' +export { default as walletConnectConnector } from './walletConnect' + +// eslint-disable-next-line no-undef +window.graph = graph diff --git a/services/merkleTree.js b/services/merkleTree.js new file mode 100644 index 0000000..0080709 --- /dev/null +++ b/services/merkleTree.js @@ -0,0 +1,197 @@ +import { MerkleTree, PartialMerkleTree } from 'fixed-merkle-tree' + +import { trees } from '@/constants' +import { download } from '@/store/snark' +import networkConfig from '@/networkConfig' +import { mimc, bloomService } from '@/services' + +class MerkleTreeService { + constructor({ netId, amount, currency, commitment, instanceName }) { + this.netId = netId + this.amount = amount + this.currency = currency + this.commitment = commitment + this.instanceName = instanceName + + this.idb = window.$nuxt.$indexedDB + this.bloomService = bloomService({ + amount, + commitment, + instanceName, + fileFolder: 'trees', + fileName: `deposits_${currency}_${amount}_bloom.json.zip` + }) + } + + getFileName(partNumber = trees.PARTS_COUNT) { + return `trees/deposits_${this.currency}_${this.amount}_slice${partNumber}.json.zip` + } + + createTree({ events }) { + const { merkleTreeHeight, emptyElement } = networkConfig[`netId${this.netId}`] + + return new MerkleTree(merkleTreeHeight, events, { + zeroElement: emptyElement, + hashFunction: mimc.hash + }) + } + + async downloadEdge(name) { + const slicedEdge = await download({ + name, + eventName: 'trees', + contentType: 'string' + }) + + if (!slicedEdge) { + throw new Error('Cant download file') + } + + return JSON.parse(slicedEdge) + } + + createPartialTree({ edge, elements }) { + const { emptyElement } = networkConfig[`netId${this.netId}`] + + return new PartialMerkleTree(trees.LEVELS, edge, elements, { + zeroElement: emptyElement, + hashFunction: mimc.hash + }) + } + + async getTreeFromCache() { + try { + const initialEdge = await this.downloadEdge(this.getFileName()) + + const partialTree = this.createPartialTree(initialEdge) + + if (initialEdge.elements.includes(this.commitment)) { + return partialTree + } + + const isCacheHasCommitment = await this.bloomService.checkBloom() + + if (!isCacheHasCommitment) { + return partialTree + } + + let edge + let elements = [] + + for (let i = trees.PARTS_COUNT - 1; i > 0; i--) { + const slicedEdge = await this.downloadEdge(this.getFileName(i)) + + edge = slicedEdge.edge + elements = [].concat(slicedEdge.elements, elements) + + if (slicedEdge.elements.includes(this.commitment)) { + break + } + } + + partialTree.shiftEdge(edge, elements) + + return partialTree + } catch (err) { + return undefined + } + } + + async getTreeFromDB() { + try { + const stringifyCachedTree = await this.idb.getAll({ + storeName: `stringify_tree_${this.instanceName}` + }) + + if (!stringifyCachedTree || !stringifyCachedTree.length) { + return undefined + } + + const [{ tree }] = stringifyCachedTree + const parsedTree = JSON.parse(tree) + const isPartial = '_edgeLeaf' in parsedTree + + const savedTree = isPartial + ? PartialMerkleTree.deserialize(parsedTree, mimc.hash) + : MerkleTree.deserialize(parsedTree, mimc.hash) + + if (isPartial) { + const edgeIndex = savedTree.edgeIndex + const indexOfEvent = savedTree.indexOf(this.commitment) + + // ToDo save edges mapping { edgeIndex, edgeSlice } + if (indexOfEvent === -1 && edgeIndex !== 0) { + const isCacheHasCommitment = await this.bloomService.checkBloom() + + if (isCacheHasCommitment) { + let edge + let elements = [] + + for (let i = trees.PARTS_COUNT; i > 0; i--) { + const slicedEdge = await this.downloadEdge(this.getFileName(i)) + + if (edgeIndex > slicedEdge.edge.edgeIndex) { + edge = slicedEdge.edge + elements = [].concat(slicedEdge.elements, elements) + } + + if (slicedEdge.elements.includes(this.commitment)) { + break + } + } + + savedTree.shiftEdge(edge, elements) + } + } + } + + return savedTree + } catch (err) { + return undefined + } + } + + async getTree() { + const { nativeCurrency } = networkConfig[`netId${this.netId}`] + const hasCache = nativeCurrency === this.currency && Number(this.netId) === 1 + + let cachedTree = await this.getTreeFromDB() + + if (!cachedTree && hasCache) { + cachedTree = await this.getTreeFromCache() + } + return cachedTree + } + + async saveTree({ tree }) { + try { + await this.idb.putItem({ + storeName: `stringify_tree_${this.instanceName}`, + data: { + hashTree: '1', // need for replace tree + tree: tree.toString() + }, + key: 'hashTree' + }) + } catch (err) { + console.error('saveCachedTree has error:', err.message) + } + } +} + +class TreesFactory { + instances = new Map() + + getService = (payload) => { + const instanceName = `${payload.currency}_${payload.amount}` + if (this.instances.has(instanceName)) { + return this.instances.get(instanceName) + } + + const instance = new MerkleTreeService(payload) + this.instances.set(instanceName, instance) + return instance + } +} + +export const treesInterface = new TreesFactory() diff --git a/services/mimc.js b/services/mimc.js new file mode 100644 index 0000000..f744c50 --- /dev/null +++ b/services/mimc.js @@ -0,0 +1,18 @@ +import { buildMimcSponge } from 'circomlibjs' + +class Mimc { + constructor() { + this.sponge = null + this.hash = null + this.initMimc() + } + + async initMimc() { + this.sponge = await buildMimcSponge() + this.hash = (left, right) => this.sponge.F.toString(this.sponge.multiHash([BigInt(left), BigInt(right)])) + } +} + +const mimc = new Mimc() + +export { mimc } diff --git a/services/pedersen.js b/services/pedersen.js new file mode 100644 index 0000000..d49be82 --- /dev/null +++ b/services/pedersen.js @@ -0,0 +1,26 @@ +import { buildPedersenHash } from 'circomlibjs' + +class Pedersen { + constructor() { + this.pedersenHash = null + this.babyJub = null + this.initPedersen() + } + + async initPedersen() { + this.pedersenHash = await buildPedersenHash() + this.babyJub = this.pedersenHash.babyJub + } + + unpackPoint(buffer) { + return this.babyJub.unpackPoint(this.pedersenHash.hash(buffer)) + } + + toStringBuffer(buffer) { + return this.babyJub.F.toString(buffer) + } +} + +const pedersen = new Pedersen() + +export { pedersen } diff --git a/services/queries.js b/services/queries.js new file mode 100644 index 0000000..2a58490 --- /dev/null +++ b/services/queries.js @@ -0,0 +1,92 @@ +export const GET_STATISTIC = ` + query getStatistic($currency: String!, $amount: String!, $first: Int, $orderBy: BigInt, $orderDirection: String) { + deposits(first: $first, orderBy: $orderBy, orderDirection: $orderDirection, where: { currency: $currency, amount: $amount }) { + index + timestamp + blockNumber + } + } +` + +export const GET_WITHDRAWALS = ` + query getWithdrawals($currency: String!, $amount: String!, $first: Int, $fromBlock: Int!) { + withdrawals(first: $first, orderBy: blockNumber, orderDirection: asc, + where: { + currency: $currency, + amount: $amount, + blockNumber_gte: $fromBlock + }) { + id + to + fee + index + nullifier + timestamp + blockNumber + transactionHash + } + } +` + +export const GET_REGISTERED = ` + query getDeposits($first: Int, $fromBlock: Int) { + relayers(first: $first, where: { + blockRegistration_gte: $fromBlock + }) { + address + ensName + ensHash + blockRegistration + } + } +` + +export const GET_DEPOSITS = ` + query getDeposits($currency: String!, $amount: String!, $first: Int, $fromBlock: Int) { + deposits(first: $first, orderBy: index, orderDirection: asc, where: { + amount: $amount, + currency: $currency, + blockNumber_gte: $fromBlock + }) { + id + index + timestamp + commitment + blockNumber + transactionHash + } + } +` + +export const GET_NOTE_ACCOUNTS = ` + query getNoteAccount($address: String!) { + noteAccounts(where: { address: $address }) { + id + index + address + encryptedAccount + } + } +` + +export const GET_ENCRYPTED_NOTES = ` + query getEncryptedNotes($first: Int, $fromBlock: Int) { + encryptedNotes(first: $first, orderBy: blockNumber, orderDirection: asc, where: { blockNumber_gte: $fromBlock }) { + id + index + blockNumber + encryptedNote + transactionHash + } + } +` + +export const _META = ` + query getMeta { + _meta { + block { + number + } + } + } +` diff --git a/services/registry/index.js b/services/registry/index.js new file mode 100644 index 0000000..110169f --- /dev/null +++ b/services/registry/index.js @@ -0,0 +1,201 @@ +import namehash from 'eth-ens-namehash' +import { BigNumber as BN } from 'bignumber.js' +import { toChecksumAddress } from 'web3-utils' + +import { graph } from '@/services' +import networkConfig from '@/networkConfig' +import { REGISTRY_DEPLOYED_BLOCK } from '@/constants' + +import AggregatorABI from '@/abis/Aggregator.abi.json' +import RelayerRegistryABI from '@/abis/RelayerRegistry.abi.json' + +const MIN_STAKE_BALANCE = '0x22B1C8C1227A00000' // 40 TORN + +const subdomains = Object.values(networkConfig).map(({ ensSubdomainKey }) => ensSubdomainKey) + +class RelayerRegister { + constructor(provider) { + this.provider = provider + this.$indexedDB = window.$nuxt.$indexedDB + + const { registryContract, aggregatorContract } = networkConfig.netId1 + + this.aggregator = new this.provider.Contract(AggregatorABI, aggregatorContract) + this.relayerRegistry = new this.provider.Contract(RelayerRegistryABI, registryContract) + } + + fetchEvents = async (fromBlock, toBlock) => { + if (fromBlock <= toBlock) { + try { + const registeredEventsPart = await this.relayerRegistry.getPastEvents('RelayerRegistered', { + fromBlock, + toBlock + }) + + return registeredEventsPart + } catch (error) { + const midBlock = (fromBlock + toBlock) >> 1 + + if (midBlock - fromBlock < 2) { + throw new Error(`error fetching events: ${error.message}`) + } + + const arr1 = await this.fetchEvents(fromBlock, midBlock) + const arr2 = await this.fetchEvents(midBlock + 1, toBlock) + return [...arr1, ...arr2] + } + } + return [] + } + + saveEvents = async ({ events, lastSyncBlock, storeName }) => { + try { + if (this.$indexedDB.isBlocked) { + return + } + + await this.$indexedDB.putItem({ + data: { + blockNumber: lastSyncBlock, + name: storeName + }, + storeName: 'lastEvents_1' + }) + + if (events.length) { + this.$indexedDB.createMultipleTransactions({ data: events, storeName }) + } + } catch (err) { + console.error(`saveEvents has error: ${err.message}`) + } + } + + getCachedData = async () => { + let blockFrom = REGISTRY_DEPLOYED_BLOCK[1] + + try { + const blockTo = await this.provider.getBlockNumber() + + const cachedEvents = await this.$indexedDB.getAll({ + storeName: 'register_events' + }) + + const lastBlock = await this.$indexedDB.getFromIndex({ + indexName: 'name', + key: 'register_events', + storeName: 'lastEvents_1' + }) + + if (lastBlock) { + blockFrom = blockTo >= lastBlock.blockNumber ? lastBlock.blockNumber + 1 : blockTo + } + + return { blockFrom, blockTo, cachedEvents } + } catch { + return { blockFrom, blockTo: 'latest', cachedEvents: [] } + } + } + + fetchRelayers = async () => { + // eslint-disable-next-line prefer-const + let { blockFrom, blockTo, cachedEvents } = await this.getCachedData() + let allRelayers = cachedEvents + + if (blockFrom !== blockTo) { + const registeredRelayersEvents = await graph.getAllRegisters(blockFrom) + + let relayers = { + lastSyncBlock: registeredRelayersEvents.lastSyncBlock, + events: registeredRelayersEvents.events.map((el) => ({ + ensName: el.ensName, + relayerAddress: toChecksumAddress(el.address) + })) + } + + const isGraphLate = relayers.lastSyncBlock && blockTo > Number(relayers.lastSyncBlock) + + if (isGraphLate) { + blockFrom = relayers.lastSyncBlock + } + + if (!relayers.events.length || isGraphLate) { + const multicallEvents = await this.fetchEvents(blockFrom, blockTo) + const eventsRelayers = multicallEvents.map(({ returnValues }) => ({ + ensName: returnValues.ensName, + relayerAddress: returnValues.relayerAddress + })) + + relayers = { + lastSyncBlock: blockTo, + events: relayers.events.concat(eventsRelayers) + } + } + + await this.saveEvents({ storeName: 'register_events', ...relayers }) + allRelayers = allRelayers.concat(relayers.events) + } + + return allRelayers + } + + filterRelayer = (acc, curr, ensSubdomainKey, relayer) => { + const subdomainIndex = subdomains.indexOf(ensSubdomainKey) + + const mainnetSubdomain = curr.records[0] + const hostname = curr.records[subdomainIndex] + const isHostWithProtocol = hostname.includes('http') + + const isOwner = relayer.relayerAddress === curr.owner + const hasMinBalance = new BN(curr.balance).gte(MIN_STAKE_BALANCE) + + if ( + hostname && + isOwner && + mainnetSubdomain && + curr.isRegistered && + hasMinBalance && + !isHostWithProtocol + ) { + acc.push({ + hostname, + ensName: relayer.ensName, + stakeBalance: curr.balance, + relayerAddress: relayer.relayerAddress + }) + } else { + console.error(`${relayer.ensName} invalid: `, { + isOwner, + hasTXT: Boolean(hostname), + isHasMinBalance: hasMinBalance, + isRegistered: curr.isRegistered, + isHostWithoutProtocol: !isHostWithProtocol, + isMainnetSubdomain: Boolean(mainnetSubdomain) + }) + } + + return acc + } + + getValidRelayers = async (relayers, ensSubdomainKey) => { + const relayerNameHashes = relayers.map((r) => namehash.hash(r.ensName)) + + const relayersData = await this.aggregator.methods.relayersData(relayerNameHashes, subdomains).call() + + const validRelayers = relayersData.reduce( + (acc, curr, index) => this.filterRelayer(acc, curr, ensSubdomainKey, relayers[index]), + [] + ) + + return validRelayers + } + + getRelayers = async (ensSubdomainKey) => { + const relayers = await this.fetchRelayers() + + const validRelayers = await this.getValidRelayers(relayers, ensSubdomainKey) + + return validRelayers + } +} + +export const relayerRegisterService = (provider) => new RelayerRegister(provider.eth) diff --git a/services/schema/index.js b/services/schema/index.js new file mode 100644 index 0000000..af2019f --- /dev/null +++ b/services/schema/index.js @@ -0,0 +1,42 @@ +import { toBN } from 'web3-utils' + +import relayerSchemas from './relayer' + +const Ajv = require('ajv') +const ajv = new Ajv({ allErrors: true, schemas: relayerSchemas }) + +ajv.addKeyword('BN', { + validate: (schema, data) => { + try { + toBN(data) + return true + } catch (e) { + return false + } + }, + errors: true +}) + +function getRelayerValidateFunction(netId) { + switch (netId) { + case 56: + return ajv.getSchema('bscRelayer') + case 100: + return ajv.getSchema('xdaiRelayer') + case 137: + return ajv.getSchema('polygonRelayer') + case 43114: + return ajv.getSchema('avalancheRelayer') + + case 10: + case 42161: + return ajv.getSchema('l2Relayer') + + default: + return ajv.getSchema('defaultRelayer') + } +} + +export default { + getRelayerValidateFunction +} diff --git a/services/schema/relayer/avalanche.js b/services/schema/relayer/avalanche.js new file mode 100644 index 0000000..8d8f908 --- /dev/null +++ b/services/schema/relayer/avalanche.js @@ -0,0 +1,44 @@ +import { addressType } from '@/constants' + +const statusSchema = { + type: 'object', + properties: { + rewardAccount: addressType, + instances: { + type: 'object', + properties: { + avax: { + type: 'object', + properties: { + instanceAddress: { + type: 'object', + properties: { + '10': addressType, + '100': addressType, + '500': addressType + }, + required: ['10', '100', '500'] + }, + decimals: { enum: [18] } + }, + required: ['instanceAddress', 'decimals'] + } + }, + required: ['avax'] + }, + netId: { type: 'integer' }, + tornadoServiceFee: { type: 'number', maximum: 20, minimum: 0 }, + health: { + type: 'object', + properties: { + status: { const: 'true' }, + error: { type: 'string' } + }, + required: ['status'] + }, + currentQueue: { type: 'number' } + }, + required: ['rewardAccount', 'instances', 'netId', 'tornadoServiceFee', 'health'] +} + +export { statusSchema } diff --git a/services/schema/relayer/bsc.js b/services/schema/relayer/bsc.js new file mode 100644 index 0000000..63e2ee5 --- /dev/null +++ b/services/schema/relayer/bsc.js @@ -0,0 +1,45 @@ +import { addressType } from '@/constants' + +const statusSchema = { + type: 'object', + properties: { + rewardAccount: addressType, + instances: { + type: 'object', + properties: { + bnb: { + type: 'object', + properties: { + instanceAddress: { + type: 'object', + properties: { + '0.1': addressType, + '1': addressType, + '10': addressType, + '100': addressType + }, + required: ['0.1', '1', '10', '100'] + }, + decimals: { enum: [18] } + }, + required: ['instanceAddress', 'decimals'] + } + }, + required: ['bnb'] + }, + netId: { type: 'integer' }, + tornadoServiceFee: { type: 'number', maximum: 20, minimum: 0 }, + health: { + type: 'object', + properties: { + status: { const: 'true' }, + error: { type: 'string' } + }, + required: ['status'] + }, + currentQueue: { type: 'number' } + }, + required: ['rewardAccount', 'instances', 'netId', 'tornadoServiceFee', 'health'] +} + +export { statusSchema } diff --git a/services/schema/relayer/default.js b/services/schema/relayer/default.js new file mode 100644 index 0000000..0372ba0 --- /dev/null +++ b/services/schema/relayer/default.js @@ -0,0 +1,172 @@ +import { addressType } from '@/constants' + +const statusSchema = { + type: 'object', + properties: { + rewardAccount: addressType, + instances: { + type: 'object', + properties: { + dai: { + type: 'object', + properties: { + instanceAddress: { + type: 'object', + properties: { + '100': addressType, + '1000': addressType, + '10000': addressType, + '100000': addressType + }, + required: ['100', '1000', '10000', '100000'] + }, + tokenAddress: addressType, + symbol: { enum: ['DAI'] }, + decimals: { enum: [18] } + }, + required: ['instanceAddress', 'tokenAddress', 'decimals'] + }, + usdt: { + type: 'object', + properties: { + instanceAddress: { + type: 'object', + properties: { + '100': addressType, + '1000': addressType, + '10000': addressType, + '100000': addressType + }, + required: ['100', '1000'] + }, + tokenAddress: addressType, + symbol: { enum: ['USDT'] }, + decimals: { enum: [6] } + }, + required: ['instanceAddress', 'tokenAddress', 'decimals'] + }, + usdc: { + type: 'object', + properties: { + instanceAddress: { + type: 'object', + properties: { + '100': addressType, + '1000': addressType, + '10000': addressType, + '100000': addressType + }, + required: ['100', '1000'] + }, + tokenAddress: addressType, + symbol: { enum: ['USDC'] }, + decimals: { enum: [6] } + }, + required: ['instanceAddress', 'tokenAddress', 'decimals'] + }, + cdai: { + type: 'object', + properties: { + instanceAddress: { + type: 'object', + properties: { + '5000': addressType, + '50000': addressType, + '500000': addressType, + '5000000': addressType + }, + required: ['5000', '50000', '500000', '5000000'] + }, + tokenAddress: addressType, + symbol: { enum: ['cDAI'] }, + decimals: { enum: [8] } + }, + required: ['instanceAddress', 'tokenAddress', 'decimals'] + }, + wbtc: { + type: 'object', + properties: { + instanceAddress: { + type: 'object', + properties: { + '0.1': addressType, + '1': addressType, + '10': addressType, + '100': addressType + }, + required: ['0.1', '1', '10'] + }, + tokenAddress: addressType, + symbol: { enum: ['WBTC'] }, + decimals: { enum: [8] } + }, + required: ['instanceAddress', 'tokenAddress', 'decimals'] + }, + eth: { + type: 'object', + properties: { + instanceAddress: { + type: 'object', + properties: { + '0.1': addressType, + '1': addressType, + '10': addressType, + '100': addressType + }, + required: ['0.1', '1', '10', '100'] + }, + decimals: { enum: [18] } + }, + required: ['instanceAddress', 'decimals'] + } + }, + required: ['eth'] + }, + gasPrices: { + type: 'object', + properties: { + fast: { type: 'number' }, + additionalProperties: { type: 'number' } + }, + required: ['fast'] + }, + netId: { type: 'integer' }, + ethPrices: { + type: 'object', + properties: { + dai: { type: 'string', BN: true }, + cdai: { type: 'string', BN: true }, + usdc: { type: 'string', BN: true }, + usdt: { type: 'string', BN: true }, + torn: { type: 'string', BN: true }, + wbtc: { type: 'string', BN: true } + }, + required: ['dai', 'cdai', 'usdc', 'usdt', 'torn', 'wbtc'] + }, + tornadoServiceFee: { type: 'number', maximum: 20, minimum: 0 }, + miningServiceFee: { type: 'number', maximum: 20, minimum: 0 }, + latestBlock: { type: 'number' }, + version: { type: 'string' }, + health: { + type: 'object', + properties: { + status: { const: 'true' }, + error: { type: 'string' } + }, + required: ['status'] + }, + currentQueue: { type: 'number' } + }, + required: [ + 'rewardAccount', + 'instances', + 'netId', + 'ethPrices', + 'tornadoServiceFee', + 'miningServiceFee', + 'version', + 'health' + ] +} + +export { statusSchema } diff --git a/services/schema/relayer/index.js b/services/schema/relayer/index.js new file mode 100644 index 0000000..5ed8a86 --- /dev/null +++ b/services/schema/relayer/index.js @@ -0,0 +1,15 @@ +import { statusSchema as l2Relayer } from './l2' +import { statusSchema as bscRelayer } from './bsc' +import { statusSchema as xdaiRelayer } from './xdai' +import { statusSchema as defaultRelayer } from './default' +import { statusSchema as polygonRelayer } from './polygon' +import { statusSchema as avalancheRelayer } from './avalanche' + +export default { + l2Relayer, + bscRelayer, + xdaiRelayer, + defaultRelayer, + polygonRelayer, + avalancheRelayer +} diff --git a/services/schema/relayer/l2.js b/services/schema/relayer/l2.js new file mode 100644 index 0000000..eb0d5fd --- /dev/null +++ b/services/schema/relayer/l2.js @@ -0,0 +1,45 @@ +import { addressType } from '@/constants' + +const statusSchema = { + type: 'object', + properties: { + rewardAccount: addressType, + instances: { + type: 'object', + properties: { + eth: { + type: 'object', + properties: { + instanceAddress: { + type: 'object', + properties: { + '0.1': addressType, + '1': addressType, + '10': addressType, + '100': addressType + }, + required: ['0.1', '1', '10', '100'] + }, + decimals: { enum: [18] } + }, + required: ['instanceAddress', 'decimals'] + } + }, + required: ['eth'] + }, + netId: { type: 'integer' }, + tornadoServiceFee: { type: 'number', maximum: 20, minimum: 0 }, + health: { + type: 'object', + properties: { + status: { const: 'true' }, + error: { type: 'string' } + }, + required: ['status'] + }, + currentQueue: { type: 'number' } + }, + required: ['rewardAccount', 'instances', 'netId', 'tornadoServiceFee', 'health'] +} + +export { statusSchema } diff --git a/services/schema/relayer/polygon.js b/services/schema/relayer/polygon.js new file mode 100644 index 0000000..6464061 --- /dev/null +++ b/services/schema/relayer/polygon.js @@ -0,0 +1,45 @@ +import { addressType } from '@/constants' + +const statusSchema = { + type: 'object', + properties: { + rewardAccount: addressType, + instances: { + type: 'object', + properties: { + matic: { + type: 'object', + properties: { + instanceAddress: { + type: 'object', + properties: { + '100': addressType, + '1000': addressType, + '10000': addressType, + '100000': addressType + }, + required: ['100', '1000', '10000', '100000'] + }, + decimals: { enum: [18] } + }, + required: ['instanceAddress', 'decimals'] + } + }, + required: ['matic'] + }, + netId: { type: 'integer' }, + tornadoServiceFee: { type: 'number', maximum: 20, minimum: 0 }, + health: { + type: 'object', + properties: { + status: { const: 'true' }, + error: { type: 'string' } + }, + required: ['status'] + }, + currentQueue: { type: 'number' } + }, + required: ['rewardAccount', 'instances', 'netId', 'tornadoServiceFee', 'health'] +} + +export { statusSchema } diff --git a/services/schema/relayer/xdai.js b/services/schema/relayer/xdai.js new file mode 100644 index 0000000..0722fd6 --- /dev/null +++ b/services/schema/relayer/xdai.js @@ -0,0 +1,45 @@ +import { addressType } from '@/constants' + +const statusSchema = { + type: 'object', + properties: { + rewardAccount: addressType, + instances: { + type: 'object', + properties: { + xdai: { + type: 'object', + properties: { + instanceAddress: { + type: 'object', + properties: { + '100': addressType, + '1000': addressType, + '10000': addressType, + '100000': addressType + }, + required: ['100', '1000', '10000', '100000'] + }, + decimals: { enum: [18] } + }, + required: ['instanceAddress', 'decimals'] + } + }, + required: ['xdai'] + }, + netId: { type: 'integer' }, + tornadoServiceFee: { type: 'number', maximum: 20, minimum: 0 }, + health: { + type: 'object', + properties: { + status: { const: 'true' }, + error: { type: 'string' } + }, + required: ['status'] + }, + currentQueue: { type: 'number' } + }, + required: ['rewardAccount', 'instances', 'netId', 'tornadoServiceFee', 'health'] +} + +export { statusSchema } diff --git a/services/walletConnect.js b/services/walletConnect.js new file mode 100644 index 0000000..b96757b --- /dev/null +++ b/services/walletConnect.js @@ -0,0 +1,51 @@ +import BN from 'bignumber.js' +import WalletConnectProvider from '@walletconnect/web3-provider' + +import { NETWORKS } from '@/constants' +import networkConfig from '@/networkConfig' + +const { WC_BRIDGE } = process.env + +const WALLET_CONNECT_INTERVAL = 1000 +const SUPPORTED_WALLETS = ['metamask', 'trust', 'imtoken', 'genericWeb3'] + +const RECONNECT_TIME = 3600000 // 1 hour + +const getFirstRpcUrls = (acc, netId) => { + const { rpcUrls } = networkConfig[`netId${netId}`] + const [{ url }] = Object.values(rpcUrls) + + return { ...acc, [netId]: url } +} + +const RPC = NETWORKS.reduce(getFirstRpcUrls, {}) + +const walletConnectConnector = (chainId) => { + try { + const prevConnection = localStorage.getItem('walletconnectTimeStamp') + + if (new BN(Date.now()).minus(prevConnection).isGreaterThanOrEqualTo(RECONNECT_TIME)) { + localStorage.removeItem('walletconnect') + } + + const provider = new WalletConnectProvider({ + chainId, + rpc: RPC, + pollingInterval: WALLET_CONNECT_INTERVAL, + qrcodeModalOptions: { + mobileLinks: SUPPORTED_WALLETS + }, + bridge: WC_BRIDGE + }) + + provider.injectedRequest = provider.enable + + localStorage.setItem('walletconnectTimeStamp', Date.now()) + return provider + } catch (err) { + console.log(err) + throw new Error('WalletConnect error: ', err) + } +} + +export default walletConnectConnector diff --git a/static/451.html b/static/451.html new file mode 100644 index 0000000..c49cb3a --- /dev/null +++ b/static/451.html @@ -0,0 +1,10 @@ + + + + + Unavailable For Legal Reasons + + +

Unavailable For Legal Reasons

+ + \ No newline at end of file diff --git a/static/README.md b/static/README.md new file mode 100644 index 0000000..ba1fb32 --- /dev/null +++ b/static/README.md @@ -0,0 +1,47 @@ +## How to use + +Step 1. Clone repository +``` +git clone https://github.com/tornadocash/ui-minified.git +cd ui-minified +``` +Step 2. Serve the folder with your favorite http server +``` +python3 -m http.server 8080 +``` +Or use any other http web server, such as https://www.npmjs.com/package/http-server + +Step 3. Open your web browser at http://localhost:8080 + +## Running a TOR service + +If you wish to serve tornado cash UI on an .onion domain, there is an easy way to do it using docker-compose. Paste the following into `docker-compose.yml` and run `docker-compose up -d` + +```yaml +version: '2' + +services: + tornado_ui: + image: tornadocash/ui + restart: always + container_name: tornado_ui + watchtower: + image: v2tec/watchtower + restart: always + volumes: + - /var/run/docker.sock:/var/run/docker.sock + command: --interval 60 tornado_ui + tor: + image: strm/tor + restart: always + depends_on: [ tornado_ui ] + environment: + LISTEN_PORT: 80 + REDIRECT: tornado_ui:80 + # Generate a new key with + # docker run --rm --entrypoint shallot strm/tor-hiddenservice-nginx ^torn + PRIVATE_KEY: | + -----BEGIN RSA PRIVATE KEY----- + ... + -----END RSA PRIVATE KEY----- +``` diff --git a/static/events/deposits_bnb_0.1.json.zip b/static/events/deposits_bnb_0.1.json.zip new file mode 100644 index 0000000..3183626 Binary files /dev/null and b/static/events/deposits_bnb_0.1.json.zip differ diff --git a/static/events/deposits_bnb_1.json.zip b/static/events/deposits_bnb_1.json.zip new file mode 100644 index 0000000..f02adc2 Binary files /dev/null and b/static/events/deposits_bnb_1.json.zip differ diff --git a/static/events/deposits_bnb_10.json.zip b/static/events/deposits_bnb_10.json.zip new file mode 100644 index 0000000..7d7a315 Binary files /dev/null and b/static/events/deposits_bnb_10.json.zip differ diff --git a/static/events/deposits_bnb_100.json.zip b/static/events/deposits_bnb_100.json.zip new file mode 100644 index 0000000..0ff7332 Binary files /dev/null and b/static/events/deposits_bnb_100.json.zip differ diff --git a/static/events/deposits_eth_0.1.json.zip b/static/events/deposits_eth_0.1.json.zip new file mode 100644 index 0000000..65313ae Binary files /dev/null and b/static/events/deposits_eth_0.1.json.zip differ diff --git a/static/events/deposits_eth_1.json.zip b/static/events/deposits_eth_1.json.zip new file mode 100644 index 0000000..8ccb0bc Binary files /dev/null and b/static/events/deposits_eth_1.json.zip differ diff --git a/static/events/deposits_eth_10.json.zip b/static/events/deposits_eth_10.json.zip new file mode 100644 index 0000000..949e623 Binary files /dev/null and b/static/events/deposits_eth_10.json.zip differ diff --git a/static/events/deposits_eth_100.json.zip b/static/events/deposits_eth_100.json.zip new file mode 100644 index 0000000..e3ff0fe Binary files /dev/null and b/static/events/deposits_eth_100.json.zip differ diff --git a/static/events/encrypted_notes_1.json.zip b/static/events/encrypted_notes_1.json.zip new file mode 100644 index 0000000..0ed2417 Binary files /dev/null and b/static/events/encrypted_notes_1.json.zip differ diff --git a/static/events/encrypted_notes_5.json.zip b/static/events/encrypted_notes_5.json.zip new file mode 100644 index 0000000..1fc5e33 Binary files /dev/null and b/static/events/encrypted_notes_5.json.zip differ diff --git a/static/events/withdrawals_bnb_0.1.json.zip b/static/events/withdrawals_bnb_0.1.json.zip new file mode 100644 index 0000000..0b1cca6 Binary files /dev/null and b/static/events/withdrawals_bnb_0.1.json.zip differ diff --git a/static/events/withdrawals_bnb_1.json.zip b/static/events/withdrawals_bnb_1.json.zip new file mode 100644 index 0000000..df940ef Binary files /dev/null and b/static/events/withdrawals_bnb_1.json.zip differ diff --git a/static/events/withdrawals_bnb_10.json.zip b/static/events/withdrawals_bnb_10.json.zip new file mode 100644 index 0000000..3c185bc Binary files /dev/null and b/static/events/withdrawals_bnb_10.json.zip differ diff --git a/static/events/withdrawals_bnb_100.json.zip b/static/events/withdrawals_bnb_100.json.zip new file mode 100644 index 0000000..c18f1e3 Binary files /dev/null and b/static/events/withdrawals_bnb_100.json.zip differ diff --git a/static/events/withdrawals_eth_0.1.json.zip b/static/events/withdrawals_eth_0.1.json.zip new file mode 100644 index 0000000..102cce0 Binary files /dev/null and b/static/events/withdrawals_eth_0.1.json.zip differ diff --git a/static/events/withdrawals_eth_1.json.zip b/static/events/withdrawals_eth_1.json.zip new file mode 100644 index 0000000..eee96c6 Binary files /dev/null and b/static/events/withdrawals_eth_1.json.zip differ diff --git a/static/events/withdrawals_eth_10.json.zip b/static/events/withdrawals_eth_10.json.zip new file mode 100644 index 0000000..c027ddd Binary files /dev/null and b/static/events/withdrawals_eth_10.json.zip differ diff --git a/static/events/withdrawals_eth_100.json.zip b/static/events/withdrawals_eth_100.json.zip new file mode 100644 index 0000000..fe6b541 Binary files /dev/null and b/static/events/withdrawals_eth_100.json.zip differ diff --git a/static/favicon/android-chrome-192x192.png b/static/favicon/android-chrome-192x192.png new file mode 100644 index 0000000..3902799 Binary files /dev/null and b/static/favicon/android-chrome-192x192.png differ diff --git a/static/favicon/android-chrome-512x512.png b/static/favicon/android-chrome-512x512.png new file mode 100644 index 0000000..7644ea7 Binary files /dev/null and b/static/favicon/android-chrome-512x512.png differ diff --git a/static/favicon/apple-touch-icon.png b/static/favicon/apple-touch-icon.png new file mode 100644 index 0000000..8a92436 Binary files /dev/null and b/static/favicon/apple-touch-icon.png differ diff --git a/static/favicon/browserconfig.xml b/static/favicon/browserconfig.xml new file mode 100644 index 0000000..6c6fae2 --- /dev/null +++ b/static/favicon/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #000403 + + + diff --git a/static/favicon/favicon.ico b/static/favicon/favicon.ico new file mode 100644 index 0000000..342b49d Binary files /dev/null and b/static/favicon/favicon.ico differ diff --git a/static/favicon/mstile-150x150.png b/static/favicon/mstile-150x150.png new file mode 100644 index 0000000..daa17c0 Binary files /dev/null and b/static/favicon/mstile-150x150.png differ diff --git a/static/manifest.json b/static/manifest.json new file mode 100644 index 0000000..a6f26aa --- /dev/null +++ b/static/manifest.json @@ -0,0 +1,19 @@ +{ + "name": "Tornado Cash", + "short_name": "Tornado Cash", + "icons": [ + { + "src": "/favicon/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/favicon/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#000403", + "background_color": "#000403", + "display": "standalone" +} diff --git a/static/tornado.json.zip b/static/tornado.json.zip new file mode 100644 index 0000000..748a238 Binary files /dev/null and b/static/tornado.json.zip differ diff --git a/static/tornadoProvingKey.bin.zip b/static/tornadoProvingKey.bin.zip new file mode 100644 index 0000000..509f3ab Binary files /dev/null and b/static/tornadoProvingKey.bin.zip differ diff --git a/static/trees/deposits_eth_0.1.json.zip b/static/trees/deposits_eth_0.1.json.zip new file mode 100644 index 0000000..b0589e2 Binary files /dev/null and b/static/trees/deposits_eth_0.1.json.zip differ diff --git a/static/trees/deposits_eth_0.1_bloom.json.zip b/static/trees/deposits_eth_0.1_bloom.json.zip new file mode 100644 index 0000000..46e8b9c Binary files /dev/null and b/static/trees/deposits_eth_0.1_bloom.json.zip differ diff --git a/static/trees/deposits_eth_0.1_slice1.json.zip b/static/trees/deposits_eth_0.1_slice1.json.zip new file mode 100644 index 0000000..b20e079 Binary files /dev/null and b/static/trees/deposits_eth_0.1_slice1.json.zip differ diff --git a/static/trees/deposits_eth_0.1_slice2.json.zip b/static/trees/deposits_eth_0.1_slice2.json.zip new file mode 100644 index 0000000..b93bcf1 Binary files /dev/null and b/static/trees/deposits_eth_0.1_slice2.json.zip differ diff --git a/static/trees/deposits_eth_0.1_slice3.json.zip b/static/trees/deposits_eth_0.1_slice3.json.zip new file mode 100644 index 0000000..8bc469d Binary files /dev/null and b/static/trees/deposits_eth_0.1_slice3.json.zip differ diff --git a/static/trees/deposits_eth_0.1_slice4.json.zip b/static/trees/deposits_eth_0.1_slice4.json.zip new file mode 100644 index 0000000..2e7e73a Binary files /dev/null and b/static/trees/deposits_eth_0.1_slice4.json.zip differ diff --git a/static/trees/deposits_eth_1.json.zip b/static/trees/deposits_eth_1.json.zip new file mode 100644 index 0000000..a517d42 Binary files /dev/null and b/static/trees/deposits_eth_1.json.zip differ diff --git a/static/trees/deposits_eth_10.json.zip b/static/trees/deposits_eth_10.json.zip new file mode 100644 index 0000000..ee242b0 Binary files /dev/null and b/static/trees/deposits_eth_10.json.zip differ diff --git a/static/trees/deposits_eth_100.json.zip b/static/trees/deposits_eth_100.json.zip new file mode 100644 index 0000000..8bb13d1 Binary files /dev/null and b/static/trees/deposits_eth_100.json.zip differ diff --git a/static/trees/deposits_eth_100_bloom.json.zip b/static/trees/deposits_eth_100_bloom.json.zip new file mode 100644 index 0000000..a04e48d Binary files /dev/null and b/static/trees/deposits_eth_100_bloom.json.zip differ diff --git a/static/trees/deposits_eth_100_slice1.json.zip b/static/trees/deposits_eth_100_slice1.json.zip new file mode 100644 index 0000000..e131b4b Binary files /dev/null and b/static/trees/deposits_eth_100_slice1.json.zip differ diff --git a/static/trees/deposits_eth_100_slice2.json.zip b/static/trees/deposits_eth_100_slice2.json.zip new file mode 100644 index 0000000..1995914 Binary files /dev/null and b/static/trees/deposits_eth_100_slice2.json.zip differ diff --git a/static/trees/deposits_eth_100_slice3.json.zip b/static/trees/deposits_eth_100_slice3.json.zip new file mode 100644 index 0000000..d2dc19f Binary files /dev/null and b/static/trees/deposits_eth_100_slice3.json.zip differ diff --git a/static/trees/deposits_eth_100_slice4.json.zip b/static/trees/deposits_eth_100_slice4.json.zip new file mode 100644 index 0000000..2afcd09 Binary files /dev/null and b/static/trees/deposits_eth_100_slice4.json.zip differ diff --git a/static/trees/deposits_eth_10_bloom.json.zip b/static/trees/deposits_eth_10_bloom.json.zip new file mode 100644 index 0000000..2b4b4ac Binary files /dev/null and b/static/trees/deposits_eth_10_bloom.json.zip differ diff --git a/static/trees/deposits_eth_10_slice1.json.zip b/static/trees/deposits_eth_10_slice1.json.zip new file mode 100644 index 0000000..dd654f1 Binary files /dev/null and b/static/trees/deposits_eth_10_slice1.json.zip differ diff --git a/static/trees/deposits_eth_10_slice2.json.zip b/static/trees/deposits_eth_10_slice2.json.zip new file mode 100644 index 0000000..c6ef8ae Binary files /dev/null and b/static/trees/deposits_eth_10_slice2.json.zip differ diff --git a/static/trees/deposits_eth_10_slice3.json.zip b/static/trees/deposits_eth_10_slice3.json.zip new file mode 100644 index 0000000..2ef281c Binary files /dev/null and b/static/trees/deposits_eth_10_slice3.json.zip differ diff --git a/static/trees/deposits_eth_10_slice4.json.zip b/static/trees/deposits_eth_10_slice4.json.zip new file mode 100644 index 0000000..a3b58a0 Binary files /dev/null and b/static/trees/deposits_eth_10_slice4.json.zip differ diff --git a/static/trees/deposits_eth_1_bloom.json.zip b/static/trees/deposits_eth_1_bloom.json.zip new file mode 100644 index 0000000..66370e0 Binary files /dev/null and b/static/trees/deposits_eth_1_bloom.json.zip differ diff --git a/static/trees/deposits_eth_1_slice1.json.zip b/static/trees/deposits_eth_1_slice1.json.zip new file mode 100644 index 0000000..fa15024 Binary files /dev/null and b/static/trees/deposits_eth_1_slice1.json.zip differ diff --git a/static/trees/deposits_eth_1_slice2.json.zip b/static/trees/deposits_eth_1_slice2.json.zip new file mode 100644 index 0000000..5ab2029 Binary files /dev/null and b/static/trees/deposits_eth_1_slice2.json.zip differ diff --git a/static/trees/deposits_eth_1_slice3.json.zip b/static/trees/deposits_eth_1_slice3.json.zip new file mode 100644 index 0000000..e052efb Binary files /dev/null and b/static/trees/deposits_eth_1_slice3.json.zip differ diff --git a/static/trees/deposits_eth_1_slice4.json.zip b/static/trees/deposits_eth_1_slice4.json.zip new file mode 100644 index 0000000..d555a4d Binary files /dev/null and b/static/trees/deposits_eth_1_slice4.json.zip differ diff --git a/static/tw.png b/static/tw.png new file mode 100644 index 0000000..28268a9 Binary files /dev/null and b/static/tw.png differ diff --git a/store/application.js b/store/application.js new file mode 100644 index 0000000..7529ffb --- /dev/null +++ b/store/application.js @@ -0,0 +1,981 @@ +/* eslint-disable camelcase */ +/* eslint-disable no-console, import/order */ +import Web3 from 'web3' + +import networkConfig from '@/networkConfig' +import { cachedEventsLength, eventsType } from '@/constants' + +import MulticallABI from '@/abis/Multicall.json' +import InstanceABI from '@/abis/Instance.abi.json' +import TornadoProxyABI from '@/abis/TornadoProxy.abi.json' + +import { ACTION, ACTION_GAS } from '@/constants/variables' +import { graph, treesInterface, EventsFactory } from '@/services' + +import { + randomBN, + parseNote, + toFixedHex, + saveAsFile, + isEmptyArray, + decimalPlaces, + parseHexNote, + checkCommitments, + buffPedersenHash +} from '@/utils' + +import { buildGroth16, download, getTornadoKeys } from './snark' + +let groth16 + +const websnarkUtils = require('websnark/src/utils') +const { toWei, numberToHex, toBN, isAddress } = require('web3-utils') + +const getStatisticStore = (acc, { tokens }) => { + Object.entries(tokens).forEach(([currency, { instanceAddress }]) => { + acc[currency] = Object.assign({}, acc[currency]) + + Object.keys(instanceAddress).forEach((amount) => { + if (!acc[currency][amount]) { + acc[currency][amount] = { + latestDeposits: [], + nextDepositIndex: null, + anonymitySet: null + } + } + }) + }) + return acc +} + +const defaultStatistics = Object.values(networkConfig).reduce(getStatisticStore, {}) + +const state = () => { + return { + note: null, + commitment: null, + prefix: null, + errors: [], + notes: {}, + statistic: defaultStatistics, + ip: {}, + selectedInstance: { currency: 'eth', amount: 0.1 }, + selectedStatistic: { currency: 'eth', amount: 0.1 }, + withdrawType: 'relayer', + ethToReceive: '20000000000000000', + defaultEthToReceive: '20000000000000000', + withdrawNote: '' + } +} + +const mutations = { + SAVE_DEPOSIT(state, { note, commitment, prefix }) { + state.note = note + state.commitment = commitment + state.prefix = prefix + }, + SAVE_PROOF(state, { proof, args, note }) { + this._vm.$set(state.notes, note, { proof, args }) + }, + REMOVE_PROOF(state, { note }) { + this._vm.$delete(state.notes, note) + }, + SAVE_ERROR(state, message) { + state.errors.push(message) + }, + REMOVE_ERRORS(state) { + this._vm.$set(state, 'errors', []) + }, + SAVE_LAST_INDEX(state, { nextDepositIndex, anonymitySet, currency, amount }) { + const currentState = state.statistic[currency][amount] + this._vm.$set(state.statistic[currency], `${amount}`, { ...currentState, nextDepositIndex, anonymitySet }) + }, + SAVE_LAST_EVENTS(state, { latestDeposits, currency, amount }) { + const currentState = state.statistic[currency][amount] + this._vm.$set(state.statistic[currency], `${amount}`, { ...currentState, latestDeposits }) + }, + SET_SELECTED_INSTANCE(state, selectedInstance) { + state.selectedInstance = selectedInstance + }, + SET_SELECTED_STATISTIC(state, selectedStatistic) { + state.selectedStatistic = selectedStatistic + }, + SET_WITHDRAW_TYPE(state, { withdrawType }) { + this._vm.$set(state, 'withdrawType', withdrawType) + }, + SAVE_ETH_TO_RECEIVE(state, { ethToReceive }) { + this._vm.$set(state, 'ethToReceive', ethToReceive) + }, + SAVE_DEFAULT_ETH_TO_RECEIVE(state, { ethToReceive }) { + this._vm.$set(state, 'defaultEthToReceive', ethToReceive) + }, + SET_WITHDRAW_NOTE(state, withdrawNote) { + state.withdrawNote = withdrawNote + } +} + +const getters = { + eventsInterface: (state, getters, rootState, rootGetters) => { + const netId = rootGetters['metamask/netId'] + const { url } = rootState.settings[`netId${netId}`].rpc + return new EventsFactory(url) + }, + instanceContract: (state, getters, rootState) => ({ currency, amount, netId }) => { + const config = networkConfig[`netId${netId}`] + const { url } = rootState.settings[`netId${netId}`].rpc + const address = config.tokens[currency].instanceAddress[amount] + const web3 = new Web3(url) + return new web3.eth.Contract(InstanceABI, address) + }, + multicallContract: (state, getters, rootState) => ({ netId }) => { + const config = networkConfig[`netId${netId}`] + const { url } = rootState.settings[`netId${netId}`].rpc + const web3 = new Web3(url) + return new web3.eth.Contract(MulticallABI, config.multicall) + }, + tornadoProxyContract: (state, getters, rootState) => ({ netId }) => { + const { + 'tornado-proxy.contract.tornadocash.eth': tornadoProxy, + 'tornado-router.contract.tornadocash.eth': tornadoRouter, + 'tornado-proxy-light.contract.tornadocash.eth': tornadoProxyLight + } = networkConfig[`netId${netId}`] + + const proxyContract = tornadoRouter || tornadoProxy || tornadoProxyLight + const { url } = rootState.settings[`netId${netId}`].rpc + const web3 = new Web3(url) + return new web3.eth.Contract(TornadoProxyABI, proxyContract) + }, + currentContract: (state, getters) => (params) => { + return getters.tornadoProxyContract(params) + }, + withdrawGas: (state, getters, rootState, rootGetters) => { + const netId = rootGetters['metamask/netId'] + let action = ACTION.WITHDRAW_WITH_EXTRA + + if (getters.hasEnabledLightProxy) { + action = ACTION.WITHDRAW + } + + if (Number(netId) === 10) { + action = ACTION.OP_WITHDRAW + } + + if (Number(netId) === 42161) { + action = ACTION.ARB_WITHDRAW + } + + return ACTION_GAS[action] + }, + networkFee: (state, getters, rootState, rootGetters) => { + const gasPrice = rootGetters['gasPrices/fastGasPrice'] + + return toBN(gasPrice).mul(toBN(getters.withdrawGas)) + }, + relayerFee: (state, getters, rootState, rootGetters) => { + const { currency, amount } = rootState.application.selectedStatistic + const { decimals } = rootGetters['metamask/networkConfig'].tokens[currency] + const nativeCurrency = rootGetters['metamask/nativeCurrency'] + const total = toBN(rootGetters['token/fromDecimals'](amount.toString())) + const fee = rootState.relayer.selectedRelayer.tornadoServiceFee + const decimalsPoint = decimalPlaces(fee) + const roundDecimal = 10 ** decimalsPoint + const aroundFee = toBN(parseInt(fee * roundDecimal, 10)) + const tornadoServiceFee = total.mul(aroundFee).div(toBN(roundDecimal * 100)) + const ethFee = getters.networkFee + switch (currency) { + case nativeCurrency: { + return ethFee.add(tornadoServiceFee) + } + default: { + const tokenFee = ethFee.mul(toBN(10 ** decimals)).div(toBN(rootState.price.prices[currency])) + return tokenFee.add(tornadoServiceFee) + } + } + }, + ethToReceiveInToken: (state, getters, rootState, rootGetters) => { + const { currency } = rootState.application.selectedStatistic + const { decimals } = rootGetters['metamask/networkConfig'].tokens[currency] + const price = rootState.price.prices[currency] + const ethToReceive = toBN(state.ethToReceive) + return ethToReceive.mul(toBN(10 ** decimals)).div(toBN(price)) + }, + isNotEnoughTokens: (state, getters, rootState, rootGetters) => { + const { amount, currency } = rootState.application.selectedStatistic + let total = toBN(rootGetters['token/fromDecimals'](amount.toString())) + + if (state.withdrawType === 'relayer') { + const relayerFee = getters.relayerFee + const nativeCurrency = rootGetters['metamask/nativeCurrency'] + + if (currency === nativeCurrency) { + total = total.sub(relayerFee) + } else { + const ethToReceiveInToken = getters.ethToReceiveInToken + total = total.sub(relayerFee).sub(ethToReceiveInToken) + } + } + + return total.isNeg() + }, + maxEthToReceive: (state, getters, rootState, rootGetters) => { + const { currency, amount } = rootState.application.selectedStatistic + const { decimals } = rootGetters['metamask/networkConfig'].tokens[currency] + const total = toBN(rootGetters['token/fromDecimals'](amount.toString())) + const price = rootState.price.prices[currency] + const relayerFee = getters.relayerFee + return total + .sub(relayerFee) + .mul(toBN(price)) + .div(toBN(10 ** decimals)) + }, + selectedCurrency: (state, getters, rootState, rootGetters) => { + const tokens = rootGetters['metamask/networkConfig'].tokens + return tokens[state.selectedInstance.currency].symbol + }, + selectedStatisticCurrency: (state, getters, rootState, rootGetters) => { + const tokens = rootGetters['metamask/networkConfig'].tokens + return tokens[state.selectedStatistic.currency].symbol + }, + lastEventIndex: (state) => ({ currency, amount }) => { + return state.statistic[currency][amount].anonymitySet + }, + latestDeposits: (state) => { + const { currency, amount } = state.selectedStatistic + return state.statistic[currency][amount].latestDeposits + }, + hasEnabledLightProxy: (state, getters, rootState, rootGetters) => { + return Boolean(rootGetters['metamask/networkConfig']['tornado-proxy-light.contract.tornadocash.eth']) + } +} + +const actions = { + setAndUpdateStatistic({ dispatch, commit }, { currency, amount }) { + commit('SET_SELECTED_STATISTIC', { currency, amount }) + dispatch('updateSelectEvents') + }, + async updateSelectEvents({ dispatch, commit, state, rootGetters, getters }) { + const netId = rootGetters['metamask/netId'] + const { currency, amount } = state.selectedStatistic + const { deployedBlock } = networkConfig[`netId${netId}`] + + const eventService = getters.eventsInterface.getService({ netId, amount, currency }) + + const savedEvents = await eventService.getEvents(eventsType.DEPOSIT) + const fromBlock = savedEvents?.lastBlock || deployedBlock + + const graphEvents = await eventService.getEventsFromGraph({ fromBlock, methodName: 'getStatistic' }) + + let statistic = graphEvents?.events + + if (!statistic || !statistic.length) { + const fresh = await eventService.getStatisticsRpc({ fromBlock, eventsCount: 10 }) + + statistic = fresh || [] + } + + const { nextDepositIndex, anonymitySet } = await dispatch('getLastDepositIndex', { + currency, + amount, + netId + }) + + statistic = statistic.sort((a, b) => a.leafIndex - b.leafIndex) + + const latestDeposits = [] + + for (const event of statistic.slice(-10)) { + latestDeposits.unshift({ + index: event.leafIndex, + depositTime: this.$moment.unix(event.timestamp).fromNow() + }) + } + + commit('SAVE_LAST_EVENTS', { + amount, + currency, + latestDeposits + }) + commit('SAVE_LAST_INDEX', { + amount, + currency, + anonymitySet, + nextDepositIndex + }) + }, + async updateEvents({ getters, rootGetters }, payload) { + try { + const eventService = getters.eventsInterface.getService(payload) + + const freshEvents = await eventService.updateEvents(payload.type) + + return freshEvents + } catch (err) { + throw new Error(`Method updateEvents has error: ${err.message}`) + } + }, + async updateCurrentEvents({ dispatch, rootGetters }, { amount, currency, lastEvent, type, netId }) { + let lastBlock = lastEvent + const nativeCurrency = rootGetters['metamask/nativeCurrency'] + const { deployedBlock } = networkConfig[`netId${netId}`] + + if (currency === nativeCurrency && !lastEvent) { + lastBlock = await this.$indexedDB.getFromIndex({ + indexName: 'name', + storeName: `lastEvents_${netId}`, + key: `${type}s_${currency}_${amount}` + }) + } + + const params = { + type, + netId, + amount, + currency, + fromBlock: lastBlock ? lastBlock.blockNumber + 1 : deployedBlock + } + + const events = await dispatch('updateEvents', params) + + return events + }, + async getLastDepositIndex({ getters }, params) { + try { + const contractInstance = getters.instanceContract(params) + const nextDepositIndex = await contractInstance.methods.nextIndex().call() + + return { + nextDepositIndex, + anonymitySet: toBN(nextDepositIndex) + } + } catch (err) { + throw new Error(`Method getLastDepositIndex has error: ${err.message}`) + } + }, + async loadEncryptedEvents(_, { netId }) { + try { + const module = await download({ + contentType: 'string', + name: `events/encrypted_notes_${netId}.json.zip` + }) + + if (module) { + const events = JSON.parse(module) + + return { + events, + lastBlock: events[events.length - 1].blockNumber + } + } + } catch (err) { + throw new Error(`Method loadCachedEvents has error: ${err.message}`) + } + }, + prepareDeposit({ getters, dispatch, commit, rootGetters }, { prefix }) { + try { + const [, currency, amount, netId] = prefix.split('-') + const contractInstance = getters.instanceContract({ currency, amount, netId }) + + const secret = randomBN(31) + const nullifier = randomBN(31) + + const preimage = Buffer.concat([nullifier.toBuffer('le', 31), secret.toBuffer('le', 31)]) + + const commitment = buffPedersenHash(preimage) + const commitmentHex = toFixedHex(commitment) + + const note = `0x${preimage.toString('hex')}` + + const isEnabled = rootGetters['encryptedNote/isEnabledSaveFile'] + + if (isEnabled) { + setTimeout(() => { + try { + dispatch('saveFile', { prefix, note }) + } catch (err) { + console.warn('NoteAccount backup as a file is not supported on this device', err) + } + }, 1000) + } + + commit('SAVE_DEPOSIT', { note, commitment: commitmentHex, prefix }) + if (!contractInstance._address) { + throw new Error(this.app.i18n.t('networkIsNotSupported')) + } + } catch (e) { + console.error('prepareDeposit', e) + } + }, + saveFile(_, { prefix, note }) { + try { + const data = new Blob([`${prefix}-${note}`], { type: 'text/plain;charset=utf-8' }) + + saveAsFile(data, `backup-${prefix}-${note.slice(0, 10)}.txt`) + } catch (err) { + console.error('saveFile', err.message) + } + }, + async getEncryptedEventsFromDb(_, { netId }) { + try { + if (this.$indexedDB.isBlocked) { + return [] + } + + const cachedEvents = await this.$indexedDB.getAll({ storeName: `encrypted_events_${netId}` }) + + return cachedEvents + } catch (err) { + console.warn(`Method getEventsFromDb has error: ${err.message}`) + } + }, + async getEncryptedNotes({ rootState, rootGetters, dispatch, getters }) { + try { + const { netId } = rootState.metamask + const rpc = rootGetters['settings/currentRpc'] + let { NOTE_ACCOUNT_BLOCK: deployedBlock } = networkConfig[`netId${netId}`].constants + + const contractInstance = getters.tornadoProxyContract({ netId }) + + let cachedEvents = await dispatch('getEncryptedEventsFromDb', { netId }) + + const networksWithCache = [1, 5] + + const LENGTH_CACHE = + Number(netId) === 1 + ? cachedEventsLength.mainnet.ENCRYPTED_NOTES + : cachedEventsLength.goerli.ENCRYPTED_NOTES + + if ( + ((isEmptyArray(cachedEvents) || !cachedEvents) && networksWithCache.includes(netId)) || + (cachedEvents.length < LENGTH_CACHE && networksWithCache.includes(netId)) + ) { + ;({ events: cachedEvents } = await dispatch('loadEncryptedEvents', { netId })) + } + + const hasCache = Boolean(cachedEvents && cachedEvents.length) + + if (hasCache) { + const [lastEvent] = cachedEvents.sort((a, b) => a.blockNumber - b.blockNumber).slice(-1) + + deployedBlock = lastEvent.blockNumber + 1 + } + + const web3 = this.$provider.getWeb3(rpc.url) + const currentBlockNumber = await web3.eth.getBlockNumber() + + let events = [] + + const { events: graphEvents, lastSyncBlock } = await graph.getAllEncryptedNotes({ + netId, + fromBlock: deployedBlock + }) + + if (!isEmptyArray(graphEvents)) { + deployedBlock = lastSyncBlock + } + + let NUMBER_PARTS = hasCache ? 2 : 10 + + if (Number(netId) === 56) { + NUMBER_PARTS = parseInt((currentBlockNumber - deployedBlock) / 4950) || 1 + } + + const part = parseInt((currentBlockNumber - deployedBlock) / NUMBER_PARTS) + + let fromBlock = deployedBlock + let toBlock = deployedBlock + part + + if (toBlock >= currentBlockNumber || toBlock === deployedBlock) { + toBlock = 'latest' + NUMBER_PARTS = 1 + } + + for (let i = 0; i < NUMBER_PARTS; i++) { + const partOfEvents = await contractInstance.getPastEvents('EncryptedNote', { + toBlock, + fromBlock + }) + if (partOfEvents) { + events = events.concat(partOfEvents) + } + fromBlock = toBlock + toBlock += part + } + + if (events && events.length) { + events = events + .filter((i) => i.returnValues.encryptedNote) + .map((e) => ({ + txHash: e.transactionHash, + transactionHash: e.transactionHash, + blockNumber: Number(e.blockNumber), + encryptedNote: e.returnValues.encryptedNote + })) + } + + const allEvents = [].concat(cachedEvents, graphEvents, events) + + await dispatch('saveEncryptedEventsToDB', { events: allEvents, netId }) + + return allEvents + } catch (err) { + console.log('getEncryptedNotes', err) + } + }, + async saveEncryptedEventsToDB(_, { events, netId }) { + if (!events || !events.length || this.$indexedDB.isBlocked) { + return + } + + await this.$indexedDB.createMultipleTransactions({ + data: events, + storeName: `encrypted_events_${netId}` + }) + }, + async sendDeposit({ state, rootState, getters, rootGetters, dispatch, commit }, { isEncrypted, gasPrice }) { + try { + const { commitment, note, prefix } = state + // eslint-disable-next-line prefer-const + let [, currency, amount, netId] = prefix.split('-') + const config = networkConfig[`netId${netId}`] + const contractInstance = getters.tornadoProxyContract({ netId }) + + if (!state.commitment) { + throw new Error(this.app.i18n.t('failToGenerateNote')) + } + + const { nextDepositIndex: index } = await dispatch('getLastDepositIndex', { netId, currency, amount }) + + const { ethAccount } = rootState.metamask + const nativeCurrency = rootGetters['metamask/nativeCurrency'] + const isNative = currency === nativeCurrency + + const value = isNative ? toWei(amount, 'ether') : '0' + const instance = config.tokens[currency].instanceAddress[amount] + + let params = [instance, commitment, []] + + if (isEncrypted) { + const encryptedNote = await dispatch( + 'encryptedNote/getEncryptedNote', + { data: `${instance}-${note}` }, + { root: true } + ) + + params = [instance, commitment, encryptedNote] + } + + const data = contractInstance.methods.deposit(...params).encodeABI() + const gas = await contractInstance.methods.deposit(...params).estimateGas({ from: ethAccount, value }) + + const callParams = { + method: 'eth_sendTransaction', + params: { + gasPrice, + to: contractInstance._address, + gas: numberToHex(gas + 50000), + value: numberToHex(value), + data + }, + watcherParams: { + title: { path: 'depositing', amount, currency }, + successTitle: { + path: 'depositedValue', + amount, + currency + }, + storeType: isEncrypted ? 'encryptedTxs' : 'txs' + }, + isAwait: false + } + + const txHash = await dispatch('metamask/sendTransaction', callParams, { root: true }) + + // there may be a race condition, you need to request an index and a timestamp of the deposit after tx is mined + const timestamp = Math.round(new Date().getTime() / 1000) + + const { nullifierHex, commitmentHex } = parseHexNote(state.note) + const storeType = isEncrypted ? 'encryptedTxs' : 'txs' + + const accounts = rootGetters['encryptedNote/accounts'] + + const tx = { + txHash, + type: 'Deposit', + note, + amount, + storeType, + prefix, + netId, + timestamp, + index, + nullifierHex, + commitmentHex, + currency + } + console.log('tx', tx) + + if (isEncrypted) { + tx.note = params[2] + tx.owner = isAddress(accounts.encrypt) ? accounts.encrypt : '' + tx.backupAccount = isAddress(accounts.backup) ? accounts.backup : '' + } + + commit('txHashKeeper/SAVE_TX_HASH', tx, { root: true }) + } catch (e) { + console.error('sendDeposit', e) + return false + } + }, + async checkSpentEventFromNullifier({ getters, dispatch }, parsedNote) { + try { + const isSpent = await dispatch('loadEvent', { + note: parsedNote, + eventName: 'nullifierHash', + type: eventsType.WITHDRAWAL, + methodName: 'getAllWithdrawals', + eventToFind: parsedNote.nullifierHex + }) + + return Boolean(isSpent) + } catch (err) { + console.error(`Method checkSpentEventFromNullifier has error: ${err.message}`) + } + }, + async checkRoot({ getters }, { root, parsedNote }) { + const contractInstance = getters.instanceContract(parsedNote) + + const isKnownRoot = await contractInstance.methods.isKnownRoot(root).call() + + if (!isKnownRoot) { + throw new Error(this.app.i18n.t('invalidRoot')) + } + }, + async buildTree({ dispatch }, { currency, amount, netId, commitmentHex }) { + const treeInstanceName = `${currency}_${amount}_${netId}` + const params = { netId, amount, currency } + + const treeService = treesInterface.getService({ + ...params, + commitment: commitmentHex, + instanceName: treeInstanceName + }) + + const [cachedTree, eventsData] = await Promise.all([ + treeService.getTree(), + dispatch('updateEvents', { ...params, type: eventsType.DEPOSIT }) + ]) + + const commitments = eventsData.events.map((el) => el.commitment.toString(10)) + + let tree = cachedTree + if (tree) { + const newLeaves = commitments.slice(tree.elements.length) + tree.bulkInsert(newLeaves) + } else { + console.log('events', eventsData) + checkCommitments(eventsData.events) + tree = treeService.createTree({ events: commitments }) + } + + const root = toFixedHex(tree.root) + await dispatch('checkRoot', { root, parsedNote: params }) + + await treeService.saveTree({ tree }) + + return { tree, root } + }, + async createSnarkProof( + { rootGetters, rootState, state, getters }, + { root, note, tree, recipient, leafIndex } + ) { + const { pathElements, pathIndices } = tree.path(leafIndex) + console.log('pathElements, pathIndices', pathElements, pathIndices) + + const nativeCurrency = rootGetters['metamask/nativeCurrency'] + const withdrawType = state.withdrawType + + let relayer = BigInt(recipient) + let fee = BigInt(0) + let refund = BigInt(0) + + if (withdrawType === 'relayer') { + let totalRelayerFee = getters.relayerFee + relayer = BigInt(rootState.relayer.selectedRelayer.address) + + if (note.currency !== nativeCurrency) { + refund = BigInt(state.ethToReceive.toString()) + totalRelayerFee = totalRelayerFee.add(getters.ethToReceiveInToken) + } + + fee = BigInt(totalRelayerFee.toString()) + } + + const input = { + // public + fee, + root, + refund, + relayer, + recipient: BigInt(recipient), + nullifierHash: note.nullifierHash, + // private + pathIndices, + pathElements, + secret: note.secret, + nullifier: note.nullifier + } + + const { circuit, provingKey } = await getTornadoKeys() + + if (!groth16) { + groth16 = await buildGroth16() + } + + console.log('Start generating SNARK proof', input) + console.time('SNARK proof time') + const proofData = await websnarkUtils.genWitnessAndProve(groth16, input, circuit, provingKey) + const { proof } = websnarkUtils.toSolidityInput(proofData) + + const args = [ + toFixedHex(input.root), + toFixedHex(input.nullifierHash), + toFixedHex(input.recipient, 20), + toFixedHex(input.relayer, 20), + toFixedHex(input.fee), + toFixedHex(input.refund) + ] + return { args, proof } + }, + async prepareWithdraw({ dispatch, getters, commit }, { note, recipient }) { + commit('REMOVE_ERRORS') + commit('REMOVE_PROOF', { note }) + try { + const parsedNote = parseNote(note) + + const { tree, root } = await dispatch('buildTree', parsedNote) + + const isSpent = await dispatch('checkSpentEventFromNullifier', parsedNote) + + if (isSpent) { + throw new Error(this.app.i18n.t('noteHasBeenSpent')) + } + + const { proof, args } = await dispatch('createSnarkProof', { + root, + tree, + recipient, + note: parsedNote, + leafIndex: tree.indexOf(parsedNote.commitmentHex) + }) + console.timeEnd('SNARK proof time') + commit('SAVE_PROOF', { proof, args, note }) + } catch (e) { + console.error('prepareWithdraw', e) + commit('SAVE_ERROR', e.message) + } + }, + async withdraw({ state, rootState, dispatch, getters }, { note }) { + try { + const [, currency, amount, netId] = note.split('-') + const config = networkConfig[`netId${netId}`] + const { proof, args } = state.notes[note] + const { ethAccount } = rootState.metamask + + const contractInstance = getters.tornadoProxyContract({ netId }) + + const instance = config.tokens[currency].instanceAddress[amount] + const params = [instance, proof, ...args] + + const data = contractInstance.methods.withdraw(...params).encodeABI() + const gas = await contractInstance.methods + .withdraw(...params) + .estimateGas({ from: ethAccount, value: args[5] }) + + const callParams = { + method: 'eth_sendTransaction', + params: { + data, + value: args[5], + to: contractInstance._address, + gas: numberToHex(gas + 200000) + }, + watcherParams: { + title: { path: 'withdrawing', amount, currency }, + successTitle: { + amount, + currency, + path: 'withdrawnValue' + }, + onSuccess: (txHash) => { + dispatch('txHashKeeper/updateDeposit', { amount, currency, netId, note, txHash }, { root: true }) + } + }, + isAwait: false, + isSaving: false + } + + await dispatch('metamask/sendTransaction', callParams, { root: true }) + } catch (e) { + console.error(e) + throw new Error(e.message) + } + }, + loadAllNotesData({ dispatch, rootGetters }) { + const { tokens } = rootGetters['metamask/networkConfig'] + + for (const [currency, { instanceAddress }] of Object.entries(tokens)) { + for (const amount in instanceAddress) { + if (instanceAddress[amount]) { + dispatch('updateLastIndex', { currency, amount }) + } + } + } + }, + async updateLastIndex({ dispatch, commit, rootState }, { currency, amount }) { + const netId = rootState.metamask.netId + const { nextDepositIndex, anonymitySet } = await dispatch('getLastDepositIndex', { + currency, + netId, + amount + }) + + commit('SAVE_LAST_INDEX', { + amount, + currency, + anonymitySet, + nextDepositIndex + }) + }, + async loadEvent({ getters, rootGetters }, { note, type, eventName, eventToFind }) { + try { + const eventService = getters.eventsInterface.getService(note) + + const foundEvent = await eventService.findEvent({ eventName, eventToFind, type }) + + return foundEvent + } catch (err) { + console.error(`Method loadEvent has error: ${err.message}`) + } + }, + async loadDepositEvent({ state, dispatch }, { withdrawNote }) { + try { + const note = parseNote(withdrawNote) + + const lastEvent = await dispatch('loadEvent', { + note, + eventName: 'commitment', + type: eventsType.DEPOSIT, + methodName: 'getAllDeposits', + eventToFind: note.commitmentHex + }) + + if (lastEvent) { + const { nextDepositIndex } = state.statistic[note.currency][note.amount] + const depositsPast = nextDepositIndex - lastEvent.leafIndex - 1 + + const isSpent = await dispatch('checkSpentEventFromNullifier', note) + + return { + isSpent, + depositsPast, + timestamp: lastEvent.timestamp, + leafIndex: lastEvent.leafIndex, + txHash: lastEvent.transactionHash, + depositBlock: lastEvent.blockNumber + } + } + } catch (err) { + console.error(`Method loadDepositEvent has error: ${err.message}`) + } + }, + async loadWithdrawalEvent({ dispatch }, { withdrawNote }) { + try { + const note = parseNote(withdrawNote) + + const lastEvent = await dispatch('loadEvent', { + note, + eventName: 'nullifierHash', + type: eventsType.WITHDRAWAL, + methodName: 'getAllWithdrawals', + eventToFind: note.nullifierHex + }) + + if (lastEvent) { + return { + to: lastEvent.to, + fee: lastEvent.fee, + txHash: lastEvent.transactionHash, + blockNumber: lastEvent.blockNumber + } + } + } catch (err) { + console.error(`Method loadWithdrawalEvent has error: ${err.message}`) + } + }, + async loadWithdrawalData({ commit, dispatch, rootGetters }, { withdrawNote }) { + try { + const toDecimals = rootGetters['token/toDecimals'] + + const { currency, amount } = parseNote(withdrawNote) + const { fee, txHash, blockNumber, to } = await dispatch('loadWithdrawalEvent', { withdrawNote }) + + const decimals = rootGetters['metamask/networkConfig'].tokens[currency].decimals + const withdrawalAmount = toBN(rootGetters['token/fromDecimals'](amount.toString(), decimals)).sub( + toBN(fee) + ) + + return { + to, + txHash, + withdrawalBlock: blockNumber, + fee: toDecimals(fee, decimals, 4), + amount: toDecimals(withdrawalAmount, decimals, 4) + } + } catch (e) { + console.error(`Method loadWithdrawalData has error: ${e}`) + commit('SAVE_ERROR', e.message) + } + }, + calculateEthToReceive({ commit, state, rootGetters }, { currency }) { + const gasLimit = rootGetters['metamask/networkConfig'].tokens[currency].gasLimit + const gasPrice = toBN(rootGetters['gasPrices/fastGasPrice']) + + const ethToReceive = gasPrice + .mul(toBN(gasLimit)) + .mul(toBN(2)) + .toString() + return ethToReceive + }, + async setDefaultEthToReceive({ dispatch, commit }, { currency }) { + const ethToReceive = await dispatch('calculateEthToReceive', { currency }) + commit('SAVE_ETH_TO_RECEIVE', { ethToReceive }) + commit('SAVE_DEFAULT_ETH_TO_RECEIVE', { ethToReceive }) + }, + setNativeCurrency({ commit }, { netId }) { + const currency = networkConfig[`netId${netId}`].nativeCurrency + const amounts = Object.keys(networkConfig[`netId${netId}`].tokens[currency].instanceAddress) + const amount = Math.min(...amounts) + + commit('SET_SELECTED_INSTANCE', { currency, amount }) + commit('SET_SELECTED_STATISTIC', { currency, amount }) + }, + async aggregateMulticall({ rootGetters, getters }, { params }) { + try { + const netId = rootGetters['metamask/netId'] + const multicallContract = getters.multicallContract({ netId }) + + const result = await multicallContract.methods.aggregate(params).call() + + return result.returnData + } catch (err) { + console.log('err', err.message) + } + } +} +export default { + namespaced: true, + state, + getters, + mutations, + actions +} diff --git a/store/encryptedNote.js b/store/encryptedNote.js new file mode 100644 index 0000000..59acd56 --- /dev/null +++ b/store/encryptedNote.js @@ -0,0 +1,3 @@ +import { actions, getters, state, mutations } from '@/modules/account/store' + +export { actions, getters, mutations, state } diff --git a/store/gasPrices.js b/store/gasPrices.js new file mode 100644 index 0000000..cc76e86 --- /dev/null +++ b/store/gasPrices.js @@ -0,0 +1,191 @@ +/* eslint-disable no-console */ +import { GasPriceOracle } from 'gas-price-oracle' +import { toHex, toWei, toBN, fromWei } from 'web3-utils' + +export const state = () => { + return { + oracle: { + instant: 80, + fast: 50, + standard: 25, + low: 8 + }, + eip: { + instant: { + baseFee: 80, + maxFeePerGas: 80, + maxPriorityFeePerGas: 3 + }, + fast: { + baseFee: 50, + maxFeePerGas: 50, + maxPriorityFeePerGas: 3 + }, + standard: { + baseFee: 25, + maxFeePerGas: 27, + maxPriorityFeePerGas: 2 + }, + low: { + baseFee: 8, + maxFeePerGas: 9, + maxPriorityFeePerGas: 1 + } + } + } +} + +export const getters = { + oracle: (state, getters, rootState, rootGetters) => { + const netId = Number(rootGetters['metamask/netId']) + const { gasPrices } = rootGetters['metamask/networkConfig'] + + return new GasPriceOracle({ + chainId: netId, + defaultRpc: rootGetters['settings/currentRpc'].url, + defaultFallbackGasPrices: gasPrices + }) + }, + eipSupported: (state, getters, rootState, rootGetters) => { + const netId = rootGetters['metamask/netId'] + const networksWithEIP1559 = [1, 5] + + return networksWithEIP1559.includes(netId) + }, + getGasParams: (state, getters) => (speed = 'fast', isDisable = false) => { + const { maxFeePerGas, maxPriorityFeePerGas } = state.eip[speed] + + if (!isDisable && getters.eipSupported) { + return { + maxFeePerGas: toHex(maxFeePerGas), + maxPriorityFeePerGas: toHex(maxPriorityFeePerGas) + } + } + + return { + gasPrice: getters.getGasPrice(speed) + } + }, + getGasPrice: (state, getters) => (speed = 'fast') => { + const gasPrices = getters.gasPrices + return toHex(toWei(gasPrices[speed].toString(), 'gwei')) + }, + fastGasPrice: (state, getters) => { + return getters.getGasPrice('fast') + }, + gasPrices: (state, getters) => { + const parseGwei = (value) => String(Math.floor(Number(fromWei(String(value), 'gwei')) * 100) / 100) + + const { eip, oracle } = state + + if (getters.eipSupported) { + return { + instant: parseGwei(eip.instant.maxFeePerGas), + low: parseGwei(eip.low.maxFeePerGas), + standard: parseGwei(eip.standard.maxFeePerGas), + fast: parseGwei(eip.fast.maxFeePerGas) + } + } + + return { + instant: String(oracle.instant), + low: String(oracle.low), + standard: String(oracle.standard), + fast: String(oracle.fast) + } + } +} + +export const mutations = { + SAVE_ORACLE_GAS_PRICES(state, { instant, fast, standard, low }) { + this._vm.$set(state.oracle, 'instant', instant) + this._vm.$set(state.oracle, 'fast', fast) + this._vm.$set(state.oracle, 'standard', standard) + this._vm.$set(state.oracle, 'low', low) + }, + SAVE_EIP_GAS_PRICES(state, { instant, fast, standard, low }) { + this._vm.$set(state.eip, 'instant', instant) + this._vm.$set(state.eip, 'fast', fast) + this._vm.$set(state.eip, 'standard', standard) + this._vm.$set(state.eip, 'low', low) + } +} + +export const actions = { + async fetchGasPrice({ getters, commit, dispatch, rootGetters, state }) { + const { pollInterval } = rootGetters['metamask/networkConfig'] + + try { + if (getters.eipSupported) { + const result = await dispatch('estimateFees') + commit('SAVE_EIP_GAS_PRICES', result) + } else { + const gas = await dispatch('getGasPrice') + commit('SAVE_ORACLE_GAS_PRICES', gas) + } + + setTimeout(() => dispatch('fetchGasPrice'), 1000 * pollInterval) + } catch (e) { + console.error('fetchGasPrice', e) + setTimeout(() => dispatch('fetchGasPrice'), 1000 * pollInterval) + } + }, + async estimateFees({ rootGetters }) { + try { + const { url } = rootGetters['settings/currentRpc'] + const web3 = this.$provider.getWeb3(url) + const latestBlock = await web3.eth.getBlock('latest') + + if (!latestBlock.baseFeePerGas) { + throw new Error('An error occurred while fetching current base fee, falling back') + } + + const baseFee = toBN(latestBlock.baseFeePerGas) + + const potentialMaxFee = baseFee.mul(toBN(1125)).div(toBN(1000)) + + const GWEI = (amount) => toBN(toWei(amount, 'gwei')) + + const fastPriorityFee = GWEI('4') + const standardPriorityFee = GWEI('2.5') + const lowPriorityFee = GWEI('1') + + return { + instant: { + baseFee, + maxFeePerGas: potentialMaxFee.add(fastPriorityFee), + maxPriorityFeePerGas: fastPriorityFee + }, + fast: { + baseFee, + maxFeePerGas: potentialMaxFee.add(fastPriorityFee), + maxPriorityFeePerGas: fastPriorityFee + }, + standard: { + baseFee, + maxFeePerGas: potentialMaxFee.add(standardPriorityFee), + maxPriorityFeePerGas: standardPriorityFee + }, + low: { + baseFee, + maxFeePerGas: potentialMaxFee.add(lowPriorityFee), + maxPriorityFeePerGas: lowPriorityFee + } + } + } catch (err) { + throw new Error(err.message) + } + }, + async getGasPrice({ state, getters }) { + try { + const gas = await getters.oracle.gasPrices(state.oracle) + return gas + } catch (err) { + throw new Error(err.message) + } + }, + setDefault({ commit, rootGetters }) { + const { gasPrices } = rootGetters['metamask/networkConfig'] + commit('SAVE_ORACLE_GAS_PRICES', gasPrices) + } +} diff --git a/store/governance/gov.js b/store/governance/gov.js new file mode 100644 index 0000000..d2f12e3 --- /dev/null +++ b/store/governance/gov.js @@ -0,0 +1,922 @@ +/* eslint-disable no-console */ +/* eslint-disable import/order */ +import Web3 from 'web3' +import { ToastProgrammatic as Toast } from 'buefy' + +import networkConfig from '@/networkConfig' + +import ERC20ABI from '@/abis/Governance.abi.json' +import AggregatorABI from '@/abis/Aggregator.abi.json' + +const { numberToHex, toWei, fromWei, toBN, hexToNumber, hexToNumberString } = require('web3-utils') + +const state = () => { + return { + approvalAmount: 'unlimited', + lockedBalance: '0', + isFetchingLockedBalance: false, + currentDelegate: '0x0000000000000000000000000000000000000000', + timestamp: 0, + delegatedBalance: '0', + isFetchingDelegatedBalance: false, + delegators: [], + latestProposalId: { + value: null, + status: null + }, + isFetchingProposals: true, + proposals: [], + voterReceipts: [], + hasActiveProposals: false, + constants: { + EXECUTION_DELAY: 172800, + EXECUTION_EXPIRATION: 259200, + PROPOSAL_THRESHOLD: '1000000000000000000000', + QUORUM_VOTES: '25000000000000000000000', + VOTING_PERIOD: 432000 + } + } +} + +const getters = { + govContract: (state, getters, rootState) => ({ netId }) => { + const config = networkConfig[`netId${netId}`] + const { url } = rootState.settings[`netId${netId}`].rpc + const address = config['governance.contract.tornadocash.eth'] + if (address) { + const web3 = new Web3(url) + return new web3.eth.Contract(ERC20ABI, address) + } + + return null + }, + aggregatorContract: (state, getters, rootState, rootGetters) => { + const { aggregatorContract } = rootGetters['metamask/networkConfig'] + const { url } = rootGetters['settings/currentRpc'] + const web3 = new Web3(url) + return new web3.eth.Contract(AggregatorABI, aggregatorContract) + }, + isFetchingProposals: ({ proposals, isFetchingProposals }) => { + if (proposals && proposals.length && !isFetchingProposals) { + return false + } + + return isFetchingProposals + }, + votingPower: (state) => { + return toBN(state.lockedBalance) + .add(toBN(state.delegatedBalance)) + .toString(10) + }, + quorumVotes: (state, getters, rootState, rootGetters) => { + return rootGetters['token/toDecimals'](state.constants.QUORUM_VOTES, 18) + }, + votingPeriod: (state) => { + return toBN(state.constants.VOTING_PERIOD) + .divRound(toBN(24 * 60 * 60)) + .toNumber() + }, + isEnabledGovernance: (state, getters, rootState, rootGetters) => { + return Boolean(rootGetters['metamask/networkConfig']['governance.contract.tornadocash.eth']) + }, + constants: (state) => { + return state.constants + }, + isFetchingBalances: (state) => { + return state.isFetchingLockedBalance || state.isFetchingDelegatedBalance + } +} + +const mutations = { + SET_APPROVAL_AMOUNT(state, { approvalAmount }) { + state.approvalAmount = approvalAmount + }, + SAVE_FETCHING_PROPOSALS(state, status) { + this._vm.$set(state, 'isFetchingProposals', status) + }, + SAVE_LOCKED_BALANCE(state, { balance }) { + this._vm.$set(state, 'lockedBalance', balance) + }, + SAVE_FETCHING_LOCKED_BALANCE(state, status) { + this._vm.$set(state, 'isFetchingLockedBalance', status) + }, + SAVE_LOCKED_TIMESTAMP(state, { timestamp }) { + this._vm.$set(state, 'timestamp', timestamp) + }, + SAVE_LATEST_PROPOSAL_ID(state, { id, status }) { + this._vm.$set(state, 'latestProposalId', { value: id, status }) + }, + SAVE_DELEGATEE(state, { currentDelegate }) { + this._vm.$set(state, 'currentDelegate', currentDelegate) + }, + SAVE_PROPOSALS(state, proposals) { + this._vm.$set(state, 'proposals', proposals) + }, + SAVE_VOTER_RECEIPT(state, { hasVoted, support, balance, id }) { + this._vm.$set(state.voterReceipts, id, { hasVoted, support, balance }) + }, + SAVE_DELEGATED_BALANCE(state, balance) { + this._vm.$set(state, 'delegatedBalance', balance) + }, + SAVE_FETCHING_DELEGATED_BALANCE(state, status) { + this._vm.$set(state, 'isFetchingDelegatedBalance', status) + }, + SAVE_DELEGATORS(state, uniq) { + this._vm.$set(state, 'delegators', uniq) + }, + SET_HAS_ACTIVE_PROPOSALS(state, condition) { + this._vm.$set(state, 'hasActiveProposals', condition) + }, + SAVE_CONSTANTS(state, constants) { + this._vm.$set(state, 'constants', constants) + } +} + +// enum ProposalState { Pending, Active, Defeated, Timelocked, AwaitingExecution, Executed, Expired } + +const ProposalState = [ + 'pending', + 'active', + 'defeated', + 'timeLocked', + 'awaitingExecution', + 'executed', + 'expired' +] + +const proposalIntervalConstants = [ + // 'CLOSING_PERIOD', + 'EXECUTION_DELAY', + 'EXECUTION_EXPIRATION', + // 'VOTE_EXTEND_TIME', + // 'VOTING_DELAY', + 'VOTING_PERIOD' +] +const govConstants = ['PROPOSAL_THRESHOLD', 'QUORUM_VOTES'] + +const actions = { + async createProposal( + { getters, rootGetters, state, commit, rootState, dispatch }, + { proposalAddress, title, description } + ) { + try { + const { ethAccount } = rootState.metamask + const netId = rootGetters['metamask/netId'] + + const govInstance = getters.govContract({ netId }) + const json = JSON.stringify({ title, description }) + const data = await govInstance.methods.propose(proposalAddress, json).encodeABI() + + const gas = await govInstance.methods + .propose(proposalAddress, json) + .estimateGas({ from: ethAccount, value: 0 }) + + const callParams = { + method: 'eth_sendTransaction', + params: { + to: govInstance._address, + gas: numberToHex(gas + 100000), + data + }, + watcherParams: { + title: 'creatingProposal', + successTitle: 'proposalCreated', + storeType: 'govTxs', + onSuccess: () => { + dispatch('torn/fetchTokenBalance', {}, { root: true }) + } + }, + isSaving: false + } + + const txHash = await dispatch('metamask/sendTransaction', callParams, { root: true }) + + commit( + 'txHashKeeper/SAVE_TX_HASH', + { + txHash, + storeType: 'govTxs', + type: 'Proposal', + netId + }, + { root: true } + ) + + await dispatch('fetchProposals', { requestId: state.proposals.length }) + + this.$router.push('/governance') + } catch (e) { + console.error('createProposal', e.message) + dispatch( + 'notice/addNoticeWithInterval', + { + notice: { + title: 'internalError', + type: 'danger' + }, + interval: 3000 + }, + { root: true } + ) + } + }, + async lock({ getters, rootGetters, commit, rootState, dispatch }) { + try { + const { ethAccount } = rootState.metamask + const netId = rootGetters['metamask/netId'] + const { deadline, v, r, s } = rootState.torn.signature + const govInstance = getters.govContract({ netId }) + const amount = toWei(rootState.torn.signature.amount.toString()) + const gas = await govInstance.methods + .lock(ethAccount, amount, deadline, v, r, s) + .estimateGas({ from: ethAccount, value: 0 }) + const data = await govInstance.methods.lock(ethAccount, amount, deadline, v, r, s).encodeABI() + + const callParams = { + method: 'eth_sendTransaction', + params: { + to: govInstance._address, + gas: numberToHex(gas + 30000), + data + }, + watcherParams: { + title: 'locking', + successTitle: 'lockedNotice', + storeType: 'govTxs', + onSuccess: () => { + dispatch('fetchBalances') + dispatch('torn/fetchTokenBalance', {}, { root: true }) + commit('torn/REMOVE_SIGNATURE', {}, { root: true }) + } + }, + isAwait: false + } + + const txHash = await dispatch('metamask/sendTransaction', callParams, { root: true }) + + commit( + 'txHashKeeper/SAVE_TX_HASH', + { + txHash, + storeType: 'govTxs', + type: 'Lock', + netId + }, + { root: true } + ) + } catch (e) { + console.error('lock', e.message) + dispatch( + 'notice/addNoticeWithInterval', + { + notice: { + title: 'internalError', + type: 'danger' + }, + interval: 3000 + }, + { root: true } + ) + } + }, + async lockWithApproval({ getters, rootGetters, commit, rootState, dispatch }, { amount }) { + try { + const { ethAccount } = rootState.metamask + const netId = rootGetters['metamask/netId'] + const govInstance = getters.govContract({ netId }) + amount = toWei(amount.toString()) + const gas = await govInstance.methods + .lockWithApproval(amount) + .estimateGas({ from: ethAccount, value: 0 }) + const data = await govInstance.methods.lockWithApproval(amount).encodeABI() + + const callParams = { + method: 'eth_sendTransaction', + params: { + to: govInstance._address, + gas: numberToHex(gas + 100000), + data + }, + watcherParams: { + title: 'locking', + successTitle: 'lockedNotice', + storeType: 'govTxs', + onSuccess: () => { + dispatch('fetchBalances') + dispatch('torn/fetchTokenBalance', {}, { root: true }) + dispatch('torn/fetchTokenAllowance', {}, { root: true }) + } + }, + isAwait: false + } + + const txHash = await dispatch('metamask/sendTransaction', callParams, { root: true }) + + commit( + 'txHashKeeper/SAVE_TX_HASH', + { + txHash, + storeType: 'govTxs', + type: 'Lock', + netId + }, + { root: true } + ) + } catch (e) { + console.error('lockWithApproval', e.message) + Toast.open({ + message: this.app.i18n.t('internalError'), + type: 'is-danger', + duration: 3000 + }) + } + }, + async castVote({ getters, rootGetters, commit, rootState, dispatch, state }, { id, support }) { + try { + const { ethAccount } = rootState.metamask + const netId = rootGetters['metamask/netId'] + const govInstance = getters.govContract({ netId }) + const delegators = [...state.delegators] + + if (toBN(state.lockedBalance).gt(toBN('0'))) { + delegators.push(ethAccount) + } + + const gas = await govInstance.methods + .castDelegatedVote(delegators, id, support) + .estimateGas({ from: ethAccount, value: 0 }) + const data = await govInstance.methods.castDelegatedVote(delegators, id, support).encodeABI() + + const callParams = { + method: 'eth_sendTransaction', + params: { + to: govInstance._address, + gas: numberToHex(gas + 30000), + data + }, + watcherParams: { + title: support ? 'votingFor' : 'votingAgainst', + successTitle: support ? 'votedFor' : 'votedAgainst', + storeType: 'govTxs', + onSuccess: () => { + dispatch('fetchProposals', { requestId: id }) + } + }, + isAwait: false + } + + const txHash = await dispatch('metamask/sendTransaction', callParams, { root: true }) + + commit( + 'txHashKeeper/SAVE_TX_HASH', + { + txHash, + storeType: 'govTxs', + type: 'CastVote', + netId + }, + { root: true } + ) + } catch (e) { + console.error('castVote', e.message) + dispatch( + 'notice/addNoticeWithInterval', + { + notice: { + title: 'internalError', + type: 'danger' + }, + interval: 3000 + }, + { root: true } + ) + } finally { + dispatch('loading/disable', {}, { root: true }) + } + }, + async executeProposal({ getters, rootGetters, commit, rootState, dispatch }, { id }) { + try { + const { ethAccount } = rootState.metamask + const netId = rootGetters['metamask/netId'] + const govInstance = getters.govContract({ netId }) + const gas = await govInstance.methods.execute(id).estimateGas({ from: ethAccount, value: 0 }) + const data = await govInstance.methods.execute(id).encodeABI() + + const callParams = { + method: 'eth_sendTransaction', + params: { + to: govInstance._address, + gas: numberToHex(gas + 100000), + data + }, + watcherParams: { + title: 'executingProposal', + successTitle: 'proposalExecuted', + storeType: 'govTxs', + onSuccess: () => { + dispatch('fetchProposals', { requestId: id }) + } + }, + isAwait: false + } + + const txHash = await dispatch('metamask/sendTransaction', callParams, { root: true }) + + commit( + 'txHashKeeper/SAVE_TX_HASH', + { + txHash, + storeType: 'govTxs', + type: 'ExecuteProposal', + netId + }, + { root: true } + ) + } catch (e) { + console.error('executeProposal', e.message) + dispatch( + 'notice/addNoticeWithInterval', + { + notice: { + title: 'internalError', + type: 'danger' + }, + interval: 3000 + }, + { root: true } + ) + } + }, + async unlock({ getters, rootGetters, commit, rootState, dispatch }, { amount }) { + try { + const { ethAccount } = rootState.metamask + const netId = rootGetters['metamask/netId'] + const govInstance = getters.govContract({ netId }) + amount = toWei(amount.toString()) + const gas = await govInstance.methods.unlock(amount).estimateGas({ from: ethAccount, value: 0 }) + const data = await govInstance.methods.unlock(amount).encodeABI() + + const callParams = { + method: 'eth_sendTransaction', + params: { + to: govInstance._address, + gas: numberToHex(gas + 100000), + data + }, + watcherParams: { + title: 'unlocking', + successTitle: 'unlocked', + storeType: 'govTxs', + onSuccess: () => { + dispatch('fetchBalances') + dispatch('torn/fetchTokenBalance', {}, { root: true }) + commit('torn/REMOVE_SIGNATURE', {}, { root: true }) + } + }, + isAwait: false + } + + const txHash = await dispatch('metamask/sendTransaction', callParams, { root: true }) + + commit( + 'txHashKeeper/SAVE_TX_HASH', + { + txHash, + storeType: 'govTxs', + type: 'Unlock', + netId + }, + { root: true } + ) + } catch (e) { + console.error('unlock', e.message) + dispatch( + 'notice/addNoticeWithInterval', + { + notice: { + title: 'internalError', + type: 'danger' + }, + interval: 3000 + }, + { root: true } + ) + } + }, + async delegate({ getters, rootGetters, commit, rootState, dispatch }, { delegatee }) { + try { + const { ethAccount } = rootState.metamask + const netId = rootGetters['metamask/netId'] + + const govInstance = getters.govContract({ netId }) + const gas = await govInstance.methods.delegate(delegatee).estimateGas({ from: ethAccount, value: 0 }) + const data = await govInstance.methods.delegate(delegatee).encodeABI() + + const callParams = { + method: 'eth_sendTransaction', + params: { + to: govInstance._address, + gas: numberToHex(gas + 100000), + data + }, + watcherParams: { + title: 'delegating', + successTitle: 'delegated', + storeType: 'govTxs', + onSuccess: () => { + dispatch('fetchDelegatee') + } + }, + isAwait: false + } + + const txHash = await dispatch('metamask/sendTransaction', callParams, { root: true }) + + commit( + 'txHashKeeper/SAVE_TX_HASH', + { + storeType: 'govTxs', + txHash, + type: 'Delegate', + netId + }, + { root: true } + ) + } catch (e) { + console.error('delegate', e.message) + dispatch( + 'notice/addNoticeWithInterval', + { + notice: { + title: 'internalError', + type: 'danger' + }, + interval: 3000 + }, + { root: true } + ) + } + }, + async undelegate({ getters, rootGetters, commit, rootState, dispatch }) { + try { + const { ethAccount } = rootState.metamask + const netId = rootGetters['metamask/netId'] + + const govInstance = getters.govContract({ netId }) + const gas = await govInstance.methods.undelegate().estimateGas({ from: ethAccount, value: 0 }) + const data = await govInstance.methods.undelegate().encodeABI() + + const callParams = { + method: 'eth_sendTransaction', + params: { + to: govInstance._address, + gas: numberToHex(gas + 100000), + data + }, + watcherParams: { + title: 'undelegating', + successTitle: 'undelegated', + storeType: 'govTxs', + onSuccess: () => { + dispatch('fetchDelegatee') + } + }, + isAwait: false + } + + const txHash = await dispatch('metamask/sendTransaction', callParams, { root: true }) + + commit( + 'txHashKeeper/SAVE_TX_HASH', + { + txHash, + storeType: 'govTxs', + type: 'Undelegate', + netId + }, + { root: true } + ) + } catch (e) { + console.error('undelegate', e.message) + dispatch( + 'notice/addNoticeWithInterval', + { + notice: { + title: 'internalError', + type: 'danger' + }, + interval: 3000 + }, + { root: true } + ) + } + }, + async fetchProposals({ rootGetters, getters, commit }, { requestId }) { + let proposals + try { + commit('SAVE_FETCHING_PROPOSALS', true) + + const netId = rootGetters['metamask/netId'] + const aggregatorContract = getters.aggregatorContract + const govInstance = getters.govContract({ netId }) + + if (!govInstance) { + return + } + + proposals = await govInstance.getPastEvents('ProposalCreated', { + fromBlock: 0, + toBlock: 'latest' + }) + let title, description, rest + proposals = proposals.map((e) => { + try { + ;({ title, description } = JSON.parse(e.returnValues.description)) + } catch (err) { + ;[title, ...rest] = e.returnValues.description.split('\n', 2) + description = rest.join('\n') + } + + const netId = rootGetters['metamask/netId'] + if (netId === 1) { + switch (Number(e.returnValues.id)) { + case 1: + description = 'See: https://torn.community/t/proposal-1-enable-torn-transfers/38' + break + case 10: + ;({ title, description } = JSON.parse(e.returnValues.description.replaceAll('\n', ''))) + break + case 11: + ;({ title, description } = JSON.parse( + e.returnValues.description.replace('"description"', ',"description"') + )) + } + } + + return { + id: Number(e.returnValues.id), + title, + description, + endTime: Number(e.returnValues.endTime), + startTime: Number(e.returnValues.startTime), + proposer: e.returnValues.proposer, + target: e.returnValues.target, + results: { + for: '0', + against: '0' + } + } + }) + const statuses = await aggregatorContract.methods.getAllProposals(govInstance._address).call() + proposals = proposals + .map((p) => { + const proposal = statuses[Number(p.id) - 1] + + if (proposal.extended) { + p.endTime = Number(proposal.endTime) + } + + p.status = ProposalState[Number(proposal.state)] + p.results = { + for: fromWei(proposal.forVotes), + against: fromWei(proposal.againstVotes) + } + return p + }) + .sort((a, b) => { + return a.id - b.id + }) + if (requestId) { + return proposals[requestId] + } + } catch (e) { + console.error('fetchProposals', e.message) + } finally { + commit('SAVE_PROPOSALS', proposals) + commit('SAVE_FETCHING_PROPOSALS', false) + } + }, + async fetchBalances({ getters, rootGetters, commit, rootState }) { + try { + commit('SAVE_FETCHING_LOCKED_BALANCE', true) + const { ethAccount } = rootState.metamask + + if (!ethAccount) { + return + } + + const netId = rootGetters['metamask/netId'] + + const govInstance = getters.govContract({ netId }) + const balance = await govInstance.methods.lockedBalance(ethAccount).call() + commit('SAVE_LOCKED_BALANCE', { balance }) + } catch (e) { + console.error('fetchBalances', e.message) + } finally { + commit('SAVE_FETCHING_LOCKED_BALANCE', false) + } + }, + async fetchedLockedTimestamp({ getters, rootGetters, commit, rootState, dispatch }) { + try { + const { ethAccount } = rootState.metamask + + if (!ethAccount) { + return + } + + const netId = rootGetters['metamask/netId'] + + const govInstance = getters.govContract({ netId }) + const timestamp = await govInstance.methods.canWithdrawAfter(ethAccount).call() + commit('SAVE_LOCKED_TIMESTAMP', { timestamp }) + } catch (e) { + console.error('fetchedLockedTimestamp', e.message) + } + }, + async fetchLatestProposalId({ getters, rootGetters, commit, rootState, state }) { + try { + const { ethAccount } = rootState.metamask + + if (!ethAccount) { + return + } + + const netId = rootGetters['metamask/netId'] + + const govInstance = getters.govContract({ netId }) + const id = await govInstance.methods.latestProposalIds(ethAccount).call() + let status = null + if (Number(id)) { + status = await govInstance.methods.state(id).call() + status = Number(status) > 1 ? null : 'active' + } + commit('SAVE_LATEST_PROPOSAL_ID', { id, status }) + console.log('status', state.latestProposalId) + } catch (e) { + console.error('fetchLatestProposalId', e.message) + } + }, + async fetchDelegatedBalance({ getters, rootGetters, commit, rootState, dispatch }) { + try { + commit('SAVE_FETCHING_DELEGATED_BALANCE', true) + const { ethAccount } = rootState.metamask + + if (!ethAccount) { + return + } + + const netId = rootGetters['metamask/netId'] + + const aggregatorContract = getters.aggregatorContract + const govInstance = getters.govContract({ netId }) + let delegatedAccs = await govInstance.getPastEvents('Delegated', { + filter: { + to: ethAccount + }, + fromBlock: 0, + toBlock: 'latest' + }) + let undelegatedAccs = await govInstance.getPastEvents('Undelegated', { + filter: { + from: ethAccount + }, + fromBlock: 0, + toBlock: 'latest' + }) + delegatedAccs = delegatedAccs.map((acc) => acc.returnValues.account) + undelegatedAccs = undelegatedAccs.map((acc) => acc.returnValues.account) + const uniq = delegatedAccs.filter((obj, index, self) => { + const indexUndelegated = undelegatedAccs.indexOf(obj) + if (indexUndelegated !== -1) { + undelegatedAccs.splice(indexUndelegated, 1) + return false + } + return true + }) + let balances = await aggregatorContract.methods.getGovernanceBalances(govInstance._address, uniq).call() + balances = balances.reduce((acc, balance, i) => { + acc = acc.add(toBN(balance)) + return acc + }, toBN('0')) + commit('SAVE_DELEGATED_BALANCE', balances.toString(10)) + commit('SAVE_DELEGATORS', uniq) + } catch (e) { + console.error('fetchDelegatedBalance', e.message) + } finally { + commit('SAVE_FETCHING_DELEGATED_BALANCE', false) + } + }, + async fetchDelegatee({ getters, rootGetters, commit, rootState, dispatch }) { + try { + const { ethAccount } = rootState.metamask + + if (!ethAccount) { + return + } + + const netId = rootGetters['metamask/netId'] + + const govInstance = getters.govContract({ netId }) + const currentDelegate = await govInstance.methods.delegatedTo(ethAccount).call() + console.log('currentDelegate', currentDelegate) + commit('SAVE_DELEGATEE', { currentDelegate }) + } catch (e) { + console.error('fetchDelegatee', e.message) + } + }, + async fetchReceipt({ getters, rootGetters, commit, rootState, dispatch }, { id }) { + try { + const { ethAccount } = rootState.metamask + const netId = rootGetters['metamask/netId'] + console.log('fetchReceipt', id) + const govInstance = getters.govContract({ netId }) + const [hasVoted, support, balance] = await govInstance.methods.getReceipt(id, ethAccount).call() + console.log('fetchReceipt', hasVoted, support, balance) + commit('SAVE_VOTER_RECEIPT', { hasVoted, support, balance, id }) + } catch (e) { + console.error('fetchReceipt', e.message) + } + }, + async fetchUserData({ getters, rootGetters, commit, rootState, dispatch }) { + try { + commit('SAVE_FETCHING_LOCKED_BALANCE', true) + const { ethAccount } = rootState.metamask + + if (!ethAccount) { + return + } + + const netId = rootGetters['metamask/netId'] + const govInstance = getters.govContract({ netId }) + const aggregatorContract = getters.aggregatorContract + const { + balance, + latestProposalId, + timelock, + delegatee, + ...userdata + } = await aggregatorContract.methods.getUserData(govInstance._address, ethAccount).call() + commit('SAVE_DELEGATEE', { currentDelegate: delegatee }) + + const latestProposalIdState = ProposalState[Number(userdata.latestProposalIdState)] + commit('SAVE_LATEST_PROPOSAL_ID', { id: Number(latestProposalId), status: latestProposalIdState }) + commit('SAVE_LOCKED_TIMESTAMP', { timestamp: Number(timelock) }) + commit('SAVE_LOCKED_BALANCE', { balance }) + } catch (e) { + console.error('fetchUserData', e.message) + } finally { + commit('SAVE_FETCHING_LOCKED_BALANCE', false) + } + }, + async checkActiveProposals({ getters, rootGetters, commit }) { + if (!getters.isEnabledGovernance) { + return + } + + const { 'governance.contract.tornadocash.eth': governanceAddress } = rootGetters['metamask/networkConfig'] + const aggregatorContract = getters.aggregatorContract + + const statuses = await aggregatorContract.methods.getAllProposals(governanceAddress).call() + let isActive = false + if (statuses && Array.isArray(statuses)) { + isActive = statuses.find((status) => Number(status.state) === 1) + } + + commit('SET_HAS_ACTIVE_PROPOSALS', Boolean(isActive)) + }, + async fetchConstants({ commit, getters, dispatch, rootGetters }) { + const netId = rootGetters['metamask/netId'] + const govInstance = getters.govContract({ netId }) + const constants = [].concat(govConstants, proposalIntervalConstants) + + const params = constants.map((name) => { + return { + target: govInstance._address, + callData: govInstance.methods[name]().encodeABI() + } + }) + + const multicallArray = await dispatch('application/aggregateMulticall', { params }, { root: true }) + + if (multicallArray) { + const hexToNumberConverter = (acc, curr, index) => { + const name = constants[index] + const value = govConstants.includes(name) ? hexToNumberString(curr) : hexToNumber(curr) + + return { ...acc, [name]: value } + } + + const result = multicallArray.reduce(hexToNumberConverter, {}) + + commit('SAVE_CONSTANTS', result) + } + } +} + +export default { + namespaced: true, + state, + getters, + mutations, + actions +} diff --git a/store/governance/staking.js b/store/governance/staking.js new file mode 100644 index 0000000..8d48d0a --- /dev/null +++ b/store/governance/staking.js @@ -0,0 +1,137 @@ +import Web3 from 'web3' +import { numberToHex, fromWei } from 'web3-utils' + +import networkConfig from '@/networkConfig' + +import TornadoStakingRewardsABI from '@/abis/TornadoStakingRewards.abi.json' + +export const state = () => { + return { + accumulatedReward: '0', + isCheckingReward: false + } +} + +export const getters = { + stakingRewardsContract: (state, getters, rootState) => ({ netId }) => { + const config = networkConfig[`netId${netId}`] + const { url } = rootState.settings[`netId${netId}`].rpc + const address = config['staking-rewards.contract.tornadocash.eth'] + + if (address) { + const web3 = new Web3(url) + return new web3.eth.Contract(TornadoStakingRewardsABI, address) + } + + return null + }, + reward: (state) => { + return fromWei(state.accumulatedReward) + }, + isCheckingReward: (state) => { + return state.isCheckingReward + } +} + +export const mutations = { + SAVE_ACCUMULATED_REWARD(state, payload) { + state.accumulatedReward = payload + }, + SAVE_CHECKING_REWARD(state, payload) { + this._vm.$set(state, 'isCheckingReward', payload) + } +} + +export const actions = { + async checkReward({ getters, rootGetters, rootState, commit }) { + try { + commit('SAVE_CHECKING_REWARD', true) + + const netId = rootGetters['metamask/netId'] + const { ethAccount } = rootState.metamask + const stakingRewardsInstance = getters.stakingRewardsContract({ netId }) + + if (!stakingRewardsInstance) { + return + } + + const reward = await stakingRewardsInstance.methods.checkReward(ethAccount).call() + + commit('SAVE_ACCUMULATED_REWARD', reward) + } catch (err) { + console.error('checkReward', err.message) + } finally { + commit('SAVE_CHECKING_REWARD', false) + } + }, + async claimReward({ state, getters, rootGetters, rootState, commit, dispatch }) { + try { + const netId = rootGetters['metamask/netId'] + const { ethAccount } = rootState.metamask + const stakingRewardsInstance = getters.stakingRewardsContract({ netId }) + + if (!stakingRewardsInstance) { + return + } + + const data = await stakingRewardsInstance.methods.getReward().encodeABI() + const gas = await stakingRewardsInstance.methods.getReward().estimateGas({ from: ethAccount, value: 0 }) + + const currency = 'TORN' + const amount = rootGetters['token/toDecimals'](state.accumulatedReward, 18) + + const callParams = { + method: 'eth_sendTransaction', + params: { + to: stakingRewardsInstance._address, + gas: numberToHex(gas + 100000), + data + }, + watcherParams: { + title: { + path: 'claiming', + amount, + currency + }, + successTitle: { + path: 'claimedValue', + amount, + currency + }, + storeType: 'govTxs', + onSuccess: () => { + dispatch('torn/fetchTokenBalance', {}, { root: true }) + dispatch('checkReward') + } + }, + isSaving: false + } + + const txHash = await dispatch('metamask/sendTransaction', callParams, { root: true }) + + commit( + 'txHashKeeper/SAVE_TX_HASH', + { + txHash, + storeType: 'govTxs', + type: 'Reward', + netId + }, + { root: true } + ) + } catch (err) { + console.error('claimReward', err.message) + dispatch( + 'notice/addNoticeWithInterval', + { + notice: { + title: 'internalError', + type: 'danger' + }, + interval: 3000 + }, + { root: true } + ) + } + } +} diff --git a/store/loading.js b/store/loading.js new file mode 100644 index 0000000..00d54bf --- /dev/null +++ b/store/loading.js @@ -0,0 +1,42 @@ +export const state = () => { + return { + message: '', + enabled: false, + type: null + } +} + +export const getters = {} + +export const mutations = { + ENABLE(state, { message, type }) { + state.message = message + state.enabled = true + state.type = type + }, + DISABLE(state) { + state.message = '' + state.enabled = false + state.type = null + } +} + +export const actions = { + enable({ commit }, { message = this.app.i18n.t('loading') }) { + commit('ENABLE', { message }) + }, + changeText({ commit }, { message, type }) { + commit('ENABLE', { message, type }) + }, + disable({ commit }) { + commit('DISABLE') + }, + showConfirmLoader({ dispatch, rootState }) { + dispatch('changeText', { + message: this.app.i18n.t('pleaseConfirmTransactionInWallet', { + wallet: rootState.metamask.walletName + }), + type: 'approve' + }) + } +} diff --git a/store/metamask.js b/store/metamask.js new file mode 100644 index 0000000..086a500 --- /dev/null +++ b/store/metamask.js @@ -0,0 +1,614 @@ +/* eslint-disable no-console */ +import BN from 'bignumber.js' +import { hexToNumber, numberToHex } from 'web3-utils' +import { SnackbarProgrammatic as Snackbar } from 'buefy' + +import { PROVIDERS } from '@/constants' +import networkConfig from '@/networkConfig' +import { walletConnectConnector } from '@/services' + +import SanctionsListAbi from '@/abis/SanctionsList.abi' + +const { toChecksumAddress } = require('web3-utils') + +const state = () => { + return { + netId: 1, + walletName: '', + ethBalance: '0', + ethAccount: null, + providerConfig: {}, + providerName: null, + isInitialized: false, + isReconnecting: false, + mismatchNetwork: false + } +} + +const getters = { + isWalletConnect(state) { + return state.providerConfig.name === 'WalletConnect' + }, + isPartialSupport(state) { + return state.providerConfig.isPartialSupport + }, + hasEthAccount(state) { + return state.ethAccount !== null + }, + mismatchNetwork(state) { + return state.mismatchNetwork + }, + netId(state) { + return state.netId + }, + networkName(state) { + return networkConfig[`netId${state.netId}`].networkName + }, + currency(state) { + return networkConfig[`netId${state.netId}`].currencyName + }, + nativeCurrency(state) { + return networkConfig[`netId${state.netId}`].nativeCurrency + }, + networkConfig(state) { + const conf = networkConfig[`netId${state.netId}`] + return conf || networkConfig.netId1 + }, + getEthereumProvider: (state, getters) => (netId) => { + switch (state.providerName) { + case 'walletConnect': + return walletConnectConnector(netId || getters.netId) + case 'metamask': + case 'trustwallet': + case 'imtoken': + case 'alphawallet': + case 'generic': + default: + if (window.ethereum) { + return window.ethereum + } else { + throw new Error(this.app.i18n.t('networkDoesNotHaveEthereumProperty')) + } + } + }, + isLoggedIn: (state, getters) => { + return !!state.providerName && getters.hasEthAccount + } +} + +const mutations = { + IDENTIFY(state, ethAccount) { + state.ethAccount = ethAccount + }, + SET_NET_ID(state, netId) { + netId = parseInt(netId, 10) + state.netId = netId + }, + SET_RECONNECTING(state, bool) { + state.isReconnecting = bool + }, + SET_MISMATCH_NETWORK(state, payload) { + state.mismatchNetwork = payload + }, + SAVE_BALANCE(state, ethBalance) { + state.ethBalance = ethBalance + }, + SET_WALLET_NAME(state, walletName) { + state.walletName = walletName + }, + SET_PROVIDER_NAME(state, providerName) { + state.providerName = providerName + state.providerConfig = PROVIDERS[providerName] + window.localStorage.setItem('provider', providerName) + }, + CLEAR_PROVIDER(state) { + state.providerName = null + state.providerConfig = {} + }, + SET_INITIALIZED(state, initialized) { + state.isInitialized = initialized + } +} + +const actions = { + async initialize({ dispatch, commit, getters, rootState, rootGetters }, payload) { + await dispatch('askPermission', payload) + + dispatch('governance/gov/checkActiveProposals', {}, { root: true }) + }, + onSetInitializeData({ commit, dispatch, state }, isMismatch) { + if (isMismatch) { + commit('IDENTIFY', null) + commit('SET_INITIALIZED', false) + } else { + const providerName = window.localStorage.getItem('provider') + + if (providerName && !state.isInitialized) { + dispatch('initialize', { providerName }) + } + } + + commit('SET_MISMATCH_NETWORK', isMismatch) + }, + async checkMismatchNetwork({ dispatch, commit, state, getters }, netId) { + if (getters.isWalletConnect) { + const { id } = this.$provider.config + + const isMismatch = Number(netId) !== Number(id) + + await dispatch('onSetInitializeData', isMismatch) + return + } + if (!window.ethereum) { + return + } + const chainId = await window.ethereum.request({ method: 'eth_chainId' }) + const isMismatch = Number(netId) !== hexToNumber(chainId) + + await dispatch('onSetInitializeData', isMismatch) + }, + async sendTransaction( + { dispatch, state, rootGetters }, + { method, params, watcherParams, isAwait = true, isSaving = true, eipDisable = false } + ) { + try { + const { ethAccount, netId } = state + const gasParams = rootGetters['gasPrices/getGasParams']('fast', eipDisable) + + if (params.gasPrice && 'gasPrice' in gasParams) { + gasParams.gasPrice = params.gasPrice.value + } + + const callParams = { + method, + params: [ + { + value: '0x00', + from: ethAccount, + ...params, + ...gasParams + } + ] + } + + dispatch('loading/showConfirmLoader', {}, { root: true }) + + const txHash = await this.$provider.sendRequest(callParams) + + dispatch( + 'loading/changeText', + { message: this.app.i18n.t('waitUntilTransactionIsMined') }, + { root: true } + ) + + const activeWatcher = () => + dispatch( + 'txHashKeeper/runTxWatcherWithNotifications', + { + ...watcherParams, + txHash, + isSaving, + netId + }, + { root: true } + ) + + if (isAwait) { + await activeWatcher() + } else { + activeWatcher() + } + + dispatch('loading/disable', {}, { root: true }) + + return txHash + } catch (err) { + if (err.message.includes('EIP-1559')) { + return await dispatch('sendTransaction', { + method, + params, + watcherParams, + isAwait, + isSaving, + eipDisable: true + }) + } else { + throw new Error(this.app.i18n.t('rejectedRequest', { description: state.walletName })) + } + } finally { + dispatch('loading/disable', {}, { root: true }) + } + }, + async getEncryptionPublicKey({ state }) { + try { + const { ethAccount } = state + + const callParams = { + method: 'eth_getEncryptionPublicKey', + params: [ethAccount] + } + + const key = await this.$provider.sendRequest(callParams) + return key + } catch (err) { + let errorMessage = 'decryptFailed' + + if (err.message.includes('Trezor')) { + errorMessage = 'trezorNotSupported' + } else if (err.message.includes('Ledger')) { + errorMessage = 'ledgerNotSupported' + } + + const isRejected = err.message.includes( + 'MetaMask EncryptionPublicKey: User denied message EncryptionPublicKey.' + ) + + if (isRejected) { + throw new Error(this.app.i18n.t('rejectedRequest', { description: state.walletName })) + } + + throw new Error(this.app.i18n.t(errorMessage)) + } + }, + async ethDecrypt({ state }, hexData) { + try { + const { ethAccount } = state + + const callParams = { + method: 'eth_decrypt', + params: [hexData, ethAccount] + } + + const encryptedData = await this.$provider.sendRequest(callParams) + return encryptedData + } catch (err) { + throw new Error(`Method ethDecrypt has error: ${err.message}`) + } + }, + async onAccountsChanged({ dispatch, commit }, { newAccount }) { + if (newAccount) { + const account = toChecksumAddress(newAccount) + commit('IDENTIFY', account) + await dispatch('updateAccountBalance') + } else { + await dispatch('onLogOut') + } + }, + onLogOut({ commit, getters, dispatch }) { + if (getters.isWalletConnect) { + const mobileProvider = this.$provider.provider + + if (typeof mobileProvider.close === 'function') { + mobileProvider.close() + } + } + commit('IDENTIFY', null) + dispatch('clearProvider') + commit('SET_INITIALIZED', false) + }, + async mobileWalletReconnect({ state, dispatch, commit, rootState }, { netId }) { + try { + commit('SET_RECONNECTING', true) + const { providerName } = state + const { enabled } = rootState.loading + + await dispatch('onLogOut') + await dispatch('initialize', { providerName, chosenNetId: netId }) + + if (enabled) { + await dispatch('loading/disable', {}, { root: true }) + } + } catch ({ message }) { + throw new Error(`Mobile wallet reconnect error: ${message}`) + } finally { + commit('SET_RECONNECTING', false) + } + }, + async networkChangeHandler({ state, getters, commit, dispatch }, params) { + try { + if (getters.isWalletConnect) { + await dispatch('mobileWalletReconnect', params) + this.$provider._onNetworkChanged({ id: params.netId }) + } else { + if (state.isInitialized) { + await dispatch('switchNetwork', params) + } + await dispatch('onNetworkChanged', params) + } + } catch (err) { + console.error('networkChangeHandler', err.message) + } + }, + async checkIsSanctioned({ rootGetters }, { address }) { + const ethProvider = rootGetters['relayer/ethProvider'] + const contract = new ethProvider.eth.Contract( + SanctionsListAbi, + '0x40C57923924B5c5c5455c48D93317139ADDaC8fb' + ) + + const isSanctioned = await contract.methods.isSanctioned(address).call() + + if (isSanctioned) { + window.onbeforeunload = null + window.location = 'https://twitter.com/TornadoCash/status/1514904975037669386' + } + }, + async onNetworkChanged({ state, getters, commit, dispatch }, { netId }) { + dispatch('checkMismatchNetwork', netId) + + if (netId !== 'loading' && Number(state.netId) !== Number(netId)) { + try { + if (!networkConfig[`netId${netId}`]) { + dispatch('clearProvider') + + Snackbar.open({ + message: this.app.i18n.t('currentNetworkIsNotSupported'), + type: 'is-primary', + position: 'is-top', + actionText: 'OK', + indefinite: true + }) + throw new Error(this.app.i18n.t('currentNetworkIsNotSupported')) + } + + commit('SET_NET_ID', netId) + await dispatch('application/setNativeCurrency', { netId }, { root: true }) + + // TODO what if all rpc failed + await dispatch('settings/checkCurrentRpc', {}, { root: true }) + + dispatch('application/updateSelectEvents', {}, { root: true }) + + if (getters.isLoggedIn) { + await dispatch('updateAccountBalance') + } + } catch (e) { + throw new Error(e.message) + } + } + }, + async updateAccountBalance({ state, commit }, account = '') { + try { + const address = account || state.ethAccount + if (!address) { + return 0 + } + + const balance = await this.$provider.getBalance({ address }) + commit('SAVE_BALANCE', balance) + return balance + } catch (err) { + console.error(`updateAccountBalance has error ${err.message}`) + } + }, + clearProvider({ commit, state }) { + if (state.providerConfig.storageName) { + window.localStorage.removeItem(state.providerConfig.storageName) + } + + commit('CLEAR_PROVIDER') + + window.localStorage.removeItem('provider') + window.localStorage.removeItem('network') + }, + async askPermission( + { commit, dispatch, getters, rootGetters, state, rootState }, + { providerName, chosenNetId } + ) { + commit('SET_PROVIDER_NAME', providerName) + + const { name, listener } = state.providerConfig + + commit('SET_WALLET_NAME', name) + + try { + const provider = await getters.getEthereumProvider(chosenNetId) + + if (providerName === 'walletConnect') { + await dispatch(listener, { provider }) + } + const address = await this.$provider.initProvider(provider, {}) + + if (!address) { + throw new Error('lockedMetamask') + } + + await dispatch('checkIsSanctioned', { address }) + + commit('IDENTIFY', address) + + const netId = await dispatch('checkNetworkVersion') + + await dispatch('onNetworkChanged', { netId }) + commit('SET_INITIALIZED', true) + + const { url } = rootGetters['settings/currentRpc'] + this.$provider.initWeb3(url) + + await dispatch('updateAccountBalance', address) + + if (getters.isWalletConnect) { + if (provider.wc.peerMeta) { + commit('SET_WALLET_NAME', provider.wc.peerMeta.name) + } + } + + this.$provider.on({ + method: 'chainChanged', + callback: () => { + dispatch('onNetworkChanged', { netId }) + } + }) + + this.$provider.on({ + method: 'accountsChanged', + callback: ([newAccount]) => { + dispatch('onAccountsChanged', { newAccount }) + } + }) + + return { netId, ethAccount: address } + } catch (err) { + if (providerName === 'walletConnect') { + const mobileProvider = this.$provider.provider + + if (typeof mobileProvider.disconnect === 'function') { + mobileProvider.disconnect() + } + await dispatch('onLogOut') + } + throw new Error(`method askPermission has error: ${err.message}`) + } + }, + walletConnectSocketListener({ state, commit, dispatch, getters, rootState }, { provider }) { + const { enabled } = rootState.loading + + try { + provider.wc.on('disconnect', (error, payload) => { + if (state.isReconnecting) { + console.warn('Provider reconnect payload', { payload, error, isReconnecting: state.isReconnecting }) + + if (enabled) { + dispatch('loading/disable', {}, { root: true }) + } + commit('SET_RECONNECTING', false) + return + } + + const prevConnection = localStorage.getItem('walletconnectTimeStamp') + + const isPrevConnection = new BN(Date.now()).minus(prevConnection).isGreaterThanOrEqualTo(5000) + + if (isPrevConnection) { + console.warn('Provider disconnect payload', { + payload, + error, + isReconnecting: state.isReconnecting + }) + + dispatch('onLogOut') + } + + if (enabled) { + dispatch('loading/disable', {}, { root: true }) + } + }) + } catch (err) { + console.error('WalletConnect listeners error: ', err) + } + }, + async switchNetwork({ dispatch }, { netId }) { + try { + await this.$provider.sendRequest({ + method: 'wallet_switchEthereumChain', + params: [{ chainId: numberToHex(netId) }] + }) + } catch (err) { + // This error indicates that the chain has not been added to MetaMask. + if (err.message.includes('wallet_addEthereumChain')) { + return dispatch('addNetwork', { netId }) + } + + throw new Error(err.message) + } + }, + async addNetwork(_, { netId }) { + const METAMASK_LIST = { + 56: { + chainId: '0x38', + chainName: 'Binance Smart Chain Mainnet', + rpcUrls: ['https://bsc-dataseed1.ninicoin.io'], + nativeCurrency: { + name: 'Binance Chain Native Token', + symbol: 'BNB', + decimals: 18 + }, + blockExplorerUrls: ['https://bscscan.com'] + }, + 10: { + chainId: '0xa', + chainName: 'Optimism', + rpcUrls: ['https://mainnet.optimism.io/'], + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18 + }, + blockExplorerUrls: ['https://optimistic.etherscan.io'] + }, + 100: { + chainId: '0x64', + chainName: 'Gnosis Chain (formerly xDai)', + rpcUrls: ['https://rpc.gnosischain.com'], + nativeCurrency: { + name: 'xDAI', + symbol: 'xDAI', + decimals: 18 + }, + blockExplorerUrls: ['https://blockscout.com/xdai/mainnet'] + }, + 137: { + chainId: '0x89', + chainName: 'Polygon Mainnet', + rpcUrls: ['https://polygon-rpc.com/'], + nativeCurrency: { + name: 'MATIC', + symbol: 'MATIC', + decimals: 18 + }, + blockExplorerUrls: ['https://polygonscan.com'] + }, + 42161: { + chainId: '0xA4B1', + chainName: 'Arbitrum One', + rpcUrls: ['https://arb1.arbitrum.io/rpc'], + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18 + }, + blockExplorerUrls: ['https://arbiscan.io'] + }, + 43114: { + chainId: '0xA86A', + chainName: 'Avalanche C-Chain', + rpcUrls: ['https://api.avax.network/ext/bc/C/rpc'], + nativeCurrency: { + name: 'Avalanche', + symbol: 'AVAX', + decimals: 18 + }, + blockExplorerUrls: ['https://snowtrace.io'] + } + } + + if (METAMASK_LIST[netId]) { + await this.$provider.sendRequest({ + method: 'wallet_addEthereumChain', + params: [METAMASK_LIST[netId]] + }) + } + }, + async checkNetworkVersion() { + try { + const id = Number( + await this.$provider.sendRequest({ + method: 'eth_chainId', + params: [] + }) + ) + + return id + } catch (err) { + throw new Error(err.message) + } + } +} + +export default { + namespaced: true, + state, + getters, + mutations, + actions +} diff --git a/store/notice.js b/store/notice.js new file mode 100644 index 0000000..6bea162 --- /dev/null +++ b/store/notice.js @@ -0,0 +1,95 @@ +const NOTICE_INTERVAL = 10000 + +export const state = () => { + return { + notices: [], + timers: {} + } +} + +export const mutations = { + ADD_NOTICE(state, notice) { + state.notices.push(notice) + }, + UPDATE_NOTICE(state, { index, notice }) { + this._vm.$set(state.notices, index, notice) + }, + DELETE_NOTICE(state, index) { + this._vm.$delete(state.notices, index) + }, + ADD_NOTICE_TIMER(state, { id, timerId }) { + this._vm.$set(state.timers, id, { timerId }) + }, + DELETE_NOTICE_TIMER(state, id) { + this._vm.$delete(state.timers, id) + } +} + +export const actions = { + addNotice({ commit }, { notice }) { + return new Promise((resolve) => { + const id = `f${(+new Date()).toString(16)}` + commit('ADD_NOTICE', { ...notice, id, isShowed: true }) + resolve(id) + }) + }, + addNoticeTimer({ commit, dispatch }, { id, interval = NOTICE_INTERVAL }) { + const timerId = setTimeout(() => { + dispatch('deleteNotice', { id }) + }, interval) + commit('ADD_NOTICE_TIMER', { id, timerId }) + }, + deleteNoticeTimer({ state, commit }, { id }) { + if (state.timers[id]) { + clearTimeout(state.timers[id].timerId) + commit('DELETE_NOTICE_TIMER', id) + } + }, + addNoticeWithInterval({ dispatch }, { notice, interval }) { + return new Promise(async (resolve) => { + const id = await dispatch('addNotice', { notice }) + dispatch('addNoticeTimer', { id, interval }) + resolve(id) + }) + }, + deleteNotice({ state, commit, dispatch }, { id }) { + const index = state.notices.findIndex((i) => { + return i.id === id + }) + if (index !== -1) { + commit('DELETE_NOTICE', index) + dispatch('deleteNoticeTimer', { id }) + } + }, + updateNotice({ state, commit, dispatch }, { id = `f${(+new Date()).toString(16)}`, notice, interval }) { + const { notices } = state + const index = notices.findIndex((i) => { + return i.id === id + }) + if (index !== -1) { + commit('UPDATE_NOTICE', { + index, + notice: { + ...notices[index], + isShowed: true, + ...notice + } + }) + } else { + commit('ADD_NOTICE', { ...notice, id, isShowed: true }) + } + + if (interval) { + dispatch('deleteNoticeTimer', { id }) + dispatch('addNoticeTimer', { id, interval }) + } + }, + showNotice({ state, commit, dispatch }, { id, isShowed = true }) { + dispatch('updateNotice', { + id, + notice: { + isShowed + } + }) + } +} diff --git a/store/price.js b/store/price.js new file mode 100644 index 0000000..2178f3f --- /dev/null +++ b/store/price.js @@ -0,0 +1,114 @@ +/* eslint-disable no-console */ +import { toBN, toChecksumAddress } from 'web3-utils' + +import networkConfig from '@/networkConfig' +import offchainOracleABI from '@/abis/OffchainOracle.abi.json' + +const offchainOracleAddress = '0x07D91f5fb9Bf7798734C3f606dB065549F6893bb' + +const TOKENS = { + torn: { + tokenAddress: '0x77777FeDdddFfC19Ff86DB637967013e6C6A116C', + symbol: 'TORN', + decimals: 18 + } +} + +export const state = () => { + return { + prices: { + dai: '593970928097706', + cdai: '12623454013395', + usdc: '593319851383838', + usdt: '592852719537467', + torn: '85362951428474830', + wbtc: '32269526951862905063' + } + } +} + +export const getters = { + tokenRate: (state, getters, rootState, rootGetters) => { + return state.prices[rootState.application.selectedStatistic.currency] + }, + getArgsForOracle: (state, getters, rootState, rootGetters) => { + const tokens = { + ...networkConfig.netId1.tokens, + ...TOKENS + } + const tokenAddresses = [] + const oneUintAmount = [] + const currencyLookup = {} + Object.entries(tokens).map(([currency, data]) => { + if (currency !== 'eth') { + tokenAddresses.push(data.tokenAddress) + oneUintAmount.push( + toBN('10') + .pow(toBN(data.decimals.toString())) + .toString() + ) + currencyLookup[data.tokenAddress] = currency + } + }) + return { tokenAddresses, oneUintAmount, currencyLookup } + }, + getTokenPrice: (state, getters, rootState, rootGetters) => (currency) => { + return state.prices[currency] + }, + isPriceWatcherDisabled: (state, getters, rootState, rootGetters) => { + const nativeCurrency = rootGetters['metamask/nativeCurrency'] + const tokens = Object.keys(rootGetters['metamask/networkConfig'].tokens) + return tokens.includes(nativeCurrency) && tokens.length === 1 + } +} + +export const mutations = { + SAVE_TOKEN_PRICES(state, prices) { + state.prices = { + ...state.prices, + ...prices + } + } +} + +export const actions = { + async fetchTokenPrice({ getters, commit, dispatch, rootState }) { + if (getters.isPriceWatcherDisabled) { + return + } + + try { + const web3 = this.$provider.getWeb3(rootState.settings.netId1.rpc.url) + const offchainOracle = new web3.eth.Contract(offchainOracleABI, offchainOracleAddress) + const { tokenAddresses, oneUintAmount, currencyLookup } = getters.getArgsForOracle + + const prices = {} + for (let i = 0; i < tokenAddresses.length; i++) { + try { + const isWrap = + toChecksumAddress(tokenAddresses[i]) === + toChecksumAddress('0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643') + + const price = await offchainOracle.methods.getRateToEth(tokenAddresses[i], isWrap).call() + const numerator = toBN(oneUintAmount[i]) + const denominator = toBN(10).pow(toBN(18)) // eth decimals + const priceFormatted = toBN(price) + .mul(numerator) + .div(denominator) + + prices[currencyLookup[tokenAddresses[i]]] = priceFormatted.toString() + } catch (e) { + console.error('cant get price of ', tokenAddresses[i]) + } + } + + console.log('prices', prices) + commit('SAVE_TOKEN_PRICES', prices) + + setTimeout(() => dispatch('fetchTokenPrice'), 1000 * 30) + } catch (e) { + console.error(e) + setTimeout(() => dispatch('fetchTokenPrice'), 1000 * 30) + } + } +} diff --git a/store/relayer.js b/store/relayer.js new file mode 100644 index 0000000..a60bc5a --- /dev/null +++ b/store/relayer.js @@ -0,0 +1,688 @@ +/* eslint-disable no-console */ +import Web3 from 'web3' +import BN from 'bignumber.js' +import namehash from 'eth-ens-namehash' + +import { schema, relayerRegisterService } from '@/services' +import { createChainIdState, parseNote, parseSemanticVersion } from '@/utils' + +import ENSABI from '@/abis/ENS.abi.json' +import networkConfig from '@/networkConfig' + +const getAxios = () => { + return import('axios') +} + +const calculateScore = ({ stakeBalance, tornadoServiceFee }, minFee = 0.33, maxFee = 0.53) => { + if (tornadoServiceFee < minFee) { + tornadoServiceFee = minFee + } else if (tornadoServiceFee >= maxFee) { + return new BN(0) + } + + const serviceFeeCoefficient = (tornadoServiceFee - minFee) ** 2 + const feeDiffCoefficient = 1 / (maxFee - minFee) ** 2 + const coefficientsMultiplier = 1 - feeDiffCoefficient * serviceFeeCoefficient + + return new BN(stakeBalance).multipliedBy(coefficientsMultiplier) +} + +const getWeightRandom = (weightsScores, random) => { + for (let i = 0; i < weightsScores.length; i++) { + if (random.isLessThan(weightsScores[i])) { + return i + } + random = random.minus(weightsScores[i]) + } + return Math.floor(Math.random() * weightsScores.length) +} + +const pickWeightedRandomRelayer = (items, netId) => { + let minFee, maxFee + + if (netId !== 1) { + minFee = 0.01 + maxFee = 0.3 + } + + const weightsScores = items.map((el) => calculateScore(el, minFee, maxFee)) + const totalWeight = weightsScores.reduce((acc, curr) => { + return (acc = acc.plus(curr)) + }, new BN('0')) + + const random = totalWeight.multipliedBy(Math.random()) + const weightRandomIndex = getWeightRandom(weightsScores, random) + + return items[weightRandomIndex] +} + +const initialJobsState = createChainIdState({ + tornado: {} +}) + +export const state = () => { + return { + prices: { + dai: '6700000000000000' + }, + selectedRelayer: { + url: '', + name: '', + stakeBalance: 0, + tornadoServiceFee: 0.05, + miningServiceFee: 0.05, + address: null, + ethPrices: { + torn: '1' + } + }, + isLoadingRelayers: false, + validRelayers: [], + jobs: initialJobsState, + jobWatchers: {} + } +} + +export const getters = { + ethProvider: (state, getters, rootState) => { + const { url } = rootState.settings.netId1.rpc + + return new Web3(url) + }, + jobs: (state, getters, rootState, rootGetters) => (type) => { + const netId = rootGetters['metamask/netId'] + const jobsToRender = Object.entries(state.jobs[`netId${netId}`][type]) + .reverse() + .map( + ([ + id, + { + action, + relayerUrl, + amount, + currency, + fee, + timestamp, + txHash, + confirmations, + status, + failedReason + } + ]) => { + return { + id, + action, + relayerUrl, + amount, + currency, + fee, + timestamp, + txHash, + confirmations, + status, + failedReason + } + } + ) + return jobsToRender + } +} + +export const mutations = { + SET_SELECTED_RELAYER(state, payload) { + this._vm.$set(state, 'selectedRelayer', payload) + }, + SAVE_VALIDATED_RELAYERS(state, relayers) { + state.validRelayers = relayers + }, + SAVE_JOB( + state, + { + id, + netId, + type, + action, + relayerUrl, + amount, + currency, + fee, + commitmentHex, + timestamp, + note, + accountAfter, + account + } + ) { + this._vm.$set(state.jobs[`netId${netId}`][type], id, { + action, + relayerUrl, + amount, + currency, + fee, + commitmentHex, + timestamp, + note, + accountAfter, + account + }) + }, + UPDATE_JOB(state, { id, netId, type, txHash, confirmations, status, failedReason }) { + const job = state.jobs[`netId${netId}`][type][id] + this._vm.$set(state.jobs[`netId${netId}`][type], id, { + ...job, + txHash, + confirmations, + status, + failedReason + }) + }, + DELETE_JOB(state, { id, netId, type }) { + this._vm.$delete(state.jobs[`netId${netId}`][type], id) + }, + ADD_JOB_WATCHER(state, { id, timerId }) { + this._vm.$set(state.jobWatchers, id, { + timerId + }) + }, + DELETE_JOB_WATCHER(state, { id }) { + this._vm.$delete(state.jobWatchers, id) + }, + SET_IS_LOADING_RELAYERS(state, isLoadingRelayers) { + state.isLoadingRelayers = isLoadingRelayers + } +} + +export const actions = { + async askRelayerStatus( + { rootState, dispatch, rootGetters }, + { hostname, relayerAddress, stakeBalance, ensName } + ) { + try { + const axios = await getAxios() + + if (!hostname.endsWith('/')) { + hostname += '/' + } + + const url = `${window.location.protocol}//${hostname}` + const response = await axios.get(`${url}status`, { timeout: 5000 }).catch(() => { + throw new Error(this.app.i18n.t('canNotFetchStatusFromTheRelayer')) + }) + + if (Number(response.data.currentQueue) > 5) { + throw new Error(this.app.i18n.t('withdrawalQueueIsOverloaded')) + } + + const netId = Number(rootGetters['metamask/netId']) + + if (Number(response.data.netId) !== netId) { + throw new Error(this.app.i18n.t('thisRelayerServesADifferentNetwork')) + } + + const validate = schema.getRelayerValidateFunction(netId) + + // check rewardAccount === relayerAddress for TORN burn, custom relayer - exception + if (netId === 1 && relayerAddress && response.data.rewardAccount !== relayerAddress) { + throw new Error('The Relayer reward address must match registered address') + } + + const isValid = validate(response.data) + if (!isValid) { + console.error('askRelayerStatus', ensName, validate?.errors) + + throw new Error(this.app.i18n.t('canNotFetchStatusFromTheRelayer')) + } + + const hasEnabledLightProxy = rootGetters['application/hasEnabledLightProxy'] + + const getIsUpdated = () => { + const requiredMajor = hasEnabledLightProxy ? '5' : '4' + const { major, prerelease } = parseSemanticVersion(response.data.version) + + const isUpdatedMajor = major === requiredMajor + + if (isUpdatedMajor && prerelease && netId === 42161) { + const minimalBeta = 10 + const [betaVersion] = prerelease.split('.').slice(-1) + return Number(betaVersion) >= minimalBeta + } + + return isUpdatedMajor + } + + if (!getIsUpdated()) { + throw new Error('Outdated version.') + } + + return { + isValid, + realUrl: url, + stakeBalance, + name: ensName, + relayerAddress, + netId: response.data.netId, + ethPrices: response.data.ethPrices, + address: response.data.rewardAccount, + currentQueue: response.data.currentQueue, + miningServiceFee: response.data.miningServiceFee, + tornadoServiceFee: response.data.tornadoServiceFee + } + } catch (e) { + console.error('askRelayerStatus', ensName, e.message) + return { isValid: false, error: e.message } + } + }, + async observeRelayer({ dispatch }, { relayer }) { + const result = await dispatch('askRelayerStatus', relayer) + + return result + }, + async pickRandomRelayer({ rootGetters, commit, dispatch, getters }) { + const netId = rootGetters['metamask/netId'] + const { ensSubdomainKey } = rootGetters['metamask/networkConfig'] + + commit('SET_IS_LOADING_RELAYERS', true) + + const registeredRelayers = await relayerRegisterService(getters.ethProvider).getRelayers(ensSubdomainKey) + + const requests = [] + for (const registeredRelayer of registeredRelayers) { + requests.push(dispatch('observeRelayer', { relayer: registeredRelayer })) + } + let statuses = await Promise.all(requests) + + statuses = statuses.filter((status) => status.isValid) + // const validRelayerENSnames = statuses.map((relayer) => relayer.name) + commit('SAVE_VALIDATED_RELAYERS', statuses) + console.log('filtered statuses ', statuses) + + try { + const { + name, + realUrl, + address, + ethPrices, + stakeBalance, + tornadoServiceFee, + miningServiceFee + } = pickWeightedRandomRelayer(statuses, netId) + + console.log('Selected relayer', name, tornadoServiceFee) + commit('SET_SELECTED_RELAYER', { + name, + address, + ethPrices, + url: realUrl, + stakeBalance, + tornadoServiceFee, + miningServiceFee + }) + } catch { + console.error('Method pickRandomRelayer has not picked relayer') + } + + commit('SET_IS_LOADING_RELAYERS', false) + }, + async getKnownRelayerData({ rootGetters, getters }, { relayerAddress, name }) { + const { ensSubdomainKey } = rootGetters['metamask/networkConfig'] + + const [validRelayer] = await relayerRegisterService(getters.ethProvider).getValidRelayers( + [{ relayerAddress, ensName: name.replace(`${ensSubdomainKey}.`, '') }], + ensSubdomainKey + ) + console.warn('validRelayer', validRelayer) + return validRelayer + }, + async getCustomRelayerData({ rootState, state, getters, rootGetters, dispatch }, { url, name }) { + const provider = getters.ethProvider.eth + + if (!url.startsWith('https:') && !url.startsWith('http:')) { + if (url.includes('.onion')) { + url = `http://${url}` + } else { + url = `https://${url}` + } + } + const urlParser = new URL(url) + urlParser.href = url + let ensName = name + + if (urlParser.hostname.endsWith('.eth')) { + ensName = urlParser.hostname + let resolverInstance = await provider.ens.getResolver(ensName) + + if (new BN(resolverInstance._address).isZero()) { + throw new Error('missingENSSubdomain') + } + resolverInstance = new provider.Contract(ENSABI, resolverInstance._address) + + const ensNameHash = namehash.hash(ensName) + const hostname = await resolverInstance.methods.text(ensNameHash, 'url').call() + + if (!hostname) { + throw new Error('canNotFetchStatusFromTheRelayer') + } + urlParser.host = hostname + } + + const hostname = urlParser.host + + return { hostname, ensName, stakeBalance: 0 } + }, + async getRelayerData({ state, dispatch }, { url, name }) { + const knownRelayer = state.validRelayers.find((el) => el.name === name) + + if (knownRelayer) { + const knownRelayerData = await dispatch('getKnownRelayerData', knownRelayer) + return knownRelayerData + } + + const customRelayerData = await dispatch('getCustomRelayerData', { url, name }) + return customRelayerData + }, + async setupRelayer({ commit, rootState, dispatch }, { url, name }) { + try { + const relayerData = await dispatch('getRelayerData', { url, name }) + + const { + error, + isValid, + realUrl, + address, + ethPrices, + miningServiceFee, + tornadoServiceFee + } = await dispatch('askRelayerStatus', relayerData) + + if (!isValid) { + return { error, isValid: false } + } + + return { + isValid, + name, + url: realUrl || '', + address: address || '', + tornadoServiceFee: tornadoServiceFee || 0.0, + miningServiceFee: miningServiceFee || 0.0, + ethPrices: ethPrices || { torn: '1' } + } + } catch (err) { + return { + isValid: false, + error: this.app.i18n.t(err.message) + } + } + }, + async relayTornadoWithdraw({ state, commit, dispatch, rootState }, { note }) { + const { currency, netId, amount, commitmentHex } = parseNote(note) + + const config = networkConfig[`netId${netId}`] + const contract = config.tokens[currency].instanceAddress[amount] + + try { + const { proof, args } = rootState.application.notes[note] + const message = { + args, + proof, + contract + } + + dispatch( + 'loading/changeText', + { message: this.app.i18n.t('relayerIsNowSendingYourTransaction') }, + { root: true } + ) + + const response = await fetch(state.selectedRelayer.url + 'v1/tornadoWithdraw', { + method: 'POST', + mode: 'cors', + cache: 'no-cache', + headers: { + 'Content-Type': 'application/json' + }, + redirect: 'error', + body: JSON.stringify(message) + }) + + if (response.status === 400) { + const { error } = await response.json() + throw new Error(error) + } + + if (response.status === 200) { + const { id } = await response.json() + const timestamp = Math.round(new Date().getTime() / 1000) + commit('SAVE_JOB', { + id, + netId, + type: 'tornado', + action: 'Deposit', + relayerUrl: state.selectedRelayer.url, + commitmentHex, + amount, + currency, + timestamp, + note + }) + + dispatch('runJobWatcherWithNotifications', { id, type: 'tornado', netId }) + } else { + throw new Error(this.app.i18n.t('unknownError')) + } + } catch (e) { + console.error('relayTornadoWithdraw', e) + const { name, url } = state.selectedRelayer + throw new Error(this.app.i18n.t('relayRequestFailed', { relayerName: name === 'custom' ? url : name })) + } + }, + async runJobWatcherWithNotifications({ dispatch, state }, { routerLink, id, netId, type }) { + const { amount, currency } = state.jobs[`netId${netId}`][type][id] + const noticeId = await dispatch( + 'notice/addNotice', + { + notice: { + title: { + path: 'withdrawing', + amount, + currency + }, + type: 'loading', + routerLink + } + }, + { root: true } + ) + + try { + await dispatch('runJobWatcher', { id, netId, type, noticeId }) + dispatch('deleteJob', { id, netId, type }) + } catch (err) { + dispatch( + 'notice/updateNotice', + { + id: noticeId, + notice: { + title: 'transactionFailed', + type: 'danger', + routerLink: undefined + } + }, + { root: true } + ) + dispatch( + 'notice/addNoticeWithInterval', + { + notice: { + title: 'relayerError', + type: 'danger' + } + }, + { root: true } + ) + } + }, + deleteJob({ state, dispatch, commit }, { id, netId, type }) { + dispatch('stopFinishJobWatcher', { id }) + const { amount, currency, action, fee, txHash, note } = state.jobs[`netId${netId}`][type][id] + + commit('DELETE_JOB', { id, netId, type }) + + dispatch( + 'txHashKeeper/updateDeposit', + { amount, currency, netId, type, action, note, txHash, fee }, + { root: true } + ) + }, + runJobWatcher({ state, dispatch }, { id, netId, type, noticeId }) { + console.log('runJobWatcher started for job', id) + return new Promise((resolve, reject) => { + const getConfirmations = async ({ id, netId, type, noticeId, retryAttempt = 0, noticeCalls = 0 }) => { + try { + const job = state.jobs[`netId${netId}`][type][id] + + if (job.status === 'FAILED') { + retryAttempt = 6 + throw new Error('Relayer is not responding') + } + + const response = await fetch(`${job.relayerUrl}v1/jobs/${id}`, { + method: 'GET', + mode: 'cors', + cache: 'no-cache', + headers: { + 'Content-Type': 'application/json' + }, + redirect: 'error' + }) + if (response.status === 400) { + const { error } = await response.json() + console.error('runJobWatcher', error) + throw new Error(this.app.i18n.t('relayerError')) + } + + if (response.status === 200) { + await dispatch('handleResponse', { + id, + response, + job, + type, + netId, + retryAttempt, + noticeId, + noticeCalls, + resolve, + getConfirmations + }) + } else { + throw new Error(this.app.i18n.t('unknownError')) + } + } catch (e) { + if (retryAttempt < 5) { + retryAttempt++ + + setTimeout( + () => + getConfirmations({ + id, + netId, + type, + noticeId, + retryAttempt, + noticeCalls + }), + 3000 + ) + } + reject(e.message) + } + } + getConfirmations({ id, netId, type, noticeId }) + dispatch('finishJobWatcher', { id, netId, type }) + }) + }, + async handleResponse( + { state, rootGetters, commit, dispatch, getters, rootState }, + { response, id, job, type, netId, retryAttempt, resolve, getConfirmations, noticeId, noticeCalls } + ) { + const { amount, currency } = job + const { txHash, confirmations, status, failedReason } = await response.json() + console.log('txHash, confirmations, status, failedReason', txHash, confirmations, status, failedReason) + commit('UPDATE_JOB', { id, netId, type, txHash, confirmations, status, failedReason }) + + if (status === 'FAILED') { + dispatch('stopFinishJobWatcher', { id }) + commit('DELETE_JOB', { id, netId, type }) + retryAttempt = 6 + console.error('runJobWatcher.handleResponse', failedReason) + + throw new Error(this.app.i18n.t('relayerError')) + } + + if (txHash && noticeCalls === 0 && (Number(confirmations) > 0 || status === 'CONFIRMED')) { + noticeCalls++ + + dispatch( + 'notice/updateNotice', + { + id: noticeId, + notice: { + title: { + path: 'withdrawnValue', + amount, + currency + }, + type: 'success', + txHash + }, + interval: 10000 + }, + { root: true } + ) + } + + if (status === 'CONFIRMED') { + console.log(`Job ${id} has enough confirmations`) + resolve(txHash) + } else { + setTimeout(() => getConfirmations({ id, netId, type, noticeId, retryAttempt, noticeCalls }), 3000) + } + }, + finishJobWatcher({ state, rootGetters, commit, dispatch, getters, rootState }, { id, netId, type }) { + const timerId = setTimeout(() => { + const { txHash, confirmations } = state.jobs[`netId${netId}`][type][id] + commit('UPDATE_JOB', { + id, + netId, + type, + txHash, + confirmations, + status: 'FAILED', + failedReason: this.app.i18n.t('relayerIsNotResponding') + }) + commit('DELETE_JOB_WATCHER', { id }) + }, 15 * 60 * 1000) + commit('ADD_JOB_WATCHER', { id, timerId }) + }, + stopFinishJobWatcher({ state, rootGetters, commit, dispatch, getters, rootState }, { id }) { + console.log(`Stop finishJobWatcher ${id}`) + const { timerId } = state.jobWatchers[id] + clearTimeout(timerId) + commit('DELETE_JOB_WATCHER', { id }) + }, + runAllJobs({ state, commit, dispatch, rootState }) { + const netId = rootState.metamask.netId + const jobs = state.jobs[`netId${netId}`] + + for (const type in jobs) { + for (const [id, { status }] of Object.entries(jobs[type])) { + const job = { id, netId, type } + if (status === 'FAILED') { + commit('DELETE_JOB', job) + } else { + dispatch('runJobWatcherWithNotifications', job) + } + } + } + } +} diff --git a/store/settings.js b/store/settings.js new file mode 100644 index 0000000..07bd48b --- /dev/null +++ b/store/settings.js @@ -0,0 +1,93 @@ +/* eslint-disable no-console */ +import Web3 from 'web3' + +import networkConfig from '@/networkConfig' + +const getFirstRpcs = (acc, [netId, { rpcUrls }]) => { + const [rpc] = Object.values(rpcUrls) + + acc[netId] = { + rpc + } + + return acc +} + +const rpcData = Object.entries(networkConfig).reduce(getFirstRpcs, {}) + +export const state = () => { + return { + ...rpcData, + isActiveNotification: { + first: true, + second: true + } + } +} + +export const getters = { + getRpc: (state) => (netId) => { + return state[`netId${netId}`].rpc + }, + currentRpc: (state, getters, rootState) => { + const netId = rootState.metamask.netId + return state[`netId${netId}`].rpc + } +} + +export const mutations = { + SAVE_RPC(state, { netId, name, url }) { + this._vm.$set(state[`netId${netId}`], 'rpc', { name, url }) + }, + DISABLE_NOTIFICATION(state, { key }) { + this._vm.$set(state, 'isActiveNotification', { ...state.isActiveNotification, [key]: false }) + } +} + +export const actions = { + disableNotification({ commit }, params) { + commit('DISABLE_NOTIFICATION', params) + }, + async checkCurrentRpc({ dispatch, getters, rootGetters }) { + const netId = rootGetters['metamask/netId'] + await dispatch('preselectRpc', { netId }) + }, + async preselectRpc({ getters, commit, dispatch }, { netId }) { + const savedRpc = getters.getRpc(netId) + const { isValid } = await dispatch('checkRpc', { ...savedRpc, netId }) + + if (isValid) { + return + } + + const { rpcUrls } = networkConfig[`netId${netId}`] + + for (const [, { name, url }] of Object.entries(rpcUrls)) { + const { isValid, error } = await dispatch('checkRpc', { url, netId }) + if (isValid) { + commit('SAVE_RPC', { netId, name, url }) + return + } else { + console.error('preselectRpc', url, error) + } + } + throw new Error(this.app.i18n.t('rpcSelectError')) + }, + async checkRpc(_, { url, netId }) { + try { + const web3 = new Web3(url) + + const chainId = await web3.eth.getChainId() + + const isCurrent = Number(chainId) === Number(netId) + if (isCurrent) { + return { isValid: true } + } else { + return { isValid: false, error: this.app.i18n.t('thisRpcIsForDifferentNetwork') } + } + } catch (e) { + console.error('checkRpc', e) + return { isValid: false, error: this.app.i18n.t('rpcIsDown') } + } + } +} diff --git a/store/snark.js b/store/snark.js new file mode 100644 index 0000000..3aec732 --- /dev/null +++ b/store/snark.js @@ -0,0 +1,113 @@ +/* eslint-disable no-console */ +import Web3 from 'web3' +import Jszip from 'jszip' +import axios from 'axios' +import ENS, { getEnsAddress } from '@ensdomains/ensjs' + +import { detectMob } from '@/utils' +import networkConfig from '@/networkConfig' + +const { APP_ENS_NAME } = process.env + +const groth16 = require('websnark/src/groth16') +const jszip = new Jszip() + +function buildGroth16() { + const isMobile = detectMob() + const wasmMemory = isMobile ? 1000 : 2000 + return groth16({ wasmInitialMemory: wasmMemory }) +} + +function getEns() { + const provider = new Web3.providers.HttpProvider(networkConfig.netId1.rpcUrls.Infura.url) + return new ENS({ provider, ensAddress: getEnsAddress('1') }) +} + +async function getTornadoKeys(getProgress) { + try { + const keys = await Promise.all([ + download({ name: 'tornado.json.zip', contentType: 'string' }), + download({ name: 'tornadoProvingKey.bin.zip', contentType: 'arraybuffer', getProgress }) + ]) + return { circuit: JSON.parse(keys[0]), provingKey: keys[1] } + } catch (err) { + throw err + } +} + +async function getIPFSIdFromENS(ensName) { + try { + const ens = getEns() + + const ensInterface = await ens.name(ensName) + const { value } = await ensInterface.getContent(ensName) + + const [, id] = value.split('://') + return id + } catch (err) { + throw new Error(err) + } +} + +async function fetchFile({ url, name, getProgress, id, retryAttempt = 0 }) { + try { + const response = await axios.get(`${url}/${name}`, { + responseType: 'blob', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + onDownloadProgress: (progressEvent) => { + if (typeof getProgress === 'function') { + const progress = Math.round((progressEvent.loaded * 100) / 9626311) + getProgress(progress) + } + } + }) + + return response + } catch (err) { + if (!id) { + id = await getIPFSIdFromENS(APP_ENS_NAME) + } + const knownResources = [ + url, + `https://ipfs.io/ipfs/${id}`, + `https://dweb.link/ipfs/${id}`, + `https://gateway.pinata.cloud/ipfs/${id}` + ] + + if (retryAttempt < knownResources.length) { + const fallbackUrl = knownResources[retryAttempt] + retryAttempt++ + + const response = await fetchFile({ name, getProgress, retryAttempt, id, url: fallbackUrl }) + + return response + } + throw err + } +} +/** + * Function to download + * @param {*} name filename + * @param {'base64'|'string'|'binarystring'|'text'|'blob'|'uint8array'|'arraybuffer'|'array'|'nodebuffer'} contentType type of the content. + * @param getProgress function + */ +async function download({ name, contentType, getProgress, eventName = 'events' }) { + try { + // eslint-disable-next-line no-undef + const prefix = __webpack_public_path__.slice(0, -7) + const response = await fetchFile({ getProgress, url: prefix, name }) + + const zip = await jszip.loadAsync(response.data) + const file = zip.file(name.replace(`${eventName}/`, '').slice(0, -4)) + + const content = await file.async(contentType) + + return content + } catch (err) { + throw err + } +} + +export { getTornadoKeys, buildGroth16, download } diff --git a/store/token.js b/store/token.js new file mode 100644 index 0000000..f94584f --- /dev/null +++ b/store/token.js @@ -0,0 +1,222 @@ +/* eslint-disable no-console */ +/* eslint-disable import/order */ +import Web3 from 'web3' +import networkConfig from '@/networkConfig' +import ERC20ABI from '@/abis/ERC20.abi.json' +const { numberToHex, toBN, toWei } = require('web3-utils') +const BN = require('bn.js') +const zero = new BN(0) +const negative1 = new BN(-1) + +export const state = () => { + return { + approvalAmount: 'unlimited', + allowance: '', + balance: '' + } +} + +export const getters = { + tokenContract: (state, getters, rootState, rootGetters) => ({ currency, netId }) => { + const config = networkConfig[`netId${netId}`] + const { url } = rootState.settings[`netId${netId}`].rpc + const address = config.tokens[currency].tokenAddress + const web3 = new Web3(url) + return new web3.eth.Contract(ERC20ABI, address) + }, + // similar to fromWei from web3 + toDecimals: (state, getters, rootState, rootGetters) => (value, decimals, fixed) => { + const { currency } = rootState.application.selectedStatistic + decimals = decimals || rootGetters['metamask/networkConfig'].tokens[currency].decimals + fixed = fixed || 2 + + value = new BN(value) + const negative = value.lt(zero) + const base = new BN('10').pow(new BN(decimals)) + const baseLength = base.toString(10).length - 1 || 1 + + if (negative) { + value = value.mul(negative1) + } + + let fraction = value.mod(base).toString(10) + while (fraction.length < baseLength) { + fraction = `0${fraction}` + } + fraction = fraction.match(/^([0-9]*[1-9]|0)(0*)/)[1] + const whole = value.div(base).toString(10) + + if (fixed && fraction !== '0') { + fraction = fraction.slice(0, fixed) + } + value = `${whole}${fraction === '0' ? '' : `.${fraction}`}` + + if (negative) { + value = `-${value}` + } + + return value + }, + // similar to toWei from web3 + fromDecimals: (state, getters, rootState, rootGetters) => (value, decimals) => { + const { currency } = rootState.application.selectedStatistic + decimals = decimals || rootGetters['metamask/networkConfig'].tokens[currency].decimals + value = value.toString() + let ether = value.toString() + const base = new BN('10').pow(new BN(decimals)) + const baseLength = base.toString(10).length - 1 || 1 + + const negative = ether.substring(0, 1) === '-' + if (negative) { + ether = ether.substring(1) + } + + if (ether === '.') { + throw new Error(this.app.i18n.t('unitInvalidValue', { value })) + } + + // Split it into a whole and fractional part + const comps = ether.split('.') + if (comps.length > 2) { + throw new Error(this.app.i18n.t('tooManyDecimalPoints', { value })) + } + + let whole = comps[0] + let fraction = comps[1] + + if (!whole) { + whole = '0' + } + if (!fraction) { + fraction = '0' + } + if (fraction.length > baseLength) { + throw new Error(this.app.i18n.t('tooManyDecimalPlaces', { value })) + } + + while (fraction.length < baseLength) { + fraction += '0' + } + + whole = new BN(whole) + fraction = new BN(fraction) + let wei = whole.mul(base).add(fraction) + + if (negative) { + wei = wei.mul(negative) + } + + return new BN(wei.toString(10), 10) + }, + isSufficientAllowance: (state, getters, rootState, rootGetters) => { + const { currency, amount } = rootState.application.selectedInstance + const { decimals } = rootGetters['metamask/networkConfig'].tokens[currency] + return toBN(state.allowance).gte(toBN(getters.fromDecimals(amount, decimals))) + }, + isSufficientBalance: (state, getters, rootState, rootGetters) => { + const ethBalance = rootState.metamask.ethBalance + const { currency, amount } = rootState.application.selectedInstance + const { decimals } = rootGetters['metamask/networkConfig'].tokens[currency] + const nativeCurrency = rootGetters['metamask/nativeCurrency'] + if (currency === nativeCurrency) { + return toBN(ethBalance).gte(toBN(toWei(amount.toString()))) + } else { + return toBN(state.balance).gte(toBN(getters.fromDecimals(amount, decimals))) + } + }, + getSymbol: (state, getters, rootState, rootGetters) => (currency) => { + const tokens = rootGetters['metamask/networkConfig'].tokens + if (tokens[currency]) { + return tokens[currency].symbol + } + return currency.toUpperCase() + } +} + +export const mutations = { + SET_APPROVAL_AMOUNT(state, { approvalAmount }) { + state.approvalAmount = approvalAmount + }, + SAVE_ALLOWANCE(state, { allowance }) { + this._vm.$set(state, 'allowance', allowance) + }, + SAVE_BALANCE(state, { balance }) { + this._vm.$set(state, 'balance', balance) + } +} + +export const actions = { + async approve({ rootState, getters, dispatch, rootGetters, state }) { + try { + const netId = rootGetters['metamask/netId'] + const { currency } = rootState.application.selectedInstance + const { decimals } = rootGetters['metamask/networkConfig'].tokens[currency] + const tokenInstance = getters.tokenContract({ currency, netId }) + const tornadoProxy = rootGetters['application/tornadoProxyContract']({ netId }) + + const { ethAccount } = rootState.metamask + const amountToApprove = + state.approvalAmount === 'unlimited' + ? toBN('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff') + : toBN(getters.fromDecimals(state.approvalAmount, decimals)) + const data = tokenInstance.methods + .approve(tornadoProxy._address, amountToApprove.toString()) + .encodeABI() + const gas = await tokenInstance.methods + .approve(tornadoProxy._address, amountToApprove.toString()) + .estimateGas({ + from: ethAccount + }) + + const callParams = { + method: 'eth_sendTransaction', + params: { + to: tokenInstance._address, + gas: numberToHex(gas + 30000), + data + }, + watcherParams: { + title: 'approve', + successTitle: 'approved' + }, + isSaving: false + } + + await dispatch('metamask/sendTransaction', callParams, { root: true }) + } catch (e) { + console.error('approve action', e) + throw new Error(e.message) + } + }, + async fetchTokenAllowance({ getters, rootGetters, commit, rootState }) { + const netId = rootGetters['metamask/netId'] + const { currency } = rootState.application.selectedInstance + const { ethAccount } = rootState.metamask + try { + const tornadoInstance = rootGetters['application/tornadoProxyContract']({ netId }) + const nativeCurrency = rootGetters['metamask/nativeCurrency'] + if (currency !== nativeCurrency && ethAccount) { + const tokenInstance = getters.tokenContract({ currency, netId }) + const allowance = await tokenInstance.methods.allowance(ethAccount, tornadoInstance._address).call() + commit('SAVE_ALLOWANCE', { allowance }) + } + } catch (e) { + console.error('fetchTokenAllowance', e.message) + } + }, + async fetchTokenBalance({ state, getters, rootGetters, commit, rootState }) { + try { + const netId = rootGetters['metamask/netId'] + const { currency } = rootState.application.selectedInstance + const { ethAccount } = rootState.metamask + const nativeCurrency = rootGetters['metamask/nativeCurrency'] + if (currency !== nativeCurrency && ethAccount) { + const tokenInstance = getters.tokenContract({ currency, netId }) + const balance = await tokenInstance.methods.balanceOf(ethAccount).call() + commit('SAVE_BALANCE', { balance }) + } + } catch (e) { + console.error('fetchTokenBalance', e.message) + } + } +} diff --git a/store/torn.js b/store/torn.js new file mode 100644 index 0000000..c6dbee4 --- /dev/null +++ b/store/torn.js @@ -0,0 +1,227 @@ +/* eslint-disable no-console */ +import Web3 from 'web3' +import { toBN } from 'web3-utils' +import tornABI from '../abis/ERC20.abi.json' + +import { isWalletRejection } from '@/utils' + +const { toWei, toHex, numberToHex } = require('web3-utils') +const { PermitSigner } = require('../lib/Permit') + +const state = () => { + return { + approvalAmount: 'unlimited', + allowance: '0', + balance: '', + signature: { + v: '', + r: '', + s: '', + amount: '', + deadline: 0 + } + } +} + +const getters = { + tokenContract: (state, getters, rootState, rootGetters) => { + const tornContract = rootGetters['metamask/networkConfig']['torn.contract.tornadocash.eth'] + const { url } = rootGetters['settings/currentRpc'] + const web3 = new Web3(url) + return new web3.eth.Contract(tornABI, tornContract) + } +} + +const mutations = { + SET_APPROVAL_AMOUNT(state, { approvalAmount }) { + state.approvalAmount = approvalAmount + }, + SAVE_ALLOWANCE(state, { allowance }) { + this._vm.$set(state, 'allowance', allowance) + }, + SAVE_BALANCE(state, { balance }) { + this._vm.$set(state, 'balance', balance) + }, + SAVE_SIGNATURE(state, { v, r, s, amount, deadline }) { + this._vm.$set(state, 'signature', { v, r, s, amount, deadline }) + }, + REMOVE_SIGNATURE(state) { + this._vm.$set(state, 'signature', { v: '', r: '', s: '', amount: '', deadline: 0 }) + } +} + +const actions = { + async approve({ rootState, getters, commit, dispatch, rootGetters, state }, { amount }) { + try { + console.log('call approve') + const netId = rootGetters['metamask/netId'] + const govInstance = rootGetters['governance/gov/govContract']({ netId }) + const amountToApprove = toHex(toWei(amount.toString())) + const data = getters.tokenContract.methods + .approve(govInstance._address, amountToApprove.toString()) + .encodeABI() + const gas = 100000 + + const callParams = { + method: 'eth_sendTransaction', + params: { + data, + gas: numberToHex(gas + 100000), + to: getters.tokenContract._address + }, + watcherParams: { + title: 'approve', + successTitle: 'approved' + }, + isSaving: false + } + + await dispatch('metamask/sendTransaction', callParams, { root: true }) + + dispatch('fetchTokenAllowance') + } catch (e) { + console.error('approve action', e) + throw new Error(e.message) + } + }, + async fetchTokenAllowance({ getters, rootGetters, commit, rootState }) { + const netId = rootGetters['metamask/netId'] + const { ethAccount } = rootState.metamask + + if (!ethAccount) { + return + } + + const govInstance = rootGetters['governance/gov/govContract']({ netId }) + try { + const allowance = await getters.tokenContract.methods.allowance(ethAccount, govInstance._address).call() + commit('SAVE_ALLOWANCE', { allowance }) + + return allowance + } catch (e) { + console.error('fetchTokenAllowance', e.message) + } + }, + async fetchTokenBalance({ state, getters, rootGetters, commit, rootState }) { + try { + const { ethAccount } = rootState.metamask + if (ethAccount) { + const balance = await getters.tokenContract.methods.balanceOf(ethAccount).call() + console.log('torn', balance) + commit('SAVE_BALANCE', { balance }) + } + } catch (e) { + console.error('fetchTokenBalance', e.message) + } + }, + async detectedAllowance({ dispatch }, initValue) { + try { + const allowance = await dispatch('fetchTokenAllowance') + + if (toBN(allowance).gte(initValue)) { + return true + } + setTimeout(() => { + return dispatch('detectedAllowance', initValue) + }, 5000) + } catch (err) { + console.error('detectedAllowance has error', err.message) + setTimeout(() => { + return dispatch('detectedAllowance', initValue) + }, 5000) + } + }, + async signApprove({ rootState, getters, rootGetters, dispatch, commit }, { amount }) { + try { + const { ethAccount } = rootState.metamask + const netId = rootGetters['metamask/netId'] + const govInstance = rootGetters['governance/gov/govContract']({ netId }) + + const domain = { + name: 'TornadoCash', + version: '1', + chainId: netId, + verifyingContract: getters.tokenContract._address + } + const oneDayFromNow = Math.ceil(Date.now() / 1000) + 86400 + // fetch nonces + let nonce = 0 + try { + nonce = await getters.tokenContract.methods.nonces(ethAccount).call() + console.log('nonce', nonce) + } catch (e) { + throw new Error(e.message) + } + + // const pre = toHex(toWei(amount.toString())).substr(2) + // let result = pre.length % 2 === 0 ? pre : '0' + pre + // result = '0x' + result + + const value = toWei(amount.toString()) + + const args = { + owner: ethAccount, + spender: govInstance._address, + value, // 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + nonce, + deadline: oneDayFromNow + } + + const permitSigner = new PermitSigner(domain, args) + const message = permitSigner.getPayload() + + const callParams = { + method: 'eth_signTypedData_v4', + params: [ethAccount, JSON.stringify(message)] + } + + dispatch( + 'loading/changeText', + { + message: this.app.i18n.t('pleaseSignRequestInWallet', { + wallet: rootState.metamask.walletName + }), + type: 'approve' + }, + { root: true } + ) + + let signature = await this.$provider.sendRequest(callParams) + signature = signature.substring(2) + const r = '0x' + signature.substring(0, 64) + const s = '0x' + signature.substring(64, 128) + let v = parseInt(signature.substring(128, 130), 16) + + // fix ledger sign + if (v === 0 || v === 1) { + v = v + 27 + } + + console.log('signature', v, r, s, signature) + + // signature validation on contract + await getters.tokenContract.methods + .permit(args.owner, args.spender, args.value, args.deadline, v, r, s) + .call() + + commit('SAVE_SIGNATURE', { v, r, s, amount, deadline: oneDayFromNow }) + } catch (e) { + console.error('signApprove', e.message) + if (!isWalletRejection(e)) { + setTimeout(async () => { + await dispatch('approve', { amount }) + dispatch('detectedAllowance', amount) + }, 1000) + } + } finally { + dispatch('loading/disable', {}, { root: true }) + } + } +} +export default { + namespaced: true, + state, + getters, + mutations, + actions +} diff --git a/store/txHashKeeper.js b/store/txHashKeeper.js new file mode 100644 index 0000000..78fd62e --- /dev/null +++ b/store/txHashKeeper.js @@ -0,0 +1,451 @@ +/* eslint-disable no-console */ +import { hexToNumber } from 'web3-utils' + +import txStatus from './txStatus' + +import { eventsType } from '@/constants' +import { createChainIdState, parseNote } from '@/utils' + +const initialState = createChainIdState({ + txs: {}, + govTxs: {}, + encryptedTxs: {} +}) + +export const state = () => { + return initialState +} + +export const getters = { + txExplorerUrl: (state, getters, rootState, rootGetters) => (txHash) => { + const { explorerUrl } = rootGetters['metamask/networkConfig'] + return explorerUrl.tx + txHash + }, + addressExplorerUrl: (state, getters, rootState, rootGetters) => (address) => { + const { explorerUrl } = rootGetters['metamask/networkConfig'] + return explorerUrl.address + address + }, + blockExplorerUrl: (state, getters, rootState, rootGetters) => (block) => { + const { explorerUrl } = rootGetters['metamask/networkConfig'] + return explorerUrl.block + block + }, + encryptedTxs: (state, getters, rootState, rootGetters) => { + const netId = rootGetters['metamask/netId'] + + const txsToRender = Object.entries(state[`netId${netId}`].encryptedTxs) + .reverse() + .map(([txHash, tx]) => { + return { + isEncrypted: true, + txHash, + status, + ...tx + } + }) + return txsToRender + }, + txs: (state, getters, rootState, rootGetters) => { + const netId = rootGetters['metamask/netId'] + const txsToRender = Object.entries(state[`netId${netId}`].txs) + .reverse() + .map(([txHash, tx]) => { + return { + txHash, + status, + ...tx + } + }) + return txsToRender + }, + allTxs: (state, getters) => { + const { txs, encryptedTxs } = getters + return txs.concat(encryptedTxs) + }, + allTxsHash: (state, getters, rootState, rootGetters) => { + const netId = rootGetters['metamask/netId'] + return Object.entries(state[`netId${netId}`].txs) + .reverse() + .map(([txHash]) => txHash) + }, + txStatusClass: () => (status) => { + let cssClass + switch (status) { + case txStatus.waitingForReciept: + cssClass = 'is-loading' + break + case txStatus.success: + cssClass = 'is-success' + break + case txStatus.fail: + cssClass = 'is-danger' + break + default: + break + } + return cssClass + } +} + +export const mutations = { + SAVE_TX_HASH(state, { storeType = 'txs', amount = '0', note = null, netId, txHash, status, ...rest }) { + this._vm.$set(state[`netId${netId}`][storeType], [txHash], { + ...rest, + status: status || txStatus.waitingForReciept, + note, + amount + }) + }, + CHANGE_TX_STATUS(state, { storeType = 'txs', txHash, status, blockNumber, netId }) { + this._vm.$set(state[`netId${netId}`][storeType][txHash], 'status', status) + this._vm.$set(state[`netId${netId}`][storeType][txHash], 'blockNumber', blockNumber) + }, + SET_SPENT(state, { netId, storeType = 'txs', txHash }) { + this._vm.$set(state[`netId${netId}`][storeType][txHash], 'isSpent', true) + }, + DELETE_TX(state, { storeType = 'txs', txHash }) { + const netId = this._vm['metamask/netId'] + this._vm.$delete(state[`netId${netId}`][storeType], txHash) + }, + UPDATE_DEPOSIT(state, { storeType = 'txs', txHash, netId, withdrawTxHash, timestamp, status, ...rest }) { + const tx = state[`netId${netId}`][storeType][txHash] + this._vm.$delete(state[`netId${netId}`][storeType], txHash) + + this._vm.$set(state[`netId${netId}`][storeType], withdrawTxHash, { + ...tx, + timestamp, + depositTxHash: txHash, + txHash: withdrawTxHash, + depositBlock: tx.blockNumber, + status: status || txStatus.waitingForReciept, + ...rest + }) + } +} + +export const actions = { + async getInstances({ rootGetters }, { txs }) { + const eventsInterface = rootGetters['application/eventsInterface'] + + const instances = txs.reduce((acc, curr) => { + const [, currency, amount, netId] = curr.prefix.split('-') + + const name = `${amount}${currency}` + if (!acc[name]) { + const service = eventsInterface.getService({ netId, amount, currency }) + acc[name] = { currency, amount, netId, service } + } + return acc + }, {}) + + await Promise.all( + [].concat( + Object.values(instances).map((instance) => instance.service.updateEvents(eventsType.DEPOSIT)), + Object.values(instances).map((instance) => instance.service.updateEvents(eventsType.WITHDRAWAL)) + ) + ) + + return instances + }, + async checkPendingEncryptedTransaction({ dispatch, getters }) { + const transactions = getters.encryptedTxs + + const pendingTxs = transactions.filter((tx) => tx.status === 1) + + const instances = await dispatch('getInstances', { txs: pendingTxs }) + + for (const tx of pendingTxs) { + const [, currency, amount, netId] = tx.prefix.split('-') + + dispatch('checkSpeedUpEncryptedTx', { + netId, + txHash: tx.txHash, + type: eventsType.DEPOSIT, + commitment: tx.commitmentHex, + service: instances[`${amount}${currency}`] + }) + } + }, + async checkSpeedUpEncryptedTx({ commit, dispatch }, { txHash, commitment, netId, service, type }) { + try { + const result = await this.$provider.web3.eth.getTransactionReceipt(txHash) + + if (result) { + const status = result.status === '0x0' ? txStatus.fail : txStatus.success + + commit('CHANGE_TX_STATUS', { + netId, + txHash, + status, + storeType: 'encryptedTxs', + blockNumber: hexToNumber(result.blockNumber) + }) + } else { + const foundEvent = await service.findEvent({ eventName: 'commitment', eventToFind: commitment, type }) + + if (foundEvent) { + commit('UPDATE_DEPOSIT', { + netId, + txHash, + storeType: 'encryptedTxs', + status: txStatus.success, + timestamp: foundEvent.timestamp, + withdrawTxHash: foundEvent.txHash, + blockNumber: foundEvent.depositBlock + }) + } + } + } catch (err) { + throw new Error(`Method checkSpeedUpEncryptedTx has error ${err.message}`) + } + }, + async cleanEncryptedTxs({ getters, commit, dispatch }) { + getters.encryptedTxs.forEach(({ status, txHash, type }) => { + if (status === txStatus.fail) { + commit('DELETE_TX', { txHash, storeType: 'encryptedTxs' }) + } + }) + + const instances = await dispatch('getInstances', { + txs: getters.encryptedTxs + }) + + for (const tx of getters.encryptedTxs) { + if (!tx.isSpent) { + const { currency, amount, netId, nullifierHex } = parseNote(`${tx.prefix}-${tx.note}`) + + const isSpent = await instances[`${amount}${currency}`].service.findEvent({ + eventName: 'nullifierHash', + eventToFind: nullifierHex, + type: eventsType.WITHDRAWAL + }) + + if (isSpent) { + commit('SET_SPENT', { txHash: tx.txHash, storeType: 'encryptedTxs', netId }) + } + } + } + }, + checkPendingTransaction({ getters, dispatch }) { + const transactions = getters.txs + + const pendingTxs = transactions.filter((tx) => tx.status === 1) + + for (const tx of pendingTxs) { + const [, , , netId] = tx.prefix.split('-') + + dispatch('checkPendingSpeedUpTx', { txHash: tx.txHash, note: `${tx.prefix}-${tx.note}`, netId }) + } + }, + async checkPendingSpeedUpTx({ commit, dispatch }, { txHash, netId, note }) { + try { + const result = await this.$provider.web3.eth.getTransactionReceipt(txHash) + + if (result) { + const status = result.status === '0x0' ? txStatus.fail : txStatus.success + + commit('CHANGE_TX_STATUS', { + storeType: 'txs', + txHash, + blockNumber: hexToNumber(result.blockNumber), + status, + netId + }) + } else { + const response = await dispatch( + 'application/loadDepositEvent', + { withdrawNote: note }, + { root: true } + ) + + if (response) { + commit('UPDATE_DEPOSIT', { + netId, + txHash, + storeType: 'txs', + status: txStatus.success, + timestamp: response.timestamp, + withdrawTxHash: response.txHash, + blockNumber: response.depositBlock + }) + } + } + } catch (err) { + throw new Error(`Method checkPendingSpeedUpTx has error ${err.message}`) + } + }, + async runTxWatcher({ commit, dispatch }, { storeType = 'txs', txHash, netId, isSaving = true }) { + console.log('runTxWatcher storeType txHash, netId', storeType, txHash, netId) + try { + // eslint-disable-next-line prefer-const + let { status, blockNumber } = await this.$provider.waitForTxReceipt({ txHash }) + status = status === '0x0' ? txStatus.fail : txStatus.success + + if (isSaving) { + commit('CHANGE_TX_STATUS', { + storeType, + txHash, + blockNumber: hexToNumber(blockNumber), + status, + netId + }) + } + + return status === txStatus.success + } catch (e) { + console.error('runTxWatcher', e) + return false + } + }, + async runTxWatcherWithNotifications( + { dispatch }, + { title, successTitle, storeType = 'txs', txHash, netId, onSuccess, isSaving } + ) { + try { + const noticeId = await dispatch( + 'notice/addNotice', + { + notice: { + title, + type: 'loading', + txHash + } + }, + { root: true } + ) + const success = await dispatch('runTxWatcher', { storeType, txHash, netId, isSaving }) + if (success) { + dispatch( + 'notice/updateNotice', + { + id: noticeId, + notice: { + title: successTitle, + type: 'success' + }, + interval: 10000 + }, + { root: true } + ) + if (typeof onSuccess === 'function') { + onSuccess(txHash) + } + } else { + dispatch( + 'notice/updateNotice', + { + id: noticeId, + notice: { + title: 'transactionFailed', + type: 'danger' + } + }, + { root: true } + ) + } + return success + } catch (e) { + console.error('runTxWatcherWithNotifications', e) + return false + } + }, + async cleanTxs({ getters, commit, dispatch }) { + // isSpentArray + getters.txs.forEach(({ status, txHash, type }) => { + if (status === txStatus.fail) { + commit('DELETE_TX', { txHash }) + } + }) + + const instances = await dispatch('getInstances', { + txs: getters.txs + }) + + for (const tx of getters.txs) { + if (tx && !tx.isSpent) { + const { currency, amount, netId, nullifierHex } = parseNote(`${tx.prefix}-${tx.note}`) + + const isSpent = await instances[`${amount}${currency}`].service.findEvent({ + eventName: 'nullifierHash', + eventToFind: nullifierHex, + type: eventsType.WITHDRAWAL + }) + + if (isSpent) { + commit('SET_SPENT', { txHash: tx.txHash, netId }) + } + } + } + }, + async updateDeposit( + { getters, commit, dispatch, rootGetters }, + { netId, type = 'tornado', action = 'Withdraw', note, txHash, fee, amount, currency } + ) { + const timestamp = Math.round(new Date().getTime() / 1000) + + let txMutation = 'SAVE_TX_HASH' + const tx = { + txHash, + type: action, + amount, + currency, + fee, + netId, + timestamp, + status: 2 + } + + if (type === 'tornado') { + const [tornado, , , , hexNote] = note.split('-') + const { commitmentHex } = parseNote(note) + tx.prefix = `${tornado}-${currency}-${amount}-${netId}` + tx.isSpent = true + + const encryptedTxs = getters.encryptedTxs + const encrypted = encryptedTxs.find((tx) => { + return tx.commitmentHex === commitmentHex + }) + + tx.storeType = encrypted ? 'encryptedTxs' : 'txs' + + const deposit = + encrypted || + getters.txs.find(({ note }) => { + return note === hexNote + }) + + tx.note = encrypted ? encrypted.note : hexNote + + const blockNumber = await dispatch('getBlockNumber', { txHash }) + tx.blockNumber = blockNumber + + if (deposit && deposit.txHash) { + txMutation = 'UPDATE_DEPOSIT' + tx.txHash = deposit.txHash + tx.withdrawTxHash = txHash + } else { + const events = await dispatch('application/loadDepositEvent', { withdrawNote: note }, { root: true }) + + tx.withdrawTxHash = txHash + tx.txHash = events.txHash + tx.depositBlock = events.depositBlock + tx.index = events.leafIndex + } + } + + commit(txMutation, tx) + }, + async getBlockNumber({ rootState }, { txHash }) { + try { + const { netId } = rootState.metamask + const { url } = rootState.settings[`netId${netId}`].rpc + + const web3 = this.$provider.getWeb3(url) + + const { blockNumber } = await web3.eth.getTransaction(txHash) + + return blockNumber + } catch (err) { + console.log('getBlockNumber has error:', err.message) + } + } +} diff --git a/store/txStatus.js b/store/txStatus.js new file mode 100644 index 0000000..0cceef6 --- /dev/null +++ b/store/txStatus.js @@ -0,0 +1,8 @@ +const statuses = Object.freeze({ + nonExistent: 0, + waitingForReciept: 1, + success: 2, + fail: 3 +}) + +export default statuses diff --git a/updateEncryptedEvents.js b/updateEncryptedEvents.js new file mode 100644 index 0000000..86913d4 --- /dev/null +++ b/updateEncryptedEvents.js @@ -0,0 +1,119 @@ +const fs = require('fs') +const Web3 = require('web3') +const Jszip = require('jszip') +const networkConfig = require('./networkConfig') + +const MAIN_NET_RPC_URL = networkConfig.netId1.rpcUrls.Infura.url +const GOERLI_RPC_URL = networkConfig.netId5.rpcUrls.Alchemy.url +const ABI = require('./abis/TornadoProxy.abi.json') + +const jszip = new Jszip() + +function getWeb3(netId) { + const rpc = Number(netId) === 1 ? MAIN_NET_RPC_URL : GOERLI_RPC_URL + const provider = new Web3.providers.HttpProvider(rpc) + const web3 = new Web3(provider) + + return web3 +} + +async function download({ name, contentType }) { + const path = `${name}.zip` + + const data = fs.readFileSync(path) + const zip = await jszip.loadAsync(data) + const file = zip.file(path.replace('./static/events/', '').slice(0, -4)) + + const content = await file.async(contentType) + + return content +} + +async function loadCachedEvents(file) { + try { + const module = await download({ + contentType: 'string', + name: file + }) + + if (module) { + const events = JSON.parse(module) + + const lastEvent = events[events.length - 1] + const lastBlock = lastEvent.block || lastEvent.blockNumber + + return { + events, + lastBlock + } + } + } catch (err) { + throw new Error(`Method loadCachedEvents has error: ${err.message}`) + } +} + +async function saveEncryptedNote(netId) { + const web3 = getWeb3(netId) + + const { + 'tornado-proxy.contract.tornadocash.eth': tornadoProxy, + 'tornado-router.contract.tornadocash.eth': tornadoRouter + } = networkConfig[`netId${netId}`] + + const contractAddress = tornadoRouter || tornadoProxy + + const contract = new web3.eth.Contract(ABI, contractAddress) + const currentBlockNumber = await web3.eth.getBlockNumber() + + const file = `./static/events/encrypted_notes_${netId}.json` + + let encryptedEvents = [] + + const cachedEvents = await loadCachedEvents(file) + console.log('cachedEvents', cachedEvents.events.length) + + const startBlock = cachedEvents.lastBlock + 1 + + const NUMBER_PARTS = 20 + const part = parseInt((currentBlockNumber - startBlock) / NUMBER_PARTS) + + let fromBlock = startBlock + let toBlock = startBlock + part + + for (let i = 0; i <= NUMBER_PARTS; i++) { + const partOfEvents = await contract.getPastEvents('EncryptedNote', { + toBlock, + fromBlock + }) + if (partOfEvents) { + encryptedEvents = encryptedEvents.concat(partOfEvents) + } + fromBlock = toBlock + toBlock += part + } + + console.log('Encrypted note', netId, encryptedEvents.length) + + encryptedEvents = encryptedEvents + .filter((e) => e.returnValues.encryptedNote) + .map((item) => { + return { + txHash: item.transactionHash, + blockNumber: Number(item.blockNumber), + encryptedNote: item.returnValues.encryptedNote + } + }) + + const eventsJson = JSON.stringify(cachedEvents.events.concat(encryptedEvents), null, 2) + '\n' + fs.writeFileSync(file, eventsJson) +} + +async function main() { + const NETWORKS = [1] + + for await (const netId of NETWORKS) { + await saveEncryptedNote(netId) + } +} + +main() diff --git a/updateEvents.js b/updateEvents.js new file mode 100644 index 0000000..c43c05b --- /dev/null +++ b/updateEvents.js @@ -0,0 +1,168 @@ +const fs = require('fs') +const Web3 = require('web3') +const Jszip = require('jszip') +const networkConfig = require('./networkConfig') + +const ABI = require('./abis/Instance.abi.json') + +const EVENTS = ['Deposit', 'Withdrawal'] +const CHAINS = [56] +const jszip = new Jszip() + +async function download({ name, contentType }) { + const path = `${name}.zip` + + const data = fs.readFileSync(path) + const zip = await jszip.loadAsync(data) + + const file = zip.file( + path + .replace('./static/events/', '') + .slice(0, -4) + .toLowerCase() + ) + + const content = await file.async(contentType) + + return content +} + +async function loadCachedEvents({ type, amount, nativeCurrency, deployedBlock }) { + try { + const module = await download({ + contentType: 'string', + name: `./static/events/${type}s_${nativeCurrency}_${amount}.json` + }) + + if (module) { + const events = JSON.parse(module) + + return { + events, + lastBlock: events[events.length - 1].blockNumber + } + } + } catch (err) { + console.error(`Method loadCachedEvents has error: ${err.message}`) + return { + events: [], + lastBlock: deployedBlock + } + } +} + +async function main(type, netId) { + const { tokens, nativeCurrency, deployedBlock } = networkConfig[`netId${netId}`] + const CONTRACTS = tokens[nativeCurrency].instanceAddress + + for (const [instance, _contract] of Object.entries(CONTRACTS)) { + const cachedEvents = await loadCachedEvents({ type, amount: instance, nativeCurrency, deployedBlock }) + console.log('cachedEvents', cachedEvents.events.length) + + let startBlock = cachedEvents.lastBlock + 1 + console.log('startBlock', startBlock) + + const rpcUrl = + netId === 1 + ? networkConfig[`netId${netId}`].rpcUrls.Infura.url + : networkConfig[`netId${netId}`].rpcUrls.publicRpc3.url + + const provider = new Web3.providers.HttpProvider(rpcUrl) + const web3 = new Web3(provider) + + const contract = new web3.eth.Contract(ABI, _contract) + + let events = [] + + console.log(netId) + if (netId === 56) { + const blockRange = 4950 + const currentBlockNumber = await web3.eth.getBlockNumber() + const blockDifference = Math.ceil(currentBlockNumber - startBlock) + + let numberParts = blockDifference === 0 ? 1 : Math.ceil(blockDifference / blockRange) + const part = Math.ceil(blockDifference / numberParts) + + console.log('numberParts', numberParts) + + let events = [] + let toBlock = startBlock + part + + if (startBlock < currentBlockNumber) { + if (toBlock >= currentBlockNumber) { + toBlock = 'latest' + numberParts = 1 + } + + for (let i = 0; i < numberParts; i++) { + try { + await new Promise((resolve) => setTimeout(resolve, 200)) + console.log({ startBlock, toBlock }) + const partOfEvents = await contract.getPastEvents(type, { + fromBlock: startBlock, + toBlock + }) + + if (partOfEvents) { + events = events.concat(partOfEvents) + console.log({ + events: events.length + }) + } + startBlock = toBlock + toBlock += part + } catch { + numberParts = numberParts + 1 + } + } + } + console.log({ events }) + } else { + events = await contract.getPastEvents(type, { + fromBlock: startBlock, + toBlock: 'latest' + }) + } + + console.log('events', events.length) + + if (type === 'Deposit') { + events = events.map(({ blockNumber, transactionHash, returnValues }) => { + const { commitment, leafIndex, timestamp } = returnValues + return { + blockNumber, + transactionHash, + commitment, + leafIndex: Number(leafIndex), + timestamp + } + }) + } + + if (type === 'Withdrawal') { + events = events.map(({ blockNumber, transactionHash, returnValues }) => { + const { nullifierHash, to, fee } = returnValues + return { + blockNumber, + transactionHash, + nullifierHash, + to, + fee + } + }) + } + + const eventsJson = JSON.stringify(cachedEvents.events.concat(events), null, 2) + '\n' + fs.writeFileSync(`./static/events/${type.toLowerCase()}s_${nativeCurrency}_${instance}.json`, eventsJson) + } +} + +async function start() { + for await (const chain of CHAINS) { + for await (const event of EVENTS) { + await main(event, chain) + } + } +} + +start() diff --git a/updateTree.js b/updateTree.js new file mode 100644 index 0000000..73c825a --- /dev/null +++ b/updateTree.js @@ -0,0 +1,183 @@ +const fs = require('fs') +const Jszip = require('jszip') +const zipper = require('zip-local') +const BloomFilter = require('bloomfilter.js') + +const jszip = new Jszip() +const EVENTS = ['deposit'] + +const { MerkleTree } = require('fixed-merkle-tree') +const { buildMimcSponge } = require('circomlibjs') + +const networkConfig = require('./networkConfig') + +const treesPath = './static/trees/' +const eventsPath = './static/events/' + +let mimcHash + +const trees = { + PARTS_COUNT: 4, + LEVELS: 20 // const from contract +} + +function getName({ path, type, instance, format = '.json', currName = 'eth' }) { + return `${path}${type.toLowerCase()}s_${currName}_${instance}${format}` +} + +const TREES_FOLDER = 'static/trees' +function createTreeZip(netId) { + try { + const config = networkConfig[`netId${netId}`] + const { instanceAddress: CONTRACTS } = config.tokens.eth + + for (const type of EVENTS) { + for (const [instance] of Object.entries(CONTRACTS)) { + const baseFilename = getName({ + type, + instance, + format: '', + path: treesPath, + currName: config.currencyName.toLowerCase() + }) + + const treesFolder = fs.readdirSync(TREES_FOLDER) + + treesFolder.forEach((fileName) => { + fileName = `${treesPath}${fileName}` + const isInstanceFile = !fileName.includes('.zip') && fileName.includes(baseFilename) + + if (isInstanceFile) { + zipper.sync + .zip(`${fileName}`) + .compress() + .save(`${fileName}.zip`) + + fs.unlinkSync(fileName) + } + }) + } + } + } catch {} +} + +async function createTree(netId) { + try { + const config = networkConfig[`netId${netId}`] + + const currName = config.currencyName.toLowerCase() + const { instanceAddress: CONTRACTS } = config.tokens.eth + + for (const type of EVENTS) { + for (const [instance] of Object.entries(CONTRACTS)) { + const filePath = getName({ + type, + instance, + currName, + format: '', + path: treesPath + }) + + console.log('createTree', { type, instance }) + + const events = await loadCachedEvents({ type, amount: instance, currName }) + console.log('events', events.length) + + const bloom = new BloomFilter(events.length) // to reduce the number of false positives + + const eventsData = events.reduce( + (acc, { leafIndex, commitment, ...rest }, i) => { + if (leafIndex !== i) { + throw new Error('leafIndex !== i', i, leafIndex) + } + + const leave = commitment.toString() + acc.leaves.push(leave) + acc.metadata[leave] = { ...rest, leafIndex } + + return acc + }, + { leaves: [], metadata: {} } + ) + + console.log('leaves', eventsData.leaves.length) + + const tree = new MerkleTree(trees.LEVELS, eventsData.leaves, { + zeroElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + hashFunction: mimcHash + }) + + const slices = tree.getTreeSlices(trees.PARTS_COUNT) // [edge(PARTS_COUNT)] + + slices.forEach((slice, index) => { + slice.metadata = slice.elements.reduce((acc, curr) => { + if (index < trees.PARTS_COUNT - 1) { + bloom.add(curr) + } + acc.push(eventsData.metadata[curr]) + return acc + }, []) + + const sliceJson = JSON.stringify(slice, null, 2) + '\n' + fs.writeFileSync(`${filePath}_slice${index + 1}.json`, sliceJson) + }) + + const bloomCache = bloom.serialize() + fs.writeFileSync(`${filePath}_bloom.json`, bloomCache) + } + } + } catch (e) { + console.log(e.message) + } +} + +async function download({ name, contentType }) { + const path = `${name}.zip` + + const data = fs.readFileSync(path) + const zip = await jszip.loadAsync(data) + + const file = zip.file( + path + .replace(eventsPath, '') + .slice(0, -4) + .toLowerCase() + ) + + const content = await file.async(contentType) + + return content +} + +async function loadCachedEvents({ type, amount, currName = 'eth', path = '' }) { + try { + const module = await download({ + contentType: 'string', + name: path || getName({ path: eventsPath, type, instance: amount, currName }) + }) + + if (module) { + return JSON.parse(module) + } + } catch (err) { + throw new Error(`Method loadCachedEvents has error: ${err.message}`) + } +} + +async function initMimc() { + const mimcSponge = await buildMimcSponge() + mimcHash = (left, right) => mimcSponge.F.toString(mimcSponge.multiHash([BigInt(left), BigInt(right)])) +} + +async function main() { + await initMimc() + + const NETWORKS = [1] + + for await (const netId of NETWORKS) { + await createTree(netId) + await createTreeZip(netId) + } +} + +main() diff --git a/updateZip.js b/updateZip.js new file mode 100644 index 0000000..a3a5a78 --- /dev/null +++ b/updateZip.js @@ -0,0 +1,113 @@ +const fs = require('fs') +const Jszip = require('jszip') +const zipper = require('zip-local') + +const jszip = new Jszip() +const EVENTS = ['Deposit', 'Withdrawal'] + +const networkConfig = require('./networkConfig') + +function updateEncryptedNote(netId) { + try { + const file = `./static/events/encrypted_notes_${netId}.json` + zipper.sync + .zip(file) + .compress() + .save(`${file}.zip`) + fs.unlinkSync(file) + } catch {} +} + +function updateCommon(netId) { + try { + const CURRENCY = networkConfig[`netId${netId}`].nativeCurrency + const CONTRACTS = networkConfig[`netId${netId}`].tokens[CURRENCY].instanceAddress + + for (const type of EVENTS) { + for (const [instance] of Object.entries(CONTRACTS)) { + const file = `./static/events/${type.toLowerCase()}s_${CURRENCY}_${instance}.json` + + zipper.sync + .zip(file) + .compress() + .save(`${file}.zip`) + + fs.unlinkSync(file) + } + } + } catch {} +} + +async function download({ name, contentType }) { + const path = `${name}.zip` + + const data = fs.readFileSync(path) + const zip = await jszip.loadAsync(data) + + const file = zip.file( + path + .replace('./static/events/', '') + .slice(0, -4) + .toLowerCase() + ) + + const content = await file.async(contentType) + + return content +} + +async function loadCachedEvents({ type, amount, CURRENCY, path = '' }) { + try { + const module = await download({ + contentType: 'string', + name: path || `./static/events/${type}s_${CURRENCY}_${amount}.json` + }) + + if (module) { + const events = JSON.parse(module) + + return { + events, + lastBlock: events[events.length - 1].blockNumber + } + } + } catch (err) { + throw new Error(`Method loadCachedEvents has error: ${err.message}`) + } +} + +async function testCommon(netId) { + for (const type of EVENTS) { + if (type === 'Withdrawal') { + return + } + + const CURRENCY = networkConfig[`netId${netId}`].nativeCurrency + const CONTRACTS = networkConfig[`netId${netId}`].tokens[CURRENCY].instanceAddress + + for (const [instance, _contract] of Object.entries(CONTRACTS)) { + console.log('update', { type, instance, contract: _contract }) + + const cachedEvents = await loadCachedEvents({ type, amount: instance, CURRENCY }) + console.log('cachedEvents', cachedEvents.events.length) + + cachedEvents.events.forEach((e, index) => { + if (Number(e.leafIndex) !== index) { + throw new Error(index) + } + }) + } + } +} + +async function main() { + const NETWORKS = [1, 5, 56] + + for await (const netId of NETWORKS) { + await updateEncryptedNote(netId) + await updateCommon(netId) + await testCommon(netId) + } +} + +main() diff --git a/utils/adapters.js b/utils/adapters.js new file mode 100644 index 0000000..f0c4184 --- /dev/null +++ b/utils/adapters.js @@ -0,0 +1,47 @@ +import { eventsType } from '@/constants' + +export function formatEvents(events, type) { + if (type === eventsType.DEPOSIT) { + return events.map(({ blockNumber, transactionHash, returnValues }) => { + const { commitment, leafIndex, timestamp } = returnValues + return { + blockNumber, + transactionHash, + commitment, + leafIndex: Number(leafIndex), + timestamp + } + }) + } else { + return events.map(({ blockNumber, transactionHash, returnValues }) => { + const { nullifierHash, to, fee } = returnValues + return { + blockNumber, + transactionHash, + nullifierHash, + to, + fee + } + }) + } +} + +export function formatEvent(event, type) { + if (type === eventsType.DEPOSIT) { + return { + timestamp: event.timestamp, + commitment: event.commitment, + leafIndex: Number(event.index ? event.index : event.leafIndex), + blockNumber: event.blockNumber, + transactionHash: event.transactionHash + } + } else { + return { + to: event.to, + fee: event.fee, + nullifierHash: event.nullifier ? event.nullifier : event.nullifierHash, + blockNumber: Number(event.blockNumber), + transactionHash: event.transactionHash + } + } +} diff --git a/utils/crypto.js b/utils/crypto.js new file mode 100644 index 0000000..e999f07 --- /dev/null +++ b/utils/crypto.js @@ -0,0 +1,101 @@ +import crypto from 'crypto' +import { BN, toBN } from 'web3-utils' + +import { pedersen } from '@/services' + +const CUT_LENGTH = 31 + +export function parseNote(note) { + const [, currency, amount, netId, hexNote] = note.split('-') + + return { + ...parseHexNote(hexNote), + netId, + amount, + currency + } +} + +export function parseHexNote(hexNote) { + const buffNote = Buffer.from(hexNote.slice(2), 'hex') + + const commitment = buffPedersenHash(buffNote) + + const nullifierBuff = buffNote.slice(0, CUT_LENGTH) + const nullifierHash = BigInt(buffPedersenHash(nullifierBuff)) + const nullifier = BigInt(leInt2Buff(buffNote.slice(0, CUT_LENGTH))) + + const secret = BigInt(leInt2Buff(buffNote.slice(CUT_LENGTH, CUT_LENGTH * 2))) + + return { + secret, + nullifier, + commitment, + nullifierBuff, + nullifierHash, + commitmentHex: toFixedHex(commitment), + nullifierHex: toFixedHex(nullifierHash) + } +} + +export function leInt2Buff(value) { + return new BN(value, 16, 'le') +} + +export function randomBN(nbytes = 31) { + return toBN(leInt2Buff(crypto.randomBytes(nbytes)).toString()) +} + +export function buffPedersenHash(buffer) { + const [hash] = pedersen.unpackPoint(buffer) + return pedersen.toStringBuffer(hash) +} + +export function toFixedHex(value, length = 32) { + const isBuffer = value instanceof Buffer + + const str = isBuffer ? value.toString('hex') : BigInt(value).toString(16) + return '0x' + str.padStart(length * 2, '0') +} + +export const isEmptyArray = (arr) => !Array.isArray(arr) || !arr.length + +export function packEncryptedMessage(encryptedMessage) { + const nonceBuf = Buffer.from(encryptedMessage.nonce, 'base64') + const ephemPublicKeyBuf = Buffer.from(encryptedMessage.ephemPublicKey, 'base64') + const ciphertextBuf = Buffer.from(encryptedMessage.ciphertext, 'base64') + const messageBuff = Buffer.concat([ + Buffer.alloc(24 - nonceBuf.length), + nonceBuf, + Buffer.alloc(32 - ephemPublicKeyBuf.length), + ephemPublicKeyBuf, + ciphertextBuf + ]) + return '0x' + messageBuff.toString('hex') +} + +export function unpackEncryptedMessage(encryptedMessage) { + if (encryptedMessage.slice(0, 2) === '0x') { + encryptedMessage = encryptedMessage.slice(2) + } + const messageBuff = Buffer.from(encryptedMessage, 'hex') + const nonceBuf = messageBuff.slice(0, 24) + const ephemPublicKeyBuf = messageBuff.slice(24, 56) + const ciphertextBuf = messageBuff.slice(56) + return { + version: 'x25519-xsalsa20-poly1305', + nonce: nonceBuf.toString('base64'), + ephemPublicKey: ephemPublicKeyBuf.toString('base64'), + ciphertext: ciphertextBuf.toString('base64') + } +} + +export function checkCommitments(events = []) { + events.forEach(({ leafIndex }, i) => { + // TODO reload events, need for if infura provider missing events + if (leafIndex !== i) { + console.error(`Missing deposit event for deposit #${i}`) + throw new Error(window.$nuxt.$t('failedToFetchAllDepositEvents')) + } + }) +} diff --git a/utils/debounce.js b/utils/debounce.js new file mode 100644 index 0000000..63618d2 --- /dev/null +++ b/utils/debounce.js @@ -0,0 +1,17 @@ +export const _debounce = (func, waitFor) => { + let timeout = null + + const debounceFunction = (...args) => { + if (timeout) { + clearTimeout(timeout) + timeout = null + } + timeout = setTimeout(() => { + return func(...args) + }, waitFor) + } + + return debounceFunction +} + +export const debounce = _debounce((func, args) => func(args), 400) diff --git a/utils/index.js b/utils/index.js new file mode 100644 index 0000000..df30fec --- /dev/null +++ b/utils/index.js @@ -0,0 +1,37 @@ +import FileSaver from 'file-saver' + +export * from './crypto' +export * from './debounce' +export * from './adapters' +export * from './storeUtils' +export * from './stringUtils' +export * from './numberUtils' +export * from './instanceUtils' + +export function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)) +} + +export function detectMob() { + if ( + navigator.userAgent.match(/Android/i) || + navigator.userAgent.match(/webOS/i) || + navigator.userAgent.match(/iPhone/i) || + navigator.userAgent.match(/iPad/i) || + navigator.userAgent.match(/iPod/i) || + navigator.userAgent.match(/BlackBerry/i) || + navigator.userAgent.match(/Windows Phone/i) + ) { + return true + } else { + return false + } +} + +export function saveAsFile(data, name) { + if (detectMob()) { + return + } + + FileSaver.saveAs(data, name) +} diff --git a/utils/instanceUtils.js b/utils/instanceUtils.js new file mode 100644 index 0000000..33e3634 --- /dev/null +++ b/utils/instanceUtils.js @@ -0,0 +1,16 @@ +import networkConfig from '@/networkConfig' + +export function getInstanceByAddress({ netId, address }) { + const { tokens } = networkConfig[`netId${netId}`] + + for (const [currency, { instanceAddress }] of Object.entries(tokens)) { + for (const [amount, instance] of Object.entries(instanceAddress)) { + if (instance === address) { + return { + amount, + currency + } + } + } + } +} diff --git a/utils/numberUtils.js b/utils/numberUtils.js new file mode 100644 index 0000000..ae50017 --- /dev/null +++ b/utils/numberUtils.js @@ -0,0 +1,6 @@ +import { BigNumber as BN } from 'bignumber.js' + +// return the number of decimal places of the value +export function decimalPlaces(value) { + return new BN(value).dp() +} diff --git a/utils/storeUtils.js b/utils/storeUtils.js new file mode 100644 index 0000000..671c82a --- /dev/null +++ b/utils/storeUtils.js @@ -0,0 +1,24 @@ +import { cloneDeep } from 'lodash' +import { CHAIN_IDS } from '@/constants' + +const netIdWrapper = (initialState) => (acc, netId) => ({ + ...acc, + [netId]: Object.assign({}, cloneDeep(initialState)) +}) + +export function createChainIdState(initialState) { + return CHAIN_IDS.reduce(netIdWrapper(initialState), {}) +} + +export function isStorageAvailable(type) { + try { + const test = '__test__' + const storage = window[type] + + storage.setItem(test, test) + storage.removeItem(test) + return true + } catch { + return false + } +} diff --git a/utils/stringUtils.js b/utils/stringUtils.js new file mode 100644 index 0000000..a7a885b --- /dev/null +++ b/utils/stringUtils.js @@ -0,0 +1,22 @@ +export function capitalizeFirstLetter(string) { + return string.charAt(0).toUpperCase() + string.slice(1) +} + +export const hashRender = (hash, size = 4, separator = '...') => { + return hash.slice(0, size) + separator + hash.slice(-size) +} + +export const sliceAddress = (address) => { + return '0x' + hashRender(address.slice(2)) +} + +const semVerRegex = /^(?0|[1-9]\d*)\.(?0|[1-9]\d*)\.(?0|[1-9]\d*)(?:-(?(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/ + +export const parseSemanticVersion = (version) => { + const { groups } = semVerRegex.exec(version) + return groups +} + +export const isWalletRejection = (err) => { + return /cance(l)+ed|denied|rejected/im.test(err.message) +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..77eec63 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,17054 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@apollo/client@^3.3.20": + version "3.3.20" + resolved "https://registry.npmjs.org/@apollo/client/-/client-3.3.20.tgz#8f0935fa991857e9cf2e73c9bd378ad7ec97caf8" + integrity sha512-hS7UmBwJweudw/J3M0RAcusMHNiRuGqkRH6g91PM2ev8cXScIMdXr/++9jo7wD1nAITMCMF4HQQ3LFaw/Or0Bw== + dependencies: + "@graphql-typed-document-node/core" "^3.0.0" + "@types/zen-observable" "^0.8.0" + "@wry/context" "^0.6.0" + "@wry/equality" "^0.5.0" + fast-json-stable-stringify "^2.0.0" + graphql-tag "^2.12.0" + hoist-non-react-statics "^3.3.2" + optimism "^0.16.0" + prop-types "^15.7.2" + symbol-observable "^4.0.0" + ts-invariant "^0.7.0" + tslib "^1.10.0" + zen-observable "^0.8.14" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.12.5", "@babel/compat-data@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" + integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw== + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" + integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== + +"@babel/core@^7.1.0": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" + integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.5.5" + "@babel/helpers" "^7.5.5" + "@babel/parser" "^7.5.5" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.12.0": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" + integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.10" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.10.tgz#2b188fc329fb8e4f762181703beffc0fe6df3460" + integrity sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww== + dependencies: + "@babel/types" "^7.12.10" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.17.3": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" + integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.4.0", "@babel/generator@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" + integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== + dependencies: + "@babel/types" "^7.5.5" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" + integrity sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ== + dependencies: + "@babel/types" "^7.12.10" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-compilation-targets@^7.12.0", "@babel/helper-compilation-targets@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831" + integrity sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw== + dependencies: + "@babel/compat-data" "^7.12.5" + "@babel/helper-validator-option" "^7.12.1" + browserslist "^4.14.5" + semver "^5.5.0" + +"@babel/helper-compilation-targets@^7.13.0": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46" + integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" + integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.12.1" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.10.4" + +"@babel/helper-create-regexp-features-plugin@^7.12.1": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz#2084172e95443fa0a09214ba1bb328f9aea1278f" + integrity sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + regexpu-core "^4.7.1" + +"@babel/helper-define-map@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.5" + lodash "^4.17.19" + +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633" + integrity sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf" + integrity sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag== + dependencies: + "@babel/types" "^7.12.10" + +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-member-expression-to-functions@^7.12.1": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855" + integrity sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw== + dependencies: + "@babel/types" "^7.12.7" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" + integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== + dependencies: + "@babel/types" "^7.12.5" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" + integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-simple-access" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/helper-validator-identifier" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d" + integrity sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ== + dependencies: + "@babel/types" "^7.12.10" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-remap-async-to-generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" + integrity sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/types" "^7.12.1" + +"@babel/helper-replace-supers@^7.12.1": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz#f009a17543bbbbce16b06206ae73b63d3fca68d9" + integrity sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.12.1" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" + +"@babel/helper-simple-access@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" + integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" + integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-wrap-function@^7.10.4": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" + integrity sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helpers@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" + integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" + +"@babel/helpers@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e" + integrity sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g== + dependencies: + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" + +"@babel/highlight@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4", "@babel/parser@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" + integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== + +"@babel/parser@^7.12.10", "@babel/parser@^7.12.7": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.10.tgz#824600d59e96aea26a5a2af5a9d812af05c3ae81" + integrity sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA== + +"@babel/parser@^7.16.7", "@babel/parser@^7.17.3": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.7.tgz#fc19b645a5456c8d6fdb6cecd3c66c0173902800" + integrity sha512-bm3AQf45vR4gKggRfvJdYJ0gFLoCbsPxiFLSH6hTVYABptNHY6l9NrhnucVjQ/X+SPtLANT9lc0fFhikj+VBRA== + +"@babel/plugin-proposal-async-generator-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz#dc6c1170e27d8aca99ff65f4925bd06b1c90550e" + integrity sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" + integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-decorators@^7.10.5": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz#59271439fed4145456c41067450543aee332d15f" + integrity sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-decorators" "^7.12.1" + +"@babel/plugin-proposal-dynamic-import@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" + integrity sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-export-namespace-from@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" + integrity sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" + integrity sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-logical-assignment-operators@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" + integrity sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" + integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz#8bf253de8139099fea193b297d23a9d406ef056b" + integrity sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-optional-catch-binding@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" + integrity sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.12.0", "@babel/plugin-proposal-optional-chaining@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz#e02f0ea1b5dc59d401ec16fb824679f683d3303c" + integrity sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389" + integrity sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" + integrity sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" + integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-decorators@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz#81a8b535b284476c41be6de06853a8802b98c5dd" + integrity sha512-ir9YW5daRrTYiy9UJ2TzdNIJEZu8KclVzDcfSt4iEmOtwQ4llPtWInNKJyKnVXp1vE4bbVd5S31M/im3mYMO1w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" + integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-arrow-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" + integrity sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-async-to-generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" + integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" + +"@babel/plugin-transform-block-scoped-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" + integrity sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-block-scoping@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" + integrity sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-classes@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" + integrity sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.10.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" + integrity sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-destructuring@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" + integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" + integrity sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-duplicate-keys@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" + integrity sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-exponentiation-operator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" + integrity sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-for-of@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" + integrity sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-function-name@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" + integrity sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" + integrity sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" + integrity sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-modules-amd@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" + integrity sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ== + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" + integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag== + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.12.1" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" + integrity sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q== + dependencies: + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-identifier" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" + integrity sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q== + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" + integrity sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + +"@babel/plugin-transform-new-target@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" + integrity sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-object-super@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" + integrity sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + +"@babel/plugin-transform-parameters@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" + integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-property-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" + integrity sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-regenerator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" + integrity sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" + integrity sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-runtime@^7.12.0": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz#af0fded4e846c4b37078e8e5d06deac6cd848562" + integrity sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA== + dependencies: + "@babel/helper-module-imports" "^7.12.5" + "@babel/helper-plugin-utils" "^7.10.4" + semver "^5.5.1" + +"@babel/plugin-transform-runtime@^7.5.5": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz#0a2e08b5e2b2d95c4b1d3b3371a2180617455b70" + integrity sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" + integrity sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-spread@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" + integrity sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + +"@babel/plugin-transform-sticky-regex@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz#560224613ab23987453948ed21d0b0b193fa7fad" + integrity sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-template-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843" + integrity sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-typeof-symbol@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz#de01c4c8f96580bd00f183072b0d0ecdcf0dec4b" + integrity sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-escapes@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709" + integrity sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" + integrity sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/preset-env@^7.12.0": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.10.tgz#ca981b95f641f2610531bd71948656306905e6ab" + integrity sha512-Gz9hnBT/tGeTE2DBNDkD7BiWRELZt+8lSysHuDwmYXUIvtwZl0zI+D6mZgXZX0u8YBlLS4tmai9ONNY9tjRgRA== + dependencies: + "@babel/compat-data" "^7.12.7" + "@babel/helper-compilation-targets" "^7.12.5" + "@babel/helper-module-imports" "^7.12.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-option" "^7.12.1" + "@babel/plugin-proposal-async-generator-functions" "^7.12.1" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-dynamic-import" "^7.12.1" + "@babel/plugin-proposal-export-namespace-from" "^7.12.1" + "@babel/plugin-proposal-json-strings" "^7.12.1" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-numeric-separator" "^7.12.7" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.7" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.12.1" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-async-to-generator" "^7.12.1" + "@babel/plugin-transform-block-scoped-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.1" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-computed-properties" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-dotall-regex" "^7.12.1" + "@babel/plugin-transform-duplicate-keys" "^7.12.1" + "@babel/plugin-transform-exponentiation-operator" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-function-name" "^7.12.1" + "@babel/plugin-transform-literals" "^7.12.1" + "@babel/plugin-transform-member-expression-literals" "^7.12.1" + "@babel/plugin-transform-modules-amd" "^7.12.1" + "@babel/plugin-transform-modules-commonjs" "^7.12.1" + "@babel/plugin-transform-modules-systemjs" "^7.12.1" + "@babel/plugin-transform-modules-umd" "^7.12.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" + "@babel/plugin-transform-new-target" "^7.12.1" + "@babel/plugin-transform-object-super" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-property-literals" "^7.12.1" + "@babel/plugin-transform-regenerator" "^7.12.1" + "@babel/plugin-transform-reserved-words" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/plugin-transform-sticky-regex" "^7.12.7" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/plugin-transform-typeof-symbol" "^7.12.10" + "@babel/plugin-transform-unicode-escapes" "^7.12.1" + "@babel/plugin-transform-unicode-regex" "^7.12.1" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.10" + core-js-compat "^3.8.0" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@^7.12.0", "@babel/runtime@^7.8.4": + 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.4.4", "@babel/runtime@^7.5.5": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.7.tgz#a5f3328dc41ff39d803f311cfe17703418cf9825" + integrity sha512-L6rvG9GDxaLgFjg41K+5Yv9OMrU98sWe+Ykmc6FDJW/+vYZMhdOMKkISgzptMaERHvS2Y2lw9MDRm2gHhlQQoA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/template@^7.10.4", "@babel/template@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" + integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.12.7" + "@babel/types" "^7.12.7" + +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" + integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.5.5" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.5.5" + "@babel/types" "^7.5.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.10.tgz#2d1f4041e8bf42ea099e5b2dc48d6a594c00017a" + integrity sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.10" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.12.10" + "@babel/types" "^7.12.10" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/traverse@^7.13.0": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" + integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.3" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.3" + "@babel/types" "^7.17.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" + integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.5", "@babel/types@^7.12.7": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.10.tgz#7965e4a7260b26f09c56bcfcb0498af1f6d9b260" + integrity sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@babel/types@^7.16.7", "@babel/types@^7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@ensdomains/address-encoder@^0.1.7": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz#f948c485443d9ef7ed2c0c4790e931c33334d02d" + integrity sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg== + dependencies: + bech32 "^1.1.3" + blakejs "^1.1.0" + bn.js "^4.11.8" + bs58 "^4.0.1" + crypto-addr-codec "^0.1.7" + nano-base32 "^1.0.1" + ripemd160 "^2.0.2" + +"@ensdomains/ens@0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" + integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== + dependencies: + bluebird "^3.5.2" + eth-ens-namehash "^2.0.8" + solc "^0.4.20" + testrpc "0.0.1" + web3-utils "^1.0.0-beta.31" + +"@ensdomains/ensjs@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@ensdomains/ensjs/-/ensjs-2.1.0.tgz#0a7296c1f3d735ef019320d863a7846a0760c460" + integrity sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog== + dependencies: + "@babel/runtime" "^7.4.4" + "@ensdomains/address-encoder" "^0.1.7" + "@ensdomains/ens" "0.4.5" + "@ensdomains/resolver" "0.2.4" + content-hash "^2.5.2" + eth-ens-namehash "^2.0.8" + ethers "^5.0.13" + js-sha3 "^0.8.0" + +"@ensdomains/resolver@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" + integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== + +"@ethereumjs/common@^2.3.0", "@ethereumjs/common@^2.4.0", "@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.1": + version "2.6.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.2.tgz#eb006c9329c75c80f634f340dc1719a5258244df" + integrity sha512-vDwye5v0SVeuDky4MtKsu+ogkH2oFUV8pBKzH/eNBzT8oI91pKa8WyzDuYuxOQsgNgv5R34LfFDh2aaw3H4HbQ== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.4" + +"@ethereumjs/tx@^3.2.1", "@ethereumjs/tx@^3.3.2": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.0.tgz#783b0aeb08518b9991b23f5155763bbaf930a037" + integrity sha512-/+ZNbnJhQhXC83Xuvy6I9k4jT5sXiV0tMR9C+AzSSpcCV64+NB8dTE1m3x98RYMqb8+TLYWA+HML4F5lfXTlJw== + dependencies: + "@ethereumjs/common" "^2.6.1" + ethereumjs-util "^7.1.4" + +"@ethersproject/abi@5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" + integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== + dependencies: + "@ethersproject/address" "^5.0.4" + "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/constants" "^5.0.4" + "@ethersproject/hash" "^5.0.4" + "@ethersproject/keccak256" "^5.0.3" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.3" + "@ethersproject/strings" "^5.0.4" + +"@ethersproject/abi@5.6.0", "@ethersproject/abi@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.0.tgz#ea07cbc1eec2374d32485679c12408005895e9f3" + integrity sha512-AhVByTwdXCc2YQ20v300w6KVHle9g2OFc28ZAFCPnJyEpkv1xKXjZcSTgWOlv1i+0dqlgF8RCF2Rn2KC1t+1Vg== + dependencies: + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + +"@ethersproject/abstract-provider@5.6.0", "@ethersproject/abstract-provider@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061" + integrity sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw== + dependencies: + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/web" "^5.6.0" + +"@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7" + integrity sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ== + dependencies: + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + +"@ethersproject/address@5.6.0", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" + integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ== + dependencies: + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/rlp" "^5.6.0" + +"@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" + integrity sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw== + dependencies: + "@ethersproject/bytes" "^5.6.0" + +"@ethersproject/basex@5.6.0", "@ethersproject/basex@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69" + integrity sha512-qN4T+hQd/Md32MoJpc69rOwLYRUXwjTlhHDIeUkUmiN/JyWkkLLMoG0TqvSQKNqZOMgN5stbUYN6ILC+eD7MEQ== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + +"@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26" + integrity sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + bn.js "^4.11.9" + +"@ethersproject/bytes@5.6.0", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.0.tgz#81652f2a0e04533575befadce555213c11d8aa20" + integrity sha512-3hJPlYemb9V4VLfJF5BfN0+55vltPZSHU3QKUyP9M3Y2TcajbiRrz65UG+xVHOzBereB1b9mn7r12o177xgN7w== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/constants@5.6.0", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088" + integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA== + dependencies: + "@ethersproject/bignumber" "^5.6.0" + +"@ethersproject/contracts@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067" + integrity sha512-74Ge7iqTDom0NX+mux8KbRUeJgu1eHZ3iv6utv++sLJG80FVuU9HnHeKVPfjd9s3woFhaFoQGf3B3iH/FrQmgw== + dependencies: + "@ethersproject/abi" "^5.6.0" + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + +"@ethersproject/hash@5.6.0", "@ethersproject/hash@^5.0.4", "@ethersproject/hash@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.0.tgz#d24446a5263e02492f9808baa99b6e2b4c3429a2" + integrity sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA== + dependencies: + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + +"@ethersproject/hdnode@5.6.0", "@ethersproject/hdnode@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998" + integrity sha512-61g3Jp3nwDqJcL/p4nugSyLrpl/+ChXIOtCEM8UDmWeB3JCAt5FoLdOMXQc3WWkc0oM2C0aAn6GFqqMcS/mHTw== + dependencies: + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/basex" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" + "@ethersproject/signing-key" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/wordlists" "^5.6.0" + +"@ethersproject/json-wallets@5.6.0", "@ethersproject/json-wallets@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz#4c2fc27f17e36c583e7a252fb938bc46f98891e5" + integrity sha512-fmh86jViB9r0ibWXTQipxpAGMiuxoqUf78oqJDlCAJXgnJF024hOOX7qVgqsjtbeoxmcLwpPsXNU0WEe/16qPQ== + dependencies: + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/hdnode" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" + integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== + dependencies: + "@ethersproject/bytes" "^5.6.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" + integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== + +"@ethersproject/networks@5.6.0", "@ethersproject/networks@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.0.tgz#486d03fff29b4b6b5414d47a232ded09fe10de5e" + integrity sha512-DaVzgyThzHgSDLuURhvkp4oviGoGe9iTZW4jMEORHDRCgSZ9K9THGFKqL+qGXqPAYLEgZTf5z2w56mRrPR1MjQ== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" + integrity sha512-Wu1AxTgJo3T3H6MIu/eejLFok9TYoSdgwRr5oGY1LTLfmGesDoSx05pemsbrPT2gG4cQME+baTSCp5sEo2erZQ== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" + +"@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" + integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/providers@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.1.tgz#9a05f00ecbac59565bf6907c8d2af8ac33303b48" + integrity sha512-w8Wx15nH+aVDvnoKCyI1f3x0B5idmk/bDJXMEUqCfdO8Eadd0QpDx9lDMTMmenhOmf9vufLJXjpSm24D3ZnVpg== + dependencies: + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/basex" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.0" + "@ethersproject/rlp" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/web" "^5.6.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" + integrity sha512-si0PLcLjq+NG/XHSZz90asNf+YfKEqJGVdxoEkSukzbnBgC8rydbgbUgBbBGLeHN4kAJwUFEKsu3sCXT93YMsw== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717" + integrity sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/sha2@5.6.0", "@ethersproject/sha2@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9" + integrity sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.6.0", "@ethersproject/signing-key@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.0.tgz#4f02e3fb09e22b71e2e1d6dc4bcb5dafa69ce042" + integrity sha512-S+njkhowmLeUu/r7ir8n78OUKx63kBdMCPssePS89So1TH4hZqnWFsThEd/GiXYp9qMxVrydf7KdM9MTGPFukA== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3" + integrity sha512-YwF52vTNd50kjDzqKaoNNbC/r9kMDPq3YzDWmsjFTRBcIF1y4JCQJ8gB30wsTfHbaxgxelI5BfxQSxD/PbJOww== + dependencies: + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + +"@ethersproject/strings@5.6.0", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" + integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" + integrity sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg== + dependencies: + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/rlp" "^5.6.0" + "@ethersproject/signing-key" "^5.6.0" + +"@ethersproject/units@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c" + integrity sha512-tig9x0Qmh8qbo1w8/6tmtyrm/QQRviBh389EQ+d8fP4wDsBrJBf08oZfoiz1/uenKK9M78yAP4PoR7SsVoTjsw== + dependencies: + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/wallet@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.0.tgz#33d11a806d783864208f348709a5a3badac8e22a" + integrity sha512-qMlSdOSTyp0MBeE+r7SUhr1jjDlC1zAXB8VD84hCnpijPQiSNbxr6GdiLXxpUs8UKzkDiNYYC5DRI3MZr+n+tg== + dependencies: + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/hdnode" "^5.6.0" + "@ethersproject/json-wallets" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.0" + "@ethersproject/signing-key" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/wordlists" "^5.6.0" + +"@ethersproject/web@5.6.0", "@ethersproject/web@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.0.tgz#4bf8b3cbc17055027e1a5dd3c357e37474eaaeb8" + integrity sha512-G/XHj0hV1FxI2teHRfCGvfBUHFmU+YOSbCxlAMqJklxSa7QMiHFQfAxvwY2PFqgvdkxEKwRNr/eCjfAPEm2Ctg== + dependencies: + "@ethersproject/base64" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + +"@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" + integrity sha512-q0bxNBfIX3fUuAo9OmjlEYxP40IB8ABgb7HjEZCL5IKubzV3j30CWi2rqQbjTS2HfoyQbfINoKcTVWP4ejwR7Q== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + +"@graphql-typed-document-node/core@^3.0.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.0.tgz#0eee6373e11418bfe0b5638f654df7a4ca6a3950" + integrity sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg== + +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + realpath-native "^1.1.0" + rimraf "^2.5.4" + slash "^2.0.0" + strip-ansi "^5.0.0" + +"@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + node-notifier "^5.4.2" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@metamask/onboarding@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@metamask/onboarding/-/onboarding-1.0.0.tgz#500c65b58d1e09419b049638024db040cce30dc6" + integrity sha512-GnR1Sv87plYM58RYRC7V04oo52JEL4zDmgoLKLdjr59ma60lK6LzZz3k9uJscqUAfwtgKurXHz2Hx5r2oBC6vQ== + dependencies: + bowser "^2.9.0" + tslib "^1.11.0" + +"@metamask/safe-event-emitter@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" + integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@nuxt/babel-preset-app@2.14.7": + version "2.14.7" + resolved "https://registry.yarnpkg.com/@nuxt/babel-preset-app/-/babel-preset-app-2.14.7.tgz#47206d368218b09d4ebc9fe61ca3a8c38ea4e0d5" + integrity sha512-lVlWvOY1exNL2tuXkYMHWOw4fiD32w2aIRYBprmechTnbjVBCExk+RabCsd6Dvyp0dYDQRrWW4IwsWZ36wqDyg== + dependencies: + "@babel/core" "^7.12.0" + "@babel/helper-compilation-targets" "^7.12.0" + "@babel/plugin-proposal-class-properties" "^7.10.4" + "@babel/plugin-proposal-decorators" "^7.10.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.0" + "@babel/plugin-proposal-optional-chaining" "^7.12.0" + "@babel/plugin-transform-runtime" "^7.12.0" + "@babel/preset-env" "^7.12.0" + "@babel/runtime" "^7.12.0" + "@vue/babel-preset-jsx" "^1.1.2" + core-js "^2.6.5" + +"@nuxt/builder@2.14.7": + version "2.14.7" + resolved "https://registry.yarnpkg.com/@nuxt/builder/-/builder-2.14.7.tgz#fe7b276d788e149923f5d7b93c3c9e23713ce0c4" + integrity sha512-dKH3z0kvm1JTm9+2RF0xKb7AGPYfMxqS1JIYTWUxT6LUQAU8A22oM6iv10sE5X6JDx0CEiW9BTZnArnR7Cjehw== + dependencies: + "@nuxt/devalue" "^1.2.4" + "@nuxt/utils" "2.14.7" + "@nuxt/vue-app" "2.14.7" + "@nuxt/webpack" "2.14.7" + chalk "^3.0.0" + chokidar "^3.4.3" + consola "^2.15.0" + fs-extra "^8.1.0" + glob "^7.1.6" + hash-sum "^2.0.0" + ignore "^5.1.8" + lodash "^4.17.20" + pify "^4.0.1" + semver "^7.3.2" + serialize-javascript "^5.0.1" + upath "^2.0.0" + +"@nuxt/cli@2.14.7": + version "2.14.7" + resolved "https://registry.yarnpkg.com/@nuxt/cli/-/cli-2.14.7.tgz#16e55e35782f46c325f52a477e9031c4b7f88d45" + integrity sha512-6EDN0WGYMpZ3wRARtTaWEm0YfJk+f2gFo0Ivgm9VZZSNHBNlw+l5b6ABzZ3JNA895dAj04rsS8wl2Q8svq5l5Q== + dependencies: + "@nuxt/config" "2.14.7" + "@nuxt/static" "^1.0.0" + "@nuxt/utils" "2.14.7" + boxen "^4.2.0" + chalk "^3.0.0" + compression "^1.7.4" + connect "^3.7.0" + consola "^2.15.0" + crc "^3.8.0" + destr "^1.0.0" + esm "^3.2.25" + execa "^3.4.0" + exit "^0.1.2" + fs-extra "^8.1.0" + globby "^11.0.1" + hable "^3.0.0" + minimist "^1.2.5" + opener "1.5.2" + pretty-bytes "^5.4.1" + serve-static "^1.14.1" + std-env "^2.2.1" + upath "^2.0.0" + wrap-ansi "^6.2.0" + +"@nuxt/components@^1.1.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@nuxt/components/-/components-1.2.2.tgz#675975758f77d3cbd33f9561867d71ba9e54d0e9" + integrity sha512-AByrBPnV4mWwwf1tPaKLmtg6JBsNJACLuSnpJOpWGV6KjS5S8i6BTf8dqiPN0uGg6YeSQaeDWtnfILcoLp2GSw== + dependencies: + chalk "^4.1.0" + chokidar "^3.4.3" + glob "^7.1.6" + globby "^11.0.1" + lodash "^4.17.20" + semver "^7.3.4" + vue-template-compiler "^2.6.12" + +"@nuxt/config@2.14.7": + version "2.14.7" + resolved "https://registry.yarnpkg.com/@nuxt/config/-/config-2.14.7.tgz#9ef2d03d440f66d3bdb9e665f03eb0827fbbcff8" + integrity sha512-qWbeJMpTWiz7aK+2kXDEPK/gJgCVDdZZ5eiJZ7I2ACqgjq9WkJ5Dn34+jDYSG3BRI7/or3iBFpCQhWysPy69Gw== + dependencies: + "@nuxt/utils" "2.14.7" + consola "^2.15.0" + create-require "^1.0.2" + defu "^2.0.4" + destr "^1.0.0" + dotenv "^8.2.0" + esm "^3.2.25" + jiti "^0.1.11" + rc9 "^1.0.0" + std-env "^2.2.1" + +"@nuxt/core@2.14.7": + version "2.14.7" + resolved "https://registry.yarnpkg.com/@nuxt/core/-/core-2.14.7.tgz#a819ce2c926d6d48dd7eed026c3cc5241126ef32" + integrity sha512-ssg4C+FGzmd6TjtYdPUGUdwUwJsu8IBLxaMo/BpPLnOd8Qs44g6bJX4OsioS9gdwfiMsZBw7j1tF5dbP5MjuNQ== + dependencies: + "@nuxt/config" "2.14.7" + "@nuxt/devalue" "^1.2.4" + "@nuxt/server" "2.14.7" + "@nuxt/utils" "2.14.7" + "@nuxt/vue-renderer" "2.14.7" + consola "^2.15.0" + debug "^4.2.0" + esm "^3.2.25" + fs-extra "^8.1.0" + hable "^3.0.0" + hash-sum "^2.0.0" + std-env "^2.2.1" + +"@nuxt/devalue@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nuxt/devalue/-/devalue-1.2.4.tgz#69eca032b7481fd3c019a78ade65d642da3f2f35" + integrity sha512-hS87c2HdSfTk1d+2KQx7mQpebyd2HjguvZu/UBy9LB+kUgT1qz2+Sj38FH32yJALK6Fv49ZfOZEwgcZ4rcNLjg== + dependencies: + consola "^2.9.0" + +"@nuxt/friendly-errors-webpack-plugin@^2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@nuxt/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-2.5.0.tgz#5374665bc72d34b7dbadcc361a4777e3f0f5d46b" + integrity sha512-pUgPFmRL56/xuTCGN5rqgTfxvs1N/AYJw7q7tUHiZaBm3UyPgbIVPkadS9njwbFbPD2XcebVy7npQMMVwQJWfA== + dependencies: + chalk "^2.3.2" + consola "^2.6.0" + error-stack-parser "^2.0.0" + string-width "^2.0.0" + +"@nuxt/generator@2.14.7": + version "2.14.7" + resolved "https://registry.yarnpkg.com/@nuxt/generator/-/generator-2.14.7.tgz#97dfb43fa302c8a301dfa5f65a833e774313bbea" + integrity sha512-EzpUudKB5lpgS9dxI0ms3tcKbNFrFjJdwEn6aKvhdC1fAl7KGSkfCb1Nt3l5JM25XIGRyCk6hB15f7zM2Xhg7A== + dependencies: + "@nuxt/utils" "2.14.7" + chalk "^3.0.0" + consola "^2.15.0" + fs-extra "^8.1.0" + html-minifier "^4.0.0" + node-html-parser "^1.3.1" + +"@nuxt/loading-screen@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nuxt/loading-screen/-/loading-screen-2.0.3.tgz#1d6b1f976bb143c6592231af0bf7fa6245f6ebd2" + integrity sha512-ThvxxUpfTZezzz0gAgyG4vHCM7KDeA692EL7lKrZ/fU8JvXlG6LYngVLWAobexBsydtGkuZyKCwCVDnEGNL4jw== + dependencies: + connect "^3.7.0" + defu "^2.0.4" + get-port-please "^1.0.0" + node-res "^5.0.1" + serve-static "^1.14.1" + +"@nuxt/opencollective@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@nuxt/opencollective/-/opencollective-0.3.2.tgz#83cb70cdb2bac5fad6f8c93529e7b11187d49c02" + integrity sha512-XG7rUdXG9fcafu9KTDIYjJSkRO38EwjlKYIb5TQ/0WDbiTUTtUtgncMscKOYzfsY86kGs05pAuMOR+3Fi0aN3A== + dependencies: + chalk "^4.1.0" + consola "^2.15.0" + node-fetch "^2.6.1" + +"@nuxt/server@2.14.7": + version "2.14.7" + resolved "https://registry.yarnpkg.com/@nuxt/server/-/server-2.14.7.tgz#fb45d084d01fe418b4385ac09b7f82de4cde3a42" + integrity sha512-udy7rk/hS0HmNdy82mzhISEIegdwHNHNormtn9RHPYshctLkWT7ymDPyU6br9nq0cIbYBkMJb6gENgzD8++2Ag== + dependencies: + "@nuxt/config" "2.14.7" + "@nuxt/utils" "2.14.7" + "@nuxt/vue-renderer" "2.14.7" + "@nuxtjs/youch" "^4.2.3" + chalk "^3.0.0" + compression "^1.7.4" + connect "^3.7.0" + consola "^2.15.0" + etag "^1.8.1" + fresh "^0.5.2" + fs-extra "^8.1.0" + ip "^1.1.5" + launch-editor-middleware "^2.2.1" + on-headers "^1.0.2" + pify "^4.0.1" + serve-placeholder "^1.2.2" + serve-static "^1.14.1" + server-destroy "^1.0.1" + +"@nuxt/static@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@nuxt/static/-/static-1.0.0.tgz#32fb4345a38a220b3f79e083f17e134ff695a822" + integrity sha512-giYaEwPsKDqqXiR4uXvsNAwJ1gGEPg/hLMLWvXC56YF5FNbdc3kOroq0/TtQ2eF0OCu38olJs8IEyLjYUdP5Vg== + dependencies: + consola "^2.14.0" + crc "^3.8.0" + defu "^2.0.4" + destr "^1.0.0" + globby "^11.0.1" + +"@nuxt/telemetry@^1.2.3": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@nuxt/telemetry/-/telemetry-1.3.0.tgz#0c6595c786c4fcb060ea8508aaf6285dce8201e0" + integrity sha512-anAhyccoVyy/RetkqVsIxpJKdAu/GHyLl79ZtH0oOCbYcC85k8d+LC1S10WcqXyeqyUKifLxGR6yPqSPmQCCtg== + dependencies: + arg "^5.0.0" + chalk "^4.1.0" + ci-info "^2.0.0" + consola "^2.15.0" + create-require "^1.1.0" + defu "^3.2.2" + destr "^1.0.1" + dotenv "^8.2.0" + fs-extra "^8.1.0" + git-url-parse "^11.4.0" + inquirer "^7.3.3" + is-docker "^2.1.1" + jiti "^0.1.16" + nanoid "^3.1.18" + node-fetch "^2.6.1" + parse-git-config "^3.0.0" + rc9 "^1.2.0" + std-env "^2.2.1" + +"@nuxt/utils@2.14.7": + version "2.14.7" + resolved "https://registry.yarnpkg.com/@nuxt/utils/-/utils-2.14.7.tgz#04d19351b5f4c33249c3497c41a00cdde0993e10" + integrity sha512-RAfzPtpf3z3qYmHF01jgqc4mkIth+2y7HQqxa4G8iisg/bCCQp03MU7Cvcrijf6vjTh3YXLU6jSeL8A4oQRjeg== + dependencies: + consola "^2.15.0" + fs-extra "^8.1.0" + hash-sum "^2.0.0" + proper-lockfile "^4.1.1" + semver "^7.3.2" + serialize-javascript "^5.0.1" + signal-exit "^3.0.3" + ua-parser-js "^0.7.22" + +"@nuxt/vue-app@2.14.7": + version "2.14.7" + resolved "https://registry.yarnpkg.com/@nuxt/vue-app/-/vue-app-2.14.7.tgz#ad069a22c0ec2f738f5603351e72d759753ef464" + integrity sha512-0Z+dIZOcTA5dA0JnRY4WLIZGfZOPpZDvnsaB1MWDaXZMkK+ul1AhlPerGBSu5YDRqURSVDcojO04+OP9aa5etw== + dependencies: + node-fetch "^2.6.1" + unfetch "^4.2.0" + vue "^2.6.12" + vue-client-only "^2.0.0" + vue-meta "^2.4.0" + vue-no-ssr "^1.1.1" + vue-router "^3.4.6" + vue-template-compiler "^2.6.12" + vuex "^3.5.1" + +"@nuxt/vue-renderer@2.14.7": + version "2.14.7" + resolved "https://registry.yarnpkg.com/@nuxt/vue-renderer/-/vue-renderer-2.14.7.tgz#cc48d1a3492e9a014da31d3df8b2062bb7f3de70" + integrity sha512-hJg8Em48KXmx8DsNpaNhDy4FwbmRMiOFkTvy8AkHrIiaaWfXPDqnNlICtSzBEKYL8Wk3/Yznp26rfLIDC19BoA== + dependencies: + "@nuxt/devalue" "^1.2.4" + "@nuxt/utils" "2.14.7" + consola "^2.15.0" + fs-extra "^8.1.0" + lru-cache "^5.1.1" + vue "^2.6.12" + vue-meta "^2.4.0" + vue-server-renderer "^2.6.12" + +"@nuxt/webpack@2.14.7": + version "2.14.7" + resolved "https://registry.yarnpkg.com/@nuxt/webpack/-/webpack-2.14.7.tgz#e466bfae9bc5976b0cb74867d0c525b5ffc906f0" + integrity sha512-oXTR1moYdKKcttp6ASb11eISkb6EWtOHtavFPHn9axtyQBoZm6pxkF01ihvEwCUz6JDoTido3vzIi7+hV3gG5A== + dependencies: + "@babel/core" "^7.12.0" + "@nuxt/babel-preset-app" "2.14.7" + "@nuxt/friendly-errors-webpack-plugin" "^2.5.0" + "@nuxt/utils" "2.14.7" + babel-loader "^8.1.0" + cache-loader "^4.1.0" + caniuse-lite "^1.0.30001148" + chalk "^3.0.0" + consola "^2.15.0" + create-require "^1.0.2" + css-loader "^3.6.0" + cssnano "^4.1.10" + eventsource-polyfill "^0.9.6" + extract-css-chunks-webpack-plugin "^4.7.5" + file-loader "^4.3.0" + glob "^7.1.6" + hard-source-webpack-plugin "^0.13.1" + hash-sum "^2.0.0" + html-webpack-plugin "^4.5.0" + memory-fs "^0.4.1" + optimize-css-assets-webpack-plugin "^5.0.4" + pify "^4.0.1" + postcss "^7.0.32" + postcss-import "^12.0.1" + postcss-import-resolver "^2.0.0" + postcss-loader "^3.0.0" + postcss-preset-env "^6.7.0" + postcss-url "^8.0.0" + semver "^7.3.2" + std-env "^2.2.1" + style-resources-loader "^1.3.3" + terser-webpack-plugin "^2.3.5" + thread-loader "^2.1.3" + time-fix-plugin "^2.0.7" + url-loader "^2.3.0" + vue-loader "^15.9.3" + webpack "^4.44.2" + webpack-bundle-analyzer "^3.9.0" + webpack-dev-middleware "^3.7.2" + webpack-hot-middleware "^2.25.0" + webpack-node-externals "^2.5.2" + webpackbar "^4.0.0" + +"@nuxtjs/eslint-config@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@nuxtjs/eslint-config/-/eslint-config-1.1.2.tgz#cde4c950014a781bcc34abbfef9c62546d8fc34c" + integrity sha512-uKBdza1/Poz32gEodQ9MSW8M9CU4RPdvEiSLX5LWyavrbjhXW9iIbzJzSDlgMhD1QfQ5WrWv1iqL3Bh/ArbIgw== + dependencies: + eslint-config-standard "^12.0.0" + eslint-plugin-import "^2.18.0" + eslint-plugin-jest "^22.10.0" + eslint-plugin-node "^9.1.0" + eslint-plugin-promise "^4.2.1" + eslint-plugin-standard "^4.0.0" + eslint-plugin-unicorn "^9.1.1" + eslint-plugin-vue "^5.2.3" + +"@nuxtjs/eslint-module@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@nuxtjs/eslint-module/-/eslint-module-1.1.0.tgz#816f8d41c3883e8131ce5f863a0ca2f3fd7cbcbf" + integrity sha512-9np9tKQ30ULIfT7Zshhw9Gc8Xf437/X7jUGG2Wv4SwT26Miu0WE0q9FNXUt9gxaBIQuokKiWsoTT28rXUaxHjQ== + dependencies: + consola "^2.10.1" + eslint-loader "^3.0.0" + +"@nuxtjs/moment@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@nuxtjs/moment/-/moment-1.6.0.tgz#d0e981ece640f9bf9bc2e75adf722f705a245d66" + integrity sha512-bg3E530sfQWZD2fDUICSLGjROZ1auqo/QQYOdDus4a3QVTHZwIiMvwebWw4ITMc1ld4Cb6VGFuQd1AV0mHm3AA== + dependencies: + moment "^2.24.0" + moment-locales-webpack-plugin "^1.1.2" + moment-timezone "^0.5.27" + moment-timezone-data-webpack-plugin "^1.1.0" + +"@nuxtjs/youch@^4.2.3": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@nuxtjs/youch/-/youch-4.2.3.tgz#36f8b22df5a0efaa81373109851e1d857aca6bed" + integrity sha512-XiTWdadTwtmL/IGkNqbVe+dOlT+IMvcBu7TvKI7plWhVQeBCQ9iKhk3jgvVWFyiwL2yHJDlEwOM5v9oVES5Xmw== + dependencies: + cookie "^0.3.1" + mustache "^2.3.0" + stack-trace "0.0.10" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@ticket721/e712@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@ticket721/e712/-/e712-0.4.1.tgz#b9be3f5d9d01a8468e0a49eeed67fe4454c87582" + integrity sha512-JHqyb2HntsmLJ4PtlXQ2AoU+s42X1itRtxeCAlA1AxOMORXQudbhly9wvGhN/Hbcl8VYpfgLJKp4hK3AT6xDiw== + dependencies: + bn.js "5.1.1" + ethers "4.0.41" + +"@types/anymatch@*": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" + integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== + +"@types/babel__core@^7.1.0": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" + integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" + integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.7.tgz#2496e9ff56196cc1429c72034e07eab6121b6f3f" + integrity sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/bn.js@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + dependencies: + "@types/node" "*" + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/html-minifier-terser@^5.0.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" + integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" + integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" + integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/json-schema@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" + integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== + +"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + +"@types/node@*": + version "12.7.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.4.tgz#64db61e0359eb5a8d99b55e05c729f130a678b04" + integrity sha512-W0+n1Y+gK/8G2P/piTkBBN38Qc5Q1ZSO6B5H3QmPCUewaiXOo2GCAWZ4ElZCcNhjJuBSUSLGFUJnmlCn5+nxOQ== + +"@types/node@^12.12.6": + version "12.20.47" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.47.tgz#ca9237d51f2a2557419688511dab1c8daf475188" + integrity sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg== + +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" + integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== + +"@types/tapable@*", "@types/tapable@^1.0.5": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" + integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== + +"@types/uglify-js@*": + version "3.11.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.11.1.tgz#97ff30e61a0aa6876c270b5f538737e2d6ab8ceb" + integrity sha512-7npvPKV+jINLu1SpSYVWG8KvyJBhBa8tmzMMdDoVc2pWUYHN8KIXlPJhjJ4LT97c4dXJA2SHL/q6ADbDriZN+Q== + dependencies: + source-map "^0.6.1" + +"@types/webpack-sources@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.1.0.tgz#8882b0bd62d1e0ce62f183d0d01b72e6e82e8c10" + integrity sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack@^4.41.8": + version "4.41.25" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.25.tgz#4d3b5aecc4e44117b376280fbfd2dc36697968c4" + integrity sha512-cr6kZ+4m9lp86ytQc1jPOJXgINQyz3kLLunZ57jznW+WIAL0JqZbGubQk4GlD42MuQL5JGOABrxdpqqWeovlVQ== + dependencies: + "@types/anymatch" "*" + "@types/node" "*" + "@types/tapable" "*" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + source-map "^0.6.0" + +"@types/yargs-parser@*": + version "13.1.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" + integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== + +"@types/yargs@^13.0.0": + version "13.0.2" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.2.tgz#a64674fc0149574ecd90ba746e932b5a5f7b3653" + integrity sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/zen-observable@^0.8.0": + version "0.8.2" + resolved "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.2.tgz#808c9fa7e4517274ed555fa158f2de4b4f468e71" + integrity sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg== + +"@typescript-eslint/experimental-utils@^1.13.0": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz#b08c60d780c0067de2fb44b04b432f540138301e" + integrity sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "1.13.0" + eslint-scope "^4.0.0" + +"@typescript-eslint/experimental-utils@^2.5.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.8.0.tgz#208b4164d175587e9b03ce6fea97d55f19c30ca9" + integrity sha512-jZ05E4SxCbbXseQGXOKf3ESKcsGxT8Ucpkp1jiVp55MGhOvZB2twmWKf894PAuVQTCgbPbJz9ZbRDqtUWzP8xA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.8.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/typescript-estree@1.13.0": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz#8140f17d0f60c03619798f1d628b8434913dc32e" + integrity sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw== + dependencies: + lodash.unescape "4.0.1" + semver "5.5.0" + +"@typescript-eslint/typescript-estree@2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.8.0.tgz#fcc3fe6532840085d29b75432c8a59895876aeca" + integrity sha512-ksvjBDTdbAQ04cR5JyFSDX113k66FxH1tAXmi+dj6hufsl/G0eMc/f1GgLjEVPkYClDbRKv+rnBFuE5EusomUw== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash.unescape "4.0.1" + semver "^6.3.0" + tsutils "^3.17.1" + +"@vue/babel-helper-vue-jsx-merge-props@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81" + integrity sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA== + +"@vue/babel-plugin-transform-vue-jsx@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz#646046c652c2f0242727f34519d917b064041ed7" + integrity sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-helper-vue-jsx-merge-props" "^1.2.1" + html-tags "^2.0.0" + lodash.kebabcase "^4.1.1" + svg-tags "^1.0.0" + +"@vue/babel-preset-jsx@^1.1.2": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz#92fea79db6f13b01e80d3a0099e2924bdcbe4e87" + integrity sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w== + dependencies: + "@vue/babel-helper-vue-jsx-merge-props" "^1.2.1" + "@vue/babel-plugin-transform-vue-jsx" "^1.2.1" + "@vue/babel-sugar-composition-api-inject-h" "^1.2.1" + "@vue/babel-sugar-composition-api-render-instance" "^1.2.4" + "@vue/babel-sugar-functional-vue" "^1.2.2" + "@vue/babel-sugar-inject-h" "^1.2.2" + "@vue/babel-sugar-v-model" "^1.2.3" + "@vue/babel-sugar-v-on" "^1.2.3" + +"@vue/babel-sugar-composition-api-inject-h@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz#05d6e0c432710e37582b2be9a6049b689b6f03eb" + integrity sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-composition-api-render-instance@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz#e4cbc6997c344fac271785ad7a29325c51d68d19" + integrity sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-functional-vue@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz#267a9ac8d787c96edbf03ce3f392c49da9bd2658" + integrity sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-inject-h@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz#d738d3c893367ec8491dcbb669b000919293e3aa" + integrity sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-v-model@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz#fa1f29ba51ebf0aa1a6c35fa66d539bc459a18f2" + integrity sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-helper-vue-jsx-merge-props" "^1.2.1" + "@vue/babel-plugin-transform-vue-jsx" "^1.2.1" + camelcase "^5.0.0" + html-tags "^2.0.0" + svg-tags "^1.0.0" + +"@vue/babel-sugar-v-on@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz#342367178586a69f392f04bfba32021d02913ada" + integrity sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-plugin-transform-vue-jsx" "^1.2.1" + camelcase "^5.0.0" + +"@vue/component-compiler-utils@^3.1.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz#8f85182ceed28e9b3c75313de669f83166d11e5d" + integrity sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw== + dependencies: + consolidate "^0.15.1" + hash-sum "^1.0.2" + lru-cache "^4.1.2" + merge-source-map "^1.1.0" + postcss "^7.0.14" + postcss-selector-parser "^6.0.2" + source-map "~0.6.1" + vue-template-es2015-compiler "^1.9.0" + optionalDependencies: + prettier "^1.18.2" + +"@vue/test-utils@^1.0.0-beta.27": + version "1.0.0-beta.29" + resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.0.0-beta.29.tgz#c942cf25e891cf081b6a03332b4ae1ef430726f0" + integrity sha512-yX4sxEIHh4M9yAbLA/ikpEnGKMNBCnoX98xE1RwxfhQVcn0MaXNSj1Qmac+ZydTj6VBSEVukchBogXBTwc+9iA== + dependencies: + dom-event-types "^1.0.0" + lodash "^4.17.4" + +"@walletconnect/browser-utils@^1.7.7": + version "1.7.7" + resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.7.7.tgz#4ae0db1ddf49be179ea556af842db3b7afce973d" + integrity sha512-6Mt7DSPaG0FKnHhuVzkU1hgtsCpGvl2nfbfRytLpyDY05iWMzMg5uK1DzV+0k4hCt9pVli0JVNt6dh9a6Xm94w== + dependencies: + "@walletconnect/safe-json" "1.0.0" + "@walletconnect/types" "^1.7.7" + "@walletconnect/window-getters" "1.0.0" + "@walletconnect/window-metadata" "1.0.0" + detect-browser "5.2.0" + +"@walletconnect/client@^1.7.7": + version "1.7.7" + resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.7.7.tgz#4570475b0aeed05e53b0c7b01a352a895c0b455b" + integrity sha512-UuDkpXDc1Emx09aGXKz2Fg8omNp5J8ZRgNblnQTb8xnoQ8rgOJSyhbFR37PFIFwVpriZZDAgmy8HlqoGwLQ2ug== + dependencies: + "@walletconnect/core" "^1.7.7" + "@walletconnect/iso-crypto" "^1.7.7" + "@walletconnect/types" "^1.7.7" + "@walletconnect/utils" "^1.7.7" + +"@walletconnect/core@^1.7.7": + version "1.7.7" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.7.7.tgz#71d0c71beda8d10c636a4eae8e81e3b7ecefbe86" + integrity sha512-XsF2x4JcBS1V2Nk/Uh38dU7ZlLmW/R5oxHp4+tVgCwTID6nZlo3vUSHBOqM7jgDRblKOHixANollm0r94bM8Cg== + dependencies: + "@walletconnect/socket-transport" "^1.7.7" + "@walletconnect/types" "^1.7.7" + "@walletconnect/utils" "^1.7.7" + +"@walletconnect/crypto@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.2.tgz#3fcc2b2cde6f529a19eadd883dc555cd0e861992" + integrity sha512-+OlNtwieUqVcOpFTvLBvH+9J9pntEqH5evpINHfVxff1XIgwV55PpbdvkHu6r9Ib4WQDOFiD8OeeXs1vHw7xKQ== + dependencies: + "@walletconnect/encoding" "^1.0.1" + "@walletconnect/environment" "^1.0.0" + "@walletconnect/randombytes" "^1.0.2" + aes-js "^3.1.2" + hash.js "^1.1.7" + +"@walletconnect/encoding@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.1.tgz#93c18ce9478c3d5283dbb88c41eb2864b575269a" + integrity sha512-8opL2rs6N6E3tJfsqwS82aZQDL3gmupWUgmvuZ3CGU7z/InZs3R9jkzH8wmYtpbq0sFK3WkJkQRZFFk4BkrmFA== + dependencies: + is-typedarray "1.0.0" + typedarray-to-buffer "3.1.5" + +"@walletconnect/environment@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.0.tgz#c4545869fa9c389ec88c364e1a5f8178e8ab5034" + integrity sha512-4BwqyWy6KpSvkocSaV7WR3BlZfrxLbJSLkg+j7Gl6pTDE+U55lLhJvQaMuDVazXYxcjBsG09k7UlH7cGiUI5vQ== + +"@walletconnect/http-connection@^1.7.7": + version "1.7.7" + resolved "https://registry.yarnpkg.com/@walletconnect/http-connection/-/http-connection-1.7.7.tgz#77bcce7c4c067e1e745da1a1c6174ff0daa76018" + integrity sha512-MmhVJfBjvjYcZnrJYnDx4VBwpYM6yh7eX4/8szo6sGwzG4E+8V4YBKU2NF6fA6YXpdAyEYayElqXhB0YBEZFJA== + dependencies: + "@walletconnect/types" "^1.7.7" + "@walletconnect/utils" "^1.7.7" + eventemitter3 "4.0.7" + xhr2-cookies "1.1.0" + +"@walletconnect/iso-crypto@^1.7.7": + version "1.7.7" + resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.7.7.tgz#a7f703f9c2a05aafe5b8cced8941c7732701e579" + integrity sha512-t8RKJZkFtFyWMFrl0jPz/3RAGhM5yext+MLFq3L/KTPxLgMZuT1yFHRUiV7cAN3+LcCmk6Sy/rV1yQPTiB158Q== + dependencies: + "@walletconnect/crypto" "^1.0.2" + "@walletconnect/types" "^1.7.7" + "@walletconnect/utils" "^1.7.7" + +"@walletconnect/jsonrpc-types@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.0.tgz#fa75ad5e8f106a2e33287b1e6833e22ed0225055" + integrity sha512-11QXNq5H1PKZk7bP8SxgmCw3HRaDuPOVE+wObqEvmhc7OWYUZqfuaaMb+OXGRSOHL3sbC+XHfdeCxFTMXSFyng== + dependencies: + keyvaluestorage-interface "^1.0.0" + +"@walletconnect/jsonrpc-utils@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.0.tgz#1a2f668d606e8f0b6e7d8fdebae86001bd037a3f" + integrity sha512-qUHbKUK6sHeHn67qtHZoLoYk5hS6x1arTPjKDRkY93/6Fx+ZmNIpdm1owX3l6aYueyegJ7mz43FpvYHUqJ8xcw== + dependencies: + "@walletconnect/environment" "^1.0.0" + "@walletconnect/jsonrpc-types" "^1.0.0" + +"@walletconnect/mobile-registry@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz#502cf8ab87330841d794819081e748ebdef7aee5" + integrity sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw== + +"@walletconnect/qrcode-modal@^1.7.7": + version "1.7.7" + resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.7.7.tgz#a7567370bf915a50fb8edc99f6ceb70ce9be2bfc" + integrity sha512-HRzw6g4P8/C4ClJYJShaGfdvjfrTfkXv+eb+IylWGWvC8IQhuiSXCq5+F3t0CXxuZs3ir26abgviEMRFQxGKdA== + dependencies: + "@walletconnect/browser-utils" "^1.7.7" + "@walletconnect/mobile-registry" "^1.4.0" + "@walletconnect/types" "^1.7.7" + copy-to-clipboard "^3.3.1" + preact "10.4.1" + qrcode "1.4.4" + +"@walletconnect/randombytes@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.2.tgz#95c644251a15e6675f58fbffc9513a01486da49c" + integrity sha512-ivgOtAyqQnN0rLQmOFPemsgYGysd/ooLfaDA/ACQ3cyqlca56t3rZc7pXfqJOIETx/wSyoF5XbwL+BqYodw27A== + dependencies: + "@walletconnect/encoding" "^1.0.1" + "@walletconnect/environment" "^1.0.0" + randombytes "^2.1.0" + +"@walletconnect/safe-json@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2" + integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg== + +"@walletconnect/socket-transport@^1.7.7": + version "1.7.7" + resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.7.7.tgz#2cf68b95c4c10f257189370d2456d99c9c206a0f" + integrity sha512-RxeFkT+5BqdaZzPtPYIw6+KSVh6Q1NaYqTiAzWWh9RPuvuTajIEsi+fUXizfkpmyi9UTYBvdFXnKcB+eSImpDg== + dependencies: + "@walletconnect/types" "^1.7.7" + "@walletconnect/utils" "^1.7.7" + ws "7.5.3" + +"@walletconnect/types@^1.7.7": + version "1.7.7" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.7.7.tgz#71c623b36a93e373370b1772e82fea2d801adf54" + integrity sha512-yXJrLxwLLCXtWgd/e8FjfY9v5DKds12Z7EEPzUrPSq6v7WtXpqate577KwlFQ6UYzioQzIEDE8+98j+0aiZbsw== + +"@walletconnect/utils@^1.7.7": + version "1.7.7" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.7.7.tgz#684522fa20ccf9ec2944f0497ca70254cb6d4729" + integrity sha512-slNlnROS4DEusGFx53hshIBylYhzd5JtGF+AJpza+Tc616+u8ozjQ9aKKUaV85bucnv5Q42bTwLYrYrXiydmuw== + dependencies: + "@walletconnect/browser-utils" "^1.7.7" + "@walletconnect/encoding" "^1.0.1" + "@walletconnect/jsonrpc-utils" "^1.0.0" + "@walletconnect/types" "^1.7.7" + bn.js "4.11.8" + js-sha3 "0.8.0" + query-string "6.13.5" + +"@walletconnect/web3-provider@1.7.7": + version "1.7.7" + resolved "https://registry.yarnpkg.com/@walletconnect/web3-provider/-/web3-provider-1.7.7.tgz#3d2f8d7a0fcdc118615283978c6a7c9f2a852b71" + integrity sha512-hUhDyaMu93e7e82OVCu3KnYOn6m6wQO9YObbhi3PexppCANe/Y9eDrw/37S+7jbjLIx5nS1et2JU+taKR7OSOw== + dependencies: + "@walletconnect/client" "^1.7.7" + "@walletconnect/http-connection" "^1.7.7" + "@walletconnect/qrcode-modal" "^1.7.7" + "@walletconnect/types" "^1.7.7" + "@walletconnect/utils" "^1.7.7" + web3-provider-engine "16.0.1" + +"@walletconnect/window-getters@1.0.0", "@walletconnect/window-getters@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" + integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== + +"@walletconnect/window-metadata@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5" + integrity sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA== + dependencies: + "@walletconnect/window-getters" "^1.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" + +"@wry/context@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@wry/context/-/context-0.6.0.tgz#f903eceb89d238ef7e8168ed30f4511f92d83e06" + integrity sha512-sAgendOXR8dM7stJw3FusRxFHF/ZinU0lffsA2YTyyIOfic86JX02qlPqPVqJNZJPAxFt+2EE8bvq6ZlS0Kf+Q== + dependencies: + tslib "^2.1.0" + +"@wry/equality@^0.5.0": + version "0.5.1" + resolved "https://registry.npmjs.org/@wry/equality/-/equality-0.5.1.tgz#b22e4e1674d7bf1439f8ccdccfd6a785f6de68b0" + integrity sha512-FZKbdpbcVcbDxQrKcaBClNsQaMg9nof1RKM7mReJe5DKUzM5u8S7T+PqwNqvib5O2j2xxF1R4p5O3+b6baTrbw== + dependencies: + tslib "^2.1.0" + +"@wry/trie@^0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@wry/trie/-/trie-0.3.0.tgz#3245e74988c4e3033299e479a1bf004430752463" + integrity sha512-Yw1akIogPhAT6XPYsRHlZZIS0tIGmAl9EYXHi2scf7LPKKqdqmow/Hu4kEqP2cJR3EjaU/9L0ZlAjFf3hFxmug== + dependencies: + tslib "^2.1.0" + +"@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== + +abab@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= + +abab@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.1.tgz#3fa17797032b71410ec372e11668f4b4ffc86a82" + integrity sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abstract-leveldown@~2.6.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" + integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA== + dependencies: + xtend "~4.0.0" + +abstract-leveldown@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" + integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== + dependencies: + xtend "~4.0.0" + +accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^1.0.4: + version "1.0.9" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" + integrity sha1-VbtemGkVB7dFedBRNBMhfDgMVM8= + dependencies: + acorn "^2.1.0" + +acorn-globals@^4.1.0: + version "4.3.3" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.3.tgz#a86f75b69680b8780d30edd21eee4e0ea170c05e" + integrity sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-jsx@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f" + integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw== + +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^2.1.0, acorn@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" + integrity sha1-q259nYhqrKiwhbwzEreaGYQz8Oc= + +acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7: + version "6.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" + integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== + +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.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= + +aes-js@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== + +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +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: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +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.5.5: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: + 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" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + dependencies: + string-width "^3.0.0" + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" + integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + dependencies: + type-fest "^0.8.1" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +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.0, 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: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.0.tgz#5681f0dcf7ae5880a7841d8831c4724ed9cc0172" + integrity sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +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" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +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: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +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.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arg@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.0.tgz#a20e2bb5710e82950a516b3f933fee5ed478be90" + integrity sha512-4P8Zm2H+BRS+c/xX1LrHw0qKpEhdlZjLCgWy+d78T9vqa2Z2SiD2wMrYuWIAFy5IZUD7nnNXroRttz+0RzlrzQ== + +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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + +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.0.1, 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-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +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.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + +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= + +arraybuffer-loader@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/arraybuffer-loader/-/arraybuffer-loader-1.0.8.tgz#3e326be5cdf6454782362823d43a8c33bb1dd276" + integrity sha512-CwUVCcxCgcgZUu2w741OV6Xj1tvRVQebq22RCyGXiLgJOJ4e4M/59EPYdtK2MLfIN28t1TDvuh2ojstNq3Kh5g== + dependencies: + loader-utils "^1.1.0" + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +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" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +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= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each@^1.0.0, 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-eventemitter@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== + dependencies: + async "^2.4.0" + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async-mutex@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.2.6.tgz#0d7a3deb978bc2b984d5908a2038e1ae2e54ff40" + integrity sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw== + dependencies: + tslib "^2.0.0" + +async@^1.4.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.1.tgz#51967a02d2d2300bb01866c1611ec8348d355a47" + integrity sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw== + dependencies: + browserslist "^4.6.3" + caniuse-lite "^1.0.30000980" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.17" + postcss-value-parser "^4.0.0" + +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== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +axios@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" + integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ== + dependencies: + follow-redirects "1.5.10" + is-buffer "^2.0.2" + +axios@^0.21.2: + 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" + +b4a@^1.0.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.3.1.tgz#5ead1402bd4a2dcfea35cc83928815d53315ff32" + integrity sha512-ULHjbJGjZcdA5bugDNAAcMA6GWXX/9N10I6AQc14TH+Sr7bMfT+NHuJnOFGPJWLtzYa6Tz+PnFD2D/1bISLLZQ== + +babel-cli@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" + integrity sha1-UCq1SHTX24itALiHoGODzgPQAvE= + dependencies: + babel-core "^6.26.0" + babel-polyfill "^6.26.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + commander "^2.11.0" + convert-source-map "^1.5.0" + fs-readdir-recursive "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + output-file-sync "^1.1.2" + path-is-absolute "^1.0.1" + slash "^1.0.0" + source-map "^0.5.6" + v8flags "^2.1.1" + optionalDependencies: + chokidar "^1.6.1" + +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-core@7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-eslint@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" + integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-loader@^8.1.0: + 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-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.26.0: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-regenerator@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-es2015@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + integrity sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk= + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +backoff@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" + integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= + dependencies: + precond "0.2" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base-path-converter@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/base-path-converter/-/base-path-converter-1.0.2.tgz#e80b4b4f31c7b1561e632158e00774b6f2f27978" + integrity sha512-51R8JiuXadknn6ouVUteOhDpmI3G5u5GqjruL7bPJpfxUHVgosaO5uPAvRP4FeR4VyyH4sSvsN78Ci6ouoRYqQ== + +base-x@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.4.tgz#94c1788736da065edb1d68808869e357c977fa77" + integrity sha512-UYOadoSIkEI/VrRGSG6qp93rp2WdokiAiNYDfGW5qURAY8GiAQkvMbwNNSDYiVJopqv4gCna7xqf4rrNGp+5AA== + dependencies: + safe-buffer "^5.0.1" + +base-x@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.7.tgz#1c5a7fafe8f66b4114063e8da102799d4e7c408f" + integrity sha512-zAKJGuQPihXW22fkrfOclUUZXM2g92z5GzlSMHxhO6r6Qj+Nm0ccaGNBzDZojzwOMkpjAv4J0fOv1U4go+a4iw== + dependencies: + safe-buffer "^5.0.1" + +base-x@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" + integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + dependencies: + safe-buffer "^5.0.1" + +base64-arraybuffer@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base64-js@^1.3.1: + 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" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bech32@1.1.4, bech32@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +bfj@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" + integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw== + dependencies: + bluebird "^3.5.5" + check-types "^8.0.3" + hoopy "^0.1.4" + tryer "^1.0.1" + +big-integer@1.6.36: + version "1.6.36" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" + integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== + +big-integer@^1.6.42, big-integer@^1.6.43, big-integer@^1.6.48: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + +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== + +bignumber.js@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.1.1.tgz#4b072ae5aea9c20f6730e4e5d529df1271c4d885" + integrity sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ== + +bignumber.js@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" + integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== + +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.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +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" + +blake-hash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e" + integrity sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w== + dependencies: + node-addon-api "^3.0.0" + node-gyp-build "^4.2.2" + readable-stream "^3.6.0" + +blake2b-wasm@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" + integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w== + dependencies: + b4a "^1.0.1" + nanoassert "^2.0.0" + +blake2b@^2.1.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/blake2b/-/blake2b-2.1.4.tgz#817d278526ddb4cd673bfb1af16d1ad61e393ba3" + integrity sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A== + dependencies: + blake2b-wasm "^2.4.0" + nanoassert "^2.0.0" + +blakejs@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" + integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= + +bloomfilter.js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bloomfilter.js/-/bloomfilter.js-1.0.2.tgz#63449e4b055dc08e5e4db75367d48cc0a395e704" + integrity sha512-x3SG+7/NlT5m6hHy1GCerNoWm38kxWZeUIsBs1LaMwnTLM0hidmGalhAfXH07DtP3s9QAp+JAQagpgVIxtUl9g== + +bluebird@^3.1.1, bluebird@^3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== + +bluebird@^3.5.0, bluebird@^3.5.2: + 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.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= + +bn.js@4.11.8, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +bn.js@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.1.tgz#48efc4031a9c4041b9c99c6941d903463ab62eb5" + integrity sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA== + +bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, 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.1.2, bn.js@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +body-parser@1.19.2, body-parser@^1.16.0: + version "1.19.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" + integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.8.1" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.9.7" + raw-body "2.4.3" + type-is "~1.6.18" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +bowser@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +boxen@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" + integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^5.3.1" + chalk "^3.0.0" + cli-boxes "^2.2.0" + string-width "^4.1.0" + term-size "^2.1.0" + type-fest "^0.8.1" + widest-line "^3.1.0" + +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@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +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= + +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: + 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: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.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.0.0, browserslist@^4.6.3, browserslist@^4.6.4: + version "4.7.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" + integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== + dependencies: + caniuse-lite "^1.0.30000989" + electron-to-chromium "^1.3.247" + node-releases "^1.1.29" + +browserslist@^4.14.5, browserslist@^4.15.0: + version "4.16.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.0.tgz#410277627500be3cb28a1bfe037586fbedf9488b" + integrity sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ== + dependencies: + caniuse-lite "^1.0.30001165" + colorette "^1.2.1" + electron-to-chromium "^1.3.621" + escalade "^3.1.1" + node-releases "^1.1.67" + +browserslist@^4.17.5, browserslist@^4.19.1: + version "4.20.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88" + integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA== + dependencies: + caniuse-lite "^1.0.30001317" + electron-to-chromium "^1.4.84" + escalade "^3.1.1" + node-releases "^2.0.2" + picocolors "^1.0.0" + +bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +bser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5" + integrity sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg== + dependencies: + node-int64 "^0.4.0" + +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + +buefy@^0.9.10: + version "0.9.10" + resolved "https://registry.yarnpkg.com/buefy/-/buefy-0.9.10.tgz#17f64ee1ba43a145d1d3c56f45cba95e4e2975fa" + integrity sha512-xXEoy/NTgBNiIfBTCdHi2Vu5SJJdB046py6ekUvYuUgYwRvulySZksdecVNNWdfEVU8iD4esZaRbTLwCegFcVQ== + dependencies: + bulma "0.9.3" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-from@^1.1.1: + 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-json@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23" + integrity sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw== + +buffer-to-arraybuffer@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" + integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= + +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@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.0.5, buffer@^5.1.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^5.4.3: + version "5.4.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" + integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +buffer@^5.5.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" + +bufferutil@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" + integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== + dependencies: + node-gyp-build "^4.3.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= + +bulma@0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.9.3.tgz#ddccb7436ebe3e21bf47afe01d3c43a296b70243" + integrity sha512-0d7GNW1PY4ud8TWxdNcP6Cc8Bu7MxcntD/RRLGWuiw/s0a9P+XlH/6QoOIrmbj6o8WWJzJYhytiu9nFjTszk1g== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +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== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^12.0.2: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + 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" + +cacache@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== + dependencies: + chownr "^1.1.2" + figgy-pudding "^3.5.1" + fs-minipass "^2.0.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + unique-filename "^1.1.1" + +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" + +cache-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-4.1.0.tgz#9948cae353aec0a1fcb1eafda2300816ec85387e" + integrity sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw== + dependencies: + buffer-json "^2.0.0" + find-cache-dir "^3.0.0" + loader-utils "^1.2.3" + mkdirp "^0.5.1" + neo-async "^2.6.1" + schema-utils "^2.0.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +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== + +camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camel-case@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989: + version "1.0.30000989" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9" + integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== + +caniuse-lite@^1.0.30001148, caniuse-lite@^1.0.30001165: + version "1.0.30001165" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz#32955490d2f60290bb186bb754f2981917fa744f" + integrity sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA== + +caniuse-lite@^1.0.30001317: + version "1.0.30001317" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001317.tgz#0548fb28fd5bc259a70b8c1ffdbe598037666a1b" + integrity sha512-xIZLh8gBm4dqNX0gkzrBeyI86J2eCjWzYAs40q88smG844YIrN4tVQl/RhquHvKEKImWWFIVh1Lxe5n1G/N+GQ== + +canvg@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/canvg/-/canvg-1.5.3.tgz#aad17915f33368bf8eb80b25d129e3ae922ddc5f" + integrity sha512-7Gn2IuQzvUQWPIuZuFHrzsTM0gkPz2RRT9OcbdmA03jeKk8kltrD8gqUzNX15ghY/4PV5bbe5lmD6yDLDY6Ybg== + dependencies: + jsdom "^8.1.0" + rgbcolor "^1.0.1" + stackblur-canvas "^1.4.1" + xmldom "^0.1.22" + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chai@^4.2.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" + integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +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@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, 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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +check-types@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" + integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== + +checkpoint-store@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" + integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY= + dependencies: + functional-red-black-tree "^1.0.1" + +"chokidar@>=3.0.0 <4.0.0": + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + 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" + +chokidar@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +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.2.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== + 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.2.0" + optionalDependencies: + fsevents "~2.1.1" + +chokidar@^3.4.1, chokidar@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== + 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.1.2" + +chownr@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" + integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== + +chownr@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + +chownr@^1.1.4: + 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.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +ci-info@^1.5.0, ci-info@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cids@^0.7.1: + version "0.7.5" + resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" + integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== + dependencies: + buffer "^5.5.0" + class-is "^1.1.0" + multibase "~0.6.0" + multicodec "^1.0.0" + multihashes "~0.4.15" + +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" + +circomlibjs@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/circomlibjs/-/circomlibjs-0.1.2.tgz#627a903fe0d5e1efceee19c47a57097d9e63faa1" + integrity sha512-F1ZQvfV6KuWAft/te4wKL2dm9DuK0y1e1Ix73qhOduVscRPsIurRg7zO7GrRVBQ/gb0THbWUY238XWRgbvGp6w== + dependencies: + blake-hash "^2.0.0" + blake2b "^2.1.3" + ethers "^5.5.1" + ffjavascript "^0.2.45" + +class-is@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" + integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== + +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" + +clean-css@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" + integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g== + dependencies: + source-map "~0.6.0" + +clean-css@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha1-jffHquUf02h06PjQW5GAvBGj/tc= + dependencies: + escape-string-regexp "^1.0.5" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-boxes@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" + integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +clipboard@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.4.tgz#836dafd66cf0fea5d71ce5d5b0bf6e958009112d" + integrity sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clone@2.x, clone@^2.0.0, clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +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, color-convert@^1.9.1: + 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.0.0, 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== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.11.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== + +commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +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== + +compressible@~2.0.16: + version "2.0.17" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" + integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== + dependencies: + mime-db ">= 1.40.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +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" + +config-chain@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +consola@^2.10.0, consola@^2.10.1: + version "2.11.0" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.11.0.tgz#9bb35d850d8cecde894ce2eb4d792fa6b90d9013" + integrity sha512-2bcAqHastlPSCvZ+ur8bgHInGAWvUnysWz3h3xRX+/XZoCY7avolJJnVXOPGoVoyCcg1b231XixonoArmgxaoA== + +consola@^2.14.0, consola@^2.15.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.0.tgz#40fc4eefa4d2f8ef2e2806147f056ea207fcc0e9" + integrity sha512-vlcSGgdYS26mPf7qNi+dCisbhiyDnrN1zaRbw3CSuc2wGOMEGGPsp46PdRG5gqXwgtJfjxDkxRNAgRPr1B77vQ== + +consola@^2.6.0, consola@^2.9.0: + version "2.10.1" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.10.1.tgz#4693edba714677c878d520e4c7e4f69306b4b927" + integrity sha512-4sxpH6SGFYLADfUip4vuY65f/gEogrzJoniVhNUYkJHtng0l8ZjnDCqxxrSVRHOHwKxsy8Vm5ONZh1wOR3/l/w== + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== + dependencies: + bluebird "^3.1.1" + +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= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-hash@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" + integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== + dependencies: + cids "^0.7.1" + multicodec "^0.5.5" + multihashes "^0.4.15" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^1.5.0, 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" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookie@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cookie@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +cookiejar@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" + integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== + +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.3.1: + 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-js-compat@^3.21.0: + version "3.21.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82" + integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g== + dependencies: + browserslist "^4.19.1" + semver "7.0.0" + +core-js-compat@^3.8.0: + version "3.8.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.1.tgz#8d1ddd341d660ba6194cbe0ce60f4c794c87a36e" + integrity sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ== + dependencies: + browserslist "^4.15.0" + semver "7.0.0" + +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5: + version "2.6.9" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cors@^2.8.1: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +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" + +crc-32@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.1.tgz#436d2bcaad27bcb6bd073a2587139d3024a16460" + integrity sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.3.1" + +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +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.2, 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" + +create-require@^1.0.2, create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@^2.1.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.5.tgz#afaf5729f3b6c78d89c9296115c9f142541a5705" + integrity sha512-xqYAhQb4NhCJSRym03dwxpP1bYXpK3y7UN83Bo2WFi3x1Zmzn0SL/6xGoPr+gpt4WmNrgCCX3HPysvOwFOW36w== + dependencies: + node-fetch "2.6.1" + whatwg-fetch "2.0.4" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-addr-codec@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz#e16cea892730178fe25a38f6d15b680cab3124ae" + integrity sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg== + dependencies: + base-x "^3.0.8" + big-integer "1.6.36" + blakejs "^1.1.0" + bs58 "^4.0.1" + ripemd160-min "0.0.6" + safe-buffer "^5.2.0" + sha3 "^2.1.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" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +crypto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037" + integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-line-break@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-1.0.1.tgz#19f2063a33e95fb2831b86446c0b80c188af450a" + integrity sha1-GfIGOjPpX7KDG4ZEbAuAwYivRQo= + dependencies: + base64-arraybuffer "^0.1.5" + +css-loader@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" + integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.0" + semver "^6.3.0" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-select@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" + integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ== + dependencies: + boolbase "^1.0.0" + css-what "^2.1.2" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha.33: + version "1.0.0-alpha.33" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.33.tgz#970e20e5a91f7a378ddd0fc58d0b6c8d4f3be93e" + integrity sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w== + dependencies: + mdn-data "2.0.4" + source-map "^0.5.3" + +css-unit-converter@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" + integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= + +css-what@2.1, css-what@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +css@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +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-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== + dependencies: + css-tree "1.0.0-alpha.29" + +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", "cssom@>= 0.3.2 < 0.4.0": + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +"cssstyle@>= 0.2.34 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + integrity sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ= + dependencies: + cssom "0.3.x" + +cssstyle@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + +cuint@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" + integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + 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.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debug@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +decamelize@^1.1.1, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +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= + +decompress-response@^3.2.0, decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +deferred-leveldown@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" + integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA== + dependencies: + abstract-leveldown "~2.6.0" + +define-properties@^1.1.2, 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" + +defu@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/defu/-/defu-2.0.4.tgz#09659a6e87a8fd7178be13bd43e9357ebf6d1c46" + integrity sha512-G9pEH1UUMxShy6syWk01VQSRVs3CDWtlxtZu7A+NyqjxaCA4gSlWAKDBx6QiUEKezqS8+DUlXLI14Fp05Hmpwg== + +defu@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/defu/-/defu-3.2.2.tgz#be20f4cc49b9805d54ee6b610658d53894942e97" + integrity sha512-8UWj5lNv7HD+kB0e9w77Z7TdQlbUYDVWqITLHNqFIn6khrNHv5WQo38Dcm1f6HeNyZf0U7UbPf6WeZDSdCzGDQ== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destr@^1.0.0, destr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/destr/-/destr-1.0.1.tgz#d13db7f9d9c9ca4fcf24e86343d601217136ddc3" + integrity sha512-LnEdINrd1ydSqRiAGjMBVrG/G8hNruwE+fEKlkJA14MGPEoI9T7zJDwGpkMTyXT2ASE0ycnN2SYn4k6Q7j7lHg== + +destroy@^1.0.4, destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-browser@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97" + integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA== + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + +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" + +dijkstrajs@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" + integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== + +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@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.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-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-event-types@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dom-event-types/-/dom-event-types-1.0.0.tgz#5830a0a29e1bf837fe50a70cd80a597232813cae" + integrity sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ== + +dom-serializer@0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb" + integrity sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + +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== + +domelementtype@1, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^4.1.0, dot-prop@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +dotenv@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +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" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +editorconfig@^0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" + integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== + dependencies: + commander "^2.19.0" + lru-cache "^4.1.5" + semver "^5.6.0" + sigmund "^1.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.1.tgz#5b5ab57f718b79d4aca9254457afecd36fa80228" + integrity sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ== + +electron-to-chromium@^1.3.247: + version "1.3.252" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.252.tgz#5b6261965b564a0f4df0f1c86246487897017f52" + integrity sha512-NWJ5TztDnjExFISZHFwpoJjMbLUifsNBnx7u2JI0gCw6SbKyQYYWWtBHasO/jPtHym69F4EZuTpRNGN11MT/jg== + +electron-to-chromium@^1.3.621: + version "1.3.625" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.625.tgz#a7bd18da4dc732c180b2e95e0e296c0bf22f3bd6" + integrity sha512-CsLk/r0C9dAzVPa9QF74HIXduxaucsaRfqiOYvIv2PRhvyC6EOqc/KbpgToQuDVgPf3sNAFZi3iBu4vpGOwGag== + +electron-to-chromium@^1.4.84: + version "1.4.86" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.86.tgz#90fe4a9787f48d6522957213408e08a8126b2ebc" + integrity sha512-EVTZ+igi8x63pK4bPuA95PXIs2b2Cowi3WQwI9f9qManLiZJOD1Lash1J3W4TvvcUCcIR4o/rgi9o8UicXSO+w== + +elliptic@6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.4: + 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" + +elliptic@^6.0.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b" + integrity sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +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== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enhanced-resolve@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" + integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +errno@~0.1.1: + 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.2.0, 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" + +error-stack-parser@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.3.tgz#9d3c000fb9f5c461f7c4e63c1aa75373ac7aaa36" + integrity sha512-vRC4rKv87twMZy92X4+TmUdv3iYMsmePbpG/YguHsfzmZ8bYJZYYep7yrXH09yFUaCEPKgNK5X79+Yq7hwLVOA== + dependencies: + stackframe "^1.0.4" + +es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.14.1.tgz#6e8d84b445ec9c610781e74a6d52cc31aac5b4ca" + integrity sha512-cp/Tb1oA/rh2X7vqeSOvM+TSo3UkJLX70eNihgVEvnzwAgikjkTFr/QVgRCaxjm0knCNQzNoxxxcw2zO2LJdZA== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.0" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-inspect "^1.6.0" + object-keys "^1.1.1" + string.prototype.trimleft "^2.0.0" + string.prototype.trimright "^2.0.0" + +es-abstract@^1.18.5: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + 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-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + 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.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +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" + +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.58" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.58.tgz#5b97d94236285fb87c8ffc782cf42eb0a25d2ae0" + integrity sha512-LHO+KBBaHGwjy32ibSaMY+ZzjpC4K4I5bPoijICMBL7gXEXfrEUrzssmNP+KigbQEp1dRUnGkry/vUnxOqptLQ== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +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-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +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= + +escodegen@^1.6.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" + integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escodegen@^1.9.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" + integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-ast-utils@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586" + integrity sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA== + dependencies: + lodash.get "^4.4.2" + lodash.zip "^4.2.0" + +eslint-config-prettier@^6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.7.0.tgz#9a876952e12df2b284adbd3440994bf1f39dfbb9" + integrity sha512-FamQVKM3jjUVwhG4hEMnbtsq7xOIDm+SY5iBPfR8gKsJoAB2IQnNF+bk1+8Fy44Nq7PPJaLvkRxILYdJWoguKQ== + dependencies: + get-stdin "^6.0.0" + +eslint-config-standard@>=14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz#b23da2b76fe5a2eba668374f246454e7058f15d4" + integrity sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA== + +eslint-config-standard@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" + integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== + +eslint-import-resolver-node@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-loader@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-3.0.2.tgz#5a627316a51d6f41d357b9f6f0554e91506cdd6e" + integrity sha512-S5VnD+UpVY1PyYRqeBd/4pgsmkvSokbHqTXAQMpvCyRr3XN2tvSLo9spm2nEpqQqh9dezw3os/0zWihLeOg2Rw== + dependencies: + fs-extra "^8.1.0" + loader-fs-cache "^1.0.2" + loader-utils "^1.2.3" + object-hash "^1.3.1" + schema-utils "^2.2.0" + +eslint-module-utils@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz#7b4675875bf96b0dbf1b21977456e5bb1f5e018c" + integrity sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw== + dependencies: + debug "^2.6.8" + pkg-dir "^2.0.0" + +eslint-plugin-es@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz#12acae0f4953e76ba444bfd1b2271081ac620998" + integrity sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA== + dependencies: + eslint-utils "^1.4.2" + regexpp "^2.0.1" + +eslint-plugin-es@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz#0f5f5da5f18aa21989feebe8a73eadefb3432976" + integrity sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ== + dependencies: + eslint-utils "^1.4.2" + regexpp "^3.0.0" + +eslint-plugin-import@>=2.18.2, eslint-plugin-import@^2.18.0: + version "2.18.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" + integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== + dependencies: + array-includes "^3.0.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" + read-pkg-up "^2.0.0" + resolve "^1.11.0" + +eslint-plugin-jest@>=23.0.4: + version "23.0.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.0.4.tgz#1ab81ffe3b16c5168efa72cbd4db14d335092aa0" + integrity sha512-OaP8hhT8chJNodUPvLJ6vl8gnalcsU/Ww1t9oR3HnGdEWjm/DdCCUXLOral+IPGAeWu/EwgVQCK/QtxALpH1Yw== + dependencies: + "@typescript-eslint/experimental-utils" "^2.5.0" + +eslint-plugin-jest@^22.10.0: + version "22.21.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.21.0.tgz#8137294645866636160487d9764224b9a43e2eb1" + integrity sha512-OaqnSS7uBgcGiqXUiEnjoqxPNKvR4JWG5mSRkzVoR6+vDwlqqp11beeql1hYs0HTbdhiwrxWLxbX0Vx7roG3Ew== + dependencies: + "@typescript-eslint/experimental-utils" "^1.13.0" + +eslint-plugin-node@>=10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz#fd1adbc7a300cf7eb6ac55cf4b0b6fc6e577f5a6" + integrity sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ== + dependencies: + eslint-plugin-es "^2.0.0" + eslint-utils "^1.4.2" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-node@^9.1.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.2.0.tgz#b1911f111002d366c5954a6d96d3cd5bf2a3036a" + integrity sha512-2abNmzAH/JpxI4gEOwd6K8wZIodK3BmHbTxz4s79OIYwwIt2gkpEXlAouJXu4H1c9ySTnRso0tsuthSOZbUMlA== + dependencies: + eslint-plugin-es "^1.4.1" + eslint-utils "^1.4.2" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-nuxt@>=0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-nuxt/-/eslint-plugin-nuxt-0.5.0.tgz#ca855110c5e32d07629112d53cf632bece1ba78c" + integrity sha512-bYMl58s3mFD28wUU++5eEGaJG44naJZEo3my4+GixacmcD/vOyQZr3Hu1ToNmJJbZ3z1Ci3La5YMEyl+t2105Q== + dependencies: + eslint-plugin-vue "^6.0.0" + vue-eslint-parser "^7.0.0" + +eslint-plugin-prettier@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz#507b8562410d02a03f0ddc949c616f877852f2ba" + integrity sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-promise@>=4.2.1, eslint-plugin-promise@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" + integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== + +eslint-plugin-standard@>=4.0.1, eslint-plugin-standard@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4" + integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ== + +eslint-plugin-unicorn@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-9.1.1.tgz#1588a0473f9a0e37cfbbcf7552065a0b0a96ce26" + integrity sha512-SHh/N54pRu5KXlS4Boa1qbWM7yTNl6VpuYJ8Qc1O3TJDr+CDUwEEdUtVlVSV/dBUE97BC8Xk0+Y5zphn21qlCA== + dependencies: + clean-regexp "^1.0.0" + eslint-ast-utils "^1.0.0" + import-modules "^1.1.0" + lodash.camelcase "^4.1.1" + lodash.defaultsdeep "^4.6.0" + lodash.kebabcase "^4.0.1" + lodash.snakecase "^4.0.1" + lodash.topairs "^4.3.0" + lodash.upperfirst "^4.2.0" + regexpp "^2.0.1" + reserved-words "^0.1.2" + safe-regex "^2.0.1" + +eslint-plugin-vue@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-5.2.3.tgz#3ee7597d823b5478804b2feba9863b1b74273961" + integrity sha512-mGwMqbbJf0+VvpGR5Lllq0PMxvTdrZ/ZPjmhkacrCHbubJeJOt+T6E3HUzAifa2Mxi7RSdJfC9HFpOeSYVMMIw== + dependencies: + vue-eslint-parser "^5.0.0" + +eslint-plugin-vue@^6.0.0, eslint-plugin-vue@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.0.1.tgz#166d3eb24cf290f3ff24d44fe9fca496f3924fc2" + integrity sha512-5tgFPcxGDKjfVB/6Yi56bKiWxygUibfZmzSh26Np3kuwAk/lfaGbVld+Yt+MPgD84ppvcachtiL4/winsXLjXA== + dependencies: + vue-eslint-parser "^6.0.5" + +eslint-scope@^4.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.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1, eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" + integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== + dependencies: + eslint-visitor-keys "^1.0.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.9.1" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.2.2" + js-yaml "^3.13.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.11" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" + +eslint@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04" + integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + +espree@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f" + integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w== + dependencies: + acorn "^6.0.2" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +espree@^5.0.0, espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + dependencies: + acorn "^7.1.0" + acorn-jsx "^5.1.0" + eslint-visitor-keys "^1.1.0" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0, esprima@^4.0.1: + 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.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +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, etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eth-block-tracker@^4.4.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" + integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== + dependencies: + "@babel/plugin-transform-runtime" "^7.5.5" + "@babel/runtime" "^7.5.5" + eth-query "^2.1.0" + json-rpc-random-id "^1.0.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" + integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88= + dependencies: + idna-uts46-hx "^2.3.1" + js-sha3 "^0.5.7" + +eth-json-rpc-filters@^4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz#eb35e1dfe9357ace8a8908e7daee80b2cd60a10d" + integrity sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + async-mutex "^0.2.6" + eth-json-rpc-middleware "^6.0.0" + eth-query "^2.1.2" + json-rpc-engine "^6.1.0" + pify "^5.0.0" + +eth-json-rpc-infura@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz#e6da7dc47402ce64c54e7018170d89433c4e8fb6" + integrity sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow== + dependencies: + eth-json-rpc-middleware "^6.0.0" + eth-rpc-errors "^3.0.0" + json-rpc-engine "^5.3.0" + node-fetch "^2.6.0" + +eth-json-rpc-middleware@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz#4fe16928b34231a2537856f08a5ebbc3d0c31175" + integrity sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ== + dependencies: + btoa "^1.2.1" + clone "^2.1.1" + eth-query "^2.1.2" + eth-rpc-errors "^3.0.0" + eth-sig-util "^1.4.2" + ethereumjs-util "^5.1.2" + json-rpc-engine "^5.3.0" + json-stable-stringify "^1.0.1" + node-fetch "^2.6.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-lib@0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" + integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + xhr-request-promise "^0.1.2" + +eth-lib@^0.1.26: + version "0.1.29" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" + integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + nano-json-stream-parser "^0.1.2" + servify "^0.1.12" + ws "^3.0.0" + xhr-request-promise "^0.1.2" + +eth-query@^2.1.0, eth-query@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" + integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= + dependencies: + json-rpc-random-id "^1.0.0" + xtend "^4.0.1" + +eth-rpc-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10" + integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-rpc-errors@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" + integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-sig-util@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" + integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA= + dependencies: + ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" + ethereumjs-util "^5.1.1" + +eth-sig-util@^2.5.3: + version "2.5.4" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5" + integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A== + dependencies: + ethereumjs-abi "0.6.8" + ethereumjs-util "^5.1.1" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.0" + +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + +ethereum-common@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca" + integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA== + +ethereum-common@^0.0.18: + version "0.0.18" + resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" + integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereumjs-abi@0.6.8, "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": + version "0.6.8" + resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-account@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" + integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== + dependencies: + ethereumjs-util "^5.0.0" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-block@^1.2.2: + version "1.7.1" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" + integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== + dependencies: + async "^2.0.1" + ethereum-common "0.2.0" + ethereumjs-tx "^1.2.2" + ethereumjs-util "^5.0.0" + merkle-patricia-tree "^2.1.2" + +ethereumjs-block@~2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" + integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== + dependencies: + async "^2.0.1" + ethereumjs-common "^1.5.0" + ethereumjs-tx "^2.1.1" + ethereumjs-util "^5.0.0" + merkle-patricia-tree "^2.1.2" + +ethereumjs-common@^1.1.0, ethereumjs-common@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" + integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== + +ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2: + version "1.3.7" + resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" + integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== + dependencies: + ethereum-common "^0.0.18" + ethereumjs-util "^5.0.0" + +ethereumjs-tx@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" + integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== + dependencies: + ethereumjs-common "^1.5.0" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5: + version "5.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" + integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "^0.1.3" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-util@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethereumjs-util@^7.0.10, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" + integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethereumjs-vm@^2.3.4: + version "2.6.0" + resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" + integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== + dependencies: + async "^2.1.2" + async-eventemitter "^0.2.2" + ethereumjs-account "^2.0.3" + ethereumjs-block "~2.2.0" + ethereumjs-common "^1.1.0" + ethereumjs-util "^6.0.0" + fake-merkle-patricia-tree "^1.0.1" + functional-red-black-tree "^1.0.1" + merkle-patricia-tree "^2.3.2" + rustbn.js "~0.2.0" + safe-buffer "^5.1.1" + +ethers@4.0.41: + version "4.0.41" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.41.tgz#a0cff526f08c2e08c525cf82ef4483f6333b8000" + integrity sha512-QpW2CPZajquwiA7rVDozMksOuvdUBKIruamAakt0++EKBB/VWtLB9zSRZDInLDpp9fZYgOT/0trPD38r6CzLIg== + dependencies: + aes-js "3.0.0" + bn.js "^4.4.0" + elliptic "6.5.2" + hash.js "1.1.3" + js-sha3 "0.5.7" + scrypt-js "2.0.4" + setimmediate "1.0.4" + uuid "2.0.1" + xmlhttprequest "1.8.0" + +ethers@^5.0.13, ethers@^5.5.1: + version "5.6.1" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.1.tgz#a56cd67f1595b745dc3dde0ccf2b5de53a41a6d0" + integrity sha512-qtl/2W+dwmUa5Z3JqwsbV3JEBZZHNARe5K/A2ePcNAuhJYnEKIgGOT/O9ouPwBijSqVoQnmQMzi5D48LFNOY2A== + dependencies: + "@ethersproject/abi" "5.6.0" + "@ethersproject/abstract-provider" "5.6.0" + "@ethersproject/abstract-signer" "5.6.0" + "@ethersproject/address" "5.6.0" + "@ethersproject/base64" "5.6.0" + "@ethersproject/basex" "5.6.0" + "@ethersproject/bignumber" "5.6.0" + "@ethersproject/bytes" "5.6.0" + "@ethersproject/constants" "5.6.0" + "@ethersproject/contracts" "5.6.0" + "@ethersproject/hash" "5.6.0" + "@ethersproject/hdnode" "5.6.0" + "@ethersproject/json-wallets" "5.6.0" + "@ethersproject/keccak256" "5.6.0" + "@ethersproject/logger" "5.6.0" + "@ethersproject/networks" "5.6.0" + "@ethersproject/pbkdf2" "5.6.0" + "@ethersproject/properties" "5.6.0" + "@ethersproject/providers" "5.6.1" + "@ethersproject/random" "5.6.0" + "@ethersproject/rlp" "5.6.0" + "@ethersproject/sha2" "5.6.0" + "@ethersproject/signing-key" "5.6.0" + "@ethersproject/solidity" "5.6.0" + "@ethersproject/strings" "5.6.0" + "@ethersproject/transactions" "5.6.0" + "@ethersproject/units" "5.6.0" + "@ethersproject/wallet" "5.6.0" + "@ethersproject/web" "5.6.0" + "@ethersproject/wordlists" "5.6.0" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + +ethjs-util@0.1.6, ethjs-util@^0.1.3: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +eventemitter3@4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + +eventemitter3@4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== + +eventsource-polyfill@^0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/eventsource-polyfill/-/eventsource-polyfill-0.9.6.tgz#10e0d187f111b167f28fdab918843ce7d818f13c" + integrity sha1-EODRh/ERsWfyj9q5GIQ859gY8Tw= + +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" + +exec-sh@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" + integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" + integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + +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" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + +express@^4.14.0: + version "4.17.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" + integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.19.2" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.4.2" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.9.7" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.17.2" + serve-static "1.14.2" + setprototypeof "1.2.0" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +express@^4.16.3: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" + integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== + dependencies: + type "^2.5.0" + +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" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + +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" + +extract-css-chunks-webpack-plugin@^4.7.5: + version "4.9.0" + resolved "https://registry.yarnpkg.com/extract-css-chunks-webpack-plugin/-/extract-css-chunks-webpack-plugin-4.9.0.tgz#da5e6b1d8b39a398c817ffc98550f4ccb6d795e1" + integrity sha512-HNuNPCXRMqJDQ1OHAUehoY+0JVCnw9Y/H22FQzYVwo8Ulgew98AGDu0grnY5c7xwiXHjQa6yJ/1dxLCI/xqTyQ== + dependencies: + loader-utils "^2.0.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +extract-from-css@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/extract-from-css/-/extract-from-css-0.4.4.tgz#1ea7df2e7c7c6eb9922fa08e8adaea486f6f8f92" + integrity sha1-HqffLnx8brmSL6COitrqSG9vj5I= + dependencies: + css "^2.1.0" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fake-merkle-patricia-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" + integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM= + dependencies: + checkpoint-store "^1.1.0" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-deep-equal@^3.1.1: + 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.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fast-safe-stringify@^2.0.6: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fastq@^1.6.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" + integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + dependencies: + bser "^2.0.0" + +ffjavascript@^0.2.45: + version "0.2.51" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.51.tgz#5d714686e3a5bde96dc57be84babc61911283629" + integrity sha512-qshvFIjU6cWMQOtKwpU4JZOKfKHfN8TFJ0Tst1Bd/V8AfgzAUScqA+zRT6sLGdV9zlumLsMgrLzGVRK4kf6RQA== + dependencies: + big-integer "^1.6.48" + wasmbuilder "^0.0.12" + wasmcurves "0.1.0" + web-worker "^1.2.0" + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9" + integrity sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-loader@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" + integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.5.0" + +file-saver@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== + +file-saver@eligrey/FileSaver.js#1.3.8: + version "1.3.8" + resolved "https://codeload.github.com/eligrey/FileSaver.js/tar.gz/e865e37af9f9947ddcced76b549e27dc45c1cb2e" + +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== + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +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" + +finalhandler@1.1.2, finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-babel-config@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" + integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA== + dependencies: + json5 "^0.5.1" + path-exists "^3.0.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-cache-dir@^2.0.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.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.1.0.tgz#9935894999debef4cf9f677fdf646d002c4cdecb" + integrity sha512-zw+EFiNBNPgI2NTrKkDd1xd7q0cs6wr/iWnr/oUkI0yF9K9GqQ+riIt4aiyFaaqpaWbxPrJXHI+QvmNUQbX+0Q== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.0" + pkg-dir "^4.1.0" + +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-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.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" + +fixed-merkle-tree@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/fixed-merkle-tree/-/fixed-merkle-tree-0.7.3.tgz#e8993628bc43894dfae3cb7e2a847f45c63e8678" + integrity sha512-b50ZBpDfp/Nru120IdeS0IyqbVjOien1OSdWMDdcxS9uVHLV668xndNkEnn9t1WFOvc5aw1owl6l4N8mP5mkKg== + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flat@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= + +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.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + +follow-redirects@^1.14.0: + version "1.14.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" + integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== + +for-in@^1.0.1, 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= + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +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" + +fresh@0.5.2, fresh@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +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-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-memo@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fs-memo/-/fs-memo-1.2.0.tgz#a2ec3be606b902077adbb37ec529c5ec5fb2e037" + integrity sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w== + +fs-minipass@^1.2.5: + version "1.2.6" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" + integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== + dependencies: + minipass "^2.2.1" + +fs-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.0.0.tgz#a6415edab02fae4b9e9230bc87ee2e4472003cd1" + integrity sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A== + dependencies: + minipass "^3.0.0" + +fs-readdir-recursive@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +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.0.0: + 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@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + +fsevents@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +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.0.2, 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= + +gas-price-oracle@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/gas-price-oracle/-/gas-price-oracle-0.4.6.tgz#3e496092122896f1c80ea7eeeecea979d106b3aa" + integrity sha512-/z0wtzKa6FDTWmgikPnELWN8KiPHhCy3Z+waeKVMgvs5FBxibgwOUL1VlMsC4mVkXBoDadnBtFNOpUMgbt5pvg== + dependencies: + axios "^0.21.2" + bignumber.js "^9.0.0" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gensync@^1.0.0-beta.1: + 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-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +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-port-please@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-port-please/-/get-port-please-1.1.0.tgz#7a60007578df6c4570c233803b48854c44db41f7" + integrity sha512-C9adQpQ9uyboxURlYAVcqvKdnrZ0uIad6lAZzIr51G5shhUFcZUwl8rxY0B0hB6OJytBNzPB1Uj/S1CpP9aFzQ== + dependencies: + fs-memo "^1.2.0" + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +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= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +git-config-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-2.0.0.tgz#62633d61af63af4405a5024efd325762f58a181b" + integrity sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA== + +git-up@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.2.tgz#10c3d731051b366dc19d3df454bfca3f77913a7c" + integrity sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ== + dependencies: + is-ssh "^1.3.0" + parse-url "^5.0.0" + +git-url-parse@^11.4.0: + version "11.4.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.4.0.tgz#f2bb1f2b00f05552540e95a62e31399a639a6aa6" + integrity sha512-KlIa5jvMYLjXMQXkqpFzobsyD/V2K5DRHl5OAf+6oDFPlPLxrGDVQlIdI63c4/Kt6kai4kALENSALlzTGST3GQ== + dependencies: + git-up "^4.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + +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.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" + integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg== + dependencies: + is-glob "^4.0.1" + +glob-parent@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +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@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + 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" + +glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + 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" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^11.1.0, globals@^11.7.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@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + 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" + +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= + dependencies: + delegate "^3.1.2" + +got@9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +got@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" + integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== + dependencies: + decompress-response "^3.2.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-plain-obj "^1.1.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + p-cancelable "^0.3.0" + p-timeout "^1.1.1" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + url-parse-lax "^1.0.0" + url-to-options "^1.0.1" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" + integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== + +graceful-fs@^4.1.3: + version "4.2.8" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +graceful-fs@^4.1.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +graceful-fs@^4.1.9: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + +graceful-fs@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +graphql-tag@^2.12.0: + version "2.12.4" + resolved "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.4.tgz#d34066688a4f09e72d6f4663c74211e9b4b7c4bf" + integrity sha512-VV1U4O+9x99EkNpNmCUV5RZwq6MnK4+pGbRYWG+lA/m3uo7TSqJF81OkcOP148gFP6fzdl7JWYBrwWVTS9jXww== + dependencies: + tslib "^2.1.0" + +graphql@^15.5.1: + version "15.5.1" + resolved "https://registry.npmjs.org/graphql/-/graphql-15.5.1.tgz#f2f84415d8985e7b84731e7f3536f8bb9d383aad" + integrity sha512-FeTRX67T3LoE3LWAxxOlW2K3Bz+rMYAC18rRguK4wgXaTZMiJwSUwDmPFo3UadAKbzirKIg5Qy+sNJXbpPRnQw== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +gzip-size@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +hable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hable/-/hable-3.0.0.tgz#6de089b2df946635cf8134b9e4859f1b62de255f" + integrity sha512-7+G0/2/COR8pwteYFqHIVYfQpuEiO2HXwJrhCBJVgrNrl9O5eaUoJVDGXUJX+0RpGncNVTuestexjk1afj01wQ== + +handlebars@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.2.0.tgz#57ce8d2175b9bbb3d8b3cf3e4217b1aec8ddcb2e" + integrity sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0, har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +hard-source-webpack-plugin@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.13.1.tgz#a99071e25b232f1438a5bc3c99f10a3869e4428e" + integrity sha512-r9zf5Wq7IqJHdVAQsZ4OP+dcUSvoHqDMxJlIzaE2J0TZWn3UjMMrHqwDHR8Jr/pzPfG7XxSe36E7Y8QGNdtuAw== + dependencies: + chalk "^2.4.1" + find-cache-dir "^2.0.0" + graceful-fs "^4.1.11" + lodash "^4.15.0" + mkdirp "^0.5.1" + node-object-hash "^1.2.0" + parse-json "^4.0.0" + pkg-dir "^3.0.0" + rimraf "^2.6.2" + semver "^5.6.0" + tapable "^1.0.0-beta.5" + webpack-sources "^1.0.1" + write-json-file "^2.3.0" + +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-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== + dependencies: + has-symbol-support-x "^1.4.1" + +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-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +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.0, has@^1.0.1, 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.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash-sum@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" + integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= + +hash-sum@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" + integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== + +hash.js@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + 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, he@^1.1.0, 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== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hmac-drbg@^1.0.0, 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.2: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^2.1.4: + version "2.8.4" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.4.tgz#44119abaf4bc64692a16ace34700fed9c03e2546" + integrity sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ== + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-entities@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= + +html-minifier-terser@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-minifier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-4.0.0.tgz#cca9aad8bce1175e02e17a8c33e46d8988889f56" + integrity sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig== + dependencies: + camel-case "^3.0.0" + clean-css "^4.2.1" + commander "^2.19.0" + he "^1.2.0" + param-case "^2.1.1" + relateurl "^0.2.7" + uglify-js "^3.5.1" + +html-tags@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" + integrity sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos= + +html-webpack-plugin@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" + integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw== + dependencies: + "@types/html-minifier-terser" "^5.0.0" + "@types/tapable" "^1.0.5" + "@types/webpack" "^4.41.8" + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +html2canvas@1.0.0-alpha.12: + version "1.0.0-alpha.12" + resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.0.0-alpha.12.tgz#3b1992e3c9b3f56063c35fd620494f37eba88513" + integrity sha1-OxmS48mz9WBjw1/WIElPN+uohRM= + dependencies: + css-line-break "1.0.1" + +htmlparser2@^3.3.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +http-errors@~1.7.2: + 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" + +http-https@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" + integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.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= + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +iconv-lite@0.4.24, iconv-lite@^0.4.13, 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" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +idb@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/idb/-/idb-6.0.0.tgz#00d6092b948138cf9bebc9dcddc4df8bf60bf0ac" + integrity sha512-+M367poGtpzAylX4pwcrZIa7cFQLfNkAOlMMLN2kw/2jGfJP6h+TB/unQNSVYwNtP8XqkLYrfuiVnxLQNP1tjA== + +idna-uts46-hx@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" + integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== + dependencies: + punycode "2.1.0" + +ieee754@^1.1.13, ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +ieee754@^1.2.1: + 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-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +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.1, ignore@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + +ignore@^5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + +immutable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== + +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: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" + integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== + 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" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +import-modules@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-1.1.0.tgz#748db79c5cc42bb9701efab424f894e72600e9dc" + integrity sha1-dI23nFzEK7lwHvq0JPiU5yYA6dw= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + 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: + 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= + +ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@^6.2.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +inquirer@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" + integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +inquirer@^7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +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" + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +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-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +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-buffer@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" + integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== + +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +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-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +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.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +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-docker@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + +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@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +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-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" + integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +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-function@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +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@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^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-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-negative-zero@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +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@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + +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@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +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-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +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-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.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-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +is-ssh@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.2.tgz#a4b82ab63d73976fd8263cceee27f99a88bdae2b" + integrity sha512-elEw0/0c2UscLrNG+OAorbP539E3rhliKPg+hDMWN9VwrDXfYK+4PBEykDPfxlYYtQvl84TascnQyobfQLHEhQ== + dependencies: + protocols "^1.1.0" + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +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-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + +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-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-weakref@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +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@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +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= + +isarray@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +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= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" + integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== + dependencies: + handlebars "^4.1.2" + +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== + dependencies: + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^13.3.0" + +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + +jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== + dependencies: + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + +jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.9.0" + string-length "^2.0.0" + +jest-worker@^24.6.0, jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest-worker@^25.4.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== + dependencies: + import-local "^2.0.0" + jest-cli "^24.9.0" + +jiti@^0.1.11, jiti@^0.1.16: + version "0.1.17" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-0.1.17.tgz#b693a29c94d0ca4f82a4624b40dd9915527416be" + integrity sha512-IlUGuEHKA44dqJoSqpv1poIRyyi31ciEmpLlRZCmo9TasVSZhwfmaVUuQVs26EHuwYdx+NirOm41+wbykH/+9Q== + +js-beautify@^1.6.14: + version "1.10.2" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.10.2.tgz#88c9099cd6559402b124cfab18754936f8a7b178" + integrity sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ== + dependencies: + config-chain "^1.1.12" + editorconfig "^0.15.3" + glob "^7.1.3" + mkdirp "~0.5.1" + nopt "~4.0.1" + +js-sha3@0.5.7, js-sha3@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" + integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +"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.0: + 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" + +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsdom@^8.1.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-8.5.0.tgz#d4d8f5dbf2768635b62a62823b947cf7071ebc98" + integrity sha1-1Nj12/J2hjW2KmKCO5R89wcevJg= + dependencies: + abab "^1.0.0" + acorn "^2.4.0" + acorn-globals "^1.0.4" + array-equal "^1.0.0" + cssom ">= 0.3.0 < 0.4.0" + cssstyle ">= 0.2.34 < 0.3.0" + escodegen "^1.6.1" + iconv-lite "^0.4.13" + nwmatcher ">= 1.3.7 < 2.0.0" + parse5 "^1.5.1" + request "^2.55.0" + sax "^1.1.4" + symbol-tree ">= 3.1.0 < 4.0.0" + tough-cookie "^2.2.0" + webidl-conversions "^3.0.1" + whatwg-url "^2.0.1" + xml-name-validator ">= 2.0.1 < 3.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +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-rpc-engine@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5" + integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g== + dependencies: + eth-rpc-errors "^3.0.0" + safe-event-emitter "^1.0.1" + +json-rpc-engine@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" + integrity sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + eth-rpc-errors "^4.0.2" + +json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" + integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= + +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@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +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= + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +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.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jspdf@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/jspdf/-/jspdf-1.5.3.tgz#5a12c011479defabef5735de55c913060ed219f2" + integrity sha512-J9X76xnncMw+wIqb15HeWfPMqPwYxSpPY8yWPJ7rAZN/ZDzFkjCSZObryCyUe8zbrVRNiuCnIeQteCzMn7GnWw== + dependencies: + canvg "1.5.3" + file-saver eligrey/FileSaver.js#1.3.8 + html2canvas "1.0.0-alpha.12" + omggif "1.0.7" + promise-polyfill "8.1.0" + stackblur-canvas "2.2.0" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jszip@^2.5.0: + version "2.6.1" + resolved "https://registry.npmjs.org/jszip/-/jszip-2.6.1.tgz#b88f3a7b2e67a2a048152982c7a3756d9c4828f0" + integrity sha1-uI86ey5noqBIFSmCx6N1bZxIKPA= + dependencies: + pako "~1.0.2" + +jszip@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.5.0.tgz#b4fd1f368245346658e781fec9675802489e15f6" + integrity sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + set-immediate-shim "~1.0.1" + +keccak@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-2.1.0.tgz#734ea53f2edcfd0f42cdb8d5f4c358fef052752b" + integrity sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q== + dependencies: + bindings "^1.5.0" + inherits "^2.0.4" + nan "^2.14.0" + safe-buffer "^5.2.0" + +keccak@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +keyvaluestorage-interface@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff" + integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g== + +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.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + +launch-editor-middleware@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz#e14b07e6c7154b0a4b86a0fd345784e45804c157" + integrity sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg== + dependencies: + launch-editor "^2.2.1" + +launch-editor@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.2.1.tgz#871b5a3ee39d6680fcc26d37930b6eeda89db0ca" + integrity sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw== + dependencies: + chalk "^2.3.0" + shell-quote "^1.6.1" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +level-codec@~7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" + integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== + +level-errors@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" + integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w== + dependencies: + errno "~0.1.1" + +level-errors@~1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" + integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig== + dependencies: + errno "~0.1.1" + +level-iterator-stream@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" + integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0= + dependencies: + inherits "^2.0.1" + level-errors "^1.0.3" + readable-stream "^1.0.33" + xtend "^4.0.0" + +level-ws@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" + integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos= + dependencies: + readable-stream "~1.0.15" + xtend "~2.1.1" + +levelup@^1.2.1: + version "1.3.9" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" + integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== + dependencies: + deferred-leveldown "~1.2.1" + level-codec "~7.0.0" + level-errors "~1.0.3" + level-iterator-stream "~1.3.0" + prr "~1.0.1" + semver "~5.4.1" + xtend "~4.0.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-fs-cache@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086" + integrity sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw== + dependencies: + find-cache-dir "^0.1.1" + mkdirp "0.5.1" + +loader-runner@^2.3.1, 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.0.2, loader-utils@^1.1.0, 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.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._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.assign@^4.0.3, lodash.assign@^4.0.6: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + +lodash.camelcase@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.defaultsdeep@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" + integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== + +lodash.difference@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" + integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.kebabcase@^4.0.1, lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.snakecase@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40= + +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.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.topairs@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.topairs/-/lodash.topairs-4.3.0.tgz#3b6deaa37d60fb116713c46c5f17ea190ec48d64" + integrity sha1-O23qo31g+xFnE8RsXxfqGQ7EjWQ= + +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash.upperfirst@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" + integrity sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984= + +lodash.zip@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" + integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= + +lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lodash@^4.17.12: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lodash@^4.17.19, lodash@^4.17.20: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +loose-envify@^1.0.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" + +loupe@^2.3.1: + version "2.3.4" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" + integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== + dependencies: + get-func-name "^2.0.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +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" + +ltgt@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.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.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" + integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== + dependencies: + semver "^6.0.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" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.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" + +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + +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" + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memdown@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" + integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU= + dependencies: + abstract-leveldown "~2.7.1" + functional-red-black-tree "^1.0.1" + immediate "^3.2.3" + inherits "~2.0.1" + ltgt "~2.2.0" + safe-buffer "~5.1.1" + +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" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.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== + +merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" + integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== + dependencies: + async "^1.4.2" + ethereumjs-util "^5.0.0" + level-ws "0.0.0" + levelup "^1.2.1" + memdown "^1.0.0" + readable-stream "^2.0.0" + rlp "^2.0.0" + semaphore ">=1.0.1" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^2.1.5: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +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.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +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.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + +mime-db@1.42.0: + version "1.42.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" + integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +"mime-db@>= 1.40.0 < 2": + version "1.41.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.41.0.tgz#9110408e1f6aa1b34aef51f2c9df3caddf46b6a0" + integrity sha512-B5gxBI+2K431XW8C2rcc/lhppbuji67nf9v39eH8pkWoZDxnAL0PxdpH32KYRScniF8qDHBDlI+ipgg5WrCUYw== + +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + +mime-types@^2.1.16, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@^2.1.19: + version "2.1.25" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" + integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== + dependencies: + mime-db "1.42.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.3.1, mime@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0, mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.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.0, 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@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +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== + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" + integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== + dependencies: + minipass "^3.0.0" + +minipass@^2.2.1, minipass@^2.3.5: + version "2.5.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.5.0.tgz#dddb1d001976978158a05badfcbef4a771612857" + integrity sha512-9FwMVYhn6ERvMR8XFdOavRz4QK/VJV8elU1x50vYexf9lslDcWe/f4HBRxCPd185ekRSjU6CfYyJCECa/CQy7Q== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^2.6.0, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" + integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== + dependencies: + yallist "^4.0.0" + +minizlib@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +minizlib@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +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-promise@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" + integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= + dependencies: + mkdirp "*" + +mkdirp@*: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mkdirp@^0.5.3, mkdirp@^0.5.5: + 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" + +mock-fs@^4.1.0: + version "4.14.0" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" + integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== + +moment-locales-webpack-plugin@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/moment-locales-webpack-plugin/-/moment-locales-webpack-plugin-1.1.2.tgz#9ae5263ac38d5cba227fc9d76efad025bb685a0c" + integrity sha512-s+JE7lADQjUyeQvqB3sVcfxXncg1o+t5hrRl2GBY66vXuLO2tXIjD+4mNUXQMS10qCGoeK3R3skBrW34gHobBQ== + dependencies: + lodash.difference "^4.5.0" + +moment-timezone-data-webpack-plugin@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/moment-timezone-data-webpack-plugin/-/moment-timezone-data-webpack-plugin-1.1.0.tgz#6e77b0353894054c5982fc3bc65e689105629fdd" + integrity sha512-szKf9rbRoY9u3WNcwK6D0tdCREk/OZkcF1k163Xc5m7GcqBh28LgNVWisb4sje6/qdG3WUkFD5hJ7/lmKOkBAA== + dependencies: + find-cache-dir "^3.0.0" + make-dir "^3.0.0" + +moment-timezone@^0.5.27: + version "0.5.28" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.28.tgz#f093d789d091ed7b055d82aa81a82467f72e4338" + integrity sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw== + dependencies: + moment ">= 2.9.0" + +"moment@>= 2.9.0", moment@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + +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.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2, ms@^2.1.1: + 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.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multibase@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" + integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== + dependencies: + base-x "^3.0.8" + buffer "^5.5.0" + +multibase@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.0.tgz#0216e350614c7456da5e8e5b20d3fcd4c9104f56" + integrity sha512-R9bNLQhbD7MsitPm1NeY7w9sDgu6d7cuj25snAWH7k5PSNPSwIQQBpcpj8jx1W96dLbdigZqmUWOdQRMnAmgjA== + dependencies: + base-x "3.0.4" + +multicodec@^0.5.5: + version "0.5.7" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" + integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== + dependencies: + varint "^5.0.0" + +multicodec@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.0.tgz#75652ff96cc30f63bb56264ef5c7e6526bc0becb" + integrity sha512-CBiLdYcMnVnkN/2kL4AaUH3betYXQGKV5CCmN2CfgHUt5xROtsj91w780ltX6Wy7frgc6en8md3h2UQl6jDXAg== + dependencies: + varint "^5.0.0" + +multihashes@^0.4.15: + version "0.4.21" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" + integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== + dependencies: + buffer "^5.5.0" + multibase "^0.7.0" + varint "^5.0.0" + +multihashes@~0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.15.tgz#6dbc55f7f312c6782f5367c03c9783681589d8a6" + integrity sha512-G/Smj1GWqw1RQP3dRuRRPe3oyLqvPqUaEDIaoi7JF7Loxl4WAWvhJNk84oyDEodSucv0MmSW/ZT0RKUrsIFD3g== + dependencies: + bs58 "^4.0.1" + varint "^5.0.0" + +mustache@^2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" + integrity sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nan@^2.14.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + +nano-base32@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nano-base32/-/nano-base32-1.0.1.tgz#ba548c879efcfb90da1c4d9e097db4a46c9255ef" + integrity sha1-ulSMh578+5DaHE2eCX20pGySVe8= + +nano-json-stream-parser@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" + integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= + +nanoassert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" + integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== + +nanoid@^3.1.18: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + +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" + +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.2.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-addon-api@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-cache@^4.1.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-4.2.1.tgz#efd8474dee4edec4138cdded580f5516500f7334" + integrity sha512-BOb67bWg2dTyax5kdef5WfU3X8xu4wPg+zHzkvls0Q/QpYycIFRLEEIdAx9Wma43DxG6Qzn4illdZoYseKWa4A== + dependencies: + clone "2.x" + lodash "^4.17.15" + +node-fetch@2.6.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-fetch@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + +node-gyp-build@^4.2.0, node-gyp-build@^4.2.2, node-gyp-build@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + +node-html-parser@^1.3.1: + 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-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +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-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.4.2: + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-object-hash@^1.2.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-1.4.2.tgz#385833d85b229902b75826224f6077be969a9e94" + integrity sha512-UdS4swXs85fCGWWf6t6DMGgpN/vnlKeSGEQ7hJcrs7PBFoxoKLmibc3QRb7fwiYsjdL7PX8iI/TMSlZ90dgHhQ== + +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.1.29: + version "1.1.29" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.29.tgz#86a57c6587a30ecd6726449e5d293466b0a0bb86" + integrity sha512-R5bDhzh6I+tpi/9i2hrrvGJ3yKPYzlVOORDkXhnZuwi5D3q1I5w4vYy24PJXTcLk9Q0kws9TO77T75bcK8/ysQ== + dependencies: + semver "^5.3.0" + +node-releases@^1.1.67: + version "1.1.67" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" + integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== + +node-releases@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" + integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== + +node-res@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/node-res/-/node-res-5.0.1.tgz#ffaa462e206509d66d0ba28a4daf1f032daa6460" + integrity sha512-YOleO9c7MAqoHC+Ccu2vzvV1fL6Ku49gShq3PIMKWHRgrMSih3XcwL05NbLBi6oU2J471gTBfdpVVxwT6Pfhxg== + dependencies: + destroy "^1.0.4" + etag "^1.8.1" + mime-types "^2.1.19" + on-finished "^2.3.0" + vary "^1.1.2" + +node-stream-zip@^1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" + integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== + +nodemon@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.0.tgz#1c19aa3c668fcf5dddd1121555efb90e315d8edd" + integrity sha512-hs+lNmZc6pIamxCTDrOhMccqSsGjZENGZ/40etM/Zc3aoR4UTvwMH38XOnhD5pmU+Jn2u1OGOC5hZF2tjCHJMA== + dependencies: + chokidar "^3.2.2" + debug "^3.2.6" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.7" + semver "^5.7.1" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.2" + update-notifier "^2.5.0" + +nopt@^4.0.1, nopt@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1, 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== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0, normalize-url@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" + integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.0.tgz#d644ec1bd0569187d2a52909971023a0a58e8438" + integrity sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ== + dependencies: + path-key "^3.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@^1.0.2, nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +numbro@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/numbro/-/numbro-2.3.2.tgz#4967c631b0ea99b17dd7f88cdd1eaa4ace4d4971" + integrity sha512-GHRdsyYs6ugRP0mipuBKTybzTPKdlhzKh271PG3hPwL1fg2DKwK/I2nCsh0gW3FfIKBzWIFoBnousQfiAkOuwQ== + dependencies: + bignumber.js "^8.1.1" + +nuxt-buefy@^0.4.10: + version "0.4.10" + resolved "https://registry.yarnpkg.com/nuxt-buefy/-/nuxt-buefy-0.4.10.tgz#7e091ebee5c7dd2bf9de46a3b7a36a3a4d0d4fba" + integrity sha512-Kk/QrNXUrIe3/iPecb0v1OmcZWfdihioEuPtqW4OUfaDDPrVUdfPPRKLMHNgy1OPxDEGSor/h3zMr23d9/0Nyw== + dependencies: + buefy "^0.9.10" + +nuxt-web3-provider@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/nuxt-web3-provider/-/nuxt-web3-provider-0.1.4.tgz#d1825fa6e59110119297fc9aa8d15844513734d2" + integrity sha512-00SKifix1es9BlyrI9GpHvKghJw7J4CQwe1jjkk/w7IGJHY2fGN1SxXzwAo6XSOE+KHT/4oWyQOQQI/c4a2qYg== + dependencies: + web3 "^1.5.2" + web3-utils "^1.3.0" + +nuxt@2.14.7: + version "2.14.7" + resolved "https://registry.yarnpkg.com/nuxt/-/nuxt-2.14.7.tgz#041bb3f5c659b1fec80042d974f68a0ed4e93aa9" + integrity sha512-0pmMDgSqyLacHJ0otGgfFC4cnMIiAfkK5JQ0TU4cHckwt1d0emgABqqWFuO9S45VI5sHHBFADDkbUnJt3JqbLg== + dependencies: + "@nuxt/builder" "2.14.7" + "@nuxt/cli" "2.14.7" + "@nuxt/components" "^1.1.0" + "@nuxt/core" "2.14.7" + "@nuxt/generator" "2.14.7" + "@nuxt/loading-screen" "^2.0.2" + "@nuxt/opencollective" "^0.3.2" + "@nuxt/static" "^1.0.0" + "@nuxt/telemetry" "^1.2.3" + "@nuxt/webpack" "2.14.7" + +"nwmatcher@>= 1.3.7 < 2.0.0": + version "1.4.4" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" + integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== + +nwsapi@^2.0.7: + version "2.1.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" + integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.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-hash@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" + integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +object-inspect@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== + +object-keys@^1.0.11, 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-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + +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.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +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.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.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" + +object.values@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +oboe@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" + integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= + dependencies: + http-https "^1.0.0" + +omggif@1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.7.tgz#59d2eecb0263de84635b3feb887c0c9973f1e49d" + integrity sha1-WdLuywJj3oRjWz/riHwMmXPx5J0= + +on-finished@^2.3.0, on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@^1.0.2, on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +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" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +opener@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + +optimism@^0.16.0: + version "0.16.1" + resolved "https://registry.npmjs.org/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d" + integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== + dependencies: + "@wry/context" "^0.6.0" + "@wry/trie" "^0.3.0" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optimize-css-assets-webpack-plugin@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" + integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.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= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY= + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +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.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + dependencies: + p-try "^2.0.0" + +p-limit@^2.3.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-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-timeout@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" + integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= + dependencies: + p-finally "^1.0.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== + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +pako@~1.0.5: + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + +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" + +param-case@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +param-case@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +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: + version "5.1.4" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" + integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-git-config@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-3.0.0.tgz#4a2de08c7b74a2555efa5ae94d40cd44302a6132" + integrity sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA== + dependencies: + git-config-path "^2.0.0" + ini "^1.3.5" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-headers@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +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-path@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.2.tgz#ef14f0d3d77bae8dd4bc66563a4c151aac9e65aa" + integrity sha512-HSqVz6iuXSiL8C1ku5Gl1Z5cwDd9Wo0q8CoffdAghP6bz8pJa1tcMC+m4N+z6VAS8QdksnIGq1TB6EgR4vPR6w== + dependencies: + is-ssh "^1.3.0" + protocols "^1.4.0" + +parse-url@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.2.tgz#856a3be1fcdf78dc93fc8b3791f169072d898b59" + integrity sha512-Czj+GIit4cdWtxo3ISZCvLiUjErSo0iI3wJ+q9Oi3QuMYTI6OZu+7cewMWZ+C1YAnKhYTk6/TLuhIgCypLthPA== + dependencies: + is-ssh "^1.3.0" + normalize-url "^3.3.0" + parse-path "^4.0.0" + protocols "^1.4.0" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +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-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@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +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, path-is-absolute@^1.0.1: + 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-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" + integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +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== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pbkdf2@^3.0.17: + 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" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + 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" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" + integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + +picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +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== + +pify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= + dependencies: + find-up "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +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" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +pngjs@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +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-attribute-case-insensitive@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz#b2a721a0d279c2f9103a36331c88981526428cc7" + integrity sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0" + +postcss-calc@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" + integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== + dependencies: + css-unit-converter "^1.1.1" + postcss "^7.0.5" + postcss-selector-parser "^5.0.0-rc.4" + postcss-value-parser "^3.3.1" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" + integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-import-resolver@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-import-resolver/-/postcss-import-resolver-2.0.0.tgz#95c61ac5489047bd93ff42a9cd405cfe9041e2c0" + integrity sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw== + dependencies: + enhanced-resolve "^4.1.1" + +postcss-import@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153" + integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw== + dependencies: + postcss "^7.0.1" + postcss-value-parser "^3.2.3" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.1.tgz#99d319669a13d6c06ef8e70d852f68cb1b399b61" + integrity sha512-I2Sz83ZSHybMNh02xQDK609lZ1/QOyYeuizCjzEhlMgeV/HcDJapQiH4yTqLjZss0X6/6VvKFXUeObaHpJoINw== + dependencies: + lodash.template "^4.5.0" + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-load-config@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" + integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + 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-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@^6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" + integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= + dependencies: + dot-prop "^4.1.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-8.0.0.tgz#7b10059bd12929cdbb1971c60f61a0e5af86b4ca" + integrity sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw== + dependencies: + mime "^2.3.1" + minimatch "^3.0.4" + mkdirp "^0.5.0" + postcss "^7.0.2" + xxhashjs "^0.2.1" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.1: + 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-value-parser@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" + integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== + +postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.18.tgz#4b9cda95ae6c069c67a4d933029eddd4838ac233" + integrity sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^7.0.32: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +preact@10.4.1: + version "10.4.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431" + integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== + +precond@0.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" + integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0, prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + +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@^1.18.2, prettier@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +pretty-bytes@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.4.1.tgz#cd89f79bbcef21e3d21eb0da68ffe93f803e884b" + integrity sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA== + +pretty-error@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== + dependencies: + lodash "^4.17.20" + renderkid "^2.0.4" + +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +printj@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.3.1.tgz#9af6b1d55647a1587ac44f4c1654a4b95b8e12cb" + integrity sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg== + +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +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: + 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= + +promise-polyfill@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.0.tgz#30059da54d1358ce905ac581f287e184aedf995d" + integrity sha512-OzSf6gcCUQ01byV4BgwyUCswlaQQ6gzXc23aLQWhicvfX9kfsUiUhgt3CCQej8jDnl8/PhGF31JdHX2/MzF3WA== + +promise-to-callback@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" + integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc= + dependencies: + is-fn "^1.0.0" + set-immediate-shim "^1.0.1" + +prompts@^2.0.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.2.1.tgz#f901dd2a2dfee080359c0e20059b24188d75ad35" + integrity sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.3" + +prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.npmjs.org/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" + +proper-lockfile@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.1.tgz#284cf9db9e30a90e647afad69deb7cb06881262c" + integrity sha512-1w6rxXodisVpn7QYvLk706mzprPTAPCYAqxMvctmPN3ekuRk/kuGkGc82pangZiAt4R3lwSuUzheTTn0/Yb7Zg== + dependencies: + graceful-fs "^4.1.11" + retry "^0.12.0" + signal-exit "^3.0.2" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +protocols@^1.1.0, protocols@^1.4.0: + version "1.4.8" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" + integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== + +proxy-addr@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.0" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.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= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24, psl@^1.1.28: + version "1.3.1" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.1.tgz#d5aa3873a35ec450bc7db9012ad5a7246f6fc8bd" + integrity sha512-2KLd5fKOdAfShtY2d/8XDWVRnmp3zp40Qt6ge2zBPFARLXOGUf2fHD5eg+TV/5oxBtQKVhjUaKFsAaE4HnwfSA== + +pstree.remy@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3" + integrity sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A== + +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@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +push-dir@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/push-dir/-/push-dir-0.4.1.tgz#29481eacd9c2106bbb7941db6d37d122a071ecb4" + integrity sha1-KUgerNnCEGu7eUHbbTfRIqBx7LQ= + dependencies: + minimist "^1.2.0" + +q@^1.1.2, q@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qrcode@1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" + integrity sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q== + dependencies: + buffer "^5.4.3" + buffer-alloc "^1.2.0" + buffer-from "^1.1.1" + dijkstrajs "^1.0.1" + isarray "^2.0.1" + pngjs "^3.3.0" + yargs "^13.2.4" + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@6.9.7: + version "6.9.7" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" + integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@6.13.5: + version "6.13.5" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8" + integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q== + dependencies: + decode-uri-component "^0.2.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +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, querystring@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +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" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" + integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== + dependencies: + bytes "3.1.2" + http-errors "1.8.1" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-loader@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-3.1.0.tgz#5e9d399a5a222cc0de18f42c3bc5e49677532b3f" + integrity sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA== + dependencies: + loader-utils "^1.1.0" + schema-utils "^2.0.1" + +rc9@^1.0.0, rc9@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/rc9/-/rc9-1.2.0.tgz#ef098181fdde714efc4c426383d6e46c14b1254a" + integrity sha512-/jknmhG0USFAx5uoKkAKhtG40sONds9RWhFHrP1UzJ3OvVfqFWOypSUpmsQD0fFwAV7YtzHhsn3QNasfAoxgcQ== + dependencies: + defu "^2.0.4" + destr "^1.0.0" + flat "^5.0.0" + +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-is@^16.7.0, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^16.8.4: + version "16.9.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" + integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, 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.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + 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@^1.0.33: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.2.9: + 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.1.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +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" + +readable-stream@~1.0.15: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@^2.0.0, 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.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== + dependencies: + picomatch "^2.0.4" + +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" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + +recursive-fs@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/recursive-fs/-/recursive-fs-2.1.0.tgz#1e20cf7836b292ed81208c4817550a58ad0e15ff" + integrity sha512-oed3YruYsD52Mi16s/07eYblQOLi5dTtxpIJNdfCEJ7S5v8dDgVcycar0pRWf4IBuPMIkoctC8RTqGJzIKMNAQ== + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.2.1, regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + +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" + +regexp-tree@~0.1.1: + version "0.1.16" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.16.tgz#0715feadb6f766aad7eac5ef4287d2c39acf2fc5" + integrity sha512-nXWhGJLTWLNdhWF1uqoXQgAOgv8mQGpgXTOk8BWp08YMOKCtn74VoyOJ+AXZ68Dj50Myd+msYs+aGRBzWJ5dJA== + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +registry-auth-token@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +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= + +renderkid@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.4.tgz#d325e532afb28d3f8796ffee306be8ffd6fc864c" + integrity sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g== + dependencies: + css-select "^1.1.0" + dom-converter "^0.2" + htmlparser2 "^3.3.0" + lodash "^4.17.20" + strip-ansi "^3.0.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.5.2, 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= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== + dependencies: + lodash "^4.17.11" + +request-promise-native@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + dependencies: + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.55.0, request@^2.79.0, request@^2.85.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +reserved-words@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" + integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +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= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.2.0, resolve@^1.3.2, resolve@^1.5.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.14.2: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +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== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +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== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rgbcolor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d" + integrity sha1-1lBezbMEplldom+ktDMHMGd1lF0= + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: + 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" + +ripemd160-min@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/ripemd160-min/-/ripemd160-min-0.0.6.tgz#a904b77658114474d02503e819dcc55853b67e62" + integrity sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A== + +ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: + 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" + +rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + +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" + +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + +rxjs@^6.4.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" + integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== + dependencies: + tslib "^1.9.0" + +rxjs@^6.6.0: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, 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-buffer@5.2.1, safe-buffer@^5.2.0, safe-buffer@^5.2.1: + 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.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-event-emitter@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" + integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== + dependencies: + events "^3.0.0" + +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" + +safe-regex@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.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== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sass-loader@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.0.tgz#e7b07a3e357f965e6b03dd45b016b0a9746af797" + integrity sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w== + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.2.3" + neo-async "^2.6.1" + schema-utils "^2.1.0" + semver "^6.3.0" + +sass@^1.49.9: + version "1.49.9" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.9.tgz#b15a189ecb0ca9e24634bae5d1ebc191809712f9" + integrity sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +sax@^1.1.4, sax@^1.2.4, 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== + +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.0.0, schema-utils@^2.1.0, schema-utils@^2.2.0, schema-utils@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.5.0.tgz#8f254f618d402cc80257486213c8970edfd7c22f" + integrity sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ== + dependencies: + ajv "^6.10.2" + ajv-keywords "^3.4.1" + +schema-utils@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.2.0.tgz#48a065ce219e0cacf4631473159037b2c1ae82da" + integrity sha512-5EwsCNhfFTZvUreQhx/4vVQpJ/lnCAkgoIHLhSpp4ZirE+4hzFvdJi0FMub6hxbFVBJYSpeVVmon+2e7uEGRrA== + dependencies: + ajv "^6.10.2" + ajv-keywords "^3.4.1" + +schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: + 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.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" + integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +scrypt-js@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" + integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== + +scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= + +semaphore@>=1.0.1, semaphore@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" + integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.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.3.2, semver@^7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + +semver@~5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +send@0.17.2: + version "0.17.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "1.8.1" + mime "1.6.0" + ms "2.1.3" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" + integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== + dependencies: + randombytes "^2.1.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" + +serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +serve-placeholder@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/serve-placeholder/-/serve-placeholder-1.2.3.tgz#d2e778c6fedfe6e6ca48aff0b4627bbe2c4aa2ca" + integrity sha512-DC7t66WeIrlVzVMzickfHIn1zHu7eMsVNiH0nkD/wCrijFQdvgyfH2zc5lkFf79EApUgRhZntkpKjfgLkn2i/Q== + dependencies: + defu "^3.2.2" + +serve-static@1.14.1, serve-static@^1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +serve-static@1.14.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" + integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.2" + +server-destroy@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0= + +servify@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" + integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== + dependencies: + body-parser "^1.16.0" + cors "^2.8.1" + express "^4.14.0" + request "^2.79.0" + xhr "^2.3.3" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-immediate-shim@^1.0.1, set-immediate-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + +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.4" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" + integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48= + +setimmediate@^1.0.4, setimmediate@^1.0.5: + 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== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +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" + +sha3@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/sha3/-/sha3-2.1.4.tgz#000fac0fe7c2feac1f48a25e7a31b52a6492cc8f" + integrity sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg== + dependencies: + buffer "6.0.3" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +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@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +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.6.1: + 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== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +shvl@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shvl/-/shvl-2.0.0.tgz#55fd550b6e81bf7574f2f576b8b5c1ffae74e10f" + integrity sha512-WbpzSvI5XgVGJ3A4ySGe8hBxj0JgJktfnoLhhJmvITDdK21WPVWwgG8GPlYEh4xqdti3Ff7PJ5G0QrRAjNS0Ig== + +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" + +sigmund@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +signal-exit@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^2.7.0: + version "2.8.2" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" + integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.3.tgz#98168d62b79e3a5e758e27ae63c4a053d748f4eb" + integrity sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg== + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +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@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.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" + +"snarkjs@git+https://github.com/tornadocash/snarkjs.git#869181cfaf7526fe8972073d31655493a04326d5": + version "0.1.20" + resolved "git+https://github.com/tornadocash/snarkjs.git#869181cfaf7526fe8972073d31655493a04326d5" + dependencies: + big-integer "^1.6.43" + chai "^4.2.0" + escape-string-regexp "^1.0.5" + eslint "^5.16.0" + keccak "^2.0.0" + yargs "^12.0.5" + +solc@^0.4.20: + version "0.4.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5" + integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== + dependencies: + fs-extra "^0.30.0" + memorystream "^0.3.1" + require-from-string "^1.1.0" + semver "^5.3.0" + yargs "^4.7.1" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + dependencies: + is-plain-obj "^1.0.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-js@>=0.6.2 <2.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + 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.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.6, source-map-support@~0.5.12: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= + +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: + 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== + +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== + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + +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= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" + integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== + dependencies: + figgy-pudding "^3.5.1" + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +stackblur-canvas@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stackblur-canvas/-/stackblur-canvas-2.2.0.tgz#cacc5924a0744b3e183eb2e6c1d8559c1a17c26e" + integrity sha512-5Gf8dtlf8k6NbLzuly2NkGrkS/Ahh+I5VUjO7TnFizdJtgpfpLLEdQlLe9umbcnZlitU84kfYjXE67xlSXfhfQ== + +stackblur-canvas@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stackblur-canvas/-/stackblur-canvas-1.4.1.tgz#849aa6f94b272ff26f6471fa4130ed1f7e47955b" + integrity sha1-hJqm+UsnL/JvZHH6QTDtH35HlVs= + +stackframe@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz#357b24a992f9427cba6b545d96a14ed2cbca187b" + integrity sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw== + +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", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +std-env@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-2.2.1.tgz#2ffa0fdc9e2263e0004c1211966e960948a40f6b" + integrity sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ== + dependencies: + ci-info "^1.6.0" + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +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@^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-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.0.0, string-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" + integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^5.2.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.trimleft@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.0.0.tgz#68b6aa8e162c6a80e76e3a8a0c2e747186e271ff" + integrity sha1-aLaqjhYsaoDnbjqKDC50cYbicf8= + dependencies: + define-properties "^1.1.2" + function-bind "^1.0.2" + +string.prototype.trimright@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.0.0.tgz#ab4a56d802a01fbe7293e11e84f24dc8164661dd" + integrity sha1-q0pW2AKgH75yk+EehPJNyBZGYd0= + dependencies: + define-properties "^1.1.2" + function-bind "^1.0.2" + +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.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@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +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@^3.0.0, strip-ansi@^3.0.1: + 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-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.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-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= + dependencies: + is-hex-prefixed "1.0.0" + +strip-json-comments@^2.0.0, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +style-resources-loader@^1.3.3: + version "1.4.1" + resolved "https://registry.yarnpkg.com/style-resources-loader/-/style-resources-loader-1.4.1.tgz#87f520e6c8120a71e756726c1c53a78c544ca7db" + integrity sha512-UaAoQXq20relw6B633z4QZDxDyW7gevTt1e0y3MZtzdZfnvB90UL658czAgNc609Y7Kn5ErdthK9bSVhnykBUA== + dependencies: + glob "^7.1.6" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +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.5.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.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-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= + +svgo@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.0.tgz#bae51ba95ded9a33a36b7c46ce9c359ae9154313" + integrity sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.33" + csso "^3.5.1" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +swarm-js@^0.1.40: + version "0.1.40" + resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" + integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA== + dependencies: + bluebird "^3.5.0" + buffer "^5.0.5" + eth-lib "^0.1.26" + fs-extra "^4.0.2" + got "^7.1.0" + mime-types "^2.1.16" + mkdirp-promise "^5.0.1" + mock-fs "^4.1.0" + setimmediate "^1.0.5" + tar "^4.0.2" + xhr-request "^1.0.1" + +symbol-observable@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + +"symbol-tree@>= 3.1.0 < 4.0.0", symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tapable@^1.0.0, tapable@^1.0.0-beta.5, 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== + +tar@^4: + version "4.4.10" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" + integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.5" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +tar@^4.0.2: + version "4.4.19" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +term-size@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.1.0.tgz#3aec444c07a7cf936e157c1dc224b590c3c7eef2" + integrity sha512-I42EWhJ+2aeNQawGx1VtpO0DFI9YcfuvAMNIdKyf/6sRbHJ4P+ZQ/zIT87tE+ln1ymAGcCJds4dolfSAS0AcNg== + +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-webpack-plugin@^2.3.5: + version "2.3.8" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz#894764a19b0743f2f704e7c2a848c5283a696724" + integrity sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.3.1" + jest-worker "^25.4.0" + p-limit "^2.3.0" + schema-utils "^2.6.6" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.6.12" + webpack-sources "^1.4.3" + +terser@^4.1.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.2.1.tgz#1052cfe17576c66e7bc70fcc7119f22b155bdac1" + integrity sha512-cGbc5utAcX4a9+2GGVX4DsenG6v0x3glnDi5hx8816X1McEAwPlPgRtXPJzSBsbpILxZ8MQMT0KvArLuE0HP5A== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^4.6.12, terser@^4.6.3: + 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" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +testrpc@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" + integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== + +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= + +thread-loader@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-2.1.3.tgz#cbd2c139fc2b2de6e9d28f62286ab770c1acbdda" + integrity sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg== + dependencies: + loader-runner "^2.3.1" + loader-utils "^1.1.0" + neo-async "^2.6.0" + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + +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" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +time-fix-plugin@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/time-fix-plugin/-/time-fix-plugin-2.0.7.tgz#4ba70ae2e40cedf34dabe505eda7b71b1b244f50" + integrity sha512-uVFet1LQToeUX0rTcSiYVYVoGuBpc8gP/2jnlUzuHMHe+gux6XLsNzxLUweabMwiUj5ejhoIMsUI55nVSEa/Vw== + +timed-out@^4.0.0, timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +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@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +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-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +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== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +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" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-invariant@^0.7.0: + version "0.7.5" + resolved "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.7.5.tgz#f9658719f9a7737b117d09820d952aacf6263f9c" + integrity sha512-qfVyqTYWEqADMtncLqwpUdMjMSXnsqOeqGtj1LeJNFDjz8oqZ1YxLEp29YCOq65z0LgEiERqQ8ThVjnfibJNpg== + dependencies: + tslib "^2.1.0" + +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + +tslib@^1.10.0, tslib@^1.11.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^1.8.1, tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +tslib@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tslib@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" + integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== + +tslib@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + 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= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl-util@^0.15.0: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" + integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== + +typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +ua-parser-js@^0.7.22: + version "0.7.23" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.23.tgz#704d67f951e13195fbcd3d78818577f5bc1d547b" + integrity sha512-m4hvMLxgGHXG3O3fQVAyyAQpZzDOvwnhOTjYz5Xmr7r/+LpkNy3vJXdVRWgd1TkAb7NGROZuSy96CrlNVjA7KA== + +uglify-js@^3.1.4, uglify-js@^3.5.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" + integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== + dependencies: + commander "~2.20.0" + source-map "~0.6.1" + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + +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" + +undefsafe@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" + integrity sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY= + dependencies: + debug "^2.2.0" + +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +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" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +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" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +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" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +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== + +upath@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" + integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== + +update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + 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@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b" + integrity sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog== + dependencies: + loader-utils "^1.2.3" + mime "^2.4.4" + schema-utils "^2.5.0" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url-set-query@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" + integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= + +url-to-options@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= + +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@^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== + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= + +utf-8-validate@^5.0.2: + version "5.0.9" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.9.tgz#ba16a822fbeedff1a58918f2a6a6b36387493ea3" + integrity sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q== + dependencies: + node-gyp-build "^4.3.0" + +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +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.promisify@1.0.0, util.promisify@^1.0.0, util.promisify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +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.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" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" + integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= + +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +uuid@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + +v-idle@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/v-idle/-/v-idle-0.2.0.tgz#340e67f44f4e3d1edf7804b9e71b2e65cb88f85e" + integrity sha512-i/bVh29rJHdgI7Ek6o4EwfOZqOBJ6oThgQGOj305X2wSl+IGxAjL6+ucKa2E9voPbZvtwQICKrnRjy7UmBYByg== + +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + +v8flags@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +varint@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.0.tgz#d826b89f7490732fabc0c0ed693ed475dcb29ebf" + integrity sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8= + +vary@^1, vary@^1.1.2, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.3.tgz#a6467781abd366217c050f8202e7e50cc9eef8c0" + integrity sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" + integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== + +vue-client-only@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/vue-client-only/-/vue-client-only-2.0.0.tgz#ddad8d675ee02c761a14229f0e440e219de1da1c" + integrity sha512-arhk1wtWAfLsJyxGMoEYhoBowM87/i6HLSG2LH/03Yog6i2d9JEN1peMP0Ceis+/n9DxdenGYZZTxbPPJyHciA== + +vue-clipboard2@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/vue-clipboard2/-/vue-clipboard2-0.3.1.tgz#6e551fb7bd384889b28b0da3b12289ed6bca4894" + integrity sha512-H5S/agEDj0kXjUb5GP2c0hCzIXWRBygaWLN3NEFsaI9I3uWin778SFEMt8QRXiPG+7anyjqWiw2lqcxWUSfkYg== + dependencies: + clipboard "^2.0.0" + +vue-eslint-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz#00f4e4da94ec974b821a26ff0ed0f7a78402b8a1" + integrity sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g== + dependencies: + debug "^4.1.0" + eslint-scope "^4.0.0" + eslint-visitor-keys "^1.0.0" + espree "^4.1.0" + esquery "^1.0.1" + lodash "^4.17.11" + +vue-eslint-parser@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-6.0.5.tgz#c1c067c2755748e28f3872cd42e8c1c4c1a8059f" + integrity sha512-Bvjlx7rH1Ulvus56KHeLXOjEi3JMOYTa1GAqZr9lBQhd8weK8mV7U7V2l85yokBZEWHJQjLn6X3nosY8TzkOKg== + dependencies: + debug "^4.1.1" + eslint-scope "^4.0.0" + eslint-visitor-keys "^1.0.0" + espree "^5.0.0" + esquery "^1.0.1" + lodash "^4.17.11" + +vue-eslint-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.0.0.tgz#a4ed2669f87179dedd06afdd8736acbb3a3864d6" + integrity sha512-yR0dLxsTT7JfD2YQo9BhnQ6bUTLsZouuzt9SKRP7XNaZJV459gvlsJo4vT2nhZ/2dH9j3c53bIx9dnqU2prM9g== + dependencies: + debug "^4.1.1" + eslint-scope "^5.0.0" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + lodash "^4.17.15" + +vue-hot-reload-api@^2.3.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz#2756f46cb3258054c5f4723de8ae7e87302a1ccf" + integrity sha512-KmvZVtmM26BQOMK1rwUZsrqxEGeKiYSZGA7SNWE6uExx8UX/cj9hq2MRV/wWC3Cq6AoeDGk57rL9YMFRel/q+g== + +vue-i18n@^8.15.4: + version "8.15.4" + resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.15.4.tgz#1bfba2b6a6cb6de7b44f0f0aa89ad775fc902bc2" + integrity sha512-brhbJRB/gyWlroAhQZU0TNTQzNonbkHmzH4HlJzs7c+DsVIhB5OlRHg3zAl+85kkT8mpxzvBE6Bm1slqnRRmsg== + +vue-jest@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/vue-jest/-/vue-jest-3.0.5.tgz#d6f124b542dcbff207bf9296c19413f4c40b70c9" + integrity sha512-xWDxde91pDqYBGDlODENZ3ezPgw+IQFoVDtf+5Awlg466w3KvMSqWzs8PxcTeTr+wmAHi0j+a+Lm3R7aUJa1jA== + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.26.0" + chalk "^2.1.0" + extract-from-css "^0.4.4" + find-babel-config "^1.1.0" + js-beautify "^1.6.14" + node-cache "^4.1.1" + object-assign "^4.1.1" + source-map "^0.5.6" + tsconfig "^7.0.0" + vue-template-es2015-compiler "^1.6.0" + +vue-loader@^15.9.3: + version "15.9.5" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.5.tgz#7a960dc420a3439deaacdda038fdcdbf7c432706" + integrity sha512-oeMOs2b5o5gRqkxfds10bCx6JeXYTwivRgbb8hzOrcThD2z1+GqEKE3EX9A2SGbsYDf4rXwRg6D5n1w0jO5SwA== + dependencies: + "@vue/component-compiler-utils" "^3.1.0" + hash-sum "^1.0.2" + loader-utils "^1.1.0" + vue-hot-reload-api "^2.3.0" + vue-style-loader "^4.1.0" + +vue-meta@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/vue-meta/-/vue-meta-2.4.0.tgz#a419fb4b4135ce965dab32ec641d1989c2ee4845" + integrity sha512-XEeZUmlVeODclAjCNpWDnjgw+t3WA6gdzs6ENoIAgwO1J1d5p1tezDhtteLUFwcaQaTtayRrsx7GL6oXp/m2Jw== + dependencies: + deepmerge "^4.2.2" + +vue-no-ssr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vue-no-ssr/-/vue-no-ssr-1.1.1.tgz#875f3be6fb0ae41568a837f3ac1a80eaa137b998" + integrity sha512-ZMjqRpWabMPqPc7gIrG0Nw6vRf1+itwf0Itft7LbMXs2g3Zs/NFmevjZGN1x7K3Q95GmIjWbQZTVerxiBxI+0g== + +vue-router@^3.4.6: + version "3.4.9" + resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.4.9.tgz#c016f42030ae2932f14e4748b39a1d9a0e250e66" + integrity sha512-CGAKWN44RqXW06oC+u4mPgHLQQi2t6vLD/JbGRDAXm0YpMv0bgpKuU5bBd7AvMgfTz9kXVRIWKHqRwGEb8xFkA== + +vue-server-renderer@^2.6.12: + version "2.6.12" + resolved "https://registry.yarnpkg.com/vue-server-renderer/-/vue-server-renderer-2.6.12.tgz#a8cb9c49439ef205293cb41c35d0d2b0541653a5" + integrity sha512-3LODaOsnQx7iMFTBLjki8xSyOxhCtbZ+nQie0wWY4iOVeEtTg1a3YQAjd82WvKxrWHHTshjvLb7OXMc2/dYuxw== + dependencies: + chalk "^1.1.3" + hash-sum "^1.0.2" + he "^1.1.0" + lodash.template "^4.5.0" + lodash.uniq "^4.5.0" + resolve "^1.2.0" + serialize-javascript "^3.1.0" + source-map "0.5.6" + +vue-style-loader@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8" + integrity sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ== + dependencies: + hash-sum "^1.0.2" + loader-utils "^1.0.2" + +vue-template-compiler@^2.6.12: + version "2.6.12" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz#947ed7196744c8a5285ebe1233fe960437fcc57e" + integrity sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg== + dependencies: + de-indent "^1.0.2" + he "^1.1.0" + +vue-template-es2015-compiler@^1.6.0, vue-template-es2015-compiler@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" + integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== + +vue@^2.6.12: + version "2.6.12" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.12.tgz#f5ebd4fa6bd2869403e29a896aed4904456c9123" + integrity sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg== + +vuex-persistedstate@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/vuex-persistedstate/-/vuex-persistedstate-2.7.0.tgz#f60aae4e1163bf293696a625526dbffaa42e429e" + integrity sha512-mpko65DUMBY4mF4sSGsgrqjE7fwO373LFZeuNrC55glRuBBAK4dkgzjr4j4Bij7WtMoKuo2t2w0NGenjauISaQ== + dependencies: + deepmerge "^4.2.2" + shvl "^2.0.0" + +vuex@^3.5.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.6.0.tgz#95efa56a58f7607c135b053350833a09e01aa813" + integrity sha512-W74OO2vCJPs9/YjNjW8lLbj+jzT24waTo2KShI8jLvJW8OaIkgb3wuAMA7D+ZiUxDOx3ubwSZTaJBip9G8a3aQ== + +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +wasmbuilder@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.12.tgz#a60cb25d6d11f314fe5ab3f4ee041ccb493cb78a" + integrity sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w== + dependencies: + big-integer "^1.6.48" + +wasmcurves@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.1.0.tgz#0bc3f9d465367fcd8243395cb0094a05577e5609" + integrity sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q== + dependencies: + big-integer "^1.6.42" + blakejs "^1.1.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@^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" + +web-worker@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== + +web3-bzz@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.5.2.tgz#a04feaa19462cff6d5a8c87dad1aca4619d9dfc8" + integrity sha512-W/sPCdA+XQ9duUYKHAwf/g69cbbV8gTCRsa1MpZwU7spXECiyJ2EvD/QzAZ+UpJk3GELXFF/fUByeZ3VRQKF2g== + dependencies: + "@types/node" "^12.12.6" + got "9.6.0" + swarm-js "^0.1.40" + +web3-bzz@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.1.tgz#ea1e7d27050eca089bc5d71b7f7688d20b68a25d" + integrity sha512-sVeUSINx4a4pfdnT+3ahdRdpDPvZDf4ZT/eBF5XtqGWq1mhGTl8XaQAk15zafKVm6Onq28vN8abgB/l+TrG8kA== + dependencies: + "@types/node" "^12.12.6" + got "9.6.0" + swarm-js "^0.1.40" + +web3-core-helpers@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.5.2.tgz#b6bd5071ca099ba3f92dfafb552eed2b70af2795" + integrity sha512-U7LJoeUdQ3aY9t5gU7t/1XpcApsWm+4AcW5qKl/44ZxD44w0Dmsq1c5zJm3GuLr/a9MwQfXK4lpmvxVQWHHQRg== + dependencies: + web3-eth-iban "1.5.2" + web3-utils "1.5.2" + +web3-core-helpers@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.1.tgz#6dc34eff6ad31149db6c7cc2babbf574a09970cd" + integrity sha512-xn7Sx+s4CyukOJdlW8bBBDnUCWndr+OCJAlUe/dN2wXiyaGRiCWRhuQZrFjbxLeBt1fYFH7uWyYHhYU6muOHgw== + dependencies: + web3-eth-iban "1.7.1" + web3-utils "1.7.1" + +web3-core-method@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.5.2.tgz#d1d602657be1000a29d11e3ca3bf7bc778dea9a5" + integrity sha512-/mC5t9UjjJoQmJJqO5nWK41YHo+tMzFaT7Tp7jDCQsBkinE68KsUJkt0jzygpheW84Zra0DVp6q19gf96+cugg== + dependencies: + "@ethereumjs/common" "^2.4.0" + "@ethersproject/transactions" "^5.0.0-beta.135" + web3-core-helpers "1.5.2" + web3-core-promievent "1.5.2" + web3-core-subscriptions "1.5.2" + web3-utils "1.5.2" + +web3-core-method@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.1.tgz#912c87d0f107d3f823932cf8a716852e3250e557" + integrity sha512-383wu5FMcEphBFl5jCjk502JnEg3ugHj7MQrsX7DY76pg5N5/dEzxeEMIJFCN6kr5Iq32NINOG3VuJIyjxpsEg== + dependencies: + "@ethersproject/transactions" "^5.0.0-beta.135" + web3-core-helpers "1.7.1" + web3-core-promievent "1.7.1" + web3-core-subscriptions "1.7.1" + web3-utils "1.7.1" + +web3-core-promievent@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.5.2.tgz#2dc9fe0e5bbeb7c360fc1aac5f12b32d9949a59b" + integrity sha512-5DacbJXe98ozSor7JlkTNCy6G8945VunRRkPxMk98rUrg60ECVEM/vuefk1atACzjQsKx6tmLZuHxbJQ64TQeQ== + dependencies: + eventemitter3 "4.0.4" + +web3-core-promievent@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.1.tgz#7f78ec100a696954d0c882dac619fec28b2efc96" + integrity sha512-Vd+CVnpPejrnevIdxhCkzMEywqgVbhHk/AmXXceYpmwA6sX41c5a65TqXv1i3FWRJAz/dW7oKz9NAzRIBAO/kA== + dependencies: + eventemitter3 "4.0.4" + +web3-core-requestmanager@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.5.2.tgz#43ccc00779394c941b28e6e07e217350fd1ded71" + integrity sha512-oRVW9OrAsXN2JIZt68OEg1Mb1A9a/L3JAGMv15zLEFEnJEGw0KQsGK1ET2kvZBzvpFd5G0EVkYCnx7WDe4HSNw== + dependencies: + util "^0.12.0" + web3-core-helpers "1.5.2" + web3-providers-http "1.5.2" + web3-providers-ipc "1.5.2" + web3-providers-ws "1.5.2" + +web3-core-requestmanager@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.1.tgz#5cd7507276ca449538fe11cb4f363de8507502e5" + integrity sha512-/EHVTiMShpZKiq0Jka0Vgguxi3vxq1DAHKxg42miqHdUsz4/cDWay2wGALDR2x3ofDB9kqp7pb66HsvQImQeag== + dependencies: + util "^0.12.0" + web3-core-helpers "1.7.1" + web3-providers-http "1.7.1" + web3-providers-ipc "1.7.1" + web3-providers-ws "1.7.1" + +web3-core-subscriptions@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.5.2.tgz#8eaebde44f81fc13c45b555c4422fe79393da9cf" + integrity sha512-hapI4rKFk22yurtIv0BYvkraHsM7epA4iI8Np+HuH6P9DD0zj/llaps6TXLM9HyacLBRwmOLZmr+pHBsPopUnQ== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.5.2" + +web3-core-subscriptions@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.1.tgz#f7c834ee3544f4a5641a989304f61fde6a523e0b" + integrity sha512-NZBsvSe4J+Wt16xCf4KEtBbxA9TOwSVr8KWfUQ0tC2KMdDYdzNswl0Q9P58xaVuNlJ3/BH+uDFZJJ5E61BSA1Q== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.7.1" + +web3-core@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.5.2.tgz#ca2b9b1ed3cf84d48b31c9bb91f7628f97cfdcd5" + integrity sha512-sebMpQbg3kbh3vHUbHrlKGKOxDWqjgt8KatmTBsTAWj/HwWYVDzeX+2Q84+swNYsm2DrTBVFlqTErFUwPBvyaA== + dependencies: + "@types/bn.js" "^4.11.5" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.5.2" + web3-core-method "1.5.2" + web3-core-requestmanager "1.5.2" + web3-utils "1.5.2" + +web3-core@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.1.tgz#ef9b7f03909387b9ab783f34cdc5ebcb50248368" + integrity sha512-HOyDPj+4cNyeNPwgSeUkhtS0F+Pxc2obcm4oRYPW5ku6jnTO34pjaij0us+zoY3QEusR8FfAKVK1kFPZnS7Dzw== + dependencies: + "@types/bn.js" "^4.11.5" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.7.1" + web3-core-method "1.7.1" + web3-core-requestmanager "1.7.1" + web3-utils "1.7.1" + +web3-eth-abi@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.5.2.tgz#b627eada967f39ae4657ddd61b693cb00d55cb29" + integrity sha512-P3bJbDR5wib4kWGfVeBKBVi27T+AiHy4EJxYM6SMNbpm3DboLDdisu9YBd6INMs8rzxgnprBbGmmyn4jKIDKAA== + dependencies: + "@ethersproject/abi" "5.0.7" + web3-utils "1.5.2" + +web3-eth-abi@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.1.tgz#6632003220a4defee4de8215dc703e43147382ea" + integrity sha512-8BVBOoFX1oheXk+t+uERBibDaVZ5dxdcefpbFTWcBs7cdm0tP8CD1ZTCLi5Xo+1bolVHNH2dMSf/nEAssq5pUA== + dependencies: + "@ethersproject/abi" "5.0.7" + web3-utils "1.7.1" + +web3-eth-accounts@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.5.2.tgz#cf506c21037fa497fe42f1f055980ce4acf83731" + integrity sha512-F8mtzxgEhxfLc66vPi0Gqd6mpscvvk7Ua575bsJ1p9J2X/VtuKgDgpWcU4e4LKeROQ+ouCpAG9//0j9jQuij3A== + dependencies: + "@ethereumjs/common" "^2.3.0" + "@ethereumjs/tx" "^3.2.1" + crypto-browserify "3.12.0" + eth-lib "0.2.8" + ethereumjs-util "^7.0.10" + scrypt-js "^3.0.1" + uuid "3.3.2" + web3-core "1.5.2" + web3-core-helpers "1.5.2" + web3-core-method "1.5.2" + web3-utils "1.5.2" + +web3-eth-accounts@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.1.tgz#f938060d08f4b641bebe743809b0018fd4e4ba51" + integrity sha512-3xGQ2bkTQc7LFoqGWxp5cQDrKndlX05s7m0rAFVoyZZODMqrdSGjMPMqmWqHzJRUswNEMc+oelqSnGBubqhguQ== + dependencies: + "@ethereumjs/common" "^2.5.0" + "@ethereumjs/tx" "^3.3.2" + crypto-browserify "3.12.0" + eth-lib "0.2.8" + ethereumjs-util "^7.0.10" + scrypt-js "^3.0.1" + uuid "3.3.2" + web3-core "1.7.1" + web3-core-helpers "1.7.1" + web3-core-method "1.7.1" + web3-utils "1.7.1" + +web3-eth-contract@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.5.2.tgz#ffbd799fd01e36596aaadefba323e24a98a23c2f" + integrity sha512-4B8X/IPFxZCTmtENpdWXtyw5fskf2muyc3Jm5brBQRb4H3lVh1/ZyQy7vOIkdphyaXu4m8hBLHzeyKkd37mOUg== + dependencies: + "@types/bn.js" "^4.11.5" + web3-core "1.5.2" + web3-core-helpers "1.5.2" + web3-core-method "1.5.2" + web3-core-promievent "1.5.2" + web3-core-subscriptions "1.5.2" + web3-eth-abi "1.5.2" + web3-utils "1.5.2" + +web3-eth-contract@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.1.tgz#3f5147e5f1441ae388c985ba95023d02503378ae" + integrity sha512-HpnbkPYkVK3lOyos2SaUjCleKfbF0SP3yjw7l551rAAi5sIz/vwlEzdPWd0IHL7ouxXbO0tDn7jzWBRcD3sTbA== + dependencies: + "@types/bn.js" "^4.11.5" + web3-core "1.7.1" + web3-core-helpers "1.7.1" + web3-core-method "1.7.1" + web3-core-promievent "1.7.1" + web3-core-subscriptions "1.7.1" + web3-eth-abi "1.7.1" + web3-utils "1.7.1" + +web3-eth-ens@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.5.2.tgz#ecb3708f0e8e2e847e9d89e8428da12c30bba6a4" + integrity sha512-/UrLL42ZOCYge+BpFBdzG8ICugaRS4f6X7PxJKO+zAt+TwNgBpjuWfW/ZYNcuqJun/ZyfcTuj03TXqA1RlNhZQ== + dependencies: + content-hash "^2.5.2" + eth-ens-namehash "2.0.8" + web3-core "1.5.2" + web3-core-helpers "1.5.2" + web3-core-promievent "1.5.2" + web3-eth-abi "1.5.2" + web3-eth-contract "1.5.2" + web3-utils "1.5.2" + +web3-eth-ens@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.1.tgz#18ddb22e14e50108f9515c9d17f14560d69ff397" + integrity sha512-DVCF76i9wM93DrPQwLrYiCw/UzxFuofBsuxTVugrnbm0SzucajLLNftp3ITK0c4/lV3x9oo5ER/wD6RRMHQnvw== + dependencies: + content-hash "^2.5.2" + eth-ens-namehash "2.0.8" + web3-core "1.7.1" + web3-core-helpers "1.7.1" + web3-core-promievent "1.7.1" + web3-eth-abi "1.7.1" + web3-eth-contract "1.7.1" + web3-utils "1.7.1" + +web3-eth-iban@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.5.2.tgz#f390ad244ef8a6c94de7c58736b0b80a484abc8e" + integrity sha512-C04YDXuSG/aDwOHSX+HySBGb0KraiAVt+/l1Mw7y/fCUrKC/K0yYzMYqY/uYOcvLtepBPsC4ZfUYWUBZ2PO8Vg== + dependencies: + bn.js "^4.11.9" + web3-utils "1.5.2" + +web3-eth-iban@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.1.tgz#2148dff256392491df36b175e393b03c6874cd31" + integrity sha512-XG4I3QXuKB/udRwZdNEhdYdGKjkhfb/uH477oFVMLBqNimU/Cw8yXUI5qwFKvBHM+hMQWfzPDuSDEDKC2uuiMg== + dependencies: + bn.js "^4.11.9" + web3-utils "1.7.1" + +web3-eth-personal@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.5.2.tgz#043335a19ab59e119ba61e3bd6c3b8cde8120490" + integrity sha512-nH5N2GiVC0C5XeMEKU16PeFP3Hb3hkPvlR6Tf9WQ+pE+jw1c8eaXBO1CJQLr15ikhUF3s94ICyHcfjzkDsmRbA== + dependencies: + "@types/node" "^12.12.6" + web3-core "1.5.2" + web3-core-helpers "1.5.2" + web3-core-method "1.5.2" + web3-net "1.5.2" + web3-utils "1.5.2" + +web3-eth-personal@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.1.tgz#38635f94223f951422105e5fcb7f7ba767a3ee9f" + integrity sha512-02H6nFBNfNmFjMGZL6xcDi0r7tUhxrUP91FTFdoLyR94eIJDadPp4rpXfG7MVES873i1PReh4ep5pSCHbc3+Pg== + dependencies: + "@types/node" "^12.12.6" + web3-core "1.7.1" + web3-core-helpers "1.7.1" + web3-core-method "1.7.1" + web3-net "1.7.1" + web3-utils "1.7.1" + +web3-eth@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.5.2.tgz#0f6470df60a2a7d04df4423ca7721db8ed5ad72b" + integrity sha512-DwWQ6TCOUqvYyo7T20S7HpQDPveNHNqOn2Q2F3E8ZFyEjmqT4XsGiwvm08kB/VgQ4e/ANyq/i8PPFSYMT8JKHg== + dependencies: + web3-core "1.5.2" + web3-core-helpers "1.5.2" + web3-core-method "1.5.2" + web3-core-subscriptions "1.5.2" + web3-eth-abi "1.5.2" + web3-eth-accounts "1.5.2" + web3-eth-contract "1.5.2" + web3-eth-ens "1.5.2" + web3-eth-iban "1.5.2" + web3-eth-personal "1.5.2" + web3-net "1.5.2" + web3-utils "1.5.2" + +web3-eth@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.1.tgz#721599865f675b43877f5a18babfb7ae087449f7" + integrity sha512-Uz3gO4CjTJ+hMyJZAd2eiv2Ur1uurpN7sTMATWKXYR/SgG+SZgncnk/9d8t23hyu4lyi2GiVL1AqVqptpRElxg== + dependencies: + web3-core "1.7.1" + web3-core-helpers "1.7.1" + web3-core-method "1.7.1" + web3-core-subscriptions "1.7.1" + web3-eth-abi "1.7.1" + web3-eth-accounts "1.7.1" + web3-eth-contract "1.7.1" + web3-eth-ens "1.7.1" + web3-eth-iban "1.7.1" + web3-eth-personal "1.7.1" + web3-net "1.7.1" + web3-utils "1.7.1" + +web3-net@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.5.2.tgz#58915d7e2dad025d2a08f02c865f3abe61c48eff" + integrity sha512-VEc9c+jfoERhbJIxnx0VPlQDot8Lm4JW/tOWFU+ekHgIiu2zFKj5YxhURIth7RAbsaRsqCb79aE+M0eI8maxVQ== + dependencies: + web3-core "1.5.2" + web3-core-method "1.5.2" + web3-utils "1.5.2" + +web3-net@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.1.tgz#c75ff7ccabb949cf15e9098505516eb1ed8e37de" + integrity sha512-8yPNp2gvjInWnU7DCoj4pIPNhxzUjrxKlODsyyXF8j0q3Z2VZuQp+c63gL++r2Prg4fS8t141/HcJw4aMu5sVA== + dependencies: + web3-core "1.7.1" + web3-core-method "1.7.1" + web3-utils "1.7.1" + +web3-provider-engine@16.0.1: + version "16.0.1" + resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-16.0.1.tgz#2600a39ede364cdc0a1fc773bf40a94f2177e605" + integrity sha512-/Eglt2aocXMBiDj7Se/lyZnNDaHBaoJlaUfbP5HkLJQC/HlGbR+3/W+dINirlJDhh7b54DzgykqY7ksaU5QgTg== + dependencies: + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^4.4.2" + eth-json-rpc-filters "^4.2.1" + eth-json-rpc-infura "^5.1.0" + eth-json-rpc-middleware "^6.0.0" + eth-rpc-errors "^3.0.0" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.2.2" + ethereumjs-tx "^1.2.0" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + +web3-providers-http@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.5.2.tgz#94f95fe5572ca54aa2c2ffd42c63956436c9eb0a" + integrity sha512-dUNFJc9IMYDLZnkoQX3H4ZjvHjGO6VRVCqrBrdh84wPX/0da9dOA7DwIWnG0Gv3n9ybWwu5JHQxK4MNQ444lyA== + dependencies: + web3-core-helpers "1.5.2" + xhr2-cookies "1.1.0" + +web3-providers-http@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.1.tgz#3e00e013f013766aade28da29247daa1a937e759" + integrity sha512-dmiO6G4dgAa3yv+2VD5TduKNckgfR97VI9YKXVleWdcpBoKXe2jofhdvtafd42fpIoaKiYsErxQNcOC5gI/7Vg== + dependencies: + web3-core-helpers "1.7.1" + xhr2-cookies "1.1.0" + +web3-providers-ipc@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.5.2.tgz#68a516883c998eeddf60df4cead77baca4fb4aaa" + integrity sha512-SJC4Sivt4g9LHKlRy7cs1jkJgp7bjrQeUndE6BKs0zNALKguxu6QYnzbmuHCTFW85GfMDjhvi24jyyZHMnBNXQ== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.5.2" + +web3-providers-ipc@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.1.tgz#cde879a2ba57b1deac2e1030de90d185b793dd50" + integrity sha512-uNgLIFynwnd5M9ZC0lBvRQU5iLtU75hgaPpc7ZYYR+kjSk2jr2BkEAQhFVJ8dlqisrVmmqoAPXOEU0flYZZgNQ== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.7.1" + +web3-providers-ws@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.5.2.tgz#d336a93ed608b40cdcadfadd1f1bc8d32ea046e0" + integrity sha512-xy9RGlyO8MbJDuKv2vAMDkg+en+OvXG0CGTCM2BTl6l1vIdHpCa+6A/9KV2rK8aU9OBZ7/Pf+Y19517kHVl9RA== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.5.2" + websocket "^1.0.32" + +web3-providers-ws@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.1.tgz#b6b3919ce155eff29b21bc3f205a098299a8c1b2" + integrity sha512-Uj0n5hdrh0ESkMnTQBsEUS2u6Unqdc7Pe4Zl+iZFb7Yn9cIGsPJBl7/YOP4137EtD5ueXAv+MKwzcelpVhFiFg== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.7.1" + websocket "^1.0.32" + +web3-shh@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.5.2.tgz#a72a3d903c0708a004db94a72d934a302d880aea" + integrity sha512-wOxOcYt4Sa0AHAI8gG7RulCwVuVjSRS/M/AbFsea3XfJdN6sU13/syY7OdZNjNYuKjYTzxKYrd3dU/K2iqffVw== + dependencies: + web3-core "1.5.2" + web3-core-method "1.5.2" + web3-core-subscriptions "1.5.2" + web3-net "1.5.2" + +web3-shh@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.1.tgz#c6a0fc67321dd585085e3e3be8f2c1c8d61636ef" + integrity sha512-NO+jpEjo8kYX6c7GiaAm57Sx93PLYkWYUCWlZmUOW7URdUcux8VVluvTWklGPvdM9H1WfDrol91DjuSW+ykyqg== + dependencies: + web3-core "1.7.1" + web3-core-method "1.7.1" + web3-core-subscriptions "1.7.1" + web3-net "1.7.1" + +web3-utils@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.5.2.tgz#150982dcb1918ffc54eba87528e28f009ebc03aa" + integrity sha512-quTtTeQJHYSxAwIBOCGEcQtqdVcFWX6mCFNoqnp+mRbq+Hxbs8CGgO/6oqfBx4OvxIOfCpgJWYVHswRXnbEu9Q== + dependencies: + bn.js "^4.11.9" + eth-lib "0.2.8" + ethereum-bloom-filters "^1.0.6" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +web3-utils@1.7.1, web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.1.tgz#77d8bacaf426c66027d8aa4864d77f0ed211aacd" + integrity sha512-fef0EsqMGJUgiHPdX+KN9okVWshbIumyJPmR+btnD1HgvoXijKEkuKBv0OmUqjbeqmLKP2/N9EiXKJel5+E1Dw== + dependencies: + bn.js "^4.11.9" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +web3@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.5.2.tgz#736ca2f39048c63964203dd811f519400973e78d" + integrity sha512-aapKLdO8t7Cos6tZLeeQUtCJvTiPMlLcHsHHDLSBZ/VaJEucSTxzun32M8sp3BmF4waDEmhY+iyUM1BKvtAcVQ== + dependencies: + web3-bzz "1.5.2" + web3-core "1.5.2" + web3-eth "1.5.2" + web3-eth-personal "1.5.2" + web3-net "1.5.2" + web3-shh "1.5.2" + web3-utils "1.5.2" + +web3@^1.5.2: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.1.tgz#4d01371a2c0c07dba089f8009dabd2b11821c5e8" + integrity sha512-RKVdyZ5FuVEykj62C1o2tc0teJciSOh61jpVB9yb344dBHO3ZV4XPPP24s/PPqIMXmVFN00g2GD9M/v1SoHO/A== + dependencies: + web3-bzz "1.7.1" + web3-core "1.7.1" + web3-eth "1.7.1" + web3-eth-personal "1.7.1" + web3-net "1.7.1" + web3-shh "1.7.1" + web3-utils "1.7.1" + +webidl-conversions@^3.0.0, webidl-conversions@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +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-bundle-analyzer@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz#f6f94db108fb574e415ad313de41a2707d33ef3c" + integrity sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.19" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-dev-middleware@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-hot-middleware@^2.25.0: + version "2.25.0" + resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz#4528a0a63ec37f8f8ef565cf9e534d57d09fe706" + integrity sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA== + dependencies: + ansi-html "0.0.7" + html-entities "^1.2.0" + querystring "^0.2.0" + strip-ansi "^3.0.0" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-node-externals@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-2.5.2.tgz#178e017a24fec6015bc9e672c77958a6afac861d" + integrity sha512-aHdl/y2N7PW2Sx7K+r3AxpJO+aDMcYzMQd60Qxefq3+EwhewSbTBqNumOsCE1JsCUNoyfGj5465N0sSf6hc/5w== + +webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + 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.2: + version "4.44.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" + integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== + 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.3.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" + +webpackbar@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-4.0.0.tgz#ee7a87f16077505b5720551af413c8ecd5b1f780" + integrity sha512-k1qRoSL/3BVuINzngj09nIwreD8wxV4grcuhHTD8VJgUbGcy8lQSPqv+bM00B7F+PffwIsQ8ISd4mIwRbr23eQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + consola "^2.10.0" + figures "^3.0.0" + pretty-time "^1.1.0" + std-env "^2.2.1" + text-table "^0.2.0" + wrap-ansi "^6.0.0" + +"websnark@git+https://github.com/tornadocash/websnark.git#4c0af6a8b65aabea3c09f377f63c44e7a58afa6d": + version "0.0.4" + resolved "git+https://github.com/tornadocash/websnark.git#4c0af6a8b65aabea3c09f377f63c44e7a58afa6d" + dependencies: + big-integer "^1.6.42" + +websocket@^1.0.32: + version "1.0.34" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" + integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== + dependencies: + bufferutil "^4.0.1" + debug "^2.2.0" + es5-ext "^0.10.50" + typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" + yaeti "^0.0.6" + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-2.0.1.tgz#5396b2043f020ee6f704d9c45ea8519e724de659" + integrity sha1-U5ayBD8CDub3BNnEXqhRnnJN5lk= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + 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-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +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@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +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" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +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" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.0.0, wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^2.0.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-json-file@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" + integrity sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8= + dependencies: + detect-indent "^5.0.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + pify "^3.0.0" + sort-keys "^2.0.0" + write-file-atomic "^2.0.0" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== + +ws@^3.0.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +ws@^5.1.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== + dependencies: + async-limiter "~1.0.0" + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +ws@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xhr-request-promise@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" + integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== + dependencies: + xhr-request "^1.1.0" + +xhr-request@^1.0.1, xhr-request@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" + integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== + dependencies: + buffer-to-arraybuffer "^0.0.5" + object-assign "^4.1.1" + query-string "^5.0.1" + simple-get "^2.7.0" + timed-out "^4.0.1" + url-set-query "^1.0.0" + xhr "^2.0.4" + +xhr2-cookies@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" + integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= + dependencies: + cookiejar "^2.1.1" + +xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== + dependencies: + global "~4.4.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +"xml-name-validator@>= 2.0.1 < 3.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmldom@^0.1.22: + version "0.1.31" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== + +xmlhttprequest@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, 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== + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= + dependencies: + object-keys "~0.4.0" + +xxhashjs@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" + integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== + dependencies: + cuint "^0.2.2" + +y18n@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + +"y18n@^3.2.1 || ^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== + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yallist@^3.1.1: + 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== + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" + integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ= + dependencies: + camelcase "^3.0.0" + lodash.assign "^4.0.6" + +yargs@^12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + +yargs@^13.2.4: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + +yargs@^4.7.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" + integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA= + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + lodash.assign "^4.0.3" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.1" + which-module "^1.0.0" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^2.4.1" + +zen-observable@^0.8.14: + version "0.8.15" + resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== + +zip-local@^0.3.4: + version "0.3.4" + resolved "https://registry.npmjs.org/zip-local/-/zip-local-0.3.4.tgz#e2931907257a946479ea5bd0d0e20adfeb2b5a07" + integrity sha1-4pMZByV6lGR56lvQ0OIK3+srWgc= + dependencies: + async "^1.4.2" + graceful-fs "^4.1.3" + jszip "^2.5.0" + q "^1.4.1"