├── .flake8 ├── .dockerignore ├── .isort.cfg ├── docker ├── confd │ ├── toml │ │ ├── witness_monitor.toml │ │ └── update_price_feed.toml │ └── templates │ │ ├── witness_monitor.yml.tmpl │ │ └── update_price_feed.yml.tmpl └── docker-entrypoint.sh ├── witness_monitor.yml.exmaple ├── pyproject.toml ├── Dockerfile ├── LICENSE ├── .gitignore ├── update_price_feed.yml.example ├── witness_monitor.py ├── docker-compose.yml.example ├── README.md ├── .pre-commit-config.yaml ├── update_price_feed.py ├── PRICEFEED.md ├── WITNESS_MONITOR.md └── poetry.lock /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | max-line-length = 120 3 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | venv/ 3 | update_price_feed.yml 4 | -------------------------------------------------------------------------------- /.isort.cfg: -------------------------------------------------------------------------------- 1 | [settings] 2 | multi_line_output=3 3 | include_trailing_comma=True 4 | line_length=120 5 | known_third_party = golosscripts,yaml 6 | -------------------------------------------------------------------------------- /docker/confd/toml/witness_monitor.toml: -------------------------------------------------------------------------------- 1 | [template] 2 | src = "witness_monitor.yml.tmpl" 3 | dest = "/opt/golos-witness-tools/witness_monitor.yml" 4 | -------------------------------------------------------------------------------- /docker/confd/toml/update_price_feed.toml: -------------------------------------------------------------------------------- 1 | [template] 2 | src = "update_price_feed.yml.tmpl" 3 | dest = "/opt/golos-witness-tools/update_price_feed.yml" 4 | -------------------------------------------------------------------------------- /docker/confd/templates/witness_monitor.yml.tmpl: -------------------------------------------------------------------------------- 1 | node: {{ getenv "node" }} 2 | witness: {{ getenv "witness" }} 3 | keys: 4 | - {{ getenv "key" }} 5 | 6 | # witness signing key for this node 7 | witness_pubkey: {{ getenv "witness_pubkey" }} 8 | 9 | # time in seconds to observe misses; witness key switch will happen whether 10 | # there are more misses than allowed_misses per miss_window 11 | miss_window: {{ getenv "miss_window" }} 12 | 13 | # number of missed blocks to allow without switching 14 | allowed_misses: {{ getenv "allowed_misses" }} 15 | -------------------------------------------------------------------------------- /witness_monitor.yml.exmaple: -------------------------------------------------------------------------------- 1 | node: 2 | - ws://localhost:8091 3 | 4 | # witness to monitor 5 | witness: foo 6 | 7 | # witness signing key for this node 8 | witness_pubkey: GLS4fdfdfdfdfdfdfd 9 | 10 | # active key for a witness account to sending transactions 11 | keys: 12 | - 5Hfdfdfffgfghfhgffg 13 | 14 | # time in seconds to observe misses; witness key switch will happen whether 15 | # there are more misses than allowed_misses per miss_window 16 | miss_window: 3600 17 | 18 | # number of missed blocks to allow without switching 19 | allowed_misses: 1 20 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "golos-witness-tools" 3 | version = "0.3.0" 4 | description = "Scripts for Golos witnesses" 5 | authors = ["Vladimir Kamarzin "] 6 | license = "MIT" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.8" 10 | golosscripts = "^1" 11 | 12 | [tool.poetry.dev-dependencies] 13 | pre-commit = "^2.3.0" 14 | 15 | [tool.black] 16 | line-length = 120 17 | skip-string-normalization = true 18 | include = '\.pyi?$' 19 | exclude = ''' 20 | /( 21 | \.git 22 | | \.tox 23 | | \.venv 24 | | _build 25 | | buck-out 26 | | build 27 | | dist 28 | )/ 29 | ''' 30 | [build-system] 31 | requires = ["poetry>=0.12"] 32 | build-backend = "poetry.masonry.api" 33 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.8 2 | 3 | ENV INSTALLDIR /opt/golos-witness-tools 4 | 5 | COPY pyproject.toml poetry.lock $INSTALLDIR/ 6 | 7 | WORKDIR $INSTALLDIR 8 | 9 | ENV CONFD_VERSION 0.13.0 10 | ADD https://github.com/kelseyhightower/confd/releases/download/v$CONFD_VERSION/confd-$CONFD_VERSION-linux-amd64 /usr/local/bin/confd 11 | RUN chmod +x /usr/local/bin/confd 12 | 13 | RUN set -xe ;\ 14 | curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python ;\ 15 | . $HOME/.poetry/env ;\ 16 | poetry export -f requirements.txt > requirements.txt ;\ 17 | pip install -r requirements.txt 18 | 19 | COPY docker/docker-entrypoint.sh /usr/local/bin 20 | COPY docker/confd/templates/* /etc/confd/templates/ 21 | COPY docker/confd/toml/* /etc/confd/conf.d/ 22 | COPY *.py $INSTALLDIR/ 23 | 24 | 25 | ENTRYPOINT ["docker-entrypoint.sh"] 26 | -------------------------------------------------------------------------------- /docker/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -e 2 | 3 | render_templates() 4 | { 5 | confd -onetime -backend env 6 | } 7 | 8 | # default common settings 9 | export node="${NODE:-ws://golos:8091}" 10 | export witness="${WITNESS:-foo}" 11 | export key="${KEY:-key}" 12 | 13 | # settings for update_price_feed.py 14 | export price_source="${SOURCE:-graphene}" 15 | export node_gph="${NODE_GPH:-" 16 | - wss://node.gph.ai 17 | - wss://node.hk.graphene.fans 18 | " 19 | }" 20 | export markets="${MARKETS:-" 21 | - RUDEX.GOLOS/GPH 22 | - RUDEX.GOLOS/RUDEX.BTC 23 | - RUDEX.GOLOS/RUDEX.USDT" 24 | }" 25 | export metric="${METRIC:-weighted_average}" 26 | export depth_pct="${DEPTH_PCT:-20}" 27 | export interval="${INTERVAL:-3600}" 28 | export max_age="${MAX_AGE:-86400}" 29 | export threshold_pct="${THRESHOLD_PCT:-10}" 30 | export k="${K:-1}" 31 | 32 | # settings for witness_monitor.py 33 | export witness_pubkey="$WITNESS_PUBKEY" 34 | export miss_window="${MISS_WINDOW:-3600}" 35 | export allowed_misses="${ALLOWED_MISSES:-1}" 36 | 37 | render_templates 38 | exec "$@" 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Vladimir Kamarzin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/* 2 | 3 | # Byte-compiled / optimized / DLL files 4 | __pycache__/ 5 | *.py[cod] 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | env/ 13 | build/ 14 | _build/ 15 | develop-eggs/ 16 | dist/ 17 | downloads/ 18 | eggs/ 19 | lib/ 20 | lib64/ 21 | parts/ 22 | sdist/ 23 | var/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | *.eggs 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | !app.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .coverage 44 | .cache 45 | nosetests.xml 46 | coverage.xml 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | 55 | # Sphinx documentation 56 | docs/_build/ 57 | docs/html 58 | 59 | # Autogenerated reference 60 | docs/reference 61 | 62 | # PyBuilder 63 | target/ 64 | 65 | # Vim temp files 66 | *.swp 67 | 68 | # script data 69 | data_*.json 70 | .env 71 | 72 | # mypy 73 | .mypy_cache/ 74 | 75 | *.sqlite 76 | venv/ 77 | *~ 78 | 79 | # configs 80 | *.yml 81 | *.yaml 82 | -------------------------------------------------------------------------------- /update_price_feed.yml.example: -------------------------------------------------------------------------------- 1 | #node: 'wss://api.golos.cf' 2 | node: 3 | - ws://localhost:8091 4 | witness: foo 5 | keys: 6 | - WIF_PRIVATE_KEY 7 | 8 | # specify price source here 9 | # supported sources are: graphene, kuna 10 | source: graphene 11 | 12 | # graphene nodes to use 13 | node_gph: 14 | - wss://node.gph.ai 15 | - wss://node.hk.graphene.fans 16 | 17 | # what markets should be used for price measurements 18 | markets: 19 | - RUDEX.GOLOS/GPH 20 | - RUDEX.GOLOS/RUDEX.BTC 21 | - RUDEX.GOLOS/RUDEX.USDT 22 | 23 | # When several markets used, how to calculate resulting price 24 | # Supported metrics are: 25 | # - median: use median price across markets 26 | # - mean: use simple averaged price 27 | # - weighted_average: markets with more volume has higher influence 28 | metric: weighted_average 29 | 30 | # Volume is measured looking into orderbook liquidity. This setting determine how deeply orderbooks should be measured 31 | depth_pct: 20 32 | 33 | # how often calculate price 34 | interval: 3600 35 | 36 | # force update price if previous price expired 37 | max_age: 86400 38 | 39 | # update price only if difference between old and current price more than threshold, percentage 40 | threshold_pct: 10 41 | 42 | # price correction coefficient (default: don't touch automatic price) 43 | k: 1 44 | -------------------------------------------------------------------------------- /docker/confd/templates/update_price_feed.yml.tmpl: -------------------------------------------------------------------------------- 1 | node: {{ getenv "node" }} 2 | witness: {{ getenv "witness" }} 3 | keys: 4 | - {{ getenv "key" }} 5 | 6 | # specify price source here 7 | # supported sources are: cmc, graphene 8 | source: {{ getenv "price_source" }} 9 | 10 | # graphene nodes to use 11 | node_gph: {{ getenv "node_gph" }} 12 | 13 | # what markets should be used for price measurements 14 | markets: {{ getenv "markets" }} 15 | 16 | # When several markets used, how to calculate resulting price 17 | # Supported metrics are: 18 | # - median: use median price across markets 19 | # - mean: use simple averaged price 20 | # - weighted_average: markets with more volume has higher influence 21 | metric: {{ getenv "metric" }} 22 | 23 | # Volume is measured looking into orderbook liquidity. This setting determine how deeply orderbooks should be measured 24 | depth_pct: {{ getenv "depth_pct" }} 25 | 26 | # how often calculate price 27 | interval: {{ getenv "interval" }} 28 | 29 | # force update price if previous price expired 30 | max_age: {{ getenv "max_age" }} 31 | 32 | # update price only if difference between old and current price more than threshold 33 | threshold_pct: {{ getenv "threshold_pct" }} 34 | 35 | # price correction coefficient (default: don't touch automatic price) 36 | k: {{ getenv "k" }} 37 | -------------------------------------------------------------------------------- /witness_monitor.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import argparse 4 | import logging 5 | import sys 6 | 7 | import yaml 8 | from golosscripts.monitor import Monitor 9 | 10 | log = logging.getLogger('golosscripts') 11 | 12 | 13 | def main(): 14 | 15 | parser = argparse.ArgumentParser( 16 | description='Monitor missed blocks for specified witness and switch key on misses', 17 | epilog='Report bugs to: https://github.com/bitfag/golos-witness-tools/issues', 18 | ) 19 | parser.add_argument('-d', '--debug', action='store_true', help='enable debug output'), 20 | parser.add_argument('-c', '--config', default='./witness_monitor.yml', help='specify custom path for config file') 21 | args = parser.parse_args() 22 | 23 | # create logger 24 | if args.debug is True: 25 | log.setLevel(logging.DEBUG) 26 | else: 27 | log.setLevel(logging.INFO) 28 | handler = logging.StreamHandler() 29 | formatter = logging.Formatter("%(asctime)s %(levelname)s: %(message)s") 30 | handler.setFormatter(formatter) 31 | log.addHandler(handler) 32 | 33 | # parse config 34 | with open(args.config, 'r') as ymlfile: 35 | conf = yaml.safe_load(ymlfile) 36 | 37 | monitor = Monitor(**conf) 38 | monitor.run_forever() 39 | 40 | return 0 41 | 42 | 43 | if __name__ == '__main__': 44 | sys.exit(main()) 45 | -------------------------------------------------------------------------------- /docker-compose.yml.example: -------------------------------------------------------------------------------- 1 | version: "2.2" 2 | services: 3 | golos: 4 | image: golos-0.17.0-lowmem:latest 5 | #environment: 6 | # STEEMD_EXTRA_OPTS: --replay 7 | ports: 8 | - "2001:2001" 9 | - "8090:8090" 10 | - "8091:8091" 11 | volumes: 12 | - "/dev/shm:/shm" 13 | - "/srv/golos:/var/lib/golosd" 14 | - "./config.ini:/etc/golosd/config.ini" 15 | 16 | pricefeed: 17 | environment: 18 | NODE: ws://golos:8091 19 | WITNESS: foo 20 | KEY: PRIVATE-ACTIVE-KEY 21 | SOURCE: graphene 22 | NODE_GPH: "\n 23 | - wss://node.gph.ai\n 24 | - wss://node.hk.graphene.fans\n 25 | " 26 | MARKETS: "\n 27 | - RUDEX.GOLOS/GPH\n 28 | - RUDEX.GOLOS/RUDEX.BTC\n 29 | - RUDEX.GOLOS/RUDEX.USDT" 30 | METRIC: weighted_average 31 | K: 1 32 | DEPTH_PCT: 20 33 | THRESHOLD_PCT: 15 34 | image: vvk123/golos-witness-tools 35 | depends_on: 36 | - golos 37 | command: ./update_price_feed.py --monitor 38 | 39 | monitor: 40 | environment: 41 | NODE: ws://golos:8091 42 | WITNESS: foo 43 | KEY: PRIVATE-ACTIVE-KEY 44 | WITNESS_PUBKEY: SIGNING-KEY-FOR-THIS-NODE 45 | MISS_WINDOW: 3600 46 | ALLOWED_MISSES: 1 47 | image: vvk123/golos-witness-tools 48 | command: ./witness_monitor.py 49 | depends_on: 50 | - golos 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | golos-witness-tools 2 | =================== 3 | 4 | This is a set of scripts for golos blockchain witness operators. 5 | 6 | Scripts 7 | ------- 8 | 9 | * [**update\_price\_feed.py**](PRICEFEED.md): script to update GBG/GOLOS price feed in golos blockchain 10 | * [**witness_monitor.py**](WITNESS_MONITOR.md): script to monitor block misses and autoswitch nodes 11 | 12 | Requirements 13 | ------------ 14 | 15 | * golos node 0.22+ 16 | 17 | Installation via poetry 18 | ----------------------- 19 | 20 | 1. Install [poetry](https://python-poetry.org/docs/) 21 | 2. Run `poetry install` to install the dependencies 22 | 3. Copy `common.yml.example` to `common.yml` and change variables according to your needs 23 | 4. Now you're ready to run scripts: 24 | 25 | 26 | ``` 27 | poetry shell 28 | ./script.py 29 | ``` 30 | 31 | Running scripts in docker 32 | ------------------------- 33 | 34 | Plain docker example: 35 | 36 | ``` 37 | docker run -it --rm vvk123/golos-witness-tools:latest ./update_price_feed.py --dry-run 38 | ``` 39 | 40 | docker-compose: 41 | 42 | * copy [docker-compose.yml.example](docker-compose.yml.example) to docker-compose.yml 43 | * adjust environment variables in docker-compose.yml. Look for all env vars in `docker-entrypoint.sh` 44 | 45 | ``` 46 | docker-compose up -d 47 | ``` 48 | 49 | To manually build docker image: 50 | 51 | ``` 52 | docker build -t vvk123/golos-witness-tools:latest . 53 | ``` 54 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | # Read up on pre-commit 2 | # https://ljvmiranda921.github.io/notebook/2018/06/21/precommits-using-black-and-flake8/ 3 | 4 | repos: 5 | 6 | - repo: https://github.com/pre-commit/pre-commit-hooks 7 | rev: v2.5.0 8 | hooks: 9 | - id: trailing-whitespace 10 | - id: end-of-file-fixer 11 | - id: check-docstring-first 12 | - id: check-executables-have-shebangs 13 | - id: check-json 14 | - id: check-yaml 15 | - id: check-toml 16 | - id: debug-statements 17 | - id: check-merge-conflict 18 | 19 | - repo: https://github.com/ambv/black 20 | rev: 19.10b0 21 | hooks: 22 | - id: black 23 | language_version: python3 24 | 25 | - repo: https://github.com/myint/docformatter 26 | rev: v1.3.1 27 | hooks: 28 | - id: docformatter 29 | args: [ 30 | -i, 31 | --wrap-summaries=120, 32 | --wrap-descriptions=120, 33 | --pre-summary-newline, 34 | ] 35 | 36 | - repo: https://github.com/humitos/mirrors-autoflake 37 | rev: v1.1 38 | hooks: 39 | - id: autoflake 40 | args: ['--in-place', '--remove-all-unused-imports', '--remove-unused-variable'] 41 | 42 | - repo: https://github.com/asottile/seed-isort-config 43 | rev: v2.1.1 44 | hooks: 45 | - id: seed-isort-config 46 | 47 | - repo: https://github.com/timothycrosley/isort 48 | rev: 4.3.21 49 | hooks: 50 | - id: isort 51 | 52 | - repo: https://gitlab.com/pycqa/flake8 53 | rev: 3.7.9 54 | hooks: 55 | - id: flake8 56 | additional_dependencies: [ 57 | 'pep8-naming', 58 | 'flake8-comprehensions', 59 | 'flake8-bugbear', 60 | 'flake8-pytest-style', 61 | 'flake8-variables-names', 62 | 'flake8-class-attributes-order', 63 | 'dlint', 64 | ] 65 | 66 | - repo: https://github.com/pre-commit/mirrors-mypy 67 | rev: v0.770 68 | hooks: 69 | - id: mypy 70 | args: [--ignore-missing-imports, --check-untyped-defs, --disallow-incomplete-defs] 71 | -------------------------------------------------------------------------------- /update_price_feed.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import argparse 4 | import asyncio 5 | import logging 6 | import sys 7 | 8 | import yaml 9 | from golosscripts.feed import FeedUpdater 10 | 11 | log = logging.getLogger('golosscripts') 12 | 13 | 14 | def main(): 15 | 16 | parser = argparse.ArgumentParser( 17 | description='golos price feed updater', 18 | epilog='Report bugs to https://github.com/bitfag/golos-witness-tools/issues', 19 | ) 20 | parser.add_argument('-c', '--config', default='./update_price_feed.yml', help='specify custom path for config file') 21 | parser.add_argument( 22 | '-m', '--monitor', action='store_true', help='run in continuous mode and update price periodically' 23 | ) 24 | 25 | publish_args = parser.add_mutually_exclusive_group() 26 | publish_args.add_argument( 27 | '-n', '--dry-run', action='store_true', help='calculate prices but do not send transaction to golos network' 28 | ) 29 | publish_args.add_argument('-f', '--force', action='store_true', help='force update price feed') 30 | 31 | verbosity_args = parser.add_mutually_exclusive_group() 32 | verbosity_args.add_argument( 33 | '-q', 34 | '--quiet', 35 | action='store_true', 36 | help='do not show any output except errors, just silently update price feed', 37 | ), 38 | verbosity_args.add_argument('-d', '--debug', action='store_true', help='enable debug output'), 39 | args = parser.parse_args() 40 | 41 | # create logger 42 | if args.quiet: 43 | log.setLevel(logging.ERROR) 44 | elif args.debug: 45 | log.setLevel(logging.DEBUG) 46 | else: 47 | log.setLevel(logging.INFO) 48 | handler = logging.StreamHandler() 49 | formatter = logging.Formatter("%(asctime)s %(levelname)s: %(message)s") 50 | handler.setFormatter(formatter) 51 | log.addHandler(handler) 52 | 53 | # parse config 54 | with open(args.config, 'r') as ymlfile: 55 | conf = yaml.safe_load(ymlfile) 56 | 57 | feed_updater = FeedUpdater(**conf) 58 | 59 | if args.monitor: 60 | asyncio.run(feed_updater.run_forever()) 61 | else: 62 | asyncio.run(feed_updater.publish_price()) 63 | 64 | return 0 65 | 66 | 67 | if __name__ == '__main__': 68 | sys.exit(main()) 69 | -------------------------------------------------------------------------------- /PRICEFEED.md: -------------------------------------------------------------------------------- 1 | update\_price\_feed.py 2 | ====================== 3 | 4 | Script to update GBG/GOLOS price feed in golos blockchain. 5 | 6 | No `cli_wallet` required! 7 | 8 | Configuration 9 | ------------- 10 | 11 | First, you need to configure script by modifying configuration template. Let's create a config: 12 | 13 | `cp update_price_feed.yml.example update_price_feed.yml` 14 | 15 | Then, you need to change at least these parameters: 16 | 17 | * **node** - golos node to connect 18 | * **witness** - your witness 19 | * **keys** - private active key of your witness 20 | 21 | Modes 22 | ----- 23 | 24 | This scripts can be used in several modes: 25 | 26 | * Dry-run mode: `./update_price_feed.py --dry-run` will perform price calculations, but no transactions will be sent 27 | * One-time run, just launch `./update_price_feed.py` without arguments and it will update price feed and exit. 28 | * Continuous mode. `./update_price_feed.py --monitor` will start script and it will continue working in infinite loop mode 29 | performing periodical price recalculations and updates. 30 | 31 | Cron friendly 32 | ------------- 33 | 34 | You may wish to run this script on "host system" without any virtualization just from cron without any output. 35 | Example: 36 | 37 | ``` 38 | 01 * * * * cd /opt/golos-witness-tools/ && ./venv/bin/python update_price_feed.py --quiet 39 | ``` 40 | 41 | Docker friendly 42 | --------------- 43 | 44 | Example exec in plain docker: 45 | 46 | ``` 47 | docker run -it --rm -e WITNESS=foo -e KEY=WIF_PRIVKEY vvk123/golos-witness-tools:latest ./update_price_feed.py --dry-run 48 | ``` 49 | 50 | Or use docker-compose.yml.example for **docker-compose(1)**. 51 | 52 | How it works 53 | ------------ 54 | 55 | 1 GBG price should be equal to price of 1 mg gold. 56 | 1 GBG is a backed asset of GOLOS blockchain. Blockchain may buy your GBG for GOLOS threating 1 GBG price as price of 1 57 | mg gold. 58 | 59 | To calculate GBG/GOLOS price, we need following variables: 60 | 61 | * price of 1 mg of gold. Script tries to get USD/gold price from goldprice.org. In case of failure, Russian Central Bank 62 | price is used. The price provided by Russian Central Bank is in RUB, so we're recalculating it to USD/gold. 63 | * price USD/BTC. We need this price because GOLOS is exchanged to BTC and not to USD directly. We use coinmarketcap.org 64 | as primary source and some exchanges as a backup source. 65 | * price BTC/GOLOS. Again, we're using coinmarketcap.org as a primary source and bittrex as a backup. 66 | 67 | 68 | Multiple instances 69 | ------------------ 70 | 71 | To keep your published feed always up-to-date, you may run `update_price_feed.py` from multiple machines. Multiple 72 | instances will not conflict with each other because script performs price comparison with previously published price. 73 | 74 | -------------------------------------------------------------------------------- /WITNESS_MONITOR.md: -------------------------------------------------------------------------------- 1 | witness\_monitor.py 2 | =================== 3 | 4 | This script is intended to run as a docker container to perform monitoring of missed blocks and automatically switch witness to the current node whether misses are detected. 5 | 6 | Building a redundant witness infrastructure 7 | ------------------------------------------- 8 | 9 | To achieve witness redundancy you need at least 2 nodes (but you can set up 3 or more). 10 | 11 | On the each node you need to configure the same witness but private keys should be different. 12 | 13 | node1: 14 | 15 | ``` 16 | witness = "foo" 17 | private-key = key1 18 | ``` 19 | 20 | node2: 21 | 22 | ``` 23 | witness = "foo" 24 | private-key = key2 25 | ``` 26 | 27 | node3: 28 | 29 | ``` 30 | witness = "foo" 31 | private-key = key3 32 | ``` 33 | 34 | **Note**: to generate keys, you can use [generate\_keypair.py](https://github.com/bitfag/golos-scripts) script. 35 | 36 | **Never use the same key on different nodes! This will lead to a double-production and chain forks!** 37 | 38 | So, having such configuration, you can always choose which node should actually produce blocks. 39 | 40 | Imagine your current active signing node is down. So, you just need to update witness to change the signing\_key. This can be done by using `witness_update()` API call directly, or using script `update_witness.py` from **golos-scripts**. 41 | 42 | Automating switching from failed node to a working one 43 | ====================================================== 44 | 45 | To automate process of switching signing keys, you can use `witness_monitor.py`. 46 | 47 | How it works 48 | ------------ 49 | 50 | At every 30 seconds the script checks current `total_missed` counter. 51 | 52 | There are 2 tunable parameters: 53 | 54 | * `miss_window` 55 | * `allowed_misses` 56 | 57 | The logic is simple: switch is happening whether there are more misses detected than `allowed_misses` per `miss_window`. 58 | 59 | For example, you can allow 2 misses per 1 hour. Whether script detects 3 misses per hour, it will switch signing key. 60 | 61 | Example configuration 62 | --------------------- 63 | 64 | To achieve working configuration, on each node you need: 65 | 66 | * golosd itself 67 | * price feed script 68 | * `witness_monitor.py` script 69 | 70 | Please look at the example [docker-compose.yml](docker-compose.yml.example) to see how all things are intended to work together. 71 | 72 | How it works with nodes > 2 73 | --------------------------- 74 | 75 | Whether you have more than 2 nodes, in case of current signing node failure, the `witness_monitor.py` on another nodes will detect misses and will perform the key switch. 76 | 77 | So, if `witness_monitor.py` configuration on the backup nodes is the same, every "backup" node will try to switch block production to itself. Because it will happen with some time difference, only the least node will actually take over. 78 | 79 | There are no explicit priorities and you cannot configure in which order your nodes should take over block production. But, actually you can simulate priorities by setting different value for an `allowed_misses` parameter. 80 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "aiodns" 3 | version = "2.0.0" 4 | description = "Simple DNS resolver for asyncio" 5 | category = "main" 6 | optional = false 7 | python-versions = "*" 8 | 9 | [package.dependencies] 10 | pycares = ">=3.0.0" 11 | 12 | [[package]] 13 | name = "aiohttp" 14 | version = "3.7.4.post0" 15 | description = "Async http client/server framework (asyncio)" 16 | category = "main" 17 | optional = false 18 | python-versions = ">=3.6" 19 | 20 | [package.dependencies] 21 | async-timeout = ">=3.0,<4.0" 22 | attrs = ">=17.3.0" 23 | chardet = ">=2.0,<5.0" 24 | multidict = ">=4.5,<7.0" 25 | typing-extensions = ">=3.6.5" 26 | yarl = ">=1.0,<2.0" 27 | 28 | [package.extras] 29 | speedups = ["aiodns", "brotlipy", "cchardet"] 30 | 31 | [[package]] 32 | name = "appdirs" 33 | version = "1.4.4" 34 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 35 | category = "main" 36 | optional = false 37 | python-versions = "*" 38 | 39 | [[package]] 40 | name = "async-timeout" 41 | version = "3.0.1" 42 | description = "Timeout context manager for asyncio programs" 43 | category = "main" 44 | optional = false 45 | python-versions = ">=3.5.3" 46 | 47 | [[package]] 48 | name = "asyncinit" 49 | version = "0.2.4" 50 | description = "Class decorator to enable async __init__" 51 | category = "main" 52 | optional = false 53 | python-versions = ">=3.5" 54 | 55 | [package.extras] 56 | dev = ["pylint (>=2.1,<3.0)", "pytest (>=3.6,<4.0)"] 57 | 58 | [[package]] 59 | name = "attrs" 60 | version = "21.2.0" 61 | description = "Classes Without Boilerplate" 62 | category = "main" 63 | optional = false 64 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 65 | 66 | [package.extras] 67 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] 68 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] 69 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] 70 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] 71 | 72 | [[package]] 73 | name = "bitshares" 74 | version = "0.5.1" 75 | description = "Python library for bitshares" 76 | category = "main" 77 | optional = false 78 | python-versions = "*" 79 | 80 | [package.dependencies] 81 | Events = "0.3" 82 | graphenelib = ">=1.1.16" 83 | websockets = "*" 84 | 85 | [[package]] 86 | name = "bitsharesscripts" 87 | version = "2.0.1" 88 | description = "A set of scripts for BitShares" 89 | category = "main" 90 | optional = false 91 | python-versions = ">=3.6.1,<4.0.0" 92 | 93 | [package.dependencies] 94 | bitshares = ">=0.5.0,<0.6.0" 95 | click = ">=7.1.1,<8.0.0" 96 | uptick = ">=0.2.4,<0.3.0" 97 | 98 | [[package]] 99 | name = "ccxt" 100 | version = "1.51.1" 101 | description = "A JavaScript / Python / PHP cryptocurrency trading library with support for 130+ exchanges" 102 | category = "main" 103 | optional = false 104 | python-versions = "*" 105 | 106 | [package.dependencies] 107 | aiodns = {version = ">=1.1.1,<2.1", markers = "python_version >= \"3.5.2\""} 108 | aiohttp = {version = ">=3.7.4,<3.8", markers = "python_version >= \"3.5.2\""} 109 | certifi = ">=2018.1.18" 110 | cryptography = ">=2.6.1" 111 | requests = ">=2.18.4" 112 | yarl = {version = "1.6.3", markers = "python_version >= \"3.5.2\""} 113 | 114 | [package.extras] 115 | doc = ["Sphinx (==1.7.0)"] 116 | qa = ["flake8 (==3.7.9)"] 117 | 118 | [[package]] 119 | name = "certifi" 120 | version = "2020.12.5" 121 | description = "Python package for providing Mozilla's CA Bundle." 122 | category = "main" 123 | optional = false 124 | python-versions = "*" 125 | 126 | [[package]] 127 | name = "cffi" 128 | version = "1.14.5" 129 | description = "Foreign Function Interface for Python calling C code." 130 | category = "main" 131 | optional = false 132 | python-versions = "*" 133 | 134 | [package.dependencies] 135 | pycparser = "*" 136 | 137 | [[package]] 138 | name = "cfgv" 139 | version = "3.3.0" 140 | description = "Validate configuration and produce human readable error messages." 141 | category = "dev" 142 | optional = false 143 | python-versions = ">=3.6.1" 144 | 145 | [[package]] 146 | name = "chardet" 147 | version = "4.0.0" 148 | description = "Universal encoding detector for Python 2 and 3" 149 | category = "main" 150 | optional = false 151 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 152 | 153 | [[package]] 154 | name = "click" 155 | version = "7.1.2" 156 | description = "Composable command line interface toolkit" 157 | category = "main" 158 | optional = false 159 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 160 | 161 | [[package]] 162 | name = "click-datetime" 163 | version = "0.2" 164 | description = "Datetime type support for click." 165 | category = "main" 166 | optional = false 167 | python-versions = "*" 168 | 169 | [package.dependencies] 170 | click = "*" 171 | 172 | [package.extras] 173 | dev = ["wheel"] 174 | 175 | [[package]] 176 | name = "cryptography" 177 | version = "3.4.7" 178 | description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." 179 | category = "main" 180 | optional = false 181 | python-versions = ">=3.6" 182 | 183 | [package.dependencies] 184 | cffi = ">=1.12" 185 | 186 | [package.extras] 187 | docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] 188 | docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] 189 | pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] 190 | sdist = ["setuptools-rust (>=0.11.4)"] 191 | ssh = ["bcrypt (>=3.1.5)"] 192 | test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] 193 | 194 | [[package]] 195 | name = "defusedxml" 196 | version = "0.6.0" 197 | description = "XML bomb protection for Python stdlib modules" 198 | category = "main" 199 | optional = false 200 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 201 | 202 | [[package]] 203 | name = "distlib" 204 | version = "0.3.2" 205 | description = "Distribution utilities" 206 | category = "dev" 207 | optional = false 208 | python-versions = "*" 209 | 210 | [[package]] 211 | name = "ecdsa" 212 | version = "0.13.3" 213 | description = "ECDSA cryptographic signature library (pure python)" 214 | category = "main" 215 | optional = false 216 | python-versions = "*" 217 | 218 | [[package]] 219 | name = "events" 220 | version = "0.3" 221 | description = "Bringing the elegance of C# EventHandler to Python" 222 | category = "main" 223 | optional = false 224 | python-versions = "*" 225 | 226 | [[package]] 227 | name = "expiringdict" 228 | version = "1.2.1" 229 | description = "Dictionary with auto-expiring values for caching purposes" 230 | category = "main" 231 | optional = false 232 | python-versions = "*" 233 | 234 | [package.extras] 235 | tests = ["dill", "coverage", "coveralls", "mock", "nose"] 236 | 237 | [[package]] 238 | name = "filelock" 239 | version = "3.0.12" 240 | description = "A platform independent file lock." 241 | category = "dev" 242 | optional = false 243 | python-versions = "*" 244 | 245 | [[package]] 246 | name = "funcy" 247 | version = "1.16" 248 | description = "A fancy and practical functional tools" 249 | category = "main" 250 | optional = false 251 | python-versions = "*" 252 | 253 | [[package]] 254 | name = "golosscripts" 255 | version = "1.0.0" 256 | description = "Scripts for Golos blockchain" 257 | category = "main" 258 | optional = false 259 | python-versions = ">=3.8,<4.0" 260 | 261 | [package.dependencies] 262 | bitshares = ">=0.5.1,<0.6.0" 263 | bitsharesscripts = ">=2,<3" 264 | ccxt = ">=1.26.96,<2.0.0" 265 | click = ">=7.1.1,<8.0.0" 266 | defusedxml = ">=0.6.0,<0.7.0" 267 | graphenelib = ">=1.3.2,<2.0.0" 268 | python-golos = ">=1.1.0,<2.0.0" 269 | 270 | [[package]] 271 | name = "graphenelib" 272 | version = "1.5.1" 273 | description = "Python library for graphene-based blockchains" 274 | category = "main" 275 | optional = false 276 | python-versions = "*" 277 | 278 | [package.dependencies] 279 | aiohttp = ">=3.5.4,<4" 280 | appdirs = ">=1.4.3,<2" 281 | asyncinit = ">=0.2.4,<0.3" 282 | ecdsa = ">=0.13.3,<0.14" 283 | expiringdict = "*" 284 | pycryptodome = ">=3.9.1,<4" 285 | pylibscrypt = ">=1.8.0,<2" 286 | requests = ">=2.22.0,<3" 287 | scrypt = ">=0.8.13,<0.9" 288 | websocket-client = ">=0.56.0,<1" 289 | websockets = ">=8.1,<9" 290 | 291 | [package.extras] 292 | speedups = ["secp256k1 (>=0.13.2)"] 293 | 294 | [[package]] 295 | name = "identify" 296 | version = "2.2.9" 297 | description = "File identification library for Python" 298 | category = "dev" 299 | optional = false 300 | python-versions = ">=3.6.1" 301 | 302 | [package.extras] 303 | license = ["editdistance-s"] 304 | 305 | [[package]] 306 | name = "idna" 307 | version = "2.10" 308 | description = "Internationalized Domain Names in Applications (IDNA)" 309 | category = "main" 310 | optional = false 311 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 312 | 313 | [[package]] 314 | name = "langdetect" 315 | version = "1.0.9" 316 | description = "Language detection library ported from Google's language-detection." 317 | category = "main" 318 | optional = false 319 | python-versions = "*" 320 | 321 | [package.dependencies] 322 | six = "*" 323 | 324 | [[package]] 325 | name = "multidict" 326 | version = "5.1.0" 327 | description = "multidict implementation" 328 | category = "main" 329 | optional = false 330 | python-versions = ">=3.6" 331 | 332 | [[package]] 333 | name = "nodeenv" 334 | version = "1.6.0" 335 | description = "Node.js virtual environment builder" 336 | category = "dev" 337 | optional = false 338 | python-versions = "*" 339 | 340 | [[package]] 341 | name = "pre-commit" 342 | version = "2.13.0" 343 | description = "A framework for managing and maintaining multi-language pre-commit hooks." 344 | category = "dev" 345 | optional = false 346 | python-versions = ">=3.6.1" 347 | 348 | [package.dependencies] 349 | cfgv = ">=2.0.0" 350 | identify = ">=1.0.0" 351 | nodeenv = ">=0.11.1" 352 | pyyaml = ">=5.1" 353 | toml = "*" 354 | virtualenv = ">=20.0.8" 355 | 356 | [[package]] 357 | name = "prettytable" 358 | version = "0.7.2" 359 | description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format." 360 | category = "main" 361 | optional = false 362 | python-versions = "*" 363 | 364 | [[package]] 365 | name = "pycares" 366 | version = "4.0.0" 367 | description = "Python interface for c-ares" 368 | category = "main" 369 | optional = false 370 | python-versions = "*" 371 | 372 | [package.dependencies] 373 | cffi = ">=1.5.0" 374 | 375 | [package.extras] 376 | idna = ["idna (>=2.1)"] 377 | 378 | [[package]] 379 | name = "pycparser" 380 | version = "2.20" 381 | description = "C parser in Python" 382 | category = "main" 383 | optional = false 384 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 385 | 386 | [[package]] 387 | name = "pycryptodome" 388 | version = "3.10.1" 389 | description = "Cryptographic library for Python" 390 | category = "main" 391 | optional = false 392 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 393 | 394 | [[package]] 395 | name = "pygments" 396 | version = "2.9.0" 397 | description = "Pygments is a syntax highlighting package written in Python." 398 | category = "main" 399 | optional = false 400 | python-versions = ">=3.5" 401 | 402 | [[package]] 403 | name = "pylibscrypt" 404 | version = "1.8.0" 405 | description = "Scrypt for Python" 406 | category = "main" 407 | optional = false 408 | python-versions = "*" 409 | 410 | [[package]] 411 | name = "python-golos" 412 | version = "1.1.1" 413 | description = "Python library for Golos blockchain" 414 | category = "main" 415 | optional = false 416 | python-versions = ">=3.6.1,<4.0.0" 417 | 418 | [package.dependencies] 419 | certifi = ">=2020.4.5,<2021.0.0" 420 | ecdsa = ">=0.13,<0.14" 421 | funcy = ">=1.14,<2.0" 422 | langdetect = ">=1.0.8,<2.0.0" 423 | prettytable = ">=0.7.2,<0.8.0" 424 | pycryptodome = ">=3.9.7,<4.0.0" 425 | pylibscrypt = ">=1.8.0,<2.0.0" 426 | scrypt = ">=0.8.13,<0.9.0" 427 | toolz = ">=0.10.0,<0.11.0" 428 | ujson = ">=2.0.3,<3.0.0" 429 | urllib3 = ">=1.25.9,<2.0.0" 430 | voluptuous = ">=0.11.7,<0.12.0" 431 | w3lib = ">=1.21.0,<2.0.0" 432 | websocket-client = ">=0.56,<0.57" 433 | 434 | [[package]] 435 | name = "pyyaml" 436 | version = "5.4.1" 437 | description = "YAML parser and emitter for Python" 438 | category = "main" 439 | optional = false 440 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 441 | 442 | [[package]] 443 | name = "requests" 444 | version = "2.25.1" 445 | description = "Python HTTP for Humans." 446 | category = "main" 447 | optional = false 448 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 449 | 450 | [package.dependencies] 451 | certifi = ">=2017.4.17" 452 | chardet = ">=3.0.2,<5" 453 | idna = ">=2.5,<3" 454 | urllib3 = ">=1.21.1,<1.27" 455 | 456 | [package.extras] 457 | security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] 458 | socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] 459 | 460 | [[package]] 461 | name = "scrypt" 462 | version = "0.8.18" 463 | description = "Bindings for the scrypt key derivation function library" 464 | category = "main" 465 | optional = false 466 | python-versions = "*" 467 | 468 | [[package]] 469 | name = "six" 470 | version = "1.16.0" 471 | description = "Python 2 and 3 compatibility utilities" 472 | category = "main" 473 | optional = false 474 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 475 | 476 | [[package]] 477 | name = "termcolor" 478 | version = "1.1.0" 479 | description = "ANSII Color formatting for output in terminal." 480 | category = "main" 481 | optional = false 482 | python-versions = "*" 483 | 484 | [[package]] 485 | name = "toml" 486 | version = "0.10.2" 487 | description = "Python Library for Tom's Obvious, Minimal Language" 488 | category = "dev" 489 | optional = false 490 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 491 | 492 | [[package]] 493 | name = "toolz" 494 | version = "0.10.0" 495 | description = "List processing tools and functional utilities" 496 | category = "main" 497 | optional = false 498 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 499 | 500 | [[package]] 501 | name = "tqdm" 502 | version = "4.61.0" 503 | description = "Fast, Extensible Progress Meter" 504 | category = "main" 505 | optional = false 506 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" 507 | 508 | [package.extras] 509 | dev = ["py-make (>=0.1.0)", "twine", "wheel"] 510 | notebook = ["ipywidgets (>=6)"] 511 | telegram = ["requests"] 512 | 513 | [[package]] 514 | name = "typing-extensions" 515 | version = "3.10.0.0" 516 | description = "Backported and Experimental Type Hints for Python 3.5+" 517 | category = "main" 518 | optional = false 519 | python-versions = "*" 520 | 521 | [[package]] 522 | name = "ujson" 523 | version = "2.0.3" 524 | description = "Ultra fast JSON encoder and decoder for Python" 525 | category = "main" 526 | optional = false 527 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 528 | 529 | [[package]] 530 | name = "uptick" 531 | version = "0.2.5" 532 | description = "Command line tool to interface with the BitShares network" 533 | category = "main" 534 | optional = false 535 | python-versions = "*" 536 | 537 | [package.dependencies] 538 | bitshares = ">=0.3.0" 539 | click = "*" 540 | click-datetime = "*" 541 | prettytable = "*" 542 | pygments = "*" 543 | pyyaml = "*" 544 | termcolor = "*" 545 | tqdm = "*" 546 | 547 | [[package]] 548 | name = "urllib3" 549 | version = "1.26.5" 550 | description = "HTTP library with thread-safe connection pooling, file post, and more." 551 | category = "main" 552 | optional = false 553 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 554 | 555 | [package.extras] 556 | brotli = ["brotlipy (>=0.6.0)"] 557 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] 558 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 559 | 560 | [[package]] 561 | name = "virtualenv" 562 | version = "20.4.7" 563 | description = "Virtual Python Environment builder" 564 | category = "dev" 565 | optional = false 566 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" 567 | 568 | [package.dependencies] 569 | appdirs = ">=1.4.3,<2" 570 | distlib = ">=0.3.1,<1" 571 | filelock = ">=3.0.0,<4" 572 | six = ">=1.9.0,<2" 573 | 574 | [package.extras] 575 | docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] 576 | testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)", "xonsh (>=0.9.16)"] 577 | 578 | [[package]] 579 | name = "voluptuous" 580 | version = "0.11.7" 581 | description = "# Voluptuous is a Python data validation library" 582 | category = "main" 583 | optional = false 584 | python-versions = "*" 585 | 586 | [[package]] 587 | name = "w3lib" 588 | version = "1.22.0" 589 | description = "Library of web-related functions" 590 | category = "main" 591 | optional = false 592 | python-versions = "*" 593 | 594 | [package.dependencies] 595 | six = ">=1.4.1" 596 | 597 | [[package]] 598 | name = "websocket-client" 599 | version = "0.56.0" 600 | description = "WebSocket client for Python. hybi13 is supported." 601 | category = "main" 602 | optional = false 603 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 604 | 605 | [package.dependencies] 606 | six = "*" 607 | 608 | [[package]] 609 | name = "websockets" 610 | version = "8.1" 611 | description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" 612 | category = "main" 613 | optional = false 614 | python-versions = ">=3.6.1" 615 | 616 | [[package]] 617 | name = "yarl" 618 | version = "1.6.3" 619 | description = "Yet another URL library" 620 | category = "main" 621 | optional = false 622 | python-versions = ">=3.6" 623 | 624 | [package.dependencies] 625 | idna = ">=2.0" 626 | multidict = ">=4.0" 627 | 628 | [metadata] 629 | lock-version = "1.1" 630 | python-versions = "^3.8" 631 | content-hash = "7cd07aff30440785ab1397437fb8a75339301c11d3c8629896eac3a9b570eee0" 632 | 633 | [metadata.files] 634 | aiodns = [ 635 | {file = "aiodns-2.0.0-py2.py3-none-any.whl", hash = "sha256:aaa5ac584f40fe778013df0aa6544bf157799bd3f608364b451840ed2c8688de"}, 636 | {file = "aiodns-2.0.0.tar.gz", hash = "sha256:815fdef4607474295d68da46978a54481dd1e7be153c7d60f9e72773cd38d77d"}, 637 | ] 638 | aiohttp = [ 639 | {file = "aiohttp-3.7.4.post0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3cf75f7cdc2397ed4442594b935a11ed5569961333d49b7539ea741be2cc79d5"}, 640 | {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4b302b45040890cea949ad092479e01ba25911a15e648429c7c5aae9650c67a8"}, 641 | {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:fe60131d21b31fd1a14bd43e6bb88256f69dfc3188b3a89d736d6c71ed43ec95"}, 642 | {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:393f389841e8f2dfc86f774ad22f00923fdee66d238af89b70ea314c4aefd290"}, 643 | {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:c6e9dcb4cb338d91a73f178d866d051efe7c62a7166653a91e7d9fb18274058f"}, 644 | {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:5df68496d19f849921f05f14f31bd6ef53ad4b00245da3195048c69934521809"}, 645 | {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:0563c1b3826945eecd62186f3f5c7d31abb7391fedc893b7e2b26303b5a9f3fe"}, 646 | {file = "aiohttp-3.7.4.post0-cp36-cp36m-win32.whl", hash = "sha256:3d78619672183be860b96ed96f533046ec97ca067fd46ac1f6a09cd9b7484287"}, 647 | {file = "aiohttp-3.7.4.post0-cp36-cp36m-win_amd64.whl", hash = "sha256:f705e12750171c0ab4ef2a3c76b9a4024a62c4103e3a55dd6f99265b9bc6fcfc"}, 648 | {file = "aiohttp-3.7.4.post0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:230a8f7e24298dea47659251abc0fd8b3c4e38a664c59d4b89cca7f6c09c9e87"}, 649 | {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2e19413bf84934d651344783c9f5e22dee452e251cfd220ebadbed2d9931dbf0"}, 650 | {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e4b2b334e68b18ac9817d828ba44d8fcb391f6acb398bcc5062b14b2cbeac970"}, 651 | {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:d012ad7911653a906425d8473a1465caa9f8dea7fcf07b6d870397b774ea7c0f"}, 652 | {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:40eced07f07a9e60e825554a31f923e8d3997cfc7fb31dbc1328c70826e04cde"}, 653 | {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:209b4a8ee987eccc91e2bd3ac36adee0e53a5970b8ac52c273f7f8fd4872c94c"}, 654 | {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:14762875b22d0055f05d12abc7f7d61d5fd4fe4642ce1a249abdf8c700bf1fd8"}, 655 | {file = "aiohttp-3.7.4.post0-cp37-cp37m-win32.whl", hash = "sha256:7615dab56bb07bff74bc865307aeb89a8bfd9941d2ef9d817b9436da3a0ea54f"}, 656 | {file = "aiohttp-3.7.4.post0-cp37-cp37m-win_amd64.whl", hash = "sha256:d9e13b33afd39ddeb377eff2c1c4f00544e191e1d1dee5b6c51ddee8ea6f0cf5"}, 657 | {file = "aiohttp-3.7.4.post0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:547da6cacac20666422d4882cfcd51298d45f7ccb60a04ec27424d2f36ba3eaf"}, 658 | {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:af9aa9ef5ba1fd5b8c948bb11f44891968ab30356d65fd0cc6707d989cd521df"}, 659 | {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:64322071e046020e8797117b3658b9c2f80e3267daec409b350b6a7a05041213"}, 660 | {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bb437315738aa441251214dad17428cafda9cdc9729499f1d6001748e1d432f4"}, 661 | {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:e54962802d4b8b18b6207d4a927032826af39395a3bd9196a5af43fc4e60b009"}, 662 | {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:a00bb73540af068ca7390e636c01cbc4f644961896fa9363154ff43fd37af2f5"}, 663 | {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:79ebfc238612123a713a457d92afb4096e2148be17df6c50fb9bf7a81c2f8013"}, 664 | {file = "aiohttp-3.7.4.post0-cp38-cp38-win32.whl", hash = "sha256:515dfef7f869a0feb2afee66b957cc7bbe9ad0cdee45aec7fdc623f4ecd4fb16"}, 665 | {file = "aiohttp-3.7.4.post0-cp38-cp38-win_amd64.whl", hash = "sha256:114b281e4d68302a324dd33abb04778e8557d88947875cbf4e842c2c01a030c5"}, 666 | {file = "aiohttp-3.7.4.post0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:7b18b97cf8ee5452fa5f4e3af95d01d84d86d32c5e2bfa260cf041749d66360b"}, 667 | {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:15492a6368d985b76a2a5fdd2166cddfea5d24e69eefed4630cbaae5c81d89bd"}, 668 | {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bdb230b4943891321e06fc7def63c7aace16095be7d9cf3b1e01be2f10fba439"}, 669 | {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:cffe3ab27871bc3ea47df5d8f7013945712c46a3cc5a95b6bee15887f1675c22"}, 670 | {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:f881853d2643a29e643609da57b96d5f9c9b93f62429dcc1cbb413c7d07f0e1a"}, 671 | {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:a5ca29ee66f8343ed336816c553e82d6cade48a3ad702b9ffa6125d187e2dedb"}, 672 | {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:17c073de315745a1510393a96e680d20af8e67e324f70b42accbd4cb3315c9fb"}, 673 | {file = "aiohttp-3.7.4.post0-cp39-cp39-win32.whl", hash = "sha256:932bb1ea39a54e9ea27fc9232163059a0b8855256f4052e776357ad9add6f1c9"}, 674 | {file = "aiohttp-3.7.4.post0-cp39-cp39-win_amd64.whl", hash = "sha256:02f46fc0e3c5ac58b80d4d56eb0a7c7d97fcef69ace9326289fb9f1955e65cfe"}, 675 | {file = "aiohttp-3.7.4.post0.tar.gz", hash = "sha256:493d3299ebe5f5a7c66b9819eacdcfbbaaf1a8e84911ddffcdc48888497afecf"}, 676 | ] 677 | appdirs = [ 678 | {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, 679 | {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, 680 | ] 681 | async-timeout = [ 682 | {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, 683 | {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, 684 | ] 685 | asyncinit = [ 686 | {file = "asyncinit-0.2.4-py3-none-any.whl", hash = "sha256:9f11291943488abd15a1463dad98452e3bd6b39e8e6d45bc7cc008a09825b11e"}, 687 | {file = "asyncinit-0.2.4.tar.gz", hash = "sha256:4acaf614f4d6f78babd278bbacf21bd9f7756efc17cd5d7e1bae31ff770b3cfa"}, 688 | ] 689 | attrs = [ 690 | {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, 691 | {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, 692 | ] 693 | bitshares = [ 694 | {file = "bitshares-0.5.1-py3-none-any.whl", hash = "sha256:974bee49c8c8b3de8f6dfd56deb34c5923c7cc81e665fda73cc33f101fcb2527"}, 695 | {file = "bitshares-0.5.1.tar.gz", hash = "sha256:414ec208a30bed20657b3a3bc96a2377bd4b9aa31b1be45fb08d5477fd1405d9"}, 696 | ] 697 | bitsharesscripts = [ 698 | {file = "bitsharesscripts-2.0.1-py3-none-any.whl", hash = "sha256:a160109f7f874079c58dcd94a2b1b001901cf687b83ecf8e5fbc30ea03fc4345"}, 699 | {file = "bitsharesscripts-2.0.1.tar.gz", hash = "sha256:776d90c62d4b1a516b17ccacfb7213869048e36a657a931aa4c03431d2af8b3a"}, 700 | ] 701 | ccxt = [ 702 | {file = "ccxt-1.51.1-py2.py3-none-any.whl", hash = "sha256:93ca7ffac456afde35e86bf9e4d0bd551d81299b14b5a5000add4677ba2f6a23"}, 703 | {file = "ccxt-1.51.1.tar.gz", hash = "sha256:28792cefd178548a727cbd456c6e8baf1716d24b8c394b04ac74a0e30fb12982"}, 704 | ] 705 | certifi = [ 706 | {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, 707 | {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, 708 | ] 709 | cffi = [ 710 | {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, 711 | {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, 712 | {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, 713 | {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, 714 | {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, 715 | {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, 716 | {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, 717 | {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, 718 | {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, 719 | {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, 720 | {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, 721 | {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, 722 | {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, 723 | {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, 724 | {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, 725 | {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, 726 | {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, 727 | {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, 728 | {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, 729 | {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, 730 | {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, 731 | {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, 732 | {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, 733 | {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, 734 | {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, 735 | {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, 736 | {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, 737 | {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, 738 | {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, 739 | {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, 740 | {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, 741 | {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, 742 | {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, 743 | {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, 744 | {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, 745 | {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, 746 | {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, 747 | {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, 748 | {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, 749 | {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, 750 | {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, 751 | {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, 752 | {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, 753 | {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, 754 | {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, 755 | {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, 756 | {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, 757 | {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, 758 | {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, 759 | ] 760 | cfgv = [ 761 | {file = "cfgv-3.3.0-py2.py3-none-any.whl", hash = "sha256:b449c9c6118fe8cca7fa5e00b9ec60ba08145d281d52164230a69211c5d597a1"}, 762 | {file = "cfgv-3.3.0.tar.gz", hash = "sha256:9e600479b3b99e8af981ecdfc80a0296104ee610cab48a5ae4ffd0b668650eb1"}, 763 | ] 764 | chardet = [ 765 | {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, 766 | {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, 767 | ] 768 | click = [ 769 | {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, 770 | {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, 771 | ] 772 | click-datetime = [ 773 | {file = "click-datetime-0.2.tar.gz", hash = "sha256:c562ad24b3711784a655a49141b4a87933a78608fe66296259acae95fda5e115"}, 774 | {file = "click_datetime-0.2-py2.py3-none-any.whl", hash = "sha256:7256ca518e648ada8e2550239ab328de125906e5b7199a5bd5bcbb4dfe28f946"}, 775 | ] 776 | cryptography = [ 777 | {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"}, 778 | {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"}, 779 | {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"}, 780 | {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"}, 781 | {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"}, 782 | {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"}, 783 | {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, 784 | {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, 785 | {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, 786 | {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, 787 | {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, 788 | {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, 789 | ] 790 | defusedxml = [ 791 | {file = "defusedxml-0.6.0-py2.py3-none-any.whl", hash = "sha256:6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93"}, 792 | {file = "defusedxml-0.6.0.tar.gz", hash = "sha256:f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5"}, 793 | ] 794 | distlib = [ 795 | {file = "distlib-0.3.2-py2.py3-none-any.whl", hash = "sha256:23e223426b28491b1ced97dc3bbe183027419dfc7982b4fa2f05d5f3ff10711c"}, 796 | {file = "distlib-0.3.2.zip", hash = "sha256:106fef6dc37dd8c0e2c0a60d3fca3e77460a48907f335fa28420463a6f799736"}, 797 | ] 798 | ecdsa = [ 799 | {file = "ecdsa-0.13.3-py2.py3-none-any.whl", hash = "sha256:9814e700890991abeceeb2242586024d4758c8fc18445b194a49bd62d85861db"}, 800 | {file = "ecdsa-0.13.3.tar.gz", hash = "sha256:163c80b064a763ea733870feb96f9dd9b92216cfcacd374837af18e4e8ec3d4d"}, 801 | ] 802 | events = [ 803 | {file = "Events-0.3.tar.gz", hash = "sha256:f4d9c41a5c160ce504278f219fe56f44242ca63794a0ad638b52d1e087ac2a41"}, 804 | ] 805 | expiringdict = [ 806 | {file = "expiringdict-1.2.1.tar.gz", hash = "sha256:fe2ba427220425c3c8a3d29f6d2e2985bcee323f8bcd4021e68ebefbd90d8250"}, 807 | ] 808 | filelock = [ 809 | {file = "filelock-3.0.12-py3-none-any.whl", hash = "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"}, 810 | {file = "filelock-3.0.12.tar.gz", hash = "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"}, 811 | ] 812 | funcy = [ 813 | {file = "funcy-1.16-py2.py3-none-any.whl", hash = "sha256:1d3fc5d42cf7564a6b2be04042d0df7a50c77903cf760a34786d0c9ebd659b25"}, 814 | {file = "funcy-1.16.tar.gz", hash = "sha256:2775409b7dc9106283f1224d97e6df5f2c02e7291c8caed72764f5a115dffb50"}, 815 | ] 816 | golosscripts = [ 817 | {file = "golosscripts-1.0.0-py3-none-any.whl", hash = "sha256:5d87c9fedce6492df20ace7e44d90424245023f09ce87ae7e83858db78947ba4"}, 818 | {file = "golosscripts-1.0.0.tar.gz", hash = "sha256:64f49bc73b81f4607467fbef9504d23330ec2802276ca111a695b7b669c09f1f"}, 819 | ] 820 | graphenelib = [ 821 | {file = "graphenelib-1.5.1-py3-none-any.whl", hash = "sha256:8d91dc1b6fbf4e7d86b226aba4d0af480ba6cf6d00a6adf03f76463d87be0959"}, 822 | {file = "graphenelib-1.5.1.tar.gz", hash = "sha256:99021b4f723572f5a2ce4d5b05c6ad1d78b0766b89f733fe026a9a2df305716e"}, 823 | ] 824 | identify = [ 825 | {file = "identify-2.2.9-py2.py3-none-any.whl", hash = "sha256:96c57d493184daecc7299acdeef0ad7771c18a59931ea927942df393688fe849"}, 826 | {file = "identify-2.2.9.tar.gz", hash = "sha256:3a8493cf49cfe4b28d50865e38f942c11be07a7b0aab8e715073e17f145caacc"}, 827 | ] 828 | idna = [ 829 | {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, 830 | {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, 831 | ] 832 | langdetect = [ 833 | {file = "langdetect-1.0.9-py2-none-any.whl", hash = "sha256:7cbc0746252f19e76f77c0b1690aadf01963be835ef0cd4b56dddf2a8f1dfc2a"}, 834 | {file = "langdetect-1.0.9.tar.gz", hash = "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0"}, 835 | ] 836 | multidict = [ 837 | {file = "multidict-5.1.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:b7993704f1a4b204e71debe6095150d43b2ee6150fa4f44d6d966ec356a8d61f"}, 838 | {file = "multidict-5.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9dd6e9b1a913d096ac95d0399bd737e00f2af1e1594a787e00f7975778c8b2bf"}, 839 | {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281"}, 840 | {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab820665e67373de5802acae069a6a05567ae234ddb129f31d290fc3d1aa56d"}, 841 | {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:9436dc58c123f07b230383083855593550c4d301d2532045a17ccf6eca505f6d"}, 842 | {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:830f57206cc96ed0ccf68304141fec9481a096c4d2e2831f311bde1c404401da"}, 843 | {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:2e68965192c4ea61fff1b81c14ff712fc7dc15d2bd120602e4a3494ea6584224"}, 844 | {file = "multidict-5.1.0-cp36-cp36m-win32.whl", hash = "sha256:2f1a132f1c88724674271d636e6b7351477c27722f2ed789f719f9e3545a3d26"}, 845 | {file = "multidict-5.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:3a4f32116f8f72ecf2a29dabfb27b23ab7cdc0ba807e8459e59a93a9be9506f6"}, 846 | {file = "multidict-5.1.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:46c73e09ad374a6d876c599f2328161bcd95e280f84d2060cf57991dec5cfe76"}, 847 | {file = "multidict-5.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a"}, 848 | {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:4b186eb7d6ae7c06eb4392411189469e6a820da81447f46c0072a41c748ab73f"}, 849 | {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3a041b76d13706b7fff23b9fc83117c7b8fe8d5fe9e6be45eee72b9baa75f348"}, 850 | {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:051012ccee979b2b06be928a6150d237aec75dd6bf2d1eeeb190baf2b05abc93"}, 851 | {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:6a4d5ce640e37b0efcc8441caeea8f43a06addace2335bd11151bc02d2ee31f9"}, 852 | {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5cf3443199b83ed9e955f511b5b241fd3ae004e3cb81c58ec10f4fe47c7dce37"}, 853 | {file = "multidict-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:f200755768dc19c6f4e2b672421e0ebb3dd54c38d5a4f262b872d8cfcc9e93b5"}, 854 | {file = "multidict-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:05c20b68e512166fddba59a918773ba002fdd77800cad9f55b59790030bab632"}, 855 | {file = "multidict-5.1.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:54fd1e83a184e19c598d5e70ba508196fd0bbdd676ce159feb412a4a6664f952"}, 856 | {file = "multidict-5.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:0e3c84e6c67eba89c2dbcee08504ba8644ab4284863452450520dad8f1e89b79"}, 857 | {file = "multidict-5.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:dc862056f76443a0db4509116c5cd480fe1b6a2d45512a653f9a855cc0517456"}, 858 | {file = "multidict-5.1.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:0e929169f9c090dae0646a011c8b058e5e5fb391466016b39d21745b48817fd7"}, 859 | {file = "multidict-5.1.0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:d81eddcb12d608cc08081fa88d046c78afb1bf8107e6feab5d43503fea74a635"}, 860 | {file = "multidict-5.1.0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:585fd452dd7782130d112f7ddf3473ffdd521414674c33876187e101b588738a"}, 861 | {file = "multidict-5.1.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:37e5438e1c78931df5d3c0c78ae049092877e5e9c02dd1ff5abb9cf27a5914ea"}, 862 | {file = "multidict-5.1.0-cp38-cp38-win32.whl", hash = "sha256:07b42215124aedecc6083f1ce6b7e5ec5b50047afa701f3442054373a6deb656"}, 863 | {file = "multidict-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:929006d3c2d923788ba153ad0de8ed2e5ed39fdbe8e7be21e2f22ed06c6783d3"}, 864 | {file = "multidict-5.1.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b797515be8743b771aa868f83563f789bbd4b236659ba52243b735d80b29ed93"}, 865 | {file = "multidict-5.1.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d5c65bdf4484872c4af3150aeebe101ba560dcfb34488d9a8ff8dbcd21079647"}, 866 | {file = "multidict-5.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b47a43177a5e65b771b80db71e7be76c0ba23cc8aa73eeeb089ed5219cdbe27d"}, 867 | {file = "multidict-5.1.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:806068d4f86cb06af37cd65821554f98240a19ce646d3cd24e1c33587f313eb8"}, 868 | {file = "multidict-5.1.0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:46dd362c2f045095c920162e9307de5ffd0a1bfbba0a6e990b344366f55a30c1"}, 869 | {file = "multidict-5.1.0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:ace010325c787c378afd7f7c1ac66b26313b3344628652eacd149bdd23c68841"}, 870 | {file = "multidict-5.1.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ecc771ab628ea281517e24fd2c52e8f31c41e66652d07599ad8818abaad38cda"}, 871 | {file = "multidict-5.1.0-cp39-cp39-win32.whl", hash = "sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80"}, 872 | {file = "multidict-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359"}, 873 | {file = "multidict-5.1.0.tar.gz", hash = "sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5"}, 874 | ] 875 | nodeenv = [ 876 | {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, 877 | {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, 878 | ] 879 | pre-commit = [ 880 | {file = "pre_commit-2.13.0-py2.py3-none-any.whl", hash = "sha256:b679d0fddd5b9d6d98783ae5f10fd0c4c59954f375b70a58cbe1ce9bcf9809a4"}, 881 | {file = "pre_commit-2.13.0.tar.gz", hash = "sha256:764972c60693dc668ba8e86eb29654ec3144501310f7198742a767bec385a378"}, 882 | ] 883 | prettytable = [ 884 | {file = "prettytable-0.7.2.tar.bz2", hash = "sha256:853c116513625c738dc3ce1aee148b5b5757a86727e67eff6502c7ca59d43c36"}, 885 | {file = "prettytable-0.7.2.tar.gz", hash = "sha256:2d5460dc9db74a32bcc8f9f67de68b2c4f4d2f01fa3bd518764c69156d9cacd9"}, 886 | {file = "prettytable-0.7.2.zip", hash = "sha256:a53da3b43d7a5c229b5e3ca2892ef982c46b7923b51e98f0db49956531211c4f"}, 887 | ] 888 | pycares = [ 889 | {file = "pycares-4.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db5a533111a3cfd481e7e4fb2bf8bef69f4fa100339803e0504dd5aecafb96a5"}, 890 | {file = "pycares-4.0.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:fdff88393c25016f417770d82678423fc7a56995abb2df3d2a1e55725db6977d"}, 891 | {file = "pycares-4.0.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0aa97f900a7ffb259be77d640006585e2a907b0cd4edeee0e85cf16605995d5a"}, 892 | {file = "pycares-4.0.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:a34b0e3e693dceb60b8a1169668d606c75cb100ceba0a2df53c234a0eb067fbc"}, 893 | {file = "pycares-4.0.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7661d6bbd51a337e7373cb356efa8be9b4655fda484e068f9455e939aec8d54e"}, 894 | {file = "pycares-4.0.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:57315b8eb8fdbc56b3ad4932bc4b17132bb7c7fd2bd590f7fb84b6b522098aa9"}, 895 | {file = "pycares-4.0.0-cp36-cp36m-win32.whl", hash = "sha256:dca9dc58845a9d083f302732a3130c68ded845ad5d463865d464e53c75a3dd45"}, 896 | {file = "pycares-4.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:c95c964d5dd307e104b44b193095c67bb6b10c9eda1ffe7d44ab7a9e84c476d9"}, 897 | {file = "pycares-4.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26e67e4f81c80a5955dcf6193f3d9bee3c491fc0056299b383b84d792252fba4"}, 898 | {file = "pycares-4.0.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cd3011ffd5e1ad55880f7256791dbab9c43ebeda260474a968f19cd0319e1aef"}, 899 | {file = "pycares-4.0.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1b959dd5921d207d759d421eece1b60416df33a7f862465739d5f2c363c2f523"}, 900 | {file = "pycares-4.0.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6f258c1b74c048a9501a25f732f11b401564005e5e3c18f1ca6cad0c3dc0fb19"}, 901 | {file = "pycares-4.0.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:b17ef48729786e62b574c6431f675f4cb02b27691b49e7428a605a50cd59c072"}, 902 | {file = "pycares-4.0.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:82b3259cb590ddd107a6d2dc52da2a2e9a986bf242e893d58c786af2f8191047"}, 903 | {file = "pycares-4.0.0-cp37-cp37m-win32.whl", hash = "sha256:4876fc790ae32832ae270c4a010a1a77e12ddf8d8e6ad70ad0b0a9d506c985f7"}, 904 | {file = "pycares-4.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f60c04c5561b1ddf85ca4e626943cc09d7fb684e1adb22abb632095415a40fd7"}, 905 | {file = "pycares-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:615406013cdcd1b445e5d1a551d276c6200b3abe77e534f8a7f7e1551208d14f"}, 906 | {file = "pycares-4.0.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6580aef5d1b29a88c3d72fe73c691eacfd454f86e74d3fdd18f4bad8e8def98b"}, 907 | {file = "pycares-4.0.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8ebb3ba0485f66cae8eed7ce3e9ed6f2c0bfd5e7319d5d0fbbb511064f17e1d4"}, 908 | {file = "pycares-4.0.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c5362b7690ca481440f6b98395ac6df06aa50518ccb183c560464d1e5e2ab5d4"}, 909 | {file = "pycares-4.0.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:eb60be66accc9a9ea1018b591a1f5800cba83491d07e9acc8c56bc6e6607ab54"}, 910 | {file = "pycares-4.0.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:44896d6e191a6b5a914dbe3aa7c748481bf6ad19a9df33c1e76f8f2dc33fc8f0"}, 911 | {file = "pycares-4.0.0-cp38-cp38-win32.whl", hash = "sha256:09b28fc7bc2cc05f7f69bf1636ddf46086e0a1837b62961e2092fcb40477320d"}, 912 | {file = "pycares-4.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4a5081e232c1d181883dcac4675807f3a6cf33911c4173fbea00c0523687ed4"}, 913 | {file = "pycares-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:103353577a6266a53e71bfee4cf83825f1401fefa60f0fb8bdec35f13be6a5f2"}, 914 | {file = "pycares-4.0.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ad6caf580ee69806fc6534be93ddbb6e99bf94296d79ab351c37b2992b17abfd"}, 915 | {file = "pycares-4.0.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3d5e50c95849f6905d2a9dbf02ed03f82580173e3c5604a39e2ad054185631f1"}, 916 | {file = "pycares-4.0.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:53bc4f181b19576499b02cea4b45391e8dcbe30abd4cd01492f66bfc15615a13"}, 917 | {file = "pycares-4.0.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:d52f9c725d2a826d5ffa37681eb07ffb996bfe21788590ef257664a3898fc0b5"}, 918 | {file = "pycares-4.0.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:3c7fb8d34ee11971c39acfaf98d0fac66725385ccef3bfe1b174c92b210e1aa4"}, 919 | {file = "pycares-4.0.0-cp39-cp39-win32.whl", hash = "sha256:e9773e07684a55f54657df05237267611a77b294ec3bacb5f851c4ffca38a465"}, 920 | {file = "pycares-4.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:38e54037f36c149146ff15f17a4a963fbdd0f9871d4a21cd94ff9f368140f57e"}, 921 | {file = "pycares-4.0.0.tar.gz", hash = "sha256:d0154fc5753b088758fbec9bc137e1b24bb84fc0c6a09725c8bac25a342311cd"}, 922 | ] 923 | pycparser = [ 924 | {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, 925 | {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, 926 | ] 927 | pycryptodome = [ 928 | {file = "pycryptodome-3.10.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1c5e1ca507de2ad93474be5cfe2bfa76b7cf039a1a32fc196f40935944871a06"}, 929 | {file = "pycryptodome-3.10.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:6260e24d41149268122dd39d4ebd5941e9d107f49463f7e071fd397e29923b0c"}, 930 | {file = "pycryptodome-3.10.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:3f840c49d38986f6e17dbc0673d37947c88bc9d2d9dba1c01b979b36f8447db1"}, 931 | {file = "pycryptodome-3.10.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:2dea65df54349cdfa43d6b2e8edb83f5f8d6861e5cf7b1fbc3e34c5694c85e27"}, 932 | {file = "pycryptodome-3.10.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:e61e363d9a5d7916f3a4ce984a929514c0df3daf3b1b2eb5e6edbb131ee771cf"}, 933 | {file = "pycryptodome-3.10.1-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:2603c98ae04aac675fefcf71a6c87dc4bb74a75e9071ae3923bbc91a59f08d35"}, 934 | {file = "pycryptodome-3.10.1-cp27-cp27m-win32.whl", hash = "sha256:38661348ecb71476037f1e1f553159b80d256c00f6c0b00502acac891f7116d9"}, 935 | {file = "pycryptodome-3.10.1-cp27-cp27m-win_amd64.whl", hash = "sha256:1723ebee5561628ce96748501cdaa7afaa67329d753933296321f0be55358dce"}, 936 | {file = "pycryptodome-3.10.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:77997519d8eb8a4adcd9a47b9cec18f9b323e296986528186c0e9a7a15d6a07e"}, 937 | {file = "pycryptodome-3.10.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:99b2f3fc51d308286071d0953f92055504a6ffe829a832a9fc7a04318a7683dd"}, 938 | {file = "pycryptodome-3.10.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e0a4d5933a88a2c98bbe19c0c722f5483dc628d7a38338ac2cb64a7dbd34064b"}, 939 | {file = "pycryptodome-3.10.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d3d6958d53ad307df5e8469cc44474a75393a434addf20ecd451f38a72fe29b8"}, 940 | {file = "pycryptodome-3.10.1-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:a8eb8b6ea09ec1c2535bf39914377bc8abcab2c7d30fa9225eb4fe412024e427"}, 941 | {file = "pycryptodome-3.10.1-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:31c1df17b3dc5f39600a4057d7db53ac372f492c955b9b75dd439f5d8b460129"}, 942 | {file = "pycryptodome-3.10.1-cp35-abi3-manylinux1_i686.whl", hash = "sha256:a3105a0eb63eacf98c2ecb0eb4aa03f77f40fbac2bdde22020bb8a536b226bb8"}, 943 | {file = "pycryptodome-3.10.1-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:a92d5c414e8ee1249e850789052608f582416e82422502dc0ac8c577808a9067"}, 944 | {file = "pycryptodome-3.10.1-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:60386d1d4cfaad299803b45a5bc2089696eaf6cdd56f9fc17479a6f89595cfc8"}, 945 | {file = "pycryptodome-3.10.1-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:501ab36aae360e31d0ec370cf5ce8ace6cb4112060d099b993bc02b36ac83fb6"}, 946 | {file = "pycryptodome-3.10.1-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:fc7489a50323a0df02378bc2fff86eb69d94cc5639914346c736be981c6a02e7"}, 947 | {file = "pycryptodome-3.10.1-cp35-abi3-win32.whl", hash = "sha256:9b6f711b25e01931f1c61ce0115245a23cdc8b80bf8539ac0363bdcf27d649b6"}, 948 | {file = "pycryptodome-3.10.1-cp35-abi3-win_amd64.whl", hash = "sha256:7fd519b89585abf57bf47d90166903ec7b43af4fe23c92273ea09e6336af5c07"}, 949 | {file = "pycryptodome-3.10.1-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:09c1555a3fa450e7eaca41ea11cd00afe7c91fef52353488e65663777d8524e0"}, 950 | {file = "pycryptodome-3.10.1-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:758949ca62690b1540dfb24ad773c6da9cd0e425189e83e39c038bbd52b8e438"}, 951 | {file = "pycryptodome-3.10.1-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:e3bf558c6aeb49afa9f0c06cee7fb5947ee5a1ff3bd794b653d39926b49077fa"}, 952 | {file = "pycryptodome-3.10.1-pp27-pypy_73-win32.whl", hash = "sha256:f977cdf725b20f6b8229b0c87acb98c7717e742ef9f46b113985303ae12a99da"}, 953 | {file = "pycryptodome-3.10.1-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d2df5223b12437e644ce0a3be7809471ffa71de44ccd28b02180401982594a6"}, 954 | {file = "pycryptodome-3.10.1-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:98213ac2b18dc1969a47bc65a79a8fca02a414249d0c8635abb081c7f38c91b6"}, 955 | {file = "pycryptodome-3.10.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:12222a5edc9ca4a29de15fbd5339099c4c26c56e13c2ceddf0b920794f26165d"}, 956 | {file = "pycryptodome-3.10.1-pp36-pypy36_pp73-win32.whl", hash = "sha256:6bbf7fee7b7948b29d7e71fcacf48bac0c57fb41332007061a933f2d996f9713"}, 957 | {file = "pycryptodome-3.10.1.tar.gz", hash = "sha256:3e2e3a06580c5f190df843cdb90ea28d61099cf4924334d5297a995de68e4673"}, 958 | ] 959 | pygments = [ 960 | {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, 961 | {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, 962 | ] 963 | pylibscrypt = [ 964 | {file = "pylibscrypt-1.8.0.tar.gz", hash = "sha256:893c4519afae05878f7aa313b76f6193e4d4b69d157b7febf6a5ef69ae3bf6e9"}, 965 | ] 966 | python-golos = [ 967 | {file = "python-golos-1.1.1.tar.gz", hash = "sha256:8ef519c3c537085d538d39327e457a040345e443c6afd30e8064f22a276b4eb3"}, 968 | {file = "python_golos-1.1.1-py3-none-any.whl", hash = "sha256:9bdb0bd84957c7aae0a89087858b5bb23229999aa0d82aed8a555cb48330397b"}, 969 | ] 970 | pyyaml = [ 971 | {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, 972 | {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, 973 | {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, 974 | {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, 975 | {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, 976 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, 977 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, 978 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, 979 | {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, 980 | {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, 981 | {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, 982 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, 983 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, 984 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, 985 | {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, 986 | {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, 987 | {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, 988 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, 989 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, 990 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, 991 | {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, 992 | {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, 993 | {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, 994 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, 995 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, 996 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, 997 | {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, 998 | {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, 999 | {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, 1000 | ] 1001 | requests = [ 1002 | {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, 1003 | {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, 1004 | ] 1005 | scrypt = [ 1006 | {file = "scrypt-0.8.18-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:c0af99a007c2082214a4e30a98d832747dfd0671cb4b858be0de0b55962df5f3"}, 1007 | {file = "scrypt-0.8.18-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:150c886ef88c4e6f64627e906a1a2fe065bcfe3d35990f51b3394096d5a4779b"}, 1008 | {file = "scrypt-0.8.18-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ee1a1bb4ecc59f138085adc9713ef61f013d16c9249474e19fc7fd1627dcb1c1"}, 1009 | {file = "scrypt-0.8.18-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:c26bd64dc9cf4d90d63a52b21fe5d23109ae6555511f391fee2e9707f4dc743f"}, 1010 | {file = "scrypt-0.8.18-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:f941d43b6485f30aee9768288b0e60b69f4b0297131f7ef93436b30d81c75b67"}, 1011 | {file = "scrypt-0.8.18-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:ee003f8ceffcc351c438301fca07e119b07568670b00a141bec3b9d7b3df5585"}, 1012 | {file = "scrypt-0.8.18-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:188cf9a00df97542ed9fa22a86a614cfbe7ca052d116c01dcc1b6d8d48210255"}, 1013 | {file = "scrypt-0.8.18-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:ddce16cef3751a5f57c46c3399c29d245bc710f30e9d967ae2ccdb4067e67f98"}, 1014 | {file = "scrypt-0.8.18-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9c8df4c04244456af2a1b489699ee504f769606cb2b2a2b36d869b3dc75487aa"}, 1015 | {file = "scrypt-0.8.18-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6285cf76aecfbf244fef8bb3a19fd77b4ef0a797eee36a2702afa8d6c8b9d919"}, 1016 | {file = "scrypt-0.8.18-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:57b33180dee66c1a21316c7fabd4d894de5e95f37639601eb76cf593cdc96adc"}, 1017 | {file = "scrypt-0.8.18-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:4620574e52598ee5913f4eef01ace71312fcce810835bfe9fc77e8117f1cf7dd"}, 1018 | {file = "scrypt-0.8.18-cp36-cp36m-win32.whl", hash = "sha256:f2b87afcbc12dcfe2fdd88304619126bffeedf4d8e99e7d310486e17e47279b9"}, 1019 | {file = "scrypt-0.8.18-cp36-cp36m-win_amd64.whl", hash = "sha256:b0091b4a141233f4445eef21110bf4818198434f453533578d89463b62127ba6"}, 1020 | {file = "scrypt-0.8.18-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:09c718b7f804d45539654e6bba8571a1b472fe62f6a16805be092a54e4e165ae"}, 1021 | {file = "scrypt-0.8.18-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:8e9edb8d619b80056afd3f9cf58a45c239b7dbe26cf5c07fbfcefee766fe63fc"}, 1022 | {file = "scrypt-0.8.18-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:425d5349a4350921c23fbb77d4375f8146aca538956933cac991441a17ef67af"}, 1023 | {file = "scrypt-0.8.18-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:b72b6956ec1e7dc4683011865500f0f53c10bf6e1a2466ee2c6891ab87bd3403"}, 1024 | {file = "scrypt-0.8.18-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:74a5981a2a3f2bc10af89c25f7c736f9bbe0fc8575957528d6338ea18c1b0c03"}, 1025 | {file = "scrypt-0.8.18-cp37-cp37m-win32.whl", hash = "sha256:a8dd767cff5a74e0eb7f2890593a214b9426edc815d2dcdbf4d41ea544828ad5"}, 1026 | {file = "scrypt-0.8.18-cp37-cp37m-win_amd64.whl", hash = "sha256:7a38cf0e5043fd514bc2ee6455fea7deb7f0a4dcf0ef14c08763b33f339a75ba"}, 1027 | {file = "scrypt-0.8.18-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:57873bbfce162569605042101e219de801b3438b7b8cd251ae7a172fad5ff556"}, 1028 | {file = "scrypt-0.8.18-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f20bef344f9e9ce92d5372247dc56b13e92f856025df54b3cf10da0b945e33f5"}, 1029 | {file = "scrypt-0.8.18-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9913f0ebb707ce0cc824592e0737693a8112e7d0603845c89bbefe5510cdb33e"}, 1030 | {file = "scrypt-0.8.18-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ffcde1d60a43e9d9aa0fc84337aee5760775ba061ec662a95a0c32ab48d162ec"}, 1031 | {file = "scrypt-0.8.18-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:6c6d5e406ab9dd253f347748556305e32b30f951b57e7e68c3e95a28000e2b32"}, 1032 | {file = "scrypt-0.8.18-cp38-cp38-win32.whl", hash = "sha256:04c256912a4271ad2a0856737800e06965431412bd5b36d361febffb67dc30ba"}, 1033 | {file = "scrypt-0.8.18-cp38-cp38-win_amd64.whl", hash = "sha256:beca5e9039d6e50b740c546d43785c514f22e6138e892c2c4ef079172fa312f8"}, 1034 | {file = "scrypt-0.8.18-cp39-cp39-manylinux1_i686.whl", hash = "sha256:967d6fb5bdd1796286dedc567a28d201c0db5edd0604a19904583983fae2efb6"}, 1035 | {file = "scrypt-0.8.18-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f9969b1b695c13ae2a0b4c2a591dbe02fabe5992ba74671aa7ad954ffdc6f3af"}, 1036 | {file = "scrypt-0.8.18-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:3a6d1c7981463eae733f08ba6e98e74b716b0d32144a4b2ff859e205cde3d2be"}, 1037 | {file = "scrypt-0.8.18-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:38195eb8c7cc12c383e25a97acbdd66530d20375f678c3718b6bb62fa67e0496"}, 1038 | {file = "scrypt-0.8.18-cp39-cp39-win32.whl", hash = "sha256:9bf50164a74517e154c1efa51441c3108cc20864b521d54801894fcaf24f6daf"}, 1039 | {file = "scrypt-0.8.18-cp39-cp39-win_amd64.whl", hash = "sha256:0436500cd2dca01400447e4bfa18fca769e5a10896880c6e29e37c0454aa2ab0"}, 1040 | {file = "scrypt-0.8.18.tar.gz", hash = "sha256:bcf04257af12e6d52974d177a7b08e314b66f350a73f9b6f7b232d69a6a1e041"}, 1041 | ] 1042 | six = [ 1043 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 1044 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 1045 | ] 1046 | termcolor = [ 1047 | {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, 1048 | ] 1049 | toml = [ 1050 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 1051 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 1052 | ] 1053 | toolz = [ 1054 | {file = "toolz-0.10.0.tar.gz", hash = "sha256:08fdd5ef7c96480ad11c12d472de21acd32359996f69a5259299b540feba4560"}, 1055 | ] 1056 | tqdm = [ 1057 | {file = "tqdm-4.61.0-py2.py3-none-any.whl", hash = "sha256:736524215c690621b06fc89d0310a49822d75e599fcd0feb7cc742b98d692493"}, 1058 | {file = "tqdm-4.61.0.tar.gz", hash = "sha256:cd5791b5d7c3f2f1819efc81d36eb719a38e0906a7380365c556779f585ea042"}, 1059 | ] 1060 | typing-extensions = [ 1061 | {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, 1062 | {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, 1063 | {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, 1064 | ] 1065 | ujson = [ 1066 | {file = "ujson-2.0.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:7ae13733d9467d16ccac2f38212cdee841b49ae927085c533425be9076b0bc9d"}, 1067 | {file = "ujson-2.0.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:6217c63a36e9b26e9271e686d212397ce7fb04c07d85509dd4e2ed73493320f8"}, 1068 | {file = "ujson-2.0.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c8369ef49169804944e920c427e350182e33756422b69989c55608fc28bebf98"}, 1069 | {file = "ujson-2.0.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0c23f21e8d2b60efab57bc6ce9d1fb7c4e96f4bfefbf5a6043a3f3309e2a738a"}, 1070 | {file = "ujson-2.0.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3d1f4705a4ec1e48ff383a4d92299d8ec25e9a8158bcea619912440948117634"}, 1071 | {file = "ujson-2.0.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2ab88e330405315512afe9276f29a60e9b3439187b273665630a57ed7fe1d936"}, 1072 | {file = "ujson-2.0.3.tar.gz", hash = "sha256:bd2deffc983827510e5145fb66e4cc0f577480c62fe0b4882139f8f7d27ae9a3"}, 1073 | ] 1074 | uptick = [ 1075 | {file = "uptick-0.2.5-py3-none-any.whl", hash = "sha256:e0d27ae1559b0e314fc9f0c5525305f66c27cc6aef914832491a3c4e457445c9"}, 1076 | {file = "uptick-0.2.5.tar.gz", hash = "sha256:66280d6dd356350543247c33d62d25b63ff8dde01dab643ef1d552034b750a83"}, 1077 | ] 1078 | urllib3 = [ 1079 | {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"}, 1080 | {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"}, 1081 | ] 1082 | virtualenv = [ 1083 | {file = "virtualenv-20.4.7-py2.py3-none-any.whl", hash = "sha256:2b0126166ea7c9c3661f5b8e06773d28f83322de7a3ff7d06f0aed18c9de6a76"}, 1084 | {file = "virtualenv-20.4.7.tar.gz", hash = "sha256:14fdf849f80dbb29a4eb6caa9875d476ee2a5cf76a5f5415fa2f1606010ab467"}, 1085 | ] 1086 | voluptuous = [ 1087 | {file = "voluptuous-0.11.7.tar.gz", hash = "sha256:2abc341dbc740c5e2302c7f9b8e2e243194fb4772585b991931cb5b22e9bf456"}, 1088 | ] 1089 | w3lib = [ 1090 | {file = "w3lib-1.22.0-py2.py3-none-any.whl", hash = "sha256:0161d55537063e00d95a241663ede3395c4c6d7b777972ba2fd58bbab2001e53"}, 1091 | {file = "w3lib-1.22.0.tar.gz", hash = "sha256:0ad6d0203157d61149fd45aaed2e24f53902989c32fc1dccc2e2bfba371560df"}, 1092 | ] 1093 | websocket-client = [ 1094 | {file = "websocket_client-0.56.0-py2.py3-none-any.whl", hash = "sha256:1151d5fb3a62dc129164292e1227655e4bbc5dd5340a5165dfae61128ec50aa9"}, 1095 | {file = "websocket_client-0.56.0.tar.gz", hash = "sha256:1fd5520878b68b84b5748bb30e592b10d0a91529d5383f74f4964e72b297fd3a"}, 1096 | ] 1097 | websockets = [ 1098 | {file = "websockets-8.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:3762791ab8b38948f0c4d281c8b2ddfa99b7e510e46bd8dfa942a5fff621068c"}, 1099 | {file = "websockets-8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:3db87421956f1b0779a7564915875ba774295cc86e81bc671631379371af1170"}, 1100 | {file = "websockets-8.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4f9f7d28ce1d8f1295717c2c25b732c2bc0645db3215cf757551c392177d7cb8"}, 1101 | {file = "websockets-8.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:295359a2cc78736737dd88c343cd0747546b2174b5e1adc223824bcaf3e164cb"}, 1102 | {file = "websockets-8.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:1d3f1bf059d04a4e0eb4985a887d49195e15ebabc42364f4eb564b1d065793f5"}, 1103 | {file = "websockets-8.1-cp36-cp36m-win32.whl", hash = "sha256:2db62a9142e88535038a6bcfea70ef9447696ea77891aebb730a333a51ed559a"}, 1104 | {file = "websockets-8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:0e4fb4de42701340bd2353bb2eee45314651caa6ccee80dbd5f5d5978888fed5"}, 1105 | {file = "websockets-8.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:9b248ba3dd8a03b1a10b19efe7d4f7fa41d158fdaa95e2cf65af5a7b95a4f989"}, 1106 | {file = "websockets-8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ce85b06a10fc65e6143518b96d3dca27b081a740bae261c2fb20375801a9d56d"}, 1107 | {file = "websockets-8.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:965889d9f0e2a75edd81a07592d0ced54daa5b0785f57dc429c378edbcffe779"}, 1108 | {file = "websockets-8.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:751a556205d8245ff94aeef23546a1113b1dd4f6e4d102ded66c39b99c2ce6c8"}, 1109 | {file = "websockets-8.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3ef56fcc7b1ff90de46ccd5a687bbd13a3180132268c4254fc0fa44ecf4fc422"}, 1110 | {file = "websockets-8.1-cp37-cp37m-win32.whl", hash = "sha256:7ff46d441db78241f4c6c27b3868c9ae71473fe03341340d2dfdbe8d79310acc"}, 1111 | {file = "websockets-8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:20891f0dddade307ffddf593c733a3fdb6b83e6f9eef85908113e628fa5a8308"}, 1112 | {file = "websockets-8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c1ec8db4fac31850286b7cd3b9c0e1b944204668b8eb721674916d4e28744092"}, 1113 | {file = "websockets-8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5c01fd846263a75bc8a2b9542606927cfad57e7282965d96b93c387622487485"}, 1114 | {file = "websockets-8.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9bef37ee224e104a413f0780e29adb3e514a5b698aabe0d969a6ba426b8435d1"}, 1115 | {file = "websockets-8.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d705f8aeecdf3262379644e4b55107a3b55860eb812b673b28d0fbc347a60c55"}, 1116 | {file = "websockets-8.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:c8a116feafdb1f84607cb3b14aa1418424ae71fee131642fc568d21423b51824"}, 1117 | {file = "websockets-8.1-cp38-cp38-win32.whl", hash = "sha256:e898a0863421650f0bebac8ba40840fc02258ef4714cb7e1fd76b6a6354bda36"}, 1118 | {file = "websockets-8.1-cp38-cp38-win_amd64.whl", hash = "sha256:f8a7bff6e8664afc4e6c28b983845c5bc14965030e3fb98789734d416af77c4b"}, 1119 | {file = "websockets-8.1.tar.gz", hash = "sha256:5c65d2da8c6bce0fca2528f69f44b2f977e06954c8512a952222cea50dad430f"}, 1120 | ] 1121 | yarl = [ 1122 | {file = "yarl-1.6.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434"}, 1123 | {file = "yarl-1.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478"}, 1124 | {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6"}, 1125 | {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e"}, 1126 | {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406"}, 1127 | {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76"}, 1128 | {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366"}, 1129 | {file = "yarl-1.6.3-cp36-cp36m-win32.whl", hash = "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721"}, 1130 | {file = "yarl-1.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643"}, 1131 | {file = "yarl-1.6.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e"}, 1132 | {file = "yarl-1.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3"}, 1133 | {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8"}, 1134 | {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a"}, 1135 | {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c"}, 1136 | {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f"}, 1137 | {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970"}, 1138 | {file = "yarl-1.6.3-cp37-cp37m-win32.whl", hash = "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e"}, 1139 | {file = "yarl-1.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50"}, 1140 | {file = "yarl-1.6.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2"}, 1141 | {file = "yarl-1.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec"}, 1142 | {file = "yarl-1.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71"}, 1143 | {file = "yarl-1.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc"}, 1144 | {file = "yarl-1.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959"}, 1145 | {file = "yarl-1.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2"}, 1146 | {file = "yarl-1.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2"}, 1147 | {file = "yarl-1.6.3-cp38-cp38-win32.whl", hash = "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896"}, 1148 | {file = "yarl-1.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a"}, 1149 | {file = "yarl-1.6.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e"}, 1150 | {file = "yarl-1.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724"}, 1151 | {file = "yarl-1.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c"}, 1152 | {file = "yarl-1.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25"}, 1153 | {file = "yarl-1.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96"}, 1154 | {file = "yarl-1.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0"}, 1155 | {file = "yarl-1.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4"}, 1156 | {file = "yarl-1.6.3-cp39-cp39-win32.whl", hash = "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424"}, 1157 | {file = "yarl-1.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6"}, 1158 | {file = "yarl-1.6.3.tar.gz", hash = "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10"}, 1159 | ] 1160 | --------------------------------------------------------------------------------