├── nyt_haiku
├── __init__.py
├── data
│ ├── sensitive_sections.txt
│ ├── bad_abbreviations.txt
│ ├── sensitive_terms.txt
│ ├── sensitive_tags.txt
│ └── syllable_counts.csv
├── errors.py
├── models.py
├── twitter.py
├── moderator.py
├── haiku.py
└── nyt.py
├── README.md
├── .gitignore
├── setup.py
├── logconfig.ini
├── remove_syllapy_redundant.py
├── Pipfile
├── pyrightconfig.json
├── main.py
├── syllapy_check.py
├── publish.py
├── tests
├── test_nyt.py
├── test_moderator.py
└── test_haiku.py
├── twitter_stats.py
├── templates
└── index.html
└── Pipfile.lock
/nyt_haiku/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/nyt_haiku/data/sensitive_sections.txt:
--------------------------------------------------------------------------------
1 | Opinion
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # NYT Haiku Bot
2 |
3 | A new python implementation of an old classic. Still under early development!
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .idea
3 | *.log
4 | tmp/
5 | logs/
6 |
7 | *.py[cod]
8 | *.egg
9 | build
10 | htmlcov.env
11 |
12 | .env
13 |
--------------------------------------------------------------------------------
/nyt_haiku/errors.py:
--------------------------------------------------------------------------------
1 | class Error(Exception):
2 | """Base class for exceptions in this module."""
3 | pass
4 |
5 |
6 | class LineMismatchError(Error):
7 | pass
8 |
9 |
10 | class SyllableCountError(Error):
11 | pass
12 |
--------------------------------------------------------------------------------
/nyt_haiku/data/bad_abbreviations.txt:
--------------------------------------------------------------------------------
1 | a.k.a.
2 | Apr.
3 | Aug.
4 | Bros.
5 | Calif.
6 | Cpl.
7 | Dec.
8 | Dr.
9 | Feb.
10 | Fla.
11 | Jan.
12 | Jul.
13 | Jun.
14 | Mar.
15 | Mont.
16 | Mr.
17 | Mrs.
18 | Ms.
19 | Mx.
20 | Nov.
21 | Oct.
22 | Okla.
23 | Pfc.
24 | Sep.
25 | Sept.
26 | Tex.
27 | Calif.
28 | Minn.
29 | Mont.
30 | Wyo.
31 |
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | import os
3 |
4 | import asyncio
5 | from dotenv import load_dotenv
6 |
7 | from nyt_haiku import models
8 |
9 | # settings.py
10 | load_dotenv()
11 |
12 | async def main():
13 | db_path = os.getenv("DB_PATH")
14 | await models.init(db_path)
15 | await models.setup_db()
16 | await models.close_db()
17 |
18 |
19 | asyncio.run(main())
20 |
--------------------------------------------------------------------------------
/logconfig.ini:
--------------------------------------------------------------------------------
1 | [loggers]
2 | keys=root
3 |
4 | [handlers]
5 | keys=stream_handler
6 |
7 | [formatters]
8 | keys=formatter
9 |
10 | [logger_root]
11 | level=DEBUG
12 | handlers=stream_handler
13 |
14 | [handler_stream_handler]
15 | class=StreamHandler
16 | level=INFO
17 | formatter=formatter
18 | args=(sys.stderr,)
19 |
20 | [formatter_formatter]
21 | format=%(asctime)s %(levelname)-6s %(message)s
22 |
--------------------------------------------------------------------------------
/remove_syllapy_redundant.py:
--------------------------------------------------------------------------------
1 | import os
2 | import csv
3 | import syllapy
4 |
5 | syllable_file_path = os.path.join(os.path.dirname(__file__), 'nyt_haiku', 'data', 'syllable_counts.csv')
6 | with open(syllable_file_path, newline='') as file:
7 | reader = csv.reader(file)
8 | for row in reader:
9 | if len(row) == 2:
10 | word = row[0].lower()
11 | count = int(row[1])
12 | if count != syllapy.count(word):
13 | print(f"{word},{count}")
14 |
--------------------------------------------------------------------------------
/Pipfile:
--------------------------------------------------------------------------------
1 | [[source]]
2 | name = "pypi"
3 | url = "https://pypi.org/simple"
4 | verify_ssl = true
5 |
6 | [dev-packages]
7 | pytest = "*"
8 | pytest-cov = "*"
9 | pytest-mock = "*"
10 | flake8 = "*"
11 | pytest-asyncio = "*"
12 | pytest-aiohttp = "*"
13 |
14 | [packages]
15 | spacy = "*"
16 | syllapy = "*"
17 | beautifulsoup4 = "*"
18 | asyncio = "*"
19 | aiohttp = "*"
20 | cchardet = "*"
21 | python-dateutil = "*"
22 | aiodns = "*"
23 | python-dotenv = "*"
24 | peony-twitter = "*"
25 | aiofiles = "*"
26 | aiosqlite = "*"
27 | tortoise-orm = "== 0.16.21"
28 | num2words = "*"
29 | unidecode = "*"
30 | jinja2 = "*"
31 |
--------------------------------------------------------------------------------
/pyrightconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "include": [
3 | "nyt_haiku"
4 | ],
5 |
6 | "exclude": [
7 | "**/node_modules",
8 | "**/__pycache__"
9 | ],
10 |
11 | "ignore": [
12 | "src/oldstuff"
13 | ],
14 |
15 | "stubPath": "nyt_haiku/stubs",
16 | "venvPath": "/Users/harrisj/.local/share/virtualenvs",
17 |
18 | "reportMissingImports": true,
19 | "reportMissingTypeStubs": false,
20 |
21 | "pythonVersion": "3.7",
22 | "pythonPlatform": "Linux",
23 |
24 | "executionEnvironments": [
25 | {
26 | "root": "nyt_haiku",
27 | "pythonVersion": "3.7",
28 | "venv": "nyt-haiku-python-YGCPWoh4"
29 | },
30 | {
31 | "root": "tests",
32 | "pythonVersion": "3.7",
33 | "venv": "nyt-haiku-python-YGCPWoh4"
34 | }
35 | ]
36 | }
37 |
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | import os
3 |
4 | import asyncio
5 | import aiohttp
6 | import logging
7 | import logging.config
8 | from dotenv import load_dotenv
9 | from nyt_haiku import models, nyt, twitter
10 | from nyt_haiku.haiku import HaikuFinder
11 |
12 | load_dotenv()
13 |
14 | logger = logging.getLogger()
15 | logging.config.fileConfig('logconfig.ini')
16 |
17 |
18 | async def main():
19 | logger.info("Starting run...")
20 | db_path = os.getenv("DB_PATH")
21 | haiku_finder = HaikuFinder()
22 | await models.init(db_path)
23 |
24 | connector = aiohttp.TCPConnector(limit_per_host=15)
25 | async with aiohttp.ClientSession(connector=connector) as session:
26 | await nyt.check_sections(session, logger)
27 | await nyt.fetch_articles(session, logger, haiku_finder)
28 | if os.getenv("DISABLE_TWITTER") != 'true':
29 | await twitter.tweet(session, logger)
30 |
31 | await models.close_db()
32 | logger.info("Ending run...")
33 |
34 | asyncio.run(main())
35 |
--------------------------------------------------------------------------------
/nyt_haiku/data/sensitive_terms.txt:
--------------------------------------------------------------------------------
1 | FEMA
2 | abort
3 | abortion
4 | abuse
5 | armed
6 | arms
7 | assault
8 | assaulted
9 | assaulting
10 | assaults
11 | attack
12 | attacked
13 | attacking
14 | attacks
15 | autopsy
16 | blast
17 | blasts
18 | bomb
19 | bombing
20 | bombs
21 | choked
22 | coronavirus
23 | covid
24 | covid-19
25 | crime
26 | dead
27 | deadly
28 | death penalty
29 | deaths
30 | drone
31 | dying
32 | emergency
33 | evacuate
34 | explode
35 | explodes
36 | exploding
37 | exploding
38 | explosion
39 | ground zero
40 | gun
41 | harrass
42 | hate crime
43 | hijack
44 | hostage
45 | hostages
46 | hurricane
47 | insurgent
48 | israel
49 | is survived by
50 | jury
51 | kidnap
52 | kidnapped
53 | kidnapping
54 | kidnaps
55 | kill
56 | killed
57 | killing
58 | kills
59 | massacre
60 | missile
61 | missing
62 | molest
63 | molested
64 | murder
65 | murdered
66 | murderer
67 | murdering
68 | murdering
69 | nuclear
70 | pro-choice
71 | pro-life
72 | prosecute
73 | qanon
74 | raid
75 | riot
76 | sentenced
77 | sentenced
78 | sexual
79 | sexually
80 | shoot
81 | shooting
82 | shooting
83 | shoots
84 | shot
85 | stabbed
86 | suicide
87 | suicides
88 | suspect
89 | suspects
90 | terror
91 | terrorist
92 | trial
93 | tropical storm
94 | tsunami
95 | victim
96 | violence
97 | violent
98 | warhead
99 | weapon
100 |
--------------------------------------------------------------------------------
/syllapy_check.py:
--------------------------------------------------------------------------------
1 | import sys
2 | import requests
3 | from nyt_haiku import nyt, haiku
4 | from nyt_haiku.moderator import ArticleModerator
5 | from nyt_haiku.haiku import HaikuFinder, clean_term
6 | from string import punctuation
7 | import logging
8 | words = {}
9 |
10 | logger = logging.getLogger(__name__)
11 |
12 | def fetch_article(url):
13 | headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
14 | r = requests.get(url, headers=headers)
15 | assert r.status_code == 200, f"Received {r.status_code} for {url}"
16 |
17 | meta, body = nyt.parse_article(logger, url, r.text, True)
18 | return body
19 |
20 | if __name__ == "__main__":
21 | url = sys.argv[1]
22 | body = fetch_article(url)
23 | haiku = HaikuFinder()
24 | sentences = haiku.sentences_from_article(body)
25 | moderator = ArticleModerator()
26 |
27 | for sent in sentences:
28 | print(sent)
29 |
30 | terms = haiku.terms_from_sentence(sent)
31 | for (term, count) in terms:
32 | term = clean_term(term)
33 | words[term] = count
34 |
35 | haikus = haiku.find_haikus_in_article(body)
36 |
37 | print("\n\nTERMS")
38 | for word in sorted(words.keys()):
39 | print(f"{word}: {words[word]}")
40 |
41 | print("\n\nHAIKU")
42 | for haiku in haikus:
43 | if not moderator.is_awkward(haiku["sentence"]):
44 | print(f'{haiku["lines"][0]}\n{haiku["lines"][1]}\n{haiku["lines"][2]}\n')
45 |
--------------------------------------------------------------------------------
/nyt_haiku/models.py:
--------------------------------------------------------------------------------
1 | from tortoise import Tortoise, run_async, fields
2 | from tortoise.models import Model
3 |
4 |
5 | class Article(Model):
6 | id = fields.IntField(pk=True)
7 | parsed = fields.BooleanField(null=False, default=False)
8 | url = fields.CharField(max_length=1024, unique=True, null=False)
9 | nyt_uri = fields.TextField(null=True)
10 | title = fields.TextField(null=True)
11 | published_at = fields.DatetimeField(null=True)
12 | description = fields.TextField(null=True)
13 | byline = fields.TextField(null=True)
14 | section = fields.CharField(max_length=32, null=True)
15 | keywords = fields.TextField(null=True)
16 | tags = fields.TextField(null=True)
17 | sensitive = fields.BooleanField(null=False, default=False)
18 | created_at = fields.DatetimeField(null=True, auto_now_add=True)
19 |
20 |
21 | class Haiku(Model):
22 | id = fields.IntField(pk=True)
23 | hash = fields.CharField(max_length=255, unique=True, null=False)
24 | article = fields.ForeignKeyField('models.Article', related_name='haiku')
25 | sentence = fields.TextField()
26 | line0 = fields.TextField()
27 | line1 = fields.TextField()
28 | line2 = fields.TextField()
29 | tweet = fields.TextField(null=True)
30 | tweet_id = fields.TextField(null=True)
31 | tweeted_at = fields.DatetimeField(null=True)
32 | retweet_count = fields.IntField(null=False, default=0)
33 | favorite_count = fields.IntField(null=False, default=0)
34 | created_at = fields.DatetimeField(null=True, auto_now_add=True)
35 | quote_count = fields.IntField(null=False, default=0)
36 |
37 |
38 | async def init(path):
39 | # Here we connect to a SQLite DB file.
40 | # also specify the app name of "models"
41 | # which contain models from "app.models"
42 | await Tortoise.init(
43 | db_url=f'sqlite://{path}',
44 | modules={'models': ['nyt_haiku.models']}
45 | )
46 |
47 |
48 | async def setup_db():
49 | await Tortoise.generate_schemas()
50 |
51 |
52 | async def close_db():
53 | await Tortoise.close_connections()
54 |
--------------------------------------------------------------------------------
/publish.py:
--------------------------------------------------------------------------------
1 | import csv
2 | import os
3 | import json
4 |
5 | import asyncio
6 | import logging
7 | import logging.config
8 | from tortoise import Tortoise
9 | from jinja2 import Environment, FileSystemLoader
10 |
11 | from dotenv import load_dotenv
12 | from nyt_haiku import models
13 |
14 | load_dotenv()
15 |
16 | logger = logging.getLogger()
17 | logging.config.fileConfig('logconfig.ini')
18 |
19 | async def publish_csv():
20 | logger.info("Publishing CSV...")
21 | headers = ['id', 'tweet_id', 'tweeted_at', 'line0', 'line1', 'line2', 'tweet_url', 'favorite_count', 'retweet_count', 'quote_count', 'nyt_url', 'nyt_title', 'byline', 'published_at', 'section', 'tags']
22 | haikus = await models.Haiku.filter(tweet_id__not_isnull=True).order_by('id').all().prefetch_related("article")
23 | csv_path = os.getenv('CSV_OUTPUT_PATH')
24 |
25 | with open(csv_path, 'w', newline='') as csvfile:
26 | csvwriter = csv.writer(csvfile)
27 | csvwriter.writerow(headers)
28 |
29 | for h in haikus:
30 | csvwriter.writerow([h.id, h.tweet_id, h.tweeted_at, h.line0, h.line1, h.line2, f"https://twitter.com/nythaikus/status/{h.tweet_id}",
31 | h.favorite_count, h.retweet_count, h.quote_count, h.article.url, h.article.title,
32 | h.article.byline, h.article.published_at, h.article.section, h.article.tags])
33 |
34 | async def publish_html():
35 | logger.info("Publishing HTML...")
36 |
37 | html_path = os.getenv('HTML_OUTPUT_PATH')
38 | conn = Tortoise.get_connection("default")
39 | haikus = await conn.execute_query_dict("select h.tweet_id, h.line0, h.line1, h.line2, h.favorite_count, h.retweet_count, h.quote_count, a.url, a.title from haiku h join article a on a.id = h.article_id where h.tweet_id is NOT NULL AND favorite_count + retweet_count + quote_count > 0 order by favorite_count + retweet_count + quote_count DESC limit 50")
40 |
41 | env = Environment(loader=FileSystemLoader('templates'))
42 | template = env.get_template('index.html')
43 | output_from_parsed_template = template.render(haikus=haikus)
44 |
45 | # to save the results
46 | with open(html_path, "w") as fh:
47 | fh.write(output_from_parsed_template)
48 |
49 |
50 | async def main():
51 | db_path = os.getenv("DB_PATH")
52 | await models.init(db_path)
53 | await publish_csv()
54 | await publish_html()
55 | await models.close_db()
56 |
57 | asyncio.run(main())
58 |
--------------------------------------------------------------------------------
/tests/test_nyt.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 | import pytest
4 | from dateutil import parser
5 | import logging
6 |
7 | from nyt_haiku import nyt, haiku
8 |
9 | logger = logging.getLogger(__name__)
10 | logger.setLevel(logging.NOTSET)
11 |
12 |
13 | def test_normalize_url():
14 | assert nyt.normalize_url('http://www.foo.com/') == "http://www.foo.com/"
15 | assert nyt.normalize_url('http://www.foo.com/bar?baz=quux') == "http://www.foo.com/bar"
16 |
17 |
18 | def test_parse_article():
19 | path = os.path.join(os.path.dirname(__file__), 'samples', 'article.html')
20 | html = ''
21 |
22 | with open(path) as file:
23 | html = file.read()
24 |
25 | meta, body = nyt.parse_article(logger, 'http://nytimes.com/', html)
26 |
27 | assert body is not None
28 | assert not meta['sensitive']
29 | assert meta['parsed']
30 | assert meta['title'] == "How to Negotiate With Your Landlord"
31 | assert meta['nyt_uri'] == 'nyt://article/41bdb446-cd51-57ad-9d24-a78f587d42e1'
32 | assert meta["published_at"] == parser.parse('2020-09-25T13:00:08.000Z')
33 | assert meta['byline'] == 'By Ronda Kaysen'
34 | assert meta['description'] == 'It’s a renter’s market. Here are some tips to help you take advantage of your power as a tenant.'
35 | assert meta['keywords'] == 'Real Estate, Housing,Rent,Landlord,Service Content,Shelter-in-Place (Lifestyle);Social Distancing,Brooklyn,Manhattan,Queens'
36 | assert meta['section'] == 'Real Estate'
37 | assert meta['tags'] == 'Real Estate and Housing (Residential);Renting and Leasing (Real Estate);Landlords;Content Type: Service;Quarantine (Life and Culture);Brooklyn (NYC);Manhattan (NYC);Queens (NYC)'
38 |
39 |
40 |
41 | def test_parse_blog():
42 | path = os.path.join(os.path.dirname(__file__), 'samples', 'live_blog.html')
43 | html = ''
44 |
45 | with open(path) as file:
46 | html = file.read()
47 |
48 | meta, body = nyt.parse_article(logger, 'http://nytimes.com/', html)
49 |
50 | assert body is not None
51 | assert not meta['sensitive']
52 | assert meta['parsed']
53 | assert meta['title'] == 'Tech Stocks Lead Wall Street Higher: Live Business Briefing'
54 | assert meta['nyt_uri'] == 'nyt://legacycollection/19601213-5afe-5bb1-9b8d-4b0b416356be'
55 | assert meta['published_at'] == parser.parse('2020-09-25T10:28:45.000Z')
56 | assert meta['byline'] == 'By Kevin Granville and Mohammed Hadi'
57 | assert meta['description'] == ''
58 | assert meta['keywords'] == 'null'
59 | assert meta['section'] == 'Business'
60 |
--------------------------------------------------------------------------------
/nyt_haiku/twitter.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | from tortoise import Tortoise
4 | from peony import PeonyClient
5 | from dateutil import parser
6 |
7 | from nyt_haiku import models
8 |
9 | def tweet_from_haiku(haiku: models.Haiku):
10 | return f"{haiku.line0}\n{haiku.line1}\n{haiku.line2}\n\n{haiku.article.url}"
11 |
12 |
13 | def change_in_counts(haiku: models.Haiku, favorite_count: int, retweet_count: int) -> bool:
14 | return haiku.favorite_count is None or haiku.retweet_count is None or favorite_count > haiku.favorite_count or retweet_count > haiku.retweet_count
15 |
16 |
17 | async def tweet(session, logger):
18 | twitter_client = PeonyClient(consumer_key=os.getenv("TWITTER_CONSUMER_KEY"),
19 | consumer_secret=os.getenv("TWITTER_CONSUMER_SECRET"),
20 | access_token=os.getenv("TWITTER_ACCESS_TOKEN"),
21 | access_token_secret=os.getenv("TWITTER_ACCESS_TOKEN_SECRET"),
22 | session=session)
23 |
24 | # Need to do a manual connection to order by random
25 | conn = Tortoise.get_connection("default")
26 | haiku_rows = await conn.execute_query_dict("select id from haiku where tweet_id IS NULL AND article_id NOT IN (select article_id from haiku where tweet_id IS NOT NULL and tweeted_at > datetime('now','-2 hour')) ORDER BY RANDOM() limit 1")
27 |
28 | if len(haiku_rows) > 0:
29 | haiku = await models.Haiku.get(id=haiku_rows[0]["id"])
30 | await haiku.fetch_related('article')
31 | haiku.tweet = tweet_from_haiku(haiku)
32 |
33 | response = await twitter_client.api.statuses.update.post(status=haiku.tweet, trim_user=True)
34 | haiku.tweet_id = response['id_str']
35 | haiku.tweeted_at = parser.parse(response['created_at'])
36 |
37 | log_line = f"{haiku.line0} / {haiku.line1} / {haiku.line2}"
38 | logger.info(f"TWEET {haiku.tweet_id} {log_line}")
39 |
40 | await haiku.save()
41 |
42 | response = await twitter_client.api.statuses.user_timeline.get(count=200, screen_name=os.getenv("TWITTER_USERNAME"), trim_user=True)
43 | for t in response:
44 | haiku = await models.Haiku.filter(tweet_id=t['id_str']).first()
45 | if haiku:
46 | favorite_count = t['favorite_count']
47 | retweet_count = t['retweet_count']
48 |
49 | if change_in_counts(haiku, favorite_count, retweet_count):
50 | logger.info(f"TWEET {t['id_str']} FAVES: {haiku.favorite_count} -> {favorite_count} RT: {haiku.retweet_count} -> {retweet_count}")
51 | haiku.favorite_count = favorite_count
52 | haiku.retweet_count = retweet_count
53 | await haiku.save()
54 |
55 | logger.info("TWEET STATISTICS updated")
56 |
--------------------------------------------------------------------------------
/tests/test_moderator.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | from nyt_haiku.moderator import ArticleModerator
3 |
4 | a = ArticleModerator()
5 |
6 | @pytest.fixture(scope="module")
7 | def mod():
8 | a = ArticleModerator()
9 | return a
10 |
11 | def test_sensitive_tags(mod):
12 | assert mod.is_sensitive_tag("Looting")
13 | assert not mod.is_sensitive_tag("Arts and Entertainment")
14 |
15 |
16 | def test_sensitive_terms(mod):
17 | assert mod.contains_sensitive_term("Area man murdered by angry goose")
18 | assert not mod.contains_sensitive_term("Area man given ice cream by friendly goose")
19 |
20 |
21 | @pytest.mark.parametrize('text', [
22 | "My friend Dr. Watson",
23 | "Mr. Raffensperger responded quickly in a statement of his own.",
24 | "She retired to Boca Raton, Fla. last year.",
25 | "Arthur D. Lastname.",
26 | "Another day at I.B.M. for us.",
27 | "CAIRO - The sun?",
28 | "The nameless narrator in Yishai Sarid’s",
29 | "’s priorities the necessary step to",
30 | "— I hiked them one after the other on",
31 | "-aware this is the end",
32 | ", among other things",
33 | 'It is not over," she said.',
34 | "After four years, she said to me, ‘Calvin, ",
35 | "Are these qualities carried in our genes, or does the life we live —",
36 | "He already had a pair of Crocs, he said, “but these were Bad Bunny",
37 | "probably revenge for a joke Michael",
38 | "At his expense, he said",
39 | "“— and make sure that we invest in the people who in fact need the help.",
40 | "invest in the people who in fact need the help.“",
41 | "The end;",
42 | "The end-",
43 | "The end)",
44 | "By Jacob Harris",
45 | "From match.com",
46 | "And that is why I have only one answer to every question now:",
47 | "Michaela Coel] is such a good writer.",
48 | "Michaela Coel) is such a good writer.",
49 | "But (Michaela Coel is such a good writer.",
50 | "But [Michaela Coel is such a good writer.",
51 | "He gave way to a lefty, Tim Hill, with two outs in the second, and",
52 | "He gave way to a lefty, Tim Hill, with two outs in the second, or",
53 | "He gave way to a lefty, Tim Hill, with two outs in the second, but",
54 | "Jacob Harris for the New York Times?",
55 | "He contacted The Times for correction!",
56 | "Photograph by Jacob Harris.",
57 | "Illustration by Jacob Harris.",
58 | "Cost was $83 total.",
59 | "Down 86th Street we strolled.",
60 | "Stock of AT&T declined."])
61 | def test_is_awkward_text(mod, text):
62 | assert mod.is_awkward(text)
63 |
64 | @pytest.mark.parametrize('text', [
65 | "My friend Dr Watson.",
66 | "There are 43 lights.",
67 | "I won't do it!",
68 | "Her name is Rio and she dances on the sand!",
69 | "Her vocal authority and pop fame?",
70 | "Self-aware this is the end.",
71 | "Michaela Coel is such an [expletive] good writer!",
72 | "This is by us!",
73 | "How many hours of creative work do you think you do in a day?",
74 | "It didn’t matter how big the pool was, if there was a pool I’d jump in."])
75 | def test_is_not_awkward(mod, text):
76 | assert not mod.is_awkward(text)
77 |
--------------------------------------------------------------------------------
/twitter_stats.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | import asyncio
4 | import logging
5 | import logging.config
6 | from peony import PeonyClient
7 | from dotenv import load_dotenv
8 | from nyt_haiku import models
9 | from nyt_haiku.models import Haiku
10 |
11 | load_dotenv()
12 |
13 | logger = logging.getLogger()
14 | logging.config.fileConfig('logconfig.ini')
15 |
16 | loop = asyncio.get_event_loop()
17 |
18 | twitter_client = PeonyClient(consumer_key=os.getenv("TWITTER_CONSUMER_KEY"),
19 | consumer_secret=os.getenv("TWITTER_CONSUMER_SECRET"),
20 | access_token=os.getenv("TWITTER_ACCESS_TOKEN"),
21 | access_token_secret=os.getenv("TWITTER_ACCESS_TOKEN_SECRET"),
22 | api_version="2",
23 | suffix="")
24 |
25 | async def count_records():
26 | count = await Haiku.filter(tweet_id__not_isnull=True).count()
27 | logger.info(f"{count} records in DB...")
28 | return count
29 |
30 |
31 | async def fetch_records(offset, limit):
32 | return await Haiku.filter(tweet_id__not_isnull=True).order_by('id').offset(offset).limit(limit)
33 |
34 |
35 | def change_in_statistics(record, tweet):
36 | return record.retweet_count != tweet["public_metrics"]["retweet_count"] or record.favorite_count != tweet["public_metrics"]["like_count"] or record.quote_count != tweet["public_metrics"]["quote_count"]
37 |
38 |
39 | async def update_tweet_stats(records):
40 | records_by_id = {}
41 | for r in records:
42 | records_by_id[r.tweet_id] = r
43 |
44 | logger.debug(records_by_id)
45 |
46 | tweet_ids = [r.tweet_id for r in records]
47 |
48 | dotted_parameters = {"tweet.fields": "public_metrics"}
49 | response = await twitter_client.api.tweets.get(
50 | ids=','.join(tweet_ids),
51 | **dotted_parameters)
52 |
53 | logger.debug(response)
54 |
55 | for t in response['data']:
56 | record = records_by_id[t.get("id")]
57 | if change_in_statistics(record, t):
58 | tweet_stats = t["public_metrics"]
59 | logger.info(f"TWEET {t.id} FAVES: {record.favorite_count} -> {tweet_stats['like_count']} RT: {record.retweet_count} -> {tweet_stats['retweet_count']} QT: {record.quote_count} -> {tweet_stats['quote_count']}")
60 |
61 | record.favorite_count = tweet_stats['like_count']
62 | record.retweet_count = tweet_stats['retweet_count']
63 | record.quote_count = tweet_stats['quote_count']
64 | await record.save()
65 |
66 |
67 | async def fetch_and_update(offset, limit):
68 | logger.info(f"OFFSET: {offset}")
69 |
70 | records = await fetch_records(offset, limit)
71 | logger.info(f"Fetched {len(records)} records")
72 | await update_tweet_stats(records)
73 |
74 |
75 | async def main():
76 | logger.info("Starting run...")
77 | db_path = os.getenv("DB_PATH")
78 | await models.init(db_path)
79 |
80 | count = await count_records()
81 | offset = 0
82 | limit = 100
83 |
84 | while offset < count:
85 | await fetch_and_update(offset, limit)
86 | offset += limit
87 |
88 | await models.close_db()
89 |
90 |
91 | loop.run_until_complete(main())
92 |
--------------------------------------------------------------------------------
/tests/test_haiku.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | import collections.abc
3 | import syllapy
4 |
5 | from nyt_haiku import haiku
6 | from nyt_haiku.haiku import HaikuFinder
7 |
8 |
9 | @pytest.fixture(scope="module")
10 | def haiku_finder():
11 | return HaikuFinder()
12 |
13 |
14 | def test_sentences_from_article(haiku_finder):
15 | para = "It was the puzzle’s creator, an unassuming Hungarian architecture professor named Erno Rubik. When he invented the cube in 1974, he wasn’t sure it could ever be solved. Mathematicians later calculated that there are 43,252,003,274,489,856,000 ways to arrange the squares, but just one of those combinations is correct."
16 |
17 | sentences = haiku_finder.sentences_from_article(para)
18 | assert isinstance(sentences, collections.abc.Sequence)
19 | assert len(sentences) > 1
20 |
21 | sentences = haiku_finder.sentences_from_article("")
22 | assert isinstance(sentences, collections.abc.Sequence)
23 | assert len(sentences) == 0
24 |
25 | sentences = haiku_finder.sentences_from_article(None)
26 | assert isinstance(sentences, collections.abc.Sequence)
27 | assert len(sentences) == 0
28 |
29 |
30 | def test_terms_from_sentence(haiku_finder):
31 | sentence = "It was the puzzle’s creator — an unassuming architecture professor named Erno Rubik."
32 | terms = haiku_finder.terms_from_sentence(sentence)
33 |
34 | assert terms == [("It", 1), ("was", 1), ("the", 1), ("puzzle’s", 2), ("creator", 3), ("—", 0),
35 | ("an", 1), ("unassuming", 4), ("architecture", 4),
36 | ("professor", 3), ("named", 1), ("Erno", 2), ("Rubik.", 2)]
37 |
38 |
39 | def test_load_syllables_override(haiku_finder):
40 | sentence = "he debates all"
41 | terms = haiku_finder.terms_from_sentence(sentence)
42 | assert terms == [("he", 1), ("debates", 2), ("all", 1)]
43 |
44 |
45 | @pytest.mark.parametrize("ldelim, rdelim", [
46 | (" ", "\n"),
47 | ("\t", "\r\n"),
48 | ("(", ")"),
49 | ("[", "]"),
50 | ('"', '"'),
51 | ('“', '”'),
52 | ("'", "'"),
53 | ("’", "’"),
54 | ("", ";")
55 | ])
56 | def test_terms_from_sentence_strip(haiku_finder, ldelim, rdelim):
57 | sentence = f"{ldelim}Passersby were astonished by the amount of fudge{rdelim}"
58 | print(sentence)
59 | terms = haiku_finder.terms_from_sentence(sentence)
60 | assert len(terms) > 0
61 | assert terms[0] == ("Passersby", 3)
62 | assert terms[-1] == ("fudge", 1)
63 |
64 |
65 | @pytest.mark.parametrize("term,expected", [
66 | ("apple", 2),
67 | ("scene's", 1),
68 | ("France's", 2),
69 | ("Disney+", 3),
70 | ("57", 4),
71 | ("1,235", 10),
72 | ("1952", 5),
73 | ("1920s", 4),
74 | ("buyer/seller", 4),
75 | ("old-fashioned", 3),
76 | ("2-year-old", 3),
77 | ("self-aware", 3),
78 | ("16-10", 4),
79 | ("-carry", 2)])
80 | def test_syllables_for_term(haiku_finder, term, expected):
81 | assert haiku_finder.syllables_for_term(term) == expected
82 |
83 |
84 | @pytest.mark.parametrize("term,expected", [
85 | ("weren’t", 1)])
86 | def test_overrides_for_term(haiku_finder, term, expected):
87 | stripped_term = haiku.clean_term(term)
88 | assert stripped_term in syllapy.WORD_DICT
89 | assert haiku_finder.syllables_for_term(term) == expected
90 |
--------------------------------------------------------------------------------
/nyt_haiku/moderator.py:
--------------------------------------------------------------------------------
1 | import os
2 | import re
3 |
4 | class ArticleModerator:
5 | def __init__(self):
6 | self.init_sensitive_tags()
7 | self.init_sensitive_terms()
8 | self.init_sensitive_sections()
9 | self.init_awkward_abbreviations()
10 |
11 | def init_sensitive_tags(self):
12 | with open(os.path.join(os.path.dirname(__file__), 'data', 'sensitive_tags.txt')) as fp:
13 | self.sensitive_tags = set(line for line in (l.strip() for l in fp) if line)
14 |
15 | # print(f"SENSITIVE TAGS: {len(self.sensitive_tags)} loaded")
16 |
17 | def init_sensitive_terms(self):
18 | with open(os.path.join(os.path.dirname(__file__), 'data', 'sensitive_terms.txt')) as fp:
19 | self.sensitive_terms = set(line for line in (l.strip() for l in fp) if line)
20 |
21 | # print(f"SENSITIVE TERMS: {len(self.sensitive_terms)} loaded")
22 |
23 | sensitive_regex_string = '|'.join([f"({t})" for t in self.sensitive_terms])
24 | self.sensitive_term_regex = re.compile(f"\b{sensitive_regex_string}\b", re.IGNORECASE)
25 |
26 | def init_awkward_abbreviations(self):
27 | with open(os.path.join(os.path.dirname(__file__), 'data', 'bad_abbreviations.txt')) as fp:
28 | self.awkward_abbreviations = set(line for line in (l.strip() for l in fp) if line)
29 |
30 | awkward_regex_string = '|'.join([f"({t})" for t in self.awkward_abbreviations]).replace(".", "\\.")
31 | self.awkward_abbreviation_regex = re.compile(awkward_regex_string)
32 |
33 | def init_sensitive_sections(self):
34 | with open(os.path.join(os.path.dirname(__file__), 'data', 'sensitive_sections.txt')) as fp:
35 | self.sensitive_sections = set(line for line in (l.strip() for l in fp) if line)
36 |
37 | def is_sensitive_tag(self, tag):
38 | return tag in self.sensitive_tags
39 |
40 | def is_sensitive_section(self, tag):
41 | return tag in self.sensitive_sections
42 |
43 | def contains_sensitive_term(self, text):
44 | return self.sensitive_term_regex.search(text)
45 |
46 | def is_awkward(self, text):
47 | if self.awkward_abbreviation_regex.search(text):
48 | return True
49 |
50 | # if not re.search(r'[.?!;]([‘“"\)])?$', text):
51 | # return True
52 |
53 | # Multi-character abbreviations
54 | if re.search('[A-Z]\\.[A-Z]\\.', text):
55 | return True
56 |
57 | # Single initials
58 | if re.search(r'\b[A-Z]\. ', text):
59 | return True
60 |
61 | # Multiple capitalized letters in a row (suggests a dateline)
62 | if re.search(r'[A-Z][A-Z]+', text):
63 | return True
64 |
65 | # Ordinals
66 | if re.search(r'[0-9]+(nd|st|th)', text):
67 | return True
68 |
69 | # Websites
70 | if re.search(r'([A-Za-z0-9]+)\.(com|org|net|ly|io)', text):
71 | return True
72 |
73 | # Bad starters
74 | if re.fullmatch(r"^[—\-\('’,;a-z].*", text):
75 | return True
76 |
77 | # No internal quotes
78 | if re.search(r' [‘“"][A-Za-z]', text) or re.search(r'[”"’] ', text):
79 | return True
80 |
81 | # Mismatched quotes
82 | if re.match(r'[‘“"\']', text) and re.search(r'[^‘“"\']$', text):
83 | return True
84 |
85 | if re.match(r'[^‘“"\']', text) and re.search(r'[‘“"\']$', text):
86 | return True
87 |
88 | # Mismatched parens
89 | if re.search(r'\([^\)]+$', text) or re.search(r'\[[^\]]+$', text):
90 | return True
91 |
92 | if re.match(r'[^\(]+\)', text) or re.match(r'[^\[]+\]', text):
93 | return True
94 |
95 | if re.search(r'\b(he|she) said', text):
96 | return True
97 |
98 | # Bad ends
99 | if re.fullmatch(r".+(([\-\);—:,])|(['’]s)|(\b(and|or|but)))", text):
100 | return True
101 |
102 | # Bad anywhere
103 | if re.search(r'[$@%#&\n\t]', text):
104 | return True
105 |
106 | # NYT Credits
107 | if re.search(r'(^By )|(photograph by)|(contributed reporting)|(the New York Times)|(The Times)|(illustration by)', text, flags=re.IGNORECASE):
108 | return True
109 |
110 | return False
111 |
--------------------------------------------------------------------------------
/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | NYT Haiku
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
40 |
41 |
42 |
49 |
50 |
51 |
52 |
53 |
NYT Haikus
54 |
These are the 50 most popular tweets from @nythaikus, a Twitter bot that scans the New York Times for haiku.
55 |
59 |
60 |
61 |
62 | {% for h in haikus %}
63 |
64 |
65 | {{ h.line0 }}
{{ h.line1 }}
{{ h.line2 }}
66 |
71 |
72 |
73 | {% endfor %}
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
--------------------------------------------------------------------------------
/nyt_haiku/haiku.py:
--------------------------------------------------------------------------------
1 | import re
2 | import os
3 | import csv
4 | import spacy
5 | import syllapy
6 | import hashlib
7 | from num2words import num2words
8 | from unidecode import unidecode
9 | from string import punctuation
10 |
11 | from functools import reduce
12 | import operator
13 |
14 | from nyt_haiku.errors import LineMismatchError, SyllableCountError
15 |
16 | SPECIAL_PUNCTUATION_BREAKS = ['-', '—']
17 |
18 |
19 | def clean_term(term):
20 | return unidecode(term).strip().lower().strip(punctuation)
21 |
22 |
23 | def is_special_punctuation(term):
24 | return term in SPECIAL_PUNCTUATION_BREAKS
25 |
26 |
27 | def has_syllable_exception(term):
28 | return term in syllapy.WORD_DICT
29 |
30 |
31 | class HaikuFinder():
32 | def __init__(self):
33 | self.nlp = spacy.load("en_core_web_sm")
34 |
35 | # Load additional syllable definitions beyond syllapy
36 | syllable_file_path = os.path.join(os.path.dirname(__file__), 'data', 'syllable_counts.csv')
37 | with open(syllable_file_path, newline='') as file:
38 | reader = csv.reader(file)
39 | for row in reader:
40 | if len(row) == 2:
41 | word = row[0].lower()
42 | count = int(row[1])
43 | syllapy.WORD_DICT[word] = count
44 |
45 | def sentences_from_article(self, text):
46 | if not text:
47 | return []
48 |
49 | doc = self.nlp(text)
50 | return [s.text.rstrip() for s in doc.sents]
51 |
52 | def syllables_for_term(self, term):
53 | if is_special_punctuation(term):
54 | return 0
55 |
56 | # Some things to do before stripping the term
57 | # Disney+, Apple+, etc.
58 | r = re.match('(.+)\+$', term)
59 | if r:
60 | return self.syllables_for_term(r.group(1)) + 1
61 |
62 | stripped_term = clean_term(term)
63 | try:
64 | if has_syllable_exception(stripped_term):
65 | return syllapy.count(stripped_term)
66 |
67 | r = re.match("(.+)'s$", stripped_term)
68 | if r:
69 | # Most possessive's don't add syllables
70 | return syllapy.count(r.group(1))
71 |
72 | r = re.match('([0-9]{4})s?$', stripped_term)
73 | if r:
74 | terms = num2words(r.group(1), to='year').split()
75 | return reduce(operator.add, [self.syllables_for_term(term) for term in terms])
76 |
77 | if re.match('[0-9,]+$', stripped_term):
78 | terms = num2words(int(stripped_term.replace(',', ''))).split()
79 | return reduce(operator.add, [self.syllables_for_term(term) for term in terms])
80 |
81 | r = re.match('([0-9]+)-([0-9]+)$', stripped_term)
82 | if r:
83 | s1 = self.syllables_for_term(r.group(1))
84 | s2 = self.syllables_for_term(r.group(2))
85 | if s1 and s2:
86 | return s1 + s2 + 1
87 | else:
88 | return 0
89 |
90 | r = re.match('([^-]+)[-/](.+)$', stripped_term)
91 | if r:
92 | s1 = self.syllables_for_term(r.group(1))
93 | s2 = self.syllables_for_term(r.group(2))
94 |
95 | if s1 and s2:
96 | return s1 + s2
97 | else:
98 | return 0
99 |
100 | c = syllapy.count(stripped_term)
101 | return c
102 |
103 | except RuntimeError as err:
104 | raise SyllableCountError("Unable to count syllables for term")
105 |
106 | def terms_from_sentence(self, text):
107 | cleaned_text = text.strip("[ \r\n\t\"“”'’\\(\\)\\[\\];]")
108 | return [(t, self.syllables_for_term(t)) for t in cleaned_text.split()]
109 |
110 | def seek_line(self, lines, max_syllables, terms):
111 | '''These arguments are passed by reference and altered'''
112 | syllable_count = 0
113 | line = []
114 |
115 | while syllable_count < max_syllables:
116 | if not terms:
117 | raise LineMismatchError("Line is too short")
118 |
119 | term, syllables = terms.pop(0)
120 |
121 | if syllables == 0 and not is_special_punctuation(term):
122 | raise LineMismatchError("Syllable count missing for term")
123 |
124 | syllable_count += syllables
125 | line.append(term)
126 |
127 | if syllable_count > max_syllables:
128 | raise LineMismatchError("Line is too long")
129 |
130 | lines.append(' '.join(line))
131 |
132 | def seek_eol(self, terms):
133 | if terms:
134 | raise LineMismatchError("Line is too long")
135 |
136 | def find_haiku(self, sentence_text):
137 | try:
138 | terms = self.terms_from_sentence(sentence_text)
139 | except SyllableCountError:
140 | return None
141 |
142 | lines = []
143 |
144 | try:
145 | self.seek_line(lines, 5, terms)
146 | self.seek_line(lines, 7, terms)
147 | self.seek_line(lines, 5, terms)
148 | self.seek_eol(terms)
149 |
150 | return {"lines": lines, "sentence": sentence_text, "hash": hashlib.md5(sentence_text.encode('utf-8')).hexdigest()}
151 |
152 | except LineMismatchError:
153 | return None
154 |
155 | def find_haikus_in_article(self, body_text):
156 | haikus = []
157 |
158 | for sent in self.sentences_from_article(body_text):
159 | haiku = self.find_haiku(sent)
160 | if haiku:
161 | haikus.append(haiku)
162 |
163 | return haikus
164 |
--------------------------------------------------------------------------------
/nyt_haiku/nyt.py:
--------------------------------------------------------------------------------
1 | import re
2 | import sqlite3
3 | import tortoise
4 | import asyncio
5 | from urllib.parse import urljoin, urlparse
6 |
7 | from bs4 import BeautifulSoup, NavigableString, Comment
8 | from datetime import datetime
9 | from dateutil import parser
10 | import operator
11 | from functools import reduce
12 |
13 | from nyt_haiku.moderator import ArticleModerator
14 | from nyt_haiku.models import Article, Haiku
15 |
16 | ARTICLE_MODERATOR = ArticleModerator()
17 |
18 | NYT_SECTION_PATTERN = '^https?://www.nytimes.com/(interactive/)?202'
19 |
20 | NYT_SECTION_URLS = ['https://www.nytimes.com/',
21 | 'https://www.nytimes.com/pages/world/',
22 | 'https://www.nytimes.com/pages/national/',
23 | 'https://www.nytimes.com/pages/todayspaper/',
24 | 'https://www.nytimes.com/pages/politics/',
25 | 'https://www.nytimes.com/pages/nyregion/',
26 | 'https://www.nytimes.com/pages/business/',
27 | 'https://www.nytimes.com/pages/technology/',
28 | 'https://www.nytimes.com/pages/sports/',
29 | 'https://dealbook.nytimes.com/',
30 | 'https://www.nytimes.com/pages/science/',
31 | 'https://www.nytimes.com/pages/health/',
32 | 'https://www.nytimes.com/pages/arts/',
33 | 'https://www.nytimes.com/pages/style/',
34 | 'https://www.nytimes.com/pages/opinion/',
35 | 'https://www.nytimes.com/pages/automobiles/',
36 | 'https://www.nytimes.com/pages/books/',
37 | 'https://www.nytimes.com/crosswords/',
38 | 'https://www.nytimes.com/pages/dining/',
39 | 'https://www.nytimes.com/pages/education/',
40 | 'https://www.nytimes.com/pages/fashion/',
41 | 'https://www.nytimes.com/pages/garden/',
42 | 'https://www.nytimes.com/pages/magazine/',
43 | 'https://www.nytimes.com/pages/business/media/',
44 | 'https://www.nytimes.com/pages/movies/',
45 | 'https://www.nytimes.com/pages/arts/music/',
46 | 'https://www.nytimes.com/pages/obituaries/',
47 | # # 'http://www.nytimes.com/pages/realestate/',
48 | 'https://www.nytimes.com/pages/t-magazine/',
49 | 'https://www.nytimes.com/pages/arts/television/',
50 | 'https://www.nytimes.com/pages/theater/',
51 | 'https://www.nytimes.com/pages/travel/',
52 | 'https://www.nytimes.com/pages/fashion/weddings/',
53 | ]
54 |
55 |
56 | def normalize_url(url:str) -> str:
57 | return urljoin(url, urlparse(url).path)
58 |
59 |
60 | async def section_callback(session, logger, section_url: str):
61 | """Process a page and add links to the database"""
62 | logger.debug(f"START SECTION {section_url}")
63 | soup = None
64 |
65 | async with session.get(section_url) as response:
66 | soup = BeautifulSoup(await response.text(), 'html.parser')
67 |
68 | article_urls = [a.get('href') or '' for a in soup.find_all('a')]
69 |
70 | # if not http://, prepend domain name
71 | domain = '/'.join(section_url.split('/')[:3])
72 | article_urls = [url if '://' in url else operator.concat(domain, url) for url in article_urls]
73 | article_urls = set([normalize_url(url) for url in article_urls if re.search(NYT_SECTION_PATTERN, url)])
74 |
75 | for url in article_urls:
76 | try:
77 | exists = await Article.get_or_create(url=url)
78 | logger.debug(f"EXISTS {url}")
79 | if not exists:
80 | logger.debug(f"CREATE ARTICLE {url}")
81 | await Article.create(url=url)
82 | except (tortoise.exceptions.IntegrityError, sqlite3.IntegrityError):
83 | pass
84 |
85 |
86 | async def check_sections(session, logger):
87 | logger.info("SECTIONS start...")
88 | await asyncio.gather(*[asyncio.create_task(section_callback(session, logger, url)) for url in NYT_SECTION_URLS], return_exceptions=True)
89 | logger.info("SECTIONS done")
90 |
91 |
92 | def parse_article(logger, url: str, body_html:str, parse_sensitive:bool=False):
93 | '''Returns metadata plus body text'''
94 |
95 | meta = {}
96 | soup = BeautifulSoup(body_html, 'html.parser')
97 |
98 | # Get rid of comments
99 | for comment in soup.find_all(text=lambda text: isinstance(text, Comment)):
100 | comment.extract()
101 |
102 | meta['sensitive'] = False
103 | meta['parsed'] = True
104 | meta['nyt_uri'] = soup.find('meta', attrs={'name':'nyt_uri'}).get("content", None)
105 | meta['byline'] = soup.find('meta', attrs={'name':'byl'}).get("content", None)
106 | meta['description'] = soup.find('meta', attrs={'name':'description'}).get("content", None)
107 | meta['keywords'] = soup.find('meta', attrs={'name':'news_keywords'}).get("content", None)
108 | meta['section'] = soup.find('meta', property='article:section').get("content", None)
109 |
110 | if ARTICLE_MODERATOR.is_sensitive_section(meta['section']):
111 | logger.debug(f"SENSITIVE SECTION: {meta['section']} in {url}")
112 | meta['sensitive'] = True
113 |
114 | title_tag = soup.find('meta', property='twitter:title')
115 | if title_tag:
116 | meta['title'] = title_tag.get('content', None)
117 | else:
118 | meta['title'] = soup.title
119 |
120 | if ARTICLE_MODERATOR.contains_sensitive_term(meta['title']):
121 | logger.debug(f"SENSITIVE TITLE: {meta['title']} IN {url}")
122 | meta['sensitive'] = True
123 |
124 | published_tag = soup.find('meta', property='article:published')
125 | if published_tag:
126 | meta['published_at'] = parser.parse(published_tag.get("content", None))
127 | else:
128 | meta['published_at'] = datetime.now()
129 |
130 | a_tags_meta = soup.find_all("meta", attrs={'property':'article:tag'})
131 | a_tags = [a.get('content') for a in a_tags_meta]
132 | meta['tags'] = ';'.join(a_tags)
133 |
134 | for tag in a_tags:
135 | if ARTICLE_MODERATOR.is_sensitive_tag(tag):
136 | logger.debug(f"SENSITIVE TAG: {tag} IN {url}")
137 | meta['sensitive'] = True
138 | break
139 |
140 | if meta['sensitive'] and not parse_sensitive:
141 | return meta, None
142 |
143 | body_found = False
144 | try:
145 | p_tags = list(soup.find("article", {"id": "story"}).find_all('p'))
146 | body_found = True
147 | except AttributeError:
148 | pass
149 |
150 | if not body_found:
151 | try:
152 | p_tags = list(soup.find("article", {"id": "interactive"}).find_all('p'))
153 | body_found = True
154 | except AttributeError:
155 | pass
156 |
157 | if not body_found:
158 | try:
159 | p_tags = []
160 | for post in list(soup.find_all("div", {"class": "live-blog-post"})):
161 | p_tags += post.find_all('p')
162 | body_found = True
163 | except AttributeError:
164 | pass
165 |
166 | if not body_found:
167 | logger.info(f"ERROR {url} NO PARAGRAPHS")
168 | return meta, None
169 |
170 | p_contents = reduce(operator.concat, [p.contents + [NavigableString('\n')] for p in p_tags], [])
171 |
172 | body_strings = []
173 | for node in p_contents:
174 | if type(node) is NavigableString:
175 | body_strings.append(node)
176 | else:
177 | if node.name == 'br':
178 | body_strings.append(' \n ')
179 | else:
180 | try:
181 | body_strings.append(node.get_text())
182 | except:
183 | body_strings.append(node)
184 |
185 | body = ''.join(body_strings)
186 | return meta, body
187 |
188 |
189 | async def save_haikus(logger, haiku_finder, article_id, url: str, body: str):
190 | haikus = haiku_finder.find_haikus_in_article(body)
191 | haiku_count = 0
192 |
193 | for haiku in haikus:
194 | sensitive = ARTICLE_MODERATOR.contains_sensitive_term(haiku["sentence"]) or ARTICLE_MODERATOR.is_awkward(haiku["sentence"])
195 | exists = await Haiku.exists(hash=haiku["hash"])
196 | if not exists and not sensitive:
197 | haiku_count += 1
198 | logger.info(f'HAIKU {haiku["hash"]} {url}: {haiku["lines"][0]} / {haiku["lines"][1]} / {haiku["lines"][2]}')
199 |
200 | try:
201 | await Haiku.create(
202 | hash=haiku["hash"],
203 | sentence=haiku["sentence"],
204 | line0=haiku["lines"][0],
205 | line1=haiku["lines"][1],
206 | line2=haiku["lines"][2],
207 | article_id=article_id
208 | )
209 | except (tortoise.exceptions.IntegrityError, sqlite3.IntegrityError):
210 | # print(f'HASH COLLISION FOR {haiku["hash"]}')
211 | pass
212 |
213 | return haiku_count
214 |
215 |
216 | async def article_callback(session, logger, haiku_finder, article: Article):
217 | article.sensitive = False
218 | text = None
219 | headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
220 |
221 | async with session.get(article.url, headers=headers) as response:
222 | text = await response.text()
223 |
224 | meta, body = parse_article(logger, article.url, text)
225 |
226 | if meta['sensitive']:
227 | logger.info(f"SKIP {article.url} SENSITIVE")
228 | else:
229 | haiku_count = await save_haikus(logger, haiku_finder, article.id, article.url, body)
230 | logger.info(f"FOUND {haiku_count} {article.url}")
231 |
232 | article.parsed = True
233 | article.sensitive = meta['sensitive']
234 | article.title = meta['title']
235 | article.nyt_uri = meta['nyt_uri']
236 | article.published_at = meta['published_at']
237 | article.byline = meta['byline']
238 | article.description = meta['description']
239 | article.keywords = meta['keywords']
240 | article.tags = meta['tags']
241 | article.section = meta['section']
242 |
243 | await article.save()
244 |
245 |
246 | async def fetch_articles(session, logger, haiku_finder):
247 | logger.info("ARTICLES start...")
248 | unfetched_articles = await Article.filter(parsed=False).all()
249 | await asyncio.gather(*[asyncio.create_task(article_callback(session, logger, haiku_finder, article)) for article in unfetched_articles], return_exceptions=True)
250 | logger.info("ARTICLES done")
251 |
--------------------------------------------------------------------------------
/nyt_haiku/data/sensitive_tags.txt:
--------------------------------------------------------------------------------
1 | Abortion
2 | Abstinence (Sexual)
3 | Abu Ghraib (Iraq)
4 | Abuse of the Disabled
5 | Academic Freedom
6 | Accidents and Safety
7 | Acne
8 | Acquired Immune Deficiency Syndrome
9 | Adoptions
10 | Adrenoleukodystrophy (ALD)
11 | Affordable Housing
12 | Afghanistan War (2001- )
13 | Al Qaeda
14 | Al Qaeda in Mesopotamia
15 | Al Qaeda in the Arabian Peninsula
16 | Al Qaeda in the Islamic Maghreb
17 | Alcohol Abuse
18 | Aleve (Drug)
19 | Alopecia Areata
20 | Altitude Sickness
21 | Alzheimer's Disease
22 | Amber Alert
23 | Amblyopia (Lazy Eye)
24 | Americans With Disabilities Act
25 | Amphetamines
26 | Amputation
27 | Amyotrophic Lateral Sclerosis
28 | Anal Cancer
29 | Anesthesia and Anesthetics
30 | Aneurysms
31 | Angina
32 | Angioplasty
33 | Ansar Dine
34 | Anthrax
35 | Anti-Semitism
36 | Antidepressants
37 | Antifa Movement (US)
38 | Antihistamines
39 | Aorta
40 | Aphasia
41 | Apnea (Sleep Disorder)
42 | Appendicitis
43 | Arab-Israeli War (1948)
44 | Arab-Israeli War (1967)
45 | Arizona Immigration Law (SB 1070)
46 | Armor
47 | Arms Control and Limitation and Disarmament
48 | Arms Trade
49 | Arson
50 | Arteriosclerosis and Atherosclerosis
51 | Arthritis
52 | Artificial Insemination
53 | Asbestos
54 | Assad, Bashar al-
55 | Assassinations and Attempted Assassinations
56 | Assaults
57 | Asthma
58 | Ataxia-Telangiectasia (Genetic Disease)
59 | Athlete's Foot
60 | Attention Deficit Hyperactivity Disorder
61 | Aurora, Colo, Shooting (2012)
62 | Aurora, Colo, Shotting (2012)
63 | Autism
64 | Autoimmune Diseases
65 | Autopsies
66 | Avalanches
67 | Avandia (Drug)
68 | Avastin (Drug)
69 | Avian Influenza
70 | Aviation Accidents and Safety
71 | Babesiosis
72 | Bariatric Surgery
73 | Barrett's Syndrome
74 | Bed Sores
75 | Bedwetting
76 | Bell's Palsy
77 | Beriberi
78 | Beta Blockers
79 | Bextra (Drug)
80 | Bidil (Drug)
81 | Biological and Chemical Warfare
82 | Bipolar Disorder
83 | Birth Control and Family Planning
84 | Birth Defects
85 | Bisphenol A (BPA)
86 | Black Lung Disease
87 | Bladder
88 | Bladder Cancer
89 | Blake, Jacob (August 23, 2020 Shooting)
90 | Blood Clots
91 | Blood Pressure
92 | Body Dysmorphic Disorder
93 | Boko Haram
94 | Bombs and Explosives
95 | Bone Cancer
96 | Bone Marrow
97 | Botox (Drug)
98 | Botulism
99 | Brain Cancer
100 | Breast Cancer
101 | Bronchitis
102 | Brucellosis
103 | Bubonic Plague
104 | Bullies
105 | Burns
106 | Byetta (Drug)
107 | Cadavers
108 | Canavan Disease
109 | Cancer
110 | Canker Sores
111 | Capgras Syndrome
112 | Capital Punishment
113 | Cardiopulmonary Resuscitation (CPR)
114 | Carjacking
115 | Carotid Arteries
116 | Carpal Tunnel Syndrome
117 | Cat-Scratch Fever
118 | Cataracts
119 | Celebrex (Drug)
120 | Celexa (Drug)
121 | Cervical Cancer
122 | Cervix
123 | Charcot-Marie-Tooth Disease
124 | Cheating
125 | Chemotherapy
126 | Chicken Pox
127 | Child Abuse and Neglect
128 | Child Custody and Support
129 | Child Labor
130 | Child Pornography
131 | Child Soldiers
132 | Chlamydia
133 | Choking
134 | Cholera
135 | Cholesterol
136 | Chronic Fatigue Syndrome
137 | Chronic Granulomatous Disease
138 | Chronic Traumatic Encephalopathy
139 | Cialis (Drug)
140 | Circumcision
141 | Cirrhosis
142 | Civil War and Guerrilla Warfare
143 | Civilian Casualties
144 | Claritin (Drug)
145 | Clinical Trials
146 | Cluster Munitions
147 | Cocaine and Crack Cocaine
148 | Coccidioidomycosis (Valley Fever)
149 | Cochlear Implants
150 | Cockfighting
151 | Codeine
152 | Coffins
153 | Colic
154 | Colitis
155 | Colon and Colorectal Cancer
156 | Coma
157 | Computer Malware
158 | Computerized Axial Tomography (CAT Scans)
159 | Concussions
160 | Condoms
161 | Confessions
162 | Conjunctivitis
163 | Conscientious Objectors
164 | Conspiracy Theories
165 | Coronavirus (2019-nCoV)
166 | Corruption (Institutional)
167 | Coughs
168 | Courts-Martial
169 | Cox-2 Inhibitors (Drugs)
170 | Cremation
171 | Crestor (Drug)
172 | Creutzfeldt-Jakob Disease
173 | Crime and Criminals
174 | Cross Burning
175 | Croup (Children's Disease)
176 | Cruelty to Animals
177 | Cyberattacks and Hackers
178 | Cymbalta (Drug)
179 | Cystic Fibrosis
180 | Day Laborers
181 | Death and Dying
182 | Deaths (Fatalities)
183 | Deaths and Dying
184 | Defense Contracts
185 | Defibrillators
186 | Dehydration
187 | Dementia
188 | Demonstrations, Protests and Riots
189 | Dengue Fever
190 | Deportation
191 | Depression (Mental)
192 | Desertion
193 | Detainees
194 | Dialysis
195 | Diarrhea
196 | Dioxin
197 | Diphtheria
198 | Dirty Bombs and Radiological Weapons
199 | Disability Insurance
200 | Disaster and Emergencies
201 | Discrimination
202 | Diverticulosis
203 | Domestic Violence
204 | Doping (Sports)
205 | Draft and Recruitment (Military)
206 | Drownings
207 | Drug Abuse Resistance Education (DARE)
208 | Drug Abuse and Traffic
209 | Drug Cartels
210 | Drugs (Pharmaceuticals)
211 | Drunken and Reckless Driving
212 | Dupuytren's Contracture
213 | Duragesic (Drug)
214 | Dwarfism
215 | Dyslexia
216 | E Coli (Bacteria)
217 | Earthquakes
218 | Eating Disorders
219 | Ecstasy (Drug)
220 | Editorials
221 | Ehlers-Danlos Syndrome
222 | Ehrlichiosis
223 | Elder Abuse
224 | Electroshock Therapy
225 | Embezzlement
226 | Emergency Medical Treatment
227 | Enbrel (Drug)
228 | Encephalitis
229 | Endometriosis
230 | Epidemics
231 | Epidermolysis Bullosa
232 | Epilepsy
233 | Erbitux (Drug)
234 | Esophageal Cancer
235 | Essential Tremor (Disorder)
236 | Euthanasia and Assisted Suicide
237 | Evacuations and Evacuees
238 | Ex-Convicts
239 | Excommunication
240 | Extortion and Blackmail
241 | Extradition
242 | Extraordinary Rendition
243 | Exubera (Drug)
244 | Eylea (Drug)
245 | Falls
246 | False Arrests, Convictions and Imprisonments
247 | Fanconi Anemia
248 | Femara (Drug)
249 | Fen-Phen (Drug Combination)
250 | Fertility Drugs
251 | Fetal Alcohol Syndrome
252 | Fever
253 | Fibroids
254 | Fibromyalgia
255 | Fifth Disease
256 | Fires and Firefighters
257 | First Aid
258 | Fistulas
259 | Floods
260 | Food Stamps
261 | Forced Labor
262 | Foreign Workers
263 | Fosamax (Drug)
264 | Foster Care
265 | Frauds and Swindling
266 | Fringe Groups and Movements
267 | Funerals and Memorials
268 | Gabapentin (Drug)
269 | Gallbladder
270 | Gallstones
271 | Galveston Hurricane (1900)
272 | Gangrene
273 | Gangs
274 | Gastritis
275 | Gastroesophageal Reflux (Acid Reflux)
276 | Gaucher's Disease
277 | Geneva Conventions
278 | George Floyd Protests (2020)
279 | German Measles (Rubella)
280 | Giardiasis
281 | Gigantism
282 | Glaucoma
283 | Global Warming
284 | Gonorrhea
285 | Gout
286 | Green New Deal
287 | Group Homes
288 | Guantanamo Bay Naval Base (Cuba)
289 | Guillain-Barre Syndrome
290 | Guinea Worm Disease
291 | Habeas Corpus
292 | Hamas
293 | Haqqani Network
294 | Harris, Kamala D
295 | Hashish
296 | Hate Crimes
297 | Hazardous and Toxic Substances
298 | Head and Neck Cancer
299 | Heart, Artificial
300 | Heatstroke
301 | Heimlich Maneuver
302 | Hemochromatosis
303 | Hemophilia
304 | Heparin (Drug)
305 | Hepatitis
306 | Herceptin (Drug)
307 | Hernias
308 | Heroin
309 | Hezbollah
310 | Hijacking
311 | Hitler, Adolf
312 | Hives
313 | Hoarding
314 | Hodgkin's Lymphona
315 | Holocaust and the Nazi Era
316 | Home Health Care
317 | Honor Killings
318 | Hospice Care
319 | Hostages
320 | Human Rights and Human Rights Violations
321 | Human Trafficking
322 | Huntington's Disease
323 | Hurler's Syndrome
324 | Hurricane Gustav
325 | Hurricane Ike
326 | Hurricane Irene (2011)
327 | Hurricane Katrina
328 | Hurricane Sandy (2012)
329 | Hurricanes and Tropical Storms
330 | Hussein, Saddam
331 | Hydrocephalus
332 | Hypertension
333 | Hypnosis
334 | Hypochondria
335 | Hypodermic Needles and Syringes
336 | Hypoglycemia
337 | Hyponatremia (Disorder)
338 | Hypothermia
339 | Hypotonia (Disease)
340 | Hysterectomies
341 | Idiopathic Pulmonary Fibrosis
342 | Immigration Detention
343 | Immolation
344 | Impetigo
345 | Implantable Cardioverter Defibrillators (ICD)
346 | Implants
347 | Impotence
348 | Improvised Explosive Devices
349 | In Vitro Fertilization
350 | Incontinence
351 | Infant Mortality
352 | Infections
353 | Infertility
354 | Influenza
355 | Informers
356 | Interstitial Cystitis
357 | Intestinal Tract
358 | Iplex (Drug)
359 | Iraq War (2003-11)
360 | Irradiation of Food
361 | Irritable Bowel Syndrome
362 | Israeli Settlements
363 | Jaundice
364 | Juvenile Delinquency
365 | Kawasaki Disease
366 | Keratoconus
367 | Kidnapping
368 | Kidney Cancer
369 | Krabbe's Disease
370 | Kuru
371 | LASIK (Eye Surgery)
372 | LSD (Lysergic Acid Diethylamide)
373 | Lactic Acid
374 | Landslides and Mudslides
375 | Larynx
376 | Lashkar-e-Taiba
377 | Lead
378 | Legal Aid for the Poor (Civil)
379 | Legg-Perthes Disease
380 | Legionnaires' Disease
381 | Leprosy (Hansen's Disease)
382 | Leptospirosis
383 | Levaquin (Drug)
384 | Levitra (Drug)
385 | Lipitor (Drug)
386 | Liposuction
387 | Listeriosis
388 | Lithium (Drug)
389 | Liver Cancer
390 | Looting
391 | Lucentis (Drug)
392 | Lung Cancer
393 | Lyme Disease
394 | Lymphatic Filariasis
395 | Lymphatic System
396 | Lymphedema
397 | Lynching
398 | Macugen (Drug)
399 | Macular Degeneration
400 | Mad Cow Disease (Bovine Spongiform Encephalopathy)
401 | Malaria
402 | Malpractice
403 | Mammography
404 | Maritime Accidents and Safety
405 | Mastectomy
406 | Measles
407 | Medical Devices
408 | Melamine
409 | Meningitis
410 | Meningococcemia
411 | Mental Health and Disorders
412 | Mercenaries and Private Military Contractors
413 | Mercury (Metal)
414 | Methadone
415 | Methamphetamines
416 | Methicillin-Resistant Staphylococcus Aureus
417 | Middle East and North Africa Unrest (2010- )
418 | Middle East and North Africa Unrest (2010-)
419 | Midodrine (Drug)
420 | Mifeprex (RU-486)
421 | Migraine Headaches
422 | Migrant Labor (Agriculture)
423 | Military Aircraft
424 | Military Bases and Installations
425 | Military Commissions Act
426 | Military Vehicles
427 | Milltown Dam (Montana)
428 | Mines, Explosive
429 | Missiles and Missile Defense Systems
430 | Missing Persons
431 | Missing in Action
432 | Mujao (Movement for Oneness and Jihad in West Africa)
433 | Multiple Personalities
434 | Multiple Sclerosis
435 | Mumps
436 | Munchausen's Syndrome
437 | Murders and Attempted Murders
438 | Murders, Attempted Murders and Homicides
439 | Muscular Dystrophy
440 | Nagorno-Karabakh
441 | Naloxone (Drug)
442 | Narcolepsy
443 | Necrotizing Fasciitis
444 | Nerves and Nervous System
445 | Neurofibromatosis (Elephant Man's Disease)
446 | Neurontin (Drug)
447 | Nevirapine (Drug)
448 | Newtown, Conn, Shooting (2012)
449 | Nicotine
450 | No-Fly Zones
451 | Non-Hodgkin's Lymphoma
452 | Norovirus
453 | Nuclear Weapons
454 | Oak Creek, Wis, Shooting (2012)
455 | Obesity
456 | Obsessive-Compulsive Disorder
457 | Oil Spills
458 | Onchocerciasis (Disease)
459 | Op-Ed
460 | Operation Condor
461 | Opinion
462 | Opium
463 | Organized Crime
464 | Orphans and Orphanages
465 | Osteogenesis Imperfecta
466 | Osteoporosis
467 | Otitis
468 | Ovarian Cancer
469 | Ovaries
470 | OxyContin (Drug)
471 | PBDE (Polybrominated Diphenyl Ether)
472 | Palestinians
473 | Pancreatic Cancer
474 | Paralympic Games
475 | Paralysis
476 | Paranoia
477 | Parasomnias (Sleep Disorders)
478 | Parkinson's Disease
479 | Paxil (Drug)
480 | Pelvic Inflammatory Disease
481 | Penile Cancer
482 | Peripheral Vascular Disease
483 | Peritonitis
484 | Perjury
485 | Persian Gulf War
486 | Phenylketonuria (PKU)
487 | Pickwickian Syndrome
488 | Piracy at Sea
489 | Placebos
490 | Plague
491 | Plan B (Contraceptive)
492 | Plastic Surgery
493 | Plavix (Drug)
494 | Pneumonia
495 | Poisoning and Poisons
496 | Police Brutality and Misconduct
497 | Poliomyelitis
498 | Political Prisoners
499 | Polycystic Ovary Syndrome
500 | Pondimin (Drug)
501 | Post-Traumatic Stress Disorder
502 | Posterior Uveitis
503 | Potassium Iodide
504 | Poverty
505 | Prader-Willi Syndrome
506 | Presidential Election of 2016
507 | Preventive Medicine
508 | Prison Escapes
509 | Prison and Prisoners
510 | Prisoners of War
511 | Prisons and Prisoners
512 | Probation and Parole
513 | Progeria
514 | Prostate Cancer
515 | Prostate Gland
516 | Prostheses
517 | Prostitution
518 | Proud Boys
519 | Prozac (Drug)
520 | Public Defenders and Court-Appointed Lawyers (Criminal)
521 | Public and Subsidized Housing
522 | Pulmonary Hypertension
523 | QAnon
524 | Qaddafi, Muammar el-
525 | Rabies
526 | Railroad Accidents and Safety
527 | Recalls and Bans of Products
528 | Refugees and Displaced Persons
529 | Relenza (Drug)
530 | Remicade (Drug)
531 | Remittances
532 | Reparations and Restitution
533 | Reproduction (Biological)
534 | Rescues
535 | Reserves (Military)
536 | Respiratory System
537 | Restless Leg Syndrome
538 | Rett's Syndrome
539 | Reye's Syndrome
540 | Rezulin (Drug)
541 | Rhabdomyolysis (Muscle Disease)
542 | Ricin (Poison)
543 | Rickets (Disease)
544 | Right-Wing Extremism and Alt-Right
545 | Ringworm
546 | Ritalin (Drug)
547 | Rittenhouse, Kyle
548 | Robberies and Thefts
549 | Rocky Mountain Spotted Fever
550 | Roe V Wade (Supreme Court Decision)
551 | Rogaine (Drug)
552 | Rosacea
553 | Runaway Children
554 | SARS (Severe Acute Respiratory Syndrome)
555 | Sabotage
556 | Salmonella (Bacteria)
557 | Salvia (Plant)
558 | Salvia Divinorum
559 | Sandy Hook Promise
560 | Scabies
561 | Schistosomiasis
562 | Schizophrenia
563 | School Shootings
564 | Sciatica
565 | Scoliosis
566 | Seasonal Affective Disorder (SAD)
567 | Sedatives
568 | Segregation
569 | Seizures (Medical)
570 | Sensory Integration Dysfunction
571 | Sentences (Criminal)
572 | Septic Shock
573 | Serial Murders
574 | Sex Crimes
575 | Sex Education
576 | Sexual Harassment
577 | Sexual Harrasment
578 | Sexually Transmitted Diseases
579 | Shabab
580 | Shigellosis
581 | Shingles (Disease)
582 | Shoplifting
583 | Sickle Cell Anemia
584 | Silicosis
585 | Sinusitis
586 | Skin Cancer
587 | Slavery
588 | Sleeping Sickness
589 | Sleepwalking
590 | Smallpox
591 | Smuggling
592 | Special Olympics
593 | Spinal Muscular Atrophy
594 | Spleen
595 | Sprains and Strains
596 | Stalking (Crime)
597 | State Children's Health Insurance Program (S-CHIP)
598 | Statins (Cholesterol-Lowering Drugs)
599 | Status of Forces Agreements
600 | Stem Cells
601 | Stents (Medical Devices)
602 | Sterilization (Biological)
603 | Steroids
604 | Stevens, J Christopher
605 | Stevens-Johnson Syndrome
606 | Still's Disease
607 | Stomach Cancer
608 | Stonewall Riots (1969)
609 | Strep Throat
610 | Stroke
611 | Suboxone (Drug)
612 | Subpoenas
613 | Sudden Infant Death Syndrome
614 | Suicides and Attempted Suicides
615 | Suicides and Suicide Attempts
616 | Superfund
617 | Surgery and Surgeons
618 | Surrogate Motherhood
619 | Syphilis
620 | Taliban
621 | Tamiflu (Drug)
622 | Tamoxifen (Drug)
623 | Tarceva (Drug)
624 | Targeted Killings
625 | Taxus (Drug)
626 | Tay-Sachs Disease
627 | Teenage Pregnancy
628 | Temporo-Mandibular Disorder (TMD)
629 | Tendinitis
630 | Tequin (Drug)
631 | Terrorism
632 | Terrorism Risk Insurance Act
633 | Testicles
634 | Testicular Cancer
635 | Testosterone
636 | Tests (Drug Use)
637 | Tests (Medical)
638 | Tests (Sobriety)
639 | Threats and Threatening Messages
640 | Thyroid Cancer
641 | Tidal Waves and Tsunamis
642 | Tissue (Human)
643 | Topamax (Drug)
644 | Torpedoes
645 | Torture
646 | Tourette's Syndrome
647 | Toxic Shock Syndrome (TSS)
648 | Toxoplasmosis
649 | Trachoma
650 | Traffic Accidents and Safety
651 | Transfusions
652 | Transgender and Transsexual
653 | Transplants
654 | Traumatic Brain Injury
655 | Tuberculosis
656 | Tucson Shooting (2011)
657 | Tularemia
658 | Turner's Syndrome
659 | Tylenol (Drug)
660 | Typhoid
661 | Typhoons
662 | Tysabri (Drug)
663 | USA PATRIOT Act
664 | Ulcers
665 | Unemployment
666 | Unemployment Insurance
667 | United States Defense and Military Forces
668 | Urinary Tract
669 | Uterine Cancer
670 | Vaginal and Vulvar Cancer
671 | Vandalism
672 | Varicose Veins
673 | Vasectomy
674 | Vasectomy
675 | Vasovagal Syncope (Fainting)
676 | Vertigo
677 | Veterans
678 | Viagra (Drug)
679 | Vigilantes
680 | Vioxx (Drug)
681 | Viruses
682 | Visas
683 | Vitiligo
684 | Vulvodynia
685 | Vytorin (Drug)
686 | War Crimes, Genocide and Crimes Against Humanity
687 | War and Revolution
688 | Weddings and Engagements
689 | Welfare (US)
690 | Whiplash
691 | Whooping Cough
692 | Williams Syndrome
693 | Wilson's Disease
694 | Witnesses
695 | Women's Health Initiative
696 | Wounds
697 | X-Rays
698 | Xanax (Drug)
699 | Xeroderma Pigmentosa (Skin Disease)
700 | Yeast Infections
701 | Yellow Fever
702 | Zetia (Drug)
703 | Zocor (Drug)
704 | Zoloft (Drug)
705 | Zyprexa (Drug)
706 | bin Laden, Osama
707 | internal-election-open
708 |
--------------------------------------------------------------------------------
/nyt_haiku/data/syllable_counts.csv:
--------------------------------------------------------------------------------
1 | 18th,2
2 | 19th,2
3 | 20th,3
4 | 21st,3
5 | a.m,2
6 | abc,3
7 | abc,3
8 | abeyance,3
9 | abridged,2
10 | absentee,3
11 | absolves,2
12 | absorbed,2
13 | abused,2
14 | academia,5
15 | academie,4
16 | accessed,2
17 | acclaimed,2
18 | accomplished,3
19 | accurately,4
20 | accused,2
21 | ached,1
22 | aches,1
23 | achievements,3
24 | achieves,2
25 | acknowledged,3
26 | acne,2
27 | acquiesce,3
28 | acquire,3
29 | actively,3
30 | activism,4
31 | acutely,3
32 | added,2
33 | admire,3
34 | adorned,2
35 | adrianne,3
36 | adriene,3
37 | adrienne,3
38 | advancement,3
39 | advancements,3
40 | adventured,3
41 | adventures,3
42 | advertised,3
43 | advertisements,4
44 | advised,2
45 | advocates,3
46 | aerial,3
47 | affirmed,2
48 | affixed,2
49 | affluent,3
50 | aficionado,6
51 | aforementioned,4
52 | aggressively,4
53 | aggrieved,2
54 | agonized,3
55 | ahwahnee,3
56 | ai,2
57 | aides,1
58 | aimed,1
59 | airbnb,4
60 | aired,1
61 | airlines,2
62 | airwaves,2
63 | alarmed,2
64 | albanian,4
65 | albeit,3
66 | algorithm,4
67 | algorithms,4
68 | aliah,3
69 | alias,3
70 | alien,3
71 | aligned,2
72 | aliveness,3
73 | aliyah,3
74 | alleged,3
75 | alleviate,4
76 | altered,2
77 | alternatives,4
78 | amassed,2
79 | amazed,2
80 | amazonian,5
81 | ambiance,3
82 | ambient,3
83 | ambiguity,5
84 | ambushed,2
85 | amelia,4
86 | ammonia,4
87 | amped,1
88 | amplifying,4
89 | amused,2
90 | amusement,3
91 | analyzed,3
92 | anarchism,4
93 | anchored,2
94 | andrea,3
95 | angered,2
96 | animates,3
97 | annie,2
98 | announcements,3
99 | annoyance,3
100 | annoying,3
101 | annually,4
102 | answered,2
103 | antiques,2
104 | anxieties,4
105 | aphorism,4
106 | aphorisms,4
107 | api,3
108 | apnea,3
109 | apolemia,5
110 | apologized,4
111 | appalled,2
112 | apparently,4
113 | appealed,2
114 | appeared,2
115 | appreciably,5
116 | apprenticed,3
117 | approached,2
118 | approached,2
119 | approximately,5
120 | aquarium,4
121 | arabia,4
122 | archaea,3
123 | archaeologist,5
124 | archaeologists,5
125 | archaic,3
126 | archives,2
127 | areas,3
128 | aren't,1
129 | argentario,5
130 | arguably,4
131 | arguing,3
132 | ariana,4
133 | arias,3
134 | arranged,2
135 | arrangements,3
136 | artichokes,3
137 | ascertained,3
138 | ashamed,2
139 | asheville,2
140 | asiago,4
141 | assiduously,5
142 | assigned,2
143 | associated,5
144 | assured,2
145 | assured,2
146 | astonished,3
147 | astoria,4
148 | astrobiologist,6
149 | astrobiologists,6
150 | athletes,2
151 | atrium,3
152 | atriums,3
153 | attacked,2
154 | attendee,3
155 | attitudes,3
156 | attributes,3
157 | auctioned,2
158 | audiences,4
159 | augured,2
160 | aurelia,4
161 | aurelien,4
162 | auslese,3
163 | authored,2
164 | autoimmune,4
165 | automatically,5
166 | averaged,3
167 | averaging,3
168 | avian,3
169 | aviator,4
170 | aviatrix,4
171 | azienda,4
172 | backed,1
173 | backlogged,2
174 | bagatelle,3
175 | bailed,1
176 | baked,1
177 | balenciaga,5
178 | banged,1
179 | banned,1
180 | barbarism,4
181 | barbecue,3
182 | barefoot,2
183 | barraged,2
184 | barred,1
185 | barriers,3
186 | baseless,2
187 | baselessly,3
188 | baseline,2
189 | baselines,2
190 | bastardized,3
191 | bates,1
192 | bathed,1
193 | bathrobes,2
194 | battered,2
195 | bavaria,4
196 | bavarian,4
197 | bayous,2
198 | bbc,3
199 | beachgoer,3
200 | beachgoers,3
201 | beckoned,2
202 | becomes,2
203 | bedeviled,3
204 | begged,1
205 | beguiles,2
206 | behaved,2
207 | behavioral,4
208 | bejeweled,2
209 | beleaguered,3
210 | bellagio,4
211 | belonged,2
212 | beloved,2
213 | belying,3
214 | bemoaned,2
215 | bemused,2
216 | beneficiaries,6
217 | bernie,2
218 | bessie,2
219 | bestowed,2
220 | betrayal,3
221 | beyonce,3
222 | biases,3
223 | bibbed,1
224 | bigger,2
225 | biggest,2
226 | bikes,1
227 | billie,2
228 | billionaires,3
229 | binge-watching,3
230 | biochemist,4
231 | biographer,4
232 | biographers,4
233 | biologist,4
234 | biologists,4
235 | biopic,3
236 | blamed,1
237 | blasio,3
238 | blessed,1
239 | blocked,1
240 | bloodiest,3
241 | bloomed,1
242 | blossomed,2
243 | blossomed,2
244 | blurred,1
245 | bmw,4
246 | bobbed,1
247 | boil,2
248 | bolivia,4
249 | bolstered,2
250 | boned,1
251 | bones,1
252 | bonnie,2
253 | booers,2
254 | booing,2
255 | booked,1
256 | boomed,1
257 | bootstrapism,4
258 | bored,1
259 | boredom,2
260 | borrowed,2
261 | boseman,2
262 | bostonian,4
263 | bothered,2
264 | bottomed,2
265 | bouteille,2
266 | bouteilles,2
267 | boxed,1
268 | bozeman,2
269 | bracelet,2
270 | bracelets,2
271 | braggadocio,5
272 | brained,1
273 | branched,1
274 | brasserie,3
275 | braved,1
276 | braved,1
277 | breathes,1
278 | brene,2
279 | bribed,1
280 | bridesmaid,2
281 | bridesmaids,2
282 | broached,1
283 | broadsides,2
284 | bronzed,1
285 | brooked,1
286 | brutalized,3
287 | bucked,1
288 | bullying,3
289 | bumped,1
290 | burdened,2
291 | burgundian,4
292 | burial,3
293 | burned,1
294 | burned,1
295 | burrowed,2
296 | burying,3
297 | bushee,2
298 | busier,3
299 | businesspeople,4
300 | businessperson,4
301 | buyers,2
302 | buzzed,1
303 | bygones,2
304 | c.e.o,3
305 | cacciola,4
306 | cadre,2
307 | cafeteria,5
308 | caged,1
309 | cakes,1
310 | calcium,3
311 | calibre,3
312 | callused,2
313 | cameo,3
314 | cameos,3
315 | camille,2
316 | campaigned,2
317 | campsites,2
318 | canceled,2
319 | candidates,3
320 | canines,2
321 | canned,1
322 | capitalism,5
323 | capitulates,4
324 | capote,3
325 | capped,1
326 | captivates,3
327 | captures,2
328 | caravaggio,5
329 | caravaggios,5
330 | cardiologist,5
331 | cardplayers,3
332 | cared,1
333 | carefully,3
334 | caregiving,3
335 | careless,2
336 | cares,1
337 | caretaker,3
338 | caretakers,3
339 | caricatured,4
340 | carlile,3
341 | carnivores,3
342 | carrie,2
343 | cartier,3
344 | carved,1
345 | cascades,2
346 | caseback,2
347 | casebacks,2
348 | caseload,2
349 | caseloads,2
350 | casseroles,3
351 | cassettes,2
352 | casually,4
353 | cataloged,3
354 | catastrophe,4
355 | categorized,4
356 | causeway,2
357 | cautioned,2
358 | caveat,3
359 | caveats,3
360 | caved,1
361 | cbs,3
362 | cbs,3
363 | ceaseless,2
364 | celebrates,3
365 | celled,1
366 | cellphones,2
367 | censored,2
368 | centennial,4
369 | centered,2
370 | centralized,3
371 | cereal,3
372 | ceremonial,5
373 | cerulean,4
374 | chalked,1
375 | challenged,2
376 | chambered,2
377 | chameleon,4
378 | championing,4
379 | champions,3
380 | championships,4
381 | changing,2
382 | chaotic,3
383 | charles,2
384 | charlottesville,3
385 | charmed,1
386 | chartered,2
387 | chased,1
388 | cheered,1
389 | cherished,2
390 | cherished,2
391 | chianti,3
392 | chilean,3
393 | chilled,1
394 | chirped,1
395 | chives,1
396 | chloe,2
397 | chocolates,3
398 | chokehold,2
399 | chokeholds,2
400 | choreographer,5
401 | choreographers,5
402 | choreographies,5
403 | christened,2
404 | churned,1
405 | cinched,1
406 | civilized,3
407 | claimed,1
408 | clambered,2
409 | clamped,1
410 | clapped,1
411 | claremont,2
412 | clarifying,4
413 | classed,1
414 | classmates,2
415 | cleared,1
416 | clerked,1
417 | clicked,1
418 | clientele,3
419 | clients,2
420 | climbed,1
421 | clinched,1
422 | clocked,1
423 | clogged,1
424 | closely,2
425 | closest,2
426 | closures,2
427 | clothed,1
428 | cloying,2
429 | clustered,2
430 | coachella,4
431 | coarsened,2
432 | coates,1
433 | coaxial,4
434 | cocooned,2
435 | coen,2
436 | coercing,3
437 | coercive,3
438 | coexist,3
439 | coexistence,4
440 | coexists,3
441 | coffered,2
442 | coincided,4
443 | coincidence,4
444 | coined,1
445 | collapsed,2
446 | colleagues,2
447 | colloquial,4
448 | colloquialism,6
449 | colloquialisms,6
450 | colonialism,6
451 | colonized,3
452 | colored,2
453 | combined,2
454 | comeback,2
455 | comedian,4
456 | comedians,4
457 | comely,2
458 | commedia,4
459 | commencement,3
460 | commissioned,3
461 | communed,2
462 | communicates,4
463 | communism,4
464 | compares,2
465 | compelled,2
466 | complained,2
467 | completely,3
468 | compressed,2
469 | comprised,2
470 | compromised,3
471 | concealed,2
472 | conceived,2
473 | concierge,3
474 | concludes,2
475 | conclusively,4
476 | condemned,2
477 | condensed,2
478 | conditioned,3
479 | conduit,3
480 | configured,3
481 | configured,3
482 | confused,2
483 | congealed,2
484 | congenial,4
485 | congratulates,4
486 | conjoined,2
487 | conjured,2
488 | conquered,2
489 | consigned,2
490 | consistently,4
491 | consoled,2
492 | consoles,2
493 | conspicuous,4
494 | constituent,4
495 | constrained,2
496 | consumed,2
497 | continuing,4
498 | continuity,5
499 | contrarian,4
500 | controlee,3
501 | convened,2
502 | conveying,3
503 | cooked,1
504 | cooled,1
505 | cooped,1
506 | cooperating,5
507 | coordinated,5
508 | coordination,5
509 | cornered,2
510 | cornerstones,3
511 | correctly,3
512 | costumed,2
513 | costumes,2
514 | cottagecore,3
515 | coughed,1
516 | couldn't,2
517 | counseled,2
518 | countered,2
519 | couturier,4
520 | cracked,1
521 | crammed,1
522 | cramped,1
523 | cranes,1
524 | craved,1
525 | crazed,1
526 | craziest,3
527 | createurs,3
528 | creators,3
529 | creatures,2
530 | crewmates,2
531 | crimes,1
532 | crinolines,3
533 | cristiana,4
534 | cristie,2
535 | criterion,4
536 | criticism,4
537 | criticized,3
538 | critiqued,2
539 | critiques,2
540 | crossed,1
541 | crowned,1
542 | crushed,1
543 | crying,2
544 | cultured,2
545 | cultures,2
546 | curates,2
547 | cured,1
548 | cures,1
549 | curled,1
550 | cursed,1
551 | curtailed,2
552 | curves,1
553 | curvier,3
554 | custodian,4
555 | cynthia,3
556 | d'escalier,4
557 | d'origine,4
558 | damaged,2
559 | dames,1
560 | damned,1
561 | dancing,2
562 | danes,1
563 | danielle,2
564 | dario,3
565 | darned,1
566 | dashed,1
567 | dawned,1
568 | dazed,1
569 | deaccession,4
570 | deaccessioning,5
571 | debates,2
572 | debunked,2
573 | debuted,2
574 | decades,2
575 | deceased,2
576 | deceived,2
577 | decides,2
578 | declares,2
579 | declined,2
580 | declines,2
581 | decreased,2
582 | deemed,1
583 | deepened,2
584 | defender,3
585 | defiance,3
586 | defiant,3
587 | defines,2
588 | degrades,2
589 | delayed,2
590 | deliberately,5
591 | delicately,4
592 | deliriously,5
593 | delirium,4
594 | delivered,3
595 | delved,1
596 | delves,1
597 | demolished,3
598 | denotes,2
599 | denounced,2
600 | depending,3
601 | depreciation,5
602 | describes,2
603 | designates,3
604 | desire,3
605 | desired,3
606 | despaired,2
607 | desperately,4
608 | destabilized,4
609 | destined,2
610 | destroying,3
611 | detached,2
612 | detectives,3
613 | deteriorate,5
614 | determines,3
615 | deutsche,2
616 | devalue,3
617 | developmental,5
618 | deviate,3
619 | deviated,4
620 | deviates,3
621 | deviled,2
622 | devised,2
623 | devolved,2
624 | devotes,2
625 | diane,2
626 | diaries,3
627 | diced,1
628 | dictates,2
629 | didion,3
630 | didn't,2
631 | diereses,4
632 | differently,4
633 | digitized,3
634 | digressed,2
635 | diminished,3
636 | dining,2
637 | dioxide,3
638 | dipped,1
639 | dire,2
640 | disappeared,3
641 | discharged,2
642 | disclosed,2
643 | disclosures,3
644 | discombobulates,5
645 | discouraged,3
646 | disenfranchised,4
647 | disfavored,3
648 | disguised,2
649 | disliked,2
650 | dismantling,4
651 | dismissed,2
652 | dispatched,2
653 | dispensed,2
654 | dispersed,2
655 | displaced,2
656 | displaying,3
657 | dispossessed,3
658 | disputes,2
659 | dissolved,2
660 | distanced,2
661 | distilled,2
662 | distinguished,3
663 | distressed,2
664 | disturbed,2
665 | dived,1
666 | diverged,2
667 | divides,2
668 | divorced,2
669 | dizzyingly,4
670 | dna,3
671 | docked,1
672 | doesn't,2
673 | dolio,3
674 | dominates,3
675 | donahue,3
676 | donned,1
677 | doomed,1
678 | doored,1
679 | draconian,4
680 | dragged,1
681 | dramatically,5
682 | dreamed,1
683 | dredged,1
684 | dressed,1
685 | driest,2
686 | drilled,1
687 | drones,1
688 | droves,1
689 | drying,2
690 | dua,2
691 | dubbed,1
692 | dubious,3
693 | dumped,1
694 | dunes,1
695 | dunked,1
696 | duo,2
697 | duomo,3
698 | duped,1
699 | duterte,3
700 | dvd,3
701 | dwarfed,1
702 | dynamism,4
703 | dystopia,4
704 | dystopian,4
705 | dystopias,4
706 | e.g,2
707 | earlier,3
708 | earliest,3
709 | earthquakes,2
710 | eased,1
711 | easeful,2
712 | easygoing,4
713 | eavesdrop,2
714 | eavesdropped,2
715 | eavesdropping,3
716 | eclipsed,2
717 | ecological,5
718 | edged,1
719 | edifying,4
720 | edwardian,4
721 | eerie,2
722 | effectively,4
723 | eighty,3
724 | elapsed,2
725 | elegiac,4
726 | eliminates,4
727 | elites,2
728 | eloisa,4
729 | elysium,4
730 | emailed,2
731 | embalmed,2
732 | embarked,2
733 | embraced,2
734 | emerged,2
735 | emigrates,3
736 | emmaus,3
737 | emotionally,5
738 | emphasized,3
739 | empire,3
740 | empowered,3
741 | encased,2
742 | enclosed,2
743 | encompassed,3
744 | encountered,3
745 | encouragement,4
746 | encouraging,4
747 | encumbered,3
748 | endorsement,3
749 | endorsements,3
750 | endowed,2
751 | endured,2
752 | enforced,2
753 | engendered,3
754 | engineered,3
755 | engines,2
756 | engulfed,2
757 | enjoyable,4
758 | enjoying,3
759 | enlivened,3
760 | enraged,2
761 | enrolled,2
762 | enslaved,2
763 | ensuing,3
764 | ensured,2
765 | entered,2
766 | entertained,3
767 | enthralled,2
768 | enthusiasts,4
769 | enticement,3
770 | entire,3
771 | entirely,4
772 | entrenched,2
773 | envelopes,3
774 | environmental,5
775 | episodes,3
776 | epitome,4
777 | eritrean,4
778 | erroneous,4
779 | erstwhile,3
780 | escapades,3
781 | escaped,2
782 | escapement,3
783 | escapes,2
784 | escapism,4
785 | eschewed,2
786 | essentially,4
787 | estates,2
788 | esteemed,2
789 | estimated,4
790 | estimates,3
791 | estonia,4
792 | ethereal,4
793 | euphoria,4
794 | evacuating,5
795 | evaluated,5
796 | evaluating,5
797 | evoked,2
798 | evolved,2
799 | evolves,2
800 | exaggerates,4
801 | examined,3
802 | examines,3
803 | exchanged,2
804 | excruciating,5
805 | excused,2
806 | executes,3
807 | executives,4
808 | exercised,3
809 | exhaustively,4
810 | existing,3
811 | expatiate,4
812 | expected,3
813 | expedient,4
814 | expelled,2
815 | expensed,2
816 | experiencing,5
817 | explained,2
818 | explored,2
819 | explores,2
820 | exposed,2
821 | expressed,2
822 | extolled,2
823 | extremism,4
824 | extremismm,4
825 | extremophiles,4
826 | eyal,2
827 | eyeing,2
828 | facebook,2
829 | faced,1
830 | facelessness,3
831 | facetime,2
832 | facsimile,4
833 | factual,3
834 | failures,2
835 | faked,1
836 | fakes,1
837 | falsehood,2
838 | falsehoods,2
839 | falsely,2
840 | famed,1
841 | fanned,1
842 | fares,1
843 | farewell,2
844 | fascinates,3
845 | fascism,3
846 | fashioned,2
847 | faster,2
848 | fateful,2
849 | fates,1
850 | fathered,2
851 | fatigued,2
852 | favored,2
853 | favorites,3
854 | fazed,1
855 | fazio,3
856 | feared,1
857 | featureless,3
858 | features,2
859 | felines,2
860 | females,2
861 | feminism,4
862 | fenced,1
863 | festooned,2
864 | fetched,1
865 | fetishized,3
866 | fettuccine,4
867 | fiance,3
868 | fictionalized,4
869 | fides,1
870 | figured,2
871 | figurehead,3
872 | figureheads,3
873 | figures,2
874 | filmed,1
875 | filtered,2
876 | filthiest,3
877 | finalized,3
878 | financed,2
879 | finely,2
880 | fished,1
881 | fived,1
882 | flagged,1
883 | flamboyance,3
884 | flamboyant,3
885 | flames,1
886 | flanked,1
887 | flared,1
888 | flattened,2
889 | flavored,2
890 | flawed,1
891 | flecked,1
892 | fleeing,2
893 | flicked,1
894 | flocked,1
895 | floundered,2
896 | flourished,2
897 | flowed,1
898 | fluency,3
899 | flustered,2
900 | fogged,1
901 | foil,2
902 | foles,1
903 | followed,2
904 | forceful,2
905 | forebear,2
906 | forebears,2
907 | forecaster,3
908 | forecasters,3
909 | forecasts,2
910 | forefathers,3
911 | foreground,2
912 | foreheads,2
913 | forerunner,3
914 | forerunners,3
915 | foreshortening,4
916 | forged,1
917 | forgiveness,3
918 | forgoing,3
919 | formulaic,4
920 | fortunes,2
921 | fostered,2
922 | foundered,2
923 | franchised,2
924 | frantically,3
925 | frowned,1
926 | fueled,1
927 | fugitives,3
928 | fulfilled,2
929 | fumed,1
930 | fumes,1
931 | functioned,2
932 | funereal,4
933 | furious,3
934 | furloughed,2
935 | furred,1
936 | furriest,3
937 | furrowed,2
938 | furthered,2
939 | futures,2
940 | gabriel,3
941 | gained,1
942 | gaines,1
943 | galea,3
944 | galerie,3
945 | galvanized,3
946 | gambia,3
947 | gamecast,2
948 | gameplay,2
949 | garbageman,3
950 | garbagemen,3
951 | gardened,2
952 | gargantuan,4
953 | gasped,1
954 | gatefold,2
955 | gatekeeper,3
956 | gatekeepers,3
957 | gates,1
958 | gathered,2
959 | gazed,1
960 | geared,1
961 | gendered,2
962 | genealogy,5
963 | generalism,5
964 | generates,3
965 | genitalia,5
966 | genomes,2
967 | geocoded,4
968 | geolocation,5
969 | georgetown,2
970 | gestures,2
971 | getting,2
972 | giacomo,4
973 | giants,2
974 | gigabytes,3
975 | giovanni,4
976 | giulia,3
977 | giuliani,4
978 | giuseppe,3
979 | giving,2
980 | gladiator,4
981 | gladiatorial,6
982 | gladiators,4
983 | glanced,1
984 | glimmered,2
985 | glimpsed,1
986 | glitched,1
987 | gloriously,4
988 | gnomelike,2
989 | goliath,3
990 | gouged,1
991 | governed,2
992 | gps,3
993 | gpt,3
994 | graced,1
995 | gradual,3
996 | gradually,4
997 | graduate,3
998 | graduated,4
999 | graduating,4
1000 | graham,1
1001 | grandiose,3
1002 | granules,2
1003 | grasped,1
1004 | gratinee,3
1005 | graves,1
1006 | greased,1
1007 | greatest,2
1008 | greedier,3
1009 | greediest,3
1010 | gridlocked,2
1011 | grilled,1
1012 | grimaced,2
1013 | grinned,1
1014 | gripped,1
1015 | groaned,1
1016 | groomed,1
1017 | grooved,1
1018 | grouped,1
1019 | guessed,1
1020 | guidelines,2
1021 | gunned,1
1022 | habitual,4
1023 | hacienda,4
1024 | hacked,1
1025 | hadn't,2
1026 | hagia,3
1027 | hailed,1
1028 | haired,1
1029 | hallowed,2
1030 | halves,1
1031 | hammered,2
1032 | happier,3
1033 | harassed,2
1034 | harder,2
1035 | harmonized,3
1036 | harriet,3
1037 | harris's,3
1038 | hasn't,2
1039 | hates,1
1040 | having,2
1041 | hbo,3
1042 | headlines,2
1043 | healthier,3
1044 | heaped,1
1045 | heartiest,3
1046 | heightened,2
1047 | helmed,1
1048 | herbivores,3
1049 | herculean,4
1050 | here's,1
1051 | heroin,3
1052 | heroine,3
1053 | hesitates,3
1054 | hicks's,2
1055 | higher,2
1056 | highest,2
1057 | hijacked,2
1058 | hiked,1
1059 | hilarious,4
1060 | himalaya,4
1061 | himalayas,4
1062 | hinged,1
1063 | historians,4
1064 | hivemind,2
1065 | holmes,1
1066 | homebound,2
1067 | homecoming,3
1068 | homecomings,3
1069 | homegrown,2
1070 | homemade,2
1071 | hometown,2
1072 | homewares,2
1073 | homogeneous,5
1074 | homosexuality,7
1075 | honed,1
1076 | honored,2
1077 | hooked,1
1078 | hoped,1
1079 | hopeless,2
1080 | hopelessly,3
1081 | hopelessness,3
1082 | hopes,1
1083 | horsehair,2
1084 | hotelier,4
1085 | hotlines,2
1086 | hour,2
1087 | hourly,3
1088 | hours,2
1089 | housed,1
1090 | households,2
1091 | hugely,2
1092 | hugged,1
1093 | hughes,1
1094 | humiliations,5
1095 | hurled,1
1096 | hurricanes,3
1097 | hyena,3
1098 | hyenas,3
1099 | hyped,1
1100 | ian,2
1101 | iceberg,2
1102 | icebergs,2
1103 | iced,1
1104 | ideal,2
1105 | idealism,4
1106 | idiosyncratic,6
1107 | idiosyncratic,7
1108 | idiosyncratically,8
1109 | idiotic,4
1110 | ignored,2
1111 | illustrious,4
1112 | imagined,3
1113 | immanuel,4
1114 | immediacy,5
1115 | immensely,3
1116 | imperial,4
1117 | imperiled,3
1118 | impetuous,4
1119 | impingement,3
1120 | implying,3
1121 | imposed,2
1122 | impressed,2
1123 | impressively,4
1124 | improvements,3
1125 | improvised,3
1126 | imputes,2
1127 | incensed,2
1128 | incentives,3
1129 | incipient,4
1130 | inclined,2
1131 | inclines,2
1132 | includes,2
1133 | including,3
1134 | incorporates,4
1135 | increasingly,4
1136 | incurred,2
1137 | indexed,2
1138 | indianapolis,6
1139 | indicates,3
1140 | inebriated,5
1141 | influencer,4
1142 | infuriating,5
1143 | infused,2
1144 | ingenuity,5
1145 | ingredients,4
1146 | inhaled,2
1147 | initially,4
1148 | initiated,5
1149 | injured,2
1150 | insomnia,4
1151 | insomniac,4
1152 | instilled,2
1153 | institutes,3
1154 | instructional,4
1155 | intensely,3
1156 | interferes,3
1157 | interred,2
1158 | interrogates,4
1159 | interviewed,3
1160 | intestines,3
1161 | intrigued,2
1162 | intuition,4
1163 | intuitive,4
1164 | invented,3
1165 | invertebrates,4
1166 | investigates,4
1167 | invites,2
1168 | invoked,2
1169 | invokes,2
1170 | involvement,3
1171 | involves,2
1172 | iphones,2
1173 | irked,1
1174 | isaac,3
1175 | isn't,2
1176 | isotopes,3
1177 | it'd,2
1178 | italia,4
1179 | jailed,1
1180 | jawbones,2
1181 | jeered,1
1182 | jerked,1
1183 | jessie,2
1184 | jeweled,1
1185 | jodie,2
1186 | joked,1
1187 | joshua,3
1188 | journalism,4
1189 | jovial,3
1190 | jpmorgan,3
1191 | judged,1
1192 | julia,3
1193 | julio,3
1194 | julius,3
1195 | jumped,1
1196 | karlsruhe,3
1197 | kicked,1
1198 | kidnapped,2
1199 | kilobytes,3
1200 | kobe,2
1201 | kumbaya,3
1202 | kylie,2
1203 | l.p,2
1204 | labeled,2
1205 | laced,1
1206 | lacked,1
1207 | lafayette,3
1208 | landscaped,2
1209 | landscapes,2
1210 | lapierre,3
1211 | laramie,3
1212 | largemouth,2
1213 | larger,2
1214 | largest,2
1215 | lateness,2
1216 | laughed,1
1217 | launched,1
1218 | lavished,2
1219 | laying,2
1220 | league's,1
1221 | leaned,1
1222 | leanne,2
1223 | lectures,2
1224 | leered,1
1225 | legally,3
1226 | leia,2
1227 | leon,2
1228 | leonardo,4
1229 | leonhardt,3
1230 | leonine,3
1231 | leukemia,4
1232 | leveled,2
1233 | leveraged,3
1234 | libya,3
1235 | libyans,3
1236 | licensed,2
1237 | licensed,2
1238 | lifeless,2
1239 | lifeline,2
1240 | lifelines,2
1241 | lifelong,2
1242 | lifesaver,3
1243 | lifetimes,2
1244 | lightened,2
1245 | likened,2
1246 | likes,1
1247 | lineage,3
1248 | linebacker,3
1249 | linebackers,3
1250 | lined,1
1251 | linguine,3
1252 | lionel,3
1253 | listened,2
1254 | littered,2
1255 | livelihoods,3
1256 | lively,2
1257 | livestream,2
1258 | livestreaming,3
1259 | loaned,1
1260 | loathed,1
1261 | loaves,1
1262 | lobbying,3
1263 | locked,1
1264 | loneliness,3
1265 | longed,1
1266 | longer,2
1267 | loosed,1
1268 | loosely,2
1269 | loosened,2
1270 | lounged,1
1271 | loungewear,2
1272 | loved,1
1273 | lowered,2
1274 | lucia,3
1275 | luciano,4
1276 | luis,2
1277 | lurched,1
1278 | lured,1
1279 | luxuriate,4
1280 | luxurious,4
1281 | lyon,2
1282 | lyons,2
1283 | macabre,3
1284 | macenzie,3
1285 | machiavellian,6
1286 | machined,2
1287 | madeleines,3
1288 | mafia,3
1289 | magazines,3
1290 | mailed,1
1291 | majored,2
1292 | males,1
1293 | managing,3
1294 | mandates,2
1295 | manicured,3
1296 | manipulates,4
1297 | mannered,2
1298 | mannerism,4
1299 | mannerisms,4
1300 | manscaped,2
1301 | manually,4
1302 | manufacturing,5
1303 | mapped,1
1304 | marched,1
1305 | marginalized,4
1306 | mariachi,4
1307 | mariah,3
1308 | mariane,3
1309 | marines,2
1310 | marionette,4
1311 | marquee,2
1312 | marveled,2
1313 | mashed,1
1314 | matched,1
1315 | matriarch,3
1316 | matriarchal,4
1317 | mattered,2
1318 | matthias,3
1319 | matured,2
1320 | maya,2
1321 | mazelike,2
1322 | mccoy,2
1323 | mcfadden,3
1324 | mcintire,4
1325 | mckinsey,3
1326 | mealtimes,2
1327 | meander,3
1328 | meandering,4
1329 | meanders,3
1330 | measures,2
1331 | mechanism,4
1332 | mechanisms,4
1333 | mediocrity,5
1334 | megabytes,3
1335 | melania,4
1336 | mellowed,2
1337 | melted,2
1338 | memes,1
1339 | memorized,3
1340 | menaced,2
1341 | mentioned,2
1342 | mercier,3
1343 | mercurial,4
1344 | merged,1
1345 | messier,3
1346 | metastasized,4
1347 | microbes,2
1348 | microcosm,4
1349 | microwaves,3
1350 | migrates,2
1351 | milestone,2
1352 | milestones,2
1353 | militarized,4
1354 | millennial,4
1355 | millennials,4
1356 | millennium,4
1357 | minecraft,2
1358 | minimized,3
1359 | minutes,2
1360 | minutiae,4
1361 | mirrored,2
1362 | mismatched,2
1363 | missiles,2
1364 | misspelled,2
1365 | mistakes,2
1366 | miyake,3
1367 | mnuchin,3
1368 | moaned,1
1369 | mocked,1
1370 | modeled,2
1371 | modernism,4
1372 | moet,2
1373 | monetized,3
1374 | mongolia,4
1375 | mongolian,4
1376 | monologued,3
1377 | monologues,3
1378 | montepulciano,6
1379 | montepulcianos,6
1380 | moored,1
1381 | morehouse,2
1382 | mortgaged,2
1383 | mosques,1
1384 | mothballed,2
1385 | mountainsides,3
1386 | movements,2
1387 | moyers,2
1388 | muammar,3
1389 | multicolored,4
1390 | multiepisode,5
1391 | multiplayer,4
1392 | multitudes,3
1393 | murdered,2
1394 | musee,2
1395 | museo,3
1396 | museums,3
1397 | must've,2
1398 | mustered,2
1399 | muttered,2
1400 | mutually,4
1401 | myopia,4
1402 | mysteriously,5
1403 | mysticism,4
1404 | n.y.u,3
1405 | naive,2
1406 | namesake,2
1407 | namesakes,2
1408 | napoleon,4
1409 | narcissism,4
1410 | narrates,2
1411 | narratives,3
1412 | narrowed,2
1413 | natalia,4
1414 | navigates,3
1415 | nazism,3
1416 | nbc,3
1417 | neapolitan,5
1418 | neared,1
1419 | necked,1
1420 | negotiated,5
1421 | negotiations,5
1422 | neo,2
1423 | neon,2
1424 | netflix's,3
1425 | neuroscience,4
1426 | nicked,1
1427 | nihilism,4
1428 | nineteen,2
1429 | ninety,2
1430 | nonviolent,4
1431 | notarized,3
1432 | notifying,4
1433 | notoriety,5
1434 | notorious,4
1435 | notoriously,5
1436 | nuances,3
1437 | nudes,1
1438 | numbered,2
1439 | nurtured,2
1440 | nxivm,3
1441 | nythaikus,5
1442 | oasis,3
1443 | oblivion,4
1444 | obscured,2
1445 | obsidian,4
1446 | obtained,2
1447 | obviously,4
1448 | oceanic,4
1449 | oeuvre,2
1450 | offered,2
1451 | oil,2
1452 | old-fashioned,3
1453 | olives,2
1454 | olivier,4
1455 | olympian,4
1456 | omnivores,3
1457 | one's,1
1458 | one-on-one,3
1459 | oneself,2
1460 | openai,4
1461 | openly,3
1462 | operates,3
1463 | operatives,4
1464 | opium,3
1465 | oppressed,2
1466 | optimism,4
1467 | optimized,3
1468 | optioned,2
1469 | oreo,3
1470 | organism,4
1471 | organisms,4
1472 | orgasm,3
1473 | orgasms,3
1474 | orientalism,6
1475 | orientalist,5
1476 | othered,2
1477 | outlier,3
1478 | outlined,2
1479 | outscored,2
1480 | outstretched,2
1481 | outtakes,2
1482 | overdue,3
1483 | overexposed,4
1484 | overlooked,3
1485 | overpowered,4
1486 | overpriced,3
1487 | overstressed,3
1488 | overtimes,3
1489 | overturned,3
1490 | overwhelmed,3
1491 | p.m,2
1492 | packed,1
1493 | paged,1
1494 | paired,1
1495 | paleontologist,6
1496 | paleontologists,6
1497 | palettes,2
1498 | pancakes,2
1499 | panicked,2
1500 | panned,1
1501 | pantheon,3
1502 | parachutes,3
1503 | parades,2
1504 | paraphrased,3
1505 | parked,1
1506 | paroxysm,4
1507 | paroxysms,4
1508 | partakes,2
1509 | partially,3
1510 | particulates,4
1511 | pastimes,2
1512 | patagonia,5
1513 | patio,3
1514 | patrolled,2
1515 | patronized,3
1516 | patterned,2
1517 | paused,1
1518 | paved,1
1519 | pavement,2
1520 | peaked,1
1521 | pealed,1
1522 | pearled,1
1523 | pedaled,2
1524 | pedialyte,4
1525 | pediatrician,5
1526 | pediatrics,4
1527 | pedigree,3
1528 | peeled,1
1529 | perceives,2
1530 | perched,1
1531 | performed,2
1532 | periods,3
1533 | perpetual,4
1534 | perpetuate,4
1535 | perspectives,3
1536 | pessimism,4
1537 | pewdiepie,3
1538 | phoned,1
1539 | phonemes,2
1540 | photographed,3
1541 | photophores,3
1542 | photoshopped,3
1543 | phrased,1
1544 | physiologists,5
1545 | physiology,5
1546 | piazza,3
1547 | pictures,2
1548 | piled,1
1549 | pinged,1
1550 | pioneering,4
1551 | pitched,1
1552 | pixie,2
1553 | pizzeria,4
1554 | plagiarism,4
1555 | plagued,1
1556 | plaintively,3
1557 | plastered,2
1558 | playacting,3
1559 | players,2
1560 | pleasures,2
1561 | pledged,1
1562 | pleistocene's,3
1563 | plopped,1
1564 | plotlines,2
1565 | plumes,1
1566 | plunged,1
1567 | pneumonia,4
1568 | podium,3
1569 | poem,1
1570 | poetic,3
1571 | poised,1
1572 | poisoned,2
1573 | poitier,3
1574 | polarized,3
1575 | poles,1
1576 | politely,3
1577 | polyester,4
1578 | pondered,2
1579 | pooled,1
1580 | popes,1
1581 | popped,1
1582 | popularized,4
1583 | pored,1
1584 | pores,1
1585 | porsche,2
1586 | portrayal,3
1587 | portraying,3
1588 | posed,1
1589 | positives,3
1590 | postmodernism,5
1591 | postponed,2
1592 | practiced,2
1593 | precarious,4
1594 | precisely,3
1595 | precooked,2
1596 | predates,2
1597 | prejudiced,3
1598 | premiered,2
1599 | premised,2
1600 | premiums,3
1601 | preoccupations,5
1602 | preoccupied,4
1603 | preoccupy,4
1604 | prepares,2
1605 | preplanned,2
1606 | presaged,2
1607 | presbyterian,5
1608 | preserved,2
1609 | preserves,2
1610 | pressed,1
1611 | pressured,2
1612 | pressures,2
1613 | presumed,2
1614 | pretaped,2
1615 | previously,4
1616 | primed,1
1617 | primitives,3
1618 | printed,2
1619 | prioritizes,5
1620 | privately,3
1621 | privileged,3
1622 | priyanka,3
1623 | prized,1
1624 | procedures,3
1625 | processed,2
1626 | processing,3
1627 | proclaimed,2
1628 | programmed,2
1629 | prolonged,2
1630 | promiscuous,4
1631 | promised,2
1632 | pronounced,2
1633 | propelled,2
1634 | properly,3
1635 | propositioned,4
1636 | proprietary,5
1637 | proustian,3
1638 | proved,1
1639 | provides,2
1640 | provoked,2
1641 | prowled,1
1642 | pruned,1
1643 | prunes,1
1644 | psychiatric,4
1645 | psychoanalyst,5
1646 | published,2
1647 | pulled,1
1648 | pulsed,1
1649 | pumped,1
1650 | punctuating,4
1651 | punished,2
1652 | purifier,4
1653 | purposely,3
1654 | pursuing,3
1655 | pushed,1
1656 | putting,2
1657 | qanon,3
1658 | quadrennial,4
1659 | qualitatively,5
1660 | quarantined,3
1661 | questioned,2
1662 | questioned,2
1663 | quieted,3
1664 | quieter,3
1665 | quiets,2
1666 | quixote,3
1667 | r.v,2
1668 | r.v.s,2
1669 | racecar,2
1670 | racecars,2
1671 | raced,1
1672 | racism,3
1673 | radiant,3
1674 | radiating,4
1675 | radiology,5
1676 | rallying,3
1677 | randomized,3
1678 | ranged,1
1679 | ranked,1
1680 | ransacked,2
1681 | rapidly,3
1682 | ravaged,2
1683 | raved,1
1684 | reactions,3
1685 | reactor,3
1686 | reactors,3
1687 | readying,3
1688 | reaganism,4
1689 | real,1
1690 | realism,3
1691 | realistic,3
1692 | realize,2
1693 | realized,2
1694 | really,2
1695 | reaped,1
1696 | rearranging,4
1697 | reasoned,2
1698 | reassembled,4
1699 | reassured,3
1700 | reassuring,4
1701 | rebelled,2
1702 | rebellious,4
1703 | recalled,2
1704 | recapped,2
1705 | recently,3
1706 | rechristened,3
1707 | recipients,4
1708 | reclines,2
1709 | reconceived,3
1710 | reconfigured,4
1711 | recovered,3
1712 | recreational,5
1713 | redefined,3
1714 | referenced,3
1715 | refinanced,3
1716 | refined,2
1717 | reformed,2
1718 | reframed,2
1719 | refurbished,3
1720 | refutes,2
1721 | regained,2
1722 | regimes,2
1723 | reichl,2
1724 | reinterpreted,5
1725 | reinvention,4
1726 | reinventions,4
1727 | reissued,3
1728 | rejoined,2
1729 | relaxed,2
1730 | reliance,3
1731 | reliant,3
1732 | relished,2
1733 | remained,2
1734 | remaining,3
1735 | remembered,3
1736 | remixed,2
1737 | remotely,3
1738 | renamed,2
1739 | rendered,2
1740 | renewed,2
1741 | renounced,2
1742 | renowned,2
1743 | reopen,3
1744 | reopening,4
1745 | repealed,2
1746 | repeatedly,4
1747 | reporting,3
1748 | representatives,5
1749 | reproduced,3
1750 | repudiation,5
1751 | repurposed,3
1752 | requires,2
1753 | rescheduled,3
1754 | researcher,3
1755 | resigned,2
1756 | resilience,4
1757 | resilient,4
1758 | resolved,2
1759 | responsibilities,7
1760 | responsibility,7
1761 | retained,2
1762 | retched,1
1763 | retrieved,2
1764 | returned,2
1765 | reunion,3
1766 | reunions,3
1767 | reunited,4
1768 | revealed,2
1769 | revered,2
1770 | reverie,3
1771 | reversed,2
1772 | reviewed,2
1773 | reviled,2
1774 | revived,2
1775 | revolutionized,5
1776 | revolves,2
1777 | rhimes,1
1778 | rhodes,1
1779 | rhymed,1
1780 | rhythms,2
1781 | ribbed,1
1782 | ridged,1
1783 | ridgetop,2
1784 | ringed,1
1785 | rio,2
1786 | riots,2
1787 | ripped,1
1788 | risked,1
1789 | roared,1
1790 | robes,1
1791 | rocinante,4
1792 | rolled,1
1793 | romanced,2
1794 | romped,1
1795 | roofed,1
1796 | roommates,2
1797 | rosewood,2
1798 | roughly,2
1799 | routes,1
1800 | routines,2
1801 | rubio,3
1802 | ruing,2
1803 | ruled,1
1804 | rumored,2
1805 | rushed,1
1806 | rwanda,3
1807 | sacrificed,3
1808 | salesman,2
1809 | salesmen,2
1810 | salespeople,3
1811 | salesperson,3
1812 | sanctioned,2
1813 | sandwiched,2
1814 | sanitized,3
1815 | santiago,4
1816 | saves,1
1817 | savvier,3
1818 | scaled,1
1819 | scandalized,3
1820 | scandinavia,5
1821 | scandinavian,5
1822 | scandinavians,5
1823 | scanned,1
1824 | scatterbrained,3
1825 | scattered,2
1826 | scenarios,4
1827 | schemed,1
1828 | scoffed,1
1829 | scored,1
1830 | scratched,1
1831 | scrawled,1
1832 | screened,1
1833 | screwed,1
1834 | scrolled,1
1835 | scrubbed,1
1836 | searched,1
1837 | seasoned,2
1838 | sectarian,4
1839 | secures,2
1840 | seemingly,3
1841 | seethed,1
1842 | seizures,2
1843 | selected,3
1844 | selfie,2
1845 | sensed,1
1846 | senseless,2
1847 | sensual,3
1848 | sensuous,3
1849 | sensuously,4
1850 | sensuousness,4
1851 | sentenced,2
1852 | sentient,3
1853 | separates,3
1854 | sequestered,3
1855 | sequined,2
1856 | serviced,2
1857 | sewed,1
1858 | sexism,3
1859 | shades,1
1860 | shadowed,2
1861 | shakespeare,2
1862 | shaped,1
1863 | shapeless,2
1864 | sharpened,2
1865 | sharply,2
1866 | shattered,2
1867 | shelled,1
1868 | shellshocked,2
1869 | sheltered,2
1870 | sheltered,2
1871 | shiitake,3
1872 | shimmying,3
1873 | shined,1
1874 | shocked,1
1875 | shooting,2
1876 | shores,1
1877 | short-term,2
1878 | shortchanged,2
1879 | shouldered,2
1880 | shouldn't,2
1881 | shreveport,2
1882 | shuddered,2
1883 | shuttered,2
1884 | sicilian,4
1885 | sideline,2
1886 | sidelines,2
1887 | sidelining,3
1888 | sidestep,2
1889 | sideswiping,3
1890 | sidewalks,2
1891 | sideways,2
1892 | signaled,2
1893 | signatures,3
1894 | significantly,5
1895 | similarly,4
1896 | situated,4
1897 | skepticism,4
1898 | sketched,1
1899 | skewered,2
1900 | slaveholder,3
1901 | slaves,1
1902 | sledgehammer,3
1903 | sledgehammers,3
1904 | sliced,1
1905 | slowed,1
1906 | smaller,2
1907 | smallest,2
1908 | smashed,1
1909 | smelled,1
1910 | smiled,1
1911 | smirked,1
1912 | smithsonian,4
1913 | smoked,1
1914 | smoothed,1
1915 | smothered,2
1916 | smudged,1
1917 | snatched,1
1918 | sneaked,1
1919 | sneezed,1
1920 | snubbed,1
1921 | so-called,2
1922 | soaked,1
1923 | soared,1
1924 | sobriety,4
1925 | socialism,4
1926 | socialized,3
1927 | socially,3
1928 | sociologist,5
1929 | sociology,5
1930 | sockeye,2
1931 | sofia,3
1932 | solved,1
1933 | sophomore,2
1934 | souped,1
1935 | sourced,1
1936 | spaced,1
1937 | spaceship,2
1938 | spaceships,2
1939 | spanned,1
1940 | spared,1
1941 | sparked,1
1942 | sparsely,2
1943 | spawned,1
1944 | specialized,3
1945 | speculates,3
1946 | spelled,1
1947 | spendier,3
1948 | spending,2
1949 | spiced,1
1950 | spiked,1
1951 | spilled,1
1952 | spire,2
1953 | splashed,1
1954 | spokeswoman,3
1955 | sponsored,2
1956 | spontaneity,5
1957 | spontaneous,4
1958 | spoofed,1
1959 | spooked,1
1960 | spores,1
1961 | sprawled,1
1962 | spurned,1
1963 | spurred,1
1964 | sputtered,2
1965 | squarely,2
1966 | squirrel,1
1967 | squirreled,1
1968 | squirrels,1
1969 | stacked,1
1970 | staged,1
1971 | stained,1
1972 | stakeholder,3
1973 | stakeholders,3
1974 | stalemate,2
1975 | stalemates,2
1976 | standardized,3
1977 | starting,2
1978 | startling,3
1979 | statesman,2
1980 | statewide,2
1981 | statuary,4
1982 | steamed,1
1983 | steeped,1
1984 | stefania,4
1985 | stephanie,3
1986 | stiffed,1
1987 | stirred,1
1988 | stocked,1
1989 | stockpile,3
1990 | stonehenge,2
1991 | stonier,3
1992 | stormed,1
1993 | straying,2
1994 | strengthened,2
1995 | strenuously,4
1996 | stretched,1
1997 | stretched,1
1998 | striped,1
1999 | stripes,1
2000 | stroked,1
2001 | strokes,1
2002 | strontium,3
2003 | structured,2
2004 | studying,3
2005 | stuffed,1
2006 | stumped,1
2007 | stunned,1
2008 | stylized,2
2009 | subbed,1
2010 | submerged,2
2011 | subservient,4
2012 | subsidized,3
2013 | substantially,4
2014 | successfully,4
2015 | sucked,1
2016 | suddenly,3
2017 | suffered,2
2018 | summed,1
2019 | supersized,3
2020 | supplier,3
2021 | surfaced,2
2022 | surged,1
2023 | surprisingly,4
2024 | surrealism,4
2025 | surrounded,3
2026 | survived,2
2027 | sustained,2
2028 | swapped,1
2029 | swelled,1
2030 | swiped,1
2031 | swooped,1
2032 | tabbed,1
2033 | tacked,1
2034 | tagged,1
2035 | tailbones,2
2036 | tailed,1
2037 | tailored,2
2038 | tailpipes,2
2039 | talked,1
2040 | taped,1
2041 | tapes,1
2042 | taqueria,4
2043 | tares,1
2044 | tasked,1
2045 | tastemakers,3
2046 | taxed,1
2047 | taxpayers,3
2048 | teammates,2
2049 | teared,1
2050 | techniques,2
2051 | temperatures,4
2052 | tempered,2
2053 | tensed,1
2054 | tensely,2
2055 | terabytes,3
2056 | terrarium,4
2057 | terrier,3
2058 | terrifying,4
2059 | testing,2
2060 | textual,3
2061 | textured,2
2062 | that'll,2
2063 | thawed,1
2064 | theater,2
2065 | theatergoer,4
2066 | theorized,2
2067 | theory,2
2068 | there's,1
2069 | thickened,2
2070 | thoroughfares,3
2071 | threatened,2
2072 | thrilled,1
2073 | thumbed,1
2074 | tiberio,4
2075 | tiered,1
2076 | tightly,2
2077 | tiled,1
2078 | timed,1
2079 | timeline,2
2080 | timelines,2
2081 | timepiece,2
2082 | timepieces,3
2083 | timezone,2
2084 | timezones,2
2085 | tinged,1
2086 | tippecanoe,4
2087 | tipped,1
2088 | tire,2
2089 | toil,2
2090 | tokenized,3
2091 | tolerates,3
2092 | tolstoyan,3
2093 | topped,1
2094 | tortured,2
2095 | totaled,2
2096 | touched,1
2097 | toured,1
2098 | tourism,3
2099 | toyota,3
2100 | traditionally,5
2101 | trafficked,2
2102 | transformed,2
2103 | trapped,1
2104 | traumatized,3
2105 | traveled,2
2106 | traversed,2
2107 | treasured,2
2108 | treasures,2
2109 | treated,2
2110 | trendier,3
2111 | triggered,2
2112 | trilobites,3
2113 | trivia,3
2114 | trivial,3
2115 | tropes,1
2116 | trudged,1
2117 | tucked,1
2118 | tulle,1
2119 | tumultuous,4
2120 | tuned,1
2121 | twerked,1
2122 | typically,4
2123 | ukrainian,4
2124 | ultimately,4
2125 | unadorned,3
2126 | unanchored,3
2127 | unattached,3
2128 | unbothered,3
2129 | unchanged,2
2130 | unconstrained,3
2131 | unconvinced,3
2132 | uncovered,3
2133 | undeniable,5
2134 | undeniably,5
2135 | undermined,3
2136 | undermines,3
2137 | underscored,3
2138 | unearthed,2
2139 | unencumbered,4
2140 | unexplained,3
2141 | unfazed,2
2142 | unfettered,3
2143 | unfiltered,3
2144 | unfinished,3
2145 | unfocused,3
2146 | unfortunately,5
2147 | unfulfilled,3
2148 | uniquely,3
2149 | unites,2
2150 | unleashed,2
2151 | unlicensed,3
2152 | unmatched,2
2153 | unmoored,2
2154 | unnamed,2
2155 | unnerved,2
2156 | unpublished,3
2157 | unresolved,3
2158 | unroped,2
2159 | unsheltered,3
2160 | unsubsidized,4
2161 | untucked,2
2162 | unveiled,2
2163 | unwrapped,2
2164 | updates,2
2165 | uproarious,4
2166 | uproariously,5
2167 | urged,1
2168 | ushered,2
2169 | using,2
2170 | utopia,4
2171 | utopia,4
2172 | utopian,4
2173 | utopias,4
2174 | v.p,2
2175 | vaccines,2
2176 | vaguely,2
2177 | valerie,3
2178 | valeriya,4
2179 | valuable,3
2180 | valuation,4
2181 | valuations,4
2182 | vandalism,4
2183 | variously,4
2184 | varying,3
2185 | ventured,2
2186 | ventured,2
2187 | ventures,2
2188 | versioned,2
2189 | vertebrates,3
2190 | victorian,4
2191 | victorians,4
2192 | video's,3
2193 | videos,3
2194 | vienna,3
2195 | vignettes,2
2196 | vinaigrettes,3
2197 | vindicates,3
2198 | viola,3
2199 | violator,4
2200 | violators,4
2201 | violently,4
2202 | virus's,3
2203 | vivienne,3
2204 | voiced,1
2205 | volumes,2
2206 | voting,2
2207 | voyages,3
2208 | voyeuristic,4
2209 | w,3
2210 | waged,1
2211 | waived,1
2212 | walked,1
2213 | walleye,2
2214 | wandered,2
2215 | waned,1
2216 | wanes,1
2217 | wares,1
2218 | warmed,1
2219 | warned,1
2220 | warped,1
2221 | wasn't,2
2222 | watched,1
2223 | watered,2
2224 | waved,1
2225 | wavered,2
2226 | weakened,2
2227 | weakened,2
2228 | weathered,2
2229 | websites,2
2230 | wedged,1
2231 | weighed,1
2232 | welcomed,2
2233 | weren't,1
2234 | werewolf,2
2235 | werewolves,2
2236 | westphalia,4
2237 | wheeled,1
2238 | whites,1
2239 | wikipedia,5
2240 | wildfire,3
2241 | willingness,3
2242 | wiped,1
2243 | wished,1
2244 | witnessed,2
2245 | wondered,2
2246 | worrying,3
2247 | worsened,2
2248 | wouldn't,2
2249 | wrecked,1
2250 | wrongdoing,3
2251 | yanked,1
2252 | yoked,1
2253 | yosemite,4
2254 | zipped,1
2255 | zoe,2
2256 | zoology,4
2257 | zoomed,1
2258 |
--------------------------------------------------------------------------------
/Pipfile.lock:
--------------------------------------------------------------------------------
1 | {
2 | "_meta": {
3 | "hash": {
4 | "sha256": "0949c2f9a9e6b5bf0c739360550140f5311980e02c18e4ecc0371f572c4d1419"
5 | },
6 | "pipfile-spec": 6,
7 | "requires": {},
8 | "sources": [
9 | {
10 | "name": "pypi",
11 | "url": "https://pypi.org/simple",
12 | "verify_ssl": true
13 | }
14 | ]
15 | },
16 | "default": {
17 | "aiodns": {
18 | "hashes": [
19 | "sha256:2b19bc5f97e5c936638d28e665923c093d8af2bf3aa88d35c43417fa25d136a2",
20 | "sha256:946bdfabe743fceeeb093c8a010f5d1645f708a241be849e17edfb0e49e08cd6"
21 | ],
22 | "index": "pypi",
23 | "version": "==3.0.0"
24 | },
25 | "aiofiles": {
26 | "hashes": [
27 | "sha256:7a973fc22b29e9962d0897805ace5856e6a566ab1f0c8e5c91ff6c866519c937",
28 | "sha256:8334f23235248a3b2e83b2c3a78a22674f39969b96397126cc93664d9a901e59"
29 | ],
30 | "index": "pypi",
31 | "version": "==0.8.0"
32 | },
33 | "aiohttp": {
34 | "hashes": [
35 | "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3",
36 | "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782",
37 | "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75",
38 | "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf",
39 | "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7",
40 | "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675",
41 | "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1",
42 | "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785",
43 | "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4",
44 | "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf",
45 | "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5",
46 | "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15",
47 | "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca",
48 | "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8",
49 | "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac",
50 | "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8",
51 | "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef",
52 | "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516",
53 | "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700",
54 | "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2",
55 | "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8",
56 | "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0",
57 | "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676",
58 | "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad",
59 | "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155",
60 | "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db",
61 | "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd",
62 | "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091",
63 | "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602",
64 | "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411",
65 | "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93",
66 | "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd",
67 | "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec",
68 | "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51",
69 | "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7",
70 | "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17",
71 | "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d",
72 | "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00",
73 | "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923",
74 | "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440",
75 | "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32",
76 | "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e",
77 | "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1",
78 | "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724",
79 | "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a",
80 | "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8",
81 | "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2",
82 | "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33",
83 | "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b",
84 | "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2",
85 | "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632",
86 | "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b",
87 | "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2",
88 | "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316",
89 | "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74",
90 | "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96",
91 | "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866",
92 | "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44",
93 | "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950",
94 | "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa",
95 | "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c",
96 | "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a",
97 | "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd",
98 | "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd",
99 | "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9",
100 | "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421",
101 | "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2",
102 | "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922",
103 | "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4",
104 | "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237",
105 | "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642",
106 | "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"
107 | ],
108 | "index": "pypi",
109 | "version": "==3.8.1"
110 | },
111 | "aiosignal": {
112 | "hashes": [
113 | "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a",
114 | "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"
115 | ],
116 | "markers": "python_version >= '3.6'",
117 | "version": "==1.2.0"
118 | },
119 | "aiosqlite": {
120 | "hashes": [
121 | "sha256:1df802815bb1e08a26c06d5ea9df589bcb8eec56e5f3378103b0f9b223c6703c",
122 | "sha256:2e915463164efa65b60fd1901aceca829b6090082f03082618afca6fb9c8fdf7"
123 | ],
124 | "index": "pypi",
125 | "version": "==0.16.1"
126 | },
127 | "async-timeout": {
128 | "hashes": [
129 | "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15",
130 | "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"
131 | ],
132 | "markers": "python_version >= '3.6'",
133 | "version": "==4.0.2"
134 | },
135 | "asyncio": {
136 | "hashes": [
137 | "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41",
138 | "sha256:b62c9157d36187eca799c378e572c969f0da87cd5fc42ca372d92cdb06e7e1de",
139 | "sha256:c46a87b48213d7464f22d9a497b9eef8c1928b68320a2fa94240f969f6fec08c",
140 | "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d"
141 | ],
142 | "index": "pypi",
143 | "version": "==3.4.3"
144 | },
145 | "attrs": {
146 | "hashes": [
147 | "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4",
148 | "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"
149 | ],
150 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
151 | "version": "==21.4.0"
152 | },
153 | "beautifulsoup4": {
154 | "hashes": [
155 | "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30",
156 | "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"
157 | ],
158 | "index": "pypi",
159 | "version": "==4.11.1"
160 | },
161 | "blis": {
162 | "hashes": [
163 | "sha256:148f59a0a47a38ce82e3afc50c709494d5e5a494bef28ce1519c7a17346c645b",
164 | "sha256:1667db8439d9ca41c0c1f0ea954d87462be01b125436c4b264f73603c9fb4e82",
165 | "sha256:3e024f103522e72a27019cfcfe14569522a394f5d651565560a18040fdd69a6c",
166 | "sha256:4a48eeaa506f176bcac306378f5e8063697c93e26d2418fcbe053e8912019090",
167 | "sha256:5d4a81f9438db7a19ac8e64ad41331f65a659ea8f3bb1889a9c2088cfd9fe104",
168 | "sha256:64bef63b1abd5b41819ea53897bdbc03c631a59c1757a9393e6ae0828692f31c",
169 | "sha256:680480dfa16b354f2e4d584edb8d36f0505ed8df12939beee2d161aea7bb3609",
170 | "sha256:76d13dbcd648ca33dfc83569bb219d0696e4f6e5ad00b9f538332a3bdb28ff30",
171 | "sha256:7865e39cac4e10506afc49213938fb7e13bf73ca980c9c20ffad2de4ef858f43",
172 | "sha256:a0183760604b14e8eb671a431d06606594def03c36aaaa2a2e7b7f88382dac76",
173 | "sha256:b5e0acc760daf5c3b45bce44653943e3a04d81c21c5b92213ed51664525dc24e",
174 | "sha256:bead485e5d79d3eb62a8df55618743878fb3cba606aaf926153db5803270b185",
175 | "sha256:cfb7d730fef706f3ea4389196ce5f610f24cc83f828c498a275c12f05f0cf5c4",
176 | "sha256:d6055ced65d6581ab4f1da0d3f6ec14c60512474c5c9b3210c9f30dd7dd1447d",
177 | "sha256:e22145110864bcffb1d52cb57050b67b8a8ecd43c7c0a1ac0bcdb2c85c8bf416",
178 | "sha256:f4109cce38e644e81d923836b34024905d59e88c8fb48b89b420f4d7661cd89f"
179 | ],
180 | "version": "==0.7.7"
181 | },
182 | "catalogue": {
183 | "hashes": [
184 | "sha256:535d33ae79ebd21ca298551d85da186ae8b8e1df36b0fb0246da774163ec2d6b",
185 | "sha256:cab4feda641fe05da1e6a1a9d123b0869d5ca324dcd93d4a5c384408ab62e7fb"
186 | ],
187 | "markers": "python_version >= '3.6'",
188 | "version": "==2.0.7"
189 | },
190 | "cchardet": {
191 | "hashes": [
192 | "sha256:0b859069bbb9d27c78a2c9eb997e6f4b738db2d7039a03f8792b4058d61d1109",
193 | "sha256:228d2533987c450f39acf7548f474dd6814c446e9d6bd228e8f1d9a2d210f10b",
194 | "sha256:2309ff8fc652b0fc3c0cff5dbb172530c7abb92fe9ba2417c9c0bcf688463c1c",
195 | "sha256:24974b3e40fee9e7557bb352be625c39ec6f50bc2053f44a3d1191db70b51675",
196 | "sha256:273699c4e5cd75377776501b72a7b291a988c6eec259c29505094553ee505597",
197 | "sha256:27a9ba87c9f99e0618e1d3081189b1217a7d110e5c5597b0b7b7c3fedd1c340a",
198 | "sha256:302aa443ae2526755d412c9631136bdcd1374acd08e34f527447f06f3c2ddb98",
199 | "sha256:45456c59ec349b29628a3c6bfb86d818ec3a6fbb7eb72de4ff3bd4713681c0e3",
200 | "sha256:48ba829badef61441e08805cfa474ccd2774be2ff44b34898f5854168c596d4d",
201 | "sha256:50ad671e8d6c886496db62c3bd68b8d55060688c655873aa4ce25ca6105409a1",
202 | "sha256:54341e7e1ba9dc0add4c9d23b48d3a94e2733065c13920e85895f944596f6150",
203 | "sha256:54d0b26fd0cd4099f08fb9c167600f3e83619abefeaa68ad823cc8ac1f7bcc0c",
204 | "sha256:5a25f9577e9bebe1a085eec2d6fdd72b7a9dd680811bba652ea6090fb2ff472f",
205 | "sha256:6b6397d8a32b976a333bdae060febd39ad5479817fabf489e5596a588ad05133",
206 | "sha256:70eeae8aaf61192e9b247cf28969faef00578becd2602526ecd8ae7600d25e0e",
207 | "sha256:80e6faae75ecb9be04a7b258dc4750d459529debb6b8dee024745b7b5a949a34",
208 | "sha256:90086e5645f8a1801350f4cc6cb5d5bf12d3fa943811bb08667744ec1ecc9ccd",
209 | "sha256:a39526c1c526843965cec589a6f6b7c2ab07e3e56dc09a7f77a2be6a6afa4636",
210 | "sha256:b154effa12886e9c18555dfc41a110f601f08d69a71809c8d908be4b1ab7314f",
211 | "sha256:b59ddc615883835e03c26f81d5fc3671fab2d32035c87f50862de0da7d7db535",
212 | "sha256:bd7f262f41fd9caf5a5f09207a55861a67af6ad5c66612043ed0f81c58cdf376",
213 | "sha256:c428b6336545053c2589f6caf24ea32276c6664cb86db817e03a94c60afa0eaf",
214 | "sha256:c6f70139aaf47ffb94d89db603af849b82efdf756f187cdd3e566e30976c519f",
215 | "sha256:c96aee9ebd1147400e608a3eff97c44f49811f8904e5a43069d55603ac4d8c97",
216 | "sha256:ec3eb5a9c475208cf52423524dcaf713c394393e18902e861f983c38eeb77f18",
217 | "sha256:eee4f5403dc3a37a1ca9ab87db32b48dc7e190ef84601068f45397144427cc5e",
218 | "sha256:f16517f3697569822c6d09671217fdeab61dfebc7acb5068634d6b0728b86c0b",
219 | "sha256:f86e0566cb61dc4397297696a4a1b30f6391b50bc52b4f073507a48466b6255a",
220 | "sha256:fdac1e4366d0579fff056d1280b8dc6348be964fda8ebb627c0269e097ab37fa"
221 | ],
222 | "index": "pypi",
223 | "version": "==2.1.7"
224 | },
225 | "certifi": {
226 | "hashes": [
227 | "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872",
228 | "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"
229 | ],
230 | "version": "==2021.10.8"
231 | },
232 | "cffi": {
233 | "hashes": [
234 | "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3",
235 | "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2",
236 | "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636",
237 | "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20",
238 | "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728",
239 | "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27",
240 | "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66",
241 | "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443",
242 | "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0",
243 | "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7",
244 | "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39",
245 | "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605",
246 | "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a",
247 | "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37",
248 | "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029",
249 | "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139",
250 | "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc",
251 | "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df",
252 | "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14",
253 | "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880",
254 | "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2",
255 | "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a",
256 | "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e",
257 | "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474",
258 | "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024",
259 | "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8",
260 | "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0",
261 | "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e",
262 | "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a",
263 | "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e",
264 | "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032",
265 | "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6",
266 | "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e",
267 | "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b",
268 | "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e",
269 | "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954",
270 | "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962",
271 | "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c",
272 | "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4",
273 | "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55",
274 | "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962",
275 | "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023",
276 | "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c",
277 | "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6",
278 | "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8",
279 | "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382",
280 | "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7",
281 | "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc",
282 | "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997",
283 | "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"
284 | ],
285 | "version": "==1.15.0"
286 | },
287 | "charset-normalizer": {
288 | "hashes": [
289 | "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597",
290 | "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"
291 | ],
292 | "markers": "python_version >= '3.5'",
293 | "version": "==2.0.12"
294 | },
295 | "click": {
296 | "hashes": [
297 | "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e",
298 | "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"
299 | ],
300 | "markers": "python_version >= '3.7'",
301 | "version": "==8.1.3"
302 | },
303 | "cymem": {
304 | "hashes": [
305 | "sha256:04676d696596b0db3f3c5a3936bab12fb6f24278921a6622bb185e61765b2b4d",
306 | "sha256:169725b5816959d34de2545b33fee6a8021a6e08818794a426c5a4f981f17e5e",
307 | "sha256:2aa3fa467d906cd2c27fa0a2e2952dd7925f5fcc7973fab6d815ef6acb25aad8",
308 | "sha256:4749f220e4c06ec44eb10de13794ff0508cdc4f8eff656cf49cab2cdb3122c0c",
309 | "sha256:492084aef23ac2ff3da3729e9d36340bc91a96c2dc8c3a82a1926e384ab52412",
310 | "sha256:4f87fe087f2ae36c3e20e2b1a29d7f76a28c035372d0a97655f26223d975235a",
311 | "sha256:6b0d1a6b0a1296f31fa9e4b7ae5ea49394084ecc883b1ae6fec4844403c43468",
312 | "sha256:700540b68e96a7056d0691d467df2bbaaf0934a3e6fe2383669998cbee19580a",
313 | "sha256:971cf0a8437dfb4185c3049c086e463612fe849efadc0f5cc153fc81c501da7d",
314 | "sha256:a93fba62fe79dbf6fc4d5b6d804a6e114b44af3ff3d40a28833ee39f21bd336b",
315 | "sha256:af3c01e6b20f9e6c07c7d7cdb7f710e49889d3906c9a3e039546ee6636a34b9a",
316 | "sha256:b8e1c18bb00800425576710468299153caad20c64ddb6819d40a6a34e21ee21c",
317 | "sha256:c59293b232b53ebb47427f16cf648e937022f489cff36c11d1d8a1f0075b6609",
318 | "sha256:d7a59cef8f2fa25d12e2c30138f8623acbd43ad2715e730a709e49c5eef8e1b0",
319 | "sha256:dd52d8a81881804625df88453611175ab7e0099b34f52204da1f6940cf2e83c9",
320 | "sha256:ea535f74ab6024e7416f93de564e5c81fb7c0964b96280de66f60aeb05f0cf53"
321 | ],
322 | "version": "==2.0.6"
323 | },
324 | "docopt": {
325 | "hashes": [
326 | "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"
327 | ],
328 | "version": "==0.6.2"
329 | },
330 | "frozenlist": {
331 | "hashes": [
332 | "sha256:006d3595e7d4108a12025ddf415ae0f6c9e736e726a5db0183326fd191b14c5e",
333 | "sha256:01a73627448b1f2145bddb6e6c2259988bb8aee0fb361776ff8604b99616cd08",
334 | "sha256:03a7dd1bfce30216a3f51a84e6dd0e4a573d23ca50f0346634916ff105ba6e6b",
335 | "sha256:0437fe763fb5d4adad1756050cbf855bbb2bf0d9385c7bb13d7a10b0dd550486",
336 | "sha256:04cb491c4b1c051734d41ea2552fde292f5f3a9c911363f74f39c23659c4af78",
337 | "sha256:0c36e78b9509e97042ef869c0e1e6ef6429e55817c12d78245eb915e1cca7468",
338 | "sha256:25af28b560e0c76fa41f550eacb389905633e7ac02d6eb3c09017fa1c8cdfde1",
339 | "sha256:2fdc3cd845e5a1f71a0c3518528bfdbfe2efaf9886d6f49eacc5ee4fd9a10953",
340 | "sha256:30530930410855c451bea83f7b272fb1c495ed9d5cc72895ac29e91279401db3",
341 | "sha256:31977f84828b5bb856ca1eb07bf7e3a34f33a5cddce981d880240ba06639b94d",
342 | "sha256:3c62964192a1c0c30b49f403495911298810bada64e4f03249ca35a33ca0417a",
343 | "sha256:3f7c935c7b58b0d78c0beea0c7358e165f95f1fd8a7e98baa40d22a05b4a8141",
344 | "sha256:40dff8962b8eba91fd3848d857203f0bd704b5f1fa2b3fc9af64901a190bba08",
345 | "sha256:40ec383bc194accba825fbb7d0ef3dda5736ceab2375462f1d8672d9f6b68d07",
346 | "sha256:436496321dad302b8b27ca955364a439ed1f0999311c393dccb243e451ff66aa",
347 | "sha256:4406cfabef8f07b3b3af0f50f70938ec06d9f0fc26cbdeaab431cbc3ca3caeaa",
348 | "sha256:45334234ec30fc4ea677f43171b18a27505bfb2dba9aca4398a62692c0ea8868",
349 | "sha256:47be22dc27ed933d55ee55845d34a3e4e9f6fee93039e7f8ebadb0c2f60d403f",
350 | "sha256:4a44ebbf601d7bac77976d429e9bdb5a4614f9f4027777f9e54fd765196e9d3b",
351 | "sha256:4eda49bea3602812518765810af732229b4291d2695ed24a0a20e098c45a707b",
352 | "sha256:57f4d3f03a18facacb2a6bcd21bccd011e3b75d463dc49f838fd699d074fabd1",
353 | "sha256:603b9091bd70fae7be28bdb8aa5c9990f4241aa33abb673390a7f7329296695f",
354 | "sha256:65bc6e2fece04e2145ab6e3c47428d1bbc05aede61ae365b2c1bddd94906e478",
355 | "sha256:691ddf6dc50480ce49f68441f1d16a4c3325887453837036e0fb94736eae1e58",
356 | "sha256:6983a31698490825171be44ffbafeaa930ddf590d3f051e397143a5045513b01",
357 | "sha256:6a202458d1298ced3768f5a7d44301e7c86defac162ace0ab7434c2e961166e8",
358 | "sha256:6eb275c6385dd72594758cbe96c07cdb9bd6becf84235f4a594bdf21e3596c9d",
359 | "sha256:754728d65f1acc61e0f4df784456106e35afb7bf39cfe37227ab00436fb38676",
360 | "sha256:768efd082074bb203c934e83a61654ed4931ef02412c2fbdecea0cff7ecd0274",
361 | "sha256:772965f773757a6026dea111a15e6e2678fbd6216180f82a48a40b27de1ee2ab",
362 | "sha256:871d42623ae15eb0b0e9df65baeee6976b2e161d0ba93155411d58ff27483ad8",
363 | "sha256:88aafd445a233dbbf8a65a62bc3249a0acd0d81ab18f6feb461cc5a938610d24",
364 | "sha256:8c905a5186d77111f02144fab5b849ab524f1e876a1e75205cd1386a9be4b00a",
365 | "sha256:8cf829bd2e2956066dd4de43fd8ec881d87842a06708c035b37ef632930505a2",
366 | "sha256:92e650bd09b5dda929523b9f8e7f99b24deac61240ecc1a32aeba487afcd970f",
367 | "sha256:93641a51f89473837333b2f8100f3f89795295b858cd4c7d4a1f18e299dc0a4f",
368 | "sha256:94c7a8a9fc9383b52c410a2ec952521906d355d18fccc927fca52ab575ee8b93",
369 | "sha256:9f892d6a94ec5c7b785e548e42722e6f3a52f5f32a8461e82ac3e67a3bd073f1",
370 | "sha256:acb267b09a509c1df5a4ca04140da96016f40d2ed183cdc356d237286c971b51",
371 | "sha256:adac9700675cf99e3615eb6a0eb5e9f5a4143c7d42c05cea2e7f71c27a3d0846",
372 | "sha256:aff388be97ef2677ae185e72dc500d19ecaf31b698986800d3fc4f399a5e30a5",
373 | "sha256:b5009062d78a8c6890d50b4e53b0ddda31841b3935c1937e2ed8c1bda1c7fb9d",
374 | "sha256:b684c68077b84522b5c7eafc1dc735bfa5b341fb011d5552ebe0968e22ed641c",
375 | "sha256:b9e3e9e365991f8cc5f5edc1fd65b58b41d0514a6a7ad95ef5c7f34eb49b3d3e",
376 | "sha256:bd89acd1b8bb4f31b47072615d72e7f53a948d302b7c1d1455e42622de180eae",
377 | "sha256:bde99812f237f79eaf3f04ebffd74f6718bbd216101b35ac7955c2d47c17da02",
378 | "sha256:c6c321dd013e8fc20735b92cb4892c115f5cdb82c817b1e5b07f6b95d952b2f0",
379 | "sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b",
380 | "sha256:d2257aaba9660f78c7b1d8fea963b68f3feffb1a9d5d05a18401ca9eb3e8d0a3",
381 | "sha256:d26b650b71fdc88065b7a21f8ace70175bcf3b5bdba5ea22df4bfd893e795a3b",
382 | "sha256:d6d32ff213aef0fd0bcf803bffe15cfa2d4fde237d1d4838e62aec242a8362fa",
383 | "sha256:e1e26ac0a253a2907d654a37e390904426d5ae5483150ce3adedb35c8c06614a",
384 | "sha256:e30b2f9683812eb30cf3f0a8e9f79f8d590a7999f731cf39f9105a7c4a39489d",
385 | "sha256:e84cb61b0ac40a0c3e0e8b79c575161c5300d1d89e13c0e02f76193982f066ed",
386 | "sha256:e982878792c971cbd60ee510c4ee5bf089a8246226dea1f2138aa0bb67aff148",
387 | "sha256:f20baa05eaa2bcd5404c445ec51aed1c268d62600362dc6cfe04fae34a424bd9",
388 | "sha256:f7353ba3367473d1d616ee727945f439e027f0bb16ac1a750219a8344d1d5d3c",
389 | "sha256:f96293d6f982c58ebebb428c50163d010c2f05de0cde99fd681bfdc18d4b2dc2",
390 | "sha256:ff9310f05b9d9c5c4dd472983dc956901ee6cb2c3ec1ab116ecdde25f3ce4951"
391 | ],
392 | "markers": "python_version >= '3.7'",
393 | "version": "==1.3.0"
394 | },
395 | "idna": {
396 | "hashes": [
397 | "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
398 | "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"
399 | ],
400 | "markers": "python_version >= '3'",
401 | "version": "==3.3"
402 | },
403 | "iso8601": {
404 | "hashes": [
405 | "sha256:36532f77cc800594e8f16641edae7f1baf7932f05d8e508545b95fc53c6dc85b",
406 | "sha256:906714829fedbc89955d52806c903f2332e3948ed94e31e85037f9e0226b8376"
407 | ],
408 | "version": "==0.1.16"
409 | },
410 | "jinja2": {
411 | "hashes": [
412 | "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852",
413 | "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"
414 | ],
415 | "index": "pypi",
416 | "version": "==3.1.2"
417 | },
418 | "langcodes": {
419 | "hashes": [
420 | "sha256:4d89fc9acb6e9c8fdef70bcdf376113a3db09b67285d9e1d534de6d8818e7e69",
421 | "sha256:794d07d5a28781231ac335a1561b8442f8648ca07cd518310aeb45d6f0807ef6"
422 | ],
423 | "markers": "python_version >= '3.6'",
424 | "version": "==3.3.0"
425 | },
426 | "markupsafe": {
427 | "hashes": [
428 | "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003",
429 | "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88",
430 | "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5",
431 | "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7",
432 | "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a",
433 | "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603",
434 | "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1",
435 | "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135",
436 | "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247",
437 | "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6",
438 | "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601",
439 | "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77",
440 | "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02",
441 | "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e",
442 | "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63",
443 | "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f",
444 | "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980",
445 | "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b",
446 | "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812",
447 | "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff",
448 | "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96",
449 | "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1",
450 | "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925",
451 | "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a",
452 | "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6",
453 | "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e",
454 | "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f",
455 | "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4",
456 | "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f",
457 | "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3",
458 | "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c",
459 | "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a",
460 | "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417",
461 | "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a",
462 | "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a",
463 | "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37",
464 | "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452",
465 | "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933",
466 | "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a",
467 | "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"
468 | ],
469 | "markers": "python_version >= '3.7'",
470 | "version": "==2.1.1"
471 | },
472 | "multidict": {
473 | "hashes": [
474 | "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60",
475 | "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c",
476 | "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672",
477 | "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51",
478 | "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032",
479 | "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2",
480 | "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b",
481 | "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80",
482 | "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88",
483 | "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a",
484 | "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d",
485 | "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389",
486 | "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c",
487 | "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9",
488 | "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c",
489 | "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516",
490 | "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b",
491 | "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43",
492 | "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee",
493 | "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227",
494 | "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d",
495 | "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae",
496 | "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7",
497 | "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4",
498 | "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9",
499 | "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f",
500 | "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013",
501 | "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9",
502 | "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e",
503 | "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693",
504 | "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a",
505 | "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15",
506 | "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb",
507 | "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96",
508 | "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87",
509 | "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376",
510 | "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658",
511 | "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0",
512 | "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071",
513 | "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360",
514 | "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc",
515 | "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3",
516 | "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba",
517 | "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8",
518 | "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9",
519 | "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2",
520 | "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3",
521 | "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68",
522 | "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8",
523 | "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d",
524 | "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49",
525 | "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608",
526 | "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57",
527 | "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86",
528 | "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20",
529 | "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293",
530 | "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849",
531 | "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937",
532 | "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"
533 | ],
534 | "markers": "python_version >= '3.7'",
535 | "version": "==6.0.2"
536 | },
537 | "murmurhash": {
538 | "hashes": [
539 | "sha256:0b317021f38505d48a9ab89ce32e3a06d7f3f32b06b16ceda8bb93c82eb6aea8",
540 | "sha256:13723aeb2b0f5ebc96bbcf133410481b28bfc7341ce65ae86fc32f02b54a68c1",
541 | "sha256:2165e2d0e8fa806e5aacc7fd9e7e79c633618b23c11aa724192fad5dda6599ef",
542 | "sha256:2f0ef0c80b590b4ad5cd474771f0bed81ecdb1942c549319d6895fa985d96dc3",
543 | "sha256:3d2cc5e8ff2ee28b124bf32a944e31e5e164000233b772d72281f6b62568dc86",
544 | "sha256:400c6a0a96f4fee3a3a384091044acb54f509af8b582d339de329d82ac4585f6",
545 | "sha256:630a396ebd31ca44d89b4eca36fa74ea8aae724adf0afaa2de7680c350b2936f",
546 | "sha256:65d9c6c39bb4c71689963109a1a3519acfa074280a94501c64f5e8d2a0cc257a",
547 | "sha256:6b151ab593132cae6529575515ed664b618095590c08b41beda9f47689408623",
548 | "sha256:78adacef6767250cb7422e36d4e3f0d7359176f17f79fef9d1529656f8e73167",
549 | "sha256:7e0837d2e02186eeac5aacb1e7ce7a8cada0da6fa7b366100e70c7d6c119206f",
550 | "sha256:966d2efec6e01aa32c5774c44906724efca00da3507f06faa11acafb47ea1230",
551 | "sha256:dee39a6f4067cdfefb2156374de230f49405850bc3280eb787e8f6c8daefeb8d",
552 | "sha256:f53f16ef143f93127e9aa920a30cda11a799e172b28508c32fb538a82b487a0c",
553 | "sha256:f7da66418c84982eca3494528b54ded4185d10a6b3231d53e1a2c83751e701e6",
554 | "sha256:fe79b40470885c5accfa7e378a0405407ebf0d8b0cd06a726748dcfd2d8dfa50"
555 | ],
556 | "version": "==1.0.7"
557 | },
558 | "num2words": {
559 | "hashes": [
560 | "sha256:0b6e5f53f11d3005787e206d9c03382f459ef048a43c544e3db3b1e05a961548",
561 | "sha256:37cd4f60678f7e1045cdc3adf6acf93c8b41bf732da860f97d301f04e611cc57"
562 | ],
563 | "index": "pypi",
564 | "version": "==0.5.10"
565 | },
566 | "numpy": {
567 | "hashes": [
568 | "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676",
569 | "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4",
570 | "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce",
571 | "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123",
572 | "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1",
573 | "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e",
574 | "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5",
575 | "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d",
576 | "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a",
577 | "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab",
578 | "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75",
579 | "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168",
580 | "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4",
581 | "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f",
582 | "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18",
583 | "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62",
584 | "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe",
585 | "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430",
586 | "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802",
587 | "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa"
588 | ],
589 | "markers": "python_version >= '3.8'",
590 | "version": "==1.22.3"
591 | },
592 | "packaging": {
593 | "hashes": [
594 | "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
595 | "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"
596 | ],
597 | "markers": "python_version >= '3.6'",
598 | "version": "==21.3"
599 | },
600 | "pathy": {
601 | "hashes": [
602 | "sha256:25fd04cec6393661113086730ce69c789d121bea83ab1aa18452e8fd42faf29a",
603 | "sha256:838624441f799a06b446a657e4ecc9ebc3fdd05234397e044a7c87e8f6e76b1c"
604 | ],
605 | "markers": "python_version >= '3.6'",
606 | "version": "==0.6.1"
607 | },
608 | "peony-twitter": {
609 | "hashes": [
610 | "sha256:0bcd8ed166107c40771d31a86b98fb36443ed262fb2fabd0cdc746d4b6aa36ca",
611 | "sha256:8a4b29919df070e387234ed71be3b0efa7068c9caf87fcc17e581320f6748453"
612 | ],
613 | "index": "pypi",
614 | "version": "==2.1.2"
615 | },
616 | "preshed": {
617 | "hashes": [
618 | "sha256:3af09f4cfcdaca085fd87dac8107617c4e2bb0ad1458f953841b71e9728287f5",
619 | "sha256:58661bea8d0d63a648588511407285e43d43627e27f836e30819801fb3c75d70",
620 | "sha256:5f99837e7353ce1fa81f0074d4b15f36e0af5af60a2a54d4d11e13cb09768a9e",
621 | "sha256:61b2ea656cb1c38d544cc774f1c2ad1cdab23167b46b35310a7e211d4ba9c6d0",
622 | "sha256:66a71ced487516cf81fd0431a3a843514262ae2f33e9a7688b87562258fa75d5",
623 | "sha256:6c98f725d8478f3ade4ab1ea00f50a92d2d9406d37276bc46fd8bab1d47452c4",
624 | "sha256:87e1add41b7f6236a3ccc34788f47ab8682bc28e8a2d369089062e274494c1a0",
625 | "sha256:8c60a400babfc5b25ba371fda7041be227f7c625e1fb7a43329c2c08fe00a53b",
626 | "sha256:92a8f49d17a63537a8beed48a049b62ef168ca07e0042a5b2bcdf178a1fb5d48",
627 | "sha256:a279c138ad1d5be02547b1545254929588414b01571fe637016367f6a1aa11de",
628 | "sha256:cfe1495fcfc7f479de840ddc4f426dbb55351e218ae5c8712c1269183a4d0060",
629 | "sha256:e03ae3eee961106a517fcd827b5a7c51f7317236b3e665c989054ab8dc381d28",
630 | "sha256:ea8aa9610837e907e8442e79300df0a861bfdb4dcaf026a5d9642a688ad04815",
631 | "sha256:eaffbc71fdb8625f9aac4fe7e19e20bf318d1421ea05903bebe3e6ffef27b587",
632 | "sha256:f92e752a868ea2690e1b38c4b775251a145e0fce36b9bdd972539e8271b7a23a",
633 | "sha256:fb3b7588a3a0f2f2f1bf3fe403361b2b031212b73a37025aea1df7215af3772a"
634 | ],
635 | "version": "==3.0.6"
636 | },
637 | "pycares": {
638 | "hashes": [
639 | "sha256:03490be0e7b51a0c8073f877bec347eff31003f64f57d9518d419d9369452837",
640 | "sha256:056330275dea42b7199494047a745e1d9785d39fb8c4cd469dca043532240b80",
641 | "sha256:0aa897543a786daba74ec5e19638bd38b2b432d179a0e248eac1e62de5756207",
642 | "sha256:112e1385c451069112d6b5ea1f9c378544f3c6b89882ff964e9a64be3336d7e4",
643 | "sha256:27a6f09dbfb69bb79609724c0f90dfaa7c215876a7cd9f12d585574d1f922112",
644 | "sha256:2b837315ed08c7df009b67725fe1f50489e99de9089f58ec1b243dc612f172aa",
645 | "sha256:2f5f84fe9f83eab9cd68544b165b74ba6e3412d029cc9ab20098d9c332869fc5",
646 | "sha256:40079ed58efa91747c50aac4edf8ecc7e570132ab57dc0a4030eb0d016a6cab8",
647 | "sha256:439799be4b7576e907139a7f9b3c8a01b90d3e38af4af9cd1fc6c1ee9a42b9e6",
648 | "sha256:4d5da840aa0d9b15fa51107f09270c563a348cb77b14ae9653d0bbdbe326fcc2",
649 | "sha256:4e190471a015f8225fa38069617192e06122771cce2b169ac7a60bfdbd3d4ab2",
650 | "sha256:5632f21d92cc0225ba5ff906e4e5dec415ef0b3df322c461d138190681cd5d89",
651 | "sha256:569eef8597b5e02b1bc4644b9f272160304d8c9985357d7ecfcd054da97c0771",
652 | "sha256:58a41a2baabcd95266db776c510d349d417919407f03510fc87ac7488730d913",
653 | "sha256:6831e963a910b0a8cbdd2750ffcdf5f2bb0edb3f53ca69ff18484de2cc3807c4",
654 | "sha256:71b99b9e041ae3356b859822c511f286f84c8889ec9ed1fbf6ac30fb4da13e4c",
655 | "sha256:8319afe4838e09df267c421ca93da408f770b945ec6217dda72f1f6a493e37e4",
656 | "sha256:8fd1ff17a26bb004f0f6bb902ba7dddd810059096ae0cc3b45e4f5be46315d19",
657 | "sha256:a810d01c9a426ee8b0f36969c2aef5fb966712be9d7e466920beb328cd9cefa3",
658 | "sha256:ad7b28e1b6bc68edd3d678373fa3af84e39d287090434f25055d21b4716b2fc6",
659 | "sha256:b0e50ddc78252f2e2b6b5f2c73e5b2449dfb6bea7a5a0e21dfd1e2bcc9e17382",
660 | "sha256:b266cec81dcea2c3efbbd3dda00af8d7eb0693ae9e47e8706518334b21f27d4a",
661 | "sha256:c000942f5fc64e6e046aa61aa53b629b576ba11607d108909727c3c8f211a157",
662 | "sha256:c6680f7fdc0f1163e8f6c2a11d11b9a0b524a61000d2a71f9ccd410f154fb171",
663 | "sha256:c7eba3c8354b730a54d23237d0b6445a2f68570fa68d0848887da23a3f3b71f3",
664 | "sha256:cbceaa9b2c416aa931627466d3240aecfc905c292c842252e3d77b8630072505",
665 | "sha256:dc942692fca0e27081b7bb414bb971d34609c80df5e953f6d0c62ecc8019acd9",
666 | "sha256:e1489aa25d14dbf7176110ead937c01176ed5a0ebefd3b092bbd6b202241814c",
667 | "sha256:e5a060f5fa90ae245aa99a4a8ad13ec39c2340400de037c7e8d27b081e1a3c64",
668 | "sha256:ec00f3594ee775665167b1a1630edceefb1b1283af9ac57480dba2fb6fd6c360",
669 | "sha256:ed71dc4290d9c3353945965604ef1f6a4de631733e9819a7ebc747220b27e641"
670 | ],
671 | "version": "==4.1.2"
672 | },
673 | "pycparser": {
674 | "hashes": [
675 | "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9",
676 | "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"
677 | ],
678 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
679 | "version": "==2.21"
680 | },
681 | "pydantic": {
682 | "hashes": [
683 | "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd",
684 | "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739",
685 | "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f",
686 | "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840",
687 | "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23",
688 | "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287",
689 | "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62",
690 | "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b",
691 | "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb",
692 | "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820",
693 | "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3",
694 | "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b",
695 | "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e",
696 | "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3",
697 | "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316",
698 | "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b",
699 | "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4",
700 | "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20",
701 | "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e",
702 | "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505",
703 | "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1",
704 | "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833"
705 | ],
706 | "markers": "python_full_version >= '3.6.1'",
707 | "version": "==1.8.2"
708 | },
709 | "pyparsing": {
710 | "hashes": [
711 | "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb",
712 | "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"
713 | ],
714 | "markers": "python_full_version >= '3.6.8'",
715 | "version": "==3.0.9"
716 | },
717 | "pypika": {
718 | "hashes": [
719 | "sha256:316839144d3ad7656405a10cdd26d2181f16bb8ff7e256d616ffb50335ca1fcb"
720 | ],
721 | "version": "==0.44.1"
722 | },
723 | "python-dateutil": {
724 | "hashes": [
725 | "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
726 | "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
727 | ],
728 | "index": "pypi",
729 | "version": "==2.8.2"
730 | },
731 | "python-dotenv": {
732 | "hashes": [
733 | "sha256:b7e3b04a59693c42c36f9ab1cc2acc46fa5df8c78e178fc33a8d4cd05c8d498f",
734 | "sha256:d92a187be61fe482e4fd675b6d52200e7be63a12b724abbf931a40ce4fa92938"
735 | ],
736 | "index": "pypi",
737 | "version": "==0.20.0"
738 | },
739 | "pytz": {
740 | "hashes": [
741 | "sha256:16962c5fb8db4a8f63a26646d8886e9d769b6c511543557bc84e9569fb9a9cb4",
742 | "sha256:180befebb1927b16f6b57101720075a984c019ac16b1b7575673bea42c6c3da5"
743 | ],
744 | "version": "==2020.5"
745 | },
746 | "requests": {
747 | "hashes": [
748 | "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61",
749 | "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"
750 | ],
751 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
752 | "version": "==2.27.1"
753 | },
754 | "setuptools": {
755 | "hashes": [
756 | "sha256:5534570b9980fc650d45c62877ff603c7aaaf24893371708736cc016bd221c3c",
757 | "sha256:ca6ba73b7fd5f734ae70ece8c4c1f7062b07f3352f6428f6277e27c8f5c64237"
758 | ],
759 | "markers": "python_version >= '3.7'",
760 | "version": "==62.2.0"
761 | },
762 | "six": {
763 | "hashes": [
764 | "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
765 | "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
766 | ],
767 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
768 | "version": "==1.16.0"
769 | },
770 | "smart-open": {
771 | "hashes": [
772 | "sha256:71d14489da58b60ce12fc3ecb823facc59a8b23cd1b58edb97175640350d3a62",
773 | "sha256:75abf758717a92a8f53aa96953f0c245c8cedf8e1e4184903db3659b419d4c17"
774 | ],
775 | "markers": "python_version >= '3.6' and python_version < '4.0'",
776 | "version": "==5.2.1"
777 | },
778 | "soupsieve": {
779 | "hashes": [
780 | "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759",
781 | "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"
782 | ],
783 | "markers": "python_version >= '3.6'",
784 | "version": "==2.3.2.post1"
785 | },
786 | "spacy": {
787 | "hashes": [
788 | "sha256:00e99c1c4c655283e1165fdb49a234034af09050d2c68b87fe1fb9d49fbb7aa4",
789 | "sha256:054f6596c0ac52fbdd1690ccdab37d8b286706bfa698abf6c7db3194f0c8dc59",
790 | "sha256:1f1c5b86daee2b1b4e60ce7c9f7a953ea60dbfe6c9c4acf3bc3c0b5a4332d475",
791 | "sha256:2070074032a1f008751cd298d32785fbcc07ec09916fa94e962f81c2a76e4976",
792 | "sha256:3639e0381b70e27841c0ce5e96bd83d7173c8356bcae69163598964b12db2646",
793 | "sha256:521df508803a924df0ea489f286e3a17d5e6eb58a22ea643ddaa544fe5a02226",
794 | "sha256:6ed92892c3d5829ed79fea188f134a9c99ff7bfa60354d023f64a77bacabd761",
795 | "sha256:7dd213224a9429cc190698294607fae0b9b94d06995e155f72c551fec66c39f4",
796 | "sha256:899c857cb6b193783a483fbc46c2ed39cc02f97252489ee6029944e6ca140046",
797 | "sha256:a2fb91e326c7f6682751a194447f6708b957fcad7589f97546986973c70774a7",
798 | "sha256:b3bdbafaf2f084cadffab95df70bc4c99441c13de9c3364078dbd99888736931",
799 | "sha256:c49d50fbe3715adc5741419367b39a468d2556648422f10b6fc4edf38eae2cb3",
800 | "sha256:cae5187f1fdb4f3478ebdb3f299d1f6c7c7f9c4b3cdd3ba9e74a7a3e566ecd7f",
801 | "sha256:df252e1b1d55068600eab4ef3e602eb32487f08704e44a85f82478e56aed9838",
802 | "sha256:ea9cabc081a7732e755dd44fbd818185ac829fcb431273a994af33d65e709281",
803 | "sha256:ebdb29392c7c6d9137127b2a4fee293c8b12e7e69277362bf744f20f3dba7a89"
804 | ],
805 | "index": "pypi",
806 | "version": "==3.3.0"
807 | },
808 | "spacy-legacy": {
809 | "hashes": [
810 | "sha256:4f7dcbc4e6c8e8cb4eadbb009f9c0a1a2a67442e0032c8d6776c9470c3759903",
811 | "sha256:dfd58b0cc65b3596cb06f7b95e7bf4fff34668297c59eb179eb050db07b199df"
812 | ],
813 | "markers": "python_version >= '3.6'",
814 | "version": "==3.0.9"
815 | },
816 | "spacy-loggers": {
817 | "hashes": [
818 | "sha256:d48c9313a577ad1818da961cf6db71a73fd1e556ae47e6e68d7e28b541d11e18",
819 | "sha256:e75d44f4cf99e6763d7132ca7c8c420e0a92790222a08bc8eb9e24ea2c13536e"
820 | ],
821 | "markers": "python_version >= '3.6'",
822 | "version": "==1.0.2"
823 | },
824 | "srsly": {
825 | "hashes": [
826 | "sha256:0d2b92c40f9aa9ba7cb0d8048bd7bfaa13d79d02e9ad6808ca7a8879ba5ed50b",
827 | "sha256:27b3f693296d8a24c306aacd5df38a565ec43214f2aeb51a38170af5dc8b48bc",
828 | "sha256:2d0236feafe3805b384532221596e6749a54d0ff10ba022b333dc1de7aa1b2f7",
829 | "sha256:61e31a72370238387a8ff2a4cebea402227215a1450648b852cad9e511a8b59e",
830 | "sha256:62630dbf20e240610fa64b6717545fcc28d9f18a6085ee93656be000678592a6",
831 | "sha256:82cbf1ec388ed0c16f8062fee30dc54ba8513bd51aae0602570143c6d9218e4c",
832 | "sha256:97a67c8f86ce3207e5e810b998a94ea49d439139adc21d9aadbd0bfab9faa64b",
833 | "sha256:a906c9b1f62c109ddcfaeaf242b19b2ebc5d2f865eb38ef4af35959027c5185b",
834 | "sha256:ab31586fd89e5e5fe6f38664209577b03e85fb834f238c928c15ed3c80ab9c73",
835 | "sha256:acbb14546da9bdf287dfefa0883e793ac563c7868eca32cd65504463980022fa",
836 | "sha256:cffec31143c6e1c783ead11245c08938cae859115d4cb0f4cf423e2895707b74",
837 | "sha256:d1d13dc2133d5a83d30774793adb2c3fd9be905da339e2d54e2c79d55248c1a5",
838 | "sha256:d3b93531f086c516a26f729beac9b052c2ad0528d72e80f9d193de26aa2202be",
839 | "sha256:dbe91f6dd4aea9e819493628356dc715bd9c606486297bb7ca5748e6e003841c",
840 | "sha256:f5ddcc5f36eb318d011c6f142e826c1ca15cb34bd5beab2f21fee62d4ae4d590",
841 | "sha256:fb08416fd6ef04c51fdeefd6d28592b64563b2853243c571a9b0d67403b5be7f"
842 | ],
843 | "markers": "python_version >= '3.6'",
844 | "version": "==2.4.3"
845 | },
846 | "syllapy": {
847 | "hashes": [
848 | "sha256:56eeac7f490905643a093d663ad0eec8c0f10344f80f96462414e8530c152cbb",
849 | "sha256:780e58448283e70ea7a0a4dc4db3c8045adbff14aea52c11c4cef7fd1df9e60c"
850 | ],
851 | "index": "pypi",
852 | "version": "==0.7.1"
853 | },
854 | "thinc": {
855 | "hashes": [
856 | "sha256:0368c0b279492c0ed0b5b1bc79614e8a335ae1ccc3b1617de46f04eb74dc9a43",
857 | "sha256:0557791e73865fa81f09623dd1f9b98b6d4ab80c63fca5f141530536516aac98",
858 | "sha256:2e315020da85c3791e191fbf37c4a2433f57cf322e27380da0cd4de99d96053b",
859 | "sha256:376b196da6c69c8efaaf26fb99f6997543d80ea4bc5f4ab8600e9d1d521a7dc9",
860 | "sha256:42641f021f4fdc47eaec4b9ff66246b153b9783ef24e2c266bf0f51eccd40db5",
861 | "sha256:489521ca3cca469d67432fc30f14c7c13c17320b179bf8e362319313feaafbb7",
862 | "sha256:5d98e6b3bf220c1068442d09d7c34dd8e52bbdfa43ea32f773747c5909a1c011",
863 | "sha256:70781a0802fbb62a27217ccb80e744e80a5b43f9107ac596c5cd2dc9878ae258",
864 | "sha256:72cec290eb1b54ba6144b05d96f3247ea34eb41c66842961b05b408b93f2ba9b",
865 | "sha256:8ddda1aa1432eef8bab5c83e4cf2020f1ed891771a6dd86729f1aa6078f25f2c",
866 | "sha256:a1f19dd9a7121d332d16446db39b4999abb4f040ce7c71bc86ea05664c86d361",
867 | "sha256:a4276b64a8cd91197f30382c0874f59fa6c94ef533150d845b2f30998aae87cc",
868 | "sha256:a4ee24a6505d63b6f0161f25d0f73f87ab569e0e1a9799a6baca97352788a91f",
869 | "sha256:bed92be72516b1511fecaf616ea31ff1c2e972a7ec4ad991c212f9b2f5c94183",
870 | "sha256:ecd8eab82598b079e901f16567818dc955481326c01d84b819c3c05801b97e07",
871 | "sha256:f9ba4e4dac98e166950e004c87a0f57b8f8796ecd0e3b6973beb6febc20257ff"
872 | ],
873 | "markers": "python_version >= '3.6'",
874 | "version": "==8.0.15"
875 | },
876 | "tortoise-orm": {
877 | "hashes": [
878 | "sha256:9729eac3eb58e59c32e2815d5ff1941a71e1eecd63834ae7199b6084c1a454b5",
879 | "sha256:f36aa16d07bab69b141e91f8791c0f878fbcc0acfffa3c671ea10a6ad73c54ed"
880 | ],
881 | "index": "pypi",
882 | "version": "== 0.16.21"
883 | },
884 | "tqdm": {
885 | "hashes": [
886 | "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d",
887 | "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"
888 | ],
889 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
890 | "version": "==4.64.0"
891 | },
892 | "typer": {
893 | "hashes": [
894 | "sha256:5646aef0d936b2c761a10393f0384ee6b5c7fe0bb3e5cd710b17134ca1d99cff",
895 | "sha256:e8467f0ebac0c81366c2168d6ad9f888efdfb6d4e1d3d5b4a004f46fa444b5c3"
896 | ],
897 | "markers": "python_version >= '3.6'",
898 | "version": "==0.4.1"
899 | },
900 | "typing-extensions": {
901 | "hashes": [
902 | "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708",
903 | "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"
904 | ],
905 | "markers": "python_version >= '3.7'",
906 | "version": "==4.2.0"
907 | },
908 | "ujson": {
909 | "hashes": [
910 | "sha256:f66073e5506e91d204ab0c614a148d5aa938bdbf104751be66f8ad7a222f5f86"
911 | ],
912 | "version": "==1.35"
913 | },
914 | "unidecode": {
915 | "hashes": [
916 | "sha256:8e4352fb93d5a735c788110d2e7ac8e8031eb06ccbfe8d324ab71735015f9342",
917 | "sha256:afa04efcdd818a93237574791be9b2817d7077c25a068b00f8cff7baa4e59257"
918 | ],
919 | "index": "pypi",
920 | "version": "==1.3.4"
921 | },
922 | "urllib3": {
923 | "hashes": [
924 | "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14",
925 | "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"
926 | ],
927 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'",
928 | "version": "==1.26.9"
929 | },
930 | "wasabi": {
931 | "hashes": [
932 | "sha256:217edcb2850993c7931399e7419afccde13539d589e333bc85f9053cf0bb1772",
933 | "sha256:ada6f13e9b70ef26bf95fad0febdfdebe2005e29a08ad58f4bbae383a97298cf"
934 | ],
935 | "version": "==0.9.1"
936 | },
937 | "yarl": {
938 | "hashes": [
939 | "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac",
940 | "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8",
941 | "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e",
942 | "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746",
943 | "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98",
944 | "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125",
945 | "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d",
946 | "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d",
947 | "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986",
948 | "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d",
949 | "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec",
950 | "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8",
951 | "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee",
952 | "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3",
953 | "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1",
954 | "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd",
955 | "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b",
956 | "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de",
957 | "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0",
958 | "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8",
959 | "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6",
960 | "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245",
961 | "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23",
962 | "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332",
963 | "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1",
964 | "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c",
965 | "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4",
966 | "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0",
967 | "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8",
968 | "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832",
969 | "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58",
970 | "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6",
971 | "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1",
972 | "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52",
973 | "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92",
974 | "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185",
975 | "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d",
976 | "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d",
977 | "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b",
978 | "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739",
979 | "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05",
980 | "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63",
981 | "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d",
982 | "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa",
983 | "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913",
984 | "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe",
985 | "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b",
986 | "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b",
987 | "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656",
988 | "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1",
989 | "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4",
990 | "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e",
991 | "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63",
992 | "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271",
993 | "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed",
994 | "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d",
995 | "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda",
996 | "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265",
997 | "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f",
998 | "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c",
999 | "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba",
1000 | "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c",
1001 | "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b",
1002 | "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523",
1003 | "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a",
1004 | "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef",
1005 | "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95",
1006 | "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72",
1007 | "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794",
1008 | "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41",
1009 | "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576",
1010 | "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59"
1011 | ],
1012 | "markers": "python_version >= '3.6'",
1013 | "version": "==1.7.2"
1014 | }
1015 | },
1016 | "develop": {
1017 | "aiohttp": {
1018 | "hashes": [
1019 | "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3",
1020 | "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782",
1021 | "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75",
1022 | "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf",
1023 | "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7",
1024 | "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675",
1025 | "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1",
1026 | "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785",
1027 | "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4",
1028 | "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf",
1029 | "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5",
1030 | "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15",
1031 | "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca",
1032 | "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8",
1033 | "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac",
1034 | "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8",
1035 | "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef",
1036 | "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516",
1037 | "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700",
1038 | "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2",
1039 | "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8",
1040 | "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0",
1041 | "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676",
1042 | "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad",
1043 | "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155",
1044 | "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db",
1045 | "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd",
1046 | "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091",
1047 | "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602",
1048 | "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411",
1049 | "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93",
1050 | "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd",
1051 | "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec",
1052 | "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51",
1053 | "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7",
1054 | "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17",
1055 | "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d",
1056 | "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00",
1057 | "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923",
1058 | "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440",
1059 | "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32",
1060 | "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e",
1061 | "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1",
1062 | "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724",
1063 | "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a",
1064 | "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8",
1065 | "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2",
1066 | "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33",
1067 | "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b",
1068 | "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2",
1069 | "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632",
1070 | "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b",
1071 | "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2",
1072 | "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316",
1073 | "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74",
1074 | "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96",
1075 | "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866",
1076 | "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44",
1077 | "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950",
1078 | "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa",
1079 | "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c",
1080 | "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a",
1081 | "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd",
1082 | "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd",
1083 | "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9",
1084 | "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421",
1085 | "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2",
1086 | "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922",
1087 | "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4",
1088 | "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237",
1089 | "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642",
1090 | "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"
1091 | ],
1092 | "index": "pypi",
1093 | "version": "==3.8.1"
1094 | },
1095 | "aiosignal": {
1096 | "hashes": [
1097 | "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a",
1098 | "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"
1099 | ],
1100 | "markers": "python_version >= '3.6'",
1101 | "version": "==1.2.0"
1102 | },
1103 | "async-timeout": {
1104 | "hashes": [
1105 | "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15",
1106 | "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"
1107 | ],
1108 | "markers": "python_version >= '3.6'",
1109 | "version": "==4.0.2"
1110 | },
1111 | "attrs": {
1112 | "hashes": [
1113 | "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4",
1114 | "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"
1115 | ],
1116 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
1117 | "version": "==21.4.0"
1118 | },
1119 | "charset-normalizer": {
1120 | "hashes": [
1121 | "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597",
1122 | "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"
1123 | ],
1124 | "markers": "python_version >= '3.5'",
1125 | "version": "==2.0.12"
1126 | },
1127 | "coverage": {
1128 | "extras": [
1129 | "toml"
1130 | ],
1131 | "hashes": [
1132 | "sha256:03e2a7826086b91ef345ff18742ee9fc47a6839ccd517061ef8fa1976e652ce9",
1133 | "sha256:07e6db90cd9686c767dcc593dff16c8c09f9814f5e9c51034066cad3373b914d",
1134 | "sha256:18d520c6860515a771708937d2f78f63cc47ab3b80cb78e86573b0a760161faf",
1135 | "sha256:1ebf730d2381158ecf3dfd4453fbca0613e16eaa547b4170e2450c9707665ce7",
1136 | "sha256:21b7745788866028adeb1e0eca3bf1101109e2dc58456cb49d2d9b99a8c516e6",
1137 | "sha256:26e2deacd414fc2f97dd9f7676ee3eaecd299ca751412d89f40bc01557a6b1b4",
1138 | "sha256:2c6dbb42f3ad25760010c45191e9757e7dce981cbfb90e42feef301d71540059",
1139 | "sha256:2fea046bfb455510e05be95e879f0e768d45c10c11509e20e06d8fcaa31d9e39",
1140 | "sha256:34626a7eee2a3da12af0507780bb51eb52dca0e1751fd1471d0810539cefb536",
1141 | "sha256:37d1141ad6b2466a7b53a22e08fe76994c2d35a5b6b469590424a9953155afac",
1142 | "sha256:46191097ebc381fbf89bdce207a6c107ac4ec0890d8d20f3360345ff5976155c",
1143 | "sha256:4dd8bafa458b5c7d061540f1ee9f18025a68e2d8471b3e858a9dad47c8d41903",
1144 | "sha256:4e21876082ed887baed0146fe222f861b5815455ada3b33b890f4105d806128d",
1145 | "sha256:58303469e9a272b4abdb9e302a780072c0633cdcc0165db7eec0f9e32f901e05",
1146 | "sha256:5ca5aeb4344b30d0bec47481536b8ba1181d50dbe783b0e4ad03c95dc1296684",
1147 | "sha256:68353fe7cdf91f109fc7d474461b46e7f1f14e533e911a2a2cbb8b0fc8613cf1",
1148 | "sha256:6f89d05e028d274ce4fa1a86887b071ae1755082ef94a6740238cd7a8178804f",
1149 | "sha256:7a15dc0a14008f1da3d1ebd44bdda3e357dbabdf5a0b5034d38fcde0b5c234b7",
1150 | "sha256:8bdde1177f2311ee552f47ae6e5aa7750c0e3291ca6b75f71f7ffe1f1dab3dca",
1151 | "sha256:8ce257cac556cb03be4a248d92ed36904a59a4a5ff55a994e92214cde15c5bad",
1152 | "sha256:8cf5cfcb1521dc3255d845d9dca3ff204b3229401994ef8d1984b32746bb45ca",
1153 | "sha256:8fbbdc8d55990eac1b0919ca69eb5a988a802b854488c34b8f37f3e2025fa90d",
1154 | "sha256:9548f10d8be799551eb3a9c74bbf2b4934ddb330e08a73320123c07f95cc2d92",
1155 | "sha256:96f8a1cb43ca1422f36492bebe63312d396491a9165ed3b9231e778d43a7fca4",
1156 | "sha256:9b27d894748475fa858f9597c0ee1d4829f44683f3813633aaf94b19cb5453cf",
1157 | "sha256:9baff2a45ae1f17c8078452e9e5962e518eab705e50a0aa8083733ea7d45f3a6",
1158 | "sha256:a2a8b8bcc399edb4347a5ca8b9b87e7524c0967b335fbb08a83c8421489ddee1",
1159 | "sha256:acf53bc2cf7282ab9b8ba346746afe703474004d9e566ad164c91a7a59f188a4",
1160 | "sha256:b0be84e5a6209858a1d3e8d1806c46214e867ce1b0fd32e4ea03f4bd8b2e3359",
1161 | "sha256:b31651d018b23ec463e95cf10070d0b2c548aa950a03d0b559eaa11c7e5a6fa3",
1162 | "sha256:b78e5afb39941572209f71866aa0b206c12f0109835aa0d601e41552f9b3e620",
1163 | "sha256:c76aeef1b95aff3905fb2ae2d96e319caca5b76fa41d3470b19d4e4a3a313512",
1164 | "sha256:dd035edafefee4d573140a76fdc785dc38829fe5a455c4bb12bac8c20cfc3d69",
1165 | "sha256:dd6fe30bd519694b356cbfcaca9bd5c1737cddd20778c6a581ae20dc8c04def2",
1166 | "sha256:e5f4e1edcf57ce94e5475fe09e5afa3e3145081318e5fd1a43a6b4539a97e518",
1167 | "sha256:ec6bc7fe73a938933d4178c9b23c4e0568e43e220aef9472c4f6044bfc6dd0f0",
1168 | "sha256:f1555ea6d6da108e1999b2463ea1003fe03f29213e459145e70edbaf3e004aaa",
1169 | "sha256:f5fa5803f47e095d7ad8443d28b01d48c0359484fec1b9d8606d0e3282084bc4",
1170 | "sha256:f7331dbf301b7289013175087636bbaf5b2405e57259dd2c42fdcc9fcc47325e",
1171 | "sha256:f9987b0354b06d4df0f4d3e0ec1ae76d7ce7cbca9a2f98c25041eb79eec766f1",
1172 | "sha256:fd9e830e9d8d89b20ab1e5af09b32d33e1a08ef4c4e14411e559556fd788e6b2"
1173 | ],
1174 | "markers": "python_version >= '3.7'",
1175 | "version": "==6.3.2"
1176 | },
1177 | "flake8": {
1178 | "hashes": [
1179 | "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d",
1180 | "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"
1181 | ],
1182 | "index": "pypi",
1183 | "version": "==4.0.1"
1184 | },
1185 | "frozenlist": {
1186 | "hashes": [
1187 | "sha256:006d3595e7d4108a12025ddf415ae0f6c9e736e726a5db0183326fd191b14c5e",
1188 | "sha256:01a73627448b1f2145bddb6e6c2259988bb8aee0fb361776ff8604b99616cd08",
1189 | "sha256:03a7dd1bfce30216a3f51a84e6dd0e4a573d23ca50f0346634916ff105ba6e6b",
1190 | "sha256:0437fe763fb5d4adad1756050cbf855bbb2bf0d9385c7bb13d7a10b0dd550486",
1191 | "sha256:04cb491c4b1c051734d41ea2552fde292f5f3a9c911363f74f39c23659c4af78",
1192 | "sha256:0c36e78b9509e97042ef869c0e1e6ef6429e55817c12d78245eb915e1cca7468",
1193 | "sha256:25af28b560e0c76fa41f550eacb389905633e7ac02d6eb3c09017fa1c8cdfde1",
1194 | "sha256:2fdc3cd845e5a1f71a0c3518528bfdbfe2efaf9886d6f49eacc5ee4fd9a10953",
1195 | "sha256:30530930410855c451bea83f7b272fb1c495ed9d5cc72895ac29e91279401db3",
1196 | "sha256:31977f84828b5bb856ca1eb07bf7e3a34f33a5cddce981d880240ba06639b94d",
1197 | "sha256:3c62964192a1c0c30b49f403495911298810bada64e4f03249ca35a33ca0417a",
1198 | "sha256:3f7c935c7b58b0d78c0beea0c7358e165f95f1fd8a7e98baa40d22a05b4a8141",
1199 | "sha256:40dff8962b8eba91fd3848d857203f0bd704b5f1fa2b3fc9af64901a190bba08",
1200 | "sha256:40ec383bc194accba825fbb7d0ef3dda5736ceab2375462f1d8672d9f6b68d07",
1201 | "sha256:436496321dad302b8b27ca955364a439ed1f0999311c393dccb243e451ff66aa",
1202 | "sha256:4406cfabef8f07b3b3af0f50f70938ec06d9f0fc26cbdeaab431cbc3ca3caeaa",
1203 | "sha256:45334234ec30fc4ea677f43171b18a27505bfb2dba9aca4398a62692c0ea8868",
1204 | "sha256:47be22dc27ed933d55ee55845d34a3e4e9f6fee93039e7f8ebadb0c2f60d403f",
1205 | "sha256:4a44ebbf601d7bac77976d429e9bdb5a4614f9f4027777f9e54fd765196e9d3b",
1206 | "sha256:4eda49bea3602812518765810af732229b4291d2695ed24a0a20e098c45a707b",
1207 | "sha256:57f4d3f03a18facacb2a6bcd21bccd011e3b75d463dc49f838fd699d074fabd1",
1208 | "sha256:603b9091bd70fae7be28bdb8aa5c9990f4241aa33abb673390a7f7329296695f",
1209 | "sha256:65bc6e2fece04e2145ab6e3c47428d1bbc05aede61ae365b2c1bddd94906e478",
1210 | "sha256:691ddf6dc50480ce49f68441f1d16a4c3325887453837036e0fb94736eae1e58",
1211 | "sha256:6983a31698490825171be44ffbafeaa930ddf590d3f051e397143a5045513b01",
1212 | "sha256:6a202458d1298ced3768f5a7d44301e7c86defac162ace0ab7434c2e961166e8",
1213 | "sha256:6eb275c6385dd72594758cbe96c07cdb9bd6becf84235f4a594bdf21e3596c9d",
1214 | "sha256:754728d65f1acc61e0f4df784456106e35afb7bf39cfe37227ab00436fb38676",
1215 | "sha256:768efd082074bb203c934e83a61654ed4931ef02412c2fbdecea0cff7ecd0274",
1216 | "sha256:772965f773757a6026dea111a15e6e2678fbd6216180f82a48a40b27de1ee2ab",
1217 | "sha256:871d42623ae15eb0b0e9df65baeee6976b2e161d0ba93155411d58ff27483ad8",
1218 | "sha256:88aafd445a233dbbf8a65a62bc3249a0acd0d81ab18f6feb461cc5a938610d24",
1219 | "sha256:8c905a5186d77111f02144fab5b849ab524f1e876a1e75205cd1386a9be4b00a",
1220 | "sha256:8cf829bd2e2956066dd4de43fd8ec881d87842a06708c035b37ef632930505a2",
1221 | "sha256:92e650bd09b5dda929523b9f8e7f99b24deac61240ecc1a32aeba487afcd970f",
1222 | "sha256:93641a51f89473837333b2f8100f3f89795295b858cd4c7d4a1f18e299dc0a4f",
1223 | "sha256:94c7a8a9fc9383b52c410a2ec952521906d355d18fccc927fca52ab575ee8b93",
1224 | "sha256:9f892d6a94ec5c7b785e548e42722e6f3a52f5f32a8461e82ac3e67a3bd073f1",
1225 | "sha256:acb267b09a509c1df5a4ca04140da96016f40d2ed183cdc356d237286c971b51",
1226 | "sha256:adac9700675cf99e3615eb6a0eb5e9f5a4143c7d42c05cea2e7f71c27a3d0846",
1227 | "sha256:aff388be97ef2677ae185e72dc500d19ecaf31b698986800d3fc4f399a5e30a5",
1228 | "sha256:b5009062d78a8c6890d50b4e53b0ddda31841b3935c1937e2ed8c1bda1c7fb9d",
1229 | "sha256:b684c68077b84522b5c7eafc1dc735bfa5b341fb011d5552ebe0968e22ed641c",
1230 | "sha256:b9e3e9e365991f8cc5f5edc1fd65b58b41d0514a6a7ad95ef5c7f34eb49b3d3e",
1231 | "sha256:bd89acd1b8bb4f31b47072615d72e7f53a948d302b7c1d1455e42622de180eae",
1232 | "sha256:bde99812f237f79eaf3f04ebffd74f6718bbd216101b35ac7955c2d47c17da02",
1233 | "sha256:c6c321dd013e8fc20735b92cb4892c115f5cdb82c817b1e5b07f6b95d952b2f0",
1234 | "sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b",
1235 | "sha256:d2257aaba9660f78c7b1d8fea963b68f3feffb1a9d5d05a18401ca9eb3e8d0a3",
1236 | "sha256:d26b650b71fdc88065b7a21f8ace70175bcf3b5bdba5ea22df4bfd893e795a3b",
1237 | "sha256:d6d32ff213aef0fd0bcf803bffe15cfa2d4fde237d1d4838e62aec242a8362fa",
1238 | "sha256:e1e26ac0a253a2907d654a37e390904426d5ae5483150ce3adedb35c8c06614a",
1239 | "sha256:e30b2f9683812eb30cf3f0a8e9f79f8d590a7999f731cf39f9105a7c4a39489d",
1240 | "sha256:e84cb61b0ac40a0c3e0e8b79c575161c5300d1d89e13c0e02f76193982f066ed",
1241 | "sha256:e982878792c971cbd60ee510c4ee5bf089a8246226dea1f2138aa0bb67aff148",
1242 | "sha256:f20baa05eaa2bcd5404c445ec51aed1c268d62600362dc6cfe04fae34a424bd9",
1243 | "sha256:f7353ba3367473d1d616ee727945f439e027f0bb16ac1a750219a8344d1d5d3c",
1244 | "sha256:f96293d6f982c58ebebb428c50163d010c2f05de0cde99fd681bfdc18d4b2dc2",
1245 | "sha256:ff9310f05b9d9c5c4dd472983dc956901ee6cb2c3ec1ab116ecdde25f3ce4951"
1246 | ],
1247 | "markers": "python_version >= '3.7'",
1248 | "version": "==1.3.0"
1249 | },
1250 | "idna": {
1251 | "hashes": [
1252 | "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
1253 | "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"
1254 | ],
1255 | "markers": "python_version >= '3'",
1256 | "version": "==3.3"
1257 | },
1258 | "iniconfig": {
1259 | "hashes": [
1260 | "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3",
1261 | "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"
1262 | ],
1263 | "version": "==1.1.1"
1264 | },
1265 | "mccabe": {
1266 | "hashes": [
1267 | "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
1268 | "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
1269 | ],
1270 | "version": "==0.6.1"
1271 | },
1272 | "multidict": {
1273 | "hashes": [
1274 | "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60",
1275 | "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c",
1276 | "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672",
1277 | "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51",
1278 | "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032",
1279 | "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2",
1280 | "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b",
1281 | "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80",
1282 | "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88",
1283 | "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a",
1284 | "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d",
1285 | "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389",
1286 | "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c",
1287 | "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9",
1288 | "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c",
1289 | "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516",
1290 | "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b",
1291 | "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43",
1292 | "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee",
1293 | "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227",
1294 | "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d",
1295 | "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae",
1296 | "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7",
1297 | "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4",
1298 | "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9",
1299 | "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f",
1300 | "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013",
1301 | "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9",
1302 | "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e",
1303 | "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693",
1304 | "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a",
1305 | "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15",
1306 | "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb",
1307 | "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96",
1308 | "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87",
1309 | "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376",
1310 | "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658",
1311 | "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0",
1312 | "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071",
1313 | "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360",
1314 | "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc",
1315 | "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3",
1316 | "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba",
1317 | "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8",
1318 | "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9",
1319 | "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2",
1320 | "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3",
1321 | "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68",
1322 | "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8",
1323 | "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d",
1324 | "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49",
1325 | "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608",
1326 | "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57",
1327 | "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86",
1328 | "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20",
1329 | "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293",
1330 | "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849",
1331 | "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937",
1332 | "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"
1333 | ],
1334 | "markers": "python_version >= '3.7'",
1335 | "version": "==6.0.2"
1336 | },
1337 | "packaging": {
1338 | "hashes": [
1339 | "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
1340 | "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"
1341 | ],
1342 | "markers": "python_version >= '3.6'",
1343 | "version": "==21.3"
1344 | },
1345 | "pluggy": {
1346 | "hashes": [
1347 | "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159",
1348 | "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"
1349 | ],
1350 | "markers": "python_version >= '3.6'",
1351 | "version": "==1.0.0"
1352 | },
1353 | "py": {
1354 | "hashes": [
1355 | "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719",
1356 | "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"
1357 | ],
1358 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
1359 | "version": "==1.11.0"
1360 | },
1361 | "pycodestyle": {
1362 | "hashes": [
1363 | "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20",
1364 | "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"
1365 | ],
1366 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
1367 | "version": "==2.8.0"
1368 | },
1369 | "pyflakes": {
1370 | "hashes": [
1371 | "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c",
1372 | "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"
1373 | ],
1374 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
1375 | "version": "==2.4.0"
1376 | },
1377 | "pyparsing": {
1378 | "hashes": [
1379 | "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb",
1380 | "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"
1381 | ],
1382 | "markers": "python_full_version >= '3.6.8'",
1383 | "version": "==3.0.9"
1384 | },
1385 | "pytest": {
1386 | "hashes": [
1387 | "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c",
1388 | "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"
1389 | ],
1390 | "index": "pypi",
1391 | "version": "==7.1.2"
1392 | },
1393 | "pytest-aiohttp": {
1394 | "hashes": [
1395 | "sha256:1d2dc3a304c2be1fd496c0c2fb6b31ab60cd9fc33984f761f951f8ea1eb4ca95",
1396 | "sha256:39ff3a0d15484c01d1436cbedad575c6eafbf0f57cdf76fb94994c97b5b8c5a4"
1397 | ],
1398 | "index": "pypi",
1399 | "version": "==1.0.4"
1400 | },
1401 | "pytest-asyncio": {
1402 | "hashes": [
1403 | "sha256:16cf40bdf2b4fb7fc8e4b82bd05ce3fbcd454cbf7b92afc445fe299dabb88213",
1404 | "sha256:7659bdb0a9eb9c6e3ef992eef11a2b3e69697800ad02fb06374a210d85b29f91",
1405 | "sha256:8fafa6c52161addfd41ee7ab35f11836c5a16ec208f93ee388f752bea3493a84"
1406 | ],
1407 | "index": "pypi",
1408 | "version": "==0.18.3"
1409 | },
1410 | "pytest-cov": {
1411 | "hashes": [
1412 | "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6",
1413 | "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"
1414 | ],
1415 | "index": "pypi",
1416 | "version": "==3.0.0"
1417 | },
1418 | "pytest-mock": {
1419 | "hashes": [
1420 | "sha256:5112bd92cc9f186ee96e1a92efc84969ea494939c3aead39c50f421c4cc69534",
1421 | "sha256:6cff27cec936bf81dc5ee87f07132b807bcda51106b5ec4b90a04331cba76231"
1422 | ],
1423 | "index": "pypi",
1424 | "version": "==3.7.0"
1425 | },
1426 | "tomli": {
1427 | "hashes": [
1428 | "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
1429 | "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"
1430 | ],
1431 | "markers": "python_version >= '3.7'",
1432 | "version": "==2.0.1"
1433 | },
1434 | "yarl": {
1435 | "hashes": [
1436 | "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac",
1437 | "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8",
1438 | "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e",
1439 | "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746",
1440 | "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98",
1441 | "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125",
1442 | "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d",
1443 | "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d",
1444 | "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986",
1445 | "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d",
1446 | "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec",
1447 | "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8",
1448 | "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee",
1449 | "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3",
1450 | "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1",
1451 | "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd",
1452 | "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b",
1453 | "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de",
1454 | "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0",
1455 | "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8",
1456 | "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6",
1457 | "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245",
1458 | "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23",
1459 | "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332",
1460 | "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1",
1461 | "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c",
1462 | "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4",
1463 | "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0",
1464 | "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8",
1465 | "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832",
1466 | "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58",
1467 | "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6",
1468 | "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1",
1469 | "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52",
1470 | "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92",
1471 | "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185",
1472 | "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d",
1473 | "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d",
1474 | "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b",
1475 | "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739",
1476 | "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05",
1477 | "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63",
1478 | "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d",
1479 | "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa",
1480 | "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913",
1481 | "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe",
1482 | "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b",
1483 | "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b",
1484 | "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656",
1485 | "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1",
1486 | "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4",
1487 | "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e",
1488 | "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63",
1489 | "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271",
1490 | "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed",
1491 | "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d",
1492 | "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda",
1493 | "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265",
1494 | "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f",
1495 | "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c",
1496 | "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba",
1497 | "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c",
1498 | "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b",
1499 | "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523",
1500 | "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a",
1501 | "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef",
1502 | "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95",
1503 | "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72",
1504 | "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794",
1505 | "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41",
1506 | "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576",
1507 | "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59"
1508 | ],
1509 | "markers": "python_version >= '3.6'",
1510 | "version": "==1.7.2"
1511 | }
1512 | }
1513 | }
1514 |
--------------------------------------------------------------------------------