From 179a962153c0630fa9cfc67fe101928bd137ae05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Thu, 2 Nov 2023 13:57:46 +0100 Subject: [PATCH 01/38] Update requirements --- scrapy_fs/README.md | 4 + scrapy_fs/requirements.txt | 202 +++++++++++++++++++++++++------------ 2 files changed, 142 insertions(+), 64 deletions(-) diff --git a/scrapy_fs/README.md b/scrapy_fs/README.md index 3e9b132..13fb471 100644 --- a/scrapy_fs/README.md +++ b/scrapy_fs/README.md @@ -1,3 +1,7 @@ +## Install + +The current dependencies in `requirements.txt` are tested to work with **Python 3.9**. + ## Run scrapers like this scrapy crawl PL -o pl_2014.csv -t csv diff --git a/scrapy_fs/requirements.txt b/scrapy_fs/requirements.txt index 183d40c..320d99b 100644 --- a/scrapy_fs/requirements.txt +++ b/scrapy_fs/requirements.txt @@ -1,66 +1,140 @@ -appdirs==1.4.0 -appnope==0.1.0 -attrs==16.3.0 -Automat==0.5.0 -bleach==1.5.0 -cffi==1.9.1 -constantly==15.1.0 -cryptography==1.7.2 -cssselect==1.0.1 -decorator==4.0.11 -entrypoints==0.2.2 -html5lib==0.9999999 -idna==2.2 -incremental==16.10.1 -ipykernel==4.5.2 -ipython==5.2.2 -ipython-genutils==0.1.0 -ipywidgets==5.2.2 -Jinja2==2.9.5 -jsonschema==2.6.0 +anyio==4.0.0 +appdirs==1.4.4 +appnope==0.1.3 +argon2-cffi==23.1.0 +argon2-cffi-bindings==21.2.0 +arrow==1.3.0 +asttokens==2.4.1 +async-lru==2.0.4 +attrs==23.1.0 +Automat==22.10.0 +Babel==2.13.1 +beautifulsoup4==4.12.2 +bleach==6.1.0 +certifi==2023.7.22 +cffi==1.16.0 +charset-normalizer==3.3.2 +comm==0.1.4 +constantly==23.10.4 +cryptography==41.0.5 +cssselect==1.2.0 +debugpy==1.8.0 +decorator==5.1.1 +defusedxml==0.7.1 +entrypoints==0.4 +exceptiongroup==1.1.3 +executing==2.0.1 +fastjsonschema==2.18.1 +filelock==3.13.1 +fqdn==1.5.1 +html5lib==1.1 +hyperlink==21.0.0 +idna==3.4 +importlib-metadata==6.8.0 +incremental==22.10.0 +ipykernel==6.26.0 +ipython==8.17.2 +ipython-genutils==0.2.0 +ipywidgets==8.1.1 +isoduration==20.11.0 +itemadapter==0.8.0 +itemloaders==1.1.0 +jedi==0.19.1 +Jinja2==3.1.2 +jmespath==1.0.1 +json5==0.9.14 +jsonpointer==2.4 +jsonschema==4.19.2 +jsonschema-specifications==2023.7.1 jupyter==1.0.0 -jupyter-client==4.4.0 -jupyter-console==5.1.0 -jupyter-core==4.3.0 -lxml==3.7.2 -MarkupSafe==0.23 -mistune==0.7.3 -nbconvert==5.1.1 -nbformat==4.2.0 -notebook==4.4.1 -numpy==1.12.0 -packaging==16.8 -pandas==0.19.2 -pandocfilters==1.4.1 -parsel==1.1.0 -pexpect==4.2.1 -pickleshare==0.7.4 -prompt-toolkit==1.0.13 -ptyprocess==0.5.1 -pyasn1==0.2.2 -pyasn1-modules==0.0.8 -pycparser==2.17 -PyDispatcher==2.0.5 -Pygments==2.2.0 -pyOpenSSL==16.2.0 -pyparsing==2.1.10 -python-dateutil==2.6.0 -python-slugify==1.2.1 -pytz==2016.10 -pyzmq==16.0.2 -qtconsole==4.2.1 -queuelib==1.4.2 -Scrapy==1.3.2 -service-identity==16.0.0 +jupyter-console==6.6.3 +jupyter-events==0.8.0 +jupyter-lsp==2.2.0 +jupyter_client==8.5.0 +jupyter_core==5.5.0 +jupyter_server==2.9.1 +jupyter_server_terminals==0.4.4 +jupyterlab==4.0.7 +jupyterlab-pygments==0.2.2 +jupyterlab-widgets==3.0.9 +jupyterlab_server==2.25.0 +lxml==4.9.3 +MarkupSafe==2.1.3 +matplotlib-inline==0.1.6 +mistune==3.0.2 +nbclient==0.8.0 +nbconvert==7.10.0 +nbformat==5.9.2 +nest-asyncio==1.5.8 +notebook==7.0.6 +notebook_shim==0.2.3 +numpy==1.26.1 +overrides==7.4.0 +packaging==23.2 +pandas==2.1.2 +pandocfilters==1.5.0 +parsel==1.8.1 +parso==0.8.3 +pexpect==4.8.0 +pickleshare==0.7.5 +platformdirs==3.11.0 +prometheus-client==0.18.0 +prompt-toolkit==3.0.39 +Protego==0.3.0 +psutil==5.9.6 +ptyprocess==0.7.0 +pure-eval==0.2.2 +pyasn1==0.5.0 +pyasn1-modules==0.3.0 +pycparser==2.21 +PyDispatcher==2.0.7 +Pygments==2.16.1 +pyOpenSSL==23.3.0 +pyparsing==3.1.1 +python-dateutil==2.8.2 +python-json-logger==2.0.7 +python-slugify==8.0.1 +pytz==2023.3.post1 +PyYAML==6.0.1 +pyzmq==25.1.1 +qtconsole==5.4.4 +QtPy==2.4.1 +queuelib==1.6.2 +referencing==0.30.2 +requests==2.31.0 +requests-file==1.5.1 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +rpds-py==0.10.6 +Scrapy==2.11.0 +Send2Trash==1.8.2 +service-identity==23.1.0 simplegeneric==0.8.1 -six==1.10.0 -terminado==0.6 -testpath==0.3 -tornado==4.4.2 -traitlets==4.3.1 -Twisted==17.1.0 -Unidecode==0.4.20 -w3lib==1.17.0 -wcwidth==0.1.7 -widgetsnbextension==1.2.6 -zope.interface==4.3.3 +six==1.16.0 +sniffio==1.3.0 +soupsieve==2.5 +stack-data==0.6.3 +terminado==0.17.1 +testpath==0.6.0 +text-unidecode==1.3 +tinycss2==1.2.1 +tldextract==5.0.1 +tomli==2.0.1 +tornado==6.3.3 +tqdm==4.66.1 +traitlets==5.13.0 +Twisted==22.10.0 +types-python-dateutil==2.8.19.14 +typing_extensions==4.8.0 +tzdata==2023.3 +Unidecode==1.3.7 +uri-template==1.3.0 +urllib3==2.0.7 +w3lib==2.1.2 +wcwidth==0.2.9 +webcolors==1.13 +webencodings==0.5.1 +websocket-client==1.6.4 +widgetsnbextension==4.0.9 +zipp==3.17.0 +zope.interface==6.1 From 86c50528b06d865728ab153bd927fd7e428186cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Thu, 2 Nov 2023 13:58:11 +0100 Subject: [PATCH 02/38] Ignore scraper data directories --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 13d7973..203a4df 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +*/data .idea/ *.pyc *.swp From fd2860001d3c9fc326e812c5bd59b8bc04ba80b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Thu, 2 Nov 2023 13:58:20 +0100 Subject: [PATCH 03/38] Update scraper user agent --- scrapy_fs/scrapy_fs/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scrapy_fs/scrapy_fs/settings.py b/scrapy_fs/scrapy_fs/settings.py index e228c79..01e8b45 100644 --- a/scrapy_fs/scrapy_fs/settings.py +++ b/scrapy_fs/scrapy_fs/settings.py @@ -17,7 +17,7 @@ # 'scrapy_fs.pipelines.DropSubsidyFilter': 100, # } -USER_AGENT = 'Farm subsidy scraper bot (http://farmsubsidy.openspending.org/)' +USER_AGENT = 'Farm subsidy scraper bot (https://farmsubsidy.org)' # For EE URLLENGTH_LIMIT=6000 From 6f3d0ca32e04520f2c04575b1e37aa6e0240dbcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Thu, 2 Nov 2023 14:47:54 +0100 Subject: [PATCH 04/38] BE: 2023 tweaks --- be/README.md | 4 +- be/be_scraper.ipynb | 187 +++++++++++++++++++++++++------------------- 2 files changed, 108 insertions(+), 83 deletions(-) diff --git a/be/README.md b/be/README.md index d11ece7..7152ded 100644 --- a/be/README.md +++ b/be/README.md @@ -8,4 +8,6 @@ Scraper for Belgium [Scheme Documentation](http://www.belpa.be/pub/PDF/73_2009_EN.pdf) -Scraper notebook available. +Scraper notebook available: use `./be_scraper.ipynb` (works 2023) + +The scraper run might break from time to time due to IP rate limiting and/or too many requests. \ No newline at end of file diff --git a/be/be_scraper.ipynb b/be/be_scraper.ipynb index 857e95a..311f339 100644 --- a/be/be_scraper.ipynb +++ b/be/be_scraper.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 19, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -16,18 +16,19 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ - "YEAR = 2018\n", + "YEAR = 2022\n", + "BUDGET_YEAR = 300 # check on website\n", "LIMIT = 1000\n", - "BASE_URL = 'https://www.belpa.be/wsExportDataTable?limit={limit}&offset={offset}&lg=fr&budget_year=54&sort=none&&sortType=ASC&'" + "BASE_URL = 'https://www.belpa.be/wsExportDataTable?limit={limit}&offset={offset}&lg=fr&budget_year={budget_year}&sort=none&&sortType=ASC&'" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -36,21 +37,15 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "31000\n", - "32000\n", - "33000\n", - "34000\n", - "35000\n", - "36000\n", - "37000\n", - "38000\n" + "38000\n", + "https://www.belpa.be/wsExportDataTable?limit=1000&offset=38000&lg=fr&budget_year=300&sort=none&&sortType=ASC&\n" ] } ], @@ -62,10 +57,13 @@ " offset += LIMIT\n", " continue\n", " print(offset)\n", - " response = requests.get(BASE_URL.format(\n", + " url = BASE_URL.format(\n", " limit=LIMIT,\n", - " offset=offset\n", - " ))\n", + " offset=offset,\n", + " budget_year=BUDGET_YEAR\n", + " )\n", + " print(url)\n", + " response = requests.get(url)\n", " data = response.json()\n", " with open(filename, 'w') as f:\n", " json.dump(data['data'][0], f)\n", @@ -76,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -100,106 +98,104 @@ " \n", " \n", " \n", - " amount\n", - " country\n", - " currency\n", - " recipient_id\n", - " recipient_location\n", " recipient_name\n", " recipient_postcode\n", - " scheme\n", + " recipient_location\n", " year\n", + " scheme\n", + " amount\n", + " currency\n", + " country\n", + " recipient_id\n", " \n", " \n", " \n", " \n", " 0\n", - " -2505.23\n", - " BE\n", - " EUR\n", - " BE-2018-8045\n", - " Sombreffe\n", - " ELIARD ETIENNE - COULON SABINE EP.\n", - " 5140\n", + " CORNET ALBERT\n", + " BE-6987\n", + " Rendeux\n", + " 2022\n", " feader\n", - " 2018\n", + " 293.50\n", + " EUR\n", + " BE\n", + " BE-2022-8282\n", " \n", " \n", " 1\n", - " -2505.23\n", - " BE\n", + " CORNET ALBERT\n", + " BE-6987\n", + " Rendeux\n", + " 2022\n", + " ii1\n", + " 476.99\n", " EUR\n", - " BE-2018-8045\n", - " Sombreffe\n", - " ELIARD ETIENNE - COULON SABINE EP.\n", - " 5140\n", - " vb1_6\n", - " 2018\n", + " BE\n", + " BE-2022-8282\n", " \n", " \n", " 2\n", - " 5840.87\n", - " BE\n", + " CORNET ALBERT\n", + " BE-6987\n", + " Rendeux\n", + " 2022\n", + " ii3\n", + " 722.01\n", " EUR\n", - " BE-2018-8045\n", - " Sombreffe\n", - " LOSSON MICHEL\n", - " 5140\n", - " ii1\n", - " 2018\n", + " BE\n", + " BE-2022-8282\n", " \n", " \n", " 3\n", - " 241.41\n", - " BE\n", + " CORNET ALBERT\n", + " BE-6987\n", + " Rendeux\n", + " 2022\n", + " ii4\n", + " 454.09\n", " EUR\n", - " BE-2018-8045\n", - " Sombreffe\n", - " LOSSON MICHEL\n", - " 5140\n", - " ii10\n", - " 2018\n", + " BE\n", + " BE-2022-8282\n", " \n", " \n", " 4\n", - " 3623.39\n", - " BE\n", + " CORNET ALBERT\n", + " BE-6987\n", + " Rendeux\n", + " 2022\n", + " iv18\n", + " 293.50\n", " EUR\n", - " BE-2018-8045\n", - " Sombreffe\n", - " LOSSON MICHEL\n", - " 5140\n", - " ii3\n", - " 2018\n", + " BE\n", + " BE-2022-8282\n", " \n", " \n", "\n", "" ], "text/plain": [ - " amount country currency recipient_id recipient_location \\\n", - "0 -2505.23 BE EUR BE-2018-8045 Sombreffe \n", - "1 -2505.23 BE EUR BE-2018-8045 Sombreffe \n", - "2 5840.87 BE EUR BE-2018-8045 Sombreffe \n", - "3 241.41 BE EUR BE-2018-8045 Sombreffe \n", - "4 3623.39 BE EUR BE-2018-8045 Sombreffe \n", + " recipient_name recipient_postcode recipient_location year scheme amount \\\n", + "0 CORNET ALBERT BE-6987 Rendeux 2022 feader 293.50 \n", + "1 CORNET ALBERT BE-6987 Rendeux 2022 ii1 476.99 \n", + "2 CORNET ALBERT BE-6987 Rendeux 2022 ii3 722.01 \n", + "3 CORNET ALBERT BE-6987 Rendeux 2022 ii4 454.09 \n", + "4 CORNET ALBERT BE-6987 Rendeux 2022 iv18 293.50 \n", "\n", - " recipient_name recipient_postcode scheme year \n", - "0 ELIARD ETIENNE - COULON SABINE EP. 5140 feader 2018 \n", - "1 ELIARD ETIENNE - COULON SABINE EP. 5140 vb1_6 2018 \n", - "2 LOSSON MICHEL 5140 ii1 2018 \n", - "3 LOSSON MICHEL 5140 ii10 2018 \n", - "4 LOSSON MICHEL 5140 ii3 2018 " + " currency country recipient_id \n", + "0 EUR BE BE-2022-8282 \n", + "1 EUR BE BE-2022-8282 \n", + "2 EUR BE BE-2022-8282 \n", + "3 EUR BE BE-2022-8282 \n", + "4 EUR BE BE-2022-8282 " ] }, - "execution_count": 29, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "\n", - "\n", "def parse_data(data):\n", " for amount_key in data['amount'].keys():\n", " if amount_key.endswith(('_total', '_feaga')):\n", @@ -224,18 +220,45 @@ " for x in json.load(f):\n", " yield from parse_data(x)\n", " \n", - "df = pd.DataFrame(get_data(2018))\n", + "df = pd.DataFrame(get_data(YEAR))\n", "df.head()" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "df.to_csv('be_{}.csv.gz'.format(YEAR), index=False, encoding='utf-8', compression='gzip')" ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "171625" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -254,7 +277,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.9.18" } }, "nbformat": 4, From 8e328165f06c75948ef73dd52859da714683d340 Mon Sep 17 00:00:00 2001 From: tilana Date: Fri, 3 Nov 2023 13:21:15 +0100 Subject: [PATCH 05/38] ee spider: fix year parameter to take effect --- scrapy_fs/scrapy_fs/spiders/ee_spider.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scrapy_fs/scrapy_fs/spiders/ee_spider.py b/scrapy_fs/scrapy_fs/spiders/ee_spider.py index ff2c747..6051cab 100644 --- a/scrapy_fs/scrapy_fs/spiders/ee_spider.py +++ b/scrapy_fs/scrapy_fs/spiders/ee_spider.py @@ -12,8 +12,9 @@ class EESpider(Spider): START_URL = "https://www.pria.ee/toetused/toetusesaajad?type=payed&year={year}&name=&county=&township=&indeks=&mp%5B352%5D=352&mp%5B350%5D=350&mp%5B348%5D=348&mp%5B342%5D=342&mp%5B340%5D=340&mp%5B607%5D=607&mp%5B606%5D=606&mp%5B320%5D=320&mp%5B597%5D=597&mp%5B331%5D=331&mp%5B333%5D=333&mp%5B336%5D=336&mp%5B328%5D=328&mp%5B379%5D=379&mp%5B329%5D=329&mp%5B330%5D=330&mp%5B343%5D=343&mp%5B321%5D=321&mp%5B332%5D=332&mp%5B1253%5D=1253&mp%5B335%5D=335&mp%5B353%5D=353&mp%5B355%5D=355&mp%5B1254%5D=1254&mp%5B334%5D=334&mp%5B354%5D=354&mp%5B375%5D=375&mp%5B338%5D=338&mp%5B1724%5D=1724&mp%5B370%5D=370&mp%5B367%5D=367&mp%5B322%5D=322&mp%5B351%5D=351&mp%5B341%5D=341&mp%5B349%5D=349&mp%5B357%5D=357&mp%5B344%5D=344&mp%5B327%5D=327&mp%5B339%5D=339&mp%5B376%5D=376&mp%5B345%5D=345&mp%5B356%5D=356&mp%5B230%5D=230&mp%5B1723%5D=1723&mp%5B390%5D=390&mp%5B1255%5D=1255&mp%5B1727%5D=1727&mp%5B1256%5D=1256&mp%5B256%5D=256&mp%5B311%5D=311&mp%5B306%5D=306&mp%5B285%5D=285&mp%5B603%5D=603&mp%5B1257%5D=1257&mp%5B309%5D=309&mp%5B307%5D=307&mp%5B1258%5D=1258&mp%5B1725%5D=1725&mp%5B315%5D=315&mp%5B1726%5D=1726&mp%5B599%5D=599&mp%5B310%5D=310&mp%5B366%5D=366&mp%5B263%5D=263&mp%5B246%5D=246&mp%5B293%5D=293&mp%5B365%5D=365&mp%5B364%5D=364&mp%5B1259%5D=1259&mp%5B373%5D=373&mp%5B595%5D=595&mp%5B266%5D=266&mp%5B267%5D=267&mp%5B1260%5D=1260&mp%5B299%5D=299&mp%5B359%5D=359&mp%5B282%5D=282&mp%5B1261%5D=1261&mp%5B600%5D=600&mp%5B270%5D=270&mp%5B284%5D=284&mp%5B308%5D=308&mp%5B323%5D=323&mp%5B347%5D=347&mp%5B358%5D=358&mp%5B289%5D=289&mp%5B598%5D=598&mp%5B593%5D=593&mp%5B337%5D=337&mp%5B601%5D=601&mp%5B605%5D=605&mp%5B231%5D=231&mp%5B276%5D=276&mp%5B227%5D=227&mp%5B298%5D=298&mp%5B362%5D=362&mp%5B290%5D=290&mp%5B260%5D=260&mp%5B592%5D=592&mp%5B240%5D=240&mp%5B243%5D=243&mp%5B324%5D=324&mp%5B346%5D=346&mp%5B233%5D=233&ma%5B1504%5D=1504&ma%5B1505%5D=1505&ma%5B1508%5D=1508&ma%5B1626%5D=1626&ma%5B1510%5D=1510&ma%5B1511%5D=1511&ma%5B1561%5D=1561&ma%5B1693%5D=1693&ma%5B1631%5D=1631&ma%5B1707%5D=1707&ma%5B1571%5D=1571&ma%5B1695%5D=1695&ma%5B1557%5D=1557&ma%5B1684%5D=1684&ma%5B1559%5D=1559&ma%5B1701%5D=1701&ma%5B1608%5D=1608&ma%5B1708%5D=1708&ma%5B1580%5D=1580&ma%5B1687%5D=1687&ma%5B1581%5D=1581&ma%5B1689%5D=1689&ma%5B1583%5D=1583&ma%5B1688%5D=1688&ma%5B1585%5D=1585&ma%5B1690%5D=1690&ma%5B1587%5D=1587&ma%5B1691%5D=1691&ma%5B1629%5D=1629&ma%5B1692%5D=1692&ma%5B1593%5D=1593&ma%5B1686%5D=1686&ma%5B1567%5D=1567&ma%5B1685%5D=1685&ma%5B1573%5D=1573&ma%5B1705%5D=1705&ma%5B1575%5D=1575&ma%5B1712%5D=1712&ma%5B1563%5D=1563&ma%5B1703%5D=1703&ma%5B1660%5D=1660&ma%5B1636%5D=1636&ma%5B1667%5D=1667&ma%5B1639%5D=1639&ma%5B1628%5D=1628&ma%5B1661%5D=1661&ma%5B1640%5D=1640&ma%5B1730%5D=1730&ma%5B1720%5D=1720&ma%5B1493%5D=1493&ma%5B1494%5D=1494&ma%5B1721%5D=1721&ma%5B1495%5D=1495&ma%5B1642%5D=1642&ma%5B1664%5D=1664&ma%5B1740%5D=1740&ma%5B1632%5D=1632&ma%5B1633%5D=1633&ma%5B1719%5D=1719&ma%5B1496%5D=1496&ma%5B1715%5D=1715&ma%5B1733%5D=1733&ma%5B1498%5D=1498&ma%5B1659%5D=1659&ma%5B1732%5D=1732&ma%5B1668%5D=1668&ma%5B1681%5D=1681&ma%5B1500%5D=1500&ma%5B1519%5D=1519&ma%5B1702%5D=1702&ma%5B1502%5D=1502&ma%5B1704%5D=1704&ma%5B1509%5D=1509&ma%5B1663%5D=1663&ma%5B1514%5D=1514&ma%5B1515%5D=1515&ma%5B1722%5D=1722&ma%5B1517%5D=1517&ma%5B1741%5D=1741&ma%5B1569%5D=1569&ma%5B1706%5D=1706&ma%5B1540%5D=1540&ma%5B1666%5D=1666&ma%5B1716%5D=1716&ma%5B1736%5D=1736&ma%5B1717%5D=1717&ma%5B1737%5D=1737&ma%5B1656%5D=1656&ma%5B1651%5D=1651&ma%5B1652%5D=1652&ma%5B1653%5D=1653&ma%5B1654%5D=1654&ma%5B1655%5D=1655&ma%5B1657%5D=1657&ma%5B1658%5D=1658&ma%5B1521%5D=1521&ma%5B1522%5D=1522&ma%5B1671%5D=1671&ma%5B1523%5D=1523&ma%5B1524%5D=1524&ma%5B1644%5D=1644&ma%5B1634%5D=1634&ma%5B1641%5D=1641&ma%5B1545%5D=1545&ma%5B1546%5D=1546&ma%5B1710%5D=1710&ma%5B1526%5D=1526&ma%5B1734%5D=1734&ma%5B1645%5D=1645&ma%5B1547%5D=1547&ma%5B1550%5D=1550&ma%5B1650%5D=1650&ma%5B1729%5D=1729&ma%5B1527%5D=1527&ma%5B1699%5D=1699&ma%5B1713%5D=1713&ma%5B1665%5D=1665&ma%5B1728%5D=1728&ma%5B1553%5D=1553&ma%5B1554%5D=1554&ma%5B1680%5D=1680&ma%5B1731%5D=1731&ma%5B1555%5D=1555&ma%5B1627%5D=1627&ma%5B1533%5D=1533&ma%5B1534%5D=1534&ma%5B1535%5D=1535&ma%5B1683%5D=1683&ma%5B1538%5D=1538&ma%5B1700%5D=1700&ma%5B1738%5D=1738&ma%5B1739%5D=1739&ma%5B1742%5D=1742&ma%5B1743%5D=1743&ma%5B1606%5D=1606&ma%5B1638%5D=1638&ma%5B1649%5D=1649&ma%5B1682%5D=1682&ma%5B1604%5D=1604&ma%5B1675%5D=1675&ma%5B1610%5D=1610&ma%5B1662%5D=1662&ma%5B1735%5D=1735&ma%5B1647%5D=1647&ma%5B1670%5D=1670&ma%5B1577%5D=1577&ma%5B1672%5D=1672&ma%5B1589%5D=1589&ma%5B1598%5D=1598&ma%5B1674%5D=1674&ma%5B1625%5D=1625&ma%5B1677%5D=1677&ma%5B1595%5D=1595&ma%5B1596%5D=1596&ma%5B1711%5D=1711&ma%5B1600%5D=1600&ma%5B1714%5D=1714&ma%5B1542%5D=1542&ma%5B1543%5D=1543&ma%5B1544%5D=1544&ma%5B1709%5D=1709&ma%5B1591%5D=1591&ma%5B1678%5D=1678&ma%5B1669%5D=1669&ma%5B1612%5D=1612&ma%5B1613%5D=1613&ma%5B1718%5D=1718&ma%5B1622%5D=1622&ma%5B1673%5D=1673&ma%5B1676%5D=1676&ma%5B1616%5D=1616&ma%5B1565%5D=1565&ma%5B1620%5D=1620&ma%5B1679%5D=1679&ma%5B1618%5D=1618&eafrd%5Bfrom%5D=&eafrd%5Bto%5D=&nat_support%5Bfrom%5D=&nat_support%5Bto%5D=&emkf%5Bfrom%5D=&emkf%5Bto%5D=&eagf%5Bfrom%5D=&eagf%5Bto%5D=&eagf_other%5Bfrom%5D=&eagf_other%5Bto%5D=&support%5Bfrom%5D=&support%5Bto%5D=&sum%5Bfrom%5D=&sum%5Bto%5D=&page={page}" def __init__(self, year=None): - # self.year = int(year) self.year = "all" + if year: + self.year = int(year) def start_requests(self): # Use high page number to get max page count From 104c68dba91365b7f3e74c08a7f56c0b43b706ab Mon Sep 17 00:00:00 2001 From: tilana Date: Fri, 3 Nov 2023 13:55:01 +0100 Subject: [PATCH 06/38] es_scraper: add 2022 url and apply minor fixes --- es/scraper_es.ipynb | 422 ++++++++++++++++++++++++-------------------- 1 file changed, 229 insertions(+), 193 deletions(-) diff --git a/es/scraper_es.ipynb b/es/scraper_es.ipynb index 3be3b2a..d9d62ca 100644 --- a/es/scraper_es.ipynb +++ b/es/scraper_es.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -123,7 +123,36 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2023-11-03 13:34:38-- https://www.fega.gob.es/sites/default/files/files/document/Beneficiarios_comarca_ejercicio_financiero_2022_0.zip\n", + "Auflösen des Hostnamens www.fega.gob.es (www.fega.gob.es) … 93.188.52.193\n", + "Verbindungsaufbau zu www.fega.gob.es (www.fega.gob.es)|93.188.52.193|:443 … verbunden.\n", + "WARNUNG: Das Zertifikat von www.fega.gob.es kann nicht geprüft werden, ausgestellt von ‘CN=AC Firmaprofesional - Secure Web 2022,OU=Security Services,organizationIdentifier=VATES-A62634068,O=Firmaprofesional S.A.,C=ES’:.\n", + " Die Autorität des Zertifikatausstellers kann lokal nicht geprüft werden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK\n", + "Länge: 30158332 (29M) [application/zip]\n", + "Wird in ‘downloads/es_2022.zip’ gespeichert.\n", + "\n", + "downloads/es_2022.z 100%[===================>] 28,76M 385KB/s in 42s \n", + "\n", + "2023-11-03 13:35:21 (696 KB/s) - ‘downloads/es_2022.zip’ gespeichert [30158332/30158332]\n", + "\n" + ] + } + ], + "source": [ + "!wget --no-check-certificate -O downloads/es_2022.zip \"https://www.fega.gob.es/sites/default/files/files/document/Beneficiarios_comarca_ejercicio_financiero_2022_0.zip\"" + ] + }, + { + "cell_type": "code", + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -132,16 +161,16 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ - "YEAR = 2018" + "YEAR = 2022" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 48, "metadata": {}, "outputs": [ { @@ -169,7 +198,7 @@ " PROVINCIA\n", " MUNICIPIO\n", " MEDIDA\n", - " IMPORTE_EUROS\n", + " IMPORTE\n", " year\n", " \n", " \n", @@ -179,45 +208,45 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.1 Régimen de pago básico\n", - " 9861.19\n", - " 2018\n", + " II.1 Régimen de pago básico\n", + " 10575,45\n", + " 2022\n", " \n", " \n", " 1\n", " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.7 Ayuda asociada voluntaria\n", - " 10810.00\n", - " 2018\n", + " IV/A.18 Ayuda a zonas con limitaciones natura...\n", + " 2653,2\n", + " 2022\n", " \n", " \n", " 2\n", " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 4775.80\n", - " 2018\n", + " II.4 Pago para prácticas agrícolas beneficios...\n", + " 5525,06\n", + " 2022\n", " \n", " \n", " 3\n", " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.10 Reembolso de créditos prorrogados del ...\n", - " 326.75\n", - " 2018\n", + " II.10 Reembolso de créditos prorrogados del e...\n", + " 607,66\n", + " 2022\n", " \n", " \n", " 4\n", - " A CABADA SC\n", - " Lugo\n", - " 2705 - SUR\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 2799.68\n", - " 2018\n", + " A BOUCIÑA S.C.\n", + " A Coruña\n", + " 1502 - OCCIDENTAL\n", + " II.7 Ayuda asociada voluntaria\n", + " 11994,6\n", + " 2022\n", " \n", " \n", "\n", @@ -229,17 +258,17 @@ "1 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "2 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "3 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", - "4 A CABADA SC Lugo 2705 - SUR \n", + "4 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "\n", - " MEDIDA IMPORTE_EUROS year \n", - "0 II.1 Régimen de pago básico 9861.19 2018 \n", - "1 II.7 Ayuda asociada voluntaria 10810.00 2018 \n", - "2 II.4 Pago para prácticas agrícolas beneficio... 4775.80 2018 \n", - "3 II.10 Reembolso de créditos prorrogados del ... 326.75 2018 \n", - "4 II.4 Pago para prácticas agrícolas beneficio... 2799.68 2018 " + " MEDIDA IMPORTE year \n", + "0 II.1 Régimen de pago básico 10575,45 2022 \n", + "1 IV/A.18 Ayuda a zonas con limitaciones natura... 2653,2 2022 \n", + "2 II.4 Pago para prácticas agrícolas beneficios... 5525,06 2022 \n", + "3 II.10 Reembolso de créditos prorrogados del e... 607,66 2022 \n", + "4 II.7 Ayuda asociada voluntaria 11994,6 2022 " ] }, - "execution_count": 11, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -253,16 +282,16 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "1910099" + "2734536" ] }, - "execution_count": 12, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -273,22 +302,22 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "BENEFICIARIO object\n", - "PROVINCIA object\n", - "MUNICIPIO object\n", - "MEDIDA object\n", - "IMPORTE_EUROS float64\n", - "year int64\n", + "BENEFICIARIO object\n", + "PROVINCIA object\n", + "MUNICIPIO object\n", + "MEDIDA object\n", + "IMPORTE object\n", + "year int64\n", "dtype: object" ] }, - "execution_count": 13, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -299,7 +328,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 51, "metadata": {}, "outputs": [ { @@ -327,7 +356,7 @@ " PROVINCIA\n", " MUNICIPIO\n", " MEDIDA\n", - " IMPORTE_EUROS\n", + " IMPORTE\n", " year\n", " \n", " \n", @@ -337,45 +366,45 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.1 Régimen de pago básico\n", - " 9861.19\n", - " 2018\n", + " II.1 Régimen de pago básico\n", + " 10575,45\n", + " 2022\n", " \n", " \n", " 1\n", " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.7 Ayuda asociada voluntaria\n", - " 10810.00\n", - " 2018\n", + " IV/A.18 Ayuda a zonas con limitaciones natura...\n", + " 2653,2\n", + " 2022\n", " \n", " \n", " 2\n", " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 4775.80\n", - " 2018\n", + " II.4 Pago para prácticas agrícolas beneficios...\n", + " 5525,06\n", + " 2022\n", " \n", " \n", " 3\n", " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.10 Reembolso de créditos prorrogados del ...\n", - " 326.75\n", - " 2018\n", + " II.10 Reembolso de créditos prorrogados del e...\n", + " 607,66\n", + " 2022\n", " \n", " \n", " 4\n", - " A CABADA SC\n", - " Lugo\n", - " 2705 - SUR\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 2799.68\n", - " 2018\n", + " A BOUCIÑA S.C.\n", + " A Coruña\n", + " 1502 - OCCIDENTAL\n", + " II.7 Ayuda asociada voluntaria\n", + " 11994,6\n", + " 2022\n", " \n", " \n", "\n", @@ -387,17 +416,17 @@ "1 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "2 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "3 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", - "4 A CABADA SC Lugo 2705 - SUR \n", + "4 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "\n", - " MEDIDA IMPORTE_EUROS year \n", - "0 II.1 Régimen de pago básico 9861.19 2018 \n", - "1 II.7 Ayuda asociada voluntaria 10810.00 2018 \n", - "2 II.4 Pago para prácticas agrícolas beneficio... 4775.80 2018 \n", - "3 II.10 Reembolso de créditos prorrogados del ... 326.75 2018 \n", - "4 II.4 Pago para prácticas agrícolas beneficio... 2799.68 2018 " + " MEDIDA IMPORTE year \n", + "0 II.1 Régimen de pago básico 10575,45 2022 \n", + "1 IV/A.18 Ayuda a zonas con limitaciones natura... 2653,2 2022 \n", + "2 II.4 Pago para prácticas agrícolas beneficios... 5525,06 2022 \n", + "3 II.10 Reembolso de créditos prorrogados del e... 607,66 2022 \n", + "4 II.7 Ayuda asociada voluntaria 11994,6 2022 " ] }, - "execution_count": 14, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -411,16 +440,16 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "1910099" + "2734536" ] }, - "execution_count": 15, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -431,16 +460,16 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 53, "metadata": {}, "outputs": [], "source": [ - "df['amount'] = pd.to_numeric(df['IMPORTE_EUROS'])" + "df['amount'] = pd.to_numeric(df['IMPORTE'].str.replace(',','.'))" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 54, "metadata": {}, "outputs": [ { @@ -468,7 +497,7 @@ " PROVINCIA\n", " MUNICIPIO\n", " MEDIDA\n", - " IMPORTE_EUROS\n", + " IMPORTE\n", " year\n", " amount\n", " recipient_postcode\n", @@ -480,10 +509,10 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.1 Régimen de pago básico\n", - " 9861.19\n", - " 2018\n", - " 9861.19\n", + " II.1 Régimen de pago básico\n", + " 10575,45\n", + " 2022\n", + " 10575.45\n", " 1502\n", " \n", " \n", @@ -491,10 +520,10 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.7 Ayuda asociada voluntaria\n", - " 10810.00\n", - " 2018\n", - " 10810.00\n", + " IV/A.18 Ayuda a zonas con limitaciones natura...\n", + " 2653,2\n", + " 2022\n", + " 2653.20\n", " 1502\n", " \n", " \n", @@ -502,10 +531,10 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 4775.80\n", - " 2018\n", - " 4775.80\n", + " II.4 Pago para prácticas agrícolas beneficios...\n", + " 5525,06\n", + " 2022\n", + " 5525.06\n", " 1502\n", " \n", " \n", @@ -513,22 +542,22 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.10 Reembolso de créditos prorrogados del ...\n", - " 326.75\n", - " 2018\n", - " 326.75\n", + " II.10 Reembolso de créditos prorrogados del e...\n", + " 607,66\n", + " 2022\n", + " 607.66\n", " 1502\n", " \n", " \n", " 4\n", - " A CABADA SC\n", - " Lugo\n", - " 2705 - SUR\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 2799.68\n", - " 2018\n", - " 2799.68\n", - " 2705\n", + " A BOUCIÑA S.C.\n", + " A Coruña\n", + " 1502 - OCCIDENTAL\n", + " II.7 Ayuda asociada voluntaria\n", + " 11994,6\n", + " 2022\n", + " 11994.60\n", + " 1502\n", " \n", " \n", "\n", @@ -540,24 +569,24 @@ "1 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "2 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "3 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", - "4 A CABADA SC Lugo 2705 - SUR \n", + "4 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "\n", - " MEDIDA IMPORTE_EUROS year \\\n", - "0 II.1 Régimen de pago básico 9861.19 2018 \n", - "1 II.7 Ayuda asociada voluntaria 10810.00 2018 \n", - "2 II.4 Pago para prácticas agrícolas beneficio... 4775.80 2018 \n", - "3 II.10 Reembolso de créditos prorrogados del ... 326.75 2018 \n", - "4 II.4 Pago para prácticas agrícolas beneficio... 2799.68 2018 \n", + " MEDIDA IMPORTE year \\\n", + "0 II.1 Régimen de pago básico 10575,45 2022 \n", + "1 IV/A.18 Ayuda a zonas con limitaciones natura... 2653,2 2022 \n", + "2 II.4 Pago para prácticas agrícolas beneficios... 5525,06 2022 \n", + "3 II.10 Reembolso de créditos prorrogados del e... 607,66 2022 \n", + "4 II.7 Ayuda asociada voluntaria 11994,6 2022 \n", "\n", " amount recipient_postcode \n", - "0 9861.19 1502 \n", - "1 10810.00 1502 \n", - "2 4775.80 1502 \n", - "3 326.75 1502 \n", - "4 2799.68 2705 " + "0 10575.45 1502 \n", + "1 2653.20 1502 \n", + "2 5525.06 1502 \n", + "3 607.66 1502 \n", + "4 11994.60 1502 " ] }, - "execution_count": 18, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" } @@ -569,7 +598,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 55, "metadata": {}, "outputs": [ { @@ -597,7 +626,7 @@ " PROVINCIA\n", " MUNICIPIO\n", " MEDIDA\n", - " IMPORTE_EUROS\n", + " IMPORTE\n", " year\n", " amount\n", " recipient_postcode\n", @@ -610,10 +639,10 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.1 Régimen de pago básico\n", - " 9861.19\n", - " 2018\n", - " 9861.19\n", + " II.1 Régimen de pago básico\n", + " 10575,45\n", + " 2022\n", + " 10575.45\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " \n", @@ -622,10 +651,10 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.7 Ayuda asociada voluntaria\n", - " 10810.00\n", - " 2018\n", - " 10810.00\n", + " IV/A.18 Ayuda a zonas con limitaciones natura...\n", + " 2653,2\n", + " 2022\n", + " 2653.20\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " \n", @@ -634,10 +663,10 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 4775.80\n", - " 2018\n", - " 4775.80\n", + " II.4 Pago para prácticas agrícolas beneficios...\n", + " 5525,06\n", + " 2022\n", + " 5525.06\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " \n", @@ -646,24 +675,24 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.10 Reembolso de créditos prorrogados del ...\n", - " 326.75\n", - " 2018\n", - " 326.75\n", + " II.10 Reembolso de créditos prorrogados del e...\n", + " 607,66\n", + " 2022\n", + " 607.66\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " \n", " \n", " 4\n", - " A CABADA SC\n", - " Lugo\n", - " 2705 - SUR\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 2799.68\n", - " 2018\n", - " 2799.68\n", - " 2705\n", - " SUR, Lugo\n", + " A BOUCIÑA S.C.\n", + " A Coruña\n", + " 1502 - OCCIDENTAL\n", + " II.7 Ayuda asociada voluntaria\n", + " 11994,6\n", + " 2022\n", + " 11994.60\n", + " 1502\n", + " OCCIDENTAL, A Coruña\n", " \n", " \n", "\n", @@ -675,24 +704,24 @@ "1 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "2 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "3 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", - "4 A CABADA SC Lugo 2705 - SUR \n", + "4 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "\n", - " MEDIDA IMPORTE_EUROS year \\\n", - "0 II.1 Régimen de pago básico 9861.19 2018 \n", - "1 II.7 Ayuda asociada voluntaria 10810.00 2018 \n", - "2 II.4 Pago para prácticas agrícolas beneficio... 4775.80 2018 \n", - "3 II.10 Reembolso de créditos prorrogados del ... 326.75 2018 \n", - "4 II.4 Pago para prácticas agrícolas beneficio... 2799.68 2018 \n", + " MEDIDA IMPORTE year \\\n", + "0 II.1 Régimen de pago básico 10575,45 2022 \n", + "1 IV/A.18 Ayuda a zonas con limitaciones natura... 2653,2 2022 \n", + "2 II.4 Pago para prácticas agrícolas beneficios... 5525,06 2022 \n", + "3 II.10 Reembolso de créditos prorrogados del e... 607,66 2022 \n", + "4 II.7 Ayuda asociada voluntaria 11994,6 2022 \n", "\n", " amount recipient_postcode recipient_location \n", - "0 9861.19 1502 OCCIDENTAL, A Coruña \n", - "1 10810.00 1502 OCCIDENTAL, A Coruña \n", - "2 4775.80 1502 OCCIDENTAL, A Coruña \n", - "3 326.75 1502 OCCIDENTAL, A Coruña \n", - "4 2799.68 2705 SUR, Lugo " + "0 10575.45 1502 OCCIDENTAL, A Coruña \n", + "1 2653.20 1502 OCCIDENTAL, A Coruña \n", + "2 5525.06 1502 OCCIDENTAL, A Coruña \n", + "3 607.66 1502 OCCIDENTAL, A Coruña \n", + "4 11994.60 1502 OCCIDENTAL, A Coruña " ] }, - "execution_count": 19, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } @@ -704,7 +733,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 59, "metadata": {}, "outputs": [ { @@ -743,9 +772,9 @@ " \n", " 0\n", " A BOUCIÑA S.C.\n", - " II.1 Régimen de pago básico\n", - " 2018\n", - " 9861.19\n", + " II.1 Régimen de pago básico\n", + " 2022\n", + " 10575.45\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " ES\n", @@ -755,9 +784,9 @@ " \n", " 1\n", " A BOUCIÑA S.C.\n", - " II.7 Ayuda asociada voluntaria\n", - " 2018\n", - " 10810.00\n", + " IV/A.18 Ayuda a zonas con limitaciones natura...\n", + " 2022\n", + " 2653.20\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " ES\n", @@ -767,9 +796,9 @@ " \n", " 2\n", " A BOUCIÑA S.C.\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 2018\n", - " 4775.80\n", + " II.4 Pago para prácticas agrícolas beneficios...\n", + " 2022\n", + " 5525.06\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " ES\n", @@ -779,9 +808,9 @@ " \n", " 3\n", " A BOUCIÑA S.C.\n", - " II.10 Reembolso de créditos prorrogados del ...\n", - " 2018\n", - " 326.75\n", + " II.10 Reembolso de créditos prorrogados del e...\n", + " 2022\n", + " 607.66\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " ES\n", @@ -790,15 +819,15 @@ " \n", " \n", " 4\n", - " A CABADA SC\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 2018\n", - " 2799.68\n", - " 2705\n", - " SUR, Lugo\n", + " A BOUCIÑA S.C.\n", + " II.7 Ayuda asociada voluntaria\n", + " 2022\n", + " 11994.60\n", + " 1502\n", + " OCCIDENTAL, A Coruña\n", " ES\n", " EUR\n", - " ES-2705-a-cabada-sc\n", + " ES-1502-a-boucina-s-c\n", " \n", " \n", "\n", @@ -806,28 +835,28 @@ ], "text/plain": [ " recipient_name scheme year \\\n", - "0 A BOUCIÑA S.C. II.1 Régimen de pago básico 2018 \n", - "1 A BOUCIÑA S.C. II.7 Ayuda asociada voluntaria 2018 \n", - "2 A BOUCIÑA S.C. II.4 Pago para prácticas agrícolas beneficio... 2018 \n", - "3 A BOUCIÑA S.C. II.10 Reembolso de créditos prorrogados del ... 2018 \n", - "4 A CABADA SC II.4 Pago para prácticas agrícolas beneficio... 2018 \n", + "0 A BOUCIÑA S.C. II.1 Régimen de pago básico 2022 \n", + "1 A BOUCIÑA S.C. IV/A.18 Ayuda a zonas con limitaciones natura... 2022 \n", + "2 A BOUCIÑA S.C. II.4 Pago para prácticas agrícolas beneficios... 2022 \n", + "3 A BOUCIÑA S.C. II.10 Reembolso de créditos prorrogados del e... 2022 \n", + "4 A BOUCIÑA S.C. II.7 Ayuda asociada voluntaria 2022 \n", "\n", " amount recipient_postcode recipient_location country currency \\\n", - "0 9861.19 1502 OCCIDENTAL, A Coruña ES EUR \n", - "1 10810.00 1502 OCCIDENTAL, A Coruña ES EUR \n", - "2 4775.80 1502 OCCIDENTAL, A Coruña ES EUR \n", - "3 326.75 1502 OCCIDENTAL, A Coruña ES EUR \n", - "4 2799.68 2705 SUR, Lugo ES EUR \n", + "0 10575.45 1502 OCCIDENTAL, A Coruña ES EUR \n", + "1 2653.20 1502 OCCIDENTAL, A Coruña ES EUR \n", + "2 5525.06 1502 OCCIDENTAL, A Coruña ES EUR \n", + "3 607.66 1502 OCCIDENTAL, A Coruña ES EUR \n", + "4 11994.60 1502 OCCIDENTAL, A Coruña ES EUR \n", "\n", " recipient_id \n", "0 ES-1502-a-boucina-s-c \n", "1 ES-1502-a-boucina-s-c \n", "2 ES-1502-a-boucina-s-c \n", "3 ES-1502-a-boucina-s-c \n", - "4 ES-2705-a-cabada-sc " + "4 ES-1502-a-boucina-s-c " ] }, - "execution_count": 20, + "execution_count": 59, "metadata": {}, "output_type": "execute_result" } @@ -839,7 +868,7 @@ " 'BENEFICIARIO': 'recipient_name',\n", " 'MEDIDA': 'scheme',\n", "})\n", - "df = df.drop(['PROVINCIA', 'MUNICIPIO', 'IMPORTE_EUROS'], 1)\n", + "df = df.drop(['PROVINCIA', 'MUNICIPIO', 'IMPORTE'], axis=1)\n", "df['country'] = 'ES'\n", "df['currency'] = 'EUR'\n", "df['recipient_id'] = df.apply(lambda x: 'ES-%s-%s' % (x['recipient_postcode'], slugify(x['recipient_name'])), 1)\n", @@ -848,17 +877,24 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 60, "metadata": {}, "outputs": [], "source": [ "df.to_csv('es_{YEAR}.csv.gz'.format(YEAR=YEAR), index=False, encoding='utf-8', compression='gzip')" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -872,9 +908,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.9.18" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From ddf652b090b9956d07a7309a23c8af204ff3018b Mon Sep 17 00:00:00 2001 From: tilana Date: Fri, 3 Nov 2023 14:50:35 +0100 Subject: [PATCH 07/38] fr_scraper: adjust for 2022 data --- fr/fr_scraper.ipynb | 482 ++++++++++++++++++++------------------------ 1 file changed, 224 insertions(+), 258 deletions(-) diff --git a/fr/fr_scraper.ipynb b/fr/fr_scraper.ipynb index 9d3feb4..005eb9b 100644 --- a/fr/fr_scraper.ipynb +++ b/fr/fr_scraper.ipynb @@ -6,12 +6,14 @@ "source": [ "## Download\n", "\n", - "[Download from here](https://www2.telepac.agriculture.gouv.fr/telepac/tbp/accueil/accueil.action)" + "Download data from [here](https://www2.telepac.agriculture.gouv.fr/telepac/tbp/accueil/accueil.action)\n", + "\n", + "Link to 2022 data: https://www2.telepac.agriculture.gouv.fr/telepac/tbp/feader/afficher.action" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -20,16 +22,16 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ - "YEAR = 2017" + "YEAR = 2022" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -66,40 +68,40 @@ " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594,16\n", " \n", " \n", " 1\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733,67\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647,00\n", " \n", " \n", " 2\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5,48\n", " \n", " \n", " 3\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2,21\n", " \n", " \n", " 4\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452,93\n", " \n", " \n", "\n", @@ -113,27 +115,27 @@ "3 XXX XXX 01XXX \n", "4 XXX XXX 01XXX \n", "\n", - " Libellé rubrique Montant rubrique \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000,00 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733,67 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000,00 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000,00 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000,00 " + " Libellé rubrique Montant rubrique \n", + "0 III.7 - Aide dans le secteur de l'apiculture 594,16 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647,00 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5,48 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2,21 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452,93 " ] }, - "execution_count": 6, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df = pd.read_csv('fr_{YEAR}_raw.csv.gz'.format(YEAR=YEAR), delimiter=';', encoding='latin1')\n", + "df = pd.read_csv('fr_{YEAR}.csv'.format(YEAR=YEAR), delimiter=';', encoding='latin1')\n", "df.head()" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -146,7 +148,7 @@ " ' Montant rubrique']" ] }, - "execution_count": 7, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -157,7 +159,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -195,45 +197,45 @@ " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594,16\n", + " 594.16\n", " \n", " \n", " 1\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733,67\n", - " 733.67\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647,00\n", + " 647.00\n", " \n", " \n", " 2\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5,48\n", + " -5.48\n", " \n", " \n", " 3\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2,21\n", + " 2.21\n", " \n", " \n", " 4\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452,93\n", + " 452.93\n", " \n", " \n", "\n", @@ -247,15 +249,15 @@ "3 XXX XXX 01XXX \n", "4 XXX XXX 01XXX \n", "\n", - " Libellé rubrique Montant rubrique amount \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733,67 733.67 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 " + " Libellé rubrique Montant rubrique amount \n", + "0 III.7 - Aide dans le secteur de l'apiculture 594,16 594.16 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647,00 647.00 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5,48 -5.48 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2,21 2.21 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452,93 452.93 " ] }, - "execution_count": 8, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -348,78 +350,28 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Nom / Raison sociale\n", - "SAS SUCRIERE DE LA REUNION 31479350.88\n", - "XXX 24993731.92\n", - "LACTALIS INGREDIENTS 21447502.24\n", - "SUCRERIE DE BOIS ROUGE 13249000.00\n", - "SA GARDEL SA 12539167.92\n", - "URCOOPA 12360193.14\n", - "LAITA 8785021.83\n", - "CERAFEL (AOP) 8334606.22\n", - "ARIBEV 6757203.13\n", - "COOPERATIVE MARAICHERE DE L'OUEST 6158949.54\n", - "SCA OCEANE 6058097.15\n", - "CENTRE NAT INTERPRO ECONOMIE LAITIERE 5547466.69\n", - "AMIV 5429241.74\n", - "CONSEIL INTERPROF DU VIN DE BORDEAUX 5274083.26\n", - "LES VERGERS DE BLUE WHALE 4879567.44\n", - "UNION DES DISTILLERIES DE LA MEDITERRANEE 4633637.23\n", - "AGRIAL 4394980.55\n", - "CHAMBRE DEPT D AGRICULTURE CHAMBRE D AGR 4336316.72\n", - "GMA 4283299.01\n", - "SA BOIS DEBOUT 4244025.32\n", - "PETIT MORNE SARL 4170492.76\n", - "G H MUMM ET CIE 4000674.74\n", - "CAFEIERE SAS 3961039.48\n", - "ARIV 3583792.86\n", - "UNION DES COOPERATIVES VINICOLES D'AQUITAINE UCVA 3417573.74\n", - "SOC DISTILLERIES VINICOLES BLAYAIS 3116204.84\n", - "GAEC DU MOULIN 2798234.49\n", - "GAEC DE LA FONTAINE 2761443.64\n", - "EARL DU MOULIN 2651521.15\n", - "SAS AGRISUD 2574301.30\n", - " ... \n", - "CHASSAGNE MARYSE 1250.98\n", - "EARL GROS CHASSIBOUD 1250.95\n", - "COURTOIS DANIEL 1250.93\n", - "GUIZE CLOTILDE 1250.93\n", - "DUCELLIER MARIE-JOSE 1250.89\n", - "EARL MICHEL HEYBERGER 1250.88\n", - "REQUIS AIME 1250.82\n", - "VERNIER BERNADETTE 1250.79\n", - "FORTIER GERARD 1250.79\n", - "CABOT EVELINE 1250.69\n", - "LEGUAY MARCEL 1250.64\n", - "FONTAINE MARIE-COLETTE 1250.60\n", - "GUICHOU JEAN-CLAUDE 1250.58\n", - "SOULIE LILIANE 1250.55\n", - "BARBOTIN ODILE 1250.55\n", - "DAL CORTIVO BENOIT 1250.55\n", - "LARRE ANDRE 1250.54\n", - "ANGLEZAN PIERRE 1250.41\n", - "BORTOLUSSI FRANCIS 1250.39\n", - "BOUYER THOMAS 1250.38\n", - "AUGRY JOEL 1250.29\n", - "GAEC XOTILDEIA 1250.28\n", - "BELLET JEAN-YVES 1250.26\n", - "DELABIE BERNARD JACQUES MICH 1250.26\n", - "MANCEL GERARD 1250.26\n", - "DUPONT FAUSTIN EUGENE 1250.25\n", - "AULONG STEPHANIE 1250.22\n", - "BLANCHET CHRISTIAN 1250.19\n", - "MARTINOT MADELEINE 1250.12\n", - "LEROY MARGARET 1250.10\n", - "Name: amount, Length: 295135, dtype: float64" + "SAS SUCRERIE DU GOL 31644000.00\n", + "XXX 17006619.42\n", + "SANDERS BRETAGNE 14395334.07\n", + "COOPERATIVE EUREDEN 14039416.65\n", + "SAS SUCRERIE DE BOIS ROUGE 13944286.60\n", + " ... \n", + "GAEC DU VALLON D ANDIGNAC 1250.18\n", + "LASSEE CLAUDE 1250.14\n", + "LESTRADE SANDRINE 1250.08\n", + "LOUBATIERES CHRISTOPHE 1250.06\n", + "PILLAULT PASCAL 1250.04\n", + "Name: amount, Length: 281011, dtype: float64" ] }, - "execution_count": 10, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -430,7 +382,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -468,45 +420,45 @@ " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594,16\n", + " 594.16\n", " \n", " \n", " 1\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733,67\n", - " 733.67\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647,00\n", + " 647.00\n", " \n", " \n", " 2\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5,48\n", + " -5.48\n", " \n", " \n", " 3\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2,21\n", + " 2.21\n", " \n", " \n", " 4\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452,93\n", + " 452.93\n", " \n", " \n", "\n", @@ -520,15 +472,15 @@ "3 XXX XXX 01XXX \n", "4 XXX XXX 01XXX \n", "\n", - " Libellé rubrique Montant rubrique amount \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733,67 733.67 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 " + " Libellé rubrique Montant rubrique amount \n", + "0 III.7 - Aide dans le secteur de l'apiculture 594,16 594.16 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647,00 647.00 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5,48 -5.48 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2,21 2.21 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452,93 452.93 " ] }, - "execution_count": 11, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -539,7 +491,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -576,40 +528,40 @@ " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594.16\n", " \n", " \n", " 1\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733.67\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647.00\n", " \n", " \n", " 2\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5.48\n", " \n", " \n", " 3\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2.21\n", " \n", " \n", " 4\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452.93\n", " \n", " \n", "\n", @@ -623,15 +575,15 @@ "3 XXX XXX 01XXX \n", "4 XXX XXX 01XXX \n", "\n", - " scheme amount \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733.67 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000.00 " + " scheme amount \n", + "0 III.7 - Aide dans le secteur de l'apiculture 594.16 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647.00 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5.48 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2.21 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452.93 " ] }, - "execution_count": 12, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -643,13 +595,13 @@ " ' Code postal': 'recipient_postcode',\n", " u' Libellé rubrique': 'scheme'\n", "})\n", - "df = df.drop(' Montant rubrique', 1)\n", + "df = df.drop(' Montant rubrique', axis=1)\n", "df.head()" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -686,40 +638,40 @@ " XXX\n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594.16\n", " \n", " \n", " 1\n", " XXX\n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733.67\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647.00\n", " \n", " \n", " 2\n", " XXX\n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5.48\n", " \n", " \n", " 3\n", " XXX\n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2.21\n", " \n", " \n", " 4\n", " XXX\n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452.93\n", " \n", " \n", "\n", @@ -733,15 +685,15 @@ "3 XXX 01XXX \n", "4 XXX 01XXX \n", "\n", - " scheme amount \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733.67 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000.00 " + " scheme amount \n", + "0 III.7 - Aide dans le secteur de l'apiculture 594.16 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647.00 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5.48 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2.21 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452.93 " ] }, - "execution_count": 13, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -753,7 +705,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -790,40 +742,40 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594.16\n", " \n", " \n", " 1\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733.67\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647.00\n", " \n", " \n", " 2\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5.48\n", " \n", " \n", " 3\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2.21\n", " \n", " \n", " 4\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452.93\n", " \n", " \n", "\n", @@ -837,15 +789,15 @@ "3 01XXX \n", "4 01XXX \n", "\n", - " scheme amount \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733.67 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000.00 " + " scheme amount \n", + "0 III.7 - Aide dans le secteur de l'apiculture 594.16 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647.00 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5.48 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2.21 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452.93 " ] }, - "execution_count": 14, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -857,7 +809,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -896,50 +848,50 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-0\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594.16\n", + " 2022\n", + " FR-01XXX-2022-0\n", " \n", " \n", " 1\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733.67\n", - " 2017\n", - " FR-01XXX-2017-1\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647.00\n", + " 2022\n", + " FR-01XXX-2022-1\n", " \n", " \n", " 2\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-2\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5.48\n", + " 2022\n", + " FR-01XXX-2022-2\n", " \n", " \n", " 3\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-3\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2.21\n", + " 2022\n", + " FR-01XXX-2022-3\n", " \n", " \n", " 4\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-4\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452.93\n", + " 2022\n", + " FR-01XXX-2022-4\n", " \n", " \n", "\n", @@ -953,15 +905,22 @@ "3 01XXX \n", "4 01XXX \n", "\n", - " scheme amount year recipient_id \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 FR-01XXX-2017-0 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733.67 2017 FR-01XXX-2017-1 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 FR-01XXX-2017-2 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 FR-01XXX-2017-3 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 FR-01XXX-2017-4 " + " scheme amount year \\\n", + "0 III.7 - Aide dans le secteur de l'apiculture 594.16 2022 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647.00 2022 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5.48 2022 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2.21 2022 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452.93 2022 \n", + "\n", + " recipient_id \n", + "0 FR-01XXX-2022-0 \n", + "1 FR-01XXX-2022-1 \n", + "2 FR-01XXX-2022-2 \n", + "3 FR-01XXX-2022-3 \n", + "4 FR-01XXX-2022-4 " ] }, - "execution_count": 15, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -977,16 +936,16 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "473540" + "417225" ] }, - "execution_count": 16, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -997,7 +956,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -1038,10 +997,10 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-0\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594.16\n", + " 2022\n", + " FR-01XXX-2022-0\n", " EUR\n", " FR\n", " \n", @@ -1050,10 +1009,10 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733.67\n", - " 2017\n", - " FR-01XXX-2017-1\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647.00\n", + " 2022\n", + " FR-01XXX-2022-1\n", " EUR\n", " FR\n", " \n", @@ -1062,10 +1021,10 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-2\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5.48\n", + " 2022\n", + " FR-01XXX-2022-2\n", " EUR\n", " FR\n", " \n", @@ -1074,10 +1033,10 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-3\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2.21\n", + " 2022\n", + " FR-01XXX-2022-3\n", " EUR\n", " FR\n", " \n", @@ -1086,10 +1045,10 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-4\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452.93\n", + " 2022\n", + " FR-01XXX-2022-4\n", " EUR\n", " FR\n", " \n", @@ -1105,22 +1064,22 @@ "3 01XXX \n", "4 01XXX \n", "\n", - " scheme amount year \\\n", - "0 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733.67 2017 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 \n", + " scheme amount year \\\n", + "0 III.7 - Aide dans le secteur de l'apiculture 594.16 2022 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647.00 2022 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5.48 2022 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2.21 2022 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452.93 2022 \n", "\n", " recipient_id currency country \n", - "0 FR-01XXX-2017-0 EUR FR \n", - "1 FR-01XXX-2017-1 EUR FR \n", - "2 FR-01XXX-2017-2 EUR FR \n", - "3 FR-01XXX-2017-3 EUR FR \n", - "4 FR-01XXX-2017-4 EUR FR " + "0 FR-01XXX-2022-0 EUR FR \n", + "1 FR-01XXX-2022-1 EUR FR \n", + "2 FR-01XXX-2022-2 EUR FR \n", + "3 FR-01XXX-2022-3 EUR FR \n", + "4 FR-01XXX-2022-4 EUR FR " ] }, - "execution_count": 17, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -1133,17 +1092,24 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "df.to_csv('fr_{YEAR}.csv.gz'.format(YEAR=YEAR), index=False, encoding='utf-8', compression='gzip')" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1157,9 +1123,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.9.18" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From 2eb0b7b56106a188ef60603a79c570fbf9a4d134 Mon Sep 17 00:00:00 2001 From: tilana Date: Fri, 3 Nov 2023 15:26:55 +0100 Subject: [PATCH 08/38] gb_scraper: adjust to 2022 --- gb/README.md | 2 +- gb/greatbritain-scraper.ipynb | 579 +++++++++++++++++++--------------- 2 files changed, 320 insertions(+), 261 deletions(-) diff --git a/gb/README.md b/gb/README.md index 40a66fc..1ca79b0 100644 --- a/gb/README.md +++ b/gb/README.md @@ -3,4 +3,4 @@ Scraper for Great Britain -Scraper build using Scrapy, see ''scrapy_fs/scrapy_fs/spiders/gb_spider.py``. +Scraper in Notebook. diff --git a/gb/greatbritain-scraper.ipynb b/gb/greatbritain-scraper.ipynb index 135db29..9cbb540 100644 --- a/gb/greatbritain-scraper.ipynb +++ b/gb/greatbritain-scraper.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -18,8 +18,21 @@ "name": "stdout", "output_type": "stream", "text": [ - "File '2014_All_CAP_Search_Results_Data_P14.xls' already there; not retrieving.\r\n", - "\r\n" + "--2023-11-03 14:53:23-- http://cap-payments.defra.gov.uk/Download/2014_All_CAP_Search_Results_Data_P14.xls\n", + "Auflösen des Hostnamens cap-payments.defra.gov.uk (cap-payments.defra.gov.uk) … 40.127.153.231\n", + "Verbindungsaufbau zu cap-payments.defra.gov.uk (cap-payments.defra.gov.uk)|40.127.153.231|:80 … verbunden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 307 Temporary Redirect\n", + "Platz: https://cap-payments.defra.gov.uk/Download/2014_All_CAP_Search_Results_Data_P14.xls [folgend]\n", + "--2023-11-03 14:53:23-- https://cap-payments.defra.gov.uk/Download/2014_All_CAP_Search_Results_Data_P14.xls\n", + "Verbindungsaufbau zu cap-payments.defra.gov.uk (cap-payments.defra.gov.uk)|40.127.153.231|:443 … verbunden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK\n", + "Länge: 33646592 (32M) [application/vnd.ms-excel]\n", + "Wird in ‘2014_All_CAP_Search_Results_Data_P14.xls’ gespeichert.\n", + "\n", + "2014_All_CAP_Search 100%[===================>] 32,09M 884KB/s in 47s \n", + "\n", + "2023-11-03 14:54:10 (699 KB/s) - ‘2014_All_CAP_Search_Results_Data_P14.xls’ gespeichert [33646592/33646592]\n", + "\n" ] } ], @@ -30,7 +43,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", @@ -85,9 +100,63 @@ "cell_type": "code", "execution_count": 3, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2023-11-03 14:54:12-- http://cap-payments.defra.gov.uk/Download/2022_All_CAP_Search_Results_Data_P14.xlsx\n", + "Auflösen des Hostnamens cap-payments.defra.gov.uk (cap-payments.defra.gov.uk) … 40.127.153.231\n", + "Verbindungsaufbau zu cap-payments.defra.gov.uk (cap-payments.defra.gov.uk)|40.127.153.231|:80 … verbunden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 307 Temporary Redirect\n", + "Platz: https://cap-payments.defra.gov.uk/Download/2022_All_CAP_Search_Results_Data_P14.xlsx [folgend]\n", + "--2023-11-03 14:54:12-- https://cap-payments.defra.gov.uk/Download/2022_All_CAP_Search_Results_Data_P14.xlsx\n", + "Verbindungsaufbau zu cap-payments.defra.gov.uk (cap-payments.defra.gov.uk)|40.127.153.231|:443 … verbunden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK\n", + "Länge: 11031657 (11M) [application/vnd.openxmlformats-officedocument.spreadsheetml.sheet]\n", + "Wird in ‘2022_All_CAP_Search_Results_Data_P14.xlsx’ gespeichert.\n", + "\n", + "2022_All_CAP_Search 100%[===================>] 10,52M 1,27MB/s in 9,0s \n", + "\n", + "2023-11-03 14:54:21 (1,17 MB/s) - ‘2022_All_CAP_Search_Results_Data_P14.xlsx’ gespeichert [11031657/11031657]\n", + "\n" + ] + } + ], + "source": [ + "!wget -nc \"http://cap-payments.defra.gov.uk/Download/2022_All_CAP_Search_Results_Data_P14.xlsx\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ - "YEAR = 2016" + "YEAR = 2022" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting openpyxl\n", + " Downloading openpyxl-3.1.2-py2.py3-none-any.whl (249 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m250.0/250.0 kB\u001b[0m \u001b[31m195.8 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m[36m0:00:01\u001b[0m[36m0:00:01\u001b[0m:01\u001b[0m\n", + "\u001b[?25hCollecting et-xmlfile (from openpyxl)\n", + " Downloading et_xmlfile-1.1.0-py3-none-any.whl (4.7 kB)\n", + "Installing collected packages: et-xmlfile, openpyxl\n", + "Successfully installed et-xmlfile-1.1.0 openpyxl-3.1.2\n" + ] + } + ], + "source": [ + "!pip install openpyxl" ] }, { @@ -98,7 +167,7 @@ { "data": { "text/plain": [ - "['DAERA', 'SGRPID', 'WG', 'RPA', 'RPA2']" + "['DAERA', 'SGRPID', 'WG', 'RPA', 'RPA 2']" ] }, "execution_count": 7, @@ -149,85 +218,85 @@ " \n", " \n", " \n", - " 26142\n", - " 2016\n", - " 1341095.0\n", - " *******\n", - " BT78\n", - " OMAGH\n", + " 1058\n", + " 2022\n", + " NaN\n", + " BRITISH TRUST FOR ORNITHOLOGY\n", + " IP24\n", + " ENGLAND\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 209.50\n", + " Technical assist\n", + " 91631.32\n", " \n", " \n", - " 26162\n", - " 2016\n", - " 1352021.0\n", - " *******\n", - " BT75\n", - " FIVEMILETOWN\n", + " 1300\n", + " 2022\n", + " NaN\n", + " COUNTRYSIDE SERVICES LIMITED\n", + " BT71\n", + " CO TYRONE\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 374.40\n", + " Technical assist\n", + " 225512.40\n", " \n", " \n", - " 26193\n", - " 2016\n", - " 1162663.0\n", - " *******\n", - " BT31\n", - " CASTLEWELLAN\n", + " 1398\n", + " 2022\n", + " NaN\n", + " DARD FARM POLICY BRANCH\n", + " BT4\n", + " BELFAST CO DOWN\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 221.93\n", + " Technical assist\n", + " 2904812.46\n", " \n", " \n", - " 26215\n", - " 2016\n", - " 1004277.0\n", - " *******\n", - " BT34\n", - " NEWRY\n", + " 195652\n", + " 2022\n", + " NaN\n", + " AGHYARAN GAA CLUB\n", + " BT81\n", + " CO.TYRONE\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 176.75\n", + " Support for Leader local development\n", + " 30725.22\n", " \n", " \n", - " 26229\n", - " 2016\n", - " 1108471.0\n", - " *******\n", - " BT74\n", - " ENNISKILLEN\n", + " 195769\n", + " 2022\n", + " NaN\n", + " ANTRIM & NEWTOWNABBEY BOROUGH COUNCIL\n", + " BT36\n", + " CO.ANTRIM\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 256.37\n", + " Support for Leader local development\n", + " 188992.88\n", " \n", " \n", "\n", "" ], "text/plain": [ - " Year BeneficiaryCode BeneficiaryName_F201 PostcodePrefix_F202B \\\n", - "26142 2016 1341095.0 ******* BT78 \n", - "26162 2016 1352021.0 ******* BT75 \n", - "26193 2016 1162663.0 ******* BT31 \n", - "26215 2016 1004277.0 ******* BT34 \n", - "26229 2016 1108471.0 ******* BT74 \n", + " Year BeneficiaryCode BeneficiaryName_F201 \\\n", + "1058 2022 NaN BRITISH TRUST FOR ORNITHOLOGY \n", + "1300 2022 NaN COUNTRYSIDE SERVICES LIMITED \n", + "1398 2022 NaN DARD FARM POLICY BRANCH \n", + "195652 2022 NaN AGHYARAN GAA CLUB \n", + "195769 2022 NaN ANTRIM & NEWTOWNABBEY BOROUGH COUNCIL \n", "\n", - " TownCity_F202C PayingAgencyLink \\\n", - "26142 OMAGH DAERA \n", - "26162 FIVEMILETOWN DAERA \n", - "26193 CASTLEWELLAN DAERA \n", - "26215 NEWRY DAERA \n", - "26229 ENNISKILLEN DAERA \n", + " PostcodePrefix_F202B TownCity_F202C PayingAgencyLink \\\n", + "1058 IP24 ENGLAND DAERA \n", + "1300 BT71 CO TYRONE DAERA \n", + "1398 BT4 BELFAST CO DOWN DAERA \n", + "195652 BT81 CO.TYRONE DAERA \n", + "195769 BT36 CO.ANTRIM DAERA \n", "\n", - " scheme amount \n", - "26142 Payments to areas facing natural and other spe... 209.50 \n", - "26162 Payments to areas facing natural and other spe... 374.40 \n", - "26193 Payments to areas facing natural and other spe... 221.93 \n", - "26215 Payments to areas facing natural and other spe... 176.75 \n", - "26229 Payments to areas facing natural and other spe... 256.37 " + " scheme amount \n", + "1058 Technical assist 91631.32 \n", + "1300 Technical assist 225512.40 \n", + "1398 Technical assist 2904812.46 \n", + "195652 Support for Leader local development 30725.22 \n", + "195769 Support for Leader local development 188992.88 " ] }, "execution_count": 8, @@ -259,17 +328,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/sw/.virtualenvs/notebook36/lib/python3.6/site-packages/ipykernel_launcher.py:15: FutureWarning: set_value is deprecated and will be removed in a future release. Please use .at[] or .iat[] accessors instead\n", - " from ipykernel import kernelapp as app\n" - ] - }, { "data": { "text/html": [ @@ -305,67 +366,67 @@ " \n", " \n", " \n", - " 26142\n", - " 2016\n", - " 1341095.0\n", - " None\n", - " BT78\n", - " OMAGH\n", + " 1058\n", + " 2022\n", + " NaN\n", + " BRITISH TRUST FOR ORNITHOLOGY\n", + " IP24\n", + " ENGLAND\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 209.50\n", + " Technical assist\n", + " 91631.32\n", " GB\n", " GBP\n", " \n", " \n", - " 26162\n", - " 2016\n", - " 1352021.0\n", - " None\n", - " BT75\n", - " FIVEMILETOWN\n", + " 1300\n", + " 2022\n", + " NaN\n", + " COUNTRYSIDE SERVICES LIMITED\n", + " BT71\n", + " CO TYRONE\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 374.40\n", + " Technical assist\n", + " 225512.40\n", " GB\n", " GBP\n", " \n", " \n", - " 26193\n", - " 2016\n", - " 1162663.0\n", - " None\n", - " BT31\n", - " CASTLEWELLAN\n", + " 1398\n", + " 2022\n", + " NaN\n", + " DARD FARM POLICY BRANCH\n", + " BT4\n", + " BELFAST CO DOWN\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 221.93\n", + " Technical assist\n", + " 2904812.46\n", " GB\n", " GBP\n", " \n", " \n", - " 26215\n", - " 2016\n", - " 1004277.0\n", - " None\n", - " BT34\n", - " NEWRY\n", + " 195652\n", + " 2022\n", + " NaN\n", + " AGHYARAN GAA CLUB\n", + " BT81\n", + " CO.TYRONE\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 176.75\n", + " Support for Leader local development\n", + " 30725.22\n", " GB\n", " GBP\n", " \n", " \n", - " 26229\n", - " 2016\n", - " 1108471.0\n", - " None\n", - " BT74\n", - " ENNISKILLEN\n", + " 195769\n", + " 2022\n", + " NaN\n", + " ANTRIM & NEWTOWNABBEY BOROUGH COUNCIL\n", + " BT36\n", + " CO.ANTRIM\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 256.37\n", + " Support for Leader local development\n", + " 188992.88\n", " GB\n", " GBP\n", " \n", @@ -374,36 +435,29 @@ "" ], "text/plain": [ - " year recipient_id recipient_name recipient_postcode \\\n", - "26142 2016 1341095.0 None BT78 \n", - "26162 2016 1352021.0 None BT75 \n", - "26193 2016 1162663.0 None BT31 \n", - "26215 2016 1004277.0 None BT34 \n", - "26229 2016 1108471.0 None BT74 \n", - "\n", - " recipient_location agency \\\n", - "26142 OMAGH DAERA \n", - "26162 FIVEMILETOWN DAERA \n", - "26193 CASTLEWELLAN DAERA \n", - "26215 NEWRY DAERA \n", - "26229 ENNISKILLEN DAERA \n", + " year recipient_id recipient_name \\\n", + "1058 2022 NaN BRITISH TRUST FOR ORNITHOLOGY \n", + "1300 2022 NaN COUNTRYSIDE SERVICES LIMITED \n", + "1398 2022 NaN DARD FARM POLICY BRANCH \n", + "195652 2022 NaN AGHYARAN GAA CLUB \n", + "195769 2022 NaN ANTRIM & NEWTOWNABBEY BOROUGH COUNCIL \n", "\n", - " scheme amount country \\\n", - "26142 Payments to areas facing natural and other spe... 209.50 GB \n", - "26162 Payments to areas facing natural and other spe... 374.40 GB \n", - "26193 Payments to areas facing natural and other spe... 221.93 GB \n", - "26215 Payments to areas facing natural and other spe... 176.75 GB \n", - "26229 Payments to areas facing natural and other spe... 256.37 GB \n", + " recipient_postcode recipient_location agency \\\n", + "1058 IP24 ENGLAND DAERA \n", + "1300 BT71 CO TYRONE DAERA \n", + "1398 BT4 BELFAST CO DOWN DAERA \n", + "195652 BT81 CO.TYRONE DAERA \n", + "195769 BT36 CO.ANTRIM DAERA \n", "\n", - " currency \n", - "26142 GBP \n", - "26162 GBP \n", - "26193 GBP \n", - "26215 GBP \n", - "26229 GBP " + " scheme amount country currency \n", + "1058 Technical assist 91631.32 GB GBP \n", + "1300 Technical assist 225512.40 GB GBP \n", + "1398 Technical assist 2904812.46 GB GBP \n", + "195652 Support for Leader local development 30725.22 GB GBP \n", + "195769 Support for Leader local development 188992.88 GB GBP " ] }, - "execution_count": 9, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -423,13 +477,14 @@ "df['recipient_name'] = df['recipient_name'].str.strip()\n", "df['recipient_postcode'] = df['recipient_postcode'].str.strip()\n", "df['recipient_location'] = df['recipient_location'].str.strip()\n", - "df.set_value(df['recipient_id'].notnull(), 'recipient_name', None)\n", + "df.loc[df['recipient_id'].notnull(), 'recipient_name'] = None\n", + "#df.set_value(df['recipient_id'].notnull(), 'recipient_name', None)\n", "df.head()" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -467,67 +522,67 @@ " \n", " \n", " \n", - " 26142\n", - " 2016\n", - " GB-1341095\n", - " None\n", - " BT78\n", - " OMAGH\n", + " 1058\n", + " 2022\n", + " GB-IP24-BRITISH TRUST FOR ORNITHOLOGY\n", + " BRITISH TRUST FOR ORNITHOLOGY\n", + " IP24\n", + " ENGLAND\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 209.50\n", + " Technical assist\n", + " 91631.32\n", " GB\n", " GBP\n", " \n", " \n", - " 26162\n", - " 2016\n", - " GB-1352021\n", - " None\n", - " BT75\n", - " FIVEMILETOWN\n", + " 1300\n", + " 2022\n", + " GB-BT71-COUNTRYSIDE SERVICES LIMITED\n", + " COUNTRYSIDE SERVICES LIMITED\n", + " BT71\n", + " CO TYRONE\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 374.40\n", + " Technical assist\n", + " 225512.40\n", " GB\n", " GBP\n", " \n", " \n", - " 26193\n", - " 2016\n", - " GB-1162663\n", - " None\n", - " BT31\n", - " CASTLEWELLAN\n", + " 1398\n", + " 2022\n", + " GB-BT4-DARD FARM POLICY BRANCH\n", + " DARD FARM POLICY BRANCH\n", + " BT4\n", + " BELFAST CO DOWN\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 221.93\n", + " Technical assist\n", + " 2904812.46\n", " GB\n", " GBP\n", " \n", " \n", - " 26215\n", - " 2016\n", - " GB-1004277\n", - " None\n", - " BT34\n", - " NEWRY\n", + " 195652\n", + " 2022\n", + " GB-BT81-AGHYARAN GAA CLUB\n", + " AGHYARAN GAA CLUB\n", + " BT81\n", + " CO.TYRONE\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 176.75\n", + " Support for Leader local development\n", + " 30725.22\n", " GB\n", " GBP\n", " \n", " \n", - " 26229\n", - " 2016\n", - " GB-1108471\n", - " None\n", - " BT74\n", - " ENNISKILLEN\n", + " 195769\n", + " 2022\n", + " GB-BT36-ANTRIM & NEWTOWNABBEY BOROUGH COUNCIL\n", + " ANTRIM & NEWTOWNABBEY BOROUGH COUNCIL\n", + " BT36\n", + " CO.ANTRIM\n", " DAERA\n", - " Payments to areas facing natural and other spe...\n", - " 256.37\n", + " Support for Leader local development\n", + " 188992.88\n", " GB\n", " GBP\n", " \n", @@ -536,29 +591,36 @@ "" ], "text/plain": [ - " year recipient_id recipient_name recipient_postcode recipient_location \\\n", - "26142 2016 GB-1341095 None BT78 OMAGH \n", - "26162 2016 GB-1352021 None BT75 FIVEMILETOWN \n", - "26193 2016 GB-1162663 None BT31 CASTLEWELLAN \n", - "26215 2016 GB-1004277 None BT34 NEWRY \n", - "26229 2016 GB-1108471 None BT74 ENNISKILLEN \n", + " year recipient_id \\\n", + "1058 2022 GB-IP24-BRITISH TRUST FOR ORNITHOLOGY \n", + "1300 2022 GB-BT71-COUNTRYSIDE SERVICES LIMITED \n", + "1398 2022 GB-BT4-DARD FARM POLICY BRANCH \n", + "195652 2022 GB-BT81-AGHYARAN GAA CLUB \n", + "195769 2022 GB-BT36-ANTRIM & NEWTOWNABBEY BOROUGH COUNCIL \n", + "\n", + " recipient_name recipient_postcode \\\n", + "1058 BRITISH TRUST FOR ORNITHOLOGY IP24 \n", + "1300 COUNTRYSIDE SERVICES LIMITED BT71 \n", + "1398 DARD FARM POLICY BRANCH BT4 \n", + "195652 AGHYARAN GAA CLUB BT81 \n", + "195769 ANTRIM & NEWTOWNABBEY BOROUGH COUNCIL BT36 \n", "\n", - " agency scheme amount \\\n", - "26142 DAERA Payments to areas facing natural and other spe... 209.50 \n", - "26162 DAERA Payments to areas facing natural and other spe... 374.40 \n", - "26193 DAERA Payments to areas facing natural and other spe... 221.93 \n", - "26215 DAERA Payments to areas facing natural and other spe... 176.75 \n", - "26229 DAERA Payments to areas facing natural and other spe... 256.37 \n", + " recipient_location agency scheme \\\n", + "1058 ENGLAND DAERA Technical assist \n", + "1300 CO TYRONE DAERA Technical assist \n", + "1398 BELFAST CO DOWN DAERA Technical assist \n", + "195652 CO.TYRONE DAERA Support for Leader local development \n", + "195769 CO.ANTRIM DAERA Support for Leader local development \n", "\n", - " country currency \n", - "26142 GB GBP \n", - "26162 GB GBP \n", - "26193 GB GBP \n", - "26215 GB GBP \n", - "26229 GB GBP " + " amount country currency \n", + "1058 91631.32 GB GBP \n", + "1300 225512.40 GB GBP \n", + "1398 2904812.46 GB GBP \n", + "195652 30725.22 GB GBP \n", + "195769 188992.88 GB GBP " ] }, - "execution_count": 10, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -577,16 +639,16 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "1135352" + "846114" ] }, - "execution_count": 11, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -597,66 +659,56 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Greening: practices beneficial for climate and environment 144673\n", - "Basic payment scheme 144317\n", - "Reimbursement of financial discipline 110149\n", - "Agri-environment-climate 59572\n", - "Redistributive payment 15684\n", - "Payments to areas facing natural and other specific constraints 9074\n", - "Investment in forest area development and improvement of the viability of forests 8974\n", - "Other direct aids 7949\n", - "Investments in physical assets 5311\n", - "Payment for young farmers 4961\n", - "Agri-environment payments 1154\n", - "Animal welfare 1117\n", - "Forest environmental and climate services and forest conservation 728\n", - "Organic farming 604\n", - "Single payment scheme (payments made in 2016) 444\n", - "Restoring agricultural production potential destroyed by natural disaster 360\n", - "Non-productive investments 307\n", - "School milk scheme 249\n", - "Farm and business development 134\n", - "Support for Leader local development 98\n", - "First afforestation of agricultural land 63\n", - "Modernisation of agricultural holdings 61\n", - "Quality schemes for agricultural products and foodstuffs 56\n", - "Aid in fruit and vegetables sector 33\n", - "Infrastructure related to the development and adaptation of agriculture and forestry 32\n", - "Knowledge transfer and information actions 27\n", - "Implementing local development strategies. Quality of life/diversification 27\n", - "Technical assist 20\n", - "Cooperation 20\n", - "Additional amounts of aid 20\n", - "Running the local action group, acquiring skills and animating the territory 16\n", - "First afforestation of non-agricultural land 14\n", - "Basic services and village renewal in rural areas 14\n", - "Technical Assistance 13\n", - "Development of new products, processes and technologies 11\n", - "Improvement of the economic value of forests 10\n", - "Encouragement of tourism activities 10\n", - "Aid for private storage 10\n", - "Adding value to agricultural and forestry products 8\n", - "Implementing local development strategies. Competitiveness 7\n", - "Vocational training and information actions 7\n", - "Basic services for the economy and rural population 7\n", - "Promotion measures 7\n", - "Aid for public storage 6\n", - "Advisory services, farm management and farm relief services 6\n", - "Skills acquisition, animation and implementation of local development strategies 6\n", - "Aid in the apiculture sector 2\n", - "Implementing cooperation projects 2\n", - "Payments to farmers in areas with handicaps, other than mountain areas 1\n", - "Training and information 1\n", - "Name: scheme, dtype: int64" + "scheme\n", + "Basic payment scheme - UK funded 143841\n", + "Agri-environment-climate 26305\n", + "Greening - UK payments - UK funded 18848\n", + "Redistributive payment - UK funded 16313\n", + "Payments to areas facing natural constraints - UK funded 10713\n", + "Other direct aids - UK funded 7293\n", + "Investment in forest area development and viability 6306\n", + "Investments in physical assets 4751\n", + "Young farmers - UK funded 4277\n", + "Investments in physical assets - UK funded 3518\n", + "Organic farming 1740\n", + "Refunds for pigmeat 1528\n", + "Forest environmental, climate and conservation - UK funded 806\n", + "Investment in forest area development and viability - UK funded 474\n", + "Payments to areas facing natural and other specific constraints 341\n", + "Support for Leader local development 317\n", + "Reimbursement of financial discipline 308\n", + "School Milk scheme – Regulation 657/2008 246\n", + "Farm and business development 208\n", + "Cooperation 179\n", + "Basic services and village renewal in rural areas 165\n", + "Forest environmental, climate and conservation 157\n", + "Skills acquisition, animation and implementation of local development strategies 99\n", + "Farm and business development - UK funded 67\n", + "Aid in fruit and vegetables sector - UK funded 34\n", + "Knowledge transfer and information actions 11\n", + "Advisory services, farm management and farm relief services 7\n", + "Technical assist 5\n", + "School milk scheme - UK funded 5\n", + "Knowledge transfer and information actions - UK funded 3\n", + "Cooperation - UK funded 3\n", + "Single payment scheme - UK funded 3\n", + "Agri-environment-climate - UK funded 2\n", + "Advisory, farm mangement and farm relief services - UK funded 2\n", + "Aid for public storage - UK funded 2\n", + "Redistributive payment 2\n", + "Basic services and village renewal in rural areas - UK funded 1\n", + "Beekeeping - UK funded 1\n", + "Single payment scheme 1\n", + "Name: count, dtype: int64" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -668,17 +720,24 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "df.to_csv('gb_%s.csv.gz' % YEAR, index=False, encoding='utf-8', compression='gzip')" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -692,9 +751,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.2" + "version": "3.9.18" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 } From 8eaccee4013cd3ec641a2867c746d13cec01e313 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Sun, 5 Nov 2023 12:07:44 +0100 Subject: [PATCH 09/38] LU: scrapy working 2023 --- scrapy_fs/scrapy_fs/spiders/lu_spider.py | 60 ++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 scrapy_fs/scrapy_fs/spiders/lu_spider.py diff --git a/scrapy_fs/scrapy_fs/spiders/lu_spider.py b/scrapy_fs/scrapy_fs/spiders/lu_spider.py new file mode 100644 index 0000000..5a4a6c6 --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/lu_spider.py @@ -0,0 +1,60 @@ +import scrapy +from scrapy.spiders import Spider + +from slugify import slugify + +from ..items import FarmSubsidyItem + + +class LUSpider(Spider): + name = "LU" + + BASE_URL = "https://agriculture.public.lu" + START_URL = "https://agriculture.public.lu/de/beihilfen/beguenstigte-der-agrarbeihilfen.html?annee={year}&mesure=&municipalite=&nom=&montantbas=&montanthaut=&numeroPage={page}" + + def __init__(self, year=None): + self.year = int(year) + + def start_requests(self): + url = self.START_URL.format(year=self.year, page=1) + yield scrapy.Request(url) + + def parse(self, response): + next_url = response.css(".pagination-next a.icon-right::attr(href)").get() + if next_url: + yield scrapy.Request(self.BASE_URL + next_url) + + yield from self.parse_page(response) + + def parse_page(self, response): + rows = response.css('.accordion-gestion details') + for row in rows: + # also read next row + name = row.css("summary .gestion-name::text").get().strip() + location = row.css("summary .gestion-city::text").get().strip() + if name.endswith('_Anonymisiert'): + recipient_id = "{}-{}-{}".format( + self.name, self.year, name.split("_")[0] + ) + name = "" + else: + recipient_id = "{}-{}-{}".format( + self.name, slugify(name), slugify(location) + ) + + scheme_rows = row.css("table tr")[1:] + for scheme_row in scheme_rows: + cols = scheme_row.xpath("./td") + scheme = cols[0].css("b::text").get() + if scheme is None: + scheme = "" + amount = float(cols[1].xpath("./text()").get().replace('€', '').strip()) + yield FarmSubsidyItem( + year=self.year, + scheme=scheme.strip(), + amount=amount, + recipient_id=recipient_id, + recipient_name=name, + recipient_location=location, + country=self.name, currency='EUR', + ) From 497d221a41c6d53d3f09e116c87d7150e1b0413a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Sun, 5 Nov 2023 12:10:47 +0100 Subject: [PATCH 10/38] AT: scrapy working 2023 --- scrapy_fs/scrapy_fs/spiders/at_spider.py | 27 +++++++++++++----------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/scrapy_fs/scrapy_fs/spiders/at_spider.py b/scrapy_fs/scrapy_fs/spiders/at_spider.py index 440b948..82d6131 100644 --- a/scrapy_fs/scrapy_fs/spiders/at_spider.py +++ b/scrapy_fs/scrapy_fs/spiders/at_spider.py @@ -9,10 +9,11 @@ class ATSpider(Spider): name = "AT" - YEAR = 2017 - START_URL = 'https://www.transparenzdatenbank.at/suche' - DETAIL_URL = 'https://www.transparenzdatenbank.at/suche/details/{id}/{year}' - DEFAULT_SEARCH = u'{"name":"","betrag_von":"","betrag_bis":"","gemeinde":"","massnahme":null,"jahr":%s,"sort":"name"}' % YEAR + YEAR = 2022 + START_URL = 'https://www.transparenzdatenbank.at/search' + # DETAIL_URL = 'https://www.transparenzdatenbank.at/suche/details/{id}/{year}' + DETAIL_URL = 'https://www.transparenzdatenbank.at/search?laufnr={laufnr}&jahr={year}' + DEFAULT_SEARCH = '{"zahlungsempfaenger":"","betrag_von":null,"betrag_bis":null,"gemeinde":"","massnahme":0,"jahr":%s,"page":0,"size":200000,"sort":"zahlungsempfaenger","asc":true}' % YEAR def __init__(self, year=YEAR): self.year = int(year) @@ -39,19 +40,21 @@ def get_results(self, response): @url http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/ @scrapes name """ - all_items = json.loads(response.body) + data = json.loads(response.body) + all_items = data["data"] for item in all_items: + # print(item) item_data = dict( country='AT', currency='EUR', - year=item['jahr'], - recipient_name=item['name'], + year=item['hhj'], + recipient_name=item['zahlungsempfaenger'], recipient_id='AT-%s' % item['id'], recipient_location=item['gemeinde'], - recipient_postcode=str(item['plz']), - amount=item['betrag'], + recipient_postcode=str(item['postleitzahl']), + amount=item['saldo'], ) - yield scrapy.Request(self.DETAIL_URL.format(id=item['id'], year=item['jahr']), - callback=self.get_detail, meta={'item_data': item_data}) + yield scrapy.Request(self.DETAIL_URL.format(laufnr=item['laufnr'], year=item['hhj']), + callback=self.get_detail, meta={'item_data': item_data}) def get_detail(self, response): item_data = response.meta['item_data'] @@ -59,6 +62,6 @@ def get_detail(self, response): for payment in all_payments: new_item = dict(item_data) new_item['amount'] = payment['betrag'] - new_item['scheme'] = u'{bezeichnung} ({id})'.format(**payment) + new_item['scheme'] = u'{bezeichnung} ({manacode})'.format(**payment) yield FarmSubsidyItem(**new_item) From a1b0ebc48769047cb1bb96674e6f1eae67c1a4b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Sun, 5 Nov 2023 12:11:27 +0100 Subject: [PATCH 11/38] DE: Add scrapy scraper --- scrapy_fs/scrapy_fs/spiders/de_spider.py | 138 +++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 scrapy_fs/scrapy_fs/spiders/de_spider.py diff --git a/scrapy_fs/scrapy_fs/spiders/de_spider.py b/scrapy_fs/scrapy_fs/spiders/de_spider.py new file mode 100644 index 0000000..8d8ef03 --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/de_spider.py @@ -0,0 +1,138 @@ +import json +import string + +import scrapy +from scrapy.spiders import Spider +# from scrapy.shell import inspect_response + +from ..items import FarmSubsidyItem + + +class DESpider(Spider): + name = "DE" + _YEAR = 2018 + YEAR = 'jahr' + START_URL = 'https://agrar-fischerei-zahlungen.de/Suche' + + def __init__(self): + pass + + def get_plzs(self): + for i in range(0, 100000): + yield str(i).zfill(5) + '%' + for i in range(0, 10000): + yield str(i).zfill(4) + for l in string.ascii_letters: + yield '%' + l + '%' + + def start_requests(self): + yield scrapy.Request(self.START_URL, + method='POST', + headers={ + 'Content-Type': 'application/json;charset=UTF-8', + 'Accept': 'application/json, text/plain, */*', + 'PAGINATION_CURRENT': 1, + 'PAGINATION_PER_PAGE': 2000000, + 'Referer': 'https://www.transparenzdatenbank.at/', + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' + }, + body=self.DEFAULT_SEARCH, + callback=self.get_results) + + def search(self, plz): + page = 1 + per_page = 50 + count, count_beg = 1000, 1000 + while True: + offset = str(per_page * (page - 1)) + if page == 1: + response = requests.post(BASE_URL, data={ + 'jahr': YEAR, + 'name': '', + 'plz': plz, + 'ort': '', + 'suchtypBetrag': 'betrag_massnahme', + 'operator': 'eq', + 'betrag': '', + 'suchtypEgfl': 'egfl_alle' + }) + + text = response.text + if 'Es liegen mehr als 1500 Ergebnisse vor' in text: + raise ValueError('Search %s result in too many!' % plz) + + dom = html.fromstring(text) + form_data = get_form_data(dom.xpath('.//form[@id="data"]')[0]) + if 'count' not in form_data: + # No results + return None + count = form_data['count'] + count_beg = form_data['countBeg'] + + response = requests.post(BASE_URL, data={ + 'jahr': YEAR, + 'name': '', + 'ort': '', + 'plz': plz, + 'suchtypBetrag': 'betrag_massnahme', + 'operator': 'eq', + 'betrag': '', + 'suchtypEgfl': 'egfl_alle', + 'suchtypEler': 'eler_alle', + 'viewOffset': str(offset), + 'viewOrderdir': 'asc', + 'viewOrderby': 'zahlungsempfaenger', + 'viewCount': str(count), + 'viewCountBeg': str(count_beg), + 'viewLimit': str(per_page), + 'offset': str(offset), + 'dir': 'asc', + 'order': 'zahlungsempfaenger', + 'count': str(count), + 'countBeg': str(count_beg), + 'prevLimit': str(per_page), + 'limit': str(per_page), + 'seite': str(page) + }) + dom = html.fromstring(response.text) + buttons = dom.xpath('.//button[@name="showBeg"]') + for x in buttons: + detail_queue.put((x.attrib['value'], plz, page)) + nav_text = dom.xpath('.//div[@id="listNavRight"]')[0].text_content() + nav_text = nav_text.strip() + '|' + # print('%s lines for %s - now on page %d' % (count_beg, plz, page)) + if 'von %d|' % page in nav_text: + break + page += 1 + # print('Going to page %d of %s' % (page, plz)) + + def get_results(self, response): + """ + The lines below is a spider contract. For more info see: + http://doc.scrapy.org/en/latest/topics/contracts.html + @url http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/ + @scrapes name + """ + all_items = json.loads(response.body) + for item in all_items: + item_data = dict( + country='AT', currency='EUR', + year=item['jahr'], + recipient_name=item['name'], + recipient_id='AT-%s' % item['id'], + recipient_location=item['gemeinde'], + recipient_postcode=str(item['plz']), + amount=item['betrag'], + ) + yield scrapy.Request(self.DETAIL_URL.format(id=item['id'], year=item['jahr']), + callback=self.get_detail, meta={'item_data': item_data}) + + def get_detail(self, response): + item_data = response.meta['item_data'] + all_payments = json.loads(response.body) + for payment in all_payments: + new_item = dict(item_data) + new_item['amount'] = payment['betrag'] + new_item['scheme'] = u'{bezeichnung} ({id})'.format(**payment) + + yield FarmSubsidyItem(**new_item) From a90d42467672ea0895d968db6992114b40bea932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Sun, 5 Nov 2023 12:12:13 +0100 Subject: [PATCH 12/38] LV: add scrapy scraper --- scrapy_fs/scrapy_fs/spiders/lv_spider.py | 61 ++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 scrapy_fs/scrapy_fs/spiders/lv_spider.py diff --git a/scrapy_fs/scrapy_fs/spiders/lv_spider.py b/scrapy_fs/scrapy_fs/spiders/lv_spider.py new file mode 100644 index 0000000..3b92ee0 --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/lv_spider.py @@ -0,0 +1,61 @@ +import scrapy +from scrapy.spiders import Spider + +from slugify import slugify + +from ..items import FarmSubsidyItem + + +class LVSpider(Spider): + name = "LV" + + START_URL = "https://eps.lad.gov.lv/payment_recipients?utf8=%E2%9C%93&eps_payment%5Bdisplay_name%5D=&eps_payment%5Btax_payer_number%5D=&eps_payment%5Bdistrict%5D=&eps_payment%5Bfund%5D=elf&eps_payment%5Bschema%5D=&eps_payment%5Bsum_from%5D=&eps_payment%5Bsum_to%5D=&eps_payment%5Byear_type%5D=F&eps_payment%5Byear%5D={year}&commit=Mekl%C4%93t&page={page}" + + def __init__(self, year=None): + self.year = int(year) + + def start_requests(self): + url = self.START_URL.format(year=self.year, page=1) + yield scrapy.Request(url) + + def parse(self, response): + page_count = response.xpath('//div[@id="paginate"]/a/text()')[-2].get() + page_count = int(page_count) + yield from self.parse_page(response) + + for i in range(2, page_count + 1): + url = self.START_URL.format(year=self.year, page=i) + yield scrapy.Request(url, callback=self.parse_page) + + def parse_page(self, response): + rows = response.xpath('//div[@id="pmt_rec_list"]/table/tr') + value_rows = iter(rows[1:]) + for row in value_rows: + # also read next row + detail_row = next(value_rows) + values = row.xpath("./td/text()") + name = values[0].get().strip() + location = values[1].get().strip() + if name.isdigit(): + recipient_id = "{}-{}".format( + self.name, name + ) + name = "" + else: + recipient_id = "{}-{}-{}".format( + self.name, slugify(name), slugify(location) + ) + scheme_rows = detail_row.xpath(".//tr")[1:] + for scheme_row in scheme_rows: + cols = scheme_row.xpath("./td") + scheme = cols[0].css("::text").get().strip() + amount = float(cols[1].css("::text").get()) + yield FarmSubsidyItem( + year=self.year, + scheme=scheme.strip(), + amount=amount, + recipient_id=recipient_id, + recipient_name=name, + recipient_location=location, + country=self.name, currency='EUR', + ) From e04b65b5f2afdee2252e0fb6c785feac789e5ac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Sun, 5 Nov 2023 12:12:41 +0100 Subject: [PATCH 13/38] SK: Fix scrapy scraper for 2022 --- scrapy_fs/scrapy_fs/spiders/sk_spider.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/scrapy_fs/scrapy_fs/spiders/sk_spider.py b/scrapy_fs/scrapy_fs/spiders/sk_spider.py index 1b537b6..00c1c26 100644 --- a/scrapy_fs/scrapy_fs/spiders/sk_spider.py +++ b/scrapy_fs/scrapy_fs/spiders/sk_spider.py @@ -11,13 +11,14 @@ class SKSpider(Spider): name = "SK" NUM_ONLY_RE = re.compile('^[\s\d]+$') + SEARCH_URL = 'https://www.apa.sk/index.php?offset={offset}&navID=511&euod=&eudo=&kod_opatrenia=&obec=&rok={year}&meno=&submit=H%C4%BEadaj' def __init__(self, year=None): self.year = int(year) def start_requests(self): - self.SEARCH_URL = 'http://www.apa.sk/index.php?offset=%s&navID=511&euod=&eudo=&order=&rok=' + str(self.year) - url = self.SEARCH_URL % '1' + offset = 0 + url = self.SEARCH_URL.format(year=self.year, offset=offset) yield scrapy.Request(url) def parse(self, response): @@ -28,8 +29,8 @@ def parse(self, response): for x in self.search_page(response): yield x - for i in range(2, max_page + 1): - yield scrapy.Request(self.SEARCH_URL % i) + for i in range(1, max_page - 1): + yield scrapy.Request(self.SEARCH_URL.format(year=self.year, offset=i), callback=self.search_page) def search_page(self, response): trs = response.xpath('.//table//tr') @@ -37,13 +38,14 @@ def search_page(self, response): if i == 0: continue tds = [x.xpath('.//text()').extract() for x in tr.xpath('./td')] + tds = [td[0] if len(td) else "" for td in tds] scheme = tds[3].strip() year = int(tds[5].strip()) amount = float(tds[4]) recipient_postcode = tds[1].strip() recipient_location = tds[2].strip() - recipient_name = tds[0] - if recipient_name.startswith('B20'): + recipient_name = tds[0].strip() + if recipient_name.isdigit(): recipient_id = u'SK-%s' % recipient_name recipient_name = '' else: From ec23cd1ffcd376f613d5b68ca8e857733704cd5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Sun, 5 Nov 2023 13:01:07 +0100 Subject: [PATCH 14/38] HU: Update converter for 2023 --- hu/README.md | 8 +- hu/hu_converter_2023.ipynb | 1036 ++++++++++++++++++++++++++++++++++++ 2 files changed, 1040 insertions(+), 4 deletions(-) create mode 100644 hu/hu_converter_2023.ipynb diff --git a/hu/README.md b/hu/README.md index 98e5a16..c331061 100644 --- a/hu/README.md +++ b/hu/README.md @@ -1,10 +1,10 @@ Scraper for Hungary ========================= - + Writing a scraper is painful (ASP viewstate). -Manually downloading CSV files from search by "Alap" and "Forrás" works though. -The individual files are stored in `data/` with the format `$ALAP-$FORRAS-$YEAR.csv`. -The provided Jupyter notebook combines these files and exports them into the necessary CSV. +Manually downloading CSV file via "Full list - abc order" and convert in `hu_converter_2023.ipynb` + + diff --git a/hu/hu_converter_2023.ipynb b/hu/hu_converter_2023.ipynb new file mode 100644 index 0000000..dd80767 --- /dev/null +++ b/hu/hu_converter_2023.ipynb @@ -0,0 +1,1036 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from glob import glob\n", + "import os\n", + "\n", + "import pandas as pd\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_115982/980775472.py:1: DtypeWarning: Columns (3) have mixed types. Specify dtype option on import or set low_memory=False.\n", + " df = pd.read_csv(\"./tamkereso_1000081/export.csv\", encoding='latin-1', delimiter=';', converters={'Postal code': str})\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Name of beneficiaryPostal codeMunicipalityAddressMeasureFUNDResourceAmount of support (Ft)Overall amount of support (Ft)year
0\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU648282672031402022
1\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National72031472031402022
2\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/AReimbursement of financial disciplineEAGFEU9379647993222022
3\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/APayments for agricultural practises beneficial...EAGFEU167143647993222022
4\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/ASingle area payment scheme (SAPS)EAGFEU303409047993222022
5\" Túri Csemege \" Kereskedelmi Kft.5400MezõtúrBajcsy-Zsilinszky utca 55Temporary state aid measure - pigeonNationalNational292500029250002022
6,, Zirc Kultúrájáért '' Közhasznú Alapítvány8420ZircMárcius 15. tér 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU8731159701282022
7,, Zirc Kultúrájáért '' Közhasznú Alapítvány8420ZircMárcius 15. tér 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National970139701282022
8A Bakonyért Vidékfejlesztési Akciócsoport Egy...8420ZircVak Bottyán utca 1.19.4.1 LEADER - Support for operational and an...EMVA 2014EU17236254229553772022
9A Bakonyért Vidékfejlesztési Akciócsoport Egy...8420ZircVak Bottyán utca 1.19.4.1 LEADER - Support for operational and an...EMVA 2014National1915140229553772022
10A Bakonyért Vidékfejlesztési Akciócsoport Egy...8420ZircVak Bottyán utca 1.RDP-M19.3.1-LEADER cooperationEMVA 2014EU3423584229553772022
11A Bakonyért Vidékfejlesztési Akciócsoport Egy...8420ZircVak Bottyán utca 1.RDP-M19.3.1-LEADER cooperationEMVA 2014National380399229553772022
12A Gyermekekért és az Ifjúságért Vincze Imre A...2898KocsSzabadság tér 6.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National41104241104232022
13A Gyermekekért és az Ifjúságért Vincze Imre A...2898KocsSzabadság tér 6.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU369938141104232022
14A JÁSZAPÁTI TEMPLOMÉRT Alapítvány5130JászapátiOrgona út 2.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU179993119999232022
15A JÁSZAPÁTI TEMPLOMÉRT Alapítvány5130JászapátiOrgona út 2.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National19999219999232022
16A Jövõ Borsodnádasdjáért Egyesület3672Borsodnádasd-LemezgyárPetõfi tér 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National855638556252022
17A Jövõ Borsodnádasdjáért Egyesület3672Borsodnádasd-LemezgyárPetõfi tér 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU7700628556252022
18A Kéki Rosszcsontokért Alapítvány4515KékRákóczi utca 2RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU111023712335972022
19A Kéki Rosszcsontokért Alapítvány4515KékRákóczi utca 2RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National12336012335972022
\n", + "
" + ], + "text/plain": [ + " Name of beneficiary Postal code \\\n", + "0 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "1 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "2 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "3 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "4 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "5 \" Túri Csemege \" Kereskedelmi Kft. 5400 \n", + "6 ,, Zirc Kultúrájáért '' Közhasznú Alapítvány 8420 \n", + "7 ,, Zirc Kultúrájáért '' Közhasznú Alapítvány 8420 \n", + "8 A Bakonyért Vidékfejlesztési Akciócsoport Egy... 8420 \n", + "9 A Bakonyért Vidékfejlesztési Akciócsoport Egy... 8420 \n", + "10 A Bakonyért Vidékfejlesztési Akciócsoport Egy... 8420 \n", + "11 A Bakonyért Vidékfejlesztési Akciócsoport Egy... 8420 \n", + "12 A Gyermekekért és az Ifjúságért Vincze Imre A... 2898 \n", + "13 A Gyermekekért és az Ifjúságért Vincze Imre A... 2898 \n", + "14 A JÁSZAPÁTI TEMPLOMÉRT Alapítvány 5130 \n", + "15 A JÁSZAPÁTI TEMPLOMÉRT Alapítvány 5130 \n", + "16 A Jövõ Borsodnádasdjáért Egyesület 3672 \n", + "17 A Jövõ Borsodnádasdjáért Egyesület 3672 \n", + "18 A Kéki Rosszcsontokért Alapítvány 4515 \n", + "19 A Kéki Rosszcsontokért Alapítvány 4515 \n", + "\n", + " Municipality Address \\\n", + "0 Csurgó Poldini Ede utca 1. \n", + "1 Csurgó Poldini Ede utca 1. \n", + "2 Gérce Kossuth Lajos utca 15/A \n", + "3 Gérce Kossuth Lajos utca 15/A \n", + "4 Gérce Kossuth Lajos utca 15/A \n", + "5 Mezõtúr Bajcsy-Zsilinszky utca 55 \n", + "6 Zirc Március 15. tér 1. \n", + "7 Zirc Március 15. tér 1. \n", + "8 Zirc Vak Bottyán utca 1. \n", + "9 Zirc Vak Bottyán utca 1. \n", + "10 Zirc Vak Bottyán utca 1. \n", + "11 Zirc Vak Bottyán utca 1. \n", + "12 Kocs Szabadság tér 6. \n", + "13 Kocs Szabadság tér 6. \n", + "14 Jászapáti Orgona út 2. \n", + "15 Jászapáti Orgona út 2. \n", + "16 Borsodnádasd-Lemezgyár Petõfi tér 1. \n", + "17 Borsodnádasd-Lemezgyár Petõfi tér 1. \n", + "18 Kék Rákóczi utca 2 \n", + "19 Kék Rákóczi utca 2 \n", + "\n", + " Measure FUND Resource \\\n", + "0 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "1 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "2 Reimbursement of financial discipline EAGF EU \n", + "3 Payments for agricultural practises beneficial... EAGF EU \n", + "4 Single area payment scheme (SAPS) EAGF EU \n", + "5 Temporary state aid measure - pigeon National National \n", + "6 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "7 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "8 19.4.1 LEADER - Support for operational and an... EMVA 2014 EU \n", + "9 19.4.1 LEADER - Support for operational and an... EMVA 2014 National \n", + "10 RDP-M19.3.1-LEADER cooperation EMVA 2014 EU \n", + "11 RDP-M19.3.1-LEADER cooperation EMVA 2014 National \n", + "12 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "13 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "14 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "15 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "16 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "17 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "18 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "19 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "\n", + " Amount of support (Ft) Overall amount of support (Ft) year \n", + "0 6482826 7203140 2022 \n", + "1 720314 7203140 2022 \n", + "2 93796 4799322 2022 \n", + "3 1671436 4799322 2022 \n", + "4 3034090 4799322 2022 \n", + "5 2925000 2925000 2022 \n", + "6 873115 970128 2022 \n", + "7 97013 970128 2022 \n", + "8 17236254 22955377 2022 \n", + "9 1915140 22955377 2022 \n", + "10 3423584 22955377 2022 \n", + "11 380399 22955377 2022 \n", + "12 411042 4110423 2022 \n", + "13 3699381 4110423 2022 \n", + "14 1799931 1999923 2022 \n", + "15 199992 1999923 2022 \n", + "16 85563 855625 2022 \n", + "17 770062 855625 2022 \n", + "18 1110237 1233597 2022 \n", + "19 123360 1233597 2022 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv(\"./tamkereso_1000081/export.csv\", encoding='latin-1', delimiter=';', converters={'Postal code': str})\n", + "df[\"year\"] = 2022\n", + "df.head(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Name of beneficiary', 'Postal code', 'Municipality', 'Address',\n", + " 'Measure', 'FUND', 'Resource', 'Amount of support (Ft)',\n", + " 'Overall amount of support (Ft)', 'year'],\n", + " dtype='object')" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recipient_namerecipient_postcoderecipient_locationrecipient_addressscheme_detailFUNDResourceamountOverall amount of support (Ft)yearscheme
0\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU648282672031402022RDP-M19.2.1 - Implementation of LDSs strategie...
1\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National72031472031402022RDP-M19.2.1 - Implementation of LDSs strategie...
2\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/AReimbursement of financial disciplineEAGFEU9379647993222022Reimbursement of financial discipline (EAGF, EU)
3\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/APayments for agricultural practises beneficial...EAGFEU167143647993222022Payments for agricultural practises beneficial...
4\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/ASingle area payment scheme (SAPS)EAGFEU303409047993222022Single area payment scheme (SAPS) (EAGF, EU)
\n", + "
" + ], + "text/plain": [ + " recipient_name recipient_postcode \\\n", + "0 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "1 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "2 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "3 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "4 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "\n", + " recipient_location recipient_address \\\n", + "0 Csurgó Poldini Ede utca 1. \n", + "1 Csurgó Poldini Ede utca 1. \n", + "2 Gérce Kossuth Lajos utca 15/A \n", + "3 Gérce Kossuth Lajos utca 15/A \n", + "4 Gérce Kossuth Lajos utca 15/A \n", + "\n", + " scheme_detail FUND Resource \\\n", + "0 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "1 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "2 Reimbursement of financial discipline EAGF EU \n", + "3 Payments for agricultural practises beneficial... EAGF EU \n", + "4 Single area payment scheme (SAPS) EAGF EU \n", + "\n", + " amount Overall amount of support (Ft) year \\\n", + "0 6482826 7203140 2022 \n", + "1 720314 7203140 2022 \n", + "2 93796 4799322 2022 \n", + "3 1671436 4799322 2022 \n", + "4 3034090 4799322 2022 \n", + "\n", + " scheme \n", + "0 RDP-M19.2.1 - Implementation of LDSs strategie... \n", + "1 RDP-M19.2.1 - Implementation of LDSs strategie... \n", + "2 Reimbursement of financial discipline (EAGF, EU) \n", + "3 Payments for agricultural practises beneficial... \n", + "4 Single area payment scheme (SAPS) (EAGF, EU) " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = df.rename(columns={\n", + " 'Amount of support (Ft)': 'amount',\n", + " 'Name of beneficiary': 'recipient_name',\n", + " 'Postal code': 'recipient_postcode',\n", + " 'Address': 'recipient_address',\n", + " 'Municipality': 'recipient_location',\n", + " 'Measure': 'scheme_detail'\n", + " })\n", + "df['recipient_name'] = df['recipient_name'].apply(lambda x: np.nan if x == 'magánszemély' else x)\n", + "df['scheme'] = df.apply(lambda x: '%s (%s, %s)' % (x['scheme_detail'], x['FUND'], x['Resource']), 1)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recipient_namerecipient_postcoderecipient_locationrecipient_addressamountOverall amount of support (Ft)yearschemecurrencycountry
0\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.648282672031402022RDP-M19.2.1 - Implementation of LDSs strategie...HUFHU
1\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.72031472031402022RDP-M19.2.1 - Implementation of LDSs strategie...HUFHU
2\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/A9379647993222022Reimbursement of financial discipline (EAGF, EU)HUFHU
3\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/A167143647993222022Payments for agricultural practises beneficial...HUFHU
4\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/A303409047993222022Single area payment scheme (SAPS) (EAGF, EU)HUFHU
\n", + "
" + ], + "text/plain": [ + " recipient_name recipient_postcode \\\n", + "0 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "1 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "2 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "3 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "4 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "\n", + " recipient_location recipient_address amount \\\n", + "0 Csurgó Poldini Ede utca 1. 6482826 \n", + "1 Csurgó Poldini Ede utca 1. 720314 \n", + "2 Gérce Kossuth Lajos utca 15/A 93796 \n", + "3 Gérce Kossuth Lajos utca 15/A 1671436 \n", + "4 Gérce Kossuth Lajos utca 15/A 3034090 \n", + "\n", + " Overall amount of support (Ft) year \\\n", + "0 7203140 2022 \n", + "1 7203140 2022 \n", + "2 4799322 2022 \n", + "3 4799322 2022 \n", + "4 4799322 2022 \n", + "\n", + " scheme currency country \n", + "0 RDP-M19.2.1 - Implementation of LDSs strategie... HUF HU \n", + "1 RDP-M19.2.1 - Implementation of LDSs strategie... HUF HU \n", + "2 Reimbursement of financial discipline (EAGF, EU) HUF HU \n", + "3 Payments for agricultural practises beneficial... HUF HU \n", + "4 Single area payment scheme (SAPS) (EAGF, EU) HUF HU " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['currency'] = 'HUF'\n", + "df['country'] = 'HU'\n", + "del df[\"FUND\"]\n", + "del df[\"Resource\"]\n", + "del df[\"scheme_detail\"]\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "639786" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df[df['recipient_name'].notnull()])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "639786" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "415" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df['scheme'].value_counts())" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recipient_namerecipient_postcoderecipient_locationrecipient_addressamountOverall amount of support (Ft)yearschemecurrencycountry
0\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.648282672031402022RDP-M19.2.1 - Implementation of LDSs strategie...HUFHU
1\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.72031472031402022RDP-M19.2.1 - Implementation of LDSs strategie...HUFHU
2\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/A9379647993222022Reimbursement of financial discipline (EAGF, EU)HUFHU
3\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/A167143647993222022Payments for agricultural practises beneficial...HUFHU
4\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/A303409047993222022Single area payment scheme (SAPS) (EAGF, EU)HUFHU
\n", + "
" + ], + "text/plain": [ + " recipient_name recipient_postcode \\\n", + "0 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "1 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "2 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "3 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "4 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "\n", + " recipient_location recipient_address amount \\\n", + "0 Csurgó Poldini Ede utca 1. 6482826 \n", + "1 Csurgó Poldini Ede utca 1. 720314 \n", + "2 Gérce Kossuth Lajos utca 15/A 93796 \n", + "3 Gérce Kossuth Lajos utca 15/A 1671436 \n", + "4 Gérce Kossuth Lajos utca 15/A 3034090 \n", + "\n", + " Overall amount of support (Ft) year \\\n", + "0 7203140 2022 \n", + "1 7203140 2022 \n", + "2 4799322 2022 \n", + "3 4799322 2022 \n", + "4 4799322 2022 \n", + "\n", + " scheme currency country \n", + "0 RDP-M19.2.1 - Implementation of LDSs strategie... HUF HU \n", + "1 RDP-M19.2.1 - Implementation of LDSs strategie... HUF HU \n", + "2 Reimbursement of financial discipline (EAGF, EU) HUF HU \n", + "3 Payments for agricultural practises beneficial... HUF HU \n", + "4 Single area payment scheme (SAPS) (EAGF, EU) HUF HU " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "df.to_csv('hu_2022.csv', encoding='utf-8', index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From e9634bfe1b3851fada9d4794248e56d3c90e4de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Sun, 5 Nov 2023 13:02:42 +0100 Subject: [PATCH 15/38] EU: Cool URIs always change --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index edbdafa..ac1a686 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Developer Documentation Developer documentation for both website and scrapers can be found at http://farmsubsidy.readthedocs.org. -[Member states data sites](http://ec.europa.eu/agriculture/cap-funding/beneficiaries/shared/index_en.htm) +[Member states data sites](https://agriculture.ec.europa.eu/common-agricultural-policy/financing-cap/beneficiaries_en) [Financial Reports](http://ec.europa.eu/agriculture/cap-funding/financial-reports/index_en.htm) From 045ecad2d68c2705ac35ce3b581b11161be43122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Sun, 5 Nov 2023 13:03:32 +0100 Subject: [PATCH 16/38] here as well -.- --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ac1a686..e6b585b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ FarmSubsidy.org Scrapers ======================== -[FarmSubsidy](http://farmsubsidy.openspending.org/) is a website that collects the payment data of the Common Agriculture Policy (CAP) which represents about a third of the EU budget. It was run by a group of journalists and activists for the past years. In 2013 the [OpenSpending project](http://openspending.org/) of the [Open Knowledge Foundation](http://okfn.org/) took over responsibility of the website. +[FarmSubsidy](https://farmsubsidy.org) is a website that collects the payment data of the Common Agriculture Policy (CAP) which represents about a third of the EU budget. It was run by a group of journalists and activists for the past years. In 2013 the [OpenSpending project](http://openspending.org/) of the [Open Knowledge Foundation](http://okfn.org/) took over responsibility of the website. The FarmSubsidy data is mostly scraped from member state websites. The old scrapers were working well, but were running in costly and proprietary software. This year we need Free and Open Source scrapers and this repository will collect these scrapers and coordinate the effort. From 6840e9bb0f7a32c6058671a0f2a2e8a81192d888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Tue, 7 Nov 2023 15:40:44 +0100 Subject: [PATCH 17/38] BE: slugify --- be/be_scraper.ipynb | 232 +++++++++++++++++++++++++-------------- be/be_scraper_2017.ipynb | 24 ++-- 2 files changed, 167 insertions(+), 89 deletions(-) diff --git a/be/be_scraper.ipynb b/be/be_scraper.ipynb index 311f339..a502d9b 100644 --- a/be/be_scraper.ipynb +++ b/be/be_scraper.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 11, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -16,19 +16,25 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "YEAR = 2022\n", - "BUDGET_YEAR = 300 # check on website\n", + "YEAR = 2021\n", "LIMIT = 1000\n", - "BASE_URL = 'https://www.belpa.be/wsExportDataTable?limit={limit}&offset={offset}&lg=fr&budget_year={budget_year}&sort=none&&sortType=ASC&'" + "# From select dropdown value\n", + "BUDGET_YEARS = {\n", + " 2018: 54,\n", + " 2019: 289,\n", + " 2020: 291,\n", + " 2021: 292,\n", + "}\n", + "BASE_URL = 'https://www.belpa.be/wsExportDataTable?limit={limit}&offset={offset}&lg=fr&budget_year=' + str(BUDGET_YEARS[YEAR]) + '&sort=none&&sortType=ASC&'" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -37,15 +43,51 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "38000\n", - "https://www.belpa.be/wsExportDataTable?limit=1000&offset=38000&lg=fr&budget_year=300&sort=none&&sortType=ASC&\n" + "0\n", + "1000\n", + "2000\n", + "3000\n", + "4000\n", + "5000\n", + "6000\n", + "7000\n", + "8000\n", + "9000\n", + "10000\n", + "11000\n", + "12000\n", + "13000\n", + "14000\n", + "15000\n", + "16000\n", + "17000\n", + "18000\n", + "19000\n", + "20000\n", + "21000\n", + "22000\n", + "23000\n", + "24000\n", + "25000\n", + "26000\n", + "27000\n", + "28000\n", + "29000\n", + "30000\n", + "31000\n", + "32000\n", + "33000\n", + "34000\n", + "35000\n", + "36000\n", + "37000\n" ] } ], @@ -57,13 +99,10 @@ " offset += LIMIT\n", " continue\n", " print(offset)\n", - " url = BASE_URL.format(\n", + " response = requests.get(BASE_URL.format(\n", " limit=LIMIT,\n", - " offset=offset,\n", - " budget_year=BUDGET_YEAR\n", - " )\n", - " print(url)\n", - " response = requests.get(url)\n", + " offset=offset\n", + " ))\n", " data = response.json()\n", " with open(filename, 'w') as f:\n", " json.dump(data['data'][0], f)\n", @@ -74,7 +113,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -112,85 +151,85 @@ " \n", " \n", " 0\n", - " CORNET ALBERT\n", - " BE-6987\n", - " Rendeux\n", - " 2022\n", - " feader\n", - " 293.50\n", + " BLAISE FERNAND\n", + " BE-4800\n", + " Verviers\n", + " 2021\n", + " ii1\n", + " 1880.73\n", " EUR\n", " BE\n", - " BE-2022-8282\n", + " BE-2021-7996\n", " \n", " \n", " 1\n", - " CORNET ALBERT\n", - " BE-6987\n", - " Rendeux\n", - " 2022\n", - " ii1\n", - " 476.99\n", + " BLAISE FERNAND\n", + " BE-4800\n", + " Verviers\n", + " 2021\n", + " ii3\n", + " 3364.43\n", " EUR\n", " BE\n", - " BE-2022-8282\n", + " BE-2021-7996\n", " \n", " \n", " 2\n", - " CORNET ALBERT\n", - " BE-6987\n", - " Rendeux\n", - " 2022\n", - " ii3\n", - " 722.01\n", + " BLAISE FERNAND\n", + " BE-4800\n", + " Verviers\n", + " 2021\n", + " ii4\n", + " 1741.11\n", " EUR\n", " BE\n", - " BE-2022-8282\n", + " BE-2021-7996\n", " \n", " \n", " 3\n", - " CORNET ALBERT\n", - " BE-6987\n", - " Rendeux\n", - " 2022\n", - " ii4\n", - " 454.09\n", + " BLAISE FERNAND\n", + " BE-4800\n", + " Verviers\n", + " 2021\n", + " ii7\n", + " 3079.15\n", " EUR\n", " BE\n", - " BE-2022-8282\n", + " BE-2021-7996\n", " \n", " \n", " 4\n", - " CORNET ALBERT\n", - " BE-6987\n", - " Rendeux\n", - " 2022\n", - " iv18\n", - " 293.50\n", + " BLAISE FERNAND\n", + " BE-4800\n", + " Verviers\n", + " 2021\n", + " ii10\n", + " 121.15\n", " EUR\n", " BE\n", - " BE-2022-8282\n", + " BE-2021-7996\n", " \n", " \n", "\n", "" ], "text/plain": [ - " recipient_name recipient_postcode recipient_location year scheme amount \\\n", - "0 CORNET ALBERT BE-6987 Rendeux 2022 feader 293.50 \n", - "1 CORNET ALBERT BE-6987 Rendeux 2022 ii1 476.99 \n", - "2 CORNET ALBERT BE-6987 Rendeux 2022 ii3 722.01 \n", - "3 CORNET ALBERT BE-6987 Rendeux 2022 ii4 454.09 \n", - "4 CORNET ALBERT BE-6987 Rendeux 2022 iv18 293.50 \n", + " recipient_name recipient_postcode recipient_location year scheme amount \\\n", + "0 BLAISE FERNAND BE-4800 Verviers 2021 ii1 1880.73 \n", + "1 BLAISE FERNAND BE-4800 Verviers 2021 ii3 3364.43 \n", + "2 BLAISE FERNAND BE-4800 Verviers 2021 ii4 1741.11 \n", + "3 BLAISE FERNAND BE-4800 Verviers 2021 ii7 3079.15 \n", + "4 BLAISE FERNAND BE-4800 Verviers 2021 ii10 121.15 \n", "\n", " currency country recipient_id \n", - "0 EUR BE BE-2022-8282 \n", - "1 EUR BE BE-2022-8282 \n", - "2 EUR BE BE-2022-8282 \n", - "3 EUR BE BE-2022-8282 \n", - "4 EUR BE BE-2022-8282 " + "0 EUR BE BE-2021-7996 \n", + "1 EUR BE BE-2021-7996 \n", + "2 EUR BE BE-2021-7996 \n", + "3 EUR BE BE-2021-7996 \n", + "4 EUR BE BE-2021-7996 " ] }, - "execution_count": 15, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -198,7 +237,7 @@ "source": [ "def parse_data(data):\n", " for amount_key in data['amount'].keys():\n", - " if amount_key.endswith(('_total', '_feaga')):\n", + " if amount_key.endswith(('_total', '_feaga', '_feader')):\n", " # ignore total and total of feaga (sub feaga amounts are present)\n", " continue\n", " scheme = amount_key.replace('field_mnt_', '')\n", @@ -226,44 +265,73 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "df.to_csv('be_{}.csv.gz'.format(YEAR), index=False, encoding='utf-8', compression='gzip')" - ] - }, - { - "cell_type": "code", - "execution_count": 17, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "171625" + "ii4 33446\n", + "ii1 33438\n", + "ii10 28732\n", + "ii3 13186\n", + "iva15 11530\n", + "ii7 9050\n", + "iva18 5366\n", + "iva17 2998\n", + "iva16 2177\n", + "ii6 1820\n", + "iva4 1781\n", + "iii3 1252\n", + "i1 1050\n", + "iva6 438\n", + "vb1_6 340\n", + "iva24 187\n", + "iva9 121\n", + "vb1_2 91\n", + "iva7 87\n", + "iva21 82\n", + "iva1 30\n", + "iva12 25\n", + "vb2_4 20\n", + "iva25 20\n", + "iva2 16\n", + "iva10 11\n", + "iii4 9\n", + "i4 6\n", + "iii2 5\n", + "iii7 4\n", + "iva14 4\n", + "vb3_1 4\n", + "iii10 3\n", + "i7 2\n", + "via_1 1\n", + "iva8 1\n", + "Name: scheme, dtype: int64" ] }, - "execution_count": 17, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "len(df)" + "df['scheme'].value_counts()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "df.to_csv('be_{}.csv.gz'.format(YEAR), index=False, encoding='utf-8', compression='gzip')" + ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -277,9 +345,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.18" + "version": "3.10.6" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/be/be_scraper_2017.ipynb b/be/be_scraper_2017.ipynb index e66ea3b..1cc7c61 100644 --- a/be/be_scraper_2017.ipynb +++ b/be/be_scraper_2017.ipynb @@ -74,11 +74,21 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (101655267.py, line 2)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m Input \u001b[0;32mIn [1]\u001b[0;36m\u001b[0m\n\u001b[0;31m import slugify import slugify\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], "source": [ - "import pandas as pd" + "import pandas as pd\n", + "from slugify import slugify" ] }, { @@ -784,7 +794,7 @@ "df['country'] = 'BE'\n", "\n", "def generate_id(row):\n", - " return u'BE-%s-%s' % (row['recipient_postcode'], row['recipient_name'])\n", + " return u'BE-%s' % slugify(row['recipient_name'], row['recipient_postcode'], row['recipient_name'])\n", "\n", "df['recipient_id'] = df.apply(generate_id, 1)\n", "df.head()" @@ -824,7 +834,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -838,9 +848,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.10.4" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From d15ec4cf193348e27673ec5a71d500df4da6e2aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Thu, 9 Nov 2023 09:10:03 +0100 Subject: [PATCH 18/38] MT: add a bad notebook --- mt/scraper_mt-bad.ipynb | 250 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 mt/scraper_mt-bad.ipynb diff --git a/mt/scraper_mt-bad.ipynb b/mt/scraper_mt-bad.ipynb new file mode 100644 index 0000000..d087c4d --- /dev/null +++ b/mt/scraper_mt-bad.ipynb @@ -0,0 +1,250 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Scraper MT\n", + "\n", + "This is an unfinished debug scraper to fix the scrapy scraper." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "from lxml import html\n", + "\n", + "from multidict import MultiDict" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "YEAR = 2019\n", + "BASE_URL = 'https://agrikoltura.gov.mt/en/arpa/Pages/PaymentSearch/EAGFPayments.aspx'\n", + "\n", + "HEADERS = {\n", + " 'Connection': 'keep-alive',\n", + " 'Pragma': 'no-cache',\n", + " 'Cache-Control': 'no-cache',\n", + " 'Origin': 'https://msdec.gov.mt',\n", + " 'Upgrade-Insecure-Requests': '1',\n", + " 'DNT': '1',\n", + " 'Content-Type': 'application/x-www-form-urlencoded',\n", + " 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',\n", + " 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',\n", + " 'Referer': 'https://msdec.gov.mt/en/arpa/Pages/Payments.aspx',\n", + " 'Accept-Encoding': 'gzip, deflate, br',\n", + " 'Accept-Language': 'en-US,en;q=0.9,de;q=0.8',\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def get_form_data_from_form(form):\n", + " form_data = MultiDict()\n", + " for el in form.xpath('.//input[@name]|.//select[@name]|.//textarea[@name]|.//button[@name]'):\n", + " data = {}\n", + " if el.tag == 'input':\n", + " if el.attrib.get('type') == 'radio' or el.attrib.get('type') == 'checkbox':\n", + " if el.attrib.get('checked', None):\n", + " data[el.attrib['name']] = el.attrib.get('value', '')\n", + " else:\n", + " data[el.attrib['name']] = el.attrib.get('value', '')\n", + " elif el.tag == 'select':\n", + " options = el.xpath('./option[@selected]')\n", + " if options:\n", + " data[el.attrib['name']] = options[0].attrib.get('value', '')\n", + " else:\n", + " data[el.attrib['name']] = ''\n", + " elif el.tag == 'textarea':\n", + " data[el.sttrib['name']] = el.text or ''\n", + " elif el.tag == 'button':\n", + " if el.attrib.get('type', None) == 'submit':\n", + " data[el.attrib['name']] = el.attrib.get('value', '')\n", + " form_data.extend(data)\n", + " return form_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "session = requests.Session()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "get_response = session.get(BASE_URL)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "root = html.fromstring(get_response.content)\n", + "form_data = get_form_data_from_form(root.xpath('//form')[0])\n", + "\n", + "form_data.update({\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$AELSg_c7852a28_8677_47de_bf51_102e5afe2ae8combo5': str(YEAR),\n", + " '__SCROLLPOSITIONX': '0',\n", + " '__SCROLLPOSITIONY': '0',\n", + " '__LASTFOCUS': '',\n", + " 'search': '0',\n", + " '__EVENTARGUMENT': '',\n", + " 'hiddenInputToUpdateATBuffer_CommonToolkitScripts': '1',\n", + " '__EVENTTARGET': '',\n", + " 'InputKeywords': 'Search',\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "response = session.post(BASE_URL, data=form_data, headers=HEADERS)\n", + "response" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "cookies = {\n", + " 'ISAWPLB{57C3C324-9678-4645-92E4-C5C8021907F0}': '{0522A075-2DF2-4AC9-BC79-4095D0BF864C}',\n", + " '__utma': '164950819.2137698559.1542035923.1542035923.1542035923.1',\n", + " '__utmb': '164950819',\n", + " '__utmc': '164950819',\n", + " '__utmz': '164950819.1542035923.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)',\n", + "}\n", + "\n", + "\n", + "\n", + "data = {\n", + " '_wpcmWpid': '',\n", + " 'wpcmVal': '',\n", + " 'MSOWebPartPage_PostbackSource': '',\n", + " 'MSOTlPn_SelectedWpId': '',\n", + " 'MSOTlPn_View': '0',\n", + " 'MSOTlPn_ShowSettings': 'False',\n", + " 'MSOGallery_SelectedLibrary': '',\n", + " 'MSOGallery_FilterString': '',\n", + " 'MSOTlPn_Button': 'none',\n", + " '__EVENTTARGET': '',\n", + " '__EVENTARGUMENT': '',\n", + " '__REQUESTDIGEST': '0x25E0A6F64E459775F08145410EB827793E5715E82EE7E96E7CD7AC139DEA803E9A7556D9AF6C3D0EAAD7DC7B96D59C122338C25375B118C42A4F88BDCD2A189A,12 Nov 2018 15:18:53 -0000',\n", + " 'MSOSPWebPartManager_DisplayModeName': 'Browse',\n", + " 'MSOSPWebPartManager_ExitingDesignMode': 'false',\n", + " 'MSOWebPartPage_Shared': '',\n", + " 'MSOLayout_LayoutChanges': '',\n", + " 'MSOLayout_InDesignMode': '',\n", + " '_wpSelected': '',\n", + " '_wzSelected': '',\n", + " 'MSOSPWebPartManager_OldDisplayModeName': 'Browse',\n", + " 'MSOSPWebPartManager_StartWebPartEditingName': 'false',\n", + " 'MSOSPWebPartManager_EndWebPartEditing': 'false',\n", + " '_maintainWorkspaceScrollPosition': '0',\n", + " '__LASTFOCUS': '',\n", + " '__VIEWSTATE': '/wEPDwUBMA9kFgJmD2QWAgIBD2QWBAIBD2QWAgILD2QWAmYPZBYCAgEPFgIeE1ByZXZpb3VzQ29udHJvbE1vZGULKYgBTWljcm9zb2Z0LlNoYXJlUG9pbnQuV2ViQ29udHJvbHMuU1BDb250cm9sTW9kZSwgTWljcm9zb2Z0LlNoYXJlUG9pbnQsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49NzFlOWJjZTExMWU5NDI5YwFkAgMPZBYIAgMPZBYIBSZnX2M3ODUyYTI4Xzg2NzdfNDdkZV9iZjUxXzEwMmU1YWZlMmFlOA8PFgQeCENzc0NsYXNzBQRBRUxTHgRfIVNCAgJkFgYCCg8QDxYCHgtfIURhdGFCb3VuZGdkEBVIAAtBVFRBUkQgKE1MKQlBVVNUUkFMSUELQkFMWkFOIChNTCkKQklSR1UgKE1MKQ9CSVJLSVJLQVJBIChNTCkQQklSWkVCQlVHSUEgKE1MKQtCT1JNTEEgKE1MKQ1CUlVTU0VMUyAoQkUpC0RJTkdMSSAoTUwpCkZHVVJBIChNTCkNRkxPUklBTkEgKE1MKQxGT05UQU5BIChHWikQR0hBSk5TSUVMRU0gKEdaKQpHSEFSQiAoR1opDUdIQVJHSFVSIChNTCkLR0hBU1JJIChHWikLR0hBWEFRIChNTCkKR1VESkEgKE1MKQpHWklSQSAoTUwpC0hBTVJVTiAoTUwpCklLTElOIChNTCkJSVNMQSAoTUwpDEtBTEtBUkEgKE1MKQtLRVJDRU0gKEdaKQtLSVJLT1AgKE1MKQlMSUpBIChNTCkJTFVRQSAoTUwpDE1BTlRPVkEgKElUKQpNQVJTQSAoTUwpD01BUlNBU0NBTEEgKE1MKQ9NQVJTQVhMT0tLIChNTCkKTURJTkEgKE1MKQ1NRUxMSUVIQSAoTUwpCk1HQVJSIChNTCkKTU9TVEEgKE1MKQtNUUFCQkEgKE1MKQpNU0lEQSAoTUwpC01UQVJGQSAoTUwpC01VTlhBUiAoR1opCk5BRFVSIChHWikLTkFYWEFSIChNTCkKUEFPTEEgKE1MKQ1QRU1CUk9LRSAoTUwpClBJRVRBIChNTCkJUUFMQSAoR1opClFPUk1JIChNTCkLUVJFTkRJIChNTCkSUkFCQVQgKE1hbHRhKSAoTUwpFVJBQkFUIChWaWN0b3JpYSkgKEdaKQlTQUZJIChNTCkPU0FOIEdJTEpBTiAoTUwpDlNBTiBHV0FOTiAoTUwpEFNBTiBMQVdSRU5aIChHWikWU0FOIFBBV0wgSUwtQkFIQVIgKE1MKQtTQU5OQVQgKEdaKRFTQU5UQSBMVUNJSkEgKE1MKRFTQU5UQSBWRU5FUkEgKE1MKQ1TSUdHSUVXSSAoTUwpC1NMSUVNQSAoTUwpC1NXSUVRSSAoTUwpD1RBJyAgWEJJRVggKE1MKQxUQVJYSUVOIChNTCkNVkFMTEVUVEEgKE1MKQtYQUdIUkEgKEdaKQxYRVdLSUpBIChHWikMWEdIQUpSQSAoTUwpC1pBQkJBUiAoTUwpFVpFQkJVRyAoR2hhd2RleCkgKEdaKRNaRUJCVUcgKE1hbHRhKSAoTUwpC1pFSlRVTiAoTUwpDFpVUlJJRVEgKE1MKRVIAAtBVFRBUkQgKE1MKQlBVVNUUkFMSUELQkFMWkFOIChNTCkKQklSR1UgKE1MKQ9CSVJLSVJLQVJBIChNTCkQQklSWkVCQlVHSUEgKE1MKQtCT1JNTEEgKE1MKQ1CUlVTU0VMUyAoQkUpC0RJTkdMSSAoTUwpCkZHVVJBIChNTCkNRkxPUklBTkEgKE1MKQxGT05UQU5BIChHWikQR0hBSk5TSUVMRU0gKEdaKQpHSEFSQiAoR1opDUdIQVJHSFVSIChNTCkLR0hBU1JJIChHWikLR0hBWEFRIChNTCkKR1VESkEgKE1MKQpHWklSQSAoTUwpC0hBTVJVTiAoTUwpCklLTElOIChNTCkJSVNMQSAoTUwpDEtBTEtBUkEgKE1MKQtLRVJDRU0gKEdaKQtLSVJLT1AgKE1MKQlMSUpBIChNTCkJTFVRQSAoTUwpDE1BTlRPVkEgKElUKQpNQVJTQSAoTUwpD01BUlNBU0NBTEEgKE1MKQ9NQVJTQVhMT0tLIChNTCkKTURJTkEgKE1MKQ1NRUxMSUVIQSAoTUwpCk1HQVJSIChNTCkKTU9TVEEgKE1MKQtNUUFCQkEgKE1MKQpNU0lEQSAoTUwpC01UQVJGQSAoTUwpC01VTlhBUiAoR1opCk5BRFVSIChHWikLTkFYWEFSIChNTCkKUEFPTEEgKE1MKQ1QRU1CUk9LRSAoTUwpClBJRVRBIChNTCkJUUFMQSAoR1opClFPUk1JIChNTCkLUVJFTkRJIChNTCkSUkFCQVQgKE1hbHRhKSAoTUwpFVJBQkFUIChWaWN0b3JpYSkgKEdaKQlTQUZJIChNTCkPU0FOIEdJTEpBTiAoTUwpDlNBTiBHV0FOTiAoTUwpEFNBTiBMQVdSRU5aIChHWikWU0FOIFBBV0wgSUwtQkFIQVIgKE1MKQtTQU5OQVQgKEdaKRFTQU5UQSBMVUNJSkEgKE1MKRFTQU5UQSBWRU5FUkEgKE1MKQ1TSUdHSUVXSSAoTUwpC1NMSUVNQSAoTUwpC1NXSUVRSSAoTUwpD1RBJyAgWEJJRVggKE1MKQxUQVJYSUVOIChNTCkNVkFMTEVUVEEgKE1MKQtYQUdIUkEgKEdaKQxYRVdLSUpBIChHWikMWEdIQUpSQSAoTUwpC1pBQkJBUiAoTUwpFVpFQkJVRyAoR2hhd2RleCkgKEdaKRNaRUJCVUcgKE1hbHRhKSAoTUwpC1pFSlRVTiAoTUwpDFpVUlJJRVEgKE1MKRQrA0hnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dkZAIPDxAPFgIfA2dkEBWdJAABLwU0NjEwMAQ1MDQ0B0FURDExMTMHQVREMTE3MAdBVEQxMjM0B0FURDE0MDYHQVREMTQxMQdBVEQxNDI4B0FURDE0MzEHQVREMTQzOAdBVEQxNTAyB0FURDE1MDMHQVREMTUwNAdBVEQxNTIxB0FURDE1MzEHQVREMTYyNAdBVEQxNjMxB0FURDE3NDEHQVREMTc2MwdBVEQxODIxB0FURDE4NzAHQVREMTkwNwdBVEQxOTIwB0FURDE5NjAHQVREMTk3MAdBVEQyMDI0B0FURDIwMjcHQVREMjAyOQdBVEQyMDY5B0FURDIwODMHQVREMjIxNAdBVEQyMjczB0FURDIzMzYHQVREMjMzOAdBVEQyMzQzB0FURDIzNjQHQVREMjM3MQdBVEQyMzgwB0FURDI0NTAHQVREMjQ1MwdBVEQyNTExB0FURDI1MzAHQVREMjYwNQdBVEQyNjEwB0FURDI3MDYHQVREMjcwNwdBVEQyNzMyB0FURDI3MzMHQVREMjc1MgdBVEQyNzYwB0FURDI3NzIHQVREMjc3NwdBVEQyNzgwB0FURDI3ODEHQVREMjg0MwdBVEQyODUwB0FURDI5MDEHQVREMjk2MAdBVEQzMDE3B0FURDMwMzIHQVREMzA1MAdBVEQzMDYwB0FURDMwODAHQVREMzExMQdBVEQzMTE3B0FURDQwMDAHQVRENDA5NQdBVEQ0ODkwB0FURDkwMzYHQVREOTAzNwdBVEQ5MDQxB0FURDkwNDIHQVREOTA1NgdBVFQyNTExB0JCRzEwMTQHQkJHMTA1MAdCQkcxMDYwB0JCRzExMDQHQkJHMTIzMAdCQkcxMjQzB0JCRzEyNDUHQkJHMTI1MwdCQkcxMjcwB0JCRzEyNzMHQkJHMTMzNAdCQkcxMzM1B0JCRzE0NzIHQkJHMTYzMwdCQkcxNjY1B0JCRzE2ODQHQkJHMTY4NgdCQkcxNjg3B0JCRzE2OTEHQkJHMTcwMQdCQkcxNzEzB0JCRzE3NTIHQkJHMTc1OAdCQkcxNzcyB0JCRzE4MDEHQkJHMTgwMwdCQkcxODM1B0JCRzE4NDUHQkJHMTg0NgdCQkcxODUyB0JCRzE4NjAHQkJHMTkwMgdCQkcxOTA2B0JCRzE5MDkHQkJHMTkxNAdCQkcxOTIxB0JCRzE5MjIHQkJHMTkyOAdCQkcxOTMzB0JCRzE5NDMHQkJHMTk1MgdCQkcxOTUzB0JCRzE5NjAHQkJHMjAxMAdCQkcyMDIxB0JCRzIwMjYHQkJHMjAyOAdCQkcyMDI5B0JCRzIwNjEHQkJHMjEwMgdCQkcyMTA0B0JCRzIxMDkHQkJHMjExMAdCQkcyMTIyB0JCRzIxNDAHQkJHMjE3MAdCQkcyMTczB0JCRzIyNDAHQkJHMjI1MQdCQkcyMjUyB0JCRzIyNTMHQkJHMjI2MAdCQkcyMjYxB0JCRzIyNzEHQkJHMjI4MwdCQkcyMjkyB0JCRzIyOTUHQkJHMjMwMQdCQkcyMzA0B0JCRzIzNDAHQkJHMjM0NAdCQkcyMzQ2B0JCRzIzNDcHQkJHMjQwMAdCQkcyNDEwB0JCRzI0MTQHQkJHMjQyNAdCQkcyNDMwB0JCRzI0NTEHQkJHMjUwNAdCQkcyNTA1B0JCRzI1NDEHQkJHMjU1MQdCQkcyNTYxB0JCRzI1NzYHQkJHMjYwMAdCQkcyNjAzB0JCRzI2MDgHQkJHMjYzMwdCQkcyNjQwB0JCRzI2NDcHQkJHMjY1MQdCQkcyNzIxB0JCRzI3NDAHQkJHMjc3MQdCQkcyNzczB0JCRzI3NzUHQkJHMjc3NgdCQkcyNzgwB0JCRzI3ODIHQkJHMzA0NAdCQkczMDcxB0JCRzMwNzMHQkJHMzA3NQdCQkczMTIxB0JCRzMxNDEHQkJHMzIxMQdCQkc5MDE0B0JCRzkwMzQHQktSMTAzMgdCS1IxMTExB0JLUjExMzUHQktSMTE1MgdCS1IxMTU0B0JLUjExNTcHQktSMTIxNAdCS1IxMjE3B0JLUjEyMTgHQktSMTI2MAdCS1IxMjcwB0JLUjEyNzcHQktSMTU2MAdCS1IxNzUzB0JLUjE3NzAHQktSMTc4MAdCS1IxODAyB0JLUjE4MDcHQktSMTg1MQdCS1IxODcxB0JLUjE4NzMHQktSMTk1MAdCS1IxOTczB0JLUjIwMTIHQktSMjA4MAdCS1IyMTAzB0JLUjIxNTQHQktSMjI4NgdCS1IyMzI2B0JLUjI0MzEHQktSMjQ3MAdCS1IyNDczB0JLUjI1MjUHQktSMjU1MgdCS1IyNjkxB0JLUjI2OTQHQktSMjY5OAdCS1IyODA4B0JLUjI4NTMHQktSMjg5MAdCS1IyOTAxB0JLUjQwMTMHQktSNDAyMwdCS1I0MDQwB0JLUjQwNjIHQktSNDExMAdCS1I0MjE0B0JLUjQzNjMHQktSNDQ0MwdCS1I0NTE4B0JLUjQ1MjIHQktSNDUyMwdCS1I0NTMzB0JLUjQ1MzQHQktSNDUzNgdCS1I0NjAxB0JLUjQ4NTAHQktSOTAxMAdCS1I5MDEzB0JLUjkwMzgHQktSOTA2NQdCS1I5MDcyB0JLUjkwNzcHQk1MMTkxOAdCTUwyMjMyB0JNTDkwODAHQlJHOTAyMQdCUksxOTEwB0JaTjEwNDAHQlpOMTEyMAdCWk4xMTUzB0JaTjExNjIHQlpOMTMwMgdCWk4xNDIxB0JaTjE0MjcHQlpOMTUwNQdCWk4xNTEwB0JaTjE1MTEHQlpOMTUyMwdCWk4xNTM1B0RHTDAzMjQHREdMMDQzOAdER0wxMDExB0RHTDEwNDEHREdMMTA2MAdER0wxMDYxB0RHTDEwNzIHREdMMTEwMAdER0wxMTEwB0RHTDExMTEHREdMMTExMgdER0wxMTEzB0RHTDExMTYHREdMMTExOAdER0wxMTE5B0RHTDExMzAHREdMMTEzNgdER0wxMTUzB0RHTDExNzUHREdMMTIyMgdER0wxMjMxB0RHTDEyMzMHREdMMTIzNAdER0wxMjgwB0RHTDEyODEHREdMMTMwMQdER0wxMzAzB0RHTDEzMDcHREdMMTMxMwdER0wxMzMwB0RHTDEzNDIHREdMMTM0NAdER0wxMzU0B0RHTDEzNjIHREdMMTM2NQdER0wxMzgwB0RHTDEzODQHREdMMTM4OAdER0wxMzkxB0RHTDE1MDAHREdMMTUxMgdER0wxNTI0B0RHTDE1MzMHREdMMTU1NAdER0wxNTc2B0RHTDE1NzcHREdMMTU5MAdER0wxNTkyB0RHTDE1OTQHREdMMTU5NQdER0wxNzE3B0RHTDE3MTkHREdMMTczMQdER0wxNzMyB0RHTDE3MzQHREdMMTc0MQdER0wxNzQzB0RHTDE3NTAHREdMMTc1MQdER0wxNzU1B0RHTDE3NTYHREdMMTc1NwdER0wxODAyB0RHTDE4MjAHREdMMTgzMQdER0wxODM0B0RHTDE4MzUHREdMMTgzNgdER0wxODUwB0RHTDE4NzEHREdMMTg4MAdER0wxODgxB0RHTDE4OTAHREdMMTg5NAdER0wxOTAwB0RHTDE5MDMHREdMMTkwNQdER0wxOTIxB0RHTDE5NDAHREdMMjAyNQdER0wyMDMwB0RHTDIxMDEHREdMMjEwMgdER0wyMTA0B0RHTDIxMTAHREdMMjExMQdER0wyMTMwB0RHTDIxNDEHREdMMjE2MAdER0wyMTcxB0RHTDI0MTEHREdMMjcwMQdER0wyNzA5B0RHTDM1MDAHREdMMzUwMQdER0wzNTAyB0RHTDM1MDcHREdMMzUwOAdER0wzNTA5B0RHTDkwMTUHREdMOTAxNwdER0w5MDE4B0RORzEzMDUHRkdSMTAyOQdGR1IxMDM0B0ZHUjEwMzYHRkdSMTA0MgdGR1IxMDcxB0ZHUjExMzcHRkdSMTI0MwdGR1IxMjQ4B0ZHUjEyNjEHRkdSMTI3MQdGR1IxNDEwB0ZHUjE0MjEHRkdSMTQzMQdGR1IxNDQwB0ZHUjE0NDQHRkdSMTQ2MAdGR1IxNDYzB0ZHUjE0NzAHRkdSMTQ3MgdGR1IxNDgwB0ZHUjE2MTQHRkdSMTYxOAdGR1IxNjE5B0ZHUjE2NjEHRkdSMTY5MgdGR1IxNzAyB0ZHUjE4MzYHRkdSMTg1MQdGR1IxODUzB0ZHUjE4NTQHRkdSMTkzMAdGR1IxOTMzB0ZHUjE5NDUHRkdSMTk1MQdGR1IxOTcyB0ZHUjIwMTEHRkdSMjAxMgdGR1IyMDE4B0ZHUjIwMjEHRkdSMjA0MAdGR1IyMDUxB0ZHUjIwNjEHRkdSMjEwMwdGR1IyMTA1B0ZHUjIxMDgHRkdSMjE1NQdGR1IyMTcyB0ZHUjkwMzIHRkdSOTAzOAdGTlQxMDEzB0ZOVDEwMzAHRk5UMTAzMQdGTlQxMDQxB0ZOVDExMDAHRk5UMTExMQdGTlQxMTEyB0ZOVDExMTMHRk5UMTEyMQdGTlQxNDAxB0ZOVDE0MTEHRk5UMTQyMgdGTlQ5MDEzB0ZOVDkwMjMHRk5UOTAyNwdGTlQ5MDI4B0ZSTjEwNDAHRlJOMTcwMAdHREowMzE1B0dESjEwMTEHR0RKMTAxNAdHREoxMDIxB0dESjEwNDEHR0RKMTA0MgdHREoxMDYxB0dESjEwNjQHR0RKMTA2NQdHREoxMTAxB0dESjExMTEHR0RKMTExMgdHREoxMTUwB0dESjExNTIHR0RKMTE1MwdHREoxMTU0B0dESjEyMDYHR0RKMTIwOQdHREoxMjQwB0dESjEyNTEHR0RKMTI2MQdHREoxMjgwB0dESjEyODEHR0RKMTMwMAdHREoxMzA0B0dESjEzMTQHR0RKMTMyMQdHREoxMzMwB0dESjEzNDEHR0RKMTM1MQdHREoxNDExB0dESjE0MTIHR0RKMTQyMAdHREoxNDQ1B0dESjE0NTAHR0RKMTQ1MQdHREoxNDUyB0dESjE0NjEHR0RKMTY1MQdHREoxNjYwB0dESjE3MDAHR0RKMTcwMgdHREoxNzAzB0dESjE3MDUHR0RKMTcwNgdHREoxNzA4B0dESjE3MTEHR0RKMTcxMwdHREoxNzYxB0dESjE4MDEHR0RKMTgwMgdHREoxODExB0dESjE4MTIHR0RKMTgxMwdHREoxODUwB0dESjE4NTIHR0RKMTkxMAdHREoxOTIwB0dESjE5MjEHR0RKMTkzMAdHREoxOTQwB0dESjE5NDEHR0RKMjAxNwdHREoyMDIwB0dESjIwMjEHR0hSMTAxMgdHSFIxMDE0B0dIUjEwMjQHR0hSMTA1MwdHSFIxMTAzB0dIUjExMjEHR0hSMTE2MgdHSFIxMjEwB0dIUjEyMjEHR0hSMTIzMwdHSFIxMjY0B0dIUjEyNjcHR0hSMTMwMAdHSFIxMzAxB0dIUjEzMDIHR0hSMTMwNQdHSFIxMzUzB0dIUjE0MDAHR0hSMTQwNQdHSFIxNDYwB0dIUjE1MDEHR0hSMTUxMgdHSFIxNTE0B0dIUjE1MTUHR0hSMTUyMAdHSFIxNTIxB0dIUjE1MzEHR0hSMTUzNQdHSFIxNjA2B0dIUjE2MjIHR0hSMTYzMQdHSFIxNjYyB0dIUjE2NjQHR0hSMTcwMQdHSFIxODA0B0dIUjE4MDcHR0hSMTgxMAdHSFIyMDcwB0dIUjIxMDAHR1JCMTAxMAdHUkIxMDE0B0dSQjEwMTUHR1JCMTAyMwdHUkIxMDQwB0dSQjEwNDMHR1JCMTA0NAdHUkIxMDQ2B0dSQjEwNTAHR1JCMTA1MwdHUkIxMDU1B0dSQjEwNjUHR1JCMTA3MAdHUkIxMDcxB0dSQjEwNzIHR1JCMTA4MAdHUkIxMDgxB0dSQjEwODIHR1JCMTA4MwdHUkIxMTAxB0dSQjExMDIHR1JCMTEwMwdHUkIxMTIwB0dSQjExNDEHR1JCMTE2MQdHUkIxMjAwB0dSQjEyMDIHR1JCMTIxMAdHUkIxMjMxB0dSQjEyNjAHR1JCMTI3MAdHUkIxMzAwB0dSQjEzMjQHR1JCMTM0MAdHUkIxNDA0B0dSQjE0MDUHR1JCMTQzNgdHUkIxNDM3B0dSQjE1MDUHR1JCMTUyMQdHUkIxNTQxB0dSQjI0MzQHR1NNMTAyMAdHU00xMDQwB0dTTTEwNDEHR1NNMTEzMAdHU00xMTMxB0dTTTExODAHR1NNMTE4MwdHU00xMjAwB0dTTTEyMDEHR1NNMTIzMQdHU00xMjMzB0dTTTEyNDAHR1NNMTI0MQdHU00xMjQyB0dTTTEyNDMHR1NNMTI4MgdHU00xMzIzB0dTTTEzMjgHR1NNMTQxMQdHU00xNDEzB0dTTTE0NTEHR1NNMTUzMgdHU00xNTMzB0dTTTE1NTAHR1NNMTU1MgdHU00xNTcxB0dTTTE2MDAHR1NNMTYyMQdHU00xNjIyB0dTTTE2MjMHR1NNMTYzMQdHU00xNjQxB0dTTTE2NDMHR1NNMTgwMAdHU00xODAxB0dTTTE4MDMHR1NNMTgwNAdHU00xODA1B0dTTTE4MDcHR1NNMTkxMwdHU00xOTUxB0dTTTE5ODAHR1NNMTk5MAdHU00yMDExB0dTTTIwMTIHR1NNMjAxNAdHU00yMDE2B0dTTTIwMTgHR1NNMjAyMQdHU00yMDUwB0dTTTkwMTAHR1NNOTAxMgdHU005MDEzB0dTTTkwMTQHR1NNOTAxNQdHU005MDE5B0dTTTkwMjIHR1NNOTAyNwdHU005MDMzB0dTUjEwMjAHR1NSMTAyMQdHU1IxMDIzB0dTUjEwNDAHR1NSMTA2MAdHU1IxMTAwB0dTUjExMDEHR1NSMTEwMgdHU1IxMTAzB0dTUjExMDQHR1NSMTE1MAdHU1IxMTU0B0dTUjEyMDAHR1NSMTIwMQdHU1IxMjAzB0dTUjEyMDYHR1NSMTIwNwdHU1IxMzAwB0dTUjEzMDEHR1NSMTMwMgdHU1IxMzEyB0dTUjEzMTMHR1NSMTMyMQdHU1IxMzQwB0dTUjEzNTAHR1hRMTAxNwdHWFExMDQwB0dYUTEwNjMHR1hRMTA3MwdHWFExMDc1B0dYUTExMTEHR1hRMTE0MAdHWFExMTQyB0dYUTExNzAHR1hRMTE4NgdHWFExMjAzB0dYUTEyMDQHR1hRMTIwNQdHWFExMjEwB0dYUTEyMzMHR1hRMTI1MAdHWFExMjUyB0dYUTEzMDAHR1hRMTMwMQdHWFExMzEzB0dYUTEzMTQHR1hRMTQwMgdHWFExNTU0B0dYUTE2MTMHR1hRMTYzMgdHWFExNzAwB0dYUTE3MDEHR1hRMTcxNAdHWFExNzE2B0dYUTE3MTcHR1hRMTcxOAdHWFExODAwB0dYUTE4MDEHR1hRMTgwMgdHWFExODIyB0dYUTE4NDEHR1hRMTkwMQdHWFExOTcwB0dYUTE5NzMHR1hRMjAyMwdHWFEyMDMyB0dYUTIwMzMHR1hRMjA1MAdHWFEyMDUyB0dYUTIxMDAHR1hRMjEwMQdHWFEyMTYwB0dYUTIxNzAHR1hRMjE3MQdHWFEyMTczB0dYUTIxNzQHR1hRMjE3NwdHWFEyMTgxB0dYUTIxODQHR1hRMjIwMAdHWFEyMjAyB0dYUTIyMTEHR1hRMjIyMQdHWFEyMjIyB0dYUTIyNDYHR1hRMjI1MwdHWFEyMzAxB0dYUTIzMjEHR1hRMjMzMAdHWFEyMzcxB0dYUTI5MDEHR1hRMjkwMgdHWFE5MDEwB0dYUTkwMTIHR1hROTAxMwdHWFE5MDE0B0dYUTkwMTgHR1hROTA0NAdHWlIxMDI2B0daUjExMzkHR1pSMTE1NAdHWlIxMTYzB0daUjEyMTAHR1pSMTMzNgdHWlIxNTAwB0daUjE1MDYHSE1SMTAxNAdITVIxMTAwB0hNUjEyMDEHSE1SMTIwMwdITVIxMzIyB0hNUjE0NTEHSE1SMTUzMAdITVIxNjEzB0hNUjE2MjEHSE1SMTg1NAdITVIxOTUyB0hNUjIwMTUHSE1SMjAzMAdITVIyMjc0B0haQjIwMTMHSUtMMTAyMQdJS0wxMDIzB0lLTDEwNDEHSUtMMTIwMAdJS0wxMzEwB0lLTDE0MTEHSUtMMTQzMQdJS0wxNDUwB0lLTDE4MTMHSUtMMTkwMAdJS0w5MDE1B0lLTDkwMzIHSVNMMTQ1MwdLQ00xMDEwB0tDTTEwMTMHS0NNMTA1MwdLQ00xMDcwB0tDTTEwODEHS0NNMTEwMAdLQ00xMTEwB0tDTTExMTEHS0NNMTExMgdLQ00xMTEzB0tDTTExMTQHS0NNMTExNQdLQ00xMTIwB0tDTTExMjEHS0NNMTEyMwdLQ00xMTMwB0tDTTExMzEHS0NNMTE0MQdLQ00xMTU0B0tDTTExNTYHS0NNMTE2MAdLQ00xMTYyB0tDTTExNjMHS0NNMTE4MAdLQ00xMTgxB0tDTTExOTIHS0NNMTIwMgdLQ00xMjMxB0tDTTEyMzMHS0NNMTI0MAdLQ00xMjYwB0tDTTEyNjIHS0NNMTI2NAdLQ00xMjY1B0tDTTEzMDAHS0NNMTMwMgdLQ00xMzExB0tDTTEzMTMHS0NNMTMyMQdLQ00xMzIzB0tDTTEzNDMHS0NNMTM1MAdLQ00xMzUyB0tDTTEzNjAHS0NNMTQwMQdLQ00xNDEwB0tDTTE0MTEHS0NNMTQxMgdLQ00xNDIxB0tDTTE0MjMHS0NNMTQyNQdLQ00xNDMwB0tDTTE3MDAHS0NNMTcwMQdLQ00xNzAyB0tDTTE3MjEHS0NNMzAxMQdLQ00zMDEyB0tDTTMwMTMHS0NNMzAxNAdLQ00zMDE2B0tDTTMwMTcHS0NNMzAyMAdLQ00zMDIxB0tDTTMwNDAHS0NNMzA0MQdLQ00zMDQyB0tDTTMwNjAHS0NNMzA2MgdLQ00zMTAwB0tDTTMxMDEHS0NNMzExMAdLQ00zMTIxB0tDTTMxNTEHS0NNMzIwMgdLQ00zMzAzB0tDTTkwMTAHS0tQMTAxMAdLS1AxMDMxB0tLUDEwNjAHS0tQMTA4MQdLS1AxMTAwB0tLUDExMDEHS0tQMTExMAdLS1AxMTExB0tLUDExMzIHS0tQMTIxMAdLS1AxMjE2B0tLUDEyMjAHS0tQMTIyMQdLS1AxMjQyB0tLUDEyNDcHS0tQMTI0OAdLS1AxMjQ5B0tLUDEyNTAHS0tQMTI2MQdLS1AxMjcwB0tLUDEzNjEHS0tQMTM3MAdLS1AxNTA3B0tLUDE1MDgHS0tQMTUwOQdLS1AxNTExB0tLUDE1MjEHS0tQMTUyOAdLS1AxNTI5B0tLUDE1MzAHS0tQMTUzMgdLS1AxNTQxB0tLUDE3MjUHS0tQMTcyNwdLS1AxNzQwB0tLUDE3NDIHS0tQMTc3MQdLS1AxODEwB0tLUDE4MTEHS0tQMTgxMgdLS1AxODEzB0tLUDE4MTUHS0tQMTkwMQdLS1IxMDM0B0tLUjEwNzIHS0tSMTEwNwdLS1IxMTIwB0tLUjExNTMHS0tSMTE4NgdLS1IxNjEyB0tLUjE2MTkHS0tSMTc2MwdLS1IxODEwB0tLUjkwMzMHS0tSOTA2MgdLUlAxMjEwB0xKQTEwMjEHTEpBMTExMwdMSkExMTQ0B0xKQTExNzYHTEpBMTE5MwdMSkExMjA1B0xKQTEyNjEHTEpBMTI3MAdMSkExMjcxB0xKQTEyNzQHTEpBMTQzMQdMSkExNDQxB0xKQTE0NjAHTEpBMTUwNAdMSkExNjEyB0xKQTE2MTMHTEpBMTcwMAdMSkExNzIyB0xKQTE3MzAHTEpBMTc1MQdMSkExODA2B0xKQTE5MTEHTEpBMTkxNQdMSkExOTE2B0xKQTE5MzEHTFFBMTAxMQdMUUExMDIzB0xRQTEwMjQHTFFBMTAyNQdMUUExMDMwB0xRQTEwOTEHTFFBMTEwMgdMUUExMTEwB0xRQTExMjAHTFFBMTEyMQdMUUExMTMxB0xRQTExNTEHTFFBMTE1NwdMUUExMjAwB0xRQTEyMjAHTFFBMTIyMQdMUUExMjUzB0xRQTEzMTMHTFFBMTMxNAdMUUExMzE1B0xRQTEzMTcHTFFBMTMxOQdMUUExMzMwB0xRQTEzNjAHTFFBMTM3MQdMUUExMzcyB0xRQTEzNzMHTFFBMTM4NAdMUUExMzg1B0xRQTE0MTAHTFFBMTQzMAdMUUExNDYwB0xRQTE0NjMHTFFBMTQ5MAdMUUExNDkyB0xRQTE1MDAHTFFBMTUxMAdMUUExNTEzB0xRQTE1MTYHTFFBMTUzMgdMUUExNTM0B0xRQTE1NDAHTFFBMTU1MwdMUUExNTYxB0xRQTE1ODMHTFFBMTYwMwdMUUExNjEwB0xRQTE2MTIHTFFBMTYzMAdMUUExNjMyB0xRQTE2MzUHTFFBMTY2MQdMUUExNjczB0xRQTE2NzQHTFFBMTcxMAdMUUExNzIyB0xRQTE3MjMHTFFBMTcyNQdMUUExNzYwB0xRQTE3NjEHTFFBMTgwMwdMUUExODA0B0xRQTE4MTEHTFFBMTgxMwdMUUExODE0B0xRQTE4NzAHTFFBMTg3MwdMUUExODgwB0xRQTE4OTMHTFFBMjAyMQdMUUEyMDIyB0xRQTIwMjQHTFFBMzAxMAdMUUEzMDQyB0xRQTMwNzgHTFFBMzExMQdMUUEzMTYwB0xRQTMxNjQHTFFBNzYwMAdMUUE5MDIxB0xRQTkwMzMHTFFBOTA0MAdMUUE5MDQzB01ETjEwNTAHTUROMTA4MAdNRE4xMTgxB01ETjY5NzAHTUROOTAyMAdNRk4xMTI0B01GTjExMjcHTUZOMTMxMgdNRk4xNDEwB01GTjE0NDMHTUZOMTQ1MQdNRk4xNDUzB01GTjE1MTQHTUZOOTAxNAdNR1IxMDEwB01HUjEwMjAHTUdSMTAzMAdNR1IxMDMzB01HUjEwNTAHTUdSMTA2MAdNR1IxMTEwB01HUjExMTIHTUdSMTExMwdNR1IxMTE2B01HUjExMTcHTUdSMTEyMQdNR1IxMTUwB01HUjExNjAHTUdSMTIwMwdNR1IxMjEwB01HUjEyMTEHTUdSMTIxMgdNR1IxMjEzB01HUjEyMTYHTUdSMTI1MQdNR1IxMzAxB01HUjEzMTAHTUdSMTMxMQdNR1IxMzEyB01HUjEzMTMHTUdSMTMxNAdNR1IxMzE1B01HUjEzMTcHTUdSMTM0MAdNR1IxMzQzB01HUjEzNjEHTUdSMTM2MgdNR1IxMzYzB01HUjEzNjQHTUdSMTM3MQdNR1IxMzc2B01HUjEzNzgHTUdSMTQwMQdNR1IxNDA1B01HUjE0MTAHTUdSMTQyNAdNR1IxNDMwB01HUjE0NDEHTUdSMTUwMQdNR1IxNTAyB01HUjE1MDMHTUdSMTUwNAdNR1IxNTA1B01HUjE1MDYHTUdSMTUwNwdNR1IxNTA4B01HUjE1MDkHTUdSMTUxMAdNR1IxNTIxB01HUjE1MjIHTUdSMTUyMwdNR1IxNTI0B01HUjE1MjUHTUdSMTUyOAdNR1IxNTI5B01HUjE1NDAHTUdSMTU0MQdNR1IxNTQ0B01HUjE1NDUHTUdSMTU0NwdNR1IxNTQ4B01HUjE3MDIHTUdSMTcxMQdNR1IxNzQwB01HUjE3NDMHTUdSMTc0NAdNR1IxNzQ1B01HUjE3NTAHTUdSMTc1MwdNR1IxNzYyB01HUjE4MTAHTUdSMTk1MAdNR1IxOTcwB01HUjIwMTAHTUdSMjAxNAdNR1IyMDIxB01HUjIwNDAHTUdSMjA1MQdNR1IyMDUzB01HUjIwNTYHTUdSMjA1NwdNR1IyMTEwB01HUjIxMjEHTUdSMjEyNQdNR1IyMTMyB01HUjIxNDEHTUdSMjE0MgdNR1IyMTQzB01HUjIyMDAHTUdSMjI0MQdNR1IyMjUwB01HUjIyNTMHTUdSMjI1NQdNR1IyMzAwB01HUjIzMjAHTUdSMjMyMQdNR1IyMzMxB01HUjIzNTEHTUdSMjM1MwdNR1IyMzU0B01HUjIzNjEHTUdSMjM3MAdNR1IyNDAxB01HUjI0MDMHTUdSMjQxMAdNR1IyNDIwB01HUjI0MjEHTUdSMjQ0MgdNR1IyNDUwB01HUjI0NjEHTUdSMjQ2MgdNR1IyNDYzB01HUjI0NzMHTUdSMjYwMAdNR1IyNjAxB01HUjI2MDMHTUdSMjYwNAdNR1IyNjA1B01HUjI4NTAHTUdSMjkwMAdNR1IyOTAzB01HUjI5MTAHTUdSOTAyMAdNR1I5MDIyB01HUjkwMjMHTUdSOTAyNQdNR1I5MDMwB01HUjkwMzIHTUdSOTAzNAdNR1I5MDM2B01HUjkwNDEHTUdSOTA1MgdNR1I5MDUzB01HUjkwNTUHTUdSOTA1NwdNR1I5MDU5B01HUjkwOTAHTUxIMDAxMwdNTEgxMDE1B01MSDEwNDAHTUxIMTA0MgdNTEgxMDQ2B01MSDEwNDgHTUxIMTA0OQdNTEgxMDU1B01MSDEwNjIHTUxIMTA2NwdNTEgxMDY4B01MSDEwNjkHTUxIMTA3MgdNTEgxMTA1B01MSDExMDYHTUxIMTExMAdNTEgxMTIwB01MSDExMjEHTUxIMTEyNwdNTEgxMTcyB01MSDExOTIHTUxIMTIwMAdNTEgxMjAxB01MSDEyMTAHTUxIMTI0NQdNTEgxMjYxB01MSDEzMDEHTUxIMTMwMwdNTEgxMzA0B01MSDEzMDkHTUxIMTMxMgdNTEgxMzM0B01MSDEzNDQHTUxIMTM0NgdNTEgxMzU0B01MSDEzNjAHTUxIMTM4MgdNTEgxNDMxB01MSDE0MzMHTUxIMTQzNAdNTEgxNDQwB01MSDE0NTQHTUxIMTQ1NgdNTEgxNDcxB01MSDE0NzIHTUxIMTQ4MAdNTEgxNDgzB01MSDE0OTAHTUxIMTQ5MQdNTEgxNTA1B01MSDE1MTIHTUxIMTUxMwdNTEgxNTE3B01MSDE1MTgHTUxIMTUxOQdNTEgxNTIyB01MSDE1MzIHTUxIMTU2MQdNTEgxNTYyB01MSDE2MTAHTUxIMTYxMQdNTEgxNjMyB01MSDE2MzUHTUxIMTYzNgdNTEgxNjM3B01MSDE2NDEHTUxIMTY1MAdNTEgxNjUxB01MSDE2NTIHTUxIMTY1NQdNTEgxNjgwB01MSDE3MDAHTUxIMTcwMgdNTEgxNzAzB01MSDE3MDUHTUxIMTcwNgdNTEgxNzA5B01MSDE3MjAHTUxIMTcyMQdNTEgxNzIzB01MSDE3MjcHTUxIMTc2MAdNTEgxNzYyB01MSDE3NzAHTUxIMTgwNgdNTEgxODA3B01MSDE4MTEHTUxIMTgyNQdNTEgxODQzB01MSDE5MDIHTUxIMTkwMwdNTEgxOTA0B01MSDE5MDgHTUxIMTkxMAdNTEgxOTEyB01MSDE5MTYHTUxIMTk5MQdNTEgyMDIwB01MSDIwMjMHTUxIMjA0MgdNTEgyMDY0B01MSDIwNjUHTUxIMjA2NwdNTEgyMDcxB01MSDIxMDQHTUxIMjEwOQdNTEgyMTEwB01MSDIxMzcHTUxIMjE2MgdNTEgyMTY2B01MSDIxNjcHTUxIMjE3MgdNTEgyMjAwB01MSDIyMDQHTUxIMjIwNgdNTEgyMjA3B01MSDIyMjgHTUxIMjIyOQdNTEgyMjQ1B01MSDIyNDkHTUxIMjI2MQdNTEgyMjY2B01MSDIyODMHTUxIMjMwNQdNTEgyMzE0B01MSDIzMTUHTUxIMjMxNgdNTEgyMzE3B01MSDIzMjIHTUxIMjMyNQdNTEgyMzI4B01MSDIzMzAHTUxIMjQyMAdNTEgyNDQ4B01MSDI0NTIHTUxIMjQ3MAdNTEgyNDcxB01MSDI0NzIHTUxIMjQ3MwdNTEgyNDkzB01MSDI1NDMHTUxIMjU0NQdNTEgyNTcwB01MSDI1NzIHTUxIMjU3MwdNTEgyNjEzB01MSDI2MzIHTUxIMjY0MAdNTEgyNzAxB01MSDI3MDIHTUxIMjcwMwdNTEg0MTUxB01MSDQyNjUHTUxINDgyMAdNTEg1MDEzB01MSDUwMTQHTUxINTAyMQdNTEg1MDIzB01MSDUwMjUHTUxINTAzMQdNTEg1MDUwB01MSDUwNTEHTUxINTA1MgdNTEg1MDUzB01MSDUwNjAHTUxINTA3MAdNTEg1MTIwB01MSDUxMjMHTUxINTEzMgdNTEg1MTM0B01MSDUxMzUHTUxINTE0MAdNTEg1MTQxB01MSDUyMDAHTUxINTIxMAdNTEg1MjgwB01MSDUzMDMHTUxINTMxMAdNTEg1MzgwB01MSDUzOTAHTUxINTUxMAdNTEg1NzAwB01MSDU5MzAHTUxINTk0MAdNTEg1OTkwB01MSDU5OTEHTUxINzQwMQdNTEg4MjU0B01MSDkwNDAHTUxIOTA2MQdNTEg5MDYzB01MSDkwNjQHTUxIOTA2OAdNTEg5MDgwB01MSDkxNTQHTVFCMTAxMAdNUUIxMDEyB01RQjEwMzkHTVFCMTA1MgdNUUIxMDUzB01RQjEwODEHTVFCMTA5NQdNUUIxMTIwB01RQjExMjIHTVFCMTEyNAdNUUIxMTMwB01RQjExNDEHTVFCMTE1MQdNUUIxMjAwB01RQjEyMDIHTVFCMTIwNAdNUUIxMjQwB01RQjEyNjAHTVFCMTMwMwdNUUIxMzA0B01RQjEzMTAHTVFCMTMyMAdNUUIxMzMwB01RQjEzNTAHTVFCMTQ2MAdNUUIxNDYxB01RQjE0ODAHTVFCMTQ4MQdNUUIxNTEwB01RQjE1MTIHTVFCMTUxNAdNUUIxNTE1B01RQjE1MTYHTVFCMTUxOQdNUUIxNTIxB01RQjE1OTIHTVFCMTYxNwdNUUIxNjMwB01RQjE2ODAHTVFCMTgwMAdNUUIxODEyB01RQjE4MTMHTVFCMTgxNAdNUUIxODQwB01RQjE4NTAHTVFCMTg1MQdNUUIxODcyB01RQjE5MDAHTVFCMTkwMQdNUUIxOTEzB01RQjE5MjIHTVFCMTkyMwdNUUIxOTQ0B01RQjE5NTAHTVFCMTk2MQdNUUIyMDEzB01RQjIzMTkHTVFCMzAwMAdNUUI5MDEyB01RQjkwMTQHTVFCOTAyMQdNUUI5MDI2B01RQjkwNDEHTVJTMTA0MgdNUlMxMDQ0B01SUzEzMDkHTVJTMTYyMAdNUlMxOTE3B01SUzIyNTgHTVJTMzAwMAdNUlMzMzAzB01SUzkwNDUHTVNEMTA5MgdNU0QxMTAzB01TRDExNjIHTVNEMTYyNAdNU0QxODMwB01TRDE4MzkHTVNEMTkxMAdNU0QyMjI2B01TRDIyNDMHTVNEOTAyMAdNU0sxMDE1B01TSzEwODAHTVNLMTA4MwdNU0sxMjAyB01TSzEyMjIHTVNLMTIyNQdNU0sxMjQxB01TSzEyNDMHTVNLMTQ4MQdNU0sxNTE4B01TSzE1MjEHTVNLMTU3MAdNU0sxNjEyB01TSzE2MTUHTVNLMTYxNgdNU0sxNjE3B01TSzIxMzYHTVNLMjIwNwdNU0syMjUyB01TSzIyNTQHTVNLMjI3MAdNU0syMjcxB01TSzIyNzIHTVNLMjI3NAdNU0syNTAwB01TSzI1MDEHTVNLMjUwMwdNU0syNzcyB01TSzMwMjEHTVNLMzAzMAdNU0szMTA3B01TSzMxMTEHTVNLMzE0MQdNU0szMzE0B01TSzMzMTcHTVNLMzQwMQdNU0szNDI0B01TSzM1MjIHTVNLMzY0OQdNU0szNjYxB01TSzM3MTEHTVNLMzcyNwdNU0szNzMzB01TSzM4MjMHTVNLNDAyMAdNU0s0MDI2B01TSzQwMjcHTVNLNDAyOAdNU0s0MDQwB01TSzQwNDUHTVNLNDA2NQdNU0s0MDczB01TSzQ2MDAHTVNLNDYxMwdNU0s1MzUzB01TSzkwMjcHTVNLOTA1NwdNU1QxMDEwB01TVDEwMTIHTVNUMTAxMwdNU1QxMDE0B01TVDEwMTUHTVNUMTAxNgdNU1QxMDE3B01TVDEwMTgHTVNUMTAxOQdNU1QxMDIxB01TVDEwNjEHTVNUMTA4MQdNU1QxMDgyB01TVDExMDEHTVNUMTEwMwdNU1QxMTExB01TVDExMzAHTVNUMTEzNAdNU1QxMTQzB01TVDExNDQHTVNUMTE2MgdNU1QxMTY1B01TVDExNzIHTVNUMTE4MAdNU1QxMjA5B01TVDEyMjMHTVNUMTI2MgdNU1QxMzAzB01TVDEzMDQHTVNUMTMwNQdNU1QxMzA2B01TVDEzMDcHTVNUMTMwOQdNU1QxMzMxB01TVDEzNDEHTVNUMTM0MgdNU1QxMzUwB01TVDEzNTIHTVNUMTM2MAdNU1QxMzcwB01TVDE0NDAHTVNUMTQ0MQdNU1QxNDcyB01TVDE0OTIHTVNUMTQ5NQdNU1QxNTAxB01TVDE1NzIHTVNUMTYwMAdNU1QxNjEzB01TVDE2MjMHTVNUMTYyNQdNU1QxNjI3B01TVDE2MzMHTVNUMTYzNgdNU1QxNjcwB01TVDE2NzMHTVNUMTY4MAdNU1QxNjgzB01TVDE2OTAHTVNUMTcwMAdNU1QxNzUxB01TVDE4NDIHTVNUMTg1MgdNU1QxODU0B01TVDE4NjIHTVNUMjAxNAdNU1QyMDIxB01TVDIwMjUHTVNUMjA2MQdNU1QyMDY0B01TVDIwNzEHTVNUMjA3MgdNU1QyMDc1B01TVDIwNzcHTVNUMjExMAdNU1QyMTMwB01TVDIxMzEHTVNUMjEzMwdNU1QyMTM1B01TVDIxNDMHTVNUMjE0NQdNU1QyMTcxB01TVDIxNzMHTVNUMjE3NwdNU1QyMTgwB01TVDIxODEHTVNUMjE4MgdNU1QyMjUxB01TVDIyNTUHTVNUMjI3MAdNU1QyMzI3B01TVDIzMzEHTVNUMjM0MQdNU1QyMzcwB01TVDIzOTAHTVNUMjM5MQdNU1QyNDAwB01TVDI0MTAHTVNUMjQxMwdNU1QyNDMwB01TVDI0MzIHTVNUMjQzMwdNU1QyNDQwB01TVDI0NjQHTVNUMjQ2OAdNU1QyNDgwB01TVDI0ODMHTVNUMjUwMwdNU1QyNTE0B01TVDI1MTcHTVNUMjUyMAdNU1QyNTIzB01TVDI1MzIHTVNUMjU0MAdNU1QyNTQzB01TVDI1NjEHTVNUMjYxMQdNU1QyNjIwB01TVDI2MjIHTVNUMjYyMwdNU1QyNjMwB01TVDI2MzIHTVNUMjY0MQdNU1QyNjUxB01TVDI2NTMHTVNUMjY2MwdNU1QyNzAxB01TVDI3MjMHTVNUMjcyNAdNU1QyNzI3B01TVDI3MzIHTVNUMjc0MAdNU1QyNzYwB01TVDI3NjQHTVNUMjc4MAdNU1QyOTExB01TVDMwMTAHTVNUMzA2MAdNU1QzMDYyB01TVDMwNjcHTVNUMzA2OAdNU1QzMDY5B01TVDMwNzMHTVNUMzA5MAdNU1QzMTAxB01TVDMxMDIHTVNUMzEwNgdNU1QzMTA3B01TVDMxMjAHTVNUMzE1MAdNU1QzMTU1B01TVDMxNzIHTVNUMzIwMAdNU1QzMjAxB01TVDMyMDQHTVNUMzIzMwdNU1QzMjQyB01TVDMyNjEHTVNUMzMxNwdNU1QzMzQwB01TVDMzNDEHTVNUMzM1MwdNU1QzNDAwB01TVDM0MDUHTVNUMzQxMAdNU1QzNTAyB01TVDM1MDMHTVNUMzUwNAdNU1QzNTA1B01TVDM1MDYHTVNUMzUwNwdNU1QzNTA4B01TVDM1MDkHTVNUMzU4MgdNU1QzNTgzB01TVDM1ODQHTVNUMzU4NQdNU1QzNjAyB01TVDM2MjAHTVNUMzY2MAdNU1QzNjcyB01TVDM3MDIHTVNUMzcwNQdNU1QzNzA2B01TVDM3MTEHTVNUMzc2MAdNU1QzNzYyB01TVDM3ODAHTVNUMzc4MQdNU1QzNzgyB01TVDM3ODMHTVNUMzc4NAdNU1QzNzg1B01TVDM4MDQHTVNUMzgzMAdNU1QzODMxB01TVDM4NDAHTVNUMzg1MAdNU1QzODUxB01TVDM4NTIHTVNUMzg1NQdNU1QzODc1B01TVDQwMTcHTVNUNDAyNgdNU1Q0MDMxB01TVDQwMzQHTVNUNDA0MAdNU1Q0MDQ1B01TVDQwODIHTVNUNDEwMgdNU1Q0MTA0B01TVDQxMDYHTVNUNDEwOAdNU1Q0MTEyB01TVDQxMTYHTVNUNDEyMAdNU1Q0MTIzB01TVDQxMjYHTVNUNDEyNwdNU1Q0MTMyB01TVDQxMzQHTVNUNDE0MwdNU1Q0MTYwB01TVDQxNjEHTVNUNDE4MAdNU1Q0MTgxB01TVDQyMDAHTVNUNDIwMQdNU1Q0MjAyB01TVDQyMDMHTVNUNDIwNAdNU1Q0MjA3B01TVDQyMzMHTVNUNDI1MAdNU1Q0MjYzB01TVDQyNzAHTVNUNDI4MAdNU1Q0MzAzB01TVDQzMTIHTVNUNDMxNgdNU1Q0MzE4B01TVDQzMjEHTVNUNDMyMgdNU1Q0MzQzB01TVDQzNTQHTVNUNDM1NgdNU1Q0MzU4B01TVDQzNjMHTVNUNDM4MQdNU1Q0MzgzB01TVDQ0MDQHTVNUNDQwNQdNU1Q0NDIyB01TVDQ0NjQHTVNUNDQ2NwdNU1Q0NDcwB01TVDQ1MDIHTVNUNDUwMwdNU1Q0NTA0B01TVDQ1MTAHTVNUNDUxMQdNU1Q0NTEyB01TVDQ1MTQHTVNUNDUzNQdNU1Q0NTQyB01TVDQ1OTIHTVNUNDU5MwdNU1Q0NjAxB01TVDQ2MDMHTVNUNDYxMQdNU1Q0NjIwB01TVDQ2MjEHTVNUNDYyMgdNU1Q0NjIzB01TVDQ2MzMHTVNUNDk0MwdNU1Q0OTQ1B01TVDQ5NjAHTVNUNTAxMAdNU1Q1MDE0B01TVDUwNTAHTVNUNTA1MQdNU1Q1MDUzB01TVDUwNTQHTVNUNTA1NQdNU1Q1MDczB01TVDUwNzUHTVNUNTA4MAdNU1Q1MDgxB01TVDUxMDEHTVNUNTEwMgdNU1Q1MTEzB01TVDU1NDAHTVNUNTU3MAdNU1Q5MDIyB01TVDkwMjQHTVNUOTAyNQdNU1Q5MDI5B01TVDkwMzQHTVNUOTA1MAdNU1Q5MDU0B01TVDkwNTUHTVNUOTA1NgdNU1Q5MDU5B01TVDkwNzIHTVNUOTA4MAdNU1Q5MDk0B01URjEwMTcHTVRGMTAyMAdNVEYxMDUxB01URjEwNzEHTVRGMTA4MQdNVEYxMTAwB01URjExMTAHTVRGMTEyMAdNVEYxMTIyB01URjExMzAHTVRGMTEzMQdNVEYxMTMyB01URjExNDMHTVRGMTE2MAdNVEYxMjAyB01URjEyMDQHTVRGMTIxMAdNVEYxMjIxB01URjEyMzAHTVRGMTIzMQdNVEYxMjM0B01URjEyNDAHTVRGMTI0MQdNVEYxMjYwB01URjEyNjEHTVRGMTI3MAdNVEYxMzAwB01URjEzMTAHTVRGMTM4MQdNVEYxNDAzB01URjE0MDUHTVRGMTQ0MAdNVEYxNDQxB01URjE0NzIHTVRGMTQ5MAdNVEYxNTAwB01URjE1NDAHTVRGMTU0MgdNVEYxNTYwB01URjE2MDAHTVRGMTc5MAdNWEsxMDM0B01YSzEwNTEHTVhLMTA4NgdNWEsxMTAwB01YSzExNTMHTVhLMTE2MAdNWEsxMTgxB01YSzEyNDcHTVhLMTMwNAdNWGsxNDA0B01YSzE0MDUHTVhLMTQxMgdNWEsxNDcyB01YSzE0NzMHTVhLMTUxMgdNWEsxNTM3B01YSzE1MzgHTVhLMTcwMAdNWEsxNzIyB01YSzE3NDEHTVhLMTc2MgdNWEsxODYxB01YSzQwODIHTVhLNDA4NAdNWEs5MDI2B01YSzkwMjcHTVhLOTA0MgdNWEs5MDQzB01YSzkwNDcHTVhLOTA2MwdNWFIxMDEyB01YUjEwNjAHTVhSMTA2MQdNWFIxMTAwB01YUjExMDEHTVhSMTEwMgdNWFIxMTAzB01YUjExMDQHTVhSMTEwNQdNWFIxMTIwB01YUjExMjEHTVhSMTMwMAdNWFIxMzAxB01YUjEzMTEHTVhSMTMyMQdNWFIxMzMxB01YUjEzNDAHTVhSMTM1MAdNWFIxMzYxB01YUjEzNjMHTVhSMTQxMAdNWFIxNDIwB01YUjE0NTIHTVhSMTQ2MQdNWFIxNDgwB01YUjE0ODEHTVhSMTUwMAdNWFIxNTAxB01YUjkwMTAHTVhSOTAzMAdORFIwMTAyB05EUjEwMjAHTkRSMTAyMQdORFIxMDM0B05EUjEwNDAHTkRSMTA3MAdORFIxMDcxB05EUjEwODAHTkRSMTE0MAdORFIxMjEyB05EUjEyMjEHTkRSMTIyMgdORFIxMjMwB05EUjEyMzQHTkRSMTIzOQdORFIxMjQzB05EUjEyNTAHTkRSMTMxMgdORFIxMzMyB05EUjEzNDEHTkRSMTM0MwdORFIxMzUwB05EUjEzNTQHTkRSMTM1NwdORFIxMzYwB05EUjEzNjEHTkRSMTM3MAdORFIxMzk2B05EUjE0MDAHTkRSMTQwNAdORFIxNDA1B05EUjE0MTEHTkRSMTQzNgdORFIxNDUwB05EUjE0NjEHTkRSMTQ2OAdORFIxNDY5B05EUjE2MDAHTkRSMTYwMQdORFIxNjAyB05EUjE2MDMHTkRSMTYwNwdORFIxNjExB05EUjE2MTMHTkRSMTY0MgdORFIxNjYwB05EUjE2NjEHTkRSMTY2MwdORFIxNjY2B05EUjE4MDAHTkRSMTg0MwdORFIxODQ0B05EUjE4NDUHTkRSMTg1MAdORFIxODUxB05EUjE5MDAHTkRSMTkzMAdORFIxOTQxB05EUjE5NjAHTkRSMTk3MQdORFIyMDEwB05EUjIwMzQHTkRSMjExMQdORFIyMTM5B05EUjIxNTAHTkRSMjE1MwdORFIyMTczB05EUjIxNzcHTkRSMjE4MAdORFIyMjIwB05EUjIyMjIHTkRSMjIzMgdORFIyMjQxB05EUjIyNDQHTkRSMjI0NQdORFIyMjUxB05EUjIzMDAHTkRSMjMwMQdORFIyMzAyB05EUjIzMDQHTkRSMjMwNQdORFIyMzA2B05EUjIzMDcHTkRSMjMyMAdORFIyMzIxB05EUjIzMzAHTkRSMjM0MAdORFIyMzUwB05EUjIzNjAHTkRSMjM2MQdORFIyMzgyB05EUjkwMTAHTkRSOTAxMQdORFI5MDE0B05EUjkwMTYHTkRSOTAzMAdORFI5MDMxB05EUjkwMzQHTkRSOTAzNgdORFI5MDQwB05EUjkwNDkHTkRSOTA1MAdORFI5MDUxB05EUjkwNjIHTkRSOTA3MAdORFI5MDcxB05EUjkwNzMHTkRSOTA3NwdORFI5MDgxB05EUjkwODgHTlhSMDU0NwdOWFIwNTk5B05YUjEwMTMHTlhSMTAxNgdOWFIxMDE3B05YUjEwMTgHTlhSMTAyMAdOWFIxMDU1B05YUjEwOTAHTlhSMTEwMgdOWFIxMTIyB05YUjExMzMHTlhSMTIwMwdOWFIxMjA1B05YUjEzNzEHTlhSMTQwNAdOWFIxNDA4B05YUjE0MjAHTlhSMTQyMQdOWFIxNTA4B05YUjE1MDkHTlhSMTU5MQdOWFIxNjIwB05YUjE5MDcHTlhSMTkyMwdOWFIxOTMyB05YUjE5NDMHTlhSMTk3MQdOWFIyMDYzB05YUjIwNjYHTlhSMjA2OAdOWFIyMTM0B05YUjIxNDIHTlhSMjM1MQdOWFIyNDA2B05YUjI0MDcHTlhSMjUwNgdOWFIyNTI1B05YUjI1MzIHTlhSMjUzMwdOWFIyNTQxB05YUjI1NDMHTlhSMjU0NQdOWFIyNTU4B05YUjI1NTkHTlhSMjYwMgdOWFIyNjAzB05YUjI2MDQHTlhSMjYwNgdOWFIyNjA3B05YUjI2MDgHTlhSMjYwOQdOWFIyNjIwB05YUjI2MjYHTlhSMjYyOAdOWFIyNjMwB05YUjI2NDEHTlhSMjY1NQdOWFIyNjYwB05YUjMwMjEHTlhSMzAyNQdOWFIzMTUwB05YUjMxNjIHTlhSMzIwNQdOWFIzMjMwB05YUjMyMzIHTlhSMzI0MQdOWFIzMjU0B05YUjMzMTIHTlhSMzM1OQdOWFIzMzcxB05YUjMzNzMHTlhSMzQxMwdOWFIzNDIwB05YUjM0MjMHTlhSMzQzNgdOWFIzNDgyB05YUjM1MTIHTlhSMzUzMQdOWFIzNTUwB05YUjM1NzgHTlhSMzYwMAdOWFIzNjIzB05YUjM2MjQHTlhSMzY0MQdOWFIzNjQzB05YUjM2NTAHTlhSMzY2MQdOWFIzNjcwB05YUjM2ODAHTlhSNDAxMAdOWFI0MDE1B05YUjQwMTkHTlhSNDAzMAdOWFI0MDM2B05YUjQwNTIHTlhSNDA4MQdOWFI0MTEzB05YUjQxMjAHTlhSNDIyMQdOWFI0MjUwB05YUjQ0MjMHTlhSNTAyMQdOWFI1MTQwB05YUjUyMDgHTlhSNTIxMgdOWFI2MDMyB05YUjYwNTAHTlhSNjA1MQdOWFI2MDUyB05YUjYzMzcHTlhSNjM0NQdOWFI2MzUzB05YUjYzODIHTlhSNjQwMAdOWFI2NDAzB05YUjY0MDQHTlhSNjQ0MAdOWFI2NDQxB05YUjY0NTMHTlhSNjQ3NgdOWFI2NDc3B05YUjY1MDMHTlhSNjUxNAdOWFI2NTE2B05YUjY1MTcHTlhSNjUzMQdOWFI2NTQwB05YUjY1NDEHTlhSNjYxNgdOWFI2NjQwB05YUjkwMjIHTlhSOTAyNwdQQksxNDQwB1BCSzE0NjEHUEJLMTUwNQdQQksxODIwBlBMQTAwMAdQTEExMDE3B1BMQTEwMjEHUExBMTA0MgdQTEExMTA0B1BMQTExMzIHUExBMTE2MAdQTEExMzAzB1BMQTEzMTAHUExBMTMxNQdQTEExMzIzB1BMQTE0MTUHUExBMTQxNwdQTEExNDU0B1BMQTE1MTUHUExBMTU3NQdQTEExNTc5B1BMQTE2MTUHUExBMTY4MQdQTEExOTA1B1BMQTIyMzQHUExBOTAxMAdQTEE5MDMyB1BMQTkwNTQHUFRBMTIyNwdQVEExNTAyB1BUQTkwNDMHUFRBOTA0NAdRTEExMDI4B1FMQTEwNDAHUUxBMTA1MgdRTEExMDUzB1FMQTEwNjMHUUxBMTA5MAdRTEExMTEzB1FMQTExNDEHUUxBMTE4MAdRTEExMTgxB1FMQTExODIHUUxBMTIwMAdRTEExMjA5B1FMQTEyNDEHUUxBMTI0MgdRTEExMzExB1FMQTEzMjAHUUxBMTMyMQdRTEExMzM0B1FMQTE0MDIHUUxBMTYxMAdRTEExNjEzB1FMQTE2MzIHUUxBMTY3MAdRTEExNzAyB1FMQTE3MDkHUUxBMTc2MAdRTEExODExB1FMQTE5MTAHUUxBMTkxMwdRTEExOTE3B1FMQTE5MzMHUUxBMjAxMAdRTEEyMDE0B1FMQTIwMTUHUUxBMjAxOQdRTEEyMDI1B1FMQTIxMzEHUUxBOTAxMwdRTEE5MDE4B1FMQTkwMTkHUUxBOTAyMgdRTEE5MDQyB1FORDE3MTEHUU5EMTc2NAdRUkQxMDIwB1FSRDEwNzAHUVJEMTEwMgdRUkQxMTAzB1FSRDExMjQHUVJEMTEyNQdRUkQxMTI3B1FSRDExMjgHUVJEMTE2MQdRUkQxMTgxB1FSRDEyMDMHUVJEMTIxMgdRUkQxMjE0B1FSRDEyMTUHUVJEMTI1MgdRUkQxMjUzB1FSRDEyNTQHUVJEMTI1NwdRUkQxMjYwB1FSRDEzMDEHUVJEMTMwMwdRUkQxMzEzB1FSRDEzNTcHUVJEMTM4MAdRUkQxMzgxB1FSRDE0MDEHUVJEMTQxMAdRUkQxNDQzB1FSRDE0NDUHUVJEMTQ2MQdRUkQxNDkxB1FSRDE0OTMHUVJEMTUwMwdRUkQxNTIyB1FSRDE1MzAHUVJEMTUzMgdRUkQxNTM1B1FSRDE2MTAHUVJEMTYxMQdRUkQxNjMwB1FSRDE2MzIHUVJEMTYzMwdRUkQxNjUxB1FSRDE2NTIHUVJEMTY3MAdRUkQxNzAxB1FSRDE3MTEHUVJEMTc0MgdRUkQxNzQ2B1FSRDE3NDcHUVJEMTc3MgdRUkQxODAwB1FSRDE4MTIHUVJEMTgxNQdRUkQxODMwB1FSRDE4MzEHUVJEMTgzMwdRUkQxOTAyB1FSRDE5MTAHUVJEMTkyMQdRUkQxOTQxB1FSRDE5NDMHUVJEMjAyMAdRUkQyMDIxB1FSRDIwMjMHUVJEMjExMwdRUkQyMTQxB1FSRDI0MDAHUVJEMjQwMgdRUkQyNDA0B1FSRDI0MDUHUVJEMjQwOAdRUkQyNTAxB1FSRDI1MDQHUVJEMjUzMQdRUkQyNTMzB1FSRDI1MzUHUVJEMzEwMgdRUk0xMDI1B1FSTTEwODAHUVJNMTA5MAdRUk0xMTA0B1FSTTExMDcHUVJNMTEwOQdRUk0xMTgyB1FSTTEyMDQHUVJNMTIwOAdRUk0xMjg0B1FSTTE0MDYHUVJNMTQ4NAdRUk0xNTA0B1FSTTE1MDUHUVJNMTUwOQdRUk0xNTE4B1FSTTE1NjMHUVJNMTU4MAdRUk0xNjA1B1FSTTE2NTEHUVJNMTcxMAdRUk0xNzE1B1FSTTE4MDEHUVJNMTgwNgdRUk0xODM4B1FSTTE4NTAHUVJNMTkwMQdRUk0xOTExB1FSTTE5NDAHUVJNMTk0MgdRUk0xOTUwB1FSTTE5NTEHUVJNMjAyMwdRUk0yMDM1B1FSTTIxMDEHUVJNMjEwMwdRUk0yMTI0B1FSTTIxMzIHUVJNMjEzMwdRUk0yMTM3B1FSTTIxNzAHUVJNMjE4MwdRUk0yMTg2B1FSTTIyMDIHUVJNMjIwMwdRUk0yMjA4B1FSTTIyMDkHUVJNMjMxNAdRUk0yMzE1B1FSTTIzNzEHUVJNMjM3OQdRUk0yMzgwB1FSTTI0MTYHUVJNMjQyMAdRUk0yNDUyB1FSTTI0NjMHUVJNMjQ3MQdRUk0yNTAwB1FSTTI1MDIHUVJNMjUwMwdRUk0yNTA1B1FSTTI1MDcHUVJNMjU4MgdRUk0yNjEyB1FSTTI2MzIHUVJNMjYzMwdRUk0yNjM0B1FSTTI2NTEHUVJNMjY4MQdRUk0yNjg2B1FSTTI3MDAHUVJNMjcwNAdRUk0yNzM3B1FSTTI3MzgHUVJNMjgwMAdRUk0yODAxB1FSTTI4MDMHUVJNMjgxMQdRUk0yODQzB1FSTTI4NDQHUVJNMjg0NQdRUk0yOTAyB1FSTTI5MDMHUVJNMjkxMgdRUk0yOTM4B1FSTTI5NDMHUVJNMjk0NQdRUk0yOTQ2B1FSTTI5NjEHUVJNMzAwMAdRUk0zMDExB1FSTTMwMzMHUVJNMzEwMAdRUk0zMjAxB1FSTTMyMzIHUVJNMzI1NAdRUk0zNjEwB1FSTTM2MTEHUVJNMzYxMgdRUk0zNjEzB1FSTTM2MTYHUVJNMzYxNwdRUk0zNjkxB1FSTTM5MDQHUVJNMzkwNQdRUk0zOTUwB1FSTTQwMDEHUVJNNDAwNwdRUk00MDUxB1FSTTQ1MTMHUVJNNDUxNQdRUk00NTMyB1FSTTQ1MzMHUVJNNDUzNAdRUk00NTM2B1FSTTQ1NTAHUVJNNDU1MgdRUk00NjAwB1FSTTQ2MjAHUVJNNDY2MQdRUk00ODAwB1FSTTUwMTkHUVJNNTEyNgdRUk01MTQwB1FSTTUxNDMHUVJNNTE1MAdRUk01MjAyB1FSTTUyMTEHUVJNNTIyMAdRUk01MjMxB1FSTTkwMTIHUVJNOTAxNgdRUk05MDE4B1FSTTkwMTkHUVJNOTA1MwdRUk05MDcyB1FSTTkwNzUHUkJUMDAxNAdSQlQwMDQ0B1JCVDEwNDMHUkJUMTA2MwdSQlQxMDgxB1JCVDEwODIHUkJUMTExMgdSQlQxMTIwB1JCVDExMzYHUkJUMTI1MAdSQlQxMjUxB1JCVDEyNzEHUkJUMTI5MQdSQlQxMzAwB1JCVDEzMzEHUkJUMTMzNAdSQlQxMzYzB1JCVDE0MDUHUkJUMTQwNwdSQlQxNDA4B1JCVDE0MTAHUkJUMTQ0MAdSQlQxNDcxB1JCVDE0NzcHUkJUMTUwMwdSQlQxNTIxB1JCVDE1MjIHUkJUMTUyNgdSQlQxNTQwB1JCVDE1NDIHUkJUMTU1MgdSQlQxNTYwB1JCVDE1ODQHUkJUMTU4NQdSQlQxNjAwB1JCVDE2MDMHUkJUMTYwNQdSQlQxNjA4B1JCVDE2MzEHUkJUMTY2MAdSQlQxNjYxB1JCVDE2NjMHUkJUMTY3MgdSQlQxNjg2B1JCVDE2ODgHUkJUMTcwMQdSQlQxNzAyB1JCVDE3MDUHUkJUMTcxMAdSQlQxNzMyB1JCVDE3NjIHUkJUMTc2MwdSQlQxNzY2B1JCVDE3NjcHUkJUMTgwMQdSQlQxODMxB1JCVDE4MzQHUkJUMTgzNQdSQlQxODM3B1JCVDE4NDEHUkJUMTg0MwdSQlQxODQ0B1JCVDE4NDgHUkJUMTg0OQdSQlQxODUwB1JCVDE4NTIHUkJUMTg2MgdSQlQxODY0B1JCVDE4NjUHUkJUMTg3MQdSQlQxOTAxB1JCVDE5MDcHUkJUMTk1MAdSQlQxOTUxB1JCVDE5NTIHUkJUMTk2MQdSQlQxOTcwB1JCVDE5NzUHUkJUMTk4MAdSQlQxOTgxB1JCVDE5ODIHUkJUMjAxMAdSQlQyMDIwB1JCVDIwMzAHUkJUMjAzMgdSQlQyMDM0B1JCVDIwMzYHUkJUMjA3MAdSQlQyMDczB1JCVDIxMDEHUkJUMjE0NAdSQlQyMTQ1B1JCVDIxNDYHUkJUMjE0NwdSQlQyMTUyB1JCVDIxNjEHUkJUMjE2MgdSQlQyMTkxB1JCVDIyMjIHUkJUMjIyMwdSQlQyMjI0B1JCVDIyMzIHUkJUMjIzNAdSQlQyMjM1B1JCVDIyMzcHUkJUMjI0MgdSQlQyMjQzB1JCVDIyNDUHUkJUMjI1MgdSQlQyMjUzB1JCVDIyNjAHUkJUMjI3MAdSQlQyMjgyB1JCVDIyODMHUkJUMjMwMwdSQlQyMzA3B1JCVDIzMjAHUkJUMjMyMQdSQlQyNDExB1JCVDI0MTMHUkJUMjQxNAdSQlQyNDMxB1JCVDI0MzUHUkJUMjQ0MwdSQlQyNDYyB1JCVDI0ODUHUkJUMjQ4NgdSQlQyNDg3B1JCVDI1MDAHUkJUMjUyMgdSQlQyNjA0B1JCVDI2MTAHUkJUMjYxNgdSQlQyNjQ2B1JCVDI2NTMHUkJUMjY3MQdSQlQyNjcyB1JCVDI3MDIHUkJUMjcwOQdSQlQyNzEwB1JCVDI3MzEHUkJUMjczMwdSQlQyNzQwB1JCVDMwMjQHUkJUMzAyNgdSQlQzMDMwB1JCVDMwNDUHUkJUMzA0NwdSQlQzMTAwB1JCVDMxMTIHUkJUMzExMwdSQlQzMTIxB1JCVDMxMzAHUkJUMzEzMQdSQlQzMTMyB1JCVDMxNDAHUkJUMzE0MQdSQlQzMTQyB1JCVDMyMTEHUkJUMzIxMgdSQlQzMjE3B1JCVDMyNDAHUkJUMzQzMAdSQlQzNTAwB1JCVDM1MDIHUkJUMzUwMwdSQlQzNTA0B1JCVDQwMTAHUkJUNDAxMQdSQlQ0MDEyB1JCVDQwMTYHUkJUNDAxNwdSQlQ0MDI0B1JCVDQwMjkHUkJUNDAzMAdSQlQ0MDM0B1JCVDQwMzcHUkJUNDA1MAdSQlQ0MDcwB1JCVDQxMDAHUkJUNDEwMQdSQlQ0MTAzB1JCVDQxMDQHUkJUNDEwNQdSQlQ0MTA3B1JCVDQxMTAHUkJUNDExMgdSQlQ0MTEzB1JCVDQyMDAHUkJUNDIwMgdSQlQ0MjEwB1JCVDQyMTQHUkJUNDIyMAdSQlQ0MjI0B1JCVDQyMjUHUkJUNDIyNgdSQlQ0MjI3B1JCVDQyNDIHUkJUNDI1MAdSQlQ0MjgwB1JCVDQyOTAHUkJUNDMwNAdSQlQ0MzMwB1JCVDQzMzEHUkJUNDMzMgdSQlQ0MzQwB1JCVDQzNDIHUkJUNDM0NAdSQlQ0NDAwB1JCVDQ0MTAHUkJUNDQyMAdSQlQ0NjAzB1JCVDQ2MDgHUkJUNDYxOAdSQlQ0NjIwB1JCVDQ2MzMHUkJUNDYzOAdSQlQ0NzAwB1JCVDQ3MDEHUkJUNDcxMQdSQlQ0NzIyB1JCVDUwMTAHUkJUNTEwMAdSQlQ1MzEwB1JCVDUzMjAHUkJUNTk5MAdSQlQ2MDExB1JCVDYwMTMHUkJUNjAxNwdSQlQ2MDIyB1JCVDYwMzMHUkJUNjAzNQdSQlQ2MDQxB1JCVDYwNTcHUkJUNjA4MAdSQlQ2MTIxB1JCVDYxMzAHUkJUNjE0MQdSQlQ2MjEwB1JCVDYzMDAHUkJUNjMwMgdSQlQ2MzAzB1JCVDY0MDMHUkJUNjQwNQdSQlQ2NDA3B1JCVDY0MTEHUkJUNjQxMwdSQlQ2NDIwB1JCVDY0NDEHUkJUNjQ0MgdSQlQ2NDQzB1JCVDY0NzAHUkJUNjUwMAdSQlQ2NTAzB1JCVDY1MTMHUkJUNjUyMAdSQlQ2NTI4B1JCVDY1NTAHUkJUNjYwMAdSQlQ2NjAzB1JCVDY2MDQHUkJUNjYwNQdSQlQ2NjA2B1JCVDY2MDcHUkJUNjcwMAdSQlQ2NzAxB1JCVDY3MDIHUkJUNjcwMwdSQlQ2NzA2B1JCVDY4MDAHUkJUNjgwMgdSQlQ2OTAwB1JCVDY5MDEHUkJUNjkwMwdSQlQ2OTMwB1JCVDY5NTAHUkJUOTAyMQdSQlQ5MDIyB1JCVDkwMjMHUkJUOTAyNgdSQlQ5MDI3B1JCVDkwMzAHUkJUOTAzOAdSQlQ5MDM5B1JCVDkwNDgHU0ZJMDE2MQdTRkkxMDMxB1NGSTEwNDAHU0ZJMTA0MQdTRkkxMDQzB1NGSTEwNDYHU0ZJMTA0NwdTRkkxMTEwB1NGSTExMTIHU0ZJMTExMwdTRkkxMTIwB1NGSTExMjEHU0ZJMTEyMgdTRkkxMTIzB1NGSTExMjQHU0ZJMTEyNQdTRkkxMTI3B1NGSTExNDEHU0ZJMTE1MgdTRkkxMTYxB1NGSTExNzEHU0ZJMTE4NAdTRkkxMjEyB1NGSTEyNTAHU0ZJMTI2MQdTRkkxMjcwB1NGSTEyOTMHU0ZJMTMwMAdTRkkxMzcwB1NGSTE0MDEHU0ZJMTQwMgdTRkkxNDAzB1NGSTE0MDQHU0ZJMTQwNQdTRkkxNDA3B1NGSTE0MTEHU0ZJMTQxMgdTRkkxNDEzB1NGSTE0MTQHU0ZJMTQxNQdTRkkxNDIxB1NGSTE0MjIHU0ZJMTQyMwdTRkkxNDMwB1NGSTE0MzIHU0ZJMTQzNAdTRkkxNDUyB1NGSTE1MDMHU0ZJMTUwNQdTRkkxNTExB1NGSTE1MTIHU0ZJMTUxMwdTRkkxNTE0B1NGSTE1MjEHU0ZJMTU0MAdTRkkxNTQxB1NGSTE1NDMHU0ZJMTYxMQdTRkkxNjEzB1NGSTE2MTUHU0ZJMTYxNwdTRkkxNjIwB1NGSTE2MjEHU0ZJMTYzNAdTRkkxNjQwB1NGSTI2MjAHU0ZJNjA3MQdTRkk3MDgwB1NGSTkwMTAHU0ZJOTAxNAdTR04wMDE2B1NHTjEwMzQHU0dOMTA3MAdTR04xMDcxB1NHTjExMDAHU0dOMTMwNAdTR04xMzA1B1NHTjEzMjEHU0dOMTM0NQdTR04xNDIxB1NHTjE1NDAHU0dOMTYwMAdTR04xNjMwB1NHTjE2NzYHU0dOMTcxMAdTR04xNzQxB1NHTjE3NjYHU0dOMTg2MgdTR04xOTA1B1NHTjE5MTQHU0dOMTkyNwdTR04yMDIwB1NHTjIwMjEHU0dOMjEwMQdTR04yMTA0B1NHTjIyMDMHU0dOMjI1MQdTR04yMzAzB1NHTjI0MTUHU0dOMjgwMQdTR04yODAzB1NHTjI5MzUHU0dOMzAwMAdTR04zMDc0B1NHTjMxMDMHU0dOMzIzMQdTR040MTkwB1NHTjQxOTMHU0dONDE5NwdTR040MzAzB1NHTjQ0MTUHU0dOOTAxNAdTR045MDMwB1NHTjkwMzIHU0dXMDAwMAdTR1cxMDEwB1NHVzEwMTEHU0dXMTAxMgdTR1cxMDE0B1NHVzEwMTUHU0dXMTAxNwdTR1cxMDE4B1NHVzEwMTkHU0dXMTAyMAdTR1cxMDQwB1NHVzEwNDIHU0dXMTA0MwdTR1cxMDQ3B1NHVzEwNTAHU0dXMTA3MAdTR1cxMDcyB1NHVzEwNzMHU0dXMTA4MQdTR1cxMDkxB1NHVzExMDQHU0dXMTExMAdTR1cxMTExB1NHVzExMTIHU0dXMTExNQdTR1cxMTE3B1NHVzExMTgHU0dXMTExOQdTR1cxMTIwB1NHVzExNTAHU0dXMTE2MQdTR1cxMTY3B1NHVzEyMDUHU0dXMTIwNwdTR1cxMjIxB1NHVzEyMzAHU0dXMTI1MAdTR1cxMjcxB1NHVzEzMDAHU0dXMTMwMQdTR1cxMzAyB1NHVzEzMDMHU0dXMTMwNAdTR1cxMzA1B1NHVzEzMDYHU0dXMTMwOQdTR1cxMzIwB1NHVzEzMjEHU0dXMTM1MQdTR1cxMzUyB1NHVzEzNjAHU0dXMTM2MgdTR1cxMzY1B1NHVzE0MDQHU0dXMTQwOAdTR1cxNDA5B1NHVzE0MjEHU0dXMTQ0MAdTR1cxNDUxB1NHVzE0NTIHU0dXMTQ1NAdTR1cxNDcwB1NHVzE0OTEHU0dXMTUwMAdTR1cxNTAyB1NHVzE1MDMHU0dXMTUzNgdTR1cxNTUwB1NHVzE2MDEHU0dXMTYwMgdTR1cxNjAzB1NHVzE2MDQHU0dXMTYwNQdTR1cxNjA5B1NHVzE2MTAHU0dXMTYxMQdTR1cxNjMwB1NHVzE2NDEHU0dXMTY2MAdTR1cxNjcxB1NHVzE2NzUHU0dXMTcwMAdTR1cxNzAyB1NHVzE3MDMHU0dXMTc1MwdTR1cxNzYwB1NHVzE3NjEHU0dXMTc3MAdTR1cxNzgzB1NHVzE4MDEHU0dXMTgwMgdTR1cxODAzB1NHVzE4MDQHU0dXMTgyMAdTR1cxODIxB1NHVzE4MjIHU0dXMTgyMwdTR1cxODI1B1NHVzE4MjYHU0dXMTgyNwdTR1cxODMwB1NHVzE4MzEHU0dXMTg0MAdTR1cxODQxB1NHVzE4NDMHU0dXMTg0NAdTR1cxODUzB1NHVzE4NTUHU0dXMTg1OQdTR1cxODYxB1NHVzE4NzEHU0dXMTkwMAdTR1cxOTEwB1NHVzE5MTEHU0dXMTkyMAdTR1cxOTIyB1NHVzE5NDEHU0dXMTk1MgdTR1cxOTYzB1NHVzE5NjQHU0dXMTk2NQdTR1cxOTY2B1NHVzE5NjgHU0dXMjAxMAdTR1cyMDExB1NHVzIwMTIHU0dXMjAxNAdTR1cyMDE2B1NHVzIwMTgHU0dXMjA0MAdTR1cyMDQyB1NHVzIwNDUHU0dXMjA1MAdTR1cyMDYwB1NHVzIwNjMHU0dXMjA3MQdTR1cyMDgwB1NHVzIwOTMHU0dXMjA5NAdTR1cyMDk1B1NHVzIwOTcHU0dXMjEwMgdTR1cyMTEwB1NHVzIxMTMHU0dXMjExNAdTR1cyMTQwB1NHVzIxNTAHU0dXMjE1MQdTR1cyMTYxB1NHVzIxNjMHU0dXMjE4MAdTR1cyMTgyB1NHVzIyMDAHU0dXMjIwOQdTR1cyNTExB1NHVzI1MTIHU0dXMjUxMwdTR1cyNTIwB1NHVzI1MjEHU0dXMjUzMAdTR1cyNTMyB1NHVzI1MzMHU0dXMjU5MAdTR1cyNTkxB1NHVzI2MDAHU0dXMjYwMQdTR1cyNjAzB1NHVzI2MTEHU0dXMjYzMgdTR1cyNjUxB1NHVzI3MjQHU0dXMjgxMwdTR1cyODIwB1NHVzI4MjQHU0dXMjgyNQdTR1cyODI4B1NHVzI4MzAHU0dXMjg2MAdTR1cyODgwB1NHVzMwMTEHU0dXMzAxMwdTR1czMDE0B1NHVzMwMTUHU0dXMzAxNgdTR1czMDE3B1NHVzMwMTkHU0dXMzAyMAdTR1czMDIxB1NHVzMwMzAHU0dXMzAzMwdTR1czMDQxB1NHVzMwNTAHU0dXMzA1MgdTR1czMDYwB1NHVzMwNzAHU0dXMzA3MQdTR1czMDcyB1NHVzMwNzQHU0dXMzA3NgdTR1czMDc4B1NHVzMwNzkHU0dXMzA4MAdTR1czMDgyB1NHVzMyMDQHU0dXMzIwNgdTR1czMjExB1NHVzMyMTIHU0dXMzIzMwdTR1czMjM1B1NHVzMyMzYHU0dXMzI1NwdTR1czMjYwB1NHVzMyNjIHU0dXMzI2MwdTR1czMjcwB1NHVzMyNzIHU0dXMzI3MwdTR1czMzAxB1NHVzMzMDMHU0dXMzMxMQdTR1czMzEyB1NHVzMzMzAHU0dXMzMzMQdTR1czMzMzB1NHVzMzMzQHU0dXMzMzNgdTR1czNDAxB1NHVzM0MDIHU0dXMzQwMwdTR1czNDA0B1NHVzM0MTIHU0dXMzQxMwdTR1czNDIzB1NHVzM1MDcHU0dXMzUwOQdTR1czOTA5B1NHVzQwNzAHU0dXNDA5MAdTR1c0NjAwB1NHVzQ4MDAHU0dXNTAxMAdTTEMxMzAyB1NMQzE2MjAHU0xDMTY0MAdTTEMxODIxB1NMQzE4MzIHU0xDMTg0MQdTTE0xMDIyB1NMTTEyMDEHU0xNMTMyMwdTTE0xMzc5B1NMTTE1NDkHU0xNMTYwNAdTTE0xNzA2B1NMTTE3MTMHU0xNMTc2NQdTTE0xNzc1B1NMTTE5MDEHU0xNMTkyMAdTTE0xOTgyB1NMTTIwNTAHU0xNMjEyMwdTTE0yMTYwB1NMTTIyMzQHU0xNMzA2MAdTTE0zMTI0B1NMWjEwMTAHU0xaMTAxMQdTTFoxMDQ1B1NMWjExMDIHU0xaMTEyMAdTTFoxMjAxB1NMWjEyMjEHU0xaMTIzMAdTTFoxMjMyB1NMWjEyMzMHU0xaMTI0MAdTTFoxMjQxB1NMWjEyNjAHU0xaMTI2MQdTTFoxMjcwB1NMWjEzMDAHU0xaMTMwMQdTTFoxMzAzB1NMWjEzMjAHU0xaMTMyMQdTTFoxMzIzB1NOVDExMDAHU05UMTEwMwdTTlQxMTExB1NOVDExMTMHU05UMTEyMAdTTlQxMTIxB1NOVDExMzAHU05UMTEzMQdTTlQxMTMyB1NOVDEyNjAHU05UMTMwMAdTTlQxMzAyB1NOVDEzMDYHU05UMTMyMAdTTlQxMzIyB1NOVDEzNDEHU05UMTM1MwdTTlQxMzYwB1NOVDE0MDEHU05UMTQwNgdTTlQxNDA3B1NOVDE0MjAHU05UMTQ2MwdTTlQxNTEwB1NOVDE1MTEHU05UMTUxMgdTTlQxNTEzB1NOVDE1MTQHU05UMTUxNQdTTlQxNTE2B1NOVDE1MTcHU05UMTUyMgdTTlQxNTUwB1NOVDE1ODEHU05UMTU4MgdTTlQxNTgzB1NOVDE5MTAHU05UNDEyMAdTTlQ5MDIwB1NOVDkwMjMHU05UOTAzMgdTTlQ5MDQwB1NOVDkwNDEHU05UOTA0NQdTTlQ5MDQ2B1NOVDkwNDcHU1BCMDAwMwdTUEIxMDEwB1NQQjEwMTEHU1BCMTAxMgdTUEIxMDEzB1NQQjEwMjQHU1BCMTAyOAdTUEIxMTA0B1NQQjExMDYHU1BCMTExMAdTUEIxMTExB1NQQjExMTMHU1BCMTEyMAdTUEIxMTIzB1NQQjExMjUHU1BCMTE0MwdTUEIxMTUzB1NQQjExNjIHU1BCMTE3MAdTUEIxMTkxB1NQQjEyMjEHU1BCMTI1NAdTUEIxMjgxB1NQQjEyODkHU1BCMTMwNQdTUEIxMzExB1NQQjEzMzQHU1BCMTQ0MgdTUEIxNTEwB1NQQjE1NjQHU1BCMTYyMgdTUEIxNzAzB1NQQjE3NTAHU1BCMTc1MQdTUEIxOTA0B1NQQjE5MDgHU1BCMTk0MQdTUEIyNDQ1B1NQQjI0NzEHU1BCMjUyOQdTUEIyNTc0B1NQQjI2NTIHU1BCMjY4MAdTUEIyNzUzB1NQQjI3NjAHU1BCMzAzNQdTUEIzMDQ0B1NQQjMwNjEHU1BCMzA2NAdTUEIzMDY2B1NQQjMwNzIHU1BCMzA4MwdTUEIzMTEyB1NQQjMxMTQHU1BCMzEzNgdTUEIzMTY4B1NQQjMxNzAHU1BCMzE4MgdTUEIzMjMwB1NQQjMyMzUHU1BCMzI2MAdTUEIzMzEzB1NQQjM0MTQHU1BCMzQxNwdTUEIzNDE4B1NQQjM0MTkHU1BCMzQzMQdTUEIzNDM1B1NQQjM0NTEHU1BCMzQ3MgdTUEIzNDc0B1NQQjM0NzgHU1BCMzUwNgdTUEIzNjUzB1NQQjM2NTUHU1BCMzkyMgdTUEI0MDE0B1NQQjQwNDEHU1BCNDExNAdTUEI0MjAwB1NQQjQyMjMHU1BCNDIzNQdTUEI0MjYwB1NQQjUxMjAHU1BCNjAxMAdTUEI2MDExB1NQQjYwMTIHU1BCNjAxMwdTUEI2MDIwB1NQQjYwMjQHU1BCNjA0MAdTUEI2MDQxB1NQQjYwNDMHU1BCNjA1MwdTUEI2MDU1B1NQQjYwNTcHU1BCNjA3MgdTUEI2MDgwB1NQQjYwODEHU1BCNjA5MwdTUEI2MDk1B1NQQjYxMDIHU1BCNjEzMQdTUEI2MTMzB1NQQjYxNTEHU1BCNjE2MQdTUEI2MTY4B1NQQjYzMDAHU1BCNjMwMwdTUEI2MzQxB1NQQjY1MDIHU1BCNjUxMQdTUEI2NTEyB1NQQjY1MTMHU1BCNjUzMgdTUEI2NTM1B1NQQjY1NDAHU1BCNjYwMAdTUEI2NjAyB1NQQjY2NDAHU1BCNjY0MgdTUEI2NzA2B1NQQjY3MzAHU1BCNjgxMAdTUEI2OTMxB1NQQjkwMjMHU1BCOTAyOAdTUEI5MDYyB1NQQjkwNjQHU1BCOTA2NQdTUEI5MDY2B1NQQjkwNjcHU1BCOTA2OAdTUEI5MDY5B1NQQjkwOTIHU1BCOTA5MwdTVEoxMTEwB1NUSjEyNjAHU1RKMTM1MwdTVEoxNDQwB1NUSjE1ODIHU1RKMTcxMAdTVEoxODUxB1NUSjE4NjEHU1RKMTk2MAdTVEozMDE0B1NUSjMxNzMHU1RKNDAxNAdTVlIwMDAwB1NWUjEwMTcHU1ZSMTAyMAdTVlIxMTA3B1NWUjEyNjMHU1ZSMTMwMQdTVlIxMzM2B1NWUjE0MDYHU1ZSMTY5NAdTVlIxNzUyB1NWUjE3NTMHU1ZSMTc1NAdTVlIxODMxB1NWUjE4NTIHU1dHMTA5MQdTV1ExMDE0B1NXUTEwMTYHU1dRMTEwNAdTV1ExMTA5B1NXUTExNjMHU1dRMTIxMwdTV1ExMjU0B1NXUTIwMzcHU1dRMjAzOAdTV1EyMzM3B1NXUTI0NDMHU1dRMjYxMQdTV1EyNjQ4B1NXUTI4MDIHU1dRMzAxNQdTV1EzMDM5B1NXUTMxNTkHU1dRMzMyMQdTV1EzNDE4B1NXUTM1MzQHU1dRMzUzNQdTV1E4MDEwB1NXUTkwMjYEVFAwMQdUWE4xMTMzB1RYTjExMzgHVFhOMTE3MwdUWE4xMjgwB1RYTjEyODIHVFhOMTMwMwdUWE4xMzE3B1RYTjEzNTYHVFhOMTQ0MwdUWE4xNDUwB1RYTjE0NjAHVFhOMTQ2MgdUWE4xNTM0B1RYTjE1NDMHVFhOMTYwNAdUWE4xNjEyB1RYTjE2MjEHVFhOMTgwMgdUWE4xOTUxB1RYTjIxNDMHVFhOMjE0NQdUWE4yMTQ2B1RYTjIyMDAHVFhOMjIxMAdUWE4yMjYxB1RYTjIzMTEHVFhOMjMzMwdUWE4yMzUyB1RYTjIzNTUHVFhOMjQwNwdUWE4yNDA5B1RYTjI0MjIHVFhOMjQ3MAdUWE4yNTExB1RYTjI1NDEHVFhOMjU1MAdUWE4yNTcxB1RYTjI2MTAHVFhOOTAxMAdUWE45MDIwB1RYTjkwMzIHVFhOOTAzNwdUWE45MDM4B1ZDVDEwMjAHVkNUMTAzMgdWQ1QxMDM0B1ZDVDEwNzEHVkNUMTEwMQdWQ1QxMTcyB1ZDVDEyNTEHVkNUMTMwNAdWQ1QxMzE0B1ZDVDEzMTYHVkNUMTMxOAdWQ1QxMzM1B1ZDVDE1MDQHVkNUMTUwNQdWQ1QxNTE5B1ZDVDE1MzAHVkNUMTYyMQdWQ1QxNjYwB1ZDVDE2NzEHVkNUMTY3NAdWQ1QxNjc1B1ZDVDE2NzYHVkNUMTY3NwdWQ1QxNzExB1ZDVDE3NjIHVkNUMTg0MAdWQ1QxOTA3B1ZDVDIwNDQHVkNUMjA1MQdWQ1QyMDU1B1ZDVDIwNjcHVkNUMjA3MgdWQ1QyMDczB1ZDVDIwNzQHVkNUMjA4MAdWQ1QyMTAzB1ZDVDIxMDQHVkNUMjEwNQdWQ1QyMTA5B1ZDVDIxMTYHVkNUMjEyNAdWQ1QyMTM2B1ZDVDIxNjIHVkNUMjIwMQdWQ1QyMjAzB1ZDVDIyMTEHVkNUMjIyNAdWQ1QyMjMzB1ZDVDIyNTMHVkNUMjI4MQdWQ1QyNTAxB1ZDVDI1MDIHVkNUMjUwMwdWQ1QyNTA4B1ZDVDI1MzAHVkNUMjUzMQdWQ1QyNTMyB1ZDVDI1NTIHVkNUMjU3OQdWQ1QyNjQwB1ZDVDI2NDQHVkNUMjY2MAdWQ1QyNjYzB1ZDVDI2NjUHVkNUMjY5MgdWQ1QyNzA3B1ZDVDI3MzMHVkNUMjczNQdWQ1QyNzUxB1ZDVDI3NTIHVkNUMjc1MwdWQ1QyNzYxB1ZDVDI3NzIHVkNUMjc4NgdWQ1QyNzg4B1ZDVDI4MDAHVkNUMjgwMwdWQ1QyODEwB1ZDVDI4MzIHVkNUMjgzMwdWQ1QyODQzB1ZDVDI4NTEHVkNUMjg1MwdWQ1QyOTAzB1ZDVDI5MDcHVkNUMjkwOQdWQ1QyOTYwB1ZDVDI5NjMHVkNUMjk4NwdWQ1Q5MDIxB1ZDVDkwMjIHVkNUOTAyMwdWQ1Q5MDI4B1ZDVDkwMzEHVkNUOTAzMgdWQ1Q5MDM1B1ZDVDkwNDAHVkNUOTA0NQdWQ1Q5MDQ2B1ZDVDkwNDgHVkNUOTA1MgdWQ1Q5MDUzB1ZDVDkwNTYHVkNUOTA1OQdWQ1Q5MDYxB1ZDVDkwNjYHVkNUOTA4MgdWQ1Q5MDgzB1ZDVDkwODQHVkNUOTA4NgdWTFQxMDQwB1ZMVDExNTAHVkxUMTIzNwdWTFQxMjUxB1ZMVDE0NTcHVkxUMTUyMQdWTFQxNjQ1B1ZMVDIwMDAHWEJYMTA4NAdYQlgxMDg2B1hCWDEyMDIHWEpSMTAyNAdYSlIxMDYwB1hKUjEwNzEHWEpSMTExMgdYSlIxMzQxB1hKUjE4NjUHWExOMTA4MgdYTE4xMDgzB1hMTjEzMjAHWExOMTMyMQdYTE4xNDMxB1hMTjkwNDAHWFJBMTAzMwdYUkExMDM1B1hSQTExMTEHWFJBMTExMgdYUkExMTE0B1hSQTExMTUHWFJBMTExNwdYUkExMTE4B1hSQTExNDEHWFJBMTE2MAdYUkExMTYyB1hSQTExNjMHWFJBMTIwMQdYUkExMjAyB1hSQTEyMDMHWFJBMTIwNgdYUkExMjMwB1hSQTEyMzUHWFJBMTIzNwdYUkExMjM5B1hSQTEzMzAHWFJBMTM0NgdYUkExMzQ3B1hSQTEzNDgHWFJBMTM0OQdYUkExNDAwB1hSQTE0MDMHWFJBMTQwNgdYUkExNTIxB1hSQTE1MjIHWFJBMTUyNAdYUkExNTI1B1hSQTE1MjcHWFJBMTYwMgdYUkExNjA0B1hSQTE2MTAHWFJBMTYxMQdYUkExNjEyB1hSQTE2NjAHWFJBMTcwMgdYUkExNzAzB1hSQTE3MDYHWFJBMTcwNwdYUkExNzExB1hSQTE3MTMHWFJBMTgwNwdYUkExODA4B1hSQTE4MTYHWFJBMTgyMAdYUkExODIyB1hSQTE4MjMHWFJBMTgyNQdYUkEyMDExB1hSQTIwMTMHWFJBMjAxNAdYUkEyMDE4B1hSQTIwODAHWFJBMjA4MQdYUkEyMDg0B1hSQTIxMDIHWFJBMjEwMwdYUkEyMTEwB1hSQTIxMzEHWFJBMjEzMgdYUkEyMTQ0B1hSQTIxNTEHWFJBMjE1NQdYUkEyMTYyB1hSQTIxNzIHWFJBMjE3NQdYUkEyMTkwB1hSQTIyMDAHWFJBMjIwMQdYUkEyMjAyB1hSQTIyMDQHWFJBMjIwNgdYUkEyMjMwB1hSQTIyMzEHWFJBMjIzMwdYUkEyMjM1B1hSQTIyMzYHWFJBMjI0MgdYUkEyMjQ0B1hSQTIyNjAHWFJBMjI2MQdYUkEyMjY0B1hSQTIyNjYHWFJBMjQwMAdYUkEyNDAzB1hSQTI0MDQHWFJBMjQwNQdYUkEyNDA2B1hSQTI0MzEHWFJBMjQzMwdYUkEyNDM0B1hSQTI0MzcHWFJBMjQ3MQdYUkEyNDczB1hSQTI1MDEHWFJBMjUwMwdYUkEyNTA1B1hSQTI1MDYHWFJBMjUwNwdYUkEyNTMwB1hSQTI1MzIHWFJBMjU1MAdYUkEyNTUyB1hSQTI2MDMHWFJBMjYzMgdYUkEyNjUyB1hSQTI2NTMHWFJBMjY5MAdYUkEyNzA1B1hSQTI3MDYHWFJBMjcwNwdYUkEyNzA4B1hSQTI3MDkHWFJBMjc3MAdYUkE5MDExB1hSQTkwMjEHWFJBOTAyMgdYUkE5MDIzB1hSQTkwMjUHWFJBOTAyNgdYUkE5MDMxB1hXSzEwMTEHWFdLMTAxMgdYV0sxMDIxB1hXSzEwMjMHWFdLMTAyNAdYV0sxMDI1B1hXSzExMDUHWFdLMTExMgdYV0sxMTE0B1hXSzExMTUHWFdLMTExNgdYV0sxMTE4B1hXSzExMTkHWFdLMTEzNQdYV0sxMTQyB1hXSzExNDQHWFdLMTIxMQdYV0sxMjIxB1hXSzEyMzAHWFdLMTIzMgdYV0sxMjMzB1hXSzEyMzQHWFdLMTI0MQdYV0sxMjUwB1hXSzEzMTEHWFdLMTMzMgdYV0sxMzM0B1hXSzE3MDAHWFdLMTcwMQdYV0sxNzAzB1hXSzE3MDQHWFdLMTcwNgdYV0sxNzE1B1hXSzE4MjIHWFdLMTgyMwdYV0sxODMxB1hXSzE4NDAHWFdLMTg0MgdYV0sxODUzB1hXSzE4NjIHWFdLMTg3MwdYV0sxODc0B1hXSzE4NzUHWFdLMjAxMQdYV0syMDE0B1hXSzIwMTcHWFdLMjAyMAdYV0syMDMyB1hXSzIwMzMHWFdLMjAzNAdYV0syMDM1B1hXSzIxMDEHWFdLMjEyMQdYV0syMTUzB1hXSzIyMzAHWFdLMjIzMQdYV0syMjMyB1hXSzIyMzUHWFdLMjI0MAdYV0syMjQyB1hXSzIyNTMHWFdLMjI3MAdYV0syMjcxB1hXSzIyNzMHWFdLMjI3NAdYV0syMzMyB1hXSzIzMzMHWFdLMjM2MwdYV0syMzY1B1hXSzIzNjkHWFdLMjQwMgdYV0syNDAzB1hXSzI0MDQHWFdLMjQwNgdYV0syNDA3B1hXSzI0MjEHWFdLMjQzNAdYV0syNDQwB1hXSzI0NDEHWFdLMjQ0MwdYV0syNDcwB1hXSzI0NzEHWFdLMjQ3MgdYV0syNDczB1hXSzI0NzUHWFdLMjQ3NwdYV0syNTAzB1hXSzI1MDQHWFdLMjUwNQdYV0syNTIwB1hXSzI1MzYHWFdLMjU1MQdYV0syNTU2B1hXSzI1NTcHWFdLMjU3MAdYV0syNTczB1hXSzI1ODAHWFdLMjU4MwdYV0syNTg1B1hXSzI2MDEHWFdLMjYxMAdYV0syNjExB1hXSzI2MTMHWFdLMjYxNAdYV0syNjIwB1hXSzI2MzAHWFdLMjYzMwdYV0syOTAxB1hXSzI5MTEHWFdLMjkyNQdYV0syOTI2B1hXSzMwMDAHWFdLOTAxMgdYV0s5MDE1B1hXSzkwMTYHWFdLOTAxNwdYV0s5MDMxB1hXSzkwMzIHWFdLOTAzNQdYV0s5MDM3B1hXSzkwMzkHWFdLOTA3MwdaQkIxMDI0B1pCQjEwNTAHWkJCMTA1MQdaQkIxMDkzB1pCQjExNDMHWkJCMTE2MAdaQkIxMTYyB1pCQjExNjMHWkJCMTE2NAdaQkIxMjAwB1pCQjEyMDEHWkJCMTIxMgdaQkIxMjEzB1pCQjEyNDAHWkJCMTI0MgdaQkIxMzAyB1pCQjEzMDYHWkJCMTMwNwdaQkIxMzA5B1pCQjEzMjAHWkJCMTMyMQdaQkIxMzIyB1pCQjEzMjMHWkJCMTMyNAdaQkIxMzI1B1pCQjEzMjcHWkJCMTMyOAdaQkIxMzQxB1pCQjEzNjIHWkJCMTM3MQdaQkIxNDIxB1pCQjE0MzEHWkJCMTQ1MAdaQkIxNDUxB1pCQjE1MDAHWkJCMTUwMQdaQkIxNTAyB1pCQjE1MDMHWkJCMTUwNQdaQkIxNTA2B1pCQjE1MDcHWkJCMTUwOAdaQkIxNTA5B1pCQjE1NTAHWkJCOTAzMAdaQkcwMDAwB1pCRzEwMTEHWkJHMTA0MAdaQkcxMDQxB1pCRzEwNTEHWkJHMTA1MgdaQkcxMDUzB1pCRzEwNTQHWkJHMTA1NwdaQkcxMDU4B1pCRzEwOTQHWkJHMTEwMQdaQkcxMTExB1pCRzExMTMHWkJHMTEyMAdaQkcxMTIxB1pCRzExMzAHWkJHMTEzMQdaQkcxMTMyB1pCRzExMzMHWkJHMTE0MQdaQkcxMTUyB1pCRzExNjAHWkJHMTE2MwdaQkcxMTY1B1pCRzExNjgHWkJHMTE3MAdaQkcxMTgyB1pCRzExODQHWkJHMTIwMAdaQkcxMjAzB1pCRzEyMTIHWkJHMTIxMwdaQkcxMjIwB1pCRzEyMzEHWkJHMTI0NQdaQkcxMjQ3B1pCRzEyNTAHWkJHMTI2MAdaQkcxMjYxB1pCRzEyODEHWkJHMTI5NQdaQkcxMzAwB1pCRzEzMDEHWkJHMTMwMgdaQkcxMzAzB1pCRzEzMDUHWkJHMTMwNgdaQkcxMzA3B1pCRzEzMDgHWkJHMTMwOQdaQkcxMzIxB1pCRzEzMjIHWkJHMTM0MAdaQkcxMzkxB1pCRzE0MDAHWkJHMTQwMQdaQkcxNDA5B1pCRzE0MTEHWkJHMTQyMAdaQkcxNDIxB1pCRzE0MjIHWkJHMTQyMwdaQkcxNDMxB1pCRzE0NDIHWkJHMTQ0MwdaQkcxNDQ1B1pCRzE0NTQHWkJHMTQ4MgdaQkcxNDkxB1pCRzE0OTIHWkJHMTUwMAdaQkcxNTAyB1pCRzE1MTEHWkJHMTUxMgdaQkcxNTEzB1pCRzE1MjIHWkJHMTU2MAdaQkcxNTYzB1pCRzE2MDQHWkJHMTYwNQdaQkcxNjA4B1pCRzE2MTEHWkJHMTYxOAdaQkcxNjQxB1pCRzE2NTEHWkJHMTY1MgdaQkcxNjUzB1pCRzE2NzAHWkJHMTY3NQdaQkcxNzQyB1pCRzE3NTAHWkJHMTc1MwdaQkcxNzU1B1pCRzE3NjIHWkJHMTc4MQdaQkcxODAyB1pCRzE4MDMHWkJHMTgwNAdaQkcxODA3B1pCRzE4MDkHWkJHMTgxMAdaQkcxODMxB1pCRzE4MzIHWkJHMTgzMwdaQkcxODUwB1pCRzE5MDcHWkJHMTkyMAdaQkcxOTIxB1pCRzE5MzEHWkJHMTkzOQdaQkcyMDEwB1pCRzIwMTMHWkJHMjAyNQdaQkcyMDMzB1pCRzIwMzYHWkJHMjA0MQdaQkcyMDQ1B1pCRzIwNjEHWkJHMjA2MwdaQkcyMDczB1pCRzIwNzQHWkJHMjA3NwdaQkcyMDc5B1pCRzIxMTIHWkJHMjE1MwdaQkcyMjUxB1pCRzIyNzMHWkJHMjI4MAdaQkcyMjkzB1pCRzIzMDYHWkJHMjMwNwdaQkcyMzA4B1pCRzIzNDAHWkJHMjM5MAdaQkcyMzkyB1pCRzI0MTEHWkJHMjQxMgdaQkcyNDE1B1pCRzI0MTgHWkJHMjQ0MAdaQkcyNDQzB1pCRzI0NjAHWkJHMjQ2MQdaQkcyNDYzB1pCRzI0OTAHWkJHMjQ5MQdaQkcyNDkzB1pCRzI0OTQHWkJHMjQ5NQdaQkcyNDk2B1pCRzI1MDEHWkJHMjUwMgdaQkcyNTAzB1pCRzI1MDQHWkJHMjUwNwdaQkcyNTEwB1pCRzI1MjAHWkJHMjUyMgdaQkcyNTIzB1pCRzI1NDgHWkJHMjU1MgdaQkcyNTYxB1pCRzI1OTAHWkJHMjYyMAdaQkcyNjIxB1pCRzI2NDEHWkJHMjY3MgdaQkcyNjgyB1pCRzI3MzEHWkJHMjc2MwdaQkcyODAxB1pCRzI4MzMHWkJHMjg0MwdaQkcyODUxB1pCRzMwMTAHWkJHMzAyMAdaQkczMDIxB1pCRzMwMjIHWkJHMzAyMwdaQkczMDI0B1pCRzMwMjUHWkJHMzAzNwdaQkczMDQzB1pCRzMwNDQHWkJHMzA0NwdaQkczMDUxB1pCRzMwNjIHWkJHMzA2MwdaQkczMDY0B1pCRzMwNjkHWkJHMzA5MAdaQkczMDkxB1pCRzMwOTIHWkJHMzEwNgdaQkczMTA4B1pCRzMxMDkHWkJHMzE0MAdaQkczMTQyB1pCRzMyMDYHWkJHMzIwNwdaQkczMjMxB1pCRzMyNDEHWkJHMzI0NAdaQkczMjUwB1pCRzMyNTEHWkJHMzI2MAdaQkczMzEwB1pCRzM0MDAHWkJHMzQwMgdaQkczNDEwB1pCRzM0NTAHWkJHMzQ1MgdaQkczNTAyB1pCRzM1MDMHWkJHMzUyNgdaQkczNTY4B1pCRzM1NzEHWkJHMzYwMQdaQkczNjAyB1pCRzM2MDMHWkJHMzYwNAdaQkczNjA2B1pCRzM2MDcHWkJHMzYwOAdaQkczNjQxB1pCRzM2NDMHWkJHMzY1NAdaQkczNjU2B1pCRzM2NTgHWkJHMzY2MAdaQkczNjYxB1pCRzM2ODEHWkJHMzY4MgdaQkczNzExB1pCRzM3MTIHWkJHMzc0MAdaQkczOTAxB1pCRzM5NTEHWkJHNDAyMgdaQkc0MTAxB1pCRzQxMDMHWkJHNDIwMgdaQkc0MzAzB1pCRzUwMjIHWkJHOTAxMQdaQkc5MDE1B1pCUjEwMTYHWkJSMTAxOQdaQlIxMTkwB1pCUjEyOTEHWkJSMTMwMQdaQlIxMzExB1pCUjEzNDMHWkJSMTM3MwdaQlIxNDAyB1pCUjE0MTMHWkJSMTQyOQdaQlIxNDMxB1pCUjE0NTYHWkJSMTQ4MAdaQlIxNDkyB1pCUjE1MjAHWkJSMTUzMQdaQlIxNTQyB1pCUjE1NjEHWkJSMTU3MQdaQlIxNTcyB1pCUjE1ODEHWkJSMTU5MQdaQlIxNjAyB1pCUjE3MTAHWkJSMTcxMgdaQlIxNzEzB1pCUjE3MTYHWkJSMTcxOAdaQlIxNzMxB1pCUjE3MzMHWkJSMTc2MgdaQlIxNzgzB1pCUjE4MDAHWkJSMTgwMQdaQlIxODA2B1pCUjE4MzQHWkJSMTgzNgdaQlIxODM3B1pCUjE4NTEHWkJSMTkwMAdaQlIxOTUwB1pCUjE5ODIHWkJSMjA2MQdaQlIyMDc0B1pCUjIxMzMHWkJSMjE0MAdaQlIyMzA1B1pCUjI1MTgHWkJSMjU0MgdaQlIyNTUxB1pCUjI1NjMHWkJSMjU4MAdaQlIyNTgxB1pCUjI2MDAHWkJSMjYwMQdaQlIyNjA3B1pCUjI2NzIHWkJSMjcwMgdaQlIyNzAzB1pCUjI3MDQHWkJSMjcwNQdaQlIyNzIyB1pCUjI3MjcHWkJSMjcyOAdaQlIyNzkzB1pCUjI3OTQHWkJSMjgwNAdaQlIyODA3B1pCUjI4MDgHWkJSMjgwOQdaQlIyODUwB1pCUjI4NTIHWkJSMjkxMwdaQlIyOTIxB1pCUjI5MjMHWkJSMjkyNQdaQlIyOTI2B1pCUjI5MzAHWkJSMjkzMQdaQlIyOTQwB1pCUjI5NDEHWkJSMjk1MAdaQlIyOTUyB1pCUjMwMTEHWkJSMzAxMgdaQlIzMDEzB1pCUjMyMTMHWkJSMzI0MQdaQlIzMjUxB1pCUjMyNjEHWkJSMzI3MQdaQlIzMjcyB1pCUjMzMDMHWkJSMzMwNAdaQlIzMzA1B1pCUjMzMDkHWkJSMzMxMQdaQlIzMzIyB1pCUjMzMjMHWkJSMzMyNAdaQlIzMzI1B1pCUjMzMjcHWkJSMzM5MgdaQlIzMzk0B1pCUjMzOTUHWkJSMzQzMgdaQlIzNDQzB1pCUjM0NTcHWkJSMzQ2MQdaQlIzNDcxB1pCUjM0NzYHWkJSMzQ5MQdaQlIzNTAwB1pCUjM1MTAHWkJSMzU0MAdaQlIzNTUwB1pCUjM1NTIHWkJSMzU3MAdaQlIzNjEwB1pCUjM2MTQHWkJSMzY0MQdaQlIzNjQ5B1pCUjM3MDMHWkJSMzcyMAdaQlIzNzMwB1pCUjM4NTAHWkJSMzkwMAdaQlI0MTczB1pCUjQyMjQHWkJSNDIzMAdaQlI0MjUxB1pCUjQzMjAHWkJSNDMyMQdaQlI0MzUyB1pCUjQzNjAHWkJSNDQyNQdaQlI0NDI3B1pCUjUwMTAHWkJSNTAxMQdaQlI5MDMzB1pCUjkwMzkHWkJSOTA0MgdaUlEwMDI2B1pSUTEwMTIHWlJRMTA3NAdaUlExMDgwB1pSUTEwODcHWlJRMTEwMQdaUlExMTA0B1pSUTExMTEHWlJRMTEyMQdaUlExMTMyB1pSUTExMzQHWlJRMTE0MAdaUlExMTUzB1pSUTExNTQHWlJRMTE1NgdaUlExMTczB1pSUTExODAHWlJRMTE4MQdaUlExMTgyB1pSUTExODUHWlJRMTIxNAdaUlExMjIyB1pSUTEzMTAHWlJRMTMxMQdaUlExMzE3B1pSUTEzMjEHWlJRMTM2MAdaUlExMzYyB1pSUTEzNjMHWlJRMTM2NQdaUlExNDEwB1pSUTE0MTEHWlJRMTQxMwdaUlExNDIyB1pSUTE1MDEHWlJRMTUwMgdaUlExNTMyB1pSUTE1NTIHWlJRMTU2MQdaUlExNTcwB1pSUTE2MDIHWlJRMTYxNwdaUlExNjIwB1pSUTE2MzEHWlJRMTYzMgdaUlExNjM1B1pSUTE2MzYHWlJRMTYzNwdaUlExNjUxB1pSUTE2NTMHWlJRMTY3MgdaUlExNzEyB1pSUTE3MTUHWlJRMTcyMgdaUlExNzMwB1pSUTE3MzEHWlJRMTc0MwdaUlExNzYwB1pSUTE3NjEHWlJRMTgxMAdaUlExODUwB1pSUTE4NTEHWlJRMTkxMAdaUlExOTE2B1pSUTE5MTgHWlJRMTkxOQdaUlEyMDEwB1pSUTIwMTIHWlJRMjAxMwdaUlEyMDE0B1pSUTIwMTUHWlJRMjAxNgdaUlEyMDE4B1pSUTIwMTkHWlJRMjAyMgdaUlEyMDI0B1pSUTIwMjUHWlJRMjA1MQdaUlEyMDc1B1pSUTIwNzYHWlJRMjEwNgdaUlEyMTIxB1pSUTIxNjAHWlJRMjIwMgdaUlEyMjAzB1pSUTIyMDQHWlJRMjIwNgdaUlEyMjA3B1pSUTIyMjIHWlJRMjI0MQdaUlEyMjYwB1pSUTIyNjMHWlJRMjI2NQdaUlEyMjY4B1pSUTIzMDQHWlJRMjMwOQdaUlEyMzEwB1pSUTIzMjMHWlJRMjMzMgdaUlEyMzMzB1pSUTIzMzcHWlJRMjMzOAdaUlEyMzM5B1pSUTIzNTAHWlJRMjM1MQdaUlEyMzUyB1pSUTIzNjAHWlJRMjM2NwdaUlEyMzY4B1pSUTIzNjkHWlJRMjM3NAdaUlEyMzc1B1pSUTI0MDQHWlJRMjQwNQdaUlEyNDA2B1pSUTI0MjEHWlJRMjQyNAdaUlEyNDQxB1pSUTI1MDIHWlJRMjUwMwdaUlEyNTA1B1pSUTI1MjIHWlJRMjUzMQdaUlEyNTQwB1pSUTI1NTAHWlJRMjU1MQdaUlEyNTcwB1pSUTI1NzEHWlJRMjU3NQdaUlEyNjAwB1pSUTI2MDQHWlJRMjYwNQdaUlEyNjA5B1pSUTI2NjEHWlJRMjY4MAdaUlEyNzMwB1pSUTI3NjQHWlJRMjc3MQdaUlEyNzkxB1pSUTI4MDAHWlJRMjgwMQdaUlEyODA2B1pSUTI4MzEHWlJRMjg0MQdaUlEyODUzB1pSUTI4NTUHWlJRMjg2MQdaUlEyODcwB1pSUTI4ODEHWlJRMjg4NAdaUlEyODg1B1pSUTI5MDIHWlJRMjkyMgdaUlEyOTYyB1pSUTI5NjUHWlJRMzAxMAdaUlEzMDcwB1pSUTMwNzMHWlJRMzEwMAdaUlEzMTAxB1pSUTMxMjMHWlJRMzEzNAdaUlEzMTYxB1pSUTMxNzIHWlJRMzE3NQdaUlEzMTc5B1pSUTMzMDEHWlJRMzMyMAdaUlEzMzIxB1pSUTMzNDAHWlJRMzM1MAdaUlEzNDAxB1pSUTM0MDYHWlJRMzQwNwdaUlEzNDMxB1pSUTM0MzMHWlJRMzQ0MgdaUlEzNDQzB1pSUTM0NDUHWlJRMzQ2NQdaUlEzNTQwB1pSUTM1NDEHWlJRMzU0MwdaUlEzNTYxB1pSUTM1NzEHWlJRMzYwMAdaUlEzNjAyB1pSUTM2MTEHWlJRNDAxMwdaUlE0MDE1B1pSUTQwMTcHWlJRNDAxOQdaUlE0MDIwB1pSUTQwMzEHWlJRNDA3NAdaUlE0MDc2B1pSUTQwOTQHWlJRNDA5NwdaUlE0MTAxB1pSUTQxMjAHWlJRNDEyMgdaUlE0MTQzB1pSUTQxNDUHWlJRNDE2MgdaUlE5MDEwB1pSUTkwMTEHWlJROTAzMQdaVE4xMDEyB1pUTjEwMTgHWlROMTAzMAdaVE4xMDM1B1pUTjEwMzgHWlROMTAzOQdaVE4xMDUxB1pUTjEwODMHWlROMTEwMQdaVE4xMTAyB1pUTjExMTIHWlROMTEyNAdaVE4xMTMzB1pUTjExNDYHWlROMTE1MAdaVE4xMTY0B1pUTjExNjcHWlROMTIwNAdaVE4xMjM0B1pUTjEzMzUHWlROMTM2MAdaVE4xMzYxB1pUTjEzNjUHWlROMTM2OQdaVE4xNDEwB1pUTjE0MTIHWlROMTQxNAdaVE4xNDIwB1pUTjE0NDMHWlROMTQ4MQdaVE4xNDg3B1pUTjE0OTIHWlROMTUwNwdaVE4xNTA5B1pUTjE1MTkHWlROMTU1MAdaVE4xNTg1B1pUTjE1OTAHWlROMTU5MQdaVE4xNTk3B1pUTjE2MDIHWlROMTY0MAdaVE4xNjUxB1pUTjE2NTMHWlROMTY5MQdaVE4xNzUwB1pUTjE3OTAHWlROMTgxMgdaVE4xODE2B1pUTjE4MjIHWlROMTg1MwdaVE4xODU0B1pUTjE5MDUHWlROMTkwNgdaVE4xOTA3B1pUTjIwNTQHWlROMjA3MAdaVE4yMDc2B1pUTjIwODEHWlROMjE0MAdaVE4yMTQxB1pUTjIyMDMHWlROMjIwNQdaVE4yMjA3B1pUTjIyMDkHWlROMjIyMAdaVE4yMjI0B1pUTjIyNzIHWlROMjI4MAdaVE4yMzAyB1pUTjIzNjUHWlROMjM4MAdaVE4yMzgxB1pUTjIzODIHWlROMjM4MwdaVE4yNDA2B1pUTjI0MDcHWlROMjQwOAdaVE4yNDA5B1pUTjI0MTEHWlROMjQ1MAdaVE4yNDUxB1pUTjI0NjIHWlROMjQ3MgdaVE4yNDc1B1pUTjI1MDMHWlROMjUwNAdaVE4yNTEwB1pUTjI1NDIHWlROMjU0NwdaVE4yNTczB1pUTjI2MDgHWlROMjYwOQdaVE4yNjQwB1pUTjI2NDIHWlROMjY3NQdaVE4yNzAwB1pUTjI3MTQHWlROMjcxNwdaVE4yNzE4B1pUTjI3NDUHWlROMjc3MwdaVE4yNzg2B1pUTjI4MTMHWlROMjgzMAdaVE4yODMyB1pUTjI4MzgHWlROMjg4MQdaVE4yODgyB1pUTjI4ODMHWlROMjkwMQdaVE4yOTA2B1pUTjI5MDcHWlROMjkxMwdaVE4yOTYwB1pUTjMyMDEHWlROMzIxMgdaVE4zMjE1B1pUTjMyMTcHWlROMzIyNAdaVE4zMjUxB1pUTjMyNzEHWlROMzI3MwdaVE4zMzA1B1pUTjMzMTAHWlROMzMxMQdaVE4zMzI0B1pUTjMzMzEHWlROMzMzMgdaVE4zMzQwB1pUTjMzNTEHWlROMzM1MwdaVE4zMzYwB1pUTjMzNjIHWlROMzM4MAdaVE4zMzg0B1pUTjM0MDAHWlROMzQwNgdaVE4zNDMwB1pUTjM0MzIHWlROMzQzNQdaVE4zNDM2B1pUTjM0NDMHWlROMzQ1MAdaVE4zNDYwB1pUTjM1MDMHWlROMzUwNAdaVE4zNTA1B1pUTjM1MDcHWlROMzUwOAdaVE4zNTA5B1pUTjM1NzIHWlROMzU5MAdaVE4zNjAyB1pUTjM2MjYHWlROMzcwOAdaVE4zNzMxB1pUTjM3NTAHWlROMzc1MgdaVE4zNzgzB1pUTjM4MDEHWlROMzgwMwdaVE40MDEwB1pUTjQwMjIHWlRONDAyMwdaVE40MDI0B1pUTjQwMjYHWlRONDAyOQdaVE40MDUwB1pUTjQwODIHWlRONDEwMQdaVE40MTIxB1pUTjQxNjYHWlRONDI5MAdaVE40MjkxB1pUTjQyOTMHWlRONDI5NwdaVE40MzAxB1pUTjQzMDQHWlRONDM0MAdaVE40MzQxB1pUTjQzNDUHWlRONDM1MQdaVE40MzYxB1pUTjQzNzAHWlRONDQwMAdaVE40NDAxB1pUTjQ0MDIHWlRONDQwNQdaVE40NDA3B1pUTjQ0MzAHWlRONDQ1MQdaVE40NDUyB1pUTjQ0NjIHWlRONDQ2MwdaVE40NDY0B1pUTjQ0NjcHWlRONDUxMQdaVE40NzAyB1pUTjQ3MDQHWlRONDkwMwdaVE40OTIyB1pUTjkwMjMHWlROOTAyNRWdJAABLwU0NjEwMAQ1MDQ0B0FURDExMTMHQVREMTE3MAdBVEQxMjM0B0FURDE0MDYHQVREMTQxMQdBVEQxNDI4B0FURDE0MzEHQVREMTQzOAdBVEQxNTAyB0FURDE1MDMHQVREMTUwNAdBVEQxNTIxB0FURDE1MzEHQVREMTYyNAdBVEQxNjMxB0FURDE3NDEHQVREMTc2MwdBVEQxODIxB0FURDE4NzAHQVREMTkwNwdBVEQxOTIwB0FURDE5NjAHQVREMTk3MAdBVEQyMDI0B0FURDIwMjcHQVREMjAyOQdBVEQyMDY5B0FURDIwODMHQVREMjIxNAdBVEQyMjczB0FURDIzMzYHQVREMjMzOAdBVEQyMzQzB0FURDIzNjQHQVREMjM3MQdBVEQyMzgwB0FURDI0NTAHQVREMjQ1MwdBVEQyNTExB0FURDI1MzAHQVREMjYwNQdBVEQyNjEwB0FURDI3MDYHQVREMjcwNwdBVEQyNzMyB0FURDI3MzMHQVREMjc1MgdBVEQyNzYwB0FURDI3NzIHQVREMjc3NwdBVEQyNzgwB0FURDI3ODEHQVREMjg0MwdBVEQyODUwB0FURDI5MDEHQVREMjk2MAdBVEQzMDE3B0FURDMwMzIHQVREMzA1MAdBVEQzMDYwB0FURDMwODAHQVREMzExMQdBVEQzMTE3B0FURDQwMDAHQVRENDA5NQdBVEQ0ODkwB0FURDkwMzYHQVREOTAzNwdBVEQ5MDQxB0FURDkwNDIHQVREOTA1NgdBVFQyNTExB0JCRzEwMTQHQkJHMTA1MAdCQkcxMDYwB0JCRzExMDQHQkJHMTIzMAdCQkcxMjQzB0JCRzEyNDUHQkJHMTI1MwdCQkcxMjcwB0JCRzEyNzMHQkJHMTMzNAdCQkcxMzM1B0JCRzE0NzIHQkJHMTYzMwdCQkcxNjY1B0JCRzE2ODQHQkJHMTY4NgdCQkcxNjg3B0JCRzE2OTEHQkJHMTcwMQdCQkcxNzEzB0JCRzE3NTIHQkJHMTc1OAdCQkcxNzcyB0JCRzE4MDEHQkJHMTgwMwdCQkcxODM1B0JCRzE4NDUHQkJHMTg0NgdCQkcxODUyB0JCRzE4NjAHQkJHMTkwMgdCQkcxOTA2B0JCRzE5MDkHQkJHMTkxNAdCQkcxOTIxB0JCRzE5MjIHQkJHMTkyOAdCQkcxOTMzB0JCRzE5NDMHQkJHMTk1MgdCQkcxOTUzB0JCRzE5NjAHQkJHMjAxMAdCQkcyMDIxB0JCRzIwMjYHQkJHMjAyOAdCQkcyMDI5B0JCRzIwNjEHQkJHMjEwMgdCQkcyMTA0B0JCRzIxMDkHQkJHMjExMAdCQkcyMTIyB0JCRzIxNDAHQkJHMjE3MAdCQkcyMTczB0JCRzIyNDAHQkJHMjI1MQdCQkcyMjUyB0JCRzIyNTMHQkJHMjI2MAdCQkcyMjYxB0JCRzIyNzEHQkJHMjI4MwdCQkcyMjkyB0JCRzIyOTUHQkJHMjMwMQdCQkcyMzA0B0JCRzIzNDAHQkJHMjM0NAdCQkcyMzQ2B0JCRzIzNDcHQkJHMjQwMAdCQkcyNDEwB0JCRzI0MTQHQkJHMjQyNAdCQkcyNDMwB0JCRzI0NTEHQkJHMjUwNAdCQkcyNTA1B0JCRzI1NDEHQkJHMjU1MQdCQkcyNTYxB0JCRzI1NzYHQkJHMjYwMAdCQkcyNjAzB0JCRzI2MDgHQkJHMjYzMwdCQkcyNjQwB0JCRzI2NDcHQkJHMjY1MQdCQkcyNzIxB0JCRzI3NDAHQkJHMjc3MQdCQkcyNzczB0JCRzI3NzUHQkJHMjc3NgdCQkcyNzgwB0JCRzI3ODIHQkJHMzA0NAdCQkczMDcxB0JCRzMwNzMHQkJHMzA3NQdCQkczMTIxB0JCRzMxNDEHQkJHMzIxMQdCQkc5MDE0B0JCRzkwMzQHQktSMTAzMgdCS1IxMTExB0JLUjExMzUHQktSMTE1MgdCS1IxMTU0B0JLUjExNTcHQktSMTIxNAdCS1IxMjE3B0JLUjEyMTgHQktSMTI2MAdCS1IxMjcwB0JLUjEyNzcHQktSMTU2MAdCS1IxNzUzB0JLUjE3NzAHQktSMTc4MAdCS1IxODAyB0JLUjE4MDcHQktSMTg1MQdCS1IxODcxB0JLUjE4NzMHQktSMTk1MAdCS1IxOTczB0JLUjIwMTIHQktSMjA4MAdCS1IyMTAzB0JLUjIxNTQHQktSMjI4NgdCS1IyMzI2B0JLUjI0MzEHQktSMjQ3MAdCS1IyNDczB0JLUjI1MjUHQktSMjU1MgdCS1IyNjkxB0JLUjI2OTQHQktSMjY5OAdCS1IyODA4B0JLUjI4NTMHQktSMjg5MAdCS1IyOTAxB0JLUjQwMTMHQktSNDAyMwdCS1I0MDQwB0JLUjQwNjIHQktSNDExMAdCS1I0MjE0B0JLUjQzNjMHQktSNDQ0MwdCS1I0NTE4B0JLUjQ1MjIHQktSNDUyMwdCS1I0NTMzB0JLUjQ1MzQHQktSNDUzNgdCS1I0NjAxB0JLUjQ4NTAHQktSOTAxMAdCS1I5MDEzB0JLUjkwMzgHQktSOTA2NQdCS1I5MDcyB0JLUjkwNzcHQk1MMTkxOAdCTUwyMjMyB0JNTDkwODAHQlJHOTAyMQdCUksxOTEwB0JaTjEwNDAHQlpOMTEyMAdCWk4xMTUzB0JaTjExNjIHQlpOMTMwMgdCWk4xNDIxB0JaTjE0MjcHQlpOMTUwNQdCWk4xNTEwB0JaTjE1MTEHQlpOMTUyMwdCWk4xNTM1B0RHTDAzMjQHREdMMDQzOAdER0wxMDExB0RHTDEwNDEHREdMMTA2MAdER0wxMDYxB0RHTDEwNzIHREdMMTEwMAdER0wxMTEwB0RHTDExMTEHREdMMTExMgdER0wxMTEzB0RHTDExMTYHREdMMTExOAdER0wxMTE5B0RHTDExMzAHREdMMTEzNgdER0wxMTUzB0RHTDExNzUHREdMMTIyMgdER0wxMjMxB0RHTDEyMzMHREdMMTIzNAdER0wxMjgwB0RHTDEyODEHREdMMTMwMQdER0wxMzAzB0RHTDEzMDcHREdMMTMxMwdER0wxMzMwB0RHTDEzNDIHREdMMTM0NAdER0wxMzU0B0RHTDEzNjIHREdMMTM2NQdER0wxMzgwB0RHTDEzODQHREdMMTM4OAdER0wxMzkxB0RHTDE1MDAHREdMMTUxMgdER0wxNTI0B0RHTDE1MzMHREdMMTU1NAdER0wxNTc2B0RHTDE1NzcHREdMMTU5MAdER0wxNTkyB0RHTDE1OTQHREdMMTU5NQdER0wxNzE3B0RHTDE3MTkHREdMMTczMQdER0wxNzMyB0RHTDE3MzQHREdMMTc0MQdER0wxNzQzB0RHTDE3NTAHREdMMTc1MQdER0wxNzU1B0RHTDE3NTYHREdMMTc1NwdER0wxODAyB0RHTDE4MjAHREdMMTgzMQdER0wxODM0B0RHTDE4MzUHREdMMTgzNgdER0wxODUwB0RHTDE4NzEHREdMMTg4MAdER0wxODgxB0RHTDE4OTAHREdMMTg5NAdER0wxOTAwB0RHTDE5MDMHREdMMTkwNQdER0wxOTIxB0RHTDE5NDAHREdMMjAyNQdER0wyMDMwB0RHTDIxMDEHREdMMjEwMgdER0wyMTA0B0RHTDIxMTAHREdMMjExMQdER0wyMTMwB0RHTDIxNDEHREdMMjE2MAdER0wyMTcxB0RHTDI0MTEHREdMMjcwMQdER0wyNzA5B0RHTDM1MDAHREdMMzUwMQdER0wzNTAyB0RHTDM1MDcHREdMMzUwOAdER0wzNTA5B0RHTDkwMTUHREdMOTAxNwdER0w5MDE4B0RORzEzMDUHRkdSMTAyOQdGR1IxMDM0B0ZHUjEwMzYHRkdSMTA0MgdGR1IxMDcxB0ZHUjExMzcHRkdSMTI0MwdGR1IxMjQ4B0ZHUjEyNjEHRkdSMTI3MQdGR1IxNDEwB0ZHUjE0MjEHRkdSMTQzMQdGR1IxNDQwB0ZHUjE0NDQHRkdSMTQ2MAdGR1IxNDYzB0ZHUjE0NzAHRkdSMTQ3MgdGR1IxNDgwB0ZHUjE2MTQHRkdSMTYxOAdGR1IxNjE5B0ZHUjE2NjEHRkdSMTY5MgdGR1IxNzAyB0ZHUjE4MzYHRkdSMTg1MQdGR1IxODUzB0ZHUjE4NTQHRkdSMTkzMAdGR1IxOTMzB0ZHUjE5NDUHRkdSMTk1MQdGR1IxOTcyB0ZHUjIwMTEHRkdSMjAxMgdGR1IyMDE4B0ZHUjIwMjEHRkdSMjA0MAdGR1IyMDUxB0ZHUjIwNjEHRkdSMjEwMwdGR1IyMTA1B0ZHUjIxMDgHRkdSMjE1NQdGR1IyMTcyB0ZHUjkwMzIHRkdSOTAzOAdGTlQxMDEzB0ZOVDEwMzAHRk5UMTAzMQdGTlQxMDQxB0ZOVDExMDAHRk5UMTExMQdGTlQxMTEyB0ZOVDExMTMHRk5UMTEyMQdGTlQxNDAxB0ZOVDE0MTEHRk5UMTQyMgdGTlQ5MDEzB0ZOVDkwMjMHRk5UOTAyNwdGTlQ5MDI4B0ZSTjEwNDAHRlJOMTcwMAdHREowMzE1B0dESjEwMTEHR0RKMTAxNAdHREoxMDIxB0dESjEwNDEHR0RKMTA0MgdHREoxMDYxB0dESjEwNjQHR0RKMTA2NQdHREoxMTAxB0dESjExMTEHR0RKMTExMgdHREoxMTUwB0dESjExNTIHR0RKMTE1MwdHREoxMTU0B0dESjEyMDYHR0RKMTIwOQdHREoxMjQwB0dESjEyNTEHR0RKMTI2MQdHREoxMjgwB0dESjEyODEHR0RKMTMwMAdHREoxMzA0B0dESjEzMTQHR0RKMTMyMQdHREoxMzMwB0dESjEzNDEHR0RKMTM1MQdHREoxNDExB0dESjE0MTIHR0RKMTQyMAdHREoxNDQ1B0dESjE0NTAHR0RKMTQ1MQdHREoxNDUyB0dESjE0NjEHR0RKMTY1MQdHREoxNjYwB0dESjE3MDAHR0RKMTcwMgdHREoxNzAzB0dESjE3MDUHR0RKMTcwNgdHREoxNzA4B0dESjE3MTEHR0RKMTcxMwdHREoxNzYxB0dESjE4MDEHR0RKMTgwMgdHREoxODExB0dESjE4MTIHR0RKMTgxMwdHREoxODUwB0dESjE4NTIHR0RKMTkxMAdHREoxOTIwB0dESjE5MjEHR0RKMTkzMAdHREoxOTQwB0dESjE5NDEHR0RKMjAxNwdHREoyMDIwB0dESjIwMjEHR0hSMTAxMgdHSFIxMDE0B0dIUjEwMjQHR0hSMTA1MwdHSFIxMTAzB0dIUjExMjEHR0hSMTE2MgdHSFIxMjEwB0dIUjEyMjEHR0hSMTIzMwdHSFIxMjY0B0dIUjEyNjcHR0hSMTMwMAdHSFIxMzAxB0dIUjEzMDIHR0hSMTMwNQdHSFIxMzUzB0dIUjE0MDAHR0hSMTQwNQdHSFIxNDYwB0dIUjE1MDEHR0hSMTUxMgdHSFIxNTE0B0dIUjE1MTUHR0hSMTUyMAdHSFIxNTIxB0dIUjE1MzEHR0hSMTUzNQdHSFIxNjA2B0dIUjE2MjIHR0hSMTYzMQdHSFIxNjYyB0dIUjE2NjQHR0hSMTcwMQdHSFIxODA0B0dIUjE4MDcHR0hSMTgxMAdHSFIyMDcwB0dIUjIxMDAHR1JCMTAxMAdHUkIxMDE0B0dSQjEwMTUHR1JCMTAyMwdHUkIxMDQwB0dSQjEwNDMHR1JCMTA0NAdHUkIxMDQ2B0dSQjEwNTAHR1JCMTA1MwdHUkIxMDU1B0dSQjEwNjUHR1JCMTA3MAdHUkIxMDcxB0dSQjEwNzIHR1JCMTA4MAdHUkIxMDgxB0dSQjEwODIHR1JCMTA4MwdHUkIxMTAxB0dSQjExMDIHR1JCMTEwMwdHUkIxMTIwB0dSQjExNDEHR1JCMTE2MQdHUkIxMjAwB0dSQjEyMDIHR1JCMTIxMAdHUkIxMjMxB0dSQjEyNjAHR1JCMTI3MAdHUkIxMzAwB0dSQjEzMjQHR1JCMTM0MAdHUkIxNDA0B0dSQjE0MDUHR1JCMTQzNgdHUkIxNDM3B0dSQjE1MDUHR1JCMTUyMQdHUkIxNTQxB0dSQjI0MzQHR1NNMTAyMAdHU00xMDQwB0dTTTEwNDEHR1NNMTEzMAdHU00xMTMxB0dTTTExODAHR1NNMTE4MwdHU00xMjAwB0dTTTEyMDEHR1NNMTIzMQdHU00xMjMzB0dTTTEyNDAHR1NNMTI0MQdHU00xMjQyB0dTTTEyNDMHR1NNMTI4MgdHU00xMzIzB0dTTTEzMjgHR1NNMTQxMQdHU00xNDEzB0dTTTE0NTEHR1NNMTUzMgdHU00xNTMzB0dTTTE1NTAHR1NNMTU1MgdHU00xNTcxB0dTTTE2MDAHR1NNMTYyMQdHU00xNjIyB0dTTTE2MjMHR1NNMTYzMQdHU00xNjQxB0dTTTE2NDMHR1NNMTgwMAdHU00xODAxB0dTTTE4MDMHR1NNMTgwNAdHU00xODA1B0dTTTE4MDcHR1NNMTkxMwdHU00xOTUxB0dTTTE5ODAHR1NNMTk5MAdHU00yMDExB0dTTTIwMTIHR1NNMjAxNAdHU00yMDE2B0dTTTIwMTgHR1NNMjAyMQdHU00yMDUwB0dTTTkwMTAHR1NNOTAxMgdHU005MDEzB0dTTTkwMTQHR1NNOTAxNQdHU005MDE5B0dTTTkwMjIHR1NNOTAyNwdHU005MDMzB0dTUjEwMjAHR1NSMTAyMQdHU1IxMDIzB0dTUjEwNDAHR1NSMTA2MAdHU1IxMTAwB0dTUjExMDEHR1NSMTEwMgdHU1IxMTAzB0dTUjExMDQHR1NSMTE1MAdHU1IxMTU0B0dTUjEyMDAHR1NSMTIwMQdHU1IxMjAzB0dTUjEyMDYHR1NSMTIwNwdHU1IxMzAwB0dTUjEzMDEHR1NSMTMwMgdHU1IxMzEyB0dTUjEzMTMHR1NSMTMyMQdHU1IxMzQwB0dTUjEzNTAHR1hRMTAxNwdHWFExMDQwB0dYUTEwNjMHR1hRMTA3MwdHWFExMDc1B0dYUTExMTEHR1hRMTE0MAdHWFExMTQyB0dYUTExNzAHR1hRMTE4NgdHWFExMjAzB0dYUTEyMDQHR1hRMTIwNQdHWFExMjEwB0dYUTEyMzMHR1hRMTI1MAdHWFExMjUyB0dYUTEzMDAHR1hRMTMwMQdHWFExMzEzB0dYUTEzMTQHR1hRMTQwMgdHWFExNTU0B0dYUTE2MTMHR1hRMTYzMgdHWFExNzAwB0dYUTE3MDEHR1hRMTcxNAdHWFExNzE2B0dYUTE3MTcHR1hRMTcxOAdHWFExODAwB0dYUTE4MDEHR1hRMTgwMgdHWFExODIyB0dYUTE4NDEHR1hRMTkwMQdHWFExOTcwB0dYUTE5NzMHR1hRMjAyMwdHWFEyMDMyB0dYUTIwMzMHR1hRMjA1MAdHWFEyMDUyB0dYUTIxMDAHR1hRMjEwMQdHWFEyMTYwB0dYUTIxNzAHR1hRMjE3MQdHWFEyMTczB0dYUTIxNzQHR1hRMjE3NwdHWFEyMTgxB0dYUTIxODQHR1hRMjIwMAdHWFEyMjAyB0dYUTIyMTEHR1hRMjIyMQdHWFEyMjIyB0dYUTIyNDYHR1hRMjI1MwdHWFEyMzAxB0dYUTIzMjEHR1hRMjMzMAdHWFEyMzcxB0dYUTI5MDEHR1hRMjkwMgdHWFE5MDEwB0dYUTkwMTIHR1hROTAxMwdHWFE5MDE0B0dYUTkwMTgHR1hROTA0NAdHWlIxMDI2B0daUjExMzkHR1pSMTE1NAdHWlIxMTYzB0daUjEyMTAHR1pSMTMzNgdHWlIxNTAwB0daUjE1MDYHSE1SMTAxNAdITVIxMTAwB0hNUjEyMDEHSE1SMTIwMwdITVIxMzIyB0hNUjE0NTEHSE1SMTUzMAdITVIxNjEzB0hNUjE2MjEHSE1SMTg1NAdITVIxOTUyB0hNUjIwMTUHSE1SMjAzMAdITVIyMjc0B0haQjIwMTMHSUtMMTAyMQdJS0wxMDIzB0lLTDEwNDEHSUtMMTIwMAdJS0wxMzEwB0lLTDE0MTEHSUtMMTQzMQdJS0wxNDUwB0lLTDE4MTMHSUtMMTkwMAdJS0w5MDE1B0lLTDkwMzIHSVNMMTQ1MwdLQ00xMDEwB0tDTTEwMTMHS0NNMTA1MwdLQ00xMDcwB0tDTTEwODEHS0NNMTEwMAdLQ00xMTEwB0tDTTExMTEHS0NNMTExMgdLQ00xMTEzB0tDTTExMTQHS0NNMTExNQdLQ00xMTIwB0tDTTExMjEHS0NNMTEyMwdLQ00xMTMwB0tDTTExMzEHS0NNMTE0MQdLQ00xMTU0B0tDTTExNTYHS0NNMTE2MAdLQ00xMTYyB0tDTTExNjMHS0NNMTE4MAdLQ00xMTgxB0tDTTExOTIHS0NNMTIwMgdLQ00xMjMxB0tDTTEyMzMHS0NNMTI0MAdLQ00xMjYwB0tDTTEyNjIHS0NNMTI2NAdLQ00xMjY1B0tDTTEzMDAHS0NNMTMwMgdLQ00xMzExB0tDTTEzMTMHS0NNMTMyMQdLQ00xMzIzB0tDTTEzNDMHS0NNMTM1MAdLQ00xMzUyB0tDTTEzNjAHS0NNMTQwMQdLQ00xNDEwB0tDTTE0MTEHS0NNMTQxMgdLQ00xNDIxB0tDTTE0MjMHS0NNMTQyNQdLQ00xNDMwB0tDTTE3MDAHS0NNMTcwMQdLQ00xNzAyB0tDTTE3MjEHS0NNMzAxMQdLQ00zMDEyB0tDTTMwMTMHS0NNMzAxNAdLQ00zMDE2B0tDTTMwMTcHS0NNMzAyMAdLQ00zMDIxB0tDTTMwNDAHS0NNMzA0MQdLQ00zMDQyB0tDTTMwNjAHS0NNMzA2MgdLQ00zMTAwB0tDTTMxMDEHS0NNMzExMAdLQ00zMTIxB0tDTTMxNTEHS0NNMzIwMgdLQ00zMzAzB0tDTTkwMTAHS0tQMTAxMAdLS1AxMDMxB0tLUDEwNjAHS0tQMTA4MQdLS1AxMTAwB0tLUDExMDEHS0tQMTExMAdLS1AxMTExB0tLUDExMzIHS0tQMTIxMAdLS1AxMjE2B0tLUDEyMjAHS0tQMTIyMQdLS1AxMjQyB0tLUDEyNDcHS0tQMTI0OAdLS1AxMjQ5B0tLUDEyNTAHS0tQMTI2MQdLS1AxMjcwB0tLUDEzNjEHS0tQMTM3MAdLS1AxNTA3B0tLUDE1MDgHS0tQMTUwOQdLS1AxNTExB0tLUDE1MjEHS0tQMTUyOAdLS1AxNTI5B0tLUDE1MzAHS0tQMTUzMgdLS1AxNTQxB0tLUDE3MjUHS0tQMTcyNwdLS1AxNzQwB0tLUDE3NDIHS0tQMTc3MQdLS1AxODEwB0tLUDE4MTEHS0tQMTgxMgdLS1AxODEzB0tLUDE4MTUHS0tQMTkwMQdLS1IxMDM0B0tLUjEwNzIHS0tSMTEwNwdLS1IxMTIwB0tLUjExNTMHS0tSMTE4NgdLS1IxNjEyB0tLUjE2MTkHS0tSMTc2MwdLS1IxODEwB0tLUjkwMzMHS0tSOTA2MgdLUlAxMjEwB0xKQTEwMjEHTEpBMTExMwdMSkExMTQ0B0xKQTExNzYHTEpBMTE5MwdMSkExMjA1B0xKQTEyNjEHTEpBMTI3MAdMSkExMjcxB0xKQTEyNzQHTEpBMTQzMQdMSkExNDQxB0xKQTE0NjAHTEpBMTUwNAdMSkExNjEyB0xKQTE2MTMHTEpBMTcwMAdMSkExNzIyB0xKQTE3MzAHTEpBMTc1MQdMSkExODA2B0xKQTE5MTEHTEpBMTkxNQdMSkExOTE2B0xKQTE5MzEHTFFBMTAxMQdMUUExMDIzB0xRQTEwMjQHTFFBMTAyNQdMUUExMDMwB0xRQTEwOTEHTFFBMTEwMgdMUUExMTEwB0xRQTExMjAHTFFBMTEyMQdMUUExMTMxB0xRQTExNTEHTFFBMTE1NwdMUUExMjAwB0xRQTEyMjAHTFFBMTIyMQdMUUExMjUzB0xRQTEzMTMHTFFBMTMxNAdMUUExMzE1B0xRQTEzMTcHTFFBMTMxOQdMUUExMzMwB0xRQTEzNjAHTFFBMTM3MQdMUUExMzcyB0xRQTEzNzMHTFFBMTM4NAdMUUExMzg1B0xRQTE0MTAHTFFBMTQzMAdMUUExNDYwB0xRQTE0NjMHTFFBMTQ5MAdMUUExNDkyB0xRQTE1MDAHTFFBMTUxMAdMUUExNTEzB0xRQTE1MTYHTFFBMTUzMgdMUUExNTM0B0xRQTE1NDAHTFFBMTU1MwdMUUExNTYxB0xRQTE1ODMHTFFBMTYwMwdMUUExNjEwB0xRQTE2MTIHTFFBMTYzMAdMUUExNjMyB0xRQTE2MzUHTFFBMTY2MQdMUUExNjczB0xRQTE2NzQHTFFBMTcxMAdMUUExNzIyB0xRQTE3MjMHTFFBMTcyNQdMUUExNzYwB0xRQTE3NjEHTFFBMTgwMwdMUUExODA0B0xRQTE4MTEHTFFBMTgxMwdMUUExODE0B0xRQTE4NzAHTFFBMTg3MwdMUUExODgwB0xRQTE4OTMHTFFBMjAyMQdMUUEyMDIyB0xRQTIwMjQHTFFBMzAxMAdMUUEzMDQyB0xRQTMwNzgHTFFBMzExMQdMUUEzMTYwB0xRQTMxNjQHTFFBNzYwMAdMUUE5MDIxB0xRQTkwMzMHTFFBOTA0MAdMUUE5MDQzB01ETjEwNTAHTUROMTA4MAdNRE4xMTgxB01ETjY5NzAHTUROOTAyMAdNRk4xMTI0B01GTjExMjcHTUZOMTMxMgdNRk4xNDEwB01GTjE0NDMHTUZOMTQ1MQdNRk4xNDUzB01GTjE1MTQHTUZOOTAxNAdNR1IxMDEwB01HUjEwMjAHTUdSMTAzMAdNR1IxMDMzB01HUjEwNTAHTUdSMTA2MAdNR1IxMTEwB01HUjExMTIHTUdSMTExMwdNR1IxMTE2B01HUjExMTcHTUdSMTEyMQdNR1IxMTUwB01HUjExNjAHTUdSMTIwMwdNR1IxMjEwB01HUjEyMTEHTUdSMTIxMgdNR1IxMjEzB01HUjEyMTYHTUdSMTI1MQdNR1IxMzAxB01HUjEzMTAHTUdSMTMxMQdNR1IxMzEyB01HUjEzMTMHTUdSMTMxNAdNR1IxMzE1B01HUjEzMTcHTUdSMTM0MAdNR1IxMzQzB01HUjEzNjEHTUdSMTM2MgdNR1IxMzYzB01HUjEzNjQHTUdSMTM3MQdNR1IxMzc2B01HUjEzNzgHTUdSMTQwMQdNR1IxNDA1B01HUjE0MTAHTUdSMTQyNAdNR1IxNDMwB01HUjE0NDEHTUdSMTUwMQdNR1IxNTAyB01HUjE1MDMHTUdSMTUwNAdNR1IxNTA1B01HUjE1MDYHTUdSMTUwNwdNR1IxNTA4B01HUjE1MDkHTUdSMTUxMAdNR1IxNTIxB01HUjE1MjIHTUdSMTUyMwdNR1IxNTI0B01HUjE1MjUHTUdSMTUyOAdNR1IxNTI5B01HUjE1NDAHTUdSMTU0MQdNR1IxNTQ0B01HUjE1NDUHTUdSMTU0NwdNR1IxNTQ4B01HUjE3MDIHTUdSMTcxMQdNR1IxNzQwB01HUjE3NDMHTUdSMTc0NAdNR1IxNzQ1B01HUjE3NTAHTUdSMTc1MwdNR1IxNzYyB01HUjE4MTAHTUdSMTk1MAdNR1IxOTcwB01HUjIwMTAHTUdSMjAxNAdNR1IyMDIxB01HUjIwNDAHTUdSMjA1MQdNR1IyMDUzB01HUjIwNTYHTUdSMjA1NwdNR1IyMTEwB01HUjIxMjEHTUdSMjEyNQdNR1IyMTMyB01HUjIxNDEHTUdSMjE0MgdNR1IyMTQzB01HUjIyMDAHTUdSMjI0MQdNR1IyMjUwB01HUjIyNTMHTUdSMjI1NQdNR1IyMzAwB01HUjIzMjAHTUdSMjMyMQdNR1IyMzMxB01HUjIzNTEHTUdSMjM1MwdNR1IyMzU0B01HUjIzNjEHTUdSMjM3MAdNR1IyNDAxB01HUjI0MDMHTUdSMjQxMAdNR1IyNDIwB01HUjI0MjEHTUdSMjQ0MgdNR1IyNDUwB01HUjI0NjEHTUdSMjQ2MgdNR1IyNDYzB01HUjI0NzMHTUdSMjYwMAdNR1IyNjAxB01HUjI2MDMHTUdSMjYwNAdNR1IyNjA1B01HUjI4NTAHTUdSMjkwMAdNR1IyOTAzB01HUjI5MTAHTUdSOTAyMAdNR1I5MDIyB01HUjkwMjMHTUdSOTAyNQdNR1I5MDMwB01HUjkwMzIHTUdSOTAzNAdNR1I5MDM2B01HUjkwNDEHTUdSOTA1MgdNR1I5MDUzB01HUjkwNTUHTUdSOTA1NwdNR1I5MDU5B01HUjkwOTAHTUxIMDAxMwdNTEgxMDE1B01MSDEwNDAHTUxIMTA0MgdNTEgxMDQ2B01MSDEwNDgHTUxIMTA0OQdNTEgxMDU1B01MSDEwNjIHTUxIMTA2NwdNTEgxMDY4B01MSDEwNjkHTUxIMTA3MgdNTEgxMTA1B01MSDExMDYHTUxIMTExMAdNTEgxMTIwB01MSDExMjEHTUxIMTEyNwdNTEgxMTcyB01MSDExOTIHTUxIMTIwMAdNTEgxMjAxB01MSDEyMTAHTUxIMTI0NQdNTEgxMjYxB01MSDEzMDEHTUxIMTMwMwdNTEgxMzA0B01MSDEzMDkHTUxIMTMxMgdNTEgxMzM0B01MSDEzNDQHTUxIMTM0NgdNTEgxMzU0B01MSDEzNjAHTUxIMTM4MgdNTEgxNDMxB01MSDE0MzMHTUxIMTQzNAdNTEgxNDQwB01MSDE0NTQHTUxIMTQ1NgdNTEgxNDcxB01MSDE0NzIHTUxIMTQ4MAdNTEgxNDgzB01MSDE0OTAHTUxIMTQ5MQdNTEgxNTA1B01MSDE1MTIHTUxIMTUxMwdNTEgxNTE3B01MSDE1MTgHTUxIMTUxOQdNTEgxNTIyB01MSDE1MzIHTUxIMTU2MQdNTEgxNTYyB01MSDE2MTAHTUxIMTYxMQdNTEgxNjMyB01MSDE2MzUHTUxIMTYzNgdNTEgxNjM3B01MSDE2NDEHTUxIMTY1MAdNTEgxNjUxB01MSDE2NTIHTUxIMTY1NQdNTEgxNjgwB01MSDE3MDAHTUxIMTcwMgdNTEgxNzAzB01MSDE3MDUHTUxIMTcwNgdNTEgxNzA5B01MSDE3MjAHTUxIMTcyMQdNTEgxNzIzB01MSDE3MjcHTUxIMTc2MAdNTEgxNzYyB01MSDE3NzAHTUxIMTgwNgdNTEgxODA3B01MSDE4MTEHTUxIMTgyNQdNTEgxODQzB01MSDE5MDIHTUxIMTkwMwdNTEgxOTA0B01MSDE5MDgHTUxIMTkxMAdNTEgxOTEyB01MSDE5MTYHTUxIMTk5MQdNTEgyMDIwB01MSDIwMjMHTUxIMjA0MgdNTEgyMDY0B01MSDIwNjUHTUxIMjA2NwdNTEgyMDcxB01MSDIxMDQHTUxIMjEwOQdNTEgyMTEwB01MSDIxMzcHTUxIMjE2MgdNTEgyMTY2B01MSDIxNjcHTUxIMjE3MgdNTEgyMjAwB01MSDIyMDQHTUxIMjIwNgdNTEgyMjA3B01MSDIyMjgHTUxIMjIyOQdNTEgyMjQ1B01MSDIyNDkHTUxIMjI2MQdNTEgyMjY2B01MSDIyODMHTUxIMjMwNQdNTEgyMzE0B01MSDIzMTUHTUxIMjMxNgdNTEgyMzE3B01MSDIzMjIHTUxIMjMyNQdNTEgyMzI4B01MSDIzMzAHTUxIMjQyMAdNTEgyNDQ4B01MSDI0NTIHTUxIMjQ3MAdNTEgyNDcxB01MSDI0NzIHTUxIMjQ3MwdNTEgyNDkzB01MSDI1NDMHTUxIMjU0NQdNTEgyNTcwB01MSDI1NzIHTUxIMjU3MwdNTEgyNjEzB01MSDI2MzIHTUxIMjY0MAdNTEgyNzAxB01MSDI3MDIHTUxIMjcwMwdNTEg0MTUxB01MSDQyNjUHTUxINDgyMAdNTEg1MDEzB01MSDUwMTQHTUxINTAyMQdNTEg1MDIzB01MSDUwMjUHTUxINTAzMQdNTEg1MDUwB01MSDUwNTEHTUxINTA1MgdNTEg1MDUzB01MSDUwNjAHTUxINTA3MAdNTEg1MTIwB01MSDUxMjMHTUxINTEzMgdNTEg1MTM0B01MSDUxMzUHTUxINTE0MAdNTEg1MTQxB01MSDUyMDAHTUxINTIxMAdNTEg1MjgwB01MSDUzMDMHTUxINTMxMAdNTEg1MzgwB01MSDUzOTAHTUxINTUxMAdNTEg1NzAwB01MSDU5MzAHTUxINTk0MAdNTEg1OTkwB01MSDU5OTEHTUxINzQwMQdNTEg4MjU0B01MSDkwNDAHTUxIOTA2MQdNTEg5MDYzB01MSDkwNjQHTUxIOTA2OAdNTEg5MDgwB01MSDkxNTQHTVFCMTAxMAdNUUIxMDEyB01RQjEwMzkHTVFCMTA1MgdNUUIxMDUzB01RQjEwODEHTVFCMTA5NQdNUUIxMTIwB01RQjExMjIHTVFCMTEyNAdNUUIxMTMwB01RQjExNDEHTVFCMTE1MQdNUUIxMjAwB01RQjEyMDIHTVFCMTIwNAdNUUIxMjQwB01RQjEyNjAHTVFCMTMwMwdNUUIxMzA0B01RQjEzMTAHTVFCMTMyMAdNUUIxMzMwB01RQjEzNTAHTVFCMTQ2MAdNUUIxNDYxB01RQjE0ODAHTVFCMTQ4MQdNUUIxNTEwB01RQjE1MTIHTVFCMTUxNAdNUUIxNTE1B01RQjE1MTYHTVFCMTUxOQdNUUIxNTIxB01RQjE1OTIHTVFCMTYxNwdNUUIxNjMwB01RQjE2ODAHTVFCMTgwMAdNUUIxODEyB01RQjE4MTMHTVFCMTgxNAdNUUIxODQwB01RQjE4NTAHTVFCMTg1MQdNUUIxODcyB01RQjE5MDAHTVFCMTkwMQdNUUIxOTEzB01RQjE5MjIHTVFCMTkyMwdNUUIxOTQ0B01RQjE5NTAHTVFCMTk2MQdNUUIyMDEzB01RQjIzMTkHTVFCMzAwMAdNUUI5MDEyB01RQjkwMTQHTVFCOTAyMQdNUUI5MDI2B01RQjkwNDEHTVJTMTA0MgdNUlMxMDQ0B01SUzEzMDkHTVJTMTYyMAdNUlMxOTE3B01SUzIyNTgHTVJTMzAwMAdNUlMzMzAzB01SUzkwNDUHTVNEMTA5MgdNU0QxMTAzB01TRDExNjIHTVNEMTYyNAdNU0QxODMwB01TRDE4MzkHTVNEMTkxMAdNU0QyMjI2B01TRDIyNDMHTVNEOTAyMAdNU0sxMDE1B01TSzEwODAHTVNLMTA4MwdNU0sxMjAyB01TSzEyMjIHTVNLMTIyNQdNU0sxMjQxB01TSzEyNDMHTVNLMTQ4MQdNU0sxNTE4B01TSzE1MjEHTVNLMTU3MAdNU0sxNjEyB01TSzE2MTUHTVNLMTYxNgdNU0sxNjE3B01TSzIxMzYHTVNLMjIwNwdNU0syMjUyB01TSzIyNTQHTVNLMjI3MAdNU0syMjcxB01TSzIyNzIHTVNLMjI3NAdNU0syNTAwB01TSzI1MDEHTVNLMjUwMwdNU0syNzcyB01TSzMwMjEHTVNLMzAzMAdNU0szMTA3B01TSzMxMTEHTVNLMzE0MQdNU0szMzE0B01TSzMzMTcHTVNLMzQwMQdNU0szNDI0B01TSzM1MjIHTVNLMzY0OQdNU0szNjYxB01TSzM3MTEHTVNLMzcyNwdNU0szNzMzB01TSzM4MjMHTVNLNDAyMAdNU0s0MDI2B01TSzQwMjcHTVNLNDAyOAdNU0s0MDQwB01TSzQwNDUHTVNLNDA2NQdNU0s0MDczB01TSzQ2MDAHTVNLNDYxMwdNU0s1MzUzB01TSzkwMjcHTVNLOTA1NwdNU1QxMDEwB01TVDEwMTIHTVNUMTAxMwdNU1QxMDE0B01TVDEwMTUHTVNUMTAxNgdNU1QxMDE3B01TVDEwMTgHTVNUMTAxOQdNU1QxMDIxB01TVDEwNjEHTVNUMTA4MQdNU1QxMDgyB01TVDExMDEHTVNUMTEwMwdNU1QxMTExB01TVDExMzAHTVNUMTEzNAdNU1QxMTQzB01TVDExNDQHTVNUMTE2MgdNU1QxMTY1B01TVDExNzIHTVNUMTE4MAdNU1QxMjA5B01TVDEyMjMHTVNUMTI2MgdNU1QxMzAzB01TVDEzMDQHTVNUMTMwNQdNU1QxMzA2B01TVDEzMDcHTVNUMTMwOQdNU1QxMzMxB01TVDEzNDEHTVNUMTM0MgdNU1QxMzUwB01TVDEzNTIHTVNUMTM2MAdNU1QxMzcwB01TVDE0NDAHTVNUMTQ0MQdNU1QxNDcyB01TVDE0OTIHTVNUMTQ5NQdNU1QxNTAxB01TVDE1NzIHTVNUMTYwMAdNU1QxNjEzB01TVDE2MjMHTVNUMTYyNQdNU1QxNjI3B01TVDE2MzMHTVNUMTYzNgdNU1QxNjcwB01TVDE2NzMHTVNUMTY4MAdNU1QxNjgzB01TVDE2OTAHTVNUMTcwMAdNU1QxNzUxB01TVDE4NDIHTVNUMTg1MgdNU1QxODU0B01TVDE4NjIHTVNUMjAxNAdNU1QyMDIxB01TVDIwMjUHTVNUMjA2MQdNU1QyMDY0B01TVDIwNzEHTVNUMjA3MgdNU1QyMDc1B01TVDIwNzcHTVNUMjExMAdNU1QyMTMwB01TVDIxMzEHTVNUMjEzMwdNU1QyMTM1B01TVDIxNDMHTVNUMjE0NQdNU1QyMTcxB01TVDIxNzMHTVNUMjE3NwdNU1QyMTgwB01TVDIxODEHTVNUMjE4MgdNU1QyMjUxB01TVDIyNTUHTVNUMjI3MAdNU1QyMzI3B01TVDIzMzEHTVNUMjM0MQdNU1QyMzcwB01TVDIzOTAHTVNUMjM5MQdNU1QyNDAwB01TVDI0MTAHTVNUMjQxMwdNU1QyNDMwB01TVDI0MzIHTVNUMjQzMwdNU1QyNDQwB01TVDI0NjQHTVNUMjQ2OAdNU1QyNDgwB01TVDI0ODMHTVNUMjUwMwdNU1QyNTE0B01TVDI1MTcHTVNUMjUyMAdNU1QyNTIzB01TVDI1MzIHTVNUMjU0MAdNU1QyNTQzB01TVDI1NjEHTVNUMjYxMQdNU1QyNjIwB01TVDI2MjIHTVNUMjYyMwdNU1QyNjMwB01TVDI2MzIHTVNUMjY0MQdNU1QyNjUxB01TVDI2NTMHTVNUMjY2MwdNU1QyNzAxB01TVDI3MjMHTVNUMjcyNAdNU1QyNzI3B01TVDI3MzIHTVNUMjc0MAdNU1QyNzYwB01TVDI3NjQHTVNUMjc4MAdNU1QyOTExB01TVDMwMTAHTVNUMzA2MAdNU1QzMDYyB01TVDMwNjcHTVNUMzA2OAdNU1QzMDY5B01TVDMwNzMHTVNUMzA5MAdNU1QzMTAxB01TVDMxMDIHTVNUMzEwNgdNU1QzMTA3B01TVDMxMjAHTVNUMzE1MAdNU1QzMTU1B01TVDMxNzIHTVNUMzIwMAdNU1QzMjAxB01TVDMyMDQHTVNUMzIzMwdNU1QzMjQyB01TVDMyNjEHTVNUMzMxNwdNU1QzMzQwB01TVDMzNDEHTVNUMzM1MwdNU1QzNDAwB01TVDM0MDUHTVNUMzQxMAdNU1QzNTAyB01TVDM1MDMHTVNUMzUwNAdNU1QzNTA1B01TVDM1MDYHTVNUMzUwNwdNU1QzNTA4B01TVDM1MDkHTVNUMzU4MgdNU1QzNTgzB01TVDM1ODQHTVNUMzU4NQdNU1QzNjAyB01TVDM2MjAHTVNUMzY2MAdNU1QzNjcyB01TVDM3MDIHTVNUMzcwNQdNU1QzNzA2B01TVDM3MTEHTVNUMzc2MAdNU1QzNzYyB01TVDM3ODAHTVNUMzc4MQdNU1QzNzgyB01TVDM3ODMHTVNUMzc4NAdNU1QzNzg1B01TVDM4MDQHTVNUMzgzMAdNU1QzODMxB01TVDM4NDAHTVNUMzg1MAdNU1QzODUxB01TVDM4NTIHTVNUMzg1NQdNU1QzODc1B01TVDQwMTcHTVNUNDAyNgdNU1Q0MDMxB01TVDQwMzQHTVNUNDA0MAdNU1Q0MDQ1B01TVDQwODIHTVNUNDEwMgdNU1Q0MTA0B01TVDQxMDYHTVNUNDEwOAdNU1Q0MTEyB01TVDQxMTYHTVNUNDEyMAdNU1Q0MTIzB01TVDQxMjYHTVNUNDEyNwdNU1Q0MTMyB01TVDQxMzQHTVNUNDE0MwdNU1Q0MTYwB01TVDQxNjEHTVNUNDE4MAdNU1Q0MTgxB01TVDQyMDAHTVNUNDIwMQdNU1Q0MjAyB01TVDQyMDMHTVNUNDIwNAdNU1Q0MjA3B01TVDQyMzMHTVNUNDI1MAdNU1Q0MjYzB01TVDQyNzAHTVNUNDI4MAdNU1Q0MzAzB01TVDQzMTIHTVNUNDMxNgdNU1Q0MzE4B01TVDQzMjEHTVNUNDMyMgdNU1Q0MzQzB01TVDQzNTQHTVNUNDM1NgdNU1Q0MzU4B01TVDQzNjMHTVNUNDM4MQdNU1Q0MzgzB01TVDQ0MDQHTVNUNDQwNQdNU1Q0NDIyB01TVDQ0NjQHTVNUNDQ2NwdNU1Q0NDcwB01TVDQ1MDIHTVNUNDUwMwdNU1Q0NTA0B01TVDQ1MTAHTVNUNDUxMQdNU1Q0NTEyB01TVDQ1MTQHTVNUNDUzNQdNU1Q0NTQyB01TVDQ1OTIHTVNUNDU5MwdNU1Q0NjAxB01TVDQ2MDMHTVNUNDYxMQdNU1Q0NjIwB01TVDQ2MjEHTVNUNDYyMgdNU1Q0NjIzB01TVDQ2MzMHTVNUNDk0MwdNU1Q0OTQ1B01TVDQ5NjAHTVNUNTAxMAdNU1Q1MDE0B01TVDUwNTAHTVNUNTA1MQdNU1Q1MDUzB01TVDUwNTQHTVNUNTA1NQdNU1Q1MDczB01TVDUwNzUHTVNUNTA4MAdNU1Q1MDgxB01TVDUxMDEHTVNUNTEwMgdNU1Q1MTEzB01TVDU1NDAHTVNUNTU3MAdNU1Q5MDIyB01TVDkwMjQHTVNUOTAyNQdNU1Q5MDI5B01TVDkwMzQHTVNUOTA1MAdNU1Q5MDU0B01TVDkwNTUHTVNUOTA1NgdNU1Q5MDU5B01TVDkwNzIHTVNUOTA4MAdNU1Q5MDk0B01URjEwMTcHTVRGMTAyMAdNVEYxMDUxB01URjEwNzEHTVRGMTA4MQdNVEYxMTAwB01URjExMTAHTVRGMTEyMAdNVEYxMTIyB01URjExMzAHTVRGMTEzMQdNVEYxMTMyB01URjExNDMHTVRGMTE2MAdNVEYxMjAyB01URjEyMDQHTVRGMTIxMAdNVEYxMjIxB01URjEyMzAHTVRGMTIzMQdNVEYxMjM0B01URjEyNDAHTVRGMTI0MQdNVEYxMjYwB01URjEyNjEHTVRGMTI3MAdNVEYxMzAwB01URjEzMTAHTVRGMTM4MQdNVEYxNDAzB01URjE0MDUHTVRGMTQ0MAdNVEYxNDQxB01URjE0NzIHTVRGMTQ5MAdNVEYxNTAwB01URjE1NDAHTVRGMTU0MgdNVEYxNTYwB01URjE2MDAHTVRGMTc5MAdNWEsxMDM0B01YSzEwNTEHTVhLMTA4NgdNWEsxMTAwB01YSzExNTMHTVhLMTE2MAdNWEsxMTgxB01YSzEyNDcHTVhLMTMwNAdNWGsxNDA0B01YSzE0MDUHTVhLMTQxMgdNWEsxNDcyB01YSzE0NzMHTVhLMTUxMgdNWEsxNTM3B01YSzE1MzgHTVhLMTcwMAdNWEsxNzIyB01YSzE3NDEHTVhLMTc2MgdNWEsxODYxB01YSzQwODIHTVhLNDA4NAdNWEs5MDI2B01YSzkwMjcHTVhLOTA0MgdNWEs5MDQzB01YSzkwNDcHTVhLOTA2MwdNWFIxMDEyB01YUjEwNjAHTVhSMTA2MQdNWFIxMTAwB01YUjExMDEHTVhSMTEwMgdNWFIxMTAzB01YUjExMDQHTVhSMTEwNQdNWFIxMTIwB01YUjExMjEHTVhSMTMwMAdNWFIxMzAxB01YUjEzMTEHTVhSMTMyMQdNWFIxMzMxB01YUjEzNDAHTVhSMTM1MAdNWFIxMzYxB01YUjEzNjMHTVhSMTQxMAdNWFIxNDIwB01YUjE0NTIHTVhSMTQ2MQdNWFIxNDgwB01YUjE0ODEHTVhSMTUwMAdNWFIxNTAxB01YUjkwMTAHTVhSOTAzMAdORFIwMTAyB05EUjEwMjAHTkRSMTAyMQdORFIxMDM0B05EUjEwNDAHTkRSMTA3MAdORFIxMDcxB05EUjEwODAHTkRSMTE0MAdORFIxMjEyB05EUjEyMjEHTkRSMTIyMgdORFIxMjMwB05EUjEyMzQHTkRSMTIzOQdORFIxMjQzB05EUjEyNTAHTkRSMTMxMgdORFIxMzMyB05EUjEzNDEHTkRSMTM0MwdORFIxMzUwB05EUjEzNTQHTkRSMTM1NwdORFIxMzYwB05EUjEzNjEHTkRSMTM3MAdORFIxMzk2B05EUjE0MDAHTkRSMTQwNAdORFIxNDA1B05EUjE0MTEHTkRSMTQzNgdORFIxNDUwB05EUjE0NjEHTkRSMTQ2OAdORFIxNDY5B05EUjE2MDAHTkRSMTYwMQdORFIxNjAyB05EUjE2MDMHTkRSMTYwNwdORFIxNjExB05EUjE2MTMHTkRSMTY0MgdORFIxNjYwB05EUjE2NjEHTkRSMTY2MwdORFIxNjY2B05EUjE4MDAHTkRSMTg0MwdORFIxODQ0B05EUjE4NDUHTkRSMTg1MAdORFIxODUxB05EUjE5MDAHTkRSMTkzMAdORFIxOTQxB05EUjE5NjAHTkRSMTk3MQdORFIyMDEwB05EUjIwMzQHTkRSMjExMQdORFIyMTM5B05EUjIxNTAHTkRSMjE1MwdORFIyMTczB05EUjIxNzcHTkRSMjE4MAdORFIyMjIwB05EUjIyMjIHTkRSMjIzMgdORFIyMjQxB05EUjIyNDQHTkRSMjI0NQdORFIyMjUxB05EUjIzMDAHTkRSMjMwMQdORFIyMzAyB05EUjIzMDQHTkRSMjMwNQdORFIyMzA2B05EUjIzMDcHTkRSMjMyMAdORFIyMzIxB05EUjIzMzAHTkRSMjM0MAdORFIyMzUwB05EUjIzNjAHTkRSMjM2MQdORFIyMzgyB05EUjkwMTAHTkRSOTAxMQdORFI5MDE0B05EUjkwMTYHTkRSOTAzMAdORFI5MDMxB05EUjkwMzQHTkRSOTAzNgdORFI5MDQwB05EUjkwNDkHTkRSOTA1MAdORFI5MDUxB05EUjkwNjIHTkRSOTA3MAdORFI5MDcxB05EUjkwNzMHTkRSOTA3NwdORFI5MDgxB05EUjkwODgHTlhSMDU0NwdOWFIwNTk5B05YUjEwMTMHTlhSMTAxNgdOWFIxMDE3B05YUjEwMTgHTlhSMTAyMAdOWFIxMDU1B05YUjEwOTAHTlhSMTEwMgdOWFIxMTIyB05YUjExMzMHTlhSMTIwMwdOWFIxMjA1B05YUjEzNzEHTlhSMTQwNAdOWFIxNDA4B05YUjE0MjAHTlhSMTQyMQdOWFIxNTA4B05YUjE1MDkHTlhSMTU5MQdOWFIxNjIwB05YUjE5MDcHTlhSMTkyMwdOWFIxOTMyB05YUjE5NDMHTlhSMTk3MQdOWFIyMDYzB05YUjIwNjYHTlhSMjA2OAdOWFIyMTM0B05YUjIxNDIHTlhSMjM1MQdOWFIyNDA2B05YUjI0MDcHTlhSMjUwNgdOWFIyNTI1B05YUjI1MzIHTlhSMjUzMwdOWFIyNTQxB05YUjI1NDMHTlhSMjU0NQdOWFIyNTU4B05YUjI1NTkHTlhSMjYwMgdOWFIyNjAzB05YUjI2MDQHTlhSMjYwNgdOWFIyNjA3B05YUjI2MDgHTlhSMjYwOQdOWFIyNjIwB05YUjI2MjYHTlhSMjYyOAdOWFIyNjMwB05YUjI2NDEHTlhSMjY1NQdOWFIyNjYwB05YUjMwMjEHTlhSMzAyNQdOWFIzMTUwB05YUjMxNjIHTlhSMzIwNQdOWFIzMjMwB05YUjMyMzIHTlhSMzI0MQdOWFIzMjU0B05YUjMzMTIHTlhSMzM1OQdOWFIzMzcxB05YUjMzNzMHTlhSMzQxMwdOWFIzNDIwB05YUjM0MjMHTlhSMzQzNgdOWFIzNDgyB05YUjM1MTIHTlhSMzUzMQdOWFIzNTUwB05YUjM1NzgHTlhSMzYwMAdOWFIzNjIzB05YUjM2MjQHTlhSMzY0MQdOWFIzNjQzB05YUjM2NTAHTlhSMzY2MQdOWFIzNjcwB05YUjM2ODAHTlhSNDAxMAdOWFI0MDE1B05YUjQwMTkHTlhSNDAzMAdOWFI0MDM2B05YUjQwNTIHTlhSNDA4MQdOWFI0MTEzB05YUjQxMjAHTlhSNDIyMQdOWFI0MjUwB05YUjQ0MjMHTlhSNTAyMQdOWFI1MTQwB05YUjUyMDgHTlhSNTIxMgdOWFI2MDMyB05YUjYwNTAHTlhSNjA1MQdOWFI2MDUyB05YUjYzMzcHTlhSNjM0NQdOWFI2MzUzB05YUjYzODIHTlhSNjQwMAdOWFI2NDAzB05YUjY0MDQHTlhSNjQ0MAdOWFI2NDQxB05YUjY0NTMHTlhSNjQ3NgdOWFI2NDc3B05YUjY1MDMHTlhSNjUxNAdOWFI2NTE2B05YUjY1MTcHTlhSNjUzMQdOWFI2NTQwB05YUjY1NDEHTlhSNjYxNgdOWFI2NjQwB05YUjkwMjIHTlhSOTAyNwdQQksxNDQwB1BCSzE0NjEHUEJLMTUwNQdQQksxODIwBlBMQTAwMAdQTEExMDE3B1BMQTEwMjEHUExBMTA0MgdQTEExMTA0B1BMQTExMzIHUExBMTE2MAdQTEExMzAzB1BMQTEzMTAHUExBMTMxNQdQTEExMzIzB1BMQTE0MTUHUExBMTQxNwdQTEExNDU0B1BMQTE1MTUHUExBMTU3NQdQTEExNTc5B1BMQTE2MTUHUExBMTY4MQdQTEExOTA1B1BMQTIyMzQHUExBOTAxMAdQTEE5MDMyB1BMQTkwNTQHUFRBMTIyNwdQVEExNTAyB1BUQTkwNDMHUFRBOTA0NAdRTEExMDI4B1FMQTEwNDAHUUxBMTA1MgdRTEExMDUzB1FMQTEwNjMHUUxBMTA5MAdRTEExMTEzB1FMQTExNDEHUUxBMTE4MAdRTEExMTgxB1FMQTExODIHUUxBMTIwMAdRTEExMjA5B1FMQTEyNDEHUUxBMTI0MgdRTEExMzExB1FMQTEzMjAHUUxBMTMyMQdRTEExMzM0B1FMQTE0MDIHUUxBMTYxMAdRTEExNjEzB1FMQTE2MzIHUUxBMTY3MAdRTEExNzAyB1FMQTE3MDkHUUxBMTc2MAdRTEExODExB1FMQTE5MTAHUUxBMTkxMwdRTEExOTE3B1FMQTE5MzMHUUxBMjAxMAdRTEEyMDE0B1FMQTIwMTUHUUxBMjAxOQdRTEEyMDI1B1FMQTIxMzEHUUxBOTAxMwdRTEE5MDE4B1FMQTkwMTkHUUxBOTAyMgdRTEE5MDQyB1FORDE3MTEHUU5EMTc2NAdRUkQxMDIwB1FSRDEwNzAHUVJEMTEwMgdRUkQxMTAzB1FSRDExMjQHUVJEMTEyNQdRUkQxMTI3B1FSRDExMjgHUVJEMTE2MQdRUkQxMTgxB1FSRDEyMDMHUVJEMTIxMgdRUkQxMjE0B1FSRDEyMTUHUVJEMTI1MgdRUkQxMjUzB1FSRDEyNTQHUVJEMTI1NwdRUkQxMjYwB1FSRDEzMDEHUVJEMTMwMwdRUkQxMzEzB1FSRDEzNTcHUVJEMTM4MAdRUkQxMzgxB1FSRDE0MDEHUVJEMTQxMAdRUkQxNDQzB1FSRDE0NDUHUVJEMTQ2MQdRUkQxNDkxB1FSRDE0OTMHUVJEMTUwMwdRUkQxNTIyB1FSRDE1MzAHUVJEMTUzMgdRUkQxNTM1B1FSRDE2MTAHUVJEMTYxMQdRUkQxNjMwB1FSRDE2MzIHUVJEMTYzMwdRUkQxNjUxB1FSRDE2NTIHUVJEMTY3MAdRUkQxNzAxB1FSRDE3MTEHUVJEMTc0MgdRUkQxNzQ2B1FSRDE3NDcHUVJEMTc3MgdRUkQxODAwB1FSRDE4MTIHUVJEMTgxNQdRUkQxODMwB1FSRDE4MzEHUVJEMTgzMwdRUkQxOTAyB1FSRDE5MTAHUVJEMTkyMQdRUkQxOTQxB1FSRDE5NDMHUVJEMjAyMAdRUkQyMDIxB1FSRDIwMjMHUVJEMjExMwdRUkQyMTQxB1FSRDI0MDAHUVJEMjQwMgdRUkQyNDA0B1FSRDI0MDUHUVJEMjQwOAdRUkQyNTAxB1FSRDI1MDQHUVJEMjUzMQdRUkQyNTMzB1FSRDI1MzUHUVJEMzEwMgdRUk0xMDI1B1FSTTEwODAHUVJNMTA5MAdRUk0xMTA0B1FSTTExMDcHUVJNMTEwOQdRUk0xMTgyB1FSTTEyMDQHUVJNMTIwOAdRUk0xMjg0B1FSTTE0MDYHUVJNMTQ4NAdRUk0xNTA0B1FSTTE1MDUHUVJNMTUwOQdRUk0xNTE4B1FSTTE1NjMHUVJNMTU4MAdRUk0xNjA1B1FSTTE2NTEHUVJNMTcxMAdRUk0xNzE1B1FSTTE4MDEHUVJNMTgwNgdRUk0xODM4B1FSTTE4NTAHUVJNMTkwMQdRUk0xOTExB1FSTTE5NDAHUVJNMTk0MgdRUk0xOTUwB1FSTTE5NTEHUVJNMjAyMwdRUk0yMDM1B1FSTTIxMDEHUVJNMjEwMwdRUk0yMTI0B1FSTTIxMzIHUVJNMjEzMwdRUk0yMTM3B1FSTTIxNzAHUVJNMjE4MwdRUk0yMTg2B1FSTTIyMDIHUVJNMjIwMwdRUk0yMjA4B1FSTTIyMDkHUVJNMjMxNAdRUk0yMzE1B1FSTTIzNzEHUVJNMjM3OQdRUk0yMzgwB1FSTTI0MTYHUVJNMjQyMAdRUk0yNDUyB1FSTTI0NjMHUVJNMjQ3MQdRUk0yNTAwB1FSTTI1MDIHUVJNMjUwMwdRUk0yNTA1B1FSTTI1MDcHUVJNMjU4MgdRUk0yNjEyB1FSTTI2MzIHUVJNMjYzMwdRUk0yNjM0B1FSTTI2NTEHUVJNMjY4MQdRUk0yNjg2B1FSTTI3MDAHUVJNMjcwNAdRUk0yNzM3B1FSTTI3MzgHUVJNMjgwMAdRUk0yODAxB1FSTTI4MDMHUVJNMjgxMQdRUk0yODQzB1FSTTI4NDQHUVJNMjg0NQdRUk0yOTAyB1FSTTI5MDMHUVJNMjkxMgdRUk0yOTM4B1FSTTI5NDMHUVJNMjk0NQdRUk0yOTQ2B1FSTTI5NjEHUVJNMzAwMAdRUk0zMDExB1FSTTMwMzMHUVJNMzEwMAdRUk0zMjAxB1FSTTMyMzIHUVJNMzI1NAdRUk0zNjEwB1FSTTM2MTEHUVJNMzYxMgdRUk0zNjEzB1FSTTM2MTYHUVJNMzYxNwdRUk0zNjkxB1FSTTM5MDQHUVJNMzkwNQdRUk0zOTUwB1FSTTQwMDEHUVJNNDAwNwdRUk00MDUxB1FSTTQ1MTMHUVJNNDUxNQdRUk00NTMyB1FSTTQ1MzMHUVJNNDUzNAdRUk00NTM2B1FSTTQ1NTAHUVJNNDU1MgdRUk00NjAwB1FSTTQ2MjAHUVJNNDY2MQdRUk00ODAwB1FSTTUwMTkHUVJNNTEyNgdRUk01MTQwB1FSTTUxNDMHUVJNNTE1MAdRUk01MjAyB1FSTTUyMTEHUVJNNTIyMAdRUk01MjMxB1FSTTkwMTIHUVJNOTAxNgdRUk05MDE4B1FSTTkwMTkHUVJNOTA1MwdRUk05MDcyB1FSTTkwNzUHUkJUMDAxNAdSQlQwMDQ0B1JCVDEwNDMHUkJUMTA2MwdSQlQxMDgxB1JCVDEwODIHUkJUMTExMgdSQlQxMTIwB1JCVDExMzYHUkJUMTI1MAdSQlQxMjUxB1JCVDEyNzEHUkJUMTI5MQdSQlQxMzAwB1JCVDEzMzEHUkJUMTMzNAdSQlQxMzYzB1JCVDE0MDUHUkJUMTQwNwdSQlQxNDA4B1JCVDE0MTAHUkJUMTQ0MAdSQlQxNDcxB1JCVDE0NzcHUkJUMTUwMwdSQlQxNTIxB1JCVDE1MjIHUkJUMTUyNgdSQlQxNTQwB1JCVDE1NDIHUkJUMTU1MgdSQlQxNTYwB1JCVDE1ODQHUkJUMTU4NQdSQlQxNjAwB1JCVDE2MDMHUkJUMTYwNQdSQlQxNjA4B1JCVDE2MzEHUkJUMTY2MAdSQlQxNjYxB1JCVDE2NjMHUkJUMTY3MgdSQlQxNjg2B1JCVDE2ODgHUkJUMTcwMQdSQlQxNzAyB1JCVDE3MDUHUkJUMTcxMAdSQlQxNzMyB1JCVDE3NjIHUkJUMTc2MwdSQlQxNzY2B1JCVDE3NjcHUkJUMTgwMQdSQlQxODMxB1JCVDE4MzQHUkJUMTgzNQdSQlQxODM3B1JCVDE4NDEHUkJUMTg0MwdSQlQxODQ0B1JCVDE4NDgHUkJUMTg0OQdSQlQxODUwB1JCVDE4NTIHUkJUMTg2MgdSQlQxODY0B1JCVDE4NjUHUkJUMTg3MQdSQlQxOTAxB1JCVDE5MDcHUkJUMTk1MAdSQlQxOTUxB1JCVDE5NTIHUkJUMTk2MQdSQlQxOTcwB1JCVDE5NzUHUkJUMTk4MAdSQlQxOTgxB1JCVDE5ODIHUkJUMjAxMAdSQlQyMDIwB1JCVDIwMzAHUkJUMjAzMgdSQlQyMDM0B1JCVDIwMzYHUkJUMjA3MAdSQlQyMDczB1JCVDIxMDEHUkJUMjE0NAdSQlQyMTQ1B1JCVDIxNDYHUkJUMjE0NwdSQlQyMTUyB1JCVDIxNjEHUkJUMjE2MgdSQlQyMTkxB1JCVDIyMjIHUkJUMjIyMwdSQlQyMjI0B1JCVDIyMzIHUkJUMjIzNAdSQlQyMjM1B1JCVDIyMzcHUkJUMjI0MgdSQlQyMjQzB1JCVDIyNDUHUkJUMjI1MgdSQlQyMjUzB1JCVDIyNjAHUkJUMjI3MAdSQlQyMjgyB1JCVDIyODMHUkJUMjMwMwdSQlQyMzA3B1JCVDIzMjAHUkJUMjMyMQdSQlQyNDExB1JCVDI0MTMHUkJUMjQxNAdSQlQyNDMxB1JCVDI0MzUHUkJUMjQ0MwdSQlQyNDYyB1JCVDI0ODUHUkJUMjQ4NgdSQlQyNDg3B1JCVDI1MDAHUkJUMjUyMgdSQlQyNjA0B1JCVDI2MTAHUkJUMjYxNgdSQlQyNjQ2B1JCVDI2NTMHUkJUMjY3MQdSQlQyNjcyB1JCVDI3MDIHUkJUMjcwOQdSQlQyNzEwB1JCVDI3MzEHUkJUMjczMwdSQlQyNzQwB1JCVDMwMjQHUkJUMzAyNgdSQlQzMDMwB1JCVDMwNDUHUkJUMzA0NwdSQlQzMTAwB1JCVDMxMTIHUkJUMzExMwdSQlQzMTIxB1JCVDMxMzAHUkJUMzEzMQdSQlQzMTMyB1JCVDMxNDAHUkJUMzE0MQdSQlQzMTQyB1JCVDMyMTEHUkJUMzIxMgdSQlQzMjE3B1JCVDMyNDAHUkJUMzQzMAdSQlQzNTAwB1JCVDM1MDIHUkJUMzUwMwdSQlQzNTA0B1JCVDQwMTAHUkJUNDAxMQdSQlQ0MDEyB1JCVDQwMTYHUkJUNDAxNwdSQlQ0MDI0B1JCVDQwMjkHUkJUNDAzMAdSQlQ0MDM0B1JCVDQwMzcHUkJUNDA1MAdSQlQ0MDcwB1JCVDQxMDAHUkJUNDEwMQdSQlQ0MTAzB1JCVDQxMDQHUkJUNDEwNQdSQlQ0MTA3B1JCVDQxMTAHUkJUNDExMgdSQlQ0MTEzB1JCVDQyMDAHUkJUNDIwMgdSQlQ0MjEwB1JCVDQyMTQHUkJUNDIyMAdSQlQ0MjI0B1JCVDQyMjUHUkJUNDIyNgdSQlQ0MjI3B1JCVDQyNDIHUkJUNDI1MAdSQlQ0MjgwB1JCVDQyOTAHUkJUNDMwNAdSQlQ0MzMwB1JCVDQzMzEHUkJUNDMzMgdSQlQ0MzQwB1JCVDQzNDIHUkJUNDM0NAdSQlQ0NDAwB1JCVDQ0MTAHUkJUNDQyMAdSQlQ0NjAzB1JCVDQ2MDgHUkJUNDYxOAdSQlQ0NjIwB1JCVDQ2MzMHUkJUNDYzOAdSQlQ0NzAwB1JCVDQ3MDEHUkJUNDcxMQdSQlQ0NzIyB1JCVDUwMTAHUkJUNTEwMAdSQlQ1MzEwB1JCVDUzMjAHUkJUNTk5MAdSQlQ2MDExB1JCVDYwMTMHUkJUNjAxNwdSQlQ2MDIyB1JCVDYwMzMHUkJUNjAzNQdSQlQ2MDQxB1JCVDYwNTcHUkJUNjA4MAdSQlQ2MTIxB1JCVDYxMzAHUkJUNjE0MQdSQlQ2MjEwB1JCVDYzMDAHUkJUNjMwMgdSQlQ2MzAzB1JCVDY0MDMHUkJUNjQwNQdSQlQ2NDA3B1JCVDY0MTEHUkJUNjQxMwdSQlQ2NDIwB1JCVDY0NDEHUkJUNjQ0MgdSQlQ2NDQzB1JCVDY0NzAHUkJUNjUwMAdSQlQ2NTAzB1JCVDY1MTMHUkJUNjUyMAdSQlQ2NTI4B1JCVDY1NTAHUkJUNjYwMAdSQlQ2NjAzB1JCVDY2MDQHUkJUNjYwNQdSQlQ2NjA2B1JCVDY2MDcHUkJUNjcwMAdSQlQ2NzAxB1JCVDY3MDIHUkJUNjcwMwdSQlQ2NzA2B1JCVDY4MDAHUkJUNjgwMgdSQlQ2OTAwB1JCVDY5MDEHUkJUNjkwMwdSQlQ2OTMwB1JCVDY5NTAHUkJUOTAyMQdSQlQ5MDIyB1JCVDkwMjMHUkJUOTAyNgdSQlQ5MDI3B1JCVDkwMzAHUkJUOTAzOAdSQlQ5MDM5B1JCVDkwNDgHU0ZJMDE2MQdTRkkxMDMxB1NGSTEwNDAHU0ZJMTA0MQdTRkkxMDQzB1NGSTEwNDYHU0ZJMTA0NwdTRkkxMTEwB1NGSTExMTIHU0ZJMTExMwdTRkkxMTIwB1NGSTExMjEHU0ZJMTEyMgdTRkkxMTIzB1NGSTExMjQHU0ZJMTEyNQdTRkkxMTI3B1NGSTExNDEHU0ZJMTE1MgdTRkkxMTYxB1NGSTExNzEHU0ZJMTE4NAdTRkkxMjEyB1NGSTEyNTAHU0ZJMTI2MQdTRkkxMjcwB1NGSTEyOTMHU0ZJMTMwMAdTRkkxMzcwB1NGSTE0MDEHU0ZJMTQwMgdTRkkxNDAzB1NGSTE0MDQHU0ZJMTQwNQdTRkkxNDA3B1NGSTE0MTEHU0ZJMTQxMgdTRkkxNDEzB1NGSTE0MTQHU0ZJMTQxNQdTRkkxNDIxB1NGSTE0MjIHU0ZJMTQyMwdTRkkxNDMwB1NGSTE0MzIHU0ZJMTQzNAdTRkkxNDUyB1NGSTE1MDMHU0ZJMTUwNQdTRkkxNTExB1NGSTE1MTIHU0ZJMTUxMwdTRkkxNTE0B1NGSTE1MjEHU0ZJMTU0MAdTRkkxNTQxB1NGSTE1NDMHU0ZJMTYxMQdTRkkxNjEzB1NGSTE2MTUHU0ZJMTYxNwdTRkkxNjIwB1NGSTE2MjEHU0ZJMTYzNAdTRkkxNjQwB1NGSTI2MjAHU0ZJNjA3MQdTRkk3MDgwB1NGSTkwMTAHU0ZJOTAxNAdTR04wMDE2B1NHTjEwMzQHU0dOMTA3MAdTR04xMDcxB1NHTjExMDAHU0dOMTMwNAdTR04xMzA1B1NHTjEzMjEHU0dOMTM0NQdTR04xNDIxB1NHTjE1NDAHU0dOMTYwMAdTR04xNjMwB1NHTjE2NzYHU0dOMTcxMAdTR04xNzQxB1NHTjE3NjYHU0dOMTg2MgdTR04xOTA1B1NHTjE5MTQHU0dOMTkyNwdTR04yMDIwB1NHTjIwMjEHU0dOMjEwMQdTR04yMTA0B1NHTjIyMDMHU0dOMjI1MQdTR04yMzAzB1NHTjI0MTUHU0dOMjgwMQdTR04yODAzB1NHTjI5MzUHU0dOMzAwMAdTR04zMDc0B1NHTjMxMDMHU0dOMzIzMQdTR040MTkwB1NHTjQxOTMHU0dONDE5NwdTR040MzAzB1NHTjQ0MTUHU0dOOTAxNAdTR045MDMwB1NHTjkwMzIHU0dXMDAwMAdTR1cxMDEwB1NHVzEwMTEHU0dXMTAxMgdTR1cxMDE0B1NHVzEwMTUHU0dXMTAxNwdTR1cxMDE4B1NHVzEwMTkHU0dXMTAyMAdTR1cxMDQwB1NHVzEwNDIHU0dXMTA0MwdTR1cxMDQ3B1NHVzEwNTAHU0dXMTA3MAdTR1cxMDcyB1NHVzEwNzMHU0dXMTA4MQdTR1cxMDkxB1NHVzExMDQHU0dXMTExMAdTR1cxMTExB1NHVzExMTIHU0dXMTExNQdTR1cxMTE3B1NHVzExMTgHU0dXMTExOQdTR1cxMTIwB1NHVzExNTAHU0dXMTE2MQdTR1cxMTY3B1NHVzEyMDUHU0dXMTIwNwdTR1cxMjIxB1NHVzEyMzAHU0dXMTI1MAdTR1cxMjcxB1NHVzEzMDAHU0dXMTMwMQdTR1cxMzAyB1NHVzEzMDMHU0dXMTMwNAdTR1cxMzA1B1NHVzEzMDYHU0dXMTMwOQdTR1cxMzIwB1NHVzEzMjEHU0dXMTM1MQdTR1cxMzUyB1NHVzEzNjAHU0dXMTM2MgdTR1cxMzY1B1NHVzE0MDQHU0dXMTQwOAdTR1cxNDA5B1NHVzE0MjEHU0dXMTQ0MAdTR1cxNDUxB1NHVzE0NTIHU0dXMTQ1NAdTR1cxNDcwB1NHVzE0OTEHU0dXMTUwMAdTR1cxNTAyB1NHVzE1MDMHU0dXMTUzNgdTR1cxNTUwB1NHVzE2MDEHU0dXMTYwMgdTR1cxNjAzB1NHVzE2MDQHU0dXMTYwNQdTR1cxNjA5B1NHVzE2MTAHU0dXMTYxMQdTR1cxNjMwB1NHVzE2NDEHU0dXMTY2MAdTR1cxNjcxB1NHVzE2NzUHU0dXMTcwMAdTR1cxNzAyB1NHVzE3MDMHU0dXMTc1MwdTR1cxNzYwB1NHVzE3NjEHU0dXMTc3MAdTR1cxNzgzB1NHVzE4MDEHU0dXMTgwMgdTR1cxODAzB1NHVzE4MDQHU0dXMTgyMAdTR1cxODIxB1NHVzE4MjIHU0dXMTgyMwdTR1cxODI1B1NHVzE4MjYHU0dXMTgyNwdTR1cxODMwB1NHVzE4MzEHU0dXMTg0MAdTR1cxODQxB1NHVzE4NDMHU0dXMTg0NAdTR1cxODUzB1NHVzE4NTUHU0dXMTg1OQdTR1cxODYxB1NHVzE4NzEHU0dXMTkwMAdTR1cxOTEwB1NHVzE5MTEHU0dXMTkyMAdTR1cxOTIyB1NHVzE5NDEHU0dXMTk1MgdTR1cxOTYzB1NHVzE5NjQHU0dXMTk2NQdTR1cxOTY2B1NHVzE5NjgHU0dXMjAxMAdTR1cyMDExB1NHVzIwMTIHU0dXMjAxNAdTR1cyMDE2B1NHVzIwMTgHU0dXMjA0MAdTR1cyMDQyB1NHVzIwNDUHU0dXMjA1MAdTR1cyMDYwB1NHVzIwNjMHU0dXMjA3MQdTR1cyMDgwB1NHVzIwOTMHU0dXMjA5NAdTR1cyMDk1B1NHVzIwOTcHU0dXMjEwMgdTR1cyMTEwB1NHVzIxMTMHU0dXMjExNAdTR1cyMTQwB1NHVzIxNTAHU0dXMjE1MQdTR1cyMTYxB1NHVzIxNjMHU0dXMjE4MAdTR1cyMTgyB1NHVzIyMDAHU0dXMjIwOQdTR1cyNTExB1NHVzI1MTIHU0dXMjUxMwdTR1cyNTIwB1NHVzI1MjEHU0dXMjUzMAdTR1cyNTMyB1NHVzI1MzMHU0dXMjU5MAdTR1cyNTkxB1NHVzI2MDAHU0dXMjYwMQdTR1cyNjAzB1NHVzI2MTEHU0dXMjYzMgdTR1cyNjUxB1NHVzI3MjQHU0dXMjgxMwdTR1cyODIwB1NHVzI4MjQHU0dXMjgyNQdTR1cyODI4B1NHVzI4MzAHU0dXMjg2MAdTR1cyODgwB1NHVzMwMTEHU0dXMzAxMwdTR1czMDE0B1NHVzMwMTUHU0dXMzAxNgdTR1czMDE3B1NHVzMwMTkHU0dXMzAyMAdTR1czMDIxB1NHVzMwMzAHU0dXMzAzMwdTR1czMDQxB1NHVzMwNTAHU0dXMzA1MgdTR1czMDYwB1NHVzMwNzAHU0dXMzA3MQdTR1czMDcyB1NHVzMwNzQHU0dXMzA3NgdTR1czMDc4B1NHVzMwNzkHU0dXMzA4MAdTR1czMDgyB1NHVzMyMDQHU0dXMzIwNgdTR1czMjExB1NHVzMyMTIHU0dXMzIzMwdTR1czMjM1B1NHVzMyMzYHU0dXMzI1NwdTR1czMjYwB1NHVzMyNjIHU0dXMzI2MwdTR1czMjcwB1NHVzMyNzIHU0dXMzI3MwdTR1czMzAxB1NHVzMzMDMHU0dXMzMxMQdTR1czMzEyB1NHVzMzMzAHU0dXMzMzMQdTR1czMzMzB1NHVzMzMzQHU0dXMzMzNgdTR1czNDAxB1NHVzM0MDIHU0dXMzQwMwdTR1czNDA0B1NHVzM0MTIHU0dXMzQxMwdTR1czNDIzB1NHVzM1MDcHU0dXMzUwOQdTR1czOTA5B1NHVzQwNzAHU0dXNDA5MAdTR1c0NjAwB1NHVzQ4MDAHU0dXNTAxMAdTTEMxMzAyB1NMQzE2MjAHU0xDMTY0MAdTTEMxODIxB1NMQzE4MzIHU0xDMTg0MQdTTE0xMDIyB1NMTTEyMDEHU0xNMTMyMwdTTE0xMzc5B1NMTTE1NDkHU0xNMTYwNAdTTE0xNzA2B1NMTTE3MTMHU0xNMTc2NQdTTE0xNzc1B1NMTTE5MDEHU0xNMTkyMAdTTE0xOTgyB1NMTTIwNTAHU0xNMjEyMwdTTE0yMTYwB1NMTTIyMzQHU0xNMzA2MAdTTE0zMTI0B1NMWjEwMTAHU0xaMTAxMQdTTFoxMDQ1B1NMWjExMDIHU0xaMTEyMAdTTFoxMjAxB1NMWjEyMjEHU0xaMTIzMAdTTFoxMjMyB1NMWjEyMzMHU0xaMTI0MAdTTFoxMjQxB1NMWjEyNjAHU0xaMTI2MQdTTFoxMjcwB1NMWjEzMDAHU0xaMTMwMQdTTFoxMzAzB1NMWjEzMjAHU0xaMTMyMQdTTFoxMzIzB1NOVDExMDAHU05UMTEwMwdTTlQxMTExB1NOVDExMTMHU05UMTEyMAdTTlQxMTIxB1NOVDExMzAHU05UMTEzMQdTTlQxMTMyB1NOVDEyNjAHU05UMTMwMAdTTlQxMzAyB1NOVDEzMDYHU05UMTMyMAdTTlQxMzIyB1NOVDEzNDEHU05UMTM1MwdTTlQxMzYwB1NOVDE0MDEHU05UMTQwNgdTTlQxNDA3B1NOVDE0MjAHU05UMTQ2MwdTTlQxNTEwB1NOVDE1MTEHU05UMTUxMgdTTlQxNTEzB1NOVDE1MTQHU05UMTUxNQdTTlQxNTE2B1NOVDE1MTcHU05UMTUyMgdTTlQxNTUwB1NOVDE1ODEHU05UMTU4MgdTTlQxNTgzB1NOVDE5MTAHU05UNDEyMAdTTlQ5MDIwB1NOVDkwMjMHU05UOTAzMgdTTlQ5MDQwB1NOVDkwNDEHU05UOTA0NQdTTlQ5MDQ2B1NOVDkwNDcHU1BCMDAwMwdTUEIxMDEwB1NQQjEwMTEHU1BCMTAxMgdTUEIxMDEzB1NQQjEwMjQHU1BCMTAyOAdTUEIxMTA0B1NQQjExMDYHU1BCMTExMAdTUEIxMTExB1NQQjExMTMHU1BCMTEyMAdTUEIxMTIzB1NQQjExMjUHU1BCMTE0MwdTUEIxMTUzB1NQQjExNjIHU1BCMTE3MAdTUEIxMTkxB1NQQjEyMjEHU1BCMTI1NAdTUEIxMjgxB1NQQjEyODkHU1BCMTMwNQdTUEIxMzExB1NQQjEzMzQHU1BCMTQ0MgdTUEIxNTEwB1NQQjE1NjQHU1BCMTYyMgdTUEIxNzAzB1NQQjE3NTAHU1BCMTc1MQdTUEIxOTA0B1NQQjE5MDgHU1BCMTk0MQdTUEIyNDQ1B1NQQjI0NzEHU1BCMjUyOQdTUEIyNTc0B1NQQjI2NTIHU1BCMjY4MAdTUEIyNzUzB1NQQjI3NjAHU1BCMzAzNQdTUEIzMDQ0B1NQQjMwNjEHU1BCMzA2NAdTUEIzMDY2B1NQQjMwNzIHU1BCMzA4MwdTUEIzMTEyB1NQQjMxMTQHU1BCMzEzNgdTUEIzMTY4B1NQQjMxNzAHU1BCMzE4MgdTUEIzMjMwB1NQQjMyMzUHU1BCMzI2MAdTUEIzMzEzB1NQQjM0MTQHU1BCMzQxNwdTUEIzNDE4B1NQQjM0MTkHU1BCMzQzMQdTUEIzNDM1B1NQQjM0NTEHU1BCMzQ3MgdTUEIzNDc0B1NQQjM0NzgHU1BCMzUwNgdTUEIzNjUzB1NQQjM2NTUHU1BCMzkyMgdTUEI0MDE0B1NQQjQwNDEHU1BCNDExNAdTUEI0MjAwB1NQQjQyMjMHU1BCNDIzNQdTUEI0MjYwB1NQQjUxMjAHU1BCNjAxMAdTUEI2MDExB1NQQjYwMTIHU1BCNjAxMwdTUEI2MDIwB1NQQjYwMjQHU1BCNjA0MAdTUEI2MDQxB1NQQjYwNDMHU1BCNjA1MwdTUEI2MDU1B1NQQjYwNTcHU1BCNjA3MgdTUEI2MDgwB1NQQjYwODEHU1BCNjA5MwdTUEI2MDk1B1NQQjYxMDIHU1BCNjEzMQdTUEI2MTMzB1NQQjYxNTEHU1BCNjE2MQdTUEI2MTY4B1NQQjYzMDAHU1BCNjMwMwdTUEI2MzQxB1NQQjY1MDIHU1BCNjUxMQdTUEI2NTEyB1NQQjY1MTMHU1BCNjUzMgdTUEI2NTM1B1NQQjY1NDAHU1BCNjYwMAdTUEI2NjAyB1NQQjY2NDAHU1BCNjY0MgdTUEI2NzA2B1NQQjY3MzAHU1BCNjgxMAdTUEI2OTMxB1NQQjkwMjMHU1BCOTAyOAdTUEI5MDYyB1NQQjkwNjQHU1BCOTA2NQdTUEI5MDY2B1NQQjkwNjcHU1BCOTA2OAdTUEI5MDY5B1NQQjkwOTIHU1BCOTA5MwdTVEoxMTEwB1NUSjEyNjAHU1RKMTM1MwdTVEoxNDQwB1NUSjE1ODIHU1RKMTcxMAdTVEoxODUxB1NUSjE4NjEHU1RKMTk2MAdTVEozMDE0B1NUSjMxNzMHU1RKNDAxNAdTVlIwMDAwB1NWUjEwMTcHU1ZSMTAyMAdTVlIxMTA3B1NWUjEyNjMHU1ZSMTMwMQdTVlIxMzM2B1NWUjE0MDYHU1ZSMTY5NAdTVlIxNzUyB1NWUjE3NTMHU1ZSMTc1NAdTVlIxODMxB1NWUjE4NTIHU1dHMTA5MQdTV1ExMDE0B1NXUTEwMTYHU1dRMTEwNAdTV1ExMTA5B1NXUTExNjMHU1dRMTIxMwdTV1ExMjU0B1NXUTIwMzcHU1dRMjAzOAdTV1EyMzM3B1NXUTI0NDMHU1dRMjYxMQdTV1EyNjQ4B1NXUTI4MDIHU1dRMzAxNQdTV1EzMDM5B1NXUTMxNTkHU1dRMzMyMQdTV1EzNDE4B1NXUTM1MzQHU1dRMzUzNQdTV1E4MDEwB1NXUTkwMjYEVFAwMQdUWE4xMTMzB1RYTjExMzgHVFhOMTE3MwdUWE4xMjgwB1RYTjEyODIHVFhOMTMwMwdUWE4xMzE3B1RYTjEzNTYHVFhOMTQ0MwdUWE4xNDUwB1RYTjE0NjAHVFhOMTQ2MgdUWE4xNTM0B1RYTjE1NDMHVFhOMTYwNAdUWE4xNjEyB1RYTjE2MjEHVFhOMTgwMgdUWE4xOTUxB1RYTjIxNDMHVFhOMjE0NQdUWE4yMTQ2B1RYTjIyMDAHVFhOMjIxMAdUWE4yMjYxB1RYTjIzMTEHVFhOMjMzMwdUWE4yMzUyB1RYTjIzNTUHVFhOMjQwNwdUWE4yNDA5B1RYTjI0MjIHVFhOMjQ3MAdUWE4yNTExB1RYTjI1NDEHVFhOMjU1MAdUWE4yNTcxB1RYTjI2MTAHVFhOOTAxMAdUWE45MDIwB1RYTjkwMzIHVFhOOTAzNwdUWE45MDM4B1ZDVDEwMjAHVkNUMTAzMgdWQ1QxMDM0B1ZDVDEwNzEHVkNUMTEwMQdWQ1QxMTcyB1ZDVDEyNTEHVkNUMTMwNAdWQ1QxMzE0B1ZDVDEzMTYHVkNUMTMxOAdWQ1QxMzM1B1ZDVDE1MDQHVkNUMTUwNQdWQ1QxNTE5B1ZDVDE1MzAHVkNUMTYyMQdWQ1QxNjYwB1ZDVDE2NzEHVkNUMTY3NAdWQ1QxNjc1B1ZDVDE2NzYHVkNUMTY3NwdWQ1QxNzExB1ZDVDE3NjIHVkNUMTg0MAdWQ1QxOTA3B1ZDVDIwNDQHVkNUMjA1MQdWQ1QyMDU1B1ZDVDIwNjcHVkNUMjA3MgdWQ1QyMDczB1ZDVDIwNzQHVkNUMjA4MAdWQ1QyMTAzB1ZDVDIxMDQHVkNUMjEwNQdWQ1QyMTA5B1ZDVDIxMTYHVkNUMjEyNAdWQ1QyMTM2B1ZDVDIxNjIHVkNUMjIwMQdWQ1QyMjAzB1ZDVDIyMTEHVkNUMjIyNAdWQ1QyMjMzB1ZDVDIyNTMHVkNUMjI4MQdWQ1QyNTAxB1ZDVDI1MDIHVkNUMjUwMwdWQ1QyNTA4B1ZDVDI1MzAHVkNUMjUzMQdWQ1QyNTMyB1ZDVDI1NTIHVkNUMjU3OQdWQ1QyNjQwB1ZDVDI2NDQHVkNUMjY2MAdWQ1QyNjYzB1ZDVDI2NjUHVkNUMjY5MgdWQ1QyNzA3B1ZDVDI3MzMHVkNUMjczNQdWQ1QyNzUxB1ZDVDI3NTIHVkNUMjc1MwdWQ1QyNzYxB1ZDVDI3NzIHVkNUMjc4NgdWQ1QyNzg4B1ZDVDI4MDAHVkNUMjgwMwdWQ1QyODEwB1ZDVDI4MzIHVkNUMjgzMwdWQ1QyODQzB1ZDVDI4NTEHVkNUMjg1MwdWQ1QyOTAzB1ZDVDI5MDcHVkNUMjkwOQdWQ1QyOTYwB1ZDVDI5NjMHVkNUMjk4NwdWQ1Q5MDIxB1ZDVDkwMjIHVkNUOTAyMwdWQ1Q5MDI4B1ZDVDkwMzEHVkNUOTAzMgdWQ1Q5MDM1B1ZDVDkwNDAHVkNUOTA0NQdWQ1Q5MDQ2B1ZDVDkwNDgHVkNUOTA1MgdWQ1Q5MDUzB1ZDVDkwNTYHVkNUOTA1OQdWQ1Q5MDYxB1ZDVDkwNjYHVkNUOTA4MgdWQ1Q5MDgzB1ZDVDkwODQHVkNUOTA4NgdWTFQxMDQwB1ZMVDExNTAHVkxUMTIzNwdWTFQxMjUxB1ZMVDE0NTcHVkxUMTUyMQdWTFQxNjQ1B1ZMVDIwMDAHWEJYMTA4NAdYQlgxMDg2B1hCWDEyMDIHWEpSMTAyNAdYSlIxMDYwB1hKUjEwNzEHWEpSMTExMgdYSlIxMzQxB1hKUjE4NjUHWExOMTA4MgdYTE4xMDgzB1hMTjEzMjAHWExOMTMyMQdYTE4xNDMxB1hMTjkwNDAHWFJBMTAzMwdYUkExMDM1B1hSQTExMTEHWFJBMTExMgdYUkExMTE0B1hSQTExMTUHWFJBMTExNwdYUkExMTE4B1hSQTExNDEHWFJBMTE2MAdYUkExMTYyB1hSQTExNjMHWFJBMTIwMQdYUkExMjAyB1hSQTEyMDMHWFJBMTIwNgdYUkExMjMwB1hSQTEyMzUHWFJBMTIzNwdYUkExMjM5B1hSQTEzMzAHWFJBMTM0NgdYUkExMzQ3B1hSQTEzNDgHWFJBMTM0OQdYUkExNDAwB1hSQTE0MDMHWFJBMTQwNgdYUkExNTIxB1hSQTE1MjIHWFJBMTUyNAdYUkExNTI1B1hSQTE1MjcHWFJBMTYwMgdYUkExNjA0B1hSQTE2MTAHWFJBMTYxMQdYUkExNjEyB1hSQTE2NjAHWFJBMTcwMgdYUkExNzAzB1hSQTE3MDYHWFJBMTcwNwdYUkExNzExB1hSQTE3MTMHWFJBMTgwNwdYUkExODA4B1hSQTE4MTYHWFJBMTgyMAdYUkExODIyB1hSQTE4MjMHWFJBMTgyNQdYUkEyMDExB1hSQTIwMTMHWFJBMjAxNAdYUkEyMDE4B1hSQTIwODAHWFJBMjA4MQdYUkEyMDg0B1hSQTIxMDIHWFJBMjEwMwdYUkEyMTEwB1hSQTIxMzEHWFJBMjEzMgdYUkEyMTQ0B1hSQTIxNTEHWFJBMjE1NQdYUkEyMTYyB1hSQTIxNzIHWFJBMjE3NQdYUkEyMTkwB1hSQTIyMDAHWFJBMjIwMQdYUkEyMjAyB1hSQTIyMDQHWFJBMjIwNgdYUkEyMjMwB1hSQTIyMzEHWFJBMjIzMwdYUkEyMjM1B1hSQTIyMzYHWFJBMjI0MgdYUkEyMjQ0B1hSQTIyNjAHWFJBMjI2MQdYUkEyMjY0B1hSQTIyNjYHWFJBMjQwMAdYUkEyNDAzB1hSQTI0MDQHWFJBMjQwNQdYUkEyNDA2B1hSQTI0MzEHWFJBMjQzMwdYUkEyNDM0B1hSQTI0MzcHWFJBMjQ3MQdYUkEyNDczB1hSQTI1MDEHWFJBMjUwMwdYUkEyNTA1B1hSQTI1MDYHWFJBMjUwNwdYUkEyNTMwB1hSQTI1MzIHWFJBMjU1MAdYUkEyNTUyB1hSQTI2MDMHWFJBMjYzMgdYUkEyNjUyB1hSQTI2NTMHWFJBMjY5MAdYUkEyNzA1B1hSQTI3MDYHWFJBMjcwNwdYUkEyNzA4B1hSQTI3MDkHWFJBMjc3MAdYUkE5MDExB1hSQTkwMjEHWFJBOTAyMgdYUkE5MDIzB1hSQTkwMjUHWFJBOTAyNgdYUkE5MDMxB1hXSzEwMTEHWFdLMTAxMgdYV0sxMDIxB1hXSzEwMjMHWFdLMTAyNAdYV0sxMDI1B1hXSzExMDUHWFdLMTExMgdYV0sxMTE0B1hXSzExMTUHWFdLMTExNgdYV0sxMTE4B1hXSzExMTkHWFdLMTEzNQdYV0sxMTQyB1hXSzExNDQHWFdLMTIxMQdYV0sxMjIxB1hXSzEyMzAHWFdLMTIzMgdYV0sxMjMzB1hXSzEyMzQHWFdLMTI0MQdYV0sxMjUwB1hXSzEzMTEHWFdLMTMzMgdYV0sxMzM0B1hXSzE3MDAHWFdLMTcwMQdYV0sxNzAzB1hXSzE3MDQHWFdLMTcwNgdYV0sxNzE1B1hXSzE4MjIHWFdLMTgyMwdYV0sxODMxB1hXSzE4NDAHWFdLMTg0MgdYV0sxODUzB1hXSzE4NjIHWFdLMTg3MwdYV0sxODc0B1hXSzE4NzUHWFdLMjAxMQdYV0syMDE0B1hXSzIwMTcHWFdLMjAyMAdYV0syMDMyB1hXSzIwMzMHWFdLMjAzNAdYV0syMDM1B1hXSzIxMDEHWFdLMjEyMQdYV0syMTUzB1hXSzIyMzAHWFdLMjIzMQdYV0syMjMyB1hXSzIyMzUHWFdLMjI0MAdYV0syMjQyB1hXSzIyNTMHWFdLMjI3MAdYV0syMjcxB1hXSzIyNzMHWFdLMjI3NAdYV0syMzMyB1hXSzIzMzMHWFdLMjM2MwdYV0syMzY1B1hXSzIzNjkHWFdLMjQwMgdYV0syNDAzB1hXSzI0MDQHWFdLMjQwNgdYV0syNDA3B1hXSzI0MjEHWFdLMjQzNAdYV0syNDQwB1hXSzI0NDEHWFdLMjQ0MwdYV0syNDcwB1hXSzI0NzEHWFdLMjQ3MgdYV0syNDczB1hXSzI0NzUHWFdLMjQ3NwdYV0syNTAzB1hXSzI1MDQHWFdLMjUwNQdYV0syNTIwB1hXSzI1MzYHWFdLMjU1MQdYV0syNTU2B1hXSzI1NTcHWFdLMjU3MAdYV0syNTczB1hXSzI1ODAHWFdLMjU4MwdYV0syNTg1B1hXSzI2MDEHWFdLMjYxMAdYV0syNjExB1hXSzI2MTMHWFdLMjYxNAdYV0syNjIwB1hXSzI2MzAHWFdLMjYzMwdYV0syOTAxB1hXSzI5MTEHWFdLMjkyNQdYV0syOTI2B1hXSzMwMDAHWFdLOTAxMgdYV0s5MDE1B1hXSzkwMTYHWFdLOTAxNwdYV0s5MDMxB1hXSzkwMzIHWFdLOTAzNQdYV0s5MDM3B1hXSzkwMzkHWFdLOTA3MwdaQkIxMDI0B1pCQjEwNTAHWkJCMTA1MQdaQkIxMDkzB1pCQjExNDMHWkJCMTE2MAdaQkIxMTYyB1pCQjExNjMHWkJCMTE2NAdaQkIxMjAwB1pCQjEyMDEHWkJCMTIxMgdaQkIxMjEzB1pCQjEyNDAHWkJCMTI0MgdaQkIxMzAyB1pCQjEzMDYHWkJCMTMwNwdaQkIxMzA5B1pCQjEzMjAHWkJCMTMyMQdaQkIxMzIyB1pCQjEzMjMHWkJCMTMyNAdaQkIxMzI1B1pCQjEzMjcHWkJCMTMyOAdaQkIxMzQxB1pCQjEzNjIHWkJCMTM3MQdaQkIxNDIxB1pCQjE0MzEHWkJCMTQ1MAdaQkIxNDUxB1pCQjE1MDAHWkJCMTUwMQdaQkIxNTAyB1pCQjE1MDMHWkJCMTUwNQdaQkIxNTA2B1pCQjE1MDcHWkJCMTUwOAdaQkIxNTA5B1pCQjE1NTAHWkJCOTAzMAdaQkcwMDAwB1pCRzEwMTEHWkJHMTA0MAdaQkcxMDQxB1pCRzEwNTEHWkJHMTA1MgdaQkcxMDUzB1pCRzEwNTQHWkJHMTA1NwdaQkcxMDU4B1pCRzEwOTQHWkJHMTEwMQdaQkcxMTExB1pCRzExMTMHWkJHMTEyMAdaQkcxMTIxB1pCRzExMzAHWkJHMTEzMQdaQkcxMTMyB1pCRzExMzMHWkJHMTE0MQdaQkcxMTUyB1pCRzExNjAHWkJHMTE2MwdaQkcxMTY1B1pCRzExNjgHWkJHMTE3MAdaQkcxMTgyB1pCRzExODQHWkJHMTIwMAdaQkcxMjAzB1pCRzEyMTIHWkJHMTIxMwdaQkcxMjIwB1pCRzEyMzEHWkJHMTI0NQdaQkcxMjQ3B1pCRzEyNTAHWkJHMTI2MAdaQkcxMjYxB1pCRzEyODEHWkJHMTI5NQdaQkcxMzAwB1pCRzEzMDEHWkJHMTMwMgdaQkcxMzAzB1pCRzEzMDUHWkJHMTMwNgdaQkcxMzA3B1pCRzEzMDgHWkJHMTMwOQdaQkcxMzIxB1pCRzEzMjIHWkJHMTM0MAdaQkcxMzkxB1pCRzE0MDAHWkJHMTQwMQdaQkcxNDA5B1pCRzE0MTEHWkJHMTQyMAdaQkcxNDIxB1pCRzE0MjIHWkJHMTQyMwdaQkcxNDMxB1pCRzE0NDIHWkJHMTQ0MwdaQkcxNDQ1B1pCRzE0NTQHWkJHMTQ4MgdaQkcxNDkxB1pCRzE0OTIHWkJHMTUwMAdaQkcxNTAyB1pCRzE1MTEHWkJHMTUxMgdaQkcxNTEzB1pCRzE1MjIHWkJHMTU2MAdaQkcxNTYzB1pCRzE2MDQHWkJHMTYwNQdaQkcxNjA4B1pCRzE2MTEHWkJHMTYxOAdaQkcxNjQxB1pCRzE2NTEHWkJHMTY1MgdaQkcxNjUzB1pCRzE2NzAHWkJHMTY3NQdaQkcxNzQyB1pCRzE3NTAHWkJHMTc1MwdaQkcxNzU1B1pCRzE3NjIHWkJHMTc4MQdaQkcxODAyB1pCRzE4MDMHWkJHMTgwNAdaQkcxODA3B1pCRzE4MDkHWkJHMTgxMAdaQkcxODMxB1pCRzE4MzIHWkJHMTgzMwdaQkcxODUwB1pCRzE5MDcHWkJHMTkyMAdaQkcxOTIxB1pCRzE5MzEHWkJHMTkzOQdaQkcyMDEwB1pCRzIwMTMHWkJHMjAyNQdaQkcyMDMzB1pCRzIwMzYHWkJHMjA0MQdaQkcyMDQ1B1pCRzIwNjEHWkJHMjA2MwdaQkcyMDczB1pCRzIwNzQHWkJHMjA3NwdaQkcyMDc5B1pCRzIxMTIHWkJHMjE1MwdaQkcyMjUxB1pCRzIyNzMHWkJHMjI4MAdaQkcyMjkzB1pCRzIzMDYHWkJHMjMwNwdaQkcyMzA4B1pCRzIzNDAHWkJHMjM5MAdaQkcyMzkyB1pCRzI0MTEHWkJHMjQxMgdaQkcyNDE1B1pCRzI0MTgHWkJHMjQ0MAdaQkcyNDQzB1pCRzI0NjAHWkJHMjQ2MQdaQkcyNDYzB1pCRzI0OTAHWkJHMjQ5MQdaQkcyNDkzB1pCRzI0OTQHWkJHMjQ5NQdaQkcyNDk2B1pCRzI1MDEHWkJHMjUwMgdaQkcyNTAzB1pCRzI1MDQHWkJHMjUwNwdaQkcyNTEwB1pCRzI1MjAHWkJHMjUyMgdaQkcyNTIzB1pCRzI1NDgHWkJHMjU1MgdaQkcyNTYxB1pCRzI1OTAHWkJHMjYyMAdaQkcyNjIxB1pCRzI2NDEHWkJHMjY3MgdaQkcyNjgyB1pCRzI3MzEHWkJHMjc2MwdaQkcyODAxB1pCRzI4MzMHWkJHMjg0MwdaQkcyODUxB1pCRzMwMTAHWkJHMzAyMAdaQkczMDIxB1pCRzMwMjIHWkJHMzAyMwdaQkczMDI0B1pCRzMwMjUHWkJHMzAzNwdaQkczMDQzB1pCRzMwNDQHWkJHMzA0NwdaQkczMDUxB1pCRzMwNjIHWkJHMzA2MwdaQkczMDY0B1pCRzMwNjkHWkJHMzA5MAdaQkczMDkxB1pCRzMwOTIHWkJHMzEwNgdaQkczMTA4B1pCRzMxMDkHWkJHMzE0MAdaQkczMTQyB1pCRzMyMDYHWkJHMzIwNwdaQkczMjMxB1pCRzMyNDEHWkJHMzI0NAdaQkczMjUwB1pCRzMyNTEHWkJHMzI2MAdaQkczMzEwB1pCRzM0MDAHWkJHMzQwMgdaQkczNDEwB1pCRzM0NTAHWkJHMzQ1MgdaQkczNTAyB1pCRzM1MDMHWkJHMzUyNgdaQkczNTY4B1pCRzM1NzEHWkJHMzYwMQdaQkczNjAyB1pCRzM2MDMHWkJHMzYwNAdaQkczNjA2B1pCRzM2MDcHWkJHMzYwOAdaQkczNjQxB1pCRzM2NDMHWkJHMzY1NAdaQkczNjU2B1pCRzM2NTgHWkJHMzY2MAdaQkczNjYxB1pCRzM2ODEHWkJHMzY4MgdaQkczNzExB1pCRzM3MTIHWkJHMzc0MAdaQkczOTAxB1pCRzM5NTEHWkJHNDAyMgdaQkc0MTAxB1pCRzQxMDMHWkJHNDIwMgdaQkc0MzAzB1pCRzUwMjIHWkJHOTAxMQdaQkc5MDE1B1pCUjEwMTYHWkJSMTAxOQdaQlIxMTkwB1pCUjEyOTEHWkJSMTMwMQdaQlIxMzExB1pCUjEzNDMHWkJSMTM3MwdaQlIxNDAyB1pCUjE0MTMHWkJSMTQyOQdaQlIxNDMxB1pCUjE0NTYHWkJSMTQ4MAdaQlIxNDkyB1pCUjE1MjAHWkJSMTUzMQdaQlIxNTQyB1pCUjE1NjEHWkJSMTU3MQdaQlIxNTcyB1pCUjE1ODEHWkJSMTU5MQdaQlIxNjAyB1pCUjE3MTAHWkJSMTcxMgdaQlIxNzEzB1pCUjE3MTYHWkJSMTcxOAdaQlIxNzMxB1pCUjE3MzMHWkJSMTc2MgdaQlIxNzgzB1pCUjE4MDAHWkJSMTgwMQdaQlIxODA2B1pCUjE4MzQHWkJSMTgzNgdaQlIxODM3B1pCUjE4NTEHWkJSMTkwMAdaQlIxOTUwB1pCUjE5ODIHWkJSMjA2MQdaQlIyMDc0B1pCUjIxMzMHWkJSMjE0MAdaQlIyMzA1B1pCUjI1MTgHWkJSMjU0MgdaQlIyNTUxB1pCUjI1NjMHWkJSMjU4MAdaQlIyNTgxB1pCUjI2MDAHWkJSMjYwMQdaQlIyNjA3B1pCUjI2NzIHWkJSMjcwMgdaQlIyNzAzB1pCUjI3MDQHWkJSMjcwNQdaQlIyNzIyB1pCUjI3MjcHWkJSMjcyOAdaQlIyNzkzB1pCUjI3OTQHWkJSMjgwNAdaQlIyODA3B1pCUjI4MDgHWkJSMjgwOQdaQlIyODUwB1pCUjI4NTIHWkJSMjkxMwdaQlIyOTIxB1pCUjI5MjMHWkJSMjkyNQdaQlIyOTI2B1pCUjI5MzAHWkJSMjkzMQdaQlIyOTQwB1pCUjI5NDEHWkJSMjk1MAdaQlIyOTUyB1pCUjMwMTEHWkJSMzAxMgdaQlIzMDEzB1pCUjMyMTMHWkJSMzI0MQdaQlIzMjUxB1pCUjMyNjEHWkJSMzI3MQdaQlIzMjcyB1pCUjMzMDMHWkJSMzMwNAdaQlIzMzA1B1pCUjMzMDkHWkJSMzMxMQdaQlIzMzIyB1pCUjMzMjMHWkJSMzMyNAdaQlIzMzI1B1pCUjMzMjcHWkJSMzM5MgdaQlIzMzk0B1pCUjMzOTUHWkJSMzQzMgdaQlIzNDQzB1pCUjM0NTcHWkJSMzQ2MQdaQlIzNDcxB1pCUjM0NzYHWkJSMzQ5MQdaQlIzNTAwB1pCUjM1MTAHWkJSMzU0MAdaQlIzNTUwB1pCUjM1NTIHWkJSMzU3MAdaQlIzNjEwB1pCUjM2MTQHWkJSMzY0MQdaQlIzNjQ5B1pCUjM3MDMHWkJSMzcyMAdaQlIzNzMwB1pCUjM4NTAHWkJSMzkwMAdaQlI0MTczB1pCUjQyMjQHWkJSNDIzMAdaQlI0MjUxB1pCUjQzMjAHWkJSNDMyMQdaQlI0MzUyB1pCUjQzNjAHWkJSNDQyNQdaQlI0NDI3B1pCUjUwMTAHWkJSNTAxMQdaQlI5MDMzB1pCUjkwMzkHWkJSOTA0MgdaUlEwMDI2B1pSUTEwMTIHWlJRMTA3NAdaUlExMDgwB1pSUTEwODcHWlJRMTEwMQdaUlExMTA0B1pSUTExMTEHWlJRMTEyMQdaUlExMTMyB1pSUTExMzQHWlJRMTE0MAdaUlExMTUzB1pSUTExNTQHWlJRMTE1NgdaUlExMTczB1pSUTExODAHWlJRMTE4MQdaUlExMTgyB1pSUTExODUHWlJRMTIxNAdaUlExMjIyB1pSUTEzMTAHWlJRMTMxMQdaUlExMzE3B1pSUTEzMjEHWlJRMTM2MAdaUlExMzYyB1pSUTEzNjMHWlJRMTM2NQdaUlExNDEwB1pSUTE0MTEHWlJRMTQxMwdaUlExNDIyB1pSUTE1MDEHWlJRMTUwMgdaUlExNTMyB1pSUTE1NTIHWlJRMTU2MQdaUlExNTcwB1pSUTE2MDIHWlJRMTYxNwdaUlExNjIwB1pSUTE2MzEHWlJRMTYzMgdaUlExNjM1B1pSUTE2MzYHWlJRMTYzNwdaUlExNjUxB1pSUTE2NTMHWlJRMTY3MgdaUlExNzEyB1pSUTE3MTUHWlJRMTcyMgdaUlExNzMwB1pSUTE3MzEHWlJRMTc0MwdaUlExNzYwB1pSUTE3NjEHWlJRMTgxMAdaUlExODUwB1pSUTE4NTEHWlJRMTkxMAdaUlExOTE2B1pSUTE5MTgHWlJRMTkxOQdaUlEyMDEwB1pSUTIwMTIHWlJRMjAxMwdaUlEyMDE0B1pSUTIwMTUHWlJRMjAxNgdaUlEyMDE4B1pSUTIwMTkHWlJRMjAyMgdaUlEyMDI0B1pSUTIwMjUHWlJRMjA1MQdaUlEyMDc1B1pSUTIwNzYHWlJRMjEwNgdaUlEyMTIxB1pSUTIxNjAHWlJRMjIwMgdaUlEyMjAzB1pSUTIyMDQHWlJRMjIwNgdaUlEyMjA3B1pSUTIyMjIHWlJRMjI0MQdaUlEyMjYwB1pSUTIyNjMHWlJRMjI2NQdaUlEyMjY4B1pSUTIzMDQHWlJRMjMwOQdaUlEyMzEwB1pSUTIzMjMHWlJRMjMzMgdaUlEyMzMzB1pSUTIzMzcHWlJRMjMzOAdaUlEyMzM5B1pSUTIzNTAHWlJRMjM1MQdaUlEyMzUyB1pSUTIzNjAHWlJRMjM2NwdaUlEyMzY4B1pSUTIzNjkHWlJRMjM3NAdaUlEyMzc1B1pSUTI0MDQHWlJRMjQwNQdaUlEyNDA2B1pSUTI0MjEHWlJRMjQyNAdaUlEyNDQxB1pSUTI1MDIHWlJRMjUwMwdaUlEyNTA1B1pSUTI1MjIHWlJRMjUzMQdaUlEyNTQwB1pSUTI1NTAHWlJRMjU1MQdaUlEyNTcwB1pSUTI1NzEHWlJRMjU3NQdaUlEyNjAwB1pSUTI2MDQHWlJRMjYwNQdaUlEyNjA5B1pSUTI2NjEHWlJRMjY4MAdaUlEyNzMwB1pSUTI3NjQHWlJRMjc3MQdaUlEyNzkxB1pSUTI4MDAHWlJRMjgwMQdaUlEyODA2B1pSUTI4MzEHWlJRMjg0MQdaUlEyODUzB1pSUTI4NTUHWlJRMjg2MQdaUlEyODcwB1pSUTI4ODEHWlJRMjg4NAdaUlEyODg1B1pSUTI5MDIHWlJRMjkyMgdaUlEyOTYyB1pSUTI5NjUHWlJRMzAxMAdaUlEzMDcwB1pSUTMwNzMHWlJRMzEwMAdaUlEzMTAxB1pSUTMxMjMHWlJRMzEzNAdaUlEzMTYxB1pSUTMxNzIHWlJRMzE3NQdaUlEzMTc5B1pSUTMzMDEHWlJRMzMyMAdaUlEzMzIxB1pSUTMzNDAHWlJRMzM1MAdaUlEzNDAxB1pSUTM0MDYHWlJRMzQwNwdaUlEzNDMxB1pSUTM0MzMHWlJRMzQ0MgdaUlEzNDQzB1pSUTM0NDUHWlJRMzQ2NQdaUlEzNTQwB1pSUTM1NDEHWlJRMzU0MwdaUlEzNTYxB1pSUTM1NzEHWlJRMzYwMAdaUlEzNjAyB1pSUTM2MTEHWlJRNDAxMwdaUlE0MDE1B1pSUTQwMTcHWlJRNDAxOQdaUlE0MDIwB1pSUTQwMzEHWlJRNDA3NAdaUlE0MDc2B1pSUTQwOTQHWlJRNDA5NwdaUlE0MTAxB1pSUTQxMjAHWlJRNDEyMgdaUlE0MTQzB1pSUTQxNDUHWlJRNDE2MgdaUlE5MDEwB1pSUTkwMTEHWlJROTAzMQdaVE4xMDEyB1pUTjEwMTgHWlROMTAzMAdaVE4xMDM1B1pUTjEwMzgHWlROMTAzOQdaVE4xMDUxB1pUTjEwODMHWlROMTEwMQdaVE4xMTAyB1pUTjExMTIHWlROMTEyNAdaVE4xMTMzB1pUTjExNDYHWlROMTE1MAdaVE4xMTY0B1pUTjExNjcHWlROMTIwNAdaVE4xMjM0B1pUTjEzMzUHWlROMTM2MAdaVE4xMzYxB1pUTjEzNjUHWlROMTM2OQdaVE4xNDEwB1pUTjE0MTIHWlROMTQxNAdaVE4xNDIwB1pUTjE0NDMHWlROMTQ4MQdaVE4xNDg3B1pUTjE0OTIHWlROMTUwNwdaVE4xNTA5B1pUTjE1MTkHWlROMTU1MAdaVE4xNTg1B1pUTjE1OTAHWlROMTU5MQdaVE4xNTk3B1pUTjE2MDIHWlROMTY0MAdaVE4xNjUxB1pUTjE2NTMHWlROMTY5MQdaVE4xNzUwB1pUTjE3OTAHWlROMTgxMgdaVE4xODE2B1pUTjE4MjIHWlROMTg1MwdaVE4xODU0B1pUTjE5MDUHWlROMTkwNgdaVE4xOTA3B1pUTjIwNTQHWlROMjA3MAdaVE4yMDc2B1pUTjIwODEHWlROMjE0MAdaVE4yMTQxB1pUTjIyMDMHWlROMjIwNQdaVE4yMjA3B1pUTjIyMDkHWlROMjIyMAdaVE4yMjI0B1pUTjIyNzIHWlROMjI4MAdaVE4yMzAyB1pUTjIzNjUHWlROMjM4MAdaVE4yMzgxB1pUTjIzODIHWlROMjM4MwdaVE4yNDA2B1pUTjI0MDcHWlROMjQwOAdaVE4yNDA5B1pUTjI0MTEHWlROMjQ1MAdaVE4yNDUxB1pUTjI0NjIHWlROMjQ3MgdaVE4yNDc1B1pUTjI1MDMHWlROMjUwNAdaVE4yNTEwB1pUTjI1NDIHWlROMjU0NwdaVE4yNTczB1pUTjI2MDgHWlROMjYwOQdaVE4yNjQwB1pUTjI2NDIHWlROMjY3NQdaVE4yNzAwB1pUTjI3MTQHWlROMjcxNwdaVE4yNzE4B1pUTjI3NDUHWlROMjc3MwdaVE4yNzg2B1pUTjI4MTMHWlROMjgzMAdaVE4yODMyB1pUTjI4MzgHWlROMjg4MQdaVE4yODgyB1pUTjI4ODMHWlROMjkwMQdaVE4yOTA2B1pUTjI5MDcHWlROMjkxMwdaVE4yOTYwB1pUTjMyMDEHWlROMzIxMgdaVE4zMjE1B1pUTjMyMTcHWlROMzIyNAdaVE4zMjUxB1pUTjMyNzEHWlROMzI3MwdaVE4zMzA1B1pUTjMzMTAHWlROMzMxMQdaVE4zMzI0B1pUTjMzMzEHWlROMzMzMgdaVE4zMzQwB1pUTjMzNTEHWlROMzM1MwdaVE4zMzYwB1pUTjMzNjIHWlROMzM4MAdaVE4zMzg0B1pUTjM0MDAHWlROMzQwNgdaVE4zNDMwB1pUTjM0MzIHWlROMzQzNQdaVE4zNDM2B1pUTjM0NDMHWlROMzQ1MAdaVE4zNDYwB1pUTjM1MDMHWlROMzUwNAdaVE4zNTA1B1pUTjM1MDcHWlROMzUwOAdaVE4zNTA5B1pUTjM1NzIHWlROMzU5MAdaVE4zNjAyB1pUTjM2MjYHWlROMzcwOAdaVE4zNzMxB1pUTjM3NTAHWlROMzc1MgdaVE4zNzgzB1pUTjM4MDEHWlROMzgwMwdaVE40MDEwB1pUTjQwMjIHWlRONDAyMwdaVE40MDI0B1pUTjQwMjYHWlRONDAyOQdaVE40MDUwB1pUTjQwODIHWlRONDEwMQdaVE40MTIxB1pUTjQxNjYHWlRONDI5MAdaVE40MjkxB1pUTjQyOTMHWlRONDI5NwdaVE40MzAxB1pUTjQzMDQHWlRONDM0MAdaVE40MzQxB1pUTjQzNDUHWlRONDM1MQdaVE40MzYxB1pUTjQzNzAHWlRONDQwMAdaVE40NDAxB1pUTjQ0MDIHWlRONDQwNQdaVE40NDA3B1pUTjQ0MzAHWlRONDQ1MQdaVE40NDUyB1pUTjQ0NjIHWlRONDQ2MwdaVE40NDY0B1pUTjQ0NjcHWlRONDUxMQdaVE40NzAyB1pUTjQ3MDQHWlRONDkwMwdaVE40OTIyB1pUTjkwMjMHWlROOTAyNRQrA50kZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dkZAIeDxAPFgIfA2dkEBUDAAQyMDE2BDIwMTcVAwAEMjAxNgQyMDE3FCsDA2dnZ2RkBSZnX2QzMTg1MDY5XzVkYzZfNGUwN19hZWNhX2NlNDk1NjUzMTgzNA9kFgRmDxYCHgdWaXNpYmxlaGQCAQ8WAh8EaGQFJmdfZDgyNjA2YjZfMDA4NV80NmVjXzk5NTJfOTM2YmU3NTc5NWMwD2QWBGYPFgIfBGhkAgEPFgIfBGhkBSZnX2IyMzIyNDg0XzM2Y2ZfNDkxYl9iZWJhX2E5OGEwODU3YWZhNQ9kFgRmDxYCHwRoZAIBDxYCHwRoZAIHD2QWBGYPZBYEAgEPFgIfBGgWAmYPZBYEAgIPZBYGAgEPFgIfBGhkAgMPFggeDEhpZGRlblNjcmlwdAVrRW5zdXJlU2NyaXB0RnVuYygnb2ZmbGluZS5qcycsICdUYWtlT2ZmbGluZURpc2FibGVkJywgZnVuY3Rpb24gKCkgeyBUYWtlT2ZmbGluZURpc2FibGVkKDEsIDUzLCAtMSwgLTEpOyB9KTseE0NsaWVudE9uQ2xpY2tTY3JpcHQFuAFFbnN1cmVTY3JpcHRGdW5jKCdvZmZsaW5lLmpzJywgJ1Rha2VPZmZsaW5lVG9DbGllbnRSZWFsJywgZnVuY3Rpb24gKCkgeyBUYWtlT2ZmbGluZVRvQ2xpZW50UmVhbCgxLCA1MywgJ2h0dHBzOlx1MDAyZlx1MDAyZm1zZGVjLmdvdi5tdFx1MDAyZmVuXHUwMDJmYXJwYScsIC0xLCAtMSwgJycpO30pOyByZXR1cm4gZmFsc2U7HhhDbGllbnRPbkNsaWNrTmF2aWdhdGVVcmxkHihDbGllbnRPbkNsaWNrU2NyaXB0Q29udGFpbmluZ1ByZWZpeGVkVXJsZGQCBQ8WAh8EaGQCAw8PFgoeCUFjY2Vzc0tleQUBLx4PQXJyb3dJbWFnZVdpZHRoAgUeEEFycm93SW1hZ2VIZWlnaHQCAx4RQXJyb3dJbWFnZU9mZnNldFhmHhFBcnJvd0ltYWdlT2Zmc2V0WQLrA2RkAgMPZBYCAgEPZBYCAgMPZBYCAgEPPCsABQEADxYCHg9TaXRlTWFwUHJvdmlkZXIFEVNQU2l0ZU1hcFByb3ZpZGVyZGQCAQ9kFgQCBQ9kFgICAQ8QFgIfBGhkFCsBAGQCBw9kFgJmD2QWAmYPPCsABgBkAg0PZBYIAgYPZBYCZg9kFgRmD2QWBAICDxYCHgRUZXh0BQdFbmdsaXNoZAIGDxYCHwRoZAICDxYCHwRoZAIKD2QWBgIBD2QWBAIBDw8WBB8PBQZTaWduVXAeC05hdmlnYXRlVXJsBTxodHRwczovL215Z292Lm10L1BPUlRBTC93ZWJmb3Jtcy9ob3dkb2lnZXRhY2Nlc3N0b215Z292LmFzcHhkZAIDD2QWAmYPFgIfDwUHU2lnbiBJbmQCAw8PFgIfBGhkZAIFD2QWBAIBDw8WAh8EaGQWAgIBDw8WBB8QBTdodHRwczovL21zZGVjLmdvdi5tdC9lbi9hcnBhL19sYXlvdXRzL2F1dGhlbnRpY2F0ZS5hc3B4Hw8FB1NpZ24gSW5kZAIDDw8WAh8EaGRkAhAPZBYCAgEPZBYCZg9kFgJmDw9kFgYeBWNsYXNzBSJtcy1zYnRhYmxlIG1zLXNidGFibGUtZXggczQtc2VhcmNoHgtjZWxscGFkZGluZwUBMB4LY2VsbHNwYWNpbmcFATAWAmYPZBYCAgEPZBYCAgEPFgIfEQUWc3JjaC1BdXRvQ29tcENvbnRhaW5lchYCZg8WAh8RBRRzcmNoLUF1dG9Db21wRHJvcEltZ2QCEg9kFggCAg9kFgZmDxYCHwRoZAICDxYCHwRoZAIEDw8WAh8EaGRkAgMPFgIfDwX8KTxsaSBjbGFzcz0nZHJvcGRvd24nPjxhIGhyZWY9JyMnIGNsYXNzPSdkcm9wZG93bi10b2dnbGUnIGRhdGEtdG9nZ2xlPSdkcm9wZG93bic+VEhFIE1JTklTVFJZDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2NhcmV0Jz48L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9J2Ryb3Bkb3duLW1lbnUnPjxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0nL2VuL1BhZ2VzL1RoZS1NaW5pc3Rlci5hc3B4Jz5UaGUgTWluaXN0ZXI8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9J2h0dHBzOi8vYWdyaWN1bHR1cmVjbXMuZ292Lm10L2VuL1BhZ2VzL1BhcmxpYW1lbnRhcnktU2VjcmV0YXJpYXQuYXNweCc+UGFybGlhbWVudGFyeSBTZWNyZXRhcnk8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9QYWdlcy9jb250YWN0ZGV0YWlscy5hc3B4Jz5Db250YWN0IERldGFpbHM8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9QYWdlcy9Qb3J0Zm9saW8uYXNweCc+UG9ydGZvbGlvPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vUGFnZXMvRnJlZWRvbSUyMG9mJTIwSW5mb3JtYXRpb24vRnJlZWRvbS1vZi1JbmZvcm1hdGlvbi5hc3B4Jz5GcmVlZG9tIG9mIEluZm9ybWF0aW9uPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vUGFnZXMvTGlua3MuYXNweCc+TGlua3M8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48L3VsPg0KICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaSBjbGFzcz0nZHJvcGRvd24nPjxhIGhyZWY9JyMnIGNsYXNzPSdkcm9wZG93bi10b2dnbGUnIGRhdGEtdG9nZ2xlPSdkcm9wZG93bic+REVQQVJUTUVOVFMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nY2FyZXQnPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0nZHJvcGRvd24tbWVudSc+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSdodHRwOi8vYWdyaWN1bHR1cmUuZ292Lm10Jz5BZ3JpY3VsdHVyZTwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0naHR0cHM6Ly9hZ3JpY3VsdHVyZS5nb3YubXQvZW4vdnByZC9QYWdlcy9ob21lLmFzcHgnPlZldGVyaW5hcnkgYW5kIFBoeXRvc2FuaXRhcnkgUmVndWxhdGlvbiBEaXZpc2lvbjwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0naHR0cDovL2FycGEuZ292Lm10Jz5BZ3JpY3VsdHVyZSBhbmQgUnVyYWwgUGF5bWVudHMgQWdlbmN5IChBUlBBKTwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0nL2VuL2RlY2MvUGFnZXMvZGVjYy5hc3B4Jz5FbnZpcm9ubWVudCBhbmQgQ2xpbWF0ZSBDaGFuZ2U8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9zdXN0YWluYWJsZWRldmVsb3BtZW50L1BhZ2VzL3N1c3RhaW5hYmxlZGV2ZWxvcG1lbnQuYXNweCc+U3VzdGFpbmFibGUgRGV2ZWxvcG1lbnQ8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9J2h0dHBzOi8vYWdyaWN1bHR1cmVjbXMuZ292Lm10L2VuL2FncmljL1BhZ2VzL0RDRC9kY2QuYXNweCc+RGl2ZXJzaWZpY2F0aW9uIGFuZCBDb21wZXRpdGl2ZW5lc3M8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9QYWdlcy9QQVJLUy9QQVJLUy5hc3B4Jz5QLkEuUi5LLlM8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9QYWdlcy9XQlJVL1dpbGQtQmlyZHMtUmVndWxhdGlvbi1Vbml0LmFzcHgnPldpbGQgQmlyZHMgUmVndWxhdGlvbiBVbml0PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSdodHRwczovL2FncmljdWx0dXJlY21zLmdvdi5tdC9lbi9maXNoZXJpZXMvUGFnZXMvaG9tZS5hc3B4Jz5GaXNoZXJpZXM8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48L3VsPg0KICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaSBjbGFzcz0nZHJvcGRvd24nPjxhIGhyZWY9JyMnIGNsYXNzPSdkcm9wZG93bi10b2dnbGUnIGRhdGEtdG9nZ2xlPSdkcm9wZG93bic+TmV3cyBhbmQgUHJlc3MgUmVsZWFzZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nY2FyZXQnPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0nZHJvcGRvd24tbWVudSc+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vR292ZXJubWVudC9wcmVzcyUyMHJlbGVhc2VzL1BhZ2VzL1ByZXNzLVJlbGVhc2VzLmFzcHgnPk5ld3MgYW5kIFByZXNzIFJlbGVhc2VzPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vUGFnZXMvUHVibGlzaGVkLVJlc3VsdHMuYXNweCc+UHVibGlzaGVkIFJlc3VsdHM8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48L3VsPg0KICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaSBjbGFzcz0nZHJvcGRvd24nPjxhIGhyZWY9JyMnIGNsYXNzPSdkcm9wZG93bi10b2dnbGUnIGRhdGEtdG9nZ2xlPSdkcm9wZG93bic+VGVuZGVycyBhbmQgUXVvdGF0aW9ucw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdjYXJldCc+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSdkcm9wZG93bi1tZW51Jz48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9UZW5kZXJzJTIwYW5kJTIwUXVvdGF0aW9ucy9QYWdlcy9leHByZXNzaW9uT2ZJbnRlcmVzdDIwMTcuYXNweCc+RXhwcmVzc2lvbiBvZiBJbnRlcmVzdCAyMDE3PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vVGVuZGVycyUyMGFuZCUyMFF1b3RhdGlvbnMvUGFnZXMvdGVuZGVyczIwMTcuYXNweCc+VGVuZGVycyAyMDE3PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vVGVuZGVycyUyMGFuZCUyMFF1b3RhdGlvbnMvUGFnZXMvcXVvdGF0aW9uczIwMTcuYXNweCc+UXVvdGF0aW9ucyAyMDE3PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vUGFnZXMvdGVuZGVyc0FuZFF1b3RhdGlvbnMvY29uY2Vzc2lvbnMyMDE3LmFzcHgnPkNvbmNlc3Npb25zIDIwMTc8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9UZW5kZXJzJTIwYW5kJTIwUXVvdGF0aW9ucy9QYWdlcy9FeHByZXNzaW9uLW9mLUludGVyZXN0LTIwMTguYXNweCc+RXhwcmVzc2lvbiBvZiBJbnRlcmVzdCAyMDE4PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vVGVuZGVycyUyMGFuZCUyMFF1b3RhdGlvbnMvUGFnZXMvQ29uY2Vzc2lvbnMtMjAxOC5hc3B4Jz5Db25jZXNzaW9ucyAyMDE4PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PC91bD4NCiAgICAgICAgICAgICAgICAgICAgPC9saT48bGkgY2xhc3M9J2Ryb3Bkb3duJz48YSBocmVmPScjJyBjbGFzcz0nZHJvcGRvd24tdG9nZ2xlJyBkYXRhLXRvZ2dsZT0nZHJvcGRvd24nPkRvd25sb2Fkcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdjYXJldCc+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSdkcm9wZG93bi1tZW51Jz48L3VsPg0KICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaSBjbGFzcz0nZHJvcGRvd24nPjxhIGhyZWY9JyMnIGNsYXNzPSdkcm9wZG93bi10b2dnbGUnIGRhdGEtdG9nZ2xlPSdkcm9wZG93bic+Q29udGFjdCBVcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdjYXJldCc+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSdkcm9wZG93bi1tZW51Jz48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9QYWdlcy9Db250YWN0LVVzLmFzcHgnPkNvbnRhY3QgVXM8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9QYWdlcy9GZWVkYmFjay5hc3B4Jz5GZWVkYmFjazwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPjwvdWw+DQogICAgICAgICAgICAgICAgICAgIDwvbGk+ZAIED2QWAmYPEGQPFgFmFgEQBQdFbmdsaXNoBQUvYXJwYWcWAWZkAgYPZBYGZg8WAh8EaGQCAg8WAh8EaGQCBA8PFgIfBGdkFgICAQ9kFgJmDxYCHw8FB1NpZ24gSW5kAhEPZBYCAgEPZBYCZg9kFgICAw9kFgICBQ8PFgQeBkhlaWdodBsAAAAAAAB5QAEAAAAfAgKAAWQWAgIBDzwrAAkBAA8WBB4NUGF0aFNlcGFyYXRvcgQIHg1OZXZlckV4cGFuZGVkZ2RkZF7fUomcxRsPajUfyB9MvM+rgC5uaT00TdB3rmZIAAZR',\n", + " '__VIEWSTATEGENERATOR': 'BAB98CB3',\n", + " '__SCROLLPOSITIONX': '0',\n", + " '__SCROLLPOSITIONY': '0',\n", + " '__EVENTVALIDATION': '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',\n", + " 'ctl00$PlaceHolderSearchArea$ctl01$SBScopesDDL': 'https://msdec.gov.mt/en/Search/Pages/results.aspx',\n", + " 'InputKeywords': 'Search',\n", + " 'ctl00$PlaceHolderSearchArea$ctl01$ctl06': '0',\n", + " 'search': '0',\n", + " 'ctl00$ctl42$variationsLabelMobileControl$ddlVariationlabels': '/arpa',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$ctl01': '',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$AELSg_c7852a28_8677_47de_bf51_102e5afe2ae8combo1': '',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$AELSg_c7852a28_8677_47de_bf51_102e5afe2ae8combo2': '',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$ctl05': '',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$ctl07': '',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$AELSg_c7852a28_8677_47de_bf51_102e5afe2ae8combo5': '2017',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$FilterButton': ' Search ',\n", + " '__spDummyText1': '',\n", + " '__spDummyText2': '',\n", + " 'hiddenInputToUpdateATBuffer_CommonToolkitScripts': '1'\n", + "}\n", + "\n", + "response = requests.post('https://msdec.gov.mt/en/arpa/Pages/Payments.aspx', headers=headers, cookies=cookies, data=data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "form_data.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for k in data:\n", + " if k not in form_data:\n", + " print(k)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# display(HTML(response.text))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From e1088e79b300f67ddf0ea9ed2ea607d84485f3e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rpel?= Date: Thu, 9 Nov 2023 09:15:43 +0100 Subject: [PATCH 19/38] LT: add some code --- lt/lt_scraper.ipynb | 8571 +++++++++++++++++++++++++++++++++++++++++++ lt/lt_scraper.py | 158 + 2 files changed, 8729 insertions(+) create mode 100644 lt/lt_scraper.ipynb create mode 100644 lt/lt_scraper.py diff --git a/lt/lt_scraper.ipynb b/lt/lt_scraper.ipynb new file mode 100644 index 0000000..18183b0 --- /dev/null +++ b/lt/lt_scraper.ipynb @@ -0,0 +1,8571 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "from lxml import html\n", + "\n", + "import pandas as pd\n", + "\n", + "from slugify import slugify\n", + "\n", + "from IPython.core.display import display, HTML\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "YEAR = 2020" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_URL = 'https://portal.nma.lt/nma-portal/pages/fas_search'\n", + "PROGRAM = 'KP13'\n", + "\n", + "QUERY = {\n", + " 'pa': 'pl',\n", + " 'pTipas': 'p',\n", + " 'psl_nr': '1',\n", + " 'programos_kodas': PROGRAM,\n", + " 'fin_metai': str(YEAR),\n", + " 'pareiskejas': '',\n", + " 'apskritis': '',\n", + " 'savivaldybe': '',\n", + " 'priemone': '',\n", + " 't_suma': '',\n", + " 'k_suma': '',\n", + " 'v_suma': '',\n", + " 'b_suma': '',\n", + " 'action': 'Ieškoti',\n", + "}\n", + "\n", + "def get_page(session, year=YEAR, page=1):\n", + " query = dict(QUERY)\n", + " query.update({\n", + " 'psl_nr': str(page),\n", + " 'fin_metai': str(year)\n", + " })\n", + " response = session.post(BASE_URL, data=query, headers={\n", + " 'Content-Type': 'application/x-www-form-urlencoded',\n", + " 'Referer': 'https://portal.nma.lt/nma-portal/pages/fas_search',\n", + " })\n", + " return response\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class EndOfPagination(Exception):\n", + " pass\n", + "\n", + "SUBSIDY_TYPES = {\n", + " 0: 'EAGF',\n", + " 1: 'EAGF - other',\n", + " 2: 'EAFRD',\n", + "}\n", + "\n", + "def extract_subsidies(text, year):\n", + " root = html.fromstring(text)\n", + " table = root.xpath('//table[1]')\n", + " if not table:\n", + " raise EndOfPagination\n", + " table = table[0]\n", + " trs = table.xpath('.//tr')\n", + " base = None\n", + " for tr in trs:\n", + " tds = tr.xpath('./td')\n", + " if tr.attrib.get('id'):\n", + " base = {\n", + " 'year': year,\n", + " 'country': 'LT',\n", + " 'currency': 'EUR',\n", + "# 'recipient_id': tr.attrib.get('id'), # bad not id\n", + " 'recipient_name': tds[0].text_content(),\n", + " 'recipient_location': '%s, %s' % (\n", + " tds[2].text_content().replace('rajonas', '').strip(),\n", + " tds[1].text_content().replace('apskritis', '').strip(),\n", + " )\n", + " }\n", + " else:\n", + " subsidy_name = tds[3].text_content()\n", + " for i in range(3):\n", + " amount = float(tds[4 + i].text_content().replace(',', '.'))\n", + " if amount > 0:\n", + " subsidy = dict(base)\n", + " subsidy.update({\n", + " 'scheme': '%s (%s)' % (subsidy_name, SUBSIDY_TYPES[i]),\n", + " 'amount': amount\n", + " })\n", + " yield subsidy\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "def get_subsidies(year):\n", + " session = requests.Session()\n", + " response = session.get(BASE_URL)\n", + " # display(HTML(response.text))\n", + " response = session.post(BASE_URL, data={'pa': 'sf', 'programos_kodas': PROGRAM}, headers={\n", + " 'Content-Type': 'application/x-www-form-urlencoded',\n", + " 'Referer': 'https://portal.nma.lt/nma-portal/pages/fas_search'\n", + " })\n", + " # print(response.request.headers)\n", + " # display(HTML(response.text))\n", + " page = 1\n", + " while True:\n", + " r = get_page(session, year=year, page=page)\n", + " yield extract_subsidies(r.text, year)\n", + " page += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "496\n", + "970\n", + "1466\n", + "2027\n", + "2528\n", + "3090\n", + "3633\n", + "4193\n", + "4698\n", + "5200\n", + "5716\n", + "6205\n", + "6741\n", + "7283\n", + "7829\n", + "8321\n", + "8799\n", + "9286\n", + "9788\n", + "10247\n", + "10731\n", + "11300\n", + "11834\n", + "12342\n", + "12846\n", + "13390\n", + "13934\n", + "14445\n", + "14970\n", + "15510\n", + "16055\n", + "16587\n", + "17109\n", + "17630\n", + "18162\n", + "18751\n", + "19340\n", + "19907\n", + "20453\n", + "21004\n", + "21550\n", + "22138\n", + "22661\n", + "23187\n", + "23687\n", + "24224\n", + "24747\n", + "25328\n", + "25912\n", + "26498\n", + "27055\n", + "27618\n", + "28174\n", + "28682\n", + "29300\n", + "29919\n", + "30540\n", + "31126\n", + "31781\n", + "32282\n", + "32736\n", + "33241\n", + "33710\n", + "34276\n", + "34794\n", + "35324\n", + "35805\n", + "36357\n", + "36875\n", + "37415\n", + "37959\n", + "38535\n", + "39087\n", + "39656\n", + "40160\n", + "40693\n", + "41249\n", + "41745\n", + "42271\n", + "42859\n", + "43466\n", + "44071\n", + "44639\n", + "45273\n", + "45864\n", + "46478\n", + "47080\n", + "47634\n", + "48209\n", + "48775\n", + "49335\n", + "49880\n", + "50471\n", + "51027\n", + "51326\n", + "51861\n", + "52372\n", + "52945\n", + "53492\n", + "54070\n", + "54637\n", + "55138\n", + "55699\n", + "56246\n", + "56837\n", + "57425\n", + "57969\n", + "58527\n", + "59036\n", + "59541\n", + "60003\n", + "60517\n", + "61026\n", + "61556\n", + "62078\n", + "62539\n", + "63065\n", + "63564\n", + "64054\n", + "64559\n", + "65070\n", + "65595\n", + "66121\n", + "66616\n", + "67166\n", + "67718\n", + "68302\n", + "68904\n", + "69425\n", + "69986\n", + "70557\n", + "71112\n", + "71660\n", + "72177\n", + "72740\n", + "73329\n", + "73871\n", + "74432\n", + "74994\n", + "75512\n", + "76050\n", + "76576\n", + "77116\n", + "77610\n", + "78129\n", + "78642\n", + "79122\n", + "79592\n", + "80119\n", + "80666\n", + "81248\n", + "81843\n", + "82461\n", + "83031\n", + "83635\n", + "84256\n", + "84818\n", + "85407\n", + "85988\n", + "86488\n", + "87036\n", + "87683\n", + "88275\n", + "88883\n", + "89393\n", + "89941\n", + "90470\n", + "90984\n", + "91567\n", + "92136\n", + "92652\n", + "93215\n", + "93741\n", + "94296\n", + "94923\n", + "95479\n", + "96044\n", + "96588\n", + "97196\n", + "97678\n", + "98139\n", + "98652\n", + "99128\n", + "99672\n", + "100171\n", + "100629\n", + "101158\n", + "101692\n", + "102226\n", + "102768\n", + "103353\n", + "103918\n", + "104509\n", + "105040\n", + "105551\n", + "106079\n", + "106645\n", + "107217\n", + "107780\n", + "108349\n", + "108867\n", + "109372\n", + "109858\n", + "110354\n", + "110850\n", + "111407\n", + "111988\n", + "112572\n", + "113116\n", + "113653\n", + "114239\n", + "114807\n", + "115379\n", + "115977\n", + "116550\n", + "117096\n", + "117641\n", + "118191\n", + "118726\n", + "119302\n", + "119900\n", + "120423\n", + "120918\n", + "121482\n", + "122026\n", + "122576\n", + "123126\n", + "123694\n", + "124200\n", + "124725\n", + "125277\n", + "125853\n", + "126398\n", + "126977\n", + "127501\n", + "128001\n", + "128482\n", + "129011\n", + "129533\n", + "130020\n", + "130551\n", + "131051\n", + "131561\n", + "132104\n", + "132651\n", + "133201\n", + "133682\n", + "134123\n", + "134633\n", + "135164\n", + "135654\n", + "136133\n", + "136638\n", + "137096\n", + "137545\n", + "138022\n", + "138530\n", + "139036\n", + "139552\n", + "140086\n", + "140651\n", + "141173\n", + "141703\n", + "142230\n", + "142792\n", + "143357\n", + "143860\n", + "144409\n", + "144978\n", + "145519\n", + "146036\n", + "146595\n", + "147150\n", + "147672\n", + "148218\n", + "148749\n", + "149243\n", + "149796\n", + "150322\n", + "150854\n", + "151375\n", + "151849\n", + "152413\n", + "152938\n", + "153457\n", + "154011\n", + "154583\n", + "155077\n", + "155606\n", + "156141\n", + "156699\n", + "157252\n", + "157778\n", + "158342\n", + "158893\n", + "159420\n", + "159956\n", + "160522\n", + "161035\n", + "161593\n", + "162191\n", + "162779\n", + "163317\n", + "163881\n", + "164457\n", + "164916\n", + "165372\n", + "165999\n", + "166452\n", + "166962\n", + "167513\n", + "168058\n", + "168562\n", + "169100\n", + "169705\n", + "170276\n", + "170817\n", + "171363\n", + "171969\n", + "172523\n", + "173074\n", + "173647\n", + "174114\n", + "174649\n", + "175182\n", + "175720\n", + "176282\n", + "176810\n", + "177323\n", + "177865\n", + "178445\n", + "179001\n", + "179579\n", + "180128\n", + "180597\n", + "181090\n", + "181658\n", + "182255\n", + "182784\n", + "183292\n", + "183773\n", + "184295\n", + "184846\n", + "185418\n", + "185980\n", + "186545\n", + "187109\n", + "187695\n", + "188245\n", + "188734\n", + "189292\n", + "189819\n", + "190376\n", + "190927\n", + "191508\n", + "192143\n", + "192754\n", + "193305\n", + "193787\n", + "194268\n", + "194713\n", + "195186\n", + "195726\n", + "196236\n", + "196752\n", + "197375\n", + "197969\n", + "198579\n", + "199174\n", + "199675\n", + "199792\n", + "199911\n", + "200028\n", + "200509\n", + "200979\n", + "201492\n", + "202092\n", + "202668\n", + "203286\n", + "203915\n", + "204495\n", + "205111\n", + "205642\n", + "206202\n", + "206756\n", + "207226\n", + "207756\n", + "208332\n", + "208920\n", + "209471\n", + "209962\n", + "210443\n", + "210961\n", + "211480\n", + "212031\n", + "212572\n", + "213058\n", + "213532\n", + "214049\n", + "214523\n", + "215034\n", + "215496\n", + "215998\n", + "216465\n", + "217019\n", + "217482\n", + "218046\n", + "218633\n", + "219249\n", + "219837\n", + "220358\n", + "220928\n", + "221442\n", + "221985\n", + "222546\n", + "223118\n", + "223640\n", + "224132\n", + "224650\n", + "225206\n", + "225754\n", + "226289\n", + "226805\n", + "227338\n", + "227809\n", + "228278\n", + "228869\n", + "229448\n", + "230026\n", + "230624\n", + "231167\n", + "231731\n", + "232344\n", + "232897\n", + "233403\n", + "233906\n", + "234447\n", + "234995\n", + "235561\n", + "236107\n", + "236678\n", + "237206\n", + "237735\n", + "238269\n", + "238795\n", + "239314\n", + "239860\n", + "240452\n", + "241040\n", + "241623\n", + "242146\n", + "242683\n", + "243229\n", + "243815\n", + "244373\n", + "244891\n", + "245431\n", + "245968\n", + "246529\n", + "247085\n", + "247633\n", + "248153\n", + "248690\n", + "249266\n", + "249836\n", + "250430\n", + "250990\n", + "251506\n", + "252071\n", + "252621\n", + "253168\n", + "253712\n", + "254246\n", + "254868\n", + "255401\n", + "255981\n", + "256562\n", + "257109\n", + "257670\n", + "258245\n", + "258752\n", + "259287\n", + "259839\n", + "260383\n", + "260929\n", + "261477\n", + "262083\n", + "262602\n", + "263126\n", + "263663\n", + "264156\n", + "264698\n", + "265277\n", + "265869\n", + "266442\n", + "267005\n", + "267582\n", + "268126\n", + "268699\n", + "269247\n", + "269808\n", + "270337\n", + "270941\n", + "271479\n", + "272021\n", + "272579\n", + "273125\n", + "273631\n", + "274157\n", + "274704\n", + "275178\n", + "275644\n", + "276146\n", + "276662\n", + "277212\n", + "277741\n", + "278247\n", + "278712\n", + "279198\n", + "279754\n", + "280353\n", + "280866\n", + "281431\n", + "281973\n", + "282503\n", + "283001\n", + "283442\n", + "284007\n", + "284538\n", + "285094\n", + "285613\n", + "286144\n", + "286763\n", + "287358\n", + "287861\n", + "288396\n", + "288857\n", + "289440\n", + "290065\n", + "290695\n", + "291320\n", + "291928\n", + "292309\n", + "292603\n", + "292918\n", + "293233\n", + "293518\n", + "293853\n", + "294250\n", + "294705\n", + "295259\n", + "295792\n", + "296320\n", + "296884\n", + "297438\n", + "297999\n", + "298591\n", + "299208\n", + "299774\n", + "300367\n", + "300955\n", + "301507\n", + "302086\n", + "302633\n", + "303133\n", + "303711\n", + "304225\n", + "304740\n", + "305206\n", + "305736\n", + "306251\n", + "306735\n", + "307215\n", + "307715\n", + "308223\n", + "308729\n", + "309224\n", + "309754\n", + "310311\n", + "310870\n", + "311413\n", + "311944\n", + "312560\n", + "313147\n", + "313683\n", + "314212\n", + "314664\n", + "315215\n", + "315749\n", + "316301\n", + "316885\n", + "317456\n", + "318016\n", + "318554\n", + "319116\n", + "319653\n", + "320206\n", + "320751\n", + "321259\n", + "321842\n", + "322362\n", + "322884\n", + "323455\n", + "324014\n", + "324563\n", + "325104\n", + "325625\n", + "326208\n", + "326766\n", + "327342\n", + "327926\n", + "328372\n", + "328902\n", + "329374\n", + "329931\n", + "330453\n", + "331006\n", + "331530\n", + "332120\n", + "332701\n", + "333249\n", + "333791\n", + "334300\n", + "334862\n", + "335416\n", + "335926\n", + "336449\n", + "337037\n", + "337585\n", + "338149\n", + "338714\n", + "339268\n", + "339807\n", + "340328\n", + "340882\n", + "341445\n", + "341928\n", + "342304\n", + "342804\n", + "343339\n", + "343876\n", + "344441\n", + "344995\n", + "345485\n", + "346039\n", + "346564\n", + "347065\n", + "347570\n", + "348052\n", + "348553\n", + "349161\n", + "349724\n", + "350297\n", + "350887\n", + "351447\n", + "352105\n", + "352335\n", + "352664\n", + "353003\n", + "353332\n", + "353660\n", + "353996\n", + "354338\n", + "354681\n", + "355011\n", + "355347\n", + "355674\n", + "356011\n", + "356346\n", + "356689\n", + "357033\n", + "357377\n", + "357728\n", + "358063\n", + "358412\n", + "358773\n", + "359114\n", + "359446\n", + "359796\n", + "360146\n", + "360500\n", + "360843\n", + "361199\n", + "361546\n", + "361898\n", + "362242\n", + "362561\n", + "362817\n", + "363083\n", + "363338\n", + "363627\n", + "363910\n", + "364154\n", + "364435\n", + "364705\n", + "364981\n", + "365269\n", + "365534\n", + "374815\n", + "375155\n", + "375515\n", + "375853\n", + "376210\n", + "376577\n", + "376939\n", + "377286\n", + "377634\n", + "377976\n", + "378326\n", + "378676\n", + "379023\n", + "379377\n", + "379723\n", + "380081\n", + "380435\n", + "380794\n", + "381161\n", + "381517\n", + "381890\n", + "382249\n", + "382617\n", + "382970\n", + "383305\n", + "383657\n", + "384026\n", + "384380\n", + "384749\n", + "385103\n", + "385453\n", + "385799\n", + "386161\n", + "386529\n", + "386868\n", + "387225\n", + "387580\n", + "387918\n", + "388270\n", + "388624\n", + "388981\n", + "389332\n", + "389676\n", + "390028\n", + "390399\n", + "390742\n", + "391104\n", + "391460\n", + "391804\n", + "392161\n", + "392515\n", + "392875\n", + "393236\n", + "393604\n", + "393963\n", + "394316\n", + "394669\n", + "395037\n", + "395386\n", + "395742\n", + "396091\n", + "396466\n", + "396814\n", + "397167\n", + "397521\n", + "397867\n", + "398220\n", + "398568\n", + "398921\n", + "399274\n", + "399636\n", + "399988\n", + "400334\n", + "400685\n", + "401039\n", + "401381\n", + "401729\n", + "402075\n", + "402424\n", + "402773\n", + "403125\n", + "403478\n", + "403815\n", + "404169\n", + "404522\n", + "404872\n", + "405235\n", + "405591\n", + "405943\n", + "406295\n", + "406635\n", + "406985\n", + "407336\n", + "407686\n", + "408032\n", + "408378\n", + "408735\n", + "409079\n", + "409430\n", + "409789\n", + "410144\n", + "410501\n", + "410851\n", + "411192\n", + "411547\n", + "411917\n", + "412282\n", + "412617\n", + "412980\n", + "413318\n", + "413658\n", + "413989\n", + "414320\n", + "414652\n", + "414988\n", + "415316\n", + "415653\n", + "415973\n", + "416307\n", + "416637\n", + "416977\n", + "417306\n", + "417634\n", + "417968\n", + "418308\n", + "418658\n", + "418983\n", + "419327\n", + "419660\n", + "419999\n", + "420328\n", + "420661\n", + "421003\n", + "421345\n", + "421671\n", + "422019\n", + "422366\n", + "422711\n", + "423037\n", + "423383\n", + "423713\n", + "424067\n", + "424420\n", + "424766\n", + "425109\n", + "425443\n", + "425783\n", + "426126\n", + "426469\n", + "426826\n", + "427155\n", + "427488\n", + "427823\n", + "428163\n", + "428518\n", + "428855\n", + "429201\n", + "429543\n", + "429877\n", + "430214\n", + "430569\n", + "430915\n", + "431256\n", + "431608\n", + "431930\n", + "432178\n", + "432409\n", + "432654\n", + "432901\n", + "433144\n", + "433383\n", + "433647\n", + "433907\n", + "434160\n", + "434421\n", + "434662\n", + "434905\n", + "435148\n", + "435391\n", + "435622\n", + "435864\n", + "436123\n", + "436401\n", + "436619\n", + "436887\n", + "437113\n", + "437330\n", + "437588\n", + "437845\n", + "438118\n", + "438364\n", + "438623\n", + "438884\n", + "439132\n", + "439403\n", + "439657\n", + "439904\n", + "440138\n", + "440364\n", + "440621\n", + "440852\n", + "441079\n", + "441320\n", + "441566\n", + "441799\n", + "442056\n", + "442302\n", + "442521\n", + "442771\n", + "443011\n", + "443283\n", + "443598\n", + "443896\n", + "444184\n", + "444481\n", + "444792\n", + "445087\n", + "445390\n", + "445703\n", + "446029\n", + "446355\n", + "446709\n", + "447063\n", + "447407\n", + "447745\n", + "448093\n", + "448429\n", + "448785\n", + "449134\n", + "449468\n", + "449809\n", + "450149\n", + "450517\n", + "450863\n", + "451213\n", + "451575\n", + "451926\n", + "452279\n", + "452629\n", + "452967\n", + "453327\n", + "453670\n", + "454020\n", + "454365\n", + "454718\n", + "455053\n", + "455403\n", + "455752\n", + "456116\n", + "456457\n", + "456804\n", + "457168\n", + "457527\n", + "457872\n", + "458218\n", + "458567\n", + "458922\n", + "459282\n", + "459648\n", + "459993\n", + "460353\n", + "460694\n", + "461040\n", + "461394\n", + "461741\n", + "462099\n", + "462453\n", + "462806\n", + "463176\n", + "463521\n", + "463875\n", + "464232\n", + "464585\n", + "464940\n", + "465284\n", + "465626\n", + "465978\n", + "466324\n", + "466683\n", + "467057\n", + "467422\n", + "467767\n", + "468125\n", + "468466\n", + "468827\n", + "469174\n", + "469527\n", + "469878\n", + "470229\n", + "470587\n", + "470941\n", + "471304\n", + "471662\n", + "472009\n", + "472361\n", + "472733\n", + "473072\n", + "473428\n", + "473793\n", + "474153\n", + "474514\n", + "474867\n", + "475220\n", + "475573\n", + "475931\n", + "476286\n", + "476646\n", + "477010\n", + "477372\n", + "477732\n", + "478078\n", + "478442\n", + "478794\n", + "479162\n", + "479503\n", + "479862\n", + "480223\n", + "480576\n", + "480924\n", + "481272\n", + "481635\n", + "481945\n", + "482302\n", + "482634\n", + "482962\n", + "483275\n", + "483599\n", + "483947\n", + "484231\n", + "484573\n", + "484894\n", + "485234\n", + "485554\n", + "485905\n", + "486210\n", + "486576\n", + "486881\n", + "487220\n", + "487540\n", + "487889\n", + "488224\n", + "488535\n", + "488843\n", + "489200\n", + "489572\n", + "489890\n", + "490234\n", + "490559\n", + "490890\n", + "491213\n", + "491548\n", + "491862\n", + "492215\n", + "492567\n", + "492889\n", + "493230\n", + "493548\n", + "493916\n", + "494199\n", + "494563\n", + "494881\n", + "495245\n", + "495552\n", + "495889\n", + "496213\n", + "496549\n", + "496895\n", + "497211\n", + "497557\n", + "497895\n", + "498258\n", + "498569\n", + "498928\n", + "499243\n", + "499574\n", + "499866\n", + "500204\n", + "500527\n", + "500880\n", + "501188\n", + "501483\n", + "501848\n", + "502124\n", + "502476\n", + "502771\n", + "503118\n", + "503433\n", + "503777\n", + "504103\n", + "504453\n", + "504822\n", + "505074\n", + "505430\n", + "505795\n", + "506132\n", + "506314\n", + "506640\n", + "506990\n", + "507318\n", + "507602\n", + "507949\n", + "508315\n", + "508529\n", + "508801\n", + "509149\n", + "509509\n", + "509754\n", + "510117\n", + "510484\n", + "510773\n", + "510999\n", + "511364\n", + "511745\n", + "512037\n", + "512325\n", + "512676\n", + "513031\n", + "513248\n", + "513534\n", + "513883\n", + "514248\n", + "514533\n", + "514832\n", + "515179\n", + "515517\n", + "515676\n", + "515959\n", + "516305\n", + "516674\n", + "516942\n", + "517302\n", + "517673\n", + "517971\n", + "518206\n", + "518556\n", + "518938\n", + "519190\n", + "519534\n", + "519905\n", + "520218\n", + "520436\n", + "520799\n", + "521193\n", + "521486\n", + "521785\n", + "522127\n", + "522491\n", + "522731\n", + "523001\n", + "523372\n", + "523715\n", + "524070\n", + "524431\n", + "524758\n", + "525101\n", + "525465\n", + "525803\n", + "526152\n", + "526514\n", + "526837\n", + "527228\n", + "527561\n", + "527912\n", + "528272\n", + "528593\n", + "528940\n", + "529308\n", + "529670\n", + "530039\n", + "530381\n", + "530710\n", + "531069\n", + "531396\n", + "531741\n", + "532112\n", + "532433\n", + "532779\n", + "533160\n", + "533491\n", + "533867\n", + "534202\n", + "534526\n", + "534898\n", + "535252\n", + "535605\n", + "535963\n", + "536269\n", + "536610\n", + "536960\n", + "537300\n", + "537661\n", + "538026\n", + "538354\n", + "538713\n", + "539040\n", + "539392\n", + "539733\n", + "540081\n", + "540441\n", + "540769\n", + "541098\n", + "541447\n", + "541808\n", + "542149\n", + "542478\n", + "542795\n", + "543144\n", + "543490\n", + "543849\n", + "544232\n", + "544604\n", + "544960\n", + "545278\n", + "545610\n", + "545913\n", + "546253\n", + "546603\n", + "546942\n", + "547254\n", + "547628\n", + "548005\n", + "548367\n", + "548690\n", + "549007\n", + "549339\n", + "549669\n", + "550019\n", + "550373\n", + "550740\n", + "551093\n", + "551424\n", + "551784\n", + "552085\n", + "552438\n", + "552778\n", + "553110\n", + "553444\n", + "553817\n", + "554176\n", + "554529\n", + "554865\n", + "555195\n", + "555536\n", + "555861\n", + "556227\n", + "564128\n", + "564471\n", + "564826\n", + "565155\n", + "565496\n", + "565916\n", + "566262\n", + "566586\n", + "566890\n", + "567242\n", + "567593\n", + "567924\n", + "568257\n", + "568622\n", + "568988\n", + "569322\n", + "569682\n", + "570024\n", + "570346\n", + "570694\n", + "571031\n", + "571368\n", + "571739\n", + "572140\n", + "572465\n", + "572781\n", + "573106\n", + "573456\n", + "573795\n", + "574133\n", + "574483\n", + "574879\n", + "575244\n", + "575584\n", + "575926\n", + "576214\n", + "576562\n", + "576901\n", + "577240\n", + "577599\n", + "577988\n", + "578396\n", + "578736\n", + "579061\n", + "579378\n", + "579736\n", + "580072\n", + "580398\n", + "580740\n", + "581109\n", + "581474\n", + "581805\n", + "582151\n", + "582454\n", + "582801\n", + "583148\n", + "583490\n", + "583832\n", + "584201\n", + "584568\n", + "584901\n", + "585238\n", + "585588\n", + "585940\n", + "586277\n", + "586622\n", + "587011\n", + "587386\n", + "587755\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "IOPub message rate exceeded.\n", + "The Jupyter server will temporarily stop sending output\n", + "to the client in order to avoid crashing it.\n", + "To change this limit, set the config variable\n", + "`--ServerApp.iopub_msg_rate_limit`.\n", + "\n", + "Current values:\n", + "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n", + "ServerApp.rate_limit_window=3.0 (secs)\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n" + ] + } + ], + "source": [ + "df = pd.DataFrame()\n", + "for page_gen in get_subsidies(YEAR):\n", + " try:\n", + " df = pd.concat([df, pd.DataFrame(page_gen)])\n", + " except EndOfPagination:\n", + " pass\n", + " df.to_csv('lt_%s.csv.gz' % YEAR, compression='gzip', index=False)\n", + " print(len(df))" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "132659" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"recipient_name\"].nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "df['recipient_id'] = df.apply(lambda x: \"LT-{}-{}\".format(slugify(x['recipient_name']), slugify(x['recipient_location'])), 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearcountrycurrencyrecipient_idrecipient_namerecipient_locationschemeamount
02020LTEURLT-a-vaiciukynienes-individuali-imone-jurbarko...A. Vaičiukynienės individuali įmonėJurbarko, TauragėsŽalinimo išmoka (EAGF)1373.08
12020LTEURLT-a-vaiciukynienes-individuali-imone-jurbarko...A. Vaičiukynienės individuali įmonėJurbarko, TauragėsFinansų disciplinos kompensavimo išmoka (EAGF)37.54
22020LTEURLT-a-vaiciukynienes-individuali-imone-jurbarko...A. Vaičiukynienės individuali įmonėJurbarko, TauragėsSusietoji parama už baltyminius augalus (EAGF)87.10
32020LTEURLT-a-vaiciukynienes-individuali-imone-jurbarko...A. Vaičiukynienės individuali įmonėJurbarko, TauragėsTiesioginės išmokos už pasėlius (EAGF)1690.05
42020LTEURLT-a-vaiciukynienes-individuali-imone-jurbarko...A. Vaičiukynienės individuali įmonėJurbarko, TauragėsIšmoka už pirmuosius hektarus (EAGF)1591.48
\n", + "
" + ], + "text/plain": [ + " year country currency recipient_id \\\n", + "0 2020 LT EUR LT-a-vaiciukynienes-individuali-imone-jurbarko... \n", + "1 2020 LT EUR LT-a-vaiciukynienes-individuali-imone-jurbarko... \n", + "2 2020 LT EUR LT-a-vaiciukynienes-individuali-imone-jurbarko... \n", + "3 2020 LT EUR LT-a-vaiciukynienes-individuali-imone-jurbarko... \n", + "4 2020 LT EUR LT-a-vaiciukynienes-individuali-imone-jurbarko... \n", + "\n", + " recipient_name recipient_location \\\n", + "0 A. Vaičiukynienės individuali įmonė Jurbarko, Tauragės \n", + "1 A. Vaičiukynienės individuali įmonė Jurbarko, Tauragės \n", + "2 A. Vaičiukynienės individuali įmonė Jurbarko, Tauragės \n", + "3 A. Vaičiukynienės individuali įmonė Jurbarko, Tauragės \n", + "4 A. Vaičiukynienės individuali įmonė Jurbarko, Tauragės \n", + "\n", + " scheme amount \n", + "0 Žalinimo išmoka (EAGF) 1373.08 \n", + "1 Finansų disciplinos kompensavimo išmoka (EAGF) 37.54 \n", + "2 Susietoji parama už baltyminius augalus (EAGF) 87.10 \n", + "3 Tiesioginės išmokos už pasėlius (EAGF) 1690.05 \n", + "4 Išmoka už pirmuosius hektarus (EAGF) 1591.48 " + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "df.to_csv('lt_%s.csv.gz' % YEAR, compression='gzip', index=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/lt/lt_scraper.py b/lt/lt_scraper.py new file mode 100644 index 0000000..17e7239 --- /dev/null +++ b/lt/lt_scraper.py @@ -0,0 +1,158 @@ +import asyncio +import csv +import time +import os + +import lxml.html +from playwright.async_api import async_playwright +import httpx +from tqdm import tqdm +import pandas as pd + + +YEAR = 2021 +BASE_URL = 'https://portal.nma.lt/nma-portal/pages/fas_search' +PROGRAM_NAME = 'KP13' + + + +async def get_session(): + + headers = None + + async def find_data_request(request): + nonlocal headers + + if request.method == 'GET' and request.url == BASE_URL: + print("Found request") + headers = await request.all_headers() + headers = headers.copy() + + + async with async_playwright() as p: + print("Launch browser") + browser = await p.firefox.launch(headless=False) + page = await browser.new_page() + page.set_default_navigation_timeout(120_000) + + await page.goto(BASE_URL) + # page.on("response", lambda response: print("<<", response.status, response.url)) + await page.wait_for_load_state(state="networkidle") + await page.locator(f"a[href=\"javascript:submitForm('{PROGRAM_NAME}');\"]").click() + await page.wait_for_load_state(state="networkidle") + + page.on("request", lambda request: print(">>", request.method, request.url)) + page.on("request", find_data_request) + await page.goto(BASE_URL) + + headers.pop("content-length", None) + return headers + + +class EndOfPagination(Exception): + pass + + +SUBSIDY_TYPES = { + 0: 'EAGF', + 1: 'EAGF - other', + 2: 'EAFRD', +} + +def get_data_items(root): + table = root.xpath('//table[1]') + if not table: + raise EndOfPagination + table = table[0] + trs = table.xpath('.//tr') + base = None + for tr in trs: + tds = tr.xpath('./td') + if tr.attrib.get('id'): + base = { + 'year': YEAR, + 'country': 'LT', + 'currency': 'EUR', + 'recipient_id': tr.attrib.get('id'), + 'recipient_name': tds[0].text_content(), + 'recipient_location': '%s, %s' % ( + tds[2].text_content().replace('rajonas', '').strip(), + tds[1].text_content().replace('apskritis', '').strip(), + ) + } + else: + subsidy_name = tds[3].text_content() + for i in range(3): + amount = float(tds[4 + i].text_content().replace(',', '.')) + if amount > 0: + subsidy = dict(base) + subsidy.update({ + 'scheme': '%s (%s)' % (subsidy_name, SUBSIDY_TYPES[i]), + 'amount': amount + }) + yield subsidy + + +def download_offset(page_num, headers): + post_data = { + "pa": "pl", + "pTipas": "p", + "psl_nr": str(page_num), + "programos_kodas": PROGRAM_NAME, + "fin_metai": str(YEAR), + "pareiskejas": "", + "apskritis": "", + "savivaldybe": "", + "priemone": "", + "t_suma": "", + "k_suma": "", + "v_suma": "", + "b_suma": "", + "action": "Ieškoti", + } + response = httpx.post(BASE_URL, headers=headers.copy(), data=post_data, timeout=120) + with open("page.html", "w") as f: + f.write(response.text) + root = lxml.html.fromstring(response.text) + yield from get_data_items(root) + +OFFSET_FILE = 'lt_offset.txt' + +def update_offset(offset): + with open(OFFSET_FILE, 'w') as f: + f.write(str(offset)) + + +def read_offset(): + if not os.path.exists(OFFSET_FILE): + return 1 + with open(OFFSET_FILE, 'r') as f: + return int(f.read()) + +def main(): + headers = asyncio.run(get_session()) + print("Headers:", headers) + output_filename = f'lt_{YEAR}.csv.gz' + if os.path.exists(output_filename): + df = pd.read_csv(output_filename) + else: + df = pd.DataFrame() + page_num = read_offset() + while True: + print("Downloading page", page_num) + try: + df = pd.concat([df, pd.DataFrame(list(download_offset(page_num, headers)))]) + df.to_csv(output_filename, index=False, compression='gzip') + page_num += 1 + update_offset(page_num) + except EndOfPagination: + print("End of pagination") + break + except Exception as e: + print(e) + time.sleep(30) + headers = asyncio.run(get_session()) + + +if __name__ == '__main__': + main() From 2ba064a9aef21087222ce03147bfa34c06e302c3 Mon Sep 17 00:00:00 2001 From: tilana Date: Thu, 9 Nov 2023 12:41:10 +0100 Subject: [PATCH 20/38] CY: adjust data source to 2022 / flag old scraper --- cy/cy_scraper.ipynb | 721 ++++++++++-------- ...scraper.ipynb => cyprus-scraper_old.ipynb} | 27 +- 2 files changed, 414 insertions(+), 334 deletions(-) rename cy/{cyprus-scraper.ipynb => cyprus-scraper_old.ipynb} (74%) diff --git a/cy/cy_scraper.ipynb b/cy/cy_scraper.ipynb index 6f498c0..921fab1 100644 --- a/cy/cy_scraper.ipynb +++ b/cy/cy_scraper.ipynb @@ -15,35 +15,45 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, + "outputs": [], + "source": [ + "# !wget -nc -O cy_2016_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/AD063B69CE4D0D06C2258131002AA09F/$file/FINAL%20%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202016-%2031.5.17.xlsx'\n", + "#!wget -nc -O cy_2017_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/ad063b69ce4d0d06c2258131002aa09f/$FILE/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202017.xlsx'\n", + "#!wget -nc -O cy_2018_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/E8D55487034C5E1BC2257FC4003E8A41/$file/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%20FY%202018.002.xlsx'" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "File ‘cy_2017_raw.xlsx’ already there; not retrieving.\n", - "--2019-11-10 13:14:52-- http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/E8D55487034C5E1BC2257FC4003E8A41/$file/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%20FY%202018.002.xlsx\n", - "Resolving www.capo.gov.cy (www.capo.gov.cy)... 212.31.118.26\n", - "Connecting to www.capo.gov.cy (www.capo.gov.cy)|212.31.118.26|:80... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 10246058 (9.8M) [application/vnd.openxmlformats-officedocument.spreadsheetml.sheet]\n", - "Saving to: ‘cy_2018_raw.xlsx’\n", + "--2023-11-09 12:34:12-- https://www.capo.gov.cy/CAPO/CAPO.nsf/0/d58f9e5a29b59458c225813100443d5d/$FILE/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%B4%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%20FY2022.xlsx\n", + "Auflösen des Hostnamens www.capo.gov.cy (www.capo.gov.cy) … 212.31.118.152\n", + "Verbindungsaufbau zu www.capo.gov.cy (www.capo.gov.cy)|212.31.118.152|:443 … verbunden.\n", + "WARNUNG: Das Zertifikat von www.capo.gov.cy kann nicht geprüft werden, ausgestellt von ‘CN=GeoTrust TLS RSA CA G1,OU=www.digicert.com,O=DigiCert Inc,C=US’:.\n", + " Die Autorität des Zertifikatausstellers kann lokal nicht geprüft werden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK\n", + "Länge: 11217119 (11M) [application/vnd.openxmlformats-officedocument.spreadsheetml.sheet]\n", + "Wird in ‘cy_2022_raw.xlsx’ gespeichert.\n", "\n", - "cy_2018_raw.xlsx 100%[===================>] 9.77M 1.11MB/s in 9.2s \n", + "cy_2022_raw.xlsx 100%[===================>] 10,70M 2,72MB/s in 3,9s \n", "\n", - "2019-11-10 13:15:02 (1.06 MB/s) - ‘cy_2018_raw.xlsx’ saved [10246058/10246058]\n", + "2023-11-09 12:34:16 (2,72 MB/s) - ‘cy_2022_raw.xlsx’ gespeichert [11217119/11217119]\n", "\n" ] } ], "source": [ - "# !wget -nc -O cy_2016_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/AD063B69CE4D0D06C2258131002AA09F/$file/FINAL%20%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202016-%2031.5.17.xlsx'\n", - "!wget -nc -O cy_2017_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/ad063b69ce4d0d06c2258131002aa09f/$FILE/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202017.xlsx'\n", - "!wget -nc -O cy_2018_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/E8D55487034C5E1BC2257FC4003E8A41/$file/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%20FY%202018.002.xlsx'" + "!wget --no-check-certificat -O cy_2022_raw.xlsx 'https://www.capo.gov.cy/CAPO/CAPO.nsf/0/d58f9e5a29b59458c225813100443d5d/$FILE/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%B4%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%20FY2022.xlsx'" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -52,28 +62,29 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "YEAR = 2018" + "YEAR = 2022" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['Πληρωμές_Δικαιούχων_FY_2018',\n", - " 'Περιγραφή_Μέτρων__Ελληνικά',\n", - " 'Description_of_Mesaures__EN',\n", - " 'Μέτρα']" + "['Πληρωμές - Payments FY2022',\n", + " 'Κωδικοί και Περιγραφή',\n", + " 'Περιγραφή Μέτρων',\n", + " 'Codes and Description',\n", + " 'Description of Measures']" ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -90,12 +101,13 @@ "outputs": [], "source": [ "SHEET_NAME = 'Πληρωμές δικαιούχων FY {}'.format(YEAR) # means 'Beneficiary Payments'\n", - "SHEET_NAME = 'Πληρωμές_Δικαιούχων_FY_2018'" + "#SHEET_NAME = 'Πληρωμές_Δικαιούχων_FY_2018'\n", + "SHEET_NAME = 'Πληρωμές - Payments FY2022'" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -119,211 +131,234 @@ " \n", " \n", " \n", - " ONOMA ΔΙΚΑΟΥΧΟΥ /ΝΑΜΕ OF BENEFICIARY\n", - " ΑΡΙΘΜΟΣ ΑΝΑΦΟΡΑΣ/\n", - "REFERENCE NUMBER\n", - " ΕΠΙΔΟΤΗΣH ΕΓΤΕ/\n", - "SUBSIDY BY EAGF \n", - "€\n", - " ΕΠΙΔΟΤΗΣΗ ΕΓΤΑΑ/\n", - "SUBSIDY BY EAFRD\n", - " €\n", - " ΣΥΝΟΛΟ ΕΠΙΔΟΤΗΣΗΣ ΕΓΤΕ ΚΑΙ ΕΓΤΑΑ/\n", - "TOTAL SUBSIDY EAGF AND EAFRD \n", - "€\n", - " ΕΥΡΩΠΑΪΚΟ ΓΕΩΡΓΙΚΟ ΤΑΜΕΙΟ/ ΕUROPEAN AGRICULTURAL FUND\n", - " ΚΩΔΙΚΟΣ ΜΕΤΡΟΥ/\n", - "MEASURE CODE\n", - " ΣΥΝΤΟΜΟΣ ΚΩΔΙΚΟΣ ΜΕΤΡΟΥ /\n", - " SHORT MEASURE CODE\n", - " ΠΕΡΙΓΡΑΦΗ ΜΕΤΡΟΥ/ DESCRIPTION OF MEASURE\n", - " ΤΑΧΥΔΡΟΜΙΚΟΣ ΚΩΔΙΚΑΣ\n", - "/POSTAL CODE\n", - " ΔΗΜΟΣ/ΕΠΑΡΧΙΑ/ΚΟΙΝΟΤΗΤΑ /\n", - " MUNICIPALITY/\n", - "DISTRICT/COMMUNITY\n", + " Όνομα Δικαιούχου\\nή Αριθμός Αναφοράς Δικαιούχου\\n\\nBeneficiary Name Or Beneficiary Reference Number\n", + " Κωδικός Μέτρου\\n\\nMeasure Code\n", + " Ευρωπαϊκό Γεωργικό Ταμείο\\n\\nEuropean Agricultural Fund\\n\\n(ΕΓΤΕ = EAGF; \\nΕΓΤΑΑ = EAFRD)\n", + " Σύντομος Κωδικός Μέτρου\\n\\nShort Measure Code\n", + " Επιδότηση ΕΓΤΕ\\n(Ευρωπαϊκή Συνεισφορά)\\n\\nSubsidy by EAGF\\n(European Contribution)\\n\\n€\n", + " Επιδότηση ΕΓΤΑΑ\\n(Ευρωπαϊκή Συνεισφορά)\\n\\nSubsidy by EAFRD\\n(European Contribution)\\n \\n€\n", + " Επιδότηση ΕΓΤΑΑ\\n(Εθνική Συνεισφορά)\\n\\nSubsidy by EAFRD\\n(National Contribution)\\n \\n€\n", + " Σύνολο Επιδότησης ΕΓΤΕ ή ΕΓΤΑΑ\\n\\nTotal subsidy EAGF or EAFRD\\n\\n€\n", + " Καθαρό Σύνολο ανά Δικαιούχο (Επιδότηση ΕΓΤΕ:\\nΕυρωπαϊκή Συνεισφορά +\\nΕπιδότηση ΕΓΤΑΑ:\\nΕυρωπαϊκή + Εθνική Συνεισφορά)\\n\\nNet Amount per Beneficiary (Subsidy by EAGF:\\nEuropean Contribution +\\nSubsidy by EAFRD:\\nEuropean + National Contribution)\\n\\n€\n", + " Ταχυδρομικός Κώδικας\\n\\nPostal Code\n", + " Δήμος ή\\nΕπαρχία ή\\nΚοινότητα\\n \\n Municipality or\\nDistrict or\\nCommunity\n", + " Περιγραφή Μέτρου\n", + " Description of Measure\n", " \n", " \n", " \n", " \n", " 0\n", + " 000000000182\n", + " 80205050000013\n", + " ΕΓΤΕ\n", + " II.4\n", + " 101.87\n", + " 0.0\n", + " 0.0\n", + " 101.87\n", " NaN\n", - " 51956\n", - " 209.45\n", - " NaN\n", - " 209.45\n", - " EAGF\n", - " 50301020010026\n", - " ΙΙ.2\n", - " Single area payment scheme - without financial...\n", " 4747\n", " ΜΟΝΙΑΤΗΣ\n", + " Ενίσχυση για γεωργικές πρακτικές επωφελείς για...\n", + " Payment for agricultural practices beneficial ...\n", " \n", " \n", " 1\n", + " 000000000182\n", + " 80205020010042\n", + " ΕΓΤΕ\n", + " II.2\n", + " 209.53\n", + " 0.0\n", + " 0.0\n", + " 209.53\n", " NaN\n", - " 51956\n", - " 103.14\n", - " NaN\n", - " 103.14\n", - " EAGF\n", - " 50301110000005\n", - " ΙΙ.4\n", - " Payment for agricultural practices beneficial ...\n", " 4747\n", " ΜΟΝΙΑΤΗΣ\n", + " Καθεστώς ενιαίας ενίσχυσης με βάση την έκταση ...\n", + " Single area payment scheme - without financial...\n", " \n", " \n", " 2\n", - " NaN\n", - " 51956\n", - " NaN\n", - " 131.6\n", + " 000000000182\n", + " 80301025343100\n", + " ΕΓΤΑΑ\n", + " IV/18\n", + " 0.00\n", + " 98.7\n", + " 32.9\n", " 131.60\n", - " EAFRD\n", - " 50460011341100\n", - " IV/A.18\n", - " RD - Measure 13\n", + " 443.0\n", " 4747\n", " ΜΟΝΙΑΤΗΣ\n", + " Αγροτική Ανάπτυξη - Μέτρο 13 - 2021 - 75%: Ενι...\n", + " Rural Development - Measure 13 - 2021 - 75%: P...\n", " \n", " \n", " 3\n", + " ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ\n", + " 80205020010042\n", + " ΕΓΤΕ\n", + " II.2\n", + " 2000.00\n", + " 0.0\n", + " 0.0\n", + " 2000.00\n", " NaN\n", - " 103350\n", - " 89.13\n", - " NaN\n", - " 89.13\n", - " EAGF\n", - " 50301020010026\n", - " ΙΙ.2\n", + " 5515\n", + " ΑΥΓΟΡΟΥ\n", + " Καθεστώς ενιαίας ενίσχυσης με βάση την έκταση ...\n", " Single area payment scheme - without financial...\n", - " 6017\n", - " ΛΑΡΝΑΚΑ\n", " \n", " \n", " 4\n", + " ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ\n", + " 80205020010043\n", + " ΕΓΤΕ\n", + " II.2\n", + " 5229.59\n", + " 0.0\n", + " 0.0\n", + " 5229.59\n", " NaN\n", - " 103350\n", - " 43.89\n", - " NaN\n", - " 43.89\n", - " EAGF\n", - " 50301110000005\n", - " ΙΙ.4\n", - " Payment for agricultural practices beneficial ...\n", - " 6017\n", - " ΛΑΡΝΑΚΑ\n", + " 5515\n", + " ΑΥΓΟΡΟΥ\n", + " Καθεστώς ενιαίας ενίσχυσης με βάση την έκταση ...\n", + " Single area payment scheme - with financial di...\n", " \n", " \n", "\n", "" ], "text/plain": [ - " ONOMA ΔΙΚΑΟΥΧΟΥ /ΝΑΜΕ OF BENEFICIARY ΑΡΙΘΜΟΣ ΑΝΑΦΟΡΑΣ/\\nREFERENCE NUMBER \\\n", - "0 NaN 51956 \n", - "1 NaN 51956 \n", - "2 NaN 51956 \n", - "3 NaN 103350 \n", - "4 NaN 103350 \n", + " Όνομα Δικαιούχου\\nή Αριθμός Αναφοράς Δικαιούχου\\n\\nBeneficiary Name Or Beneficiary Reference Number \\\n", + "0 000000000182 \n", + "1 000000000182 \n", + "2 000000000182 \n", + "3 ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ \n", + "4 ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ \n", + "\n", + " Κωδικός Μέτρου\\n\\nMeasure Code \\\n", + "0 80205050000013 \n", + "1 80205020010042 \n", + "2 80301025343100 \n", + "3 80205020010042 \n", + "4 80205020010043 \n", + "\n", + " Ευρωπαϊκό Γεωργικό Ταμείο\\n\\nEuropean Agricultural Fund\\n\\n(ΕΓΤΕ = EAGF; \\nΕΓΤΑΑ = EAFRD) \\\n", + "0 ΕΓΤΕ \n", + "1 ΕΓΤΕ \n", + "2 ΕΓΤΑΑ \n", + "3 ΕΓΤΕ \n", + "4 ΕΓΤΕ \n", + "\n", + " Σύντομος Κωδικός Μέτρου\\n\\nShort Measure Code \\\n", + "0 II.4 \n", + "1 II.2 \n", + "2 IV/18 \n", + "3 II.2 \n", + "4 II.2 \n", "\n", - " ΕΠΙΔΟΤΗΣH ΕΓΤΕ/\\nSUBSIDY BY EAGF \\n€ \\\n", - "0 209.45 \n", - "1 103.14 \n", - "2 NaN \n", - "3 89.13 \n", - "4 43.89 \n", + " Επιδότηση ΕΓΤΕ\\n(Ευρωπαϊκή Συνεισφορά)\\n\\nSubsidy by EAGF\\n(European Contribution)\\n\\n€ \\\n", + "0 101.87 \n", + "1 209.53 \n", + "2 0.00 \n", + "3 2000.00 \n", + "4 5229.59 \n", "\n", - " ΕΠΙΔΟΤΗΣΗ ΕΓΤΑΑ/\\nSUBSIDY BY EAFRD\\n € \\\n", - "0 NaN \n", - "1 NaN \n", - "2 131.6 \n", - "3 NaN \n", - "4 NaN \n", + " Επιδότηση ΕΓΤΑΑ\\n(Ευρωπαϊκή Συνεισφορά)\\n\\nSubsidy by EAFRD\\n(European Contribution)\\n \\n€ \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 98.7 \n", + "3 0.0 \n", + "4 0.0 \n", "\n", - " ΣΥΝΟΛΟ ΕΠΙΔΟΤΗΣΗΣ ΕΓΤΕ ΚΑΙ ΕΓΤΑΑ/\\nTOTAL SUBSIDY EAGF AND EAFRD \\n€ \\\n", - "0 209.45 \n", - "1 103.14 \n", - "2 131.60 \n", - "3 89.13 \n", - "4 43.89 \n", + " Επιδότηση ΕΓΤΑΑ\\n(Εθνική Συνεισφορά)\\n\\nSubsidy by EAFRD\\n(National Contribution)\\n \\n€ \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 32.9 \n", + "3 0.0 \n", + "4 0.0 \n", "\n", - " ΕΥΡΩΠΑΪΚΟ ΓΕΩΡΓΙΚΟ ΤΑΜΕΙΟ/ ΕUROPEAN AGRICULTURAL FUND \\\n", - "0 EAGF \n", - "1 EAGF \n", - "2 EAFRD \n", - "3 EAGF \n", - "4 EAGF \n", + " Σύνολο Επιδότησης ΕΓΤΕ ή ΕΓΤΑΑ\\n\\nTotal subsidy EAGF or EAFRD\\n\\n€ \\\n", + "0 101.87 \n", + "1 209.53 \n", + "2 131.60 \n", + "3 2000.00 \n", + "4 5229.59 \n", "\n", - " ΚΩΔΙΚΟΣ ΜΕΤΡΟΥ/\\nMEASURE CODE \\\n", - "0 50301020010026 \n", - "1 50301110000005 \n", - "2 50460011341100 \n", - "3 50301020010026 \n", - "4 50301110000005 \n", + " Καθαρό Σύνολο ανά Δικαιούχο (Επιδότηση ΕΓΤΕ:\\nΕυρωπαϊκή Συνεισφορά +\\nΕπιδότηση ΕΓΤΑΑ:\\nΕυρωπαϊκή + Εθνική Συνεισφορά)\\n\\nNet Amount per Beneficiary (Subsidy by EAGF:\\nEuropean Contribution +\\nSubsidy by EAFRD:\\nEuropean + National Contribution)\\n\\n€ \\\n", + "0 NaN \n", + "1 NaN \n", + "2 443.0 \n", + "3 NaN \n", + "4 NaN \n", "\n", - " ΣΥΝΤΟΜΟΣ ΚΩΔΙΚΟΣ ΜΕΤΡΟΥ /\\n SHORT MEASURE CODE \\\n", - "0 ΙΙ.2 \n", - "1 ΙΙ.4 \n", - "2 IV/A.18 \n", - "3 ΙΙ.2 \n", - "4 ΙΙ.4 \n", + " Ταχυδρομικός Κώδικας\\n\\nPostal Code \\\n", + "0 4747 \n", + "1 4747 \n", + "2 4747 \n", + "3 5515 \n", + "4 5515 \n", "\n", - " ΠΕΡΙΓΡΑΦΗ ΜΕΤΡΟΥ/ DESCRIPTION OF MEASURE \\\n", - "0 Single area payment scheme - without financial... \n", - "1 Payment for agricultural practices beneficial ... \n", - "2 RD - Measure 13 \n", - "3 Single area payment scheme - without financial... \n", - "4 Payment for agricultural practices beneficial ... \n", + " Δήμος ή\\nΕπαρχία ή\\nΚοινότητα\\n \\n Municipality or\\nDistrict or\\nCommunity \\\n", + "0 ΜΟΝΙΑΤΗΣ \n", + "1 ΜΟΝΙΑΤΗΣ \n", + "2 ΜΟΝΙΑΤΗΣ \n", + "3 ΑΥΓΟΡΟΥ \n", + "4 ΑΥΓΟΡΟΥ \n", "\n", - " ΤΑΧΥΔΡΟΜΙΚΟΣ ΚΩΔΙΚΑΣ\\n/POSTAL CODE \\\n", - "0 4747 \n", - "1 4747 \n", - "2 4747 \n", - "3 6017 \n", - "4 6017 \n", + " Περιγραφή Μέτρου \\\n", + "0 Ενίσχυση για γεωργικές πρακτικές επωφελείς για... \n", + "1 Καθεστώς ενιαίας ενίσχυσης με βάση την έκταση ... \n", + "2 Αγροτική Ανάπτυξη - Μέτρο 13 - 2021 - 75%: Ενι... \n", + "3 Καθεστώς ενιαίας ενίσχυσης με βάση την έκταση ... \n", + "4 Καθεστώς ενιαίας ενίσχυσης με βάση την έκταση ... \n", "\n", - " ΔΗΜΟΣ/ΕΠΑΡΧΙΑ/ΚΟΙΝΟΤΗΤΑ /\\n MUNICIPALITY/\\nDISTRICT/COMMUNITY \n", - "0 ΜΟΝΙΑΤΗΣ \n", - "1 ΜΟΝΙΑΤΗΣ \n", - "2 ΜΟΝΙΑΤΗΣ \n", - "3 ΛΑΡΝΑΚΑ \n", - "4 ΛΑΡΝΑΚΑ " + " Description of Measure \n", + "0 Payment for agricultural practices beneficial ... \n", + "1 Single area payment scheme - without financial... \n", + "2 Rural Development - Measure 13 - 2021 - 75%: P... \n", + "3 Single area payment scheme - without financial... \n", + "4 Single area payment scheme - with financial di... " ] }, - "execution_count": 16, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df = pd.read_excel('cy_%s_raw.xlsx' % YEAR, sheetname=SHEET_NAME)\n", + "df = pd.read_excel('cy_%s_raw.xlsx' % YEAR, sheet_name=SHEET_NAME, skiprows=1)\n", "original_columns = list(df.columns)\n", "df.head()" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['ONOMA ΔΙΚΑΟΥΧΟΥ /ΝΑΜΕ OF BENEFICIARY',\n", - " 'ΑΡΙΘΜΟΣ ΑΝΑΦΟΡΑΣ/\\nREFERENCE NUMBER',\n", - " 'ΕΠΙΔΟΤΗΣH ΕΓΤΕ/\\nSUBSIDY BY EAGF \\n€',\n", - " 'ΕΠΙΔΟΤΗΣΗ ΕΓΤΑΑ/\\nSUBSIDY BY EAFRD\\n €',\n", - " 'ΣΥΝΟΛΟ ΕΠΙΔΟΤΗΣΗΣ ΕΓΤΕ ΚΑΙ ΕΓΤΑΑ/\\nTOTAL SUBSIDY EAGF AND EAFRD \\n€',\n", - " 'ΕΥΡΩΠΑΪΚΟ ΓΕΩΡΓΙΚΟ ΤΑΜΕΙΟ/ ΕUROPEAN AGRICULTURAL FUND',\n", - " 'ΚΩΔΙΚΟΣ ΜΕΤΡΟΥ/\\nMEASURE CODE',\n", - " 'ΣΥΝΤΟΜΟΣ ΚΩΔΙΚΟΣ ΜΕΤΡΟΥ /\\n SHORT MEASURE CODE',\n", - " 'ΠΕΡΙΓΡΑΦΗ ΜΕΤΡΟΥ/ DESCRIPTION OF MEASURE',\n", - " 'ΤΑΧΥΔΡΟΜΙΚΟΣ ΚΩΔΙΚΑΣ\\n/POSTAL CODE',\n", - " 'ΔΗΜΟΣ/ΕΠΑΡΧΙΑ/ΚΟΙΝΟΤΗΤΑ /\\n MUNICIPALITY/\\nDISTRICT/COMMUNITY']" + "['Όνομα Δικαιούχου\\nή Αριθμός Αναφοράς Δικαιούχου\\n\\nBeneficiary Name Or Beneficiary Reference Number',\n", + " 'Κωδικός Μέτρου\\n\\nMeasure Code',\n", + " 'Ευρωπαϊκό Γεωργικό Ταμείο\\n\\nEuropean Agricultural Fund\\n\\n(ΕΓΤΕ = EAGF; \\nΕΓΤΑΑ = EAFRD)',\n", + " 'Σύντομος Κωδικός Μέτρου\\n\\nShort Measure Code',\n", + " 'Επιδότηση ΕΓΤΕ\\n(Ευρωπαϊκή Συνεισφορά)\\n\\nSubsidy by EAGF\\n(European Contribution)\\n\\n€',\n", + " 'Επιδότηση ΕΓΤΑΑ\\n(Ευρωπαϊκή Συνεισφορά)\\n\\nSubsidy by EAFRD\\n(European Contribution)\\n \\n€',\n", + " 'Επιδότηση ΕΓΤΑΑ\\n(Εθνική Συνεισφορά)\\n\\nSubsidy by EAFRD\\n(National Contribution)\\n \\n€',\n", + " 'Σύνολο Επιδότησης ΕΓΤΕ ή ΕΓΤΑΑ\\n\\nTotal subsidy EAGF or EAFRD\\n\\n€',\n", + " 'Καθαρό Σύνολο ανά Δικαιούχο (Επιδότηση ΕΓΤΕ:\\nΕυρωπαϊκή Συνεισφορά +\\nΕπιδότηση ΕΓΤΑΑ:\\nΕυρωπαϊκή + Εθνική Συνεισφορά)\\n\\nNet Amount per Beneficiary (Subsidy by EAGF:\\nEuropean Contribution +\\nSubsidy by EAFRD:\\nEuropean + National Contribution)\\n\\n€',\n", + " 'Ταχυδρομικός Κώδικας\\n\\nPostal Code',\n", + " 'Δήμος ή\\nΕπαρχία ή\\nΚοινότητα\\n \\n Municipality or\\nDistrict or\\nCommunity',\n", + " 'Περιγραφή Μέτρου',\n", + " 'Description of Measure']" ] }, - "execution_count": 19, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -334,28 +369,30 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "translations = [\n", " 'recipient_name',\n", " 'application_code',\n", + " 'programme_type',\n", + " 'scheme_code_short',\n", " 'EAGF',\n", " 'EAFRD',\n", + " 'EAFRD national',\n", " 'total',\n", - " 'scheme_name',\n", + " 'total + national',\n", + " 'recipient_postcode',\n", + " 'recipient_location',\n", " 'scheme_code',\n", - " 'scheme_code_short',\n", " 'scheme_description',\n", - " 'recipient_postcode',\n", - " 'recipient_location'\n", "]" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -381,14 +418,16 @@ " \n", " recipient_name\n", " application_code\n", + " programme_type\n", + " scheme_code_short\n", " EAGF\n", " EAFRD\n", + " EAFRD national\n", " total\n", - " scheme_name\n", - " scheme_code_short\n", - " scheme_description\n", + " total + national\n", " recipient_postcode\n", " recipient_location\n", + " scheme_description\n", " year\n", " scheme\n", " \n", @@ -396,114 +435,131 @@ " \n", " \n", " 0\n", + " 000000000182\n", + " 80205050000013\n", + " ΕΓΤΕ\n", + " II.4\n", + " 101.87\n", + " 0.0\n", + " 0.0\n", + " 101.87\n", " NaN\n", - " 51956\n", - " 209.45\n", - " NaN\n", - " 209.45\n", - " EAGF\n", - " ΙΙ.2\n", - " Single area payment scheme - without financial...\n", " 4747\n", " ΜΟΝΙΑΤΗΣ\n", - " 2018\n", - " ΙΙ.2 - Single area payment scheme - without fi...\n", + " Payment for agricultural practices beneficial ...\n", + " 2022\n", + " II.4 - Payment for agricultural practices bene...\n", " \n", " \n", " 1\n", + " 000000000182\n", + " 80205020010042\n", + " ΕΓΤΕ\n", + " II.2\n", + " 209.53\n", + " 0.0\n", + " 0.0\n", + " 209.53\n", " NaN\n", - " 51956\n", - " 103.14\n", - " NaN\n", - " 103.14\n", - " EAGF\n", - " ΙΙ.4\n", - " Payment for agricultural practices beneficial ...\n", " 4747\n", " ΜΟΝΙΑΤΗΣ\n", - " 2018\n", - " ΙΙ.4 - Payment for agricultural practices bene...\n", + " Single area payment scheme - without financial...\n", + " 2022\n", + " II.2 - Single area payment scheme - without fi...\n", " \n", " \n", " 2\n", - " NaN\n", - " 51956\n", - " NaN\n", - " 131.6\n", + " 000000000182\n", + " 80301025343100\n", + " ΕΓΤΑΑ\n", + " IV/18\n", + " 0.00\n", + " 98.7\n", + " 32.9\n", " 131.60\n", - " EAFRD\n", - " IV/A.18\n", - " RD - Measure 13\n", + " 443.0\n", " 4747\n", " ΜΟΝΙΑΤΗΣ\n", - " 2018\n", - " IV/A.18 - RD - Measure 13\n", + " Rural Development - Measure 13 - 2021 - 75%: P...\n", + " 2022\n", + " IV/18 - Rural Development - Measure 13 - 2021 ...\n", " \n", " \n", " 3\n", + " ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ\n", + " 80205020010042\n", + " ΕΓΤΕ\n", + " II.2\n", + " 2000.00\n", + " 0.0\n", + " 0.0\n", + " 2000.00\n", " NaN\n", - " 103350\n", - " 89.13\n", - " NaN\n", - " 89.13\n", - " EAGF\n", - " ΙΙ.2\n", + " 5515\n", + " ΑΥΓΟΡΟΥ\n", " Single area payment scheme - without financial...\n", - " 6017\n", - " ΛΑΡΝΑΚΑ\n", - " 2018\n", - " ΙΙ.2 - Single area payment scheme - without fi...\n", + " 2022\n", + " II.2 - Single area payment scheme - without fi...\n", " \n", " \n", " 4\n", + " ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ\n", + " 80205020010043\n", + " ΕΓΤΕ\n", + " II.2\n", + " 5229.59\n", + " 0.0\n", + " 0.0\n", + " 5229.59\n", " NaN\n", - " 103350\n", - " 43.89\n", - " NaN\n", - " 43.89\n", - " EAGF\n", - " ΙΙ.4\n", - " Payment for agricultural practices beneficial ...\n", - " 6017\n", - " ΛΑΡΝΑΚΑ\n", - " 2018\n", - " ΙΙ.4 - Payment for agricultural practices bene...\n", + " 5515\n", + " ΑΥΓΟΡΟΥ\n", + " Single area payment scheme - with financial di...\n", + " 2022\n", + " II.2 - Single area payment scheme - with finan...\n", " \n", " \n", "\n", "" ], "text/plain": [ - " recipient_name application_code EAGF EAFRD total scheme_name \\\n", - "0 NaN 51956 209.45 NaN 209.45 EAGF \n", - "1 NaN 51956 103.14 NaN 103.14 EAGF \n", - "2 NaN 51956 NaN 131.6 131.60 EAFRD \n", - "3 NaN 103350 89.13 NaN 89.13 EAGF \n", - "4 NaN 103350 43.89 NaN 43.89 EAGF \n", + " recipient_name application_code programme_type scheme_code_short \\\n", + "0 000000000182 80205050000013 ΕΓΤΕ II.4 \n", + "1 000000000182 80205020010042 ΕΓΤΕ II.2 \n", + "2 000000000182 80301025343100 ΕΓΤΑΑ IV/18 \n", + "3 ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ 80205020010042 ΕΓΤΕ II.2 \n", + "4 ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ 80205020010043 ΕΓΤΕ II.2 \n", + "\n", + " EAGF EAFRD EAFRD national total total + national \\\n", + "0 101.87 0.0 0.0 101.87 NaN \n", + "1 209.53 0.0 0.0 209.53 NaN \n", + "2 0.00 98.7 32.9 131.60 443.0 \n", + "3 2000.00 0.0 0.0 2000.00 NaN \n", + "4 5229.59 0.0 0.0 5229.59 NaN \n", "\n", - " scheme_code_short scheme_description \\\n", - "0 ΙΙ.2 Single area payment scheme - without financial... \n", - "1 ΙΙ.4 Payment for agricultural practices beneficial ... \n", - "2 IV/A.18 RD - Measure 13 \n", - "3 ΙΙ.2 Single area payment scheme - without financial... \n", - "4 ΙΙ.4 Payment for agricultural practices beneficial ... \n", + " recipient_postcode recipient_location \\\n", + "0 4747 ΜΟΝΙΑΤΗΣ \n", + "1 4747 ΜΟΝΙΑΤΗΣ \n", + "2 4747 ΜΟΝΙΑΤΗΣ \n", + "3 5515 ΑΥΓΟΡΟΥ \n", + "4 5515 ΑΥΓΟΡΟΥ \n", "\n", - " recipient_postcode recipient_location year \\\n", - "0 4747 ΜΟΝΙΑΤΗΣ 2018 \n", - "1 4747 ΜΟΝΙΑΤΗΣ 2018 \n", - "2 4747 ΜΟΝΙΑΤΗΣ 2018 \n", - "3 6017 ΛΑΡΝΑΚΑ 2018 \n", - "4 6017 ΛΑΡΝΑΚΑ 2018 \n", + " scheme_description year \\\n", + "0 Payment for agricultural practices beneficial ... 2022 \n", + "1 Single area payment scheme - without financial... 2022 \n", + "2 Rural Development - Measure 13 - 2021 - 75%: P... 2022 \n", + "3 Single area payment scheme - without financial... 2022 \n", + "4 Single area payment scheme - with financial di... 2022 \n", "\n", " scheme \n", - "0 ΙΙ.2 - Single area payment scheme - without fi... \n", - "1 ΙΙ.4 - Payment for agricultural practices bene... \n", - "2 IV/A.18 - RD - Measure 13 \n", - "3 ΙΙ.2 - Single area payment scheme - without fi... \n", - "4 ΙΙ.4 - Payment for agricultural practices bene... " + "0 II.4 - Payment for agricultural practices bene... \n", + "1 II.2 - Single area payment scheme - without fi... \n", + "2 IV/18 - Rural Development - Measure 13 - 2021 ... \n", + "3 II.2 - Single area payment scheme - without fi... \n", + "4 II.2 - Single area payment scheme - with finan... " ] }, - "execution_count": 21, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -518,7 +574,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -540,7 +596,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -549,7 +605,7 @@ "True" ] }, - "execution_count": 22, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -561,7 +617,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -586,12 +642,12 @@ " \n", " \n", " recipient_name\n", - " total\n", - " scheme_name\n", + " programme_type\n", " scheme_code_short\n", - " scheme_description\n", + " total\n", " recipient_postcode\n", " recipient_location\n", + " scheme_description\n", " year\n", " scheme\n", " country\n", @@ -603,119 +659,126 @@ " \n", " \n", " 0\n", - " NaN\n", - " 209.45\n", - " EAGF\n", - " ΙΙ.2\n", - " Single area payment scheme - without financial...\n", + " 000000000182\n", + " ΕΓΤΕ\n", + " II.4\n", + " 101.87\n", " 4747\n", " ΜΟΝΙΑΤΗΣ\n", - " 2018\n", - " ΙΙ.2 - Single area payment scheme - without fi...\n", + " Payment for agricultural practices beneficial ...\n", + " 2022\n", + " II.4 - Payment for agricultural practices bene...\n", " CY\n", " EUR\n", - " CY-51956\n", - " 209.45\n", + " CY-80205050000013\n", + " 101.87\n", " \n", " \n", " 1\n", - " NaN\n", - " 103.14\n", - " EAGF\n", - " ΙΙ.4\n", - " Payment for agricultural practices beneficial ...\n", + " 000000000182\n", + " ΕΓΤΕ\n", + " II.2\n", + " 209.53\n", " 4747\n", " ΜΟΝΙΑΤΗΣ\n", - " 2018\n", - " ΙΙ.4 - Payment for agricultural practices bene...\n", + " Single area payment scheme - without financial...\n", + " 2022\n", + " II.2 - Single area payment scheme - without fi...\n", " CY\n", " EUR\n", - " CY-51956\n", - " 103.14\n", + " CY-80205020010042\n", + " 209.53\n", " \n", " \n", " 2\n", - " NaN\n", + " 000000000182\n", + " ΕΓΤΑΑ\n", + " IV/18\n", " 131.60\n", - " EAFRD\n", - " IV/A.18\n", - " RD - Measure 13\n", " 4747\n", " ΜΟΝΙΑΤΗΣ\n", - " 2018\n", - " IV/A.18 - RD - Measure 13\n", + " Rural Development - Measure 13 - 2021 - 75%: P...\n", + " 2022\n", + " IV/18 - Rural Development - Measure 13 - 2021 ...\n", " CY\n", " EUR\n", - " CY-51956\n", - " 131.60\n", + " CY-80301025343100\n", + " 98.70\n", " \n", " \n", " 3\n", - " NaN\n", - " 89.13\n", - " EAGF\n", - " ΙΙ.2\n", + " ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ\n", + " ΕΓΤΕ\n", + " II.2\n", + " 2000.00\n", + " 5515\n", + " ΑΥΓΟΡΟΥ\n", " Single area payment scheme - without financial...\n", - " 6017\n", - " ΛΑΡΝΑΚΑ\n", - " 2018\n", - " ΙΙ.2 - Single area payment scheme - without fi...\n", + " 2022\n", + " II.2 - Single area payment scheme - without fi...\n", " CY\n", " EUR\n", - " CY-103350\n", - " 89.13\n", + " CY-80205020010042\n", + " 2000.00\n", " \n", " \n", " 4\n", - " NaN\n", - " 43.89\n", - " EAGF\n", - " ΙΙ.4\n", - " Payment for agricultural practices beneficial ...\n", - " 6017\n", - " ΛΑΡΝΑΚΑ\n", - " 2018\n", - " ΙΙ.4 - Payment for agricultural practices bene...\n", + " ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ\n", + " ΕΓΤΕ\n", + " II.2\n", + " 5229.59\n", + " 5515\n", + " ΑΥΓΟΡΟΥ\n", + " Single area payment scheme - with financial di...\n", + " 2022\n", + " II.2 - Single area payment scheme - with finan...\n", " CY\n", " EUR\n", - " CY-103350\n", - " 43.89\n", + " CY-80205020010043\n", + " 5229.59\n", " \n", " \n", "\n", "" ], "text/plain": [ - " recipient_name total scheme_name scheme_code_short \\\n", - "0 NaN 209.45 EAGF ΙΙ.2 \n", - "1 NaN 103.14 EAGF ΙΙ.4 \n", - "2 NaN 131.60 EAFRD IV/A.18 \n", - "3 NaN 89.13 EAGF ΙΙ.2 \n", - "4 NaN 43.89 EAGF ΙΙ.4 \n", + " recipient_name programme_type scheme_code_short total \\\n", + "0 000000000182 ΕΓΤΕ II.4 101.87 \n", + "1 000000000182 ΕΓΤΕ II.2 209.53 \n", + "2 000000000182 ΕΓΤΑΑ IV/18 131.60 \n", + "3 ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ ΕΓΤΕ II.2 2000.00 \n", + "4 ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ ΕΓΤΕ II.2 5229.59 \n", + "\n", + " recipient_postcode recipient_location \\\n", + "0 4747 ΜΟΝΙΑΤΗΣ \n", + "1 4747 ΜΟΝΙΑΤΗΣ \n", + "2 4747 ΜΟΝΙΑΤΗΣ \n", + "3 5515 ΑΥΓΟΡΟΥ \n", + "4 5515 ΑΥΓΟΡΟΥ \n", "\n", - " scheme_description recipient_postcode \\\n", - "0 Single area payment scheme - without financial... 4747 \n", - "1 Payment for agricultural practices beneficial ... 4747 \n", - "2 RD - Measure 13 4747 \n", - "3 Single area payment scheme - without financial... 6017 \n", - "4 Payment for agricultural practices beneficial ... 6017 \n", + " scheme_description year \\\n", + "0 Payment for agricultural practices beneficial ... 2022 \n", + "1 Single area payment scheme - without financial... 2022 \n", + "2 Rural Development - Measure 13 - 2021 - 75%: P... 2022 \n", + "3 Single area payment scheme - without financial... 2022 \n", + "4 Single area payment scheme - with financial di... 2022 \n", "\n", - " recipient_location year scheme \\\n", - "0 ΜΟΝΙΑΤΗΣ 2018 ΙΙ.2 - Single area payment scheme - without fi... \n", - "1 ΜΟΝΙΑΤΗΣ 2018 ΙΙ.4 - Payment for agricultural practices bene... \n", - "2 ΜΟΝΙΑΤΗΣ 2018 IV/A.18 - RD - Measure 13 \n", - "3 ΛΑΡΝΑΚΑ 2018 ΙΙ.2 - Single area payment scheme - without fi... \n", - "4 ΛΑΡΝΑΚΑ 2018 ΙΙ.4 - Payment for agricultural practices bene... \n", + " scheme country currency \\\n", + "0 II.4 - Payment for agricultural practices bene... CY EUR \n", + "1 II.2 - Single area payment scheme - without fi... CY EUR \n", + "2 IV/18 - Rural Development - Measure 13 - 2021 ... CY EUR \n", + "3 II.2 - Single area payment scheme - without fi... CY EUR \n", + "4 II.2 - Single area payment scheme - with finan... CY EUR \n", "\n", - " country currency recipient_id amount \n", - "0 CY EUR CY-51956 209.45 \n", - "1 CY EUR CY-51956 103.14 \n", - "2 CY EUR CY-51956 131.60 \n", - "3 CY EUR CY-103350 89.13 \n", - "4 CY EUR CY-103350 43.89 " + " recipient_id amount \n", + "0 CY-80205050000013 101.87 \n", + "1 CY-80205020010042 209.53 \n", + "2 CY-80301025343100 98.70 \n", + "3 CY-80205020010042 2000.00 \n", + "4 CY-80205020010043 5229.59 " ] }, - "execution_count": 23, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -731,13 +794,13 @@ " '' if pd.isnull(x['recipient_name']) else x['recipient_name'])), 1)\n", "\n", "df['amount'] = df.apply(lambda x: x[['EAGF', 'EAFRD']].sum(), 1)\n", - "df = df.drop(['application_code', 'EAFRD', 'EAGF'], 1)\n", + "df = df.drop(['application_code', 'EAFRD', 'EAGF', 'EAFRD national', 'total + national', ], axis=1)\n", "df.head()" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -747,7 +810,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -761,9 +824,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.9.18" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/cy/cyprus-scraper.ipynb b/cy/cyprus-scraper_old.ipynb similarity index 74% rename from cy/cyprus-scraper.ipynb rename to cy/cyprus-scraper_old.ipynb index d133115..b8f8250 100644 --- a/cy/cyprus-scraper.ipynb +++ b/cy/cyprus-scraper_old.ipynb @@ -13,9 +13,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2023-11-03 07:39:21-- http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/AD063B69CE4D0D06C2258131002AA09F/$file/FINAL%20%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202016-%2031.5.17.xlsx\n", + "Auflösen des Hostnamens www.capo.gov.cy (www.capo.gov.cy) … 212.31.118.152\n", + "Verbindungsaufbau zu www.capo.gov.cy (www.capo.gov.cy)|212.31.118.152|:80 … verbunden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 302 Found\n", + "Platz: https://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/AD063B69CE4D0D06C2258131002AA09F/$file/FINAL%20%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202016-%2031.5.17.xlsx [folgend]\n", + "--2023-11-03 07:39:21-- https://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/AD063B69CE4D0D06C2258131002AA09F/$file/FINAL%20%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202016-%2031.5.17.xlsx\n", + "Verbindungsaufbau zu www.capo.gov.cy (www.capo.gov.cy)|212.31.118.152|:443 … verbunden.\n", + "FEHLER: Das Zertifikat von www.capo.gov.cy kann nicht geprüft werden, ausgestellt von ‘CN=GeoTrust TLS RSA CA G1,OU=www.digicert.com,O=DigiCert Inc,C=US’:.\n", + " Die Autorität des Zertifikatausstellers kann lokal nicht geprüft werden.\n", + "Verwenden Sie »--no-check-certificate«, um zu dem Server www.capo.gov.cy eine nicht gesicherte Verbindung aufzubauen.\n" + ] + } + ], "source": [ "!wget -nc -O cy_2016_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/AD063B69CE4D0D06C2258131002AA09F/$file/FINAL%20%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202016-%2031.5.17.xlsx'" ] @@ -174,7 +191,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -188,9 +205,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.9.18" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 } From e7017d3066af5d0a24bafff6ded1bbc6f83d5222 Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Fri, 22 Nov 2024 18:00:38 +0100 Subject: [PATCH 21/38] Improve folder structure --- {at => countries/at}/README.md | 0 {be => countries/be}/README.md | 0 {be => countries/be}/be_scraper.ipynb | 0 {be => countries/be}/be_scraper_2017.ipynb | 0 {bg => countries/bg}/README.md | 0 {bg => countries/bg}/bg_scraper.ipynb | 0 {cy => countries/cy}/README.md | 0 {cy => countries/cy}/cy_scraper.ipynb | 0 {cy => countries/cy}/cyprus-scraper_old.ipynb | 0 {cz => countries/cz}/README.md | 0 {de => countries/de}/README.md | 0 {de => countries/de}/convert.py | 0 {de => countries/de}/de_scraper.py | 0 {dk => countries/dk}/README.md | 0 {dk => countries/dk}/dk_scraper.ipynb | 0 {ee => countries/ee}/README.md | 0 {ee => countries/ee}/estonia-scraper.ipynb | 0 {es => countries/es}/.gitignore | 0 {es => countries/es}/README.md | 0 {es => countries/es}/scraper_es.ipynb | 0 {fi => countries/fi}/README.md | 0 {fr => countries/fr}/README.md | 0 {fr => countries/fr}/fr_scraper.ipynb | 0 {gb => countries/gb}/README.md | 0 .../gb}/greatbritain-scraper.ipynb | 0 {gr => countries/gr}/README.md | 0 {gr => countries/gr}/convert_gr.ipynb | 0 {gr => countries/gr}/scraper.py | 0 {hr => countries/hr}/README.md | 0 {hu => countries/hu}/README.md | 0 {hu => countries/hu}/hu_converter.ipynb | 0 {hu => countries/hu}/hu_converter_2023.ipynb | 0 {ie => countries/ie}/README.md | 0 {ie => countries/ie}/convert.py | 0 {ie => countries/ie}/ie_scraper.ipynb | 0 {ie => countries/ie}/ie_scraper.py | 0 {it => countries/it}/README.md | 0 {it => countries/it}/captcha/__init__.py | 0 .../it}/captcha/agea_captcha/__init__.py | 0 .../it}/captcha/agea_captcha/captcha.py | 0 .../it}/captcha/captcha_trainer.ipynb | 0 .../it}/captcha/solve_captchas.py | 0 {it => countries/it}/it_converter.ipynb | 0 {it => countries/it}/it_scraper.ipynb | 0 {lt => countries/lt}/README.md | 0 {lt => countries/lt}/lt_scraper.ipynb | 0 {lt => countries/lt}/lt_scraper.py | 0 {lt => countries/lt}/scraper_lt.ipynb | 0 {lu => countries/lu}/README.md | 0 {lu => countries/lu}/lu_scraper.ipynb | 0 {lu => countries/lu}/lu_scraper.py | 0 {lv => countries/lv}/README.md | 0 {lv => countries/lv}/lv_scraper.ipynb | 0 {mt => countries/mt}/README.md | 0 {mt => countries/mt}/scraper_mt-bad.ipynb | 0 {nl => countries/nl}/README.md | 0 {nl => countries/nl}/nl_scraper.py | 0 {pl => countries/pl}/README.md | 0 countries/pl/pl_scraper.ipynb | 637 +++++++++++++++++ .../pl/pl_scraper_2.ipynb | 6 +- countries/pl/pl_scraper_3.ipynb | 675 ++++++++++++++++++ {pt => countries/pt}/README.md | 0 {pt => countries/pt}/pt_scraper.ipynb | 0 {ro => countries/ro}/README.md | 0 {ro => countries/ro}/scraper.py | 0 {se => countries/se}/README.md | 0 {se => countries/se}/combine_se.ipynb | 0 {se => countries/se}/scraper_se.ipynb | 0 {si => countries/si}/README.md | 0 {sk => countries/sk}/README.md | 0 70 files changed, 1315 insertions(+), 3 deletions(-) rename {at => countries/at}/README.md (100%) rename {be => countries/be}/README.md (100%) rename {be => countries/be}/be_scraper.ipynb (100%) rename {be => countries/be}/be_scraper_2017.ipynb (100%) rename {bg => countries/bg}/README.md (100%) rename {bg => countries/bg}/bg_scraper.ipynb (100%) rename {cy => countries/cy}/README.md (100%) rename {cy => countries/cy}/cy_scraper.ipynb (100%) rename {cy => countries/cy}/cyprus-scraper_old.ipynb (100%) rename {cz => countries/cz}/README.md (100%) rename {de => countries/de}/README.md (100%) rename {de => countries/de}/convert.py (100%) rename {de => countries/de}/de_scraper.py (100%) rename {dk => countries/dk}/README.md (100%) rename {dk => countries/dk}/dk_scraper.ipynb (100%) rename {ee => countries/ee}/README.md (100%) rename {ee => countries/ee}/estonia-scraper.ipynb (100%) rename {es => countries/es}/.gitignore (100%) rename {es => countries/es}/README.md (100%) rename {es => countries/es}/scraper_es.ipynb (100%) rename {fi => countries/fi}/README.md (100%) rename {fr => countries/fr}/README.md (100%) rename {fr => countries/fr}/fr_scraper.ipynb (100%) rename {gb => countries/gb}/README.md (100%) rename {gb => countries/gb}/greatbritain-scraper.ipynb (100%) rename {gr => countries/gr}/README.md (100%) rename {gr => countries/gr}/convert_gr.ipynb (100%) rename {gr => countries/gr}/scraper.py (100%) rename {hr => countries/hr}/README.md (100%) rename {hu => countries/hu}/README.md (100%) rename {hu => countries/hu}/hu_converter.ipynb (100%) rename {hu => countries/hu}/hu_converter_2023.ipynb (100%) rename {ie => countries/ie}/README.md (100%) rename {ie => countries/ie}/convert.py (100%) rename {ie => countries/ie}/ie_scraper.ipynb (100%) rename {ie => countries/ie}/ie_scraper.py (100%) rename {it => countries/it}/README.md (100%) rename {it => countries/it}/captcha/__init__.py (100%) rename {it => countries/it}/captcha/agea_captcha/__init__.py (100%) rename {it => countries/it}/captcha/agea_captcha/captcha.py (100%) rename {it => countries/it}/captcha/captcha_trainer.ipynb (100%) rename {it => countries/it}/captcha/solve_captchas.py (100%) rename {it => countries/it}/it_converter.ipynb (100%) rename {it => countries/it}/it_scraper.ipynb (100%) rename {lt => countries/lt}/README.md (100%) rename {lt => countries/lt}/lt_scraper.ipynb (100%) rename {lt => countries/lt}/lt_scraper.py (100%) rename {lt => countries/lt}/scraper_lt.ipynb (100%) rename {lu => countries/lu}/README.md (100%) rename {lu => countries/lu}/lu_scraper.ipynb (100%) rename {lu => countries/lu}/lu_scraper.py (100%) rename {lv => countries/lv}/README.md (100%) rename {lv => countries/lv}/lv_scraper.ipynb (100%) rename {mt => countries/mt}/README.md (100%) rename {mt => countries/mt}/scraper_mt-bad.ipynb (100%) rename {nl => countries/nl}/README.md (100%) rename {nl => countries/nl}/nl_scraper.py (100%) rename {pl => countries/pl}/README.md (100%) create mode 100644 countries/pl/pl_scraper.ipynb rename pl/pl_scraper.ipynb => countries/pl/pl_scraper_2.ipynb (99%) create mode 100644 countries/pl/pl_scraper_3.ipynb rename {pt => countries/pt}/README.md (100%) rename {pt => countries/pt}/pt_scraper.ipynb (100%) rename {ro => countries/ro}/README.md (100%) rename {ro => countries/ro}/scraper.py (100%) rename {se => countries/se}/README.md (100%) rename {se => countries/se}/combine_se.ipynb (100%) rename {se => countries/se}/scraper_se.ipynb (100%) rename {si => countries/si}/README.md (100%) rename {sk => countries/sk}/README.md (100%) diff --git a/at/README.md b/countries/at/README.md similarity index 100% rename from at/README.md rename to countries/at/README.md diff --git a/be/README.md b/countries/be/README.md similarity index 100% rename from be/README.md rename to countries/be/README.md diff --git a/be/be_scraper.ipynb b/countries/be/be_scraper.ipynb similarity index 100% rename from be/be_scraper.ipynb rename to countries/be/be_scraper.ipynb diff --git a/be/be_scraper_2017.ipynb b/countries/be/be_scraper_2017.ipynb similarity index 100% rename from be/be_scraper_2017.ipynb rename to countries/be/be_scraper_2017.ipynb diff --git a/bg/README.md b/countries/bg/README.md similarity index 100% rename from bg/README.md rename to countries/bg/README.md diff --git a/bg/bg_scraper.ipynb b/countries/bg/bg_scraper.ipynb similarity index 100% rename from bg/bg_scraper.ipynb rename to countries/bg/bg_scraper.ipynb diff --git a/cy/README.md b/countries/cy/README.md similarity index 100% rename from cy/README.md rename to countries/cy/README.md diff --git a/cy/cy_scraper.ipynb b/countries/cy/cy_scraper.ipynb similarity index 100% rename from cy/cy_scraper.ipynb rename to countries/cy/cy_scraper.ipynb diff --git a/cy/cyprus-scraper_old.ipynb b/countries/cy/cyprus-scraper_old.ipynb similarity index 100% rename from cy/cyprus-scraper_old.ipynb rename to countries/cy/cyprus-scraper_old.ipynb diff --git a/cz/README.md b/countries/cz/README.md similarity index 100% rename from cz/README.md rename to countries/cz/README.md diff --git a/de/README.md b/countries/de/README.md similarity index 100% rename from de/README.md rename to countries/de/README.md diff --git a/de/convert.py b/countries/de/convert.py similarity index 100% rename from de/convert.py rename to countries/de/convert.py diff --git a/de/de_scraper.py b/countries/de/de_scraper.py similarity index 100% rename from de/de_scraper.py rename to countries/de/de_scraper.py diff --git a/dk/README.md b/countries/dk/README.md similarity index 100% rename from dk/README.md rename to countries/dk/README.md diff --git a/dk/dk_scraper.ipynb b/countries/dk/dk_scraper.ipynb similarity index 100% rename from dk/dk_scraper.ipynb rename to countries/dk/dk_scraper.ipynb diff --git a/ee/README.md b/countries/ee/README.md similarity index 100% rename from ee/README.md rename to countries/ee/README.md diff --git a/ee/estonia-scraper.ipynb b/countries/ee/estonia-scraper.ipynb similarity index 100% rename from ee/estonia-scraper.ipynb rename to countries/ee/estonia-scraper.ipynb diff --git a/es/.gitignore b/countries/es/.gitignore similarity index 100% rename from es/.gitignore rename to countries/es/.gitignore diff --git a/es/README.md b/countries/es/README.md similarity index 100% rename from es/README.md rename to countries/es/README.md diff --git a/es/scraper_es.ipynb b/countries/es/scraper_es.ipynb similarity index 100% rename from es/scraper_es.ipynb rename to countries/es/scraper_es.ipynb diff --git a/fi/README.md b/countries/fi/README.md similarity index 100% rename from fi/README.md rename to countries/fi/README.md diff --git a/fr/README.md b/countries/fr/README.md similarity index 100% rename from fr/README.md rename to countries/fr/README.md diff --git a/fr/fr_scraper.ipynb b/countries/fr/fr_scraper.ipynb similarity index 100% rename from fr/fr_scraper.ipynb rename to countries/fr/fr_scraper.ipynb diff --git a/gb/README.md b/countries/gb/README.md similarity index 100% rename from gb/README.md rename to countries/gb/README.md diff --git a/gb/greatbritain-scraper.ipynb b/countries/gb/greatbritain-scraper.ipynb similarity index 100% rename from gb/greatbritain-scraper.ipynb rename to countries/gb/greatbritain-scraper.ipynb diff --git a/gr/README.md b/countries/gr/README.md similarity index 100% rename from gr/README.md rename to countries/gr/README.md diff --git a/gr/convert_gr.ipynb b/countries/gr/convert_gr.ipynb similarity index 100% rename from gr/convert_gr.ipynb rename to countries/gr/convert_gr.ipynb diff --git a/gr/scraper.py b/countries/gr/scraper.py similarity index 100% rename from gr/scraper.py rename to countries/gr/scraper.py diff --git a/hr/README.md b/countries/hr/README.md similarity index 100% rename from hr/README.md rename to countries/hr/README.md diff --git a/hu/README.md b/countries/hu/README.md similarity index 100% rename from hu/README.md rename to countries/hu/README.md diff --git a/hu/hu_converter.ipynb b/countries/hu/hu_converter.ipynb similarity index 100% rename from hu/hu_converter.ipynb rename to countries/hu/hu_converter.ipynb diff --git a/hu/hu_converter_2023.ipynb b/countries/hu/hu_converter_2023.ipynb similarity index 100% rename from hu/hu_converter_2023.ipynb rename to countries/hu/hu_converter_2023.ipynb diff --git a/ie/README.md b/countries/ie/README.md similarity index 100% rename from ie/README.md rename to countries/ie/README.md diff --git a/ie/convert.py b/countries/ie/convert.py similarity index 100% rename from ie/convert.py rename to countries/ie/convert.py diff --git a/ie/ie_scraper.ipynb b/countries/ie/ie_scraper.ipynb similarity index 100% rename from ie/ie_scraper.ipynb rename to countries/ie/ie_scraper.ipynb diff --git a/ie/ie_scraper.py b/countries/ie/ie_scraper.py similarity index 100% rename from ie/ie_scraper.py rename to countries/ie/ie_scraper.py diff --git a/it/README.md b/countries/it/README.md similarity index 100% rename from it/README.md rename to countries/it/README.md diff --git a/it/captcha/__init__.py b/countries/it/captcha/__init__.py similarity index 100% rename from it/captcha/__init__.py rename to countries/it/captcha/__init__.py diff --git a/it/captcha/agea_captcha/__init__.py b/countries/it/captcha/agea_captcha/__init__.py similarity index 100% rename from it/captcha/agea_captcha/__init__.py rename to countries/it/captcha/agea_captcha/__init__.py diff --git a/it/captcha/agea_captcha/captcha.py b/countries/it/captcha/agea_captcha/captcha.py similarity index 100% rename from it/captcha/agea_captcha/captcha.py rename to countries/it/captcha/agea_captcha/captcha.py diff --git a/it/captcha/captcha_trainer.ipynb b/countries/it/captcha/captcha_trainer.ipynb similarity index 100% rename from it/captcha/captcha_trainer.ipynb rename to countries/it/captcha/captcha_trainer.ipynb diff --git a/it/captcha/solve_captchas.py b/countries/it/captcha/solve_captchas.py similarity index 100% rename from it/captcha/solve_captchas.py rename to countries/it/captcha/solve_captchas.py diff --git a/it/it_converter.ipynb b/countries/it/it_converter.ipynb similarity index 100% rename from it/it_converter.ipynb rename to countries/it/it_converter.ipynb diff --git a/it/it_scraper.ipynb b/countries/it/it_scraper.ipynb similarity index 100% rename from it/it_scraper.ipynb rename to countries/it/it_scraper.ipynb diff --git a/lt/README.md b/countries/lt/README.md similarity index 100% rename from lt/README.md rename to countries/lt/README.md diff --git a/lt/lt_scraper.ipynb b/countries/lt/lt_scraper.ipynb similarity index 100% rename from lt/lt_scraper.ipynb rename to countries/lt/lt_scraper.ipynb diff --git a/lt/lt_scraper.py b/countries/lt/lt_scraper.py similarity index 100% rename from lt/lt_scraper.py rename to countries/lt/lt_scraper.py diff --git a/lt/scraper_lt.ipynb b/countries/lt/scraper_lt.ipynb similarity index 100% rename from lt/scraper_lt.ipynb rename to countries/lt/scraper_lt.ipynb diff --git a/lu/README.md b/countries/lu/README.md similarity index 100% rename from lu/README.md rename to countries/lu/README.md diff --git a/lu/lu_scraper.ipynb b/countries/lu/lu_scraper.ipynb similarity index 100% rename from lu/lu_scraper.ipynb rename to countries/lu/lu_scraper.ipynb diff --git a/lu/lu_scraper.py b/countries/lu/lu_scraper.py similarity index 100% rename from lu/lu_scraper.py rename to countries/lu/lu_scraper.py diff --git a/lv/README.md b/countries/lv/README.md similarity index 100% rename from lv/README.md rename to countries/lv/README.md diff --git a/lv/lv_scraper.ipynb b/countries/lv/lv_scraper.ipynb similarity index 100% rename from lv/lv_scraper.ipynb rename to countries/lv/lv_scraper.ipynb diff --git a/mt/README.md b/countries/mt/README.md similarity index 100% rename from mt/README.md rename to countries/mt/README.md diff --git a/mt/scraper_mt-bad.ipynb b/countries/mt/scraper_mt-bad.ipynb similarity index 100% rename from mt/scraper_mt-bad.ipynb rename to countries/mt/scraper_mt-bad.ipynb diff --git a/nl/README.md b/countries/nl/README.md similarity index 100% rename from nl/README.md rename to countries/nl/README.md diff --git a/nl/nl_scraper.py b/countries/nl/nl_scraper.py similarity index 100% rename from nl/nl_scraper.py rename to countries/nl/nl_scraper.py diff --git a/pl/README.md b/countries/pl/README.md similarity index 100% rename from pl/README.md rename to countries/pl/README.md diff --git a/countries/pl/pl_scraper.ipynb b/countries/pl/pl_scraper.ipynb new file mode 100644 index 0000000..6c3cc84 --- /dev/null +++ b/countries/pl/pl_scraper.ipynb @@ -0,0 +1,637 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'tqdm.notebook.tqdm'; 'tqdm.notebook' is not a package", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[22], line 8\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[0;32m----> 8\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtqdm\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mnotebook\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtqdm\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m tqdm\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mslugify\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m slugify\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'tqdm.notebook.tqdm'; 'tqdm.notebook' is not a package" + ] + } + ], + "source": [ + "import requests\n", + "import os\n", + "import gzip\n", + "import glob\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "from tqdm.notebook import tqdm\n", + "\n", + "from slugify import slugify" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "314" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "YEAR = 2023\n", + "START_AMOUNT = 420000 # PLN, roughly 100k EUR\n", + "MAX_DIV = 300\n", + "# Both ranges are non-inclusive!\n", + "RANGES = [START_AMOUNT // i for i in range(1, MAX_DIV)] + [i for i in range(START_AMOUNT // MAX_DIV, 0, -100)] + [0]\n", + "len(RANGES)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# These break the export, probably because of non-windows-1250 characters\n", + "# The downloader queries around these sums and so these recipients are missing from the years\n", + "SPECIALS = {\n", + " 2015: [\n", + " 21016.97, # http://beneficjenciwpr.minrol.gov.pl/outrecords/view/12485559\n", + " 51755.63, # http://beneficjenciwpr.minrol.gov.pl/outrecords/view/13334673\n", + " ],\n", + " 2016: [\n", + " 18805.66, # http://beneficjenciwpr.minrol.gov.pl/outrecords/view/16350294\n", + " ],\n", + " 2017: [\n", + " \n", + " ]\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_URL = 'http://beneficjenciwpr.minrol.gov.pl/search/export/csv/'" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "params = {'year': YEAR, 'totalfrom': 420000, 'totalto': None}\n", + "\n", + "def get_url(params):\n", + " return BASE_URL + '/'.join('{k}:{v}'.format(k=k, v=str(v).replace(\".\", \",\"))\n", + " for k, v in params.items() if v is not None) + '/sort:total/direction:asc'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def download(year, amount, total_to):\n", + " url = get_url({'year': year, 'totalfrom': amount, 'totalto': total_to})\n", + " filename = 'data/{year}_{amount}_{total_to}.csv.gz'.format(year=year, amount=amount, total_to=total_to)\n", + " if os.path.exists(filename):\n", + " return\n", + " print(filename, url)\n", + " response = requests.get(url, stream=True)\n", + " with gzip.open(filename, 'wb') as f:\n", + " for chunk in response.iter_content(chunk_size=1024): \n", + " if chunk:\n", + " f.write(chunk)\n", + "\n", + " \n", + "def start(year):\n", + " specials = SPECIALS.get(year, [])\n", + " total_to = None\n", + " for amount in RANGES:\n", + " print(amount, total_to)\n", + " specs = []\n", + " if total_to is not None:\n", + " specs = [s for s in specials if amount < s < total_to]\n", + " if specs:\n", + " download(year, amount, specs[0])\n", + " download(year, specs[0], total_to)\n", + " else:\n", + " download(year, amount, total_to)\n", + " total_to = amount+0.001" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "data/2023_0_1000.csv.gz http://beneficjenciwpr.minrol.gov.pl/search/export/csv/year:2023/totalfrom:0/totalto:1000/sort:total/direction:asc\n" + ] + } + ], + "source": [ + "download(2023, 0, 1000)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "def get_year(year):\n", + " for filename in (glob.glob('data/{}_*.csv.gz'.format(year))):\n", + " print(filename)\n", + " yield pd.read_csv(filename, compression='gzip', encoding='windows-1250', sep=';')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# with gzip.open('data/2016_11666_12000.001.csv.gz') as f:\n", + "# print(f.read()[:10400].decode('windows-1250'))" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "def apply_fixes(df):\n", + " df = df.rename(columns={\n", + " 'Imię': 'recipient_firstname',\n", + " 'Nazwisko': 'recipient_lastname',\n", + " 'Nazwa': 'recipient_name',\n", + " 'Gmina': 'recipient_location',\n", + " 'Kod pocztowy': 'recipient_postcode',\n", + " 'Rok': 'year'\n", + " })\n", + " df = df.drop(columns=['Suma'])\n", + " df['recipient_firstname'] = df['recipient_firstname'].fillna('').apply(str)\n", + " df['recipient_lastname'] = df['recipient_lastname'].fillna('').apply(str)\n", + " df['recipient_name'] = df['recipient_name'].where(df['recipient_name'].notnull(),\n", + " df['recipient_firstname'] + ' ' + df['recipient_lastname'])\n", + "\n", + " anonymous = 'Małe gospodarstwo'\n", + " df['recipient_name'] = df['recipient_name'].str.replace(anonymous, '').str.strip()\n", + " df = df.drop(columns=['recipient_firstname', 'recipient_lastname'])\n", + " df['recipient_id'] = df.apply(lambda x: '%s-%s-%s' % (slugify(x['recipient_name']), x['recipient_postcode'], x['year']), 1)\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "get_year(2023)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "data/2023_0_1000.csv.gz\n" + ] + }, + { + "ename": "ParserError", + "evalue": "Error tokenizing data. C error: Expected 1 fields in line 7, saw 2\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mParserError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[38], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconcat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mget_year\u001b[49m\u001b[43m(\u001b[49m\u001b[43mYEAR\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m df \u001b[38;5;241m=\u001b[39m apply_fixes(df)\n\u001b[1;32m 3\u001b[0m df\u001b[38;5;241m.\u001b[39mhead()\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/core/reshape/concat.py:382\u001b[0m, in \u001b[0;36mconcat\u001b[0;34m(objs, axis, join, ignore_index, keys, levels, names, verify_integrity, sort, copy)\u001b[0m\n\u001b[1;32m 379\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m copy \u001b[38;5;129;01mand\u001b[39;00m using_copy_on_write():\n\u001b[1;32m 380\u001b[0m copy \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m--> 382\u001b[0m op \u001b[38;5;241m=\u001b[39m \u001b[43m_Concatenator\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 383\u001b[0m \u001b[43m \u001b[49m\u001b[43mobjs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 384\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 385\u001b[0m \u001b[43m \u001b[49m\u001b[43mignore_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mignore_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 386\u001b[0m \u001b[43m \u001b[49m\u001b[43mjoin\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 387\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkeys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 388\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevels\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevels\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 389\u001b[0m \u001b[43m \u001b[49m\u001b[43mnames\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnames\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 390\u001b[0m \u001b[43m \u001b[49m\u001b[43mverify_integrity\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mverify_integrity\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 391\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 392\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 393\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 395\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m op\u001b[38;5;241m.\u001b[39mget_result()\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/core/reshape/concat.py:445\u001b[0m, in \u001b[0;36m_Concatenator.__init__\u001b[0;34m(self, objs, axis, join, keys, levels, names, ignore_index, verify_integrity, copy, sort)\u001b[0m\n\u001b[1;32m 442\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mverify_integrity \u001b[38;5;241m=\u001b[39m verify_integrity\n\u001b[1;32m 443\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcopy \u001b[38;5;241m=\u001b[39m copy\n\u001b[0;32m--> 445\u001b[0m objs, keys \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_clean_keys_and_objs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobjs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 447\u001b[0m \u001b[38;5;66;03m# figure out what our result ndim is going to be\u001b[39;00m\n\u001b[1;32m 448\u001b[0m ndims \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_ndims(objs)\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/core/reshape/concat.py:504\u001b[0m, in \u001b[0;36m_Concatenator._clean_keys_and_objs\u001b[0;34m(self, objs, keys)\u001b[0m\n\u001b[1;32m 502\u001b[0m objs_list \u001b[38;5;241m=\u001b[39m [objs[k] \u001b[38;5;28;01mfor\u001b[39;00m k \u001b[38;5;129;01min\u001b[39;00m keys]\n\u001b[1;32m 503\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 504\u001b[0m objs_list \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mobjs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 506\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(objs_list) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m 507\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNo objects to concatenate\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "Cell \u001b[0;32mIn[32], line 4\u001b[0m, in \u001b[0;36mget_year\u001b[0;34m(year)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m filename \u001b[38;5;129;01min\u001b[39;00m (glob\u001b[38;5;241m.\u001b[39mglob(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdata/\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m_*.csv.gz\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mformat(year))):\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28mprint\u001b[39m(filename)\n\u001b[0;32m----> 4\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_csv\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilename\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcompression\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mgzip\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mwindows-1250\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msep\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m;\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/io/parsers/readers.py:1026\u001b[0m, in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[1;32m 1013\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[1;32m 1014\u001b[0m dialect,\n\u001b[1;32m 1015\u001b[0m delimiter,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1022\u001b[0m dtype_backend\u001b[38;5;241m=\u001b[39mdtype_backend,\n\u001b[1;32m 1023\u001b[0m )\n\u001b[1;32m 1024\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[0;32m-> 1026\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_read\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/io/parsers/readers.py:626\u001b[0m, in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 623\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parser\n\u001b[1;32m 625\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m parser:\n\u001b[0;32m--> 626\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mparser\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnrows\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/io/parsers/readers.py:1923\u001b[0m, in \u001b[0;36mTextFileReader.read\u001b[0;34m(self, nrows)\u001b[0m\n\u001b[1;32m 1916\u001b[0m nrows \u001b[38;5;241m=\u001b[39m validate_integer(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnrows\u001b[39m\u001b[38;5;124m\"\u001b[39m, nrows)\n\u001b[1;32m 1917\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1918\u001b[0m \u001b[38;5;66;03m# error: \"ParserBase\" has no attribute \"read\"\u001b[39;00m\n\u001b[1;32m 1919\u001b[0m (\n\u001b[1;32m 1920\u001b[0m index,\n\u001b[1;32m 1921\u001b[0m columns,\n\u001b[1;32m 1922\u001b[0m col_dict,\n\u001b[0;32m-> 1923\u001b[0m ) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[attr-defined]\u001b[39;49;00m\n\u001b[1;32m 1924\u001b[0m \u001b[43m \u001b[49m\u001b[43mnrows\u001b[49m\n\u001b[1;32m 1925\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1926\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[1;32m 1927\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclose()\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/io/parsers/c_parser_wrapper.py:234\u001b[0m, in \u001b[0;36mCParserWrapper.read\u001b[0;34m(self, nrows)\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 233\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlow_memory:\n\u001b[0;32m--> 234\u001b[0m chunks \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_reader\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_low_memory\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnrows\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 235\u001b[0m \u001b[38;5;66;03m# destructive to chunks\u001b[39;00m\n\u001b[1;32m 236\u001b[0m data \u001b[38;5;241m=\u001b[39m _concatenate_chunks(chunks)\n", + "File \u001b[0;32mparsers.pyx:838\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader.read_low_memory\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mparsers.pyx:905\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader._read_rows\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mparsers.pyx:874\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader._tokenize_rows\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mparsers.pyx:891\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader._check_tokenize_status\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mparsers.pyx:2061\u001b[0m, in \u001b[0;36mpandas._libs.parsers.raise_parser_error\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mParserError\u001b[0m: Error tokenizing data. C error: Expected 1 fields in line 7, saw 2\n" + ] + } + ], + "source": [ + "df = pd.concat(get_year(YEAR))\n", + "df = apply_fixes(df)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'df' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[39], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28mlen\u001b[39m(\u001b[43mdf\u001b[49m)\n", + "\u001b[0;31mNameError\u001b[0m: name 'df' is not defined" + ] + } + ], + "source": [ + "len(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "cols = 'recipient_name|recipient_location|recipient_id|recipient_postcode|year'.split('|')\n", + "scheme_cols = list(set(df.columns) - set(cols))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "102" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(scheme_cols)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# df['Suma'] = pd.to_numeric(df['Suma'].str.replace(',', '.'))\n", + "for c in scheme_cols:\n", + " df[c] = pd.to_numeric(df[c].str.replace(',', '.'))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# mismatch = np.isclose(df[scheme_cols].sum(1), df['Suma'] , atol=1)\n", + "# len(df) - mismatch.sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recipient_namerecipient_locationrecipient_idrecipient_postcodeyearschemeamount
0KOŁO ŁOWIECKIE PUSZCZA W BIAŁOWIEŻYBIAŁOWIEŻAkolo-lowieckie-puszcza-w-bialowiezy-17-230-201717-2302017III.4 Program dla sektora owocow i warzyw0.0
1\"PRZEDSIĘBIORSTWO PRODUKCYJNO-HANDLOWO-USŁUGOW...BUKprzedsiebiorstwo-produkcyjno-handlowo-uslugowe...64-3202017III.4 Program dla sektora owocow i warzyw0.0
2ROBERT NOWOROLNIK - GOSPODARSTWO ROLNEJODŁOWNIKrobert-noworolnik-gospodarstwo-rolne-34-620-201734-6202017III.4 Program dla sektora owocow i warzyw0.0
3JUSTYNA ROZMIAREK GOSPODARSTWO ROLNEKÓRNIKjustyna-rozmiarek-gospodarstwo-rolne-62-035-201762-0352017III.4 Program dla sektora owocow i warzyw0.0
4ROLNICZO WYTWÓRCZY KOMBINAT SPÓŁDZIELCZY IM, A...LEŻAJSKrolniczo-wytworczy-kombinat-spoldzielczy-im-an...37-3052017III.4 Program dla sektora owocow i warzyw0.0
\n", + "
" + ], + "text/plain": [ + " recipient_name recipient_location \\\n", + "0 KOŁO ŁOWIECKIE PUSZCZA W BIAŁOWIEŻY BIAŁOWIEŻA \n", + "1 \"PRZEDSIĘBIORSTWO PRODUKCYJNO-HANDLOWO-USŁUGOW... BUK \n", + "2 ROBERT NOWOROLNIK - GOSPODARSTWO ROLNE JODŁOWNIK \n", + "3 JUSTYNA ROZMIAREK GOSPODARSTWO ROLNE KÓRNIK \n", + "4 ROLNICZO WYTWÓRCZY KOMBINAT SPÓŁDZIELCZY IM, A... LEŻAJSK \n", + "\n", + " recipient_id recipient_postcode year \\\n", + "0 kolo-lowieckie-puszcza-w-bialowiezy-17-230-2017 17-230 2017 \n", + "1 przedsiebiorstwo-produkcyjno-handlowo-uslugowe... 64-320 2017 \n", + "2 robert-noworolnik-gospodarstwo-rolne-34-620-2017 34-620 2017 \n", + "3 justyna-rozmiarek-gospodarstwo-rolne-62-035-2017 62-035 2017 \n", + "4 rolniczo-wytworczy-kombinat-spoldzielczy-im-an... 37-305 2017 \n", + "\n", + " scheme amount \n", + "0 III.4 Program dla sektora owocow i warzyw 0.0 \n", + "1 III.4 Program dla sektora owocow i warzyw 0.0 \n", + "2 III.4 Program dla sektora owocow i warzyw 0.0 \n", + "3 III.4 Program dla sektora owocow i warzyw 0.0 \n", + "4 III.4 Program dla sektora owocow i warzyw 0.0 " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final = pd.melt(df, id_vars=cols, var_name='scheme', value_name='amount', value_vars=scheme_cols)\n", + "df_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recipient_namerecipient_locationrecipient_idrecipient_postcodeyearschemeamountcountrycurrency
48336PRZEDSZKOLE NR 1 W NOWEJ DĘBIENOWA DĘBAprzedszkole-nr-1-w-nowej-debie-39-460-201739-4602017III.4 Program dla sektora owocow i warzyw1893.11PLPLN
50864PRZEDSZKOLE MIEJSKIE Z ODDZIAŁEM SPECJALNYM I ...MIŃSK MAZOWIECKIprzedszkole-miejskie-z-oddzialem-specjalnym-i-...05-3002017III.4 Program dla sektora owocow i warzyw1405.63PLPLN
52683PRZEDSZKOLE NR 3PŁOŃSKprzedszkole-nr-3-09-100-201709-1002017III.4 Program dla sektora owocow i warzyw3675.68PLPLN
81305\"PRZEDSZKOLE NR 9 IM, \"\"JASIA I MAŁGOSI\"\"\"WOŁOMINprzedszkole-nr-9-im-jasia-i-malgosi-05-200-201705-2002017III.4 Program dla sektora owocow i warzyw3445.94PLPLN
87817ZESPÓŁ SZKÓŁ LEŚNYCH IM, UNII EUROPEJSKIEJ W ...RUCIANE-NIDAzespol-szkol-lesnych-im-unii-europejskiej-w-ru...12-2202017III.4 Program dla sektora owocow i warzyw6034.09PLPLN
\n", + "
" + ], + "text/plain": [ + " recipient_name recipient_location \\\n", + "48336 PRZEDSZKOLE NR 1 W NOWEJ DĘBIE NOWA DĘBA \n", + "50864 PRZEDSZKOLE MIEJSKIE Z ODDZIAŁEM SPECJALNYM I ... MIŃSK MAZOWIECKI \n", + "52683 PRZEDSZKOLE NR 3 PŁOŃSK \n", + "81305 \"PRZEDSZKOLE NR 9 IM, \"\"JASIA I MAŁGOSI\"\"\" WOŁOMIN \n", + "87817 ZESPÓŁ SZKÓŁ LEŚNYCH IM, UNII EUROPEJSKIEJ W ... RUCIANE-NIDA \n", + "\n", + " recipient_id recipient_postcode \\\n", + "48336 przedszkole-nr-1-w-nowej-debie-39-460-2017 39-460 \n", + "50864 przedszkole-miejskie-z-oddzialem-specjalnym-i-... 05-300 \n", + "52683 przedszkole-nr-3-09-100-2017 09-100 \n", + "81305 przedszkole-nr-9-im-jasia-i-malgosi-05-200-2017 05-200 \n", + "87817 zespol-szkol-lesnych-im-unii-europejskiej-w-ru... 12-220 \n", + "\n", + " year scheme amount country \\\n", + "48336 2017 III.4 Program dla sektora owocow i warzyw 1893.11 PL \n", + "50864 2017 III.4 Program dla sektora owocow i warzyw 1405.63 PL \n", + "52683 2017 III.4 Program dla sektora owocow i warzyw 3675.68 PL \n", + "81305 2017 III.4 Program dla sektora owocow i warzyw 3445.94 PL \n", + "87817 2017 III.4 Program dla sektora owocow i warzyw 6034.09 PL \n", + "\n", + " currency \n", + "48336 PLN \n", + "50864 PLN \n", + "52683 PLN \n", + "81305 PLN \n", + "87817 PLN " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final = df_final[(df_final['amount'] != 0.0) & df_final['amount'].notnull()]\n", + "df_final['country'] = 'PL'\n", + "df_final['currency'] = 'PLN'\n", + "df_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "df_final.to_csv('pl_{}.csv.gz'.format(YEAR), compression='gzip', index=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/pl/pl_scraper.ipynb b/countries/pl/pl_scraper_2.ipynb similarity index 99% rename from pl/pl_scraper.ipynb rename to countries/pl/pl_scraper_2.ipynb index c13f94f..4d1845d 100644 --- a/pl/pl_scraper.ipynb +++ b/countries/pl/pl_scraper_2.ipynb @@ -852,7 +852,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -866,9 +866,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.10.14" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/countries/pl/pl_scraper_3.ipynb b/countries/pl/pl_scraper_3.ipynb new file mode 100644 index 0000000..ba0f04d --- /dev/null +++ b/countries/pl/pl_scraper_3.ipynb @@ -0,0 +1,675 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import gzip\n", + "import glob\n", + "import time\n", + "\n", + "import requests\n", + "import backoff\n", + "from requests.exceptions import ConnectionError\n", + "\n", + "from joblib import Parallel, delayed\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "from tqdm.notebook import tqdm\n", + "\n", + "from slugify import slugify" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "YEAR = 2022\n", + "ANON_NEEDLE = \"MAŁE GOSPODARSTWO\"\n", + "# All amounts in PLN\n", + "AMOUNT_CUTOFF = [999_999_999, 10_000_000, 150_000, 125_000, 120_000, 67000, 62000, 50_000, 32_000, 31_000, 16_900, 10750, 3000, 0, -1_0000, -10_000, -9_999_999]\n", + "AMOUNT_STEPS = [None , 20_000_000, 5_000, 1_000, 1_000, 1_000, 100, 100, 10, 10, 10, 10, 10, 1, 10, 100, 100_000]\n", + "\n", + "def get_ranges():\n", + " last_top = None\n", + " for top, step in zip(AMOUNT_CUTOFF, AMOUNT_STEPS):\n", + " if last_top is not None:\n", + " yield from reversed(range(top, last_top, step))\n", + " last_top = top" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "RANGES = []\n", + "for x in get_ranges():\n", + " if x != 0:\n", + " RANGES.append(x)\n", + " else:\n", + " # 0 is not working so make sure to make a range around it\n", + " RANGES.append(-1)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[4, 3, 2, 1, -1, -10, -20, -30, -40, -50, -60, -70, -80, -90]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[r for r in RANGES if -100 < r < 5]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "11073" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(RANGES)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "SPECIALS = {\n", + " # Lots of people got these values, so do these with postcode search\n", + " 2020: [\n", + " 120_000,\n", + " 64_000,\n", + " 48_000,\n", + " 20_000,\n", + " 12_000,\n", + " ],\n", + " 2021: [\n", + " 125_000,\n", + " 120_000,\n", + " 68_000,\n", + " 67_000,\n", + " 66_000,\n", + " 64_000,\n", + " 48_000,\n", + " 31_434,\n", + " 20_000,\n", + " 12_000,\n", + " 5_682,\n", + " 5_680,\n", + " 2_225,\n", + " 2_010,\n", + " 2000,\n", + " 1990,\n", + " 1970,\n", + " 1736,\n", + " 1243,\n", + " 1154,\n", + " 1114,\n", + " ], \n", + " 2022: [\n", + " 120_000,\n", + " 47_990,\n", + " 11_990,\n", + " 5_770,\n", + " ] + [48000, 1629, 12000, 1083, 1043, 1222]\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_URL = 'https://beneficjenciwpr.minrol.gov.pl/search/export/csv/'\n", + "BAD_SENTINEL = b'2}'.format(postal))\n", + "\n", + " \n", + "def start(year, extra_specials=None):\n", + " extra_specials = extra_specials or []\n", + " specials = SPECIALS.get(year, [])\n", + " specials.extend(extra_specials)\n", + " total_to = None\n", + " tasks = []\n", + " for amount in RANGES:\n", + " if total_to is None:\n", + " total_to = amount \n", + " continue\n", + " specs = [s for s in specials if amount <= s < total_to]\n", + " # if a range is special, then iterate over post codes as well\n", + " if specs:\n", + " tasks.append(delayed(download_with_postal)(year, amount, total_to))\n", + " else:\n", + " tasks.append(delayed(download)(year, amount, total_to))\n", + " \n", + " total_to = amount\n", + " Parallel(n_jobs=2, verbose=10, batch_size=5)(tasks)\n", + "\n", + "extra_specials = []\n", + "while True:\n", + " try:\n", + " start(YEAR, extra_specials=extra_specials)\n", + " break\n", + " except ConnectionError as e:\n", + " print(e)\n", + " time.sleep(10)\n", + " except TooMuchException as e:\n", + " print(\"too much at\", e.amount)\n", + " if e.amount in extra_specials:\n", + " print(\"we give up\")\n", + " print(e.url)\n", + " break\n", + " else:\n", + " extra_specials.append(e.amount)\n", + " print(\"retrying!\")\n", + " time.sleep(1)\n", + "print(extra_specials)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def get_year(year):\n", + " for i, filename in enumerate(tqdm(sorted(glob.glob('data/{}_*.csv.gz'.format(year))))):\n", + " if os.stat(filename).st_size <= 50:\n", + " continue\n", + " if i % 1000 == 0:\n", + " print(filename)\n", + " print(filename)\n", + " df = pd.read_csv(filename, compression='gzip', encoding='utf-8-sig', sep=';', engine=\"python\", on_bad_lines=\"warn\")\n", + " df['fn'] = filename\n", + " yield df\n", + "# yield pd.DataFrame(poor_csv_parser(filename))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "df = pd.concat(get_year(YEAR))\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dupes = df.duplicated(subset=df.columns.tolist()[:-1], keep=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[dupes].head(50)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[dupes].sort_values('Imię')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df['Suma'] = df['Suma'].replace(',', '.', regex=True).astype('float')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_pos = df[df['Suma'] > 0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_pos.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df['Suma'].sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_pos['Suma'].sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[df['Suma'] == 0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[df['Nazwisko'] == \"1\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[df['Nazwisko'] == \"141098\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[df['Nazwisko'] == \"497873\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[df['Suma'] < -1].count()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[df['Suma'] < -1].sort_values('Suma', ascending=False).iloc[101]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "list(df.columns)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def apply_fixes(df):\n", + " df = df.rename(columns={\n", + " 'Imię': 'recipient_firstname',\n", + " 'Nazwisko': 'recipient_lastname',\n", + " 'Nazwa': 'recipient_name',\n", + " 'Gmina': 'recipient_location',\n", + " 'Kod pocztowy': 'recipient_postcode',\n", + " '\\ufeff\\ufeff\\ufeffRok': 'year'\n", + " })\n", + " df = df.drop(columns=['Suma'])\n", + " df['recipient_firstname'] = df['recipient_firstname'].fillna('').apply(str)\n", + " df['recipient_lastname'] = df['recipient_lastname'].fillna('').apply(str)\n", + " df['recipient_name'] = df['recipient_name'].where(df['recipient_name'].notnull(),\n", + " df['recipient_firstname'] + ' ' + df['recipient_lastname'])\n", + "\n", + " anonymous = 'Małe gospodarstwo'\n", + " df['recipient_name'] = df['recipient_name'].str.replace(anonymous, '').str.strip()\n", + " df = df.drop(columns=['recipient_firstname', 'recipient_lastname'])\n", + " df['recipient_id'] = df.apply(lambda x: 'PL-%s-%s' % (x['recipient_postcode'], slugify(x['recipient_name'])), 1)\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = apply_fixes(df)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cols = 'recipient_name|recipient_location|recipient_id|recipient_postcode|year'.split('|')\n", + "scheme_cols = list(set(df.columns) - set(cols))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(scheme_cols)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "scheme_cols" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# df['Suma'] = pd.to_numeric(df['Suma'].str.replace(',', '.'))\n", + "# for c in scheme_cols:\n", + "# df[c] = pd.to_numeric(df[c].str.replace(',', '.'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# mismatch = np.isclose(df[scheme_cols].sum(1), df['Suma'] , atol=1)\n", + "# len(df) - mismatch.sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_final = pd.melt(df, id_vars=cols, var_name='scheme', value_name='amount', value_vars=scheme_cols)\n", + "df_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_final = df_final[(df_final['amount'] != 0.0) & df_final['amount'].notnull()]\n", + "df_final['country'] = 'PL'\n", + "df_final['currency'] = 'PLN'\n", + "df_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_final.to_csv('pl_{}.csv.gz'.format(YEAR), compression='gzip', index=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/pt/README.md b/countries/pt/README.md similarity index 100% rename from pt/README.md rename to countries/pt/README.md diff --git a/pt/pt_scraper.ipynb b/countries/pt/pt_scraper.ipynb similarity index 100% rename from pt/pt_scraper.ipynb rename to countries/pt/pt_scraper.ipynb diff --git a/ro/README.md b/countries/ro/README.md similarity index 100% rename from ro/README.md rename to countries/ro/README.md diff --git a/ro/scraper.py b/countries/ro/scraper.py similarity index 100% rename from ro/scraper.py rename to countries/ro/scraper.py diff --git a/se/README.md b/countries/se/README.md similarity index 100% rename from se/README.md rename to countries/se/README.md diff --git a/se/combine_se.ipynb b/countries/se/combine_se.ipynb similarity index 100% rename from se/combine_se.ipynb rename to countries/se/combine_se.ipynb diff --git a/se/scraper_se.ipynb b/countries/se/scraper_se.ipynb similarity index 100% rename from se/scraper_se.ipynb rename to countries/se/scraper_se.ipynb diff --git a/si/README.md b/countries/si/README.md similarity index 100% rename from si/README.md rename to countries/si/README.md diff --git a/sk/README.md b/countries/sk/README.md similarity index 100% rename from sk/README.md rename to countries/sk/README.md From fb13a5e987e66681f4fb99381715b85ca66795f9 Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Fri, 22 Nov 2024 18:00:56 +0100 Subject: [PATCH 22/38] Improve README --- README.md | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index e6b585b..f9ab65a 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,8 @@ -FarmSubsidy.org Scrapers -======================== +# FarmSubsidy.org Scrapers -[FarmSubsidy](https://farmsubsidy.org) is a website that collects the payment data of the Common Agriculture Policy (CAP) which represents about a third of the EU budget. It was run by a group of journalists and activists for the past years. In 2013 the [OpenSpending project](http://openspending.org/) of the [Open Knowledge Foundation](http://okfn.org/) took over responsibility of the website. +[FarmSubsidy](https://farmsubsidy.org) is a platform that collects payment data related to the EU’s Common Agricultural Policy (CAP), which accounts for approximately one-third of the EU budget. This repository focuses on the initial data collection phase, often using web scraping. However, many EU member states now offer bulk data downloads, reducing the need for scraping. -The FarmSubsidy data is mostly scraped from member state websites. The old scrapers were working well, but were running in costly and proprietary software. This year we need Free and Open Source scrapers and this repository will collect these scrapers and coordinate the effort. +## Resources -Please have a look at the [member state scraper issues](https://github.com/openspending/farmsubsidy-scrapers/issues?labels=memberstate&page=1&state=open). If you can help provide a scraper that would be awesome. - - -Developer Documentation ------------------------ - -Developer documentation for both website and scrapers can be found at http://farmsubsidy.readthedocs.org. - -[Member states data sites](https://agriculture.ec.europa.eu/common-agricultural-policy/financing-cap/beneficiaries_en) - - -[Financial Reports](http://ec.europa.eu/agriculture/cap-funding/financial-reports/index_en.htm) +- **[Member States Data Sites](https://agriculture.ec.europa.eu/common-agricultural-policy/financing-cap/beneficiaries_en):** Links to member states’ CAP payment data portals. +- **[Financial Reports](http://ec.europa.eu/agriculture/cap-funding/financial-reports/index_en.htm):** Summary reports on CAP funding and expenditures. From 27419caef762608910a5b5e3ce9ca4a30ed59752 Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Fri, 22 Nov 2024 18:01:24 +0100 Subject: [PATCH 23/38] Update requirements to get it to run again --- scrapy_fs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scrapy_fs/requirements.txt b/scrapy_fs/requirements.txt index 320d99b..11b51e4 100644 --- a/scrapy_fs/requirements.txt +++ b/scrapy_fs/requirements.txt @@ -58,7 +58,7 @@ jupyterlab==4.0.7 jupyterlab-pygments==0.2.2 jupyterlab-widgets==3.0.9 jupyterlab_server==2.25.0 -lxml==4.9.3 +lxml==5.3.0 MarkupSafe==2.1.3 matplotlib-inline==0.1.6 mistune==3.0.2 From 2639dc1acb7f4d332a95216d338cf92c25d6eeba Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Sun, 8 Dec 2024 21:36:30 +0100 Subject: [PATCH 24/38] Add basic cli structure --- .editorconfig | 17 + .gitignore | 5 +- cli.py | 28 + countries/__init__.py | 0 countries/at/__init__.py | 0 countries/at/run.py | 13 + poetry.lock | 1130 ++++++++++++++++++++++++++++++++++++++ pyproject.toml | 22 + 8 files changed, 1213 insertions(+), 2 deletions(-) create mode 100644 .editorconfig create mode 100644 cli.py create mode 100644 countries/__init__.py create mode 100644 countries/at/__init__.py create mode 100644 countries/at/run.py create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..4f92a46 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Tab indentation +[*] +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true +insert_final_newline = true + +# The indent size used in the `package.json` file cannot be changed +# https://github.com/npm/npm/pull/3180#issuecomment-16336516 +[{.travis.yml,npm-shrinkwrap.json,package.json}] +indent_style = space +indent_size = 4 diff --git a/.gitignore b/.gitignore index 203a4df..78f8aae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -*/data +data .idea/ *.pyc *.swp @@ -12,4 +12,5 @@ *.jpg *.xlsx .ipynb_checkpoints -lv/__pycache__/ +__pycache__ +cache diff --git a/cli.py b/cli.py new file mode 100644 index 0000000..cb81aa8 --- /dev/null +++ b/cli.py @@ -0,0 +1,28 @@ +""" +CLI commands +""" +import importlib +import click + +DEFAULT_YEAR = 2022 + +@click.command() +@click.argument('country') +@click.argument('year') +def cli(country=None, year=DEFAULT_YEAR): + """Download farm subsidy data for specified country and year.""" + print(f'Downloading data for {country} in {year}') + + try: + # Dynamically import the country module + country_module = importlib.import_module(f'countries.{country}.run') + return country_module.run(year) + except ImportError: + print(f"Error: Country module '{country}' not found") + return 1 + except Exception as e: + print(f"Error downloading data: {e}") + return 1 + +if __name__ == '__main__': + cli() diff --git a/countries/__init__.py b/countries/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/countries/at/__init__.py b/countries/at/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/countries/at/run.py b/countries/at/run.py new file mode 100644 index 0000000..9c5eabd --- /dev/null +++ b/countries/at/run.py @@ -0,0 +1,13 @@ + + + + +base_url = 'https://www.transparenz.at/export/Export_%s.zip' + +def download(url): + pass + +def run(year): + url = base_url % year + print('Downloading from %s' % url) + return base_url diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..409312a --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1130 @@ +# This file is automatically @generated by Poetry 1.8.0 and should not be changed by hand. + +[[package]] +name = "attrs" +version = "24.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "automat" +version = "24.8.1" +description = "Self-service finite-state machines for the programmer on the go." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Automat-24.8.1-py3-none-any.whl", hash = "sha256:bf029a7bc3da1e2c24da2343e7598affaa9f10bf0ab63ff808566ce90551e02a"}, + {file = "automat-24.8.1.tar.gz", hash = "sha256:b34227cf63f6325b8ad2399ede780675083e439b20c323d376373d8ee6306d88"}, +] + +[package.extras] +visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] + +[[package]] +name = "black" +version = "24.10.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.9" +files = [ + {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, + {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, + {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, + {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, + {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, + {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, + {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, + {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, + {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, + {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, + {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, + {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, + {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, + {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, + {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, + {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, + {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, + {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, + {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, + {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, + {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, + {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.10)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "certifi" +version = "2024.8.30" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, +] + +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "constantly" +version = "23.10.4" +description = "Symbolic constants in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "constantly-23.10.4-py3-none-any.whl", hash = "sha256:3fd9b4d1c3dc1ec9757f3c52aef7e53ad9323dbe39f51dfd4c43853b68dfa3f9"}, + {file = "constantly-23.10.4.tar.gz", hash = "sha256:aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd"}, +] + +[[package]] +name = "cryptography" +version = "44.0.0" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = "!=3.9.0,!=3.9.1,>=3.7" +files = [ + {file = "cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385"}, + {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"}, + {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"}, + {file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"}, + {file = "cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd"}, + {file = "cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba"}, + {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"}, + {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"}, + {file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"}, + {file = "cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c"}, + {file = "cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] +docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] +pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +sdist = ["build (>=1.0.0)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi (>=2024)", "cryptography-vectors (==44.0.0)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "cssselect" +version = "1.2.0" +description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, + {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "filelock" +version = "3.16.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] + +[[package]] +name = "hyperlink" +version = "21.0.0" +description = "A featureful, immutable, and correct URL for Python." +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4"}, + {file = "hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b"}, +] + +[package.dependencies] +idna = ">=2.5" + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "incremental" +version = "24.7.2" +description = "A small library that versions your Python projects." +optional = false +python-versions = ">=3.8" +files = [ + {file = "incremental-24.7.2-py3-none-any.whl", hash = "sha256:8cb2c3431530bec48ad70513931a760f446ad6c25e8333ca5d95e24b0ed7b8fe"}, + {file = "incremental-24.7.2.tar.gz", hash = "sha256:fb4f1d47ee60efe87d4f6f0ebb5f70b9760db2b2574c59c8e8912be4ebd464c9"}, +] + +[package.dependencies] +setuptools = ">=61.0" +tomli = {version = "*", markers = "python_version < \"3.11\""} + +[package.extras] +scripts = ["click (>=6.0)"] + +[[package]] +name = "itemadapter" +version = "0.9.0" +description = "Common interface for data container classes" +optional = false +python-versions = ">=3.8" +files = [ + {file = "itemadapter-0.9.0-py3-none-any.whl", hash = "sha256:cfd108c9d5205d056fcac402ec8f8e9d799ce9066911eec1cd521ea442f87af1"}, + {file = "itemadapter-0.9.0.tar.gz", hash = "sha256:e4f958a6b6b6f5831fa207373010031a0bd7ed0429ddd09b51979c011475cafd"}, +] + +[[package]] +name = "itemloaders" +version = "1.3.2" +description = "Base library for scrapy's ItemLoader" +optional = false +python-versions = ">=3.8" +files = [ + {file = "itemloaders-1.3.2-py3-none-any.whl", hash = "sha256:6a91465f721c7bad8b07e1fbb0560cf99f4845156ed9f7bf2ca424336c6a677c"}, + {file = "itemloaders-1.3.2.tar.gz", hash = "sha256:4faf5b3abe83bf014476e3fd9ccf66867282971d9f1d4e96d9a61b60c3786770"}, +] + +[package.dependencies] +itemadapter = ">=0.1.0" +jmespath = ">=0.9.5" +parsel = ">=1.5.0" + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + +[[package]] +name = "lxml" +version = "5.3.0" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656"}, + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7"}, + {file = "lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80"}, + {file = "lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be"}, + {file = "lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9"}, + {file = "lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d"}, + {file = "lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30"}, + {file = "lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f"}, + {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a"}, + {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b"}, + {file = "lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957"}, + {file = "lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d"}, + {file = "lxml-5.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8f0de2d390af441fe8b2c12626d103540b5d850d585b18fcada58d972b74a74e"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1afe0a8c353746e610bd9031a630a95bcfb1a720684c3f2b36c4710a0a96528f"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56b9861a71575f5795bde89256e7467ece3d339c9b43141dbdd54544566b3b94"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:9fb81d2824dff4f2e297a276297e9031f46d2682cafc484f49de182aa5e5df99"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2c226a06ecb8cdef28845ae976da407917542c5e6e75dcac7cc33eb04aaeb237"}, + {file = "lxml-5.3.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:7d3d1ca42870cdb6d0d29939630dbe48fa511c203724820fc0fd507b2fb46577"}, + {file = "lxml-5.3.0-cp36-cp36m-win32.whl", hash = "sha256:094cb601ba9f55296774c2d57ad68730daa0b13dc260e1f941b4d13678239e70"}, + {file = "lxml-5.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:eafa2c8658f4e560b098fe9fc54539f86528651f61849b22111a9b107d18910c"}, + {file = "lxml-5.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb83f8a875b3d9b458cada4f880fa498646874ba4011dc974e071a0a84a1b033"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25f1b69d41656b05885aa185f5fdf822cb01a586d1b32739633679699f220391"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23e0553b8055600b3bf4a00b255ec5c92e1e4aebf8c2c09334f8368e8bd174d6"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ada35dd21dc6c039259596b358caab6b13f4db4d4a7f8665764d616daf9cc1d"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:81b4e48da4c69313192d8c8d4311e5d818b8be1afe68ee20f6385d0e96fc9512"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:2bc9fd5ca4729af796f9f59cd8ff160fe06a474da40aca03fcc79655ddee1a8b"}, + {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07da23d7ee08577760f0a71d67a861019103e4812c87e2fab26b039054594cc5"}, + {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ea2e2f6f801696ad7de8aec061044d6c8c0dd4037608c7cab38a9a4d316bfb11"}, + {file = "lxml-5.3.0-cp37-cp37m-win32.whl", hash = "sha256:5c54afdcbb0182d06836cc3d1be921e540be3ebdf8b8a51ee3ef987537455f84"}, + {file = "lxml-5.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f2901429da1e645ce548bf9171784c0f74f0718c3f6150ce166be39e4dd66c3e"}, + {file = "lxml-5.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c56a1d43b2f9ee4786e4658c7903f05da35b923fb53c11025712562d5cc02753"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee8c39582d2652dcd516d1b879451500f8db3fe3607ce45d7c5957ab2596040"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdf3a3059611f7585a78ee10399a15566356116a4288380921a4b598d807a22"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:146173654d79eb1fc97498b4280c1d3e1e5d58c398fa530905c9ea50ea849b22"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0a7056921edbdd7560746f4221dca89bb7a3fe457d3d74267995253f46343f15"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:9e4b47ac0f5e749cfc618efdf4726269441014ae1d5583e047b452a32e221920"}, + {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f914c03e6a31deb632e2daa881fe198461f4d06e57ac3d0e05bbcab8eae01945"}, + {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:213261f168c5e1d9b7535a67e68b1f59f92398dd17a56d934550837143f79c42"}, + {file = "lxml-5.3.0-cp38-cp38-win32.whl", hash = "sha256:218c1b2e17a710e363855594230f44060e2025b05c80d1f0661258142b2add2e"}, + {file = "lxml-5.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:315f9542011b2c4e1d280e4a20ddcca1761993dda3afc7a73b01235f8641e903"}, + {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1ffc23010330c2ab67fac02781df60998ca8fe759e8efde6f8b756a20599c5de"}, + {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2b3778cb38212f52fac9fe913017deea2fdf4eb1a4f8e4cfc6b009a13a6d3fcc"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b0c7a688944891086ba192e21c5229dea54382f4836a209ff8d0a660fac06be"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:747a3d3e98e24597981ca0be0fd922aebd471fa99d0043a3842d00cdcad7ad6a"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86a6b24b19eaebc448dc56b87c4865527855145d851f9fc3891673ff97950540"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b11a5d918a6216e521c715b02749240fb07ae5a1fefd4b7bf12f833bc8b4fe70"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b87753c784d6acb8a25b05cb526c3406913c9d988d51f80adecc2b0775d6aa"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:109fa6fede314cc50eed29e6e56c540075e63d922455346f11e4d7a036d2b8cf"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:02ced472497b8362c8e902ade23e3300479f4f43e45f4105c85ef43b8db85229"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:6b038cc86b285e4f9fea2ba5ee76e89f21ed1ea898e287dc277a25884f3a7dfe"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:7437237c6a66b7ca341e868cda48be24b8701862757426852c9b3186de1da8a2"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7f41026c1d64043a36fda21d64c5026762d53a77043e73e94b71f0521939cc71"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:482c2f67761868f0108b1743098640fbb2a28a8e15bf3f47ada9fa59d9fe08c3"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1483fd3358963cc5c1c9b122c80606a3a79ee0875bcac0204149fa09d6ff2727"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dec2d1130a9cda5b904696cec33b2cfb451304ba9081eeda7f90f724097300a"}, + {file = "lxml-5.3.0-cp39-cp39-win32.whl", hash = "sha256:a0eabd0a81625049c5df745209dc7fcef6e2aea7793e5f003ba363610aa0a3ff"}, + {file = "lxml-5.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:89e043f1d9d341c52bf2af6d02e6adde62e0a46e6755d5eb60dc6e4f0b8aeca2"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:94d6c3782907b5e40e21cadf94b13b0842ac421192f26b84c45f13f3c9d5dc27"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c300306673aa0f3ed5ed9372b21867690a17dba38c68c44b287437c362ce486b"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d9b952e07aed35fe2e1a7ad26e929595412db48535921c5013edc8aa4a35ce"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:01220dca0d066d1349bd6a1726856a78f7929f3878f7e2ee83c296c69495309e"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2d9b8d9177afaef80c53c0a9e30fa252ff3036fb1c6494d427c066a4ce6a282f"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:20094fc3f21ea0a8669dc4c61ed7fa8263bd37d97d93b90f28fc613371e7a875"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ace2c2326a319a0bb8a8b0e5b570c764962e95818de9f259ce814ee666603f19"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e67a0be1639c251d21e35fe74df6bcc40cba445c2cda7c4a967656733249e2"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd5350b55f9fecddc51385463a4f67a5da829bc741e38cf689f38ec9023f54ab"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c1fefd7e3d00921c44dc9ca80a775af49698bbfd92ea84498e56acffd4c5469"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:71a8dd38fbd2f2319136d4ae855a7078c69c9a38ae06e0c17c73fd70fc6caad8"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:97acf1e1fd66ab53dacd2c35b319d7e548380c2e9e8c54525c6e76d21b1ae3b1"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:68934b242c51eb02907c5b81d138cb977b2129a0a75a8f8b60b01cb8586c7b21"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b710bc2b8292966b23a6a0121f7a6c51d45d2347edcc75f016ac123b8054d3f2"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18feb4b93302091b1541221196a2155aa296c363fd233814fa11e181adebc52f"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3eb44520c4724c2e1a57c0af33a379eee41792595023f367ba3952a2d96c2aab"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:609251a0ca4770e5a8768ff902aa02bf636339c5a93f9349b48eb1f606f7f3e9"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:516f491c834eb320d6c843156440fe7fc0d50b33e44387fcec5b02f0bc118a4c"}, + {file = "lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.11)"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "packaging" +version = "24.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] + +[[package]] +name = "parsel" +version = "1.9.1" +description = "Parsel is a library to extract data from HTML and XML using XPath and CSS selectors" +optional = false +python-versions = ">=3.8" +files = [ + {file = "parsel-1.9.1-py2.py3-none-any.whl", hash = "sha256:c4a777ee6c3ff5e39652b58e351c5cf02c12ff420d05b07a7966aebb68ab1700"}, + {file = "parsel-1.9.1.tar.gz", hash = "sha256:14e00dc07731c9030db620c195fcae884b5b4848e9f9c523c6119f708ccfa9ac"}, +] + +[package.dependencies] +cssselect = ">=1.2.0" +jmespath = "*" +lxml = "*" +packaging = "*" +w3lib = ">=1.19.0" + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] + +[[package]] +name = "protego" +version = "0.3.1" +description = "Pure-Python robots.txt parser with support for modern conventions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Protego-0.3.1-py2.py3-none-any.whl", hash = "sha256:2fbe8e9b7a7dbc5016a932b14c98d236aad4c29290bbe457b8d2779666ef7a41"}, + {file = "Protego-0.3.1.tar.gz", hash = "sha256:e94430d0d25cbbf239bc849d86c5e544fbde531fcccfa059953c7da344a1712c"}, +] + +[[package]] +name = "pyasn1" +version = "0.6.1" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.1" +description = "A collection of ASN.1-based protocols modules" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, + {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.7.0" + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydispatcher" +version = "2.0.7" +description = "Multi-producer multi-consumer in-memory signal dispatch system" +optional = false +python-versions = "*" +files = [ + {file = "PyDispatcher-2.0.7-py3-none-any.whl", hash = "sha256:96543bea04115ffde08f851e1d45cacbfd1ee866ac42127d9b476dc5aefa7de0"}, + {file = "PyDispatcher-2.0.7.tar.gz", hash = "sha256:b777c6ad080dc1bad74a4c29d6a46914fa6701ac70f94b0d66fbcfde62f5be31"}, +] + +[package.extras] +dev = ["tox"] + +[[package]] +name = "pyopenssl" +version = "24.3.0" +description = "Python wrapper module around the OpenSSL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyOpenSSL-24.3.0-py3-none-any.whl", hash = "sha256:e474f5a473cd7f92221cc04976e48f4d11502804657a08a989fb3be5514c904a"}, + {file = "pyopenssl-24.3.0.tar.gz", hash = "sha256:49f7a019577d834746bc55c5fce6ecbcec0f2b4ec5ce1cf43a9a173b8138bb36"}, +] + +[package.dependencies] +cryptography = ">=41.0.5,<45" + +[package.extras] +docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx_rtd_theme"] +test = ["pretend", "pytest (>=3.0.1)", "pytest-rerunfailures"] + +[[package]] +name = "pypydispatcher" +version = "2.1.2" +description = "Multi-producer-multi-consumer signal dispatching mechanism" +optional = false +python-versions = "*" +files = [ + {file = "PyPyDispatcher-2.1.2.tar.gz", hash = "sha256:b6bec5dfcff9d2535bca2b23c80eae367b1ac250a645106948d315fcfa9130f2"}, +] + +[[package]] +name = "queuelib" +version = "1.7.0" +description = "Collection of persistent (disk-based) and non-persistent (memory-based) queues" +optional = false +python-versions = ">=3.8" +files = [ + {file = "queuelib-1.7.0-py2.py3-none-any.whl", hash = "sha256:b07aaa2410caac3a0021ee4f4026acdac992b0fb9a2cbeb34a918617df3c12a7"}, + {file = "queuelib-1.7.0.tar.gz", hash = "sha256:2855162096cf0230510890b354379ea1c0ff19d105d3147d349d2433bb222b08"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-file" +version = "2.1.0" +description = "File transport adapter for Requests" +optional = false +python-versions = "*" +files = [ + {file = "requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c"}, + {file = "requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658"}, +] + +[package.dependencies] +requests = ">=1.0.0" + +[[package]] +name = "scrapy" +version = "2.12.0" +description = "A high-level Web Crawling and Web Scraping framework" +optional = false +python-versions = ">=3.9" +files = [ + {file = "Scrapy-2.12.0-py2.py3-none-any.whl", hash = "sha256:c33e2dc7da42e727390bacb32dd9938a54ac210fa71972b5c392754f478669cd"}, + {file = "scrapy-2.12.0.tar.gz", hash = "sha256:d66d6e76009b12447604196875a463b61d10721140032a8084a0a52df7f4788f"}, +] + +[package.dependencies] +cryptography = ">=37.0.0" +cssselect = ">=0.9.1" +defusedxml = ">=0.7.1" +itemadapter = ">=0.1.0" +itemloaders = ">=1.0.1" +lxml = ">=4.6.0" +packaging = "*" +parsel = ">=1.5.0" +protego = ">=0.1.15" +PyDispatcher = {version = ">=2.0.5", markers = "platform_python_implementation == \"CPython\""} +pyOpenSSL = ">=22.0.0" +PyPyDispatcher = {version = ">=2.1.0", markers = "platform_python_implementation == \"PyPy\""} +queuelib = ">=1.4.2" +service-identity = ">=18.1.0" +tldextract = "*" +Twisted = ">=21.7.0" +w3lib = ">=1.17.0" +"zope.interface" = ">=5.1.0" + +[[package]] +name = "service-identity" +version = "24.2.0" +description = "Service identity verification for pyOpenSSL & cryptography." +optional = false +python-versions = ">=3.8" +files = [ + {file = "service_identity-24.2.0-py3-none-any.whl", hash = "sha256:6b047fbd8a84fd0bb0d55ebce4031e400562b9196e1e0d3e0fe2b8a59f6d4a85"}, + {file = "service_identity-24.2.0.tar.gz", hash = "sha256:b8683ba13f0d39c6cd5d625d2c5f65421d6d707b013b375c355751557cbe8e09"}, +] + +[package.dependencies] +attrs = ">=19.1.0" +cryptography = "*" +pyasn1 = "*" +pyasn1-modules = "*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "idna", "mypy", "pyopenssl", "pytest", "types-pyopenssl"] +docs = ["furo", "myst-parser", "pyopenssl", "sphinx", "sphinx-notfound-page"] +idna = ["idna"] +mypy = ["idna", "mypy", "types-pyopenssl"] +tests = ["coverage[toml] (>=5.0.2)", "pytest"] + +[[package]] +name = "setuptools" +version = "75.6.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.9" +files = [ + {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, + {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] +core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] + +[[package]] +name = "tldextract" +version = "5.1.3" +description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." +optional = false +python-versions = ">=3.9" +files = [ + {file = "tldextract-5.1.3-py3-none-any.whl", hash = "sha256:78de310cc2ca018692de5ddf320f9d6bd7c5cf857d0fd4f2175f0cdf4440ea75"}, + {file = "tldextract-5.1.3.tar.gz", hash = "sha256:d43c7284c23f5dc8a42fd0fee2abede2ff74cc622674e4cb07f514ab3330c338"}, +] + +[package.dependencies] +filelock = ">=3.0.8" +idna = "*" +requests = ">=2.1.0" +requests-file = ">=1.4" + +[package.extras] +release = ["build", "twine"] +testing = ["mypy", "pytest", "pytest-gitignore", "pytest-mock", "responses", "ruff", "syrupy", "tox", "tox-uv", "types-filelock", "types-requests"] + +[[package]] +name = "tomli" +version = "2.2.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, +] + +[[package]] +name = "twisted" +version = "24.10.0" +description = "An asynchronous networking framework written in Python" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "twisted-24.10.0-py3-none-any.whl", hash = "sha256:67aa7c8aa94387385302acf44ade12967c747858c8bcce0f11d38077a11c5326"}, + {file = "twisted-24.10.0.tar.gz", hash = "sha256:02951299672595fea0f70fa2d5f7b5e3d56836157eda68859a6ad6492d36756e"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +automat = ">=24.8.0" +constantly = ">=15.1" +hyperlink = ">=17.1.1" +incremental = ">=24.7.0" +typing-extensions = ">=4.2.0" +zope-interface = ">=5" + +[package.extras] +all-non-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] +conch = ["appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)"] +dev = ["coverage (>=7.5,<8.0)", "cython-test-exception-raiser (>=1.0.2,<2)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "pydoctor (>=23.9.0,<23.10.0)", "pyflakes (>=2.2,<3.0)", "pyhamcrest (>=2)", "python-subunit (>=1.4,<2.0)", "sphinx (>=6,<7)", "sphinx-rtd-theme (>=1.3,<2.0)", "towncrier (>=23.6,<24.0)", "twistedchecker (>=0.7,<1.0)"] +dev-release = ["pydoctor (>=23.9.0,<23.10.0)", "pydoctor (>=23.9.0,<23.10.0)", "sphinx (>=6,<7)", "sphinx (>=6,<7)", "sphinx-rtd-theme (>=1.3,<2.0)", "sphinx-rtd-theme (>=1.3,<2.0)", "towncrier (>=23.6,<24.0)", "towncrier (>=23.6,<24.0)"] +gtk-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pygobject", "pygobject", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] +http2 = ["h2 (>=3.2,<5.0)", "priority (>=1.1.0,<2.0)"] +macos-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyobjc-core", "pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "pyobjc-framework-cocoa", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] +mypy = ["appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "coverage (>=7.5,<8.0)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "idna (>=2.4)", "mypy (==1.10.1)", "mypy-zope (==1.0.6)", "priority (>=1.1.0,<2.0)", "pydoctor (>=23.9.0,<23.10.0)", "pyflakes (>=2.2,<3.0)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "python-subunit (>=1.4,<2.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "sphinx (>=6,<7)", "sphinx-rtd-theme (>=1.3,<2.0)", "towncrier (>=23.6,<24.0)", "twistedchecker (>=0.7,<1.0)", "types-pyopenssl", "types-setuptools"] +osx-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyobjc-core", "pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "pyobjc-framework-cocoa", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] +serial = ["pyserial (>=3.0)", "pywin32 (!=226)"] +test = ["cython-test-exception-raiser (>=1.0.2,<2)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "pyhamcrest (>=2)"] +tls = ["idna (>=2.4)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)"] +windows-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)", "twisted-iocpsupport (>=1.0.2)", "twisted-iocpsupport (>=1.0.2)"] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "urllib3" +version = "2.2.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "w3lib" +version = "2.2.1" +description = "Library of web-related functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "w3lib-2.2.1-py3-none-any.whl", hash = "sha256:e56d81c6a6bf507d7039e0c95745ab80abd24b465eb0f248af81e3eaa46eb510"}, + {file = "w3lib-2.2.1.tar.gz", hash = "sha256:756ff2d94c64e41c8d7c0c59fea12a5d0bc55e33a531c7988b4a163deb9b07dd"}, +] + +[[package]] +name = "zope-interface" +version = "7.2" +description = "Interfaces for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zope.interface-7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ce290e62229964715f1011c3dbeab7a4a1e4971fd6f31324c4519464473ef9f2"}, + {file = "zope.interface-7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05b910a5afe03256b58ab2ba6288960a2892dfeef01336dc4be6f1b9ed02ab0a"}, + {file = "zope.interface-7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550f1c6588ecc368c9ce13c44a49b8d6b6f3ca7588873c679bd8fd88a1b557b6"}, + {file = "zope.interface-7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ef9e2f865721553c6f22a9ff97da0f0216c074bd02b25cf0d3af60ea4d6931d"}, + {file = "zope.interface-7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27f926f0dcb058211a3bb3e0e501c69759613b17a553788b2caeb991bed3b61d"}, + {file = "zope.interface-7.2-cp310-cp310-win_amd64.whl", hash = "sha256:144964649eba4c5e4410bb0ee290d338e78f179cdbfd15813de1a664e7649b3b"}, + {file = "zope.interface-7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1909f52a00c8c3dcab6c4fad5d13de2285a4b3c7be063b239b8dc15ddfb73bd2"}, + {file = "zope.interface-7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:80ecf2451596f19fd607bb09953f426588fc1e79e93f5968ecf3367550396b22"}, + {file = "zope.interface-7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:033b3923b63474800b04cba480b70f6e6243a62208071fc148354f3f89cc01b7"}, + {file = "zope.interface-7.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a102424e28c6b47c67923a1f337ede4a4c2bba3965b01cf707978a801fc7442c"}, + {file = "zope.interface-7.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25e6a61dcb184453bb00eafa733169ab6d903e46f5c2ace4ad275386f9ab327a"}, + {file = "zope.interface-7.2-cp311-cp311-win_amd64.whl", hash = "sha256:3f6771d1647b1fc543d37640b45c06b34832a943c80d1db214a37c31161a93f1"}, + {file = "zope.interface-7.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:086ee2f51eaef1e4a52bd7d3111a0404081dadae87f84c0ad4ce2649d4f708b7"}, + {file = "zope.interface-7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:21328fcc9d5b80768bf051faa35ab98fb979080c18e6f84ab3f27ce703bce465"}, + {file = "zope.interface-7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6dd02ec01f4468da0f234da9d9c8545c5412fef80bc590cc51d8dd084138a89"}, + {file = "zope.interface-7.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e7da17f53e25d1a3bde5da4601e026adc9e8071f9f6f936d0fe3fe84ace6d54"}, + {file = "zope.interface-7.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cab15ff4832580aa440dc9790b8a6128abd0b88b7ee4dd56abacbc52f212209d"}, + {file = "zope.interface-7.2-cp312-cp312-win_amd64.whl", hash = "sha256:29caad142a2355ce7cfea48725aa8bcf0067e2b5cc63fcf5cd9f97ad12d6afb5"}, + {file = "zope.interface-7.2-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:3e0350b51e88658d5ad126c6a57502b19d5f559f6cb0a628e3dc90442b53dd98"}, + {file = "zope.interface-7.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15398c000c094b8855d7d74f4fdc9e73aa02d4d0d5c775acdef98cdb1119768d"}, + {file = "zope.interface-7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:802176a9f99bd8cc276dcd3b8512808716492f6f557c11196d42e26c01a69a4c"}, + {file = "zope.interface-7.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb23f58a446a7f09db85eda09521a498e109f137b85fb278edb2e34841055398"}, + {file = "zope.interface-7.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a71a5b541078d0ebe373a81a3b7e71432c61d12e660f1d67896ca62d9628045b"}, + {file = "zope.interface-7.2-cp313-cp313-win_amd64.whl", hash = "sha256:4893395d5dd2ba655c38ceb13014fd65667740f09fa5bb01caa1e6284e48c0cd"}, + {file = "zope.interface-7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d3a8ffec2a50d8ec470143ea3d15c0c52d73df882eef92de7537e8ce13475e8a"}, + {file = "zope.interface-7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:31d06db13a30303c08d61d5fb32154be51dfcbdb8438d2374ae27b4e069aac40"}, + {file = "zope.interface-7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e204937f67b28d2dca73ca936d3039a144a081fc47a07598d44854ea2a106239"}, + {file = "zope.interface-7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:224b7b0314f919e751f2bca17d15aad00ddbb1eadf1cb0190fa8175edb7ede62"}, + {file = "zope.interface-7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf95683cde5bc7d0e12d8e7588a3eb754d7c4fa714548adcd96bdf90169f021"}, + {file = "zope.interface-7.2-cp38-cp38-win_amd64.whl", hash = "sha256:7dc5016e0133c1a1ec212fc87a4f7e7e562054549a99c73c8896fa3a9e80cbc7"}, + {file = "zope.interface-7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7bd449c306ba006c65799ea7912adbbfed071089461a19091a228998b82b1fdb"}, + {file = "zope.interface-7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a19a6cc9c6ce4b1e7e3d319a473cf0ee989cbbe2b39201d7c19e214d2dfb80c7"}, + {file = "zope.interface-7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72cd1790b48c16db85d51fbbd12d20949d7339ad84fd971427cf00d990c1f137"}, + {file = "zope.interface-7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52e446f9955195440e787596dccd1411f543743c359eeb26e9b2c02b077b0519"}, + {file = "zope.interface-7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ad9913fd858274db8dd867012ebe544ef18d218f6f7d1e3c3e6d98000f14b75"}, + {file = "zope.interface-7.2-cp39-cp39-win_amd64.whl", hash = "sha256:1090c60116b3da3bfdd0c03406e2f14a1ff53e5771aebe33fec1edc0a350175d"}, + {file = "zope.interface-7.2.tar.gz", hash = "sha256:8b49f1a3d1ee4cdaf5b32d2e738362c7f5e40ac8b46dd7d1a65e82a4872728fe"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx", "furo", "repoze.sphinx.autointerface"] +test = ["coverage[toml]", "zope.event", "zope.testing"] +testing = ["coverage[toml]", "zope.event", "zope.testing"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "09e52e1b9f042ea4c44f6ce4e09328535901965f87ef221f505cd90404a6e1d0" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..6bdd502 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,22 @@ +[tool.poetry] +authors = ["Your Name "] +description = "" +name = "farmsubsidy-scrapers" +readme = "README.md" +version = "0.1.0" + +[tool.poetry.dependencies] +click = "^8.1.7" +joblib = "^1.4.2" +python = "^3.10" +scrapy = "^2.12.0" + +[tool.poetry.group.dev.dependencies] +black = "^24.10.0" + +[build-system] +build-backend = "poetry.core.masonry.api" +requires = ["poetry-core"] + +[tool.poetry.scripts] +run = "cli:cli" From 6a4d5b8e876636a2bb2c92e612b99ee9e18e3355 Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Mon, 9 Dec 2024 18:16:59 +0100 Subject: [PATCH 25/38] Add file download --- cli.py | 20 ++++++++++++------ countries/at/run.py | 22 ++++++++++++-------- poetry.lock | 23 ++++++++++++++++++++- pyproject.toml | 2 ++ utils/__init__.py | 0 utils/download.py | 50 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 102 insertions(+), 15 deletions(-) create mode 100644 utils/__init__.py create mode 100644 utils/download.py diff --git a/cli.py b/cli.py index cb81aa8..b5285bb 100644 --- a/cli.py +++ b/cli.py @@ -1,22 +1,29 @@ """ CLI commands """ + import importlib +import pathlib + import click DEFAULT_YEAR = 2022 +DATA_DIR = "data" + @click.command() -@click.argument('country') -@click.argument('year') +@click.argument("country") +@click.argument("year") def cli(country=None, year=DEFAULT_YEAR): """Download farm subsidy data for specified country and year.""" - print(f'Downloading data for {country} in {year}') + print(f"Downloading data for {country} in {year}") try: # Dynamically import the country module - country_module = importlib.import_module(f'countries.{country}.run') - return country_module.run(year) + country_module = importlib.import_module(f"countries.{country}.run") + options = {"data_dir": pathlib.Path(DATA_DIR)} + + return country_module.run(year, **options) except ImportError: print(f"Error: Country module '{country}' not found") return 1 @@ -24,5 +31,6 @@ def cli(country=None, year=DEFAULT_YEAR): print(f"Error downloading data: {e}") return 1 -if __name__ == '__main__': + +if __name__ == "__main__": cli() diff --git a/countries/at/run.py b/countries/at/run.py index 9c5eabd..8a79baf 100644 --- a/countries/at/run.py +++ b/countries/at/run.py @@ -1,13 +1,19 @@ +""" +Austria +""" +import os +from utils.download import download_file +BASE_URL = "https://www.transparenz.at/export/Export_%s.zip" +DATA_FILE = "Daten.json" -base_url = 'https://www.transparenz.at/export/Export_%s.zip' -def download(url): - pass - -def run(year): - url = base_url % year - print('Downloading from %s' % url) - return base_url +def run(year, data_dir): + """ + Austria data download + """ + url = BASE_URL % year + dl_dir = os.path.join(data_dir, "raw", "at", year) + download_file(url, dl_dir) diff --git a/poetry.lock b/poetry.lock index 409312a..ca9ff68 100644 --- a/poetry.lock +++ b/poetry.lock @@ -996,6 +996,27 @@ files = [ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] +[[package]] +name = "tqdm" +version = "4.67.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + [[package]] name = "twisted" version = "24.10.0" @@ -1127,4 +1148,4 @@ testing = ["coverage[toml]", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "09e52e1b9f042ea4c44f6ce4e09328535901965f87ef221f505cd90404a6e1d0" +content-hash = "2689c5d69eee9c6f468e263318ce8b77854f5836e0e384427652d9bd19378cbe" diff --git a/pyproject.toml b/pyproject.toml index 6bdd502..40de792 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,9 @@ version = "0.1.0" click = "^8.1.7" joblib = "^1.4.2" python = "^3.10" +requests = "^2.32.3" scrapy = "^2.12.0" +tqdm = "^4.67.1" [tool.poetry.group.dev.dependencies] black = "^24.10.0" diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/download.py b/utils/download.py new file mode 100644 index 0000000..ddb6f07 --- /dev/null +++ b/utils/download.py @@ -0,0 +1,50 @@ +""" +Download a file from a URL and extract it to a folder. +""" + +import os +import pathlib +import shutil + +import requests +from tqdm import tqdm + +CHUNK_SIZE = 1024 * 8 +TIMEOUT = 10 + + +def download_file(url, folder): + """ + Download a file from a URL and extract it to a folder. + """ + print(f"Downloading from {url}") + pathlib.Path(folder).mkdir(parents=True, exist_ok=True) + local_filename = url.split("/")[-1] + fn = os.path.join(folder, local_filename) + extract_folder = os.path.join(folder, "extracted") + + try: + if not os.path.exists(fn): + with requests.get(url, stream=True, timeout=TIMEOUT) as r: + r.raise_for_status() + total_len = r.headers.get("content-length", None) + total = int(total_len) / CHUNK_SIZE if total_len is not None else None + + with open(fn, "wb") as f: + for chunk in tqdm( + r.iter_content(chunk_size=CHUNK_SIZE), + total=total, + unit="KB", + desc=local_filename, + unit_scale=True, + ): + # If you have chunk encoded response uncomment if + # and set chunk_size parameter to None. + # if chunk: + f.write(chunk) + shutil.unpack_archive(fn, extract_folder) + except Exception as e: + shutil.rmtree(folder) + raise e + print(f"Successfully downloaded to {folder}") + return local_filename From e5c892c96d62159582b3eb0d3fbbd98dfbcfdfde Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Wed, 11 Dec 2024 00:52:19 +0100 Subject: [PATCH 26/38] Add file processing --- countries/at/run.py | 71 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/countries/at/run.py b/countries/at/run.py index 8a79baf..9bf4eda 100644 --- a/countries/at/run.py +++ b/countries/at/run.py @@ -2,12 +2,33 @@ Austria """ +import csv +import gzip +import json import os +from pathlib import Path + +from tqdm import tqdm from utils.download import download_file BASE_URL = "https://www.transparenz.at/export/Export_%s.zip" DATA_FILE = "Daten.json" +SCHEMA_FILE = "Massnahmen.json" + +mappings = { + "hhj": "year", + "laufnr": "recipient_id", + "zahlungsempfaenger": "recipient_name", + "postleitzahl": "recipient_postcode", + "gemeinde": "recipient_location", +} + +payment_mappings = { + "bezeichnung": "scheme_name", + "textcode": "scheme_code", + "beschreibung": "scheme_description", +} def run(year, data_dir): @@ -16,4 +37,54 @@ def run(year, data_dir): """ url = BASE_URL % year dl_dir = os.path.join(data_dir, "raw", "at", year) + done_dir = os.path.join(data_dir, "done", "at", year) download_file(url, dl_dir) + + # prepare schema dict + schema_raw = json.loads( + (Path(dl_dir) / "extracted" / SCHEMA_FILE).read_text(encoding="UTF-8"), + ) + schema = {} + for row in schema_raw: + row_fixed = row.copy() + del row_fixed["textid"] + # apply payment_mappings + for k, v in payment_mappings.items(): + row_fixed[v] = row_fixed[k] + del row_fixed[k] + + schema[row["textid"]] = row_fixed + + raw_data = json.loads( + (Path(dl_dir) / "extracted" / DATA_FILE).read_text(encoding="UTF-8"), + ) + + base_row_data = {"year": year, "country": "AT", "currency": "EUR"} + + Path(done_dir).mkdir(parents=True, exist_ok=True) + with gzip.open(Path(done_dir) / "data.csv.gz", "wt") as f: + fns = ( + list(mappings.values()) + + list(base_row_data.keys()) + + list(payment_mappings.values()) + + ["amount"] + ) + + writer = csv.DictWriter(f, fieldnames=fns) + writer.writeheader() + + for row in tqdm(raw_data, desc="Processing data"): + row_base_done = base_row_data.copy() + for k, v in mappings.items(): + row_base_done[v] = row[k] + + for payment in row["zahlungen"]: + row_done = row_base_done.copy() + row_done["amount"] = ( + payment["betragEgfl"] + + payment["betragEler"] + + payment["betragKofinanzierung"] + ) + row_done.update(schema[payment["textid"]]) + + writer.writerow(row_done) From 12117e2b62f8b53d5fd4e054997305ad9ce33959 Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Thu, 12 Dec 2024 12:18:40 +0100 Subject: [PATCH 27/38] Add description for hard-to-automate exports --- countries/bg/README.md | 11 +- countries/bg/bg_scraper.ipynb | 448 -------- countries/dk/README.md | 13 +- countries/fi/README.md | 11 +- poetry.lock | 2010 ++++++++++++++++++++++++++++++++- pyproject.toml | 3 + 6 files changed, 1990 insertions(+), 506 deletions(-) delete mode 100644 countries/bg/bg_scraper.ipynb diff --git a/countries/bg/README.md b/countries/bg/README.md index 1c329c8..df4ef57 100644 --- a/countries/bg/README.md +++ b/countries/bg/README.md @@ -1,6 +1,9 @@ -Scraper for Bulgaria -========================= +# Bulgaria - +## How to get the data -Scraper notebook available. +1. Use Chrome to auto translate to English. +2. Visit +3. Select year +4. Go to 'action' -> 'download file' -> 'download csv' +5. Place the resulting file into `data/raw/bg/$year`. diff --git a/countries/bg/bg_scraper.ipynb b/countries/bg/bg_scraper.ipynb deleted file mode 100644 index 7e0e6f8..0000000 --- a/countries/bg/bg_scraper.ipynb +++ /dev/null @@ -1,448 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import glob\n", - "import math\n", - "from collections import defaultdict\n", - "\n", - "import requests\n", - "from lxml import html\n", - "from tqdm import tqdm\n", - "\n", - "import pandas as pd\n", - "from slugify import slugify" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "YEARS = [2015, 2016]" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "BASE_URL = 'http://iacs-online.dfz.bg/apex/f'\n", - "\n", - "def download_year(year):\n", - "# import pdb; pdb.set_trace()\n", - " print('Initial %d' % year)\n", - " session = requests.Session()\n", - " response = session.get(BASE_URL, params={'p': '100:1:2519959547410070'}) # initial instance\n", - " instance_id = response.url.split(':')[-1]\n", - " print(instance_id)\n", - " rows_per_page = 10000\n", - "\n", - " # 10000000 is max count\n", - " data = '''p_flow_id:100\n", - " p_flow_step_id:1\n", - " p_instance:{instance_id}\n", - " p_page_submission_id:440674281878682\n", - " p_request:APPLY_SEARCH\n", - " p_arg_names:13020010139748916\n", - " p_t01:\n", - " p_arg_names:13024311094768143\n", - " p_t02:\n", - " p_arg_names:13025631311783482\n", - " p_t03:GT\n", - " p_arg_names:13027400751793490\n", - " p_t04:\n", - " p_arg_names:13031001171749357\n", - " p_t05:TOTAL\n", - " p_arg_names:13043117504858129\n", - " p_t06:{rows_per_page}\n", - " p_arg_names:67245119208950917\n", - " p_t07:{year}\n", - " p_md5_checksum:'''.format(instance_id=instance_id, year=year, rows_per_page=rows_per_page).splitlines()\n", - " data = [[k.strip() for k in x.split(':')] for x in data]\n", - " post_data = defaultdict(list)\n", - " for k, v in data:\n", - " post_data[k].append(v)\n", - "# import pdb; pdb.set_trace()\n", - " print('Searching...')\n", - " response = session.post('http://iacs-online.dfz.bg/apex/wwv_flow.accept', data=post_data)\n", - " \n", - " root = html.fromstring(response.content)\n", - " count = root.xpath('//span[@class=\"fielddata\"]/text()')[0]\n", - " result_rows = int(count.split()[-1])\n", - " max_pages = math.ceil(result_rows / rows_per_page)\n", - " print(result_rows, max_pages)\n", - " # http://iacs-online.dfz.bg/apex/f?p=100:1:897845325062580::NO:::\n", - " # http://iacs-online.dfz.bg/apex/f?p=100:1:897845325062580:FLOW_EXCEL_OUTPUT_R7009528473046037_bg\n", - "\n", - " # args = response.url.split('=')[-1]\n", - " # args = args.replace('::NO:::', '')\n", - " # args += ':FLOW_EXCEL_OUTPUT_R7009528473046037_bg'\n", - " # url = '?p=' + args\n", - " print('Downloading...')\n", - " \n", - " page = 1\n", - " for page in tqdm(range(1, max_pages + 1)):\n", - " page_data = {\n", - " 'p': '100:1:{instance_id}:pg_R_7009528473046037:NO'.format(instance_id=instance_id),\n", - " 'pg_min_row': str((page - 1) * rows_per_page + 1),\n", - " 'pg_max_rows': str(rows_per_page),\n", - " 'pg_rows_fetched': str(rows_per_page),\n", - " }\n", - " response = session.get(BASE_URL, params=page_data)\n", - " yield get_rows(response, year)\n", - "\n", - "\n", - "def get_rows(response, year):\n", - " root = html.fromstring(response.content)\n", - " table = root.xpath('//table[@class=\"t3standard\"]')[0]\n", - " rows = table.xpath('./tr')[1:-1]\n", - " mapping = 'recipient_name\tdistrict\tmunicipality\tEAGF DP\tEAGF\tEAFRD - ND\tPublic storage\tTotal\tMeasure\tDescription'.split('\\t')\n", - " for row in rows:\n", - " cells = row.xpath('.//td/text()')\n", - " row = dict(zip(mapping, cells))\n", - " base_info = {\n", - " 'recipient_id': slugify('BG-%s-%s-%s' % (row['recipient_name'], row['municipality'], row['district'])),\n", - " 'recipient_name': row['recipient_name'],\n", - " 'recipient_location': '%s, %s' % (row['municipality'], row['district']),\n", - " 'recipient_postcode': None,\n", - " 'recipient_address': None,\n", - " 'country': 'BG',\n", - " }\n", - " for key in ('EAGF DP', 'EAGF', 'EAFRD - ND'):\n", - " amount = float(row[key].replace(',', ''))\n", - " if amount == 0.0:\n", - " continue\n", - " d = {\n", - " 'amount': amount,\n", - " 'year': year,\n", - " 'currency': 'BGN',\n", - " 'scheme': '%s - %s - %s' % (key, row['Measure'].strip(), row['Description'].strip())\n", - " }\n", - " d.update(base_info)\n", - " yield d\n" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "!mkdir -p data" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "YEAR = 2017\n", - "\n", - "def get_year(year):\n", - " page_generator = download_year(year)\n", - " for i, row_generator in enumerate(page_generator):\n", - " df = pd.DataFrame(row_generator)\n", - " df.to_csv('data/BG_{}_{}.csv.gz'.format(year, i), index=False, compression='gzip')" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial 2017\n", - "3391091644796414\n", - "Searching...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - "\n", - " 0%| | 0/37 [00:00\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
amountcountrycurrencyrecipient_addressrecipient_idrecipient_locationrecipient_namerecipient_postcodeschemeyear
0356.49BGBGNNaNbg-mekhmed-ademov-omurtag-trgovishcheОмуртаг, ТърговищеМЕХМЕД АДЕМОВNaNEAGF DP - СПП - Схема за преразпределително пл...2017
1507.53BGBGNNaNbg-mekhmed-ademov-omurtag-trgovishcheОмуртаг, ТърговищеМЕХМЕД АДЕМОВNaNEAGF DP - ДПЖ - Схема за обвързано подпомагане...2017
2305.33BGBGNNaNbg-mekhmed-ademov-omurtag-trgovishcheОмуртаг, ТърговищеМЕХМЕД АДЕМОВNaNEAGF DP - Схема за плащане за селскостопански ...2017
31370.33BGBGNNaNbg-mekhmed-adil-alfatar-silistraАлфатар, СилистраМЕХМЕД АДИЛNaNEAGF DP - ДПЖ - Схема за обвързано подпомагане...2017
4162.00BGBGNNaNbg-mekhmed-adil-alfatar-silistraАлфатар, СилистраМЕХМЕД АДИЛNaNEAFRD - ND - Държавна помощ de minimis, съглас...2017
\n", - "" - ], - "text/plain": [ - " amount country currency recipient_address \\\n", - "0 356.49 BG BGN NaN \n", - "1 507.53 BG BGN NaN \n", - "2 305.33 BG BGN NaN \n", - "3 1370.33 BG BGN NaN \n", - "4 162.00 BG BGN NaN \n", - "\n", - " recipient_id recipient_location recipient_name \\\n", - "0 bg-mekhmed-ademov-omurtag-trgovishche Омуртаг, Търговище МЕХМЕД АДЕМОВ \n", - "1 bg-mekhmed-ademov-omurtag-trgovishche Омуртаг, Търговище МЕХМЕД АДЕМОВ \n", - "2 bg-mekhmed-ademov-omurtag-trgovishche Омуртаг, Търговище МЕХМЕД АДЕМОВ \n", - "3 bg-mekhmed-adil-alfatar-silistra Алфатар, Силистра МЕХМЕД АДИЛ \n", - "4 bg-mekhmed-adil-alfatar-silistra Алфатар, Силистра МЕХМЕД АДИЛ \n", - "\n", - " recipient_postcode scheme year \n", - "0 NaN EAGF DP - СПП - Схема за преразпределително пл... 2017 \n", - "1 NaN EAGF DP - ДПЖ - Схема за обвързано подпомагане... 2017 \n", - "2 NaN EAGF DP - Схема за плащане за селскостопански ... 2017 \n", - "3 NaN EAGF DP - ДПЖ - Схема за обвързано подпомагане... 2017 \n", - "4 NaN EAFRD - ND - Държавна помощ de minimis, съглас... 2017 " - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = pd.concat([pd.read_csv(fn, compression='gzip') for fn in glob.glob('data/BG_{}_*.csv.gz'.format(YEAR))])\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "df.to_csv('bg_%s.csv.gz' % YEAR, index=False, encoding='utf-8', compression='gzip')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/countries/dk/README.md b/countries/dk/README.md index cfe1b1a..3f2e79e 100644 --- a/countries/dk/README.md +++ b/countries/dk/README.md @@ -1,8 +1,9 @@ -Scraper for Denmark -========================= +# Denmark - +## How to get the data -Download works. - -See scraper/cleaning notebook. +1. Go to https://stoetteoplysninger.naturerhverv.dk/ords/capp/f?p=101:2:14473151364280::::: +2. Select the right year +3. Hit 'search' +4. Download via 'export data to spreadsheet' +5. Import diff --git a/countries/fi/README.md b/countries/fi/README.md index 0788248..12344c7 100644 --- a/countries/fi/README.md +++ b/countries/fi/README.md @@ -1,8 +1,7 @@ -Scraper for Finland -========================= +# Finland - +## How to get the data -Anything but in-browser scraper seems to be quite difficult. - -FOIA request send on 5th of May to tiedonluovutus@mavi.fi +1. Visit +2. In the sheet, click 'in English' +3. Click 'download csv' diff --git a/poetry.lock b/poetry.lock index ca9ff68..9c7e262 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,143 @@ # This file is automatically @generated by Poetry 1.8.0 and should not be changed by hand. +[[package]] +name = "anyio" +version = "4.7.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +files = [ + {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, + {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.6" +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "arrow" +version = "1.3.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] + +[[package]] +name = "asttokens" +version = "3.0.0" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, + {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, +] + +[package.extras] +astroid = ["astroid (>=2,<4)"] +test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "async-lru" +version = "2.0.4" +description = "Simple LRU cache for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + [[package]] name = "attrs" version = "24.2.0" @@ -33,6 +171,41 @@ files = [ [package.extras] visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] +[[package]] +name = "babel" +version = "2.16.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "black" version = "24.10.0" @@ -79,6 +252,23 @@ d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "bleach" +version = "6.2.0" +description = "An easy safelist-based HTML-sanitizing tool." +optional = false +python-versions = ">=3.9" +files = [ + {file = "bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e"}, + {file = "bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"}, +] + +[package.dependencies] +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.5)"] + [[package]] name = "certifi" version = "2024.8.30" @@ -308,6 +498,23 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "comm" +version = "0.2.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + [[package]] name = "constantly" version = "23.10.4" @@ -381,6 +588,52 @@ files = [ {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, ] +[[package]] +name = "debugpy" +version = "1.8.9" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.9-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:cfe1e6c6ad7178265f74981edf1154ffce97b69005212fbc90ca22ddfe3d017e"}, + {file = "debugpy-1.8.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada7fb65102a4d2c9ab62e8908e9e9f12aed9d76ef44880367bc9308ebe49a0f"}, + {file = "debugpy-1.8.9-cp310-cp310-win32.whl", hash = "sha256:c36856343cbaa448171cba62a721531e10e7ffb0abff838004701454149bc037"}, + {file = "debugpy-1.8.9-cp310-cp310-win_amd64.whl", hash = "sha256:17c5e0297678442511cf00a745c9709e928ea4ca263d764e90d233208889a19e"}, + {file = "debugpy-1.8.9-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:b74a49753e21e33e7cf030883a92fa607bddc4ede1aa4145172debc637780040"}, + {file = "debugpy-1.8.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d22dacdb0e296966d7d74a7141aaab4bec123fa43d1a35ddcb39bf9fd29d70"}, + {file = "debugpy-1.8.9-cp311-cp311-win32.whl", hash = "sha256:8138efff315cd09b8dcd14226a21afda4ca582284bf4215126d87342bba1cc66"}, + {file = "debugpy-1.8.9-cp311-cp311-win_amd64.whl", hash = "sha256:ff54ef77ad9f5c425398efb150239f6fe8e20c53ae2f68367eba7ece1e96226d"}, + {file = "debugpy-1.8.9-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:957363d9a7a6612a37458d9a15e72d03a635047f946e5fceee74b50d52a9c8e2"}, + {file = "debugpy-1.8.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e565fc54b680292b418bb809f1386f17081d1346dca9a871bf69a8ac4071afe"}, + {file = "debugpy-1.8.9-cp312-cp312-win32.whl", hash = "sha256:3e59842d6c4569c65ceb3751075ff8d7e6a6ada209ceca6308c9bde932bcef11"}, + {file = "debugpy-1.8.9-cp312-cp312-win_amd64.whl", hash = "sha256:66eeae42f3137eb428ea3a86d4a55f28da9bd5a4a3d369ba95ecc3a92c1bba53"}, + {file = "debugpy-1.8.9-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:957ecffff80d47cafa9b6545de9e016ae8c9547c98a538ee96ab5947115fb3dd"}, + {file = "debugpy-1.8.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1efbb3ff61487e2c16b3e033bc8595aea578222c08aaf3c4bf0f93fadbd662ee"}, + {file = "debugpy-1.8.9-cp313-cp313-win32.whl", hash = "sha256:7c4d65d03bee875bcb211c76c1d8f10f600c305dbd734beaed4077e902606fee"}, + {file = "debugpy-1.8.9-cp313-cp313-win_amd64.whl", hash = "sha256:e46b420dc1bea64e5bbedd678148be512442bc589b0111bd799367cde051e71a"}, + {file = "debugpy-1.8.9-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:472a3994999fe6c0756945ffa359e9e7e2d690fb55d251639d07208dbc37caea"}, + {file = "debugpy-1.8.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:365e556a4772d7d0d151d7eb0e77ec4db03bcd95f26b67b15742b88cacff88e9"}, + {file = "debugpy-1.8.9-cp38-cp38-win32.whl", hash = "sha256:54a7e6d3014c408eb37b0b06021366ee985f1539e12fe49ca2ee0d392d9ceca5"}, + {file = "debugpy-1.8.9-cp38-cp38-win_amd64.whl", hash = "sha256:8e99c0b1cc7bf86d83fb95d5ccdc4ad0586d4432d489d1f54e4055bcc795f693"}, + {file = "debugpy-1.8.9-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:7e8b079323a56f719977fde9d8115590cb5e7a1cba2fcee0986ef8817116e7c1"}, + {file = "debugpy-1.8.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6953b335b804a41f16a192fa2e7851bdcfd92173cbb2f9f777bb934f49baab65"}, + {file = "debugpy-1.8.9-cp39-cp39-win32.whl", hash = "sha256:7e646e62d4602bb8956db88b1e72fe63172148c1e25c041e03b103a25f36673c"}, + {file = "debugpy-1.8.9-cp39-cp39-win_amd64.whl", hash = "sha256:3d9755e77a2d680ce3d2c5394a444cf42be4a592caaf246dbfbdd100ffcf7ae5"}, + {file = "debugpy-1.8.9-py2.py3-none-any.whl", hash = "sha256:cc37a6c9987ad743d9c3a14fa1b1a14b7e4e6041f9dd0c8abf8895fe7a97b899"}, + {file = "debugpy-1.8.9.zip", hash = "sha256:1339e14c7d980407248f09824d1b25ff5c5616651689f1e0f0e51bdead3ea13e"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + [[package]] name = "defusedxml" version = "0.7.1" @@ -392,6 +645,48 @@ files = [ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.1.0" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.8" +files = [ + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fastjsonschema" +version = "2.21.1" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +files = [ + {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, + {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + [[package]] name = "filelock" version = "3.16.1" @@ -408,6 +703,73 @@ docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2. testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] typing = ["typing-extensions (>=4.12.2)"] +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, + {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + +[[package]] +name = "httpx" +version = "0.28.1" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + [[package]] name = "hyperlink" version = "21.0.0" @@ -454,6 +816,91 @@ tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] scripts = ["click (>=6.0)"] +[[package]] +name = "ipykernel" +version = "6.29.5" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.30.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +files = [ + {file = "ipython-8.30.0-py3-none-any.whl", hash = "sha256:85ec56a7e20f6c38fce7727dcca699ae4ffc85985aa7b23635a8008f918ae321"}, + {file = "ipython-8.30.0.tar.gz", hash = "sha256:cb0a405a306d2995a5cbb9901894d240784a9f341394c6ba3f4fe8c6eb89ff6e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt_toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack_data = "*" +traitlets = ">=5.13.0" +typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[package.dependencies] +arrow = ">=0.15.0" + [[package]] name = "itemadapter" version = "0.9.0" @@ -481,6 +928,42 @@ itemadapter = ">=0.1.0" jmespath = ">=0.9.5" parsel = ">=1.5.0" +[[package]] +name = "jedi" +version = "0.19.2" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, +] + +[package.dependencies] +parso = ">=0.8.4,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + [[package]] name = "jmespath" version = "1.0.1" @@ -504,46 +987,320 @@ files = [ ] [[package]] -name = "lxml" -version = "5.3.0" -description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +name = "json5" +version = "0.10.0" +description = "A Python implementation of the JSON5 data format." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8.0" files = [ - {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656"}, - {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32"}, - {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86"}, - {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5"}, - {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03"}, - {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7"}, - {file = "lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80"}, - {file = "lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3"}, - {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b"}, - {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654"}, - {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d"}, - {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763"}, - {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec"}, - {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be"}, - {file = "lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9"}, - {file = "lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1"}, + {file = "json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa"}, + {file = "json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559"}, +] + +[package.extras] +dev = ["build (==1.2.2.post1)", "coverage (==7.5.3)", "mypy (==1.13.0)", "pip (==24.3.1)", "pylint (==3.2.3)", "ruff (==0.7.3)", "twine (==5.1.1)", "uv (==0.5.1)"] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rpds-py = ">=0.7.1" +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=24.6.0", optional = true, markers = "extra == \"format-nongpl\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2024.10.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +files = [ + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter-client" +version = "8.6.3" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, +] + +[package.dependencies] +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-events" +version = "0.10.0" +description = "Jupyter Event System library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, + {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, +] + +[package.dependencies] +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} +python-json-logger = ">=2.0.4" +pyyaml = ">=5.3" +referencing = "*" +rfc3339-validator = "*" +rfc3986-validator = ">=0.1.1" +traitlets = ">=5.3" + +[package.extras] +cli = ["click", "rich"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] + +[[package]] +name = "jupyter-lsp" +version = "2.2.5" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, + {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, +] + +[package.dependencies] +jupyter-server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.14.2" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server-2.14.2-py3-none-any.whl", hash = "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd"}, + {file = "jupyter_server-2.14.2.tar.gz", hash = "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b"}, +] + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = ">=21.1" +jinja2 = ">=3.0.3" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-events = ">=0.9.0" +jupyter-server-terminals = ">=0.4.4" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +overrides = ">=5.0" +packaging = ">=22.0" +prometheus-client = ">=0.9" +pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = ">=1.8.2" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = ">=1.7" + +[package.extras] +docs = ["ipykernel", "jinja2", "jupyter-client", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.3" +description = "A Jupyter Server Extension Providing Terminals." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, + {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, +] + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyterlab" +version = "4.3.3" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab-4.3.3-py3-none-any.whl", hash = "sha256:32a8fd30677e734ffcc3916a4758b9dab21b02015b668c60eb36f84357b7d4b1"}, + {file = "jupyterlab-4.3.3.tar.gz", hash = "sha256:76fa39e548fdac94dc1204af5956c556f54c785f70ee26aa47ea08eda4d5bbcd"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +httpx = ">=0.25.0" +ipykernel = ">=6.5.0" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.27.1,<3" +notebook-shim = ">=0.2" +packaging = "*" +setuptools = ">=40.8.0" +tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.6.9)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<8.1.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.4.1)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.2.post3)", "matplotlib (==3.9.2)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.14.1)", "vega-datasets (==0.9.0)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] +upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +description = "Pygments theme using JupyterLab CSS variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.27.3" +description = "A set of server components for JupyterLab and JupyterLab like applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, + {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, +] + +[package.dependencies] +babel = ">=2.10" +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.18.0" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.31" + +[package.extras] +docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] +openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + +[[package]] +name = "lxml" +version = "5.3.0" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656"}, + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7"}, + {file = "lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80"}, + {file = "lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be"}, + {file = "lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9"}, + {file = "lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1"}, {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859"}, {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e"}, {file = "lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f"}, @@ -657,6 +1414,101 @@ html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=3.0.11)"] +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mistune" +version = "3.0.2" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, +] + [[package]] name = "mypy-extensions" version = "1.0.0" @@ -668,6 +1520,189 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "nbclient" +version = "0.10.1" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "nbclient-0.10.1-py3-none-any.whl", hash = "sha256:949019b9240d66897e442888cfb618f69ef23dc71c01cb5fced8499c2cfc084d"}, + {file = "nbclient-0.10.1.tar.gz", hash = "sha256:3e93e348ab27e712acd46fccd809139e356eb9a31aab641d1a7991a6eb4e6f68"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +nbformat = ">=5.1" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.16.4" +description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, + {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "!=5.0.0" +defusedxml = "*" +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.1" + +[package.extras] +all = ["flaky", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (==5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] +docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["pyqtwebengine (>=5.15)"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.10.4" +description = "The Jupyter Notebook format" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, +] + +[package.dependencies] +fastjsonschema = ">=2.15" +jsonschema = ">=2.6" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +description = "A shim layer for notebook traits and config" +optional = false +python-versions = ">=3.7" +files = [ + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, +] + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] + +[[package]] +name = "numpy" +version = "2.2.0" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.10" +files = [ + {file = "numpy-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa"}, + {file = "numpy-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219"}, + {file = "numpy-2.2.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e"}, + {file = "numpy-2.2.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9"}, + {file = "numpy-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3"}, + {file = "numpy-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83"}, + {file = "numpy-2.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a"}, + {file = "numpy-2.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31"}, + {file = "numpy-2.2.0-cp310-cp310-win32.whl", hash = "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661"}, + {file = "numpy-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4"}, + {file = "numpy-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6"}, + {file = "numpy-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90"}, + {file = "numpy-2.2.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608"}, + {file = "numpy-2.2.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da"}, + {file = "numpy-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74"}, + {file = "numpy-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e"}, + {file = "numpy-2.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b"}, + {file = "numpy-2.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d"}, + {file = "numpy-2.2.0-cp311-cp311-win32.whl", hash = "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410"}, + {file = "numpy-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73"}, + {file = "numpy-2.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3"}, + {file = "numpy-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e"}, + {file = "numpy-2.2.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67"}, + {file = "numpy-2.2.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e"}, + {file = "numpy-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038"}, + {file = "numpy-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03"}, + {file = "numpy-2.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a"}, + {file = "numpy-2.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef"}, + {file = "numpy-2.2.0-cp312-cp312-win32.whl", hash = "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1"}, + {file = "numpy-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3"}, + {file = "numpy-2.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367"}, + {file = "numpy-2.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae"}, + {file = "numpy-2.2.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69"}, + {file = "numpy-2.2.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13"}, + {file = "numpy-2.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671"}, + {file = "numpy-2.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571"}, + {file = "numpy-2.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d"}, + {file = "numpy-2.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742"}, + {file = "numpy-2.2.0-cp313-cp313-win32.whl", hash = "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e"}, + {file = "numpy-2.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2"}, + {file = "numpy-2.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95"}, + {file = "numpy-2.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c"}, + {file = "numpy-2.2.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca"}, + {file = "numpy-2.2.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d"}, + {file = "numpy-2.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529"}, + {file = "numpy-2.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3"}, + {file = "numpy-2.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab"}, + {file = "numpy-2.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72"}, + {file = "numpy-2.2.0-cp313-cp313t-win32.whl", hash = "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066"}, + {file = "numpy-2.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881"}, + {file = "numpy-2.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773"}, + {file = "numpy-2.2.0-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e"}, + {file = "numpy-2.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7"}, + {file = "numpy-2.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221"}, + {file = "numpy-2.2.0.tar.gz", hash = "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0"}, +] + +[[package]] +name = "overrides" +version = "7.7.0" +description = "A decorator to automatically detect mismatch when overriding a method." +optional = false +python-versions = ">=3.6" +files = [ + {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, + {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, +] + [[package]] name = "packaging" version = "24.2" @@ -679,6 +1714,103 @@ files = [ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] +[[package]] +name = "pandas" +version = "2.2.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +description = "Utilities for writing pandoc filters in python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, +] + [[package]] name = "parsel" version = "1.9.1" @@ -697,17 +1829,46 @@ lxml = "*" packaging = "*" w3lib = ">=1.19.0" +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + [[package]] name = "pathspec" version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.8" +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] +[package.dependencies] +ptyprocess = ">=0.5" + [[package]] name = "platformdirs" version = "4.3.6" @@ -724,6 +1885,34 @@ docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-a test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] type = ["mypy (>=1.11.2)"] +[[package]] +name = "prometheus-client" +version = "0.21.1" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.8" +files = [ + {file = "prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301"}, + {file = "prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.48" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, +] + +[package.dependencies] +wcwidth = "*" + [[package]] name = "protego" version = "0.3.1" @@ -735,6 +1924,61 @@ files = [ {file = "Protego-0.3.1.tar.gz", hash = "sha256:e94430d0d25cbbf239bc849d86c5e544fbde531fcccfa059953c7da344a1712c"}, ] +[[package]] +name = "psutil" +version = "6.1.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, +] + +[package.extras] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] + [[package]] name = "pyasn1" version = "0.6.1" @@ -785,6 +2029,20 @@ files = [ [package.extras] dev = ["tox"] +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + [[package]] name = "pyopenssl" version = "24.3.0" @@ -813,6 +2071,284 @@ files = [ {file = "PyPyDispatcher-2.1.2.tar.gz", hash = "sha256:b6bec5dfcff9d2535bca2b23c80eae367b1ac250a645106948d315fcfa9130f2"}, ] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-json-logger" +version = "2.0.7" +description = "A python library adding a json log formatter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] + +[[package]] +name = "python-slugify" +version = "8.0.4" +description = "A Python slugify application that also handles Unicode" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, + {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, +] + +[package.dependencies] +text-unidecode = ">=1.3" + +[package.extras] +unidecode = ["Unidecode (>=1.1.1)"] + +[[package]] +name = "pytz" +version = "2024.2" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, +] + +[[package]] +name = "pywin32" +version = "308" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, +] + +[[package]] +name = "pywinpty" +version = "2.0.14" +description = "Pseudo terminal support for Windows from Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pywinpty-2.0.14-cp310-none-win_amd64.whl", hash = "sha256:0b149c2918c7974f575ba79f5a4aad58bd859a52fa9eb1296cc22aa412aa411f"}, + {file = "pywinpty-2.0.14-cp311-none-win_amd64.whl", hash = "sha256:cf2a43ac7065b3e0dc8510f8c1f13a75fb8fde805efa3b8cff7599a1ef497bc7"}, + {file = "pywinpty-2.0.14-cp312-none-win_amd64.whl", hash = "sha256:55dad362ef3e9408ade68fd173e4f9032b3ce08f68cfe7eacb2c263ea1179737"}, + {file = "pywinpty-2.0.14-cp313-none-win_amd64.whl", hash = "sha256:074fb988a56ec79ca90ed03a896d40707131897cefb8f76f926e3834227f2819"}, + {file = "pywinpty-2.0.14-cp39-none-win_amd64.whl", hash = "sha256:5725fd56f73c0531ec218663bd8c8ff5acc43c78962fab28564871b5fce053fd"}, + {file = "pywinpty-2.0.14.tar.gz", hash = "sha256:18bd9529e4a5daf2d9719aa17788ba6013e594ae94c5a0c27e83df3278b0660e"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "pyzmq" +version = "26.2.0" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"}, + {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"}, + {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"}, + {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"}, + {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"}, + {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"}, + {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"}, + {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + [[package]] name = "queuelib" version = "1.7.0" @@ -824,6 +2360,21 @@ files = [ {file = "queuelib-1.7.0.tar.gz", hash = "sha256:2855162096cf0230510890b354379ea1c0ff19d105d3147d349d2433bb222b08"}, ] +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "requests" version = "2.32.3" @@ -859,6 +2410,143 @@ files = [ [package.dependencies] requests = ">=1.0.0" +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + +[[package]] +name = "rpds-py" +version = "0.22.3" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, + {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf"}, + {file = "rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652"}, + {file = "rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a"}, + {file = "rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64"}, + {file = "rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7"}, + {file = "rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627"}, + {file = "rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f"}, + {file = "rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de"}, + {file = "rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520"}, + {file = "rpds_py-0.22.3-cp39-cp39-win32.whl", hash = "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9"}, + {file = "rpds_py-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6"}, + {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, +] + [[package]] name = "scrapy" version = "2.12.0" @@ -890,6 +2578,22 @@ Twisted = ">=21.7.0" w3lib = ">=1.17.0" "zope.interface" = ">=5.1.0" +[[package]] +name = "send2trash" +version = "1.8.3" +description = "Send file to trash natively under Mac OS X, Windows and Linux" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, + {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, +] + +[package.extras] +nativelib = ["pyobjc-framework-Cocoa", "pywin32"] +objc = ["pyobjc-framework-Cocoa"] +win32 = ["pywin32"] + [[package]] name = "service-identity" version = "24.2.0" @@ -934,6 +2638,108 @@ enabler = ["pytest-enabler (>=2.2)"] test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "soupsieve" +version = "2.6" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "terminado" +version = "0.18.1" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, +] + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] + +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +optional = false +python-versions = "*" +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] + +[[package]] +name = "tinycss2" +version = "1.4.0" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, + {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pytest", "ruff"] + [[package]] name = "tldextract" version = "5.1.3" @@ -996,6 +2802,26 @@ files = [ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] +[[package]] +name = "tornado" +version = "6.4.2" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c"}, + {file = "tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482"}, + {file = "tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38"}, + {file = "tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b"}, +] + [[package]] name = "tqdm" version = "4.67.1" @@ -1017,6 +2843,21 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + [[package]] name = "twisted" version = "24.10.0" @@ -1052,6 +2893,17 @@ test = ["cython-test-exception-raiser (>=1.0.2,<2)", "httpx[http2] (>=0.27)", "h tls = ["idna (>=2.4)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)"] windows-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)", "twisted-iocpsupport (>=1.0.2)", "twisted-iocpsupport (>=1.0.2)"] +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20241206" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, + {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, +] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -1063,6 +2915,31 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +[[package]] +name = "tzdata" +version = "2024.2" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +description = "RFC 6570 URI Template Processor" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[package.extras] +dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] + [[package]] name = "urllib3" version = "2.2.3" @@ -1091,6 +2968,55 @@ files = [ {file = "w3lib-2.2.1.tar.gz", hash = "sha256:756ff2d94c64e41c8d7c0c59fea12a5d0bc55e33a531c7988b4a163deb9b07dd"}, ] +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "webcolors" +version = "24.11.1" +description = "A library for working with the color formats defined by HTML and CSS." +optional = false +python-versions = ">=3.9" +files = [ + {file = "webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9"}, + {file = "webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6"}, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + [[package]] name = "zope-interface" version = "7.2" @@ -1148,4 +3074,4 @@ testing = ["coverage[toml]", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "2689c5d69eee9c6f468e263318ce8b77854f5836e0e384427652d9bd19378cbe" +content-hash = "74868acfed3443318b7de6a3342fd89080f3550d2c3bafd949bd27896f1e6ce8" diff --git a/pyproject.toml b/pyproject.toml index 40de792..fcf25d1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,9 +12,12 @@ python = "^3.10" requests = "^2.32.3" scrapy = "^2.12.0" tqdm = "^4.67.1" +pandas = "^2.2.3" +python-slugify = "^8.0.4" [tool.poetry.group.dev.dependencies] black = "^24.10.0" +jupyterlab = "^4.3.3" [build-system] build-backend = "poetry.core.masonry.api" From b7ac44f95bf9d286743fd4ca6dd1cf23ab2a376b Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Thu, 12 Dec 2024 16:45:51 +0100 Subject: [PATCH 28/38] Add new RO scraper --- countries/ro/README.md | 11 +- countries/ro/scraper.py | 122 ----------------------- scrapy_fs/README.md | 8 +- scrapy_fs/scrapy_fs/items.py | 25 ++--- scrapy_fs/scrapy_fs/settings.py | 27 ++++- scrapy_fs/scrapy_fs/spiders/ro_spider.py | 120 ++++++++++++++++++++++ 6 files changed, 160 insertions(+), 153 deletions(-) delete mode 100644 countries/ro/scraper.py create mode 100644 scrapy_fs/scrapy_fs/spiders/ro_spider.py diff --git a/countries/ro/README.md b/countries/ro/README.md index f5ddabb..0b23a87 100644 --- a/countries/ro/README.md +++ b/countries/ro/README.md @@ -1,10 +1 @@ -Scraper for Romania -========================= - -Possibly somewhere here: - - - - - -No scraper available yet. +# Romania diff --git a/countries/ro/scraper.py b/countries/ro/scraper.py deleted file mode 100644 index 0aaddb5..0000000 --- a/countries/ro/scraper.py +++ /dev/null @@ -1,122 +0,0 @@ -from datetime import datetime -import csv -import os -import asyncio - -import aiohttp -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.common.by import By -from selenium.webdriver.support.ui import Select -from selenium.webdriver.support import expected_conditions as EC - -import scrapa -from scrapa.selenium import SeleniumMixin - - -class ROScraper(SeleniumMixin, scrapa.Scraper): - BASE_URL = 'http://plati.afir.info/ListePlatiFegaFeadr.aspx' - CONSUMER_COUNT = 1 - - async def start(self): - await self.schedule_many(self.download_year, [2014, 2015]) - - async def get_first_page(self, year): - already_page = 0 - while True: - already_page += 1 - has_page = await self.has_result('%s-%s' % (year, already_page), 'page_data') - if not has_page: - break - return already_page - - @scrapa.store - async def download_year(self, year): - def wait_for_load(session): - WebDriverWait(session.driver, 90).until( - EC.presence_of_element_located((By.XPATH, './/body[not(@class)]'))) - print('Running with', year) - - first_page = await self.get_first_page(year) - ready = True - - if first_page != 1: - ready = False - - with self.selenium(driver_name='phantomjs') as session: - # session.driver.set_window_size(1132, 800) - await session.get(self.BASE_URL) - print('Selecting year', year) - select = Select(session.driver.find_element_by_id("FILTER_AN_FINANCIAR")) - select.select_by_visible_text(str(year)) - session.driver.find_element_by_id('FILTER_BUTTON').click() - await asyncio.sleep(1) - wait_for_load(session) - select = Select(session.driver.find_element_by_id("FILTER_AN_FINANCIAR")) - print('Selected year is', select.first_selected_option.text) - print('Setting order') - order_heading = session.find_elements_by_xpath('.//table[@id="GridView1"]//th')[1] - print(order_heading.text) - order_heading.el.click() - await asyncio.sleep(2) - wait_for_load(session) - print('Starting on page 1') - page_no = 1 - while True: - try: - dom = session.dom() - if not ready: - # Find correct page link site - links = session.driver.find_elements_by_xpath('.//a[contains(@href, "Page$%s")]' % first_page) - if not links: - print('Could not find', first_page, 'advancing...') - # Fail, advance as to next pagination section - session.driver.find_elements_by_xpath('.//a[contains(@href, "Page$")]')[-1].click() - else: - # Success, we are ready to scrape, go to first page - print('Found', first_page, 'start scraping...') - ready = True - links[0].click() - page_no = first_page - - wait_for_load(session) - continue - - print('Saving table %s' % page_no) - await self.save_table(year, dom) - page_no += 1 - links = session.driver.find_elements_by_xpath('.//a[contains(@href, "Page$%s")]' % page_no) - if not links: - print('Found no more pagination links at', page_no) - break - print('Going to page %s' % page_no) - links[0].click() - wait_for_load(session) - except Exception as e: - print(e) - await asyncio.sleep(2) - - async def save_table(self, year, dom): - # 'Denumire beneficiar Cod unic Localitate Fond Masura Cuantum'.split() - COL_NAMES = ('recipient_name', 'recipient_id', 'recipient_location', 'scheme_1', 'scheme_2', 'amount') - table = dom.xpath('//table[@id="GridView1"]')[0] - rows = table.xpath('./tbody/tr') - page_no = int(rows[-1].xpath('.//td/span/text()')[0]) - data = [] - for row in rows[1:-1]: - texts = row.xpath('./td/text()') - d = dict(zip(COL_NAMES, texts)) - d['year'] = year - d['currency'] = 'EUR' - d['country'] = 'RO' - data.append(d) - key = '%s-%s' % (year, page_no) - await self.store_result(key, 'page_data', data) - - -def main(): - scraper = ROScraper() - scraper.run_from_cli() - - -if __name__ == '__main__': - main() diff --git a/scrapy_fs/README.md b/scrapy_fs/README.md index 13fb471..94f6432 100644 --- a/scrapy_fs/README.md +++ b/scrapy_fs/README.md @@ -1,7 +1,7 @@ -## Install - -The current dependencies in `requirements.txt` are tested to work with **Python 3.9**. +## Scrapy ## Run scrapers like this - scrapy crawl PL -o pl_2014.csv -t csv +``` +scrapy crawl -a year=2022 -o ro_2022.csv RO +``` diff --git a/scrapy_fs/scrapy_fs/items.py b/scrapy_fs/scrapy_fs/items.py index 680bcba..9085e97 100644 --- a/scrapy_fs/scrapy_fs/items.py +++ b/scrapy_fs/scrapy_fs/items.py @@ -3,18 +3,19 @@ # Farm subsidy data format: # http://farmsubsidy.readthedocs.org/en/latest/scraper.html#scraper-data-format -from scrapy import Item, Field +from itemloaders.processors import Join, MapCompose, TakeFirst +from scrapy import Field, Item from scrapy.loader import ItemLoader -from scrapy.loader.processors import TakeFirst, MapCompose, Join - -from scrapy_fs.scrubbers import (filter_euro_amount, - filter_croatian_recipient_id, - select_after_semicolon, - filter_croatian_postcode, - strip_line_breaks, - make_comma_proof, - filter_lithuanian_recipient_id, - filter_lithuanian_location) +from scrapy_fs.scrubbers import ( + filter_croatian_postcode, + filter_croatian_recipient_id, + filter_euro_amount, + filter_lithuanian_location, + filter_lithuanian_recipient_id, + make_comma_proof, + select_after_semicolon, + strip_line_breaks, +) class FarmSubsidyItem(Item): @@ -52,4 +53,4 @@ class LithuanianLoader(ItemLoader): recipient_id_in = MapCompose(filter_lithuanian_recipient_id, str) recipient_location_in = MapCompose(filter_lithuanian_location) - recipient_location_out = Join(separator=', ') + recipient_location_out = Join(separator=", ") diff --git a/scrapy_fs/scrapy_fs/settings.py b/scrapy_fs/scrapy_fs/settings.py index 01e8b45..469f095 100644 --- a/scrapy_fs/scrapy_fs/settings.py +++ b/scrapy_fs/scrapy_fs/settings.py @@ -6,10 +6,10 @@ # http://doc.scrapy.org/en/latest/topics/settings.html # -BOT_NAME = 'scrapy_fs' +BOT_NAME = "scrapy_fs" -SPIDER_MODULES = ['scrapy_fs.spiders'] -NEWSPIDER_MODULE = 'scrapy_fs.spiders' +SPIDER_MODULES = ["scrapy_fs.spiders"] +NEWSPIDER_MODULE = "scrapy_fs.spiders" # AUTOTHROTTLE_ENABLED = True @@ -17,7 +17,24 @@ # 'scrapy_fs.pipelines.DropSubsidyFilter': 100, # } -USER_AGENT = 'Farm subsidy scraper bot (https://farmsubsidy.org)' +USER_AGENT = "Farm subsidy scraper bot (https://farmsubsidy.org)" + +RETRY_TIMES = 5 # For EE -URLLENGTH_LIMIT=6000 +URLLENGTH_LIMIT = 6000 + +# Enable HTTP caching +HTTPCACHE_ENABLED = True + +# Cache storage location +HTTPCACHE_DIR = "cache" + +# Cache expiration time (in seconds) - default 0 = never expire +HTTPCACHE_EXPIRATION_SECS = 0 + +# Cache storage backend +# HTTPCACHE_STORAGE = "scrapy.extensions.httpcache.FilesystemCacheStorage" + +# Optional: Ignore these HTTP codes for caching +HTTPCACHE_IGNORE_HTTP_CODES = [500, 502, 503, 504, 408] diff --git a/scrapy_fs/scrapy_fs/spiders/ro_spider.py b/scrapy_fs/scrapy_fs/spiders/ro_spider.py new file mode 100644 index 0000000..ee9389e --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/ro_spider.py @@ -0,0 +1,120 @@ +import re + +import scrapy +from scrapy.spiders import Spider + +from ..items import FarmSubsidyItem + + +class ROSpider(Spider): + """ + Spider for Romanias's CAP payments + """ + + name = "RO" + + custom_settings = {"AUTOTHROTTLE_ENABLED": True, "LOG_LEVEL": "INFO"} + + # AMOUNT_RE = re.compile('[^\d\.]') + # BAD_NAME = u'ID not available' + + def __init__(self, year=None): + self.year = int(year) + # self.start_urls = [ + # f"https://plati.afir.info/Plati/AfisareListaPlatiEN?pageNumber={x}&anFinanciar={self.year}" + # for x in range(1, 1000) + # ] + + def start_requests(self): + url = f"https://plati.afir.info/Plati/AfisareListaPlatiEN?pageNumber=1&anFinanciar={self.year}" + yield scrapy.Request(url, callback=self.parse_total_pages) + + def parse_total_pages(self, response): + total_pages_url = response.css("a#btn-last-page::attr(href)").get() + + if total_pages_url: + page_pattern = re.compile(r"pageNumber=(\d+)") + match = page_pattern.search(total_pages_url) + + if match: + total_pages = int(match.group(1)) + for x in range(1, total_pages + 1): + url = f"https://plati.afir.info/Plati/AfisareListaPlatiEN?pageNumber={x}&anFinanciar={self.year}" + yield scrapy.Request(url, callback=self.parse) + + def parse(self, response): + # Loop through each table row + rows = response.css("#content tr") + + for row in rows: + # Extract data fields + beneficiary_name = row.xpath( + ".//td[contains(., 'BENEFICIARY NAME')]/div[@class='fw-bold-content']/text()" + ).get() + beneficiary_last_name = row.xpath( + """.//td[contains(., "BENEFICIARY'S LAST NAME")]/div[@class='fw-bold-content']/text()""" + ).get() + beneficiary_parent_company = row.xpath( + ".//td[contains(., 'PARENT COMPANY NAME AND TAX REGISTRATION CODE')]/div[@class='fw-bold-content']/text()" + ).get() + locality = row.xpath( + ".//td[contains(., 'LOCALITY')]/div[@class='fw-bold-content']/text()" + ).get() + measure_code = row.xpath( + ".//td[normalize-space(.//div[@class='fw-bold'])='MEASURE/INTERVENTION TYPE CODE']/div[@class='fw-bold-content']/text()" + ).get() + + objective = row.xpath( + ".//td[contains(., 'OBJECTIVE')]/div[@class='fw-bold-content']/text()" + ).get() + + fega_operation_amount = row.xpath( + ".//td[contains(., 'FEGA OPERATION AMOUNT')]/div[@class='fw-bold-content']/text()" + ).get() + feadr_operation_amount = row.xpath( + ".//td[contains(., 'FEADR OPERATION AMOUNT')]/div[@class='fw-bold-content']/text()" + ).get() + total_feadr_amount = row.xpath( + ".//td[contains(., 'TOTAL FEADR AMOUNT')]/div[@class='fw-bold-content']/text()" + ).get() + operation_related_amount = row.xpath( + ".//td[contains(., 'OPERATION-RELATED AMOUNT')]/div[@class='fw-bold-content']/text()" + ).get() + total_bene_cof_amount = row.xpath( + ".//td[contains(., 'TOTAL BENEFICIARY COFINANCING AMOUNT')]/div[@class='fw-bold-content']/text()" + ).get() + total_eu_amount = row.xpath( + ".//td[contains(., 'TOTAL EU AMOUNT FOR BENEFICIARY')]/div[@class='fw-bold-content']/text()" + ).get() + + name = beneficiary_name.strip() if beneficiary_name else "N.N." + + if beneficiary_last_name: + name += " " + beneficiary_last_name.strip() + + if beneficiary_parent_company: + name += ", " + beneficiary_parent_company.strip() + + schema = ( + measure_code + if measure_code + else "" + (" - " + objective if objective else "") + ) + + yield FarmSubsidyItem( + country="RO", + currency="RON", + year=self.year, + recipient_name=name, + recipient_location=locality, + scheme=schema, + amount=total_eu_amount, + ) + + # # Find the link to the next page + # next_page = response.css("a#btn-next-page::attr(href)").get() + + # # If there's a next page, yield a new request + # if next_page: + # next_page_url = response.urljoin(next_page) # Make the URL absolute + # yield scrapy.Request(url=next_page_url, callback=self.parse) From 0e716154bd687be868084f3011daf5c69c498fa2 Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Fri, 13 Dec 2024 15:42:00 +0100 Subject: [PATCH 29/38] Add option to scrape sequentially --- scrapy_fs/scrapy_fs/spiders/ro_spider.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/scrapy_fs/scrapy_fs/spiders/ro_spider.py b/scrapy_fs/scrapy_fs/spiders/ro_spider.py index ee9389e..1749449 100644 --- a/scrapy_fs/scrapy_fs/spiders/ro_spider.py +++ b/scrapy_fs/scrapy_fs/spiders/ro_spider.py @@ -5,6 +5,9 @@ from ..items import FarmSubsidyItem +# Acutally faster to scrape sequentially and not in parallel +SEQUENTIAL = True + class ROSpider(Spider): """ @@ -13,7 +16,7 @@ class ROSpider(Spider): name = "RO" - custom_settings = {"AUTOTHROTTLE_ENABLED": True, "LOG_LEVEL": "INFO"} + custom_settings = {"AUTOTHROTTLE_ENABLED": not SEQUENTIAL, "LOG_LEVEL": "INFO"} # AMOUNT_RE = re.compile('[^\d\.]') # BAD_NAME = u'ID not available' @@ -27,7 +30,10 @@ def __init__(self, year=None): def start_requests(self): url = f"https://plati.afir.info/Plati/AfisareListaPlatiEN?pageNumber=1&anFinanciar={self.year}" - yield scrapy.Request(url, callback=self.parse_total_pages) + if SEQUENTIAL: + yield scrapy.Request(url, callback=self.parse) + else: + yield scrapy.Request(url, callback=self.parse_total_pages) def parse_total_pages(self, response): total_pages_url = response.css("a#btn-last-page::attr(href)").get() @@ -111,10 +117,11 @@ def parse(self, response): amount=total_eu_amount, ) - # # Find the link to the next page - # next_page = response.css("a#btn-next-page::attr(href)").get() + if SEQUENTIAL: + # Find the link to the next page + next_page = response.css("a#btn-next-page::attr(href)").get() - # # If there's a next page, yield a new request - # if next_page: - # next_page_url = response.urljoin(next_page) # Make the URL absolute - # yield scrapy.Request(url=next_page_url, callback=self.parse) + # If there's a next page, yield a new request + if next_page: + next_page_url = response.urljoin(next_page) # Make the URL absolute + yield scrapy.Request(url=next_page_url, callback=self.parse) From 2398b53482acb1599f5874dc111840d9f64f1e1b Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Thu, 22 May 2025 14:45:22 +0200 Subject: [PATCH 30/38] Clean up some scrapy spiders --- scrapy_fs/scrapy_fs/spiders/at_spider.py | 67 ---------- scrapy_fs/scrapy_fs/spiders/mt_spider.py | 115 ----------------- scrapy_fs/scrapy_fs/spiders/pl_scraper.py | 126 +++++++++--------- scrapy_fs/scrapy_fs/spiders/se_spider.py | 150 ++++++++++++++++++++++ 4 files changed, 215 insertions(+), 243 deletions(-) delete mode 100644 scrapy_fs/scrapy_fs/spiders/at_spider.py delete mode 100644 scrapy_fs/scrapy_fs/spiders/mt_spider.py create mode 100644 scrapy_fs/scrapy_fs/spiders/se_spider.py diff --git a/scrapy_fs/scrapy_fs/spiders/at_spider.py b/scrapy_fs/scrapy_fs/spiders/at_spider.py deleted file mode 100644 index 82d6131..0000000 --- a/scrapy_fs/scrapy_fs/spiders/at_spider.py +++ /dev/null @@ -1,67 +0,0 @@ -import json - -import scrapy -from scrapy.spiders import Spider -# from scrapy.shell import inspect_response - -from ..items import FarmSubsidyItem - - -class ATSpider(Spider): - name = "AT" - YEAR = 2022 - START_URL = 'https://www.transparenzdatenbank.at/search' - # DETAIL_URL = 'https://www.transparenzdatenbank.at/suche/details/{id}/{year}' - DETAIL_URL = 'https://www.transparenzdatenbank.at/search?laufnr={laufnr}&jahr={year}' - DEFAULT_SEARCH = '{"zahlungsempfaenger":"","betrag_von":null,"betrag_bis":null,"gemeinde":"","massnahme":0,"jahr":%s,"page":0,"size":200000,"sort":"zahlungsempfaenger","asc":true}' % YEAR - - def __init__(self, year=YEAR): - self.year = int(year) - - def start_requests(self): - # import ipdb; ipdb.set_trace() - yield scrapy.Request(self.START_URL, - method='POST', - headers={ - 'Content-Type': 'application/json;charset=UTF-8', - 'Accept': 'application/json, text/plain, */*', - 'PAGINATION_CURRENT': 1, - 'PAGINATION_PER_PAGE': 2000000, - 'Referer': 'https://www.transparenzdatenbank.at/', - 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' - }, - body=self.DEFAULT_SEARCH, - callback=self.get_results) - - def get_results(self, response): - """ - The lines below is a spider contract. For more info see: - http://doc.scrapy.org/en/latest/topics/contracts.html - @url http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/ - @scrapes name - """ - data = json.loads(response.body) - all_items = data["data"] - for item in all_items: - # print(item) - item_data = dict( - country='AT', currency='EUR', - year=item['hhj'], - recipient_name=item['zahlungsempfaenger'], - recipient_id='AT-%s' % item['id'], - recipient_location=item['gemeinde'], - recipient_postcode=str(item['postleitzahl']), - amount=item['saldo'], - ) - yield scrapy.Request(self.DETAIL_URL.format(laufnr=item['laufnr'], year=item['hhj']), - callback=self.get_detail, meta={'item_data': item_data}) - - def get_detail(self, response): - item_data = response.meta['item_data'] - all_payments = json.loads(response.body) - for payment in all_payments: - new_item = dict(item_data) - new_item['amount'] = payment['betrag'] - new_item['scheme'] = u'{bezeichnung} ({manacode})'.format(**payment) - - yield FarmSubsidyItem(**new_item) diff --git a/scrapy_fs/scrapy_fs/spiders/mt_spider.py b/scrapy_fs/scrapy_fs/spiders/mt_spider.py deleted file mode 100644 index 47eb7ce..0000000 --- a/scrapy_fs/scrapy_fs/spiders/mt_spider.py +++ /dev/null @@ -1,115 +0,0 @@ -import re - -import scrapy -from scrapy.spiders import Spider - -from slugify import slugify - -from ..items import FarmSubsidyItem - - -YEAR = 2017 - - -class MTSpider(Spider): - name = "MT" - - NUM_ONLY_RE = re.compile('^[\s\d]+$') - - start_urls = [ - 'https://msdec.gov.mt/en/arpa/Pages/Payments.aspx' - ] - - def __init__(self, year=YEAR): - self.year = int(year) - - def parse(self, response): - return scrapy.FormRequest.from_response( - response, - formdata={ - 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$AELSg_c7852a28_8677_47de_bf51_102e5afe2ae8combo5': str(self.year), - '__SCROLLPOSITIONX': '0', - '__SCROLLPOSITIONY': '0', - '__LASTFOCUS': '', - 'search': '0', - '__EVENTARGUMENT': '', - 'hiddenInputToUpdateATBuffer_CommonToolkitScripts': '1', - '__EVENTTARGET': '', - 'InputKeywords': 'Search', - }, - callback=self.search) - - def search(self, response): - current_page = response.xpath('//tr[@class="AELSpager"]//table//td[span]') - if current_page: - print('Page %s' % current_page[0].extract()) - else: - print('No current page!') - trs = response.xpath('.//table[starts-with(@class, "AELStable")]//tr') - keys = None - for i, tr in enumerate(trs): - if i == 0: - keys = [x.extract().strip() for x in tr.xpath('./th//text()')] - continue - if tr.xpath('self::*[@class = "AELSpager"]'): - ''' -3 - function __doPostBack(eventTarget, eventArgument) { - if (!theForm.onsubmit || (theForm.onsubmit() != false)) { - theForm.__EVENTTARGET.value = eventTarget; - theForm.__EVENTARGUMENT.value = eventArgument; - theForm.submit(); - } -} - ''' - # Find next link - next_link = response.xpath('//tr[@class="AELSpager"]//table//td[span]/following-sibling::td/a/@href') - if not next_link: - continue - next_link = next_link[0].extract() - next_link = next_link.replace("javascript:__doPostBack('", '') - next_link = next_link.split("','") - event_target = next_link[0] - event_arg = next_link[1].replace("')", '') - - yield scrapy.FormRequest.from_response(response, - callback=self.search, - dont_click=True, - formdata={ - '__EVENTTARGET': event_target, - '__EVENTARGUMENT': event_arg - }) - return - tds = [x.extract().strip() for x in tr.xpath('./td//text()')] - if len(tds) != len(keys): - return - data = dict(zip(keys, tds)) - recipient_name = data.pop('Name') - recipient_location = data.pop('Locality') - recipient_postcode = data.pop('Postcode') - year = data.pop('Financial Year', None) - if year is None: - return - data.pop('Grand_Total') - if self.NUM_ONLY_RE.match(recipient_name): - recipient_id = 'MT-%s-%s' % (year, recipient_name) - recipient_name = '' - else: - recipient_id = 'MT-%s-%s' % (recipient_postcode, slugify(recipient_name)) - - for scheme, amount in data.items(): - if not amount: - continue - amount = float(amount.replace(',', '')) - if not amount: - continue - yield FarmSubsidyItem( - year=int(year), - scheme=scheme, - amount=amount, - recipient_id=recipient_id, - recipient_name=recipient_name, - recipient_location=recipient_location, - recipient_postcode=recipient_postcode, - country='MT', currency='EUR', - ) diff --git a/scrapy_fs/scrapy_fs/spiders/pl_scraper.py b/scrapy_fs/scrapy_fs/spiders/pl_scraper.py index 501e012..9ae80eb 100644 --- a/scrapy_fs/scrapy_fs/spiders/pl_scraper.py +++ b/scrapy_fs/scrapy_fs/spiders/pl_scraper.py @@ -1,6 +1,6 @@ # -*- encoding: utf-8 -*- -import re import math +import re import scrapy from scrapy.spiders import Spider @@ -10,71 +10,75 @@ class PLSpider(Spider): name = "PL" - YEAR = 2014 - LIMIT = 50 - NUM_ONLY_RE = re.compile('^[\s\d]+$') - SEARCH_URL = 'http://beneficjenciwpr.minrol.gov.pl/search/index/page:{page}/year:{year}/limit:{limit}' + custom_settings = {"AUTOTHROTTLE_ENABLED": True, "LOG_LEVEL": "INFO"} + + def __init__(self, year=None): + self.year = int(year) - start_urls = [ - SEARCH_URL.format(page=1, year=YEAR, limit=LIMIT) - ] + # https://beneficjenciwpr.minrol.gov.pl/api/beneficiary?first=0&page=10000&size=50&sort=¤cy.equals=pln&year.equals=2022 + + def start_requests(self): + max_page = 30000 + for x in range(1, max_page): + url = f"https://beneficjenciwpr.minrol.gov.pl/api/beneficiary?first=0&page={x}&size=50&sort=¤cy.equals=pln&year.equals={self.year}" + yield scrapy.Request(url, callback=self.parse) def parse(self, response): - if '/outrecords/privateacc' in response.url: - # accept terms - yield scrapy.FormRequest.from_response(response, - formxpath='.//div[@class="privacy"]//form', - formdata={ - 'data[Outrecord][accept]': '1' - }, callback=self.parse) - return - max_items = int(response.css('.search_quotes').re('znaleziono: (\d+) beneficjent')[0]) - max_pages = int(math.ceil(max_items / float(self.LIMIT))) - for x in self.search(response): - yield x - for page in range(2, max_pages + 1): - yield scrapy.Request(self.SEARCH_URL.format(page=page, - year=self.YEAR, limit=self.LIMIT), callback=self.search) - - def search(self, response): - url = response.xpath('//table[@class="search_res"]//tr/td/a/@href')[0].extract() - url = response.urljoin(url) - yield scrapy.Request(url, callback=self.detail) - - def detail(self, response): - recipient_url = response.url - url_id = recipient_url.rsplit('/')[-1] - - keys = [x.extract().strip() for x in response.xpath('//div[@class="outrecord_label"]//text()')] - values = [x for x in response.xpath('//div[@class="outrecord_data"]')] - values = [v.xpath('.//text()')[0].extract() if v.xpath('.//text()') else '' for v in values] - data = dict(zip(keys, values)) - year = int(data[u'Rok budżetowy']) - recipient_name = [ - data[u'Imię beneficjenta'], data[u'Nazwisko beneficjenta'], - data[u'Nazwa beneficjenta'] - ] - recipient_name = ' '.join(x.strip() for x in recipient_name if x.strip()) - recipient_postcode = data[u'Kod pocztowy'] - recipient_location = data[u'Nazwa gminy'] - recipient_id = 'PL-%s-%s' % (year, url_id) - - for line in response.xpath('.//div[@class="outrecord_left_green"]/div'): - amount = line.xpath('.//div[@class="outrecord_data_green"]//text()')[0].extract() - amount = float(amount.replace(' ', '').replace(',', '.')) - if not amount: - continue - scheme = line.xpath('.//div[@class="outrecord_label_green"]//text()')[0].extract() + # print(response.json()) + + # item + """ + { + "id" : 14139415, + "identyfikator" : null, + "year" : 2022, + "firstname" : "ANDRZEJ", + "surname" : "NOWOTNIK", + "name" : null, + "taxnumber" : "8111007587", + "idnumber" : "71113001378", + "otherdocument" : null, + "regon" : null, + "state" : "KAZANÓW", + "postal" : "26-713", + "payment" : 0.0, + "efrg" : 0.0, + "prow" : 0.0, + "total" : 28384.98, + "substate" : "ZWOLEŃSKI", + "substate_postal" : "26-713" + }, { + """ + + for item in response.json(): + # Extract data fields + name = "" + first_name = item.get("firstname", "") + + if first_name: + name = first_name + " " + + if item.get("name", ""): + name += item.get("name", "") + + locality = "" + if item.get("state"): + locality = item.get("state", "") + + if item.get("substate", ""): + if locality: + locality += ", " + locality += item.get("substate", "") + + amount = item.get("total", 0.0) + yield FarmSubsidyItem( - year=year, - scheme=scheme, + country="PL", + currency="PLN", + year=self.year, + recipient_name=name, + recipient_location=locality, amount=amount, - recipient_id=recipient_id, - recipient_name=recipient_name, - recipient_location=recipient_location, - recipient_url=recipient_url, - recipient_postcode=recipient_postcode, - country='PL', currency='PLN', ) diff --git a/scrapy_fs/scrapy_fs/spiders/se_spider.py b/scrapy_fs/scrapy_fs/spiders/se_spider.py new file mode 100644 index 0000000..39e9288 --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/se_spider.py @@ -0,0 +1,150 @@ +import re + +import scrapy +from scrapy.spiders import Spider + +from ..items import FarmSubsidyItem + + +class SESpider(Spider): + """ + Swedens CAP payments + """ + + name = "SE" + + custom_settings = { + "AUTOTHROTTLE_ENABLED": False, + "LOG_LEVEL": "INFO", + "HTTPCACHE_ENABLED": True, + } + + # AMOUNT_RE = re.compile('[^\d\.]') + # BAD_NAME = u'ID not available' + + def __init__(self, year=None): + self.year = int(year) + + """ + AJAXREQUEST=j_id0 +searchResultsForm_SUBMIT=1 +javax.faces.ViewState=+cNxfEoERH6+x0Xj4WkRQvRibhZzngTTR/x6Hdk1mPOinYw2nGzwLsiAM2oJK5RpGyR9BS/c+2rs++XqtfkHttPhx4i4JCKa3l9BCKNBpLO57+iGQmnqNyr+ktlaah24qq2mBMBsvN20b37y +searchResultsForm:j_id_jsp_121545192_121=2 +ajaxSingle=searchResultsForm:j_id_jsp_121545192_121 +AJAX:EVENTS_COUNT=1 + """ + + def start_requests(self): + for x in range(1, 620): + yield scrapy.FormRequest( + url="https://etjanst.sjv.se/asken/faces/jbstod/searchJbstod.jsp", + formdata={ + "AJAXREQUEST": "j_id0", + "searchResultsForm_SUBMIT": "1", + "javax.faces.ViewState": "+cNxfEoERH6+x0Xj4WkRQvRibhZzngTTR/x6Hdk1mPOinYw2nGzwLhk8iJUV9M9MwyQ3m0dr+rHkpwRZpSqEIU//L6sHgV8mVipq9MYy9NzRcflfhla1xVtiQv8nYAb+z2VHYdtMx/yFoQbO", + "searchResultsForm:j_id_jsp_121545192_121": str(x), + "ajaxSingle": "searchResultsForm:j_id_jsp_121545192_121", + "AJAX:EVENTS_COUNT": "1", + }, + cookies={ + "BIGipServerpool_epublik_http_8106": "2185762220.43551.0000", + "JSESSIONID": "4921943166FA5C8AD0CE5869AE19169F", + }, + callback=self.parse, + ) + # yield scrapy.Request(url, callback=self.parse) + + # def parse_total_pages(self, response): + # total_pages_url = response.css("a#btn-last-page::attr(href)").get() + + # if total_pages_url: + # page_pattern = re.compile(r"pageNumber=(\d+)") + # match = page_pattern.search(total_pages_url) + + # if match: + # total_pages = int(match.group(1)) + # for x in range(1, total_pages + 1): + # url = f"https://plati.afir.info/Plati/AfisareListaPlatiEN?pageNumber={x}&anFinanciar={self.year}" + # yield scrapy.Request(url, callback=self.parse) + + def parse(self, response): + print(response) + # place = response.css("div.kommun") + print(response.text) + + # Loop through each table row + rows = response.css("#content tr") + + # for row in rows: + # # Extract data fields + # beneficiary_name = row.xpath( + # ".//td[contains(., 'BENEFICIARY NAME')]/div[@class='fw-bold-content']/text()" + # ).get() + # beneficiary_last_name = row.xpath( + # """.//td[contains(., "BENEFICIARY'S LAST NAME")]/div[@class='fw-bold-content']/text()""" + # ).get() + # beneficiary_parent_company = row.xpath( + # ".//td[contains(., 'PARENT COMPANY NAME AND TAX REGISTRATION CODE')]/div[@class='fw-bold-content']/text()" + # ).get() + # locality = row.xpath( + # ".//td[contains(., 'LOCALITY')]/div[@class='fw-bold-content']/text()" + # ).get() + # measure_code = row.xpath( + # ".//td[normalize-space(.//div[@class='fw-bold'])='MEASURE/INTERVENTION TYPE CODE']/div[@class='fw-bold-content']/text()" + # ).get() + + # objective = row.xpath( + # ".//td[contains(., 'OBJECTIVE')]/div[@class='fw-bold-content']/text()" + # ).get() + + # fega_operation_amount = row.xpath( + # ".//td[contains(., 'FEGA OPERATION AMOUNT')]/div[@class='fw-bold-content']/text()" + # ).get() + # feadr_operation_amount = row.xpath( + # ".//td[contains(., 'FEADR OPERATION AMOUNT')]/div[@class='fw-bold-content']/text()" + # ).get() + # total_feadr_amount = row.xpath( + # ".//td[contains(., 'TOTAL FEADR AMOUNT')]/div[@class='fw-bold-content']/text()" + # ).get() + # operation_related_amount = row.xpath( + # ".//td[contains(., 'OPERATION-RELATED AMOUNT')]/div[@class='fw-bold-content']/text()" + # ).get() + # total_bene_cof_amount = row.xpath( + # ".//td[contains(., 'TOTAL BENEFICIARY COFINANCING AMOUNT')]/div[@class='fw-bold-content']/text()" + # ).get() + # total_eu_amount = row.xpath( + # ".//td[contains(., 'TOTAL EU AMOUNT FOR BENEFICIARY')]/div[@class='fw-bold-content']/text()" + # ).get() + + # name = beneficiary_name.strip() if beneficiary_name else "N.N." + + # if beneficiary_last_name: + # name += " " + beneficiary_last_name.strip() + + # if beneficiary_parent_company: + # name += ", " + beneficiary_parent_company.strip() + + # schema = ( + # measure_code + # if measure_code + # else "" + (" - " + objective if objective else "") + # ) + + yield FarmSubsidyItem( + country="SE", + currency="SEK", + year=self.year, + recipient_name="x", + recipient_location=place, + scheme="x", + amount="x", + ) + + # if SEQUENTIAL: + # # Find the link to the next page + # next_page = response.css("a#btn-next-page::attr(href)").get() + + # # If there's a next page, yield a new request + # if next_page: + # next_page_url = response.urljoin(next_page) # Make the URL absolute + # yield scrapy.Request(url=next_page_url, callback=self.parse) From 6407161d5589d37b22b56a018562ee143d4533f7 Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Thu, 22 May 2025 17:34:05 +0200 Subject: [PATCH 31/38] Update PL parsing for 2022 --- scrapy_fs/scrapy_fs/spiders/pl_scraper.py | 131 ++++++++++++++++------ 1 file changed, 99 insertions(+), 32 deletions(-) diff --git a/scrapy_fs/scrapy_fs/spiders/pl_scraper.py b/scrapy_fs/scrapy_fs/spiders/pl_scraper.py index 9ae80eb..d33a4f0 100644 --- a/scrapy_fs/scrapy_fs/spiders/pl_scraper.py +++ b/scrapy_fs/scrapy_fs/spiders/pl_scraper.py @@ -1,35 +1,39 @@ -# -*- encoding: utf-8 -*- -import math -import re - -import scrapy -from scrapy.spiders import Spider - -from ..items import FarmSubsidyItem - - -class PLSpider(Spider): - name = "PL" - - custom_settings = {"AUTOTHROTTLE_ENABLED": True, "LOG_LEVEL": "INFO"} - - def __init__(self, year=None): - self.year = int(year) - +""" + +source data required columns + + country + year + recipient_name + amount + currency + + +additional columns that are taken if present + + recipient_id (helps for deduping if source supplies an identifier) + recipient_address + recipient_street + recipient_street1 + recipient_street2 + recipient_postcode + recipient_country + recipient_url (source url to original data platform?) + scheme (EU measurement) + scheme_name + scheme_code + scheme_code_short + scheme_description + scheme_1 + scheme_2 + amount_original + currency_original + + # print(response.json()) # https://beneficjenciwpr.minrol.gov.pl/api/beneficiary?first=0&page=10000&size=50&sort=¤cy.equals=pln&year.equals=2022 - def start_requests(self): - max_page = 30000 - for x in range(1, max_page): - url = f"https://beneficjenciwpr.minrol.gov.pl/api/beneficiary?first=0&page={x}&size=50&sort=¤cy.equals=pln&year.equals={self.year}" - yield scrapy.Request(url, callback=self.parse) - - def parse(self, response): - - # print(response.json()) - # item - """ + { "id" : 14139415, "identyfikator" : null, @@ -50,8 +54,47 @@ def parse(self, response): "substate" : "ZWOLEŃSKI", "substate_postal" : "26-713" }, { - """ +""" +import math + +import scrapy +from scrapy.spiders import Spider + +from ..items import FarmSubsidyItem + + +class PLSpider(Spider): + name = "PL" + + custom_settings = {"AUTOTHROTTLE_ENABLED": True, "LOG_LEVEL": "INFO"} + + def __init__(self, year=None, *args, **kwargs): + super().__init__(*args, **kwargs) + self.year = int(year) + self.page_size = 50 + self.expected_total_count = None # Initialize expected_total_count + self.item_count = 0 # Initialize item counter + + def start_requests(self): + url = f"https://beneficjenciwpr.minrol.gov.pl/api/beneficiary?first=0&page=0&size={self.page_size}&sort=¤cy.equals=pln&year.equals={self.year}" + yield scrapy.Request(url, callback=self.parse_total_count) + + def parse_total_count(self, response): + total_count = response.headers.get("X-Total-Count", None) + if not total_count: + raise ValueError( + f"X-Total-Count header not found in the response for year {self.year}" + ) + self.expected_total_count = int(total_count) + self.item_count = 0 + max_page = math.ceil(self.expected_total_count / self.page_size) + print(f"Total pages: {max_page}") + for x in range(0, max_page + 1): + url = f"https://beneficjenciwpr.minrol.gov.pl/api/beneficiary?first=0&page={x}&size={self.page_size}&sort=¤cy.equals=pln&year.equals={self.year}" + yield scrapy.Request(url, callback=self.parse) + + def parse(self, response): for item in response.json(): # Extract data fields name = "" @@ -67,18 +110,42 @@ def parse(self, response): if item.get("state"): locality = item.get("state", "") - if item.get("substate", ""): + recipient_postcode = item.get("postal", "") + + substate = item.get("substate", "") + if substate and substate != item.get("state", ""): if locality: locality += ", " - locality += item.get("substate", "") + locality += substate + + # append substate_postal if it is different from the main postal code + substate_postal = item.get("substate_postal", "") + if substate_postal and substate_postal != recipient_postcode: + if locality: + locality += ", " + locality += substate_postal amount = item.get("total", 0.0) + identifier = f"{item.get('id', '')}-{item.get('taxnumber', '')}-{item.get('idnumber', '')}" + + self.item_count += 1 # Increment counter yield FarmSubsidyItem( country="PL", currency="PLN", year=self.year, recipient_name=name, recipient_location=locality, + recipient_postcode=recipient_postcode, amount=amount, + recipient_id=identifier, + ) + + def closed(self, reason): + # For 2022, 50 are missing. Unclear why. + if hasattr(self, "expected_total_count"): + print( + f"Expected items: {self.expected_total_count}, Scraped items: {self.item_count}, Difference: {self.item_count - self.expected_total_count}" ) + if self.item_count != self.expected_total_count: + print("WARNING: Scraped item count does not match expected total!") From c38e296d8061c729ff1c15741a12cfae7e54b9f1 Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Wed, 4 Jun 2025 16:27:18 +0200 Subject: [PATCH 32/38] Get details for PL --- scrapy_fs/scrapy_fs/spiders/pl_scraper.py | 84 +++++++++++++++-------- 1 file changed, 57 insertions(+), 27 deletions(-) diff --git a/scrapy_fs/scrapy_fs/spiders/pl_scraper.py b/scrapy_fs/scrapy_fs/spiders/pl_scraper.py index d33a4f0..7260a39 100644 --- a/scrapy_fs/scrapy_fs/spiders/pl_scraper.py +++ b/scrapy_fs/scrapy_fs/spiders/pl_scraper.py @@ -67,7 +67,12 @@ class PLSpider(Spider): name = "PL" - custom_settings = {"AUTOTHROTTLE_ENABLED": True, "LOG_LEVEL": "INFO"} + custom_settings = { + "AUTOTHROTTLE_ENABLED": False, + "LOG_LEVEL": "INFO", + # "CONCURRENT_REQUESTS": 20, + # "CONCURRENT_REQUESTS_PER_DOMAIN": 20, + } def __init__(self, year=None, *args, **kwargs): super().__init__(*args, **kwargs) @@ -94,52 +99,77 @@ def parse_total_count(self, response): url = f"https://beneficjenciwpr.minrol.gov.pl/api/beneficiary?first=0&page={x}&size={self.page_size}&sort=¤cy.equals=pln&year.equals={self.year}" yield scrapy.Request(url, callback=self.parse) + # GET https://beneficjenciwpr.minrol.gov.pl/api/beneficiary/13139415 + def parse(self, response): for item in response.json(): - # Extract data fields + # Prepare partial data name = "" first_name = item.get("firstname", "") - if first_name: name = first_name + " " - if item.get("name", ""): name += item.get("name", "") - - locality = "" - if item.get("state"): - locality = item.get("state", "") - + locality = item.get("state", "") recipient_postcode = item.get("postal", "") - substate = item.get("substate", "") if substate and substate != item.get("state", ""): if locality: locality += ", " - locality += substate - - # append substate_postal if it is different from the main postal code + locality += substate + else: + locality = substate substate_postal = item.get("substate_postal", "") + if substate_postal and substate_postal != recipient_postcode: if locality: locality += ", " - locality += substate_postal - - amount = item.get("total", 0.0) + locality += substate_postal + else: + locality = substate_postal + # amount = item.get("total", 0.0) identifier = f"{item.get('id', '')}-{item.get('taxnumber', '')}-{item.get('idnumber', '')}" - self.item_count += 1 # Increment counter - yield FarmSubsidyItem( - country="PL", - currency="PLN", - year=self.year, - recipient_name=name, - recipient_location=locality, - recipient_postcode=recipient_postcode, - amount=amount, - recipient_id=identifier, - ) + # Prepare meta for detail request + meta = { + "country": "PL", + "currency": "PLN", + "year": self.year, + "recipient_name": name, + "recipient_location": locality, + "recipient_postcode": recipient_postcode, + # "amount": amount, + "recipient_id": identifier, + } + detail_url = f"https://beneficjenciwpr.minrol.gov.pl/api/beneficiary/{item.get('id')}" + yield scrapy.Request(detail_url, callback=self.parse_detail, meta=meta) + + def parse_detail(self, response): + # Extract additional details from detail page + meta = response.meta + detail_data = response.json() + + # Only keep allowed fields + allowed_fields = { + "country", + "currency", + "year", + "recipient_name", + "recipient_location", + "recipient_postcode", + "recipient_id", + } + filtered_meta = {k: v for k, v in meta.items() if k in allowed_fields} + + for key, value in detail_data.items(): + if isinstance(value, (int, float)) and value != 0: + if key in ["year"]: + continue + # print(f"Key: {key}, Value: {value}") + yield FarmSubsidyItem(**filtered_meta, scheme=key, amount=value) + + self.item_count += 1 def closed(self, reason): # For 2022, 50 are missing. Unclear why. From 46824e136adad8b089e7b460d08916e48f8f2589 Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Wed, 4 Jun 2025 17:00:30 +0200 Subject: [PATCH 33/38] Add links to other repos --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f9ab65a..f87818a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,12 @@ [FarmSubsidy](https://farmsubsidy.org) is a platform that collects payment data related to the EU’s Common Agricultural Policy (CAP), which accounts for approximately one-third of the EU budget. This repository focuses on the initial data collection phase, often using web scraping. However, many EU member states now offer bulk data downloads, reducing the need for scraping. +## Related Farm Subsidy repositories + +- Backend & cleaning: +- Website: + ## Resources -- **[Member States Data Sites](https://agriculture.ec.europa.eu/common-agricultural-policy/financing-cap/beneficiaries_en):** Links to member states’ CAP payment data portals. -- **[Financial Reports](http://ec.europa.eu/agriculture/cap-funding/financial-reports/index_en.htm):** Summary reports on CAP funding and expenditures. +- **[Member States Data Sites](https://agriculture.ec.europa.eu/common-agricultural-policy/financing-cap/beneficiaries_en):** Links to member states’ CAP payment data portals. +- **[Financial Reports](http://ec.europa.eu/agriculture/cap-funding/financial-reports/index_en.htm):** Summary reports on CAP funding and expenditures. From 3b73d5beb756bce86de97ace4efd276ec3884687 Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Wed, 4 Jun 2025 20:53:52 +0200 Subject: [PATCH 34/38] Add scraper for pl & it for 2022 --- .gitignore | 1 + scrapy_fs/scrapy_fs/items.py | 7 +- scrapy_fs/scrapy_fs/pipelines.py | 30 +- scrapy_fs/scrapy_fs/spiders/de_spider.py | 138 -- scrapy_fs/scrapy_fs/spiders/it_spider.py | 77 + scrapy_fs/scrapy_fs/spiders/pl_scheme.json | 771 ++++++++++ scrapy_fs/scrapy_fs/spiders/pl_scraper.py | 59 +- special-scrapers/.gitignore | 10 + special-scrapers/avg_new_files_per_minute.sh | 20 + special-scrapers/it.js | 396 +++++ special-scrapers/it_captcha/captcha.py | 396 +++++ special-scrapers/it_captcha/mise.toml | 2 + special-scrapers/it_captcha/poetry.lock | 1301 +++++++++++++++++ special-scrapers/it_captcha/pyproject.toml | 17 + special-scrapers/nl.js | 181 +++ special-scrapers/package-lock.json | 1375 ++++++++++++++++++ special-scrapers/package.json | 20 + special-scrapers/playwright.config.ts | 79 + special-scrapers/runprog.sh | 38 + 19 files changed, 4763 insertions(+), 155 deletions(-) delete mode 100644 scrapy_fs/scrapy_fs/spiders/de_spider.py create mode 100644 scrapy_fs/scrapy_fs/spiders/it_spider.py create mode 100644 scrapy_fs/scrapy_fs/spiders/pl_scheme.json create mode 100644 special-scrapers/.gitignore create mode 100755 special-scrapers/avg_new_files_per_minute.sh create mode 100644 special-scrapers/it.js create mode 100644 special-scrapers/it_captcha/captcha.py create mode 100644 special-scrapers/it_captcha/mise.toml create mode 100644 special-scrapers/it_captcha/poetry.lock create mode 100644 special-scrapers/it_captcha/pyproject.toml create mode 100644 special-scrapers/nl.js create mode 100644 special-scrapers/package-lock.json create mode 100644 special-scrapers/package.json create mode 100644 special-scrapers/playwright.config.ts create mode 100755 special-scrapers/runprog.sh diff --git a/.gitignore b/.gitignore index 78f8aae..f32726d 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ data .ipynb_checkpoints __pycache__ cache +*.zip diff --git a/scrapy_fs/scrapy_fs/items.py b/scrapy_fs/scrapy_fs/items.py index 9085e97..0720f67 100644 --- a/scrapy_fs/scrapy_fs/items.py +++ b/scrapy_fs/scrapy_fs/items.py @@ -1,4 +1,4 @@ -""" Item and Loader classes. """ +"""Item and Loader classes.""" # Farm subsidy data format: # http://farmsubsidy.readthedocs.org/en/latest/scraper.html#scraper-data-format @@ -19,6 +19,7 @@ class FarmSubsidyItem(Item): + id = Field() # Only to identify duplicates with scrapy year = Field() country = Field() # Two letters ISO 3166 recipient_id = Field() @@ -28,7 +29,9 @@ class FarmSubsidyItem(Item): recipient_location = Field() recipient_url = Field() agency = Field() - scheme = Field() + scheme_code = Field() + scheme_name = Field() + scheme_description = Field() amount = Field() currency = Field() diff --git a/scrapy_fs/scrapy_fs/pipelines.py b/scrapy_fs/scrapy_fs/pipelines.py index f29f707..0fc263d 100644 --- a/scrapy_fs/scrapy_fs/pipelines.py +++ b/scrapy_fs/scrapy_fs/pipelines.py @@ -1,24 +1,40 @@ -""" A bunch of pipelines. """ +"""A bunch of pipelines.""" +from itemadapter import ItemAdapter from scrapy.exceptions import DropItem class DropSubsidyFilter(object): - """ Drop unwanted subsidy items. """ + """Drop unwanted subsidy items.""" @staticmethod def process_item(item, spider): - args = (spider.name, item['scheme'], item['recipient_name']) + args = (spider.name, item["scheme"], item["recipient_name"]) - if spider.name == 'croatia': - if 'nacionalna' in item['agency'].lower(): + if spider.name == "croatia": + if "nacionalna" in item["agency"].lower(): raise DropItem('%s dropped national subsidy item "%s" for %s' % args) else: return item - if spider.name == 'lithuania': - if not item['amount']: + if spider.name == "lithuania": + if not item["amount"]: raise DropItem('%s dropped empty subsidy item "%s" for %s' % args) else: return item return item + + +class DuplicatesPipeline: + def __init__(self): + self.ids_seen = set() + + def process_item(self, item, spider): + adapter = ItemAdapter(item) + if adapter["id"] in self.ids_seen: + raise DropItem(f"Item ID already seen: {adapter['id']}") + else: + self.ids_seen.add(adapter["id"]) + # Remove 'id' before returning the item + del adapter["id"] + return item diff --git a/scrapy_fs/scrapy_fs/spiders/de_spider.py b/scrapy_fs/scrapy_fs/spiders/de_spider.py deleted file mode 100644 index 8d8ef03..0000000 --- a/scrapy_fs/scrapy_fs/spiders/de_spider.py +++ /dev/null @@ -1,138 +0,0 @@ -import json -import string - -import scrapy -from scrapy.spiders import Spider -# from scrapy.shell import inspect_response - -from ..items import FarmSubsidyItem - - -class DESpider(Spider): - name = "DE" - _YEAR = 2018 - YEAR = 'jahr' - START_URL = 'https://agrar-fischerei-zahlungen.de/Suche' - - def __init__(self): - pass - - def get_plzs(self): - for i in range(0, 100000): - yield str(i).zfill(5) + '%' - for i in range(0, 10000): - yield str(i).zfill(4) - for l in string.ascii_letters: - yield '%' + l + '%' - - def start_requests(self): - yield scrapy.Request(self.START_URL, - method='POST', - headers={ - 'Content-Type': 'application/json;charset=UTF-8', - 'Accept': 'application/json, text/plain, */*', - 'PAGINATION_CURRENT': 1, - 'PAGINATION_PER_PAGE': 2000000, - 'Referer': 'https://www.transparenzdatenbank.at/', - 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' - }, - body=self.DEFAULT_SEARCH, - callback=self.get_results) - - def search(self, plz): - page = 1 - per_page = 50 - count, count_beg = 1000, 1000 - while True: - offset = str(per_page * (page - 1)) - if page == 1: - response = requests.post(BASE_URL, data={ - 'jahr': YEAR, - 'name': '', - 'plz': plz, - 'ort': '', - 'suchtypBetrag': 'betrag_massnahme', - 'operator': 'eq', - 'betrag': '', - 'suchtypEgfl': 'egfl_alle' - }) - - text = response.text - if 'Es liegen mehr als 1500 Ergebnisse vor' in text: - raise ValueError('Search %s result in too many!' % plz) - - dom = html.fromstring(text) - form_data = get_form_data(dom.xpath('.//form[@id="data"]')[0]) - if 'count' not in form_data: - # No results - return None - count = form_data['count'] - count_beg = form_data['countBeg'] - - response = requests.post(BASE_URL, data={ - 'jahr': YEAR, - 'name': '', - 'ort': '', - 'plz': plz, - 'suchtypBetrag': 'betrag_massnahme', - 'operator': 'eq', - 'betrag': '', - 'suchtypEgfl': 'egfl_alle', - 'suchtypEler': 'eler_alle', - 'viewOffset': str(offset), - 'viewOrderdir': 'asc', - 'viewOrderby': 'zahlungsempfaenger', - 'viewCount': str(count), - 'viewCountBeg': str(count_beg), - 'viewLimit': str(per_page), - 'offset': str(offset), - 'dir': 'asc', - 'order': 'zahlungsempfaenger', - 'count': str(count), - 'countBeg': str(count_beg), - 'prevLimit': str(per_page), - 'limit': str(per_page), - 'seite': str(page) - }) - dom = html.fromstring(response.text) - buttons = dom.xpath('.//button[@name="showBeg"]') - for x in buttons: - detail_queue.put((x.attrib['value'], plz, page)) - nav_text = dom.xpath('.//div[@id="listNavRight"]')[0].text_content() - nav_text = nav_text.strip() + '|' - # print('%s lines for %s - now on page %d' % (count_beg, plz, page)) - if 'von %d|' % page in nav_text: - break - page += 1 - # print('Going to page %d of %s' % (page, plz)) - - def get_results(self, response): - """ - The lines below is a spider contract. For more info see: - http://doc.scrapy.org/en/latest/topics/contracts.html - @url http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/ - @scrapes name - """ - all_items = json.loads(response.body) - for item in all_items: - item_data = dict( - country='AT', currency='EUR', - year=item['jahr'], - recipient_name=item['name'], - recipient_id='AT-%s' % item['id'], - recipient_location=item['gemeinde'], - recipient_postcode=str(item['plz']), - amount=item['betrag'], - ) - yield scrapy.Request(self.DETAIL_URL.format(id=item['id'], year=item['jahr']), - callback=self.get_detail, meta={'item_data': item_data}) - - def get_detail(self, response): - item_data = response.meta['item_data'] - all_payments = json.loads(response.body) - for payment in all_payments: - new_item = dict(item_data) - new_item['amount'] = payment['betrag'] - new_item['scheme'] = u'{bezeichnung} ({id})'.format(**payment) - - yield FarmSubsidyItem(**new_item) diff --git a/scrapy_fs/scrapy_fs/spiders/it_spider.py b/scrapy_fs/scrapy_fs/spiders/it_spider.py new file mode 100644 index 0000000..7308275 --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/it_spider.py @@ -0,0 +1,77 @@ +""" +Get data from all the HTML files scraped via Playwright in the `it` directory. + +It is not possible to say whether the data is complete. +We had to narrow down the selection for each request to not overwhelm the server. +This was done by iterating through locations & measures. +But in the results, there were a lot of duplicated payments. +Maybe the search with the comune was too broad. +""" + +import os + +import scrapy +from scrapy.spiders import Spider +from tqdm import tqdm + +from ..items import FarmSubsidyItem + + +class ITSpider(Spider): + name = "IT" + year = 2022 + # Use absolute path based on this file's location + data_dir = os.path.abspath( + os.path.join(os.path.dirname(__file__), "../../../special-scrapers/data/it") + ) + + custom_settings = { + "ITEM_PIPELINES": { + "scrapy_fs.pipelines.DuplicatesPipeline": 100, + }, + "LOG_LEVEL": "ERROR", + "AUTOTHROTTLE_ENABLED": False, + "CONCURRENT_REQUESTS": 2, + "CONCURRENT_REQUESTS_PER_DOMAIN": 2, + } + + def start_requests(self): + for file in tqdm(os.listdir(self.data_dir)): + if file.endswith(".html"): + file_path = os.path.join(self.data_dir, file) + url = "file:///" + file_path + yield scrapy.Request(url=url, callback=self.parse) + + def parse(self, response): + # Loop through each table row that contains elements + for row in response.xpath("//tr[td]"): + # Extract text from each in the row + cells = row.xpath("./td//text()").getall() + # Clean up whitespace and join multi-line cell text + cells = [cell.strip() for cell in cells if cell.strip()] + if cells and cells[0] == "Beneficiary": + continue + + offset = 0 + if cells and len(cells) < 5: + offset = -2 + + # create id from all cells since there are duplicate payments + duplicate_id = "-".join(cells) + recipient_id = "-".join([c for c in cells[:4]]).lower() + recipient_id = "".join( + [ch for ch in recipient_id if ch.isalnum() or ch == "-"] + ) + # Create an item for each row + item = FarmSubsidyItem() + item["id"] = duplicate_id + item["recipient_id"] = recipient_id + item["recipient_name"] = cells[0] + item["recipient_address"] = cells[1] if offset == 0 else "" + item["recipient_postcode"] = cells[2] if offset == 0 else "" + item["recipient_location"] = cells[3 + offset] + item["amount"] = cells[4 + offset].replace(".", "").replace(",", ".") + item["year"] = self.year + item["country"] = "IT" + item["currency"] = "EUR" + yield item diff --git a/scrapy_fs/scrapy_fs/spiders/pl_scheme.json b/scrapy_fs/scrapy_fs/spiders/pl_scheme.json new file mode 100644 index 0000000..12b38ad --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/pl_scheme.json @@ -0,0 +1,771 @@ +[ + { + "Code": null, + "Name": "Operations in the form of types of intervention for direct payments as provided for in Article 16 of Regulation (EU) 2021/2115", + "Purpose": null, + "Nomenclature": { + "Chapter_08_02": ["08 02 04"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.1", + "Name": "Basic income support for sustainability", + "Purpose": "The basic income support is an area payment decoupled from production. The aim is to support viable farm income and resilience across the Union to enhance food security.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 01"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.2", + "Name": "Complementary redistributive income support for sustainability", + "Purpose": "The complementary redistributive income support for sustainability is an area payment decoupled from production. The aim is to improve the distribution of direct payments by redistributing support from larger to smaller or medium-sized farms.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 02"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.3", + "Name": "Complementary income support for young farmers", + "Purpose": "The complementary income support for young farmers is a payment decoupled from production providing enhanced income support to young farmers who are setting up for the first time. The aim is to modernise the agricultural sector by attracting young people and improving their business development.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 03"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.4", + "Name": "Schemes for the climate and the environment", + "Purpose": "Eco-schemes are a payment decoupled from production. The aim is to target income support to agricultural practices beneficial for the environment, climate and animal welfare.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 04"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.5", + "Name": "Small farmer's payments (Article 28)", + "Purpose": "The small farmer's payments are decoupled from production and replace all other direct payments for the concerned beneficiaries. The purpose of the payments for small farmers is to promote a more balanced distribution of support and to reduce administrative burden for both beneficiaries of small amounts and managing authorities.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 01"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.6", + "Name": "Coupled income support", + "Purpose": "Coupled income support covers payments per hectare or head linked to specific productions. The aim is to improve competitiveness, sustainability, and/or quality in certain sectors and products that are particularly important for social, economic or environmental reasons and encounter certain difficulties.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 05"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.7", + "Name": "Crop-specific payment for cotton", + "Purpose": "The crop-specific payment for cotton is a coupled payment granted per hectare of eligible area of cotton. It is a mandatory scheme for cotton producer's Member States to support the cotton production in regions where it is important for the agricultural economy.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 06"], + "Chapter_08_03": [] + } + }, + { + "Code": null, + "Name": "Measures set out in Annex I to Regulation (EU) No 1307/2013", + "Purpose": null, + "Nomenclature": { + "Chapter_08_02": ["08 02 05"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.1", + "Name": "Basic payment scheme (Title III, Chapter 1, Sections 1, 2, 3 and 5)", + "Purpose": "The basic payment scheme is an area payment decoupled from production operated on the basis of payment entitlements allocated to farmers. The aim is to support the income of farmers which is, on average, significantly below the average income in the rest of the economy.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 04"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.2", + "Name": "Single area payment scheme (Article 36)", + "Purpose": "The single area payment scheme is an area payment decoupled from production paid for eligible hectares declared by a farmer. The aim is to support the income of farmers which is, on average, significantly below the average income in the rest of the economy.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 02"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.3", + "Name": "Redistributive payment (Title III, Chapter 2)", + "Purpose": "The redistributive payment is a decoupled area payment. The aim is to support smaller farms by providing them an additional support on their first hectares declared under the basic payment.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 03"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.4", + "Name": "Payment for agricultural practices beneficial for the climate and the environment (Title III, Chapter 3)", + "Purpose": "Greening is a decoupled area payment per hectare paid. The aim is to observe three agricultural practices in favour of the climate and the environment: crop diversification, maintenance of permanent grassland and having ecological focus area on the agricultural area", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 05"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.5", + "Name": "Payment for areas with natural constraints (Title III, Chapter 4)", + "Purpose": "The payment to areas with natural constraints is an area based decoupled payment, provided on top of the basic payment to farmers. The aim is to give support to farmers who are situated in areas with natural constraints.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 06"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.6", + "Name": "Payment for young farmers (Title III, Chapter 5)", + "Purpose": "Payment for young farmers is a payment decoupled from production providing enhanced income support to young farmers who are newly set up for the first time. The aim is to promote the creation and development of new economic activities in the agricultural sector, which is essential for the competitiveness of the agricultural sector in the Union.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 07"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.7", + "Name": "Voluntary coupled support (Title IV, Chapter 1)", + "Purpose": "The voluntary coupled support covers payments per hectare or head linked to specific productions. The aim is to improve the competitiveness and sustainability of sectors that are particularly important for economic, social or environmental reasons and undergo certain difficulties.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 09"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.8", + "Name": "Crop-specific payment for cotton (Title IV, Chapter 2)", + "Purpose": "The crop-specific payment for cotton is a coupled payment granted per hectare of eligible area of cotton. It is a mandatory scheme for Member States producing cotton so as to support its production in regions where it is important for the agricultural economy.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 08"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.9", + "Name": "Small farmers scheme (Title V)", + "Purpose": "The small farmers' scheme is decoupled from production and replaces all other direct payments for the concerned beneficiaries. The aim is to promote a more balanced distribution of support and to reduce administrative burden for both beneficiaries of small amounts and managing authorities.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 10"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.10", + "Name": "Measures set out in Annex I to Council Regulation (EC) No 73/2009²", + "Purpose": "The aim of these direct payments is to decouple support from the production of crops and livestock in order to improve the income support of the farmers.", + "Nomenclature": { + "Chapter_08_02": ["08 02 99 01"], + "Chapter_08_03": [] + } + }, + { + "Code": null, + "Name": "Operations in the form of sectoral interventions as provided for in Article 42 of Regulation (EU) 2021/2115", + "Purpose": null, + "Nomenclature": { + "Chapter_08_02": ["08 02 02"], + "Chapter_08_03": [] + } + }, + { + "Code": "III.1", + "Name": "In the fruit and vegetables sector (Articles 49 to 53)", + "Purpose": "The aim is to support concentration of supply, competitiveness and sustainability of the fruit and vegetables sector. It is done through producer organisations (PO) or their associations (APO) recognised under Regulation (EU) No 1308/2013 and running operational programmes in accordance with Regulation (EU) 2021/2115. Beneficiaries are POs and APOs. Programmes have a duration of between 3 and 7 years and are managed on a financial year basis. Member States have to approve every single programme.", + "Nomenclature": { + "Chapter_08_02": ["08 02 02 01"], + "Chapter_08_03": [] + } + }, + { + "Code": "III.2", + "Name": "In the apiculture products sector (Articles 54, 55 and 56)", + "Purpose": "The aim is to support beekeepers, quality and market for apiculture products", + "Nomenclature": { + "Chapter_08_02": ["08 02 02 02"], + "Chapter_08_03": [] + } + }, + { + "Code": "III.3", + "Name": "In the wine sector (Articles 57 to 60)", + "Purpose": "The aim is to support competitiveness and sustainability of the wine sector. Programmes are run by Member States at national level as part of their Strategic Plan and are managed in a financial year basis. Beneficiaries are winegrowers as well as wine-making and wine-trading operators or their associations/organisations. Operations to be approved by Member States can be annual or multiannual.", + "Nomenclature": { + "Chapter_08_02": ["08 02 02 03"], + "Chapter_08_03": [] + } + }, + { + "Code": "III.4", + "Name": "In the hops sector (Articles 61 and 62)", + "Purpose": "The aim is to support concentration of supply, competitiveness and sustainability of the hops sector through producer organisations (PO) or their associations (APO) recognised under Regulation (EU) No 1308/2013 and running operational programmes in accordance with Regulation (EU) 2021/2115. Beneficiaries are POs or APOs. Programmes have a duration of between 3 and 7 years and are managed on a financial year basis. Member States have to approve every single programme.", + "Nomenclature": { + "Chapter_08_02": ["08 02 02 04"], + "Chapter_08_03": [] + } + }, + { + "Code": "III.5", + "Name": "In the olive oil and table olives sector (Articles 63, 64 and 65)", + "Purpose": "The aim is to support concentration of supply, competitiveness and sustainability of the olive oil and table olives sector through producer organisations (PO) and their associations (APO) recognised under Regulation (EU) No 1308/2013 and running operational programmes in accordance with Regulation (EU) 2021/2115. Beneficiaries are POs or APOs. Programmes have a duration of between 3 and 7 years and are managed in a financial year basis. Member States have to approve every single programme.", + "Nomenclature": { + "Chapter_08_02": ["08 02 02 05"], + "Chapter_08_03": [] + } + }, + { + "Code": "III.6", + "Name": "In other sectors referred to in Article 1(2), points (a) to (h), (k), (m), (o) to (t) and (w), of Regulation (EU) No 1308/2013 and sectors covering products listed in Annex XIII to Regulation (EU) 2021/2115. (Articles 66, 67 and 68)", + "Purpose": "The aim is to support concentration of supply, competitiveness and sustainability of the related sectors through producer organisations (PO), their associations (APO) recognised under Regulation (EU) No 1308/2013, as well as Producers Groups (PG) temporarily approved by Member States and running operational programmes in accordance with Regulation (EU) 2021/2115. Beneficiaries are POs, APOs or PGs. Programmes have a duration of between 3 and 7 years and are managed in a financial year basis. Member States have to approve every single programme.", + "Nomenclature": { + "Chapter_08_02": ["08 02 02 06"], + "Chapter_08_03": [] + } + }, + { + "Code": null, + "Name": "Measures set out in Regulation (EU) No 1308/2013", + "Purpose": null, + "Nomenclature": { + "Chapter_08_02": ["08 02 03"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.1", + "Name": "Public intervention (Chapter I, Section 2)", + "Purpose": "When market prices for certain agricultural products fall below a pre-determined level, the public authorities of the Member States may intervene to stabilise the market by purchasing surplus supplies, which may then be stored until the market price increases. The entities that must be published are the ones which benefit from the aid, in other words the entities from which the product has been bought.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 10"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.2", + "Name": "Aid for private storage (Chapter I, Section 3)", + "Purpose": "The aim of the aid granted is to temporarily support producers of certain products regarding the cost of private storage.", + "Nomenclature": { + "Chapter_08_02": [ + "08 02 03 10 0001 005", + "08 02 03 10 0001 007", + "08 02 03 10 0001 008", + "08 02 03 10 0006 015", + "08 02 03 10 0007 010", + "08 02 03 10 0008 002", + "08 02 03 10 0009 002" + ], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.3", + "Name": "The EU school scheme, school fruit and school milk schemes (Chapter II, Section 1)", + "Purpose": "The aim of the aid provided is to support the distribution of agricultural products to children in nursery, primary and secondary schools with the objective to increase their fruit, vegetables and milk consumption and improve their eating habits.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 04"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.4", + "Name": "Exceptional measures (Chapter I, Sections 1, 2 and 3)", + "Purpose": "The aim of the exceptional measures granted under Article 219(1), Article 220(1) and Article 221(1) and (2) of Regulation (EU) No 1308/2013 is to support agricultural markets in accordance with Article 5(2), point (a), of Regulation (EU) 2021/2116.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 11"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.5", + "Name": "Aid in the fruit and vegetables sector (Chapter II, Section 3)", + "Purpose": "Growers are encouraged to join producer organisations (POs). These receive aid for implementing operational programmes, based on a national strategy. The aim of the aid granted is also to mitigate income fluctuation from crises. Aid is offered for crisis prevention and crisis management measures under operational programmes, i.e.: product withdrawal, green harvesting/non-harvesting, promotion and communication tools, training, harvest insurance, help to secure bank loans and cover administrative costs of setting up mutual funds (farmer-owned stabilisation funds).", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 06"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.6", + "Name": "Support in the wine sector (Chapter II, Section 4)", + "Purpose": "The aim of the various aids granted is to ensure market balance and increase the competitiveness of Union wine: support for promotion of wine on third country markets and information on responsible consumption of wine and the Union system of Protected Designation of Origin (PDO) and Protected Geographical Indication (PGI); co-financing of costs for restructuring and conversion of vineyards, for investments in wineries and in marketing facilities as well as for innovation; support for green harvesting, mutual funds, harvest insurance and by-product distillation.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 07"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.7", + "Name": "Support in the olive oil and tables olives sector (Chapter II, Section 2)", + "Purpose": "Support granted to the three-year work programmes to be drawn up by producer organisations, associations of producer organisations or inter-branch organisations in one or more of the following areas: market follow-up and management in the olive oil and table olives sector; the improvement of the environmental impact of olive cultivation; the improvement of the competitiveness of olive cultivation through modernisation; the improvement of the production quality of olive oil and table olives; the traceability system, the certification and protection of the quality of olive oil and table olives; the dissemination of information on measures carried out by producer organisations, associations of producer organisations or interbranch organisations to improve the quality of olive oil and table olives.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 05"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.8", + "Name": "Aid in the apiculture sector (Chapter II, Section 5)", + "Purpose": "The aim of the aid granted is to support this sector through apiculture programmes in order to improve the production and marketing of apiculture products.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 08"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.9", + "Name": "Aid in the hops sector (Chapter II, Section 6)", + "Purpose": "Aid granted to support hops producer organisations.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 09"], + "Chapter_08_03": [] + } + }, + { + "Code": null, + "Name": "Operation in the form of types of intervention for rural development as provided for in Article 69 of Regulation (EU) 2021/2115", + "Purpose": null, + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01"] + } + }, + { + "Code": "V.1", + "Name": "Environmental, climate and other management commitments", + "Purpose": "The aim of the aid granted is to compensate farmers, forest holders and other land managers for the additional costs and income foregone related to voluntary environment, climate and other management commitments undertaken which go beyond mandatory standards and which contribute to the specific objectives of the CAP, notably in the area of environment, climate and animal welfare.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0001"] + } + }, + { + "Code": "V.2", + "Name": "Natural or other area-specific constraints", + "Purpose": "The aim of the aid granted is to compensate farmers for all or part of the additional costs and income foregone related to the natural or other area-specific constraints in the area concerned, such as mountainous areas.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0002"] + } + }, + { + "Code": "V.3", + "Name": "Area-specific disadvantages resulting from certain mandatory requirements", + "Purpose": "The aim of the aid granted is to compensate farmers, forest holders and other land managers for all or part of the additional costs and income foregone related to certain area-specific disadvantages in the area concerned which are imposed by requirements resulting from the implementation of the Natura 2000 Directives (Council Directive 92/43/EEC³ and Directive 2009/147/EC of the European Parliament and of the Council⁴) or, for agricultural areas, the Water Framework Directive (Directive 2000/60/EC of the European Parliament and of the Council).", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0003"] + } + }, + { + "Code": "V.4", + "Name": "Investments, including investments in irrigation", + "Purpose": "The aim of the aid granted is to support investments in tangible or intangible assets, including investments in irrigation, that contribute to achieving one or more of the specific objectives of the CAP.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0004"] + } + }, + { + "Code": "V.5", + "Name": "Setting-up of young farmers, new farmers and rural business start-up", + "Purpose": "The aim of the aid granted is to support the setting-up of young farmers, new farmers and, under certain conditions, rural business start-up with the view of contributing to the achievement of one or more of the specific objectives of the CAP.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0005"] + } + }, + { + "Code": "V.6", + "Name": "Risk management tools", + "Purpose": "The aim of the aid granted is to promote risk management tools, which help farmers manage production and income risks related to their agricultural activity which are outside their control.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0006"] + } + }, + { + "Code": "V.7", + "Name": "Cooperation", + "Purpose": "The aim of the aid granted is to support cooperation with the view of contributing to the achievement of one or more of the specific objectives of the CAP. This includes cooperation support to:\n(a) prepare and implement Operational Group operations of the European Innovation Partnership for agricultural productivity and sustainability;\n(b) prepare and implement LEADER\n(c) promote and support Union and national recognised quality schemes and their use by farmers;\n(d) support producer groups, producer organisations or inter-branch organisations;\n(e) prepare and implement Smart Villages strategies;\n(f) support other forms of cooperation.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0007"] + } + }, + { + "Code": "V.8", + "Name": "Knowledge exchange and dissemination of information", + "Purpose": "The aim of the aid granted is to support knowledge exchange and information actions that contribute to one or more of the specific objectives of the CAP, specifically targeting the protection of nature, environment and climate, including environmental education and awareness actions and the development of rural businesses and communities. Such actions may include actions to promote innovation, training and advice as well as exchange and dissemination of knowledge and information.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0008"] + } + }, + { + "Code": "VI.1", + "Name": "Knowledge transfer and information actions (Article 14)", + "Purpose": "This measure concerns training and other types of activities such as workshops, coaching, demonstration activities, information actions, short-term farm and forest exchange and visit schemes in order. The aim is to enhance the human potential of persons engaged in the agricultural, food and forestry sectors, land managers and small and medium-sized enterprises (SMEs) operating in rural areas.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 01", "08 03 01 03 01"] + } + }, + { + "Code": "VI.2", + "Name": "Advisory services, farm management and farm relief services (Article 15)", + "Purpose": "This measure, through the use of advisory services as well as the setting up of advisory, farm management and farm relief services, aims to improve the sustainable management and the economic and environmental performance of farm and forest holdings and SMEs operating in rural areas. It also promotes the training of advisors.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 02", "08 03 01 03 02"] + } + }, + { + "Code": "VI.3", + "Name": "Quality schemes for agricultural products and foodstuffs (Article 16)", + "Purpose": "The aim of this measure is to support all new entrants to the Union, national and voluntary quality schemes. Support may also cover costs arising from information and promotion activities in order to improve consumers' awareness of the existence and specifications of products produced under these Union and national quality schemes.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 03", "08 03 01 03 03"] + } + }, + { + "Code": "VI.4", + "Name": "Investments in physical assets (Article 17)", + "Purpose": "The aim of this measure is to improve the economic and environmental performance of agricultural holdings and rural enterprises, improve the efficiency of the agricultural products marketing and processing sectors, provide infrastructure needed for the development of agriculture and forestry and support non-remunerative investments necessary to achieve environmental aims.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 04", "08 03 01 03 04"] + } + }, + { + "Code": "VI.5", + "Name": "Restoring agricultural production potential damage by natural disasters and introduction of appropriate prevention actions (Article 18)", + "Purpose": "The aim of this measure is to help farmers prevent natural disasters and catastrophic events or restore agricultural potential, which has been damaged, after its formal recognition by the competent public authorities of Member States, in order to help farm viability and competitiveness in the face of such events.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 05", "08 03 01 03 05"] + } + }, + { + "Code": "VI.6", + "Name": "Farm and business development (Article 19)", + "Purpose": "The aim of this measure is to support the creation and development of new viable economic activities such as new holdings run by young farmers, new businesses in rural areas, or the development of small farms. Support is also given to new or existing enterprises for investments and development of non-agricultural activities which are essential for the development and competitiveness of rural areas and of all farmers diversifying their agricultural activities. The measure provides payments for farmers eligible for the small farmers scheme who permanently transfer their holding to another farmer.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 06", "08 03 01 03 06"] + } + }, + { + "Code": "VI.7", + "Name": "Basic services and village renewal in rural areas (Article 20)", + "Purpose": "The aim of this measure is to support the interventions stimulating growth and promoting environmental and socio-economic sustainability of rural areas, in particular through the development of local infrastructure (including broadband, renewable energy and social infrastructure) and local basic services, as well as through the renewal of villages and activities aimed at the restoration and upgrading of the cultural and natural heritage. The measure also supports the relocation of activities and conversion of facilities with a view to improving the quality of life or increasing the environmental performance of the settlement.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 07", "08 03 01 03 07"] + } + }, + { + "Code": "VI.8", + "Name": "Investments in forest area development and improvement of the viability of forests (Article 21, Articles 22 to 26)", + "Purpose": "The aim of this measure is to promote investments in development of woodlands, in forest protection, in innovation in forestry, in forestry technologies and forest products, in order to contribute to the growth potential of rural areas.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 08", + "08 03 01 02 37", + "08 03 01 02 47", + "08 03 01 02 57", + "08 03 01 03 08", + "08 03 01 03 37", + "08 03 01 03 47", + "08 03 01 03 57" + ] + } + }, + { + "Code": "VI.9", + "Name": "Afforestation and creation of woodland (Article 22)", + "Purpose": "The aim of this sub-measure is to provide support for operations of afforestation and creation of woodland on agricultural and non-agricultural land.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["See VI.8"] + } + }, + { + "Code": "VI.10", + "Name": "Establishment, regeneration or renovation of agroforestry systems (Article 23)", + "Purpose": "The aim of this sub-measure is to support the establishment of agroforestry systems and practices where woody perennials are deliberately integrated with crops and/or animals on the same land unit.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["See VI.8"] + } + }, + { + "Code": "VI.11", + "Name": "Prevention and restoration of damage to forests from forest fires, natural disasters and catastrophic events (Article 24)", + "Purpose": "This sub-measure aims at preventing and restoring (clearing and replanting) forestry potential after the occurrence of forest fires, other natural disasters including pest and disease outbreaks, as well as climate change related threats.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["See VI.8"] + } + }, + { + "Code": "VI.12", + "Name": "Investments improving the resilience and environmental value of forest ecosystems (Article 25)", + "Purpose": "The aim of this sub-measure is to support actions that enhance the environmental value of the forest, facilitate the adaptation and mitigation of forests to climate change, provide ecosystem services and enhance the public amenity value of forest. The increase of the environmental value of the forest should be ensured.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["See VI.8"] + } + }, + { + "Code": "VI.13", + "Name": "Investments in forest technologies, processing, mobilising and marketing of forest products (Article 26)", + "Purpose": "This sub-measure aims at providing support for investment in machinery and/or equipment related to harvesting, cutting, mobilising, processing the wood prior to industrial sawing of wood. The main goal of this sub-measure is to improve the economic value of forests.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["See VI.8"] + } + }, + { + "Code": "VI.14", + "Name": "Setting up of producer groups and organisations (Article 27)", + "Purpose": "The aim of this measure is to support the setting up of producer groups and organisations, especially in the early years, when additional costs are incurred so as to face jointly market challenges and strengthening bargain power in relation to production and marketing, including in local markets.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 09", "08 03 01 03 09"] + } + }, + { + "Code": "VI.15", + "Name": "Agri-environment-climate (Article 28)", + "Purpose": "The aim of this measure is to encourage land managers to apply farming practices contributing to the protection of the environment, landscape, natural resources and climate mitigation and adaptation. It may concern not only environmentally beneficial improvements to farming practice but also the maintenance of existing beneficial practices.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 10", + "08 03 01 02 30", + "08 03 01 02 40", + "08 03 01 02 50", + "08 03 01 02 60", + "08 03 01 03 10", + "08 03 01 03 30", + "08 03 01 03 40", + "08 03 01 03 50", + "08 03 01 03 60" + ] + } + }, + { + "Code": "VI.16", + "Name": "Organic farming (Article 29)", + "Purpose": "The aim of this measure is to focus on supporting the conversion to and/or the maintenance of organic farming practices and methods, with a view to encourage farmers to participate in such schemes, thus answering to society's demand for the use of environmentally friendly farm practices.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 11", + "08 03 01 02 31", + "08 03 01 02 41", + "08 03 01 02 51", + "08 03 01 02 61", + "08 03 01 03 11", + "08 03 01 03 31", + "08 03 01 03 41", + "08 03 01 03 51", + "08 03 01 03 61" + ] + } + }, + { + "Code": "VI.17", + "Name": "Natura 2000 and Water Framework Directive payments (Article 30)", + "Purpose": "The aim of this measure is to give compensatory support to beneficiaries who suffer from particular disadvantages due to specific mandatory requirements in the areas concerned resulting from the implementation of Directives 92/43/EEC, 2009/147/EC and 2000/60/EC when compared to the situation of farmers and foresters in other areas not concerned by these disadvantages.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 12", + "08 03 01 02 32", + "08 03 01 02 42", + "08 03 01 02 52", + "08 03 01 02 62", + "08 03 01 03 12", + "08 03 01 03 32", + "08 03 01 03 42", + "08 03 01 03 52", + "08 03 01 03 62" + ] + } + }, + { + "Code": "VI.18", + "Name": "Payments to areas facing natural or other specific constraints (Article 31)", + "Purpose": "The aim of this measure is to give support to beneficiaries who suffer from particular constraints due to their location in mountain areas or other areas facing significant natural constraints or specific constraints.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 13", + "08 03 01 02 33", + "08 03 01 02 43", + "08 02 01 02 53", + "08 03 01 02 63", + "08 03 01 03 13", + "08 03 01 03 33", + "08 03 01 03 43", + "08 02 01 03 53", + "08 03 01 03 63" + ] + } + }, + { + "Code": "VI.19", + "Name": "Animal welfare (Article 33)", + "Purpose": "The aim of this measure is to provide payments to farmers who undertake, on a voluntary basis, to carry out operations of one or more animal welfare commitments.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 14", + "08 03 01 02 34", + "08 03 01 02 44", + "08 03 01 02 54", + "08 03 01 02 64", + "08 03 01 03 14", + "08 03 01 03 34", + "08 03 01 03 44", + "08 03 01 03 54", + "08 03 01 03 64" + ] + } + }, + { + "Code": "VI.20", + "Name": "Forest-environmental and climate services and forest conservation (Article 34)", + "Purpose": "The aim of this measure is to respond to the needs of promoting the sustainable management and improvement of forests and woodland, including the maintenance and improvement of biodiversity, water and soil resources and combating climate change and also to the need to conserve the forest genetic resources, including activities such as development of different varieties of forest species in order to adapt to specific local conditions.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 15", + "08 03 01 02 35", + "08 03 01 02 45", + "08 03 01 02 55", + "08 03 01 02 65", + "08 03 01 03 15", + "08 03 01 03 35", + "08 03 01 03 45", + "08 03 01 03 55", + "08 03 01 03 65" + ] + } + }, + { + "Code": "VI.21", + "Name": "Cooperation (Article 35)", + "Purpose": "The aim of this measure is to promote forms of co-operation involving at least two entities and aiming to develop, among others: pilot projects; new products, practices, processes and technologies in the agriculture, food and forestry sectors; tourism services; short supply chains and local markets; joint projects / practices concerning the environment / climate change; projects for the sustainable provision of biomass; non-LEADER local development strategies; forest management plans; and diversification into \"social farming\" activities.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 16", "08 03 01 03 16"] + } + }, + { + "Code": "VI.22", + "Name": "Risk management (Article 36)", + "Purpose": "This measure represents a new risk management toolkit and takes forward the possibilities that currently exist to support insurances and mutual funds via Member States' national direct payment envelopes to help farmers exposed to increasing economic and environmental risks. The measure also introduces an income stabilisation tool to provide compensation to farmers suffering a severe drop in their income.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 17", "08 03 01 03 17"] + } + }, + { + "Code": "VI.22a", + "Name": "Exceptional temporary support to farmers and SMEs particularly affected by the COVID-19 crisis (Article 39b)", + "Purpose": "The aim of this measure offers is to offer to farmers and to small and medium-sized enterprises (SMEs) temporary support due to the Covid-19 crisis.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 21"] + } + }, + { + "Code": "VI.22b", + "Name": "Exceptional temporary support to farmers and SMEs particularly affected by the Russia's invasion of Ukraine (Article 39c)", + "Purpose": "The aim of this measure is to offer to farmers and to small and medium-sized enterprises (SMEs) temporary support due to Russia's invasion of Ukraine.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 22"] + } + }, + { + "Code": "VI.23", + "Name": "Financing of complementary national direct payments for Croatia (Article 40)", + "Purpose": "The aim of this measure is to offer to the farmers eligible for complementary national direct payments in Croatia a top-up payment under the EAFRD.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 18"] + } + }, + { + "Code": "VI.24", + "Name": "Support for LEADER local development (community-led local development) (Article 35 of Regulation (EU) No 1303/2013 of the European Parliament and of the Council⁶)", + "Purpose": "The aim of this measure is to maintain LEADER as an integrated territorial development tool on sub-regional ('local') level which will directly contribute to the balanced territorial development of rural areas, which is one of the overall objectives of the rural development policy.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 19", + "08 03 01 02 39", + "08 03 01 02 49", + "08 03 01 02 59", + "08 03 01 02 69", + "08 03 01 03 19", + "08 03 01 03 39", + "08 03 01 03 49", + "08 03 01 03 59", + "08 03 01 03 69" + ] + } + }, + { + "Code": "VI.25", + "Name": "Technical assistance (Articles 51 to 54)", + "Purpose": "The aim of this measure is to give to Member States the ability to provide a technical assistance to support actions that support administrative capacity linked to the management of European Structural and Investment (ESI) Funds. These actions may be addressed to the preparation, management, monitoring, evaluation, information and communication, networking, complaint resolution and control and audit of the Rural Development Programmes.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 20", "08 03 01 03 20"] + } + }, + { + "Code": "VII.1", + "Name": "Measures provided for in Regulation (EU) No 228/2013", + "Purpose": "POSEI measures are specific agricultural schemes aiming at taking into account the constraints of the Outermost Regions as required by Article 349 of the Treaty. It consists of two main elements: the specific supply arrangements and the measures to support local production. The former aims at mitigating additional costs for supplying essential products resulting from the remoteness of these regions (through aid for products from the Union and exemption from import duties for products from third countries) and the latter at assisting the development of the local agriculture sector (direct payments and market measures). POSEI also allow the financing of plant-health programmes.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 01", "08 02 05 01"], + "Chapter_08_03": [] + } + }, + { + "Code": "VIII.1", + "Name": "Measures provided for in Regulation (EU) No 229/2013", + "Purpose": "The regime for the smaller Aegean Islands is similar to POSEI but does not have the same legal basis in the Treaty and operates on a smaller scale than POSEI. It includes both the specific supply arrangements (limited however to aid for products from the Union) and the measures to support the local agricultural activities consisting in top-up payments for specifically defined local products.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 01", "08 02 05 01"], + "Chapter_08_03": [] + } + }, + { + "Code": "IX.1", + "Name": "Information and promotion measures provided for in Regulation (EU) No 1144/2014", + "Purpose": "Information provision and promotion measures concerning agricultural products and certain food products based on agricultural products implemented in the internal market or in third countries as listed in Regulation (EU) No 1144/2014 may be fully or partly financed by the Union budget, subject to the conditions laid down in this Regulation. These measures shall take the form of information and promotion programmes.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 02"], + "Chapter_08_03": [] + } + } +] diff --git a/scrapy_fs/scrapy_fs/spiders/pl_scraper.py b/scrapy_fs/scrapy_fs/spiders/pl_scraper.py index 7260a39..ea21b5c 100644 --- a/scrapy_fs/scrapy_fs/spiders/pl_scraper.py +++ b/scrapy_fs/scrapy_fs/spiders/pl_scraper.py @@ -56,7 +56,9 @@ }, { """ +import json import math +import os import scrapy from scrapy.spiders import Spider @@ -74,14 +76,37 @@ class PLSpider(Spider): # "CONCURRENT_REQUESTS_PER_DOMAIN": 20, } - def __init__(self, year=None, *args, **kwargs): + def __init__(self, year=None, raw=None, *args, **kwargs): super().__init__(*args, **kwargs) self.year = int(year) + self.raw = raw self.page_size = 50 - self.expected_total_count = None # Initialize expected_total_count - self.item_count = 0 # Initialize item counter + self.expected_total_count = None + self.item_count = 0 + + # Load scheme mapping with normalized keys + scheme_path = os.path.join(os.path.dirname(__file__), "pl_scheme.json") + try: + with open(scheme_path, encoding="utf-8") as f: + scheme_data = json.load(f) + + # Normalize: "IV.9" -> "iv_9" + def normalize(code): + if not code: + return None + return code.lower().replace(".", "_") + + self.scheme_map = { + normalize(entry["Code"]): entry + for entry in scheme_data + if entry.get("Code") + } + except Exception as e: + self.scheme_map = {} + print(f"Could not load pl_scheme.json: {e}") def start_requests(self): + url = f"https://beneficjenciwpr.minrol.gov.pl/api/beneficiary?first=0&page=0&size={self.page_size}&sort=¤cy.equals=pln&year.equals={self.year}" yield scrapy.Request(url, callback=self.parse_total_count) @@ -102,6 +127,9 @@ def parse_total_count(self, response): # GET https://beneficjenciwpr.minrol.gov.pl/api/beneficiary/13139415 def parse(self, response): + if self.raw: + yield {"url": response.url, "raw": json.dumps(response.json())} + for item in response.json(): # Prepare partial data name = "" @@ -146,11 +174,13 @@ def parse(self, response): yield scrapy.Request(detail_url, callback=self.parse_detail, meta=meta) def parse_detail(self, response): - # Extract additional details from detail page meta = response.meta detail_data = response.json() - # Only keep allowed fields + if self.raw: + yield {"url": response.url, "raw": json.dumps(detail_data)} + return + allowed_fields = { "country", "currency", @@ -166,14 +196,27 @@ def parse_detail(self, response): if isinstance(value, (int, float)) and value != 0: if key in ["year"]: continue - # print(f"Key: {key}, Value: {value}") - yield FarmSubsidyItem(**filtered_meta, scheme=key, amount=value) + scheme_code = key + # Normalize for lookup + norm_code = scheme_code.lower().replace(".", "_") + scheme_info = self.scheme_map.get(norm_code, {}) + scheme_name = scheme_info.get("Name", "") + scheme_description = scheme_info.get("Purpose", "") + + yield FarmSubsidyItem( + **filtered_meta, + scheme_code=scheme_code, + scheme_name=scheme_name, + scheme_description=scheme_description, + amount=value, + ) self.item_count += 1 def closed(self, reason): + # For 2022, 50 are missing. Unclear why. - if hasattr(self, "expected_total_count"): + if not self.raw and hasattr(self, "expected_total_count"): print( f"Expected items: {self.expected_total_count}, Scraped items: {self.item_count}, Difference: {self.item_count - self.expected_total_count}" ) diff --git a/special-scrapers/.gitignore b/special-scrapers/.gitignore new file mode 100644 index 0000000..5c1f1e5 --- /dev/null +++ b/special-scrapers/.gitignore @@ -0,0 +1,10 @@ +# Playwright +node_modules/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ + +failed.txt +uploads3.sh +it_captcha/*.h5 diff --git a/special-scrapers/avg_new_files_per_minute.sh b/special-scrapers/avg_new_files_per_minute.sh new file mode 100755 index 0000000..1dd1f3b --- /dev/null +++ b/special-scrapers/avg_new_files_per_minute.sh @@ -0,0 +1,20 @@ +#!/bin/bash +DIR="data/it" # <-- set this to your target folder + +# Get current time and 1 hour ago, in seconds since epoch +now=$(date +%s) +start=$((now - 300)) + +# List all files, get their mtime in seconds since epoch +find "$DIR" -type f -exec stat -f "%m" {} \; | \ +awk -v start="$start" -v now="$now" ' + $1 >= start && $1 <= now { + minute = int(($1 - start) / 60); + count[minute]++; + } + END { + for (i in count) { total += count[i]; mins++ } + if (mins > 0) print "Average files per minute (last 5 min):", total/mins; + else print 0 + } +' diff --git a/special-scrapers/it.js b/special-scrapers/it.js new file mode 100644 index 0000000..619b4d7 --- /dev/null +++ b/special-scrapers/it.js @@ -0,0 +1,396 @@ +const playwright = require("playwright"); +const fs = require("fs"); +const { default: PQueue } = require("p-queue"); +const { get } = require("http"); +const fetch = (...args) => + import("node-fetch").then((mod) => mod.default(...args)); +const FormData = require("form-data"); +const csv = require("csv-parser"); + +const CONCURRENCY = 10; +const TIMEOUT = 30000; +const MAX_RETRIES = 20; + +const dump = + "/Users/user/SynologyDrive/Beruf/Projekte/farmsubsidies/dumps/it_2023/Trasparenza2023_Ita.csv"; + +async function readCsv(dump) { + return new Promise((resolve, reject) => { + const results = []; + fs.createReadStream(dump) + .pipe(csv({ separator: ";" })) + .on("data", (data) => results.push(data)) + .on("end", () => resolve(results)) + .on("error", reject); + }); +} + +const scrapeTable = async (page, code, location) => { + const table = await page.locator("table#results"); + const tableHtml = await table.innerHTML(); + if (tableHtml.length > 1) { + fs.writeFileSync(`data/it/${location}-${code}.html`, tableHtml); + console.log(`Page ${code} ${location} saved to file.`); + return true; + } + return false; +}; + +// // generate strings from 01 to 99 +// const generateAllCodes = () => { +// const codes = []; +// for (let i = 10; i <= 99; i++) { +// const code = i.toString().padStart(2, "0"); +// codes.push(code); +// } +// return codes; +// }; + +const solveCaptcha = async (page) => { + // Find the captcha image and get its src + const captchaImg = await page.locator("img[src*='Captcha.jpg']"); + const imgSrc = await captchaImg.getAttribute("src"); + // console.log("Captcha image source:", imgSrc); + + // Take a screenshot of the captcha image as a buffer + const captchaBuffer = await captchaImg.screenshot(); + + // Use Node.js FormData + const formData = new FormData(); + formData.append("file", captchaBuffer, { + filename: "captcha.jpg", + contentType: "image/jpeg", + }); + + // Send the image to the server for processing + const response = await fetch("http://127.0.0.1:5001/predict", { + method: "POST", + body: formData, + headers: formData.getHeaders(), + }); + + const result = await response.json(); + console.log("Captcha result:", result); + + return result.result; // or handle error/result as needed +}; + +const getResult = async (page, location, code) => { + // enter location, input with name 'ricercaComuneResidenza' + await page.locator("input[name='ricercaComuneResidenza']").fill(location); + await page.waitForTimeout(1000); + + if (code.includes("-")) { + // split code by '-' + const codeParts = code.split("-"); + // enter code, input with name 'ricercaMacroMisura' + await page + .locator("select[name='ricercaMacroMisura']") + .selectOption(codeParts[0]); + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(5000); + + // get all options from select with name 'ricercaMisura' + const options = await page + .locator("select[name='ricercaMisura'] option") + .all(); + const idx = parseInt(codeParts[1]); + if (!options[idx]) { + throw new Error( + `Option index ${idx} not found in 'ricercaMisura' select` + ); + } + const val = await options[idx].getAttribute("value"); + await page.locator("select[name='ricercaMisura']").selectOption(val); + + if (codeParts.length > 2) { + await page + .locator("select[name='ricercaImportoPagamenti']") + .selectOption(codeParts[2]); + } + } else { + await page.locator("select[name='ricercaMacroMisura']").selectOption(code); + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(5000); + } + + const captchaResult = await solveCaptcha(page); + + await page.locator("input[name='caratteriImmagine']").fill(captchaResult); + + // click on the button with the text "Find" + await page.locator("input:has-text('Find')").first().click(); + + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(5000); + + // The characters you type do not match those in the image. + + const errorMessage = await page + .locator("img:has-text('do not match')") + .isVisible(); + + if (errorMessage) { + console.log("Captcha error, retrying..."); + return getResult(page, location, code); + } + + // No beneficiary found for the chosen criteria. + const noResults = await page + .locator("text=No beneficiary found for the chosen criteria.") + .isVisible(); + + if (noResults) { + fs.writeFileSync(`data/it/${location}-${code}.html`, "No results"); + console.log("No results found for code", code, location); + return; + } + + const isSuccess = await scrapeTable(page, code, location); + + if (isSuccess) { + console.log("Success! Found results for code", code, location); + } + + if (!isSuccess) { + console.log("No results found for code", code, location); + throw new Error("No results found"); + } + return; +}; + +const oneRun = async (browser, location, code) => { + let tryCount = 0; + while (tryCount < MAX_RETRIES) { + try { + console.log( + `Starting run for code ${location} ${code}, try ${tryCount + 1}` + ); + // skip if html file exists + if (fs.existsSync(`data/it/${location}-${code}.html`)) { + console.log(`Code ${code} already exists, skipping.`); + return; + } + if (CONCURRENCY > 1) { + const randomWait = Math.floor(Math.random() * TIMEOUT); + await new Promise((resolve) => setTimeout(resolve, randomWait)); + } + const context = await browser.newContext({ ignoreHTTPSErrors: true }); // Bypass SSL errors + context.setDefaultTimeout( + tryCount > MAX_RETRIES / 2 ? TIMEOUT * 2 : TIMEOUT + ); + const page = await context.newPage(); + + await page.goto( + "https://www.agea.gov.it/portale-agea/servizi/pubblicazione-dei-beneficiari" + ); + await page.waitForLoadState("networkidle"); + // await page.waitForTimeout(1000); + + // click on first button with the text "Vai al servizio" + await page + .locator("button span:has-text('Vai al servizio')") + .first() + .click(); + + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(2000); + + // close old tab + const pages = context.pages(); + // console.log("Pages length:", pages.length); + if (pages.length > 1) { + // focus on new tab + await pages[1].bringToFront(); + // console.log("Focused on new tab"); + // close old tab + await pages[0].close(); + // console.log("Closed old tab"); + } + + const newPage = context.pages()[0]; + + // click on the link with the title "English" + await newPage.waitForTimeout(5000); + await newPage.locator("img[title='English']").first().click(); + await newPage.waitForLoadState("networkidle"); + await newPage.waitForTimeout(5000); + // click on the link with the text "Search for beneficiaries" + + await newPage.locator("a:has-text('BENEFICIARIES')").first().click(); + await newPage.waitForLoadState("networkidle"); + // await newPage.waitForTimeout(2000); + + await getResult(newPage, location, code); + + console.log(`Finished ${code}.`); + await newPage.close(); + break; // Success, exit retry loop + } catch (error) { + tryCount++; + console.error(`Error in code ${code} (try ${tryCount}):`, error); + if (tryCount >= MAX_RETRIES) { + console.error( + `Failed after ${MAX_RETRIES} attempts for code ${code}, location ${location}` + ); + // append location and code to a file + fs.appendFileSync("failed.txt", `${location}-${code}\n`); + } else { + console.log( + `Retrying code ${code}, location ${location} (attempt ${ + tryCount + 1 + })...` + ); + } + } + } +}; + +(async () => { + const launchOptions = { + headless: true, + }; + + const browser = await playwright.chromium.launch(launchOptions); + + const queue = new PQueue({ concurrency: CONCURRENCY }); + // const allCodes = generateAllCodes(); + let allCodes = [ + "1", + "2-1", + "2-2", + "2-3", + "2-4", + "2-5", + "2-6-1", + "2-6-2", + "2-6-3", + "2-6-4", + "2-6-5", + "2-6-6", + "2-7-1", + "2-7-2", + "2-7-3", + "2-7-4", + "2-7-5", + "2-7-6", + "2-8-1", + "2-8-2", + "2-8-3", + "2-8-4", + "2-8-5", + "2-8-6", + "2-9", + "2-10", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + ]; + + for (let j = 1; j < 7; j++) { + for (let i = 1; i < 25; i++) { + allCodes.push("4-" + i + "-" + j); + } + // for (let i = 1; i < 25; i++) { + allCodes.push("2-" + "5" + "-" + j); + allCodes.push("2-" + "9" + "-" + j); + allCodes.push("2-" + "10" + "-" + j); + // } + } + // allCodes = [...allCodes, ...allCodes, ...allCodes]; + // allCodes = [...allCodes, ...allCodes, ...allCodes]; + + const results = await readCsv(dump); + const allLocation = results.map((row) => row["Comune"]); + + // get counts of all locations + const locationCounts = {}; + allLocation.forEach((location) => { + if (locationCounts[location]) { + locationCounts[location]++; + } else { + locationCounts[location] = 1; + } + }); + // sort locations by count + const sortedLocations = Object.entries(locationCounts).sort( + (a, b) => b[1] - a[1] + ); + console.log("Sorted locations:", sortedLocations.slice(0, 10)); + + // displat locations with onle one entry + const singleEntryLocations = Object.entries(locationCounts).filter( + (entry) => entry[1] == 1 + ); + // console.log("Locations with only one entry:", singleEntryLocations); + + // only keep locations with more than 10 entries + const filteredLocations = Object.entries(locationCounts) + .filter((entry) => entry[1] > 1) + .filter((entry) => entry[0] != "ROMA") + .filter((entry) => entry[0] != "SISSA TRECASALI") + .filter((entry) => entry[0] != "BADIA .ABTEI.") + .filter((entry) => entry[0] != "APPIANO SULLA STRADA DEL VIN") + .filter((entry) => entry[0] != "MONTEBELLO JONICO") + .filter((entry) => entry[0] != "RENON .RITTEN.") // buggy location + .sort((a, b) => b[1] - a[1]); + // console.log("Locations with more than 10 entries:", filteredLocations); + + const uniqueLocations = filteredLocations.map((entry) => entry[0]); + // const uniqueLocations = [...new Set(allLocation)]; + + console.log("Unique locations:", uniqueLocations.length); + + const allPromises = []; + + const unfinished = allCodes + .filter((code) => { + return ( + !fs.existsSync(`data/it/${""}-${code}.html`) && + code.split("-").length == 3 + ); + }) + .map((code) => { + // if (code[0] == "2" && "678".includes(code.split("-")[1])) return code; + if (code[0] == "2") return code[0] + "-" + code.split("-")[1]; + + return code.split("-")[0]; + }); + + const setUnfinished = new Set(unfinished); + const unfinishedArray = [...setUnfinished]; + + for (const location of uniqueLocations) { + if (!location) continue; + // for (const location of uniqueLocations) { + // for (const code of allCodes) { + // if (code.split("-").length == 3) { + // allPromises.push(queue.add(() => oneRun(browser, location, code))); + // } + // } + for (const code of unfinishedArray) { + if (["NOCI", "DELICETO"].includes(location) && code.startsWith("2-7")) { + allPromises.push(queue.add(() => oneRun(browser, location, "2-7-1"))); + allPromises.push(queue.add(() => oneRun(browser, location, "2-7-2"))); + allPromises.push(queue.add(() => oneRun(browser, location, "2-7-3"))); + allPromises.push(queue.add(() => oneRun(browser, location, "2-7-4"))); + allPromises.push(queue.add(() => oneRun(browser, location, "2-7-5"))); + allPromises.push(queue.add(() => oneRun(browser, location, "2-7-6"))); + } else { + allPromises.push(queue.add(() => oneRun(browser, location, code))); + } + } + } + + // const allPromises = allCodes.map((code) => { + // return queue.add(() => oneRun(browser, "Roma", code)); + // }); + await Promise.all(allPromises); + console.log("All pages scraped."); + + await browser.close(); +})(); diff --git a/special-scrapers/it_captcha/captcha.py b/special-scrapers/it_captcha/captcha.py new file mode 100644 index 0000000..d6beed5 --- /dev/null +++ b/special-scrapers/it_captcha/captcha.py @@ -0,0 +1,396 @@ +""" +# /// script +# dependencies = [ +# "keras==3.9.2", +# "numpy==2.1.3", +# "pillow==11.2.1", +# "requests==2.32.3", +# "tensorflow==2.19.0", +# ] +# /// +""" + +import base64 +import io +import os + +import numpy as np +from keras.layers import ( + Activation, + BatchNormalization, + Conv2D, + Dense, + Dropout, + Flatten, + MaxPooling2D, +) +from keras.models import Sequential +from keras.preprocessing.image import img_to_array +from tensorflow import keras + +Adam = keras.optimizers.Adam + +from PIL import Image +from flask import Flask, request, jsonify + +NOISE_BACKGROUND = (255, 255, None) +BACKGROUND = (255, 255, 255) +TEXT_NOISE = (0, 5, 255) +TEXT = (0, 0, 0) +NOISE = (0, 0, 0) +THRESHOLD = 140 + +CLASSES = [ + "3", + "4", + "6", + "7", + "8", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "k", + "r", + "s", + "t", + "v", + "x", + "y", +] +IMG_SIZE = (22, 50) + + +def normalize_color(im, from_color, to_color, threshold): + im = im.copy() + w, h = im.size + for i in range(w): + for j in range(h): + p = im.getpixel((i, j)) + if not isinstance(p, tuple): + p = (p,) + diff = [ + abs(x - from_color[k]) + for k, x in enumerate(p) + if from_color[k] is not None + ] + if all(map(lambda x: x < threshold, diff)): + im.putpixel((i, j), to_color) + return im + + +def non_white(p_list): + diff = [abs(x - BACKGROUND[i]) for p in p_list for i, x in enumerate(p)] + return any(map(lambda x: x > 0, diff)) + + +def all_white(p_list): + diff = [abs(x - BACKGROUND[i]) for p in p_list for i, x in enumerate(p)] + return all([x == 0 for x in diff]) + + +def check_image(im, width_range, check_func=non_white): + w, h = im.size + for i in width_range: + if check_func((im.getpixel((i, j))) for j in range(h)): + return i + + +def find_start_end(im): + w, h = im.size + start = check_image(im, range(w)) + end = check_image(im, range(w - 1, -1, -1)) + return start, end + + +def crop_start_end(im): + start, end = find_start_end(im) + box = (start, 0, end, im.size[1]) + return im.crop(box) + + +def get_empty_spaces(im): + w, h = im.size + x = check_image(im, range(0, w), check_func=non_white) + empty_spots = [] + last_spot = None + while True: + empty = check_image(im, range(x, w), check_func=all_white) + if empty is None: + break + if empty >= w - 1: + break + if last_spot is None: + empty_spots.append(empty) + else: + if abs(empty - last_spot) > 1: + empty_spots.append(last_spot) + empty_spots.append(empty) + last_spot = empty + x = empty + 1 + empty_spots.append(last_spot) + return [ + (empty_spots[i], empty_spots[i + 1]) for i in range(0, len(empty_spots) - 1, 2) + ] + + +def crop_by_splits(image, splits): + w, h = image.size + x = 0 + for a, b in splits: + yield image.crop((x, 0, a, h)) + x = b + + +class LetterSplitter: + def __init__(self, image, letter_count=6): + self.image = image + self.w, self.h = image.size + self.letter_count = letter_count + self.current_letter = 0 + self.x = 0 + self.recalc() + + def recalc(self): + remaining = self.w - self.x + self.ideal_width = remaining / (self.letter_count - self.current_letter) + self.threshold = self.ideal_width / 4 + self.ideal_x = self.x + self.ideal_width + + def make_letter(self, end_x, new_x=None): + part = self.image.crop((self.x, 0, end_x, self.h)) + self.current_letter += 1 + if new_x is None: + self.x = end_x + 1 + else: + self.x = new_x + 1 + self.recalc() + return part + + def get_images(self): + empty_spaces = get_empty_spaces(self.image) + for a, b in empty_spaces: + if self.current_letter == self.letter_count: + break + if abs(self.ideal_x - a) < self.threshold: + # split ideal + yield self.make_letter(a, b) + continue + elif self.ideal_x > a: + # split too early, let's wait for next + continue + yield from self.advance(a) + yield from self.advance(self.w) + + def advance(self, until): + while ( + self.ideal_x < until - self.threshold + and self.current_letter < self.letter_count + ): + yield self.make_letter(self.ideal_x) + + +def alt_split_letters(image): + splitter = LetterSplitter(image) + yield from splitter.get_images() + + +def split_letters(image, letter_count=5): + w, h = image.size + part_width = w / letter_count + parts = [] + for i in range(letter_count): + yield image.crop((i * part_width, 0, i * part_width + part_width, h)) + + +def normalize_crop(im): + im = normalize_color(im, NOISE_BACKGROUND, BACKGROUND, THRESHOLD) + im = normalize_color(im, NOISE, BACKGROUND, THRESHOLD) + im = normalize_color(im, TEXT_NOISE, TEXT, THRESHOLD) + im = crop_start_end(im) + return im + + +def get_split_letters_from_image(im): + yield from split_letters(normalize_crop(im)) + + +def resize_images(images): + for img in images: + gray = img.convert("L") + bw = gray.point(lambda x: 0 if x < 128 else 255, "1") + yield bw.resize(IMG_SIZE) + + +def letters_from_image(image): + yield from resize_images(get_split_letters_from_image(image)) + + +def read_solution_images(filename): + with open(filename) as f: + count = 0 + for line in f: + solution, image_data = line.split("|") + _, image_data = image_data.split(",") + im = Image.open(io.BytesIO(base64.b64decode(image_data))) + yield solution, im + + +def generate_images(filename): + for solution, image in read_solution_images(filename): + letter_images = letters_from_image(image) + yield from zip(solution, letter_images) + + +def get_letter_onehot(letter): + index_offset = CLASSES.index(letter) + num_classes = len(CLASSES) + labels_one_hot = np.zeros(num_classes) + labels_one_hot[index_offset] = 1 + return labels_one_hot + + +def convert_captchas(filename): + images = [] + letters = [] + for letter, im in generate_images(filename): + image = img_to_array(im, data_format="channels_last") + images.append(image) + letters.append(get_letter_onehot(letter)) + images = np.array(images, dtype="float32") + labels = np.array(letters) + perm = np.arange(len(images)) + np.random.shuffle(perm) + images = images[perm] + labels = labels[perm] + return images, labels + + +def extract_data(filename, recreate=False): + images_path = os.path.abspath("data/images.npy") + if not os.path.exists(images_path) or recreate: + images, labels = convert_captchas(filename) + np.save(images_path, images) + labels_path = os.path.abspath("data/labels.npy") + np.save(labels_path, labels) + + +def make_model(): + nb_classes = len(CLASSES) + nb_filters = 32 + # # size of pooling area for max pooling + pool_size = (2, 2) + # # convolution kernel size + kernel_size = (4, 10) + input_shape = (IMG_SIZE[1], IMG_SIZE[0], 1) + + model = Sequential() + + # model.add(Conv2D(nb_filters, (kernel_size[0], kernel_size[1]), + # padding='valid', + # input_shape=input_shape)) + # model.add(BatchNormalization(axis=-1)) + # model.add(Activation('relu')) + # model.add(Conv2D(nb_filters, (kernel_size[0], kernel_size[1]))) + # model.add(BatchNormalization(axis=-1)) + # model.add(Activation('relu')) + # model.add(MaxPooling2D(pool_size=pool_size)) + # model.add(Dropout(0.25)) + + model.add(Conv2D(32, (3, 3), input_shape=input_shape)) + model.add(BatchNormalization(axis=-1)) + model.add(Activation("relu")) + model.add(Conv2D(32, (3, 3))) + model.add(BatchNormalization(axis=-1)) + model.add(Activation("relu")) + model.add(MaxPooling2D(pool_size=(2, 2))) + + model.add(Conv2D(64, (3, 3))) + model.add(BatchNormalization(axis=-1)) + model.add(Activation("relu")) + model.add(Conv2D(64, (3, 3))) + model.add(BatchNormalization(axis=-1)) + model.add(Activation("relu")) + model.add(MaxPooling2D(pool_size=(2, 2))) + + model.add(Flatten()) + + model.add(Dense(512)) + model.add(BatchNormalization()) + model.add(Activation("relu")) + model.add(Dropout(0.5)) + model.add(Dense(nb_classes)) + model.add(Activation("softmax")) + + # model.compile(loss='categorical_crossentropy', + # optimizer='adadelta', + # metrics=['accuracy']) + model.compile( + loss="categorical_crossentropy", optimizer=Adam(), metrics=["accuracy"] + ) + + return model + + +class CaptchaSolver: + def __init__(self, model=None, model_path=None): + if model is None: + self.model = make_model() + self.model.load_weights(model_path) + else: + self.model = model + + def predict_from_bytes(self, content): + return self.predict(Image.open(io.BytesIO(content))) + + def predict(self, image_data): + letters = np.array( + [ + img_to_array(im, data_format="channels_last") + for im in letters_from_image(image_data) + ] + ) + + # predicted = self.model.predict_classes(letters) + predicted = np.argmax(self.model.predict(letters), axis=-1) + return "".join(CLASSES[i] for i in predicted) + + +def run_on_url(cs, url="https://www.sian.it/pubbAimu/Captcha.jpg"): + import requests + + response = requests.get(url) + img = Image.open(io.BytesIO(response.content)) + img.save("captcha.jpg") + return cs.predict(img) + + +def create_app(): + app = Flask(__name__) + cs = CaptchaSolver(model_path="./agea_11.h5") + + @app.route("/predict", methods=["POST"]) + def predict(): + if "file" not in request.files: + return jsonify({"error": "No file part"}), 400 + file = request.files["file"] + if file.filename == "": + return jsonify({"error": "No selected file"}), 400 + try: + img_bytes = file.read() + result = cs.predict_from_bytes(img_bytes) + print(result) + return jsonify({"result": result}) + except Exception as e: + print('lol') + return jsonify({"error": str(e)}), 500 + + return app + +if __name__ == "__main__": + app = create_app() + app.run(host="0.0.0.0", port=5001) diff --git a/special-scrapers/it_captcha/mise.toml b/special-scrapers/it_captcha/mise.toml new file mode 100644 index 0000000..e01d6ae --- /dev/null +++ b/special-scrapers/it_captcha/mise.toml @@ -0,0 +1,2 @@ +[tools] +python = "3.9" diff --git a/special-scrapers/it_captcha/poetry.lock b/special-scrapers/it_captcha/poetry.lock new file mode 100644 index 0000000..b900de9 --- /dev/null +++ b/special-scrapers/it_captcha/poetry.lock @@ -0,0 +1,1301 @@ +# This file is automatically @generated by Poetry 1.8.0 and should not be changed by hand. + +[[package]] +name = "absl-py" +version = "2.2.2" +description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." +optional = false +python-versions = ">=3.8" +files = [ + {file = "absl_py-2.2.2-py3-none-any.whl", hash = "sha256:e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092"}, + {file = "absl_py-2.2.2.tar.gz", hash = "sha256:bf25b2c2eed013ca456918c453d687eab4e8309fba81ee2f4c1a6aa2494175eb"}, +] + +[[package]] +name = "astunparse" +version = "1.6.3" +description = "An AST unparser for Python" +optional = false +python-versions = "*" +files = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] + +[package.dependencies] +six = ">=1.6.1,<2.0" +wheel = ">=0.23.0,<1.0" + +[[package]] +name = "blinker" +version = "1.9.0" +description = "Fast, simple object-to-object and broadcast signaling" +optional = false +python-versions = ">=3.9" +files = [ + {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, + {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, +] + +[[package]] +name = "certifi" +version = "2025.4.26" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"}, + {file = "certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +files = [ + {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, + {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, + {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, +] + +[[package]] +name = "click" +version = "8.1.8" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "flask" +version = "3.1.1" +description = "A simple framework for building complex web applications." +optional = false +python-versions = ">=3.9" +files = [ + {file = "flask-3.1.1-py3-none-any.whl", hash = "sha256:07aae2bb5eaf77993ef57e357491839f5fd9f4dc281593a81a9e4d79a24f295c"}, + {file = "flask-3.1.1.tar.gz", hash = "sha256:284c7b8f2f58cb737f0cf1c30fd7eaf0ccfcde196099d24ecede3fc2005aa59e"}, +] + +[package.dependencies] +blinker = ">=1.9.0" +click = ">=8.1.3" +importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} +itsdangerous = ">=2.2.0" +jinja2 = ">=3.1.2" +markupsafe = ">=2.1.1" +werkzeug = ">=3.1.0" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "flatbuffers" +version = "25.2.10" +description = "The FlatBuffers serialization format for Python" +optional = false +python-versions = "*" +files = [ + {file = "flatbuffers-25.2.10-py2.py3-none-any.whl", hash = "sha256:ebba5f4d5ea615af3f7fd70fc310636fbb2bbd1f566ac0a23d98dd412de50051"}, + {file = "flatbuffers-25.2.10.tar.gz", hash = "sha256:97e451377a41262f8d9bd4295cc836133415cc03d8cb966410a4af92eb00d26e"}, +] + +[[package]] +name = "gast" +version = "0.6.0" +description = "Python AST that abstracts the underlying Python version" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "gast-0.6.0-py3-none-any.whl", hash = "sha256:52b182313f7330389f72b069ba00f174cfe2a06411099547288839c6cbafbd54"}, + {file = "gast-0.6.0.tar.gz", hash = "sha256:88fc5300d32c7ac6ca7b515310862f71e6fdf2c029bbec7c66c0f5dd47b6b1fb"}, +] + +[[package]] +name = "google-pasta" +version = "0.2.0" +description = "pasta is an AST-based Python refactoring library" +optional = false +python-versions = "*" +files = [ + {file = "google-pasta-0.2.0.tar.gz", hash = "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e"}, + {file = "google_pasta-0.2.0-py2-none-any.whl", hash = "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954"}, + {file = "google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "grpcio" +version = "1.71.0" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.9" +files = [ + {file = "grpcio-1.71.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:c200cb6f2393468142eb50ab19613229dcc7829b5ccee8b658a36005f6669fdd"}, + {file = "grpcio-1.71.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b2266862c5ad664a380fbbcdbdb8289d71464c42a8c29053820ee78ba0119e5d"}, + {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:0ab8b2864396663a5b0b0d6d79495657ae85fa37dcb6498a2669d067c65c11ea"}, + {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c30f393f9d5ff00a71bb56de4aa75b8fe91b161aeb61d39528db6b768d7eac69"}, + {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f250ff44843d9a0615e350c77f890082102a0318d66a99540f54769c8766ab73"}, + {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6d8de076528f7c43a2f576bc311799f89d795aa6c9b637377cc2b1616473804"}, + {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9b91879d6da1605811ebc60d21ab6a7e4bae6c35f6b63a061d61eb818c8168f6"}, + {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f71574afdf944e6652203cd1badcda195b2a27d9c83e6d88dc1ce3cfb73b31a5"}, + {file = "grpcio-1.71.0-cp310-cp310-win32.whl", hash = "sha256:8997d6785e93308f277884ee6899ba63baafa0dfb4729748200fcc537858a509"}, + {file = "grpcio-1.71.0-cp310-cp310-win_amd64.whl", hash = "sha256:7d6ac9481d9d0d129224f6d5934d5832c4b1cddb96b59e7eba8416868909786a"}, + {file = "grpcio-1.71.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:d6aa986318c36508dc1d5001a3ff169a15b99b9f96ef5e98e13522c506b37eef"}, + {file = "grpcio-1.71.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:d2c170247315f2d7e5798a22358e982ad6eeb68fa20cf7a820bb74c11f0736e7"}, + {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:e6f83a583ed0a5b08c5bc7a3fe860bb3c2eac1f03f1f63e0bc2091325605d2b7"}, + {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4be74ddeeb92cc87190e0e376dbc8fc7736dbb6d3d454f2fa1f5be1dee26b9d7"}, + {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd0dfbe4d5eb1fcfec9490ca13f82b089a309dc3678e2edabc144051270a66e"}, + {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a2242d6950dc892afdf9e951ed7ff89473aaf744b7d5727ad56bdaace363722b"}, + {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0fa05ee31a20456b13ae49ad2e5d585265f71dd19fbd9ef983c28f926d45d0a7"}, + {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3d081e859fb1ebe176de33fc3adb26c7d46b8812f906042705346b314bde32c3"}, + {file = "grpcio-1.71.0-cp311-cp311-win32.whl", hash = "sha256:d6de81c9c00c8a23047136b11794b3584cdc1460ed7cbc10eada50614baa1444"}, + {file = "grpcio-1.71.0-cp311-cp311-win_amd64.whl", hash = "sha256:24e867651fc67717b6f896d5f0cac0ec863a8b5fb7d6441c2ab428f52c651c6b"}, + {file = "grpcio-1.71.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:0ff35c8d807c1c7531d3002be03221ff9ae15712b53ab46e2a0b4bb271f38537"}, + {file = "grpcio-1.71.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:b78a99cd1ece4be92ab7c07765a0b038194ded2e0a26fd654591ee136088d8d7"}, + {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:dc1a1231ed23caac1de9f943d031f1bc38d0f69d2a3b243ea0d664fc1fbd7fec"}, + {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6beeea5566092c5e3c4896c6d1d307fb46b1d4bdf3e70c8340b190a69198594"}, + {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5170929109450a2c031cfe87d6716f2fae39695ad5335d9106ae88cc32dc84c"}, + {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5b08d03ace7aca7b2fadd4baf291139b4a5f058805a8327bfe9aece7253b6d67"}, + {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f903017db76bf9cc2b2d8bdd37bf04b505bbccad6be8a81e1542206875d0e9db"}, + {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:469f42a0b410883185eab4689060a20488a1a0a00f8bbb3cbc1061197b4c5a79"}, + {file = "grpcio-1.71.0-cp312-cp312-win32.whl", hash = "sha256:ad9f30838550695b5eb302add33f21f7301b882937460dd24f24b3cc5a95067a"}, + {file = "grpcio-1.71.0-cp312-cp312-win_amd64.whl", hash = "sha256:652350609332de6dac4ece254e5d7e1ff834e203d6afb769601f286886f6f3a8"}, + {file = "grpcio-1.71.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:cebc1b34ba40a312ab480ccdb396ff3c529377a2fce72c45a741f7215bfe8379"}, + {file = "grpcio-1.71.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:85da336e3649a3d2171e82f696b5cad2c6231fdd5bad52616476235681bee5b3"}, + {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f9a412f55bb6e8f3bb000e020dbc1e709627dcb3a56f6431fa7076b4c1aab0db"}, + {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47be9584729534660416f6d2a3108aaeac1122f6b5bdbf9fd823e11fe6fbaa29"}, + {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9c80ac6091c916db81131d50926a93ab162a7e97e4428ffc186b6e80d6dda4"}, + {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:789d5e2a3a15419374b7b45cd680b1e83bbc1e52b9086e49308e2c0b5bbae6e3"}, + {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:1be857615e26a86d7363e8a163fade914595c81fec962b3d514a4b1e8760467b"}, + {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a76d39b5fafd79ed604c4be0a869ec3581a172a707e2a8d7a4858cb05a5a7637"}, + {file = "grpcio-1.71.0-cp313-cp313-win32.whl", hash = "sha256:74258dce215cb1995083daa17b379a1a5a87d275387b7ffe137f1d5131e2cfbb"}, + {file = "grpcio-1.71.0-cp313-cp313-win_amd64.whl", hash = "sha256:22c3bc8d488c039a199f7a003a38cb7635db6656fa96437a8accde8322ce2366"}, + {file = "grpcio-1.71.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c6a0a28450c16809f94e0b5bfe52cabff63e7e4b97b44123ebf77f448534d07d"}, + {file = "grpcio-1.71.0-cp39-cp39-macosx_10_14_universal2.whl", hash = "sha256:a371e6b6a5379d3692cc4ea1cb92754d2a47bdddeee755d3203d1f84ae08e03e"}, + {file = "grpcio-1.71.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:39983a9245d37394fd59de71e88c4b295eb510a3555e0a847d9965088cdbd033"}, + {file = "grpcio-1.71.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9182e0063112e55e74ee7584769ec5a0b4f18252c35787f48738627e23a62b97"}, + {file = "grpcio-1.71.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693bc706c031aeb848849b9d1c6b63ae6bcc64057984bb91a542332b75aa4c3d"}, + {file = "grpcio-1.71.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:20e8f653abd5ec606be69540f57289274c9ca503ed38388481e98fa396ed0b41"}, + {file = "grpcio-1.71.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8700a2a57771cc43ea295296330daaddc0d93c088f0a35cc969292b6db959bf3"}, + {file = "grpcio-1.71.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d35a95f05a8a2cbe8e02be137740138b3b2ea5f80bd004444e4f9a1ffc511e32"}, + {file = "grpcio-1.71.0-cp39-cp39-win32.whl", hash = "sha256:f9c30c464cb2ddfbc2ddf9400287701270fdc0f14be5f08a1e3939f1e749b455"}, + {file = "grpcio-1.71.0-cp39-cp39-win_amd64.whl", hash = "sha256:63e41b91032f298b3e973b3fa4093cbbc620c875e2da7b93e249d4728b54559a"}, + {file = "grpcio-1.71.0.tar.gz", hash = "sha256:2b85f7820475ad3edec209d3d89a7909ada16caab05d3f2e08a7e8ae3200a55c"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.71.0)"] + +[[package]] +name = "h5py" +version = "3.13.0" +description = "Read and write HDF5 files from Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "h5py-3.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5540daee2b236d9569c950b417f13fd112d51d78b4c43012de05774908dff3f5"}, + {file = "h5py-3.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10894c55d46df502d82a7a4ed38f9c3fdbcb93efb42e25d275193e093071fade"}, + {file = "h5py-3.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb267ce4b83f9c42560e9ff4d30f60f7ae492eacf9c7ede849edf8c1b860e16b"}, + {file = "h5py-3.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2cf6a231a07c14acd504a945a6e9ec115e0007f675bde5e0de30a4dc8d86a31"}, + {file = "h5py-3.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:851ae3a8563d87a5a0dc49c2e2529c75b8842582ccaefbf84297d2cfceeacd61"}, + {file = "h5py-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a8e38ef4ceb969f832cc230c0cf808c613cc47e31e768fd7b1106c55afa1cb8"}, + {file = "h5py-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f35640e81b03c02a88b8bf99fb6a9d3023cc52f7c627694db2f379e0028f2868"}, + {file = "h5py-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:337af114616f3656da0c83b68fcf53ecd9ce9989a700b0883a6e7c483c3235d4"}, + {file = "h5py-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:782ff0ac39f455f21fd1c8ebc007328f65f43d56718a89327eec76677ebf238a"}, + {file = "h5py-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:22ffe2a25770a2d67213a1b94f58006c14dce06933a42d2aaa0318c5868d1508"}, + {file = "h5py-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:477c58307b6b9a2509c59c57811afb9f598aedede24a67da808262dfa0ee37b4"}, + {file = "h5py-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:57c4c74f627c616f02b7aec608a8c706fe08cb5b0ba7c08555a4eb1dde20805a"}, + {file = "h5py-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:357e6dc20b101a805ccfd0024731fbaf6e8718c18c09baf3b5e4e9d198d13fca"}, + {file = "h5py-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6f13f9b5ce549448c01e4dfe08ea8d1772e6078799af2c1c8d09e941230a90d"}, + {file = "h5py-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:21daf38171753899b5905f3d82c99b0b1ec2cbbe282a037cad431feb620e62ec"}, + {file = "h5py-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e520ec76de00943dd017c8ea3f354fa1d2f542eac994811943a8faedf2a7d5cb"}, + {file = "h5py-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e79d8368cd9295045956bfb436656bea3f915beaa11d342e9f79f129f5178763"}, + {file = "h5py-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56dd172d862e850823c4af02dc4ddbc308f042b85472ffdaca67f1598dff4a57"}, + {file = "h5py-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be949b46b7388074c5acae017fbbe3e5ba303fd9daaa52157fdfef30bbdacadd"}, + {file = "h5py-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:4f97ecde7ac6513b21cd95efdfc38dc6d19f96f6ca6f2a30550e94e551458e0a"}, + {file = "h5py-3.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82690e89c72b85addf4fc4d5058fb1e387b6c14eb063b0b879bf3f42c3b93c35"}, + {file = "h5py-3.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d571644958c5e19a61c793d8d23cd02479572da828e333498c9acc463f4a3997"}, + {file = "h5py-3.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:560e71220dc92dfa254b10a4dcb12d56b574d2d87e095db20466b32a93fec3f9"}, + {file = "h5py-3.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c10f061764d8dce0a9592ce08bfd5f243a00703325c388f1086037e5d619c5f1"}, + {file = "h5py-3.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:9c82ece71ed1c2b807b6628e3933bc6eae57ea21dac207dca3470e3ceaaf437c"}, + {file = "h5py-3.13.0.tar.gz", hash = "sha256:1870e46518720023da85d0895a1960ff2ce398c5671eac3b1a41ec696b7105c3"}, +] + +[package.dependencies] +numpy = ">=1.19.3" + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "importlib-metadata" +version = "8.7.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.9" +files = [ + {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, + {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, +] + +[package.dependencies] +zipp = ">=3.20" + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +description = "Safely pass data to untrusted environments and back." +optional = false +python-versions = ">=3.8" +files = [ + {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, + {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "keras" +version = "3.9.2" +description = "Multi-backend Keras" +optional = false +python-versions = ">=3.9" +files = [ + {file = "keras-3.9.2-py3-none-any.whl", hash = "sha256:404427856c2dc30e38c9fa6fa6a13ffb1844a8c35af312ca32a8e7dea9840f1e"}, + {file = "keras-3.9.2.tar.gz", hash = "sha256:322aab6418ee3de1e2bd0871b60a07f0e444e744a7e8cba79af8b42408879ecf"}, +] + +[package.dependencies] +absl-py = "*" +h5py = "*" +ml-dtypes = "*" +namex = "*" +numpy = "*" +optree = "*" +packaging = "*" +rich = "*" + +[[package]] +name = "libclang" +version = "18.1.1" +description = "Clang Python Bindings, mirrored from the official LLVM repo: https://github.com/llvm/llvm-project/tree/main/clang/bindings/python, to make the installation process easier." +optional = false +python-versions = "*" +files = [ + {file = "libclang-18.1.1-1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:0b2e143f0fac830156feb56f9231ff8338c20aecfe72b4ffe96f19e5a1dbb69a"}, + {file = "libclang-18.1.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:6f14c3f194704e5d09769108f03185fce7acaf1d1ae4bbb2f30a72c2400cb7c5"}, + {file = "libclang-18.1.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:83ce5045d101b669ac38e6da8e58765f12da2d3aafb3b9b98d88b286a60964d8"}, + {file = "libclang-18.1.1-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:c533091d8a3bbf7460a00cb6c1a71da93bffe148f172c7d03b1c31fbf8aa2a0b"}, + {file = "libclang-18.1.1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:54dda940a4a0491a9d1532bf071ea3ef26e6dbaf03b5000ed94dd7174e8f9592"}, + {file = "libclang-18.1.1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:cf4a99b05376513717ab5d82a0db832c56ccea4fd61a69dbb7bccf2dfb207dbe"}, + {file = "libclang-18.1.1-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:69f8eb8f65c279e765ffd28aaa7e9e364c776c17618af8bff22a8df58677ff4f"}, + {file = "libclang-18.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:4dd2d3b82fab35e2bf9ca717d7b63ac990a3519c7e312f19fa8e86dcc712f7fb"}, + {file = "libclang-18.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:3f0e1f49f04d3cd198985fea0511576b0aee16f9ff0e0f0cad7f9c57ec3c20e8"}, + {file = "libclang-18.1.1.tar.gz", hash = "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250"}, +] + +[[package]] +name = "markdown" +version = "3.8" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.9" +files = [ + {file = "markdown-3.8-py3-none-any.whl", hash = "sha256:794a929b79c5af141ef5ab0f2f642d0f7b1872981250230e72682346f7cc90dc"}, + {file = "markdown-3.8.tar.gz", hash = "sha256:7df81e63f0df5c4b24b7d156eb81e4690595239b7d70937d0409f1b0de319c6f"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["mdx_gh_links (>=0.2)", "mkdocs (>=1.6)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "ml-dtypes" +version = "0.5.1" +description = "" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ml_dtypes-0.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bd73f51957949069573ff783563486339a9285d72e2f36c18e0c1aa9ca7eb190"}, + {file = "ml_dtypes-0.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:810512e2eccdfc3b41eefa3a27402371a3411453a1efc7e9c000318196140fed"}, + {file = "ml_dtypes-0.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141b2ea2f20bb10802ddca55d91fe21231ef49715cfc971998e8f2a9838f3dbe"}, + {file = "ml_dtypes-0.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:26ebcc69d7b779c8f129393e99732961b5cc33fcff84090451f448c89b0e01b4"}, + {file = "ml_dtypes-0.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:023ce2f502efd4d6c1e0472cc58ce3640d051d40e71e27386bed33901e201327"}, + {file = "ml_dtypes-0.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7000b6e4d8ef07542c05044ec5d8bbae1df083b3f56822c3da63993a113e716f"}, + {file = "ml_dtypes-0.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c09526488c3a9e8b7a23a388d4974b670a9a3dd40c5c8a61db5593ce9b725bab"}, + {file = "ml_dtypes-0.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:15ad0f3b0323ce96c24637a88a6f44f6713c64032f27277b069f285c3cf66478"}, + {file = "ml_dtypes-0.5.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6f462f5eca22fb66d7ff9c4744a3db4463af06c49816c4b6ac89b16bfcdc592e"}, + {file = "ml_dtypes-0.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f76232163b5b9c34291b54621ee60417601e2e4802a188a0ea7157cd9b323f4"}, + {file = "ml_dtypes-0.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4953c5eb9c25a56d11a913c2011d7e580a435ef5145f804d98efa14477d390"}, + {file = "ml_dtypes-0.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:9626d0bca1fb387d5791ca36bacbba298c5ef554747b7ebeafefb4564fc83566"}, + {file = "ml_dtypes-0.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:12651420130ee7cc13059fc56dac6ad300c3af3848b802d475148c9defd27c23"}, + {file = "ml_dtypes-0.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9945669d3dadf8acb40ec2e57d38c985d8c285ea73af57fc5b09872c516106d"}, + {file = "ml_dtypes-0.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf9975bda82a99dc935f2ae4c83846d86df8fd6ba179614acac8e686910851da"}, + {file = "ml_dtypes-0.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:fd918d4e6a4e0c110e2e05be7a7814d10dc1b95872accbf6512b80a109b71ae1"}, + {file = "ml_dtypes-0.5.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:05f23447a1c20ddf4dc7c2c661aa9ed93fcb2658f1017c204d1e758714dc28a8"}, + {file = "ml_dtypes-0.5.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b7fbe5571fdf28fd3aaab3ef4aafc847de9ebf263be959958c1ca58ec8eadf5"}, + {file = "ml_dtypes-0.5.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d13755f8e8445b3870114e5b6240facaa7cb0c3361e54beba3e07fa912a6e12b"}, + {file = "ml_dtypes-0.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b8a9d46b4df5ae2135a8e8e72b465448ebbc1559997f4f9304a9ecc3413efb5b"}, + {file = "ml_dtypes-0.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afb2009ac98da274e893e03162f6269398b2b00d947e7057ee2469a921d58135"}, + {file = "ml_dtypes-0.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aefedc579ece2f8fb38f876aa7698204ee4c372d0e54f1c1ffa8ca580b54cc60"}, + {file = "ml_dtypes-0.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:8f2c028954f16ede77902b223a8da2d9cbb3892375b85809a5c3cfb1587960c4"}, + {file = "ml_dtypes-0.5.1.tar.gz", hash = "sha256:ac5b58559bb84a95848ed6984eb8013249f90b6bab62aa5acbad876e256002c9"}, +] + +[package.dependencies] +numpy = ">=1.21" + +[package.extras] +dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] + +[[package]] +name = "namex" +version = "0.0.9" +description = "A simple utility to separate the implementation of your Python package and its public API surface." +optional = false +python-versions = "*" +files = [ + {file = "namex-0.0.9-py3-none-any.whl", hash = "sha256:7bd4e4a2cc3876592111609fdf4cbe6ff19883adbe6b3b40d842fd340f77025e"}, + {file = "namex-0.0.9.tar.gz", hash = "sha256:8adfea9da5cea5be8f4e632349b4669e30172c7859e1fd97459fdf3b17469253"}, +] + +[[package]] +name = "numpy" +version = "2.0.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, + {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, + {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, + {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, + {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, + {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, + {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, + {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, + {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, + {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, +] + +[[package]] +name = "opt-einsum" +version = "3.4.0" +description = "Path optimization of einsum functions." +optional = false +python-versions = ">=3.8" +files = [ + {file = "opt_einsum-3.4.0-py3-none-any.whl", hash = "sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd"}, + {file = "opt_einsum-3.4.0.tar.gz", hash = "sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac"}, +] + +[[package]] +name = "optree" +version = "0.15.0" +description = "Optimized PyTree Utilities." +optional = false +python-versions = ">=3.8" +files = [ + {file = "optree-0.15.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e73e390520a545ebcaa0b77fd77943a85d1952df658268129e6c523d4d38972"}, + {file = "optree-0.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c45593a818c67b72fd0beaeaa6410fa3c5debd39af500127fa367f8ee1f4bd8e"}, + {file = "optree-0.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4e440de109529ce919d0a0a4fa234d3b949da6f99630c9406c9f21160800831"}, + {file = "optree-0.15.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7614ad2f7bde7b905c897011be573d89a9cb5cf851784ee8efb0020d8e067b27"}, + {file = "optree-0.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:655ab99f9f9570fbb124f81fdf7e480250b59b1f1d9bd07df04c8751eecc1450"}, + {file = "optree-0.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e63b965b62f461513983095750fd1331cad5674153bf3811bd7e2748044df4cd"}, + {file = "optree-0.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14e515b011d965bd3f7aeb021bb523265cb49fde47be0033ba5601e386fff90a"}, + {file = "optree-0.15.0-cp310-cp310-win32.whl", hash = "sha256:27031f507828c18606047e695129e9ec9678cd4321f57856da59c7fcc8f8666c"}, + {file = "optree-0.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0392bebcd24fc70ca9a397c1eb2373727fa775e1007f27f3983c50f16a98e45"}, + {file = "optree-0.15.0-cp310-cp310-win_arm64.whl", hash = "sha256:c3122f73eca03e38712ceee16a6acf75d5244ba8b8d1adf5cd6613d1a60a6c26"}, + {file = "optree-0.15.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c15d98e6f587badb9df67d67fa914fcfa0b63db2db270951915c563816c29f3d"}, + {file = "optree-0.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8d58949ef132beb3a025ace512a71a0fcf92e0e5ef350f289f33a782ae6cb85"}, + {file = "optree-0.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f71d4759de0c4abc132dab69d1aa6ea4561ba748efabeee7b25db57c08652b79"}, + {file = "optree-0.15.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ba65d4c48d76bd5caac7f0b1b8db55223c1c3707d26f6d1d2ff18baf6f81850"}, + {file = "optree-0.15.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad3878acdb082701e5f77a153cd86af8819659bfa7e27debd0dc1a52f16c365"}, + {file = "optree-0.15.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6676b8c3f4cd4c8d8d052b66767a9e4cf852627bf256da6e49d2c38a95f07712"}, + {file = "optree-0.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1f185b0d21bc4dda1f4fd03f5ba9e2bc9d28ca14bce3ce3d36b5817140a345e"}, + {file = "optree-0.15.0-cp311-cp311-win32.whl", hash = "sha256:927b579a76c13b9328580c09dd4a9947646531f0a371a170a785002c50dedb94"}, + {file = "optree-0.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:d6525d6a550a1030957e5205e57a415d608a9f7561154e0fb29670e967424578"}, + {file = "optree-0.15.0-cp311-cp311-win_arm64.whl", hash = "sha256:081e8bed7583b625819659d68288365bd4348b3c4281935a6ecfa53c93619b13"}, + {file = "optree-0.15.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ba2eee9de9d57e145b4c1a71749f7f8b8fe1c645abbb306d4a26cfa45a9cdbb5"}, + {file = "optree-0.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4aad5023686cd7caad68d70ad3706b82cfe9ae8ff9a13c08c1edef2a9b4c9d72"}, + {file = "optree-0.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9810e84466025da55ce19ac6b2b79a5cb2c0c1349d318a17504f6e44528221f8"}, + {file = "optree-0.15.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20b07d8a097b810d68b0ee35f287c1f0b7c9844133ada613a92cc10bade9cdbe"}, + {file = "optree-0.15.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0304ec416258edebe2cd2a1ef71770e43405d5e7366ecbc134c520b4ab44d155"}, + {file = "optree-0.15.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:759a72e6dcca3e7239d202a253e1e8e44e8df5033a5e178df585778ac85ddd13"}, + {file = "optree-0.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01a0dc75c594c884d0ca502b8d169cec538e19a70883d2e5f5b9b08fce740958"}, + {file = "optree-0.15.0-cp312-cp312-win32.whl", hash = "sha256:7e10e5c2a8110f5f4fbc999ff8580d1db3a915f851f63f602fff3bbd250ffa20"}, + {file = "optree-0.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:def5b08f219c31edd029b47624e689ffa07747b0694222156f28a28d341d29ac"}, + {file = "optree-0.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:8ec6d3040b1cbfe3f0bc045a3302ee9f9e329c2cd96e928360d22e1cfd9d973a"}, + {file = "optree-0.15.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4ab606720ae319cb43da47c71d7d5fa7cfbb6a02e6da4857331e6f93800c970e"}, + {file = "optree-0.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9cfc5771115f85b0bfa8f72cce1599186fd6a0ea71c8154d8b2751d9170be428"}, + {file = "optree-0.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f958a20a311854aaab8bdd0f124aab5b9848f07976b54da3e95526a491aa860"}, + {file = "optree-0.15.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47ce7e9d81eaed5a05004df1fa279d2608e063dd5eb236e9c95803b4fa0a286c"}, + {file = "optree-0.15.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6d6ab3717d48e0e747d9e348e23be1fa0f8a812f73632face6303c438d259ba"}, + {file = "optree-0.15.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c7d101a15be39a9c7c4afae9f0bb85f682eb7d719117e2f9e5fb39c9f6f2c92"}, + {file = "optree-0.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aae337ab30b45a096eb5b4ffc3ad8909731617543a7eb288e0b297b9d10a241f"}, + {file = "optree-0.15.0-cp313-cp313-win32.whl", hash = "sha256:eb9c51d728485f5908111191b5403a3f9bc310d121a981f29fad45750b9ff89c"}, + {file = "optree-0.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:7f00e6f011f021ae470efe070ec4d2339fb1a8cd0dcdd16fe3dab782a47aba45"}, + {file = "optree-0.15.0-cp313-cp313-win_arm64.whl", hash = "sha256:17990fbc7f4c461de7ae546fc5661f6a248c3dcee966c89c2e2e5ad7f6228bae"}, + {file = "optree-0.15.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b31c88af70e3f5c14ff2aacd38c4076e6cde98f75169fe0bb59543f01bfb9719"}, + {file = "optree-0.15.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bc440f81f738d9c822030c3b4f53b6dec9ceb52410f02fd06b9338dc25a8447f"}, + {file = "optree-0.15.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ffc2dd8c754e95495163dde55b38dc37e6712b6a3bc7f2190b0547a2c403bb"}, + {file = "optree-0.15.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9fa9fb0197cd7b5f2b1fa7e05d30946b3b79bcfc3608fe54dbfc67969895cac9"}, + {file = "optree-0.15.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6828639b01ba1177c04875dd9529d938d7b28122c97e7ae14ec41c68ec22826c"}, + {file = "optree-0.15.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:93c74eed0f52818c30212dba4867f5672e498567bad49dcdffbe8db6703a0d65"}, + {file = "optree-0.15.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12188f6832c29dac37385a2f42fce961e303349909cff6d40e21cb27a8d09023"}, + {file = "optree-0.15.0-cp313-cp313t-win32.whl", hash = "sha256:d7b8ce7d13580985922dcfbda515da3f004cd7cb1b03320b96ea32d8cfd76392"}, + {file = "optree-0.15.0-cp313-cp313t-win_amd64.whl", hash = "sha256:daccdb583abaab14346f0af316ee570152a5c058e7b9fb09d8f8171fe751f2b3"}, + {file = "optree-0.15.0-cp313-cp313t-win_arm64.whl", hash = "sha256:e0162a36a6cedb0829efe980d0b370d4e5970fdb28a6609daa2c906d547add5f"}, + {file = "optree-0.15.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1a99941604a5a958b4e1cbd0caa8b2339aa716babde0189a92843b39d2a77e48"}, + {file = "optree-0.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8678ac0cdf752d6194f75637f3cd19af9071bc00967b05f00aff48727d373aab"}, + {file = "optree-0.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce2a8d57b8fe0179f967494a7d19cff18f8cc0f2e9aff0ed2cb5e5605475a19a"}, + {file = "optree-0.15.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1feca7404e69a0860940c9cf6a4e3af23457613c4c2338991dc9355dfbbc1ab"}, + {file = "optree-0.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d13c5d7d9af345bc96f441bfb313e4286f4495a20d29ad6499a8923c581c593e"}, + {file = "optree-0.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5614aebb65a18db496bbdf8b6ce4873779be5352cc91c7e2372984eaf1d4cce4"}, + {file = "optree-0.15.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def382dbd35ab715008c8604d64c67baf0d97a5f7389a56b5148bbfc9bb006a7"}, + {file = "optree-0.15.0-cp38-cp38-win32.whl", hash = "sha256:e7e0fb32ea05beec7d46a79e4c03701f060a2cfbd5ffa89abaf7b7d17e2d28aa"}, + {file = "optree-0.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:ae66e98634f0c843c5c6b4f27508200971c1a66b726db29c30aba368cf23de5f"}, + {file = "optree-0.15.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0f9ea3208a14d1677c8966ea1eabe5b8f148424a8c3214ed4d4769beecd48a8a"}, + {file = "optree-0.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ebd608b02cb207e4851983b78f57e800c542758f131abe3b23cd4a5f0153676c"}, + {file = "optree-0.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09d11111194a6211e9d806828d29d932ad5f998ea156c76ad0e4d5da39654541"}, + {file = "optree-0.15.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44cb5d1e5317dbb3044ad4b76af2d4f5e51de73d6ff6e858077d8af00756fe16"}, + {file = "optree-0.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1493f3e97f921b8742368406d3de390f051a7c405959e2088d72b4a4ff3f5394"}, + {file = "optree-0.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fef87f006da3c4dfc914f6c0f863c7f4712e958f56c991c320b06026e9ccfd87"}, + {file = "optree-0.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad409276099b89fb5077b0b9311c9e8500086888eba9c77546353c18d520bfe5"}, + {file = "optree-0.15.0-cp39-cp39-win32.whl", hash = "sha256:a6103a3d33cc300ea567f373680e29a29ae854e8775bf87231aae12664b4732e"}, + {file = "optree-0.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:a68a813a2141493566178ae87e1906856f1549e2c3e439ff76801f8fb05bd3a7"}, + {file = "optree-0.15.0-cp39-cp39-win_arm64.whl", hash = "sha256:59d8d252cb83465ecac2f7ff457489606a56316fe8b8f7635770ee8e27b6a3b8"}, + {file = "optree-0.15.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b30673fe30d4d77eef18534420491c27837f0b55dfe18107cfd9eca39a62de3b"}, + {file = "optree-0.15.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0f378d08b8a09f7e495c49cd94141c1acebc2aa7d567d7dd2cb44a707f29268"}, + {file = "optree-0.15.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90dae741d683cbc47cba16a1b4af3c0d5d8c1042efb7c4aec7664a4f3f07eca2"}, + {file = "optree-0.15.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:cf790dd21dcaa0857888c03233276f5513821abfe605964e825837a30a24f0d7"}, + {file = "optree-0.15.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:21afadec56475f2a13670b8ecf7b767af4feb3ba5bd3a246cbbd8c1822e2a664"}, + {file = "optree-0.15.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a39bccc63223e040f36eb8b413fa1f94a190289eb82e7b384ed32d95d1ffd67"}, + {file = "optree-0.15.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06aed485ab9c94f5b45a18f956bcb89bf6bad29632421da69da268cb49adb37b"}, + {file = "optree-0.15.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:07e9d75867ca39cce98375249b83a2033b0313cbfa32cbd06f93f7bc15104afc"}, + {file = "optree-0.15.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3d237605b277d5600748c8a6f83f65e00c294b000ac8772f473fa41eb587ca15"}, + {file = "optree-0.15.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c82f0e88f43b5ec57b8e225175003dc6624dfa400fb56c18c0e4b4667bef805"}, + {file = "optree-0.15.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2245f9a9fd5c7f042f07a476695fd4f6074f85036b5ff3d004f4da121220bf56"}, + {file = "optree-0.15.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:29e1fa90153908d968a2fcebf62bbbc0b434b5a75463a202c33ba3e13dc170ea"}, + {file = "optree-0.15.0.tar.gz", hash = "sha256:d00a45e3b192093ef2cd32bf0d541ecbfc93c1bd73a5f3fe36293499f28a50cf"}, +] + +[package.dependencies] +typing-extensions = ">=4.5.0" + +[package.extras] +benchmark = ["dm-tree (>=0.1,<0.2.0a0)", "jax[cpu] (>=0.4.6,<0.5.0a0)", "pandas", "tabulate", "termcolor", "torch (>=2.0,<2.6.0a0)", "torchvision"] +docs = ["docutils", "jax[cpu]", "numpy", "sphinx", "sphinx-autoapi", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx-copybutton", "sphinx-rtd-theme", "sphinxcontrib-bibtex", "torch"] +jax = ["jax"] +lint = ["cpplint", "doc8", "mypy", "pre-commit", "pyenchant", "pylint[spelling]", "ruff", "xdoctest"] +numpy = ["numpy"] +test = ["covdefaults", "pytest", "pytest-cov", "pytest-xdist"] +torch = ["torch"] + +[[package]] +name = "packaging" +version = "25.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, +] + +[[package]] +name = "pillow" +version = "11.2.1" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pillow-11.2.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:d57a75d53922fc20c165016a20d9c44f73305e67c351bbc60d1adaf662e74047"}, + {file = "pillow-11.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:127bf6ac4a5b58b3d32fc8289656f77f80567d65660bc46f72c0d77e6600cc95"}, + {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ba4be812c7a40280629e55ae0b14a0aafa150dd6451297562e1764808bbe61"}, + {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8bd62331e5032bc396a93609982a9ab6b411c05078a52f5fe3cc59234a3abd1"}, + {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:562d11134c97a62fe3af29581f083033179f7ff435f78392565a1ad2d1c2c45c"}, + {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c97209e85b5be259994eb5b69ff50c5d20cca0f458ef9abd835e262d9d88b39d"}, + {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0c3e6d0f59171dfa2e25d7116217543310908dfa2770aa64b8f87605f8cacc97"}, + {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc1c3bc53befb6096b84165956e886b1729634a799e9d6329a0c512ab651e579"}, + {file = "pillow-11.2.1-cp310-cp310-win32.whl", hash = "sha256:312c77b7f07ab2139924d2639860e084ec2a13e72af54d4f08ac843a5fc9c79d"}, + {file = "pillow-11.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9bc7ae48b8057a611e5fe9f853baa88093b9a76303937449397899385da06fad"}, + {file = "pillow-11.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:2728567e249cdd939f6cc3d1f049595c66e4187f3c34078cbc0a7d21c47482d2"}, + {file = "pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70"}, + {file = "pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf"}, + {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7"}, + {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8"}, + {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600"}, + {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788"}, + {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e"}, + {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e"}, + {file = "pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6"}, + {file = "pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193"}, + {file = "pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7"}, + {file = "pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f"}, + {file = "pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b"}, + {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d"}, + {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4"}, + {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d"}, + {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4"}, + {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443"}, + {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c"}, + {file = "pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3"}, + {file = "pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941"}, + {file = "pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb"}, + {file = "pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28"}, + {file = "pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830"}, + {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0"}, + {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1"}, + {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f"}, + {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155"}, + {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14"}, + {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b"}, + {file = "pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2"}, + {file = "pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691"}, + {file = "pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c"}, + {file = "pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22"}, + {file = "pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7"}, + {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16"}, + {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b"}, + {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406"}, + {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91"}, + {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751"}, + {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9"}, + {file = "pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd"}, + {file = "pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e"}, + {file = "pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681"}, + {file = "pillow-11.2.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:7491cf8a79b8eb867d419648fff2f83cb0b3891c8b36da92cc7f1931d46108c8"}, + {file = "pillow-11.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b02d8f9cb83c52578a0b4beadba92e37d83a4ef11570a8688bbf43f4ca50909"}, + {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:014ca0050c85003620526b0ac1ac53f56fc93af128f7546623cc8e31875ab928"}, + {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3692b68c87096ac6308296d96354eddd25f98740c9d2ab54e1549d6c8aea9d79"}, + {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:f781dcb0bc9929adc77bad571b8621ecb1e4cdef86e940fe2e5b5ee24fd33b35"}, + {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:2b490402c96f907a166615e9a5afacf2519e28295f157ec3a2bb9bd57de638cb"}, + {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dd6b20b93b3ccc9c1b597999209e4bc5cf2853f9ee66e3fc9a400a78733ffc9a"}, + {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4b835d89c08a6c2ee7781b8dd0a30209a8012b5f09c0a665b65b0eb3560b6f36"}, + {file = "pillow-11.2.1-cp39-cp39-win32.whl", hash = "sha256:b10428b3416d4f9c61f94b494681280be7686bda15898a3a9e08eb66a6d92d67"}, + {file = "pillow-11.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:6ebce70c3f486acf7591a3d73431fa504a4e18a9b97ff27f5f47b7368e4b9dd1"}, + {file = "pillow-11.2.1-cp39-cp39-win_arm64.whl", hash = "sha256:c27476257b2fdcd7872d54cfd119b3a9ce4610fb85c8e32b70b42e3680a29a1e"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b7b0d4fd2635f54ad82785d56bc0d94f147096493a79985d0ab57aedd563156"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:aa442755e31c64037aa7c1cb186e0b369f8416c567381852c63444dd666fb772"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d3348c95b766f54b76116d53d4cb171b52992a1027e7ca50c81b43b9d9e363"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d27ea4c889342f7e35f6d56e7e1cb345632ad592e8c51b693d7b7556043ce0"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bf2c33d6791c598142f00c9c4c7d47f6476731c31081331664eb26d6ab583e01"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e616e7154c37669fc1dfc14584f11e284e05d1c650e1c0f972f281c4ccc53193"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39ad2e0f424394e3aebc40168845fee52df1394a4673a6ee512d840d14ab3013"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044"}, + {file = "pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +test-arrow = ["pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "protobuf" +version = "5.29.4" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7"}, + {file = "protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d"}, + {file = "protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0"}, + {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e"}, + {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922"}, + {file = "protobuf-5.29.4-cp38-cp38-win32.whl", hash = "sha256:1832f0515b62d12d8e6ffc078d7e9eb06969aa6dc13c13e1036e39d73bebc2de"}, + {file = "protobuf-5.29.4-cp38-cp38-win_amd64.whl", hash = "sha256:476cb7b14914c780605a8cf62e38c2a85f8caff2e28a6a0bad827ec7d6c85d68"}, + {file = "protobuf-5.29.4-cp39-cp39-win32.whl", hash = "sha256:fd32223020cb25a2cc100366f1dedc904e2d71d9322403224cdde5fdced0dabe"}, + {file = "protobuf-5.29.4-cp39-cp39-win_amd64.whl", hash = "sha256:678974e1e3a9b975b8bc2447fca458db5f93a2fb6b0c8db46b6675b5b5346812"}, + {file = "protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862"}, + {file = "protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99"}, +] + +[[package]] +name = "pygments" +version = "2.19.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, + {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rich" +version = "14.0.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"}, + {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" +typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.11\""} + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "setuptools" +version = "80.7.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.9" +files = [ + {file = "setuptools-80.7.1-py3-none-any.whl", hash = "sha256:ca5cc1069b85dc23070a6628e6bcecb3292acac802399c7f8edc0100619f9009"}, + {file = "setuptools-80.7.1.tar.gz", hash = "sha256:f6ffc5f0142b1bd8d0ca94ee91b30c0ca862ffd50826da1ea85258a06fd94552"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] +core = ["importlib_metadata (>=6)", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "tensorboard" +version = "2.19.0" +description = "TensorBoard lets you watch Tensors Flow" +optional = false +python-versions = ">=3.9" +files = [ + {file = "tensorboard-2.19.0-py3-none-any.whl", hash = "sha256:5e71b98663a641a7ce8a6e70b0be8e1a4c0c45d48760b076383ac4755c35b9a0"}, +] + +[package.dependencies] +absl-py = ">=0.4" +grpcio = ">=1.48.2" +markdown = ">=2.6.8" +numpy = ">=1.12.0" +packaging = "*" +protobuf = ">=3.19.6,<4.24.0 || >4.24.0" +setuptools = ">=41.0.0" +six = ">1.9" +tensorboard-data-server = ">=0.7.0,<0.8.0" +werkzeug = ">=1.0.1" + +[[package]] +name = "tensorboard-data-server" +version = "0.7.2" +description = "Fast data loading for TensorBoard" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb"}, + {file = "tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60"}, + {file = "tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530"}, +] + +[[package]] +name = "tensorflow" +version = "2.19.0" +description = "TensorFlow is an open source machine learning framework for everyone." +optional = false +python-versions = ">=3.9" +files = [ + {file = "tensorflow-2.19.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:c95604f25c3032e9591c7e01e457fdd442dde48e9cc1ce951078973ab1b4ca34"}, + {file = "tensorflow-2.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b39293cae3aeee534dc4746dc6097b48c281e5e8b9a423efbd14d4495968e5c"}, + {file = "tensorflow-2.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83e2d6c748105488205d30e43093f28fc90e8da0176db9ddee12e2784cf435e8"}, + {file = "tensorflow-2.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3f47452246bd08902f0c865d3839fa715f1738d801d256934b943aa21c5a1d2"}, + {file = "tensorflow-2.19.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:68d462278ad88c193c16d7b905864ff0117d61dc20deded9264d1999d513c115"}, + {file = "tensorflow-2.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c92d3ff958ac0ee0eb343f10d4055b3a2815635cb3ee0836f9b1d735c76ee098"}, + {file = "tensorflow-2.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:390747786ac979809fa1cfcf6916220ef0bfed6b9e1b8c643b6b09184a868fe4"}, + {file = "tensorflow-2.19.0-cp311-cp311-win_amd64.whl", hash = "sha256:ade03804d81e696f8b9045bbe2dd5d0146e36c63d85bf2eae8225ffa74a03713"}, + {file = "tensorflow-2.19.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:821916beebd541c95b451dd911af442e11a7cb3aabde9084cab2be5c4d8b2bae"}, + {file = "tensorflow-2.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10f4bfbd33ee23408b98c67e63654f4697845f005555dcc6b790ecfaeabd1308"}, + {file = "tensorflow-2.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e28b26594cd793e7f52471b8f2d98aafc6d232868a366462d238f7967935a6f6"}, + {file = "tensorflow-2.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:5eae58946f5a22f4d5656a95e54c5d7aae5a5483c388922a207667d8858c37b9"}, + {file = "tensorflow-2.19.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ad15dbf488e287127a18e2274c64a201ea50ee32444a84657ead72d10438cb09"}, + {file = "tensorflow-2.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb87fb2052b819adffb749b7e9426bd109c8cf98751e684de73567424ab2a88"}, + {file = "tensorflow-2.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:849f72820e2bb1bfd4f6446d09db4635896f2ceaa35212a98a1238c9439f6f93"}, + {file = "tensorflow-2.19.0-cp39-cp39-win_amd64.whl", hash = "sha256:88c594d98bbe6d81d069f418ae823b03f7273c8b612d7073a09373483f212d9a"}, +] + +[package.dependencies] +absl-py = ">=1.0.0" +astunparse = ">=1.6.0" +flatbuffers = ">=24.3.25" +gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" +google-pasta = ">=0.1.1" +grpcio = ">=1.24.3,<2.0" +h5py = ">=3.11.0" +keras = ">=3.5.0" +libclang = ">=13.0.0" +ml-dtypes = ">=0.5.1,<1.0.0" +numpy = ">=1.26.0,<2.2.0" +opt-einsum = ">=2.3.2" +packaging = "*" +protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" +requests = ">=2.21.0,<3" +setuptools = "*" +six = ">=1.12.0" +tensorboard = ">=2.19.0,<2.20.0" +tensorflow-io-gcs-filesystem = {version = ">=0.23.1", markers = "python_version < \"3.12\""} +termcolor = ">=1.1.0" +typing-extensions = ">=3.6.6" +wrapt = ">=1.11.0" + +[package.extras] +and-cuda = ["nvidia-cublas-cu12 (==12.5.3.2)", "nvidia-cuda-cupti-cu12 (==12.5.82)", "nvidia-cuda-nvcc-cu12 (==12.5.82)", "nvidia-cuda-nvrtc-cu12 (==12.5.82)", "nvidia-cuda-runtime-cu12 (==12.5.82)", "nvidia-cudnn-cu12 (==9.3.0.75)", "nvidia-cufft-cu12 (==11.2.3.61)", "nvidia-curand-cu12 (==10.3.6.82)", "nvidia-cusolver-cu12 (==11.6.3.83)", "nvidia-cusparse-cu12 (==12.5.1.3)", "nvidia-nccl-cu12 (==2.23.4)", "nvidia-nvjitlink-cu12 (==12.5.82)"] + +[[package]] +name = "tensorflow-io-gcs-filesystem" +version = "0.37.1" +description = "TensorFlow IO" +optional = false +python-versions = "<3.13,>=3.7" +files = [ + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:249c12b830165841411ba71e08215d0e94277a49c551e6dd5d72aab54fe5491b"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:257aab23470a0796978efc9c2bcf8b0bc80f22e6298612a4c0a50d3f4e88060c"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8febbfcc67c61e542a5ac1a98c7c20a91a5e1afc2e14b1ef0cb7c28bc3b6aa70"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9679b36e3a80921876f31685ab6f7270f3411a4cc51bc2847e80d0e4b5291e27"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:32c50ab4e29a23c1f91cd0f9ab8c381a0ab10f45ef5c5252e94965916041737c"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b02f9c5f94fd62773954a04f69b68c4d576d076fd0db4ca25d5479f0fbfcdbad"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e1f2796b57e799a8ca1b75bf47c2aaa437c968408cc1a402a9862929e104cda"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee7c8ee5fe2fd8cb6392669ef16e71841133041fee8a330eff519ad9b36e4556"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:ffebb6666a7bfc28005f4fbbb111a455b5e7d6cd3b12752b7050863ecb27d5cc"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fe8dcc6d222258a080ac3dfcaaaa347325ce36a7a046277f6b3e19abc1efb3c5"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fbb33f1745f218464a59cecd9a18e32ca927b0f4d77abd8f8671b645cc1a182f"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:286389a203a5aee1a4fa2e53718c661091aa5fea797ff4fa6715ab8436b02e6c"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:ee5da49019670ed364f3e5fb86b46420841a6c3cb52a300553c63841671b3e6d"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8943036bbf84e7a2be3705cb56f9c9df7c48c9e614bb941f0936c58e3ca89d6f"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:426de1173cb81fbd62becec2012fc00322a295326d90eb6c737fab636f182aed"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df00891669390078a003cedbdd3b8e645c718b111917535fa1d7725e95cdb95"}, +] + +[package.extras] +tensorflow = ["tensorflow (>=2.16.0,<2.17.0)"] +tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.16.0,<2.17.0)"] +tensorflow-cpu = ["tensorflow-cpu (>=2.16.0,<2.17.0)"] +tensorflow-gpu = ["tensorflow-gpu (>=2.16.0,<2.17.0)"] +tensorflow-rocm = ["tensorflow-rocm (>=2.16.0,<2.17.0)"] + +[[package]] +name = "termcolor" +version = "3.1.0" +description = "ANSI color formatting for output in terminal" +optional = false +python-versions = ">=3.9" +files = [ + {file = "termcolor-3.1.0-py3-none-any.whl", hash = "sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa"}, + {file = "termcolor-3.1.0.tar.gz", hash = "sha256:6a6dd7fbee581909eeec6a756cff1d7f7c376063b14e4a298dc4980309e55970"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, + {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, +] + +[[package]] +name = "urllib3" +version = "2.4.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +files = [ + {file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"}, + {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "werkzeug" +version = "3.1.3" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=3.9" +files = [ + {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"}, + {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "wheel" +version = "0.45.1" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"}, + {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + +[[package]] +name = "zipp" +version = "3.21.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.9" +files = [ + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] + +[metadata] +lock-version = "2.0" +python-versions = "~3.9" +content-hash = "1ec7758d309be1e7aa5d54a67dca427b9feda672b63c626bc83481aafcbacbb6" diff --git a/special-scrapers/it_captcha/pyproject.toml b/special-scrapers/it_captcha/pyproject.toml new file mode 100644 index 0000000..653431a --- /dev/null +++ b/special-scrapers/it_captcha/pyproject.toml @@ -0,0 +1,17 @@ +[tool.poetry] +authors = ["Johannes Filter "] +description = "" +name = "it-captcha" +readme = "README.md" +version = "0.1.0" + +[tool.poetry.dependencies] +python = "~3.9" +keras = "3.9.2" +tensorflow = "2.19.0" +pillow = "11.2.1" +flask = "^3.1.1" + +[build-system] +build-backend = "poetry.core.masonry.api" +requires = ["poetry-core"] diff --git a/special-scrapers/nl.js b/special-scrapers/nl.js new file mode 100644 index 0000000..4419673 --- /dev/null +++ b/special-scrapers/nl.js @@ -0,0 +1,181 @@ +const playwright = require("playwright"); +const fs = require("fs"); +const { default: PQueue } = require("p-queue"); + +const scrapeTable = async (page, code) => { + const table = await page.locator("table"); + const tableHtml = await table.innerHTML(); + if (tableHtml.length > 1) { + // check if pagination is present + const pagination = await page + .locator( + "div.ui-paginator.ui-paginator-bottom.ui-widget-header.ui-corner-bottom" + ) + .isVisible(); + let pageNumber = 0; + if (pagination) { + pageNumber = await page + .locator( + "div.ui-paginator.ui-paginator-bottom.ui-widget-header.ui-corner-bottom a.ui-state-active" + ) + .innerText(); + } + // write the tableHtml to a file + fs.writeFileSync(`data/nl/${code}-${pageNumber}.html`, tableHtml); + console.log(`Page ${code} ${pageNumber} saved to file.`); + return pageNumber; + } + throw new Error("Table is empty"); +}; + +// generate strings from 01 to 99 +const generateAllCodes = () => { + const codes = []; + for (let i = 10; i <= 99; i++) { + const code = i.toString().padStart(2, "0"); + codes.push(code); + } + return codes; +}; + +const oneRun = async (browser, code) => { + try { + console.log(`Starting run for code ${code}`); + if (fs.existsSync(`data/nl/${code}.txt`)) { + console.log(`Code ${code} already exists, skipping.`); + return; + } + + const context = await browser.newContext({ ignoreHTTPSErrors: true }); // Bypass SSL errors + const page = await context.newPage(); + + await page.goto("https://mijn.rvo.nl/europese-subsidies-2022"); + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(1000); + + await page.waitForSelector( + "#_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:subsidie_label" + ); + await page + .locator( + "#_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:subsidie_label" + ) + .click(); + await page.waitForTimeout(1000); + // await page.waitForSelector("text=Gemeenschappelijk Landbouw Beleid", { + // timeout: 10000, + // }); + + // await page.locator("text=Gemeenschappelijk Landbouw Beleid¿").click(); + await page + .locator( + "#_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:subsidie_1" + ) + .click(); + await page.waitForTimeout(2000); + + await page.waitForSelector( + "#_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:postcode" + ); + + // input the code + await page + .locator( + "#_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:postcode" + ) + .fill(code); + + await page.waitForTimeout(5000); + await page.locator('span.ui-button-text:text("Zoek")').click(); + + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(5000); + + if ( + await page + .locator( + "text=Er zijn geen resultaten gevonden die voldoen aan uw zoekcriteria." + ) + .isVisible() + ) { + console.log(`No results found for code ${code}`); + await page.close(); + return; + } + + const choice = await page.locator( + 'div.ui-paginator-top select[title="Rijen per Pagina"]' + ); + if (await choice.isVisible()) { + await choice.selectOption("100"); + } + + await page.waitForTimeout(1000); + + let prevPageNumber = -1; + while (true) { + while (true) { + const pageNumber = await scrapeTable(page, code); + if (pageNumber !== prevPageNumber) { + prevPageNumber = pageNumber; + break; + } + console.log("Page number is the same, retrying..."); + await page.waitForTimeout(2000); + } + + if (prevPageNumber == 0) { + console.log("No more pages to scrape, exiting loop."); + break; + } + + // 101-126 van 126 resultaten, just an example! + const resultText = await page + .locator( + "div.ui-paginator.ui-paginator-bottom.ui-widget-header.ui-corner-bottom span.ui-paginator-current" + ) + .innerText(); + + const resultNumber = parseInt(resultText.split("van")[0].split("-")[1]); + // check if the result is the final one + if (resultText.includes(" " + resultNumber + " ")) { + console.log("Last page reached, exiting loop."); + break; + } + + await page + .locator( + '[id="_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:glbTable_paginator_bottom"] span.ui-icon-seek-next' + ) + .click(); + await page.waitForLoadState("networkidle"); + + await page.waitForTimeout(1000); + } + // create a file with the code + fs.writeFileSync(`data/nl/${code}.txt`, code); + console.log(`Finished ${code}.`); + await page.close(); + } catch (error) { + console.error(`Error in code ${code}:`, error); + } +}; + +(async () => { + const launchOptions = { + headless: false, + }; + + const browser = await playwright.chromium.launch(launchOptions); + + const queue = new PQueue({ concurrency: 10 }); + const allCodes = generateAllCodes(); + + const allPromises = allCodes.map((code) => { + return queue.add(() => oneRun(browser, code)); + }); + await Promise.all(allPromises); + console.log("All pages scraped."); + + await browser.close(); +})(); diff --git a/special-scrapers/package-lock.json b/special-scrapers/package-lock.json new file mode 100644 index 0000000..b58e9a1 --- /dev/null +++ b/special-scrapers/package-lock.json @@ -0,0 +1,1375 @@ +{ + "name": "special-scrapers", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "special-scrapers", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "csv-parser": "^3.2.0", + "form-data": "^4.0.2", + "jimp": "^1.6.0", + "node-fetch": "^3.3.2", + "p-queue": "^6.6.2" + }, + "devDependencies": { + "@playwright/test": "^1.52.0", + "@types/node": "^22.15.17" + } + }, + "node_modules/@jimp/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-1.6.0.tgz", + "integrity": "sha512-EQQlKU3s9QfdJqiSrZWNTxBs3rKXgO2W+GxNXDtwchF3a4IqxDheFX1ti+Env9hdJXDiYLp2jTRjlxhPthsk8w==", + "license": "MIT", + "dependencies": { + "@jimp/file-ops": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "await-to-js": "^3.0.0", + "exif-parser": "^0.1.12", + "file-type": "^16.0.0", + "mime": "3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/diff": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/diff/-/diff-1.6.0.tgz", + "integrity": "sha512-+yUAQ5gvRC5D1WHYxjBHZI7JBRusGGSLf8AmPRPCenTzh4PA+wZ1xv2+cYqQwTfQHU5tXYOhA0xDytfHUf1Zyw==", + "license": "MIT", + "dependencies": { + "@jimp/plugin-resize": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "pixelmatch": "^5.3.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/file-ops": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/file-ops/-/file-ops-1.6.0.tgz", + "integrity": "sha512-Dx/bVDmgnRe1AlniRpCKrGRm5YvGmUwbDzt+MAkgmLGf+jvBT75hmMEZ003n9HQI/aPnm/YKnXjg/hOpzNCpHQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/js-bmp": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/js-bmp/-/js-bmp-1.6.0.tgz", + "integrity": "sha512-FU6Q5PC/e3yzLyBDXupR3SnL3htU7S3KEs4e6rjDP6gNEOXRFsWs6YD3hXuXd50jd8ummy+q2WSwuGkr8wi+Gw==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "bmp-ts": "^1.0.9" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/js-gif": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/js-gif/-/js-gif-1.6.0.tgz", + "integrity": "sha512-N9CZPHOrJTsAUoWkWZstLPpwT5AwJ0wge+47+ix3++SdSL/H2QzyMqxbcDYNFe4MoI5MIhATfb0/dl/wmX221g==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "gifwrap": "^0.10.1", + "omggif": "^1.0.10" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/js-jpeg": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/js-jpeg/-/js-jpeg-1.6.0.tgz", + "integrity": "sha512-6vgFDqeusblf5Pok6B2DUiMXplH8RhIKAryj1yn+007SIAQ0khM1Uptxmpku/0MfbClx2r7pnJv9gWpAEJdMVA==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "jpeg-js": "^0.4.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/js-png": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/js-png/-/js-png-1.6.0.tgz", + "integrity": "sha512-AbQHScy3hDDgMRNfG0tPjL88AV6qKAILGReIa3ATpW5QFjBKpisvUaOqhzJ7Reic1oawx3Riyv152gaPfqsBVg==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "pngjs": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/js-tiff": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/js-tiff/-/js-tiff-1.6.0.tgz", + "integrity": "sha512-zhReR8/7KO+adijj3h0ZQUOiun3mXUv79zYEAKvE0O+rP7EhgtKvWJOZfRzdZSNv0Pu1rKtgM72qgtwe2tFvyw==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "utif2": "^4.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-blit": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-1.6.0.tgz", + "integrity": "sha512-M+uRWl1csi7qilnSK8uxK4RJMSuVeBiO1AY0+7APnfUbQNZm6hCe0CCFv1Iyw1D/Dhb8ph8fQgm5mwM0eSxgVA==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-blur": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-1.6.0.tgz", + "integrity": "sha512-zrM7iic1OTwUCb0g/rN5y+UnmdEsT3IfuCXCJJNs8SZzP0MkZ1eTvuwK9ZidCuMo4+J3xkzCidRwYXB5CyGZTw==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/utils": "1.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-circle": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-1.6.0.tgz", + "integrity": "sha512-xt1Gp+LtdMKAXfDp3HNaG30SPZW6AQ7dtAtTnoRKorRi+5yCJjKqXRgkewS5bvj8DEh87Ko1ydJfzqS3P2tdWw==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-color": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-1.6.0.tgz", + "integrity": "sha512-J5q8IVCpkBsxIXM+45XOXTrsyfblyMZg3a9eAo0P7VPH4+CrvyNQwaYatbAIamSIN1YzxmO3DkIZXzRjFSz1SA==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "tinycolor2": "^1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-contain": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-1.6.0.tgz", + "integrity": "sha512-oN/n+Vdq/Qg9bB4yOBOxtY9IPAtEfES8J1n9Ddx+XhGBYT1/QTU/JYkGaAkIGoPnyYvmLEDqMz2SGihqlpqfzQ==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/plugin-blit": "1.6.0", + "@jimp/plugin-resize": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-cover": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-1.6.0.tgz", + "integrity": "sha512-Iow0h6yqSC269YUJ8HC3Q/MpCi2V55sMlbkkTTx4zPvd8mWZlC0ykrNDeAy9IJegrQ7v5E99rJwmQu25lygKLA==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/plugin-crop": "1.6.0", + "@jimp/plugin-resize": "1.6.0", + "@jimp/types": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-crop": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-1.6.0.tgz", + "integrity": "sha512-KqZkEhvs+21USdySCUDI+GFa393eDIzbi1smBqkUPTE+pRwSWMAf01D5OC3ZWB+xZsNla93BDS9iCkLHA8wang==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-displace": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-1.6.0.tgz", + "integrity": "sha512-4Y10X9qwr5F+Bo5ME356XSACEF55485j5nGdiyJ9hYzjQP9nGgxNJaZ4SAOqpd+k5sFaIeD7SQ0Occ26uIng5Q==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-dither": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-1.6.0.tgz", + "integrity": "sha512-600d1RxY0pKwgyU0tgMahLNKsqEcxGdbgXadCiVCoGd6V6glyCvkNrnnwC0n5aJ56Htkj88PToSdF88tNVZEEQ==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-fisheye": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-1.6.0.tgz", + "integrity": "sha512-E5QHKWSCBFtpgZarlmN3Q6+rTQxjirFqo44ohoTjzYVrDI6B6beXNnPIThJgPr0Y9GwfzgyarKvQuQuqCnnfbA==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-flip": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-1.6.0.tgz", + "integrity": "sha512-/+rJVDuBIVOgwoyVkBjUFHtP+wmW0r+r5OQ2GpatQofToPVbJw1DdYWXlwviSx7hvixTWLKVgRWQ5Dw862emDg==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-hash": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-hash/-/plugin-hash-1.6.0.tgz", + "integrity": "sha512-wWzl0kTpDJgYVbZdajTf+4NBSKvmI3bRI8q6EH9CVeIHps9VWVsUvEyb7rpbcwVLWYuzDtP2R0lTT6WeBNQH9Q==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/js-bmp": "1.6.0", + "@jimp/js-jpeg": "1.6.0", + "@jimp/js-png": "1.6.0", + "@jimp/js-tiff": "1.6.0", + "@jimp/plugin-color": "1.6.0", + "@jimp/plugin-resize": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "any-base": "^1.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-mask": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-1.6.0.tgz", + "integrity": "sha512-Cwy7ExSJMZszvkad8NV8o/Z92X2kFUFM8mcDAhNVxU0Q6tA0op2UKRJY51eoK8r6eds/qak3FQkXakvNabdLnA==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-print": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-1.6.0.tgz", + "integrity": "sha512-zarTIJi8fjoGMSI/M3Xh5yY9T65p03XJmPsuNet19K/Q7mwRU6EV2pfj+28++2PV2NJ+htDF5uecAlnGyxFN2A==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/js-jpeg": "1.6.0", + "@jimp/js-png": "1.6.0", + "@jimp/plugin-blit": "1.6.0", + "@jimp/types": "1.6.0", + "parse-bmfont-ascii": "^1.0.6", + "parse-bmfont-binary": "^1.0.6", + "parse-bmfont-xml": "^1.1.6", + "simple-xml-to-json": "^1.2.2", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-quantize": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-quantize/-/plugin-quantize-1.6.0.tgz", + "integrity": "sha512-EmzZ/s9StYQwbpG6rUGBCisc3f64JIhSH+ncTJd+iFGtGo0YvSeMdAd+zqgiHpfZoOL54dNavZNjF4otK+mvlg==", + "license": "MIT", + "dependencies": { + "image-q": "^4.0.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-resize": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-1.6.0.tgz", + "integrity": "sha512-uSUD1mqXN9i1SGSz5ov3keRZ7S9L32/mAQG08wUwZiEi5FpbV0K8A8l1zkazAIZi9IJzLlTauRNU41Mi8IF9fA==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-rotate": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-1.6.0.tgz", + "integrity": "sha512-JagdjBLnUZGSG4xjCLkIpQOZZ3Mjbg8aGCCi4G69qR+OjNpOeGI7N2EQlfK/WE8BEHOW5vdjSyglNqcYbQBWRw==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/plugin-crop": "1.6.0", + "@jimp/plugin-resize": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-threshold": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-1.6.0.tgz", + "integrity": "sha512-M59m5dzLoHOVWdM41O8z9SyySzcDn43xHseOH0HavjsfQsT56GGCC4QzU1banJidbUrePhzoEdS42uFE8Fei8w==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/plugin-color": "1.6.0", + "@jimp/plugin-hash": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/types": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-1.6.0.tgz", + "integrity": "sha512-7UfRsiKo5GZTAATxm2qQ7jqmUXP0DxTArztllTcYdyw6Xi5oT4RaoXynVtCD4UyLK5gJgkZJcwonoijrhYFKfg==", + "license": "MIT", + "dependencies": { + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/utils": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-gqFTGEosKbOkYF/WFj26jMHOI5OH2jeP1MmC/zbK6BF6VJBf8rIC5898dPfSzZEbSA0wbbV5slbntWVc5PKLFA==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "tinycolor2": "^1.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/test": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.52.0.tgz", + "integrity": "sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.52.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/await-to-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/await-to-js/-/await-to-js-3.0.0.tgz", + "integrity": "sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bmp-ts": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bmp-ts/-/bmp-ts-1.0.9.tgz", + "integrity": "sha512-cTEHk2jLrPyi+12M3dhpEbnnPOsaZuq7C45ylbbQIiWgDFZq4UVYPEY5mlqjvsj/6gJv9qX5sa+ebDzLXT28Vw==", + "license": "MIT" + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/csv-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.2.0.tgz", + "integrity": "sha512-fgKbp+AJbn1h2dcAHKIdKNSSjfp43BZZykXsCjzALjKy80VXQNHPFJ6T9Afwdzoj24aMkq8GwDS7KGcDPpejrA==", + "license": "MIT", + "bin": { + "csv-parser": "bin/csv-parser" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "license": "MIT", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gifwrap": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.10.1.tgz", + "integrity": "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw==", + "license": "MIT", + "dependencies": { + "image-q": "^4.0.0", + "omggif": "^1.0.10" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/image-q": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", + "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", + "license": "MIT", + "dependencies": { + "@types/node": "16.9.1" + } + }, + "node_modules/image-q/node_modules/@types/node": { + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", + "license": "MIT" + }, + "node_modules/jimp": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-1.6.0.tgz", + "integrity": "sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/diff": "1.6.0", + "@jimp/js-bmp": "1.6.0", + "@jimp/js-gif": "1.6.0", + "@jimp/js-jpeg": "1.6.0", + "@jimp/js-png": "1.6.0", + "@jimp/js-tiff": "1.6.0", + "@jimp/plugin-blit": "1.6.0", + "@jimp/plugin-blur": "1.6.0", + "@jimp/plugin-circle": "1.6.0", + "@jimp/plugin-color": "1.6.0", + "@jimp/plugin-contain": "1.6.0", + "@jimp/plugin-cover": "1.6.0", + "@jimp/plugin-crop": "1.6.0", + "@jimp/plugin-displace": "1.6.0", + "@jimp/plugin-dither": "1.6.0", + "@jimp/plugin-fisheye": "1.6.0", + "@jimp/plugin-flip": "1.6.0", + "@jimp/plugin-hash": "1.6.0", + "@jimp/plugin-mask": "1.6.0", + "@jimp/plugin-print": "1.6.0", + "@jimp/plugin-quantize": "1.6.0", + "@jimp/plugin-resize": "1.6.0", + "@jimp/plugin-rotate": "1.6.0", + "@jimp/plugin-threshold": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "license": "BSD-3-Clause" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", + "license": "MIT" + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==", + "license": "MIT" + }, + "node_modules/parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==", + "license": "MIT" + }, + "node_modules/parse-bmfont-xml": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz", + "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==", + "license": "MIT", + "dependencies": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.5.0" + } + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/pixelmatch": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz", + "integrity": "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==", + "license": "ISC", + "dependencies": { + "pngjs": "^6.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/pixelmatch/node_modules/pngjs": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", + "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", + "license": "MIT", + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/playwright": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", + "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.52.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz", + "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.4.tgz", + "integrity": "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^4.7.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, + "node_modules/simple-xml-to-json": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/simple-xml-to-json/-/simple-xml-to-json-1.2.3.tgz", + "integrity": "sha512-kWJDCr9EWtZ+/EYYM5MareWj2cRnZGF93YDNpH4jQiHB+hBIZnfPFSQiVMzZOdk+zXWqTZ/9fTeQNu2DqeiudA==", + "license": "MIT", + "engines": { + "node": ">=20.12.2" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/utif2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/utif2/-/utif2-4.1.0.tgz", + "integrity": "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w==", + "license": "MIT", + "dependencies": { + "pako": "^1.0.11" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==", + "license": "MIT" + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/special-scrapers/package.json b/special-scrapers/package.json new file mode 100644 index 0000000..064fdbe --- /dev/null +++ b/special-scrapers/package.json @@ -0,0 +1,20 @@ +{ + "name": "special-scrapers", + "version": "1.0.0", + "main": "index.js", + "scripts": {}, + "author": "", + "license": "ISC", + "description": "", + "devDependencies": { + "@playwright/test": "^1.52.0", + "@types/node": "^22.15.17" + }, + "dependencies": { + "csv-parser": "^3.2.0", + "form-data": "^4.0.2", + "jimp": "^1.6.0", + "node-fetch": "^3.3.2", + "p-queue": "^6.6.2" + } +} diff --git a/special-scrapers/playwright.config.ts b/special-scrapers/playwright.config.ts new file mode 100644 index 0000000..a05d8b5 --- /dev/null +++ b/special-scrapers/playwright.config.ts @@ -0,0 +1,79 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// import dotenv from 'dotenv'; +// import path from 'path'; +// dotenv.config({ path: path.resolve(__dirname, '.env') }); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // url: 'http://127.0.0.1:3000', + // reuseExistingServer: !process.env.CI, + // }, +}); diff --git a/special-scrapers/runprog.sh b/special-scrapers/runprog.sh new file mode 100755 index 0000000..c59abfd --- /dev/null +++ b/special-scrapers/runprog.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# Script to start a Node.js program and restart it every hour, +# with a forced exit ("exit harder") if the process does not terminate gracefully. + +NODE_PROGRAM="it.js" +RESTART_INTERVAL=3600 # seconds (1 hour) +GRACE_PERIOD=10 # seconds to wait for a graceful shutdown + +while true; do + echo "Starting $NODE_PROGRAM at $(date)" + /Users/user/.local/share/mise/installs/node/20.18.1/bin/node "$NODE_PROGRAM" & + NODE_PID=$! + + SECONDS=0 + while kill -0 $NODE_PID 2>/dev/null; do + if [ $SECONDS -ge $RESTART_INTERVAL ]; then + echo "Restart interval reached. Sending SIGTERM to $NODE_PROGRAM (PID: $NODE_PID)" + kill $NODE_PID + WAITED=0 + # Wait for GRACE_PERIOD seconds for the process to exit gracefully + while kill -0 $NODE_PID 2>/dev/null && [ $WAITED -lt $GRACE_PERIOD ]; do + sleep 1 + WAITED=$((WAITED+1)) + done + # If still running, force kill + if kill -0 $NODE_PID 2>/dev/null; then + echo "Process did not exit after $GRACE_PERIOD seconds. Sending SIGKILL to $NODE_PID" + kill -9 $NODE_PID + fi + wait $NODE_PID 2>/dev/null + break + fi + sleep 5 + done + + echo "$NODE_PROGRAM stopped at $(date). Restarting..." +done From 5ed2a7bdad16b29cdbea50cd55053bc9a50fd249 Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Thu, 5 Jun 2025 11:35:11 +0200 Subject: [PATCH 35/38] Add new nl spider for 2022 --- scrapy_fs/scrapy_fs/spiders/nl_spider.py | 122 +++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 scrapy_fs/scrapy_fs/spiders/nl_spider.py diff --git a/scrapy_fs/scrapy_fs/spiders/nl_spider.py b/scrapy_fs/scrapy_fs/spiders/nl_spider.py new file mode 100644 index 0000000..a1bea07 --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/nl_spider.py @@ -0,0 +1,122 @@ +""" """ + +import os + +import scrapy +from scrapy.spiders import Spider +from tqdm import tqdm + +from ..items import FarmSubsidyItem + + +class NLSpider(Spider): + name = "NL" + year = 2022 + # Use absolute path based on this file's location + data_dir = os.path.abspath( + os.path.join(os.path.dirname(__file__), "../../../special-scrapers/data/nl") + ) + + custom_settings = { + # "ITEM_PIPELINES": { + # "scrapy_fs.pipelines.DuplicatesPipeline": 100, + # }, + "LOG_LEVEL": "INFO", + "AUTOTHROTTLE_ENABLED": False, + "CONCURRENT_REQUESTS": 2, + "CONCURRENT_REQUESTS_PER_DOMAIN": 2, + } + + def start_requests(self): + for file in tqdm(os.listdir(self.data_dir)): + if file.endswith(".html"): + file_path = os.path.join(self.data_dir, file) + url = "file:///" + file_path + yield scrapy.Request(url=url, callback=self.parse) + + def parse(self, response): + # Extract table rows from the HTML + rows = response.css( + "tbody#_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:glbTable_data tr" + ) + + for row in rows: + # Extract recipient name and location from the first column + name_cell = row.css("td:first-child ul li::text").getall() + if len(name_cell) >= 2: + recipient_name = name_cell[0].strip() + recipient_location = name_cell[1].strip() + + # Extract postcode and city from location + location_parts = recipient_location.split(" ", 1) + postcode = location_parts[0] if location_parts else "" + city = location_parts[1] if len(location_parts) > 1 else "" + else: + recipient_name = "" + recipient_location = "" + postcode = "" + city = "" + + # Extract scheme name from second column + # The HTML structure is: RegelingSCHEME_CODE. SCHEME_DESCRIPTION + scheme_cell = row.css("td:nth-child(2)") + if scheme_cell: + # Get all text content from the cell + all_text = scheme_cell.css("::text").getall() + # Filter out the "Regeling" span text and join the rest + scheme_full = "".join( + [text for text in all_text if text.strip() != "Regeling"] + ).strip() + + # Split scheme into code and description + # Look for pattern like "II.04. " or "IV.22. " + if ". " in scheme_full: + parts = scheme_full.split(". ", 1) + scheme_code = parts[0] + "." + scheme_name = " ".join(parts[1].split()) if len(parts) > 1 else "" + else: + scheme_code = "" + scheme_name = " ".join(scheme_full.split()) + else: + scheme_full = "" + scheme_code = "" + scheme_name = "" + + # Extract amount from third column + amount_text = row.css("td:nth-child(3) span.amount::text").getall() + if amount_text: + # Join the amount parts and clean up + amount_str = "".join(amount_text).strip() + # Remove € symbol and convert comma to dot for decimal + amount_str = ( + amount_str.replace("€", "") + .replace(".", "") + .replace(",", ".") + .strip() + ) + try: + amount = float(amount_str) + except ValueError: + amount = 0.0 + else: + amount = 0.0 + + if amount == 0.0: + # Skip rows with zero amount + raise ValueError( + f"Skipping row with zero amount: {recipient_name}, {scheme_name}" + ) + + # Create and yield the item + item = FarmSubsidyItem() + item["year"] = self.year + item["country"] = "NL" + item["recipient_name"] = recipient_name + item["recipient_location"] = city + item["recipient_postcode"] = postcode + item["scheme_name"] = scheme_name + item["scheme_code"] = scheme_code + item["amount"] = amount + item["currency"] = "EUR" + + yield item From eab77aa886f25aba136d6db96feb797896d7f060 Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Fri, 6 Jun 2025 00:32:14 +0200 Subject: [PATCH 36/38] Add proper SE scraper --- .gitignore | 1 + poetry.lock | 97 ++++++- pyproject.toml | 2 + scrapy_fs/scrapy_fs/spiders/se_spider.py | 342 +++++++++++++++-------- 4 files changed, 331 insertions(+), 111 deletions(-) diff --git a/.gitignore b/.gitignore index f32726d..9716fa4 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ data __pycache__ cache *.zip +scrapy_fs/responses diff --git a/poetry.lock b/poetry.lock index 9c7e262..20050a1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -473,6 +473,25 @@ files = [ {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] +[[package]] +name = "clean-text" +version = "0.6.0" +description = "Functions to preprocess and normalize text." +optional = false +python-versions = ">=3.7" +files = [ + {file = "clean-text-0.6.0.tar.gz", hash = "sha256:8374b385fc2a26e06383f62aed076fa6be115e5832239e2a7fd8b344fa8d2ab2"}, + {file = "clean_text-0.6.0-py3-none-any.whl", hash = "sha256:4fedb156042f192cdef9ed5324b281465f1116aba96791e9289384a2e6bec4da"}, +] + +[package.dependencies] +emoji = ">=1.0.0,<2.0.0" +ftfy = ">=6.0,<7.0" + +[package.extras] +gpl = ["unidecode (>=1.1.1,<2.0.0)"] +sklearn = ["pandas (>=1.0.0,<2.0.0)", "scikit-learn (>=1.0.0,<2.0.0)"] + [[package]] name = "click" version = "8.1.7" @@ -645,6 +664,19 @@ files = [ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] +[[package]] +name = "emoji" +version = "1.7.0" +description = "Emoji for Python" +optional = false +python-versions = "*" +files = [ + {file = "emoji-1.7.0.tar.gz", hash = "sha256:65c54533ea3c78f30d0729288998715f418d7467de89ec258a31c0ce8660a1d1"}, +] + +[package.extras] +dev = ["coverage", "coveralls", "pytest"] + [[package]] name = "exceptiongroup" version = "1.2.2" @@ -714,6 +746,20 @@ files = [ {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, ] +[[package]] +name = "ftfy" +version = "6.3.1" +description = "Fixes mojibake and other problems with Unicode, after the fact" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ftfy-6.3.1-py3-none-any.whl", hash = "sha256:7c70eb532015cd2f9adb53f101fb6c7945988d023a085d127d1573dc49dd0083"}, + {file = "ftfy-6.3.1.tar.gz", hash = "sha256:9b3c3d90f84fb267fe64d375a07b7f8912d817cf86009ae134aa03e1819506ec"}, +] + +[package.dependencies] +wcwidth = "*" + [[package]] name = "h11" version = "0.14.0" @@ -816,6 +862,17 @@ tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] scripts = ["click (>=6.0)"] +[[package]] +name = "iniconfig" +version = "2.1.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, +] + [[package]] name = "ipykernel" version = "6.29.5" @@ -1885,6 +1942,21 @@ docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-a test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] type = ["mypy (>=1.11.2)"] +[[package]] +name = "pluggy" +version = "1.6.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["coverage", "pytest", "pytest-benchmark"] + [[package]] name = "prometheus-client" version = "0.21.1" @@ -2071,6 +2143,29 @@ files = [ {file = "PyPyDispatcher-2.1.2.tar.gz", hash = "sha256:b6bec5dfcff9d2535bca2b23c80eae367b1ac250a645106948d315fcfa9130f2"}, ] +[[package]] +name = "pytest" +version = "8.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pytest-8.4.0-py3-none-any.whl", hash = "sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e"}, + {file = "pytest-8.4.0.tar.gz", hash = "sha256:14d920b48472ea0dbf68e45b96cd1ffda4705f33307dcc86c676c1b5104838a6"}, +] + +[package.dependencies] +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} +iniconfig = ">=1" +packaging = ">=20" +pluggy = ">=1.5,<2" +pygments = ">=2.7.2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -3074,4 +3169,4 @@ testing = ["coverage[toml]", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "74868acfed3443318b7de6a3342fd89080f3550d2c3bafd949bd27896f1e6ce8" +content-hash = "ddbdc88a544ec488e37b958f6bdbf5e08c8f4a920e27d705515275ebd5be5a0a" diff --git a/pyproject.toml b/pyproject.toml index fcf25d1..d57f528 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,8 @@ scrapy = "^2.12.0" tqdm = "^4.67.1" pandas = "^2.2.3" python-slugify = "^8.0.4" +pytest = "^8.4.0" +clean-text = "^0.6.0" [tool.poetry.group.dev.dependencies] black = "^24.10.0" diff --git a/scrapy_fs/scrapy_fs/spiders/se_spider.py b/scrapy_fs/scrapy_fs/spiders/se_spider.py index 39e9288..07ebb5b 100644 --- a/scrapy_fs/scrapy_fs/spiders/se_spider.py +++ b/scrapy_fs/scrapy_fs/spiders/se_spider.py @@ -1,14 +1,18 @@ -import re +import html +from pathlib import Path import scrapy from scrapy.spiders import Spider from ..items import FarmSubsidyItem +viewstate = "+G9PnIYGASYwXFmoQlmp2EGyOtj8B2PaHtFMA7bwNCczxi5T+p6R1a8ClN8qOJLOW0CKmPgpW8hSG2dyU5UNyrvRJuE+jCSzm8Rbc4vMx0yBWtrd4QNhDzI8Nb7jwPvP3i5hcBEl2B4mJebK" +cookie = "F5406B8932E22DB0158986BDEEAEAF09" + class SESpider(Spider): """ - Swedens CAP payments + Sweden's CAP payments """ name = "SE" @@ -16,135 +20,253 @@ class SESpider(Spider): custom_settings = { "AUTOTHROTTLE_ENABLED": False, "LOG_LEVEL": "INFO", - "HTTPCACHE_ENABLED": True, + "HTTPCACHE_ENABLED": False, + "HTTPCACHE_DIR": "httpcache", + "HTTPCACHE_POLICY": "scrapy_fs.cache_policies.NoContentLengthErrorCachePolicy", + "CONCURRENT_REQUESTS": 10, } - # AMOUNT_RE = re.compile('[^\d\.]') - # BAD_NAME = u'ID not available' - def __init__(self, year=None): + super().__init__() self.year = int(year) - """ - AJAXREQUEST=j_id0 -searchResultsForm_SUBMIT=1 -javax.faces.ViewState=+cNxfEoERH6+x0Xj4WkRQvRibhZzngTTR/x6Hdk1mPOinYw2nGzwLsiAM2oJK5RpGyR9BS/c+2rs++XqtfkHttPhx4i4JCKa3l9BCKNBpLO57+iGQmnqNyr+ktlaah24qq2mBMBsvN20b37y -searchResultsForm:j_id_jsp_121545192_121=2 -ajaxSingle=searchResultsForm:j_id_jsp_121545192_121 -AJAX:EVENTS_COUNT=1 - """ - def start_requests(self): + page_size = 100 for x in range(1, 620): + page_start = (x - 1) * page_size + page_end = page_start + page_size - 1 + + # check if page_end was saved to file + # file_name = f"responses/{x}_{page_start}.html" + # try: + # with open(file_name, "rb") as f: + # print(f"File {file_name} already exists, skipping request") + # continue + # except FileNotFoundError: + # print(f"File {file_name} does not exist, making request") + yield scrapy.FormRequest( url="https://etjanst.sjv.se/asken/faces/jbstod/searchJbstod.jsp", formdata={ "AJAXREQUEST": "j_id0", "searchResultsForm_SUBMIT": "1", - "javax.faces.ViewState": "+cNxfEoERH6+x0Xj4WkRQvRibhZzngTTR/x6Hdk1mPOinYw2nGzwLhk8iJUV9M9MwyQ3m0dr+rHkpwRZpSqEIU//L6sHgV8mVipq9MYy9NzRcflfhla1xVtiQv8nYAb+z2VHYdtMx/yFoQbO", + "javax.faces.ViewState": viewstate, "searchResultsForm:j_id_jsp_121545192_121": str(x), "ajaxSingle": "searchResultsForm:j_id_jsp_121545192_121", "AJAX:EVENTS_COUNT": "1", }, cookies={ "BIGipServerpool_epublik_http_8106": "2185762220.43551.0000", - "JSESSIONID": "4921943166FA5C8AD0CE5869AE19169F", + "JSESSIONID": cookie, }, callback=self.parse, ) - # yield scrapy.Request(url, callback=self.parse) - - # def parse_total_pages(self, response): - # total_pages_url = response.css("a#btn-last-page::attr(href)").get() - - # if total_pages_url: - # page_pattern = re.compile(r"pageNumber=(\d+)") - # match = page_pattern.search(total_pages_url) - - # if match: - # total_pages = int(match.group(1)) - # for x in range(1, total_pages + 1): - # url = f"https://plati.afir.info/Plati/AfisareListaPlatiEN?pageNumber={x}&anFinanciar={self.year}" - # yield scrapy.Request(url, callback=self.parse) - - def parse(self, response): - print(response) - # place = response.css("div.kommun") - print(response.text) - - # Loop through each table row - rows = response.css("#content tr") - - # for row in rows: - # # Extract data fields - # beneficiary_name = row.xpath( - # ".//td[contains(., 'BENEFICIARY NAME')]/div[@class='fw-bold-content']/text()" - # ).get() - # beneficiary_last_name = row.xpath( - # """.//td[contains(., "BENEFICIARY'S LAST NAME")]/div[@class='fw-bold-content']/text()""" - # ).get() - # beneficiary_parent_company = row.xpath( - # ".//td[contains(., 'PARENT COMPANY NAME AND TAX REGISTRATION CODE')]/div[@class='fw-bold-content']/text()" - # ).get() - # locality = row.xpath( - # ".//td[contains(., 'LOCALITY')]/div[@class='fw-bold-content']/text()" - # ).get() - # measure_code = row.xpath( - # ".//td[normalize-space(.//div[@class='fw-bold'])='MEASURE/INTERVENTION TYPE CODE']/div[@class='fw-bold-content']/text()" - # ).get() - - # objective = row.xpath( - # ".//td[contains(., 'OBJECTIVE')]/div[@class='fw-bold-content']/text()" - # ).get() - - # fega_operation_amount = row.xpath( - # ".//td[contains(., 'FEGA OPERATION AMOUNT')]/div[@class='fw-bold-content']/text()" - # ).get() - # feadr_operation_amount = row.xpath( - # ".//td[contains(., 'FEADR OPERATION AMOUNT')]/div[@class='fw-bold-content']/text()" - # ).get() - # total_feadr_amount = row.xpath( - # ".//td[contains(., 'TOTAL FEADR AMOUNT')]/div[@class='fw-bold-content']/text()" - # ).get() - # operation_related_amount = row.xpath( - # ".//td[contains(., 'OPERATION-RELATED AMOUNT')]/div[@class='fw-bold-content']/text()" - # ).get() - # total_bene_cof_amount = row.xpath( - # ".//td[contains(., 'TOTAL BENEFICIARY COFINANCING AMOUNT')]/div[@class='fw-bold-content']/text()" - # ).get() - # total_eu_amount = row.xpath( - # ".//td[contains(., 'TOTAL EU AMOUNT FOR BENEFICIARY')]/div[@class='fw-bold-content']/text()" - # ).get() - - # name = beneficiary_name.strip() if beneficiary_name else "N.N." - - # if beneficiary_last_name: - # name += " " + beneficiary_last_name.strip() - - # if beneficiary_parent_company: - # name += ", " + beneficiary_parent_company.strip() - - # schema = ( - # measure_code - # if measure_code - # else "" + (" - " + objective if objective else "") - # ) - - yield FarmSubsidyItem( - country="SE", - currency="SEK", - year=self.year, - recipient_name="x", - recipient_location=place, - scheme="x", - amount="x", + + for y in range(page_start, page_end + 1): + key = ( + "searchResultsForm:foundStodmottagare:" + + str(y) + + ":j_id_jsp_121545192_98" + ) + # check if file already exists + file_path = f"responses/{x}_{y}.html" + if Path(file_path).exists(): + text = Path(file_path).read_text(encoding="utf-8") + if 'class="stodmottagare selected"' in text: + print( + f"File {file_path} already exists and contains .selected, skipping request" + ) + absolute_file_path = Path(file_path).resolve() + url = "file:///" + str(absolute_file_path) + print(f"Using cached file: {url}") + yield scrapy.Request( + url=url, + callback=self.parse_response, + encoding="utf-8", + headers={ + "encoding": "utf-8", + }, + meta={"fn": absolute_file_path}, + ) + continue + else: + print( + f"File {file_path} exists but does not contain .selected, making request" + ) + + print(key) + yield scrapy.FormRequest( + dont_filter=True, + method="POST", + url="https://etjanst.sjv.se/asken/faces/jbstod/searchJbstod.jsp", + formdata={ + "AJAXREQUEST": "j_id0", + "searchResultsForm_SUBMIT": "1", + "javax.faces.ViewState": viewstate, + key: key, + }, + cookies={ + "BIGipServerpool_epublik_http_8106": "2185762220.43551.0000", + "JSESSIONID": cookie, + }, + headers={ + "Host": "etjanst.sjv.se", + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:139.0) Gecko/20100101 Firefox/139.0", + "Accept": "*/*", + "Accept-Language": "en-US,en;q=0.7,de-DE;q=0.3", + "Accept-Encoding": "gzip, deflate, br, zstd", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + # "Content-Length": "358", + "Origin": "https://etjanst.sjv.se", + "DNT": "1", + "Sec-GPC": "1", + # "Connection": "keep-alive", + "Referer": "https://etjanst.sjv.se/asken/faces/jbstod/searchJbstod.jsp", + }, + callback=self.parse2, + meta={ + "page_number": x, + "offset": y, + }, + ) + + def parse2(self, response): + # get page number and offset from request meta + page_number = response.meta.get("page_number", None) + offset = response.meta.get("offset", None) + file_path = f"responses/{page_number}_{offset}.html" + + with open(file_path, "wb") as f: + f.write(response.body) + + return self.parse_response(response) + + def parse_response(self, response): + # print(response.encoding) + # Read again since the encoding is broken + body_text = Path(response.meta["fn"]).read_text(encoding="utf-8") + + # Handle XML declaration and namespace issues + # Remove XML declaration and convert to regular HTML for easier parsing + if body_text.startswith("") + if xml_end != -1: + body_text = body_text[xml_end + 2 :].strip() + + # Remove XHTML namespace to make CSS selectors work better + body_text = body_text.replace('xmlns="http://www.w3.org/1999/xhtml"', "") + + # print(body_text) # Print first 1000 characters for debugging + + # Create a new response object with cleaned HTML + from scrapy.http import TextResponse + + clean_response = TextResponse( + url=response.url, + body=body_text, + encoding=response.encoding, # Pass the original response's encoding ) - # if SEQUENTIAL: - # # Find the link to the next page - # next_page = response.css("a#btn-next-page::attr(href)").get() + # Select div.selected and extract farm subsidy data + selected_div = clean_response.css("div.selected") + + if selected_div: + # Extract recipient information from the main columns + name = selected_div.css("div.stodmottagareColumn.namn::text").get() + county = selected_div.css("div.stodmottagareColumn.lan::text").get() + + municipality = selected_div.css( + "div.stodmottagareColumn.kommun::text" + ).get() + postal_address = selected_div.css( + "div.stodmottagareColumn.postadress::text" + ).get() + + # Get total amount + total_amount_text = selected_div.css( + "div.stodmottagareColumn.belopp::text" + ).get() + + if name and total_amount_text: + # Decode HTML entities and clean up amount + total_amount_text = html.unescape(total_amount_text).strip() + # Clean up the recipient name + name_clean = name.strip() + # total_amount = total_amount_text.replace("\u00a0", "").replace(" ", "") + + # Construct location string + location_parts = [] + if municipality: + municipality_clean = municipality.strip() + location_parts.append(municipality_clean) + if county: + county_clean = county.strip() + location_parts.append(county_clean) + if postal_address: + postal_address_clean = postal_address.strip() + location_parts.append(postal_address_clean) + + location = ", ".join(location_parts) if location_parts else "" + + # Extract individual subsidy details from stodRow elements + subsidy_rows = selected_div.css("div.stodRow") + + for row in subsidy_rows: + fund_type = row.css("div.stodItem.fondtyp::text").get() + category = row.css("div.stodItem.kategori::text").get() + specific_goal = row.css("div.stodItem.specifiktmal::text").get() + amount_text = row.css("div.stodItem.belopp::text").get() + + if amount_text: + # Clean up the individual amount + amount_text = html.unescape(amount_text).strip() + amount = amount_text.replace("\u00a0", "").replace(" ", "") + + scheme_description = "" + if fund_type: + scheme_description = fund_type.strip() + + scheme_name = "" + scheme_code = "" + + if category: + category_clean = category.strip() + # Extract scheme code from category (e.g., "II.1" from "II.1, Basic payment scheme...") + if "," in category_clean: + scheme_code = category_clean.split(",")[0].strip() + scheme_name = category_clean.split(",", 1)[1].strip() + else: + scheme_code = category_clean + scheme_name = category_clean + + if specific_goal and specific_goal.strip() != "-": + scheme_description += ( + f" | Specific Goal: {specific_goal.strip()}" + ) + + yield FarmSubsidyItem( + country="SE", + currency="SEK", + year=self.year, + recipient_name=name_clean, + recipient_location=location, + amount=amount, + scheme_name=scheme_name, + scheme_code=scheme_code, + scheme_description=scheme_description.strip(), + ) + + # Also yield the total amount as a summary item + # yield FarmSubsidyItem( + # country="SE", + # currency="SEK", + # year=self.year, + # recipient_name=name.strip(), + # recipient_location=location, + # amount=total_amount, + # scheme="Total", + # ) - # # If there's a next page, yield a new request - # if next_page: - # next_page_url = response.urljoin(next_page) # Make the URL absolute - # yield scrapy.Request(url=next_page_url, callback=self.parse) + def parse(self, _response): + return From 3cc1b239df5176e2b76613ee267964d313fa46ca Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Tue, 17 Jun 2025 12:30:08 +0200 Subject: [PATCH 37/38] Fix SE scraper --- scrapy_fs/scrapy_fs/spiders/se_spider.py | 73 +++++++++++++----------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/scrapy_fs/scrapy_fs/spiders/se_spider.py b/scrapy_fs/scrapy_fs/spiders/se_spider.py index 07ebb5b..9747658 100644 --- a/scrapy_fs/scrapy_fs/spiders/se_spider.py +++ b/scrapy_fs/scrapy_fs/spiders/se_spider.py @@ -1,3 +1,20 @@ +""" +1. Open the website https://etjanst.sjv.se/asken/faces/jbstod/searchJbstod.jsp +2. Select the year (e.g., 2023) from the dropdown menu +3. Select English as the language +4. Click the "Search" button +5. Change the page size to 100 +6. Open the web console, open a details view for a row and find the `ViewState` in a POST request body and the `JSESSIONID` cookie. +7. Copy the `ViewState` and `JSESSIONID` values into the code below +8. Run the spider with `scrapy crawl SE -a year=2023` +9. The results will be saved in the `responses` directory as HTML files named `{year}_{page_number}_{offset}.html` +10. Run the spider multile times since the website is flaky. + +You can increase `CONCURRENT_REQUESTS` but then you also have to run the spider again with only one thread. +This is because the details view requires that the current page is opened before being able to make requests for the detail view. +If you use multiple threads, the requests for the detail view might be made before the current page is opened, resulting in an HTML page that has no data (but has a 200 status). +""" + import html from pathlib import Path @@ -6,8 +23,12 @@ from ..items import FarmSubsidyItem -viewstate = "+G9PnIYGASYwXFmoQlmp2EGyOtj8B2PaHtFMA7bwNCczxi5T+p6R1a8ClN8qOJLOW0CKmPgpW8hSG2dyU5UNyrvRJuE+jCSzm8Rbc4vMx0yBWtrd4QNhDzI8Nb7jwPvP3i5hcBEl2B4mJebK" -cookie = "F5406B8932E22DB0158986BDEEAEAF09" +viewstate = "qLxOAX8P3CUJ2HoBKQ58ry6yueRR51e4gDGybvBgIv6IkDC9DdCFG7vwCpTi510VKfC44Znrou2hoTYsN2oEwS7nO5hTLV4ySkv8DEcF4HwPVKpf2g/vrQhUWbZ3B5xhtxjHyQNQVyitkbas" +cookie = "E87990DE319CDA5A80685A97BFF8EDFA" + +page_size = 100 +num_receivers = 62000 # in doubt, check it on the website +num_concurrent_requests = 1 # number of concurrent requests to make class SESpider(Spider): @@ -21,9 +42,8 @@ class SESpider(Spider): "AUTOTHROTTLE_ENABLED": False, "LOG_LEVEL": "INFO", "HTTPCACHE_ENABLED": False, - "HTTPCACHE_DIR": "httpcache", - "HTTPCACHE_POLICY": "scrapy_fs.cache_policies.NoContentLengthErrorCachePolicy", - "CONCURRENT_REQUESTS": 10, + "CONCURRENT_REQUESTS": num_concurrent_requests, + "CONCURRENT_REQUESTS_PER_DOMAIN": num_concurrent_requests, } def __init__(self, year=None): @@ -31,20 +51,11 @@ def __init__(self, year=None): self.year = int(year) def start_requests(self): - page_size = 100 - for x in range(1, 620): + for x in range(1, num_receivers // page_size + 2): page_start = (x - 1) * page_size page_end = page_start + page_size - 1 - # check if page_end was saved to file - # file_name = f"responses/{x}_{page_start}.html" - # try: - # with open(file_name, "rb") as f: - # print(f"File {file_name} already exists, skipping request") - # continue - # except FileNotFoundError: - # print(f"File {file_name} does not exist, making request") - + # It is ESSENTIAL to open the current page before being able to make requests for the detail view. yield scrapy.FormRequest( url="https://etjanst.sjv.se/asken/faces/jbstod/searchJbstod.jsp", formdata={ @@ -69,16 +80,16 @@ def start_requests(self): + ":j_id_jsp_121545192_98" ) # check if file already exists - file_path = f"responses/{x}_{y}.html" + file_path = f"responses/{self.year}_{x}_{y}.html" if Path(file_path).exists(): text = Path(file_path).read_text(encoding="utf-8") if 'class="stodmottagare selected"' in text: - print( - f"File {file_path} already exists and contains .selected, skipping request" - ) + # print( + # f"File {file_path} already exists and contains .selected, skipping request" + # ) absolute_file_path = Path(file_path).resolve() url = "file:///" + str(absolute_file_path) - print(f"Using cached file: {url}") + # print(f"Using cached file: {url}") yield scrapy.Request( url=url, callback=self.parse_response, @@ -93,6 +104,12 @@ def start_requests(self): print( f"File {file_path} exists but does not contain .selected, making request" ) + # write to log file & skip request + # with open("log.txt", "a") as log_file: + # log_file.write( + # f"File {file_path} exists but does not contain .selected, making request\n" + # ) + # continue print(key) yield scrapy.FormRequest( @@ -127,6 +144,7 @@ def start_requests(self): meta={ "page_number": x, "offset": y, + "fn": file_path, # Save the file path in meta for later use }, ) @@ -134,7 +152,7 @@ def parse2(self, response): # get page number and offset from request meta page_number = response.meta.get("page_number", None) offset = response.meta.get("offset", None) - file_path = f"responses/{page_number}_{offset}.html" + file_path = f"responses/{self.year}_{page_number}_{offset}.html" with open(file_path, "wb") as f: f.write(response.body) @@ -257,16 +275,5 @@ def parse_response(self, response): scheme_description=scheme_description.strip(), ) - # Also yield the total amount as a summary item - # yield FarmSubsidyItem( - # country="SE", - # currency="SEK", - # year=self.year, - # recipient_name=name.strip(), - # recipient_location=location, - # amount=total_amount, - # scheme="Total", - # ) - def parse(self, _response): return From 2bc897e8025370af619bdd0acf8ae02ff457ba97 Mon Sep 17 00:00:00 2001 From: Johannes Filter Date: Tue, 17 Jun 2025 18:22:07 +0200 Subject: [PATCH 38/38] Add proper parsing to RO --- scrapy_fs/scrapy_fs/spiders/ro_spider.py | 92 +++++++++++++++++++++--- 1 file changed, 83 insertions(+), 9 deletions(-) diff --git a/scrapy_fs/scrapy_fs/spiders/ro_spider.py b/scrapy_fs/scrapy_fs/spiders/ro_spider.py index 1749449..e7a3803 100644 --- a/scrapy_fs/scrapy_fs/spiders/ro_spider.py +++ b/scrapy_fs/scrapy_fs/spiders/ro_spider.py @@ -9,6 +9,20 @@ SEQUENTIAL = True +def parse_float(value): + """ + Parse a string to a float, removing any non-numeric characters except for the decimal point. + """ + if not value: + return None + # Remove all characters except digits and decimal point + cleaned_value = re.sub(r"[^\d,]", "", value) + try: + return float(cleaned_value.replace(",", ".")) + except ValueError: + return None + + class ROSpider(Spider): """ Spider for Romanias's CAP payments @@ -53,6 +67,9 @@ def parse(self, response): rows = response.css("#content tr") for row in rows: + # print(row) + # print(row.get()) + # Extract data fields beneficiary_name = row.xpath( ".//td[contains(., 'BENEFICIARY NAME')]/div[@class='fw-bold-content']/text()" @@ -77,12 +94,18 @@ def parse(self, response): fega_operation_amount = row.xpath( ".//td[contains(., 'FEGA OPERATION AMOUNT')]/div[@class='fw-bold-content']/text()" ).get() + feadr_operation_amount = row.xpath( ".//td[contains(., 'FEADR OPERATION AMOUNT')]/div[@class='fw-bold-content']/text()" ).get() total_feadr_amount = row.xpath( ".//td[contains(., 'TOTAL FEADR AMOUNT')]/div[@class='fw-bold-content']/text()" ).get() + + total_fega_amount = row.xpath( + ".//td[contains(., 'TOTAL FEGA AMOUNT')]/div[@class='fw-bold-content']/text()" + ).get() + operation_related_amount = row.xpath( ".//td[contains(., 'OPERATION-RELATED AMOUNT')]/div[@class='fw-bold-content']/text()" ).get() @@ -93,7 +116,15 @@ def parse(self, response): ".//td[contains(., 'TOTAL EU AMOUNT FOR BENEFICIARY')]/div[@class='fw-bold-content']/text()" ).get() - name = beneficiary_name.strip() if beneficiary_name else "N.N." + schema = ( + measure_code + if measure_code + else "" + (" - " + objective if objective else "") + ) + name = "" + + if beneficiary_name: + name = beneficiary_name.strip() if beneficiary_last_name: name += " " + beneficiary_last_name.strip() @@ -101,20 +132,63 @@ def parse(self, response): if beneficiary_parent_company: name += ", " + beneficiary_parent_company.strip() - schema = ( - measure_code - if measure_code - else "" + (" - " + objective if objective else "") - ) + if not name: + continue + print(row.get()) + print("No name available in row") + continue # Skip if no name is available + + total_feadr_amount = parse_float(total_feadr_amount) + total_fega_amount = parse_float(total_fega_amount) + total_eu_amount = parse_float(total_eu_amount) + + # if total_eu_amount: + # print(row.get()) + # raise ValueError("Total EU amount is there, which is unexpected.") + + if total_feadr_amount and total_fega_amount: + print(row.get()) + print(total_feadr_amount, total_fega_amount) + raise ValueError( + "Both total FEADR and total FEGA amounts are present, which is unexpected." + ) + amount = 0 + if total_feadr_amount: + schema = "FEADR: " + schema + amount = total_feadr_amount + + if total_fega_amount: + schema = "FEGA: " + schema + amount = total_fega_amount + + if amount and total_eu_amount and amount != total_eu_amount: + print(row.get()) + print( + f"Amount {amount} does not match total EU amount {total_eu_amount}, which is unexpected." + ) + raise ValueError( + f"Amount {amount} does not match total EU amount {total_eu_amount}, which is unexpected." + ) + + if not amount and total_eu_amount: + schema = "EU: " + schema + amount = total_eu_amount + + if not amount: + continue + # print("no amount") + print(row.get()) + print("No amount available in row") + raise ValueError("No amount available in row, which is unexpected.") yield FarmSubsidyItem( country="RO", - currency="RON", + currency="EUR", # It's displayed on the website in Euro and not RON! year=self.year, recipient_name=name, recipient_location=locality, - scheme=schema, - amount=total_eu_amount, + scheme_name=schema, + amount=amount, ) if SEQUENTIAL: