diff --git a/.DS_Store b/.DS_Store
deleted file mode 100644
index 7f4aa4c..0000000
Binary files a/.DS_Store and /dev/null differ
diff --git a/.gitattributes b/.gitattributes
index d433fda..b57f642 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,2 +1 @@
-*.zip filter=lfs diff=lfs merge=lfs -text
-*.csv filter=lfs diff=lfs merge=lfs -text
+*.parquet filter=lfs diff=lfs merge=lfs -text
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..40a6be6
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,41 @@
+name: CI
+
+on:
+ push:
+ pull_request:
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.12"
+
+ - name: Install uv and dependencies
+ run: |
+ pip install uv
+ uv sync
+ uv pip install pytest-cov pytest-xdist
+
+ - name: Run tests with coverage
+ run: uv run pytest app/tests/ --cov --cov-branch --cov-report=xml --junitxml=junit.xml -o junit_family=legacy
+ env:
+ PYTHONPATH: .
+
+ - name: Upload coverage reports to Codecov
+ uses: codecov/codecov-action@v5
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ slug: Abstract-Data/campaignfinance-2023
+
+ - name: Upload test results to Codecov
+ if: ${{ !cancelled() }}
+ uses: codecov/test-results-action@v1
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+
diff --git a/.gitignore b/.gitignore
index ae5f005..f8693fd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,8 +4,10 @@
*.zip
*.DS_Store
*.env
+# *.parquet
*.__pycache__/
/logs/
+# /tmp/
# Byte-compiled / optimized / DLL files
__pycache__/
@@ -173,3 +175,5 @@ cython_debug/
*.csv
*.txt
+*.parquet
+/tmp
\ No newline at end of file
diff --git a/.idea/.DS_Store b/.idea/.DS_Store
index ef45f5b..7615b36 100644
Binary files a/.idea/.DS_Store and b/.idea/.DS_Store differ
diff --git a/.idea/campaignfinance.iml b/.idea/campaignfinance.iml
index 235dc2c..3873efe 100644
--- a/.idea/campaignfinance.iml
+++ b/.idea/campaignfinance.iml
@@ -5,8 +5,9 @@
+
-
+
diff --git a/.idea/csv-editor.xml b/.idea/csv-editor.xml
index 1301501..28bbc2c 100644
--- a/.idea/csv-editor.xml
+++ b/.idea/csv-editor.xml
@@ -108,34 +108,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea/misc.xml b/.idea/misc.xml
index f6f180a..6d44f0c 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -6,7 +6,7 @@
-
+
diff --git a/.idea/ruff.xml b/.idea/ruff.xml
new file mode 100644
index 0000000..ed9f86d
--- /dev/null
+++ b/.idea/ruff.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index e69de29..9d0613d 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,18 @@
+# Texas Campaign Finance Package
+
+## Overview
+This package is designed to provide a simple interface for accessing campaign finance data from the Texas Ethics Commission.
+It also reduces duplication of fields and joins data from multiple files into a single table to reduce the size of the data.
+
+## Examples
+Across all files, there are over 317 columns. This package reduces the number of columns to [number of columns] by joining data from multiple files.
+
+## Ability to Download TEC File Data Built-In
+Using [Selenium](https://www.selenium.dev/), this package can download the latest campaign finance data from the Texas Ethics Commission website. The data is then processed and saved as CSV files.
+
+
+## Dependencies
+
+
+
+
\ No newline at end of file
diff --git a/app/.DS_Store b/app/.DS_Store
index 51dbcc8..6318756 100644
Binary files a/app/.DS_Store and b/app/.DS_Store differ
diff --git a/app/abcs/__init__.py b/app/abcs/__init__.py
index 4300da1..d18b9ad 100644
--- a/app/abcs/__init__.py
+++ b/app/abcs/__init__.py
@@ -1,7 +1,7 @@
# from abcs.abc_download import FileDownloader
-from abcs.abc_state_config import CSVReaderConfig, StateConfig, CategoryConfig, CategoryTypes
-from abcs.abc_category import StateCategoryClass
-from abcs.abc_validation import StateFileValidation
-from abcs.abc_validation_errors import ValidationErrorList
-from abcs.abc_db_loader import DBLoaderClass
-from abcs.abc_download import FileDownloaderABC, RecordGen
+from app.abcs.abc_state_config import CSVReaderConfig, StateConfig, CategoryConfig, CategoryTypes
+from app.abcs.abc_category import StateCategoryClass
+from app.abcs.abc_validation import StateFileValidation
+from app.abcs.abc_validation_errors import ValidationErrorList
+from app.abcs.abc_db_loader import DBLoaderClass
+from app.abcs.abc_download import FileDownloaderABC, RecordGen, progress
diff --git a/app/abcs/abc_category.py b/app/abcs/abc_category.py
index 7df8865..8c3957a 100644
--- a/app/abcs/abc_category.py
+++ b/app/abcs/abc_category.py
@@ -3,7 +3,7 @@
import sqlalchemy
import sqlmodel
-import abcs.abc_validation as validation
+import app.abcs.abc_validation as validation
from pathlib import Path
from typing import ClassVar, Dict, List
from dataclasses import dataclass, field
@@ -13,10 +13,10 @@
from collections import defaultdict
import datetime
# from abcs.abc_download import FileDownloader
-from abcs.abc_db_loader import DBLoaderClass
-from abcs.abc_state_config import StateConfig
-from logger import Logger
-import funcs
+from app.abcs.abc_db_loader import DBLoaderClass
+from app.abcs.abc_state_config import StateConfig
+from app.logger import Logger
+import app.funcs as funcs
import inject
from sqlmodel import SQLModel
from pydantic import BaseModel, Field, ConfigDict, model_validator, computed_field
diff --git a/app/abcs/abc_db_loader.py b/app/abcs/abc_db_loader.py
index 6ffa9ae..18964bc 100644
--- a/app/abcs/abc_db_loader.py
+++ b/app/abcs/abc_db_loader.py
@@ -1,7 +1,7 @@
from __future__ import annotations
import abc
from sqlmodel import SQLModel, Session, create_engine, select
-from logger import Logger
+from app.logger import Logger
from typing import Iterator, List, Type
from dataclasses import dataclass
import itertools
diff --git a/app/abcs/abc_download.py b/app/abcs/abc_download.py
index 52006f2..138f928 100644
--- a/app/abcs/abc_download.py
+++ b/app/abcs/abc_download.py
@@ -2,29 +2,41 @@
from dataclasses import dataclass, field
from pathlib import Path
import abc
-from abcs.abc_state_config import StateConfig, CategoryTypes
import sys
-from typing import Optional, Generator, Dict, Annotated
+from typing import Optional, Generator, Dict, Annotated, ClassVar
from icecream import ic
from pydantic import Field as PydanticField
import itertools
+from datetime import datetime
+import polars as pl
+from app.abcs.abc_state_config import StateConfig, CategoryTypes
+from web_scrape_utils import CreateWebDriver
+from app.live_display import ProgressTracker
RecordGen = Annotated[Optional[Generator[Dict, None, None]], PydanticField(default=None)]
FilteredRecordGen = RecordGen
-
+progress = ProgressTracker()
+progress.start()
@dataclass
class FileDownloaderABC(abc.ABC):
config: StateConfig
+ driver: ClassVar[Optional[CreateWebDriver]] = None
folder: Path = field(init=False)
data: RecordGen | CategoryTypes = None
def __post_init__(self):
-
self.check_if_folder_exists()
self.folder = self.config.TEMP_FOLDER
+ FileDownloaderABC.driver = CreateWebDriver(download_folder=self.folder)
+
+ @classmethod
+ def not_headless(cls):
+ if cls.driver:
+ cls.driver.headless = False
+ return cls
def check_if_folder_exists(self) -> Path:
_temp_folder_name = self.config.TEMP_FOLDER.stem.title()
@@ -46,12 +58,65 @@ def check_if_folder_exists(self) -> Path:
ic("User selected 'n'. Exiting...")
sys.exit()
+ @classmethod
+ def extract_zipfile(cls, zip_ref, tmp):
+ zip_file_info = zip_ref.infolist()
+ _extract_task = progress.add_task("T4", "Extract Zip", "In Progress")
+ for file in zip_file_info:
+ try:
+ cls._process_csv(zip_ref, file, tmp)
+ except Exception as e:
+ ic(f"Zip File Extraction Error on {file.filename.upper()}: {e}")
+ progress.update_task(_extract_task, "Complete")
+
+ @classmethod
+ def _process_csv(cls, zip_ref, file, tmp):
+ file_name = Path(file.filename)
+ if file_name.suffix not in ('.csv', '.txt'):
+ ic(f"File {file_name.stem} is not a CSV/TXT file. Skipping...")
+ return
+
+ _csv_task = progress.add_task("T5", f"Extract CSV {file_name.stem}", "Started")
+ zip_ref.extract(file, tmp)
+
+ if file_name.suffix == '.txt':
+ return
+
+ rename = f"{file_name.stem}_{datetime.now():%Y%m%d}dl"
+ pl_file = pl.scan_csv(tmp / file_name, low_memory=False, infer_schema=False)
+ pl_file = (
+ pl_file
+ .with_columns(
+ pl.lit(file_name.stem)
+ .alias('file_origin')
+ ))
+
+ pl_file = (
+ pl_file
+ .with_columns([
+ pl.col(col)
+ .cast(pl.String)
+ for col in pl_file.collect_schema().names()
+ ]))
+
+ pl_file.collect().write_parquet(tmp / f"{rename}.parquet", compression='lz4')
+ progress.update_task(_csv_task, "Complete")
+ # Clean up original CSV file
+ (tmp / file_name).unlink()
+
+ @classmethod
+ @abc.abstractmethod
+ def download(cls, overwrite: bool, read_from_temp: bool) -> FileDownloaderABC:
+ ...
+
+ @classmethod
@abc.abstractmethod
- def download(self, overwrite: bool, read_from_temp: bool) -> FileDownloaderABC:
+ def consolidate_files(cls):
...
+ @classmethod
@abc.abstractmethod
- def read(self):
+ def read(cls):
...
def sort_categories(self) -> CategoryTypes:
diff --git a/app/abcs/abc_state_config.py b/app/abcs/abc_state_config.py
index 6018035..f2a7f0b 100644
--- a/app/abcs/abc_state_config.py
+++ b/app/abcs/abc_state_config.py
@@ -12,7 +12,7 @@
from enum import StrEnum
from rich.progress import track
-import funcs
+import app.funcs as funcs
def check_for_empty_gen(func):
@@ -151,7 +151,11 @@ def TEMP_FOLDER(self) -> Path:
@property
def FIELD_DATA(self) -> dict:
- return funcs.read_toml(Path(__file__).parents[1] / 'states'/ (_state := self.STATE_NAME.lower()) / f"{_state}_fields.toml")
+ return (
+ funcs
+ .read_toml(
+ Path(__file__)
+ .parents[1] / 'states'/ (_state := self.STATE_NAME.lower()) / f"{_state}_fields.toml"))
@staticmethod
@lru_cache
diff --git a/app/abcs/abc_validation.py b/app/abcs/abc_validation.py
index 61c6564..b412aa4 100644
--- a/app/abcs/abc_validation.py
+++ b/app/abcs/abc_validation.py
@@ -6,9 +6,9 @@
import csv
from tqdm import tqdm
from pydantic import ValidationError
-from abcs.abc_validation_errors import ValidationErrorList
-from funcs.validator_functions import create_record_id
-from logger import Logger
+from app.abcs.abc_validation_errors import ValidationErrorList
+from app.funcs.validator_functions import create_record_id
+from app.logger import Logger
from icecream import ic
ValidatorType = Type[SQLModel]
diff --git a/app/abcs/abc_validation_errors.py b/app/abcs/abc_validation_errors.py
index e68bf0f..8fa77a4 100644
--- a/app/abcs/abc_validation_errors.py
+++ b/app/abcs/abc_validation_errors.py
@@ -4,7 +4,7 @@
import pandas as pd
from icecream import ic
-ic.configureOutput(prefix='abc_validation_errors|')
+ic.configureOutput(prefix='campaignfinance|')
class RecordValidationError(BaseModel):
diff --git a/app/funcs/__init__.py b/app/funcs/__init__.py
index 602c9d9..1192079 100644
--- a/app/funcs/__init__.py
+++ b/app/funcs/__init__.py
@@ -1,4 +1,4 @@
-from funcs.csv_reader import FileReader
-from funcs.toml_reader import read_toml
-from funcs.file_exporters import write_records_to_csv_validation
-from funcs.depreciated import deprecated
+from .csv_reader import FileReader
+from .toml_reader import read_toml
+from .file_exporters import write_records_to_csv_validation
+from .depreciated import deprecated
diff --git a/app/funcs/csv_reader.py b/app/funcs/csv_reader.py
index 45f59ca..70a8026 100644
--- a/app/funcs/csv_reader.py
+++ b/app/funcs/csv_reader.py
@@ -5,7 +5,7 @@
from typing import Callable, Dict, Generator
import datetime
from dataclasses import dataclass
-from logger import Logger
+from app.logger import Logger
from rich.progress import Progress
import polars as pl
from rich.progress import Progress
@@ -80,11 +80,65 @@ def read_csv(self, file: Path, **kwargs) -> Generator[Dict[int, Dict], None, Non
yield _record
def read_folder(self, folder: Path, **kwargs) -> Generator[Dict[int, Dict], None, None]:
- files = list(folder.glob("*.csv"))
+ # Get both CSV and Parquet files
+ csv_files = list(folder.glob("*.csv"))
+ parquet_files = list(folder.glob("*.parquet"))
+ all_files = csv_files + parquet_files
+
with Progress() as pbar:
- task = pbar.add_task("Reading files...", total=len(files))
- for file in files:
+ task = pbar.add_task("Reading files...", total=len(all_files))
+ for file in all_files:
pbar.update(task, advance=1)
- recs = self.read_csv(file, **kwargs)
- for rec in recs:
- yield rec
+ try:
+ if file.suffix.lower() == '.csv':
+ recs = self.read_csv(file, **kwargs)
+ elif file.suffix.lower() == '.parquet':
+ recs = self.read_parquet(file, **kwargs)
+ else:
+ continue
+
+ for rec in recs:
+ yield rec
+ except Exception as e:
+ print(f"Error processing file {file}: {str(e)}")
+ continue
+
+ @include_file_origin
+ @include_download_date
+ def read_parquet(self, file: Path, **kwargs) -> Generator[Dict[int, Dict], None, None]:
+ """
+ Read a Parquet file and yield each row as a dictionary.
+ Handles schema mismatches by reading row by row.
+ """
+ try:
+ # Use scan_parquet for lazy evaluation
+ lazy_df = pl.scan_parquet(file, **kwargs)
+
+ # Collect the lazy frame and then iterate over rows
+ df = lazy_df.collect()
+
+ # Use iter_rows to get each row as a dictionary
+ for row in df.iter_rows(named=True):
+ yield row
+
+ except Exception as e:
+ print(f"Error reading parquet file {file}: {str(e)}")
+ # Try alternative approach if scan_parquet fails
+ try:
+ df = pl.read_parquet(file, **kwargs)
+ for row_dict in df.to_dicts():
+ yield row_dict
+ except Exception as e2:
+ print(f"Alternative approach also failed for {file}: {str(e2)}")
+
+ @include_file_origin
+ @include_download_date
+ def read_txt_file(self, file: Path, **kwargs) -> Generator[Dict[int, Dict], None, None]:
+ with open(file, "r", encoding='utf-8') as _file:
+ _records = csv.DictReader(_file)
+ if kwargs.get('lowercase_headers'):
+ _records.fieldnames = [x.lower() for x in _records.fieldnames]
+ for _record in _records:
+ if kwargs.get('change_space_in_headers'):
+ _record = {k.replace(' ', '_'): v for k, v in _record.items() if k is not None}
+ yield _record
diff --git a/app/funcs/db_loader.py b/app/funcs/db_loader.py
index 3f45448..ea1906b 100644
--- a/app/funcs/db_loader.py
+++ b/app/funcs/db_loader.py
@@ -1,6 +1,6 @@
from __future__ import annotations
from sqlmodel import SQLModel, Session, create_engine, select
-from logger import Logger
+from app.logger import Logger
from typing import Iterator, List, Type, Generator
from dataclasses import dataclass
import itertools
diff --git a/app/funcs/validator_functions.py b/app/funcs/validator_functions.py
index b0cc15f..46c406e 100644
--- a/app/funcs/validator_functions.py
+++ b/app/funcs/validator_functions.py
@@ -163,6 +163,13 @@ def format_zipcode(column, zipcode: str) -> str:
}
)
+def check_contains_factory(match_string: str):
+ def check_contains(value: str) -> str:
+ if value and match_string not in value:
+ raise ValueError(f"Value must contain '{match_string}'")
+ return value
+ return check_contains
+
@singledispatch
def person_name_parser(name: str) -> HumanName:
diff --git a/app/live_display.py b/app/live_display.py
new file mode 100644
index 0000000..95fc70a
--- /dev/null
+++ b/app/live_display.py
@@ -0,0 +1,106 @@
+from rich.live import Live
+from rich.table import Table
+from rich.console import Console
+from typing import Dict, Optional
+import threading
+from datetime import datetime
+import queue
+
+class ProgressTracker:
+ def __init__(self):
+ self._tasks: Dict[str, dict] = {}
+ self._lock = threading.Lock()
+ self._live: Optional[Live] = None
+ self._update_queue = queue.Queue()
+ self._console = Console(force_terminal=True, color_system="auto")
+ self._running = True
+ self._update_thread = threading.Thread(target=self._update_display)
+ self._update_thread.daemon = True
+ self._update_thread.start()
+
+ def start(self):
+ """Start the live display"""
+ if not self._live:
+ self._live = Live(self._generate_table(), refresh_per_second=4)
+ self._live.start()
+
+ def stop(self):
+ """Stop the live display and cleanup"""
+ self._running = False
+ if self._live:
+ self._live.stop()
+ self._live = None
+
+ def add_task(self, task_id: str, description: str, status: str = "pending"):
+ """Add a new task to track"""
+ with self._lock:
+ self._tasks[task_id] = {
+ "description": description,
+ "status": status,
+ "start_time": datetime.now(),
+ "update_time": datetime.now()
+ }
+ self._queue_update()
+ return task_id
+
+ def update_task(self, task_id: str, status: str):
+ """Update the status of an existing task"""
+ with self._lock:
+ if task_id in self._tasks:
+ self._tasks[task_id]["status"] = status
+ self._tasks[task_id]["update_time"] = datetime.now()
+ self._queue_update()
+
+ def remove_task(self, task_id: str):
+ """Remove a task from tracking"""
+ with self._lock:
+ self._tasks.pop(task_id, None)
+ self._queue_update()
+
+ def print(self, msg: str):
+ """Print a message to the console"""
+ self._console.print(msg)
+
+ def _generate_table(self) -> Table:
+ """Generate the Rich table for display"""
+ table = Table()
+ table.add_column("Task ID")
+ table.add_column("Description")
+ table.add_column("Status")
+ table.add_column("Duration")
+
+ with self._lock:
+ for task_id, task in self._tasks.items():
+ duration = datetime.now() - task["start_time"]
+ duration_str = str(duration).split('.')[0] # Remove microseconds
+
+ # Color-code status
+ status_style = {
+ "pending": "yellow",
+ "running": "blue",
+ "completed": "green",
+ "failed": "red"
+ }.get(task["status"].lower(), "white")
+
+ table.add_row(
+ task_id,
+ task["description"],
+ f"[{status_style}]{task['status']}[/{status_style}]",
+ duration_str
+ )
+
+ return table
+
+ def _queue_update(self):
+ """Queue a display update"""
+ self._update_queue.put(True)
+
+ def _update_display(self):
+ """Update display thread"""
+ while self._running:
+ try:
+ self._update_queue.get(timeout=0.25)
+ if self._live:
+ self._live.update(self._generate_table())
+ except queue.Empty:
+ continue
\ No newline at end of file
diff --git a/app/logs/campaign_finance.log.2025-01-21 b/app/logs/campaign_finance.log.2025-01-21
new file mode 100644
index 0000000..ea46928
--- /dev/null
+++ b/app/logs/campaign_finance.log.2025-01-21
@@ -0,0 +1,2299 @@
+2024-12-31 15:32:12 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2024-12-31 15:32:12 campaignfinance@TECDownloader INFO: Checking if Texas temp folder exists...
+2025-01-06 22:47:27 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:47:49 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:50:21 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:51:54 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:52:05 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:52:48 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:53:01 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:53:06 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:53:20 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:53:30 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:53:55 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:54:06 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:54:17 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:54:26 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:54:38 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:54:46 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:54:52 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 22:55:32 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:06:46 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:07:37 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:08:59 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:09:36 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:09:48 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:10:11 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:22:11 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:22:25 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:23:04 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:23:16 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:23:56 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:24:23 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:25:03 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:28:25 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:29:53 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:30:00 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:30:20 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:32:32 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:32:50 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:32:59 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:33:08 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:33:14 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:34:12 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:34:18 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:34:40 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:36:22 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:36:34 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:37:47 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:38:23 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:38:37 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:39:52 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:40:16 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:42:22 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:47:52 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:48:46 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:49:50 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:50:23 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:51:53 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:52:08 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:55:37 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:56:04 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:56:39 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:58:10 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-06 23:59:40 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:01:24 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:04:35 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:04:55 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:05:19 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:09:29 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:10:14 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:11:08 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:11:52 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:12:03 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:12:43 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:13:20 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:15:21 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:17:52 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:21:31 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:21:53 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:22:59 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:23:31 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:24:49 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:25:08 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:25:30 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:26:22 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:26:42 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:28:47 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:29:07 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:31:01 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:32:26 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:48:54 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:49:18 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:49:46 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 00:59:53 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:03:30 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:07:34 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:08:22 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:09:29 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:13:33 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:18:20 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:18:31 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:23:05 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:24:48 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:26:52 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:31:34 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:34:36 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:35:48 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:41:09 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:41:23 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:42:00 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:42:42 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:43:27 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:44:01 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:45:38 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:47:11 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:47:54 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:48:19 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:49:12 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:53:50 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:54:01 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:54:34 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:55:06 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:57:41 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:58:18 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 01:58:43 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 02:00:08 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 16:34:07 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 16:35:25 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 16:37:08 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 16:38:35 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 16:55:07 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 16:58:51 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 16:58:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:01:49 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 17:01:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:02:37 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 17:02:37 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:03:06 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 17:03:06 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:04:45 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 17:04:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:05:48 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 17:05:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:10:28 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 17:10:28 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:11:32 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 17:11:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:12:19 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 17:12:19 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:14:14 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 17:14:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:15:32 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 17:15:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:16:11 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 17:16:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:18:28 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 17:18:28 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:23:22 campaignfinance@states.texas INFO: Logger initialized in states.texas.texas
+2025-01-07 17:23:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:28:26 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:29:00 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:29:47 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:30:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:33:50 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:35:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:35:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:36:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:41:01 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:43:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:45:01 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:46:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:48:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:51:40 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:54:43 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 17:54:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:06:00 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:07:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:08:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:13:42 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:14:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:15:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:15:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:16:36 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:19:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:19:46 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:20:42 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:23:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:23:50 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:23:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:26:19 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:27:31 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:29:09 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:30:59 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:31:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:32:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:34:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:35:42 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:36:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:37:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:38:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:39:10 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:40:01 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:41:47 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:42:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:42:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:43:35 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:49:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:50:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:51:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:52:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:55:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 18:57:43 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 19:02:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-07 19:04:28 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 00:48:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 00:53:37 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 00:54:31 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:18:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:19:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:20:53 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:24:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:24:47 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:25:26 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:26:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:33:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:33:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:35:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:45:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:45:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:47:00 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:47:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:48:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:49:02 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:49:36 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 01:53:38 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 02:01:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 02:05:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 02:06:04 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 02:08:36 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 02:12:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 02:16:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 02:17:12 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 02:21:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 02:22:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 02:25:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-08 02:29:31 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 01:32:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 01:33:59 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 01:35:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 01:35:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 01:50:44 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 01:56:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:03:40 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:17:37 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:22:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:22:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:24:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:27:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:27:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:28:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:29:00 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:31:29 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:33:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:33:42 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:34:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:38:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:39:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:39:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:40:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:41:12 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:43:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:43:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:44:46 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:51:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:53:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:55:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:56:46 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:57:35 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 02:59:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 03:01:26 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 03:03:01 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_80_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_78_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_87_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_38_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/spacs_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_49_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/notices_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_39_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pledges_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_86_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_79_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_81_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_48_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_57_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_50_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_catg_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/purpose_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/debts_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_45_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_17_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_42_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_21_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_74_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_26_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_73_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_33_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_66_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_34_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_61_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_43_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_16_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_44_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_51_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_56_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_60_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_35_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_67_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_32_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_72_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_27_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_75_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_20_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cand_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_13_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_46_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_14_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_41_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_54_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_53_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_30_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_65_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_37_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_62_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_88_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_22_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_77_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_25_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_70_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_52_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_55_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/loans_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_40_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_15_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_47_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_71_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_24_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_76_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_23_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_89_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/credits_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_63_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_36_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_64_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_31_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/assets_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_69_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/filers_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_83_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_29_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_84_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_18_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/finals_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_58_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/travel_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_85_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_28_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_82_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_68_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_59_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:04 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_19_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_80_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_78_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_87_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_38_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/spacs_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_49_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/notices_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_39_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pledges_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_86_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_79_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_81_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_48_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_57_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_50_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_catg_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/purpose_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/debts_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_45_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_17_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_42_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_21_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_74_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_26_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_73_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_33_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_66_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_34_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_61_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_43_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_16_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_44_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_51_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_56_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_60_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_35_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_67_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_32_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_72_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_27_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_75_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_20_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cand_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_13_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_46_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_14_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_41_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_54_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_53_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_30_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_65_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_37_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_62_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_88_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_22_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_77_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_25_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_70_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_52_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_55_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/loans_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_40_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_15_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_47_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_71_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_24_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_76_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_23_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_89_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/credits_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_63_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_36_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_64_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_31_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/assets_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_69_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/filers_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_83_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_29_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_84_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_18_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/finals_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_58_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/travel_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_85_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_28_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_82_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_68_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_59_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 03:03:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_19_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:26:45 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_80_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:45 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_78_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:45 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_87_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:45 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_38_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/spacs_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_49_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/notices_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_39_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pledges_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_86_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_79_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_81_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_48_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_57_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_50_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_catg_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/purpose_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/debts_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_45_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_17_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_42_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_21_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_74_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_26_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_73_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_33_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_66_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_34_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_61_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_43_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_16_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_44_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_51_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_56_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_60_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_35_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_67_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_32_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_72_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_27_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_75_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_20_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cand_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_13_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_46_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_14_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_22_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_54_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_53_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_30_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_65_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_37_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_62_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_88_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_41_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_77_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_25_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_70_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_52_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_55_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/loans_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_40_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_15_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_47_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_71_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_24_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_76_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_23_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_89_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/credits_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_63_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_36_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_64_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_31_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/assets_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_69_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/filers_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_83_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_29_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_84_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_18_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/finals_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_58_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/travel_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_85_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_28_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_82_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_68_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_59_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:26:46 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_19_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_80_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_78_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_87_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_38_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/spacs_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_49_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/notices_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_39_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pledges_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_86_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_79_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_81_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:57 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_48_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_57_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_50_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_catg_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/purpose_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/debts_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_45_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_17_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_42_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_21_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_74_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_26_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_73_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_33_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_66_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_34_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_61_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_43_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_16_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_44_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_51_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_56_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_60_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_35_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_67_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_32_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_72_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_27_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_75_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_20_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cand_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_13_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_46_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_14_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_41_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_54_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_53_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_30_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_65_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_37_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_62_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_88_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_22_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_77_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_25_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_70_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_52_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_55_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/loans_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_40_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_15_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_47_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_71_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_24_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_76_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_23_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_89_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/credits_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_63_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_36_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_64_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_31_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/assets_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_69_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/filers_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_83_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_29_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_84_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_18_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/finals_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_58_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/travel_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_85_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_28_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_82_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_68_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_59_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:27:58 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_19_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_80_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_78_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_87_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_38_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/spacs_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_49_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/notices_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_39_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pledges_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_86_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_79_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_81_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_48_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_57_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_50_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_catg_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/purpose_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/debts_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_45_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_17_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_42_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_21_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_74_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_26_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_73_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_33_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_66_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_34_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_61_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_43_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_16_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_44_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_51_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_56_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_60_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_35_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_67_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_32_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_72_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_27_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_75_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_20_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cand_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_13_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_46_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_14_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_41_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_54_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_53_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_30_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_65_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_37_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_62_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_88_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_22_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_77_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_25_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_70_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_52_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_55_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/loans_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_40_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_15_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_47_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_71_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_24_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_76_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_23_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_89_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/credits_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_63_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_36_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_64_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_31_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/assets_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_69_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/filers_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_83_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_29_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_84_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_18_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/finals_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_58_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/travel_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_85_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_28_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_82_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_68_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_59_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:28:43 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_19_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_80_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_78_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_87_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_38_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/spacs_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_49_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/notices_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_39_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pledges_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_86_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_79_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_81_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_48_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_57_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_50_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_catg_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/purpose_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/debts_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_45_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_17_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_42_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_21_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_74_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_26_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_73_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_33_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_66_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_34_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_61_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_43_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_16_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_44_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_51_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_56_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_60_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_35_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_67_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_32_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_72_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_27_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_75_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_20_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cand_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_13_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_46_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_14_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_41_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_54_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_53_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_30_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_65_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_37_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_62_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_88_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_22_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_77_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_25_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_70_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_52_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_55_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/loans_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_40_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_15_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_47_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_71_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_24_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_76_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_23_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_89_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/credits_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_63_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_36_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_64_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_31_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/assets_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_69_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/filers_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_83_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_29_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_84_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_18_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/finals_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_58_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/travel_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_85_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_28_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_82_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_68_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_59_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:30:42 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_19_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_80_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_78_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_87_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_38_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/spacs_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_49_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/notices_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_39_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pledges_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_86_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_79_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_81_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_48_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_57_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_50_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_catg_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/purpose_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/debts_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_45_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_17_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_42_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_21_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_74_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_26_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_73_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_33_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_66_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_34_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_61_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_43_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_16_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_44_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_51_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_56_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_60_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_35_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_67_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_32_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_72_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_27_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_75_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_20_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cand_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_13_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_46_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_14_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_41_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_54_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_53_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_30_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_65_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_37_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_62_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_88_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_22_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_77_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_25_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_70_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_52_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_55_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/loans_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_40_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_15_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_47_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_71_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_24_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_76_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_23_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_89_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/credits_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_63_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_36_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_64_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_31_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/assets_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_69_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/filers_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_83_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_29_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_84_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_18_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/finals_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_58_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/travel_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_85_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_28_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_82_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_68_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_59_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:32:26 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_19_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:19 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_80_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_78_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_87_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_38_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/spacs_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_49_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/notices_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_39_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pledges_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_86_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_79_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_81_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_48_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_57_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_50_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_catg_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/purpose_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/debts_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_45_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_17_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_42_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_21_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_74_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_26_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_73_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_33_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_66_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_34_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_61_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_43_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_16_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_44_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_51_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_56_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_60_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_35_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_67_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_32_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_72_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_27_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_75_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_20_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cand_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_13_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_46_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_14_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_41_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_54_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_53_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_30_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_65_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_37_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_62_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_88_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_22_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_77_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_25_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_70_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_52_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_55_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/loans_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_40_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_15_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_47_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_71_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_24_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_76_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_23_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_89_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/credits_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_63_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_36_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_64_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_31_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/assets_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_69_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/filers_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_83_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_29_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_84_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_18_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/finals_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_58_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/travel_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_85_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_28_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_82_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_68_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_59_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:33:24 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_19_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:37 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_80_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_78_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_87_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_38_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/spacs_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_49_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/notices_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_39_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pledges_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_86_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_79_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_81_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_48_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_57_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_50_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_catg_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/purpose_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/debts_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_45_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_17_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_42_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_21_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_74_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_26_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_73_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_33_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_66_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_34_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_61_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_43_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_16_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_44_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_51_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_56_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_60_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_35_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_67_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_32_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_72_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_27_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_75_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_20_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cand_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_13_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_46_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_14_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_41_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_54_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_53_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_30_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_65_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_37_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_62_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_88_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_22_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_77_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_25_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_70_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_52_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_55_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/loans_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_40_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_15_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_47_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_71_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_24_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_76_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_23_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_89_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/credits_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_63_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_36_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_64_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_31_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/assets_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_69_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/filers_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_83_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_29_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_84_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_18_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/finals_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_58_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/travel_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_85_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_28_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_82_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_68_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_59_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:34:41 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_19_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_80_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_78_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_87_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_38_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/spacs_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_49_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/notices_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_39_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pledges_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_86_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_79_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_81_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_48_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_57_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_50_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_catg_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/purpose_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/debts_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_45_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_17_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_42_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_21_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_74_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_26_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_73_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_33_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_66_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_34_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_61_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_43_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_16_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_44_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_51_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_56_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_60_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_35_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_67_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_32_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_72_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_27_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_75_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_20_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cand_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_13_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_46_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_14_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_41_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_54_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_53_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_30_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_65_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_37_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_62_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_88_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_22_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_77_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_25_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_70_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_52_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_55_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/loans_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_40_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_15_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_47_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_71_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_24_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_76_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_23_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_89_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/credits_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_63_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_36_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_64_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_31_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/assets_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_69_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/filers_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_83_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_29_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_84_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_18_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/finals_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_58_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/travel_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_85_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_28_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_82_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_68_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_59_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:35:25 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_19_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_80_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_78_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_87_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_38_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/spacs_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_49_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/notices_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_39_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_09_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pledges_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_86_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_79_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_81_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_48_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_08_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_57_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_50_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_catg_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/purpose_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/debts_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_45_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_17_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_42_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_21_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_74_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_26_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_73_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_33_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_66_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_34_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_61_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_43_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_16_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expn_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_44_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_11_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_51_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_04_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_56_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_03_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_60_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_35_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_67_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_32_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_02_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_05_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_72_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_27_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_75_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_20_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_10_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/pldg_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cand_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_13_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_46_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_14_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_41_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_54_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_53_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_30_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_65_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_37_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_62_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_88_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_22_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_77_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_25_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_70_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_52_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_07_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_55_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/loans_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_40_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_15_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_47_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_12_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_71_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_24_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_76_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_23_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_89_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_01_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/expend_06_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/credits_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_63_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_36_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_64_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_31_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/assets_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_69_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/filers_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_83_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_29_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_84_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_18_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cover_t_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/finals_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/cont_ss_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_58_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/travel_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_85_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_28_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_82_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_68_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_59_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:37:29 campaignfinance@FileReader ERROR: Error processing /Users/johneakin/PyCharmProjects/campaignfinance/tmp/texas/contribs_19_20250107.csv: 'ExprStringNameSpace' object has no attribute 'strip'
+2025-01-09 19:40:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:40:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:41:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:42:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:43:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:45:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:46:46 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:48:10 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:48:50 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:50:28 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:52:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:55:43 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 19:55:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:09:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:10:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:11:04 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:12:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:13:37 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:16:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:20:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:21:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:22:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:22:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:24:46 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:27:38 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:28:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:29:44 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:30:02 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:30:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:32:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:32:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:33:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:34:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:35:42 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:37:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:38:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:40:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:41:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:41:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:42:59 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:43:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:44:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:45:28 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:47:44 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:48:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:48:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:48:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:48:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:49:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:52:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:54:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:55:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:56:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 20:59:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:01:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:04:29 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:05:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:06:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:07:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:08:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:12:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:14:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:14:47 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:15:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:15:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:17:02 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:17:36 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:18:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:20:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:22:28 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:23:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:23:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:25:09 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:26:09 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:26:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:29:09 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-09 21:29:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-10 17:08:38 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-10 17:18:38 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-10 17:18:53 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-10 17:21:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-10 17:26:07 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-10 17:31:05 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-10 17:36:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:20:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:20:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:21:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:21:35 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:22:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:23:10 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:24:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:24:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:28:09 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:32:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:36:19 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:37:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:38:31 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:43:38 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 18:46:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:04:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:06:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:09:04 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:09:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:09:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:10:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:12:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:14:04 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:16:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:17:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:19:46 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:20:28 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:20:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:24:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:25:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:26:01 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:26:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:31:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:32:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:32:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:35:12 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:35:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:36:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:37:06 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:37:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:38:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:40:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:42:40 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:43:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:43:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:44:19 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:45:46 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:46:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:46:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:47:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:48:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:50:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:51:10 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:51:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:52:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:53:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:55:35 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 19:56:40 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:22:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:24:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:28:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:28:31 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:30:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:33:09 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:34:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:35:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:36:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:38:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:40:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:43:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:53:04 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:56:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 20:58:05 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-11 23:14:53 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:29:10 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:29:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:34:05 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:38:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:40:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:41:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:43:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:43:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:44:29 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:45:26 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:48:02 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:48:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:50:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:52:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:53:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:54:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:55:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:55:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:56:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:56:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:58:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 14:59:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 15:01:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 15:35:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 15:38:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 15:39:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 15:39:43 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:06:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:08:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:09:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:10:04 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:10:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:10:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:12:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:14:40 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:15:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:15:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:19:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:27:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:31:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:32:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:40:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:44:19 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:44:43 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:46:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:47:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:48:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:49:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:50:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:53:44 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:54:53 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:55:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:57:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:59:05 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 16:59:43 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 17:00:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 17:03:26 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 17:04:50 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 17:05:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 17:06:47 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 17:09:00 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 17:15:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 17:17:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 18:44:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-13 19:32:53 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 17:21:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 17:47:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 18:08:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 18:09:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 18:23:44 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 19:10:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 19:44:29 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 19:50:07 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 20:17:36 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 20:34:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 20:34:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 20:35:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 21:05:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 21:06:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 21:06:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 21:07:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 21:53:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 21:53:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 21:59:47 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 22:18:02 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 22:25:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 22:28:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 22:48:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 22:50:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 22:54:12 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 22:59:42 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 23:05:47 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 23:09:29 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 23:14:47 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 23:18:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 23:23:06 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 23:26:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 23:26:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 23:32:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 23:41:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 23:45:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 23:47:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-14 23:56:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 00:02:00 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 00:07:36 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 00:12:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 00:19:46 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 00:24:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 00:31:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 00:36:09 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 00:37:19 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 00:41:09 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 00:47:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 00:52:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 00:57:26 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 01:03:01 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 01:06:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 01:12:31 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 01:16:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 01:31:28 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 01:35:01 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 01:40:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 01:50:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 01:56:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 02:03:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 02:12:36 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 02:16:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 02:20:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 14:43:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 14:44:47 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 14:48:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 14:55:43 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 14:56:38 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 15:08:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 15:15:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 15:17:05 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 15:20:46 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 15:24:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 15:26:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 15:34:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 15:45:04 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 15:48:37 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 15:54:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 15:58:07 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 15:58:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:06:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:06:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:09:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:10:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:12:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:17:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:18:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:18:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:19:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:24:40 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:25:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:26:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:27:10 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:32:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:40:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:42:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:43:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:45:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 16:50:06 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:00:07 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:00:26 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:03:36 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:04:28 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:05:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:07:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:07:46 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:11:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:12:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:14:42 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:18:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:19:04 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:21:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:21:47 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:24:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:25:09 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:27:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:32:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:34:38 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:35:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:39:04 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:39:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:40:06 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 17:40:36 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 20:29:38 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 20:47:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 20:47:53 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 20:48:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 20:49:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 20:50:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 20:55:00 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 20:59:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 21:25:59 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 21:26:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 21:26:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 22:18:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 22:20:35 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 22:24:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 22:30:10 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 22:32:53 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 22:43:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 22:46:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 22:49:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 22:52:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 22:54:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 22:57:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 23:00:28 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 23:04:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 23:10:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 23:16:07 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 23:21:10 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 23:24:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 23:27:47 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 23:44:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-15 23:46:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:06:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:07:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:13:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:13:47 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:21:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:22:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:29:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:29:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:30:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:31:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:32:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:34:59 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:35:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:39:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:40:09 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:42:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:48:04 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 00:51:53 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:04:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:05:42 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:08:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:09:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:11:59 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:14:38 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:16:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:20:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:21:12 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:21:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:21:50 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:24:05 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:24:26 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:26:42 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:26:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:27:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:27:46 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:28:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:28:59 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:30:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:33:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:33:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:33:53 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:34:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:34:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:35:07 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:36:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:37:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:37:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:38:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:39:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:40:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:42:07 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:42:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:43:05 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:44:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:45:06 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:45:59 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:48:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:49:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:49:42 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:50:04 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:50:43 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:51:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:51:42 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:51:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:52:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:53:40 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:54:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:55:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:57:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:58:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 01:59:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 02:05:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 02:06:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 02:08:35 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 02:09:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 02:11:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 02:13:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 02:14:29 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 17:51:50 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 17:59:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 18:00:53 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 18:06:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 18:29:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 18:35:07 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 18:36:35 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 18:42:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 18:46:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 18:47:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 18:48:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 18:48:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 18:52:19 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 18:53:37 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 19:17:46 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 19:24:12 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 19:24:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 19:29:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:04:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:05:12 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:18:31 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:19:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:20:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:20:29 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:21:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:21:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:22:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:24:10 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:32:29 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:36:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:43:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:50:26 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:53:35 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:56:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:57:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 20:59:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 21:00:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 21:17:38 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 21:18:09 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 21:22:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 21:22:53 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 21:26:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 21:30:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 21:33:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 21:37:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 21:42:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 21:48:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 21:55:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 21:59:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 22:05:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 22:11:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 22:17:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 22:24:02 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 22:27:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-16 22:31:46 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 01:21:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 01:23:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 01:25:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 01:29:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 01:29:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 01:32:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 01:38:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 01:48:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 01:49:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 01:51:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 01:54:23 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:04:47 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:06:04 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:07:02 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:10:09 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:10:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:12:30 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:16:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:19:06 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:19:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:20:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:21:06 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:21:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:22:12 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:22:35 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:24:28 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:30:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:31:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:33:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:35:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:39:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:40:02 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:40:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:41:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:42:04 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:44:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:44:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:47:41 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:48:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:49:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:49:36 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:50:00 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:50:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:53:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:54:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:55:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:56:26 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 02:57:59 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:01:42 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:03:10 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:03:40 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:04:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:04:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:05:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:05:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:08:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:08:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:10:31 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:11:40 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:12:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:15:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:22:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:23:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:24:12 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:25:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:26:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:27:26 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:29:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:30:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:33:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:35:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:37:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:38:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:47:37 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:51:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:52:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:52:53 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 03:53:29 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 04:20:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 04:24:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 04:31:03 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 04:31:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 04:33:26 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 04:34:14 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 04:45:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 19:18:07 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 19:30:17 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 19:32:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 19:34:02 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 19:35:25 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 19:36:16 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 21:11:18 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 21:24:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 21:24:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 21:25:37 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 21:26:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 21:29:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 21:30:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 21:32:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 21:39:58 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 21:40:27 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 21:40:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 21:41:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 21:48:40 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:09:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:11:24 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:12:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:13:33 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:14:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:14:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:15:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:16:49 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:17:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:19:09 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:20:20 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:21:12 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:21:40 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:22:43 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:23:05 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:23:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:23:52 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:24:05 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:24:44 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:31:53 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:32:10 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:32:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:32:40 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:35:08 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:37:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:42:55 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:43:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:45:01 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:45:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:46:10 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:46:32 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:47:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:48:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:48:54 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:49:19 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:49:56 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:50:15 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:50:51 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:52:35 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:55:39 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 22:57:22 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 23:03:19 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-17 23:19:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-21 00:26:13 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-21 00:28:57 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-21 20:01:44 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-21 20:03:45 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-21 20:10:34 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-21 20:12:48 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-21 20:15:11 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-21 20:28:38 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-21 20:31:33 campaignfinance@states INFO: Logger initialized in states.texas
diff --git a/app/logs/campaign_finance.log.2025-01-31 b/app/logs/campaign_finance.log.2025-01-31
new file mode 100644
index 0000000..f4be134
--- /dev/null
+++ b/app/logs/campaign_finance.log.2025-01-31
@@ -0,0 +1,3 @@
+2025-01-31 13:02:21 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-31 13:21:40 campaignfinance@states INFO: Logger initialized in states.texas
+2025-01-31 13:33:19 campaignfinance@states INFO: Logger initialized in states.texas
diff --git a/app/main.py b/app/main.py
index b89e92b..c1758af 100644
--- a/app/main.py
+++ b/app/main.py
@@ -1,14 +1,18 @@
#! /usr/bin/env python3
from __future__ import annotations
-from states.texas import (
- TexasDownloader
+
+import re
+
+from app.states.texas import (
+ TexasDownloader,
+ TexasSearch
# texas_engine as engine,
)
-from states.texas.validators.texas_personname import TECPersonName
+# from states.texas.validators.texas_filers import TECFilerName
# from states.oklahoma import OklahomaCategory, oklahoma_validators, oklahoma_snowpark_session
# from sqlmodel import select, SQLModel, text, within_group, Session, any_, col, and_, or_
-# import pandas as pd
+import pandas as pd
# from tqdm import tqdm
# import matplotlib.pyplot as plt
# from sqlalchemy.exc import SQLAlchemyError
@@ -23,7 +27,9 @@
# from collections import namedtuple
# from enum import Enum
# import matplotlib.pyplot as plt
-# from pathlib import Path
+from pathlib import Path
+import polars as pl
+from contextlib import contextmanager
# from functools import singledispatch
""" Update the model order of imports. Break out each model to a
@@ -54,31 +60,384 @@
# SQLModel.metadata.create_all(engine)
download = TexasDownloader()
# download.download()
-download.read()
-cats = download.sort_categories()
-data = download.data
-
-
-fields = [data.travel,
- data.contributions,
- data.expenses,
- data.filers,
- data.reports,
- data.candidates,
- data.debts
- ]
-prefix_to_remove = ['guarantor', 'payee', 'candidate', 'treas', 'filer', 'chair', 'contributor', 'expend', 'assttreas', ]
-unique_fields = set()
-for field in fields:
- if field.DATA:
- for record in field.DATA:
- for key in record.keys():
- unique_fields.add(key)
- if key.endswith('3'):
- print(key, record['file_origin'])
-unique_fields_rm_prefix = set([x.replace(prefix, "") for x in unique_fields for prefix in prefix_to_remove if x.startswith(prefix) and x != prefix])
-unique_fields_wo_prefix = set([x for x in unique_fields if not any([x.startswith(prefix) for prefix in prefix_to_remove])])
-unique_fields = unique_fields_rm_prefix.union(unique_fields_wo_prefix)
+dfs = download.dataframes()
+
+contribution_df = dfs['contribs']
+expenditure_df = dfs['expend']
+
+tim_dunn = contribution_df.filter(pl.col('contributorNameLast') == "DUNN", pl.col('contributorNameFirst').str.contains("TIM")).collect().to_pandas()
+farris_wilks = contribution_df.filter(pl.col('contributorNameLast') == "WILKS", pl.col('contributorNameFirst').str.contains("FARRIS")).collect().to_pandas()
+don_dyer = contribution_df.filter(pl.col('contributorNameLast') == "DYER", pl.col('contributorNameFirst').str.contains("DON")).collect().to_pandas()
+doug_deason = contribution_df.filter(pl.col('contributorNameLast') == "DEASON", pl.col('contributorNameFirst').str.contains("DOUG")).collect().to_pandas()
+
+donation_list = pd.concat([tim_dunn, farris_wilks, don_dyer])
+campaign_ids_set = set(donation_list['filerIdent'].unique())
+
+donation_campaign_expenses = expenditure_df.filter(pl.col('filerIdent').is_in(campaign_ids_set)).collect().to_pandas()
+donation_campaign_expenses['new_PayeeName'] = donation_campaign_expenses['payeeNameOrganization'].fillna('') \
+ .where(donation_campaign_expenses['payeeNameOrganization'].notna(),
+ (donation_campaign_expenses['payeeNameFirst'].fillna('') + ' ' +
+ donation_campaign_expenses['payeeNameLast'].fillna('')).str.strip())
+donation_campaign_expenses['expendAmount'] = donation_campaign_expenses['expendAmount'].astype(float)
+expenses_groupby = donation_campaign_expenses.groupby(['filerName', 'new_PayeeName']).agg({'expendAmount': 'sum'}).reset_index()
+# sprague = pl.scan_csv(Path.home() / 'Downloads' / 'CAC_EXP_MSTRKEY_13504.CSV', infer_schema_length=None)
+# FIRST_AND_LAST = pl.format(
+# "{} {}", pl.col("FIRST_NAME"), pl.col("LAST_NAME"))
+# NAME_AND_ORG = pl.coalesce(FIRST_AND_LAST, pl.col("NON_INDIVIDUAL")).alias('NAME_ORG')
+# sprauge = sprague.with_columns(NAME_AND_ORG)
+# by_year = sprague.group_by(pl.col('RPT_YEAR'), pl.col('FIRST_NAME'), pl.col('LAST_NAME'), pl.col("NON_INDIVIDUAL"), NAME_AND_ORG, pl.col('PURPOSE')).agg(pl.col('AMOUNT').sum().round(2))
+# by_year = by_year.filter(pl.col('AMOUNT') > 1000).collect().to_pandas()
+#
+# by_year2 = sprague.group_by(pl.col('RPT_YEAR'), pl.col('FIRST_NAME'), pl.col('LAST_NAME'), pl.col("NON_INDIVIDUAL"), NAME_AND_ORG).agg(pl.col('AMOUNT').sum().round(2))
+# ct = pd.crosstab(
+# index=[by_year['NAME_ORG'], by_year['PURPOSE']],
+# columns=by_year['RPT_YEAR'],
+# values=by_year['AMOUNT'],
+# aggfunc='sum',
+# margins=True,
+# margins_name='total',
+# )
+#
+# ct2 = pd.crosstab(
+# index=by_year['NAME_ORG'],
+# columns=by_year['RPT_YEAR'],
+# values=by_year['AMOUNT'],
+# aggfunc='sum',
+# margins=True,
+# margins_name='total',
+# )
+#
+# ct.to_csv(Path.home() / 'Downloads' / 'sprague_by_purpose.csv')
+# search_expenditures = TexasSearch(dfs['expend'])
+# search_contributions = TexasSearch(dfs['contribs'])
+# travis_gop_possible = [
+# 43474,
+# 15789,
+# 23738,
+# 57940,
+# 15789,
+# 39023,
+# 15743,
+# 57940,
+# 17221,
+# 58441,
+# 39023,
+# ]
+#
+# travis_gop = search_expenditures.search(*travis_gop_possible, by_filer=True)
+#
+# travis_expenses = travis_gop.data.to_pandas()
+# travis_expense_ct = pd.crosstab(
+# index=travis_expenses['payeeName'],
+# columns=pd.to_datetime(travis_expenses['expendDt']).dt.year,
+# values=travis_expenses['expendAmount'].astype(float),
+# aggfunc='sum',
+# margins=True,
+# margins_name='total',
+# dropna=True
+# ).sort_values(by='total', ascending=False)
+#
+# travis_county_fec_contributions = pd.read_csv("/Users/johneakin/Downloads/schedule_a-2025-02-25T21_25_07.csv")
+# grouped.to_csv(Path.home() / 'Downloads' / 'macias.csv')
+
+
+# tim_dunn = search_contributions.search("TIM DUNN")
+# df = dfs['contribs']
+# cols = df.collect_schema().names()
+# date_cols = [x for x in cols if x.endswith('Dt')]
+# identity_cols = [x for x in cols if x.endswith('Ident')]
+# amount_cols = [x for x in cols if x.endswith('Amount')]
+# df = df.with_columns(
+# [pl.col(col).str.strptime(pl.Date, '%Y%m%d', strict=False).alias(col) for col in date_cols]
+# + [pl.col(col).cast(pl.Int32).alias(col) for col in identity_cols]
+# + [pl.col(col).cast(pl.Float64).alias(col) for col in amount_cols],
+# )
+#
+# wilks = df.sql(
+# """SELECT * FROM self WHERE
+# STARTS_WITH(contributorNameLast, 'Wilks')
+# AND (contributorNameFirst LIKE '%JoAnn%' OR contributorNameFirst LIKE '%Farris%' OR contributorNameFirst LIKE '%Dan%')"""
+# )
+# w_ = wilks.select(pl.col('contributionAmount')).collect().to_series()
+# w_min, w_max, w_median = w_.min(), w_.max(), w_.median()
+#
+# CONTRIB_FIRST_AND_LAST = pl.format("{} {}", pl.col('contributorNameFirst'), pl.col('contributorNameLast'))
+# CONTRIB_NAME_ORG = pl.coalesce(CONTRIB_FIRST_AND_LAST, pl.col('contributorNameOrganization')).alias('contributorName')
+#
+# VENDOR_FIRST_AND_LAST = pl.format("{} {}", pl.col('payeeNameFirst'), pl.col('payeeNameLast'))
+# VENDOR_NAME_AND_ORG = pl.coalesce(VENDOR_FIRST_AND_LAST, pl.col('payeeNameOrganization')).alias('payeeName')
+#
+# group_by = wilks.group_by(
+# pl.col('filerIdent'),
+# pl.col('filerName'),
+# CONTRIB_NAME_ORG,
+# pl.col('contributionDt').dt.year().alias('year'),
+# ).agg(
+# pl.col('contributionAmount').cast(pl.Float64).alias('amount').sum()
+# ).collect().to_pandas()
+#
+# unique_filers = group_by[['filerIdent', 'filerName']].drop_duplicates(subset='filerIdent')
+# filer_ids = unique_filers['filerIdent'].unique()
+# filer_ids_count = len(filer_ids)
+#
+# all_donors_matching_ids = (df.filter(
+# pl.col('filerIdent')
+# .is_in(filer_ids))
+# .with_columns(
+# pl.col('contributionDt').dt.year().alias('year')
+# )
+# )
+#
+# count_by_contributor = all_donors_matching_ids.group_by(
+# CONTRIB_NAME_ORG,
+# ).agg(
+# pl.col('filerIdent').n_unique().alias('num_same_as_wilks'),
+# ).collect().to_pandas()
+#
+# all_donors_to_same = all_donors_matching_ids.group_by(
+# [CONTRIB_NAME_ORG, 'year', 'filerIdent',]).agg(
+# pl.col('contributionAmount').cast(pl.Float64).alias('total').sum(),
+# ).collect().to_pandas()
+#
+# all_donors_to_same = unique_filers.merge(all_donors_to_same, on='filerIdent', how='left')
+# df1 = all_donors_to_same.groupby(
+# ['contributorName', 'filerIdent', 'year']
+# ).agg({
+# 'filerName': 'first',
+# 'total': 'sum'
+# }).reset_index()
+#
+# df2 = (
+# pd.crosstab(
+# index=[
+# all_donors_to_same['contributorName'],
+# all_donors_to_same['filerIdent'],
+# all_donors_to_same['filerName'].astype(str),
+# ],
+# columns=all_donors_to_same['year'],
+# values=all_donors_to_same['total'],
+# aggfunc='sum',
+# margins=True,
+# margins_name='total',
+# dropna=True
+# ).reset_index()
+# .merge(count_by_contributor, on='contributorName', how='left')
+# .fillna(pd.NA)
+# .assign(num_same_as_wilks=lambda x: x['num_same_as_wilks'].round().astype(pd.Int64Dtype()))
+# .query(f'num_same_as_wilks >= {filer_ids_count / 5} and total >= {w_median}')
+# .set_index(['contributorName', 'filerIdent'])
+# )
+#
+# exdf = dfs['expend']
+#
+# ex_cols = exdf.collect_schema().names()
+# ex_date_cols = [x for x in ex_cols if x.endswith('Dt')]
+# ex_identity_cols = [x for x in ex_cols if x.endswith('Ident')]
+# ex_amount_cols = [x for x in ex_cols if x.endswith('Amount')]
+# exdf = exdf.with_columns(
+# [pl.col(col).str.strptime(pl.Date, '%Y%m%d', strict=False).alias(col) for col in ex_date_cols]
+# + [pl.col(col).cast(pl.Int32).alias(col) for col in ex_identity_cols]
+# + [pl.col(col).cast(pl.Float64).alias(col) for col in ex_amount_cols]
+# )
+#
+#
+# exdf = (exdf
+# .filter(
+# pl.col('filerIdent')
+# .is_in(filer_ids))
+# .with_columns(
+# pl.col('expendDt').dt.year().alias('year'))
+# )
+# categories = (exdf
+# .select(
+# pl.col('expendCatCd')
+# .unique()
+# .alias('expenditure_categories'))
+# .collect())
+#
+# count_by_vendor = exdf.group_by(
+# VENDOR_NAME_AND_ORG,
+# ).agg(
+# pl.col('filerIdent').n_unique().alias('num_same_as_wilks'),
+# ).collect().to_pandas()
+#
+# all_vendors_to_same = exdf.group_by([
+# VENDOR_NAME_AND_ORG, 'filerIdent', 'year']).agg(
+# pl.col('expendAmount').cast(pl.Float64).sum().round().alias('total'),
+# pl.col('expendCatCd').unique().alias('expenditure_categories').cast(pl.String),
+# ).collect().to_pandas()
+# all_vendors_to_same['year'] = all_vendors_to_same['year'].astype(pd.Int64Dtype())
+#
+# merge_filer_data = unique_filers.merge(all_vendors_to_same, on='filerIdent', how='left')
+#
+# ex_ct = (
+# pd.crosstab(
+# index=[
+# merge_filer_data['payeeName'],
+# merge_filer_data['filerIdent'],
+# merge_filer_data['filerName'].astype(str),
+# ],
+# columns=merge_filer_data['year'],
+# values=merge_filer_data['total'],
+# aggfunc='sum',
+# margins=True,
+# margins_name='total',
+# dropna=True
+# ).reset_index()
+# .merge(count_by_vendor, on='payeeName', how='left')
+# .fillna(pd.NA)
+# .assign(num_same_as_wilks=lambda x: x['num_same_as_wilks'].round().astype(pd.Int64Dtype()))
+# .query(f'num_same_as_wilks >= {filer_ids_count / 5} and total >= {w_median}')
+# .set_index(['payeeName'])
+# .sort_values(by='total', ascending=False)
+# )
+#
+#
+# vendor_total_ct = (
+# pd.crosstab(
+# index=merge_filer_data['payeeName'],
+# columns=merge_filer_data['year'],
+# values=merge_filer_data['total'],
+# aggfunc='sum',
+# margins=True,
+# margins_name='total',
+# dropna=True
+# ).reset_index()
+# .merge(count_by_vendor, on='payeeName', how='left')
+# .fillna(pd.NA)
+# .assign(num_same_as_wilks=lambda x: x['num_same_as_wilks'].round().astype(pd.Int64Dtype()))
+# .query(f'num_same_as_wilks >= {filer_ids_count / 5} and total >= {w_median}')
+# .set_index(['payeeName'])
+# .sort_values(by=['total', 'payeeName'], ascending=False)
+# )
+# vendor_total_ct.to_csv(Path.home() / 'Downloads' / 'vendor_totals.csv')
+# ex_ct.to_csv(Path.home() / 'Downloads' / 'vendor_totals_by_filer.csv')
+# same_as_wilks_vendors = all_vendors_to_same.filter(
+# pl.col('num_same_as_wilks') >= (filer_ids_count / 5))
+#
+#
+# top_donors = df.with_columns(
+# CONTRIB_NAME_ORG,
+# pl.col('contributionDt').dt.year().alias('year').cast(pl.String)
+# ).select(
+# CONTRIB_NAME_ORG, pl.col('filerIdent'), pl.col('filerName'), pl.col('contributionAmount'), 'year').collect()
+#
+# top_donors_group = top_donors.group_by([
+# 'contributorName', 'filerIdent', 'filerName', 'year']).agg(
+# pl.col('contributionAmount').sum().round().alias('total')
+# )
+#
+# top_ct_by_filer = pd.crosstab(
+# index=[
+# top_donors_group['contributorName'],
+# top_donors_group['filerName']],
+# columns=top_donors_group['year'],
+# values=top_donors_group['total'],
+# aggfunc='sum',
+# margins=True,
+# margins_name='total',
+# ).query(f'total >= {w_median}')
+# top_ct_total = pd.crosstab(
+# index=top_donors_group['contributorName'],
+# columns=top_donors_group['year'],
+# values=top_donors_group['total'],
+# aggfunc='sum',
+# margins=True,
+# margins_name='total',
+# ).query(f'total >= 3e6')
+
+# all_donors_to_same = dfs['contributions'].sql(
+# f"""
+# SELECT t1.*
+# FROM self t1
+# INNER JOIN (
+# SELECT filerIdent, contributorNameLast, contributorNameFirst
+# FROM self
+# WHERE filerIdent IN {tuple(filer_ids)}
+# GROUP BY filerIdent, contributorNameLast, contributorNameFirst
+# HAVING COUNT(DISTINCT filerIdent) = {filer_ids_count}
+# ) t2
+# ON t1.contributorNameLast = t2.contributorNameLast
+# AND t1.contributorNameFirst = t2.contributorNameFirst
+# AND t1.filerIdent = t2.filerIdent
+# WHERE t1.filerIdent IN {tuple(filer_ids)}
+# """
+# ).collect()
+# def categorize_data(_data = data):
+# def filter_by_origin(origin_subset):
+# return (item for item in _data if item['file_origin'].startswith(origin_subset))
+#
+# _filers = filter_by_origin('filer')
+# _reports = filter_by_origin('final')
+# _contributions = filter_by_origin('contrib')
+# _expenses = filter_by_origin('expend')
+# _travel = filter_by_origin('travel')
+# _candidates = filter_by_origin('cand')
+#
+# return _filers, _reports, _contributions, _expenses, _travel, _candidates
+#
+# filers, reports, contributions, expenses, travel, candidates = categorize_data()
+#
+# filer_test = next(filers)
+# report_test = next(reports)
+# contribution_test = next(contributions)
+# expense_test = next(expenses)
+# travel_test = next(travel)
+# candidate_test = next(candidates)
+
+# filers = (x['filerIdent'] for x in data if 'filers' in x['file_origin'])
+# reports = (x['reportInfoIdent'] for x in data if 'reports' in x['file_origin'])
+# contributions = (x for x in data.contributions if x['filerIdent'] in reports and x['filderIdent'] == test.filerIdent)
+# expenses = (x for x in data.expenses if x['filerIdent'] in reports and x['filderIdent'] == test.filerIdent)
+
+# contrib = next(data.contributions)
+# filers = next(data.filers)
+# reports = next(data.reports)
+# expenses = next(data.expenses)
+# travel = next(data.travel)
+# candidates = next(data.candidates)
+# debts = next(data.debts)
+#
+# fields = [data.travel,
+# data.contributions,
+# data.expenses,
+# data.filers,
+# data.reports,
+# data.candidates,
+# data.debts
+# ]
+# prefix_to_remove = ['lender', 'guarantor', 'payee', 'candidate', 'treas', 'chair', 'contributor', 'expend', 'assttreas', ]
+# unique_fields = set()
+# numerical_field_dict = {}
+# all_field_dict = {}
+# for field in fields:
+# if field.DATA:
+# record = next(field.DATA)
+# for key in record.keys():
+# unique_fields.add(key)
+# all_field_dict.setdefault(record['file_origin'], []).append(key)
+# if key[-1].isdigit():
+# numerical_field_dict.setdefault(record['file_origin'], []).append(key)
+#
+# all_field_dict_rm_prefix = set(
+# key.replace(prefix, "")
+# for v in all_field_dict.values()
+# for key in v
+# for prefix in prefix_to_remove
+# if key.startswith(prefix) and key != prefix
+# )
+#
+# all_field_dict_after_prefix_removed = {}
+# for file, fields in all_field_dict.items():
+# remove_pfx = [x.replace(prefix, "") for x in fields for prefix in prefix_to_remove if x.startswith(prefix) and x != prefix]
+# all_field_dict_after_prefix_removed[file] = remove_pfx
+#
+# common_fields = set.intersection(*[set(v) for v in all_field_dict_after_prefix_removed.values()])
+# unique_fields_rm_prefix = set([x.replace(prefix, "") for x in unique_fields for prefix in prefix_to_remove if x.startswith(prefix) and x != prefix])
+# unique_fields_wo_prefix = set([x for x in unique_fields if not any([x.startswith(prefix) for prefix in prefix_to_remove])])
+# unique_fields_reduced = unique_fields_rm_prefix.union(unique_fields_wo_prefix)
+#
+# flags = set([key for v in all_field_dict.values() for key in v if 'Flag' in key])
# set_of_fields = list(next(x) for x in data_generators)
# texas = TexasCategory('filers')
# texas.validate()
diff --git a/app/states/ohio/ohio_downloader.py b/app/states/ohio/ohio_downloader.py
index 8b13789..9a34d3b 100644
--- a/app/states/ohio/ohio_downloader.py
+++ b/app/states/ohio/ohio_downloader.py
@@ -1 +1,35 @@
+from app.abcs import (
+ FileDownloaderABC, StateConfig, CategoryTypes, RecordGen, CategoryConfig, progress, CSVReaderConfig)
+from web_scrape_utils import CreateWebDriver, By
+
+
+OHIO_ENTRY_URL = "https://www.ohiosos.gov/campaign-finance/search/"
+
+OHIO_CONFIGURATION = StateConfig(
+ STATE_NAME="Ohio",
+ STATE_ABBREVIATION="OH",
+ # DATABASE_ENGINE=engine,
+ CSV_CONFIG=CSVReaderConfig(),
+
+)
+
+
+class OhioDownloader(FileDownloaderABC):
+ config: StateConfig = OHIO_CONFIGURATION
+
+ def download(self, overwrite: bool, read_from_temp: bool) -> FileDownloaderABC:
+ _driver = self.driver.create_driver()
+ _wait = self.driver
+ _driver.get(OHIO_ENTRY_URL)
+ _wait.wait_until_clickable(By.LINK_TEXT, "FTP Site")
+ _ftp_site_url = _driver.find_element(By.LINK_TEXT, "FTP Site").get_attribute("href")
+ _driver.get(_ftp_site_url)
+
+ ...
+
+ def consolidate_files(self):
+ ...
+
+ def read(self):
+ ...
diff --git a/app/states/oklahoma/funcs/ok_validation_funcs.py b/app/states/oklahoma/funcs/ok_validation_funcs.py
index d9d06d5..f1f1529 100644
--- a/app/states/oklahoma/funcs/ok_validation_funcs.py
+++ b/app/states/oklahoma/funcs/ok_validation_funcs.py
@@ -1,4 +1,4 @@
-import funcs.validator_functions as funcs
+import app.funcs.validator_functions as funcs
from functools import partial
diff --git a/app/states/oklahoma/oklahoma.py b/app/states/oklahoma/oklahoma.py
index e24ebed..5c42a77 100644
--- a/app/states/oklahoma/oklahoma.py
+++ b/app/states/oklahoma/oklahoma.py
@@ -2,11 +2,11 @@
from pathlib import Path
from typing import Dict, List
from typing import Generator, Type
-import funcs
-from logger import Logger
-from abcs import StateCategoryClass, StateConfig, CategoryConfig, CSVReaderConfig
-from states.oklahoma.oklahoma_database import oklahoma_snowpark_session
-import states.oklahoma.validators as validators
+import app.funcs as funcs
+from app.logger import Logger
+from app.abcs import StateCategoryClass, StateConfig, CategoryConfig, CSVReaderConfig
+from app.states.oklahoma.oklahoma_database import oklahoma_snowpark_session
+from . import validators
from functools import partial
# TODO: Change File Prefix Configurations to Oklahoma
diff --git a/app/states/oklahoma/validators/ok_contribution.py b/app/states/oklahoma/validators/ok_contribution.py
index 700460f..f53ed91 100644
--- a/app/states/oklahoma/validators/ok_contribution.py
+++ b/app/states/oklahoma/validators/ok_contribution.py
@@ -4,7 +4,7 @@
from pydantic_core import PydanticCustomError
from datetime import date
from .ok_settings import OklahomaSettings
-import funcs.validator_functions as funcs
+import app.funcs.validator_functions as funcs
"""
Oklahoma Expenditure Model/Validator
diff --git a/app/states/oklahoma/validators/ok_expenditure.py b/app/states/oklahoma/validators/ok_expenditure.py
index a9cd450..1dcc195 100644
--- a/app/states/oklahoma/validators/ok_expenditure.py
+++ b/app/states/oklahoma/validators/ok_expenditure.py
@@ -3,7 +3,7 @@
from sqlmodel import Field
from pydantic_core import PydanticCustomError
from .ok_settings import OklahomaSettings
-import funcs.validator_functions as funcs
+import app.funcs.validator_functions as funcs
from datetime import date
"""
diff --git a/app/states/oklahoma/validators/ok_lobbyist_expenditure.py b/app/states/oklahoma/validators/ok_lobbyist_expenditure.py
index 23c2470..8680174 100644
--- a/app/states/oklahoma/validators/ok_lobbyist_expenditure.py
+++ b/app/states/oklahoma/validators/ok_lobbyist_expenditure.py
@@ -4,7 +4,7 @@
from pydantic_core import PydanticCustomError
from datetime import date
from .ok_settings import OklahomaSettings
-import funcs.validator_functions as funcs
+import app.funcs.validator_functions as funcs
"""
Oklahoma Expenditure Model/Validator
diff --git a/app/states/oklahoma/validators/ok_settings.py b/app/states/oklahoma/validators/ok_settings.py
index 94ee7aa..763f15b 100644
--- a/app/states/oklahoma/validators/ok_settings.py
+++ b/app/states/oklahoma/validators/ok_settings.py
@@ -1,6 +1,6 @@
from pydantic import ConfigDict, model_validator
from sqlmodel import SQLModel
-import funcs.validator_functions as funcs
+import app.funcs.validator_functions as funcs
from pydantic_core import PydanticCustomError
"""
diff --git a/app/states/texas/__init__.py b/app/states/texas/__init__.py
index cc6ca12..59af7ab 100644
--- a/app/states/texas/__init__.py
+++ b/app/states/texas/__init__.py
@@ -1,9 +1,10 @@
from __future__ import annotations
-from logger import Logger
+from app.logger import Logger
# from states.texas.texas_database import local_postgres_engine as engine
-import states.texas.validators as validators
+from . import validators
from .texas_downloader import TECDownloader
-from abcs import StateCategoryClass, StateConfig, CategoryConfig, CSVReaderConfig, CategoryTypes
+from .texas_search import TexasSearch
+from app.abcs import StateCategoryClass, StateConfig, CategoryConfig, CSVReaderConfig, CategoryTypes
from functools import partial
logger = Logger(__name__)
@@ -30,7 +31,7 @@
VALIDATOR=validators.TECContribution),
'filers': TexasCategoryConfig(
DESC="filers",
- VALIDATOR=validators.TECFiler),
+ VALIDATOR=validators.TECFilerName),
'reports': TexasCategoryConfig(
DESC='reports',
VALIDATOR=validators.TECFinalReport),
diff --git a/app/states/texas/funcs/tx_validation_funcs.py b/app/states/texas/funcs/tx_validation_funcs.py
index 4368cfd..ecd1e0f 100644
--- a/app/states/texas/funcs/tx_validation_funcs.py
+++ b/app/states/texas/funcs/tx_validation_funcs.py
@@ -1,5 +1,5 @@
from pydantic_core import PydanticCustomError
-import funcs.validator_functions as funcs
+import app.funcs.validator_functions as funcs
from datetime import datetime
diff --git a/app/states/texas/models.py b/app/states/texas/models.py
new file mode 100644
index 0000000..1b2d116
--- /dev/null
+++ b/app/states/texas/models.py
@@ -0,0 +1,64 @@
+from dataclasses import Field
+from typing import Optional
+from datetime import date
+from pydantic import ConfigDict, model_validator, BaseModel, BeforeValidator
+from sqlmodel import SQLModel, Field
+from .validators.texas_settings import TECSettings
+import app.states.texas.funcs.tx_validation_funcs as tx_funcs
+import app.funcs.validator_functions as funcs
+from app.funcs.record_keygen import RecordKeyGenerator
+
+class TECFlags(TECSettings, table=True):
+ __tablename__ = "tx_flags"
+ __table_args__ = {"schema": "texas"}
+ id: Optional[int] = Field(default=None, primary_key=True, description="Unique record ID")
+ primaryUsaPhoneFlag: Optional[bool] = Field(
+ BeforeValidator(funcs.check_contains_factory('PrimaryUsaPhoneFlag')),
+ description="Y indicates that the phone is a USA")
+ capitalLivingexpFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was for capital living expenses")
+ contributorOosPacFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contributor is an out-of-state PAC")
+ finalOfficeholderAckFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was acknowledged by the final officeholder")
+ finalRetainedAssetsFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was retained as final assets")
+ finalUnexpendContribFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was unexpended")
+ infoOnlyFlag: Optional[bool] = Field(
+ default=None,
+ description="Superseded by other report")
+ itemizeFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution is itemized")
+ loanGuaranteedFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the loan was guaranteed")
+ modifiedElectCycleFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was modified by the election cycle")
+ reimburseIntendedFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was intended for reimbursement")
+ srcCorpContribFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was from a corporate source")
+ travelFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution has associated travel")
+ unexpendContribFilerFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was unexpended by the filer")
+
+class TECBaseModel(TECSettings):
+ recordType: Optional[str] = Field(BeforeValidator(funcs.check_contains_factory('recordType')), description="Record type code")
+ formTypeCd: Optional[str] = Field(BeforeValidator(funcs.check_contains_factory('formType')), description="TEC form used")
+ schedFormTypeCd: Optional[str] = Field(BeforeValidator(funcs.check_contains_factory('schedFormType')), description="TEC Schedule Used")
+ receivedDt: Optional[date] = Field(BeforeValidator(funcs.check_contains_factory('receivedDt')), description="Date report received by TEC")
+ filerIdent: Optional[str] = Field(default=None, description="Filer account #", max_length=100)
+ filerTypeCd: Optional[str] = Field(default=None, description="Type of filer", max_length=30)
\ No newline at end of file
diff --git a/app/states/texas/texas_downloader.py b/app/states/texas/texas_downloader.py
index fec32ad..291aafa 100644
--- a/app/states/texas/texas_downloader.py
+++ b/app/states/texas/texas_downloader.py
@@ -1,4 +1,6 @@
from __future__ import annotations
+from typing import Self, ClassVar, Optional
+import re
from dataclasses import dataclass
from pathlib import Path
from datetime import datetime
@@ -6,91 +8,272 @@
from tqdm import tqdm
import time
from icecream import ic
-from funcs.csv_reader import FileReader
+from app.funcs.csv_reader import FileReader
+import polars as pl
+import itertools
-from selenium import webdriver
-from selenium.webdriver.support.ui import WebDriverWait
-from selenium.webdriver.chrome.options import Options
-from selenium.webdriver.common.by import By
-from selenium.webdriver.support import expected_conditions as EC
-from abcs import (
- FileDownloaderABC, StateConfig, CategoryTypes, RecordGen)
+from app.abcs import (
+ FileDownloaderABC, StateConfig, CategoryTypes, RecordGen, CategoryConfig, progress)
+from web_scrape_utils import CreateWebDriver, By
@dataclass
class TECDownloader(FileDownloaderABC):
- config: StateConfig
-
- def __post_init__(self):
- self.folder = self.config.TEMP_FOLDER
+ config: ClassVar[StateConfig]
+ def __init__(self, config: StateConfig):
+ super().__init__(config=config)
+ TECDownloader.config = config
+ @classmethod
def download(
- self,
- overwrite: bool = False,
- read_from_temp: bool = True
- ) -> TECDownloader:
- tmp = self.config.TEMP_FOLDER
- options = Options()
- _prefs = {'download.default_directory': str(tmp)}
- options.add_experimental_option('prefs', _prefs)
- options.add_argument("--window-size=1920,1080") # set window size to native GUI size
- options.add_argument("start-maximized") # ensure window is full-screen
- options.page_load_strategy = "none" # Load the page as soon as possible
- # options.add_argument("--headless=True") # hide GUI
-
- if not tmp.is_dir():
- tmp.mkdir()
-
- if overwrite:
- read_from_temp = False
- for file_extension in ('*.csv', '*.txt'):
- files = tmp.glob(file_extension)
- for file in files:
- ic(f"Removing {file}")
- file.unlink()
-
- driver = webdriver.Chrome(options=options)
- wait = WebDriverWait(driver, 10)
+ cls,
+ read_from_temp: bool = True,
+ headless: bool = True
+ ) -> Self:
+ tmp = cls.config.TEMP_FOLDER
+ _existing_files = itertools.chain(*map(lambda x: tmp.glob(x), ["*.csv", "*.parquet", "*.txt"]))
+ _safe_to_delete = False
+
+ if not headless or not cls.driver.headless:
+ cls.not_headless()
+
+ _task2 = progress.add_task("T2", "Downloading TEC Zipfile...", "In Progress")
+ ic()
+ cls.driver.create_driver()
+ driver = cls.driver.chrome_driver
+ wait = cls.driver
+
driver.get("https://ethics.state.tx.us/")
- wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Search"))).click()
- wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Campaign Finance Reports"))).click()
- wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Database of Campaign Finance Reports"))).click()
- wait.until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, "Campaign Finance CSV Database"))).click()
+ wait.wait_until_clickable(By.LINK_TEXT, "Search")
+ wait.wait_until_clickable(By.LINK_TEXT, "Campaign Finance Reports")
+ wait.wait_until_clickable(By.LINK_TEXT, "Database of Campaign Finance Reports")
+ wait.wait_until_clickable(By.PARTIAL_LINK_TEXT, "Campaign Finance CSV Database")
time.sleep(5)
+ attempts = 0
+ while driver.title == 'Error':
+ attempts += 1
+ ic(f"Error page detected. Refreshing... (Attempt #: {attempts})")
+ driver.refresh()
+ time.sleep(5)
+ if attempts > 5:
+ raise ConnectionError("Error downloading TEC Zipfile. You will need to contact TEC for more information.")
+
+
in_progress = False
while True:
dl_files = list(tmp.glob("*.crdownload"))
if dl_files:
if not in_progress:
- ic(f"File {Path(dl_files[0]).stem} download in progress")
+ progress.update_task(_task2, "Still in progress")
in_progress = True
time.sleep(10)
else:
if in_progress:
- ic("File download complete")
- in_progress = False
+ progress.update_task(_task2, "Download Complete")
+ _safe_to_delete = True
break
- files = (Path(x) for x in tmp.glob("*.zip"))
- latest_file = max(files, key=lambda x: x.stat().st_ctime)
- with zipfile.ZipFile(latest_file, "r") as zip_ref:
- zip_file_info = zip_ref.infolist()
- for file in tqdm(zip_file_info, desc="Extracting Files"):
- zip_ref.extract(file, tmp)
- file_name = Path(file.filename)
- rename = f"{file_name.stem}_{datetime.now().strftime("%Y%m%d")}{file_name.suffix}"
- Path(tmp / file.filename).rename(tmp / rename)
- ic(f"Removing {latest_file}")
- latest_file.unlink()
-
-
- return self
-
- def read(self) -> RecordGen:
- _reader = FileReader()
- self.data = _reader.read_folder(self.folder, file_counts=self.config.FILE_COUNTS)
- return iter(self.data)
+ if _safe_to_delete:
+ _task1 = progress.add_task("T1", "Removing existing files", "In Progress")
+ ic()
+ list(map(lambda x: x.unlink(), _existing_files))
+ progress.update_task(_task1, "Complete")
+
+
+ _zip_files = list(Path(x) for x in tmp.glob("*.zip"))
+ if not _zip_files:
+ raise FileNotFoundError("No zip files found in folder")
+
+ _latest_file = max(_zip_files, key=lambda x: x.stat().st_ctime)
+ with zipfile.ZipFile(_latest_file, "r") as zip_ref:
+ TECDownloader.extract_zipfile(zip_ref, tmp)
+
+ list(map(lambda x: x.unlink(), _zip_files))
+ cls.consolidate_files()
+ progress.stop()
+ return cls
+
+ @classmethod
+ def _create_file_type_dict(cls) -> dict:
+ _folder = cls.config.TEMP_FOLDER
+ _file_count = len(list(_folder.glob("*.parquet")))
+ _file_type_dict = {}
+ digit_pattern = re.compile(r'^[a-zA-Z]+_\d{2}')
+ string_pattern = re.compile(r'^[a-zA-Z]+_[a-zA-Z]{1,2}')
+ for file in _folder.glob("*.parquet"):
+ if digit_pattern.match(file.stem):
+ parts = file.stem.split('_', 1)[0] # Split at the first underscore
+ elif string_pattern.match(file.stem):
+ parts = file.stem.rsplit('_', 1)[0] # Split at the last underscore
+ else:
+ raise ValueError(f"File {file} does not match the expected pattern")
+ _file_type_dict.setdefault(parts, []).append(file)
+ _file_type_dict[parts] = sorted(_file_type_dict[parts])
+
+ return _file_type_dict
+
+ @classmethod
+ def consolidate_files(cls):
+ _file_types = cls._create_file_type_dict()
+ _file_count = len(_file_types)
+ ic(_file_types)
+
+ _task = progress.add_task("Consolidation", "Consolidating Files By Category...", "Started")
+ ic()
+ for k, v in _file_types.items():
+ if len(v) > 1:
+ ic("More than 1 file found")
+ _files = iter(v)
+ # Start with scanning the first file instead of empty DataFrame
+ _first_file = next(_files)
+ df = (
+ pl.read_parquet(_first_file)
+ .with_columns(
+ pl.lit(_first_file.stem)
+ .alias('file_origin')
+ )
+ )
+
+ # Get all unique columns from all files in this category
+ all_columns = set(df.columns)
+ for _file in v[1:]: # Skip first file since we already loaded it
+ try:
+ _fdf = pl.read_parquet(_file)
+ all_columns.update(_fdf.columns)
+ except Exception as e:
+ ic(f"Error reading {_file}: {e}")
+ continue
+
+ # Ensure all columns exist in the main DataFrame (cast to String for compatibility)
+ for col in all_columns:
+ if col not in df.columns:
+ df = df.with_columns(pl.lit(None).cast(pl.String).alias(col))
+
+ # Now process each file and align columns
+ for _file in _files:
+ try:
+ _fdf = (
+ pl.read_parquet(_file)
+ .with_columns(
+ pl.lit(_file.stem)
+ .alias('file_origin')
+ )
+ )
+
+ # Add missing columns to _fdf (cast to String for compatibility)
+ for col in all_columns:
+ if col not in _fdf.columns:
+ _fdf = _fdf.with_columns(pl.lit(None).cast(pl.String).alias(col))
+
+ # Ensure column order matches
+ _fdf = _fdf.select(df.columns)
+
+ # Now stack the aligned DataFrames
+ df = df.vstack(_fdf)
+ ic(f"Added {_file.stem} to DataFrame {k}")
+ except Exception as e:
+ ic(f"Error processing {_file}: {e}")
+ continue
+ else:
+ df = (
+ pl.read_parquet(v[0])
+ .with_columns(
+ pl.lit(v[0].stem)
+ .alias('file_origin')
+ )
+ )
+
+ df = (
+ df
+ .with_columns(
+ [
+ pl.col(col)
+ .cast(pl.String) for col in df.columns
+ ]
+ )
+ )
+
+ df.write_parquet(
+ file=cls.config.TEMP_FOLDER / f"{k}_{datetime.now():%Y%m%d}w.parquet",
+ compression='lz4')
+ progress.update_task(_task, "In Progress")
+ list(map(lambda x: x.unlink(), itertools.chain(*_file_types.values())))
+ progress.update_task(_task, "Complete")
+ return cls
+
+ @classmethod
+ def read(cls, parquet: bool = True) -> RecordGen:
+
+ if not parquet:
+ _reader = FileReader()
+ cls.data = _reader.read_folder(cls.folder, file_counts=cls.config.FILE_COUNTS)
+ else:
+ parquet_files = list(cls.config.TEMP_FOLDER.glob("*.parquet"))
+ if not parquet_files:
+ raise FileNotFoundError("No parquet files found in folder")
+ _data = {}
+ for file in parquet_files:
+ _type = file.stem.rsplit('_', 1)[0]
+ _data.setdefault(_type, []).append(file)
+
+ _data = {}
+ for k, v in _data.items():
+ if len(v) == 1:
+ # Single file - read directly
+ _data[k] = pl.read_parquet(v[0]).to_dicts()
+ else:
+ # Multiple files - need to align schemas
+ try:
+ # Read first file
+ df = pl.read_parquet(v[0])
+
+ # Get all unique columns from all files
+ all_columns = set(df.columns)
+ for _file in v[1:]:
+ try:
+ _fdf = pl.read_parquet(_file)
+ all_columns.update(_fdf.columns)
+ except Exception as e:
+ ic(f"Error reading {_file}: {e}")
+ continue
+
+ # Ensure all columns exist in the main DataFrame (cast to String for compatibility)
+ for col in all_columns:
+ if col not in df.columns:
+ df = df.with_columns(pl.lit(None).cast(pl.String).alias(col))
+
+ # Process remaining files
+ for _file in v[1:]:
+ try:
+ _fdf = pl.read_parquet(_file)
+
+ # Add missing columns to _fdf (cast to String for compatibility)
+ for col in all_columns:
+ if col not in _fdf.columns:
+ _fdf = _fdf.with_columns(pl.lit(None).cast(pl.String).alias(col))
+
+ # Ensure column order matches
+ _fdf = _fdf.select(df.columns)
+
+ # Stack the aligned DataFrames
+ df = df.vstack(_fdf)
+ except Exception as e:
+ ic(f"Error processing {_file}: {e}")
+ continue
+
+ _data[k] = df.to_dicts()
+ except Exception as e:
+ ic(f"Error processing category {k}: {e}")
+ _data[k] = []
+
+ cls.data = _data
+ return cls.data
+
+ @classmethod
+ def dataframes(cls):
+ _files = cls._create_file_type_dict()
+ return {k: pl.scan_parquet(v) for k, v in _files.items()}
diff --git a/app/states/texas/texas_search.py b/app/states/texas/texas_search.py
index 0ea9ec8..78a5a97 100644
--- a/app/states/texas/texas_search.py
+++ b/app/states/texas/texas_search.py
@@ -1,173 +1,294 @@
-from states.texas.texas_database import SessionLocal
+from __future__ import annotations
+from typing import Optional, List, Dict, Any, Type, NamedTuple, Self, Tuple
import pandas as pd
-from states.texas.texas import TECFilerRecord, TECExpenseRecord, TECContributionRecord
+import polars as pl
+from polars import DataFrame
from dataclasses import dataclass, field
-from typing import ClassVar, Union
-from nameparser import HumanName
-from matplotlib import pyplot as plt
+from icecream import ic
+import time
+
+
+class TexasFieldsBase(NamedTuple):
+ PFX: str
+ DATE: str
+ AMOUNT: str
+ TYPE: str
+ FILER_ID: str = "filerIdent"
+ FILER_NAME: str = "filerName"
+
+
+TexasExpenseFields = TexasFieldsBase(
+ PFX="exp",
+ DATE="expendDt",
+ AMOUNT="expendAmount",
+ TYPE="payee",
+)
+
+TexasContributionFields = TexasFieldsBase(
+ PFX="con",
+ DATE="contributionDt",
+ AMOUNT="contributionAmount",
+ TYPE="contrib",
+)
+
@dataclass
-class TECCampaignSearch:
- query: str
- filer_id: int = field(init=False)
+class TexasSearchSetup:
+ DATA: pl.LazyFrame
+ COLS: Optional[Dict[str, List[str]]] = None
+ NAME_ORG: Any = None
+ amount_: Optional[str] = None
+
+
+ type_: Optional[TexasFieldsBase] = None
+ filer_id_: Optional[str] = "filerIdent"
+ filer_name_: Optional[str] = "filerName"
+ search_field_: Optional[str] = None
def __post_init__(self):
- self.search_for_campaign()
-
- def search_for_campaign(self):
- with SessionLocal() as session:
- results = session.query(TECFilerRecord).where(TECFilerRecord.org_names.ilike(f'%%{self.query}%%')).all()
- result_dict = [x.__dict__ for x in results]
- result_list = {x[0]: {
- 'Names': x[1]['org_names'],
- 'id': x[1]['filerIdent']} for x in enumerate(result_dict, 1)}
- for x in result_list:
- print(f"{x}: {result_list[x]['Names']}")
-
- _choice = int(input("Choose a filer: "))
- self.filer_id = result_list[_choice]['id']
- return self.filer_id
+ self._sort_fields()
+ self._recast_sorted_field_types()
+ self._coalesce_names()
-@dataclass
-class TECCriteriaPrompts:
- type_of_search: str = field(init=False)
- campaign_details: TECCampaignSearch = field(init=False)
- person_name: HumanName = None
- organization_name: str = None
- type_model: TECExpenseRecord or TECContributionRecord = field(init=False)
- _fields: dict = field(init=False)
-
- def ask_contribution_or_expense(self):
- _choice = input("""
- 1. Contribution
- 2. Expense
- """)
- fields = {}
- if _choice == '1':
- self.type_of_search = 'contribution'
- self.type_model = TECContributionRecord
- fields['name_filer'] = self.type_model.filerName
- fields['name_first'] = self.type_model.contributorNameFirst
- fields['name_last'] = self.type_model.contributorNameLast
- fields['name_organization'] = self.type_model.contributorNameOrganization
- fields['date_field'] = self.type_model.contributionDt
- fields['amount_field'] = self.type_model.contributionAmount
- elif _choice == '2':
- self.type_of_search = 'expense'
- self.type_model = TECExpenseRecord
- fields['name_filer'] = self.type_model.filerName
- fields['name_first'] = self.type_model.payeeNameFirst
- fields['name_last'] = self.type_model.payeeNameLast
- fields['name_organization'] = self.type_model.payeeNameOrganization
- fields['date_field'] = self.type_model.expendDt
- fields['amount_field'] = self.type_model.expendAmount
+ def _sort_fields(self):
+ _cols = self.DATA.collect_schema().names()
+ self.COLS = {
+ 'date': [x for x in _cols if x.endswith('Dt')],
+ 'identity': [x for x in _cols if x.endswith('Ident')],
+ 'amount': [x for x in _cols if x.endswith('Amount')],
+ 'all': _cols,
+ }
+ return self.COLS
+
+ def _recast_sorted_field_types(self):
+ self.DATA = (
+ self.DATA
+ .with_columns(
+ [pl.col(col)
+ .str
+ .strptime(pl.Date, '%Y%m%d', strict=False)
+ .alias(col) for col in self.COLS['date']] +
+ [pl.col(col)
+ .cast(pl.Int32)
+ .alias(col) for col in self.COLS['identity']] +
+ [pl.col(col)
+ .cast(pl.Float64)
+ .alias(col) for col in self.COLS['amount']],
+ )
+ )
+ _pfx = self.DATA.first().collect().get_column('file_origin')[0]
+ if TexasExpenseFields.PFX in _pfx:
+ self.type_ = TexasExpenseFields
+ elif TexasContributionFields.PFX in _pfx:
+ self.type_ = TexasContributionFields
else:
- raise ValueError("Invalid choice")
- self._fields = fields
- return self
+ raise ValueError("Could not determine type of data")
- def ask_search_type(self):
- _choice = input(f"""Would you like to:
- 1. Search all {self.type_of_search.lower()}s for a campaign
- 2. Search all {self.type_of_search.lower()}s made by a person to any campaign
- 3. Search all {self.type_of_search.lower()}s made by an organization to any campaign
- 4. Search {self.type_of_search.lower()}s made by a person to a specific campaign
- 5. Search {self.type_of_search.lower()}s made by an organization to a specific campaign
- """)
- if _choice in ['1', '4', '5']:
- self.campaign_details = TECCampaignSearch(input("Enter a campaign name: "))
- if _choice in ['2', '4']:
- _person_name = HumanName(input("Enter a person's name: "))
- if not _person_name.first and not _person_name.last:
- raise ValueError("Name must have a first and last name")
- self.person_name = _person_name
- if _choice in ['3', '5']:
- self.organization_name = input("Enter an organization's name: ")
+ _dt_field = next((x for x in self.COLS['date'] if x.endswith('Dt') and self.type_.PFX in x), None)
+ if _dt_field:
+ self.DATA = self.DATA.with_columns(
+ pl.col(_dt_field).dt.year().alias('year')
+ )
return self
+ def _coalesce_names(self):
+ _fields = [x for x in self.COLS['all'] if self.type_.TYPE in x]
+ ic(_fields)
+ _first = next((x for x in _fields if 'First' in x), None)
+ _last = next((x for x in _fields if 'Last' in x), None)
+ _org = next((x for x in _fields if 'Organization' in x), None)
+ self.search_field_ = _first.replace('First', "")
+
+ FIRST_AND_LAST = pl.format(
+ "{} {}", pl.col(_first), pl.col(_last))
+ self.NAME_ORG = pl.coalesce(
+ FIRST_AND_LAST, pl.col(_org)).alias(self.search_field_)
+ self.DATA = self.DATA.with_columns(self.NAME_ORG)
+ return self
@dataclass
-class TECResults:
- results: list
+class TexasSearchResult:
+ input_terms: tuple
+ config: TexasSearchSetup
+ data: pd.DataFrame | DataFrame = None
+ unique_filers: pd.DataFrame = None
+ unique_filters: dict = field(default_factory=dict)
+ selected_choices: set = field(default_factory=set)
+ filtered: Optional[pd.DataFrame] = None
+ grouped: Optional[pd.DataFrame] = None
- def print_results(self):
- for x in self.results:
- print(x)
+ def __repr__(self):
+ return f"TexasSearchResult({', '.join(self.input_terms)})"
- def to_dataframe(self):
- pd.set_option('display.max_columns', None)
- pd.set_option('display.max_rows', None)
- return pd.DataFrame.from_records([x.__dict__ for x in self.results]).drop(columns=['_sa_instance_state'])
+ # def group_by_year(self) -> pd.DataFrame:
+ # _df = self.data if self.filtered is None else self.filtered
+ # _result = (
+ # _df
+ # .group_by(
+ # pl.col('filerIdent'),
+ # self.config.NAME_ORG,
+ # pl.col(self.config.type_.DATE)
+ # .dt.year()
+ # .cast(pl.String)
+ # .alias('year'))
+ # .agg(
+ # pl.col(self.config.type_.AMOUNT)
+ # .cast(pl.Float64)
+ # .alias('total')
+ # .sum()
+ # .round())
+ # .to_pandas()
+ # )
+ #
+ # _merge_uniques = (
+ # self.unique_filers
+ # .to_pandas()
+ # .merge(_result, on='filerIdent', how='left'))
+ #
+ # _ct = pd.crosstab(
+ # index=[
+ # _merge_uniques['filerIdent'],
+ # _merge_uniques['filerName'],
+ # _merge_uniques[self.config.search_field_]],
+ # columns=_merge_uniques['year'],
+ # values=_merge_uniques['total'],
+ # aggfunc='sum',
+ # margins=True,
+ # margins_name='total',
+ # dropna=True
+ # )
+ # self.grouped = _ct
+ # return _ct
- def by_year(self, **kwargs):
- _campaign = kwargs.get('name_filer').name
- _date_col = kwargs.get('date_field').name
- _amount_col = kwargs.get('amount_field').name
- _df = self.to_dataframe()
- _df[_date_col] = pd.to_datetime(_df[_date_col])
+@dataclass
+class TexasSearch:
+ data: Optional[pl.LazyFrame] = None
+ config: TexasSearchSetup = None
- _df['year'] = _df[_date_col].dt.year
- _df['quarter'] = _df[_date_col].dt.quarter
+ def __repr__(self):
+ return f"TexasSearch({self.config.DATA})"
- if kwargs.get('name_first') and kwargs.get('name_last'):
- _crosstabs = pd.crosstab(index=_df[_campaign], columns=_df['year'], values=_df[_amount_col], aggfunc='sum', margins=True)
- else:
- _crosstabs = pd.crosstab(index=_df[_campaign], columns=_df['year'], values=_df[_amount_col], aggfunc='sum', margins=True)
- # Change sum values to dollar amounts
- _crosstabs = _crosstabs.map(lambda x: f"${x:,.2f}")
- print(_crosstabs)
- return _crosstabs
+ def __post_init__(self):
+ self.config = TexasSearchSetup(self.data)
+ self.data = self.config.DATA
-@dataclass
-class TECSearchQuery:
- data: TECCriteriaPrompts = field(default_factory=TECCriteriaPrompts)
- __session: SessionLocal = SessionLocal
+ def normal_search(self, result: TexasSearchResult) -> tuple[list[DataFrame], list[DataFrame], dict[
+ Any, dict[int, Any]]] | None:
+ _result = []
+ _unique_filers = []
+ _unique_filters = dict()
+ for p in result.input_terms:
+ _param_df = (
+ self.data
+ .filter(
+ pl.col(self.config.search_field_)
+ .str
+ .contains(p)
+ )
+ .collect()
+ )
+ if _param_df.is_empty():
+ continue
+ _result.append(_param_df)
- def __post_init__(self):
- self.data.ask_contribution_or_expense().ask_search_type()
+ _param_unique_filers = (
+ _param_df
+ .group_by(
+ pl.col(self.config.filer_id_))
+ .agg(
+ pl.col(self.config.type_.FILER_NAME)
+ .first()
+ .alias(self.config.type_.FILER_NAME)
+ ))
+ _unique_filers.append(_param_unique_filers)
- def search(self):
+ _unique_filters[p] = {
+ x[0]: x[1] for x in enumerate(
+ set(
+ _param_df.to_pandas()[self.config.search_field_].to_list()
+ ), 1
+ )
+ }
+ return _result, _unique_filers, _unique_filters
- with self.__session() as session:
- query = session.query(self.data.type_model)
- if self.data.campaign_details:
- query = query.where(self.data.type_model.filerIdent == self.data.campaign_details.filer_id)
- else:
- pass
- if self.data.person_name:
- query = query.where(self.data._fields['name_first'].ilike(f"%%{self.data.person_name.first}%%"))
- query = query.where(self.data._fields['name_last'].ilike(self.data.person_name.last))
- else:
- pass
+ def by_filer_search(self, result: TexasSearchResult) -> List[pl.DataFrame]:
+ _result_frames = []
+ for p in result.input_terms:
+ _param_df = (
+ self.data.filter(
+ pl.col(self.config.filer_id_).cast(pl.String)
+ .str
+ .contains(str(p))
+ )
+ ).collect().cast(pl.String)
+ if _param_df.is_empty():
+ continue
+ _result_frames.append(_param_df)
+ return _result_frames
- if self.data.organization_name:
- query = query.where(self.data._fields['name_organization'].ilike(f"%%{self.data.organization_name}%%"))
+ def search(self, *args, by_filer=False) -> TexasSearchResult:
+ result = TexasSearchResult(input_terms=args, config=self.config)
+ # self.params.extend(args)
+ _result = []
+ _unique_filers = []
+ _unique_filters = dict()
+ _still_running, _message_printed = True, False
+ _start_time = time.time()
+ while _still_running:
+ if not by_filer:
+ __result, __unique_filers, __unique_filters = self.normal_search(result)
+ _unique_filers = pl.concat(__unique_filers)
+ result.unique_filers = _unique_filers
+ result.unique_filters = _unique_filters
else:
- pass
-
- return query.all()
-
-
-# 84766
-
-# @dataclass
-# class TECContributionSearch:
-# model: ClassVar[TECContributionRecord] = TECContributionRecord
-# campaign_id: TECFilerSearch = TECFilerSearch()
-#
-# def create_campaign_filter(self, session: SessionLocal = SessionLocal) -> SessionLocal:
-# return session.query(self.model).where(self.model.filerIdent == self.campaign_id.filer_id)
-#
-# def search_by_name(self, name: str, campaign_filter: SessionLocal = create_campaign_filter):
-# _name = HumanName(name)
-# if not _name.first and not _name.last:
-# raise ValueError("Name must have a first and last name")
-# return campaign_filter.where(
-# self.model.contributorNameFirst.ilike(_name.first)
-# .where(self.model.contributorNameLast.ilike(_name.last)))
-
-# with SessionLocal() as session:
-# _all_contributions = session.query(TECContributionRecord).where(TECContributionRecord.filerIdent == search_test.filer_id)
-# _name = _all_contributions.where(TECContributionRecord.contributorNameLast == 'DUNN')
-# contribution_results = [x.__dict__ for x in _name.all()]
+ __result = self.by_filer_search(result)
+ if time.time() - _start_time > 5 and not _message_printed:
+ print("Still searching...")
+ _message_printed = True
+ _result = pl.concat(__result)
+ _still_running = False
+
+ result.data = _result
+ if by_filer:
+ return result
+ result = self.choose_options(result)
+ if not result.selected_choices:
+ return result
+ result.selected_choices = result.selected_choices
+ _filtered_result = (
+ _result
+ .filter(
+ pl.col(
+ self.config.search_field_
+ )
+ .str
+ .contains(
+ '|'.join(str(x) for x in
+ result.selected_choices
+ )
+ )
+ )
+ )
+ result.filtered = _filtered_result
+ return result
+
+ @staticmethod
+ def choose_options(_result: TexasSearchResult) -> TexasSearchResult:
+ _selections = set()
+ for term, options in _result.unique_filters.items():
+ if len(options) == 1 and options[1] == term:
+ print(f"{term} found. Added to selection list")
+ _selections.add(term)
+ continue
+ for k, v in options.items():
+ if v:
+ print(f"{k}: {v}")
+ if options:
+ _select = input(f"Select which options you'd like for {term.upper()} by number(s) or hit 'enter' to select all: ")
+ if not _select:
+ _result.selected_choices.update(options.values())
+ else:
+ _choices = list(map(int, _select.split(',')))
+ _result.selected_choices.update(_choices)
+ return _result
\ No newline at end of file
diff --git a/app/states/texas/validators/__init__.py b/app/states/texas/validators/__init__.py
index f52f41f..9a836f0 100644
--- a/app/states/texas/validators/__init__.py
+++ b/app/states/texas/validators/__init__.py
@@ -1,10 +1,10 @@
-from .texas_settings import TECSettings
-from .texas_filers import TECFiler
+from .texas_settings import TECSettings, TECBaseModel
+from .texas_filers import TECFilerName
from .texas_contributions import TECContribution
from .texas_finalreport import TECFinalReport
from .texas_expenses import TECExpense
from .texas_traveldata import TECTravelData
from .texas_candidatedata import CandidateData
from .texas_debtdata import DebtData
-from .texas_personname import TECPersonName
-from .texas_address import TECAddress
+# from .texas_personname import TECPersonName
+from .texas_address import TECAddressBase
diff --git a/app/states/texas/validators/direct_expenditures.py b/app/states/texas/validators/direct_expenditures.py
index 3062d2d..8708c6c 100644
--- a/app/states/texas/validators/direct_expenditures.py
+++ b/app/states/texas/validators/direct_expenditures.py
@@ -1,4 +1,4 @@
-from states.texas.validators.texas_settings import TECSettings
+from app.states.texas.validators.texas_settings import TECSettings
from datetime import date
class TECDirectExpenses(TECSettings):
diff --git a/app/states/texas/validators/texas_address.py b/app/states/texas/validators/texas_address.py
index b2c2eb6..92e70b7 100644
--- a/app/states/texas/validators/texas_address.py
+++ b/app/states/texas/validators/texas_address.py
@@ -6,20 +6,20 @@
from pydantic_extra_types.phone_numbers import PhoneNumber
from pydantic_core import PydanticCustomError
-from . import TECSettings
-import funcs.validator_functions as funcs
-import states.texas.funcs.tx_validation_funcs as tx_funcs
+from . import TECBaseModel
+import app.funcs.validator_functions as funcs
+import app.states.texas.funcs.tx_validation_funcs as tx_funcs
from scourgify import NormalizeAddress
from scourgify.exceptions import AddressNormalizationError
import usaddress
from icecream import ic
-from funcs.record_keygen import RecordKeyGenerator
+from app.funcs.record_keygen import RecordKeyGenerator
ADDRESS_LIST = {}
-class TECAddress(TECSettings):
- __tablename__ = "tx_addresses"
- __table_args__ = {"schema": "texas"}
+class TECAddressBase(TECBaseModel):
+ # __tablename__ = "tx_addresses"
+ # __table_args__ = {"schema": "texas"}
id: Optional[str] = Field(default=None, description="Unique record ID", primary_key=True)
address1: Optional[str] = Field(default=None, description="Address line 1")
address2: Optional[str] = Field(default=None, description="Address line 2")
@@ -30,8 +30,8 @@ class TECAddress(TECSettings):
country: Optional[str] = Field(default=None, description="Country")
region: Optional[str] = Field(default=None, description="Region")
standardized: str = Field(default=None, description="Address standardized")
- person_name_id: Optional[str] = Field(default=None, foreign_key="tx_person_names.id")
- person_name: list['TECPersonName'] = Field(default=None)
+ person_name_id: Optional[str] = Field(default=None, foreign_key="texas.tx_person_names.id")
+ # person_name: list['TECPersonName'] = Relationship(back_populates="addresses")
@model_validator(mode='before')
@classmethod
@@ -140,3 +140,13 @@ def standardize_address(self):
self.standardized = _standardized
self.id = self.generate_key(self.standardized)
return self
+
+
+class TECPersonAddressLinkModel(TECBaseModel, table=True):
+ __tablename__ = "tx_person_address_link"
+ __table_args__ = {"schema": "texas"}
+ address_id: str = Field(foreign_key="texas.tx_addresses.id", primary_key=True)
+ person_id: Optional[str] = Field(default=None, foreign_key="texas.tx_person_names.id", primary_key=True)
+ treasurer_id: Optional[str] = Field(default=None, foreign_key="texas.tx_treasurer.id", primary_key=True)
+ assistant_treasurer_id: Optional[str] = Field(default=None, foreign_key="texas.tx_assistant_treasurer.id", primary_key=True)
+
diff --git a/app/states/texas/validators/texas_contributions.py b/app/states/texas/validators/texas_contributions.py
index 7b695e9..f81176b 100644
--- a/app/states/texas/validators/texas_contributions.py
+++ b/app/states/texas/validators/texas_contributions.py
@@ -4,7 +4,7 @@
from sqlmodel import Field
from pydantic_core import PydanticCustomError
from .texas_settings import TECSettings
-import states.texas.funcs.tx_validation_funcs as tx_funcs
+import app.states.texas.funcs.tx_validation_funcs as tx_funcs
class TECContribution(TECSettings, table=True):
diff --git a/app/states/texas/validators/texas_debtdata.py b/app/states/texas/validators/texas_debtdata.py
index 9708682..04ba1d1 100644
--- a/app/states/texas/validators/texas_debtdata.py
+++ b/app/states/texas/validators/texas_debtdata.py
@@ -4,8 +4,8 @@
from sqlmodel import SQLModel, Field
from pydantic_core import PydanticCustomError
from .texas_settings import TECSettings
-import funcs.validator_functions as funcs
-import states.texas.funcs.tx_validation_funcs as tx_funcs
+import app.funcs.validator_functions as funcs
+import app.states.texas.funcs.tx_validation_funcs as tx_funcs
class DebtData(TECSettings, table=True):
diff --git a/app/states/texas/validators/texas_expenses.py b/app/states/texas/validators/texas_expenses.py
index ae53779..b918883 100644
--- a/app/states/texas/validators/texas_expenses.py
+++ b/app/states/texas/validators/texas_expenses.py
@@ -4,8 +4,9 @@
from sqlmodel import Field
from pydantic_core import PydanticCustomError
from .texas_settings import TECSettings
-import funcs.validator_functions as funcs
-import states.texas.funcs.tx_validation_funcs as tx_funcs
+import app.funcs.validator_functions as funcs
+import app.states.texas.funcs.tx_validation_funcs as tx_funcs
+from .texas_personname import TECPersonNameBase
# class TECExpenseCategory(TECSettings, table=True):
@@ -14,49 +15,10 @@
# expendCategoryCodeLabel: str = Field(..., description="Expenditure category description")
-class TECExpense(TECSettings, table=True):
+class TECExpense(TECSettings):
__tablename__ = "tx_expenses"
__table_args__ = {"schema": "texas"}
id: Optional[str] = Field(default=None, description="Unique record ID")
- recordType: str = Field(
- ...,
- description="Record type code - always EXPN",
- max_length=20
- )
- formTypeCd: str = Field(
- ...,
- description="TEC form used",
- max_length=20
- )
- schedFormTypeCd: str = Field(
- ...,
- description="TEC Schedule Used",
- max_length=20
- )
- reportInfoIdent: int = Field(
- ...,
- description="Unique report #"
- )
- receivedDt: date = Field(
- ...,
- description="Date report received by TEC"
- )
- infoOnlyFlag: Optional[bool] = Field(
- ...,
- description="Superseded by other report"
- )
- filerIdent: int = Field(
- ...,
- description="Filer account #"
- )
- filerTypeCd: str = Field(
- ...,
- description="Type of filer"
- )
- filerName: str = Field(
- ...,
- description="Filer name"
- )
expendInfoId: int = Field(
primary_key=True,
description="Unique expenditure identifier"
@@ -105,71 +67,72 @@ class TECExpense(TECSettings, table=True):
default=None,
description="Austin living expense indicator",
)
- payeePersentTypeCd: str = Field(
- ...,
- description="Type of payee name data - INDIVIDUAL or ENTITY"
- )
- payeeNameOrganization: Optional[str] = Field(
- ...,
- description="For ENTITY, the payee organization name"
- )
- payeeNameLast: Optional[str] = Field(
- default=None,
- description="For INDIVIDUAL, the payee last name"
- )
- payeeNameSuffixCd: Optional[str] = Field(
- default=None,
- description="For INDIVIDUAL, the payee suffix"
- )
- payeeNameFirst: Optional[str] = Field(
- default=None,
- description="For INDIVIDUAL, the payee first name"
- )
- payeeNamePrefixCd: Optional[str] = Field(
- default=None,
- description="For INDIVIDUAL, the payee prefix"
- )
- payeeNameShort: Optional[str] = Field(
- default=None,
- description="For INDIVIDUAL, the payee short name"
- )
- payeeNameFull: Optional[str] = Field(
- default=None,
- description="For INDIVIDUAL, the payee full name"
- )
- payeeStreetAddr1: Optional[str] = Field(
- ...,
- description="Payee street address line 1"
- )
- payeeStreetAddr2: Optional[str] = Field(
- default=None,
- description="Payee street address line 2"
- )
- payeeStreetCity: Optional[str] = Field(
- ...,
- description="Payee street address city"
- )
- payeeStreetStateCd: str = Field(
- ...,
- description="Payee street address state code"
- )
- payeeStreetCountyCd: Optional[str] = Field(
- ...,
- description="Payee street address Texas county"
- )
- payeeStreetCountryCd: Optional[str] = Field(
- ...,
- description="Payee street address - country (e.g. USA, UMI, MEX, CAN)",
- max_length=3
- )
- payeeStreetPostalCode: Optional[str] = Field(
- default=None,
- description="Payee street address - postal code - for USA addresses only"
- )
- payeeStreetRegion: Optional[str] = Field(
- default=None,
- description="Payee street address - region for country other than USA"
- )
+ payee: Optional[TECPersonNameBase] = Field(default=None, description="Payee details")
+ # payeePersentTypeCd: str = Field(
+ # ...,
+ # description="Type of payee name data - INDIVIDUAL or ENTITY"
+ # )
+ # payeeNameOrganization: Optional[str] = Field(
+ # ...,
+ # description="For ENTITY, the payee organization name"
+ # )
+ # payeeNameLast: Optional[str] = Field(
+ # default=None,
+ # description="For INDIVIDUAL, the payee last name"
+ # )
+ # payeeNameSuffixCd: Optional[str] = Field(
+ # default=None,
+ # description="For INDIVIDUAL, the payee suffix"
+ # )
+ # payeeNameFirst: Optional[str] = Field(
+ # default=None,
+ # description="For INDIVIDUAL, the payee first name"
+ # )
+ # payeeNamePrefixCd: Optional[str] = Field(
+ # default=None,
+ # description="For INDIVIDUAL, the payee prefix"
+ # )
+ # payeeNameShort: Optional[str] = Field(
+ # default=None,
+ # description="For INDIVIDUAL, the payee short name"
+ # )
+ # payeeNameFull: Optional[str] = Field(
+ # default=None,
+ # description="For INDIVIDUAL, the payee full name"
+ # )
+ # payeeStreetAddr1: Optional[str] = Field(
+ # ...,
+ # description="Payee street address line 1"
+ # )
+ # payeeStreetAddr2: Optional[str] = Field(
+ # default=None,
+ # description="Payee street address line 2"
+ # )
+ # payeeStreetCity: Optional[str] = Field(
+ # ...,
+ # description="Payee street address city"
+ # )
+ # payeeStreetStateCd: str = Field(
+ # ...,
+ # description="Payee street address state code"
+ # )
+ # payeeStreetCountyCd: Optional[str] = Field(
+ # ...,
+ # description="Payee street address Texas county"
+ # )
+ # payeeStreetCountryCd: Optional[str] = Field(
+ # ...,
+ # description="Payee street address - country (e.g. USA, UMI, MEX, CAN)",
+ # max_length=3
+ # )
+ # payeeStreetPostalCode: Optional[str] = Field(
+ # default=None,
+ # description="Payee street address - postal code - for USA addresses only"
+ # )
+ # payeeStreetRegion: Optional[str] = Field(
+ # default=None,
+ # description="Payee street address - region for country other than USA"
+ # )
creditCardIssuer: Optional[str] = Field(
default=None,
description="Financial institution issuing credit card"
@@ -187,74 +150,89 @@ class TECExpense(TECSettings, table=True):
description="Download date"
)
- clear_blank_strings = model_validator(mode='before')(funcs.clear_blank_strings)
- check_dates = model_validator(mode='before')(tx_funcs.validate_dates)
- check_zipcodes = model_validator(mode='before')(tx_funcs.check_zipcodes)
- address_formatting = model_validator(mode='before')(tx_funcs.address_formatting)
- phone_number_validation = model_validator(mode='before')(tx_funcs.phone_number_validation)
+ # clear_blank_strings = model_validator(mode='before')(funcs.clear_blank_strings)
+ # check_dates = model_validator(mode='before')(tx_funcs.validate_dates)
+ # check_zipcodes = model_validator(mode='before')(tx_funcs.check_zipcodes)
+ # address_formatting = model_validator(mode='before')(tx_funcs.address_formatting)
+ # phone_number_validation = model_validator(mode='before')(tx_funcs.phone_number_validation)
- @model_validator(mode="before")
+ @model_validator(mode='before')
@classmethod
- def _check_payee_field(cls, values):
- if values["payeePersentTypeCd"] == "INDIVIDUAL":
- if not values["payeeNameLast"]:
- raise PydanticCustomError(
- 'missing_required_value',
- "payeeNameLast is required for INDIVIDUAL payeePersentTypeCd",
- {
- 'column': 'payeeNameLast',
- 'value': values["payeeNameLast"]
- }
- )
- if not values["payeeNameFirst"]:
- raise PydanticCustomError(
- 'missing_required_value',
- "payeeNameFirst is required for INDIVIDUAL payeePersentTypeCd",
- {
- 'column': 'payeeNameFirst',
- 'value': values["payeeNameFirst"]
- }
- )
- elif values["payeePersentTypeCd"] == "ENTITY":
- if not values["payeeNameOrganization"]:
- raise PydanticCustomError(
- 'missing_required_value',
- "payeeNameOrganization is required for ENTITY payeePersentTypeCd",
- {
- 'column': 'payeeNameOrganization',
- 'value': values["payeeNameOrganization"]
- }
- )
- else:
+ def validate_payee(cls, values):
+ _payee = {k: v for k, v in values.items() if k.startswith("payee")}
+ if not _payee:
raise PydanticCustomError(
- 'incorrect_value',
- "payeePersentTypeCd must be INDIVIDUAL or ENTITY",
+ 'missing_required_value',
+ "Payee data is required",
{
- 'column': 'payeePersentTypeCd',
- 'value': values["payeePersentTypeCd"]
+ 'column': 'payee',
+ 'value': _payee
}
)
+ values['payee'] = TECPersonNameBase(**_payee)
return values
+ # @model_validator(mode="before")
+ # @classmethod
+ # def _check_payee_field(cls, values):
+ # if values["payeePersentTypeCd"] == "INDIVIDUAL":
+ # if not values["payeeNameLast"]:
+ # raise PydanticCustomError(
+ # 'missing_required_value',
+ # "payeeNameLast is required for INDIVIDUAL payeePersentTypeCd",
+ # {
+ # 'column': 'payeeNameLast',
+ # 'value': values["payeeNameLast"]
+ # }
+ # )
+ # if not values["payeeNameFirst"]:
+ # raise PydanticCustomError(
+ # 'missing_required_value',
+ # "payeeNameFirst is required for INDIVIDUAL payeePersentTypeCd",
+ # {
+ # 'column': 'payeeNameFirst',
+ # 'value': values["payeeNameFirst"]
+ # }
+ # )
+ # elif values["payeePersentTypeCd"] == "ENTITY":
+ # if not values["payeeNameOrganization"]:
+ # raise PydanticCustomError(
+ # 'missing_required_value',
+ # "payeeNameOrganization is required for ENTITY payeePersentTypeCd",
+ # {
+ # 'column': 'payeeNameOrganization',
+ # 'value': values["payeeNameOrganization"]
+ # }
+ # )
+ # else:
+ # raise PydanticCustomError(
+ # 'incorrect_value',
+ # "payeePersentTypeCd must be INDIVIDUAL or ENTITY",
+ # {
+ # 'column': 'payeePersentTypeCd',
+ # 'value': values["payeePersentTypeCd"]
+ # }
+ # )
+ # return values
+ #
+ # @model_validator(mode="before")
+ # @classmethod
+ # def format_payee_name(cls, values):
+ # if values["payeePersentTypeCd"] == "INDIVIDUAL":
+ # _payee_name_fields = [
+ # x for x in values.keys() if x.startswith("payeeName") and x != "payeeNameOrganization"
+ # ]
+ # _name_fields_not_empty = [values[x] for x in _payee_name_fields if values[x] != ""]
+ # payee_name = funcs.person_name_parser(" ".join(_name_fields_not_empty))
+ # payee_name.parse_full_name()
+ # values["payeeNameLast"] = payee_name.last
+ # values["payeeNameFirst"] = payee_name.first
+ # values["payeeNameSuffixCd"] = payee_name.suffix
+ # values["payeeNamePrefixCd"] = payee_name.title
+ # values["payeeNameFull"] = payee_name.full_name
+ #
+ # return values
- @model_validator(mode="before")
- @classmethod
- def format_payee_name(cls, values):
- if values["payeePersentTypeCd"] == "INDIVIDUAL":
- _payee_name_fields = [
- x for x in values.keys() if x.startswith("payeeName") and x != "payeeNameOrganization"
- ]
- _name_fields_not_empty = [values[x] for x in _payee_name_fields if values[x] != ""]
- payee_name = funcs.person_name_parser(" ".join(_name_fields_not_empty))
- payee_name.parse_full_name()
- values["payeeNameLast"] = payee_name.last
- values["payeeNameFirst"] = payee_name.first
- values["payeeNameSuffixCd"] = payee_name.suffix
- values["payeeNamePrefixCd"] = payee_name.title
- values["payeeNameFull"] = payee_name.full_name
-
- return values
-
- @field_validator('filerName', 'expendDescr', 'payeeStreetStateCd', 'expendDt', 'receivedDt', mode='before')
+ @field_validator('expendDescr', 'expendDt', mode='before')
@classmethod
def validate_required_fields(cls, v):
if v == "" or v is None:
diff --git a/app/states/texas/validators/texas_filers.py b/app/states/texas/validators/texas_filers.py
index cbd778b..529e1f2 100644
--- a/app/states/texas/validators/texas_filers.py
+++ b/app/states/texas/validators/texas_filers.py
@@ -1,53 +1,72 @@
from datetime import date
from typing import Optional
-from sqlmodel import Field, JSON, Relationship
+from sqlmodel import Field, JSON, Relationship, Date
from pydantic import field_validator, model_validator, BeforeValidator, create_model
from pydantic_extra_types.phone_numbers import PhoneNumber
from pydantic_core import PydanticCustomError
-import funcs.validator_functions as funcs
-import states.texas.funcs.tx_validation_funcs as tx_funcs
-from .texas_settings import TECSettings
-from .texas_address import TECAddress
-from funcs.record_keygen import RecordKeyGenerator
+import app.funcs.validator_functions as funcs
+import app.states.texas.funcs.tx_validation_funcs as tx_funcs
+from .texas_settings import TECBaseModel
+from .texas_address import TECAddressBase, TECPersonAddressLinkModel
+from .texas_flags import TECFlagsBase
+from .texas_personname import TECPersonNameBase
+
+from app.funcs.record_keygen import RecordKeyGenerator
# TODO: Create a 'Corrections' variable to hold the corrections for
# the data as a list to add each correction to the list.
-class TECFilerLink(TECSettings, table=True):
- __tablename__ = "tx_filerlink"
- __table_args__ = {"schema": "texas"}
- filer_identity_id: int = Field(foreign_key='texas.tx_fileridentity.filerIdent', primary_key=True)
- filer_details_id: int = Field(foreign_key='texas.tx_filername.filerIdent', primary_key=True)
+# TODO: Setup Filer Name as its Own Name, Then Create a Link Model of the Names and ID.
+class TECAddress(TECAddressBase, table=True):
+ __tablename__ = "tx_addresses"
+ __table_args__ = {"schema": "texas", "extend_existing": True}
+ person_name: list['TECPersonName'] = Relationship(
+ back_populates="addresses",
+ link_model=TECPersonAddressLinkModel)
-class TECTreasurerLink(TECSettings, table=True):
- __tablename__ = "tx_treasurerlink"
+class TECFilerIDNameLink(TECBaseModel, table=True):
+ __tablename__ = "tx_filer_id_name_link"
__table_args__ = {"schema": "texas"}
- filer_identity_id: int = Field(foreign_key='texas.tx_filer.filerIdent', primary_key=True)
- treasurer_id: str = Field(foreign_key='texas.tx_treasurer.treasId', primary_key=True)
+ filer_id: int = Field(foreign_key="texas.tx_filer.filerIdent", primary_key=True)
+ filer_name_id: Optional[str] = Field(default=None, foreign_key="texas.tx_filer_name.filerIdent", primary_key=True)
+ person_name_id: Optional[str] = Field(default=None, foreign_key="texas.tx_person_names.id", primary_key=True)
+ office_id: Optional[str] = Field(default=None, foreign_key="texas.tx_cta.id", primary_key=True)
+ treasurer_id: Optional[str] = Field(default=None, foreign_key="texas.tx_treasurer.id", primary_key=True)
+ assttreas_id: Optional[str] = Field(default=None, foreign_key="texas.tx_assistant_treasurer.id", primary_key=True)
+ chair_id: Optional[str] = Field(default=None, foreign_key="texas.tx_chair.id", primary_key=True)
-class TECFilerIdentity(TECSettings, table= True):
- __tablename__ = "tx_fileridentity"
- __table_args__ = {"schema": "texas"}
- filerIdent: int = Field(..., description="Filer account #", primary_key=True)
- filerTypeCd: str = Field(..., description="Type of filer")
- filerName: str = Field(..., description="Filer name")
- filer_name: list["TECFilerName"] = Relationship(back_populates="filer_name", link_model=TECFilerLink)
+class TECFlags(TECFlagsBase, table=True):
+ pass
-class TECFilerName(TECSettings, table=True):
- __tablename__ = "tx_filername"
+class TECPersonName(TECPersonNameBase, table=True):
+ __tablename__ = "tx_person_names"
+ __table_args__ = {"schema": "texas"}
+ addresses: list["TECAddress"] = Relationship(back_populates="person_name", link_model=TECPersonAddressLinkModel)
+ # filer_name: list["TECFilerName"] = Relationship(back_populates="filer_name", link_model=TECFilerIDNameLink)
+
+
+class TECFilerID(TECBaseModel, table=True):
+ __tablename__ = "tx_filer"
__table_args__ = {"schema": "texas"}
filerIdent: int = Field(..., description="Filer account #", primary_key=True)
- unexpendContribFilerFlag: Optional[bool] = Field(
- default=None, description="Unexpended contribution filer flag")
- modifiedElectCycleFlag: Optional[bool] = Field(
- default=None, description="Modified election cycle flag")
- filerJdiCd: Optional[str] = Field(
- default=None, description="Judicial declaration of intent code ")
- committeeStatusCd: Optional[str] = Field(
- default=None, description="PAC filing status code")
+ filerName: str = Field(..., description="Filer name")
+ other_names: list["TECFilerName"] = Relationship(
+ back_populates="filer_names",
+ link_model=TECFilerIDNameLink)
+
+# class TECFilerCTALinkModel(TECBaseModel, table=True):
+# __tablename__ = "tx_filer_cta_link"
+# __table_args__ = {"schema": "texas"}
+# filerIdent: int = Field(foreign_key="texas.tx_filer_name.filerIdent", primary_key=True)
+# ctaSeekOfficeCd: Optional[str] = Field(foreign_key="texas.tx_cta.id", primary_key=True)
+
+class TECCampaignTreasurerAppointment(TECBaseModel, table=True):
+ __tablename__ = "tx_cta"
+ __table_args__ = {"schema": "texas"}
+ id: Optional[int] = Field(default=None, primary_key=True)
ctaSeekOfficeCd: Optional[str] = Field(
default=None, description="CTA office sought")
ctaSeekOfficeDistrict: Optional[str] = Field(
@@ -60,85 +79,24 @@ class TECFilerName(TECSettings, table=True):
default=None, description="CTA office sought county code")
ctaSeekOfficeCountyDescr: Optional[str] = Field(
default=None, description="CTA office sought county description")
- filerPersentTypeCd: Optional[str] = Field(
- default=None, description="Type of filer name data - INDIVIDUAL or ENTITY")
- filerNameOrganization: Optional[str] = Field(
- default=None, description="For ENTITY, the filer organization name")
- filerNameLast: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the filer last name")
- filerNameSuffixCd: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the filer suffix")
- filerNameFirst: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the filer first name")
- filerNameMiddle: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the filer middle name")
- filerNamePrefixCd: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the filer prefix")
- filerNameFull: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, Full name of the filer")
- filerNameShort: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, Short name of the filer")
- filerAddress: TECAddress = Field(
- default=None, description="Filer address", sa_type=JSON)
- filerMailing: TECAddress = Field(
- default=None, description="Filer mailing address", sa_type=JSON)
-
- filer_name: Optional["TECFilerIdentity"] = Relationship(back_populates="filer_name", link_model=TECFilerLink)
-
- @model_validator(mode='before')
- @classmethod
- def validate_addresses(cls, values):
- _filer_street = {k: v for k, v in values.items() if k.startswith('filerStreet')}
- _filer_mailing = {k: v for k, v in values.items() if k.startswith('filerMailing')}
- values['filerAddress'] = TECAddress(**_filer_street)
- values['filerMailing'] = TECAddress(**_filer_mailing)
- return values
-
- @model_validator(mode='before')
- @classmethod
- def check_name(cls, values):
- _first_name = next((values.get(x) for x in values.keys() if x.endswith('NameFirst')), None)
- _last_name = next((values.get(x) for x in values.keys() if x.endswith('NameLast')), None)
- if not _first_name and not _last_name:
- return values
-
- _name = funcs.person_name_parser(f"{_first_name} {_last_name}")
- values['filerNameLast'] = _name.last
- values['filerNameFirst'] = _name.first
- values['filerNameMiddle'] = _name.middle.replace('.', '')
- values['filerNameSuffixCd'] = _name.suffix
- values['filerNamePrefixCd'] = _name.title
- values['filerNameFull'] = _name.full_name
- return values
+ filer_name: Optional["TECFilerName"] = Relationship(back_populates="cta_details", link_model=TECFilerIDNameLink)
+ def __init__(self, **data):
+ super().__init__(**data)
+ self.id = self.generate_key(self.ctaSeekOfficeCd, self.ctaSeekOfficeDistrict, self.ctaSeekOfficePlace)
+# class TECFilerTreasurerLinkModel(TECBaseModel, table=True):
+# __tablename__ = "tx_filer_treasurer_link"
+# __table_args__ = {"schema": "texas"}
+# filer_name_id: int = Field(foreign_key="texas.tx_filer_name.filerIdent", primary_key=True)
+# treasurer_id: Optional[str] = Field(foreign_key="texas.tx_treasurer.id", primary_key=True)
+# assttreas_id: Optional[str] = Field(foreign_key="texas.tx_assistant_treasurer.id", primary_key=True)
+# chair_id: Optional[str] = Field(foreign_key="texas.tx_chair.id", primary_key=True)
-class TECTreasurer(TECSettings, table=True):
+class TECTreasurer(TECPersonNameBase, table=True):
__tablename__ = "tx_treasurer"
__table_args__ = {"schema": "texas"}
- treasId: str = Field(..., description="Filer account #", primary_key=True)
- treasPersentTypeCd: Optional[str] = Field(
- default=None, description="Type of treasurer name data - INDIVIDUAL or ENTITY")
- treasNameOrganization: Optional[str] = Field(
- default=None, description="For ENTITY, the treasurer organization name")
- treasNameLast: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the treasurer last name")
- treasNameSuffixCd: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the treasurer suffix")
- treasNameFirst: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the treasurer first name")
- treasNamePrefixCd: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the treasurer prefix")
- treasNameShort: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the treasurer short name")
- treasPrimaryUsaPhoneFlag: Optional[bool] = Field(
- default=None, description="Primary phone number is in the USA")
-
- treasPrimaryPhoneNumber: Optional[PhoneNumber] = Field(
- default=None, description="Treasurer primary phone number")
- treasPrimaryPhoneExt: Optional[str] = Field(
- default=None, description="Treasurer primary phone number extension")
treasAppointorNameLast: Optional[str] = Field(
default=None, description="Treasurer appointor last name")
treasAppointorNameFirst: Optional[str] = Field(
@@ -146,139 +104,250 @@ class TECTreasurer(TECSettings, table=True):
treasFilerpersStatusCd: Optional[str] = Field(
default=None, description="Treasurer status (CURRENT, etc)")
treasEffStartDt: Optional[date] = Field(
- default=None, description="Treasurer effective start date")
+ default=None, description="Treasurer effective start date", sa_type=Date)
treasEffStopDt: Optional[date] = Field(
- default=None, description="Treasurer effective stop date")
- treasAddress: Optional[TECAddress] = Field(default=None, description="Treasurer address", sa_type=JSON)
- treasMailing: Optional[TECAddress] = Field(
- default=None, description="Treasurer mailing address", sa_type=JSON)
+ default=None, description="Treasurer effective stop date", sa_type=Date)
+ # campaign: "TECFilerName" = Relationship(back_populates="treasurer", link_model=TECFilerIDNameLink)
- treasurer: list["TECFiler"] = Relationship(back_populates="treasurer", link_model=TECTreasurerLink)
-
-
- @model_validator(mode='before')
- @classmethod
- def validate_addresses(cls, values):
- _treas_street = {k: v for k, v in values.items() if k.startswith('treasStreet')}
- _treas_mailing = {k: v for k, v in values.items() if k.startswith('treasMailing')}
-
- values['treasAddress'] = TECAddress(**_treas_street) if _treas_street else None
- values['treasMailing'] = TECAddress(**_treas_mailing) if _treas_mailing else None
- return values
-
- @model_validator(mode='after')
- def check_for_address(self):
- if not self.treasAddress and not self.treasMailing:
- raise PydanticCustomError(
- 'missing_address',
- "Treasurer address is missing",
- {
- 'address': self.treasAddress,
- 'mailing': self.treasMailing
- }
- )
- return self
-
- @model_validator(mode='after')
- def create_key(self):
- _addresses = [self.treasAddress, self.treasMailing]
- _address = next((_address.standardized for _address in _addresses if _address), None)
- if not _address:
- raise PydanticCustomError(
- 'missing_address',
- "Treasurer address is missing",
- {
- 'address': _address
- }
- )
- self.treasId = self.generate_key(self.treasNameFirst, self.treasNameLast, _address)
- return self
-
-
-class TECAsstTreasurer(TECSettings):
- assttreasPersentTypeCd: Optional[str] = Field(
- default=None, description="Type of assistant treasurer name data - INDIVIDUAL or ENTITY")
- assttreasNameOrganization: Optional[str] = Field(
- default=None, description="For ENTITY, the assistant treasurer organization name")
- assttreasNameLast: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the assistant treasurer last name")
- assttreasNameSuffixCd: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the assistant treasurer suffix")
- assttreasNameFirst: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the assistant treasurer first name")
- assttreasNamePrefixCd: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the assistant treasurer prefix")
- assttreasNameShort: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the assistant treasurer short name")
- assttreasPrimaryUsaPhoneFlag: Optional[bool] = Field(
- default=None, description="Primary phone number is in the USA")
-
- assttreasPrimaryPhoneNumber: Optional[PhoneNumber] = Field(
- default=None, description="Assistant treasurer primary phone number")
- assttreasPrimaryPhoneExt: Optional[str] = Field(
- default=None, description="Assistant treasurer primary phone number extension")
+class TECAssistantTreasurer(TECPersonNameBase, table=True):
+ __tablename__ = "tx_assistant_treasurer"
+ __table_args__ = {"schema": "texas"}
assttreasAppointorNameLast: Optional[str] = Field(
default=None, description="Assistant treasurer appointor last name")
assttreasAppointorNameFirst: Optional[str] = Field(
default=None, description="Assistant treasurer appointor first name")
+ # campaign: "TECFilerName" = Relationship(back_populates="asstTreasurer", link_model=TECFilerIDNameLink)
- assttreasAddress: TECAddress = Field(
- default=None, description="Assistant treasurer address", sa_type=JSON)
-
+class TECCampaignChair(TECPersonNameBase, table=True):
+ __tablename__ = "tx_chair"
+ __table_args__ = {"schema": "texas"}
+ # campaign: "TECFilerName" = Relationship(back_populates="chair", link_model=TECFilerIDNameLink)
+class TECFilerName(TECBaseModel, table=True):
+ __tablename__ = "tx_filer_name"
+ __table_args__ = {"schema": "texas"}
+ id: Optional[int] = Field(default=None, primary_key=True)
+ filerIdent: int = Field(foreign_key="texas.tx_filer.filerIdent")
+ filerJdiCd: Optional[str] = Field(
+ default=None, description="Judicial declaration of intent code ")
+ committeeStatusCd: Optional[str] = Field(
+ default=None, description="PAC filing status code")
+ filerName: str = Field(..., description="Filer name")
+ filerAddress: TECAddress = Field(
+ default=None, description="Filer address", sa_type=JSON)
+ filerMailing: TECAddress = Field(
+ default=None, description="Filer mailing address", sa_type=JSON)
+ cta_details: TECCampaignTreasurerAppointment = Relationship(
+ back_populates="filer_name",
+ link_model=TECFilerIDNameLink
+ )
+ filer_name: Optional["TECPersonName"] = Relationship(back_populates="filer_name", link_model=TECFilerIDNameLink)
+ treasurer: TECTreasurer = Relationship(back_populates="campaign", link_model=TECFilerIDNameLink)
+ asstTreasurer: TECAssistantTreasurer = Relationship(back_populates="campaign", link_model=TECFilerIDNameLink)
+ chair: TECCampaignChair = Relationship(back_populates="campaign", link_model=TECFilerIDNameLink)
+
+ filer_names: Optional["TECFilerID"] = Relationship(back_populates="other_names", link_model=TECFilerIDNameLink)
+ @model_validator(mode='before')
+ @classmethod
+ def validate_name(cls, values):
+ values['filerName'] = TECPersonName(**values)
+ return values
@model_validator(mode='before')
@classmethod
def validate_addresses(cls, values):
- _assttreas_street = {k: v for k, v in values.items() if k.startswith('assttreasStreet')}
- if _assttreas_street:
- values['assttreasAddress'] = TECAddress(**_assttreas_street)
+ _filer_street = {k: v for k, v in values.items() if k.startswith('filerStreet')}
+ _filer_mailing = {k: v for k, v in values.items() if k.startswith('filerMailing')}
+ values['filerAddress'] = TECAddress(**_filer_street)
+ values['filerMailing'] = TECAddress(**_filer_mailing)
return values
+ @model_validator(mode='before')
+ @classmethod
+ def validate_treasurer(cls, values):
+ _treas_values = {k: v for k, v in values.items() if k.startswith('treas')}
+ values['treasurer'] = TECTreasurer(**_treas_values)
+ return values
-class TECChair(TECSettings):
- chairPersentTypeCd: Optional[str] = Field(
- default=None, description="Type of chair name data - INDIVIDUAL or ENTITY")
- chairNameOrganization: Optional[str] = Field(
- default=None, description="For ENTITY, the chair organization name")
- chairNameLast: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the chair last name")
- chairNameSuffixCd: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the chair suffix")
- chairNameFirst: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the chair first name")
- chairNamePrefixCd: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the chair prefix")
- chairNameShort: Optional[str] = Field(
- default=None, description="For INDIVIDUAL, the chair short name")
- chairAddress: TECAddress = Field(..., description="Chair address", sa_type=JSON)
- chairPrimaryUsaPhoneFlag: Optional[bool] = Field(
- default=None, description="Primary phone number is in the USA")
-
- chairPrimaryPhoneNumber: Optional[PhoneNumber] = Field(
- default=None, description="Chair primary phone number")
- chairPrimaryPhoneExt: Optional[str] = Field(
- default=None, description="Chair primary phone number extension")
+ @model_validator(mode='before')
+ @classmethod
+ def validate_assistant_treasurer(cls, values):
+ _asst_treas_values = {k: v for k, v in values.items() if k.startswith('assttreas')}
+ values['asstTreasurer'] = TECAssistantTreasurer(**_asst_treas_values)
+ return values
@model_validator(mode='before')
@classmethod
- def validate_addresses(cls, values):
- _chair_street = {k: v for k, v in values.items() if k.startswith('chair')}
- # _chair_mailing = {k: v for k, v in values.items() if k.startswith('chairMailing')}
- values['chairAddress'] = TECAddress(**_chair_street)
- # values['chairMailing'] = TECAddress(**_chair_mailing)
+ def validate_chair(cls, values):
+ _chair_values = {k: v for k, v in values.items() if k.startswith('chair')}
+ values['chair'] = TECCampaignChair(**_chair_values)
return values
-class TECFiler(TECSettings, table=True):
- __tablename__ = "tx_filer"
- __table_args__ = {"schema": "texas"}
- filerIdent: int = Field(default=None, primary_key=True)
- recordType: str = Field(..., description="Record type code - always FILER")
- filerName: TECFilerName = Field(
- default=None, description="Filer name", sa_type=JSON)
- treasurer: list["TECTreasurer"] = Relationship(back_populates="treasurer", link_model=TECTreasurerLink)
- asstTreasurer: Optional[TECAsstTreasurer] = Field(default=None, description="Assistant Treasurer", sa_type=JSON)
- chair: Optional[TECChair] = Field(default=None, description="Chair", sa_type=JSON)
+# class TECTreasurer(TECBaseModel, table=True):
+# __tablename__ = "tx_treasurer"
+# __table_args__ = {"schema": "texas"}
+# treasId: str = Field(..., description="Filer account #", primary_key=True)
+# treasPersentTypeCd: Optional[str] = Field(
+# default=None, description="Type of treasurer name data - INDIVIDUAL or ENTITY")
+# treasNameOrganization: Optional[str] = Field(
+# default=None, description="For ENTITY, the treasurer organization name")
+# treasNameLast: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the treasurer last name")
+# treasNameSuffixCd: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the treasurer suffix")
+# treasNameFirst: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the treasurer first name")
+# treasNamePrefixCd: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the treasurer prefix")
+# treasNameShort: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the treasurer short name")
+# treasPrimaryUsaPhoneFlag: Optional[bool] = Field(
+# default=None, description="Primary phone number is in the USA")
+#
+# treasPrimaryPhoneNumber: Optional[PhoneNumber] = Field(
+# default=None, description="Treasurer primary phone number")
+# treasPrimaryPhoneExt: Optional[str] = Field(
+# default=None, description="Treasurer primary phone number extension")
+# treasAppointorNameLast: Optional[str] = Field(
+# default=None, description="Treasurer appointor last name")
+# treasAppointorNameFirst: Optional[str] = Field(
+# default=None, description="Treasurer appointor first name")
+# treasFilerpersStatusCd: Optional[str] = Field(
+# default=None, description="Treasurer status (CURRENT, etc)")
+# treasEffStartDt: Optional[date] = Field(
+# default=None, description="Treasurer effective start date")
+# treasEffStopDt: Optional[date] = Field(
+# default=None, description="Treasurer effective stop date")
+# treasAddress: Optional[TECAddress] = Field(default=None, description="Treasurer address", sa_type=JSON)
+# treasMailing: Optional[TECAddress] = Field(
+# default=None, description="Treasurer mailing address", sa_type=JSON)
+#
+# treasurer: list["TECFiler"] = Relationship(back_populates="treasurer")
+#
+#
+# @model_validator(mode='before')
+# @classmethod
+# def validate_addresses(cls, values):
+# _treas_street = {k: v for k, v in values.items() if k.startswith('treasStreet')}
+# _treas_mailing = {k: v for k, v in values.items() if k.startswith('treasMailing')}
+#
+# values['treasAddress'] = TECAddress(**_treas_street) if _treas_street else None
+# values['treasMailing'] = TECAddress(**_treas_mailing) if _treas_mailing else None
+# return values
+#
+# @model_validator(mode='after')
+# def check_for_address(self):
+# if not self.treasAddress and not self.treasMailing:
+# raise PydanticCustomError(
+# 'missing_address',
+# "Treasurer address is missing",
+# {
+# 'address': self.treasAddress,
+# 'mailing': self.treasMailing
+# }
+# )
+# return self
+#
+# @model_validator(mode='after')
+# def create_key(self):
+# _addresses = [self.treasAddress, self.treasMailing]
+# _address = next((_address.standardized for _address in _addresses if _address), None)
+# if not _address:
+# raise PydanticCustomError(
+# 'missing_address',
+# "Treasurer address is missing",
+# {
+# 'address': _address
+# }
+# )
+# self.treasId = self.generate_key(self.treasNameFirst, self.treasNameLast, _address)
+# return self
+
+
+# class TECAsstTreasurer(TECBaseModel):
+# assttreasPersentTypeCd: Optional[str] = Field(
+# default=None, description="Type of assistant treasurer name data - INDIVIDUAL or ENTITY")
+# assttreasNameOrganization: Optional[str] = Field(
+# default=None, description="For ENTITY, the assistant treasurer organization name")
+# assttreasNameLast: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the assistant treasurer last name")
+# assttreasNameSuffixCd: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the assistant treasurer suffix")
+# assttreasNameFirst: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the assistant treasurer first name")
+# assttreasNamePrefixCd: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the assistant treasurer prefix")
+# assttreasNameShort: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the assistant treasurer short name")
+# assttreasPrimaryUsaPhoneFlag: Optional[bool] = Field(
+# default=None, description="Primary phone number is in the USA")
+#
+# assttreasPrimaryPhoneNumber: Optional[PhoneNumber] = Field(
+# default=None, description="Assistant treasurer primary phone number")
+# assttreasPrimaryPhoneExt: Optional[str] = Field(
+# default=None, description="Assistant treasurer primary phone number extension")
+# assttreasAppointorNameLast: Optional[str] = Field(
+# default=None, description="Assistant treasurer appointor last name")
+# assttreasAppointorNameFirst: Optional[str] = Field(
+# default=None, description="Assistant treasurer appointor first name")
+#
+# assttreasAddress: TECAddress = Field(
+# default=None, description="Assistant treasurer address", sa_type=JSON)
+#
+#
+#
+# @model_validator(mode='before')
+# @classmethod
+# def validate_addresses(cls, values):
+# _assttreas_street = {k: v for k, v in values.items() if k.startswith('assttreasStreet')}
+# if _assttreas_street:
+# values['assttreasAddress'] = TECAddress(**_assttreas_street)
+# return values
+
+
+# class TECChair(TECBaseModel):
+# chairPersentTypeCd: Optional[str] = Field(
+# default=None, description="Type of chair name data - INDIVIDUAL or ENTITY")
+# chairNameOrganization: Optional[str] = Field(
+# default=None, description="For ENTITY, the chair organization name")
+# chairNameLast: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the chair last name")
+# chairNameSuffixCd: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the chair suffix")
+# chairNameFirst: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the chair first name")
+# chairNamePrefixCd: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the chair prefix")
+# chairNameShort: Optional[str] = Field(
+# default=None, description="For INDIVIDUAL, the chair short name")
+# chairAddress: TECAddress = Field(..., description="Chair address", sa_type=JSON)
+# chairPrimaryUsaPhoneFlag: Optional[bool] = Field(
+# default=None, description="Primary phone number is in the USA")
+#
+# chairPrimaryPhoneNumber: Optional[PhoneNumber] = Field(
+# default=None, description="Chair primary phone number")
+# chairPrimaryPhoneExt: Optional[str] = Field(
+# default=None, description="Chair primary phone number extension")
+#
+# @model_validator(mode='before')
+# @classmethod
+# def validate_addresses(cls, values):
+# _chair_street = {k: v for k, v in values.items() if k.startswith('chair')}
+# # _chair_mailing = {k: v for k, v in values.items() if k.startswith('chairMailing')}
+# values['chairAddress'] = TECAddress(**_chair_street)
+# # values['chairMailing'] = TECAddress(**_chair_mailing)
+# return values
+
+# class TECFiler(TECBaseModel, table=True):
+# __tablename__ = "tx_filer"
+# __table_args__ = {"schema": "texas"}
+# filerIdent: int = Field(default=None, primary_key=True)
+# recordType: str = Field(..., description="Record type code - always FILER")
+# filerName: TECFilerName = Field(
+# default=None, description="Filer name", sa_type=JSON)
+# treasurer: list["TECTreasurer"] = Relationship(back_populates="treasurer")
+# asstTreasurer: Optional[TECAsstTreasurer] = Field(default=None, description="Assistant Treasurer", sa_type=JSON)
+# chair: Optional[TECChair] = Field(default=None, description="Chair", sa_type=JSON)
# filerIdent: int = Field(..., description="Filer account #")
# filerTypeCd: str = Field(..., description="Type of filer")
# filerName: str = Field(..., description="Filer name")
@@ -381,18 +450,18 @@ class TECFiler(TECSettings, table=True):
# default=None, description="Filer effective start date")
# filerEffStopDt: Optional[date] = Field(
# default=None, description="Filer effective stop date")
- contestSeekOfficeCd: Optional[str] = Field(
- default=None, description="Filer office sought ")
- contestSeekOfficeDistrict: Optional[str] = Field(
- default=None, description="Filer office sought district")
- contestSeekOfficePlace: Optional[str] = Field(
- default=None, description="Filer office sought place")
- contestSeekOfficeDescr: Optional[str] = Field(
- default=None, description="Filer office sought description")
- contestSeekOfficeCountyCd: Optional[str] = Field(
- default=None, description="Filer office sought county code")
- contestSeekOfficeCountyDescr: Optional[str] = Field(
- default=None, description="Filer office sought county description")
+ # contestSeekOfficeCd: Optional[str] = Field(
+ # default=None, description="Filer office sought ")
+ # contestSeekOfficeDistrict: Optional[str] = Field(
+ # default=None, description="Filer office sought district")
+ # contestSeekOfficePlace: Optional[str] = Field(
+ # default=None, description="Filer office sought place")
+ # contestSeekOfficeDescr: Optional[str] = Field(
+ # default=None, description="Filer office sought description")
+ # contestSeekOfficeCountyCd: Optional[str] = Field(
+ # default=None, description="Filer office sought county code")
+ # contestSeekOfficeCountyDescr: Optional[str] = Field(
+ # default=None, description="Filer office sought county description")
# treasPersentTypeCd: Optional[str] = Field(
# default=None, description="Type of treasurer name data - INDIVIDUAL or ENTITY")
# treasNameOrganization: Optional[str] = Field(
@@ -556,16 +625,16 @@ class TECFiler(TECSettings, table=True):
# default=None, description="Chair primary phone number")
# chairPrimaryPhoneExt: Optional[str] = Field(
# default=None, description="Chair primary phone number extension")
- file_origin: str = Field(
- ..., description="Origin of the file")
- download_date: date = Field(
- ..., description="Date the file was downloaded")
-
- clear_blank_strings = model_validator(mode="before")(funcs.clear_blank_strings)
- format_dates = model_validator(mode="before")(tx_funcs.validate_dates)
- format_zipcodes = model_validator(mode="before")(tx_funcs.check_zipcodes)
- format_phone_numbers = model_validator(mode="before")(tx_funcs.phone_number_validation)
- format_address = model_validator(mode="before")(tx_funcs.address_formatting)
+ # file_origin: str = Field(
+ # ..., description="Origin of the file")
+ # download_date: date = Field(
+ # ..., description="Date the file was downloaded")
+ #
+ # clear_blank_strings = model_validator(mode="before")(funcs.clear_blank_strings)
+ # format_dates = model_validator(mode="before")(tx_funcs.validate_dates)
+ # format_zipcodes = model_validator(mode="before")(tx_funcs.check_zipcodes)
+ # format_phone_numbers = model_validator(mode="before")(tx_funcs.phone_number_validation)
+ # format_address = model_validator(mode="before")(tx_funcs.address_formatting)
# @model_validator(mode="before")
# @classmethod
@@ -634,27 +703,27 @@ class TECFiler(TECSettings, table=True):
# )
# return v
- @model_validator(mode='before')
- @classmethod
- def validate_addresses(cls, values):
- _filer_dict = {k: v for k, v in values.items() if k.startswith('filer') and v}
- _treasurer = {k: v for k, v in values.items() if k.startswith('treas') and v}
- _asst_treasurer = {k: v for k, v in values.items() if k.startswith('assttreas') and v}
- _chair = {k: v for k, v in values.items() if k.startswith('chair') and v}
-
- if _filer_dict:
- values['filerName'] = TECFilerName(**_filer_dict)
-
- if _treasurer:
- values['treasurer'] = TECTreasurer(**_treasurer)
-
- if _asst_treasurer:
- values['asstTreasurer'] = TECAsstTreasurer(**_asst_treasurer)
-
- if _chair:
- values['chair'] = TECChair(**_chair)
-
- # _filer_street = {k: v for k, v in values.items() if k.startswith('filerStreet')}
- # _filer_mailing = {k: v for k, v in values.items() if k.startswith('filerMailing')}
- # values['filerAddress'] = TECAddress(**_filer_street)
- return values
\ No newline at end of file
+ # @model_validator(mode='before')
+ # @classmethod
+ # def validate_addresses(cls, values):
+ # _filer_dict = {k: v for k, v in values.items() if k.startswith('filer') and v}
+ # _treasurer = {k: v for k, v in values.items() if k.startswith('treas') and v}
+ # _asst_treasurer = {k: v for k, v in values.items() if k.startswith('assttreas') and v}
+ # _chair = {k: v for k, v in values.items() if k.startswith('chair') and v}
+ #
+ # if _filer_dict:
+ # values['filerName'] = TECFilerName(**_filer_dict)
+ #
+ # if _treasurer:
+ # values['treasurer'] = TECTreasurer(**_treasurer)
+ #
+ # if _asst_treasurer:
+ # values['asstTreasurer'] = TECAsstTreasurer(**_asst_treasurer)
+ #
+ # if _chair:
+ # values['chair'] = TECChair(**_chair)
+ #
+ # # _filer_street = {k: v for k, v in values.items() if k.startswith('filerStreet')}
+ # # _filer_mailing = {k: v for k, v in values.items() if k.startswith('filerMailing')}
+ # # values['filerAddress'] = TECAddress(**_filer_street)
+ # return values
\ No newline at end of file
diff --git a/app/states/texas/validators/texas_flags.py b/app/states/texas/validators/texas_flags.py
new file mode 100644
index 0000000..4928af5
--- /dev/null
+++ b/app/states/texas/validators/texas_flags.py
@@ -0,0 +1,53 @@
+from typing import Optional
+from pydantic import BeforeValidator
+from sqlmodel import Field
+from .texas_settings import TECBaseModel
+import app.funcs.validator_functions as funcs
+
+
+class TECFlagsBase(TECBaseModel):
+ __tablename__ = "tx_flags"
+ __table_args__ = {"schema": "texas"}
+ id: Optional[int] = Field(default=None, primary_key=True, description="Unique record ID")
+ primaryUsaPhoneFlag: Optional[bool] = Field(
+ BeforeValidator(funcs.check_contains_factory('PrimaryUsaPhoneFlag')),
+ description="Y indicates that the phone is a USA")
+ capitalLivingexpFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was for capital living expenses")
+ contributorOosPacFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contributor is an out-of-state PAC")
+ finalOfficeholderAckFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was acknowledged by the final officeholder")
+ finalRetainedAssetsFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was retained as final assets")
+ finalUnexpendContribFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was unexpended")
+ infoOnlyFlag: Optional[bool] = Field(
+ default=None,
+ description="Superseded by other report")
+ itemizeFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution is itemized")
+ loanGuaranteedFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the loan was guaranteed")
+ modifiedElectCycleFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was modified by the election cycle")
+ reimburseIntendedFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was intended for reimbursement")
+ srcCorpContribFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was from a corporate source")
+ travelFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution has associated travel")
+ unexpendContribFilerFlag: Optional[bool] = Field(
+ default=None,
+ description="Y indicates that the contribution was unexpended by the filer")
\ No newline at end of file
diff --git a/app/states/texas/validators/texas_personname.py b/app/states/texas/validators/texas_personname.py
index cd6129f..1dded2b 100644
--- a/app/states/texas/validators/texas_personname.py
+++ b/app/states/texas/validators/texas_personname.py
@@ -1,53 +1,72 @@
from datetime import date
-from typing import Optional
+from typing import Optional, Annotated
from sqlmodel import Field, JSON, Relationship
-from pydantic import field_validator, model_validator, BeforeValidator, create_model
+from pydantic import field_validator, model_validator, BeforeValidator, create_model, AliasChoices
from pydantic_extra_types.phone_numbers import PhoneNumber
from pydantic_core import PydanticCustomError
-from .texas_settings import TECSettings
-from .texas_address import TECAddress
-import funcs.validator_functions as funcs
-import states.texas.funcs.tx_validation_funcs as tx_funcs
-from funcs.record_keygen import RecordKeyGenerator
+from .texas_settings import TECBaseModel
+from .texas_address import TECAddressBase
+import app.funcs.validator_functions as funcs
+import app.states.texas.funcs.tx_validation_funcs as tx_funcs
+from app.funcs.record_keygen import RecordKeyGenerator
+import re
-class TECPersonName(TECSettings):
- __tablename__ = "tx_person_names"
- __table_args__ = {"schema": "texas"}
- id: Optional[str] = Field(default=None, description="Unique record ID", primary_key=True)
+class TECPersonNameBase(TECBaseModel):
+ id: Optional[str] = Field(
+ default=None,
+ description="Unique record ID",
+ primary_key=True)
+ persentTypeCd: Optional[str] = Field(
+ BeforeValidator(funcs.check_contains_factory('PersentTypeCd')),
+ description="Type of filer name data - INDIVIDUAL or ENTITY")
+ nameOrganization: Optional[str] = Field(
+ BeforeValidator(funcs.check_contains_factory('NameOrganization')),
+ description="For ENTITY, the filer organization name")
prefix: Optional[str] = Field(
- ...,
+ BeforeValidator(funcs.check_contains_factory('NamePrefixCd')),
description="Prefix",
- max_length=20
+ max_length=20,
)
last: str = Field(
- ...,
+ BeforeValidator(funcs.check_contains_factory('NameLast')),
description="Last name",
max_length=50
)
first: str = Field(
- ...,
+ BeforeValidator(funcs.check_contains_factory('NameFirst')),
description="First name",
max_length=50
)
+ middle: Optional[str] = Field(
+ BeforeValidator(funcs.check_contains_factory('NameMiddle')),
+ description="Middle name",
+ max_length=50
+ )
suffix: Optional[str] = Field(
- ...,
+ BeforeValidator(funcs.check_contains_factory('NameSuffixCd')),
description="Suffix",
max_length=20
)
field_pfx: Optional[str] = Field(
- default=None,
+ BeforeValidator(funcs.check_contains_factory('NameSuffixCd')),
description="Field prefix"
)
+ nameFull: Optional[str] = Field(
+ BeforeValidator(funcs.check_contains_factory('NameFull')),
+ description="For INDIVIDUAL, Full name of the filer")
+ nameShort: Optional[str] = Field(
+ BeforeValidator(funcs.check_contains_factory('NameShort')),
+ description="For INDIVIDUAL, Short name of the filer")
+ primaryPhoneNumber: Optional[PhoneNumber] = Field(BeforeValidator(funcs.check_contains_factory('PrimaryPhoneNumber')), description="Primary phone number")
+ primaryPhoneExt: Optional[str] = Field(BeforeValidator(funcs.check_contains_factory('PrimaryPhoneExt')), description="Primary phone number extension")
+ # addresses: list["TECAddress"] = Field(default_factory=list)
- addresses: list["TECAddress"] = Field(default=None)
- raw_input: dict = Field(default=None)
-
- @model_validator(mode='before')
- @classmethod
- def store_raw(cls, values):
- values['raw_input'] = {k: v for k, v in values.items()}
- return values
+ # @model_validator(mode='before')
+ # @classmethod
+ # def store_raw(cls, values):
+ # values['raw_input'] = {k: v for k, v in values.items()}
+ # return values
@model_validator(mode='before')
@classmethod
@@ -81,9 +100,8 @@ def validate_address(cls, values):
}
mail_dict = {k: values.get(k) for k in _mail_keys}
- _address = TECAddress(**gen_address) if gen_address else None
- _mail = TECAddress(**mail_dict) if mail_dict else None
+ _address = TECAddressBase(**gen_address) if gen_address else None
+ _mail = TECAddressBase(**mail_dict) if mail_dict else None
if any([_address, _mail]):
values['addresses'] = [x for x in [_address, _mail] if x]
return values
-
diff --git a/app/states/texas/validators/texas_settings.py b/app/states/texas/validators/texas_settings.py
index 233264b..24b67c8 100644
--- a/app/states/texas/validators/texas_settings.py
+++ b/app/states/texas/validators/texas_settings.py
@@ -1,23 +1,31 @@
-from pydantic import ConfigDict, model_validator
-from sqlmodel import SQLModel
-import states.texas.funcs.tx_validation_funcs as tx_funcs
-import funcs.validator_functions as funcs
-from funcs.record_keygen import RecordKeyGenerator
+from dataclasses import Field
+from typing import Optional
+from datetime import date
+from pydantic import ConfigDict, model_validator, BaseModel, BeforeValidator
+from sqlmodel import SQLModel, Field
+import app.states.texas.funcs.tx_validation_funcs as tx_funcs
+import app.funcs.validator_functions as funcs
+from app.funcs.record_keygen import RecordKeyGenerator
"""
======================
==== TEC Settings ====
======================
"""
-
+def check_contains_factory(match_string: str):
+ def check_contains(value: str) -> str:
+ if value and match_string not in value:
+ raise ValueError(f"Value must contain '{match_string}'")
+ return value
+ return check_contains
class TECSettings(SQLModel):
model_config = ConfigDict(
str_strip_whitespace=True,
str_to_upper=True,
from_attributes=True,
+ arbitrary_types_allowed=True,
)
-
def __repr__(self):
return self.__class__.__name__
@@ -31,3 +39,19 @@ def __repr__(self):
def generate_key(*args):
_values = "".join([x for x in args if x])
return RecordKeyGenerator.generate_static_key(_values)
+
+
+class TECBaseModel(TECSettings):
+ recordType: Optional[str] = Field(BeforeValidator(check_contains_factory('recordType')), description="Record type code")
+ formTypeCd: Optional[str] = Field(BeforeValidator(check_contains_factory('formType')), description="TEC form used")
+ schedFormTypeCd: Optional[str] = Field(BeforeValidator(check_contains_factory('schedFormType')), description="TEC Schedule Used")
+ receivedDt: Optional[date] = Field(BeforeValidator(check_contains_factory('receivedDt')), description="Date report received by TEC")
+ filerIdent: Optional[str] = Field(default=None, description="Filer account #", max_length=100)
+ filerTypeCd: Optional[str] = Field(default=None, description="Type of filer", max_length=30)
+ # flags: Optional[TECFlags] = Field(default=None, description="Flags")
+ #
+ # def __init__(self, **data):
+ # _flags = TECFlags(**data)
+ # if len(_flags.model_dump(exclude_none=True).values()) > 0:
+ # self.flags = _flags
+ # super().__init__(**data)
\ No newline at end of file
diff --git a/app/states/unified_database.py b/app/states/unified_database.py
new file mode 100644
index 0000000..7edec84
--- /dev/null
+++ b/app/states/unified_database.py
@@ -0,0 +1,1208 @@
+"""
+Database manager for unified SQLModels backed by PostgreSQL.
+"""
+
+from typing import List, Dict, Any, Optional, Union
+from pathlib import Path
+from sqlmodel import SQLModel, Session, create_engine, select
+from sqlalchemy import text, func, or_
+from sqlalchemy.orm import selectinload
+from icecream import ic
+import json
+from datetime import datetime, date
+from decimal import Decimal
+
+from .postgres_config import PostgresConfig
+from .unified_sqlmodels import (
+ UnifiedTransaction, UnifiedPerson, UnifiedAddress, UnifiedCommittee,
+ UnifiedTransactionPerson, PersonRole, TransactionType, PersonType,
+ unified_sql_processor, UnifiedTransactionVersion,
+ UnifiedPersonVersion, UnifiedCommitteeVersion, UnifiedAddressVersion,
+ UnifiedCommitteePerson, UnifiedCommitteePersonVersion, CommitteeRole, State
+)
+
+
+class UnifiedDatabaseManager:
+ """
+ Database manager for unified campaign finance data.
+ Uses PostgreSQL configuration by default.
+ """
+
+ def __init__(self, database_url: Optional[str] = None, *, echo: bool = False):
+ """
+ Initialize the database manager.
+
+ Args:
+ database_url: SQLAlchemy database URL. If None, use PostgresConfig.
+ echo: Enable SQL echo for debugging.
+ """
+ self._config: Optional[PostgresConfig] = None
+
+ if database_url is None:
+ config = PostgresConfig()
+ if not config.validate_connection():
+ raise RuntimeError("Failed to validate PostgreSQL connection.")
+ database_url = config.database_url
+ self._config = config
+
+ self.database_url = database_url
+ engine_kwargs = {"echo": echo}
+
+ if self._config:
+ engine_kwargs.update(
+ {
+ "pool_size": self._config.pool_size,
+ "max_overflow": self._config.max_overflow,
+ "pool_timeout": self._config.pool_timeout,
+ "pool_recycle": self._config.pool_recycle,
+ }
+ )
+
+ self.engine = create_engine(self.database_url, **engine_kwargs)
+
+ # Create all tables
+ SQLModel.metadata.create_all(self.engine)
+
+ def _resolve_state_record(self, session: Session, state_identifier: str) -> Optional[State]:
+ if not state_identifier:
+ return None
+ code = state_identifier.strip().upper()
+ name = state_identifier.strip().lower()
+ return session.exec(
+ select(State).where(
+ or_(State.code == code, func.lower(State.name) == name)
+ )
+ ).first()
+
+ def get_session(self) -> Session:
+ """Get a database session"""
+ return Session(self.engine)
+
+ def load_data_from_file(self, file_path: Path, state: str) -> List[UnifiedTransaction]:
+ """
+ Load data from a file and convert to SQLModel instances.
+
+ Args:
+ file_path: Path to the data file
+ state: State identifier
+
+ Returns:
+ List of UnifiedTransaction objects
+ """
+ from ..funcs.csv_reader import FileReader
+
+ reader = FileReader()
+ records = []
+
+ if file_path.suffix.lower() == '.parquet':
+ records = list(reader.read_parquet(file_path))
+ elif file_path.suffix.lower() == '.csv':
+ records = list(reader.read_csv(file_path))
+
+ with self.get_session() as session:
+ state_record = self._resolve_state_record(session, state)
+ if not state_record:
+ raise ValueError(f"State '{state}' is not present in the states table.")
+ transactions = unified_sql_processor.process_records(
+ records,
+ state,
+ state_id=state_record.id,
+ state_code=state_record.code
+ )
+
+ ic(f"Loaded {len(transactions)} transactions from {file_path}")
+ return transactions
+
+ def save_transactions(self, transactions: List[UnifiedTransaction]) -> int:
+ """
+ Save transactions to the database.
+
+ Args:
+ transactions: List of UnifiedTransaction objects
+
+ Returns:
+ Number of transactions saved
+ """
+ with self.get_session() as session:
+ for transaction in transactions:
+ session.add(transaction)
+ session.commit()
+
+ ic(f"Saved {len(transactions)} transactions to database")
+ return len(transactions)
+
+ def load_and_save_file(self, file_path: Path, state: str) -> int:
+ """
+ Load data from file and save to database in one operation.
+
+ Args:
+ file_path: Path to the data file
+ state: State identifier
+
+ Returns:
+ Number of transactions saved
+ """
+ transactions = self.load_data_from_file(file_path, state)
+ return self.save_transactions(transactions)
+
+ def get_transactions(self,
+ state: Optional[str] = None,
+ transaction_type: Optional[TransactionType] = None,
+ limit: Optional[int] = None,
+ load_relationships: bool = True) -> List[UnifiedTransaction]:
+ """
+ Get transactions from the database with optional filters.
+
+ Args:
+ state: Filter by state
+ transaction_type: Filter by transaction type
+ limit: Limit number of results
+
+ Returns:
+ List of UnifiedTransaction objects
+ """
+ with self.get_session() as session:
+ query = select(UnifiedTransaction)
+
+ if state:
+ state_record = self._resolve_state_record(session, state)
+ if not state_record:
+ return []
+ query = query.where(UnifiedTransaction.state_id == state_record.id)
+
+ if transaction_type:
+ query = query.where(UnifiedTransaction.transaction_type == transaction_type)
+
+ if limit:
+ query = query.limit(limit)
+
+ if load_relationships:
+ # Load relationships to avoid lazy loading issues
+ query = query.options(
+ selectinload(UnifiedTransaction.persons),
+ selectinload(UnifiedTransaction.committee),
+ selectinload(UnifiedTransaction.state),
+ selectinload(UnifiedTransaction.file_origin)
+ )
+
+ results = session.exec(query).all()
+ return results
+
+ def get_transaction_by_id(self, transaction_id: str) -> Optional[UnifiedTransaction]:
+ """
+ Get a specific transaction by its transaction ID.
+
+ Args:
+ transaction_id: Transaction ID to search for
+
+ Returns:
+ UnifiedTransaction object or None
+ """
+ with self.get_session() as session:
+ query = select(UnifiedTransaction).where(UnifiedTransaction.transaction_id == transaction_id)
+ return session.exec(query).first()
+
+ def get_person_by_name(self, first_name: str, last_name: str) -> List[UnifiedPerson]:
+ """
+ Get persons by name.
+
+ Args:
+ first_name: First name to search for
+ last_name: Last name to search for
+
+ Returns:
+ List of UnifiedPerson objects
+ """
+ with self.get_session() as session:
+ query = select(UnifiedPerson).where(
+ UnifiedPerson.first_name == first_name,
+ UnifiedPerson.last_name == last_name
+ )
+ return session.exec(query).all()
+
+ def get_committee_by_name(self, name: str) -> List[UnifiedCommittee]:
+ """
+ Get committees by name.
+
+ Args:
+ name: Committee name to search for
+
+ Returns:
+ List of UnifiedCommittee objects
+ """
+ with self.get_session() as session:
+ query = select(UnifiedCommittee).where(UnifiedCommittee.name == name)
+ return session.exec(query).all()
+
+ def get_transactions_by_amount_range(self,
+ min_amount: float,
+ max_amount: float,
+ state: Optional[str] = None) -> List[UnifiedTransaction]:
+ """
+ Get transactions within an amount range.
+
+ Args:
+ min_amount: Minimum amount
+ max_amount: Maximum amount
+ state: Optional state filter
+
+ Returns:
+ List of UnifiedTransaction objects
+ """
+ with self.get_session() as session:
+ query = select(UnifiedTransaction).where(
+ UnifiedTransaction.amount >= min_amount,
+ UnifiedTransaction.amount <= max_amount
+ )
+
+ if state:
+ state_record = self._resolve_state_record(session, state)
+ if not state_record:
+ return []
+ query = query.where(UnifiedTransaction.state_id == state_record.id)
+
+ return session.exec(query).all()
+
+ def get_transactions_by_date_range(self,
+ start_date: str,
+ end_date: str,
+ state: Optional[str] = None) -> List[UnifiedTransaction]:
+ """
+ Get transactions within a date range.
+
+ Args:
+ start_date: Start date (YYYY-MM-DD)
+ end_date: End date (YYYY-MM-DD)
+ state: Optional state filter
+
+ Returns:
+ List of UnifiedTransaction objects
+ """
+ from datetime import datetime
+
+ start = datetime.strptime(start_date, "%Y-%m-%d").date()
+ end = datetime.strptime(end_date, "%Y-%m-%d").date()
+
+ with self.get_session() as session:
+ query = select(UnifiedTransaction).where(
+ UnifiedTransaction.transaction_date >= start,
+ UnifiedTransaction.transaction_date <= end
+ )
+
+ if state:
+ state_record = self._resolve_state_record(session, state)
+ if not state_record:
+ return []
+ query = query.where(UnifiedTransaction.state_id == state_record.id)
+
+ return session.exec(query).all()
+
+ def get_summary_statistics(self) -> Dict[str, Any]:
+ """
+ Get summary statistics for all data in the database.
+
+ Returns:
+ Dictionary with summary statistics
+ """
+ with self.get_session() as session:
+ # Total transactions
+ total_transactions = session.exec(
+ select(UnifiedTransaction).options(selectinload(UnifiedTransaction.state))
+ ).all()
+
+ # Total amount
+ total_amount = sum(tx.amount for tx in total_transactions if tx.amount)
+
+ # By state
+ states = {}
+ for tx in total_transactions:
+ state_code = tx.state.code if tx.state else "UNKNOWN"
+ if state_code not in states:
+ states[state_code] = {"count": 0, "total_amount": 0}
+ states[state_code]["count"] += 1
+ if tx.amount:
+ states[state_code]["total_amount"] += tx.amount
+
+ # By transaction type
+ types = {}
+ for tx in total_transactions:
+ tx_type = tx.transaction_type.value
+ if tx_type not in types:
+ types[tx_type] = {"count": 0, "total_amount": 0}
+ types[tx_type]["count"] += 1
+ if tx.amount:
+ types[tx_type]["total_amount"] += tx.amount
+
+ # Top contributors
+ contributor_totals = {}
+ for tx in total_transactions:
+ if tx.contributor and tx.contributor.person and tx.amount:
+ contributor_name = tx.contributor.person.full_name
+ if contributor_name not in contributor_totals:
+ contributor_totals[contributor_name] = 0
+ contributor_totals[contributor_name] += tx.amount
+
+ top_contributors = dict(
+ sorted(contributor_totals.items(), key=lambda x: x[1], reverse=True)[:10]
+ )
+
+ return {
+ "total_transactions": len(total_transactions),
+ "total_amount": float(total_amount),
+ "by_state": states,
+ "by_type": types,
+ "top_contributors": top_contributors
+ }
+
+ def get_cross_state_analysis(self) -> Dict[str, Any]:
+ """
+ Get cross-state analysis of the data.
+
+ Returns:
+ Dictionary with cross-state analysis
+ """
+ with self.get_session() as session:
+ # Get all transactions with their relationships
+ query = select(UnifiedTransaction).options(
+ selectinload(UnifiedTransaction.persons),
+ selectinload(UnifiedTransaction.committee),
+ selectinload(UnifiedTransaction.state)
+ )
+ transactions = session.exec(query).all()
+
+ analysis = {
+ "total_transactions": len(transactions),
+ "states": {},
+ "transaction_types": {},
+ "top_contributors": {},
+ "top_committees": {},
+ "amount_ranges": {
+ "0-100": 0,
+ "100-1000": 0,
+ "1000-10000": 0,
+ "10000+": 0
+ }
+ }
+
+ # Analyze each transaction
+ for tx in transactions:
+ # State analysis
+ state_code = tx.state.code if tx.state else "UNKNOWN"
+ if state_code not in analysis["states"]:
+ analysis["states"][state_code] = {"count": 0, "total_amount": 0}
+ analysis["states"][state_code]["count"] += 1
+ if tx.amount:
+ analysis["states"][state_code]["total_amount"] += tx.amount
+
+ # Transaction type analysis
+ tx_type = tx.transaction_type.value
+ if tx_type not in analysis["transaction_types"]:
+ analysis["transaction_types"][tx_type] = {"count": 0, "total_amount": 0}
+ analysis["transaction_types"][tx_type]["count"] += 1
+ if tx.amount:
+ analysis["transaction_types"][tx_type]["total_amount"] += tx.amount
+
+ # Amount range analysis
+ if tx.amount:
+ amount = float(tx.amount)
+ if amount <= 100:
+ analysis["amount_ranges"]["0-100"] += 1
+ elif amount <= 1000:
+ analysis["amount_ranges"]["100-1000"] += 1
+ elif amount <= 10000:
+ analysis["amount_ranges"]["1000-10000"] += 1
+ else:
+ analysis["amount_ranges"]["10000+"] += 1
+
+ # Contributor analysis
+ if tx.contributor and tx.contributor.person and tx.amount:
+ contributor_name = tx.contributor.person.full_name
+ if contributor_name not in analysis["top_contributors"]:
+ analysis["top_contributors"][contributor_name] = 0
+ analysis["top_contributors"][contributor_name] += tx.amount
+
+ # Committee analysis
+ if tx.committee and tx.amount:
+ committee_name = tx.committee.name
+ if committee_name not in analysis["top_committees"]:
+ analysis["top_committees"][committee_name] = 0
+ analysis["top_committees"][committee_name] += tx.amount
+
+ # Sort top contributors and committees
+ analysis["top_contributors"] = dict(
+ sorted(analysis["top_contributors"].items(), key=lambda x: x[1], reverse=True)[:10]
+ )
+ analysis["top_committees"] = dict(
+ sorted(analysis["top_committees"].items(), key=lambda x: x[1], reverse=True)[:10]
+ )
+
+ return analysis
+
+ def export_to_json(self, output_path: Path,
+ state: Optional[str] = None,
+ transaction_type: Optional[TransactionType] = None,
+ limit: Optional[int] = None):
+ """
+ Export transactions to JSON format.
+
+ Args:
+ output_path: Path to save the JSON file
+ state: Optional state filter
+ transaction_type: Optional transaction type filter
+ limit: Optional limit on number of records
+ """
+ transactions = self.get_transactions(state, transaction_type, limit)
+
+ export_data = []
+ for tx in transactions:
+ tx_dict = {
+ "id": tx.id,
+ "uuid": tx.uuid,
+ "transaction_id": tx.transaction_id,
+ "amount": float(tx.amount) if tx.amount else None,
+ "transaction_date": tx.transaction_date.isoformat() if tx.transaction_date else None,
+ "description": tx.description,
+ "transaction_type": tx.transaction_type.value,
+ "state": tx.state.code if tx.state else None,
+ "file_origin": tx.file_origin.filename if tx.file_origin else None,
+ "download_date": tx.download_date,
+ "filed_date": tx.filed_date.isoformat() if tx.filed_date else None,
+ "amended": tx.amended,
+ "created_at": tx.created_at.isoformat(),
+ "updated_at": tx.updated_at.isoformat(),
+ "persons": [],
+ "committee": None
+ }
+
+ # Add person relationships
+ for tx_person in tx.persons:
+ person_dict = {
+ "role": tx_person.role.value,
+ "person": {
+ "id": tx_person.person.id,
+ "uuid": tx_person.person.uuid,
+ "full_name": tx_person.person.full_name,
+ "first_name": tx_person.person.first_name,
+ "last_name": tx_person.person.last_name,
+ "organization": tx_person.person.organization,
+ "employer": tx_person.person.employer,
+ "occupation": tx_person.person.occupation,
+ "person_type": tx_person.person.person_type.value,
+ "address": None
+ }
+ }
+
+ if tx_person.person.address:
+ person_dict["person"]["address"] = {
+ "street_1": tx_person.person.address.street_1,
+ "street_2": tx_person.person.address.street_2,
+ "city": tx_person.person.address.city,
+ "state": tx_person.person.address.state,
+ "zip_code": tx_person.person.address.zip_code,
+ "full_address": tx_person.person.address.full_address
+ }
+
+ tx_dict["persons"].append(person_dict)
+
+ # Add committee relationship
+ if tx.committee:
+ tx_dict["committee"] = {
+ "id": tx.committee.id,
+ "uuid": tx.committee.uuid,
+ "name": tx.committee.name,
+ "committee_type": tx.committee.committee_type,
+ "filer_id": tx.committee.filer_id
+ }
+
+ export_data.append(tx_dict)
+
+ with open(output_path, 'w') as f:
+ json.dump(export_data, f, indent=2)
+
+ ic(f"Exported {len(export_data)} transactions to {output_path}")
+
+ def run_custom_query(self, sql_query: str) -> List[Dict[str, Any]]:
+ """
+ Run a custom SQL query.
+
+ Args:
+ sql_query: SQL query to execute
+
+ Returns:
+ List of dictionaries with query results
+ """
+ with self.get_session() as session:
+ result = session.exec(text(sql_query))
+ return [dict(row) for row in result]
+
+ def update_transaction(self, transaction_id: int, updates: dict, user: Optional[str] = None, reason: Optional[str] = None, amendment_details: Optional[str] = None) -> Optional[UnifiedTransaction]:
+ """
+ Update a transaction, saving a version snapshot before updating.
+ Args:
+ transaction_id: The id of the transaction to update
+ updates: Dict of fields to update
+ user: Who made the change
+ reason: Reason for change
+ amendment_details: Details about the amendment
+ Returns:
+ The updated UnifiedTransaction or None if not found
+ """
+ with self.get_session() as session:
+ tx = session.get(UnifiedTransaction, transaction_id)
+ if not tx:
+ return None
+ # Get current version number
+ version_count = session.exec(select(UnifiedTransactionVersion).where(UnifiedTransactionVersion.transaction_id == tx.id)).count()
+ # Save current state as version
+ # Convert data to JSON-serializable format
+ data_dict = {}
+ for k in tx.__fields__.keys():
+ value = getattr(tx, k)
+ if isinstance(value, date):
+ data_dict[k] = value.isoformat()
+ elif isinstance(value, datetime):
+ data_dict[k] = value.isoformat()
+ elif isinstance(value, Decimal):
+ data_dict[k] = float(value)
+ else:
+ data_dict[k] = value
+
+ version = UnifiedTransactionVersion(
+ transaction_id=tx.id,
+ version_number=version_count + 1,
+ data=json.dumps(data_dict),
+ changed_at=datetime.utcnow(),
+ changed_by=user,
+ change_reason=reason,
+ amendment_details=amendment_details
+ )
+ session.add(version)
+ # Update fields
+ for k, v in updates.items():
+ setattr(tx, k, v)
+ tx.last_modified_at = datetime.utcnow()
+ tx.last_modified_by = user
+ tx.change_reason = reason
+ tx.amendment_details = amendment_details
+ session.add(tx)
+ session.commit()
+ session.refresh(tx)
+ return tx
+
+ def get_transaction_versions(self, transaction_id: int) -> list:
+ """
+ Get all versions for a transaction.
+ Args:
+ transaction_id: The id of the transaction
+ Returns:
+ List of UnifiedTransactionVersion objects
+ """
+ with self.get_session() as session:
+ versions = session.exec(select(UnifiedTransactionVersion).where(UnifiedTransactionVersion.transaction_id == transaction_id).order_by(UnifiedTransactionVersion.version_number)).all()
+ return versions
+
+ def update_person(self, person_id: int, updates: dict, user: Optional[str] = None, reason: Optional[str] = None, amendment_details: Optional[str] = None) -> Optional[UnifiedPerson]:
+ """
+ Update a person, saving a version snapshot before updating.
+ """
+ with self.get_session() as session:
+ person = session.get(UnifiedPerson, person_id)
+ if not person:
+ return None
+ version_count = session.exec(select(UnifiedPersonVersion).where(UnifiedPersonVersion.person_id == person.id)).count()
+ version = UnifiedPersonVersion(
+ person_id=person.id,
+ version_number=version_count + 1,
+ data=json.dumps({k: getattr(person, k) for k in person.__fields__.keys()}),
+ changed_at=datetime.utcnow(),
+ changed_by=user,
+ change_reason=reason,
+ amendment_details=amendment_details
+ )
+ session.add(version)
+ for k, v in updates.items():
+ setattr(person, k, v)
+ session.add(person)
+ session.commit()
+ session.refresh(person)
+ return person
+
+ def get_person_versions(self, person_id: int) -> list:
+ """
+ Get all versions for a person.
+ """
+ with self.get_session() as session:
+ versions = session.exec(select(UnifiedPersonVersion).where(UnifiedPersonVersion.person_id == person_id).order_by(UnifiedPersonVersion.version_number)).all()
+ return versions
+
+ def update_committee(self, committee_id: int, updates: dict, user: Optional[str] = None, reason: Optional[str] = None, amendment_details: Optional[str] = None) -> Optional[UnifiedCommittee]:
+ """
+ Update a committee, saving a version snapshot before updating.
+ """
+ with self.get_session() as session:
+ committee = session.get(UnifiedCommittee, committee_id)
+ if not committee:
+ return None
+ version_count = session.exec(select(UnifiedCommitteeVersion).where(UnifiedCommitteeVersion.committee_id == committee.id)).count()
+ version = UnifiedCommitteeVersion(
+ committee_id=committee.id,
+ version_number=version_count + 1,
+ data=json.dumps({k: getattr(committee, k) for k in committee.__fields__.keys()}),
+ changed_at=datetime.utcnow(),
+ changed_by=user,
+ change_reason=reason,
+ amendment_details=amendment_details
+ )
+ session.add(version)
+ for k, v in updates.items():
+ setattr(committee, k, v)
+ session.add(committee)
+ session.commit()
+ session.refresh(committee)
+ return committee
+
+ def get_committee_versions(self, committee_id: int) -> list:
+ """
+ Get all versions for a committee.
+ """
+ with self.get_session() as session:
+ versions = session.exec(select(UnifiedCommitteeVersion).where(UnifiedCommitteeVersion.committee_id == committee_id).order_by(UnifiedCommitteeVersion.version_number)).all()
+ return versions
+
+ def update_address(self, address_id: int, updates: dict, user: Optional[str] = None, reason: Optional[str] = None, amendment_details: Optional[str] = None) -> Optional[UnifiedAddress]:
+ """
+ Update an address, saving a version snapshot before updating.
+ """
+ with self.get_session() as session:
+ address = session.get(UnifiedAddress, address_id)
+ if not address:
+ return None
+ version_count = session.exec(select(UnifiedAddressVersion).where(UnifiedAddressVersion.address_id == address.id)).count()
+ version = UnifiedAddressVersion(
+ address_id=address.id,
+ version_number=version_count + 1,
+ data=json.dumps({k: getattr(address, k) for k in address.__fields__.keys()}),
+ changed_at=datetime.utcnow(),
+ changed_by=user,
+ change_reason=reason,
+ amendment_details=amendment_details
+ )
+ session.add(version)
+ for k, v in updates.items():
+ setattr(address, k, v)
+ session.add(address)
+ session.commit()
+ session.refresh(address)
+ return address
+
+ def get_address_versions(self, address_id: int) -> list:
+ """
+ Get all versions for an address.
+ """
+ with self.get_session() as session:
+ versions = session.exec(select(UnifiedAddressVersion).where(UnifiedAddressVersion.address_id == address_id).order_by(UnifiedAddressVersion.version_number)).all()
+ return versions
+
+ def add_person_to_committee(self, person_id: int, committee_id: int, role: CommitteeRole,
+ start_date: Optional[date] = None, notes: Optional[str] = None,
+ user: Optional[str] = None) -> UnifiedCommitteePerson:
+ """
+ Add a person to a committee with a specific role.
+ """
+ with self.get_session() as session:
+ committee_person = UnifiedCommitteePerson(
+ person_id=person_id,
+ committee_id=committee_id,
+ role=role,
+ start_date=start_date,
+ notes=notes,
+ last_modified_by=user
+ )
+ session.add(committee_person)
+ session.commit()
+ session.refresh(committee_person)
+ return committee_person
+
+ def remove_person_from_committee(self, person_id: int, committee_id: int, role: CommitteeRole,
+ end_date: Optional[date] = None, user: Optional[str] = None,
+ reason: Optional[str] = None) -> bool:
+ """
+ Remove a person from a committee role (set as inactive).
+ """
+ with self.get_session() as session:
+ committee_person = session.exec(
+ select(UnifiedCommitteePerson).where(
+ UnifiedCommitteePerson.person_id == person_id,
+ UnifiedCommitteePerson.committee_id == committee_id,
+ UnifiedCommitteePerson.role == role,
+ UnifiedCommitteePerson.is_active == True
+ )
+ ).first()
+
+ if committee_person:
+ committee_person.is_active = False
+ committee_person.end_date = end_date or datetime.utcnow().date()
+ committee_person.last_modified_at = datetime.utcnow()
+ committee_person.last_modified_by = user
+ committee_person.change_reason = reason
+ session.add(committee_person)
+ session.commit()
+ return True
+ return False
+
+ def get_person_committee_roles(self, person_id: int, active_only: bool = True) -> List[UnifiedCommitteePerson]:
+ """
+ Get all committee roles for a specific person.
+ """
+ with self.get_session() as session:
+ query = select(UnifiedCommitteePerson).where(UnifiedCommitteePerson.person_id == person_id)
+ if active_only:
+ query = query.where(UnifiedCommitteePerson.is_active == True)
+ query = query.options(
+ selectinload(UnifiedCommitteePerson.person),
+ selectinload(UnifiedCommitteePerson.committee)
+ )
+ return session.exec(query.order_by(UnifiedCommitteePerson.start_date)).all()
+
+ def get_committee_persons(self, committee_id: int, role: Optional[CommitteeRole] = None,
+ active_only: bool = True) -> List[UnifiedCommitteePerson]:
+ """
+ Get all people for a specific committee, optionally filtered by role.
+ """
+ with self.get_session() as session:
+ query = select(UnifiedCommitteePerson).where(UnifiedCommitteePerson.committee_id == committee_id)
+ if role:
+ query = query.where(UnifiedCommitteePerson.role == role)
+ if active_only:
+ query = query.where(UnifiedCommitteePerson.is_active == True)
+ query = query.options(
+ selectinload(UnifiedCommitteePerson.person),
+ selectinload(UnifiedCommitteePerson.committee)
+ )
+ return session.exec(query.order_by(UnifiedCommitteePerson.role, UnifiedCommitteePerson.start_date)).all()
+
+ def update_committee_person(self, committee_person_id: int, updates: dict,
+ user: Optional[str] = None, reason: Optional[str] = None,
+ amendment_details: Optional[str] = None) -> Optional[UnifiedCommitteePerson]:
+ """
+ Update a committee-person relationship, saving a version snapshot before updating.
+ """
+ with self.get_session() as session:
+ cp = session.get(UnifiedCommitteePerson, committee_person_id)
+ if not cp:
+ return None
+
+ # Save version snapshot
+ version_count = len(session.exec(
+ select(UnifiedCommitteePersonVersion).where(
+ UnifiedCommitteePersonVersion.committee_person_id == cp.id
+ )
+ ).all())
+
+ # Convert data to JSON-serializable format
+ data_dict = {}
+ for k in cp.__fields__.keys():
+ value = getattr(cp, k)
+ if isinstance(value, date):
+ data_dict[k] = value.isoformat()
+ elif isinstance(value, datetime):
+ data_dict[k] = value.isoformat()
+ else:
+ data_dict[k] = value
+
+ version = UnifiedCommitteePersonVersion(
+ committee_person_id=cp.id,
+ version_number=version_count + 1,
+ data=json.dumps(data_dict),
+ changed_at=datetime.utcnow(),
+ changed_by=user,
+ change_reason=reason,
+ amendment_details=amendment_details
+ )
+ session.add(version)
+
+ # Apply updates
+ for k, v in updates.items():
+ setattr(cp, k, v)
+ cp.last_modified_at = datetime.utcnow()
+ cp.last_modified_by = user
+ cp.change_reason = reason
+
+ session.add(cp)
+ session.commit()
+ session.refresh(cp)
+ return cp
+
+ def get_committee_person_versions(self, committee_person_id: int) -> List[UnifiedCommitteePersonVersion]:
+ """
+ Get all versions for a committee-person relationship.
+ """
+ with self.get_session() as session:
+ versions = session.exec(
+ select(UnifiedCommitteePersonVersion)
+ .where(UnifiedCommitteePersonVersion.committee_person_id == committee_person_id)
+ .order_by(UnifiedCommitteePersonVersion.version_number)
+ ).all()
+ return versions
+
+ def get_active_treasurers(self, committee_id: Optional[int] = None) -> List[UnifiedCommitteePerson]:
+ """
+ Get all active treasurers, optionally filtered by committee.
+ """
+ with self.get_session() as session:
+ query = select(UnifiedCommitteePerson).where(
+ UnifiedCommitteePerson.role == CommitteeRole.TREASURER,
+ UnifiedCommitteePerson.is_active == True
+ )
+ if committee_id:
+ query = query.where(UnifiedCommitteePerson.committee_id == committee_id)
+ query = query.options(
+ selectinload(UnifiedCommitteePerson.person),
+ selectinload(UnifiedCommitteePerson.committee)
+ )
+ return session.exec(query).all()
+
+ def get_committee_officers(self, committee_id: int, active_only: bool = True) -> Dict[CommitteeRole, List[UnifiedCommitteePerson]]:
+ """
+ Get all officers for a committee, grouped by role.
+ """
+ committee_persons = self.get_committee_persons(committee_id, active_only=active_only)
+ officers = {}
+ for cp in committee_persons:
+ if cp.role not in officers:
+ officers[cp.role] = []
+ officers[cp.role].append(cp)
+ return officers
+
+ def link_transaction_to_committee_role(self, transaction_person_id: int, committee_person_id: int,
+ user: Optional[str] = None, notes: Optional[str] = None) -> bool:
+ """
+ Link a transaction-person relationship to a committee role.
+ This allows tracking when committee officers make contributions or receive expenditures.
+ """
+ with self.get_session() as session:
+ tx_person = session.get(UnifiedTransactionPerson, transaction_person_id)
+ if not tx_person:
+ return False
+
+ tx_person.committee_person_id = committee_person_id
+ if notes:
+ tx_person.notes = notes
+ tx_person.updated_at = datetime.utcnow()
+
+ session.add(tx_person)
+ session.commit()
+ return True
+
+ def get_officer_contributions(self, committee_person_id: int) -> List[UnifiedTransactionPerson]:
+ """
+ Get all contributions made by a committee officer.
+ """
+ with self.get_session() as session:
+ query = select(UnifiedTransactionPerson).where(
+ UnifiedTransactionPerson.committee_person_id == committee_person_id,
+ UnifiedTransactionPerson.role == PersonRole.CONTRIBUTOR
+ ).options(
+ selectinload(UnifiedTransactionPerson.transaction),
+ selectinload(UnifiedTransactionPerson.person),
+ selectinload(UnifiedTransactionPerson.committee_person)
+ )
+ return session.exec(query).all()
+
+ def get_officer_expenditures(self, committee_person_id: int) -> List[UnifiedTransactionPerson]:
+ """
+ Get all expenditures received by a committee officer.
+ """
+ with self.get_session() as session:
+ query = select(UnifiedTransactionPerson).where(
+ UnifiedTransactionPerson.committee_person_id == committee_person_id,
+ UnifiedTransactionPerson.role == PersonRole.PAYEE
+ ).options(
+ selectinload(UnifiedTransactionPerson.transaction),
+ selectinload(UnifiedTransactionPerson.person),
+ selectinload(UnifiedTransactionPerson.committee_person)
+ )
+ return session.exec(query).all()
+
+ def get_committee_officer_activities(self, committee_id: int, role: Optional[CommitteeRole] = None) -> Dict[str, List[UnifiedTransactionPerson]]:
+ """
+ Get all financial activities (contributions and expenditures) for committee officers.
+ """
+ with self.get_session() as session:
+ # Get committee officers
+ committee_persons_query = select(UnifiedCommitteePerson).where(
+ UnifiedCommitteePerson.committee_id == committee_id,
+ UnifiedCommitteePerson.is_active == True
+ )
+ if role:
+ committee_persons_query = committee_persons_query.where(UnifiedCommitteePerson.role == role)
+
+ committee_persons = session.exec(committee_persons_query).all()
+
+ activities = {
+ "contributions": [],
+ "expenditures": []
+ }
+
+ for cp in committee_persons:
+ # Get contributions by this officer
+ contributions = session.exec(
+ select(UnifiedTransactionPerson).where(
+ UnifiedTransactionPerson.committee_person_id == cp.id,
+ UnifiedTransactionPerson.role == PersonRole.CONTRIBUTOR
+ ).options(
+ selectinload(UnifiedTransactionPerson.transaction),
+ selectinload(UnifiedTransactionPerson.person),
+ selectinload(UnifiedTransactionPerson.committee_person)
+ )
+ ).all()
+ activities["contributions"].extend(contributions)
+
+ # Get expenditures to this officer
+ expenditures = session.exec(
+ select(UnifiedTransactionPerson).where(
+ UnifiedTransactionPerson.committee_person_id == cp.id,
+ UnifiedTransactionPerson.role == PersonRole.PAYEE
+ ).options(
+ selectinload(UnifiedTransactionPerson.transaction),
+ selectinload(UnifiedTransactionPerson.person),
+ selectinload(UnifiedTransactionPerson.committee_person)
+ )
+ ).all()
+ activities["expenditures"].extend(expenditures)
+
+ return activities
+
+ def get_person_committee_financial_summary(self, person_id: int) -> Dict[str, Any]:
+ """
+ Get a financial summary for a person across all their committee roles.
+ """
+ with self.get_session() as session:
+ # Get all committee roles for the person
+ committee_roles = session.exec(
+ select(UnifiedCommitteePerson).where(
+ UnifiedCommitteePerson.person_id == person_id,
+ UnifiedCommitteePerson.is_active == True
+ )
+ ).all()
+
+ summary = {
+ "person_id": person_id,
+ "committee_roles": [],
+ "total_contributions": 0,
+ "total_expenditures": 0,
+ "role_breakdown": {}
+ }
+
+ for role in committee_roles:
+ role_summary = {
+ "committee": role.committee.name,
+ "role": role.role.value,
+ "start_date": role.start_date,
+ "contributions": [],
+ "expenditures": [],
+ "total_contributions": 0,
+ "total_expenditures": 0
+ }
+
+ # Get contributions made while in this role
+ contributions = session.exec(
+ select(UnifiedTransactionPerson).where(
+ UnifiedTransactionPerson.committee_person_id == role.id,
+ UnifiedTransactionPerson.role == PersonRole.CONTRIBUTOR
+ ).options(
+ selectinload(UnifiedTransactionPerson.transaction)
+ )
+ ).all()
+
+ for contrib in contributions:
+ amount = contrib.transaction.amount or 0
+ role_summary["contributions"].append({
+ "transaction_id": contrib.transaction.transaction_id,
+ "amount": float(amount),
+ "date": contrib.transaction.transaction_date,
+ "description": contrib.transaction.description
+ })
+ role_summary["total_contributions"] += float(amount)
+ summary["total_contributions"] += float(amount)
+
+ # Get expenditures received while in this role
+ expenditures = session.exec(
+ select(UnifiedTransactionPerson).where(
+ UnifiedTransactionPerson.committee_person_id == role.id,
+ UnifiedTransactionPerson.role == PersonRole.PAYEE
+ ).options(
+ selectinload(UnifiedTransactionPerson.transaction)
+ )
+ ).all()
+
+ for exp in expenditures:
+ amount = exp.transaction.amount or 0
+ role_summary["expenditures"].append({
+ "transaction_id": exp.transaction.transaction_id,
+ "amount": float(amount),
+ "date": exp.transaction.transaction_date,
+ "description": exp.transaction.description
+ })
+ role_summary["total_expenditures"] += float(amount)
+ summary["total_expenditures"] += float(amount)
+
+ summary["committee_roles"].append(role_summary)
+ summary["role_breakdown"][f"{role.committee.name} - {role.role.value}"] = {
+ "contributions": role_summary["total_contributions"],
+ "expenditures": role_summary["total_expenditures"]
+ }
+
+ return summary
+
+ def auto_link_transactions_to_committee_roles(self, committee_id: int,
+ user: Optional[str] = None) -> Dict[str, int]:
+ """
+ Automatically link existing transactions to committee roles based on person and committee matching.
+ This is useful when you have existing data and want to retroactively link officer activities.
+ """
+ with self.get_session() as session:
+ # Get all committee-person relationships for this committee
+ committee_persons = session.exec(
+ select(UnifiedCommitteePerson).where(
+ UnifiedCommitteePerson.committee_id == committee_id,
+ UnifiedCommitteePerson.is_active == True
+ )
+ ).all()
+
+ linked_counts = {"contributions": 0, "expenditures": 0, "total": 0}
+
+ for cp in committee_persons:
+ # Find transactions where this person is involved with this committee
+ # but not yet linked to a committee role
+ unlinked_transactions = session.exec(
+ select(UnifiedTransactionPerson).where(
+ UnifiedTransactionPerson.person_id == cp.person_id,
+ UnifiedTransactionPerson.committee_person_id == None
+ ).options(
+ selectinload(UnifiedTransactionPerson.transaction)
+ )
+ ).all()
+
+ for tx_person in unlinked_transactions:
+ # Check if this transaction belongs to the committee
+ if tx_person.transaction.committee_id == committee_id:
+ # Link the transaction to this committee role
+ tx_person.committee_person_id = cp.id
+ tx_person.updated_at = datetime.utcnow()
+
+ if tx_person.role == PersonRole.CONTRIBUTOR:
+ linked_counts["contributions"] += 1
+ elif tx_person.role == PersonRole.PAYEE:
+ linked_counts["expenditures"] += 1
+
+ linked_counts["total"] += 1
+ session.add(tx_person)
+
+ session.commit()
+ return linked_counts
+
+ def process_transaction_with_officer_linking(self, transaction_data: dict,
+ committee_officers: List[dict],
+ user: Optional[str] = None) -> UnifiedTransaction:
+ """
+ Process a new transaction and automatically link it to committee officers if applicable.
+
+ Args:
+ transaction_data: Transaction data to process
+ committee_officers: List of dicts with 'person_id', 'committee_id', 'role' keys
+ user: User making the change
+ """
+ # First, create the transaction normally
+ transaction = unified_sql_processor.build_transaction(transaction_data)
+
+ with self.get_session() as session:
+ session.add(transaction)
+ session.commit()
+ session.refresh(transaction)
+
+ # Now check if any of the transaction participants are committee officers
+ for officer in committee_officers:
+ # Find the committee-person relationship
+ committee_person = session.exec(
+ select(UnifiedCommitteePerson).where(
+ UnifiedCommitteePerson.person_id == officer['person_id'],
+ UnifiedCommitteePerson.committee_id == officer['committee_id'],
+ UnifiedCommitteePerson.role == officer['role'],
+ UnifiedCommitteePerson.is_active == True
+ )
+ ).first()
+
+ if committee_person:
+ # Find the transaction-person relationship for this person
+ tx_person = session.exec(
+ select(UnifiedTransactionPerson).where(
+ UnifiedTransactionPerson.transaction_id == transaction.id,
+ UnifiedTransactionPerson.person_id == officer['person_id']
+ )
+ ).first()
+
+ if tx_person:
+ # Link the transaction to this committee role
+ tx_person.committee_person_id = committee_person.id
+ tx_person.updated_at = datetime.utcnow()
+ session.add(tx_person)
+
+ session.commit()
+ session.refresh(transaction)
+ return transaction
+
+ def get_unlinked_officer_transactions(self, committee_id: Optional[int] = None) -> List[UnifiedTransactionPerson]:
+ """
+ Find transactions involving committee officers that haven't been linked to their roles yet.
+ Useful for identifying transactions that need manual review and linking.
+ """
+ with self.get_session() as session:
+ # Get all committee-person relationships
+ committee_persons_query = select(UnifiedCommitteePerson).where(
+ UnifiedCommitteePerson.is_active == True
+ )
+ if committee_id:
+ committee_persons_query = committee_persons_query.where(
+ UnifiedCommitteePerson.committee_id == committee_id
+ )
+
+ committee_persons = session.exec(committee_persons_query).all()
+
+ unlinked_transactions = []
+
+ for cp in committee_persons:
+ # Find transactions by this person that aren't linked to any committee role
+ person_transactions = session.exec(
+ select(UnifiedTransactionPerson).where(
+ UnifiedTransactionPerson.person_id == cp.person_id,
+ UnifiedTransactionPerson.committee_person_id == None
+ ).options(
+ selectinload(UnifiedTransactionPerson.transaction),
+ selectinload(UnifiedTransactionPerson.person)
+ )
+ ).all()
+
+ for tx_person in person_transactions:
+ # Add committee role info to help with manual review
+ tx_person._committee_role_info = {
+ "committee_id": cp.committee_id,
+ "role": cp.role,
+ "start_date": cp.start_date
+ }
+ unlinked_transactions.append(tx_person)
+
+ return unlinked_transactions
+
+
+
+# Global database manager instance (PostgreSQL)
+# Only created if PostgreSQL connection is available
+try:
+ db_manager = UnifiedDatabaseManager()
+except (RuntimeError, Exception) as e:
+ # PostgreSQL not available or schema doesn't exist - set to None
+ # Tests can check if db_manager is None before using
+ db_manager = None
+ import warnings
+ warnings.warn(f"PostgreSQL database manager not available: {e}", UserWarning)
\ No newline at end of file
diff --git a/app/states/unified_field_library.py b/app/states/unified_field_library.py
new file mode 100644
index 0000000..ecf7152
--- /dev/null
+++ b/app/states/unified_field_library.py
@@ -0,0 +1,503 @@
+"""
+Unified Field Library for Campaign Finance Data
+
+This module provides a comprehensive mapping system for campaign finance fields
+across different states, enabling consistent data processing and analysis.
+"""
+
+from typing import Dict, List, Set, Optional, Any, Tuple
+from dataclasses import dataclass, field
+from enum import Enum
+import json
+from pathlib import Path
+
+
+class FieldCategory(Enum):
+ """Semantic categories for campaign finance fields"""
+ # Core transaction fields
+ TRANSACTION_ID = "transaction_id"
+ AMOUNT = "amount"
+ DATE = "date"
+ DESCRIPTION = "description"
+ TYPE = "type"
+ STATUS = "status"
+
+ # Person/Entity fields
+ PERSON_NAME = "person_name"
+ PERSON_ORGANIZATION = "person_organization"
+ PERSON_ADDRESS = "person_address"
+ PERSON_CONTACT = "person_contact"
+ PERSON_EMPLOYMENT = "person_employment"
+ PERSON_IDENTIFICATION = "person_identification"
+
+ # Committee/Organization fields
+ COMMITTEE_NAME = "committee_name"
+ COMMITTEE_TYPE = "committee_type"
+ COMMITTEE_ADDRESS = "committee_address"
+ COMMITTEE_CONTACT = "committee_contact"
+ COMMITTEE_IDENTIFICATION = "committee_identification"
+
+ # Campaign/Election fields
+ CANDIDATE_NAME = "candidate_name"
+ OFFICE_SOUGHT = "office_sought"
+ OFFICE_HELD = "office_held"
+ ELECTION_INFO = "election_info"
+ DISTRICT_INFO = "district_info"
+
+ # Financial fields
+ LOAN_INFO = "loan_info"
+ PLEDGE_INFO = "pledge_info"
+ ASSET_INFO = "asset_info"
+ DEBT_INFO = "debt_info"
+ EXPENSE_CATEGORY = "expense_category"
+
+ # Administrative fields
+ FILING_INFO = "filing_info"
+ REPORT_INFO = "report_info"
+ AMENDMENT_INFO = "amendment_info"
+ VERIFICATION_INFO = "verification_info"
+
+ # Metadata fields
+ SOURCE_INFO = "source_info"
+ PROCESSING_INFO = "processing_info"
+ VALIDATION_INFO = "validation_info"
+
+
+class FieldType(Enum):
+ """Data types for fields"""
+ STRING = "string"
+ INTEGER = "integer"
+ DECIMAL = "decimal"
+ DATE = "date"
+ DATETIME = "datetime"
+ BOOLEAN = "boolean"
+ CURRENCY = "currency"
+ PERCENTAGE = "percentage"
+ CODE = "code"
+ IDENTIFIER = "identifier"
+
+
+@dataclass
+class FieldDefinition:
+ """Definition for a unified field"""
+ name: str
+ category: FieldCategory
+ field_type: FieldType
+ description: str
+ examples: List[str] = field(default_factory=list)
+ validation_rules: Dict[str, Any] = field(default_factory=dict)
+ normalization_rules: Dict[str, Any] = field(default_factory=dict)
+
+
+@dataclass
+class StateFieldMapping:
+ """Mapping from state-specific fields to unified fields"""
+ state: str
+ state_field: str
+ unified_field: str
+ confidence: float = 1.0 # 0.0 to 1.0
+ notes: str = ""
+
+
+class UnifiedFieldLibrary:
+ """
+ Unified field library for campaign finance data across all states.
+ Provides field mapping, categorization, and normalization capabilities.
+ """
+
+ def __init__(self):
+ self.unified_fields: Dict[str, FieldDefinition] = {}
+ self.state_mappings: Dict[str, List[StateFieldMapping]] = {}
+ self.field_categories: Dict[FieldCategory, Set[str]] = {}
+ self._initialize_unified_fields()
+ self._initialize_state_mappings()
+
+ def _initialize_unified_fields(self):
+ """Initialize the core unified field definitions"""
+
+ # Core transaction fields
+ self.unified_fields.update({
+ "transaction_id": FieldDefinition(
+ name="transaction_id",
+ category=FieldCategory.TRANSACTION_ID,
+ field_type=FieldType.IDENTIFIER,
+ description="Unique identifier for a financial transaction",
+ examples=["contributionInfoId", "expendInfoId", "Receipt ID", "Expenditure ID"],
+ validation_rules={"required": False, "unique": True} # Not all records have IDs
+ ),
+ "amount": FieldDefinition(
+ name="amount",
+ category=FieldCategory.AMOUNT,
+ field_type=FieldType.CURRENCY,
+ description="Monetary amount of the transaction",
+ examples=["contributionAmount", "expendAmount", "Receipt Amount", "Expenditure Amount"],
+ validation_rules={"required": False, "min_value": 0} # Some records may have missing amounts
+ ),
+ "transaction_date": FieldDefinition(
+ name="transaction_date",
+ category=FieldCategory.DATE,
+ field_type=FieldType.DATE,
+ description="Date when the transaction occurred",
+ examples=["contributionDt", "expendDt", "Receipt Date", "Expenditure Date"],
+ validation_rules={"required": False} # Not all records have dates
+ ),
+ "description": FieldDefinition(
+ name="description",
+ category=FieldCategory.DESCRIPTION,
+ field_type=FieldType.STRING,
+ description="Description or purpose of the transaction",
+ examples=["contributionDescr", "expendDescr", "Description", "Purpose"],
+ validation_rules={"max_length": 1000}
+ ),
+ "transaction_type": FieldDefinition(
+ name="transaction_type",
+ category=FieldCategory.TYPE,
+ field_type=FieldType.CODE,
+ description="Type of transaction (contribution, expenditure, loan, etc.)",
+ examples=["Receipt Type", "Expenditure Type"],
+ validation_rules={"enum_values": ["contribution", "expenditure", "loan", "pledge"]}
+ ),
+ })
+
+ # Person/Entity fields
+ self.unified_fields.update({
+ "person_first_name": FieldDefinition(
+ name="person_first_name",
+ category=FieldCategory.PERSON_NAME,
+ field_type=FieldType.STRING,
+ description="First name of a person",
+ examples=["contributorNameFirst", "payeeNameFirst", "First Name"],
+ validation_rules={"max_length": 100}
+ ),
+ "person_last_name": FieldDefinition(
+ name="person_last_name",
+ category=FieldCategory.PERSON_NAME,
+ field_type=FieldType.STRING,
+ description="Last name of a person",
+ examples=["contributorNameLast", "payeeNameLast", "Last Name"],
+ validation_rules={"max_length": 100}
+ ),
+ "person_organization": FieldDefinition(
+ name="person_organization",
+ category=FieldCategory.PERSON_ORGANIZATION,
+ field_type=FieldType.STRING,
+ description="Organization name for entity contributors",
+ examples=["contributorNameOrganization", "Committee Name"],
+ validation_rules={"max_length": 200}
+ ),
+ "person_employer": FieldDefinition(
+ name="person_employer",
+ category=FieldCategory.PERSON_EMPLOYMENT,
+ field_type=FieldType.STRING,
+ description="Employer of the person",
+ examples=["contributorEmployer", "Employer"],
+ validation_rules={"max_length": 200}
+ ),
+ "person_occupation": FieldDefinition(
+ name="person_occupation",
+ category=FieldCategory.PERSON_EMPLOYMENT,
+ field_type=FieldType.STRING,
+ description="Occupation of the person",
+ examples=["contributorOccupation", "Occupation"],
+ validation_rules={"max_length": 200}
+ ),
+ })
+
+ # Address fields
+ self.unified_fields.update({
+ "address_street_1": FieldDefinition(
+ name="address_street_1",
+ category=FieldCategory.PERSON_ADDRESS,
+ field_type=FieldType.STRING,
+ description="Primary street address",
+ examples=["contributorStreetAddr1", "Address 1"],
+ validation_rules={"max_length": 200}
+ ),
+ "address_street_2": FieldDefinition(
+ name="address_street_2",
+ category=FieldCategory.PERSON_ADDRESS,
+ field_type=FieldType.STRING,
+ description="Secondary street address",
+ examples=["contributorStreetAddr2", "Address 2"],
+ validation_rules={"max_length": 200}
+ ),
+ "address_city": FieldDefinition(
+ name="address_city",
+ category=FieldCategory.PERSON_ADDRESS,
+ field_type=FieldType.STRING,
+ description="City name",
+ examples=["contributorStreetCity", "City"],
+ validation_rules={"max_length": 100}
+ ),
+ "address_state": FieldDefinition(
+ name="address_state",
+ category=FieldCategory.PERSON_ADDRESS,
+ field_type=FieldType.CODE,
+ description="State or province code",
+ examples=["contributorStreetStateCd", "State"],
+ validation_rules={"max_length": 2}
+ ),
+ "address_zip": FieldDefinition(
+ name="address_zip",
+ category=FieldCategory.PERSON_ADDRESS,
+ field_type=FieldType.STRING,
+ description="Postal/ZIP code",
+ examples=["contributorStreetPostalCode", "Zip"],
+ validation_rules={"max_length": 10}
+ ),
+ })
+
+ # Committee fields
+ self.unified_fields.update({
+ "committee_name": FieldDefinition(
+ name="committee_name",
+ category=FieldCategory.COMMITTEE_NAME,
+ field_type=FieldType.STRING,
+ description="Name of the political committee",
+ examples=["filerName", "Committee Name"],
+ validation_rules={"max_length": 200}
+ ),
+ "committee_type": FieldDefinition(
+ name="committee_type",
+ category=FieldCategory.COMMITTEE_TYPE,
+ field_type=FieldType.CODE,
+ description="Type of political committee",
+ examples=["filerTypeCd", "Committee Type"],
+ validation_rules={"enum_values": ["candidate", "pac", "party", "other"]}
+ ),
+ })
+
+ # Filing/Administrative fields
+ self.unified_fields.update({
+ "filed_date": FieldDefinition(
+ name="filed_date",
+ category=FieldCategory.FILING_INFO,
+ field_type=FieldType.DATE,
+ description="Date when the report was filed",
+ examples=["filedDt", "Filed Date"],
+ validation_rules={"required": False} # Not all records have this
+ ),
+ "amended": FieldDefinition(
+ name="amended",
+ category=FieldCategory.AMENDMENT_INFO,
+ field_type=FieldType.BOOLEAN,
+ description="Whether this is an amended filing",
+ examples=["Amended"],
+ validation_rules={"default": False}
+ ),
+ })
+
+ # Build category index
+ for field_name, field_def in self.unified_fields.items():
+ if field_def.category not in self.field_categories:
+ self.field_categories[field_def.category] = set()
+ self.field_categories[field_def.category].add(field_name)
+
+ def _initialize_state_mappings(self):
+ """Initialize state-specific field mappings"""
+
+ # Texas mappings
+ self.state_mappings["texas"] = [
+ # Transaction fields
+ StateFieldMapping("texas", "contributionInfoId", "transaction_id", 1.0),
+ StateFieldMapping("texas", "expendInfoId", "transaction_id", 1.0),
+ StateFieldMapping("texas", "loanInfoId", "transaction_id", 1.0),
+ StateFieldMapping("texas", "contributionAmount", "amount", 1.0),
+ StateFieldMapping("texas", "expendAmount", "amount", 1.0),
+ StateFieldMapping("texas", "loanAmount", "amount", 1.0),
+ StateFieldMapping("texas", "contributionDt", "transaction_date", 1.0),
+ StateFieldMapping("texas", "expendDt", "transaction_date", 1.0),
+ StateFieldMapping("texas", "loanDt", "transaction_date", 1.0),
+ StateFieldMapping("texas", "contributionDescr", "description", 1.0),
+ StateFieldMapping("texas", "expendDescr", "description", 1.0),
+ StateFieldMapping("texas", "loanDescr", "description", 1.0),
+
+ # Person fields
+ StateFieldMapping("texas", "contributorNameFirst", "person_first_name", 1.0),
+ StateFieldMapping("texas", "contributorNameLast", "person_last_name", 1.0),
+ StateFieldMapping("texas", "contributorNameOrganization", "person_organization", 1.0),
+ StateFieldMapping("texas", "contributorEmployer", "person_employer", 1.0),
+ StateFieldMapping("texas", "contributorOccupation", "person_occupation", 1.0),
+
+ # Address fields
+ StateFieldMapping("texas", "contributorStreetAddr1", "address_street_1", 1.0),
+ StateFieldMapping("texas", "contributorStreetAddr2", "address_street_2", 1.0),
+ StateFieldMapping("texas", "contributorStreetCity", "address_city", 1.0),
+ StateFieldMapping("texas", "contributorStreetStateCd", "address_state", 1.0),
+ StateFieldMapping("texas", "contributorStreetPostalCode", "address_zip", 1.0),
+
+ # Committee fields
+ StateFieldMapping("texas", "filerName", "committee_name", 1.0),
+ StateFieldMapping("texas", "filerTypeCd", "committee_type", 1.0),
+ StateFieldMapping("texas", "filerIdent", "committee_filer_id", 1.0),
+
+ # Filing fields
+ StateFieldMapping("texas", "filedDt", "filed_date", 1.0),
+ StateFieldMapping("texas", "receivedDt", "filed_date", 0.9), # Also used in contributions
+ ]
+
+ # Oklahoma mappings
+ self.state_mappings["oklahoma"] = [
+ # Transaction fields
+ StateFieldMapping("oklahoma", "Receipt ID", "transaction_id", 1.0),
+ StateFieldMapping("oklahoma", "Expenditure ID", "transaction_id", 1.0),
+ StateFieldMapping("oklahoma", "Receipt Amount", "amount", 1.0),
+ StateFieldMapping("oklahoma", "Expenditure Amount", "amount", 1.0),
+ StateFieldMapping("oklahoma", "Receipt Date", "transaction_date", 1.0),
+ StateFieldMapping("oklahoma", "Expenditure Date", "transaction_date", 1.0),
+ StateFieldMapping("oklahoma", "Description", "description", 1.0),
+ StateFieldMapping("oklahoma", "Purpose", "description", 0.8),
+ StateFieldMapping("oklahoma", "Receipt Type", "transaction_type", 1.0),
+ StateFieldMapping("oklahoma", "Expenditure Type", "transaction_type", 1.0),
+
+ # Person fields
+ StateFieldMapping("oklahoma", "First Name", "person_first_name", 1.0),
+ StateFieldMapping("oklahoma", "Last Name", "person_last_name", 1.0),
+ StateFieldMapping("oklahoma", "Employer", "person_employer", 1.0),
+ StateFieldMapping("oklahoma", "Occupation", "person_occupation", 1.0),
+
+ # Address fields
+ StateFieldMapping("oklahoma", "Address 1", "address_street_1", 1.0),
+ StateFieldMapping("oklahoma", "Address 2", "address_street_2", 1.0),
+ StateFieldMapping("oklahoma", "City", "address_city", 1.0),
+ StateFieldMapping("oklahoma", "State", "address_state", 1.0),
+ StateFieldMapping("oklahoma", "Zip", "address_zip", 1.0),
+
+ # Committee fields
+ StateFieldMapping("oklahoma", "Committee Name", "committee_name", 1.0),
+ StateFieldMapping("oklahoma", "Committee Type", "committee_type", 1.0),
+ StateFieldMapping("oklahoma", "Org ID", "committee_filer_id", 1.0),
+
+ # Filing fields
+ StateFieldMapping("oklahoma", "Filed Date", "filed_date", 1.0),
+ StateFieldMapping("oklahoma", "Amended", "amended", 1.0),
+ ]
+
+ def get_unified_field(self, field_name: str) -> Optional[FieldDefinition]:
+ """Get a unified field definition by name"""
+ return self.unified_fields.get(field_name)
+
+ def get_state_mappings(self, state: str) -> List[StateFieldMapping]:
+ """Get all field mappings for a specific state"""
+ return self.state_mappings.get(state, [])
+
+ def map_state_field_to_unified(self, state: str, state_field: str) -> Optional[str]:
+ """Map a state-specific field to a unified field name"""
+ mappings = self.state_mappings.get(state, [])
+ for mapping in mappings:
+ if mapping.state_field == state_field:
+ return mapping.unified_field
+ return None
+
+ def get_fields_by_category(self, category: FieldCategory) -> List[str]:
+ """Get all unified field names for a specific category"""
+ return list(self.field_categories.get(category, set()))
+
+ def get_all_state_fields(self, state: str) -> Set[str]:
+ """Get all known field names for a specific state"""
+ mappings = self.state_mappings.get(state, [])
+ return {mapping.state_field for mapping in mappings}
+
+ def get_unified_fields_for_state(self, state: str) -> Set[str]:
+ """Get all unified fields that have mappings for a specific state"""
+ mappings = self.state_mappings.get(state, [])
+ return {mapping.unified_field for mapping in mappings}
+
+ def add_state_mapping(self, state: str, state_field: str, unified_field: str,
+ confidence: float = 1.0, notes: str = ""):
+ """Add a new state field mapping"""
+ if state not in self.state_mappings:
+ self.state_mappings[state] = []
+
+ mapping = StateFieldMapping(
+ state=state,
+ state_field=state_field,
+ unified_field=unified_field,
+ confidence=confidence,
+ notes=notes
+ )
+ self.state_mappings[state].append(mapping)
+
+ def add_unified_field(self, field_definition: FieldDefinition):
+ """Add a new unified field definition"""
+ self.unified_fields[field_definition.name] = field_definition
+
+ # Update category index
+ if field_definition.category not in self.field_categories:
+ self.field_categories[field_definition.category] = set()
+ self.field_categories[field_definition.category].add(field_definition.name)
+
+ def export_mappings(self, file_path: Path):
+ """Export all mappings to a JSON file"""
+ export_data = {
+ "unified_fields": {
+ name: {
+ "name": field_def.name,
+ "category": field_def.category.value,
+ "field_type": field_def.field_type.value,
+ "description": field_def.description,
+ "examples": field_def.examples,
+ "validation_rules": field_def.validation_rules,
+ "normalization_rules": field_def.normalization_rules
+ }
+ for name, field_def in self.unified_fields.items()
+ },
+ "state_mappings": {
+ state: [
+ {
+ "state": mapping.state,
+ "state_field": mapping.state_field,
+ "unified_field": mapping.unified_field,
+ "confidence": mapping.confidence,
+ "notes": mapping.notes
+ }
+ for mapping in mappings
+ ]
+ for state, mappings in self.state_mappings.items()
+ }
+ }
+
+ with open(file_path, 'w') as f:
+ json.dump(export_data, f, indent=2)
+
+ def import_mappings(self, file_path: Path):
+ """Import mappings from a JSON file"""
+ with open(file_path, 'r') as f:
+ import_data = json.load(f)
+
+ # Import unified fields
+ for name, field_data in import_data["unified_fields"].items():
+ field_def = FieldDefinition(
+ name=field_data["name"],
+ category=FieldCategory(field_data["category"]),
+ field_type=FieldType(field_data["field_type"]),
+ description=field_data["description"],
+ examples=field_data.get("examples", []),
+ validation_rules=field_data.get("validation_rules", {}),
+ normalization_rules=field_data.get("normalization_rules", {})
+ )
+ self.unified_fields[name] = field_def
+
+ # Import state mappings
+ for state, mappings_data in import_data["state_mappings"].items():
+ self.state_mappings[state] = [
+ StateFieldMapping(
+ state=mapping["state"],
+ state_field=mapping["state_field"],
+ unified_field=mapping["unified_field"],
+ confidence=mapping.get("confidence", 1.0),
+ notes=mapping.get("notes", "")
+ )
+ for mapping in mappings_data
+ ]
+
+ # Rebuild category index
+ self.field_categories.clear()
+ for field_name, field_def in self.unified_fields.items():
+ if field_def.category not in self.field_categories:
+ self.field_categories[field_def.category] = set()
+ self.field_categories[field_def.category].add(field_name)
+
+
+# Global instance for easy access
+field_library = UnifiedFieldLibrary()
\ No newline at end of file
diff --git a/app/states/unified_sqlmodels.py b/app/states/unified_sqlmodels.py
new file mode 100644
index 0000000..92eeaa9
--- /dev/null
+++ b/app/states/unified_sqlmodels.py
@@ -0,0 +1,1477 @@
+"""
+Unified SQLModels for Campaign Finance Data
+
+These SQLModel-based models provide database relationships and ORM capabilities
+for campaign finance data from any state.
+"""
+
+from typing import Optional, List, Dict, Any
+from datetime import date, datetime
+from decimal import Decimal
+from enum import Enum
+import re
+import json
+import uuid
+import hashlib
+from sqlmodel import SQLModel, Field, Relationship, select
+from sqlalchemy import Column, String, Numeric, Text, Integer, ForeignKey, Index
+from sqlalchemy.orm import selectinload
+
+from .unified_field_library import field_library
+
+
+class TransactionType(str, Enum):
+ """Types of campaign finance transactions"""
+ CONTRIBUTION = "contribution"
+ EXPENDITURE = "expenditure"
+ LOAN = "loan"
+ PLEDGE = "pledge"
+ REFUND = "refund"
+ TRANSFER = "transfer"
+ OTHER = "other"
+
+
+class PersonType(str, Enum):
+ """Types of persons in campaign finance data"""
+ INDIVIDUAL = "individual"
+ ORGANIZATION = "organization"
+ COMMITTEE = "committee"
+ CANDIDATE = "candidate"
+ UNKNOWN = "unknown"
+
+
+class PersonRole(str, Enum):
+ """Roles of persons in transactions"""
+ CONTRIBUTOR = "contributor"
+ RECIPIENT = "recipient"
+ PAYEE = "payee"
+ CANDIDATE = "candidate"
+ TREASURER = "treasurer"
+ CHAIR = "chair"
+
+
+class CommitteeRole(str, Enum):
+ """Roles that people can have within committees"""
+ TREASURER = "treasurer"
+ ASSISTANT_TREASURER = "assistant_treasurer"
+ CHAIR = "chair"
+ VICE_CHAIR = "vice_chair"
+ SECRETARY = "secretary"
+ ASSISTANT_SECRETARY = "assistant_secretary"
+ CANDIDATE = "candidate"
+ DEPUTY_TREASURER = "deputy_treasurer"
+ OTHER = "other"
+
+
+class EntityType(str, Enum):
+ """Types of unified entities used for deduplication"""
+ PERSON = "person"
+ ORGANIZATION = "organization"
+ COMMITTEE = "committee"
+ CAMPAIGN = "campaign"
+ VENDOR = "vendor"
+ OTHER = "other"
+
+
+class AssociationType(str, Enum):
+ """Association types between unified entities"""
+ TREASURER_OF = "treasurer_of"
+ DONOR_TO = "donor_to"
+ VENDOR_FOR = "vendor_for"
+ OFFICER_OF = "officer_of"
+ AFFILIATED_WITH = "affiliated_with"
+ EMPLOYED_BY = "employed_by"
+ OTHER = "other"
+
+
+class CampaignRole(str, Enum):
+ """Roles that entities can have within a campaign context"""
+ CANDIDATE = "candidate"
+ TREASURER = "treasurer"
+ CHAIR = "chair"
+ DONOR = "donor"
+ VENDOR = "vendor"
+ CONSULTANT = "consultant"
+ STAFF = "staff"
+ SUPPORTER = "supporter"
+ COMMITTEE = "committee"
+ OTHER = "other"
+
+
+class State(SQLModel, table=True):
+ """Reference table containing US states."""
+ __tablename__ = "states"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ code: str = Field(sa_column=Column(String(2), unique=True, nullable=False))
+ name: str = Field(sa_column=Column(String(100), unique=True, nullable=False))
+
+ transactions: List["UnifiedTransaction"] = Relationship(back_populates="state")
+ persons: List["UnifiedPerson"] = Relationship(back_populates="state")
+ committees: List["UnifiedCommittee"] = Relationship(back_populates="state")
+ entities: List["UnifiedEntity"] = Relationship(back_populates="state")
+ campaigns: List["UnifiedCampaign"] = Relationship(back_populates="state")
+ contributions: List["UnifiedContribution"] = Relationship(back_populates="state")
+ loans: List["UnifiedLoan"] = Relationship(back_populates="state")
+ campaign_entities: List["UnifiedCampaignEntity"] = Relationship(back_populates="state")
+ transaction_persons: List["UnifiedTransactionPerson"] = Relationship(back_populates="state")
+ committee_persons: List["UnifiedCommitteePerson"] = Relationship(back_populates="state")
+ file_origins: List["FileOrigin"] = Relationship(back_populates="state")
+
+
+class FileOrigin(SQLModel, table=True):
+ """Normalized file origin references for ingested data."""
+ __tablename__ = "file_origins"
+
+ id: str = Field(default=None, primary_key=True, max_length=64)
+ state_id: int = Field(foreign_key="states.id")
+ filename: str = Field(sa_column=Column(String(500), nullable=False))
+ created_at: datetime = Field(default_factory=datetime.utcnow)
+
+ state: State = Relationship(back_populates="file_origins")
+ transactions: List["UnifiedTransaction"] = Relationship(back_populates="file_origin")
+
+ @staticmethod
+ def build_key(state_id: int, filename: str) -> str:
+ base = f"{state_id}:{filename}".encode("utf-8")
+ return hashlib.sha256(base).hexdigest()
+
+
+class UnifiedAddress(SQLModel, table=True):
+ """Unified address model with database table"""
+ __tablename__ = "unified_addresses"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()), unique=True, index=True)
+
+ # Address fields
+ street_1: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ street_2: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ city: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ state: Optional[str] = Field(default=None, sa_column=Column(String(50)))
+ zip_code: Optional[str] = Field(default=None, sa_column=Column(String(50)))
+ country: Optional[str] = Field(default=None, sa_column=Column(String(100)))
+ county: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+
+ # Metadata
+ created_at: datetime = Field(default_factory=datetime.utcnow)
+ updated_at: datetime = Field(default_factory=datetime.utcnow)
+
+ # Relationships
+ persons: List["UnifiedPerson"] = Relationship(back_populates="address")
+ entities: List["UnifiedEntity"] = Relationship(back_populates="address")
+
+ def __post_init__(self):
+ """Normalize address data after initialization"""
+ if self.state:
+ self.state = self.state.upper().strip()
+ if self.city:
+ self.city = self.city.strip()
+ if self.zip_code:
+ self.zip_code = str(self.zip_code).strip()
+
+ @property
+ def full_address(self) -> str:
+ """Get the full formatted address"""
+ parts = []
+ if self.street_1:
+ parts.append(self.street_1)
+ if self.street_2:
+ parts.append(self.street_2)
+ if self.city:
+ parts.append(self.city)
+ if self.state:
+ parts.append(self.state)
+ if self.zip_code:
+ parts.append(self.zip_code)
+
+ return ", ".join(parts) if parts else "No address"
+
+
+class UnifiedPerson(SQLModel, table=True):
+ """Unified person model with database table"""
+ __tablename__ = "unified_persons"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()), unique=True, index=True)
+
+ # Person fields
+ first_name: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ last_name: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ middle_name: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ suffix: Optional[str] = Field(default=None, sa_column=Column(String(50)))
+ organization: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ employer: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ occupation: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ job_title: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ person_type: PersonType = Field(default=PersonType.UNKNOWN)
+
+ # Foreign keys
+ address_id: Optional[int] = Field(default=None, foreign_key="unified_addresses.id")
+ state_id: Optional[int] = Field(default=None, foreign_key="states.id")
+
+ # Metadata
+ created_at: datetime = Field(default_factory=datetime.utcnow)
+ updated_at: datetime = Field(default_factory=datetime.utcnow)
+
+ # Relationships
+ address: Optional[UnifiedAddress] = Relationship(back_populates="persons")
+ entity: Optional["UnifiedEntity"] = Relationship(back_populates="person")
+ state: Optional[State] = Relationship(back_populates="persons")
+ campaigns: List["UnifiedCampaign"] = Relationship(back_populates="candidate")
+ transaction_contributions: List["UnifiedTransactionPerson"] = Relationship(
+ back_populates="person",
+ sa_relationship_kwargs={"foreign_keys": "UnifiedTransactionPerson.person_id"}
+ )
+
+ def __post_init__(self):
+ """Normalize person data after initialization"""
+ if self.first_name:
+ self.first_name = self.first_name.strip()
+ if self.last_name:
+ self.last_name = self.last_name.strip()
+ if self.organization:
+ self.organization = self.organization.strip()
+ if self.employer:
+ self.employer = self.employer.strip()
+ if self.occupation:
+ self.occupation = self.occupation.strip()
+
+ @property
+ def full_name(self) -> str:
+ """Get the full name of the person"""
+ parts = []
+ if self.first_name:
+ parts.append(self.first_name)
+ if self.middle_name:
+ parts.append(self.middle_name)
+ if self.last_name:
+ parts.append(self.last_name)
+ if self.suffix:
+ parts.append(self.suffix)
+
+ if parts:
+ return " ".join(parts)
+ elif self.organization:
+ return self.organization
+ else:
+ return "Unknown"
+
+
+class UnifiedCommittee(SQLModel, table=True):
+ """Unified committee model with database table"""
+ __tablename__ = "unified_committees"
+
+ # Use filer_id as primary key since it's the unique identifier from state systems
+ filer_id: str = Field(sa_column=Column(String(200), primary_key=True))
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()), unique=True, index=True)
+
+ # Committee fields
+ name: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ committee_type: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+
+ # Foreign keys
+ address_id: Optional[int] = Field(default=None, foreign_key="unified_addresses.id")
+ state_id: Optional[int] = Field(default=None, foreign_key="states.id")
+
+ # Metadata
+ created_at: datetime = Field(default_factory=datetime.utcnow)
+ updated_at: datetime = Field(default_factory=datetime.utcnow)
+
+ # Relationships
+ address: Optional[UnifiedAddress] = Relationship()
+ transactions: List["UnifiedTransaction"] = Relationship(back_populates="committee")
+ entity: Optional["UnifiedEntity"] = Relationship(back_populates="committee")
+ campaigns: List["UnifiedCampaign"] = Relationship(back_populates="primary_committee")
+ state: Optional[State] = Relationship(back_populates="committees")
+
+ def __post_init__(self):
+ """Normalize committee data after initialization"""
+ if self.name:
+ self.name = self.name.strip()
+ if self.committee_type:
+ self.committee_type = self.committee_type.strip()
+
+
+class UnifiedEntity(SQLModel, table=True):
+ """Unified entity representing people, committees, vendors, and campaigns."""
+ __tablename__ = "unified_entities"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()), unique=True, index=True)
+ entity_type: EntityType = Field(default=EntityType.PERSON, index=True)
+ name: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ normalized_name: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ person_id: Optional[int] = Field(default=None, sa_column=Column(Integer, ForeignKey("unified_persons.id"), unique=True))
+ committee_id: Optional[str] = Field(default=None, sa_column=Column(String(200), ForeignKey("unified_committees.filer_id"), unique=True))
+ address_id: Optional[int] = Field(default=None, foreign_key="unified_addresses.id")
+ state_id: Optional[int] = Field(default=None, foreign_key="states.id")
+ notes: Optional[str] = Field(default=None, sa_column=Column(Text))
+ metadata_json: Optional[str] = Field(default=None, sa_column=Column(Text))
+ created_at: datetime = Field(default_factory=datetime.utcnow)
+ updated_at: datetime = Field(default_factory=datetime.utcnow)
+
+ # Relationships
+ address: Optional[UnifiedAddress] = Relationship(back_populates="entities")
+ person: Optional[UnifiedPerson] = Relationship(back_populates="entity")
+ committee: Optional[UnifiedCommittee] = Relationship(back_populates="entity")
+ campaign_memberships: List["UnifiedCampaignEntity"] = Relationship(back_populates="entity")
+ association_sources: List["UnifiedEntityAssociation"] = Relationship(
+ back_populates="source_entity",
+ sa_relationship_kwargs={"foreign_keys": "UnifiedEntityAssociation.source_entity_id"}
+ )
+ association_targets: List["UnifiedEntityAssociation"] = Relationship(
+ back_populates="target_entity",
+ sa_relationship_kwargs={"foreign_keys": "UnifiedEntityAssociation.target_entity_id"}
+ )
+ contributions_given: List["UnifiedContribution"] = Relationship(
+ back_populates="contributor",
+ sa_relationship_kwargs={"foreign_keys": "UnifiedContribution.contributor_entity_id"}
+ )
+ contributions_received: List["UnifiedContribution"] = Relationship(
+ back_populates="recipient",
+ sa_relationship_kwargs={"foreign_keys": "UnifiedContribution.recipient_entity_id"}
+ )
+ loans_lent: List["UnifiedLoan"] = Relationship(
+ back_populates="lender",
+ sa_relationship_kwargs={"foreign_keys": "UnifiedLoan.lender_entity_id"}
+ )
+ loans_borrowed: List["UnifiedLoan"] = Relationship(
+ back_populates="borrower",
+ sa_relationship_kwargs={"foreign_keys": "UnifiedLoan.borrower_entity_id"}
+ )
+ state: Optional[State] = Relationship(back_populates="entities")
+
+
+class UnifiedTransaction(SQLModel, table=True):
+ """Unified transaction model with database table and change tracking"""
+ __tablename__ = "unified_transactions"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()), unique=True, index=True)
+
+ # Core transaction fields
+ transaction_id: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ amount: Optional[Decimal] = Field(default=None, sa_column=Column(Numeric(15, 2)))
+ transaction_date: Optional[date] = Field(default=None, index=True)
+ description: Optional[str] = Field(default=None, sa_column=Column(Text))
+ transaction_type: TransactionType = Field(default=TransactionType.OTHER, index=True)
+
+ # Foreign keys
+ committee_id: Optional[str] = Field(default=None, foreign_key="unified_committees.filer_id")
+ campaign_id: Optional[int] = Field(default=None, foreign_key="unified_campaigns.id")
+ state_id: Optional[int] = Field(default=None, foreign_key="states.id")
+ file_origin_id: Optional[str] = Field(default=None, foreign_key="file_origins.id")
+
+ # Administrative fields
+ filed_date: Optional[date] = Field(default=None, index=True)
+ amended: bool = Field(default=False, index=True)
+
+ # Metadata fields
+ download_date: Optional[str] = Field(default=None, sa_column=Column(String(100)))
+
+ # Raw data for debugging (stored as JSON string)
+ raw_data: Optional[str] = Field(default=None, sa_column=Column(Text))
+
+ # Change tracking fields
+ last_modified_at: datetime = Field(default_factory=datetime.utcnow, index=True)
+ last_modified_by: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ change_reason: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ amendment_details: Optional[str] = Field(default=None, sa_column=Column(Text))
+
+ # Metadata
+ created_at: datetime = Field(default_factory=datetime.utcnow)
+ updated_at: datetime = Field(default_factory=datetime.utcnow)
+
+ # Relationships
+ committee: Optional[UnifiedCommittee] = Relationship(back_populates="transactions")
+ campaign: Optional["UnifiedCampaign"] = Relationship(back_populates="transactions")
+ persons: List["UnifiedTransactionPerson"] = Relationship(back_populates="transaction")
+ contribution: Optional["UnifiedContribution"] = Relationship(
+ back_populates="transaction",
+ sa_relationship_kwargs={"uselist": False}
+ )
+ loan: Optional["UnifiedLoan"] = Relationship(
+ back_populates="transaction",
+ sa_relationship_kwargs={"uselist": False}
+ )
+ state: Optional[State] = Relationship(back_populates="transactions")
+ file_origin: Optional[FileOrigin] = Relationship(back_populates="transactions")
+
+
+class UnifiedTransactionPerson(SQLModel, table=True):
+ """Junction table for transaction-person relationships with roles"""
+ __tablename__ = "unified_transaction_persons"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()), unique=True, index=True)
+
+ # Foreign keys
+ transaction_id: int = Field(foreign_key="unified_transactions.id")
+ person_id: int = Field(foreign_key="unified_persons.id")
+ entity_id: Optional[int] = Field(default=None, foreign_key="unified_entities.id")
+ state_id: Optional[int] = Field(default=None, foreign_key="states.id")
+ state_id: Optional[int] = Field(default=None, foreign_key="states.id")
+
+ # Link to committee role (optional - for tracking officer activities)
+ committee_person_id: Optional[int] = Field(default=None, foreign_key="unified_committee_persons.id")
+
+ # Role in the transaction
+ role: PersonRole = Field(index=True)
+
+ # Additional metadata for the relationship
+ amount: Optional[Decimal] = Field(default=None, sa_column=Column(Numeric(15, 2)))
+ notes: Optional[str] = Field(default=None, sa_column=Column(Text))
+
+ # Metadata
+ created_at: datetime = Field(default_factory=datetime.utcnow)
+ updated_at: datetime = Field(default_factory=datetime.utcnow)
+
+ # Relationships
+ transaction: UnifiedTransaction = Relationship(back_populates="persons")
+ person: UnifiedPerson = Relationship(back_populates="transaction_contributions")
+ entity: Optional[UnifiedEntity] = Relationship()
+ state: Optional[State] = Relationship(back_populates="transaction_persons")
+ committee_person: Optional["UnifiedCommitteePerson"] = Relationship()
+
+
+class UnifiedTransactionVersion(SQLModel, table=True):
+ """Versioning/history table for UnifiedTransaction"""
+ __tablename__ = "unified_transaction_versions"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ transaction_id: int = Field(foreign_key="unified_transactions.id")
+ version_number: int = Field(index=True)
+ data: str = Field(sa_column=Column(Text)) # JSON snapshot of the transaction
+ changed_at: datetime = Field(default_factory=datetime.utcnow, index=True)
+ changed_by: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ change_reason: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ amendment_details: Optional[str] = Field(default=None, sa_column=Column(Text))
+
+ # Relationships
+ transaction: Optional[UnifiedTransaction] = Relationship()
+
+
+class UnifiedPersonVersion(SQLModel, table=True):
+ """Versioning/history table for UnifiedPerson"""
+ __tablename__ = "unified_person_versions"
+ id: Optional[int] = Field(default=None, primary_key=True)
+ person_id: int = Field(foreign_key="unified_persons.id")
+ version_number: int = Field(index=True)
+ data: str = Field(sa_column=Column(Text)) # JSON snapshot of the person
+ changed_at: datetime = Field(default_factory=datetime.utcnow, index=True)
+ changed_by: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ change_reason: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ amendment_details: Optional[str] = Field(default=None, sa_column=Column(Text))
+ person: Optional[UnifiedPerson] = Relationship()
+
+class UnifiedCommitteeVersion(SQLModel, table=True):
+ """Versioning/history table for UnifiedCommittee"""
+ __tablename__ = "unified_committee_versions"
+ id: Optional[int] = Field(default=None, primary_key=True)
+ committee_id: str = Field(foreign_key="unified_committees.filer_id")
+ version_number: int = Field(index=True)
+ data: str = Field(sa_column=Column(Text)) # JSON snapshot of the committee
+ changed_at: datetime = Field(default_factory=datetime.utcnow, index=True)
+ changed_by: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ change_reason: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ amendment_details: Optional[str] = Field(default=None, sa_column=Column(Text))
+ committee: Optional[UnifiedCommittee] = Relationship()
+
+class UnifiedAddressVersion(SQLModel, table=True):
+ """Versioning/history table for UnifiedAddress"""
+ __tablename__ = "unified_address_versions"
+ id: Optional[int] = Field(default=None, primary_key=True)
+ address_id: int = Field(foreign_key="unified_addresses.id")
+ version_number: int = Field(index=True)
+ data: str = Field(sa_column=Column(Text)) # JSON snapshot of the address
+ changed_at: datetime = Field(default_factory=datetime.utcnow, index=True)
+ changed_by: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ change_reason: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ amendment_details: Optional[str] = Field(default=None, sa_column=Column(Text))
+ address: Optional[UnifiedAddress] = Relationship()
+
+class UnifiedCommitteePerson(SQLModel, table=True):
+ """Junction table for committee-person relationships with roles"""
+ __tablename__ = "unified_committee_persons"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()), unique=True, index=True)
+
+ # Foreign keys
+ committee_id: str = Field(foreign_key="unified_committees.filer_id")
+ person_id: int = Field(foreign_key="unified_persons.id")
+ entity_id: Optional[int] = Field(default=None, foreign_key="unified_entities.id")
+ state_id: Optional[int] = Field(default=None, foreign_key="states.id")
+
+ # Role information
+ role: CommitteeRole = Field(index=True)
+ start_date: Optional[date] = Field(default=None, index=True)
+ end_date: Optional[date] = Field(default=None, index=True)
+ is_active: bool = Field(default=True, index=True)
+
+ # Additional metadata
+ notes: Optional[str] = Field(default=None, sa_column=Column(Text))
+
+ # Change tracking fields
+ last_modified_at: datetime = Field(default_factory=datetime.utcnow, index=True)
+ last_modified_by: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ change_reason: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+
+ # Metadata
+ created_at: datetime = Field(default_factory=datetime.utcnow)
+ updated_at: datetime = Field(default_factory=datetime.utcnow)
+
+ # Relationships
+ committee: UnifiedCommittee = Relationship()
+ person: UnifiedPerson = Relationship()
+ entity: Optional[UnifiedEntity] = Relationship()
+ state: Optional[State] = Relationship(back_populates="committee_persons")
+
+class UnifiedCommitteePersonVersion(SQLModel, table=True):
+ """Versioning/history table for UnifiedCommitteePerson"""
+ __tablename__ = "unified_committee_person_versions"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()), unique=True, index=True)
+ committee_person_id: int = Field(foreign_key="unified_committee_persons.id")
+ version_number: int = Field(index=True)
+ data: str = Field(sa_column=Column(Text)) # JSON snapshot
+ changed_at: datetime = Field(default_factory=datetime.utcnow, index=True)
+ changed_by: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ change_reason: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ amendment_details: Optional[str] = Field(default=None, sa_column=Column(Text))
+
+ # Relationships
+ committee_person: Optional[UnifiedCommitteePerson] = Relationship()
+
+class UnifiedEntityAssociation(SQLModel, table=True):
+ """Associations between unified entities (e.g., treasurer-of, vendor-for)."""
+ __tablename__ = "unified_entity_associations"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()), unique=True, index=True)
+ source_entity_id: int = Field(foreign_key="unified_entities.id")
+ target_entity_id: int = Field(foreign_key="unified_entities.id")
+ association_type: AssociationType = Field(index=True)
+ start_date: Optional[date] = Field(default=None, index=True)
+ end_date: Optional[date] = Field(default=None, index=True)
+ description: Optional[str] = Field(default=None, sa_column=Column(Text))
+ metadata_json: Optional[str] = Field(default=None, sa_column=Column(Text))
+ created_at: datetime = Field(default_factory=datetime.utcnow)
+ updated_at: datetime = Field(default_factory=datetime.utcnow)
+
+ # Relationships
+ source_entity: UnifiedEntity = Relationship(
+ back_populates="association_sources",
+ sa_relationship_kwargs={"foreign_keys": "UnifiedEntityAssociation.source_entity_id"}
+ )
+ target_entity: UnifiedEntity = Relationship(
+ back_populates="association_targets",
+ sa_relationship_kwargs={"foreign_keys": "UnifiedEntityAssociation.target_entity_id"}
+ )
+
+
+class UnifiedCampaign(SQLModel, table=True):
+ """Unified campaign metadata allowing cross-committee associations."""
+ __tablename__ = "unified_campaigns"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()), unique=True, index=True)
+ name: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ normalized_name: Optional[str] = Field(default=None, sa_column=Column(String(500)))
+ election_year: Optional[int] = Field(default=None, index=True)
+ office_sought: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ district: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ candidate_person_id: Optional[int] = Field(default=None, foreign_key="unified_persons.id")
+ primary_committee_id: Optional[str] = Field(default=None, foreign_key="unified_committees.filer_id")
+ state_id: Optional[int] = Field(default=None, foreign_key="states.id")
+ metadata_json: Optional[str] = Field(default=None, sa_column=Column(Text))
+ created_at: datetime = Field(default_factory=datetime.utcnow)
+ updated_at: datetime = Field(default_factory=datetime.utcnow)
+
+ # Relationships
+ candidate: Optional["UnifiedPerson"] = Relationship(back_populates="campaigns")
+ primary_committee: Optional["UnifiedCommittee"] = Relationship(back_populates="campaigns")
+ entities: List["UnifiedCampaignEntity"] = Relationship(back_populates="campaign")
+ transactions: List["UnifiedTransaction"] = Relationship(back_populates="campaign")
+ state: Optional[State] = Relationship(back_populates="campaigns")
+
+
+class UnifiedCampaignEntity(SQLModel, table=True):
+ """Links unified entities to campaigns with specific roles."""
+ __tablename__ = "unified_campaign_entities"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()), unique=True, index=True)
+ campaign_id: int = Field(foreign_key="unified_campaigns.id")
+ entity_id: int = Field(foreign_key="unified_entities.id")
+ state_id: Optional[int] = Field(default=None, foreign_key="states.id")
+ role: CampaignRole = Field(index=True)
+ is_primary: bool = Field(default=False, index=True)
+ start_date: Optional[date] = Field(default=None, index=True)
+ end_date: Optional[date] = Field(default=None, index=True)
+ notes: Optional[str] = Field(default=None, sa_column=Column(Text))
+ metadata_json: Optional[str] = Field(default=None, sa_column=Column(Text))
+ created_at: datetime = Field(default_factory=datetime.utcnow)
+ updated_at: datetime = Field(default_factory=datetime.utcnow)
+
+ # Relationships
+ campaign: "UnifiedCampaign" = Relationship(back_populates="entities")
+ entity: "UnifiedEntity" = Relationship(back_populates="campaign_memberships")
+ state: Optional[State] = Relationship(back_populates="campaign_entities")
+
+
+class UnifiedContribution(SQLModel, table=True):
+ """Normalized contribution detail extracted from transactions."""
+ __tablename__ = "unified_contributions"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()), unique=True, index=True)
+ transaction_id: int = Field(sa_column=Column(Integer, ForeignKey("unified_transactions.id"), unique=True))
+ contributor_entity_id: int = Field(foreign_key="unified_entities.id")
+ recipient_entity_id: int = Field(foreign_key="unified_entities.id")
+ state_id: Optional[int] = Field(default=None, foreign_key="states.id")
+ amount: Optional[Decimal] = Field(default=None, sa_column=Column(Numeric(15, 2)))
+ receipt_date: Optional[date] = Field(default=None, index=True)
+ contribution_type: Optional[str] = Field(default=None, sa_column=Column(String(200)))
+ is_anonymous: bool = Field(default=False, index=True)
+ description: Optional[str] = Field(default=None, sa_column=Column(Text))
+ metadata_json: Optional[str] = Field(default=None, sa_column=Column(Text))
+ created_at: datetime = Field(default_factory=datetime.utcnow)
+ updated_at: datetime = Field(default_factory=datetime.utcnow)
+
+ # Relationships
+ transaction: "UnifiedTransaction" = Relationship(back_populates="contribution")
+ contributor: "UnifiedEntity" = Relationship(
+ back_populates="contributions_given",
+ sa_relationship_kwargs={"foreign_keys": "UnifiedContribution.contributor_entity_id"}
+ )
+ recipient: "UnifiedEntity" = Relationship(
+ back_populates="contributions_received",
+ sa_relationship_kwargs={"foreign_keys": "UnifiedContribution.recipient_entity_id"}
+ )
+ state: Optional[State] = Relationship(back_populates="contributions")
+
+
+class UnifiedLoan(SQLModel, table=True):
+ """Normalized loan detail extracted from transactions."""
+ __tablename__ = "unified_loans"
+
+ id: Optional[int] = Field(default=None, primary_key=True)
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()), unique=True, index=True)
+ transaction_id: int = Field(sa_column=Column(Integer, ForeignKey("unified_transactions.id"), unique=True))
+ lender_entity_id: int = Field(foreign_key="unified_entities.id")
+ borrower_entity_id: int = Field(foreign_key="unified_entities.id")
+ state_id: Optional[int] = Field(default=None, foreign_key="states.id")
+ amount: Optional[Decimal] = Field(default=None, sa_column=Column(Numeric(15, 2)))
+ loan_date: Optional[date] = Field(default=None, index=True)
+ due_date: Optional[date] = Field(default=None, index=True)
+ interest_rate: Optional[Decimal] = Field(default=None, sa_column=Column(Numeric(9, 4)))
+ is_forgiven: bool = Field(default=False, index=True)
+ collateral: Optional[str] = Field(default=None, sa_column=Column(Text))
+ metadata_json: Optional[str] = Field(default=None, sa_column=Column(Text))
+ created_at: datetime = Field(default_factory=datetime.utcnow)
+ updated_at: datetime = Field(default_factory=datetime.utcnow)
+
+ # Relationships
+ transaction: "UnifiedTransaction" = Relationship(back_populates="loan")
+ lender: "UnifiedEntity" = Relationship(
+ back_populates="loans_lent",
+ sa_relationship_kwargs={"foreign_keys": "UnifiedLoan.lender_entity_id"}
+ )
+ borrower: "UnifiedEntity" = Relationship(
+ back_populates="loans_borrowed",
+ sa_relationship_kwargs={"foreign_keys": "UnifiedLoan.borrower_entity_id"}
+ )
+ state: Optional[State] = Relationship(back_populates="loans")
+
+
+# Database indexes for performance
+class UnifiedTransactionIndexes:
+ """Database indexes for the unified transaction system"""
+
+ # Transaction indexes
+ idx_transactions_state = Index("idx_transactions_state", UnifiedTransaction.state_id)
+ idx_transactions_type = Index("idx_transactions_type", UnifiedTransaction.transaction_type)
+ idx_transactions_date = Index("idx_transactions_date", UnifiedTransaction.transaction_date)
+ idx_transactions_amount = Index("idx_transactions_amount", UnifiedTransaction.amount)
+ idx_transactions_committee = Index("idx_transactions_committee", UnifiedTransaction.committee_id)
+ idx_transactions_id = Index("idx_transactions_id", UnifiedTransaction.transaction_id)
+ idx_transactions_file_origin = Index("idx_transactions_file_origin", UnifiedTransaction.file_origin_id)
+
+ # Person indexes
+ idx_persons_name = Index("idx_persons_name", UnifiedPerson.last_name, UnifiedPerson.first_name)
+ idx_persons_organization = Index("idx_persons_organization", UnifiedPerson.organization)
+ idx_persons_type = Index("idx_persons_type", UnifiedPerson.person_type)
+
+ # Transaction-Person relationship indexes
+ idx_transaction_persons_role = Index("idx_transaction_persons_role", UnifiedTransactionPerson.role)
+ idx_transaction_persons_transaction = Index("idx_transaction_persons_transaction", UnifiedTransactionPerson.transaction_id)
+ idx_transaction_persons_person = Index("idx_transaction_persons_person", UnifiedTransactionPerson.person_id)
+
+ # Address indexes
+ idx_addresses_state = Index("idx_addresses_state", UnifiedAddress.state)
+ idx_addresses_city = Index("idx_addresses_city", UnifiedAddress.city)
+
+ # Committee indexes
+ idx_committees_name = Index("idx_committees_name", UnifiedCommittee.name)
+ idx_committees_type = Index("idx_committees_type", UnifiedCommittee.committee_type)
+ # Note: filer_id is already indexed as primary key
+
+ # Entity indexes
+ idx_entities_type = Index("idx_entities_type", UnifiedEntity.entity_type)
+ idx_entities_name = Index("idx_entities_name", UnifiedEntity.normalized_name)
+
+ # Campaign indexes
+ idx_campaigns_year = Index("idx_campaigns_year", UnifiedCampaign.election_year)
+ idx_campaigns_office = Index("idx_campaigns_office", UnifiedCampaign.office_sought)
+ idx_campaigns_name = Index("idx_campaigns_name", UnifiedCampaign.normalized_name)
+ idx_campaign_entity_role = Index("idx_campaign_entity_role", UnifiedCampaignEntity.role)
+
+ # Contribution indexes
+ idx_contributions_date = Index("idx_contributions_date", UnifiedContribution.receipt_date)
+ idx_contributions_amount = Index("idx_contributions_amount", UnifiedContribution.amount)
+
+ # Loan indexes
+ idx_loans_date = Index("idx_loans_date", UnifiedLoan.loan_date)
+ idx_loans_due_date = Index("idx_loans_due_date", UnifiedLoan.due_date)
+
+
+class UnifiedSQLModelBuilder:
+ """
+ Builder class that creates SQLModel instances from state-specific data
+ by automatically mapping fields using the field library.
+ """
+
+ def __init__(self, state: str, state_id: Optional[int], state_code: Optional[str] = None):
+ self.state_slug = state
+ self.state_id = state_id
+ self.state_code = state_code
+ self.field_mappings = {
+ mapping.state_field: mapping.unified_field
+ for mapping in field_library.get_state_mappings(state)
+ }
+
+ def build_transaction(self, raw_data: Dict[str, Any]) -> UnifiedTransaction:
+ """
+ Build a unified transaction from raw state-specific data.
+
+ Args:
+ raw_data: Dictionary containing state-specific field data
+
+ Returns:
+ UnifiedTransaction object with normalized data
+ """
+ # Initialize the transaction
+ transaction = UnifiedTransaction(
+ state_id=self.state_id,
+ raw_data=json.dumps(raw_data.copy(), default=self._json_default)
+ )
+
+ # Map core transaction fields
+ transaction.transaction_id = self._get_field_value(raw_data, "transaction_id")
+ transaction.amount = self._parse_amount(self._get_field_value(raw_data, "amount"))
+ transaction.transaction_date = self._parse_date(self._get_field_value(raw_data, "transaction_date"))
+ transaction.description = self._get_field_value(raw_data, "description")
+ transaction.transaction_type = self._determine_transaction_type(raw_data)
+
+ # Map administrative fields
+ transaction.filed_date = self._parse_date(self._get_field_value(raw_data, "filed_date"))
+ transaction.amended = self._parse_boolean(self._get_field_value(raw_data, "amended"))
+
+ # Map metadata fields
+ transaction.download_date = raw_data.get("download_date")
+
+ return transaction
+
+ def build_person(self, raw_data: Dict[str, Any], role: PersonRole) -> Optional[UnifiedPerson]:
+ """Build a unified person from raw data"""
+ person_data = {}
+
+ # Map person fields using the unified field names from the field library
+ person_fields = {
+ "first_name": "person_first_name",
+ "last_name": "person_last_name",
+ "middle_name": "person_middle_name",
+ "suffix": "person_suffix",
+ "organization": "person_organization",
+ "employer": "person_employer",
+ "occupation": "person_occupation"
+ }
+
+ for unified_field, field_name in person_fields.items():
+ value = self._get_field_value(raw_data, field_name)
+ if value:
+ person_data[unified_field] = value
+
+ # If we found any person data, create the person
+ if person_data:
+ # Determine person type
+ person_type = PersonType.UNKNOWN
+
+ # Check for special cases first
+ last_name = person_data.get("last_name", "").strip()
+ first_name = person_data.get("first_name", "").strip()
+
+ # Handle special placeholder cases
+ if last_name.upper() in ["NON-ITEMIZED CONTRIBUTOR", "NON-ITEMIZED", "UNKNOWN", "ANONYMOUS"]:
+ person_type = PersonType.UNKNOWN
+ elif person_data.get("organization"):
+ person_type = PersonType.ORGANIZATION
+ elif first_name and last_name:
+ person_type = PersonType.INDIVIDUAL
+ elif last_name and not first_name:
+ # Only last name - could be organization or incomplete individual
+ person_type = PersonType.UNKNOWN
+
+ # Build address
+ address = self.build_address(raw_data, role.value)
+
+ person = UnifiedPerson(
+ **person_data,
+ person_type=person_type,
+ state_id=self.state_id,
+ address=address
+ )
+
+ entity_type = EntityType.ORGANIZATION if person_type == PersonType.ORGANIZATION else EntityType.PERSON
+ entity_name = person.organization if person.organization else person.full_name
+ entity = self._get_or_create_entity(
+ entity_type=entity_type,
+ name=entity_name,
+ address=address,
+ person=person
+ )
+ if entity:
+ person.entity = entity
+
+ return person
+
+ return None
+
+ def build_address(self, raw_data: Dict[str, Any], entity_role: str) -> Optional[UnifiedAddress]:
+ """Build a unified address from raw data"""
+ address_data = {}
+
+ # Map address fields using the unified field names from the field library
+ address_fields = {
+ "street_1": "address_street_1",
+ "street_2": "address_street_2",
+ "city": "address_city",
+ "state": "address_state",
+ "zip_code": "address_zip",
+ "country": "address_country",
+ "county": "address_county"
+ }
+
+ for unified_field, field_name in address_fields.items():
+ value = self._get_field_value(raw_data, field_name)
+ if value:
+ address_data[unified_field] = value
+
+ # If we found any address data, create or find the address
+ if address_data:
+ # Check if address already exists
+ existing_address = self._find_address_by_fields(address_data)
+ if existing_address:
+ return existing_address
+
+ # Create new address
+ return UnifiedAddress(**address_data)
+
+ return None
+
+ def build_committee(self, raw_data: Dict[str, Any]) -> Optional[UnifiedCommittee]:
+ """Build a unified committee from raw data"""
+ committee_data = {}
+
+ # Map committee fields
+ committee_fields = {
+ "name": "committee_name",
+ "committee_type": "committee_type",
+ "filer_id": "committee_filer_id"
+ }
+
+ for unified_field, field_name in committee_fields.items():
+ value = self._get_field_value(raw_data, field_name)
+ if value:
+ committee_data[unified_field] = value
+
+ # Handle missing committee name - for candidate committees, use candidate name
+ if not committee_data.get("name"):
+ committee_type = committee_data.get("committee_type", "").lower()
+ candidate_name = raw_data.get("Candidate Name", "")
+
+ if "candidate" in committee_type and candidate_name:
+ # For candidate committees, use candidate name as committee name
+ committee_data["name"] = f"Candidate Committee - {candidate_name}"
+ else:
+ # Use filer_id as fallback name if no committee name is available
+ filer_id = committee_data.get("filer_id", "UNKNOWN")
+ committee_data["name"] = f"Committee {filer_id}"
+
+ committee_address = self.build_address(raw_data, "committee")
+
+ # If we found any committee data, create or find the committee
+ if committee_data:
+ # Check if committee already exists by filer_id
+ existing_committee = self._find_committee_by_filer_id(committee_data.get("filer_id"))
+ if existing_committee:
+ if self.state_id and not existing_committee.state_id:
+ existing_committee.state_id = self.state_id
+ if committee_address and not existing_committee.address:
+ existing_committee.address = committee_address
+ if not existing_committee.entity:
+ entity = self._get_or_create_entity(
+ entity_type=EntityType.COMMITTEE,
+ name=existing_committee.name,
+ address=existing_committee.address,
+ committee=existing_committee
+ )
+ if entity:
+ existing_committee.entity = entity
+ return existing_committee
+
+ committee = UnifiedCommittee(**committee_data)
+ committee.state_id = self.state_id
+ if committee_address:
+ committee.address = committee_address
+ entity = self._get_or_create_entity(
+ entity_type=EntityType.COMMITTEE,
+ name=committee.name,
+ address=committee.address,
+ committee=committee
+ )
+ if entity:
+ committee.entity = entity
+
+ return committee
+
+ return None
+
+ def _get_field_value(self, raw_data: Dict[str, Any], unified_field: str) -> Optional[Any]:
+ """Get the value for a unified field from raw data"""
+ # Handle None unified_field
+ if unified_field is None:
+ return None
+
+ # First check if the unified field name is directly in raw_data
+ # This handles cases where GenericFileReader already normalized the field names
+ if unified_field in raw_data:
+ return raw_data[unified_field]
+
+ # Then try direct mapping from state-specific field names
+ for state_field, mapped_field in self.field_mappings.items():
+ if mapped_field == unified_field and state_field in raw_data:
+ return raw_data[state_field]
+
+ # If no direct mapping, try fuzzy matching (but avoid matching other unified field names)
+ for field_name, value in raw_data.items():
+ if field_name is not None:
+ # Skip fuzzy matching on fields that look like unified field names
+ # (they start with common prefixes like 'person_', 'address_', 'committee_')
+ if field_name.startswith(('person_', 'address_', 'committee_', 'transaction_')):
+ continue
+ if self._fuzzy_match(field_name, unified_field):
+ return value
+
+ return None
+
+ def _fuzzy_match(self, state_field: str, unified_field: str) -> bool:
+ """Check if a state field roughly matches a unified field"""
+ try:
+ state_normalized = self._normalize_field_name(state_field)
+ unified_normalized = self._normalize_field_name(unified_field)
+
+ # Exact match after normalization
+ if state_normalized == unified_normalized:
+ return True
+
+ # Check for exact word matches (more precise)
+ state_words = set(state_normalized.split('_'))
+ unified_words = set(unified_normalized.split('_'))
+
+ if state_words and unified_words:
+ # Require at least 2 words to match for better precision
+ overlap = len(state_words.intersection(unified_words))
+ return overlap >= 2
+
+ return False
+ except Exception:
+ return False
+
+ def _find_committee_by_filer_id(self, filer_id: str) -> Optional[UnifiedCommittee]:
+ """Find an existing committee by filer_id"""
+ if not filer_id:
+ return None
+
+ try:
+ from app.states.unified_database import db_manager
+ with db_manager.get_session() as session:
+ stmt = select(UnifiedCommittee).options(
+ selectinload(UnifiedCommittee.address),
+ selectinload(UnifiedCommittee.entity).selectinload(UnifiedEntity.address)
+ ).where(UnifiedCommittee.filer_id == filer_id)
+ return session.exec(stmt).first()
+ except Exception:
+ return None
+
+ def _normalize_entity_name(self, value: Optional[str]) -> str:
+ if not value:
+ return ""
+ normalized = value.strip().lower()
+ normalized = re.sub(r"[^a-z0-9]+", " ", normalized)
+ normalized = re.sub(r"\s+", " ", normalized)
+ return normalized.strip()
+
+ def _find_entity(
+ self,
+ entity_type: EntityType,
+ normalized_name: str,
+ address: Optional[UnifiedAddress]
+ ) -> Optional[UnifiedEntity]:
+ if not normalized_name:
+ return None
+ try:
+ from app.states.unified_database import db_manager
+ with db_manager.get_session() as session:
+ query = select(UnifiedEntity).where(
+ UnifiedEntity.entity_type == entity_type,
+ UnifiedEntity.normalized_name == normalized_name
+ )
+ if address and getattr(address, "id", None):
+ query = query.where(UnifiedEntity.address_id == address.id)
+ return session.exec(query).first()
+ except Exception:
+ return None
+
+ def _get_or_create_entity(
+ self,
+ entity_type: EntityType,
+ name: Optional[str],
+ address: Optional[UnifiedAddress],
+ person: Optional[UnifiedPerson] = None,
+ committee: Optional[UnifiedCommittee] = None
+ ) -> Optional[UnifiedEntity]:
+ normalized_name = self._normalize_entity_name(name)
+ existing = self._find_entity(entity_type, normalized_name, address)
+ if existing:
+ if person and not existing.person:
+ existing.person = person
+ if committee and not existing.committee:
+ existing.committee = committee
+ if address and not existing.address:
+ existing.address = address
+ if self.state_id and not existing.state_id:
+ existing.state_id = self.state_id
+ return existing
+ if not normalized_name and not name:
+ return None
+ entity = UnifiedEntity(
+ entity_type=entity_type,
+ name=name or normalized_name or None,
+ normalized_name=normalized_name or None,
+ address=address,
+ person=person,
+ committee=committee,
+ state_id=self.state_id
+ )
+ return entity
+
+ def _find_campaign(
+ self,
+ normalized_name: str,
+ committee: Optional[UnifiedCommittee],
+ candidate: Optional[UnifiedPerson],
+ election_year: Optional[int]
+ ) -> Optional[UnifiedCampaign]:
+ if not normalized_name:
+ return None
+ try:
+ from app.states.unified_database import db_manager
+ with db_manager.get_session() as session:
+ query = select(UnifiedCampaign).where(
+ UnifiedCampaign.normalized_name == normalized_name
+ )
+ if committee and committee.filer_id:
+ query = query.where(UnifiedCampaign.primary_committee_id == committee.filer_id)
+ if candidate and getattr(candidate, "id", None):
+ query = query.where(UnifiedCampaign.candidate_person_id == candidate.id)
+ if election_year:
+ query = query.where(UnifiedCampaign.election_year == election_year)
+ return session.exec(query).first()
+ except Exception:
+ return None
+
+ def build_campaign(
+ self,
+ raw_data: Dict[str, Any],
+ committee: Optional[UnifiedCommittee],
+ candidate: Optional[UnifiedPerson],
+ transaction: Optional[UnifiedTransaction]
+ ) -> Optional[UnifiedCampaign]:
+ campaign_name = self._get_field_value(raw_data, "campaign_name")
+ if not campaign_name:
+ campaign_name = candidate.full_name if candidate else None
+ if not campaign_name and committee:
+ campaign_name = committee.name
+ normalized_name = self._normalize_entity_name(campaign_name)
+ if not normalized_name:
+ return None
+ transaction_date = transaction.transaction_date if transaction else None
+ if not transaction_date:
+ transaction_date = self._parse_date(self._get_field_value(raw_data, "transaction_date"))
+ election_year = transaction_date.year if isinstance(transaction_date, date) else None
+ campaign = self._find_campaign(normalized_name, committee, candidate, election_year)
+ if campaign:
+ return campaign
+ campaign = UnifiedCampaign(
+ name=campaign_name,
+ normalized_name=normalized_name,
+ election_year=election_year,
+ office_sought=self._get_field_value(raw_data, "office_sought"),
+ district=self._get_field_value(raw_data, "district_info"),
+ candidate=candidate,
+ primary_committee=committee,
+ state_id=self.state_id
+ )
+ if candidate and candidate.entity:
+ campaign.entities.append(
+ UnifiedCampaignEntity(
+ campaign=campaign,
+ entity=candidate.entity,
+ state_id=self.state_id,
+ role=CampaignRole.CANDIDATE,
+ is_primary=True
+ )
+ )
+ if committee and committee.entity:
+ campaign.entities.append(
+ UnifiedCampaignEntity(
+ campaign=campaign,
+ entity=committee.entity,
+ state_id=self.state_id,
+ role=CampaignRole.COMMITTEE,
+ is_primary=True
+ )
+ )
+ return campaign
+
+ def _find_address_by_fields(self, address_data: Dict[str, Any]) -> Optional[UnifiedAddress]:
+ """Find an existing address by key fields"""
+ if not address_data:
+ return None
+
+ try:
+ from app.states.unified_database import db_manager
+ with db_manager.get_session() as session:
+ from sqlalchemy import text
+
+ # Build query based on available fields
+ conditions = []
+ params = {}
+
+ if address_data.get("street_1"):
+ conditions.append("street_1 = :street_1")
+ params["street_1"] = address_data["street_1"]
+
+ if address_data.get("city"):
+ conditions.append("city = :city")
+ params["city"] = address_data["city"]
+
+ if address_data.get("state"):
+ conditions.append("state = :state")
+ params["state"] = address_data["state"]
+
+ if address_data.get("zip_code"):
+ conditions.append("zip_code = :zip_code")
+ params["zip_code"] = address_data["zip_code"]
+
+ # Need at least street_1 and city to find a match
+ if len(conditions) >= 2:
+ query = f"SELECT * FROM unified_addresses WHERE {' AND '.join(conditions)} LIMIT 1"
+ result = session.exec(text(query), params).first()
+ if result:
+ return UnifiedAddress(**dict(result))
+
+ return None
+ except Exception:
+ return None
+
+ def _normalize_field_name(self, field_name: str) -> str:
+ """Normalize a field name for comparison"""
+ if field_name is None:
+ return ""
+ try:
+ normalized = str(field_name).lower()
+ normalized = re.sub(r'[^a-z0-9]', '_', normalized)
+ normalized = re.sub(r'_+', '_', normalized)
+ return normalized.strip('_')
+ except Exception:
+ return ""
+
+ def _parse_amount(self, value: Any) -> Optional[Decimal]:
+ """Parse an amount value to Decimal"""
+ if value is None:
+ return None
+
+ try:
+ # Remove currency symbols and commas
+ if isinstance(value, str):
+ value = re.sub(r'[^\d.-]', '', value)
+
+ return Decimal(str(value))
+ except (ValueError, TypeError):
+ return None
+
+ def _parse_date(self, value: Any) -> Optional[date]:
+ """Parse a date value"""
+ if value is None:
+ return None
+
+ try:
+ if isinstance(value, str):
+ # Try common date formats
+ for fmt in ['%Y-%m-%d', '%m/%d/%Y', '%m-%d-%Y', '%Y/%m/%d']:
+ try:
+ return datetime.strptime(value, fmt).date()
+ except ValueError:
+ continue
+ elif isinstance(value, (date, datetime)):
+ return value.date() if isinstance(value, datetime) else value
+
+ return None
+ except (ValueError, TypeError):
+ return None
+
+ def _parse_boolean(self, value: Any) -> bool:
+ """Parse a boolean value"""
+ if value is None:
+ return False
+
+ if isinstance(value, bool):
+ return value
+
+ if isinstance(value, str):
+ return value.lower() in ['true', 'yes', 'y', '1', 't']
+
+ if isinstance(value, (int, float)):
+ return bool(value)
+
+ return False
+
+ def _determine_transaction_type(self, raw_data: Dict[str, Any]) -> TransactionType:
+ """Determine the transaction type from raw data"""
+ # Check for explicit transaction type
+ type_value = self._get_field_value(raw_data, "transaction_type")
+ if type_value:
+ type_str = str(type_value).lower()
+ type_synonyms = {
+ "monetary": TransactionType.CONTRIBUTION,
+ "money": TransactionType.CONTRIBUTION,
+ "in-kind": TransactionType.CONTRIBUTION,
+ "inkind": TransactionType.CONTRIBUTION,
+ "loan": TransactionType.LOAN,
+ "expenditure": TransactionType.EXPENDITURE,
+ "expense": TransactionType.EXPENDITURE,
+ }
+ if type_str in type_synonyms:
+ return type_synonyms[type_str]
+ for transaction_type in TransactionType:
+ if transaction_type.value in type_str:
+ return transaction_type
+
+ # Infer from field names
+ field_names = [k.lower() for k in raw_data.keys()]
+
+ if any('contribution' in name for name in field_names):
+ return TransactionType.CONTRIBUTION
+ elif any('expenditure' in name for name in field_names):
+ return TransactionType.EXPENDITURE
+ elif any('loan' in name for name in field_names):
+ return TransactionType.LOAN
+ elif any('pledge' in name for name in field_names):
+ return TransactionType.PLEDGE
+ elif any('refund' in name for name in field_names):
+ return TransactionType.REFUND
+ elif any('transfer' in name for name in field_names):
+ return TransactionType.TRANSFER
+
+ return TransactionType.OTHER
+
+ def _json_default(self, obj: Any) -> Any:
+ if isinstance(obj, (datetime, date)):
+ return obj.isoformat()
+ return str(obj)
+
+
+class UnifiedSQLDataProcessor:
+ """
+ High-level processor for converting state-specific data to SQLModel instances.
+ """
+
+ def __init__(self):
+ self.builders = {}
+
+ def get_builder(
+ self,
+ state: str,
+ state_id: Optional[int] = None,
+ state_code: Optional[str] = None
+ ) -> UnifiedSQLModelBuilder:
+ """Get or create a model builder for a specific state"""
+ if state not in self.builders:
+ self.builders[state] = UnifiedSQLModelBuilder(state, state_id, state_code)
+ builder = self.builders[state]
+ builder.state_id = state_id
+ builder.state_code = state_code
+ return builder
+
+ def process_record(
+ self,
+ raw_data: Dict[str, Any],
+ state: str,
+ state_id: Optional[int] = None,
+ state_code: Optional[str] = None
+ ) -> UnifiedTransaction:
+ """
+ Process a single record from any state into a unified transaction.
+
+ Args:
+ raw_data: Raw data dictionary from the state
+ state: State identifier (e.g., 'texas', 'oklahoma')
+
+ Returns:
+ UnifiedTransaction object
+ """
+ builder = self.get_builder(state, state_id=state_id, state_code=state_code)
+
+ # Build related entities first (committee, persons, addresses)
+ contributor = builder.build_person(raw_data, PersonRole.CONTRIBUTOR)
+ recipient = builder.build_person(raw_data, PersonRole.RECIPIENT)
+ payee = builder.build_person(raw_data, PersonRole.PAYEE)
+ candidate = builder.build_person(raw_data, PersonRole.CANDIDATE)
+ committee = builder.build_committee(raw_data)
+
+ # Build the transaction
+ transaction = builder.build_transaction(raw_data)
+
+ # Build campaign if possible
+ campaign = builder.build_campaign(raw_data, committee, candidate, transaction)
+ if campaign:
+ transaction.campaign = campaign
+
+ # Set committee relationship
+ if committee:
+ transaction.committee_id = committee.filer_id
+ transaction.committee = committee
+
+ # Create transaction-person relationships
+ if contributor:
+ tx_person = UnifiedTransactionPerson(
+ transaction=transaction,
+ person=contributor,
+ entity=contributor.entity,
+ state_id=builder.state_id,
+ role=PersonRole.CONTRIBUTOR
+ )
+ transaction.persons.append(tx_person)
+
+ if recipient:
+ tx_person = UnifiedTransactionPerson(
+ transaction=transaction,
+ person=recipient,
+ entity=recipient.entity,
+ state_id=builder.state_id,
+ role=PersonRole.RECIPIENT
+ )
+ transaction.persons.append(tx_person)
+
+ if payee:
+ tx_person = UnifiedTransactionPerson(
+ transaction=transaction,
+ person=payee,
+ entity=payee.entity,
+ state_id=builder.state_id,
+ role=PersonRole.PAYEE
+ )
+ transaction.persons.append(tx_person)
+
+ if candidate:
+ tx_person = UnifiedTransactionPerson(
+ transaction=transaction,
+ person=candidate,
+ entity=candidate.entity,
+ state_id=builder.state_id,
+ role=PersonRole.CANDIDATE
+ )
+ transaction.persons.append(tx_person)
+
+ # Create specialized financial records
+ contributor_entity = contributor.entity if contributor and contributor.entity else None
+ recipient_entity = None
+ if committee and committee.entity:
+ recipient_entity = committee.entity
+ elif recipient and recipient.entity:
+ recipient_entity = recipient.entity
+
+ if transaction.transaction_type == TransactionType.CONTRIBUTION:
+ if not contributor_entity and committee and committee.entity:
+ contributor_entity = committee.entity
+ if not recipient_entity and recipient and recipient.entity:
+ recipient_entity = recipient.entity
+ if contributor_entity and recipient_entity:
+ contribution = UnifiedContribution(
+ transaction=transaction,
+ contributor=contributor_entity,
+ recipient=recipient_entity,
+ amount=transaction.amount,
+ receipt_date=transaction.transaction_date,
+ contribution_type=builder._get_field_value(raw_data, "contribution_type"),
+ description=transaction.description,
+ state_id=builder.state_id
+ )
+ transaction.contribution = contribution
+
+ if transaction.transaction_type == TransactionType.LOAN:
+ if not contributor_entity and recipient_entity:
+ contributor_entity = recipient_entity
+ if contributor_entity and recipient_entity:
+ loan = UnifiedLoan(
+ transaction=transaction,
+ lender=contributor_entity,
+ borrower=recipient_entity,
+ amount=transaction.amount,
+ loan_date=transaction.transaction_date,
+ due_date=builder._parse_date(builder._get_field_value(raw_data, "loan_due_date")),
+ interest_rate=builder._parse_amount(builder._get_field_value(raw_data, "loan_interest_rate")),
+ collateral=builder._get_field_value(raw_data, "loan_collateral"),
+ state_id=builder.state_id
+ )
+ transaction.loan = loan
+
+ return transaction
+
+ def process_records(
+ self,
+ records: List[Dict[str, Any]],
+ state: str,
+ state_id: Optional[int] = None,
+ state_code: Optional[str] = None
+ ) -> List[UnifiedTransaction]:
+ """
+ Process multiple records from any state into unified transactions.
+
+ Args:
+ records: List of raw data dictionaries
+ state: State identifier
+
+ Returns:
+ List of UnifiedTransaction objects
+ """
+ return [self.process_record(record, state, state_id=state_id, state_code=state_code) for record in records]
+
+
+# Global processor instance
+unified_sql_processor = UnifiedSQLDataProcessor()
\ No newline at end of file
diff --git a/app/tests/test_ingest_hypothesis.py b/app/tests/test_ingest_hypothesis.py
new file mode 100644
index 0000000..955c134
--- /dev/null
+++ b/app/tests/test_ingest_hypothesis.py
@@ -0,0 +1,224 @@
+from __future__ import annotations
+
+import csv
+import datetime as dt
+from decimal import Decimal
+from pathlib import Path
+from typing import Dict, List, Tuple
+
+import sys
+import importlib
+
+sys.modules.setdefault("logger", importlib.import_module("app.logger"))
+sys.modules.setdefault("states", importlib.import_module("app.states"))
+sys.modules.setdefault("funcs", importlib.import_module("app.funcs"))
+
+import polars as pl
+import pytest
+from hypothesis import given, settings, strategies as st, HealthCheck
+
+from app.ingest.file_reader import FieldSpec, FieldType, GenericFileReader, SchemaDefinition
+from app.states.texas import TEXAS_CONFIGURATION, TexasDownloader
+from app.states.texas.texas_downloader import TECDownloader
+from app.abcs.abc_state_config import StateConfig
+
+
+def _build_test_schema() -> Tuple[SchemaDefinition, List[str]]:
+ headers = [
+ "Transaction ID",
+ "Amount",
+ "Transaction Date",
+ "Committee Name",
+ "Committee Filer ID",
+ ]
+ schema = SchemaDefinition(
+ name="test_schema",
+ fields={
+ "transaction_id": FieldSpec(
+ name="transaction_id",
+ aliases=("transaction_id", "Transaction ID"),
+ field_type=FieldType.IDENTIFIER,
+ ),
+ "amount": FieldSpec(
+ name="amount",
+ aliases=("Amount",),
+ field_type=FieldType.DECIMAL,
+ ),
+ "transaction_date": FieldSpec(
+ name="transaction_date",
+ aliases=("Transaction Date",),
+ field_type=FieldType.DATE,
+ ),
+ "committee_name": FieldSpec(
+ name="committee_name",
+ aliases=("Committee Name",),
+ field_type=FieldType.STRING,
+ ),
+ "committee_filer_id": FieldSpec(
+ name="committee_filer_id",
+ aliases=("Committee Filer ID", "Org ID"),
+ field_type=FieldType.STRING,
+ ),
+ },
+ )
+ return schema, headers
+
+
+def _expected_records_from_schema(
+ schema: SchemaDefinition,
+ headers: List[str],
+ raw_records: List[Dict[str, str]],
+) -> List[Dict[str, object]]:
+ mapping = schema.map_headers(headers)
+ converted: List[Dict[str, object]] = []
+ for record in raw_records:
+ converted_record: Dict[str, object] = {}
+ for header in headers:
+ canonical = mapping[header]
+ converted_record[canonical] = schema.fields[canonical].convert(record[header])
+ converted.append(converted_record)
+ return converted
+
+
+record_strategy = st.fixed_dictionaries(
+ {
+ "Transaction ID": st.text(min_size=1, max_size=12),
+ "Amount": st.decimals(
+ min_value=Decimal("-100000"),
+ max_value=Decimal("100000"),
+ places=2,
+ allow_nan=False,
+ allow_infinity=False,
+ ).map(lambda value: f"{value:f}"),
+ "Transaction Date": st.dates(min_value=dt.date(2000, 1, 1), max_value=dt.date(2030, 12, 31)).map(
+ lambda value: value.strftime("%Y-%m-%d")
+ ),
+ "Committee Name": st.text(min_size=1, max_size=40),
+ "Committee Filer ID": st.text(min_size=1, max_size=20),
+ }
+)
+
+
+@given(st.lists(record_strategy, min_size=1, max_size=5))
+@settings(max_examples=25, suppress_health_check=[HealthCheck.function_scoped_fixture])
+def test_generic_file_reader_handles_csv(tmp_path: Path, records: List[Dict[str, str]]) -> None:
+ schema, headers = _build_test_schema()
+ reader = GenericFileReader(schema=schema, add_metadata=True, strict=True)
+
+ file_path = tmp_path / "sample.csv"
+ with file_path.open("w", encoding="utf-8", newline="") as handle:
+ writer = csv.DictWriter(handle, fieldnames=headers)
+ writer.writeheader()
+ writer.writerows(records)
+
+ expected = _expected_records_from_schema(schema, headers, records)
+ output = list(reader.read_records(file_path))
+
+ assert len(output) == len(expected)
+ for produced, expect in zip(output, expected, strict=True):
+ for key, value in expect.items():
+ assert produced[key] == value
+ assert produced["file_origin"] == file_path.stem
+ assert produced["download_date"] == dt.datetime.fromtimestamp(file_path.stat().st_mtime).strftime("%Y-%m-%d")
+
+
+@given(st.lists(record_strategy, min_size=1, max_size=5))
+@settings(max_examples=25, suppress_health_check=[HealthCheck.function_scoped_fixture])
+def test_generic_file_reader_handles_parquet(tmp_path: Path, records: List[Dict[str, str]]) -> None:
+ schema, headers = _build_test_schema()
+ reader = GenericFileReader(schema=schema, add_metadata=True, strict=True)
+
+ data_columns = {header: [record[header] for record in records] for header in headers}
+ df = pl.DataFrame(data_columns)
+ file_path = tmp_path / "sample.parquet"
+ df.write_parquet(file_path)
+
+ expected = _expected_records_from_schema(schema, headers, records)
+ output = list(reader.read_records(file_path))
+
+ assert len(output) == len(expected)
+ for produced, expect in zip(output, expected, strict=True):
+ for key, value in expect.items():
+ assert produced[key] == value
+ assert produced["file_origin"] == file_path.stem
+ assert produced["download_date"] == dt.datetime.fromtimestamp(file_path.stat().st_mtime).strftime("%Y-%m-%d")
+
+
+file_columns = ["col_a", "col_b", "col_c", "col_d"]
+
+
+@st.composite
+def texas_category_files(draw: st.DrawFn) -> Dict[str, List[Tuple[List[str], List[Dict[str, str]]]]]:
+ categories = draw(
+ st.sets(st.sampled_from(["contributions", "expenses", "filers"]), min_size=1, max_size=2)
+ )
+ result: Dict[str, List[Tuple[List[str], List[Dict[str, str]]]]] = {}
+ for category in categories:
+ file_count = draw(st.integers(min_value=1, max_value=3))
+ files: List[Tuple[List[str], List[Dict[str, str]]]] = []
+ for _ in range(file_count):
+ columns = draw(
+ st.sets(st.sampled_from(file_columns), min_size=1, max_size=len(file_columns))
+ )
+ column_list = list(columns)
+ row_strategy = st.fixed_dictionaries({col: st.text(min_size=1, max_size=10) for col in column_list})
+ rows = draw(st.lists(row_strategy, min_size=1, max_size=3))
+ files.append((column_list, rows))
+ result[category] = files
+ return result
+
+
+@given(texas_category_files())
+@settings(max_examples=10, suppress_health_check=[HealthCheck.function_scoped_fixture])
+def test_texas_consolidate_files(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, category_files):
+ monkeypatch.setattr(StateConfig, "TEMP_FOLDER", property(lambda self: tmp_path))
+ tmp_path.mkdir(parents=True, exist_ok=True)
+
+ # Clean up any leftover parquet files from previous Hypothesis examples
+ # (tmp_path is reused between examples, so we need to start fresh)
+ for existing_file in tmp_path.glob("*.parquet"):
+ existing_file.unlink()
+
+ # Ensure downloader is initialised with patched temp folder
+ TECDownloader(config=TEXAS_CONFIGURATION)
+
+ original_files: Dict[str, List[Path]] = {}
+ expected_columns: Dict[str, set[str]] = {}
+
+ for category, file_entries in category_files.items():
+ original_files[category] = []
+ expected_columns[category] = set()
+ for index, (columns, rows) in enumerate(file_entries, start=1):
+ data = {col: [row[col] for row in rows] for col in columns}
+ if not data:
+ data = {"col_a": ["placeholder"]}
+ columns = ["col_a"]
+ df = pl.DataFrame(data)
+ file_path = tmp_path / f"{category}_{index:02d}.parquet"
+ df.write_parquet(file_path)
+ original_files[category].append(file_path)
+ expected_columns[category].update(columns)
+
+ if not category_files:
+ pytest.skip("No category files generated")
+
+ TECDownloader.consolidate_files()
+
+ for files in original_files.values():
+ for file_path in files:
+ assert not file_path.exists(), "Original parquet files should be removed after consolidation"
+
+ for category, files in category_files.items():
+ consolidated = list(tmp_path.glob(f"{category}_*.parquet"))
+ assert len(consolidated) == 1, f"Expected a single consolidated file for {category}"
+
+ df = pl.read_parquet(consolidated[0])
+ expected_cols = expected_columns[category] | {"file_origin"}
+ assert expected_cols.issubset(set(df.columns)), "Consolidated file missing expected columns"
+
+ origins = set(df["file_origin"].to_list())
+ expected_origins = {
+ Path(file_path).stem for file_path in original_files[category]
+ }
+ assert expected_origins.issubset(origins), "Consolidated data missing file_origin markers"
+
diff --git a/app/tests/test_validation_class.py b/app/tests/test_validation_class.py
index 0c7935e..b385e39 100644
--- a/app/tests/test_validation_class.py
+++ b/app/tests/test_validation_class.py
@@ -1,14 +1,19 @@
from hypothesis import given, strategies as st
-from pydantic import BaseModel
-from funcs import StateFileValidation
+from sqlmodel import SQLModel, Field
+from typing import Optional
+from app.abcs.abc_validation import StateFileValidation
-class MockModel(BaseModel):
+
+class MockModel(SQLModel):
+ """Mock model for testing validation."""
+ id: Optional[str] = Field(default=None)
field: str
+
@given(st.dictionaries(st.text(), st.text()))
def test_validate_record(record):
- validator = StateFileValidation()
- result = validator.validate_record(record, MockModel)
+ validator = StateFileValidation(validator_to_use=MockModel)
+ result = validator.validate_record(record)
assert result[0] in ['passed', 'failed']
if result[0] == 'passed':
assert isinstance(result[1], MockModel)
@@ -16,10 +21,16 @@ def test_validate_record(record):
assert isinstance(result[1], dict)
assert 'error' in result[1]
+
@given(st.lists(st.dictionaries(st.text(), st.text())))
def test_validate(records):
- validator = StateFileValidation()
- result = validator.validate(iter(records), MockModel)
- assert isinstance(result, StateFileValidation)
- assert all(isinstance(record, MockModel) for record in result.passed)
- assert all('error' in record for record in result.failed)
\ No newline at end of file
+ validator = StateFileValidation(validator_to_use=MockModel)
+ results = list(validator.validate(iter(records)))
+ # Validate returns a generator of (status, record) tuples
+ for status, record in results:
+ assert status in ['passed', 'failed']
+ if status == 'passed':
+ assert isinstance(record, MockModel)
+ else:
+ assert isinstance(record, dict)
+ assert 'error' in record
\ No newline at end of file
diff --git a/app/workflows/__init__.py b/app/workflows/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/app/workflows/texas_download.py b/app/workflows/texas_download.py
deleted file mode 100644
index 9bfccca..0000000
--- a/app/workflows/texas_download.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# #! /usr/bin/env python3
-# from app.states.texas import TECFileDownloader, TECCategory
-
-# download = TECFileDownloader()
-# download.download()
-
-# filers = TECCategory("filers")
-# contributions = TECCategory("contributions")
-# expenses = TECCategory("expenses")
-# reports = TECCategory("reports")
-
-# filers.read()
-# filers.validate()
-# expenses.write_to_csv(
-# records=filers.validation.passed,
-# validation_status="passed"
-# ).write_to_csv(
-# records=filers.validation.failed,
-# validation_status="failed"
-# )
-
-# expenses.read()
-# expenses.validate()
-# expenses.write_to_csv(
-# records=expenses.validation.passed,
-# validation_status="passed"
-# ).write_to_csv(
-# records=expenses.validation.failed,
-# validation_status='failed'
-# )
-
-
-# contributions.read()
-# contributions.validate()
-# contributions.write_to_csv(
-# records=contributions.validation.passed,
-# validation_status="passed"
-# ).write_to_csv(
-# records=contributions.validation.failed,
-# validation_status="failed"
-# )
-
-# reports.read()
-# reports.validate()
-# reports.write_to_csv(
-# records=reports.validation.passed,
-# validation_status="passed"
-# ).write_to_csv(
-# records=reports.validation.failed,
-# validation_status="failed"
-# )
\ No newline at end of file
diff --git a/poetry.lock b/poetry.lock
deleted file mode 100644
index e355cec..0000000
--- a/poetry.lock
+++ /dev/null
@@ -1,3525 +0,0 @@
-# This file is automatically @generated by Poetry 2.0.0 and should not be changed by hand.
-
-[[package]]
-name = "aiocsv"
-version = "1.3.2"
-description = ""
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "aiocsv-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f1996ac960c196aecc7d22e701c273a2676d13bf25575af78d4e515fc724ef20"},
- {file = "aiocsv-1.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd688dbc1723f2b3a433e42041ceb9c9a8fe70f547d35b2da4ea31e4c78efc5"},
- {file = "aiocsv-1.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2f921828e386bb6945ed7d268e1524349ea506974ae35b9772542714f0ef3efd"},
- {file = "aiocsv-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:198c905ec29897c347bf9b18eb410af13d7ac94a03d4b673e64eaa5f4557c913"},
- {file = "aiocsv-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7c25ad8afbf79d28ec3320e608c7f38d3eff93e96ebbbd2430ae8fa0f6e7631b"},
- {file = "aiocsv-1.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4004569bff39cb839a335b8f673a6496fd5b0b6e074c7adb7aee4a0c8379ea22"},
- {file = "aiocsv-1.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e9c98f8d760add0b52274523baa4b81dde4a3c96f79222d3d4d6965bac9cdcbd"},
- {file = "aiocsv-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:9edb342b0d7dba94d8976f46ba5814b8d8704d67a45e1b8a6579ab0ba04309e7"},
- {file = "aiocsv-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:db943a463cb6828ba81bd7c083c6dd4c96edac4880b8638af81798d694405e26"},
- {file = "aiocsv-1.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10780033a1ed3da825f2256449d177b7106b3c5a2d64bd683eab37f1fdee1e36"},
- {file = "aiocsv-1.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8c7aee34ceff4eaa654f01acbdba648297f5f9532dc7a23fac62defec28e0fe5"},
- {file = "aiocsv-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:59b0ea2d9e73539d4c1276467c4457acafa995717ea1b5340f3737f2cde2f71a"},
- {file = "aiocsv-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1c7d1700b8de16f25b24bfcebfc2b0817b29ce413f6961f08d5aa95bf00a6862"},
- {file = "aiocsv-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9aa9629c8a1c07e9d02c7d80d84f021f7994fe30d021f13ac963e251b54724ef"},
- {file = "aiocsv-1.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d125286f971e0038e8872f31b6f1cd6184b9c508445e6633f075d8b543b444bc"},
- {file = "aiocsv-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:b7220b4a6545abbbb6ab8fe7d4880aa8334f156b872b83641b898df2da9a6484"},
- {file = "aiocsv-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfd2ef214b6d7944991f62ac593ad45bdaf0ed9f5741c8441ee7de148e512fe7"},
- {file = "aiocsv-1.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c3e5a817b3489283cc1fd80f8ba56431d552dc9ea4e539c0069d8d56bf0fba7"},
- {file = "aiocsv-1.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2ef14fa0839394ecc52274ea538b12b7b2e756eb0f514902a8fb391612161079"},
- {file = "aiocsv-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:17341fa3b90414adda6cd8c79efc3c1a3f58a4dc72c2053c4532e82b61ef9f5e"},
- {file = "aiocsv-1.3.2.tar.gz", hash = "sha256:806d93465c7808d58d3ff0d2bba270fb4d04b934be6a1e95d0834c50a510910e"},
-]
-
-[package.dependencies]
-typing_extensions = "*"
-
-[[package]]
-name = "aiofiles"
-version = "24.1.0"
-description = "File support for asyncio."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"},
- {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"},
-]
-
-[[package]]
-name = "aiojobs"
-version = "1.3.0"
-description = "Job scheduler for managing background tasks (asyncio)"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "aiojobs-1.3.0-py3-none-any.whl", hash = "sha256:1f9f36179b6d50796c4fc9e8851fdae10f38d6c2f64412a91e2c4eff73054ce0"},
- {file = "aiojobs-1.3.0.tar.gz", hash = "sha256:03074c884b3dc388b8d798c0de24ec17d72b2799018497fda8062c0431a494b5"},
-]
-
-[package.extras]
-aiohttp = ["aiohttp (>=3.9.0)"]
-
-[[package]]
-name = "annotated-types"
-version = "0.7.0"
-description = "Reusable constraint types to use with typing.Annotated"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
- {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
-]
-
-[[package]]
-name = "anyio"
-version = "4.8.0"
-description = "High level compatibility layer for multiple asynchronous event loop implementations"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"},
- {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"},
-]
-
-[package.dependencies]
-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)", "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"
-groups = ["main"]
-markers = "platform_system == \"Darwin\""
-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"
-groups = ["main"]
-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"
-groups = ["main"]
-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"
-groups = ["main"]
-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"
-groups = ["main"]
-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"
-groups = ["main"]
-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]]
-name = "attrs"
-version = "24.3.0"
-description = "Classes Without Boilerplate"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"},
- {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"},
-]
-
-[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-uv", "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 = "babel"
-version = "2.16.0"
-description = "Internationalization utilities"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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"
-groups = ["main"]
-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 = "bleach"
-version = "6.2.0"
-description = "An easy safelist-based HTML-sanitizing tool."
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-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]
-tinycss2 = {version = ">=1.1.0,<1.5", optional = true, markers = "extra == \"css\""}
-webencodings = "*"
-
-[package.extras]
-css = ["tinycss2 (>=1.1.0,<1.5)"]
-
-[[package]]
-name = "certifi"
-version = "2024.12.14"
-description = "Python package for providing Mozilla's CA Bundle."
-optional = false
-python-versions = ">=3.6"
-groups = ["main"]
-files = [
- {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"},
- {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"},
-]
-
-[[package]]
-name = "cffi"
-version = "1.17.1"
-description = "Foreign Function Interface for Python calling C code."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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.1"
-description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"},
- {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"},
- {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"},
-]
-
-[[package]]
-name = "click"
-version = "8.1.8"
-description = "Composable command line interface toolkit"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-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"
-groups = ["main"]
-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 = "comm"
-version = "0.2.2"
-description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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 = "debugpy"
-version = "1.8.11"
-description = "An implementation of the Debug Adapter Protocol for Python"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "debugpy-1.8.11-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:2b26fefc4e31ff85593d68b9022e35e8925714a10ab4858fb1b577a8a48cb8cd"},
- {file = "debugpy-1.8.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61bc8b3b265e6949855300e84dc93d02d7a3a637f2aec6d382afd4ceb9120c9f"},
- {file = "debugpy-1.8.11-cp310-cp310-win32.whl", hash = "sha256:c928bbf47f65288574b78518449edaa46c82572d340e2750889bbf8cd92f3737"},
- {file = "debugpy-1.8.11-cp310-cp310-win_amd64.whl", hash = "sha256:8da1db4ca4f22583e834dcabdc7832e56fe16275253ee53ba66627b86e304da1"},
- {file = "debugpy-1.8.11-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:85de8474ad53ad546ff1c7c7c89230db215b9b8a02754d41cb5a76f70d0be296"},
- {file = "debugpy-1.8.11-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ffc382e4afa4aee367bf413f55ed17bd91b191dcaf979890af239dda435f2a1"},
- {file = "debugpy-1.8.11-cp311-cp311-win32.whl", hash = "sha256:40499a9979c55f72f4eb2fc38695419546b62594f8af194b879d2a18439c97a9"},
- {file = "debugpy-1.8.11-cp311-cp311-win_amd64.whl", hash = "sha256:987bce16e86efa86f747d5151c54e91b3c1e36acc03ce1ddb50f9d09d16ded0e"},
- {file = "debugpy-1.8.11-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:84e511a7545d11683d32cdb8f809ef63fc17ea2a00455cc62d0a4dbb4ed1c308"},
- {file = "debugpy-1.8.11-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce291a5aca4985d82875d6779f61375e959208cdf09fcec40001e65fb0a54768"},
- {file = "debugpy-1.8.11-cp312-cp312-win32.whl", hash = "sha256:28e45b3f827d3bf2592f3cf7ae63282e859f3259db44ed2b129093ca0ac7940b"},
- {file = "debugpy-1.8.11-cp312-cp312-win_amd64.whl", hash = "sha256:44b1b8e6253bceada11f714acf4309ffb98bfa9ac55e4fce14f9e5d4484287a1"},
- {file = "debugpy-1.8.11-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:8988f7163e4381b0da7696f37eec7aca19deb02e500245df68a7159739bbd0d3"},
- {file = "debugpy-1.8.11-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c1f6a173d1140e557347419767d2b14ac1c9cd847e0b4c5444c7f3144697e4e"},
- {file = "debugpy-1.8.11-cp313-cp313-win32.whl", hash = "sha256:bb3b15e25891f38da3ca0740271e63ab9db61f41d4d8541745cfc1824252cb28"},
- {file = "debugpy-1.8.11-cp313-cp313-win_amd64.whl", hash = "sha256:d8768edcbeb34da9e11bcb8b5c2e0958d25218df7a6e56adf415ef262cd7b6d1"},
- {file = "debugpy-1.8.11-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:ad7efe588c8f5cf940f40c3de0cd683cc5b76819446abaa50dc0829a30c094db"},
- {file = "debugpy-1.8.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:189058d03a40103a57144752652b3ab08ff02b7595d0ce1f651b9acc3a3a35a0"},
- {file = "debugpy-1.8.11-cp38-cp38-win32.whl", hash = "sha256:32db46ba45849daed7ccf3f2e26f7a386867b077f39b2a974bb5c4c2c3b0a280"},
- {file = "debugpy-1.8.11-cp38-cp38-win_amd64.whl", hash = "sha256:116bf8342062246ca749013df4f6ea106f23bc159305843491f64672a55af2e5"},
- {file = "debugpy-1.8.11-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:654130ca6ad5de73d978057eaf9e582244ff72d4574b3e106fb8d3d2a0d32458"},
- {file = "debugpy-1.8.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23dc34c5e03b0212fa3c49a874df2b8b1b8fda95160bd79c01eb3ab51ea8d851"},
- {file = "debugpy-1.8.11-cp39-cp39-win32.whl", hash = "sha256:52d8a3166c9f2815bfae05f386114b0b2d274456980d41f320299a8d9a5615a7"},
- {file = "debugpy-1.8.11-cp39-cp39-win_amd64.whl", hash = "sha256:52c3cf9ecda273a19cc092961ee34eb9ba8687d67ba34cc7b79a521c1c64c4c0"},
- {file = "debugpy-1.8.11-py2.py3-none-any.whl", hash = "sha256:0e22f846f4211383e6a416d04b4c13ed174d24cc5d43f5fd52e7821d0ebc8920"},
- {file = "debugpy-1.8.11.tar.gz", hash = "sha256:6ad2688b69235c43b020e04fecccdf6a96c8943ca9c2fb340b8adc103c655e57"},
-]
-
-[[package]]
-name = "decorator"
-version = "5.1.1"
-description = "Decorators for Humans"
-optional = false
-python-versions = ">=3.5"
-groups = ["main"]
-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"
-description = "XML bomb protection for Python stdlib modules"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-groups = ["main"]
-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 = "doublemetaphone"
-version = "1.1"
-description = "Python wrapper for C++ Double Metaphone"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "DoubleMetaphone-1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b6d29cf7aa3969be0b6e74244edc52f29ccb47d8d7e5fc9265ca398d3774deb8"},
- {file = "DoubleMetaphone-1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ea3ce737506b91b6e2ed46f41e29ca11a188cdfd5f54606d60b8e86e09bd81a1"},
- {file = "DoubleMetaphone-1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d1ec804224d2361a5ef2b408177ec65e4a7a49a28d934e3c919ee6487763566e"},
- {file = "DoubleMetaphone-1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e35454c366b609f365ac15727b9e3a288cd0373aa30603fda7675016c032dca"},
- {file = "DoubleMetaphone-1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:47f91b6d54b75e41a0e4c4ed6b4dbf0b64bd8c08239cf5d4dd75f76d1c6aae30"},
- {file = "DoubleMetaphone-1.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:51cbe1ec26498fd631f6e3b599ba2473a072541461b391ad78ae5b255de27aab"},
- {file = "DoubleMetaphone-1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:557cc9b21f4e2257e4f404859a015ef8ed11713cdffad3446d919d6963e0f8a8"},
- {file = "DoubleMetaphone-1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4cfe99954df4aa6895349781734a207513219520af16aafd46446877d66ae558"},
- {file = "DoubleMetaphone-1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a79ae04e709ef33a408a1d43170695980414abede4863526c42d0047bb1538eb"},
- {file = "DoubleMetaphone-1.1-cp310-cp310-win32.whl", hash = "sha256:77029daa26bc22c2dd8d8928eb5e7ded90f1bf70519016b73de3751bdbc55e9e"},
- {file = "DoubleMetaphone-1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77e69bd9fee97f26c7d5ce5c75fbc981a3fbde8876591721e70139a12958c0b9"},
- {file = "DoubleMetaphone-1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:aa4fba139bb8ddb3b98ded4dccbf1416202bfa41a716488c4afb0c98555296f6"},
- {file = "DoubleMetaphone-1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07df5226d0e7e25150f6b9ca8af66a1228684d1b8e627ab95ce217e5d02af59"},
- {file = "DoubleMetaphone-1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6cc74777c9e9b8eba0c15181f17f2c1854ae838abe61c3fafe22c28702b999d7"},
- {file = "DoubleMetaphone-1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b913e28c807fff4c1a88061751ae93a268fc5cb85d32927b200c4b1c23e486c"},
- {file = "DoubleMetaphone-1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:66f8400236a804c8e446b1b3955f7b1cced118b058d4747804de4a7a9aa4e9f8"},
- {file = "DoubleMetaphone-1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:209b2021155fd0efd86ff127feb0c952ab53568397e9cc43fc18b7b1c3755983"},
- {file = "DoubleMetaphone-1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:78e4c9cb3d616bfa5f465a05e6104db161776110a5f46e1f9d2f8d9f91cd1519"},
- {file = "DoubleMetaphone-1.1-cp36-cp36m-win32.whl", hash = "sha256:1057bba7177d409a73a8ecd9dcd71a7957808b3e12401e6d60e66c3d8d7439e9"},
- {file = "DoubleMetaphone-1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b7bf1e0b63c78c01ff6d914b7739df407a617b9d05a210371d0e3a68d0fe1b8d"},
- {file = "DoubleMetaphone-1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:53c5b64c255dea2815dee15f0dfaee3b89595bbfd83826902628f0e439914820"},
- {file = "DoubleMetaphone-1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ac057e8674e0aaf5b247beb3e2f5f7a2f61887f19f7e15df672fc83197fdd03"},
- {file = "DoubleMetaphone-1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:36989a8766751b131a23a15717e39bf504908df06ba60026cbae31c950192533"},
- {file = "DoubleMetaphone-1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:36fd26100f05e5ff8903f4e69649542a6b3d237b71d0cd96f8e0929c61be06f0"},
- {file = "DoubleMetaphone-1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:133d91f0911c08b7ba1e953d04d25949f1da1c8ea82af8ec8efe0eaf81ef4cdc"},
- {file = "DoubleMetaphone-1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bb03494a30b3aedf3ab7dcc9892f28cb2bdf390fd8edbf31e77064157a78cc89"},
- {file = "DoubleMetaphone-1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:38e9e5c3638f46d7585f5119f9cc8b2d2e56c59a80d2ae6e0618238debe74d43"},
- {file = "DoubleMetaphone-1.1-cp37-cp37m-win32.whl", hash = "sha256:e4381cf5cba1fd9205654104330b0fb84f66c84cce56c0cb2316d1f37c67f773"},
- {file = "DoubleMetaphone-1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0e42aecb4ef275f5d2a6b34bee180739df40f08a17cefdb215bef002e3231c42"},
- {file = "DoubleMetaphone-1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd2f6530fec276969067f15824ffda4fee23cda5f26ffd0eee2cdfb996195976"},
- {file = "DoubleMetaphone-1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97a03ea3de818600ffd22ca52509065e3b9c702d9fa84c3021e752ae69d6e71f"},
- {file = "DoubleMetaphone-1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c344540cac82504ed45622ba461c762a331880a7144095adb10ea78067fa06e4"},
- {file = "DoubleMetaphone-1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:892112a20047a0986d409d790047fd1b392554863307e3b2d02213cde52c748a"},
- {file = "DoubleMetaphone-1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc067fd34b51301d459fdceef8183ecbe5cc88f3d59de436dcb19be627525513"},
- {file = "DoubleMetaphone-1.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:18318b45a2c945bbc1f44640788d66122563ba19824b714ccca50780b842249c"},
- {file = "DoubleMetaphone-1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cbde63c7e155e2774bc1055a05b26d83d947f903bc78bb918ae4a2eda5248ba3"},
- {file = "DoubleMetaphone-1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e551c98fe7c65d445b972be207673a1192e9f2121266fa075da1989f6ebf8ab1"},
- {file = "DoubleMetaphone-1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:18d1d2e9d583ade6fcda92fc04e8620331722763233ecf5f6005ccc76361bce0"},
- {file = "DoubleMetaphone-1.1-cp38-cp38-win32.whl", hash = "sha256:ae91d46f386dd92da0545b5d913138bc8ed38c2517bd2e0cda55ed94f61d2275"},
- {file = "DoubleMetaphone-1.1-cp38-cp38-win_amd64.whl", hash = "sha256:c5eb8b123777177096371e464e5f07a8184a96db50e5a2073de210b8a84873b4"},
- {file = "DoubleMetaphone-1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:974fe7f24881ccbd0ca68e1580d5561b27176b41e3fc7a360db8bb44608b721b"},
- {file = "DoubleMetaphone-1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:449ed1dead21e3847d59dacb1bfeb96a911d3ee827fb8439d67a34e54ba7b04d"},
- {file = "DoubleMetaphone-1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13a93575dd1261d4175d0552c2b423bd99316357c880ed345a839da0303ddbc1"},
- {file = "DoubleMetaphone-1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a14c5760f959d12b47d3b6b8bf1eab4b2b566bb393dff0e93151778e96f7f9c8"},
- {file = "DoubleMetaphone-1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd43a478ed1a0ca13e624cc4e9da0a0621f96977fd639b02373c22a6598a952a"},
- {file = "DoubleMetaphone-1.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8e921aed4453be6e5fe4408f72dfe707d390082c1c093b7340862f1e2146d933"},
- {file = "DoubleMetaphone-1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5a173690939dbad37206e1df78e3093f8acc5e5caaade01f95a20461dce1849a"},
- {file = "DoubleMetaphone-1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1f7873201ee45060b37a034d0a43536d6015c9bef3717b161ddb780754b60c0f"},
- {file = "DoubleMetaphone-1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:534cd1575e1c6c6c21b47db138b5eaf640735baff7a8e15d1516f5edce1edd6a"},
- {file = "DoubleMetaphone-1.1-cp39-cp39-win32.whl", hash = "sha256:f532145363c797bbdf1774d86e0838f4254a570edbb8fe986868df2e10076888"},
- {file = "DoubleMetaphone-1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e2143a570df80bb1596f20c8573d638deb5672f5f73410c14a12b7880e247918"},
- {file = "DoubleMetaphone-1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7e2ad55d9343fe2d7004e4aaa6da10d743ebe9c51b6672d8aa5f3f1e072049b5"},
- {file = "DoubleMetaphone-1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3892108a595cf8393b4bb4791d635fa18d0553f7a4e84343b8047e49d96d7be"},
- {file = "DoubleMetaphone-1.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a579b5dc2db3ea1613238b9a06fd1077a600ce88e858ecb0a7b07060a1e90909"},
- {file = "DoubleMetaphone-1.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d87851bf507dce2bdf01cdc299d12a21746ea8aff668dea0b6d768bdfa2dff71"},
- {file = "DoubleMetaphone-1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:cb25c36af7fd44c68ffb8f0fb7778676d726919e7a656a67f5aa192ef88e9d1e"},
- {file = "DoubleMetaphone-1.1.tar.gz", hash = "sha256:cd185dbc18347accb5a27c1289a6bdc989a479294a74f41c42a6cb0b414e5379"},
-]
-
-[[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"
-groups = ["main"]
-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 = "*"
-groups = ["main"]
-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 = "fqdn"
-version = "1.4.0"
-description = "Validate fully-qualified domain names compliant to RFC 1035 and the preferred form in RFC 3686 s. 2."
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "fqdn-1.4.0-py3-none-any.whl", hash = "sha256:e935616ae81c9c60a22267593fe8e6af68cecc68549cc71bb9bfbcbbcb383386"},
- {file = "fqdn-1.4.0.tar.gz", hash = "sha256:30e8f2e685ce87cdace4712fd97c5d09f5e6fa519bbb66e8f188f6a7cb3a5c4e"},
-]
-
-[[package]]
-name = "future"
-version = "1.0.0"
-description = "Clean single-source support for Python 3 and 2"
-optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
-groups = ["main"]
-files = [
- {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"},
- {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"},
-]
-
-[[package]]
-name = "geocoder"
-version = "1.38.1"
-description = "Geocoder is a simple and consistent geocoding library."
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "geocoder-1.38.1-py2.py3-none-any.whl", hash = "sha256:a733e1dfbce3f4e1a526cac03aadcedb8ed1239cf55bd7f3a23c60075121a834"},
- {file = "geocoder-1.38.1.tar.gz", hash = "sha256:c9925374c961577d0aee403b09e6f8ea1971d913f011f00ca70c76beaf7a77e7"},
-]
-
-[package.dependencies]
-click = "*"
-future = "*"
-ratelim = "*"
-requests = "*"
-six = "*"
-
-[[package]]
-name = "greenlet"
-version = "3.1.1"
-description = "Lightweight in-process concurrent programming"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"
-files = [
- {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"},
- {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"},
- {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"},
- {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"},
- {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"},
- {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"},
- {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"},
- {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"},
- {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"},
- {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"},
- {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"},
- {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"},
- {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"},
- {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"},
- {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"},
- {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"},
- {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"},
- {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"},
- {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"},
- {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"},
- {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"},
- {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"},
- {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"},
- {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"},
- {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"},
- {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"},
- {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"},
- {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"},
- {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"},
- {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"},
- {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"},
- {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"},
- {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"},
-]
-
-[package.extras]
-docs = ["Sphinx", "furo"]
-test = ["objgraph", "psutil"]
-
-[[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"
-groups = ["main"]
-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"
-groups = ["main"]
-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"
-groups = ["main"]
-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 = "icecream"
-version = "2.1.3"
-description = "Never use print() to debug again; inspect variables, expressions, and program execution with a single, simple function call."
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "icecream-2.1.3-py2.py3-none-any.whl", hash = "sha256:757aec31ad4488b949bc4f499d18e6e5973c40cc4d4fc607229e78cfaec94c34"},
- {file = "icecream-2.1.3.tar.gz", hash = "sha256:0aa4a7c3374ec36153a1d08f81e3080e83d8ac1eefd97d2f4fe9544e8f9b49de"},
-]
-
-[package.dependencies]
-asttokens = ">=2.0.1"
-colorama = ">=0.3.9"
-executing = ">=0.3.1"
-pygments = ">=2.2.0"
-
-[[package]]
-name = "idna"
-version = "3.10"
-description = "Internationalized Domain Names in Applications (IDNA)"
-optional = false
-python-versions = ">=3.6"
-groups = ["main"]
-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 = "inject"
-version = "5.2.1"
-description = "Python dependency injection framework."
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "inject-5.2.1-py2.py3-none-any.whl", hash = "sha256:e40a5b1bebd8a4050b6f98f3396f3de6e9e2e411ad2a2145f16f351cb6f54e51"},
- {file = "inject-5.2.1.tar.gz", hash = "sha256:f7c305a75cc4e3a331d248e996f25783ba784b88d5a9b9f73c53eacaa6d76985"},
-]
-
-[[package]]
-name = "ipykernel"
-version = "6.29.5"
-description = "IPython Kernel for Jupyter"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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.31.0"
-description = "IPython: Productive Interactive Computing"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "ipython-8.31.0-py3-none-any.whl", hash = "sha256:46ec58f8d3d076a61d128fe517a51eb730e3aaf0c184ea8c17d16e366660c6a6"},
- {file = "ipython-8.31.0.tar.gz", hash = "sha256:b6a2274606bec6166405ff05e54932ed6e5cfecaca1fc05f2cacde7bb074d70b"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-decorator = "*"
-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"
-
-[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 = "ipywidgets"
-version = "8.1.5"
-description = "Jupyter interactive widgets"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245"},
- {file = "ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17"},
-]
-
-[package.dependencies]
-comm = ">=0.1.3"
-ipython = ">=6.1.0"
-jupyterlab-widgets = ">=3.0.12,<3.1.0"
-traitlets = ">=4.3.1"
-widgetsnbextension = ">=4.0.12,<4.1.0"
-
-[package.extras]
-test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"]
-
-[[package]]
-name = "isoduration"
-version = "20.11.0"
-description = "Operations with ISO 8601 durations"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-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 = "jedi"
-version = "0.19.2"
-description = "An autocompletion tool for Python that can be used for text editors."
-optional = false
-python-versions = ">=3.6"
-groups = ["main"]
-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.5"
-description = "A very fast and expressive template engine."
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"},
- {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"},
-]
-
-[package.dependencies]
-MarkupSafe = ">=2.0"
-
-[package.extras]
-i18n = ["Babel (>=2.7)"]
-
-[[package]]
-name = "json5"
-version = "0.10.0"
-description = "A Python implementation of the JSON5 data format."
-optional = false
-python-versions = ">=3.8.0"
-groups = ["main"]
-files = [
- {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"
-groups = ["main"]
-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"
-groups = ["main"]
-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"
-groups = ["main"]
-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"
-version = "1.1.1"
-description = "Jupyter metapackage. Install all the Jupyter components in one go."
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83"},
- {file = "jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a"},
-]
-
-[package.dependencies]
-ipykernel = "*"
-ipywidgets = "*"
-jupyter-console = "*"
-jupyterlab = "*"
-nbconvert = "*"
-notebook = "*"
-
-[[package]]
-name = "jupyter-client"
-version = "8.6.3"
-description = "Jupyter protocol implementation and client libraries"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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-console"
-version = "6.6.3"
-description = "Jupyter terminal console"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"},
- {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"},
-]
-
-[package.dependencies]
-ipykernel = ">=6.14"
-ipython = "*"
-jupyter-client = ">=7.0.0"
-jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
-prompt-toolkit = ">=3.0.30"
-pygments = "*"
-pyzmq = ">=17"
-traitlets = ">=5.4"
-
-[package.extras]
-test = ["flaky", "pexpect", "pytest"]
-
-[[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"
-groups = ["main"]
-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.11.0"
-description = "Jupyter Event System library"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "jupyter_events-0.11.0-py3-none-any.whl", hash = "sha256:36399b41ce1ca45fe8b8271067d6a140ffa54cec4028e95491c93b78a855cacf"},
- {file = "jupyter_events-0.11.0.tar.gz", hash = "sha256:c0bc56a37aac29c1fbc3bcfbddb8c8c49533f9cf11f1c4e6adadba936574ab90"},
-]
-
-[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 (>=0.16)", "sphinx (>=8)", "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"
-groups = ["main"]
-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.15.0"
-description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications."
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "jupyter_server-2.15.0-py3-none-any.whl", hash = "sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3"},
- {file = "jupyter_server-2.15.0.tar.gz", hash = "sha256:9d446b8697b4f7337a1b7cdcac40778babdd93ba614b6d68ab1c0c918f1c4084"},
-]
-
-[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.11.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"
-groups = ["main"]
-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.4"
-description = "JupyterLab computational environment"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "jupyterlab-4.3.4-py3-none-any.whl", hash = "sha256:b754c2601c5be6adf87cb5a1d8495d653ffb945f021939f77776acaa94dae952"},
- {file = "jupyterlab-4.3.4.tar.gz", hash = "sha256:f0bb9b09a04766e3423cccc2fc23169aa2ffedcdf8713e9e0fb33cac0b6859d0"},
-]
-
-[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"
-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"
-groups = ["main"]
-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"
-groups = ["main"]
-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 = "jupyterlab-widgets"
-version = "3.0.13"
-description = "Jupyter interactive widgets for JupyterLab"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54"},
- {file = "jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed"},
-]
-
-[[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"
-groups = ["main"]
-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"
-groups = ["main"]
-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"
-groups = ["main"]
-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 = "mdurl"
-version = "0.1.2"
-description = "Markdown URL utilities"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-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 = "mistune"
-version = "3.1.0"
-description = "A sane and fast Markdown parser with useful plugins and renderers"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "mistune-3.1.0-py3-none-any.whl", hash = "sha256:b05198cf6d671b3deba6c87ec6cf0d4eb7b72c524636eddb6dbf13823b52cee1"},
- {file = "mistune-3.1.0.tar.gz", hash = "sha256:dbcac2f78292b9dc066cd03b7a3a26b62d85f8159f2ea5fd28e55df79908d667"},
-]
-
-[[package]]
-name = "nameparser"
-version = "1.1.3"
-description = "A simple Python module for parsing human names into their individual components."
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "nameparser-1.1.3-py2.py3-none-any.whl", hash = "sha256:08ccda98681d59751c82052d52f185bc52f99d43e87d46b85c015a9096ecfa66"},
- {file = "nameparser-1.1.3.tar.gz", hash = "sha256:aa2400ad71ccf8070675b40311a257c934659f91854b154e1ba6c264761c049d"},
-]
-
-[[package]]
-name = "nbclient"
-version = "0.10.2"
-description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor."
-optional = false
-python-versions = ">=3.9.0"
-groups = ["main"]
-files = [
- {file = "nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d"},
- {file = "nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193"},
-]
-
-[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.1.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.1.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"]
-
-[[package]]
-name = "nbconvert"
-version = "7.16.5"
-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"
-groups = ["main"]
-files = [
- {file = "nbconvert-7.16.5-py3-none-any.whl", hash = "sha256:e12eac052d6fd03040af4166c563d76e7aeead2e9aadf5356db552a1784bd547"},
- {file = "nbconvert-7.16.5.tar.gz", hash = "sha256:c83467bb5777fdfaac5ebbb8e864f300b277f68692ecc04d6dab72f2d8442344"},
-]
-
-[package.dependencies]
-beautifulsoup4 = "*"
-bleach = {version = "!=5.0.0", extras = ["css"]}
-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"
-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"
-groups = ["main"]
-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"
-groups = ["main"]
-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"
-version = "7.3.2"
-description = "Jupyter Notebook - A web-based notebook environment for interactive computing"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "notebook-7.3.2-py3-none-any.whl", hash = "sha256:e5f85fc59b69d3618d73cf27544418193ff8e8058d5bf61d315ce4f473556288"},
- {file = "notebook-7.3.2.tar.gz", hash = "sha256:705e83a1785f45b383bf3ee13cb76680b92d24f56fb0c7d2136fe1d850cd3ca8"},
-]
-
-[package.dependencies]
-jupyter-server = ">=2.4.0,<3"
-jupyterlab = ">=4.3.4,<4.4"
-jupyterlab-server = ">=2.27.1,<3"
-notebook-shim = ">=0.2,<0.3"
-tornado = ">=6.2.0"
-
-[package.extras]
-dev = ["hatch", "pre-commit"]
-docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"]
-test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"]
-
-[[package]]
-name = "notebook-shim"
-version = "0.2.4"
-description = "A shim layer for notebook traits and config"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-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.1"
-description = "Fundamental package for array computing in Python"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "numpy-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5edb4e4caf751c1518e6a26a83501fda79bff41cc59dac48d70e6d65d4ec4440"},
- {file = "numpy-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa3017c40d513ccac9621a2364f939d39e550c542eb2a894b4c8da92b38896ab"},
- {file = "numpy-2.2.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:61048b4a49b1c93fe13426e04e04fdf5a03f456616f6e98c7576144677598675"},
- {file = "numpy-2.2.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:7671dc19c7019103ca44e8d94917eba8534c76133523ca8406822efdd19c9308"},
- {file = "numpy-2.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4250888bcb96617e00bfa28ac24850a83c9f3a16db471eca2ee1f1714df0f957"},
- {file = "numpy-2.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7746f235c47abc72b102d3bce9977714c2444bdfaea7888d241b4c4bb6a78bf"},
- {file = "numpy-2.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:059e6a747ae84fce488c3ee397cee7e5f905fd1bda5fb18c66bc41807ff119b2"},
- {file = "numpy-2.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f62aa6ee4eb43b024b0e5a01cf65a0bb078ef8c395e8713c6e8a12a697144528"},
- {file = "numpy-2.2.1-cp310-cp310-win32.whl", hash = "sha256:48fd472630715e1c1c89bf1feab55c29098cb403cc184b4859f9c86d4fcb6a95"},
- {file = "numpy-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:b541032178a718c165a49638d28272b771053f628382d5e9d1c93df23ff58dbf"},
- {file = "numpy-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40f9e544c1c56ba8f1cf7686a8c9b5bb249e665d40d626a23899ba6d5d9e1484"},
- {file = "numpy-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9b57eaa3b0cd8db52049ed0330747b0364e899e8a606a624813452b8203d5f7"},
- {file = "numpy-2.2.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bc8a37ad5b22c08e2dbd27df2b3ef7e5c0864235805b1e718a235bcb200cf1cb"},
- {file = "numpy-2.2.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9036d6365d13b6cbe8f27a0eaf73ddcc070cae584e5ff94bb45e3e9d729feab5"},
- {file = "numpy-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51faf345324db860b515d3f364eaa93d0e0551a88d6218a7d61286554d190d73"},
- {file = "numpy-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38efc1e56b73cc9b182fe55e56e63b044dd26a72128fd2fbd502f75555d92591"},
- {file = "numpy-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:31b89fa67a8042e96715c68e071a1200c4e172f93b0fbe01a14c0ff3ff820fc8"},
- {file = "numpy-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c86e2a209199ead7ee0af65e1d9992d1dce7e1f63c4b9a616500f93820658d0"},
- {file = "numpy-2.2.1-cp311-cp311-win32.whl", hash = "sha256:b34d87e8a3090ea626003f87f9392b3929a7bbf4104a05b6667348b6bd4bf1cd"},
- {file = "numpy-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:360137f8fb1b753c5cde3ac388597ad680eccbbbb3865ab65efea062c4a1fd16"},
- {file = "numpy-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab"},
- {file = "numpy-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa"},
- {file = "numpy-2.2.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315"},
- {file = "numpy-2.2.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355"},
- {file = "numpy-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7"},
- {file = "numpy-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d"},
- {file = "numpy-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51"},
- {file = "numpy-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046"},
- {file = "numpy-2.2.1-cp312-cp312-win32.whl", hash = "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2"},
- {file = "numpy-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8"},
- {file = "numpy-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780"},
- {file = "numpy-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821"},
- {file = "numpy-2.2.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e"},
- {file = "numpy-2.2.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348"},
- {file = "numpy-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59"},
- {file = "numpy-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af"},
- {file = "numpy-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51"},
- {file = "numpy-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716"},
- {file = "numpy-2.2.1-cp313-cp313-win32.whl", hash = "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e"},
- {file = "numpy-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60"},
- {file = "numpy-2.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e"},
- {file = "numpy-2.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712"},
- {file = "numpy-2.2.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008"},
- {file = "numpy-2.2.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84"},
- {file = "numpy-2.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631"},
- {file = "numpy-2.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d"},
- {file = "numpy-2.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5"},
- {file = "numpy-2.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71"},
- {file = "numpy-2.2.1-cp313-cp313t-win32.whl", hash = "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2"},
- {file = "numpy-2.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268"},
- {file = "numpy-2.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ba9cc93a91d86365a5d270dee221fdc04fb68d7478e6bf6af650de78a8339e3"},
- {file = "numpy-2.2.1-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:3d03883435a19794e41f147612a77a8f56d4e52822337844fff3d4040a142964"},
- {file = "numpy-2.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4511d9e6071452b944207c8ce46ad2f897307910b402ea5fa975da32e0102800"},
- {file = "numpy-2.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5c5cc0cbabe9452038ed984d05ac87910f89370b9242371bd9079cb4af61811e"},
- {file = "numpy-2.2.1.tar.gz", hash = "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918"},
-]
-
-[[package]]
-name = "onepassword-sdk"
-version = "0.1.5"
-description = "The 1Password Python SDK offers programmatic read access to your secrets in 1Password in an interface native to Python."
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "onepassword_sdk-0.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b79b7f4cc1fba8480473e0b250e66df80e5411e58bc5432e913f47f6d50fb057"},
- {file = "onepassword_sdk-0.1.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2324246dd73a7705d5be40018f68129177b438ceff1331aaef546d64993709e9"},
- {file = "onepassword_sdk-0.1.5-cp310-cp310-manylinux_2_32_aarch64.whl", hash = "sha256:c445e758c203f207bda4ec3a3241ef89034174cdc07f9b9ca544318293023ca3"},
- {file = "onepassword_sdk-0.1.5-cp310-cp310-manylinux_2_32_x86_64.whl", hash = "sha256:a0ab735b00197ce0f6eca40137ccd87f276ef069638f3abf9dfed9c51ec70411"},
- {file = "onepassword_sdk-0.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:91d3a8d854dfeeb899607c3b17f75e0f60c41514023c65e29ffbe463cb37783b"},
- {file = "onepassword_sdk-0.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e6cfef9dda2ae7e7116b139dec105b8917e4315072cdb7b29f62599687f0cf77"},
- {file = "onepassword_sdk-0.1.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aeca49b7bfad5a46f0c2ab58f086056f821ec2deca178bb69fd5decd94a3ebcc"},
- {file = "onepassword_sdk-0.1.5-cp311-cp311-manylinux_2_32_aarch64.whl", hash = "sha256:af6f7a983b43c1814793faf936744f1d4428eed85e46ea3f0deaac4ab45ae146"},
- {file = "onepassword_sdk-0.1.5-cp311-cp311-manylinux_2_32_x86_64.whl", hash = "sha256:79efbc673b4d6145ae57c6c477530494a392cd6b80b9d1af43baf2b51050dd23"},
- {file = "onepassword_sdk-0.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:f2d362afedfcc5c6a531637d278ac82e0d38d5a0f59e92e26e2b259578d86226"},
- {file = "onepassword_sdk-0.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71773cf44db431695a821c797d76adde72c082bafc784efa7e4688fdc1e4912b"},
- {file = "onepassword_sdk-0.1.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:74a3c7458e7adcf344f5c1e9f3f4adb495086cc92f184cb210a574551b57c79b"},
- {file = "onepassword_sdk-0.1.5-cp312-cp312-manylinux_2_32_aarch64.whl", hash = "sha256:b3fbd9e2c2caecc29982ed8a91a134d77ff7abdf2dcc37e11c06f5d73bb09a58"},
- {file = "onepassword_sdk-0.1.5-cp312-cp312-manylinux_2_32_x86_64.whl", hash = "sha256:500bc314e52cb303acd265709bb72b5730a75c75bc5a8099a232edd690a8d701"},
- {file = "onepassword_sdk-0.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:6af9bea09989e59958284fd333395a1867d759235bdebb833dcfe73f721d0dab"},
- {file = "onepassword_sdk-0.1.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9c8cf43979cd4cd4ab45ac35027099d4a59498e0d869180a6807506bbe5ea81"},
- {file = "onepassword_sdk-0.1.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e367be8587bc0f54967d1e1acc216edd497c3421e07e9168e66f3160086c1eb4"},
- {file = "onepassword_sdk-0.1.5-cp313-cp313-manylinux_2_32_aarch64.whl", hash = "sha256:bd9c0ba73eec1748435b9992ca593c6367c639078324fb2b36243f9a2636be1b"},
- {file = "onepassword_sdk-0.1.5-cp313-cp313-manylinux_2_32_x86_64.whl", hash = "sha256:5667f25609ac8c2337b8f5144e6115520aff30aaaa0e95889bcb9e7aa0c9c6cb"},
- {file = "onepassword_sdk-0.1.5-cp313-cp313-win_amd64.whl", hash = "sha256:deb761be96e49b11f636a540bfe16509003acfeb1e5cc75669b02ba0e087069e"},
- {file = "onepassword_sdk-0.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:83fd2cf7ea677eaa6f191e3f14aee16de78492cf52de7e1d38f59203b4fb9bb5"},
- {file = "onepassword_sdk-0.1.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:185acb722d9b3b3059531d4bd5bf29ec018516d17a16e7dd9b1c46d9056f11db"},
- {file = "onepassword_sdk-0.1.5-cp39-cp39-manylinux_2_32_aarch64.whl", hash = "sha256:be903be409d1c0a18b6d8740ffd6d8e58e603b095368c373f3a2020b0bc6aa6a"},
- {file = "onepassword_sdk-0.1.5-cp39-cp39-manylinux_2_32_x86_64.whl", hash = "sha256:4e4683bb4b6b60ae1b96e493ebe21503e01147b59d46c9238a1b2f97b13d9c8a"},
- {file = "onepassword_sdk-0.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:6b26c5325299660fda75902feb4269dc00749f64dd36ee97561cd72a3305b0e4"},
- {file = "onepassword_sdk-0.1.5.tar.gz", hash = "sha256:ac88fb75b397c231c594d87d21cdf8e55898e160a59d7e381499a38ccfe4e254"},
-]
-
-[package.dependencies]
-pydantic = ">=2.5"
-
-[[package]]
-name = "outcome"
-version = "1.3.0.post0"
-description = "Capture the outcome of Python function calls."
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b"},
- {file = "outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8"},
-]
-
-[package.dependencies]
-attrs = ">=19.2.0"
-
-[[package]]
-name = "overrides"
-version = "7.7.0"
-description = "A decorator to automatically detect mismatch when overriding a method."
-optional = false
-python-versions = ">=3.6"
-groups = ["main"]
-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"
-description = "Core utilities for Python packages"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
- {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"
-groups = ["main"]
-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.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.*"
-groups = ["main"]
-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 = "parso"
-version = "0.8.4"
-description = "A Python Parser"
-optional = false
-python-versions = ">=3.6"
-groups = ["main"]
-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 = "pexpect"
-version = "4.9.0"
-description = "Pexpect allows easy control of interactive console applications."
-optional = false
-python-versions = "*"
-groups = ["main"]
-markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""
-files = [
- {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 = "phonenumbers"
-version = "8.13.52"
-description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers."
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "phonenumbers-8.13.52-py2.py3-none-any.whl", hash = "sha256:e803210038ece9d208b129e3023dc20e656a820d6bf6f1cb0471d4164f54bada"},
- {file = "phonenumbers-8.13.52.tar.gz", hash = "sha256:fdc371ea6a4da052beb1225de63963d5a2fddbbff2bb53e3a957f360e0185f80"},
-]
-
-[[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"
-groups = ["main"]
-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 = "probableparsing"
-version = "0.0.1"
-description = "Common methods for propbable parsers"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "probableparsing-0.0.1-py2.py3-none-any.whl", hash = "sha256:509df25fdda4fd7c0b2a100f58cc971bd23daf26f3b3320aebf2616d2e10c69e"},
- {file = "probableparsing-0.0.1.tar.gz", hash = "sha256:8114bbf889e1f9456fe35946454c96e42a6ee2673a90d4f1f9c46a406f543767"},
-]
-
-[[package]]
-name = "probablepeople"
-version = "0.5.6"
-description = "Parse romanized names & companies using advanced NLP methods"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "probablepeople-0.5.6-py3-none-any.whl", hash = "sha256:1900ba5575669dd5a0b554a0d1cb66aa1ec2ab076c94a514519a2e42954bbcfc"},
- {file = "probablepeople-0.5.6.tar.gz", hash = "sha256:4ae95e77f9fa7dceb116538500ab48c81a91bf68eb652d45207b794b450f4392"},
-]
-
-[package.dependencies]
-doublemetaphone = "*"
-probableparsing = "*"
-python-crfsuite = ">=0.7"
-
-[package.extras]
-dev = ["black", "flake8", "isort", "mypy", "parserator", "pre-commit", "pytest"]
-
-[[package]]
-name = "prometheus-client"
-version = "0.21.1"
-description = "Python client for the Prometheus monitoring system."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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"
-groups = ["main"]
-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 = "psutil"
-version = "6.1.1"
-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"
-groups = ["main"]
-files = [
- {file = "psutil-6.1.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8"},
- {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777"},
- {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4"},
- {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468"},
- {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca"},
- {file = "psutil-6.1.1-cp27-none-win32.whl", hash = "sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac"},
- {file = "psutil-6.1.1-cp27-none-win_amd64.whl", hash = "sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030"},
- {file = "psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8"},
- {file = "psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377"},
- {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003"},
- {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160"},
- {file = "psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3"},
- {file = "psutil-6.1.1-cp36-cp36m-win32.whl", hash = "sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603"},
- {file = "psutil-6.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303"},
- {file = "psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53"},
- {file = "psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649"},
- {file = "psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5"},
-]
-
-[package.extras]
-dev = ["abi3audit", "black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "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 = "*"
-groups = ["main"]
-markers = "os_name != \"nt\" or sys_platform != \"win32\" and sys_platform != \"emscripten\""
-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 = "*"
-groups = ["main"]
-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 = "pycparser"
-version = "2.22"
-description = "C parser in Python"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"},
- {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"},
-]
-
-[[package]]
-name = "pydantic"
-version = "2.10.4"
-description = "Data validation using Python type hints"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d"},
- {file = "pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06"},
-]
-
-[package.dependencies]
-annotated-types = ">=0.6.0"
-pydantic-core = "2.27.2"
-typing-extensions = ">=4.12.2"
-
-[package.extras]
-email = ["email-validator (>=2.0.0)"]
-timezone = ["tzdata"]
-
-[[package]]
-name = "pydantic-core"
-version = "2.27.2"
-description = "Core functionality for Pydantic validation and serialization"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"},
- {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"},
- {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"},
- {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"},
- {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"},
- {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"},
- {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"},
- {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"},
- {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"},
- {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"},
- {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"},
- {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"},
- {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"},
- {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"},
- {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"},
- {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"},
- {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"},
- {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"},
- {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"},
- {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"},
- {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"},
- {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"},
- {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"},
- {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"},
- {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"},
- {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"},
- {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"},
- {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"},
- {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"},
- {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"},
- {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"},
- {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"},
- {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"},
- {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"},
- {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"},
- {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"},
- {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"},
- {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"},
- {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"},
- {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"},
- {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"},
- {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"},
- {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"},
- {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"},
- {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"},
- {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"},
-]
-
-[package.dependencies]
-typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
-
-[[package]]
-name = "pydantic-extra-types"
-version = "2.10.1"
-description = "Extra Pydantic types."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "pydantic_extra_types-2.10.1-py3-none-any.whl", hash = "sha256:db2c86c04a837bbac0d2d79bbd6f5d46c4c9253db11ca3fdd36a2b282575f1e2"},
- {file = "pydantic_extra_types-2.10.1.tar.gz", hash = "sha256:e4f937af34a754b8f1fa228a2fac867091a51f56ed0e8a61d5b3a6719b13c923"},
-]
-
-[package.dependencies]
-pydantic = ">=2.5.2"
-typing-extensions = "*"
-
-[package.extras]
-all = ["pendulum (>=3.0.0,<4.0.0)", "phonenumbers (>=8,<9)", "pycountry (>=23)", "python-ulid (>=1,<2)", "python-ulid (>=1,<4)", "pytz (>=2024.1)", "semver (>=3.0.2)", "semver (>=3.0.2,<3.1.0)", "tzdata (>=2024.1)"]
-pendulum = ["pendulum (>=3.0.0,<4.0.0)"]
-phonenumbers = ["phonenumbers (>=8,<9)"]
-pycountry = ["pycountry (>=23)"]
-python-ulid = ["python-ulid (>=1,<2)", "python-ulid (>=1,<4)"]
-semver = ["semver (>=3.0.2)"]
-
-[[package]]
-name = "pydantic-settings"
-version = "2.7.1"
-description = "Settings management using Pydantic"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"},
- {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"},
-]
-
-[package.dependencies]
-pydantic = ">=2.7.0"
-python-dotenv = ">=0.21.0"
-
-[package.extras]
-azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"]
-toml = ["tomli (>=2.0.1)"]
-yaml = ["pyyaml (>=6.0.1)"]
-
-[[package]]
-name = "pygments"
-version = "2.19.1"
-description = "Pygments is a syntax highlighting package written in Python."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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 = "pysocks"
-version = "1.7.1"
-description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information."
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-groups = ["main"]
-files = [
- {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"},
- {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"},
- {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"},
-]
-
-[[package]]
-name = "python-crfsuite"
-version = "0.9.11"
-description = "Python binding for CRFsuite"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "python_crfsuite-0.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f5ed569517e7b1fa3d32cf5d5cbe2fb6c85486195bf5cad03d52072fef7aa8a"},
- {file = "python_crfsuite-0.9.11-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aed10ee4334c99173940e88318d312a4f9e70ba653b8ac0e6f3ef816431af811"},
- {file = "python_crfsuite-0.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd8cc52f853436bbed580ad6c17e37c3657466fdfa28ddc55efcbba28b92cdf"},
- {file = "python_crfsuite-0.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:182fad0415697d5acbe18364333f8255016c8609d570cba78c20d8d71a392f90"},
- {file = "python_crfsuite-0.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:05cd988aaa7ac87a54d4bd1d756455f6e3b078f07b4fcbda3bccfd91a784dd20"},
- {file = "python_crfsuite-0.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2dead957809b92b7f0fc4c03fc70af9cbcaf35518ff1fd3a3fe2862dd0bb52fa"},
- {file = "python_crfsuite-0.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:66f24e5281b8a10091c3a9eef5a85115aea9570bcb9e0c03c738b0eab7070cb5"},
- {file = "python_crfsuite-0.9.11-cp310-cp310-win32.whl", hash = "sha256:b5a9492686e3dde5739ea19a3ec37397eb7cff787362e403a411acb6431aaf84"},
- {file = "python_crfsuite-0.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:d2c361819ba331c48038f1b231b8863b886205e9decae2fb89f69da44b28d00a"},
- {file = "python_crfsuite-0.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4a2f2ff5b6b0b6cf72ee476436f3926ccd0045c97e7703478a025c9badd180c6"},
- {file = "python_crfsuite-0.9.11-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83bc133fc2a411144778bb03d56a95f88a4da0386462fb99d32b45428959101f"},
- {file = "python_crfsuite-0.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5e52bfe54c1cb94009f1edb9c1dec3fe6d31823c60fafee04d63354c342303"},
- {file = "python_crfsuite-0.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23a96dc9a25a0d143430236158ca0d836b94a26d5752ffdf7efe315c14045f5"},
- {file = "python_crfsuite-0.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dd95a8ab9d92ac6756c17dde8150d7edcc696e49b4ca5f537e347143d19c94bc"},
- {file = "python_crfsuite-0.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:800fd345f2eb822d574eeaa6099bb88a23942272f62ea3e182e8ec07f4cf5ca8"},
- {file = "python_crfsuite-0.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c17dc2c5ac63d10993afbab0288bb1949e4ac856361c83e8041fff4493d7dab"},
- {file = "python_crfsuite-0.9.11-cp311-cp311-win32.whl", hash = "sha256:9a00f1f32203d9cb66658df75ee62ce4809b24f26b982b7f482934a683abc96c"},
- {file = "python_crfsuite-0.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:d255f02c890628337c970d76cba787afb7991340b3a7b201d3a158add5f78989"},
- {file = "python_crfsuite-0.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:346a37d1ffa9f161d56c523d2386eaa5026c663e70f65db4478adb292d7c047c"},
- {file = "python_crfsuite-0.9.11-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec40a7924d2e79a06f8eb0cec613ade54d677b73c4041c6052cd890aca2db89"},
- {file = "python_crfsuite-0.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5b3836e8ee8d684fb9d76d287035db51039b30cadac3332664655acf970831"},
- {file = "python_crfsuite-0.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f498cb82686dc18f7cecaf0a7ebceb4590ee2137cfa8cfe1b75f53514d0e956"},
- {file = "python_crfsuite-0.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:29cdf55c54c388c62148ba310bf8ad1b93b352d62dd84856d15c421dae2e902d"},
- {file = "python_crfsuite-0.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e6738ed044ba91d8284716f87525ca95bc857ece0b226910a80126a8ce6ad06"},
- {file = "python_crfsuite-0.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1a365a70e54dbd20a9251a3b6df91e1406cab1b1b5995a9d68e8c748fc9b3af7"},
- {file = "python_crfsuite-0.9.11-cp312-cp312-win32.whl", hash = "sha256:4b230ab1b69c6025e4f64e72c445f7492cccf00d94fc2c0bf2f337fafc05d5d5"},
- {file = "python_crfsuite-0.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:c89d7ad4ca520a5f045c676865ec09a2accc25dc5dce387f2199e5b2c9d8f337"},
- {file = "python_crfsuite-0.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89b45426f28b39dfc4789d29bcd7398f177746e4ab27f6ae3c7b48a082ecb73b"},
- {file = "python_crfsuite-0.9.11-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:788b6ca5fd43797f6822bb7aed8d5b0255d7d53be62746c77ca91dad5dfd2f2b"},
- {file = "python_crfsuite-0.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:609ce1e2ea1ff36379e91a4af9f10bcaaca0b22d089ec7489181ae0d9d098419"},
- {file = "python_crfsuite-0.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893af206342196e37c84af73941d7c2498e3ab926a67f846f78de6f48a7cb067"},
- {file = "python_crfsuite-0.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a387c4c4794ecccc712e01091b2887fc90b63dbc6612947232c2593116545e8a"},
- {file = "python_crfsuite-0.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:00db049cc46f716cef6626fbcf5b8abc258f4740e39dcceccc706ba77200992b"},
- {file = "python_crfsuite-0.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c0f95fd723e7a684188c541106f301a1d87104a07acd1e5687df849d2a86391a"},
- {file = "python_crfsuite-0.9.11-cp313-cp313-win32.whl", hash = "sha256:5664cebdc82d20b374641f2d0e77a86e8b010fafaf8efeb8862c3fc567d41c08"},
- {file = "python_crfsuite-0.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:00123f42dca02897aaa1fc129ea99b815f800c2893ffb210d8b8f71235ffeef4"},
- {file = "python_crfsuite-0.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bb02962c16e3c84bb056ed86f2227b3d0432995c047acb7eb15032c1b645044c"},
- {file = "python_crfsuite-0.9.11-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5cc941f1e22cd52e1965cd353b67edfbae06dc5ceb6556bf3176d8523113f66"},
- {file = "python_crfsuite-0.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8b3ceefc199b46e562a8bfaac9ef71f86108f0435e28f40007da48618f53837"},
- {file = "python_crfsuite-0.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b0c244c0ac04f1213576d28743dae133ca3ff2ebba98b3c4abda3327f37ed23"},
- {file = "python_crfsuite-0.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8919fec4638133b3e95afe1496b5b771bb8464741bd467534cc1414ae7f0efc6"},
- {file = "python_crfsuite-0.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:993705405b979047a9c66141f4ef886635278f244b5371c25db94751f4b7d326"},
- {file = "python_crfsuite-0.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:48fb8b11ae294a3f5986dc4ae9a20047d850e1dc20dae3725c3a9d0c70e14418"},
- {file = "python_crfsuite-0.9.11-cp38-cp38-win32.whl", hash = "sha256:f8df18614e5c6c3c95d3e20a7968f75201693a0cc1284d893f7bbc04a392f8e3"},
- {file = "python_crfsuite-0.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:01a0078292fff9e171ab9f4cabc67cbd2c629647b8fc67187c1335520a7a45fa"},
- {file = "python_crfsuite-0.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0e1fad868fe15cb5bca7c0015995bd962de2f0b100e3e5b7dd3c14273fdc806"},
- {file = "python_crfsuite-0.9.11-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb60d6ac04e6f7e64f02aceaea88b6ad4ffdc183c5301f7fd8b8a280c3efc8e"},
- {file = "python_crfsuite-0.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e6e9a3439c503884d6bb4311f9e7bb34cd4c5e83da28f8c8abcfa34332b2f7"},
- {file = "python_crfsuite-0.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3064a4902b18c8a0916e48db4f94bc323e9390b96ae41098674ceb36f107acee"},
- {file = "python_crfsuite-0.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cac7a8bb6f629dc42408f3df45a892010321ba539a30cecc54bdea8f05580003"},
- {file = "python_crfsuite-0.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:796b6b84d4af5b848786f05c378a32f08ef6a5c67dd929f9845f0f7217177db8"},
- {file = "python_crfsuite-0.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:92ebc0f4291b6beae87eb6b9999c3381db5299852f7bdd88cdfca62d759630db"},
- {file = "python_crfsuite-0.9.11-cp39-cp39-win32.whl", hash = "sha256:d6b4705cd7657efa8fc7742b09783537595944d18c0708e362252c2a9cd2a58d"},
- {file = "python_crfsuite-0.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:c7aeec4be4056b0c6dd4a1357707c8d5b9c88b3f74e51d2f4d407692cad4877f"},
- {file = "python_crfsuite-0.9.11.tar.gz", hash = "sha256:6eff965ca70567396d822c9a35ea74b0f7edb27d9471524997bdabe7a6da5f5a"},
-]
-
-[package.extras]
-dev = ["black", "flake8", "isort", "tox"]
-
-[[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"
-groups = ["main"]
-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-dotenv"
-version = "1.0.1"
-description = "Read key-value pairs from a .env file and set them as environment variables"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
- {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
-]
-
-[package.extras]
-cli = ["click (>=5.0)"]
-
-[[package]]
-name = "python-json-logger"
-version = "3.2.1"
-description = "JSON Log Formatter for the Python Logging Package"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090"},
- {file = "python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008"},
-]
-
-[package.extras]
-dev = ["backports.zoneinfo", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec", "msgspec-python313-pre", "mypy", "orjson", "pylint", "pytest", "tzdata", "validate-pyproject[all]"]
-
-[[package]]
-name = "pytz"
-version = "2024.2"
-description = "World timezone definitions, modern and historical"
-optional = false
-python-versions = "*"
-groups = ["main"]
-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 = "*"
-groups = ["main"]
-markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""
-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"
-groups = ["main"]
-markers = "os_name == \"nt\""
-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"
-groups = ["main"]
-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"
-groups = ["main"]
-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 = "ratelim"
-version = "0.1.6"
-description = "Makes it easy to respect rate limits."
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "ratelim-0.1.6-py2.py3-none-any.whl", hash = "sha256:e1a7dd39e6b552b7cc7f52169cd66cdb826a1a30198e355d7016012987c9ad08"},
- {file = "ratelim-0.1.6.tar.gz", hash = "sha256:826d32177e11f9a12831901c9fda6679fd5bbea3605910820167088f5acbb11d"},
-]
-
-[package.dependencies]
-decorator = "*"
-
-[[package]]
-name = "referencing"
-version = "0.35.1"
-description = "JSON Referencing + Python"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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"
-description = "Python HTTP for Humans."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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 = "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.*"
-groups = ["main"]
-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.*"
-groups = ["main"]
-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 = "rich"
-version = "13.9.4"
-description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
-optional = false
-python-versions = ">=3.8.0"
-groups = ["main"]
-files = [
- {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"},
- {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"},
-]
-
-[package.dependencies]
-markdown-it-py = ">=2.2.0"
-pygments = ">=2.13.0,<3.0.0"
-
-[package.extras]
-jupyter = ["ipywidgets (>=7.5.1,<9)"]
-
-[[package]]
-name = "rpds-py"
-version = "0.22.3"
-description = "Python bindings to Rust's persistent data structures (rpds)"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-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 = "selenium"
-version = "4.27.1"
-description = "Official Python bindings for Selenium WebDriver"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "selenium-4.27.1-py3-none-any.whl", hash = "sha256:b89b1f62b5cfe8025868556fe82360d6b649d464f75d2655cb966c8f8447ea18"},
- {file = "selenium-4.27.1.tar.gz", hash = "sha256:5296c425a75ff1b44d0d5199042b36a6d1ef76c04fb775b97b40be739a9caae2"},
-]
-
-[package.dependencies]
-certifi = ">=2021.10.8"
-trio = ">=0.17,<1.0"
-trio-websocket = ">=0.9,<1.0"
-typing_extensions = ">=4.9,<5.0"
-urllib3 = {version = ">=1.26,<3", extras = ["socks"]}
-websocket-client = ">=1.8,<2.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"
-groups = ["main"]
-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 = "setuptools"
-version = "75.7.0"
-description = "Easily download, build, install, upgrade, and uninstall Python packages"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "setuptools-75.7.0-py3-none-any.whl", hash = "sha256:84fb203f278ebcf5cd08f97d3fb96d3fbed4b629d500b29ad60d11e00769b183"},
- {file = "setuptools-75.7.0.tar.gz", hash = "sha256:886ff7b16cd342f1d1defc16fc98c9ce3fde69e087a4e1983d7ab634e5f41f4f"},
-]
-
-[package.extras]
-check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.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.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"
-groups = ["main"]
-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"
-groups = ["main"]
-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 = "sortedcontainers"
-version = "2.4.0"
-description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"},
- {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"},
-]
-
-[[package]]
-name = "soupsieve"
-version = "2.6"
-description = "A modern CSS selector implementation for Beautiful Soup."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"},
- {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"},
-]
-
-[[package]]
-name = "sqlalchemy"
-version = "2.0.36"
-description = "Database Abstraction Library"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72"},
- {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908"},
- {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08"},
- {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07"},
- {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5"},
- {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44"},
- {file = "SQLAlchemy-2.0.36-cp310-cp310-win32.whl", hash = "sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa"},
- {file = "SQLAlchemy-2.0.36-cp310-cp310-win_amd64.whl", hash = "sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5"},
- {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c"},
- {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71"},
- {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff"},
- {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d"},
- {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb"},
- {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8"},
- {file = "SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f"},
- {file = "SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959"},
- {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4"},
- {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855"},
- {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53"},
- {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a"},
- {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686"},
- {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588"},
- {file = "SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e"},
- {file = "SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5"},
- {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef"},
- {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8"},
- {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b"},
- {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2"},
- {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf"},
- {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c"},
- {file = "SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436"},
- {file = "SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88"},
- {file = "SQLAlchemy-2.0.36-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:be9812b766cad94a25bc63bec11f88c4ad3629a0cec1cd5d4ba48dc23860486b"},
- {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aae840ebbd6cdd41af1c14590e5741665e5272d2fee999306673a1bb1fdb4d"},
- {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4557e1f11c5f653ebfdd924f3f9d5ebfc718283b0b9beebaa5dd6b77ec290971"},
- {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07b441f7d03b9a66299ce7ccf3ef2900abc81c0db434f42a5694a37bd73870f2"},
- {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:28120ef39c92c2dd60f2721af9328479516844c6b550b077ca450c7d7dc68575"},
- {file = "SQLAlchemy-2.0.36-cp37-cp37m-win32.whl", hash = "sha256:b81ee3d84803fd42d0b154cb6892ae57ea6b7c55d8359a02379965706c7efe6c"},
- {file = "SQLAlchemy-2.0.36-cp37-cp37m-win_amd64.whl", hash = "sha256:f942a799516184c855e1a32fbc7b29d7e571b52612647866d4ec1c3242578fcb"},
- {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3d6718667da04294d7df1670d70eeddd414f313738d20a6f1d1f379e3139a545"},
- {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:72c28b84b174ce8af8504ca28ae9347d317f9dba3999e5981a3cd441f3712e24"},
- {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b11d0cfdd2b095e7b0686cf5fabeb9c67fae5b06d265d8180715b8cfa86522e3"},
- {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e32092c47011d113dc01ab3e1d3ce9f006a47223b18422c5c0d150af13a00687"},
- {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6a440293d802d3011028e14e4226da1434b373cbaf4a4bbb63f845761a708346"},
- {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c54a1e53a0c308a8e8a7dffb59097bff7facda27c70c286f005327f21b2bd6b1"},
- {file = "SQLAlchemy-2.0.36-cp38-cp38-win32.whl", hash = "sha256:1e0d612a17581b6616ff03c8e3d5eff7452f34655c901f75d62bd86449d9750e"},
- {file = "SQLAlchemy-2.0.36-cp38-cp38-win_amd64.whl", hash = "sha256:8958b10490125124463095bbdadda5aa22ec799f91958e410438ad6c97a7b793"},
- {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc022184d3e5cacc9579e41805a681187650e170eb2fd70e28b86192a479dcaa"},
- {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b817d41d692bf286abc181f8af476c4fbef3fd05e798777492618378448ee689"},
- {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e46a888b54be23d03a89be510f24a7652fe6ff660787b96cd0e57a4ebcb46d"},
- {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ae3005ed83f5967f961fd091f2f8c5329161f69ce8480aa8168b2d7fe37f06"},
- {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03e08af7a5f9386a43919eda9de33ffda16b44eb11f3b313e6822243770e9763"},
- {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3dbb986bad3ed5ceaf090200eba750b5245150bd97d3e67343a3cfed06feecf7"},
- {file = "SQLAlchemy-2.0.36-cp39-cp39-win32.whl", hash = "sha256:9fe53b404f24789b5ea9003fc25b9a3988feddebd7e7b369c8fac27ad6f52f28"},
- {file = "SQLAlchemy-2.0.36-cp39-cp39-win_amd64.whl", hash = "sha256:af148a33ff0349f53512a049c6406923e4e02bf2f26c5fb285f143faf4f0e46a"},
- {file = "SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e"},
- {file = "sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5"},
-]
-
-[package.dependencies]
-greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"}
-typing-extensions = ">=4.6.0"
-
-[package.extras]
-aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"]
-aioodbc = ["aioodbc", "greenlet (!=0.4.17)"]
-aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"]
-asyncio = ["greenlet (!=0.4.17)"]
-asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"]
-mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"]
-mssql = ["pyodbc"]
-mssql-pymssql = ["pymssql"]
-mssql-pyodbc = ["pyodbc"]
-mypy = ["mypy (>=0.910)"]
-mysql = ["mysqlclient (>=1.4.0)"]
-mysql-connector = ["mysql-connector-python"]
-oracle = ["cx_oracle (>=8)"]
-oracle-oracledb = ["oracledb (>=1.0.1)"]
-postgresql = ["psycopg2 (>=2.7)"]
-postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"]
-postgresql-pg8000 = ["pg8000 (>=1.29.1)"]
-postgresql-psycopg = ["psycopg (>=3.0.7)"]
-postgresql-psycopg2binary = ["psycopg2-binary"]
-postgresql-psycopg2cffi = ["psycopg2cffi"]
-postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"]
-pymysql = ["pymysql"]
-sqlcipher = ["sqlcipher3_binary"]
-
-[[package]]
-name = "sqlmodel"
-version = "0.0.22"
-description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness."
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "sqlmodel-0.0.22-py3-none-any.whl", hash = "sha256:a1ed13e28a1f4057cbf4ff6cdb4fc09e85702621d3259ba17b3c230bfb2f941b"},
- {file = "sqlmodel-0.0.22.tar.gz", hash = "sha256:7d37c882a30c43464d143e35e9ecaf945d88035e20117bf5ec2834a23cbe505e"},
-]
-
-[package.dependencies]
-pydantic = ">=1.10.13,<3.0.0"
-SQLAlchemy = ">=2.0.14,<2.1.0"
-
-[[package]]
-name = "stack-data"
-version = "0.6.3"
-description = "Extract data from python stack frames and tracebacks for informative displays"
-optional = false
-python-versions = "*"
-groups = ["main"]
-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"
-groups = ["main"]
-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 = "tinycss2"
-version = "1.4.0"
-description = "A tiny CSS parser"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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 = "tomli"
-version = "2.2.1"
-description = "A lil' TOML parser"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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 = "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"
-groups = ["main"]
-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"
-description = "Fast, Extensible Progress Meter"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-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 = "traitlets"
-version = "5.14.3"
-description = "Traitlets Python configuration system"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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 = "trio"
-version = "0.28.0"
-description = "A friendly Python library for async concurrency and I/O"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "trio-0.28.0-py3-none-any.whl", hash = "sha256:56d58977acc1635735a96581ec70513cc781b8b6decd299c487d3be2a721cd94"},
- {file = "trio-0.28.0.tar.gz", hash = "sha256:4e547896fe9e8a5658e54e4c7c5fa1db748cbbbaa7c965e7d40505b928c73c05"},
-]
-
-[package.dependencies]
-attrs = ">=23.2.0"
-cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""}
-idna = "*"
-outcome = "*"
-sniffio = ">=1.3.0"
-sortedcontainers = "*"
-
-[[package]]
-name = "trio-websocket"
-version = "0.11.1"
-description = "WebSocket library for Trio"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "trio-websocket-0.11.1.tar.gz", hash = "sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f"},
- {file = "trio_websocket-0.11.1-py3-none-any.whl", hash = "sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638"},
-]
-
-[package.dependencies]
-trio = ">=0.11"
-wsproto = ">=0.14"
-
-[[package]]
-name = "types-python-dateutil"
-version = "2.9.0.20241206"
-description = "Typing stubs for python-dateutil"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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"
-description = "Backported and Experimental Type Hints for Python 3.8+"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-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 = "tzdata"
-version = "2024.2"
-description = "Provider of IANA time zone data"
-optional = false
-python-versions = ">=2"
-groups = ["main"]
-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"
-groups = ["main"]
-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.3.0"
-description = "HTTP library with thread-safe connection pooling, file post, and more."
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
- {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
-]
-
-[package.dependencies]
-pysocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""}
-
-[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 = "usaddress"
-version = "0.5.11"
-description = "Parse US addresses using conditional random fields"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "usaddress-0.5.11-py3-none-any.whl", hash = "sha256:a745be0ff0c525d64463f19f2ec798bb1679a9bb6864b0d9a8b9054023f683b5"},
- {file = "usaddress-0.5.11.tar.gz", hash = "sha256:eec4c473b94e2a29350ee335f18bac7fe4fa698e08271211dad5fed63bdd3e60"},
-]
-
-[package.dependencies]
-probableparsing = "*"
-python-crfsuite = ">=0.7"
-
-[package.extras]
-dev = ["black", "flake8", "isort", "mypy", "parserator", "pytest"]
-
-[[package]]
-name = "usaddress-scourgify"
-version = "0.6.0"
-description = "Clean US addresses following USPS pub 28 and RESO guidelines"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "usaddress_scourgify-0.6.0-py3-none-any.whl", hash = "sha256:2bd1e2136ac70ba2fe412482dcd6cfad40f5298dd49685e105b68fd89f881999"},
-]
-
-[package.dependencies]
-geocoder = ">=1.22.6"
-usaddress = ">=0.5.9"
-yaml-config = ">=0.1.2"
-
-[[package]]
-name = "wcwidth"
-version = "0.2.13"
-description = "Measures the displayed width of unicode strings in a terminal"
-optional = false
-python-versions = "*"
-groups = ["main"]
-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"
-groups = ["main"]
-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 = "*"
-groups = ["main"]
-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"
-groups = ["main"]
-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 = "widgetsnbextension"
-version = "4.0.13"
-description = "Jupyter interactive widgets for Jupyter Notebook"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71"},
- {file = "widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6"},
-]
-
-[[package]]
-name = "wsproto"
-version = "1.2.0"
-description = "WebSockets state-machine based protocol implementation"
-optional = false
-python-versions = ">=3.7.0"
-groups = ["main"]
-files = [
- {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"},
- {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"},
-]
-
-[package.dependencies]
-h11 = ">=0.9.0,<1"
-
-[[package]]
-name = "yaml-config"
-version = "0.1.5"
-description = "Python client for reading yaml based config files"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "yaml-config-0.1.5.tar.gz", hash = "sha256:5924c92d8e7c49fa9ab2ef8bb3122794b261f217b14e69698a481d4e3ba535b5"},
- {file = "yaml_config-0.1.5-py2.py3-none-any.whl", hash = "sha256:8d30a65eab4eb303af252350375c75fbae179854d47e26327c7ae0a9177f29be"},
-]
-
-[package.dependencies]
-PyYAML = ">=3.13"
-
-[metadata]
-lock-version = "2.1"
-python-versions = ">=3.12.8"
-content-hash = "4226ee2d2284edff1530029fe1985b86b031ec47f2a48360378154898c0d9b7b"
diff --git a/production_loader.py b/production_loader.py
new file mode 100644
index 0000000..bcc0a7e
--- /dev/null
+++ b/production_loader.py
@@ -0,0 +1,1053 @@
+#!/usr/bin/env python3
+"""
+Production-ready campaign finance data loader with batch processing.
+Features:
+- Batch processing for memory efficiency
+- Comprehensive error handling and logging
+- Progress tracking with rich output
+- Address and committee deduplication
+- Transaction rollback on errors
+- Performance metrics
+- Configurable batch sizes and limits
+"""
+
+import time
+import logging
+import re
+from itertools import islice
+from pathlib import Path
+from typing import Dict, List, Tuple, Optional
+from dataclasses import dataclass
+from rich.console import Console
+from rich.progress import Progress, SpinnerColumn, TextColumn, BarColumn, TaskProgressColumn, TimeElapsedColumn
+from rich.table import Table
+from rich.panel import Panel
+from rich import print as rprint
+
+from sqlalchemy import text
+from sqlmodel import select
+
+from app.ingest import GenericFileReader, SchemaValidationError, build_schema_for_states, build_unified_schema
+from app.states.unified_field_library import field_library
+from sqlalchemy.exc import InvalidRequestError
+
+from app.states.unified_sqlmodels import (
+ unified_sql_processor,
+ UnifiedCommittee,
+ UnifiedAddress,
+ UnifiedEntity,
+ UnifiedCampaign,
+ UnifiedPerson,
+ FileOrigin,
+ State,
+ EntityType,
+)
+from app.states.postgres_config import create_postgres_database_manager
+from loader_config import get_config, get_file_config
+
+# Configure logging
+logging.basicConfig(
+ level=logging.INFO,
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
+ handlers=[
+ logging.FileHandler('campaign_finance_loader.log'),
+ logging.StreamHandler()
+ ]
+)
+logger = logging.getLogger(__name__)
+
+US_STATE_METADATA: Dict[str, Tuple[str, str]] = {
+ "alabama": ("AL", "Alabama"),
+ "alaska": ("AK", "Alaska"),
+ "arizona": ("AZ", "Arizona"),
+ "arkansas": ("AR", "Arkansas"),
+ "california": ("CA", "California"),
+ "colorado": ("CO", "Colorado"),
+ "connecticut": ("CT", "Connecticut"),
+ "delaware": ("DE", "Delaware"),
+ "florida": ("FL", "Florida"),
+ "georgia": ("GA", "Georgia"),
+ "hawaii": ("HI", "Hawaii"),
+ "idaho": ("ID", "Idaho"),
+ "illinois": ("IL", "Illinois"),
+ "indiana": ("IN", "Indiana"),
+ "iowa": ("IA", "Iowa"),
+ "kansas": ("KS", "Kansas"),
+ "kentucky": ("KY", "Kentucky"),
+ "louisiana": ("LA", "Louisiana"),
+ "maine": ("ME", "Maine"),
+ "maryland": ("MD", "Maryland"),
+ "massachusetts": ("MA", "Massachusetts"),
+ "michigan": ("MI", "Michigan"),
+ "minnesota": ("MN", "Minnesota"),
+ "mississippi": ("MS", "Mississippi"),
+ "missouri": ("MO", "Missouri"),
+ "montana": ("MT", "Montana"),
+ "nebraska": ("NE", "Nebraska"),
+ "nevada": ("NV", "Nevada"),
+ "new hampshire": ("NH", "New Hampshire"),
+ "new jersey": ("NJ", "New Jersey"),
+ "new mexico": ("NM", "New Mexico"),
+ "new york": ("NY", "New York"),
+ "north carolina": ("NC", "North Carolina"),
+ "north dakota": ("ND", "North Dakota"),
+ "ohio": ("OH", "Ohio"),
+ "oklahoma": ("OK", "Oklahoma"),
+ "oregon": ("OR", "Oregon"),
+ "pennsylvania": ("PA", "Pennsylvania"),
+ "rhode island": ("RI", "Rhode Island"),
+ "south carolina": ("SC", "South Carolina"),
+ "south dakota": ("SD", "South Dakota"),
+ "tennessee": ("TN", "Tennessee"),
+ "texas": ("TX", "Texas"),
+ "utah": ("UT", "Utah"),
+ "vermont": ("VT", "Vermont"),
+ "virginia": ("VA", "Virginia"),
+ "washington": ("WA", "Washington"),
+ "west virginia": ("WV", "West Virginia"),
+ "wisconsin": ("WI", "Wisconsin"),
+ "wyoming": ("WY", "Wyoming"),
+}
+
+@dataclass
+class LoaderConfig:
+ """Configuration for the production loader"""
+ batch_size: int = 100
+ max_records: Optional[int] = None
+ commit_frequency: int = 50 # Commit every N batches
+ enable_progress: bool = True
+ enable_logging: bool = True
+ retry_failed: bool = True
+ max_retries: int = 3
+
+@dataclass
+class LoaderStats:
+ """Statistics for the loader"""
+ total_records: int = 0
+ successful_records: int = 0
+ failed_records: int = 0
+ skipped_records: int = 0
+ start_time: float = 0
+ end_time: float = 0
+
+ @property
+ def success_rate(self) -> float:
+ if self.total_records == 0:
+ return 0.0
+ return (self.successful_records / self.total_records) * 100
+
+ @property
+ def duration(self) -> float:
+ return self.end_time - self.start_time
+
+ @property
+ def records_per_second(self) -> float:
+ if self.duration == 0:
+ return 0.0
+ return self.successful_records / self.duration
+
+class ProductionLoader:
+ """Production-ready campaign finance data loader"""
+
+ def __init__(self, config: LoaderConfig):
+ self.config = config
+ self.console = Console()
+ self.stats = LoaderStats()
+ self.db_manager = create_postgres_database_manager()
+
+ # Caches for deduplication
+ self.address_cache: Dict[Tuple, object] = {}
+ self.committee_cache: Dict[str, object] = {}
+ self.entity_cache: Dict[Tuple, UnifiedEntity] = {}
+ self.campaign_cache: Dict[Tuple[str, Optional[str], Optional[str], Optional[int]], object] = {}
+ self.person_cache: Dict[Tuple, UnifiedPerson] = {}
+ self.state_cache: Dict[str, State] = {}
+ self.state_code_cache: Dict[str, State] = {}
+ self.file_origin_cache: Dict[str, FileOrigin] = {}
+ self.active_state: Optional[State] = None
+ self.active_state_code: Optional[str] = None
+ self.active_state_slug: Optional[str] = None
+
+ # Reader cache (state -> GenericFileReader)
+ self.reader_cache: Dict[str, GenericFileReader] = {}
+
+ # Error tracking
+ self.errors: List[Dict] = []
+ self.failed_records: List[Dict] = []
+
+ @staticmethod
+ def _normalize_name(value: Optional[str]) -> str:
+ if not value:
+ return ""
+ normalized = value.strip().lower()
+ normalized = re.sub(r"[^a-z0-9]+", " ", normalized)
+ normalized = re.sub(r"\s+", " ", normalized)
+ return normalized.strip()
+
+ @staticmethod
+ def _address_key(address) -> Tuple[str, str, str, str]:
+ if not address:
+ return ("", "", "", "")
+ return (
+ (address.street_1 or "").strip().upper(),
+ (address.city or "").strip().upper(),
+ (address.state or "").strip().upper(),
+ (address.zip_code or "").strip()
+ )
+
+ def _resolve_state_metadata(self, state_key: str) -> Tuple[str, str]:
+ normalized = (state_key or "").strip().lower()
+ if normalized in US_STATE_METADATA:
+ return US_STATE_METADATA[normalized]
+ if len(normalized) == 2:
+ for slug, (code, name) in US_STATE_METADATA.items():
+ if code.lower() == normalized:
+ return code, name
+ raise ValueError(f"Unsupported state identifier '{state_key}'. Unable to resolve metadata.")
+
+ def _ensure_state(self, session, state_key: str) -> State:
+ normalized = (state_key or "").strip().lower()
+ if normalized in self.state_cache:
+ return self.state_cache[normalized]
+
+ code, name = self._resolve_state_metadata(state_key)
+ cached_by_code = self.state_code_cache.get(code)
+ if cached_by_code:
+ self.state_cache[normalized] = cached_by_code
+ return cached_by_code
+
+ state = session.exec(
+ select(State).where(State.code == code)
+ ).first()
+ if not state:
+ state = State(code=code, name=name)
+ session.add(state)
+ session.flush()
+
+ self.state_cache[normalized] = state
+ self.state_code_cache[code] = state
+ return state
+
+ def _ensure_file_origin(self, session, state: State, filename: Optional[str]) -> Optional[FileOrigin]:
+ if not filename:
+ return None
+ key = FileOrigin.build_key(state.id, filename)
+ cached = self.file_origin_cache.get(key)
+ if cached:
+ return cached
+ file_origin = session.get(FileOrigin, key)
+ if not file_origin:
+ file_origin = FileOrigin(id=key, state_id=state.id, filename=filename)
+ session.add(file_origin)
+ self.file_origin_cache[key] = file_origin
+ return file_origin
+
+ def _entity_key(self, entity) -> Optional[Tuple]:
+ if not entity:
+ return None
+ entity_type = getattr(entity, "entity_type", None)
+ if not entity_type:
+ return None
+ if entity_type == EntityType.PERSON:
+ person = getattr(entity, "person", None)
+ if person and getattr(person, "uuid", None):
+ return (entity_type.value, f"person_uuid:{person.uuid}")
+ person_id = getattr(entity, "person_id", None)
+ if person_id:
+ return (entity_type.value, f"person_id:{person_id}")
+ return None
+ if entity_type == EntityType.COMMITTEE:
+ return None
+ normalized_name = entity.normalized_name or self._normalize_name(entity.name)
+ if not normalized_name:
+ return None
+ return (entity_type.value, normalized_name, self._address_key(entity.address))
+
+ def _campaign_key(self, campaign) -> Optional[Tuple[str, Optional[str], Optional[str], Optional[int]]]:
+ if not campaign:
+ return None
+ normalized_name = campaign.normalized_name or self._normalize_name(campaign.name)
+ if not normalized_name:
+ return None
+ candidate_name = None
+ if getattr(campaign, "candidate", None):
+ candidate_name = campaign.candidate.full_name
+ return (normalized_name, campaign.primary_committee_id, candidate_name, campaign.election_year)
+
+ def _person_key(self, person: Optional[UnifiedPerson]) -> Optional[Tuple]:
+ if not person:
+ return None
+ first = (person.first_name or "").strip().lower()
+ last = (person.last_name or "").strip().lower()
+ middle = (person.middle_name or "").strip().lower() if person.middle_name else ""
+ suffix = (person.suffix or "").strip().lower() if person.suffix else ""
+ organization = (person.organization or "").strip().lower() if person.organization else ""
+ address_id = getattr(person, "address_id", None)
+ if not address_id and getattr(person, "address", None):
+ address = person.address
+ address_id = getattr(address, "id", None)
+ if not any([first, last, organization]):
+ return None
+ address_component = address_id if address_id is not None else "__no_address__"
+ return (first, middle, last, suffix, organization, address_component)
+
+ def _ensure_person(self, session, person: Optional[UnifiedPerson]) -> Optional[UnifiedPerson]:
+ if not person:
+ return None
+ key = self._person_key(person)
+ if not key:
+ return person
+ if self.active_state and getattr(person, "state_id", None) is None:
+ person.state_id = self.active_state.id
+ cached_person = self.person_cache.get(key)
+ if cached_person:
+ if self.active_state and getattr(cached_person, "state_id", None) is None:
+ cached_person.state_id = self.active_state.id
+ return cached_person
+
+ stmt = (
+ select(UnifiedPerson)
+ .where(
+ UnifiedPerson.first_name == person.first_name,
+ UnifiedPerson.last_name == person.last_name,
+ UnifiedPerson.organization == person.organization,
+ UnifiedPerson.address_id == person.address_id,
+ UnifiedPerson.middle_name == person.middle_name,
+ UnifiedPerson.suffix == person.suffix,
+ )
+ .limit(1)
+ )
+ existing_person = session.exec(stmt).first()
+ if existing_person:
+ if self.active_state and getattr(existing_person, "state_id", None) is None:
+ existing_person.state_id = self.active_state.id
+ self.person_cache[key] = existing_person
+ return existing_person
+
+ self.person_cache[key] = person
+ return person
+
+ def _dedupe_addresses(self, session) -> None:
+ session.exec(
+ text(
+ """
+ WITH dup AS (
+ SELECT id,
+ MIN(id) OVER (PARTITION BY street_1, city, state, zip_code) AS keep_id
+ FROM unified_addresses
+ )
+ UPDATE unified_persons up
+ SET address_id = dup.keep_id
+ FROM dup
+ WHERE up.address_id = dup.id
+ AND dup.id <> dup.keep_id
+ """
+ )
+ )
+ session.exec(
+ text(
+ """
+ WITH dup AS (
+ SELECT id,
+ MIN(id) OVER (PARTITION BY street_1, city, state, zip_code) AS keep_id
+ FROM unified_addresses
+ )
+ UPDATE unified_entities ue
+ SET address_id = dup.keep_id
+ FROM dup
+ WHERE ue.address_id = dup.id
+ AND dup.id <> dup.keep_id
+ """
+ )
+ )
+ session.exec(
+ text(
+ """
+ WITH dup AS (
+ SELECT id,
+ MIN(id) OVER (PARTITION BY street_1, city, state, zip_code) AS keep_id
+ FROM unified_addresses
+ )
+ UPDATE unified_committees uc
+ SET address_id = dup.keep_id
+ FROM dup
+ WHERE uc.address_id = dup.id
+ AND dup.id <> dup.keep_id
+ """
+ )
+ )
+ session.exec(
+ text(
+ """
+ DELETE FROM unified_addresses ua
+ USING (
+ SELECT id,
+ ROW_NUMBER() OVER (PARTITION BY street_1, city, state, zip_code ORDER BY id) AS rn
+ FROM unified_addresses
+ ) dup
+ WHERE ua.id = dup.id
+ AND dup.rn > 1
+ """
+ )
+ )
+
+ def _cleanup_orphan_persons(self, session) -> None:
+ session.exec(
+ text(
+ """
+ DELETE FROM unified_entities ue
+ WHERE ue.person_id IS NOT NULL
+ AND ue.person_id NOT IN (
+ SELECT id FROM unified_persons
+ )
+ """
+ )
+ )
+ session.exec(
+ text(
+ """
+ DELETE FROM unified_entities ue
+ WHERE ue.person_id IS NOT NULL
+ AND ue.person_id NOT IN (
+ SELECT DISTINCT person_id FROM unified_transaction_persons WHERE person_id IS NOT NULL
+ )
+ AND ue.person_id NOT IN (
+ SELECT DISTINCT candidate_person_id FROM unified_campaigns WHERE candidate_person_id IS NOT NULL
+ )
+ AND ue.person_id NOT IN (
+ SELECT DISTINCT person_id FROM unified_committee_persons WHERE person_id IS NOT NULL
+ )
+ """
+ )
+ )
+ session.exec(
+ text(
+ """
+ DELETE FROM unified_persons up
+ WHERE up.id NOT IN (
+ SELECT DISTINCT person_id FROM unified_transaction_persons WHERE person_id IS NOT NULL
+ )
+ AND up.id NOT IN (
+ SELECT DISTINCT candidate_person_id FROM unified_campaigns WHERE candidate_person_id IS NOT NULL
+ )
+ AND up.id NOT IN (
+ SELECT DISTINCT person_id FROM unified_committee_persons WHERE person_id IS NOT NULL
+ )
+ AND up.id NOT IN (
+ SELECT DISTINCT person_id FROM unified_entities WHERE person_id IS NOT NULL
+ )
+ """
+ )
+ )
+
+ def _update_person_references(self, session, old_id: int, new_id: int) -> None:
+ reference_tables = [
+ ("unified_transaction_persons", "person_id"),
+ ("unified_committee_persons", "person_id"),
+ ("unified_campaigns", "candidate_person_id"),
+ ]
+ for table, column in reference_tables:
+ session.exec(
+ text(f"UPDATE {table} SET {column} = :new WHERE {column} = :old").bindparams(
+ new=new_id, old=old_id
+ )
+ )
+
+ def _update_entity_references(self, session, old_id: int, new_id: int) -> None:
+ reference_tables = [
+ ("unified_transaction_persons", "entity_id"),
+ ("unified_contributions", "contributor_entity_id"),
+ ("unified_contributions", "recipient_entity_id"),
+ ("unified_loans", "lender_entity_id"),
+ ("unified_loans", "borrower_entity_id"),
+ ("unified_campaign_entities", "entity_id"),
+ ("unified_entity_associations", "source_entity_id"),
+ ("unified_entity_associations", "target_entity_id"),
+ ]
+ for table, column in reference_tables:
+ session.exec(
+ text(f"UPDATE {table} SET {column} = :new WHERE {column} = :old").bindparams(
+ new=new_id, old=old_id
+ )
+ )
+
+ def _dedupe_persons_and_entities(self, session) -> None:
+ duplicate_groups = session.exec(
+ text(
+ """
+ SELECT first_name, middle_name, last_name, suffix, organization, address_id,
+ array_agg(id ORDER BY id) AS person_ids
+ FROM unified_persons
+ GROUP BY first_name, middle_name, last_name, suffix, organization, address_id
+ HAVING COUNT(*) > 1
+ """
+ )
+ ).all()
+
+ for row in duplicate_groups:
+ person_ids = list(row.person_ids)
+ if not person_ids:
+ continue
+ keep_person_id = person_ids[0]
+ entities = session.exec(
+ select(UnifiedEntity).where(UnifiedEntity.person_id.in_(person_ids))
+ ).all()
+ keep_entity = next((entity for entity in entities if entity.person_id == keep_person_id), None)
+ if not keep_entity and entities:
+ keep_entity = entities[0]
+ session.exec(
+ text("UPDATE unified_entities SET person_id = :keep WHERE id = :entity_id").bindparams(
+ keep=keep_person_id, entity_id=keep_entity.id
+ )
+ )
+ keep_entity_id = keep_entity.id if keep_entity else None
+
+ for person_id in person_ids[1:]:
+ self._update_person_references(session, person_id, keep_person_id)
+
+ duplicate_entities = [entity for entity in entities if entity.person_id == person_id]
+ for entity in duplicate_entities:
+ if keep_entity_id is not None:
+ self._update_entity_references(session, entity.id, keep_entity_id)
+ session.exec(
+ text("DELETE FROM unified_entities WHERE id = :entity_id").bindparams(
+ entity_id=entity.id
+ )
+ )
+ else:
+ session.exec(
+ text("UPDATE unified_entities SET person_id = :keep WHERE id = :entity_id").bindparams(
+ keep=keep_person_id, entity_id=entity.id
+ )
+ )
+ keep_entity_id = entity.id
+
+ session.exec(
+ text("DELETE FROM unified_persons WHERE id = :person_id").bindparams(person_id=person_id)
+ )
+
+ keep_person = session.get(UnifiedPerson, keep_person_id)
+ if keep_person:
+ key = self._person_key(keep_person)
+ if key:
+ self.person_cache[key] = keep_person
+
+
+ def _cache_entity(self, entity):
+ key = self._entity_key(entity)
+ if not key:
+ return entity
+ cached = self.entity_cache.get(key)
+ if cached:
+ if self.active_state and getattr(cached, "state_id", None) is None:
+ cached.state_id = self.active_state.id
+ return cached
+ if not entity.normalized_name:
+ entity.normalized_name = key[1]
+ if self.active_state and getattr(entity, "state_id", None) is None:
+ entity.state_id = self.active_state.id
+ self.entity_cache[key] = entity
+ return entity
+
+ def _cache_campaign(self, campaign):
+ key = self._campaign_key(campaign)
+ if not key:
+ return campaign
+ cached = self.campaign_cache.get(key)
+ if cached:
+ if self.active_state and getattr(cached, "state_id", None) is None:
+ cached.state_id = self.active_state.id
+ return cached
+ if not campaign.normalized_name:
+ campaign.normalized_name = key[0]
+ if self.active_state and getattr(campaign, "state_id", None) is None:
+ campaign.state_id = self.active_state.id
+ self.campaign_cache[key] = campaign
+ return campaign
+
+ def _ensure_address(self, session, address):
+ if not address:
+ return None
+ key = self._address_key(address)
+ if key in self.address_cache:
+ return self.address_cache[key]
+ session.add(address)
+ session.flush()
+ self.address_cache[key] = address
+ return address
+
+ def _ensure_committee(self, session, committee: UnifiedCommittee) -> UnifiedCommittee:
+ if not committee or not getattr(committee, "filer_id", None):
+ return committee
+ filer_id = committee.filer_id
+ existing = self.committee_cache.get(filer_id)
+ if not existing:
+ existing = session.get(UnifiedCommittee, filer_id)
+ if existing:
+ self.committee_cache[filer_id] = existing
+ if existing:
+ if self.active_state and getattr(existing, "state_id", None) is None:
+ existing.state_id = self.active_state.id
+ if committee.address and not existing.address:
+ original_address = committee.address
+ ensured_address = self._ensure_address(session, original_address)
+ existing.address = ensured_address
+ existing.address_id = ensured_address.id
+ if existing.entity and ensured_address:
+ existing.entity.address = ensured_address
+ existing.entity.address_id = ensured_address.id
+ if self.active_state and getattr(existing.entity, "state_id", None) is None:
+ existing.entity.state_id = self.active_state.id
+ if original_address is not ensured_address and original_address is not None:
+ try:
+ session.expunge(original_address)
+ except InvalidRequestError:
+ pass
+ if committee.entity and not existing.entity:
+ committee.entity.committee = existing
+ if committee.address and committee.entity:
+ ensured_address = self._ensure_address(session, committee.address)
+ committee.entity.address = ensured_address
+ committee.entity.address_id = ensured_address.id if ensured_address else None
+ if self.active_state and getattr(committee.entity, "state_id", None) is None:
+ committee.entity.state_id = self.active_state.id
+ existing.entity = committee.entity
+ session.add(existing.entity)
+ return existing
+ if committee.address:
+ original_address = committee.address
+ ensured_address = self._ensure_address(session, original_address)
+ committee.address = ensured_address
+ committee.address_id = ensured_address.id
+ if committee.entity and ensured_address:
+ committee.entity.address = ensured_address
+ committee.entity.address_id = ensured_address.id
+ if self.active_state and getattr(committee.entity, "state_id", None) is None:
+ committee.entity.state_id = self.active_state.id
+ if original_address is not ensured_address and original_address is not None:
+ try:
+ session.expunge(original_address)
+ except InvalidRequestError:
+ pass
+ if self.active_state and getattr(committee, "state_id", None) is None:
+ committee.state_id = self.active_state.id
+ session.add(committee)
+ session.flush()
+ self.committee_cache[filer_id] = committee
+ return committee
+
+ def load_existing_data(self, session) -> None:
+ """Pre-load existing addresses and committees for deduplication"""
+ self.console.print("📋 Loading existing data for deduplication...", style="blue")
+
+ # Load existing addresses
+ existing_addresses = session.exec(text("SELECT id, street_1, city, state, zip_code FROM unified_addresses")).all()
+ for addr in existing_addresses:
+ full_addr = session.get(UnifiedAddress, addr.id)
+ key = self._address_key(full_addr)
+ if key[0] or key[1]:
+ self.address_cache[key] = full_addr
+
+ # Load existing committees
+ existing_committees = session.exec(text("SELECT filer_id FROM unified_committees")).all()
+ for committee in existing_committees:
+ full_committee = session.get(UnifiedCommittee, committee.filer_id)
+ self.committee_cache[full_committee.filer_id] = full_committee
+
+ # Load existing entities
+ existing_entities = session.exec(text("SELECT id FROM unified_entities")).all()
+ for entity in existing_entities:
+ full_entity = session.get(UnifiedEntity, entity.id)
+ key = self._entity_key(full_entity)
+ if key:
+ self.entity_cache[key] = full_entity
+
+ # Load existing persons
+ existing_persons = session.exec(text("SELECT id FROM unified_persons")).all()
+ for person_row in existing_persons:
+ full_person = session.get(UnifiedPerson, person_row.id)
+ key = self._person_key(full_person)
+ if key:
+ self.person_cache[key] = full_person
+
+ # Load existing campaigns
+ existing_campaigns = session.exec(text("SELECT id FROM unified_campaigns")).all()
+ for campaign in existing_campaigns:
+ full_campaign = session.get(UnifiedCampaign, campaign.id)
+ key = self._campaign_key(full_campaign)
+ if key:
+ self.campaign_cache[key] = full_campaign
+
+ # Load existing file origins
+ existing_file_origins = session.exec(text("SELECT id FROM file_origins")).all()
+ for file_origin in existing_file_origins:
+ fo = session.get(FileOrigin, file_origin.id)
+ if fo:
+ self.file_origin_cache[fo.id] = fo
+
+ self.console.print(f" 📍 Loaded {len(self.address_cache)} addresses", style="green")
+ self.console.print(f" 🏛️ Loaded {len(self.committee_cache)} committees", style="green")
+ self.console.print(f" 🧾 Loaded {len(self.entity_cache)} entities", style="green")
+ self.console.print(f" 🎯 Loaded {len(self.campaign_cache)} campaigns", style="green")
+
+ def process_batch(self, batch: List[Dict], session, progress_task, state: str) -> Tuple[int, int, int]:
+ """Process a batch of records"""
+ batch_success = 0
+ batch_errors = 0
+ batch_skipped = 0
+ active_state = self.active_state
+ if not active_state:
+ raise RuntimeError("Active state is not set before processing batch.")
+
+ for record in batch:
+ try:
+ # Ensure state metadata is present
+ record['state'] = state
+
+ # Process record
+ transaction = unified_sql_processor.process_record(
+ record,
+ state,
+ state_id=active_state.id,
+ state_code=self.active_state_code
+ )
+ transaction.state_id = active_state.id
+ file_origin_value = record.get("file_origin")
+ file_origin_obj = self._ensure_file_origin(session, active_state, file_origin_value)
+ if file_origin_obj:
+ transaction.file_origin_id = file_origin_obj.id
+ transaction.file_origin = file_origin_obj
+
+ if not transaction:
+ batch_skipped += 1
+ continue
+
+ final_committee = None
+ if transaction.committee:
+ final_committee = self._ensure_committee(session, transaction.committee)
+ if final_committee:
+ transaction.committee = final_committee
+ transaction.committee_id = final_committee.filer_id
+ if active_state and getattr(final_committee, "state_id", None) is None:
+ final_committee.state_id = active_state.id
+
+ if final_committee and transaction.contribution and transaction.contribution.recipient:
+ recipient_entity = transaction.contribution.recipient
+ if getattr(recipient_entity, "entity_type", None) == EntityType.COMMITTEE and final_committee.entity:
+ transaction.contribution.recipient = final_committee.entity
+ if final_committee and transaction.loan and transaction.loan.borrower:
+ borrower_entity = transaction.loan.borrower
+ if getattr(borrower_entity, "entity_type", None) == EntityType.COMMITTEE and final_committee.entity:
+ transaction.loan.borrower = final_committee.entity
+
+ if transaction.campaign:
+ if final_committee and getattr(transaction.campaign, "primary_committee", None):
+ if getattr(transaction.campaign.primary_committee, "filer_id", None) == final_committee.filer_id:
+ transaction.campaign.primary_committee = final_committee
+ if active_state and getattr(transaction.campaign, "state_id", None) is None:
+ transaction.campaign.state_id = active_state.id
+ updated_memberships = []
+ for membership in list(transaction.campaign.entities):
+ membership_entity = membership.entity
+ if final_committee and getattr(membership_entity, "entity_type", None) == EntityType.COMMITTEE and final_committee.entity:
+ membership.entity = final_committee.entity
+ membership.entity_id = final_committee.entity.id
+ else:
+ membership.entity = self._cache_entity(membership_entity)
+ if active_state and getattr(membership, "state_id", None) is None:
+ membership.state_id = active_state.id
+ updated_memberships.append(membership)
+ transaction.campaign.entities = updated_memberships
+ transaction.campaign = self._cache_campaign(transaction.campaign)
+
+ # Handle address deduplication for persons
+ for tx_person in transaction.persons:
+ if tx_person.person and tx_person.person.address:
+ original_address = tx_person.person.address
+ ensured_address = self._ensure_address(session, original_address)
+ if ensured_address:
+ tx_person.person.address_id = ensured_address.id
+ tx_person.person.address = ensured_address
+ if tx_person.person.entity:
+ tx_person.person.entity.address = ensured_address
+ tx_person.person.entity.address_id = ensured_address.id
+ if original_address is not ensured_address and original_address is not None:
+ try:
+ session.expunge(original_address)
+ except InvalidRequestError:
+ pass
+ if tx_person.person and tx_person.person.entity:
+ cached_entity = self._cache_entity(tx_person.person.entity)
+ tx_person.person.entity = cached_entity
+ tx_person.entity = cached_entity
+
+ if tx_person.person:
+ original_person = tx_person.person
+ ensured_person = self._ensure_person(session, tx_person.person)
+ tx_person.person = ensured_person
+ if ensured_person and ensured_person.entity:
+ tx_person.entity = ensured_person.entity
+ elif ensured_person and tx_person.entity and ensured_person.entity is None:
+ ensured_person.entity = tx_person.entity
+ if ensured_person.address and ensured_person.entity.address is None:
+ ensured_person.entity.address = ensured_person.address
+ ensured_person.entity.address_id = ensured_person.address_id
+ if original_person is not ensured_person:
+ try:
+ session.expunge(original_person)
+ except InvalidRequestError:
+ pass
+ if active_state and getattr(tx_person, "state_id", None) is None:
+ tx_person.state_id = active_state.id
+
+ if transaction.contribution:
+ if transaction.contribution.contributor:
+ transaction.contribution.contributor = self._cache_entity(transaction.contribution.contributor)
+ if transaction.contribution.recipient:
+ transaction.contribution.recipient = self._cache_entity(transaction.contribution.recipient)
+ if active_state and getattr(transaction.contribution, "state_id", None) is None:
+ transaction.contribution.state_id = active_state.id
+
+ if transaction.loan:
+ if transaction.loan.lender:
+ transaction.loan.lender = self._cache_entity(transaction.loan.lender)
+ if transaction.loan.borrower:
+ transaction.loan.borrower = self._cache_entity(transaction.loan.borrower)
+ if active_state and getattr(transaction.loan, "state_id", None) is None:
+ transaction.loan.state_id = active_state.id
+
+ # Save transaction
+ session.add(transaction)
+ batch_success += 1
+
+ except Exception as e:
+ batch_errors += 1
+ error_info = {
+ 'record': record,
+ 'error': str(e),
+ 'error_type': type(e).__name__
+ }
+ self.errors.append(error_info)
+ self.failed_records.append(record)
+ logger.error(f"Error processing record: {e}")
+
+ # Update progress
+ if progress_task:
+ progress_task.advance(len(batch))
+
+ return batch_success, batch_errors, batch_skipped
+
+ def _get_reader(self, state_key: str) -> GenericFileReader:
+ if state_key not in self.reader_cache:
+ if state_key == "generic":
+ schema = build_unified_schema()
+ elif state_key in field_library.state_mappings:
+ schema = build_schema_for_states([state_key])
+ else:
+ logger.warning("No field mappings registered for state '%s'; using unified schema", state_key)
+ schema = build_unified_schema()
+ self.reader_cache[state_key] = GenericFileReader(schema=schema, add_metadata=True, strict=False)
+ return self.reader_cache[state_key]
+
+ def load_file(self, file_path: Path, *, state: Optional[str] = None) -> LoaderStats:
+ """Load data from a file using the generic reader"""
+ if not file_path.exists():
+ raise FileNotFoundError(f"File not found: {file_path}")
+
+ state_key = state or "generic"
+ reader = self._get_reader(state_key)
+
+ self.stats = LoaderStats()
+ self.stats.start_time = time.time()
+
+ # Display header
+ self.console.print(Panel.fit(
+ f"[bold blue]Production Campaign Finance Loader[/bold blue]\n"
+ f"File: {file_path.name}\n"
+ f"Batch Size: {self.config.batch_size}\n"
+ f"Max Records: {self.config.max_records or 'All'}\n"
+ f"Commit Frequency: Every {self.config.commit_frequency} batches",
+ border_style="blue"
+ ))
+
+ try:
+ records_iter = reader.read_records(file_path)
+ except SchemaValidationError as exc:
+ raise SchemaValidationError(f"Failed to read {file_path.name}: {exc}") from exc
+
+ if self.config.max_records:
+ records_iter = islice(records_iter, self.config.max_records)
+
+ all_records: List[Dict] = []
+ for record in records_iter:
+ if state:
+ record.setdefault("state", state)
+ else:
+ record.setdefault("state", state_key)
+ all_records.append(record)
+
+ total_records = len(all_records)
+ self.stats.total_records = total_records
+
+ if total_records == 0:
+ self.console.print("No records found in file", style="yellow")
+ return self.stats
+
+ # Process in batches
+ with self.db_manager.get_session() as session:
+ # Load existing data
+ self.address_cache.clear()
+ self.committee_cache.clear()
+ self.entity_cache.clear()
+ self.campaign_cache.clear()
+ self.person_cache.clear()
+ self.file_origin_cache.clear()
+ self.load_existing_data(session)
+ self.active_state_slug = state_key.lower()
+ self.active_state = self._ensure_state(session, state_key)
+ self.active_state_code = self.active_state.code
+
+ if self.config.enable_progress:
+ with Progress(
+ SpinnerColumn(),
+ TextColumn("[progress.description]{task.description}"),
+ BarColumn(),
+ TaskProgressColumn(),
+ TimeElapsedColumn(),
+ console=self.console
+ ) as progress:
+ task = progress.add_task("Processing records...", total=total_records)
+ for i in range(0, total_records, self.config.batch_size):
+ batch = all_records[i:i + self.config.batch_size]
+ batch_num = (i // self.config.batch_size) + 1
+ success, errors, skipped = self.process_batch(batch, session, task, state_key)
+ self.stats.successful_records += success
+ self.stats.failed_records += errors
+ self.stats.skipped_records += skipped
+ if batch_num % self.config.commit_frequency == 0:
+ session.commit()
+ self.console.print(f"✅ Committed batch {batch_num}", style="green")
+ if self.config.enable_logging:
+ logger.info(f"Batch {batch_num}: {success} success, {errors} errors, {skipped} skipped")
+ self._dedupe_addresses(session)
+ self._dedupe_persons_and_entities(session)
+ session.commit()
+ else:
+ for i in range(0, total_records, self.config.batch_size):
+ batch = all_records[i:i + self.config.batch_size]
+ batch_num = (i // self.config.batch_size) + 1
+ success, errors, skipped = self.process_batch(batch, session, None, state_key)
+ self.stats.successful_records += success
+ self.stats.failed_records += errors
+ self.stats.skipped_records += skipped
+ if batch_num % self.config.commit_frequency == 0:
+ session.commit()
+ self.console.print(f"✅ Committed batch {batch_num}", style="green")
+ self._dedupe_addresses(session)
+ self._dedupe_persons_and_entities(session)
+ session.commit()
+ self.active_state = None
+ self.active_state_code = None
+ self.active_state_slug = None
+
+ self.stats.end_time = time.time()
+ self.display_results()
+ return self.stats
+
+ def display_results(self) -> None:
+ """Display comprehensive results"""
+ # Create results table
+ table = Table(title="📊 Loader Results", show_header=True, header_style="bold blue")
+ table.add_column("Metric", style="cyan")
+ table.add_column("Value", style="green")
+
+ table.add_row("Total Records", str(self.stats.total_records))
+ table.add_row("Successful", str(self.stats.successful_records))
+ table.add_row("Failed", str(self.stats.failed_records))
+ table.add_row("Skipped", str(self.stats.skipped_records))
+ table.add_row("Success Rate", f"{self.stats.success_rate:.1f}%")
+ table.add_row("Duration", f"{self.stats.duration:.2f}s")
+ table.add_row("Records/Second", f"{self.stats.records_per_second:.1f}")
+ table.add_row("Address Cache", str(len(self.address_cache)))
+ table.add_row("Committee Cache", str(len(self.committee_cache)))
+
+ self.console.print(table)
+
+ # Display errors if any
+ if self.errors:
+ error_table = Table(title="❌ Errors Summary", show_header=True, header_style="bold red")
+ error_table.add_column("Error Type", style="red")
+ error_table.add_column("Count", style="red")
+
+ error_counts = {}
+ for error in self.errors:
+ error_type = error['error_type']
+ error_counts[error_type] = error_counts.get(error_type, 0) + 1
+
+ for error_type, count in error_counts.items():
+ error_table.add_row(error_type, str(count))
+
+ self.console.print(error_table)
+
+ # Display database summary
+ self.display_database_summary()
+
+ def display_database_summary(self) -> None:
+ """Display current database state"""
+ with self.db_manager.get_session() as session:
+ from sqlalchemy import text
+
+ tx_count = session.exec(text("SELECT COUNT(*) FROM unified_transactions")).first()
+ committee_count = session.exec(text("SELECT COUNT(*) FROM unified_committees")).first()
+ address_count = session.exec(text("SELECT COUNT(*) FROM unified_addresses")).first()
+
+ db_table = Table(title="🗄️ Database Summary", show_header=True, header_style="bold blue")
+ db_table.add_column("Table", style="cyan")
+ db_table.add_column("Count", style="green")
+
+ db_table.add_row("Transactions", str(tx_count))
+ db_table.add_row("Committees", str(committee_count))
+ db_table.add_row("Addresses", str(address_count))
+
+ self.console.print(db_table)
+
+def main():
+ """Main function"""
+ import sys
+
+ # Get preset from command line argument or use default
+ preset = sys.argv[1] if len(sys.argv) > 1 else "testing"
+ file_key = sys.argv[2] if len(sys.argv) > 2 else "oklahoma_2020"
+
+ try:
+ # Get configuration
+ config = get_config(preset)
+ file_config = get_file_config(file_key)
+
+ rprint(f"🔧 Using preset: {preset}")
+ rprint(f"📁 Loading file: {file_config['description']}")
+
+ # Create loader
+ loader = ProductionLoader(config)
+
+ # Load file
+ file_path = file_config['file_path']
+ state = file_config.get('state')
+
+ stats = loader.load_file(file_path, state=state)
+ rprint(f"\n🎉 Load completed successfully!")
+ rprint(f"📈 Performance: {stats.records_per_second:.1f} records/second")
+ rprint(f"✅ Success Rate: {stats.success_rate:.1f}%")
+
+ except Exception as e:
+ rprint(f"\n❌ Load failed: {e}")
+ logger.error(f"Load failed: {e}", exc_info=True)
+
+ # Show usage if argument error
+ if "Unknown preset" in str(e) or "Unknown file key" in str(e):
+ rprint(f"\n📖 Usage: python production_loader.py [preset] [file_key]")
+ rprint(f"📋 Available presets: development, testing, production, high_performance, safe")
+ rprint(f"📁 Available files: oklahoma_2020, oklahoma_2021, texas_sample")
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index d7396f1..1fbc2bd 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -22,6 +22,7 @@ dependencies = [
"requests>=2.32.3",
"selenium>=4.27.1",
"sqlmodel>=0.0.22",
+ "psycopg2-binary>=2.9.9",
"tomli>=2.2.1",
"tqdm>=4.67.1",
"usaddress-scourgify>=0.6.0",
@@ -29,7 +30,11 @@ dependencies = [
"jupyter>=1.1.1",
"rich>=13.9.4",
"polars>=1.19.0",
+ "web-scrape-utils",
+ "pyarrow>=19.0.0",
+ "hypothesis>=6.112.1",
+ "pytest>=8.3.3",
]
-[tool.uv.workspace]
-members = ["packages/*"]
+[tool.uv.sources]
+web-scrape-utils = { git = "https://github.com/jreakin/jre-web-scrape-utils.git", branch = "jan25-web-scrape" }
diff --git a/recreate_tables.py b/recreate_tables.py
new file mode 100644
index 0000000..f8a1c75
--- /dev/null
+++ b/recreate_tables.py
@@ -0,0 +1,117 @@
+#!/usr/bin/env python3
+"""
+Recreate the unified tables with the correct schema.
+"""
+
+from rich.console import Console
+from sqlalchemy import text, create_engine
+from sqlmodel import SQLModel
+
+from app.states.postgres_config import PostgresConfig
+# Import unified SQLModels to ensure metadata is registered
+from app.states import unified_sqlmodels # noqa: F401
+
+def recreate_unified_tables():
+ """Drop and recreate all unified tables with correct schema."""
+ console = Console()
+
+ console.print("\n[bold blue]Recreating Unified Tables[/bold blue]")
+ console.print("=" * 35)
+
+ # Setup PostgreSQL
+ try:
+ config = PostgresConfig()
+ console.print(f"[green]✅ Connected to database: {config.database}[/green]")
+
+ # Create engine
+ engine = create_engine(config.database_url)
+ console.print("[green]✅ Database engine created successfully![/green]")
+
+ except Exception as e:
+ console.print(f"[red]❌ Setup failed: {e}[/red]")
+ return
+
+ # Drop existing unified tables
+ console.print("\n[bold blue]Dropping existing unified tables...[/bold blue]")
+ try:
+ with engine.connect() as conn:
+ # Drop tables in reverse dependency order
+ tables_to_drop = [
+ 'unified_committee_person_versions',
+ 'unified_transaction_versions',
+ 'unified_person_versions',
+ 'unified_committee_versions',
+ 'unified_address_versions',
+ 'unified_campaign_entities',
+ 'unified_entity_associations',
+ 'unified_transaction_persons',
+ 'unified_committee_persons',
+ 'unified_contributions',
+ 'unified_loans',
+ 'unified_transactions',
+ 'file_origins',
+ 'unified_campaigns',
+ 'unified_entities',
+ 'unified_persons',
+ 'unified_committees',
+ 'unified_addresses',
+ 'states'
+ ]
+
+ for table in tables_to_drop:
+ try:
+ conn.execute(text(f"DROP TABLE IF EXISTS {table} CASCADE"))
+ console.print(f"[green]✅ Dropped {table}[/green]")
+ except Exception as e:
+ console.print(f"[yellow]⚠️ Could not drop {table}: {e}[/yellow]")
+
+ conn.commit()
+
+ except Exception as e:
+ console.print(f"[red]❌ Error dropping tables: {e}[/red]")
+ return
+
+ # Create new tables with correct schema
+ console.print("\n[bold blue]Creating new unified tables...[/bold blue]")
+ try:
+ # Create all tables
+ SQLModel.metadata.create_all(engine)
+ console.print("[green]✅ All unified tables created successfully![/green]")
+
+ except Exception as e:
+ console.print(f"[red]❌ Error creating tables: {e}[/red]")
+ return
+
+ # Verify tables were created
+ console.print("\n[bold blue]Verifying new tables...[/bold blue]")
+ try:
+ with engine.connect() as conn:
+ result = conn.execute(text("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_name LIKE 'unified_%' ORDER BY table_name"))
+ tables = [row[0] for row in result]
+
+ console.print(f"[green]✅ Found {len(tables)} unified tables:[/green]")
+ for table in tables:
+ console.print(f" • {table}")
+
+ extra_result = conn.execute(
+ text(
+ "SELECT table_name FROM information_schema.tables "
+ "WHERE table_schema = 'public' AND table_name IN ('states', 'file_origins') "
+ "ORDER BY table_name"
+ )
+ )
+ extras = [row[0] for row in extra_result]
+ if extras:
+ console.print("[green]✅ Additional reference tables:[/green]")
+ for table in extras:
+ console.print(f" • {table}")
+
+ except Exception as e:
+ console.print(f"[red]❌ Error verifying tables: {e}[/red]")
+ return
+
+ console.print("\n[bold green]✅ Table recreation complete![/bold green]")
+ console.print("All unified tables have been recreated with the correct schema.")
+
+if __name__ == "__main__":
+ recreate_unified_tables()
\ No newline at end of file
diff --git a/tmp/.DS_Store b/tmp/.DS_Store
index 1498073..17e735e 100644
Binary files a/tmp/.DS_Store and b/tmp/.DS_Store differ
diff --git a/uv.lock b/uv.lock
index b1c742d..31633e0 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1,5 +1,10 @@
version = 1
+revision = 3
requires-python = ">=3.12.8"
+resolution-markers = [
+ "python_full_version >= '3.14'",
+ "python_full_version < '3.14'",
+]
[[package]]
name = "aiocsv"
@@ -8,95 +13,139 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/33/78/bd4a85d195e57e72837415ef81d26ce6db6fdf185dce8d4f6a7c099ed4af/aiocsv-1.3.2.tar.gz", hash = "sha256:806d93465c7808d58d3ff0d2bba270fb4d04b934be6a1e95d0834c50a510910e", size = 24837 }
+sdist = { url = "https://files.pythonhosted.org/packages/33/78/bd4a85d195e57e72837415ef81d26ce6db6fdf185dce8d4f6a7c099ed4af/aiocsv-1.3.2.tar.gz", hash = "sha256:806d93465c7808d58d3ff0d2bba270fb4d04b934be6a1e95d0834c50a510910e", size = 24837, upload-time = "2024-04-28T10:30:30.382Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/52/b5/48e8b825d8ec9ffbb47ebbc381702d5dfb59ef01ad00174bf43123b860cf/aiocsv-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:db943a463cb6828ba81bd7c083c6dd4c96edac4880b8638af81798d694405e26", size = 26497 },
- { url = "https://files.pythonhosted.org/packages/94/6f/cb2d7b751a03433a30e7a645f0b3a126f5f2ecb0947c3da5a04496c06767/aiocsv-1.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10780033a1ed3da825f2256449d177b7106b3c5a2d64bd683eab37f1fdee1e36", size = 51459 },
- { url = "https://files.pythonhosted.org/packages/c2/19/67edf04b47168a2639d73ebaae25f2459d7284d10a5e7a2fef72a69bb31e/aiocsv-1.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8c7aee34ceff4eaa654f01acbdba648297f5f9532dc7a23fac62defec28e0fe5", size = 55921 },
- { url = "https://files.pythonhosted.org/packages/13/39/ee5645807a947736c87ab7c0dfcdbceb7d7f8d1d31cb7d52992cbd5d6d44/aiocsv-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:59b0ea2d9e73539d4c1276467c4457acafa995717ea1b5340f3737f2cde2f71a", size = 29137 },
+ { url = "https://files.pythonhosted.org/packages/a6/ab/4c811d08dafb35832e799b7c8284426c037f136f7287b7fe32d5d932778a/aiocsv-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5aa586564800df49280e0aa108acc855062ac5b9486bb052f0dd0c0051ea4f18", size = 26506, upload-time = "2025-01-21T16:53:42.545Z" },
+ { url = "https://files.pythonhosted.org/packages/52/b5/48e8b825d8ec9ffbb47ebbc381702d5dfb59ef01ad00174bf43123b860cf/aiocsv-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:db943a463cb6828ba81bd7c083c6dd4c96edac4880b8638af81798d694405e26", size = 26497, upload-time = "2024-04-28T10:35:53.272Z" },
+ { url = "https://files.pythonhosted.org/packages/94/6f/cb2d7b751a03433a30e7a645f0b3a126f5f2ecb0947c3da5a04496c06767/aiocsv-1.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10780033a1ed3da825f2256449d177b7106b3c5a2d64bd683eab37f1fdee1e36", size = 51459, upload-time = "2024-04-28T10:35:54.747Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/19/67edf04b47168a2639d73ebaae25f2459d7284d10a5e7a2fef72a69bb31e/aiocsv-1.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8c7aee34ceff4eaa654f01acbdba648297f5f9532dc7a23fac62defec28e0fe5", size = 55921, upload-time = "2024-04-28T10:35:56.205Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/e9/00fd06908ec1a0b2f2e6c6e10e6e8344dc2d6ca03c2a40b5241bdbd3b817/aiocsv-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f848e1cca7d22d8bd6480fa4c7338dc8be2abdd02e0b99f677b8a7af27e15767", size = 50088, upload-time = "2025-01-21T16:53:43.645Z" },
+ { url = "https://files.pythonhosted.org/packages/13/39/ee5645807a947736c87ab7c0dfcdbceb7d7f8d1d31cb7d52992cbd5d6d44/aiocsv-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:59b0ea2d9e73539d4c1276467c4457acafa995717ea1b5340f3737f2cde2f71a", size = 29137, upload-time = "2024-04-28T10:35:57.094Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/0f/1826e1c0f561c831aa933d24918e51645b4b162abf1b5df4c37ef0ddc172/aiocsv-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039dcf7bd684a98bf7c2218b8e7dc4abc951e1045dadd8813e992a1ba829ff", size = 26497, upload-time = "2025-01-21T16:53:47.544Z" },
+ { url = "https://files.pythonhosted.org/packages/00/dc/d479b647af73a3b2126f9e364d669c9acb4e9b1f0e5006b8f74271820d40/aiocsv-1.3.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d8612392b7da7bff545b69202fb03a8e09381fff2d5c4d9594246d7375cd603", size = 51261, upload-time = "2025-01-21T16:53:48.794Z" },
+ { url = "https://files.pythonhosted.org/packages/75/68/aec1088dcc216c40b86122183fd28771e9a43f79a6866d1b912e8c282700/aiocsv-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cee1577a381a44a18bcaed97c41f39b4400655de1a873f4e90b64af68e19dcd9", size = 50092, upload-time = "2025-01-21T16:53:50.107Z" },
+ { url = "https://files.pythonhosted.org/packages/45/9a/18f65720081f2564f614fa872812508aa7e93651d3b3a0ca4eb42a744de1/aiocsv-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:0f0437f34ab7d1da86b30407653d635cf7de330681e746859b8c54aaac2c4574", size = 29290, upload-time = "2025-01-21T16:53:51.655Z" },
]
[[package]]
name = "aiofiles"
version = "24.1.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247 }
+sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247, upload-time = "2024-06-24T11:02:03.584Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896 },
+ { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896, upload-time = "2024-06-24T11:02:01.529Z" },
]
[[package]]
name = "aiojobs"
-version = "1.3.0"
+version = "1.4.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/c4/0b/d612a769c28bd22bcc52b369a9a10c63eb6e7b5e2e0cfb35e3be7357fe29/aiojobs-1.3.0.tar.gz", hash = "sha256:03074c884b3dc388b8d798c0de24ec17d72b2799018497fda8062c0431a494b5", size = 138950 }
+sdist = { url = "https://files.pythonhosted.org/packages/03/54/751969398e2039b4dc458fa153dc066a0f7337a5b480d58944f59b7b38ae/aiojobs-1.4.0.tar.gz", hash = "sha256:463665c75d1fcc46c78d44375c1034abf5e3f087894b0fc5ec4dd16ef90fdc98", size = 139598, upload-time = "2025-04-05T00:39:07.771Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/35/29/1c02cdd9307071e4ce9b87cb1ab0f9a589b24cc68f276afd8c3ec83b5955/aiojobs-1.3.0-py3-none-any.whl", hash = "sha256:1f9f36179b6d50796c4fc9e8851fdae10f38d6c2f64412a91e2c4eff73054ce0", size = 9525 },
+ { url = "https://files.pythonhosted.org/packages/ce/89/5a30b3c041712a8b2dadb5ccef2bae12a874469650c61c018705039699cd/aiojobs-1.4.0-py3-none-any.whl", hash = "sha256:e95eb0d10d1f6095aefb04d228d2b4b3747514503f26540de722c2228a8500ca", size = 9455, upload-time = "2025-04-05T00:39:06.279Z" },
]
[[package]]
name = "annotated-types"
version = "0.7.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 }
+sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 },
+ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" },
]
[[package]]
name = "anyio"
-version = "4.8.0"
+version = "4.10.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "idna" },
{ name = "sniffio" },
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 }
+sdist = { url = "https://files.pythonhosted.org/packages/f1/b4/636b3b65173d3ce9a38ef5f0522789614e590dab6a8d505340a4efe4c567/anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", size = 213252, upload-time = "2025-08-04T08:54:26.451Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 },
+ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" },
]
[[package]]
name = "appnope"
version = "0.1.4"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 }
+sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 },
+ { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" },
]
[[package]]
name = "argon2-cffi"
-version = "23.1.0"
+version = "25.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "argon2-cffi-bindings" },
+ { name = "argon2-cffi-bindings", version = "21.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
+ { name = "argon2-cffi-bindings", version = "25.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/31/fa/57ec2c6d16ecd2ba0cf15f3c7d1c3c2e7b5fcb83555ff56d7ab10888ec8f/argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", size = 42798 }
+sdist = { url = "https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", size = 45706, upload-time = "2025-06-03T06:55:32.073Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea", size = 15124 },
+ { url = "https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741", size = 14657, upload-time = "2025-06-03T06:55:30.804Z" },
]
[[package]]
name = "argon2-cffi-bindings"
version = "21.2.0"
source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.14'",
+]
dependencies = [
- { name = "cffi" },
+ { name = "cffi", marker = "python_full_version >= '3.14'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/b9/e9/184b8ccce6683b0aa2fbb7ba5683ea4b9c5763f1356347f1312c32e3c66e/argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", size = 1779911 }
+sdist = { url = "https://files.pythonhosted.org/packages/b9/e9/184b8ccce6683b0aa2fbb7ba5683ea4b9c5763f1356347f1312c32e3c66e/argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", size = 1779911, upload-time = "2021-12-01T08:52:55.68Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d4/13/838ce2620025e9666aa8f686431f67a29052241692a3dd1ae9d3692a89d3/argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", size = 29658 },
- { url = "https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", size = 80583 },
- { url = "https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", size = 86168 },
- { url = "https://files.pythonhosted.org/packages/74/f6/4a34a37a98311ed73bb80efe422fed95f2ac25a4cacc5ae1d7ae6a144505/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", size = 82709 },
- { url = "https://files.pythonhosted.org/packages/74/2b/73d767bfdaab25484f7e7901379d5f8793cccbb86c6e0cbc4c1b96f63896/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", size = 83613 },
- { url = "https://files.pythonhosted.org/packages/4f/fd/37f86deef67ff57c76f137a67181949c2d408077e2e3dd70c6c42912c9bf/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", size = 84583 },
- { url = "https://files.pythonhosted.org/packages/6f/52/5a60085a3dae8fded8327a4f564223029f5f54b0cb0455a31131b5363a01/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", size = 88475 },
- { url = "https://files.pythonhosted.org/packages/8b/95/143cd64feb24a15fa4b189a3e1e7efbaeeb00f39a51e99b26fc62fbacabd/argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", size = 27698 },
- { url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", size = 30817 },
- { url = "https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", size = 53104 },
+ { url = "https://files.pythonhosted.org/packages/d4/13/838ce2620025e9666aa8f686431f67a29052241692a3dd1ae9d3692a89d3/argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", size = 29658, upload-time = "2021-12-01T09:09:17.016Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", size = 80583, upload-time = "2021-12-01T09:09:19.546Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", size = 86168, upload-time = "2021-12-01T09:09:21.445Z" },
+ { url = "https://files.pythonhosted.org/packages/74/f6/4a34a37a98311ed73bb80efe422fed95f2ac25a4cacc5ae1d7ae6a144505/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", size = 82709, upload-time = "2021-12-01T09:09:18.182Z" },
+ { url = "https://files.pythonhosted.org/packages/74/2b/73d767bfdaab25484f7e7901379d5f8793cccbb86c6e0cbc4c1b96f63896/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", size = 83613, upload-time = "2021-12-01T09:09:22.741Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/fd/37f86deef67ff57c76f137a67181949c2d408077e2e3dd70c6c42912c9bf/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", size = 84583, upload-time = "2021-12-01T09:09:24.177Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/52/5a60085a3dae8fded8327a4f564223029f5f54b0cb0455a31131b5363a01/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", size = 88475, upload-time = "2021-12-01T09:09:26.673Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/95/143cd64feb24a15fa4b189a3e1e7efbaeeb00f39a51e99b26fc62fbacabd/argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", size = 27698, upload-time = "2021-12-01T09:09:27.87Z" },
+ { url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", size = 30817, upload-time = "2021-12-01T09:09:30.267Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", size = 53104, upload-time = "2021-12-01T09:09:31.335Z" },
+]
+
+[[package]]
+name = "argon2-cffi-bindings"
+version = "25.1.0"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.14'",
+]
+dependencies = [
+ { name = "cffi", marker = "python_full_version < '3.14'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f", size = 54393, upload-time = "2025-07-30T10:01:40.97Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b", size = 29328, upload-time = "2025-07-30T10:01:41.916Z" },
+ { url = "https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a", size = 31269, upload-time = "2025-07-30T10:01:42.716Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44", size = 86558, upload-time = "2025-07-30T10:01:43.943Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb", size = 92364, upload-time = "2025-07-30T10:01:44.887Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92", size = 85637, upload-time = "2025-07-30T10:01:46.225Z" },
+ { url = "https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85", size = 91934, upload-time = "2025-07-30T10:01:47.203Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f", size = 28158, upload-time = "2025-07-30T10:01:48.341Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6", size = 32597, upload-time = "2025-07-30T10:01:49.112Z" },
+ { url = "https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623", size = 28231, upload-time = "2025-07-30T10:01:49.92Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" },
+ { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" },
+ { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" },
+ { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" },
+ { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" },
+ { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" },
]
[[package]]
@@ -107,57 +156,58 @@ dependencies = [
{ name = "python-dateutil" },
{ name = "types-python-dateutil" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/2e/00/0f6e8fcdb23ea632c866620cc872729ff43ed91d284c866b515c6342b173/arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85", size = 131960 }
+sdist = { url = "https://files.pythonhosted.org/packages/2e/00/0f6e8fcdb23ea632c866620cc872729ff43ed91d284c866b515c6342b173/arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85", size = 131960, upload-time = "2023-09-30T22:11:18.25Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", size = 66419 },
+ { url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", size = 66419, upload-time = "2023-09-30T22:11:16.072Z" },
]
[[package]]
name = "asttokens"
version = "3.0.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 }
+sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload-time = "2024-11-30T04:30:14.439Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 },
+ { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload-time = "2024-11-30T04:30:10.946Z" },
]
[[package]]
name = "async-lru"
-version = "2.0.4"
+version = "2.0.5"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/80/e2/2b4651eff771f6fd900d233e175ddc5e2be502c7eb62c0c42f975c6d36cd/async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627", size = 10019 }
+sdist = { url = "https://files.pythonhosted.org/packages/b2/4d/71ec4d3939dc755264f680f6c2b4906423a304c3d18e96853f0a595dfe97/async_lru-2.0.5.tar.gz", hash = "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb", size = 10380, upload-time = "2025-03-16T17:25:36.919Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/fa/9f/3c3503693386c4b0f245eaf5ca6198e3b28879ca0a40bde6b0e319793453/async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224", size = 6111 },
+ { url = "https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl", hash = "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943", size = 6069, upload-time = "2025-03-16T17:25:35.422Z" },
]
[[package]]
name = "attrs"
-version = "24.3.0"
+version = "25.3.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/48/c8/6260f8ccc11f0917360fc0da435c5c9c7504e3db174d5a12a1494887b045/attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff", size = 805984 }
+sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/89/aa/ab0f7891a01eeb2d2e338ae8fecbe57fcebea1a24dbb64d45801bfab481d/attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308", size = 63397 },
+ { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" },
]
[[package]]
name = "babel"
-version = "2.16.0"
+version = "2.17.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/2a/74/f1bc80f23eeba13393b7222b11d95ca3af2c1e28edca18af487137eefed9/babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316", size = 9348104 }
+sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", size = 9587599 },
+ { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" },
]
[[package]]
name = "beautifulsoup4"
-version = "4.12.3"
+version = "4.13.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "soupsieve" },
+ { name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/b3/ca/824b1195773ce6166d388573fc106ce56d4a805bd7427b624e063596ec58/beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", size = 581181 }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload-time = "2025-04-15T17:05:13.836Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed", size = 147925 },
+ { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" },
]
[[package]]
@@ -167,9 +217,9 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "webencodings" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083 }
+sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083, upload-time = "2024-10-29T18:30:40.477Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406 },
+ { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406, upload-time = "2024-10-29T18:30:38.186Z" },
]
[package.optional-dependencies]
@@ -185,6 +235,7 @@ dependencies = [
{ name = "aiocsv" },
{ name = "aiofiles" },
{ name = "aiojobs" },
+ { name = "hypothesis" },
{ name = "icecream" },
{ name = "inject" },
{ name = "jupyter" },
@@ -194,9 +245,12 @@ dependencies = [
{ name = "phonenumbers" },
{ name = "polars" },
{ name = "probablepeople" },
+ { name = "psycopg2-binary" },
+ { name = "pyarrow" },
{ name = "pydantic" },
{ name = "pydantic-extra-types" },
{ name = "pydantic-settings" },
+ { name = "pytest" },
{ name = "python-dotenv" },
{ name = "requests" },
{ name = "rich" },
@@ -206,6 +260,7 @@ dependencies = [
{ name = "tqdm" },
{ name = "usaddress" },
{ name = "usaddress-scourgify" },
+ { name = "web-scrape-utils" },
]
[package.metadata]
@@ -213,6 +268,7 @@ requires-dist = [
{ name = "aiocsv", specifier = ">=1.3.2" },
{ name = "aiofiles", specifier = ">=24.1.0" },
{ name = "aiojobs", specifier = ">=1.3.0" },
+ { name = "hypothesis", specifier = ">=6.112.1" },
{ name = "icecream", specifier = ">=2.1.3" },
{ name = "inject", specifier = ">=5.2.1" },
{ name = "jupyter", specifier = ">=1.1.1" },
@@ -222,9 +278,12 @@ requires-dist = [
{ name = "phonenumbers", specifier = ">=8.13.52" },
{ name = "polars", specifier = ">=1.19.0" },
{ name = "probablepeople", specifier = ">=0.5.6" },
+ { name = "psycopg2-binary", specifier = ">=2.9.9" },
+ { name = "pyarrow", specifier = ">=19.0.0" },
{ name = "pydantic", specifier = ">=2.10.4" },
{ name = "pydantic-extra-types", specifier = ">=2.10.1" },
{ name = "pydantic-settings", specifier = ">=2.7.0" },
+ { name = "pytest", specifier = ">=8.3.3" },
{ name = "python-dotenv", specifier = ">=1.0.1" },
{ name = "requests", specifier = ">=2.32.3" },
{ name = "rich", specifier = ">=13.9.4" },
@@ -234,15 +293,16 @@ requires-dist = [
{ name = "tqdm", specifier = ">=4.67.1" },
{ name = "usaddress", specifier = ">=0.5.11" },
{ name = "usaddress-scourgify", specifier = ">=0.6.0" },
+ { name = "web-scrape-utils", git = "https://github.com/jreakin/jre-web-scrape-utils.git?branch=jan25-web-scrape" },
]
[[package]]
name = "certifi"
-version = "2024.12.14"
+version = "2025.8.3"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 }
+sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 },
+ { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" },
]
[[package]]
@@ -252,179 +312,196 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pycparser" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 },
- { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 },
- { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 },
- { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 },
- { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 },
- { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 },
- { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 },
- { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 },
- { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 },
- { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 },
- { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 },
- { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 },
- { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 },
- { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 },
- { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 },
- { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 },
- { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 },
- { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 },
- { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 },
- { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 },
- { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 },
- { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 },
+sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload-time = "2024-09-04T20:44:12.232Z" },
+ { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload-time = "2024-09-04T20:44:13.739Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload-time = "2024-09-04T20:44:15.231Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload-time = "2024-09-04T20:44:17.188Z" },
+ { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload-time = "2024-09-04T20:44:18.688Z" },
+ { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload-time = "2024-09-04T20:44:20.248Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload-time = "2024-09-04T20:44:21.673Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload-time = "2024-09-04T20:44:23.245Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload-time = "2024-09-04T20:44:24.757Z" },
+ { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload-time = "2024-09-04T20:44:26.208Z" },
+ { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload-time = "2024-09-04T20:44:27.578Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload-time = "2024-09-04T20:44:28.956Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload-time = "2024-09-04T20:44:30.289Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload-time = "2024-09-04T20:44:32.01Z" },
+ { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload-time = "2024-09-04T20:44:33.606Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload-time = "2024-09-04T20:44:35.191Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload-time = "2024-09-04T20:44:36.743Z" },
+ { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload-time = "2024-09-04T20:44:38.492Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload-time = "2024-09-04T20:44:40.046Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload-time = "2024-09-04T20:44:41.616Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload-time = "2024-09-04T20:44:43.733Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" },
]
[[package]]
name = "charset-normalizer"
-version = "3.4.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 },
- { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 },
- { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 },
- { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 },
- { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 },
- { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 },
- { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 },
- { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 },
- { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 },
- { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 },
- { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 },
- { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 },
- { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 },
- { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 },
- { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 },
- { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 },
- { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 },
- { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 },
- { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 },
- { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 },
- { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 },
- { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 },
- { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 },
- { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 },
- { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 },
- { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 },
- { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 },
- { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 },
- { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 },
- { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 },
- { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 },
+version = "3.4.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" },
+ { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" },
+ { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" },
+ { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" },
+ { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" },
+ { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" },
+ { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" },
+ { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" },
+ { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" },
+ { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" },
+ { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" },
+ { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" },
+ { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" },
+ { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" },
]
[[package]]
name = "click"
-version = "8.1.7"
+version = "8.2.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 }
+sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 },
+ { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" },
]
[[package]]
name = "colorama"
version = "0.4.6"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
]
[[package]]
name = "comm"
-version = "0.2.2"
+version = "0.2.3"
source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "traitlets" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 }
+sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 },
+ { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" },
]
[[package]]
name = "debugpy"
-version = "1.8.11"
+version = "1.8.15"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/bc/e7/666f4c9b0e24796af50aadc28d36d21c2e01e831a934535f956e09b3650c/debugpy-1.8.11.tar.gz", hash = "sha256:6ad2688b69235c43b020e04fecccdf6a96c8943ca9c2fb340b8adc103c655e57", size = 1640124 }
+sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/3a9a28ddb750a76eaec445c7f4d3147ea2c579a97dbd9e25d39001b92b21/debugpy-1.8.15.tar.gz", hash = "sha256:58d7a20b7773ab5ee6bdfb2e6cf622fdf1e40c9d5aef2857d85391526719ac00", size = 1643279, upload-time = "2025-07-15T16:43:29.135Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/c6/ae/2cf26f3111e9d94384d9c01e9d6170188b0aeda15b60a4ac6457f7c8a26f/debugpy-1.8.11-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:84e511a7545d11683d32cdb8f809ef63fc17ea2a00455cc62d0a4dbb4ed1c308", size = 2498756 },
- { url = "https://files.pythonhosted.org/packages/b0/16/ec551789d547541a46831a19aa15c147741133da188e7e6acf77510545a7/debugpy-1.8.11-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce291a5aca4985d82875d6779f61375e959208cdf09fcec40001e65fb0a54768", size = 4219136 },
- { url = "https://files.pythonhosted.org/packages/72/6f/b2b3ce673c55f882d27a6eb04a5f0c68bcad6b742ac08a86d8392ae58030/debugpy-1.8.11-cp312-cp312-win32.whl", hash = "sha256:28e45b3f827d3bf2592f3cf7ae63282e859f3259db44ed2b129093ca0ac7940b", size = 5224440 },
- { url = "https://files.pythonhosted.org/packages/77/09/b1f05be802c1caef5b3efc042fc6a7cadd13d8118b072afd04a9b9e91e06/debugpy-1.8.11-cp312-cp312-win_amd64.whl", hash = "sha256:44b1b8e6253bceada11f714acf4309ffb98bfa9ac55e4fce14f9e5d4484287a1", size = 5264578 },
- { url = "https://files.pythonhosted.org/packages/2e/66/931dc2479aa8fbf362dc6dcee707d895a84b0b2d7b64020135f20b8db1ed/debugpy-1.8.11-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:8988f7163e4381b0da7696f37eec7aca19deb02e500245df68a7159739bbd0d3", size = 2483651 },
- { url = "https://files.pythonhosted.org/packages/10/07/6c171d0fe6b8d237e35598b742f20ba062511b3a4631938cc78eefbbf847/debugpy-1.8.11-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c1f6a173d1140e557347419767d2b14ac1c9cd847e0b4c5444c7f3144697e4e", size = 4213770 },
- { url = "https://files.pythonhosted.org/packages/89/f1/0711da6ac250d4fe3bf7b3e9b14b4a86e82a98b7825075c07e19bab8da3d/debugpy-1.8.11-cp313-cp313-win32.whl", hash = "sha256:bb3b15e25891f38da3ca0740271e63ab9db61f41d4d8541745cfc1824252cb28", size = 5223911 },
- { url = "https://files.pythonhosted.org/packages/56/98/5e27fa39050749ed460025bcd0034a0a5e78a580a14079b164cc3abdeb98/debugpy-1.8.11-cp313-cp313-win_amd64.whl", hash = "sha256:d8768edcbeb34da9e11bcb8b5c2e0958d25218df7a6e56adf415ef262cd7b6d1", size = 5264166 },
- { url = "https://files.pythonhosted.org/packages/77/0a/d29a5aacf47b4383ed569b8478c02d59ee3a01ad91224d2cff8562410e43/debugpy-1.8.11-py2.py3-none-any.whl", hash = "sha256:0e22f846f4211383e6a416d04b4c13ed174d24cc5d43f5fd52e7821d0ebc8920", size = 5226874 },
+ { url = "https://files.pythonhosted.org/packages/ab/4a/4508d256e52897f5cdfee6a6d7580974811e911c6d01321df3264508a5ac/debugpy-1.8.15-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:3dcc7225cb317469721ab5136cda9ff9c8b6e6fb43e87c9e15d5b108b99d01ba", size = 2511197, upload-time = "2025-07-15T16:43:42.343Z" },
+ { url = "https://files.pythonhosted.org/packages/99/8d/7f6ef1097e7fecf26b4ef72338d08e41644a41b7ee958a19f494ffcffc29/debugpy-1.8.15-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:047a493ca93c85ccede1dbbaf4e66816794bdc214213dde41a9a61e42d27f8fc", size = 4229517, upload-time = "2025-07-15T16:43:44.14Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/e8/e8c6a9aa33a9c9c6dacbf31747384f6ed2adde4de2e9693c766bdf323aa3/debugpy-1.8.15-cp312-cp312-win32.whl", hash = "sha256:b08e9b0bc260cf324c890626961dad4ffd973f7568fbf57feb3c3a65ab6b6327", size = 5276132, upload-time = "2025-07-15T16:43:45.529Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/ad/231050c6177b3476b85fcea01e565dac83607b5233d003ff067e2ee44d8f/debugpy-1.8.15-cp312-cp312-win_amd64.whl", hash = "sha256:e2a4fe357c92334272eb2845fcfcdbec3ef9f22c16cf613c388ac0887aed15fa", size = 5317645, upload-time = "2025-07-15T16:43:46.968Z" },
+ { url = "https://files.pythonhosted.org/packages/28/70/2928aad2310726d5920b18ed9f54b9f06df5aa4c10cf9b45fa18ff0ab7e8/debugpy-1.8.15-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:f5e01291ad7d6649aed5773256c5bba7a1a556196300232de1474c3c372592bf", size = 2495538, upload-time = "2025-07-15T16:43:48.927Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/c6/9b8ffb4ca91fac8b2877eef63c9cc0e87dd2570b1120054c272815ec4cd0/debugpy-1.8.15-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94dc0f0d00e528d915e0ce1c78e771475b2335b376c49afcc7382ee0b146bab6", size = 4221874, upload-time = "2025-07-15T16:43:50.282Z" },
+ { url = "https://files.pythonhosted.org/packages/55/8a/9b8d59674b4bf489318c7c46a1aab58e606e583651438084b7e029bf3c43/debugpy-1.8.15-cp313-cp313-win32.whl", hash = "sha256:fcf0748d4f6e25f89dc5e013d1129ca6f26ad4da405e0723a4f704583896a709", size = 5275949, upload-time = "2025-07-15T16:43:52.079Z" },
+ { url = "https://files.pythonhosted.org/packages/72/83/9e58e6fdfa8710a5e6ec06c2401241b9ad48b71c0a7eb99570a1f1edb1d3/debugpy-1.8.15-cp313-cp313-win_amd64.whl", hash = "sha256:73c943776cb83e36baf95e8f7f8da765896fd94b05991e7bc162456d25500683", size = 5317720, upload-time = "2025-07-15T16:43:53.703Z" },
+ { url = "https://files.pythonhosted.org/packages/07/d5/98748d9860e767a1248b5e31ffa7ce8cb7006e97bf8abbf3d891d0a8ba4e/debugpy-1.8.15-py2.py3-none-any.whl", hash = "sha256:bce2e6c5ff4f2e00b98d45e7e01a49c7b489ff6df5f12d881c67d2f1ac635f3d", size = 5282697, upload-time = "2025-07-15T16:44:07.996Z" },
]
[[package]]
name = "decorator"
-version = "5.1.1"
+version = "5.2.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 }
+sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 },
+ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" },
]
[[package]]
name = "defusedxml"
version = "0.7.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 },
+ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" },
]
[[package]]
name = "doublemetaphone"
-version = "1.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/8a/fb/054ad89223951abedde4351c5ff8ba009dcd576d8ecafed357762c7f2d9d/DoubleMetaphone-1.1.tar.gz", hash = "sha256:cd185dbc18347accb5a27c1289a6bdc989a479294a74f41c42a6cb0b414e5379", size = 34025 }
+version = "1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/48/b0/7d900c1b3171f7ca6dfa066002f8238d75e0895d9fab3b4851d40fc69a9f/doublemetaphone-1.2.tar.gz", hash = "sha256:9d93decfe5ecfbd7fe665224a8e949f9c1658d0e146589a4688cfe6243f628d2", size = 64555, upload-time = "2025-05-11T11:34:32.122Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8f/3f/fe7023f5e671dd7edf6d2fcbdc12e15ee8726e9a77aa5bb08f02af1a6c24/doublemetaphone-1.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cada83509ed865cb577eb80b72bbf8c5a10d329c2300c91aa26d3d0dfe5e3af4", size = 55590, upload-time = "2025-05-11T11:34:20.479Z" },
+ { url = "https://files.pythonhosted.org/packages/14/77/a9e42cddc69e80ba0575d3df5d17d667a9ea6943d9966b581c87996adca7/doublemetaphone-1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:854123364d737b364719a05d3b4bc232196f10ab8bbd22378941e58cd778035e", size = 30426, upload-time = "2025-05-11T11:34:21.66Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/0b/f8007b0990ee870378c6c848cd94377fb844c77ba6b1010f64e7b8209fbc/doublemetaphone-1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee11fd0ad53d393f3aab25a9c3807995faa6704a8584eada0fc0da50d0360e59", size = 30646, upload-time = "2025-05-11T11:34:22.387Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/f5/6a7c25023a6f53f9076a5c38e8bf1425e20c90d6b011e1b9b4dac68cef6b/doublemetaphone-1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e2e640e130d8486ee8b5a4db4c5fcbf924b5296ad7fc3305c18ac484141621f", size = 173354, upload-time = "2025-05-11T12:03:43.417Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/9d/2838fdd1e0bb91e7c72154f9b4faee4803c1166a3387a8f16bf9ec00d6f2/doublemetaphone-1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:221bbf10e458ae2796f5000469cf85576dce4dbf6dbd8121305fdfdf2f068f76", size = 172678, upload-time = "2025-05-11T12:03:44.405Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/f7/3bef2d67a39e58b346645365504dad7afbe3cc56eef4215cd7a10fa72a95/doublemetaphone-1.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53d6f7260379ee97357c5725cdf10eec9235f4036b04429a95fdc16984e528c8", size = 164784, upload-time = "2025-05-11T12:03:45.351Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/75/83768ac75e827f41cd408d55d83ac01f19cb725ecac8ca69dca0422bf3a1/doublemetaphone-1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02fcebbb91f979a0a9a53acb52ec110848058785114abfd0e5c85b046303dc91", size = 1183417, upload-time = "2025-05-11T12:03:46.401Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/a7/ae20f597df41f302e6259f9eabf033416c2e51f74f947ccdb23eb2e5ae15/doublemetaphone-1.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:14945e8efaec0053c108341bb22f98e8914657fe891529fde6f4ea082b865044", size = 1336549, upload-time = "2025-05-11T12:03:47.679Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/d8/be15751a4424d84e6309d072be7a07782cf2d9c0a0f8ebd07e8481ede17e/doublemetaphone-1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:342be444efd904b67fcf3c18319e16d1b41d4d8860763e2158bef5d0a193228b", size = 1240109, upload-time = "2025-05-11T12:03:48.928Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/44/f3dfa941bb3de5588d1eca590b87f26d6ee87da937f810fd9596f843687b/doublemetaphone-1.2-cp312-cp312-win32.whl", hash = "sha256:cb69053be13473116024fe8b871f662e87bed49279b8109e36c2dfa911460c36", size = 28937, upload-time = "2025-05-11T11:38:02.605Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/1d/ade88b7eb321dbd0b94019f6d00838b2a363437bcca92ae36b96d583d72e/doublemetaphone-1.2-cp312-cp312-win_amd64.whl", hash = "sha256:38400216e97a675cc9d9373c8c294117c59d141a46c4745dbd8b849de28a65aa", size = 31802, upload-time = "2025-05-11T11:38:03.325Z" },
+ { url = "https://files.pythonhosted.org/packages/51/b4/c007f911688afc64fe822260eeb4e96e1990b34e70d585153ee8822aecb7/doublemetaphone-1.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4d0117d1a7ee2b3002eb623dc6e36b97b96705a8fd702056e00801445c2fb284", size = 55631, upload-time = "2025-05-11T11:34:23.377Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/98/eba9538b9a0ef6a2e246c3cf680efb40c76467c63bd893e53def8d637cb8/doublemetaphone-1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a5d9a5f97d6fa46e25285fe0937872482b71136c2564cabb3c7b6b205f0aebac", size = 30436, upload-time = "2025-05-11T11:34:24.265Z" },
+ { url = "https://files.pythonhosted.org/packages/50/3e/d4c456ad2694d7b4fbdc3bed52610a258d9f9bcca0e591110deb5c5ede49/doublemetaphone-1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0df0450230090b539200f1f3b74c997c7ad78b3b8cc5d01a5334b79014d9a79", size = 30666, upload-time = "2025-05-11T11:34:25.249Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/57/d010b0ffa97c0463f30e1ca737e9aceba7fd776551f82b35a7f8ac8b749e/doublemetaphone-1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c7d5b13db0c5153164d59cf93643a9ab8404e032087b642f85a9b8b8b0679b", size = 172597, upload-time = "2025-05-11T12:03:50.109Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/74/a1e6a5b9cf0cc47b17e8f39142f03484f4b2edbf8be921acf853a3ac2d8d/doublemetaphone-1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3092aefa4c10758696baff9ce04d836d5564ec80a90afaf47befd107cd7bdc0d", size = 172085, upload-time = "2025-05-11T12:03:51.092Z" },
+ { url = "https://files.pythonhosted.org/packages/51/06/b2bddc2d3eeed236eb06c34a58a300898695092d04053802c50030a33379/doublemetaphone-1.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e774018591b13bee6f5f65bf2ef20d32401b04ed7f684290615420ae26404e5", size = 163945, upload-time = "2025-05-11T12:03:52.112Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/45/c4f10bdc47b659450ad6b363ae6087abb2343ae8969ef4b628c045077285/doublemetaphone-1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8383b8a29e68fd79251731bb16569b20a6d1fa9dc6e7983e6e21cba231765185", size = 1182722, upload-time = "2025-05-11T12:03:53.095Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/5f/69b1ad4a72095979909c58503e352f29cbb0cec410bffd7b00f68aa0cf30/doublemetaphone-1.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3e7b0369e87d5fc0a29103c4abdbf1fea5ce054bc090462fdb8ef8daac6d8326", size = 1335769, upload-time = "2025-05-11T12:03:54.495Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/8e/3532477b5f58de7ae3ee27f704e7b73aefb92f1202ea6e15d6080ab05e9d/doublemetaphone-1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2642379941a824bbd3e09dce7e52bbcce10fa127b1e1a72b263110ea2a0241d3", size = 1239255, upload-time = "2025-05-11T12:03:55.685Z" },
+ { url = "https://files.pythonhosted.org/packages/54/62/a9db121d63fb6611747a91597b6a1d452a87c5814dff8c40002ebb18e3dc/doublemetaphone-1.2-cp313-cp313-win32.whl", hash = "sha256:aa0416254db47a1681fc16ab48ced1756b76419d3b0e74912868b8507c9c7eff", size = 28902, upload-time = "2025-05-11T11:38:04.439Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/1f/70923d8aeb07714c3ff0ade2374b5326abff509b0139e37187f08ad99a2a/doublemetaphone-1.2-cp313-cp313-win_amd64.whl", hash = "sha256:e91994f556111930e2e215625ce4960a720340ebc8f87e369e60504540772dff", size = 31830, upload-time = "2025-05-11T11:38:05.582Z" },
+]
[[package]]
name = "executing"
-version = "2.1.0"
+version = "2.2.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/8c/e3/7d45f492c2c4a0e8e0fad57d081a7c8a0286cdd86372b070cca1ec0caa1e/executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab", size = 977485 }
+sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693, upload-time = "2025-01-22T15:41:29.403Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf", size = 25805 },
+ { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702, upload-time = "2025-01-22T15:41:25.929Z" },
]
[[package]]
name = "fastjsonschema"
version = "2.21.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939 }
+sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939, upload-time = "2024-12-02T10:55:15.133Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924 },
+ { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924, upload-time = "2024-12-02T10:55:07.599Z" },
]
[[package]]
name = "fqdn"
version = "1.5.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015 }
+sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015, upload-time = "2021-03-11T07:16:29.08Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121 },
+ { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload-time = "2021-03-11T07:16:28.351Z" },
]
[[package]]
name = "future"
version = "1.0.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/a7/b2/4140c69c6a66432916b26158687e821ba631a4c9273c474343badf84d3ba/future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05", size = 1228490 }
+sdist = { url = "https://files.pythonhosted.org/packages/a7/b2/4140c69c6a66432916b26158687e821ba631a4c9273c474343badf84d3ba/future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05", size = 1228490, upload-time = "2024-02-21T11:52:38.461Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216", size = 491326 },
+ { url = "https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216", size = 491326, upload-time = "2024-02-21T11:52:35.956Z" },
]
[[package]]
@@ -438,64 +515,64 @@ dependencies = [
{ name = "requests" },
{ name = "six" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/ea/0b/2ea440270c1efb7ac73450cb704344c8127f45dabff0bea48711dc9dd93a/geocoder-1.38.1.tar.gz", hash = "sha256:c9925374c961577d0aee403b09e6f8ea1971d913f011f00ca70c76beaf7a77e7", size = 64345 }
+sdist = { url = "https://files.pythonhosted.org/packages/ea/0b/2ea440270c1efb7ac73450cb704344c8127f45dabff0bea48711dc9dd93a/geocoder-1.38.1.tar.gz", hash = "sha256:c9925374c961577d0aee403b09e6f8ea1971d913f011f00ca70c76beaf7a77e7", size = 64345, upload-time = "2018-04-04T12:34:47.649Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/4f/6b/13166c909ad2f2d76b929a4227c952630ebaf0d729f6317eb09cbceccbab/geocoder-1.38.1-py2.py3-none-any.whl", hash = "sha256:a733e1dfbce3f4e1a526cac03aadcedb8ed1239cf55bd7f3a23c60075121a834", size = 98590 },
+ { url = "https://files.pythonhosted.org/packages/4f/6b/13166c909ad2f2d76b929a4227c952630ebaf0d729f6317eb09cbceccbab/geocoder-1.38.1-py2.py3-none-any.whl", hash = "sha256:a733e1dfbce3f4e1a526cac03aadcedb8ed1239cf55bd7f3a23c60075121a834", size = 98590, upload-time = "2018-04-04T12:34:51.222Z" },
]
[[package]]
name = "greenlet"
-version = "3.1.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/2f/ff/df5fede753cc10f6a5be0931204ea30c35fa2f2ea7a35b25bdaf4fe40e46/greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", size = 186022 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", size = 274260 },
- { url = "https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", size = 649064 },
- { url = "https://files.pythonhosted.org/packages/51/41/467b12a8c7c1303d20abcca145db2be4e6cd50a951fa30af48b6ec607581/greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", size = 663420 },
- { url = "https://files.pythonhosted.org/packages/27/8f/2a93cd9b1e7107d5c7b3b7816eeadcac2ebcaf6d6513df9abaf0334777f6/greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", size = 658035 },
- { url = "https://files.pythonhosted.org/packages/57/5c/7c6f50cb12be092e1dccb2599be5a942c3416dbcfb76efcf54b3f8be4d8d/greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", size = 660105 },
- { url = "https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", size = 613077 },
- { url = "https://files.pythonhosted.org/packages/19/c5/36384a06f748044d06bdd8776e231fadf92fc896bd12cb1c9f5a1bda9578/greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", size = 1135975 },
- { url = "https://files.pythonhosted.org/packages/38/f9/c0a0eb61bdf808d23266ecf1d63309f0e1471f284300ce6dac0ae1231881/greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", size = 1163955 },
- { url = "https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", size = 299655 },
- { url = "https://files.pythonhosted.org/packages/f3/57/0db4940cd7bb461365ca8d6fd53e68254c9dbbcc2b452e69d0d41f10a85e/greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", size = 272990 },
- { url = "https://files.pythonhosted.org/packages/1c/ec/423d113c9f74e5e402e175b157203e9102feeb7088cee844d735b28ef963/greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", size = 649175 },
- { url = "https://files.pythonhosted.org/packages/a9/46/ddbd2db9ff209186b7b7c621d1432e2f21714adc988703dbdd0e65155c77/greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", size = 663425 },
- { url = "https://files.pythonhosted.org/packages/bc/f9/9c82d6b2b04aa37e38e74f0c429aece5eeb02bab6e3b98e7db89b23d94c6/greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", size = 657736 },
- { url = "https://files.pythonhosted.org/packages/d9/42/b87bc2a81e3a62c3de2b0d550bf91a86939442b7ff85abb94eec3fc0e6aa/greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", size = 660347 },
- { url = "https://files.pythonhosted.org/packages/37/fa/71599c3fd06336cdc3eac52e6871cfebab4d9d70674a9a9e7a482c318e99/greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", size = 615583 },
- { url = "https://files.pythonhosted.org/packages/4e/96/e9ef85de031703ee7a4483489b40cf307f93c1824a02e903106f2ea315fe/greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", size = 1133039 },
- { url = "https://files.pythonhosted.org/packages/87/76/b2b6362accd69f2d1889db61a18c94bc743e961e3cab344c2effaa4b4a25/greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", size = 1160716 },
- { url = "https://files.pythonhosted.org/packages/1f/1b/54336d876186920e185066d8c3024ad55f21d7cc3683c856127ddb7b13ce/greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", size = 299490 },
- { url = "https://files.pythonhosted.org/packages/5f/17/bea55bf36990e1638a2af5ba10c1640273ef20f627962cf97107f1e5d637/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", size = 643731 },
- { url = "https://files.pythonhosted.org/packages/78/d2/aa3d2157f9ab742a08e0fd8f77d4699f37c22adfbfeb0c610a186b5f75e0/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", size = 649304 },
- { url = "https://files.pythonhosted.org/packages/f1/8e/d0aeffe69e53ccff5a28fa86f07ad1d2d2d6537a9506229431a2a02e2f15/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", size = 646537 },
- { url = "https://files.pythonhosted.org/packages/05/79/e15408220bbb989469c8871062c97c6c9136770657ba779711b90870d867/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", size = 642506 },
- { url = "https://files.pythonhosted.org/packages/18/87/470e01a940307796f1d25f8167b551a968540fbe0551c0ebb853cb527dd6/greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", size = 602753 },
- { url = "https://files.pythonhosted.org/packages/e2/72/576815ba674eddc3c25028238f74d7b8068902b3968cbe456771b166455e/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", size = 1122731 },
- { url = "https://files.pythonhosted.org/packages/ac/38/08cc303ddddc4b3d7c628c3039a61a3aae36c241ed01393d00c2fd663473/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", size = 1142112 },
+version = "3.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c9/92/bb85bd6e80148a4d2e0c59f7c0c2891029f8fd510183afc7d8d2feeed9b6/greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365", size = 185752, upload-time = "2025-06-05T16:16:09.955Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f3/94/ad0d435f7c48debe960c53b8f60fb41c2026b1d0fa4a99a1cb17c3461e09/greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d", size = 271992, upload-time = "2025-06-05T16:11:23.467Z" },
+ { url = "https://files.pythonhosted.org/packages/93/5d/7c27cf4d003d6e77749d299c7c8f5fd50b4f251647b5c2e97e1f20da0ab5/greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b", size = 638820, upload-time = "2025-06-05T16:38:52.882Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/7e/807e1e9be07a125bb4c169144937910bf59b9d2f6d931578e57f0bce0ae2/greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d", size = 653046, upload-time = "2025-06-05T16:41:36.343Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/ab/158c1a4ea1068bdbc78dba5a3de57e4c7aeb4e7fa034320ea94c688bfb61/greenlet-3.2.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:be52af4b6292baecfa0f397f3edb3c6092ce071b499dd6fe292c9ac9f2c8f264", size = 647701, upload-time = "2025-06-05T16:48:19.604Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/0d/93729068259b550d6a0288da4ff72b86ed05626eaf1eb7c0d3466a2571de/greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688", size = 649747, upload-time = "2025-06-05T16:13:04.628Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/f6/c82ac1851c60851302d8581680573245c8fc300253fc1ff741ae74a6c24d/greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb", size = 605461, upload-time = "2025-06-05T16:12:50.792Z" },
+ { url = "https://files.pythonhosted.org/packages/98/82/d022cf25ca39cf1200650fc58c52af32c90f80479c25d1cbf57980ec3065/greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c", size = 1121190, upload-time = "2025-06-05T16:36:48.59Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/e1/25297f70717abe8104c20ecf7af0a5b82d2f5a980eb1ac79f65654799f9f/greenlet-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:93d48533fade144203816783373f27a97e4193177ebaaf0fc396db19e5d61163", size = 1149055, upload-time = "2025-06-05T16:12:40.457Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/8f/8f9e56c5e82eb2c26e8cde787962e66494312dc8cb261c460e1f3a9c88bc/greenlet-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:7454d37c740bb27bdeddfc3f358f26956a07d5220818ceb467a483197d84f849", size = 297817, upload-time = "2025-06-05T16:29:49.244Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/cf/f5c0b23309070ae93de75c90d29300751a5aacefc0a3ed1b1d8edb28f08b/greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad", size = 270732, upload-time = "2025-06-05T16:10:08.26Z" },
+ { url = "https://files.pythonhosted.org/packages/48/ae/91a957ba60482d3fecf9be49bc3948f341d706b52ddb9d83a70d42abd498/greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef", size = 639033, upload-time = "2025-06-05T16:38:53.983Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/df/20ffa66dd5a7a7beffa6451bdb7400d66251374ab40b99981478c69a67a8/greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3", size = 652999, upload-time = "2025-06-05T16:41:37.89Z" },
+ { url = "https://files.pythonhosted.org/packages/51/b4/ebb2c8cb41e521f1d72bf0465f2f9a2fd803f674a88db228887e6847077e/greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95", size = 647368, upload-time = "2025-06-05T16:48:21.467Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/6a/1e1b5aa10dced4ae876a322155705257748108b7fd2e4fae3f2a091fe81a/greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb", size = 650037, upload-time = "2025-06-05T16:13:06.402Z" },
+ { url = "https://files.pythonhosted.org/packages/26/f2/ad51331a157c7015c675702e2d5230c243695c788f8f75feba1af32b3617/greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b", size = 608402, upload-time = "2025-06-05T16:12:51.91Z" },
+ { url = "https://files.pythonhosted.org/packages/26/bc/862bd2083e6b3aff23300900a956f4ea9a4059de337f5c8734346b9b34fc/greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0", size = 1119577, upload-time = "2025-06-05T16:36:49.787Z" },
+ { url = "https://files.pythonhosted.org/packages/86/94/1fc0cc068cfde885170e01de40a619b00eaa8f2916bf3541744730ffb4c3/greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36", size = 1147121, upload-time = "2025-06-05T16:12:42.527Z" },
+ { url = "https://files.pythonhosted.org/packages/27/1a/199f9587e8cb08a0658f9c30f3799244307614148ffe8b1e3aa22f324dea/greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3", size = 297603, upload-time = "2025-06-05T16:20:12.651Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/ca/accd7aa5280eb92b70ed9e8f7fd79dc50a2c21d8c73b9a0856f5b564e222/greenlet-3.2.3-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:3d04332dddb10b4a211b68111dabaee2e1a073663d117dc10247b5b1642bac86", size = 271479, upload-time = "2025-06-05T16:10:47.525Z" },
+ { url = "https://files.pythonhosted.org/packages/55/71/01ed9895d9eb49223280ecc98a557585edfa56b3d0e965b9fa9f7f06b6d9/greenlet-3.2.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8186162dffde068a465deab08fc72c767196895c39db26ab1c17c0b77a6d8b97", size = 683952, upload-time = "2025-06-05T16:38:55.125Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/61/638c4bdf460c3c678a0a1ef4c200f347dff80719597e53b5edb2fb27ab54/greenlet-3.2.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f4bfbaa6096b1b7a200024784217defedf46a07c2eee1a498e94a1b5f8ec5728", size = 696917, upload-time = "2025-06-05T16:41:38.959Z" },
+ { url = "https://files.pythonhosted.org/packages/22/cc/0bd1a7eb759d1f3e3cc2d1bc0f0b487ad3cc9f34d74da4b80f226fde4ec3/greenlet-3.2.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ed6cfa9200484d234d8394c70f5492f144b20d4533f69262d530a1a082f6ee9a", size = 692443, upload-time = "2025-06-05T16:48:23.113Z" },
+ { url = "https://files.pythonhosted.org/packages/67/10/b2a4b63d3f08362662e89c103f7fe28894a51ae0bc890fabf37d1d780e52/greenlet-3.2.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:02b0df6f63cd15012bed5401b47829cfd2e97052dc89da3cfaf2c779124eb892", size = 692995, upload-time = "2025-06-05T16:13:07.972Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/c6/ad82f148a4e3ce9564056453a71529732baf5448ad53fc323e37efe34f66/greenlet-3.2.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86c2d68e87107c1792e2e8d5399acec2487a4e993ab76c792408e59394d52141", size = 655320, upload-time = "2025-06-05T16:12:53.453Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/4f/aab73ecaa6b3086a4c89863d94cf26fa84cbff63f52ce9bc4342b3087a06/greenlet-3.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:8c47aae8fbbfcf82cc13327ae802ba13c9c36753b67e760023fd116bc124a62a", size = 301236, upload-time = "2025-06-05T16:15:20.111Z" },
]
[[package]]
name = "h11"
-version = "0.14.0"
+version = "0.16.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 }
+sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
+ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
]
[[package]]
name = "httpcore"
-version = "1.0.7"
+version = "1.0.9"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "certifi" },
{ name = "h11" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 }
+sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 },
+ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" },
]
[[package]]
@@ -508,14 +585,26 @@ dependencies = [
{ name = "httpcore" },
{ name = "idna" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 }
+sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
+]
+
+[[package]]
+name = "hypothesis"
+version = "6.147.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "sortedcontainers" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f3/53/e19fe74671fd60db86344a4623c818fac58b813cc3efbb7ea3b3074dcb71/hypothesis-6.147.0.tar.gz", hash = "sha256:72e6004ea3bd1460bdb4640b6389df23b87ba7a4851893fd84d1375635d3e507", size = 468587, upload-time = "2025-11-06T20:27:29.682Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 },
+ { url = "https://files.pythonhosted.org/packages/b2/1b/932eddc3d55c4ed6c585006cffe6c6a133b5e1797d873de0bcf5208e4fed/hypothesis-6.147.0-py3-none-any.whl", hash = "sha256:de588807b6da33550d32f47bcd42b1a86d061df85673aa73e6443680249d185e", size = 535595, upload-time = "2025-11-06T20:27:23.536Z" },
]
[[package]]
name = "icecream"
-version = "2.1.3"
+version = "2.1.5"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "asttokens" },
@@ -523,32 +612,41 @@ dependencies = [
{ name = "executing" },
{ name = "pygments" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/1c/8b/ae6ebc9fc423f9397a0982990c86f1fe94077df729ef452c9a847fb16ae6/icecream-2.1.3.tar.gz", hash = "sha256:0aa4a7c3374ec36153a1d08f81e3080e83d8ac1eefd97d2f4fe9544e8f9b49de", size = 14722 }
+sdist = { url = "https://files.pythonhosted.org/packages/0e/5f/9635c20f14f558768e89b0e20c32ca852640b8973e102ff2f6ee229bbebc/icecream-2.1.5.tar.gz", hash = "sha256:14d21e3383326a69a8c1a3bcf11f83283459f0d269ece5af83fce2c0d663efec", size = 16744, upload-time = "2025-06-25T18:02:31.44Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/06/4e/21e309c7087695cf500a1827597f8510641f2c9a50ed7741bf7fc38736ff/icecream-2.1.3-py2.py3-none-any.whl", hash = "sha256:757aec31ad4488b949bc4f499d18e6e5973c40cc4d4fc607229e78cfaec94c34", size = 8425 },
+ { url = "https://files.pythonhosted.org/packages/36/0a/9496191b82b2839cc92fc713a5888931ab301dfcc55b9d5a49665cdb2aa5/icecream-2.1.5-py3-none-any.whl", hash = "sha256:c020917c5cb180a528dbba170250ccd8b74ebc75f2a7a8e839819bf959b9f80c", size = 14378, upload-time = "2025-06-25T18:02:30.262Z" },
]
[[package]]
name = "idna"
version = "3.10"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
+sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
]
[[package]]
name = "inject"
-version = "5.2.1"
+version = "5.3.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/03/c5/679c993e82dcd86056cfc44dc6bb6f0ed4a2fcb379c7640ba7e10fb217da/inject-5.2.1.tar.gz", hash = "sha256:f7c305a75cc4e3a331d248e996f25783ba784b88d5a9b9f73c53eacaa6d76985", size = 25995 }
+sdist = { url = "https://files.pythonhosted.org/packages/3e/b6/762d2dac6b587698abde000dc0fe85dfe9cd469cbda8856699a84adee82a/inject-5.3.0.tar.gz", hash = "sha256:bc9db0fe05a42990dbdaf570db085c409bc8d1a9dea6d06143049476b922abba", size = 26482, upload-time = "2025-06-20T10:20:51.825Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/e9/db/3250e21ff08b3466e1ce8d0b2b09edcd6af7672f709d8625e142e824eb0b/inject-5.2.1-py2.py3-none-any.whl", hash = "sha256:e40a5b1bebd8a4050b6f98f3396f3de6e9e2e411ad2a2145f16f351cb6f54e51", size = 14151 },
+ { url = "https://files.pythonhosted.org/packages/98/6e/b00ef8fe9a43aa3a6f5687b710832f0d876c0812bd0ce1c3af3e71bf7dd1/inject-5.3.0-py2.py3-none-any.whl", hash = "sha256:4758eb6c464d3e2badbbf65ac991c64752b05429d6af4c3c0e5b2765efaf7e73", size = 14349, upload-time = "2025-06-20T10:20:50.717Z" },
]
[[package]]
name = "ipykernel"
-version = "6.29.5"
+version = "6.30.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "appnope", marker = "sys_platform == 'darwin'" },
@@ -565,18 +663,19 @@ dependencies = [
{ name = "tornado" },
{ name = "traitlets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 }
+sdist = { url = "https://files.pythonhosted.org/packages/bb/76/11082e338e0daadc89c8ff866185de11daf67d181901038f9e139d109761/ipykernel-6.30.1.tar.gz", hash = "sha256:6abb270161896402e76b91394fcdce5d1be5d45f456671e5080572f8505be39b", size = 166260, upload-time = "2025-08-04T15:47:35.018Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 },
+ { url = "https://files.pythonhosted.org/packages/fc/c7/b445faca8deb954fe536abebff4ece5b097b923de482b26e78448c89d1dd/ipykernel-6.30.1-py3-none-any.whl", hash = "sha256:aa6b9fb93dca949069d8b85b6c79b2518e32ac583ae9c7d37c51d119e18b3fb4", size = 117484, upload-time = "2025-08-04T15:47:32.622Z" },
]
[[package]]
name = "ipython"
-version = "8.31.0"
+version = "9.4.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
{ name = "decorator" },
+ { name = "ipython-pygments-lexers" },
{ name = "jedi" },
{ name = "matplotlib-inline" },
{ name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
@@ -585,14 +684,26 @@ dependencies = [
{ name = "stack-data" },
{ name = "traitlets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/01/35/6f90fdddff7a08b7b715fccbd2427b5212c9525cd043d26fdc45bee0708d/ipython-8.31.0.tar.gz", hash = "sha256:b6a2274606bec6166405ff05e54932ed6e5cfecaca1fc05f2cacde7bb074d70b", size = 5501011 }
+sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338, upload-time = "2025-07-01T11:11:30.606Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021, upload-time = "2025-07-01T11:11:27.85Z" },
+]
+
+[[package]]
+name = "ipython-pygments-lexers"
+version = "1.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/04/60/d0feb6b6d9fe4ab89fe8fe5b47cbf6cd936bfd9f1e7ffa9d0015425aeed6/ipython-8.31.0-py3-none-any.whl", hash = "sha256:46ec58f8d3d076a61d128fe517a51eb730e3aaf0c184ea8c17d16e366660c6a6", size = 821583 },
+ { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" },
]
[[package]]
name = "ipywidgets"
-version = "8.1.5"
+version = "8.1.7"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "comm" },
@@ -601,9 +712,9 @@ dependencies = [
{ name = "traitlets" },
{ name = "widgetsnbextension" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/c7/4c/dab2a281b07596a5fc220d49827fe6c794c66f1493d7a74f1df0640f2cc5/ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17", size = 116723 }
+sdist = { url = "https://files.pythonhosted.org/packages/3e/48/d3dbac45c2814cb73812f98dd6b38bbcc957a4e7bb31d6ea9c03bf94ed87/ipywidgets-8.1.7.tar.gz", hash = "sha256:15f1ac050b9ccbefd45dccfbb2ef6bed0029d8278682d569d71b8dd96bee0376", size = 116721, upload-time = "2025-05-05T12:42:03.489Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245", size = 139767 },
+ { url = "https://files.pythonhosted.org/packages/58/6a/9166369a2f092bd286d24e6307de555d63616e8ddb373ebad2b5635ca4cd/ipywidgets-8.1.7-py3-none-any.whl", hash = "sha256:764f2602d25471c213919b8a1997df04bef869251db4ca8efba1b76b1bd9f7bb", size = 139806, upload-time = "2025-05-05T12:41:56.833Z" },
]
[[package]]
@@ -613,9 +724,9 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "arrow" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649 }
+sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649, upload-time = "2020-11-01T11:00:00.312Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321 },
+ { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload-time = "2020-11-01T10:59:58.02Z" },
]
[[package]]
@@ -625,44 +736,44 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "parso" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 }
+sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 },
+ { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" },
]
[[package]]
name = "jinja2"
-version = "3.1.5"
+version = "3.1.6"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "markupsafe" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 }
+sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 },
+ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
]
[[package]]
name = "json5"
-version = "0.10.0"
+version = "0.12.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/85/3d/bbe62f3d0c05a689c711cff57b2e3ac3d3e526380adb7c781989f075115c/json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559", size = 48202 }
+sdist = { url = "https://files.pythonhosted.org/packages/12/be/c6c745ec4c4539b25a278b70e29793f10382947df0d9efba2fa09120895d/json5-0.12.0.tar.gz", hash = "sha256:0b4b6ff56801a1c7dc817b0241bca4ce474a0e6a163bfef3fc594d3fd263ff3a", size = 51907, upload-time = "2025-04-03T16:33:13.201Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa", size = 34049 },
+ { url = "https://files.pythonhosted.org/packages/41/9f/3500910d5a98549e3098807493851eeef2b89cdd3032227558a104dfe926/json5-0.12.0-py3-none-any.whl", hash = "sha256:6d37aa6c08b0609f16e1ec5ff94697e2cbbfbad5ac112afa05794da9ab7810db", size = 36079, upload-time = "2025-04-03T16:33:11.927Z" },
]
[[package]]
name = "jsonpointer"
version = "3.0.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 }
+sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114, upload-time = "2024-06-10T19:24:42.462Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 },
+ { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" },
]
[[package]]
name = "jsonschema"
-version = "4.23.0"
+version = "4.25.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "attrs" },
@@ -670,9 +781,9 @@ dependencies = [
{ name = "referencing" },
{ name = "rpds-py" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 }
+sdist = { url = "https://files.pythonhosted.org/packages/d5/00/a297a868e9d0784450faa7365c2172a7d6110c763e30ba861867c32ae6a9/jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f", size = 356830, upload-time = "2025-07-18T15:39:45.11Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 },
+ { url = "https://files.pythonhosted.org/packages/fe/54/c86cd8e011fe98803d7e382fd67c0df5ceab8d2b7ad8c5a81524f791551c/jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716", size = 89184, upload-time = "2025-07-18T15:39:42.956Z" },
]
[package.optional-dependencies]
@@ -683,20 +794,21 @@ format-nongpl = [
{ name = "jsonpointer" },
{ name = "rfc3339-validator" },
{ name = "rfc3986-validator" },
+ { name = "rfc3987-syntax" },
{ name = "uri-template" },
{ name = "webcolors" },
]
[[package]]
name = "jsonschema-specifications"
-version = "2024.10.1"
+version = "2025.4.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "referencing" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/10/db/58f950c996c793472e336ff3655b13fbcf1e3b359dcf52dcf3ed3b52c352/jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", size = 15561 }
+sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload-time = "2025-04-23T12:34:07.418Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 },
+ { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload-time = "2025-04-23T12:34:05.422Z" },
]
[[package]]
@@ -711,9 +823,9 @@ dependencies = [
{ name = "nbconvert" },
{ name = "notebook" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959 }
+sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959, upload-time = "2024-08-30T07:15:48.299Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657 },
+ { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657, upload-time = "2024-08-30T07:15:47.045Z" },
]
[[package]]
@@ -727,9 +839,9 @@ dependencies = [
{ name = "tornado" },
{ name = "traitlets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 }
+sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload-time = "2024-09-17T10:44:17.613Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 },
+ { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload-time = "2024-09-17T10:44:15.218Z" },
]
[[package]]
@@ -746,31 +858,32 @@ dependencies = [
{ name = "pyzmq" },
{ name = "traitlets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363 }
+sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363, upload-time = "2023-03-06T14:13:31.02Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510 },
+ { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510, upload-time = "2023-03-06T14:13:28.229Z" },
]
[[package]]
name = "jupyter-core"
-version = "5.7.2"
+version = "5.8.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "platformdirs" },
{ name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" },
{ name = "traitlets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 }
+sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload-time = "2025-05-27T07:38:16.655Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 },
+ { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload-time = "2025-05-27T07:38:15.137Z" },
]
[[package]]
name = "jupyter-events"
-version = "0.11.0"
+version = "0.12.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "jsonschema", extra = ["format-nongpl"] },
+ { name = "packaging" },
{ name = "python-json-logger" },
{ name = "pyyaml" },
{ name = "referencing" },
@@ -778,26 +891,26 @@ dependencies = [
{ name = "rfc3986-validator" },
{ name = "traitlets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/f4/65/5791c8a979b5646ca29ea50e42b6708908b789f7ff389d1a03c1b93a1c54/jupyter_events-0.11.0.tar.gz", hash = "sha256:c0bc56a37aac29c1fbc3bcfbddb8c8c49533f9cf11f1c4e6adadba936574ab90", size = 62039 }
+sdist = { url = "https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b", size = 62196, upload-time = "2025-02-03T17:23:41.485Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/3f/8c/9b65cb2cd4ea32d885993d5542244641590530836802a2e8c7449a4c61c9/jupyter_events-0.11.0-py3-none-any.whl", hash = "sha256:36399b41ce1ca45fe8b8271067d6a140ffa54cec4028e95491c93b78a855cacf", size = 19423 },
+ { url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", size = 19430, upload-time = "2025-02-03T17:23:38.643Z" },
]
[[package]]
name = "jupyter-lsp"
-version = "2.2.5"
+version = "2.2.6"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "jupyter-server" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/85/b4/3200b0b09c12bc3b72d943d923323c398eff382d1dcc7c0dbc8b74630e40/jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001", size = 48741 }
+sdist = { url = "https://files.pythonhosted.org/packages/28/3d/40bdb41b665d3302390ed1356cebd5917c10769d1f190ee4ca595900840e/jupyter_lsp-2.2.6.tar.gz", hash = "sha256:0566bd9bb04fd9e6774a937ed01522b555ba78be37bebef787c8ab22de4c0361", size = 48948, upload-time = "2025-07-18T21:35:19.885Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/07/e0/7bd7cff65594fd9936e2f9385701e44574fc7d721331ff676ce440b14100/jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da", size = 69146 },
+ { url = "https://files.pythonhosted.org/packages/47/7c/12f68daf85b469b4896d5e4a629baa33c806d61de75ac5b39d8ef27ec4a2/jupyter_lsp-2.2.6-py3-none-any.whl", hash = "sha256:283783752bf0b459ee7fa88effa72104d87dd343b82d5c06cf113ef755b15b6d", size = 69371, upload-time = "2025-07-18T21:35:16.585Z" },
]
[[package]]
name = "jupyter-server"
-version = "2.15.0"
+version = "2.16.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
@@ -820,9 +933,9 @@ dependencies = [
{ name = "traitlets" },
{ name = "websocket-client" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/61/8c/df09d4ab646141f130f9977b32b206ba8615d1969b2eba6a2e84b7f89137/jupyter_server-2.15.0.tar.gz", hash = "sha256:9d446b8697b4f7337a1b7cdcac40778babdd93ba614b6d68ab1c0c918f1c4084", size = 725227 }
+sdist = { url = "https://files.pythonhosted.org/packages/41/c8/ba2bbcd758c47f1124c4ca14061e8ce60d9c6fd537faee9534a95f83521a/jupyter_server-2.16.0.tar.gz", hash = "sha256:65d4b44fdf2dcbbdfe0aa1ace4a842d4aaf746a2b7b168134d5aaed35621b7f6", size = 728177, upload-time = "2025-05-12T16:44:46.245Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl", hash = "sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3", size = 385826 },
+ { url = "https://files.pythonhosted.org/packages/46/1f/5ebbced977171d09a7b0c08a285ff9a20aafb9c51bde07e52349ff1ddd71/jupyter_server-2.16.0-py3-none-any.whl", hash = "sha256:3d8db5be3bc64403b1c65b400a1d7f4647a5ce743f3b20dbdefe8ddb7b55af9e", size = 386904, upload-time = "2025-05-12T16:44:43.335Z" },
]
[[package]]
@@ -833,14 +946,14 @@ dependencies = [
{ name = "pywinpty", marker = "os_name == 'nt'" },
{ name = "terminado" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269", size = 31430 }
+sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269", size = 31430, upload-time = "2024-03-12T14:37:03.049Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", size = 13656 },
+ { url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", size = 13656, upload-time = "2024-03-12T14:37:00.708Z" },
]
[[package]]
name = "jupyterlab"
-version = "4.3.4"
+version = "4.4.5"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "async-lru" },
@@ -857,18 +970,18 @@ dependencies = [
{ name = "tornado" },
{ name = "traitlets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/a7/45/1052f842e066902b1d78126df7e2269b1b9408991e1344e167b2e429f9e1/jupyterlab-4.3.4.tar.gz", hash = "sha256:f0bb9b09a04766e3423cccc2fc23169aa2ffedcdf8713e9e0fb33cac0b6859d0", size = 21797583 }
+sdist = { url = "https://files.pythonhosted.org/packages/20/89/695805a6564bafe08ef2505f3c473ae7140b8ba431d381436f11bdc2c266/jupyterlab-4.4.5.tar.gz", hash = "sha256:0bd6c18e6a3c3d91388af6540afa3d0bb0b2e76287a7b88ddf20ab41b336e595", size = 23037079, upload-time = "2025-07-20T09:21:30.151Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/61/48/af57263e53cfc220e522de047aa0993f53bab734fe812af1e03e33ac6d7c/jupyterlab-4.3.4-py3-none-any.whl", hash = "sha256:b754c2601c5be6adf87cb5a1d8495d653ffb945f021939f77776acaa94dae952", size = 11665373 },
+ { url = "https://files.pythonhosted.org/packages/47/74/e144ce85b34414e44b14c1f6bf2e3bfe17964c8e5670ebdc7629f2e53672/jupyterlab-4.4.5-py3-none-any.whl", hash = "sha256:e76244cceb2d1fb4a99341f3edc866f2a13a9e14c50368d730d75d8017be0863", size = 12267763, upload-time = "2025-07-20T09:21:26.37Z" },
]
[[package]]
name = "jupyterlab-pygments"
version = "0.3.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900 }
+sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884 },
+ { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" },
]
[[package]]
@@ -884,18 +997,27 @@ dependencies = [
{ name = "packaging" },
{ name = "requests" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/0a/c9/a883ce65eb27905ce77ace410d83587c82ea64dc85a48d1f7ed52bcfa68d/jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4", size = 76173 }
+sdist = { url = "https://files.pythonhosted.org/packages/0a/c9/a883ce65eb27905ce77ace410d83587c82ea64dc85a48d1f7ed52bcfa68d/jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4", size = 76173, upload-time = "2024-07-16T17:02:04.149Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4", size = 59700 },
+ { url = "https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4", size = 59700, upload-time = "2024-07-16T17:02:01.115Z" },
]
[[package]]
name = "jupyterlab-widgets"
-version = "3.0.13"
+version = "3.0.15"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/59/73/fa26bbb747a9ea4fca6b01453aa22990d52ab62dd61384f1ac0dc9d4e7ba/jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed", size = 203556 }
+sdist = { url = "https://files.pythonhosted.org/packages/b9/7d/160595ca88ee87ac6ba95d82177d29ec60aaa63821d3077babb22ce031a5/jupyterlab_widgets-3.0.15.tar.gz", hash = "sha256:2920888a0c2922351a9202817957a68c07d99673504d6cd37345299e971bb08b", size = 213149, upload-time = "2025-05-05T12:32:31.004Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a9/93/858e87edc634d628e5d752ba944c2833133a28fa87bb093e6832ced36a3e/jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54", size = 214392 },
+ { url = "https://files.pythonhosted.org/packages/43/6a/ca128561b22b60bd5a0c4ea26649e68c8556b82bc70a0c396eebc977fe86/jupyterlab_widgets-3.0.15-py3-none-any.whl", hash = "sha256:d59023d7d7ef71400d51e6fee9a88867f6e65e10a4201605d2d7f3e8f012a31c", size = 216571, upload-time = "2025-05-05T12:32:29.534Z" },
+]
+
+[[package]]
+name = "lark"
+version = "1.2.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/af/60/bc7622aefb2aee1c0b4ba23c1446d3e30225c8770b38d7aedbfb65ca9d5a/lark-1.2.2.tar.gz", hash = "sha256:ca807d0162cd16cef15a8feecb862d7319e7a09bdb13aef927968e45040fed80", size = 252132, upload-time = "2024-08-13T19:49:00.652Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2d/00/d90b10b962b4277f5e64a78b6609968859ff86889f5b898c1a778c06ec00/lark-1.2.2-py3-none-any.whl", hash = "sha256:c2276486b02f0f1b90be155f2c8ba4a8e194d42775786db622faccd652d8e80c", size = 111036, upload-time = "2024-08-13T19:48:58.603Z" },
]
[[package]]
@@ -905,47 +1027,47 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "mdurl" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 }
+sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 },
+ { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" },
]
[[package]]
name = "markupsafe"
version = "3.0.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 },
- { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 },
- { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 },
- { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 },
- { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 },
- { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 },
- { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 },
- { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 },
- { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 },
- { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 },
- { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 },
- { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 },
- { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 },
- { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 },
- { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 },
- { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 },
- { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 },
- { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 },
- { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 },
- { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 },
- { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 },
- { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 },
- { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 },
- { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 },
- { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 },
- { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 },
- { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 },
- { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 },
- { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 },
- { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 },
+sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" },
+ { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" },
+ { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" },
+ { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" },
+ { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" },
+ { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" },
+ { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" },
+ { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" },
+ { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" },
]
[[package]]
@@ -955,36 +1077,36 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "traitlets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 }
+sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload-time = "2024-04-15T13:44:44.803Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 },
+ { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload-time = "2024-04-15T13:44:43.265Z" },
]
[[package]]
name = "mdurl"
version = "0.1.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
]
[[package]]
name = "mistune"
-version = "3.1.0"
+version = "3.1.3"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/79/6e/96fc7cb3288666c5de2c396eb0e338dc95f7a8e4920e43e38783a22d0084/mistune-3.1.0.tar.gz", hash = "sha256:dbcac2f78292b9dc066cd03b7a3a26b62d85f8159f2ea5fd28e55df79908d667", size = 94401 }
+sdist = { url = "https://files.pythonhosted.org/packages/c4/79/bda47f7dd7c3c55770478d6d02c9960c430b0cf1773b72366ff89126ea31/mistune-3.1.3.tar.gz", hash = "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0", size = 94347, upload-time = "2025-03-19T14:27:24.955Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b4/b3/743ffc3f59da380da504d84ccd1faf9a857a1445991ff19bf2ec754163c2/mistune-3.1.0-py3-none-any.whl", hash = "sha256:b05198cf6d671b3deba6c87ec6cf0d4eb7b72c524636eddb6dbf13823b52cee1", size = 53694 },
+ { url = "https://files.pythonhosted.org/packages/01/4d/23c4e4f09da849e127e9f123241946c23c1e30f45a88366879e064211815/mistune-3.1.3-py3-none-any.whl", hash = "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9", size = 53410, upload-time = "2025-03-19T14:27:23.451Z" },
]
[[package]]
name = "nameparser"
version = "1.1.3"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ee/f6/418a49f9e7a6d98f938e712b1356eaff2247bc1ce679a851ac0d02022330/nameparser-1.1.3.tar.gz", hash = "sha256:aa2400ad71ccf8070675b40311a257c934659f91854b154e1ba6c264761c049d", size = 36504 }
+sdist = { url = "https://files.pythonhosted.org/packages/ee/f6/418a49f9e7a6d98f938e712b1356eaff2247bc1ce679a851ac0d02022330/nameparser-1.1.3.tar.gz", hash = "sha256:aa2400ad71ccf8070675b40311a257c934659f91854b154e1ba6c264761c049d", size = 36504, upload-time = "2023-09-21T00:12:05.522Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/5c/41/dd01b1f0ccffe618efe2d66ecde6964b0fada9d0f4891542675a9e722498/nameparser-1.1.3-py2.py3-none-any.whl", hash = "sha256:08ccda98681d59751c82052d52f185bc52f99d43e87d46b85c015a9096ecfa66", size = 24669 },
+ { url = "https://files.pythonhosted.org/packages/5c/41/dd01b1f0ccffe618efe2d66ecde6964b0fada9d0f4891542675a9e722498/nameparser-1.1.3-py2.py3-none-any.whl", hash = "sha256:08ccda98681d59751c82052d52f185bc52f99d43e87d46b85c015a9096ecfa66", size = 24669, upload-time = "2023-09-21T00:12:04.174Z" },
]
[[package]]
@@ -997,14 +1119,14 @@ dependencies = [
{ name = "nbformat" },
{ name = "traitlets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424 }
+sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424, upload-time = "2024-12-19T10:32:27.164Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434 },
+ { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434, upload-time = "2024-12-19T10:32:24.139Z" },
]
[[package]]
name = "nbconvert"
-version = "7.16.5"
+version = "7.16.6"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "beautifulsoup4" },
@@ -1022,9 +1144,9 @@ dependencies = [
{ name = "pygments" },
{ name = "traitlets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/46/2c/d026c0367f2be2463d4c2f5b538e28add2bc67bc13730abb7f364ae4eb8b/nbconvert-7.16.5.tar.gz", hash = "sha256:c83467bb5777fdfaac5ebbb8e864f300b277f68692ecc04d6dab72f2d8442344", size = 856367 }
+sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715, upload-time = "2025-01-28T09:29:14.724Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/8f/9e/2dcc9fe00cf55d95a8deae69384e9cea61816126e345754f6c75494d32ec/nbconvert-7.16.5-py3-none-any.whl", hash = "sha256:e12eac052d6fd03040af4166c563d76e7aeead2e9aadf5356db552a1784bd547", size = 258061 },
+ { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525, upload-time = "2025-01-28T09:29:12.551Z" },
]
[[package]]
@@ -1037,23 +1159,23 @@ dependencies = [
{ name = "jupyter-core" },
{ name = "traitlets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749 }
+sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454 },
+ { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" },
]
[[package]]
name = "nest-asyncio"
version = "1.6.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 }
+sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 },
+ { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" },
]
[[package]]
name = "notebook"
-version = "7.3.2"
+version = "7.4.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "jupyter-server" },
@@ -1062,9 +1184,9 @@ dependencies = [
{ name = "notebook-shim" },
{ name = "tornado" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/ea/04/ac488379d5afef43402b3fb4be2857db1a09804fecf98b9b714c741b225b/notebook-7.3.2.tar.gz", hash = "sha256:705e83a1785f45b383bf3ee13cb76680b92d24f56fb0c7d2136fe1d850cd3ca8", size = 12781804 }
+sdist = { url = "https://files.pythonhosted.org/packages/b1/4e/a40b5a94eb01fc51746db7854296d88b84905ab18ee0fcef853a60d708a3/notebook-7.4.4.tar.gz", hash = "sha256:392fd501e266f2fb3466c6fcd3331163a2184968cb5c5accf90292e01dfe528c", size = 13883628, upload-time = "2025-06-30T13:04:18.099Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/22/9b/76e50ee18f183ea5fe1784a9eeaa50f2c71802e4740d6e959592b0993298/notebook-7.3.2-py3-none-any.whl", hash = "sha256:e5f85fc59b69d3618d73cf27544418193ff8e8058d5bf61d315ce4f473556288", size = 13163630 },
+ { url = "https://files.pythonhosted.org/packages/b3/c0/e64d2047fd752249b0b69f6aee2a7049eb94e7273e5baabc8b8ad05cc068/notebook-7.4.4-py3-none-any.whl", hash = "sha256:32840f7f777b6bff79bb101159336e9b332bdbfba1495b8739e34d1d65cbc1c0", size = 14288000, upload-time = "2025-06-30T13:04:14.584Z" },
]
[[package]]
@@ -1074,68 +1196,93 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "jupyter-server" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167 }
+sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167, upload-time = "2024-02-14T23:35:18.353Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307 },
+ { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" },
]
[[package]]
name = "numpy"
-version = "2.2.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/47/1b/1d565e0f6e156e1522ab564176b8b29d71e13d8caf003a08768df3d5cec5/numpy-2.2.0.tar.gz", hash = "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", size = 20225497 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/7f/bc/a20dc4e1d051149052762e7647455311865d11c603170c476d1e910a353e/numpy-2.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", size = 20909153 },
- { url = "https://files.pythonhosted.org/packages/60/3d/ac4fb63f36db94f4c7db05b45e3ecb3f88f778ca71850664460c78cfde41/numpy-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", size = 14095021 },
- { url = "https://files.pythonhosted.org/packages/41/6d/a654d519d24e4fcc7a83d4a51209cda086f26cf30722b3d8ffc1aa9b775e/numpy-2.2.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", size = 5125491 },
- { url = "https://files.pythonhosted.org/packages/e6/22/fab7e1510a62e5092f4e6507a279020052b89f11d9cfe52af7f52c243b04/numpy-2.2.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", size = 6658534 },
- { url = "https://files.pythonhosted.org/packages/fc/29/a3d938ddc5a534cd53df7ab79d20a68db8c67578de1df0ae0118230f5f54/numpy-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", size = 14046306 },
- { url = "https://files.pythonhosted.org/packages/90/24/d0bbb56abdd8934f30384632e3c2ca1ebfeb5d17e150c6e366ba291de36b/numpy-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", size = 16095819 },
- { url = "https://files.pythonhosted.org/packages/99/9c/58a673faa9e8a0e77248e782f7a17410cf7259b326265646fd50ed49c4e1/numpy-2.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", size = 15243215 },
- { url = "https://files.pythonhosted.org/packages/9c/61/f311693f78cbf635cfb69ce9e1e857ff83937a27d93c96ac5932fd33e330/numpy-2.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", size = 17860175 },
- { url = "https://files.pythonhosted.org/packages/11/3e/491c34262cb1fc9dd13a00beb80d755ee0517b17db20e54cac7aa524533e/numpy-2.2.0-cp312-cp312-win32.whl", hash = "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", size = 6273281 },
- { url = "https://files.pythonhosted.org/packages/89/ea/00537f599eb230771157bc509f6ea5b2dddf05d4b09f9d2f1d7096a18781/numpy-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", size = 12613227 },
- { url = "https://files.pythonhosted.org/packages/bd/4c/0d1eef206545c994289e7a9de21b642880a11e0ed47a2b0c407c688c4f69/numpy-2.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367", size = 20895707 },
- { url = "https://files.pythonhosted.org/packages/16/cb/88f6c1e6df83002c421d5f854ccf134aa088aa997af786a5dac3f32ec99b/numpy-2.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", size = 14110592 },
- { url = "https://files.pythonhosted.org/packages/b4/54/817e6894168a43f33dca74199ba0dd0f1acd99aa6323ed6d323d63d640a2/numpy-2.2.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", size = 5110858 },
- { url = "https://files.pythonhosted.org/packages/c7/99/00d8a1a8eb70425bba7880257ed73fed08d3e8d05da4202fb6b9a81d5ee4/numpy-2.2.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", size = 6645143 },
- { url = "https://files.pythonhosted.org/packages/34/86/5b9c2b7c56e7a9d9297a0a4be0b8433f498eba52a8f5892d9132b0f64627/numpy-2.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", size = 14042812 },
- { url = "https://files.pythonhosted.org/packages/df/54/13535f74391dbe5f479ceed96f1403267be302c840040700d4fd66688089/numpy-2.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", size = 16093419 },
- { url = "https://files.pythonhosted.org/packages/dd/37/dfb2056842ac61315f225aa56f455da369f5223e4c5a38b91d20da1b628b/numpy-2.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", size = 15238969 },
- { url = "https://files.pythonhosted.org/packages/5a/3d/d20d24ee313992f0b7e7b9d9eef642d9b545d39d5b91c4a2cc8c98776328/numpy-2.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", size = 17855705 },
- { url = "https://files.pythonhosted.org/packages/5b/40/944c9ee264f875a2db6f79380944fd2b5bb9d712bb4a134d11f45ad5b693/numpy-2.2.0-cp313-cp313-win32.whl", hash = "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", size = 6270078 },
- { url = "https://files.pythonhosted.org/packages/30/04/e1ee6f8b22034302d4c5c24e15782bdedf76d90b90f3874ed0b48525def0/numpy-2.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", size = 12605791 },
- { url = "https://files.pythonhosted.org/packages/ef/fb/51d458625cd6134d60ac15180ae50995d7d21b0f2f92a6286ae7b0792d19/numpy-2.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", size = 20920160 },
- { url = "https://files.pythonhosted.org/packages/b4/34/162ae0c5d2536ea4be98c813b5161c980f0443cd5765fde16ddfe3450140/numpy-2.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", size = 14119064 },
- { url = "https://files.pythonhosted.org/packages/17/6c/4195dd0e1c41c55f466d516e17e9e28510f32af76d23061ea3da67438e3c/numpy-2.2.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", size = 5152778 },
- { url = "https://files.pythonhosted.org/packages/2f/47/ea804ae525832c8d05ed85b560dfd242d34e4bb0962bc269ccaa720fb934/numpy-2.2.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", size = 6667605 },
- { url = "https://files.pythonhosted.org/packages/76/99/34d20e50b3d894bb16b5374bfbee399ab8ff3a33bf1e1f0b8acfe7bbd70d/numpy-2.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", size = 14013275 },
- { url = "https://files.pythonhosted.org/packages/69/8f/a1df7bd02d434ab82539517d1b98028985700cfc4300bc5496fb140ca648/numpy-2.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", size = 16074900 },
- { url = "https://files.pythonhosted.org/packages/04/94/b419e7a76bf21a00fcb03c613583f10e389fdc8dfe420412ff5710c8ad3d/numpy-2.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", size = 15219122 },
- { url = "https://files.pythonhosted.org/packages/65/d9/dddf398b2b6c5d750892a207a469c2854a8db0f033edaf72103af8cf05aa/numpy-2.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", size = 17851668 },
- { url = "https://files.pythonhosted.org/packages/d4/dc/09a4e5819a9782a213c0eb4eecacdc1cd75ad8dac99279b04cfccb7eeb0a/numpy-2.2.0-cp313-cp313t-win32.whl", hash = "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", size = 6325288 },
- { url = "https://files.pythonhosted.org/packages/ce/e1/e0d06ec34036c92b43aef206efe99a5f5f04e12c776eab82a36e00c40afc/numpy-2.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", size = 12692303 },
+version = "2.3.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/37/7d/3fec4199c5ffb892bed55cff901e4f39a58c81df9c44c280499e92cad264/numpy-2.3.2.tar.gz", hash = "sha256:e0486a11ec30cdecb53f184d496d1c6a20786c81e55e41640270130056f8ee48", size = 20489306, upload-time = "2025-07-24T21:32:07.553Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/00/6d/745dd1c1c5c284d17725e5c802ca4d45cfc6803519d777f087b71c9f4069/numpy-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bc3186bea41fae9d8e90c2b4fb5f0a1f5a690682da79b92574d63f56b529080b", size = 20956420, upload-time = "2025-07-24T20:28:18.002Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/96/e7b533ea5740641dd62b07a790af5d9d8fec36000b8e2d0472bd7574105f/numpy-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f4f0215edb189048a3c03bd5b19345bdfa7b45a7a6f72ae5945d2a28272727f", size = 14184660, upload-time = "2025-07-24T20:28:39.522Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/53/102c6122db45a62aa20d1b18c9986f67e6b97e0d6fbc1ae13e3e4c84430c/numpy-2.3.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b1224a734cd509f70816455c3cffe13a4f599b1bf7130f913ba0e2c0b2006c0", size = 5113382, upload-time = "2025-07-24T20:28:48.544Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/21/376257efcbf63e624250717e82b4fae93d60178f09eb03ed766dbb48ec9c/numpy-2.3.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3dcf02866b977a38ba3ec10215220609ab9667378a9e2150615673f3ffd6c73b", size = 6647258, upload-time = "2025-07-24T20:28:59.104Z" },
+ { url = "https://files.pythonhosted.org/packages/91/ba/f4ebf257f08affa464fe6036e13f2bf9d4642a40228781dc1235da81be9f/numpy-2.3.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:572d5512df5470f50ada8d1972c5f1082d9a0b7aa5944db8084077570cf98370", size = 14281409, upload-time = "2025-07-24T20:40:30.298Z" },
+ { url = "https://files.pythonhosted.org/packages/59/ef/f96536f1df42c668cbacb727a8c6da7afc9c05ece6d558927fb1722693e1/numpy-2.3.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8145dd6d10df13c559d1e4314df29695613575183fa2e2d11fac4c208c8a1f73", size = 16641317, upload-time = "2025-07-24T20:40:56.625Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/a7/af813a7b4f9a42f498dde8a4c6fcbff8100eed00182cc91dbaf095645f38/numpy-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:103ea7063fa624af04a791c39f97070bf93b96d7af7eb23530cd087dc8dbe9dc", size = 16056262, upload-time = "2025-07-24T20:41:20.797Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/5d/41c4ef8404caaa7f05ed1cfb06afe16a25895260eacbd29b4d84dff2920b/numpy-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc927d7f289d14f5e037be917539620603294454130b6de200091e23d27dc9be", size = 18579342, upload-time = "2025-07-24T20:41:50.753Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/4f/9950e44c5a11636f4a3af6e825ec23003475cc9a466edb7a759ed3ea63bd/numpy-2.3.2-cp312-cp312-win32.whl", hash = "sha256:d95f59afe7f808c103be692175008bab926b59309ade3e6d25009e9a171f7036", size = 6320610, upload-time = "2025-07-24T20:42:01.551Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/2f/244643a5ce54a94f0a9a2ab578189c061e4a87c002e037b0829dd77293b6/numpy-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:9e196ade2400c0c737d93465327d1ae7c06c7cb8a1756121ebf54b06ca183c7f", size = 12786292, upload-time = "2025-07-24T20:42:20.738Z" },
+ { url = "https://files.pythonhosted.org/packages/54/cd/7b5f49d5d78db7badab22d8323c1b6ae458fbf86c4fdfa194ab3cd4eb39b/numpy-2.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:ee807923782faaf60d0d7331f5e86da7d5e3079e28b291973c545476c2b00d07", size = 10194071, upload-time = "2025-07-24T20:42:36.657Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/c0/c6bb172c916b00700ed3bf71cb56175fd1f7dbecebf8353545d0b5519f6c/numpy-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c8d9727f5316a256425892b043736d63e89ed15bbfe6556c5ff4d9d4448ff3b3", size = 20949074, upload-time = "2025-07-24T20:43:07.813Z" },
+ { url = "https://files.pythonhosted.org/packages/20/4e/c116466d22acaf4573e58421c956c6076dc526e24a6be0903219775d862e/numpy-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:efc81393f25f14d11c9d161e46e6ee348637c0a1e8a54bf9dedc472a3fae993b", size = 14177311, upload-time = "2025-07-24T20:43:29.335Z" },
+ { url = "https://files.pythonhosted.org/packages/78/45/d4698c182895af189c463fc91d70805d455a227261d950e4e0f1310c2550/numpy-2.3.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dd937f088a2df683cbb79dda9a772b62a3e5a8a7e76690612c2737f38c6ef1b6", size = 5106022, upload-time = "2025-07-24T20:43:37.999Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/76/3e6880fef4420179309dba72a8c11f6166c431cf6dee54c577af8906f914/numpy-2.3.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:11e58218c0c46c80509186e460d79fbdc9ca1eb8d8aee39d8f2dc768eb781089", size = 6640135, upload-time = "2025-07-24T20:43:49.28Z" },
+ { url = "https://files.pythonhosted.org/packages/34/fa/87ff7f25b3c4ce9085a62554460b7db686fef1e0207e8977795c7b7d7ba1/numpy-2.3.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5ad4ebcb683a1f99f4f392cc522ee20a18b2bb12a2c1c42c3d48d5a1adc9d3d2", size = 14278147, upload-time = "2025-07-24T20:44:10.328Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/0f/571b2c7a3833ae419fe69ff7b479a78d313581785203cc70a8db90121b9a/numpy-2.3.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:938065908d1d869c7d75d8ec45f735a034771c6ea07088867f713d1cd3bbbe4f", size = 16635989, upload-time = "2025-07-24T20:44:34.88Z" },
+ { url = "https://files.pythonhosted.org/packages/24/5a/84ae8dca9c9a4c592fe11340b36a86ffa9fd3e40513198daf8a97839345c/numpy-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66459dccc65d8ec98cc7df61307b64bf9e08101f9598755d42d8ae65d9a7a6ee", size = 16053052, upload-time = "2025-07-24T20:44:58.872Z" },
+ { url = "https://files.pythonhosted.org/packages/57/7c/e5725d99a9133b9813fcf148d3f858df98511686e853169dbaf63aec6097/numpy-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a7af9ed2aa9ec5950daf05bb11abc4076a108bd3c7db9aa7251d5f107079b6a6", size = 18577955, upload-time = "2025-07-24T20:45:26.714Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/11/7c546fcf42145f29b71e4d6f429e96d8d68e5a7ba1830b2e68d7418f0bbd/numpy-2.3.2-cp313-cp313-win32.whl", hash = "sha256:906a30249315f9c8e17b085cc5f87d3f369b35fedd0051d4a84686967bdbbd0b", size = 6311843, upload-time = "2025-07-24T20:49:24.444Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/6f/a428fd1cb7ed39b4280d057720fed5121b0d7754fd2a9768640160f5517b/numpy-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:c63d95dc9d67b676e9108fe0d2182987ccb0f11933c1e8959f42fa0da8d4fa56", size = 12782876, upload-time = "2025-07-24T20:49:43.227Z" },
+ { url = "https://files.pythonhosted.org/packages/65/85/4ea455c9040a12595fb6c43f2c217257c7b52dd0ba332c6a6c1d28b289fe/numpy-2.3.2-cp313-cp313-win_arm64.whl", hash = "sha256:b05a89f2fb84d21235f93de47129dd4f11c16f64c87c33f5e284e6a3a54e43f2", size = 10192786, upload-time = "2025-07-24T20:49:59.443Z" },
+ { url = "https://files.pythonhosted.org/packages/80/23/8278f40282d10c3f258ec3ff1b103d4994bcad78b0cba9208317f6bb73da/numpy-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e6ecfeddfa83b02318f4d84acf15fbdbf9ded18e46989a15a8b6995dfbf85ab", size = 21047395, upload-time = "2025-07-24T20:45:58.821Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/2d/624f2ce4a5df52628b4ccd16a4f9437b37c35f4f8a50d00e962aae6efd7a/numpy-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:508b0eada3eded10a3b55725b40806a4b855961040180028f52580c4729916a2", size = 14300374, upload-time = "2025-07-24T20:46:20.207Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/62/ff1e512cdbb829b80a6bd08318a58698867bca0ca2499d101b4af063ee97/numpy-2.3.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:754d6755d9a7588bdc6ac47dc4ee97867271b17cee39cb87aef079574366db0a", size = 5228864, upload-time = "2025-07-24T20:46:30.58Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/8e/74bc18078fff03192d4032cfa99d5a5ca937807136d6f5790ce07ca53515/numpy-2.3.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f66e7d2b2d7712410d3bc5684149040ef5f19856f20277cd17ea83e5006286", size = 6737533, upload-time = "2025-07-24T20:46:46.111Z" },
+ { url = "https://files.pythonhosted.org/packages/19/ea/0731efe2c9073ccca5698ef6a8c3667c4cf4eea53fcdcd0b50140aba03bc/numpy-2.3.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de6ea4e5a65d5a90c7d286ddff2b87f3f4ad61faa3db8dabe936b34c2275b6f8", size = 14352007, upload-time = "2025-07-24T20:47:07.1Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/90/36be0865f16dfed20f4bc7f75235b963d5939707d4b591f086777412ff7b/numpy-2.3.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3ef07ec8cbc8fc9e369c8dcd52019510c12da4de81367d8b20bc692aa07573a", size = 16701914, upload-time = "2025-07-24T20:47:32.459Z" },
+ { url = "https://files.pythonhosted.org/packages/94/30/06cd055e24cb6c38e5989a9e747042b4e723535758e6153f11afea88c01b/numpy-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:27c9f90e7481275c7800dc9c24b7cc40ace3fdb970ae4d21eaff983a32f70c91", size = 16132708, upload-time = "2025-07-24T20:47:58.129Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/14/ecede608ea73e58267fd7cb78f42341b3b37ba576e778a1a06baffbe585c/numpy-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:07b62978075b67eee4065b166d000d457c82a1efe726cce608b9db9dd66a73a5", size = 18651678, upload-time = "2025-07-24T20:48:25.402Z" },
+ { url = "https://files.pythonhosted.org/packages/40/f3/2fe6066b8d07c3685509bc24d56386534c008b462a488b7f503ba82b8923/numpy-2.3.2-cp313-cp313t-win32.whl", hash = "sha256:c771cfac34a4f2c0de8e8c97312d07d64fd8f8ed45bc9f5726a7e947270152b5", size = 6441832, upload-time = "2025-07-24T20:48:37.181Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/ba/0937d66d05204d8f28630c9c60bc3eda68824abde4cf756c4d6aad03b0c6/numpy-2.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:72dbebb2dcc8305c431b2836bcc66af967df91be793d63a24e3d9b741374c450", size = 12927049, upload-time = "2025-07-24T20:48:56.24Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/ed/13542dd59c104d5e654dfa2ac282c199ba64846a74c2c4bcdbc3a0f75df1/numpy-2.3.2-cp313-cp313t-win_arm64.whl", hash = "sha256:72c6df2267e926a6d5286b0a6d556ebe49eae261062059317837fda12ddf0c1a", size = 10262935, upload-time = "2025-07-24T20:49:13.136Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/7c/7659048aaf498f7611b783e000c7268fcc4dcf0ce21cd10aad7b2e8f9591/numpy-2.3.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:448a66d052d0cf14ce9865d159bfc403282c9bc7bb2a31b03cc18b651eca8b1a", size = 20950906, upload-time = "2025-07-24T20:50:30.346Z" },
+ { url = "https://files.pythonhosted.org/packages/80/db/984bea9d4ddf7112a04cfdfb22b1050af5757864cfffe8e09e44b7f11a10/numpy-2.3.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:546aaf78e81b4081b2eba1d105c3b34064783027a06b3ab20b6eba21fb64132b", size = 14185607, upload-time = "2025-07-24T20:50:51.923Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/76/b3d6f414f4eca568f469ac112a3b510938d892bc5a6c190cb883af080b77/numpy-2.3.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:87c930d52f45df092f7578889711a0768094debf73cfcde105e2d66954358125", size = 5114110, upload-time = "2025-07-24T20:51:01.041Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/d2/6f5e6826abd6bca52392ed88fe44a4b52aacb60567ac3bc86c67834c3a56/numpy-2.3.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:8dc082ea901a62edb8f59713c6a7e28a85daddcb67454c839de57656478f5b19", size = 6642050, upload-time = "2025-07-24T20:51:11.64Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/43/f12b2ade99199e39c73ad182f103f9d9791f48d885c600c8e05927865baf/numpy-2.3.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:af58de8745f7fa9ca1c0c7c943616c6fe28e75d0c81f5c295810e3c83b5be92f", size = 14296292, upload-time = "2025-07-24T20:51:33.488Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/f9/77c07d94bf110a916b17210fac38680ed8734c236bfed9982fd8524a7b47/numpy-2.3.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed5527c4cf10f16c6d0b6bee1f89958bccb0ad2522c8cadc2efd318bcd545f5", size = 16638913, upload-time = "2025-07-24T20:51:58.517Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/d1/9d9f2c8ea399cc05cfff8a7437453bd4e7d894373a93cdc46361bbb49a7d/numpy-2.3.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:095737ed986e00393ec18ec0b21b47c22889ae4b0cd2d5e88342e08b01141f58", size = 16071180, upload-time = "2025-07-24T20:52:22.827Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/41/82e2c68aff2a0c9bf315e47d61951099fed65d8cb2c8d9dc388cb87e947e/numpy-2.3.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5e40e80299607f597e1a8a247ff8d71d79c5b52baa11cc1cce30aa92d2da6e0", size = 18576809, upload-time = "2025-07-24T20:52:51.015Z" },
+ { url = "https://files.pythonhosted.org/packages/14/14/4b4fd3efb0837ed252d0f583c5c35a75121038a8c4e065f2c259be06d2d8/numpy-2.3.2-cp314-cp314-win32.whl", hash = "sha256:7d6e390423cc1f76e1b8108c9b6889d20a7a1f59d9a60cac4a050fa734d6c1e2", size = 6366410, upload-time = "2025-07-24T20:56:44.949Z" },
+ { url = "https://files.pythonhosted.org/packages/11/9e/b4c24a6b8467b61aced5c8dc7dcfce23621baa2e17f661edb2444a418040/numpy-2.3.2-cp314-cp314-win_amd64.whl", hash = "sha256:b9d0878b21e3918d76d2209c924ebb272340da1fb51abc00f986c258cd5e957b", size = 12918821, upload-time = "2025-07-24T20:57:06.479Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/0f/0dc44007c70b1007c1cef86b06986a3812dd7106d8f946c09cfa75782556/numpy-2.3.2-cp314-cp314-win_arm64.whl", hash = "sha256:2738534837c6a1d0c39340a190177d7d66fdf432894f469728da901f8f6dc910", size = 10477303, upload-time = "2025-07-24T20:57:22.879Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/3e/075752b79140b78ddfc9c0a1634d234cfdbc6f9bbbfa6b7504e445ad7d19/numpy-2.3.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:4d002ecf7c9b53240be3bb69d80f86ddbd34078bae04d87be81c1f58466f264e", size = 21047524, upload-time = "2025-07-24T20:53:22.086Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/6d/60e8247564a72426570d0e0ea1151b95ce5bd2f1597bb878a18d32aec855/numpy-2.3.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:293b2192c6bcce487dbc6326de5853787f870aeb6c43f8f9c6496db5b1781e45", size = 14300519, upload-time = "2025-07-24T20:53:44.053Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/73/d8326c442cd428d47a067070c3ac6cc3b651a6e53613a1668342a12d4479/numpy-2.3.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0a4f2021a6da53a0d580d6ef5db29947025ae8b35b3250141805ea9a32bbe86b", size = 5228972, upload-time = "2025-07-24T20:53:53.81Z" },
+ { url = "https://files.pythonhosted.org/packages/34/2e/e71b2d6dad075271e7079db776196829019b90ce3ece5c69639e4f6fdc44/numpy-2.3.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9c144440db4bf3bb6372d2c3e49834cc0ff7bb4c24975ab33e01199e645416f2", size = 6737439, upload-time = "2025-07-24T20:54:04.742Z" },
+ { url = "https://files.pythonhosted.org/packages/15/b0/d004bcd56c2c5e0500ffc65385eb6d569ffd3363cb5e593ae742749b2daa/numpy-2.3.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f92d6c2a8535dc4fe4419562294ff957f83a16ebdec66df0805e473ffaad8bd0", size = 14352479, upload-time = "2025-07-24T20:54:25.819Z" },
+ { url = "https://files.pythonhosted.org/packages/11/e3/285142fcff8721e0c99b51686426165059874c150ea9ab898e12a492e291/numpy-2.3.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cefc2219baa48e468e3db7e706305fcd0c095534a192a08f31e98d83a7d45fb0", size = 16702805, upload-time = "2025-07-24T20:54:50.814Z" },
+ { url = "https://files.pythonhosted.org/packages/33/c3/33b56b0e47e604af2c7cd065edca892d180f5899599b76830652875249a3/numpy-2.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:76c3e9501ceb50b2ff3824c3589d5d1ab4ac857b0ee3f8f49629d0de55ecf7c2", size = 16133830, upload-time = "2025-07-24T20:55:17.306Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/ae/7b1476a1f4d6a48bc669b8deb09939c56dd2a439db1ab03017844374fb67/numpy-2.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:122bf5ed9a0221b3419672493878ba4967121514b1d7d4656a7580cd11dddcbf", size = 18652665, upload-time = "2025-07-24T20:55:46.665Z" },
+ { url = "https://files.pythonhosted.org/packages/14/ba/5b5c9978c4bb161034148ade2de9db44ec316fab89ce8c400db0e0c81f86/numpy-2.3.2-cp314-cp314t-win32.whl", hash = "sha256:6f1ae3dcb840edccc45af496f312528c15b1f79ac318169d094e85e4bb35fdf1", size = 6514777, upload-time = "2025-07-24T20:55:57.66Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/46/3dbaf0ae7c17cdc46b9f662c56da2054887b8d9e737c1476f335c83d33db/numpy-2.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:087ffc25890d89a43536f75c5fe8770922008758e8eeeef61733957041ed2f9b", size = 13111856, upload-time = "2025-07-24T20:56:17.318Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/9e/1652778bce745a67b5fe05adde60ed362d38eb17d919a540e813d30f6874/numpy-2.3.2-cp314-cp314t-win_arm64.whl", hash = "sha256:092aeb3449833ea9c0bf0089d70c29ae480685dd2377ec9cdbbb620257f84631", size = 10544226, upload-time = "2025-07-24T20:56:34.509Z" },
]
[[package]]
name = "onepassword-sdk"
-version = "0.1.5"
+version = "0.3.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pydantic" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/1b/9f/bcf8694a07c2017d75b7749c80b8d238b987d97fa85f25a3fe934ea2c77d/onepassword_sdk-0.1.5.tar.gz", hash = "sha256:ac88fb75b397c231c594d87d21cdf8e55898e160a59d7e381499a38ccfe4e254", size = 24380119 }
+sdist = { url = "https://files.pythonhosted.org/packages/04/2c/c1b2ea64cc3ccde4de0dbc52bdff1e08f90798df207b9ed0a24bc0995608/onepassword_sdk-0.3.1.tar.gz", hash = "sha256:ddc6ecd7c7b33fbafe1673196605f309b4b2dfee5a6d2e137a4d18860eb07c3b", size = 29160996, upload-time = "2025-06-11T17:25:20.729Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/3f/3f/9cfa1da1b629562ce228a61666be73389d3dd15c0b99851e92b0351b070c/onepassword_sdk-0.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71773cf44db431695a821c797d76adde72c082bafc784efa7e4688fdc1e4912b", size = 5092157 },
- { url = "https://files.pythonhosted.org/packages/08/10/f2e87cc24f4132299f7ce0c2289b62643c983f90091cf6c9540bfa9c0bfe/onepassword_sdk-0.1.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:74a3c7458e7adcf344f5c1e9f3f4adb495086cc92f184cb210a574551b57c79b", size = 4663964 },
- { url = "https://files.pythonhosted.org/packages/78/22/516060f3a9aca475a44c0a73a5b0ea5e906df35bb67fc3f081805ea35d04/onepassword_sdk-0.1.5-cp312-cp312-manylinux_2_32_aarch64.whl", hash = "sha256:b3fbd9e2c2caecc29982ed8a91a134d77ff7abdf2dcc37e11c06f5d73bb09a58", size = 5039174 },
- { url = "https://files.pythonhosted.org/packages/fc/43/c589a9fa1a20c01e41a1f57742a55105d5c902e1c4272df7acb0835aeca1/onepassword_sdk-0.1.5-cp312-cp312-manylinux_2_32_x86_64.whl", hash = "sha256:500bc314e52cb303acd265709bb72b5730a75c75bc5a8099a232edd690a8d701", size = 5315791 },
- { url = "https://files.pythonhosted.org/packages/db/12/580979d47b315ad06de31fb757f6fe3d0de1386702852f1617f851f5178a/onepassword_sdk-0.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:6af9bea09989e59958284fd333395a1867d759235bdebb833dcfe73f721d0dab", size = 4475912 },
- { url = "https://files.pythonhosted.org/packages/91/9e/6842be66ce047ed9a8d3eb9b9f5e12961fe66d20d9f73b1c38b3a637cf62/onepassword_sdk-0.1.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9c8cf43979cd4cd4ab45ac35027099d4a59498e0d869180a6807506bbe5ea81", size = 5092156 },
- { url = "https://files.pythonhosted.org/packages/1f/79/dc7123950d51eedbbf3c52b870fdd26c46dc673a6a49f24632e0cc3691f5/onepassword_sdk-0.1.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e367be8587bc0f54967d1e1acc216edd497c3421e07e9168e66f3160086c1eb4", size = 4663966 },
- { url = "https://files.pythonhosted.org/packages/10/a4/312c2c0ef196de8b8beaa4e434928647175d57cac6a83f0169305a6f1f3b/onepassword_sdk-0.1.5-cp313-cp313-manylinux_2_32_aarch64.whl", hash = "sha256:bd9c0ba73eec1748435b9992ca593c6367c639078324fb2b36243f9a2636be1b", size = 5039175 },
- { url = "https://files.pythonhosted.org/packages/f2/29/539fd8897a3d25c50d6cbe5f3b7a4879e61459654d9e109ca8fc0e55d03f/onepassword_sdk-0.1.5-cp313-cp313-manylinux_2_32_x86_64.whl", hash = "sha256:5667f25609ac8c2337b8f5144e6115520aff30aaaa0e95889bcb9e7aa0c9c6cb", size = 5315790 },
- { url = "https://files.pythonhosted.org/packages/06/31/67e0ccce1ea8f58c26eb7527ea2065dfe07af74eec82019c2b56e01ea1bd/onepassword_sdk-0.1.5-cp313-cp313-win_amd64.whl", hash = "sha256:deb761be96e49b11f636a540bfe16509003acfeb1e5cc75669b02ba0e087069e", size = 4475912 },
+ { url = "https://files.pythonhosted.org/packages/51/ca/a0d526f93446d3c301ed793a7b504604a3847c038fb2e189687e49e40a92/onepassword_sdk-0.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d57cb37d7a49f140e99892542de8f7e027602ff35ebdc45a74d9d15b671056e4", size = 6035549, upload-time = "2025-06-11T17:23:54.504Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/ab/611b565492985f02f073970c5737653439da1a98c9fc26e6a21dec598477/onepassword_sdk-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9611ca7f831bce0e8d7280551a289cbc326e5041537c713b985bef2d5cdc324d", size = 5518637, upload-time = "2025-06-11T17:23:57.993Z" },
+ { url = "https://files.pythonhosted.org/packages/23/a6/00c3a2b5a6c6637aa4959b01f77399b714e394b50e8c14fa0a0e766233a1/onepassword_sdk-0.3.1-cp312-cp312-manylinux_2_32_aarch64.whl", hash = "sha256:8368b9325fe835f0bfbee4e084486ee39185349ea5e2ec712d9531d56d5b74ef", size = 6012083, upload-time = "2025-06-11T17:24:01.591Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/eb/39b92ba242d32aee3e7705db831e1691713a9a87c6dc32d2bda3682c4ff7/onepassword_sdk-0.3.1-cp312-cp312-manylinux_2_32_x86_64.whl", hash = "sha256:cb69b84ee6d23a2ce83648a94dce499dfac96941ad4bed7801ca69857608877d", size = 6351723, upload-time = "2025-06-11T17:24:06.435Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/02/3063b562aae6a1972a0a8938fe4fc464631419847a409589667dd3cbf6ba/onepassword_sdk-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:b4e6a035af990d172da24fb65146f91b46c61f4216f67392c4595c4de23f48b5", size = 5506879, upload-time = "2025-06-11T17:24:11.184Z" },
+ { url = "https://files.pythonhosted.org/packages/24/7a/a7e67af03afdf431882a696d522dff6ee6b43f91ff5d806f8deb557bcc4a/onepassword_sdk-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6d6d5182734ca711fb15e0b652fd0609ca57f7175d2a21aa5e5e8b182b3b67ce", size = 6035551, upload-time = "2025-06-11T17:24:15.299Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/a6/4bd09f0ccbaa2436799f647ae30602bb70b5a9c81399c048f9af1de20d61/onepassword_sdk-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bce94596cdd3f1d5258ced1fe99076361b3807dde110263a3c3350824a99bd46", size = 5518634, upload-time = "2025-06-11T17:24:19.599Z" },
+ { url = "https://files.pythonhosted.org/packages/95/45/ebe066360aac1bcbbf8e37a7ff3d73e4dc882d3de249e8ebfd6892c389b3/onepassword_sdk-0.3.1-cp313-cp313-manylinux_2_32_aarch64.whl", hash = "sha256:39f0adea83d8659d64a00be9c744053c215660eda14838de82040f2eb800216e", size = 6012081, upload-time = "2025-06-11T17:24:23.921Z" },
+ { url = "https://files.pythonhosted.org/packages/63/b2/e8acb8bd5e3599b4204f3a9b11171c1f9ce503dfa46405c4f689d9f2021a/onepassword_sdk-0.3.1-cp313-cp313-manylinux_2_32_x86_64.whl", hash = "sha256:38a4f337a1d6f9357ed97a2ceb4b712607be4b5d6278daabb5cdba46bb948b44", size = 6351723, upload-time = "2025-06-11T17:24:29.546Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/1d/91becb8fa0e417c172a5721c06dc403ad2abbbc766e9a8bdeff46bdea6ba/onepassword_sdk-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:4a77fa3fdbad03738faf2703387256f53c2c86329bcd9f19ee5725a2075db77b", size = 5506878, upload-time = "2025-06-11T17:24:33.339Z" },
]
[[package]]
@@ -1145,32 +1292,32 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "attrs" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/98/df/77698abfac98571e65ffeb0c1fba8ffd692ab8458d617a0eed7d9a8d38f2/outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", size = 21060 }
+sdist = { url = "https://files.pythonhosted.org/packages/98/df/77698abfac98571e65ffeb0c1fba8ffd692ab8458d617a0eed7d9a8d38f2/outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", size = 21060, upload-time = "2023-10-26T04:26:04.361Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b", size = 10692 },
+ { url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b", size = 10692, upload-time = "2023-10-26T04:26:02.532Z" },
]
[[package]]
name = "overrides"
version = "7.7.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812 }
+sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812, upload-time = "2024-01-27T21:01:33.423Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832 },
+ { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832, upload-time = "2024-01-27T21:01:31.393Z" },
]
[[package]]
name = "packaging"
-version = "24.2"
+version = "25.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
+sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
+ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
]
[[package]]
name = "pandas"
-version = "2.2.3"
+version = "2.3.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "numpy" },
@@ -1178,46 +1325,46 @@ dependencies = [
{ name = "pytz" },
{ name = "tzdata" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 },
- { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 },
- { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 },
- { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 },
- { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 },
- { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 },
- { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 },
- { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 },
- { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 },
- { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 },
- { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 },
- { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 },
- { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 },
- { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 },
- { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 },
- { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 },
- { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 },
- { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 },
- { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 },
- { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 },
+sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493, upload-time = "2025-07-07T19:20:04.079Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/46/de/b8445e0f5d217a99fe0eeb2f4988070908979bec3587c0633e5428ab596c/pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", size = 11588172, upload-time = "2025-07-07T19:18:52.054Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/e0/801cdb3564e65a5ac041ab99ea6f1d802a6c325bb6e58c79c06a3f1cd010/pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", size = 10717365, upload-time = "2025-07-07T19:18:54.785Z" },
+ { url = "https://files.pythonhosted.org/packages/51/a5/c76a8311833c24ae61a376dbf360eb1b1c9247a5d9c1e8b356563b31b80c/pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", size = 11280411, upload-time = "2025-07-07T19:18:57.045Z" },
+ { url = "https://files.pythonhosted.org/packages/da/01/e383018feba0a1ead6cf5fe8728e5d767fee02f06a3d800e82c489e5daaf/pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", size = 11988013, upload-time = "2025-07-07T19:18:59.771Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/14/cec7760d7c9507f11c97d64f29022e12a6cc4fc03ac694535e89f88ad2ec/pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", size = 12767210, upload-time = "2025-07-07T19:19:02.944Z" },
+ { url = "https://files.pythonhosted.org/packages/50/b9/6e2d2c6728ed29fb3d4d4d302504fb66f1a543e37eb2e43f352a86365cdf/pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", size = 13440571, upload-time = "2025-07-07T19:19:06.82Z" },
+ { url = "https://files.pythonhosted.org/packages/80/a5/3a92893e7399a691bad7664d977cb5e7c81cf666c81f89ea76ba2bff483d/pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", size = 10987601, upload-time = "2025-07-07T19:19:09.589Z" },
+ { url = "https://files.pythonhosted.org/packages/32/ed/ff0a67a2c5505e1854e6715586ac6693dd860fbf52ef9f81edee200266e7/pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", size = 11531393, upload-time = "2025-07-07T19:19:12.245Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/db/d8f24a7cc9fb0972adab0cc80b6817e8bef888cfd0024eeb5a21c0bb5c4a/pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", size = 10668750, upload-time = "2025-07-07T19:19:14.612Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/b0/80f6ec783313f1e2356b28b4fd8d2148c378370045da918c73145e6aab50/pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", size = 11342004, upload-time = "2025-07-07T19:19:16.857Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/e2/20a317688435470872885e7fc8f95109ae9683dec7c50be29b56911515a5/pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", size = 12050869, upload-time = "2025-07-07T19:19:19.265Z" },
+ { url = "https://files.pythonhosted.org/packages/55/79/20d746b0a96c67203a5bee5fb4e00ac49c3e8009a39e1f78de264ecc5729/pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", size = 12750218, upload-time = "2025-07-07T19:19:21.547Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/0f/145c8b41e48dbf03dd18fdd7f24f8ba95b8254a97a3379048378f33e7838/pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", size = 13416763, upload-time = "2025-07-07T19:19:23.939Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/c0/54415af59db5cdd86a3d3bf79863e8cc3fa9ed265f0745254061ac09d5f2/pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", size = 10987482, upload-time = "2025-07-07T19:19:42.699Z" },
+ { url = "https://files.pythonhosted.org/packages/48/64/2fd2e400073a1230e13b8cd604c9bc95d9e3b962e5d44088ead2e8f0cfec/pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", size = 12029159, upload-time = "2025-07-07T19:19:26.362Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/0a/d84fd79b0293b7ef88c760d7dca69828d867c89b6d9bc52d6a27e4d87316/pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", size = 11393287, upload-time = "2025-07-07T19:19:29.157Z" },
+ { url = "https://files.pythonhosted.org/packages/50/ae/ff885d2b6e88f3c7520bb74ba319268b42f05d7e583b5dded9837da2723f/pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", size = 11309381, upload-time = "2025-07-07T19:19:31.436Z" },
+ { url = "https://files.pythonhosted.org/packages/85/86/1fa345fc17caf5d7780d2699985c03dbe186c68fee00b526813939062bb0/pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", size = 11883998, upload-time = "2025-07-07T19:19:34.267Z" },
+ { url = "https://files.pythonhosted.org/packages/81/aa/e58541a49b5e6310d89474333e994ee57fea97c8aaa8fc7f00b873059bbf/pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", size = 12704705, upload-time = "2025-07-07T19:19:36.856Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/f9/07086f5b0f2a19872554abeea7658200824f5835c58a106fa8f2ae96a46c/pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", size = 13189044, upload-time = "2025-07-07T19:19:39.999Z" },
]
[[package]]
name = "pandocfilters"
version = "1.5.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454 }
+sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663 },
+ { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" },
]
[[package]]
name = "parso"
version = "0.8.4"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 }
+sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload-time = "2024-04-05T09:43:55.897Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 },
+ { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload-time = "2024-04-05T09:43:53.299Z" },
]
[[package]]
@@ -1227,50 +1374,59 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "ptyprocess" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 }
+sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 },
+ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" },
]
[[package]]
name = "phonenumbers"
-version = "8.13.52"
+version = "9.0.10"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/2f/be/8d1698beaed180df58685a3d0e1aacac86a7b90e74a954ca489bd2a0a247/phonenumbers-8.13.52.tar.gz", hash = "sha256:fdc371ea6a4da052beb1225de63963d5a2fddbbff2bb53e3a957f360e0185f80", size = 2296342 }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/b3/0092ef7813f663a06cc0474adfaee5e9c327a2fde416a7926d958fd6cd8a/phonenumbers-9.0.10.tar.gz", hash = "sha256:c2d15a6a9d0534b14a7764f51246ada99563e263f65b80b0251d1a760ac4a1ba", size = 2297752, upload-time = "2025-07-18T08:47:39.477Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b0/fa/ccc322224bbe27434f67d8fae917affcf6af4a6ef55f82f16ae87d9c784d/phonenumbers-8.13.52-py2.py3-none-any.whl", hash = "sha256:e803210038ece9d208b129e3023dc20e656a820d6bf6f1cb0471d4164f54bada", size = 2582018 },
+ { url = "https://files.pythonhosted.org/packages/93/44/4a200f2e06f6ece2de33ff09978cdccc03e2df8007fadcc706f846167dec/phonenumbers-9.0.10-py2.py3-none-any.whl", hash = "sha256:13b12d269be1f2b363c9bc2868656a7e2e8b50f1a1cef629c75005da6c374c6b", size = 2583494, upload-time = "2025-07-18T08:47:35.808Z" },
]
[[package]]
name = "platformdirs"
-version = "4.3.6"
+version = "4.3.8"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 },
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
]
[[package]]
name = "polars"
-version = "1.19.0"
+version = "1.32.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/26/d9/66ada2204483c4c4d83898ade77eacd5fbef26ae4975a0d7d5de134ca46a/polars-1.19.0.tar.gz", hash = "sha256:b52ada5c43fcdadf64f282522198c5549ee4e46ea57d236a4d7e572643070d9d", size = 4267947 }
+sdist = { url = "https://files.pythonhosted.org/packages/67/23/6a5f151981f3ac409bed6dc48a3eaecd0592a03eb382693d4c7e749eda8b/polars-1.32.0.tar.gz", hash = "sha256:b01045981c0f23eeccfbfc870b782f93e73b74b29212fdfc8aae0be9024bc1fb", size = 4761045, upload-time = "2025-08-01T01:43:22.413Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/c0/7d/e8645281281d44d96752443366ceef2df76c9c1e17dce040111abb6a4a12/polars-1.19.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:51c01837268a1aa41785e60ed7d3363d4b52f652ab0eef4981f887bdfa2e9ca7", size = 29472039 },
- { url = "https://files.pythonhosted.org/packages/d7/fb/7e5054598d6bb7a47e4ca086797bae61270f7d570350cf779dd97384d913/polars-1.19.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:20f8235e810f6ee795d7a215a3560945e6a1b57d017f87ba0c8542dced1fc665", size = 26150541 },
- { url = "https://files.pythonhosted.org/packages/ba/ba/6d715730c28b035abd308fc2cf0fcbae0cedea6216797e83ce4a9a96c6d4/polars-1.19.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be0ea51f7b3553652bf0d53f3b925e969a898d4feb9980acecf8e3037d696903", size = 32751173 },
- { url = "https://files.pythonhosted.org/packages/ea/9a/bee8ab37ab82b8eea75170afa3b37ea7e1df74e4c4da8f6c93b3009977fd/polars-1.19.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:30305ef4e1b634c67a5d985832296fade9908482c5b1abb0100800808b2d090e", size = 29704437 },
- { url = "https://files.pythonhosted.org/packages/57/ec/74afa5699e37e03e3acc7f241f4e2c3e8c91847524005424d9cf038b3034/polars-1.19.0-cp39-abi3-win_amd64.whl", hash = "sha256:de4aa45e24f8f94a1da9cc6031a7db6fa65ac7de8246fac0bc581ebb427d0643", size = 32846039 },
- { url = "https://files.pythonhosted.org/packages/cf/5b/c6f6c70ddc9d3070dee65f4640437cb84ccb4cca04f7a81b01db15329ae3/polars-1.19.0-cp39-abi3-win_arm64.whl", hash = "sha256:d7ca7aeb63fa22c0a00f6cfa95dd5252c249e83dd4d1b954583a59f97a8e407b", size = 29029208 },
+ { url = "https://files.pythonhosted.org/packages/e2/40/5b27067d10b5a77ab4094932118e16629ffb20ea9ae5f7d1178e04087891/polars-1.32.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:94f7c6a3b30bc99bc6b682ea42bb1ae983e33a302ca21aacbac50ae19e34fcf2", size = 37479518, upload-time = "2025-08-01T01:42:18.603Z" },
+ { url = "https://files.pythonhosted.org/packages/08/b7/ca28ac10d340fb91bffb2751efd52aebc9799ae161b867214c6299c8f75b/polars-1.32.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:8bf14c16164839e62c741a863942a94a9a463db21e797452fca996c8afaf8827", size = 34214196, upload-time = "2025-08-01T01:42:22.667Z" },
+ { url = "https://files.pythonhosted.org/packages/61/97/fe3797e8e1d4f9eadab32ffe218a841b8874585b6c9bd0f1a26469fb2992/polars-1.32.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4c15adb97d44766d30c759f5cebbdb64d361e8349ef10b5afc7413f71bf4b72", size = 37985353, upload-time = "2025-08-01T01:42:26.033Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/7e/2baa2858556e970cc6a35c0d8ad34b2f9d982f1766c0a1fec20ca529a947/polars-1.32.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:13af55890734f89b76016a395fb2e7460e7d9feecf50ed2f55cf0f05a1c0c991", size = 35183912, upload-time = "2025-08-01T01:42:30.446Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/41/0e6821dccc5871186a9b95af3990404aa283318263918d33ac974b35cb37/polars-1.32.0-cp39-abi3-win_amd64.whl", hash = "sha256:0397fc2501a5d5f1bb3fe8d27e0c26c7a5349b4110157c0fb7833cd3f5921c9e", size = 37747905, upload-time = "2025-08-01T01:42:33.975Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/93/d06df0817da93f922a67e27e9e0f407856991374daa62687e2a45a18935c/polars-1.32.0-cp39-abi3-win_arm64.whl", hash = "sha256:dd84e24422509e1ec9be46f67f758d0bd9944d1ae4eacecee4f53adaa8ecd822", size = 33978543, upload-time = "2025-08-01T01:42:36.779Z" },
]
[[package]]
name = "probableparsing"
version = "0.0.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/8b/26/5a86ac418ee4cecb127a4a6f98d6b202216b5ac4f6b519328ae81d07ba9e/probableparsing-0.0.1.tar.gz", hash = "sha256:8114bbf889e1f9456fe35946454c96e42a6ee2673a90d4f1f9c46a406f543767", size = 1722 }
+sdist = { url = "https://files.pythonhosted.org/packages/8b/26/5a86ac418ee4cecb127a4a6f98d6b202216b5ac4f6b519328ae81d07ba9e/probableparsing-0.0.1.tar.gz", hash = "sha256:8114bbf889e1f9456fe35946454c96e42a6ee2673a90d4f1f9c46a406f543767", size = 1722, upload-time = "2016-03-28T23:39:54.972Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/e1/6b/91255cbf739a835df41af530a36798397d70342d152b773b5b0fe3001843/probableparsing-0.0.1-py2.py3-none-any.whl", hash = "sha256:509df25fdda4fd7c0b2a100f58cc971bd23daf26f3b3320aebf2616d2e10c69e", size = 3056 },
+ { url = "https://files.pythonhosted.org/packages/e1/6b/91255cbf739a835df41af530a36798397d70342d152b773b5b0fe3001843/probableparsing-0.0.1-py2.py3-none-any.whl", hash = "sha256:509df25fdda4fd7c0b2a100f58cc971bd23daf26f3b3320aebf2616d2e10c69e", size = 3056, upload-time = "2016-12-19T15:04:32.102Z" },
]
[[package]]
@@ -1282,195 +1438,276 @@ dependencies = [
{ name = "probableparsing" },
{ name = "python-crfsuite" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/a5/fd/bcd6ca7c4044b5705a316b98235537ffcd175075d4e0cd90a5440ce16ff2/probablepeople-0.5.6.tar.gz", hash = "sha256:4ae95e77f9fa7dceb116538500ab48c81a91bf68eb652d45207b794b450f4392", size = 571747 }
+sdist = { url = "https://files.pythonhosted.org/packages/a5/fd/bcd6ca7c4044b5705a316b98235537ffcd175075d4e0cd90a5440ce16ff2/probablepeople-0.5.6.tar.gz", hash = "sha256:4ae95e77f9fa7dceb116538500ab48c81a91bf68eb652d45207b794b450f4392", size = 571747, upload-time = "2024-10-29T15:23:34.736Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a4/b9/c5a6b83cad7f0e92f1c827007eaef528b02f3b95cf7e959b6315c4ac1540/probablepeople-0.5.6-py3-none-any.whl", hash = "sha256:1900ba5575669dd5a0b554a0d1cb66aa1ec2ab076c94a514519a2e42954bbcfc", size = 905483 },
+ { url = "https://files.pythonhosted.org/packages/a4/b9/c5a6b83cad7f0e92f1c827007eaef528b02f3b95cf7e959b6315c4ac1540/probablepeople-0.5.6-py3-none-any.whl", hash = "sha256:1900ba5575669dd5a0b554a0d1cb66aa1ec2ab076c94a514519a2e42954bbcfc", size = 905483, upload-time = "2024-10-29T15:23:33.092Z" },
]
[[package]]
name = "prometheus-client"
-version = "0.21.1"
+version = "0.22.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/62/14/7d0f567991f3a9af8d1cd4f619040c93b68f09a02b6d0b6ab1b2d1ded5fe/prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", size = 78551 }
+sdist = { url = "https://files.pythonhosted.org/packages/5e/cf/40dde0a2be27cc1eb41e333d1a674a74ce8b8b0457269cc640fd42b07cf7/prometheus_client-0.22.1.tar.gz", hash = "sha256:190f1331e783cf21eb60bca559354e0a4d4378facecf78f5428c39b675d20d28", size = 69746, upload-time = "2025-06-02T14:29:01.152Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301", size = 54682 },
+ { url = "https://files.pythonhosted.org/packages/32/ae/ec06af4fe3ee72d16973474f122541746196aaa16cea6f66d18b963c6177/prometheus_client-0.22.1-py3-none-any.whl", hash = "sha256:cca895342e308174341b2cbf99a56bef291fbc0ef7b9e5412a0f26d653ba7094", size = 58694, upload-time = "2025-06-02T14:29:00.068Z" },
]
[[package]]
name = "prompt-toolkit"
-version = "3.0.48"
+version = "3.0.51"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "wcwidth" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/2d/4f/feb5e137aff82f7c7f3248267b97451da3644f6cdc218edfe549fb354127/prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90", size = 424684 }
+sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940, upload-time = "2025-04-15T09:18:47.731Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e", size = 386595 },
+ { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810, upload-time = "2025-04-15T09:18:44.753Z" },
]
[[package]]
name = "psutil"
-version = "6.1.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511 },
- { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985 },
- { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488 },
- { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477 },
- { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017 },
- { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602 },
- { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444 },
+version = "7.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload-time = "2025-02-13T21:54:07.946Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload-time = "2025-02-13T21:54:12.36Z" },
+ { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload-time = "2025-02-13T21:54:16.07Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload-time = "2025-02-13T21:54:18.662Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload-time = "2025-02-13T21:54:21.811Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload-time = "2025-02-13T21:54:24.68Z" },
+ { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload-time = "2025-02-13T21:54:34.31Z" },
+ { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload-time = "2025-02-13T21:54:37.486Z" },
+]
+
+[[package]]
+name = "psycopg2-binary"
+version = "2.9.10"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/cb/0e/bdc8274dc0585090b4e3432267d7be4dfbfd8971c0fa59167c711105a6bf/psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2", size = 385764, upload-time = "2024-10-16T11:24:58.126Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/7d/465cc9795cf76f6d329efdafca74693714556ea3891813701ac1fee87545/psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0", size = 3044771, upload-time = "2024-10-16T11:20:35.234Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/31/6d225b7b641a1a2148e3ed65e1aa74fc86ba3fee850545e27be9e1de893d/psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a", size = 3275336, upload-time = "2024-10-16T11:20:38.742Z" },
+ { url = "https://files.pythonhosted.org/packages/30/b7/a68c2b4bff1cbb1728e3ec864b2d92327c77ad52edcd27922535a8366f68/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539", size = 2851637, upload-time = "2024-10-16T11:20:42.145Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/b1/cfedc0e0e6f9ad61f8657fd173b2f831ce261c02a08c0b09c652b127d813/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526", size = 3082097, upload-time = "2024-10-16T11:20:46.185Z" },
+ { url = "https://files.pythonhosted.org/packages/18/ed/0a8e4153c9b769f59c02fb5e7914f20f0b2483a19dae7bf2db54b743d0d0/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1", size = 3264776, upload-time = "2024-10-16T11:20:50.879Z" },
+ { url = "https://files.pythonhosted.org/packages/10/db/d09da68c6a0cdab41566b74e0a6068a425f077169bed0946559b7348ebe9/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e", size = 3020968, upload-time = "2024-10-16T11:20:56.819Z" },
+ { url = "https://files.pythonhosted.org/packages/94/28/4d6f8c255f0dfffb410db2b3f9ac5218d959a66c715c34cac31081e19b95/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f", size = 2872334, upload-time = "2024-10-16T11:21:02.411Z" },
+ { url = "https://files.pythonhosted.org/packages/05/f7/20d7bf796593c4fea95e12119d6cc384ff1f6141a24fbb7df5a668d29d29/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00", size = 2822722, upload-time = "2024-10-16T11:21:09.01Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/e4/0c407ae919ef626dbdb32835a03b6737013c3cc7240169843965cada2bdf/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5", size = 2920132, upload-time = "2024-10-16T11:21:16.339Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/70/aa69c9f69cf09a01da224909ff6ce8b68faeef476f00f7ec377e8f03be70/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47", size = 2959312, upload-time = "2024-10-16T11:21:25.584Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/bd/213e59854fafe87ba47814bf413ace0dcee33a89c8c8c814faca6bc7cf3c/psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64", size = 1025191, upload-time = "2024-10-16T11:21:29.912Z" },
+ { url = "https://files.pythonhosted.org/packages/92/29/06261ea000e2dc1e22907dbbc483a1093665509ea586b29b8986a0e56733/psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0", size = 1164031, upload-time = "2024-10-16T11:21:34.211Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/30/d41d3ba765609c0763505d565c4d12d8f3c79793f0d0f044ff5a28bf395b/psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d", size = 3044699, upload-time = "2024-10-16T11:21:42.841Z" },
+ { url = "https://files.pythonhosted.org/packages/35/44/257ddadec7ef04536ba71af6bc6a75ec05c5343004a7ec93006bee66c0bc/psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb", size = 3275245, upload-time = "2024-10-16T11:21:51.989Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/11/48ea1cd11de67f9efd7262085588790a95d9dfcd9b8a687d46caf7305c1a/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7", size = 2851631, upload-time = "2024-10-16T11:21:57.584Z" },
+ { url = "https://files.pythonhosted.org/packages/62/e0/62ce5ee650e6c86719d621a761fe4bc846ab9eff8c1f12b1ed5741bf1c9b/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d", size = 3082140, upload-time = "2024-10-16T11:22:02.005Z" },
+ { url = "https://files.pythonhosted.org/packages/27/ce/63f946c098611f7be234c0dd7cb1ad68b0b5744d34f68062bb3c5aa510c8/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73", size = 3264762, upload-time = "2024-10-16T11:22:06.412Z" },
+ { url = "https://files.pythonhosted.org/packages/43/25/c603cd81402e69edf7daa59b1602bd41eb9859e2824b8c0855d748366ac9/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673", size = 3020967, upload-time = "2024-10-16T11:22:11.583Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/d6/8708d8c6fca531057fa170cdde8df870e8b6a9b136e82b361c65e42b841e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f", size = 2872326, upload-time = "2024-10-16T11:22:16.406Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/ac/5b1ea50fc08a9df82de7e1771537557f07c2632231bbab652c7e22597908/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909", size = 2822712, upload-time = "2024-10-16T11:22:21.366Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/fc/504d4503b2abc4570fac3ca56eb8fed5e437bf9c9ef13f36b6621db8ef00/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1", size = 2920155, upload-time = "2024-10-16T11:22:25.684Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/d1/323581e9273ad2c0dbd1902f3fb50c441da86e894b6e25a73c3fda32c57e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567", size = 2959356, upload-time = "2024-10-16T11:22:30.562Z" },
+ { url = "https://files.pythonhosted.org/packages/08/50/d13ea0a054189ae1bc21af1d85b6f8bb9bbc5572991055d70ad9006fe2d6/psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142", size = 2569224, upload-time = "2025-01-04T20:09:19.234Z" },
]
[[package]]
name = "ptyprocess"
version = "0.7.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 }
+sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 },
+ { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" },
]
[[package]]
name = "pure-eval"
version = "0.2.3"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 }
+sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 },
+ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" },
+]
+
+[[package]]
+name = "pyarrow"
+version = "21.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ef/c2/ea068b8f00905c06329a3dfcd40d0fcc2b7d0f2e355bdb25b65e0a0e4cd4/pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", size = 1133487, upload-time = "2025-07-18T00:57:31.761Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ca/d4/d4f817b21aacc30195cf6a46ba041dd1be827efa4a623cc8bf39a1c2a0c0/pyarrow-21.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3a302f0e0963db37e0a24a70c56cf91a4faa0bca51c23812279ca2e23481fccd", size = 31160305, upload-time = "2025-07-18T00:55:35.373Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/9c/dcd38ce6e4b4d9a19e1d36914cb8e2b1da4e6003dd075474c4cfcdfe0601/pyarrow-21.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b6b27cf01e243871390474a211a7922bfbe3bda21e39bc9160daf0da3fe48876", size = 32684264, upload-time = "2025-07-18T00:55:39.303Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/74/2a2d9f8d7a59b639523454bec12dba35ae3d0a07d8ab529dc0809f74b23c/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e72a8ec6b868e258a2cd2672d91f2860ad532d590ce94cdf7d5e7ec674ccf03d", size = 41108099, upload-time = "2025-07-18T00:55:42.889Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/90/2660332eeb31303c13b653ea566a9918484b6e4d6b9d2d46879a33ab0622/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b7ae0bbdc8c6674259b25bef5d2a1d6af5d39d7200c819cf99e07f7dfef1c51e", size = 42829529, upload-time = "2025-07-18T00:55:47.069Z" },
+ { url = "https://files.pythonhosted.org/packages/33/27/1a93a25c92717f6aa0fca06eb4700860577d016cd3ae51aad0e0488ac899/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:58c30a1729f82d201627c173d91bd431db88ea74dcaa3885855bc6203e433b82", size = 43367883, upload-time = "2025-07-18T00:55:53.069Z" },
+ { url = "https://files.pythonhosted.org/packages/05/d9/4d09d919f35d599bc05c6950095e358c3e15148ead26292dfca1fb659b0c/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:072116f65604b822a7f22945a7a6e581cfa28e3454fdcc6939d4ff6090126623", size = 45133802, upload-time = "2025-07-18T00:55:57.714Z" },
+ { url = "https://files.pythonhosted.org/packages/71/30/f3795b6e192c3ab881325ffe172e526499eb3780e306a15103a2764916a2/pyarrow-21.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf56ec8b0a5c8c9d7021d6fd754e688104f9ebebf1bf4449613c9531f5346a18", size = 26203175, upload-time = "2025-07-18T00:56:01.364Z" },
+ { url = "https://files.pythonhosted.org/packages/16/ca/c7eaa8e62db8fb37ce942b1ea0c6d7abfe3786ca193957afa25e71b81b66/pyarrow-21.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a", size = 31154306, upload-time = "2025-07-18T00:56:04.42Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/e8/e87d9e3b2489302b3a1aea709aaca4b781c5252fcb812a17ab6275a9a484/pyarrow-21.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe", size = 32680622, upload-time = "2025-07-18T00:56:07.505Z" },
+ { url = "https://files.pythonhosted.org/packages/84/52/79095d73a742aa0aba370c7942b1b655f598069489ab387fe47261a849e1/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd", size = 41104094, upload-time = "2025-07-18T00:56:10.994Z" },
+ { url = "https://files.pythonhosted.org/packages/89/4b/7782438b551dbb0468892a276b8c789b8bbdb25ea5c5eb27faadd753e037/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61", size = 42825576, upload-time = "2025-07-18T00:56:15.569Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/62/0f29de6e0a1e33518dec92c65be0351d32d7ca351e51ec5f4f837a9aab91/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d", size = 43368342, upload-time = "2025-07-18T00:56:19.531Z" },
+ { url = "https://files.pythonhosted.org/packages/90/c7/0fa1f3f29cf75f339768cc698c8ad4ddd2481c1742e9741459911c9ac477/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99", size = 45131218, upload-time = "2025-07-18T00:56:23.347Z" },
+ { url = "https://files.pythonhosted.org/packages/01/63/581f2076465e67b23bc5a37d4a2abff8362d389d29d8105832e82c9c811c/pyarrow-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636", size = 26087551, upload-time = "2025-07-18T00:56:26.758Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/ab/357d0d9648bb8241ee7348e564f2479d206ebe6e1c47ac5027c2e31ecd39/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da", size = 31290064, upload-time = "2025-07-18T00:56:30.214Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/8a/5685d62a990e4cac2043fc76b4661bf38d06efed55cf45a334b455bd2759/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7", size = 32727837, upload-time = "2025-07-18T00:56:33.935Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/de/c0828ee09525c2bafefd3e736a248ebe764d07d0fd762d4f0929dbc516c9/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6", size = 41014158, upload-time = "2025-07-18T00:56:37.528Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/26/a2865c420c50b7a3748320b614f3484bfcde8347b2639b2b903b21ce6a72/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8", size = 42667885, upload-time = "2025-07-18T00:56:41.483Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/f9/4ee798dc902533159250fb4321267730bc0a107d8c6889e07c3add4fe3a5/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503", size = 43276625, upload-time = "2025-07-18T00:56:48.002Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/da/e02544d6997037a4b0d22d8e5f66bc9315c3671371a8b18c79ade1cefe14/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79", size = 44951890, upload-time = "2025-07-18T00:56:52.568Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/4e/519c1bc1876625fe6b71e9a28287c43ec2f20f73c658b9ae1d485c0c206e/pyarrow-21.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10", size = 26371006, upload-time = "2025-07-18T00:56:56.379Z" },
]
[[package]]
name = "pycparser"
version = "2.22"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 }
+sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload-time = "2024-03-30T13:22:22.564Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 },
+ { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload-time = "2024-03-30T13:22:20.476Z" },
]
[[package]]
name = "pydantic"
-version = "2.10.4"
+version = "2.11.7"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "annotated-types" },
{ name = "pydantic-core" },
{ name = "typing-extensions" },
+ { name = "typing-inspection" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/70/7e/fb60e6fee04d0ef8f15e4e01ff187a196fa976eb0f0ab524af4599e5754c/pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06", size = 762094 }
+sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload-time = "2025-06-14T08:33:17.137Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f3/26/3e1bbe954fde7ee22a6e7d31582c642aad9e84ffe4b5fb61e63b87cd326f/pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d", size = 431765 },
+ { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload-time = "2025-06-14T08:33:14.905Z" },
]
[[package]]
name = "pydantic-core"
-version = "2.27.2"
+version = "2.33.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 },
- { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 },
- { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 },
- { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 },
- { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 },
- { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 },
- { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 },
- { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 },
- { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 },
- { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 },
- { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 },
- { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 },
- { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 },
- { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 },
- { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 },
- { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 },
- { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 },
- { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 },
- { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 },
- { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 },
- { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 },
- { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 },
- { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 },
- { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 },
- { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 },
- { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 },
- { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 },
- { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 },
+sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" },
+ { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" },
+ { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" },
+ { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" },
+ { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" },
+ { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" },
+ { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" },
+ { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" },
+ { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" },
+ { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" },
]
[[package]]
name = "pydantic-extra-types"
-version = "2.10.1"
+version = "2.10.5"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pydantic" },
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/c3/12/844a4796dbbc814ef0a706f403cb0f3029bf324c2bca2bf0681f4f7d8618/pydantic_extra_types-2.10.1.tar.gz", hash = "sha256:e4f937af34a754b8f1fa228a2fac867091a51f56ed0e8a61d5b3a6719b13c923", size = 85694 }
+sdist = { url = "https://files.pythonhosted.org/packages/7e/ba/4178111ec4116c54e1dc7ecd2a1ff8f54256cdbd250e576882911e8f710a/pydantic_extra_types-2.10.5.tar.gz", hash = "sha256:1dcfa2c0cf741a422f088e0dbb4690e7bfadaaf050da3d6f80d6c3cf58a2bad8", size = 138429, upload-time = "2025-06-02T09:31:52.713Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a8/f1/92f7b4711d3d0d08981c2677ec9cdde6cb114205a69814bf803e0be5ae9b/pydantic_extra_types-2.10.1-py3-none-any.whl", hash = "sha256:db2c86c04a837bbac0d2d79bbd6f5d46c4c9253db11ca3fdd36a2b282575f1e2", size = 35155 },
+ { url = "https://files.pythonhosted.org/packages/70/1a/5f4fd9e7285f10c44095a4f9fe17d0f358d1702a7c74a9278c794e8a7537/pydantic_extra_types-2.10.5-py3-none-any.whl", hash = "sha256:b60c4e23d573a69a4f1a16dd92888ecc0ef34fb0e655b4f305530377fa70e7a8", size = 38315, upload-time = "2025-06-02T09:31:51.229Z" },
]
[[package]]
name = "pydantic-settings"
-version = "2.7.0"
+version = "2.10.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pydantic" },
{ name = "python-dotenv" },
+ { name = "typing-inspection" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/86/41/19b62b99e7530cfa1d6ccd16199afd9289a12929bef1a03aa4382b22e683/pydantic_settings-2.7.0.tar.gz", hash = "sha256:ac4bfd4a36831a48dbf8b2d9325425b549a0a6f18cea118436d728eb4f1c4d66", size = 79743 }
+sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583, upload-time = "2025-06-24T13:26:46.841Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f9/00/57b4540deb5c3a39ba689bb519a4e03124b24ab8589e618be4aac2c769bd/pydantic_settings-2.7.0-py3-none-any.whl", hash = "sha256:e00c05d5fa6cbbb227c84bd7487c5c1065084119b750df7c8c1a554aed236eb5", size = 29549 },
+ { url = "https://files.pythonhosted.org/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796", size = 45235, upload-time = "2025-06-24T13:26:45.485Z" },
]
[[package]]
name = "pygments"
-version = "2.18.0"
+version = "2.19.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905 }
+sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 },
+ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
]
[[package]]
name = "pysocks"
version = "1.7.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/bd/11/293dd436aea955d45fc4e8a35b6ae7270f5b8e00b53cf6c024c83b657a11/PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0", size = 284429 }
+sdist = { url = "https://files.pythonhosted.org/packages/bd/11/293dd436aea955d45fc4e8a35b6ae7270f5b8e00b53cf6c024c83b657a11/PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0", size = 284429, upload-time = "2019-09-20T02:07:35.714Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", size = 16725, upload-time = "2019-09-20T02:06:22.938Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "9.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/da/1d/eb34f286b164c5e431a810a38697409cca1112cee04b287bb56ac486730b/pytest-9.0.0.tar.gz", hash = "sha256:8f44522eafe4137b0f35c9ce3072931a788a21ee40a2ed279e817d3cc16ed21e", size = 1562764, upload-time = "2025-11-08T17:25:33.34Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", size = 16725 },
+ { url = "https://files.pythonhosted.org/packages/72/99/cafef234114a3b6d9f3aaed0723b437c40c57bdb7b3e4c3a575bc4890052/pytest-9.0.0-py3-none-any.whl", hash = "sha256:e5ccdf10b0bac554970ee88fc1a4ad0ee5d221f8ef22321f9b7e4584e19d7f96", size = 373364, upload-time = "2025-11-08T17:25:31.811Z" },
]
[[package]]
name = "python-crfsuite"
version = "0.9.11"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ea/17/9c64a2486de27fce7570c366eb723fd7a39dd7845119ee8fdd5051023671/python_crfsuite-0.9.11.tar.gz", hash = "sha256:6eff965ca70567396d822c9a35ea74b0f7edb27d9471524997bdabe7a6da5f5a", size = 477721 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/22/e2/1fafca9ea7a964bbc4a8a91351acb1f46c17c63e9aa766a22a59b0a14aa0/python_crfsuite-0.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:346a37d1ffa9f161d56c523d2386eaa5026c663e70f65db4478adb292d7c047c", size = 319874 },
- { url = "https://files.pythonhosted.org/packages/43/3f/1d954edbef65a0d2b9fe71a974973aaace5f617ab3276f50b995ea1ea198/python_crfsuite-0.9.11-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec40a7924d2e79a06f8eb0cec613ade54d677b73c4041c6052cd890aca2db89", size = 1200041 },
- { url = "https://files.pythonhosted.org/packages/49/77/069c75217707c0727944293571bccb90642269990abfac76427b3446c275/python_crfsuite-0.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5b3836e8ee8d684fb9d76d287035db51039b30cadac3332664655acf970831", size = 1234277 },
- { url = "https://files.pythonhosted.org/packages/54/a3/6af8a68bdfe4d8c001a1fdb84b6fa1154d2b772dbd619050697f4cc2fe39/python_crfsuite-0.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f498cb82686dc18f7cecaf0a7ebceb4590ee2137cfa8cfe1b75f53514d0e956", size = 1254759 },
- { url = "https://files.pythonhosted.org/packages/6f/3c/75e26cfd1e2c8807aa465a7213f63e2e0c9d61af0ad0ff635bbd2f47e4aa/python_crfsuite-0.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:29cdf55c54c388c62148ba310bf8ad1b93b352d62dd84856d15c421dae2e902d", size = 2131213 },
- { url = "https://files.pythonhosted.org/packages/16/76/53e57efd9f3e9cbbed3615d065d5367a8c18df0217e83ca216f215aa257a/python_crfsuite-0.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e6738ed044ba91d8284716f87525ca95bc857ece0b226910a80126a8ce6ad06", size = 2259424 },
- { url = "https://files.pythonhosted.org/packages/a1/05/663e01d5721ea5b0dfde0483696dd28498929cd095e86e31501891de2381/python_crfsuite-0.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1a365a70e54dbd20a9251a3b6df91e1406cab1b1b5995a9d68e8c748fc9b3af7", size = 2219484 },
- { url = "https://files.pythonhosted.org/packages/75/53/55c908ca49e0d3f5d0c7410f876ef4fc0b605e140492b41f8833a1befb96/python_crfsuite-0.9.11-cp312-cp312-win32.whl", hash = "sha256:4b230ab1b69c6025e4f64e72c445f7492cccf00d94fc2c0bf2f337fafc05d5d5", size = 280500 },
- { url = "https://files.pythonhosted.org/packages/54/08/d060405793cab77dbd167814393c838c456f9d9281cebcc3d9f185e2c5d5/python_crfsuite-0.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:c89d7ad4ca520a5f045c676865ec09a2accc25dc5dce387f2199e5b2c9d8f337", size = 301055 },
- { url = "https://files.pythonhosted.org/packages/22/8d/55073b5150b3884a30fc2ec2fc01fbdaa4187bedd57b5c80002182b09ab3/python_crfsuite-0.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89b45426f28b39dfc4789d29bcd7398f177746e4ab27f6ae3c7b48a082ecb73b", size = 318894 },
- { url = "https://files.pythonhosted.org/packages/14/5f/89cfb856b9bfc6d37723e20c439b5fff56a7a1b48de331a53d1669907b38/python_crfsuite-0.9.11-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:788b6ca5fd43797f6822bb7aed8d5b0255d7d53be62746c77ca91dad5dfd2f2b", size = 1196963 },
- { url = "https://files.pythonhosted.org/packages/72/a7/cfe27cb4539dbd0209fd23a1c3d653ba493202bb8c635045ff8f3e8ec6d5/python_crfsuite-0.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:609ce1e2ea1ff36379e91a4af9f10bcaaca0b22d089ec7489181ae0d9d098419", size = 1231856 },
- { url = "https://files.pythonhosted.org/packages/78/72/ec157e6a280e1662622ac8a74d891e436e765299df75b5f5cdbb48c2ca1a/python_crfsuite-0.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893af206342196e37c84af73941d7c2498e3ab926a67f846f78de6f48a7cb067", size = 1252163 },
- { url = "https://files.pythonhosted.org/packages/6c/1a/1b60a013e5e24ffcd420aa7b44f2328c1f4f0d8f33606baa845ee5e1fa9c/python_crfsuite-0.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a387c4c4794ecccc712e01091b2887fc90b63dbc6612947232c2593116545e8a", size = 2130072 },
- { url = "https://files.pythonhosted.org/packages/59/0a/48a93be02c2eee1f62c92ead8ca50e194c09da9e62bea6c7177ea767d36a/python_crfsuite-0.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:00db049cc46f716cef6626fbcf5b8abc258f4740e39dcceccc706ba77200992b", size = 2259369 },
- { url = "https://files.pythonhosted.org/packages/7c/88/666e5a7a46119200d079bd676001e154938be2674c54a0e0cf6cf2bfa1a3/python_crfsuite-0.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c0f95fd723e7a684188c541106f301a1d87104a07acd1e5687df849d2a86391a", size = 2218763 },
- { url = "https://files.pythonhosted.org/packages/a7/1a/9c21fe8ca1cf05d2fb879c7cebc31938eb7e8734bd2cf4066d41afd08db8/python_crfsuite-0.9.11-cp313-cp313-win32.whl", hash = "sha256:5664cebdc82d20b374641f2d0e77a86e8b010fafaf8efeb8862c3fc567d41c08", size = 280175 },
- { url = "https://files.pythonhosted.org/packages/5f/bd/f37bad6ec84b8e5eaa8c56965de2ae25d292b011ff6532bdfe70b7a0b6c0/python_crfsuite-0.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:00123f42dca02897aaa1fc129ea99b815f800c2893ffb210d8b8f71235ffeef4", size = 300505 },
+sdist = { url = "https://files.pythonhosted.org/packages/ea/17/9c64a2486de27fce7570c366eb723fd7a39dd7845119ee8fdd5051023671/python_crfsuite-0.9.11.tar.gz", hash = "sha256:6eff965ca70567396d822c9a35ea74b0f7edb27d9471524997bdabe7a6da5f5a", size = 477721, upload-time = "2024-10-02T13:01:16.646Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/e2/1fafca9ea7a964bbc4a8a91351acb1f46c17c63e9aa766a22a59b0a14aa0/python_crfsuite-0.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:346a37d1ffa9f161d56c523d2386eaa5026c663e70f65db4478adb292d7c047c", size = 319874, upload-time = "2024-10-02T13:00:20.921Z" },
+ { url = "https://files.pythonhosted.org/packages/43/3f/1d954edbef65a0d2b9fe71a974973aaace5f617ab3276f50b995ea1ea198/python_crfsuite-0.9.11-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec40a7924d2e79a06f8eb0cec613ade54d677b73c4041c6052cd890aca2db89", size = 1200041, upload-time = "2024-10-02T13:00:22.526Z" },
+ { url = "https://files.pythonhosted.org/packages/49/77/069c75217707c0727944293571bccb90642269990abfac76427b3446c275/python_crfsuite-0.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5b3836e8ee8d684fb9d76d287035db51039b30cadac3332664655acf970831", size = 1234277, upload-time = "2024-10-02T13:00:24.593Z" },
+ { url = "https://files.pythonhosted.org/packages/54/a3/6af8a68bdfe4d8c001a1fdb84b6fa1154d2b772dbd619050697f4cc2fe39/python_crfsuite-0.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f498cb82686dc18f7cecaf0a7ebceb4590ee2137cfa8cfe1b75f53514d0e956", size = 1254759, upload-time = "2024-10-02T13:00:26.159Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/3c/75e26cfd1e2c8807aa465a7213f63e2e0c9d61af0ad0ff635bbd2f47e4aa/python_crfsuite-0.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:29cdf55c54c388c62148ba310bf8ad1b93b352d62dd84856d15c421dae2e902d", size = 2131213, upload-time = "2024-10-02T13:00:27.945Z" },
+ { url = "https://files.pythonhosted.org/packages/16/76/53e57efd9f3e9cbbed3615d065d5367a8c18df0217e83ca216f215aa257a/python_crfsuite-0.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e6738ed044ba91d8284716f87525ca95bc857ece0b226910a80126a8ce6ad06", size = 2259424, upload-time = "2024-10-02T13:00:29.371Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/05/663e01d5721ea5b0dfde0483696dd28498929cd095e86e31501891de2381/python_crfsuite-0.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1a365a70e54dbd20a9251a3b6df91e1406cab1b1b5995a9d68e8c748fc9b3af7", size = 2219484, upload-time = "2024-10-02T13:00:31.033Z" },
+ { url = "https://files.pythonhosted.org/packages/75/53/55c908ca49e0d3f5d0c7410f876ef4fc0b605e140492b41f8833a1befb96/python_crfsuite-0.9.11-cp312-cp312-win32.whl", hash = "sha256:4b230ab1b69c6025e4f64e72c445f7492cccf00d94fc2c0bf2f337fafc05d5d5", size = 280500, upload-time = "2024-10-02T13:00:32.765Z" },
+ { url = "https://files.pythonhosted.org/packages/54/08/d060405793cab77dbd167814393c838c456f9d9281cebcc3d9f185e2c5d5/python_crfsuite-0.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:c89d7ad4ca520a5f045c676865ec09a2accc25dc5dce387f2199e5b2c9d8f337", size = 301055, upload-time = "2024-10-02T13:00:33.956Z" },
+ { url = "https://files.pythonhosted.org/packages/22/8d/55073b5150b3884a30fc2ec2fc01fbdaa4187bedd57b5c80002182b09ab3/python_crfsuite-0.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89b45426f28b39dfc4789d29bcd7398f177746e4ab27f6ae3c7b48a082ecb73b", size = 318894, upload-time = "2024-10-02T13:00:35.363Z" },
+ { url = "https://files.pythonhosted.org/packages/14/5f/89cfb856b9bfc6d37723e20c439b5fff56a7a1b48de331a53d1669907b38/python_crfsuite-0.9.11-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:788b6ca5fd43797f6822bb7aed8d5b0255d7d53be62746c77ca91dad5dfd2f2b", size = 1196963, upload-time = "2024-10-02T13:00:37.512Z" },
+ { url = "https://files.pythonhosted.org/packages/72/a7/cfe27cb4539dbd0209fd23a1c3d653ba493202bb8c635045ff8f3e8ec6d5/python_crfsuite-0.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:609ce1e2ea1ff36379e91a4af9f10bcaaca0b22d089ec7489181ae0d9d098419", size = 1231856, upload-time = "2024-10-02T13:00:39.312Z" },
+ { url = "https://files.pythonhosted.org/packages/78/72/ec157e6a280e1662622ac8a74d891e436e765299df75b5f5cdbb48c2ca1a/python_crfsuite-0.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893af206342196e37c84af73941d7c2498e3ab926a67f846f78de6f48a7cb067", size = 1252163, upload-time = "2024-10-02T13:00:41.139Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/1a/1b60a013e5e24ffcd420aa7b44f2328c1f4f0d8f33606baa845ee5e1fa9c/python_crfsuite-0.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a387c4c4794ecccc712e01091b2887fc90b63dbc6612947232c2593116545e8a", size = 2130072, upload-time = "2024-10-02T13:00:42.518Z" },
+ { url = "https://files.pythonhosted.org/packages/59/0a/48a93be02c2eee1f62c92ead8ca50e194c09da9e62bea6c7177ea767d36a/python_crfsuite-0.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:00db049cc46f716cef6626fbcf5b8abc258f4740e39dcceccc706ba77200992b", size = 2259369, upload-time = "2024-10-02T13:00:43.914Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/88/666e5a7a46119200d079bd676001e154938be2674c54a0e0cf6cf2bfa1a3/python_crfsuite-0.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c0f95fd723e7a684188c541106f301a1d87104a07acd1e5687df849d2a86391a", size = 2218763, upload-time = "2024-10-02T13:00:45.627Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/1a/9c21fe8ca1cf05d2fb879c7cebc31938eb7e8734bd2cf4066d41afd08db8/python_crfsuite-0.9.11-cp313-cp313-win32.whl", hash = "sha256:5664cebdc82d20b374641f2d0e77a86e8b010fafaf8efeb8862c3fc567d41c08", size = 280175, upload-time = "2024-10-02T13:00:46.915Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/bd/f37bad6ec84b8e5eaa8c56965de2ae25d292b011ff6532bdfe70b7a0b6c0/python_crfsuite-0.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:00123f42dca02897aaa1fc129ea99b815f800c2893ffb210d8b8f71235ffeef4", size = 300505, upload-time = "2024-10-02T13:00:48.117Z" },
]
[[package]]
@@ -1480,129 +1717,132 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "six" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 }
+sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 },
+ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
]
[[package]]
name = "python-dotenv"
-version = "1.0.1"
+version = "1.1.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 },
+ { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" },
]
[[package]]
name = "python-json-logger"
-version = "3.2.1"
+version = "3.3.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e3/c4/358cd13daa1d912ef795010897a483ab2f0b41c9ea1b35235a8b2f7d15a7/python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008", size = 16287 }
+sdist = { url = "https://files.pythonhosted.org/packages/9e/de/d3144a0bceede957f961e975f3752760fbe390d57fbe194baf709d8f1f7b/python_json_logger-3.3.0.tar.gz", hash = "sha256:12b7e74b17775e7d565129296105bbe3910842d9d0eb083fc83a6a617aa8df84", size = 16642, upload-time = "2025-03-07T07:08:27.301Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/4b/72/2f30cf26664fcfa0bd8ec5ee62ec90c03bd485e4a294d92aabc76c5203a5/python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090", size = 14924 },
+ { url = "https://files.pythonhosted.org/packages/08/20/0f2523b9e50a8052bc6a8b732dfc8568abbdc42010aef03a2d750bdab3b2/python_json_logger-3.3.0-py3-none-any.whl", hash = "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7", size = 15163, upload-time = "2025-03-07T07:08:25.627Z" },
]
[[package]]
name = "pytz"
-version = "2024.2"
+version = "2025.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 }
+sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 },
+ { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" },
]
[[package]]
name = "pywin32"
-version = "308"
+version = "311"
source = { registry = "https://pypi.org/simple" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 },
- { url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 },
- { url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 },
- { url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 },
- { url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 },
- { url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 },
+ { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" },
+ { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" },
+ { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" },
]
[[package]]
name = "pywinpty"
-version = "2.0.14"
+version = "2.0.15"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f1/82/90f8750423cba4b9b6c842df227609fb60704482d7abf6dd47e2babc055a/pywinpty-2.0.14.tar.gz", hash = "sha256:18bd9529e4a5daf2d9719aa17788ba6013e594ae94c5a0c27e83df3278b0660e", size = 27769 }
+sdist = { url = "https://files.pythonhosted.org/packages/2d/7c/917f9c4681bb8d34bfbe0b79d36bbcd902651aeab48790df3d30ba0202fb/pywinpty-2.0.15.tar.gz", hash = "sha256:312cf39153a8736c617d45ce8b6ad6cd2107de121df91c455b10ce6bba7a39b2", size = 29017, upload-time = "2025-02-03T21:53:23.265Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ad/79/759ae767a3b78d340446efd54dd1fe4f7dafa4fc7be96ed757e44bcdba54/pywinpty-2.0.14-cp312-none-win_amd64.whl", hash = "sha256:55dad362ef3e9408ade68fd173e4f9032b3ce08f68cfe7eacb2c263ea1179737", size = 1397207 },
- { url = "https://files.pythonhosted.org/packages/7d/34/b77b3c209bf2eaa6455390c8d5449241637f5957f41636a2204065d52bfa/pywinpty-2.0.14-cp313-none-win_amd64.whl", hash = "sha256:074fb988a56ec79ca90ed03a896d40707131897cefb8f76f926e3834227f2819", size = 1396698 },
+ { url = "https://files.pythonhosted.org/packages/88/e5/9714def18c3a411809771a3fbcec70bffa764b9675afb00048a620fca604/pywinpty-2.0.15-cp312-cp312-win_amd64.whl", hash = "sha256:83a8f20b430bbc5d8957249f875341a60219a4e971580f2ba694fbfb54a45ebc", size = 1405243, upload-time = "2025-02-03T21:56:52.476Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/16/2ab7b3b7f55f3c6929e5f629e1a68362981e4e5fed592a2ed1cb4b4914a5/pywinpty-2.0.15-cp313-cp313-win_amd64.whl", hash = "sha256:ab5920877dd632c124b4ed17bc6dd6ef3b9f86cd492b963ffdb1a67b85b0f408", size = 1405020, upload-time = "2025-02-03T21:56:04.753Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/16/edef3515dd2030db2795dbfbe392232c7a0f3dc41b98e92b38b42ba497c7/pywinpty-2.0.15-cp313-cp313t-win_amd64.whl", hash = "sha256:a4560ad8c01e537708d2790dbe7da7d986791de805d89dd0d3697ca59e9e4901", size = 1404151, upload-time = "2025-02-03T21:55:53.628Z" },
]
[[package]]
name = "pyyaml"
version = "6.0.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 },
- { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 },
- { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 },
- { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 },
- { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 },
- { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 },
- { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 },
- { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 },
- { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 },
- { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 },
- { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 },
- { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 },
- { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 },
- { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 },
- { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 },
- { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 },
- { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 },
- { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 },
+sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" },
+ { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" },
+ { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" },
+ { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" },
+ { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" },
+ { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" },
]
[[package]]
name = "pyzmq"
-version = "26.2.0"
+version = "27.0.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cffi", marker = "implementation_name == 'pypy'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/fd/05/bed626b9f7bb2322cdbbf7b4bd8f54b1b617b0d2ab2d3547d6e39428a48e/pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f", size = 271975 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/28/2f/78a766c8913ad62b28581777ac4ede50c6d9f249d39c2963e279524a1bbe/pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9", size = 1343105 },
- { url = "https://files.pythonhosted.org/packages/b7/9c/4b1e2d3d4065be715e007fe063ec7885978fad285f87eae1436e6c3201f4/pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52", size = 1008365 },
- { url = "https://files.pythonhosted.org/packages/4f/ef/5a23ec689ff36d7625b38d121ef15abfc3631a9aecb417baf7a4245e4124/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08", size = 665923 },
- { url = "https://files.pythonhosted.org/packages/ae/61/d436461a47437d63c6302c90724cf0981883ec57ceb6073873f32172d676/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5", size = 903400 },
- { url = "https://files.pythonhosted.org/packages/47/42/fc6d35ecefe1739a819afaf6f8e686f7f02a4dd241c78972d316f403474c/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae", size = 860034 },
- { url = "https://files.pythonhosted.org/packages/07/3b/44ea6266a6761e9eefaa37d98fabefa112328808ac41aa87b4bbb668af30/pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711", size = 860579 },
- { url = "https://files.pythonhosted.org/packages/38/6f/4df2014ab553a6052b0e551b37da55166991510f9e1002c89cab7ce3b3f2/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6", size = 1196246 },
- { url = "https://files.pythonhosted.org/packages/38/9d/ee240fc0c9fe9817f0c9127a43238a3e28048795483c403cc10720ddef22/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3", size = 1507441 },
- { url = "https://files.pythonhosted.org/packages/85/4f/01711edaa58d535eac4a26c294c617c9a01f09857c0ce191fd574d06f359/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b", size = 1406498 },
- { url = "https://files.pythonhosted.org/packages/07/18/907134c85c7152f679ed744e73e645b365f3ad571f38bdb62e36f347699a/pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7", size = 575533 },
- { url = "https://files.pythonhosted.org/packages/ce/2c/a6f4a20202a4d3c582ad93f95ee78d79bbdc26803495aec2912b17dbbb6c/pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a", size = 637768 },
- { url = "https://files.pythonhosted.org/packages/5f/0e/eb16ff731632d30554bf5af4dbba3ffcd04518219d82028aea4ae1b02ca5/pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b", size = 540675 },
- { url = "https://files.pythonhosted.org/packages/04/a7/0f7e2f6c126fe6e62dbae0bc93b1bd3f1099cf7fea47a5468defebe3f39d/pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726", size = 1006564 },
- { url = "https://files.pythonhosted.org/packages/31/b6/a187165c852c5d49f826a690857684333a6a4a065af0a6015572d2284f6a/pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3", size = 1340447 },
- { url = "https://files.pythonhosted.org/packages/68/ba/f4280c58ff71f321602a6e24fd19879b7e79793fb8ab14027027c0fb58ef/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50", size = 665485 },
- { url = "https://files.pythonhosted.org/packages/77/b5/c987a5c53c7d8704216f29fc3d810b32f156bcea488a940e330e1bcbb88d/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb", size = 903484 },
- { url = "https://files.pythonhosted.org/packages/29/c9/07da157d2db18c72a7eccef8e684cefc155b712a88e3d479d930aa9eceba/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187", size = 859981 },
- { url = "https://files.pythonhosted.org/packages/43/09/e12501bd0b8394b7d02c41efd35c537a1988da67fc9c745cae9c6c776d31/pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b", size = 860334 },
- { url = "https://files.pythonhosted.org/packages/eb/ff/f5ec1d455f8f7385cc0a8b2acd8c807d7fade875c14c44b85c1bddabae21/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18", size = 1196179 },
- { url = "https://files.pythonhosted.org/packages/ec/8a/bb2ac43295b1950fe436a81fc5b298be0b96ac76fb029b514d3ed58f7b27/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115", size = 1507668 },
- { url = "https://files.pythonhosted.org/packages/a9/49/dbc284ebcfd2dca23f6349227ff1616a7ee2c4a35fe0a5d6c3deff2b4fed/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e", size = 1406539 },
- { url = "https://files.pythonhosted.org/packages/00/68/093cdce3fe31e30a341d8e52a1ad86392e13c57970d722c1f62a1d1a54b6/pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5", size = 575567 },
- { url = "https://files.pythonhosted.org/packages/92/ae/6cc4657148143412b5819b05e362ae7dd09fb9fe76e2a539dcff3d0386bc/pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad", size = 637551 },
- { url = "https://files.pythonhosted.org/packages/6c/67/fbff102e201688f97c8092e4c3445d1c1068c2f27bbd45a578df97ed5f94/pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797", size = 540378 },
- { url = "https://files.pythonhosted.org/packages/3f/fe/2d998380b6e0122c6c4bdf9b6caf490831e5f5e2d08a203b5adff060c226/pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a", size = 1007378 },
- { url = "https://files.pythonhosted.org/packages/4a/f4/30d6e7157f12b3a0390bde94d6a8567cdb88846ed068a6e17238a4ccf600/pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc", size = 1329532 },
- { url = "https://files.pythonhosted.org/packages/82/86/3fe917870e15ee1c3ad48229a2a64458e36036e64b4afa9659045d82bfa8/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5", size = 653242 },
- { url = "https://files.pythonhosted.org/packages/50/2d/242e7e6ef6c8c19e6cb52d095834508cd581ffb925699fd3c640cdc758f1/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672", size = 888404 },
- { url = "https://files.pythonhosted.org/packages/ac/11/7270566e1f31e4ea73c81ec821a4b1688fd551009a3d2bab11ec66cb1e8f/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797", size = 845858 },
- { url = "https://files.pythonhosted.org/packages/91/d5/72b38fbc69867795c8711bdd735312f9fef1e3d9204e2f63ab57085434b9/pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386", size = 847375 },
- { url = "https://files.pythonhosted.org/packages/dd/9a/10ed3c7f72b4c24e719c59359fbadd1a27556a28b36cdf1cd9e4fb7845d5/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306", size = 1183489 },
- { url = "https://files.pythonhosted.org/packages/72/2d/8660892543fabf1fe41861efa222455811adac9f3c0818d6c3170a1153e3/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6", size = 1492932 },
- { url = "https://files.pythonhosted.org/packages/7b/d6/32fd69744afb53995619bc5effa2a405ae0d343cd3e747d0fbc43fe894ee/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0", size = 1392485 },
+sdist = { url = "https://files.pythonhosted.org/packages/30/5f/557d2032a2f471edbcc227da724c24a1c05887b5cda1e3ae53af98b9e0a5/pyzmq-27.0.1.tar.gz", hash = "sha256:45c549204bc20e7484ffd2555f6cf02e572440ecf2f3bdd60d4404b20fddf64b", size = 281158, upload-time = "2025-08-03T05:05:40.352Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0e/9b/c0957041067c7724b310f22c398be46399297c12ed834c3bc42200a2756f/pyzmq-27.0.1-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:af7ebce2a1e7caf30c0bb64a845f63a69e76a2fadbc1cac47178f7bb6e657bdd", size = 1305432, upload-time = "2025-08-03T05:03:32.177Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/55/bd3a312790858f16b7def3897a0c3eb1804e974711bf7b9dcb5f47e7f82c/pyzmq-27.0.1-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8f617f60a8b609a13099b313e7e525e67f84ef4524b6acad396d9ff153f6e4cd", size = 895095, upload-time = "2025-08-03T05:03:33.918Z" },
+ { url = "https://files.pythonhosted.org/packages/20/50/fc384631d8282809fb1029a4460d2fe90fa0370a0e866a8318ed75c8d3bb/pyzmq-27.0.1-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d59dad4173dc2a111f03e59315c7bd6e73da1a9d20a84a25cf08325b0582b1a", size = 651826, upload-time = "2025-08-03T05:03:35.818Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/0a/2356305c423a975000867de56888b79e44ec2192c690ff93c3109fd78081/pyzmq-27.0.1-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5b6133c8d313bde8bd0d123c169d22525300ff164c2189f849de495e1344577", size = 839751, upload-time = "2025-08-03T05:03:37.265Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/1b/81e95ad256ca7e7ccd47f5294c1c6da6e2b64fbace65b84fe8a41470342e/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:58cca552567423f04d06a075f4b473e78ab5bdb906febe56bf4797633f54aa4e", size = 1641359, upload-time = "2025-08-03T05:03:38.799Z" },
+ { url = "https://files.pythonhosted.org/packages/50/63/9f50ec965285f4e92c265c8f18344e46b12803666d8b73b65d254d441435/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:4b9d8e26fb600d0d69cc9933e20af08552e97cc868a183d38a5c0d661e40dfbb", size = 2020281, upload-time = "2025-08-03T05:03:40.338Z" },
+ { url = "https://files.pythonhosted.org/packages/02/4a/19e3398d0dc66ad2b463e4afa1fc541d697d7bc090305f9dfb948d3dfa29/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2329f0c87f0466dce45bba32b63f47018dda5ca40a0085cc5c8558fea7d9fc55", size = 1877112, upload-time = "2025-08-03T05:03:42.012Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/42/c562e9151aa90ed1d70aac381ea22a929d6b3a2ce4e1d6e2e135d34fd9c6/pyzmq-27.0.1-cp312-abi3-win32.whl", hash = "sha256:57bb92abdb48467b89c2d21da1ab01a07d0745e536d62afd2e30d5acbd0092eb", size = 558177, upload-time = "2025-08-03T05:03:43.979Z" },
+ { url = "https://files.pythonhosted.org/packages/40/96/5c50a7d2d2b05b19994bf7336b97db254299353dd9b49b565bb71b485f03/pyzmq-27.0.1-cp312-abi3-win_amd64.whl", hash = "sha256:ff3f8757570e45da7a5bedaa140489846510014f7a9d5ee9301c61f3f1b8a686", size = 618923, upload-time = "2025-08-03T05:03:45.438Z" },
+ { url = "https://files.pythonhosted.org/packages/13/33/1ec89c8f21c89d21a2eaff7def3676e21d8248d2675705e72554fb5a6f3f/pyzmq-27.0.1-cp312-abi3-win_arm64.whl", hash = "sha256:df2c55c958d3766bdb3e9d858b911288acec09a9aab15883f384fc7180df5bed", size = 552358, upload-time = "2025-08-03T05:03:46.887Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/a0/f26e276211ec8090a4d11e4ec70eb8a8b15781e591c1d44ce62f372963a0/pyzmq-27.0.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:497bd8af534ae55dc4ef67eebd1c149ff2a0b0f1e146db73c8b5a53d83c1a5f5", size = 1122287, upload-time = "2025-08-03T05:03:48.838Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/d8/af4b507e4f7eeea478cc8ee873995a6fd55582bfb99140593ed460e1db3c/pyzmq-27.0.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:a066ea6ad6218b4c233906adf0ae67830f451ed238419c0db609310dd781fbe7", size = 1155756, upload-time = "2025-08-03T05:03:50.907Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/55/37fae0013e11f88681da42698e550b08a316d608242551f65095cc99232a/pyzmq-27.0.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:72d235d6365ca73d8ce92f7425065d70f5c1e19baa458eb3f0d570e425b73a96", size = 1340826, upload-time = "2025-08-03T05:03:52.568Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/e4/3a87854c64b26fcf63a9d1b6f4382bd727d4797c772ceb334a97b7489be9/pyzmq-27.0.1-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:313a7b374e3dc64848644ca348a51004b41726f768b02e17e689f1322366a4d9", size = 897283, upload-time = "2025-08-03T05:03:54.167Z" },
+ { url = "https://files.pythonhosted.org/packages/17/3e/4296c6b0ad2d07be11ae1395dccf9cae48a0a655cf9be1c3733ad2b591d1/pyzmq-27.0.1-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:119ce8590409702394f959c159d048002cbed2f3c0645ec9d6a88087fc70f0f1", size = 660565, upload-time = "2025-08-03T05:03:56.152Z" },
+ { url = "https://files.pythonhosted.org/packages/72/41/a33ba3aa48b45b23c4cd4ac49aafde46f3e0f81939f2bfb3b6171a437122/pyzmq-27.0.1-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:45c3e00ce16896ace2cd770ab9057a7cf97d4613ea5f2a13f815141d8b6894b9", size = 847680, upload-time = "2025-08-03T05:03:57.696Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/8c/bf2350bb25b3b58d2e5b5d2290ffab0e923f0cc6d02288d3fbf4baa6e4d1/pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:678e50ec112bdc6df5a83ac259a55a4ba97a8b314c325ab26b3b5b071151bc61", size = 1650151, upload-time = "2025-08-03T05:03:59.387Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/1a/a5a07c54890891344a8ddc3d5ab320dd3c4e39febb6e4472546e456d5157/pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d0b96c30be9f9387b18b18b6133c75a7b1b0065da64e150fe1feb5ebf31ece1c", size = 2023766, upload-time = "2025-08-03T05:04:01.883Z" },
+ { url = "https://files.pythonhosted.org/packages/62/5e/514dcff08f02c6c8a45a6e23621901139cf853be7ac5ccd0b9407c3aa3de/pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88dc92d9eb5ea4968123e74db146d770b0c8d48f0e2bfb1dbc6c50a8edb12d64", size = 1885195, upload-time = "2025-08-03T05:04:03.923Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/91/87f74f98a487fbef0b115f6025e4a295129fd56b2b633a03ba7d5816ecc2/pyzmq-27.0.1-cp313-cp313t-win32.whl", hash = "sha256:6dcbcb34f5c9b0cefdfc71ff745459241b7d3cda5b27c7ad69d45afc0821d1e1", size = 574213, upload-time = "2025-08-03T05:04:05.905Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/d7/07f7d0d7f4c81e08be7b60e52ff2591c557377c017f96204d33d5fca1b07/pyzmq-27.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9fd0fda730461f510cfd9a40fafa5355d65f5e3dbdd8d6dfa342b5b3f5d1949", size = 640202, upload-time = "2025-08-03T05:04:07.439Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/83/21d66bcef6fb803647a223cbde95111b099e2176277c0cbc8b099c485510/pyzmq-27.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:56a3b1853f3954ec1f0e91085f1350cc57d18f11205e4ab6e83e4b7c414120e0", size = 561514, upload-time = "2025-08-03T05:04:09.071Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/0b/d5ea75cf46b52cdce85a85200c963cb498932953df443892238be49b1a01/pyzmq-27.0.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:f98f6b7787bd2beb1f0dde03f23a0621a0c978edf673b7d8f5e7bc039cbe1b60", size = 1340836, upload-time = "2025-08-03T05:04:10.774Z" },
+ { url = "https://files.pythonhosted.org/packages/be/4c/0dbce882550e17db6846b29e9dc242aea7590e7594e1ca5043e8e58fff2d/pyzmq-27.0.1-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:351bf5d8ca0788ca85327fda45843b6927593ff4c807faee368cc5aaf9f809c2", size = 897236, upload-time = "2025-08-03T05:04:13.221Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/22/461e131cf16b8814f3c356fa1ea0912697dbc4c64cddf01f7756ec704c1e/pyzmq-27.0.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5268a5a9177afff53dc6d70dffe63114ba2a6e7b20d9411cc3adeba09eeda403", size = 660374, upload-time = "2025-08-03T05:04:15.032Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/0c/bbd65a814395bf4fc3e57c6c13af27601c07e4009bdfb75ebcf500537bbd/pyzmq-27.0.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4aca06ba295aa78bec9b33ec028d1ca08744c36294338c41432b7171060c808", size = 847497, upload-time = "2025-08-03T05:04:16.967Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/df/3d1f4a03b561d824cbd491394f67591957e2f1acf6dc85d96f970312a76a/pyzmq-27.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1c363c6dc66352331d5ad64bb838765c6692766334a6a02fdb05e76bd408ae18", size = 1650028, upload-time = "2025-08-03T05:04:19.398Z" },
+ { url = "https://files.pythonhosted.org/packages/41/c9/a3987540f59a412bdaae3f362f78e00e6769557a598c63b7e32956aade5a/pyzmq-27.0.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:87aebf4acd7249bdff8d3df03aed4f09e67078e6762cfe0aecf8d0748ff94cde", size = 2023808, upload-time = "2025-08-03T05:04:21.145Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/a5/c388f4cd80498a8eaef7535f2a8eaca0a35b82b87a0b47fa1856fc135004/pyzmq-27.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e4f22d67756518d71901edf73b38dc0eb4765cce22c8fe122cc81748d425262b", size = 1884970, upload-time = "2025-08-03T05:04:22.908Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/ac/b2a89a1ed90526a1b9a260cdc5cd42f055fd44ee8d2a59902b5ac35ddeb1/pyzmq-27.0.1-cp314-cp314t-win32.whl", hash = "sha256:8c62297bc7aea2147b472ca5ca2b4389377ad82898c87cabab2a94aedd75e337", size = 586905, upload-time = "2025-08-03T05:04:24.492Z" },
+ { url = "https://files.pythonhosted.org/packages/68/62/7aa5ea04e836f7a788b2a67405f83011cef59ca76d7bac91d1fc9a0476da/pyzmq-27.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:bee5248d5ec9223545f8cc4f368c2d571477ae828c99409125c3911511d98245", size = 660503, upload-time = "2025-08-03T05:04:26.382Z" },
+ { url = "https://files.pythonhosted.org/packages/89/32/3836ed85947b06f1d67c07ce16c00b0cf8c053ab0b249d234f9f81ff95ff/pyzmq-27.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:0fc24bf45e4a454e55ef99d7f5c8b8712539200ce98533af25a5bfa954b6b390", size = 575098, upload-time = "2025-08-03T05:04:27.974Z" },
]
[[package]]
@@ -1612,27 +1852,28 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "decorator" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/c5/5a/e1440017bccb14523bb76356e6f3a5468386b8a9192bd901e98babd1a1ea/ratelim-0.1.6.tar.gz", hash = "sha256:826d32177e11f9a12831901c9fda6679fd5bbea3605910820167088f5acbb11d", size = 2793 }
+sdist = { url = "https://files.pythonhosted.org/packages/c5/5a/e1440017bccb14523bb76356e6f3a5468386b8a9192bd901e98babd1a1ea/ratelim-0.1.6.tar.gz", hash = "sha256:826d32177e11f9a12831901c9fda6679fd5bbea3605910820167088f5acbb11d", size = 2793, upload-time = "2015-02-27T18:06:08.53Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f2/98/7e6d147fd16a10a5f821db6e25f192265d6ecca3d82957a4fdd592cad49c/ratelim-0.1.6-py2.py3-none-any.whl", hash = "sha256:e1a7dd39e6b552b7cc7f52169cd66cdb826a1a30198e355d7016012987c9ad08", size = 4017 },
+ { url = "https://files.pythonhosted.org/packages/f2/98/7e6d147fd16a10a5f821db6e25f192265d6ecca3d82957a4fdd592cad49c/ratelim-0.1.6-py2.py3-none-any.whl", hash = "sha256:e1a7dd39e6b552b7cc7f52169cd66cdb826a1a30198e355d7016012987c9ad08", size = 4017, upload-time = "2015-02-27T18:06:06.464Z" },
]
[[package]]
name = "referencing"
-version = "0.35.1"
+version = "0.36.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "attrs" },
{ name = "rpds-py" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/99/5b/73ca1f8e72fff6fa52119dbd185f73a907b1989428917b24cff660129b6d/referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c", size = 62991 }
+sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de", size = 26684 },
+ { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" },
]
[[package]]
name = "requests"
-version = "2.32.3"
+version = "2.32.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "certifi" },
@@ -1640,9 +1881,9 @@ dependencies = [
{ name = "idna" },
{ name = "urllib3" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 }
+sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
+ { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" },
]
[[package]]
@@ -1652,83 +1893,124 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "six" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513 }
+sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490 },
+ { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" },
]
[[package]]
name = "rfc3986-validator"
version = "0.1.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760 }
+sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760, upload-time = "2019-10-28T16:00:19.144Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" },
+]
+
+[[package]]
+name = "rfc3987-syntax"
+version = "1.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "lark" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d", size = 14239, upload-time = "2025-07-18T01:05:05.015Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242 },
+ { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" },
]
[[package]]
name = "rich"
-version = "13.9.4"
+version = "14.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "markdown-it-py" },
{ name = "pygments" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 }
+sdist = { url = "https://files.pythonhosted.org/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441, upload-time = "2025-07-25T07:32:58.125Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 },
+ { url = "https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368, upload-time = "2025-07-25T07:32:56.73Z" },
]
[[package]]
name = "rpds-py"
-version = "0.22.3"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/01/80/cce854d0921ff2f0a9fa831ba3ad3c65cee3a46711addf39a2af52df2cfd/rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", size = 26771 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/75/47/3383ee3bd787a2a5e65a9b9edc37ccf8505c0a00170e3a5e6ea5fbcd97f7/rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e", size = 352334 },
- { url = "https://files.pythonhosted.org/packages/40/14/aa6400fa8158b90a5a250a77f2077c0d0cd8a76fce31d9f2b289f04c6dec/rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56", size = 342111 },
- { url = "https://files.pythonhosted.org/packages/7d/06/395a13bfaa8a28b302fb433fb285a67ce0ea2004959a027aea8f9c52bad4/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45", size = 384286 },
- { url = "https://files.pythonhosted.org/packages/43/52/d8eeaffab047e6b7b7ef7f00d5ead074a07973968ffa2d5820fa131d7852/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e", size = 391739 },
- { url = "https://files.pythonhosted.org/packages/83/31/52dc4bde85c60b63719610ed6f6d61877effdb5113a72007679b786377b8/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d", size = 427306 },
- { url = "https://files.pythonhosted.org/packages/70/d5/1bab8e389c2261dba1764e9e793ed6830a63f830fdbec581a242c7c46bda/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38", size = 442717 },
- { url = "https://files.pythonhosted.org/packages/82/a1/a45f3e30835b553379b3a56ea6c4eb622cf11e72008229af840e4596a8ea/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15", size = 385721 },
- { url = "https://files.pythonhosted.org/packages/a6/27/780c942de3120bdd4d0e69583f9c96e179dfff082f6ecbb46b8d6488841f/rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059", size = 415824 },
- { url = "https://files.pythonhosted.org/packages/94/0b/aa0542ca88ad20ea719b06520f925bae348ea5c1fdf201b7e7202d20871d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e", size = 561227 },
- { url = "https://files.pythonhosted.org/packages/0d/92/3ed77d215f82c8f844d7f98929d56cc321bb0bcfaf8f166559b8ec56e5f1/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61", size = 587424 },
- { url = "https://files.pythonhosted.org/packages/09/42/cacaeb047a22cab6241f107644f230e2935d4efecf6488859a7dd82fc47d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7", size = 555953 },
- { url = "https://files.pythonhosted.org/packages/e6/52/c921dc6d5f5d45b212a456c1f5b17df1a471127e8037eb0972379e39dff4/rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627", size = 221339 },
- { url = "https://files.pythonhosted.org/packages/f2/c7/f82b5be1e8456600395366f86104d1bd8d0faed3802ad511ef6d60c30d98/rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4", size = 235786 },
- { url = "https://files.pythonhosted.org/packages/d0/bf/36d5cc1f2c609ae6e8bf0fc35949355ca9d8790eceb66e6385680c951e60/rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84", size = 351657 },
- { url = "https://files.pythonhosted.org/packages/24/2a/f1e0fa124e300c26ea9382e59b2d582cba71cedd340f32d1447f4f29fa4e/rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25", size = 341829 },
- { url = "https://files.pythonhosted.org/packages/cf/c2/0da1231dd16953845bed60d1a586fcd6b15ceaeb965f4d35cdc71f70f606/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4", size = 384220 },
- { url = "https://files.pythonhosted.org/packages/c7/73/a4407f4e3a00a9d4b68c532bf2d873d6b562854a8eaff8faa6133b3588ec/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5", size = 391009 },
- { url = "https://files.pythonhosted.org/packages/a9/c3/04b7353477ab360fe2563f5f0b176d2105982f97cd9ae80a9c5a18f1ae0f/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc", size = 426989 },
- { url = "https://files.pythonhosted.org/packages/8d/e6/e4b85b722bcf11398e17d59c0f6049d19cd606d35363221951e6d625fcb0/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b", size = 441544 },
- { url = "https://files.pythonhosted.org/packages/27/fc/403e65e56f65fff25f2973216974976d3f0a5c3f30e53758589b6dc9b79b/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518", size = 385179 },
- { url = "https://files.pythonhosted.org/packages/57/9b/2be9ff9700d664d51fd96b33d6595791c496d2778cb0b2a634f048437a55/rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd", size = 415103 },
- { url = "https://files.pythonhosted.org/packages/bb/a5/03c2ad8ca10994fcf22dd2150dd1d653bc974fa82d9a590494c84c10c641/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2", size = 560916 },
- { url = "https://files.pythonhosted.org/packages/ba/2e/be4fdfc8b5b576e588782b56978c5b702c5a2307024120d8aeec1ab818f0/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16", size = 587062 },
- { url = "https://files.pythonhosted.org/packages/67/e0/2034c221937709bf9c542603d25ad43a68b4b0a9a0c0b06a742f2756eb66/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f", size = 555734 },
- { url = "https://files.pythonhosted.org/packages/ea/ce/240bae07b5401a22482b58e18cfbabaa392409b2797da60223cca10d7367/rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de", size = 220663 },
- { url = "https://files.pythonhosted.org/packages/cb/f0/d330d08f51126330467edae2fa4efa5cec8923c87551a79299380fdea30d/rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9", size = 235503 },
- { url = "https://files.pythonhosted.org/packages/f7/c4/dbe1cc03df013bf2feb5ad00615038050e7859f381e96fb5b7b4572cd814/rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b", size = 347698 },
- { url = "https://files.pythonhosted.org/packages/a4/3a/684f66dd6b0f37499cad24cd1c0e523541fd768576fa5ce2d0a8799c3cba/rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b", size = 337330 },
- { url = "https://files.pythonhosted.org/packages/82/eb/e022c08c2ce2e8f7683baa313476492c0e2c1ca97227fe8a75d9f0181e95/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1", size = 380022 },
- { url = "https://files.pythonhosted.org/packages/e4/21/5a80e653e4c86aeb28eb4fea4add1f72e1787a3299687a9187105c3ee966/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83", size = 390754 },
- { url = "https://files.pythonhosted.org/packages/37/a4/d320a04ae90f72d080b3d74597074e62be0a8ecad7d7321312dfe2dc5a6a/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd", size = 423840 },
- { url = "https://files.pythonhosted.org/packages/87/70/674dc47d93db30a6624279284e5631be4c3a12a0340e8e4f349153546728/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1", size = 438970 },
- { url = "https://files.pythonhosted.org/packages/3f/64/9500f4d66601d55cadd21e90784cfd5d5f4560e129d72e4339823129171c/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3", size = 383146 },
- { url = "https://files.pythonhosted.org/packages/4d/45/630327addb1d17173adcf4af01336fd0ee030c04798027dfcb50106001e0/rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130", size = 408294 },
- { url = "https://files.pythonhosted.org/packages/5f/ef/8efb3373cee54ea9d9980b772e5690a0c9e9214045a4e7fa35046e399fee/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c", size = 556345 },
- { url = "https://files.pythonhosted.org/packages/54/01/151d3b9ef4925fc8f15bfb131086c12ec3c3d6dd4a4f7589c335bf8e85ba/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b", size = 582292 },
- { url = "https://files.pythonhosted.org/packages/30/89/35fc7a6cdf3477d441c7aca5e9bbf5a14e0f25152aed7f63f4e0b141045d/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", size = 553855 },
- { url = "https://files.pythonhosted.org/packages/8f/e0/830c02b2457c4bd20a8c5bb394d31d81f57fbefce2dbdd2e31feff4f7003/rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", size = 219100 },
- { url = "https://files.pythonhosted.org/packages/f8/30/7ac943f69855c2db77407ae363484b915d861702dbba1aa82d68d57f42be/rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", size = 233794 },
+version = "0.26.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385, upload-time = "2025-07-01T15:57:13.958Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933, upload-time = "2025-07-01T15:54:15.734Z" },
+ { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447, upload-time = "2025-07-01T15:54:16.922Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711, upload-time = "2025-07-01T15:54:18.101Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865, upload-time = "2025-07-01T15:54:19.295Z" },
+ { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763, upload-time = "2025-07-01T15:54:20.858Z" },
+ { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651, upload-time = "2025-07-01T15:54:22.508Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079, upload-time = "2025-07-01T15:54:23.987Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379, upload-time = "2025-07-01T15:54:25.073Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033, upload-time = "2025-07-01T15:54:26.225Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639, upload-time = "2025-07-01T15:54:27.424Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105, upload-time = "2025-07-01T15:54:29.93Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272, upload-time = "2025-07-01T15:54:31.128Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995, upload-time = "2025-07-01T15:54:32.195Z" },
+ { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198, upload-time = "2025-07-01T15:54:33.271Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917, upload-time = "2025-07-01T15:54:34.755Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073, upload-time = "2025-07-01T15:54:36.292Z" },
+ { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214, upload-time = "2025-07-01T15:54:37.469Z" },
+ { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113, upload-time = "2025-07-01T15:54:38.954Z" },
+ { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189, upload-time = "2025-07-01T15:54:40.57Z" },
+ { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998, upload-time = "2025-07-01T15:54:43.025Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903, upload-time = "2025-07-01T15:54:44.752Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785, upload-time = "2025-07-01T15:54:46.043Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329, upload-time = "2025-07-01T15:54:47.64Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875, upload-time = "2025-07-01T15:54:48.9Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636, upload-time = "2025-07-01T15:54:50.619Z" },
+ { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663, upload-time = "2025-07-01T15:54:52.023Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428, upload-time = "2025-07-01T15:54:53.692Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571, upload-time = "2025-07-01T15:54:54.822Z" },
+ { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475, upload-time = "2025-07-01T15:54:56.228Z" },
+ { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692, upload-time = "2025-07-01T15:54:58.561Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415, upload-time = "2025-07-01T15:54:59.751Z" },
+ { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783, upload-time = "2025-07-01T15:55:00.898Z" },
+ { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844, upload-time = "2025-07-01T15:55:02.201Z" },
+ { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105, upload-time = "2025-07-01T15:55:03.698Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440, upload-time = "2025-07-01T15:55:05.398Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759, upload-time = "2025-07-01T15:55:08.316Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032, upload-time = "2025-07-01T15:55:09.52Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416, upload-time = "2025-07-01T15:55:11.216Z" },
+ { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049, upload-time = "2025-07-01T15:55:13.004Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428, upload-time = "2025-07-01T15:55:14.486Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524, upload-time = "2025-07-01T15:55:15.745Z" },
+ { url = "https://files.pythonhosted.org/packages/55/07/029b7c45db910c74e182de626dfdae0ad489a949d84a468465cd0ca36355/rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a", size = 364292, upload-time = "2025-07-01T15:55:17.001Z" },
+ { url = "https://files.pythonhosted.org/packages/13/d1/9b3d3f986216b4d1f584878dca15ce4797aaf5d372d738974ba737bf68d6/rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf", size = 350334, upload-time = "2025-07-01T15:55:18.922Z" },
+ { url = "https://files.pythonhosted.org/packages/18/98/16d5e7bc9ec715fa9668731d0cf97f6b032724e61696e2db3d47aeb89214/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12", size = 384875, upload-time = "2025-07-01T15:55:20.399Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/13/aa5e2b1ec5ab0e86a5c464d53514c0467bec6ba2507027d35fc81818358e/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20", size = 399993, upload-time = "2025-07-01T15:55:21.729Z" },
+ { url = "https://files.pythonhosted.org/packages/17/03/8021810b0e97923abdbab6474c8b77c69bcb4b2c58330777df9ff69dc559/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331", size = 516683, upload-time = "2025-07-01T15:55:22.918Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/b1/da8e61c87c2f3d836954239fdbbfb477bb7b54d74974d8f6fcb34342d166/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f", size = 408825, upload-time = "2025-07-01T15:55:24.207Z" },
+ { url = "https://files.pythonhosted.org/packages/38/bc/1fc173edaaa0e52c94b02a655db20697cb5fa954ad5a8e15a2c784c5cbdd/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246", size = 387292, upload-time = "2025-07-01T15:55:25.554Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/eb/3a9bb4bd90867d21916f253caf4f0d0be7098671b6715ad1cead9fe7bab9/rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387", size = 420435, upload-time = "2025-07-01T15:55:27.798Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/16/e066dcdb56f5632713445271a3f8d3d0b426d51ae9c0cca387799df58b02/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af", size = 562410, upload-time = "2025-07-01T15:55:29.057Z" },
+ { url = "https://files.pythonhosted.org/packages/60/22/ddbdec7eb82a0dc2e455be44c97c71c232983e21349836ce9f272e8a3c29/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33", size = 590724, upload-time = "2025-07-01T15:55:30.719Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/b4/95744085e65b7187d83f2fcb0bef70716a1ea0a9e5d8f7f39a86e5d83424/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953", size = 558285, upload-time = "2025-07-01T15:55:31.981Z" },
+ { url = "https://files.pythonhosted.org/packages/37/37/6309a75e464d1da2559446f9c811aa4d16343cebe3dbb73701e63f760caa/rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9", size = 223459, upload-time = "2025-07-01T15:55:33.312Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/6f/8e9c11214c46098b1d1391b7e02b70bb689ab963db3b19540cba17315291/rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37", size = 236083, upload-time = "2025-07-01T15:55:34.933Z" },
+ { url = "https://files.pythonhosted.org/packages/47/af/9c4638994dd623d51c39892edd9d08e8be8220a4b7e874fa02c2d6e91955/rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867", size = 223291, upload-time = "2025-07-01T15:55:36.202Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/db/669a241144460474aab03e254326b32c42def83eb23458a10d163cb9b5ce/rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da", size = 361445, upload-time = "2025-07-01T15:55:37.483Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/2d/133f61cc5807c6c2fd086a46df0eb8f63a23f5df8306ff9f6d0fd168fecc/rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7", size = 347206, upload-time = "2025-07-01T15:55:38.828Z" },
+ { url = "https://files.pythonhosted.org/packages/05/bf/0e8fb4c05f70273469eecf82f6ccf37248558526a45321644826555db31b/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad", size = 380330, upload-time = "2025-07-01T15:55:40.175Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/a8/060d24185d8b24d3923322f8d0ede16df4ade226a74e747b8c7c978e3dd3/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d", size = 392254, upload-time = "2025-07-01T15:55:42.015Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/7b/7c2e8a9ee3e6bc0bae26bf29f5219955ca2fbb761dca996a83f5d2f773fe/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca", size = 516094, upload-time = "2025-07-01T15:55:43.603Z" },
+ { url = "https://files.pythonhosted.org/packages/75/d6/f61cafbed8ba1499b9af9f1777a2a199cd888f74a96133d8833ce5eaa9c5/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19", size = 402889, upload-time = "2025-07-01T15:55:45.275Z" },
+ { url = "https://files.pythonhosted.org/packages/92/19/c8ac0a8a8df2dd30cdec27f69298a5c13e9029500d6d76718130f5e5be10/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8", size = 384301, upload-time = "2025-07-01T15:55:47.098Z" },
+ { url = "https://files.pythonhosted.org/packages/41/e1/6b1859898bc292a9ce5776016c7312b672da00e25cec74d7beced1027286/rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b", size = 412891, upload-time = "2025-07-01T15:55:48.412Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/b9/ceb39af29913c07966a61367b3c08b4f71fad841e32c6b59a129d5974698/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a", size = 557044, upload-time = "2025-07-01T15:55:49.816Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/27/35637b98380731a521f8ec4f3fd94e477964f04f6b2f8f7af8a2d889a4af/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170", size = 585774, upload-time = "2025-07-01T15:55:51.192Z" },
+ { url = "https://files.pythonhosted.org/packages/52/d9/3f0f105420fecd18551b678c9a6ce60bd23986098b252a56d35781b3e7e9/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e", size = 554886, upload-time = "2025-07-01T15:55:52.541Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/c5/347c056a90dc8dd9bc240a08c527315008e1b5042e7a4cf4ac027be9d38a/rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f", size = 219027, upload-time = "2025-07-01T15:55:53.874Z" },
+ { url = "https://files.pythonhosted.org/packages/75/04/5302cea1aa26d886d34cadbf2dc77d90d7737e576c0065f357b96dc7a1a6/rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7", size = 232821, upload-time = "2025-07-01T15:55:55.167Z" },
]
[[package]]
name = "selenium"
-version = "4.27.1"
+version = "4.34.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "certifi" },
@@ -1738,105 +2020,105 @@ dependencies = [
{ name = "urllib3", extra = ["socks"] },
{ name = "websocket-client" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/44/8c/62c47c91072aa03af1c3b7d7f1c59b987db41c9fec0f158fb03a0da51aa6/selenium-4.27.1.tar.gz", hash = "sha256:5296c425a75ff1b44d0d5199042b36a6d1ef76c04fb775b97b40be739a9caae2", size = 973526 }
+sdist = { url = "https://files.pythonhosted.org/packages/b0/e6/646d0a41fb9a64572043c3de80be2a4941f2aeb578f273cf3dae54fc9437/selenium-4.34.2.tar.gz", hash = "sha256:0f6d147595f08c6d4bad87b34c39dcacb4650aedc78e3956c8eac1bb752a3854", size = 896309, upload-time = "2025-07-08T12:54:54.785Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a6/1e/5f1a5dd2a28528c4b3ec6e076b58e4c035810c805328f9936123283ca14e/selenium-4.27.1-py3-none-any.whl", hash = "sha256:b89b1f62b5cfe8025868556fe82360d6b649d464f75d2655cb966c8f8447ea18", size = 9707007 },
+ { url = "https://files.pythonhosted.org/packages/f3/2b/dee1c58bde0a747b2d75fa7282a190885a726fe95b18b8ce1dc52f9c0983/selenium-4.34.2-py3-none-any.whl", hash = "sha256:ea208f7db9e3b26e58c4a817ea9dd29454576d6ea55937d754df079ad588e1ad", size = 9410676, upload-time = "2025-07-08T12:54:48.725Z" },
]
[[package]]
name = "send2trash"
version = "1.8.3"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/fd/3a/aec9b02217bb79b87bbc1a21bc6abc51e3d5dcf65c30487ac96c0908c722/Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf", size = 17394 }
+sdist = { url = "https://files.pythonhosted.org/packages/fd/3a/aec9b02217bb79b87bbc1a21bc6abc51e3d5dcf65c30487ac96c0908c722/Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf", size = 17394, upload-time = "2024-04-07T00:01:09.267Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", size = 18072 },
+ { url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", size = 18072, upload-time = "2024-04-07T00:01:07.438Z" },
]
[[package]]
name = "setuptools"
-version = "75.7.0"
+version = "80.9.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ac/57/e6f0bde5a2c333a32fbcce201f906c1fd0b3a7144138712a5e9d9598c5ec/setuptools-75.7.0.tar.gz", hash = "sha256:886ff7b16cd342f1d1defc16fc98c9ce3fde69e087a4e1983d7ab634e5f41f4f", size = 1338616 }
+sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/4e/6e/abdfaaf5c294c553e7a81cf5d801fbb4f53f5c5b6646de651f92a2667547/setuptools-75.7.0-py3-none-any.whl", hash = "sha256:84fb203f278ebcf5cd08f97d3fb96d3fbed4b629d500b29ad60d11e00769b183", size = 1224467 },
+ { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" },
]
[[package]]
name = "six"
version = "1.17.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 }
+sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 },
+ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
]
[[package]]
name = "sniffio"
version = "1.3.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 },
+ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
]
[[package]]
name = "sortedcontainers"
version = "2.4.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594 }
+sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575 },
+ { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" },
]
[[package]]
name = "soupsieve"
-version = "2.6"
+version = "2.7"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 }
+sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload-time = "2025-04-20T18:50:08.518Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 },
+ { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload-time = "2025-04-20T18:50:07.196Z" },
]
[[package]]
name = "sqlalchemy"
-version = "2.0.36"
+version = "2.0.42"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "greenlet", marker = "(python_full_version < '3.13' and platform_machine == 'AMD64') or (python_full_version < '3.13' and platform_machine == 'WIN32') or (python_full_version < '3.13' and platform_machine == 'aarch64') or (python_full_version < '3.13' and platform_machine == 'amd64') or (python_full_version < '3.13' and platform_machine == 'ppc64le') or (python_full_version < '3.13' and platform_machine == 'win32') or (python_full_version < '3.13' and platform_machine == 'x86_64')" },
+ { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" },
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/50/65/9cbc9c4c3287bed2499e05033e207473504dc4df999ce49385fb1f8b058a/sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5", size = 9574485 }
+sdist = { url = "https://files.pythonhosted.org/packages/5a/03/a0af991e3a43174d6b83fca4fb399745abceddd1171bdabae48ce877ff47/sqlalchemy-2.0.42.tar.gz", hash = "sha256:160bedd8a5c28765bd5be4dec2d881e109e33b34922e50a3b881a7681773ac5f", size = 9749972, upload-time = "2025-07-29T12:48:09.323Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b8/bf/005dc47f0e57556e14512d5542f3f183b94fde46e15ff1588ec58ca89555/SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4", size = 2092378 },
- { url = "https://files.pythonhosted.org/packages/94/65/f109d5720779a08e6e324ec89a744f5f92c48bd8005edc814bf72fbb24e5/SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855", size = 2082778 },
- { url = "https://files.pythonhosted.org/packages/60/f6/d9aa8c49c44f9b8c9b9dada1f12fa78df3d4c42aa2de437164b83ee1123c/SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53", size = 3232191 },
- { url = "https://files.pythonhosted.org/packages/8a/ab/81d4514527c068670cb1d7ab62a81a185df53a7c379bd2a5636e83d09ede/SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a", size = 3243044 },
- { url = "https://files.pythonhosted.org/packages/35/b4/f87c014ecf5167dc669199cafdb20a7358ff4b1d49ce3622cc48571f811c/SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686", size = 3178511 },
- { url = "https://files.pythonhosted.org/packages/ea/09/badfc9293bc3ccba6ede05e5f2b44a760aa47d84da1fc5a326e963e3d4d9/SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588", size = 3205147 },
- { url = "https://files.pythonhosted.org/packages/c8/60/70e681de02a13c4b27979b7b78da3058c49bacc9858c89ba672e030f03f2/SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e", size = 2062709 },
- { url = "https://files.pythonhosted.org/packages/b7/ed/f6cd9395e41bfe47dd253d74d2dfc3cab34980d4e20c8878cb1117306085/SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5", size = 2088433 },
- { url = "https://files.pythonhosted.org/packages/78/5c/236398ae3678b3237726819b484f15f5c038a9549da01703a771f05a00d6/SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef", size = 2087651 },
- { url = "https://files.pythonhosted.org/packages/a8/14/55c47420c0d23fb67a35af8be4719199b81c59f3084c28d131a7767b0b0b/SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8", size = 2078132 },
- { url = "https://files.pythonhosted.org/packages/3d/97/1e843b36abff8c4a7aa2e37f9bea364f90d021754c2de94d792c2d91405b/SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b", size = 3164559 },
- { url = "https://files.pythonhosted.org/packages/7b/c5/07f18a897b997f6d6b234fab2bf31dccf66d5d16a79fe329aefc95cd7461/SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2", size = 3177897 },
- { url = "https://files.pythonhosted.org/packages/b3/cd/e16f3cbefd82b5c40b33732da634ec67a5f33b587744c7ab41699789d492/SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf", size = 3111289 },
- { url = "https://files.pythonhosted.org/packages/15/85/5b8a3b0bc29c9928aa62b5c91fcc8335f57c1de0a6343873b5f372e3672b/SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c", size = 3139491 },
- { url = "https://files.pythonhosted.org/packages/a1/95/81babb6089938680dfe2cd3f88cd3fd39cccd1543b7cb603b21ad881bff1/SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436", size = 2060439 },
- { url = "https://files.pythonhosted.org/packages/c1/ce/5f7428df55660d6879d0522adc73a3364970b5ef33ec17fa125c5dbcac1d/SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88", size = 2084574 },
- { url = "https://files.pythonhosted.org/packages/b8/49/21633706dd6feb14cd3f7935fc00b60870ea057686035e1a99ae6d9d9d53/SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e", size = 1883787 },
+ { url = "https://files.pythonhosted.org/packages/61/66/ac31a9821fc70a7376321fb2c70fdd7eadbc06dadf66ee216a22a41d6058/sqlalchemy-2.0.42-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:09637a0872689d3eb71c41e249c6f422e3e18bbd05b4cd258193cfc7a9a50da2", size = 2132203, upload-time = "2025-07-29T13:29:19.291Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/ba/fd943172e017f955d7a8b3a94695265b7114efe4854feaa01f057e8f5293/sqlalchemy-2.0.42-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3cb3ec67cc08bea54e06b569398ae21623534a7b1b23c258883a7c696ae10df", size = 2120373, upload-time = "2025-07-29T13:29:21.049Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/a2/b5f7d233d063ffadf7e9fff3898b42657ba154a5bec95a96f44cba7f818b/sqlalchemy-2.0.42-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87e6a5ef6f9d8daeb2ce5918bf5fddecc11cae6a7d7a671fcc4616c47635e01", size = 3317685, upload-time = "2025-07-29T13:26:40.837Z" },
+ { url = "https://files.pythonhosted.org/packages/86/00/fcd8daab13a9119d41f3e485a101c29f5d2085bda459154ba354c616bf4e/sqlalchemy-2.0.42-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b718011a9d66c0d2f78e1997755cd965f3414563b31867475e9bc6efdc2281d", size = 3326967, upload-time = "2025-07-29T13:22:31.009Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/85/e622a273d648d39d6771157961956991a6d760e323e273d15e9704c30ccc/sqlalchemy-2.0.42-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:16d9b544873fe6486dddbb859501a07d89f77c61d29060bb87d0faf7519b6a4d", size = 3255331, upload-time = "2025-07-29T13:26:42.579Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/a0/2c2338b592c7b0a61feffd005378c084b4c01fabaf1ed5f655ab7bd446f0/sqlalchemy-2.0.42-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21bfdf57abf72fa89b97dd74d3187caa3172a78c125f2144764a73970810c4ee", size = 3291791, upload-time = "2025-07-29T13:22:32.454Z" },
+ { url = "https://files.pythonhosted.org/packages/41/19/b8a2907972a78285fdce4c880ecaab3c5067eb726882ca6347f7a4bf64f6/sqlalchemy-2.0.42-cp312-cp312-win32.whl", hash = "sha256:78b46555b730a24901ceb4cb901c6b45c9407f8875209ed3c5d6bcd0390a6ed1", size = 2096180, upload-time = "2025-07-29T13:16:08.952Z" },
+ { url = "https://files.pythonhosted.org/packages/48/1f/67a78f3dfd08a2ed1c7be820fe7775944f5126080b5027cc859084f8e223/sqlalchemy-2.0.42-cp312-cp312-win_amd64.whl", hash = "sha256:4c94447a016f36c4da80072e6c6964713b0af3c8019e9c4daadf21f61b81ab53", size = 2123533, upload-time = "2025-07-29T13:16:11.705Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/7e/25d8c28b86730c9fb0e09156f601d7a96d1c634043bf8ba36513eb78887b/sqlalchemy-2.0.42-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:941804f55c7d507334da38133268e3f6e5b0340d584ba0f277dd884197f4ae8c", size = 2127905, upload-time = "2025-07-29T13:29:22.249Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/a1/9d8c93434d1d983880d976400fcb7895a79576bd94dca61c3b7b90b1ed0d/sqlalchemy-2.0.42-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:95d3d06a968a760ce2aa6a5889fefcbdd53ca935735e0768e1db046ec08cbf01", size = 2115726, upload-time = "2025-07-29T13:29:23.496Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/cc/d33646fcc24c87cc4e30a03556b611a4e7bcfa69a4c935bffb923e3c89f4/sqlalchemy-2.0.42-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cf10396a8a700a0f38ccd220d940be529c8f64435c5d5b29375acab9267a6c9", size = 3246007, upload-time = "2025-07-29T13:26:44.166Z" },
+ { url = "https://files.pythonhosted.org/packages/67/08/4e6c533d4c7f5e7c4cbb6fe8a2c4e813202a40f05700d4009a44ec6e236d/sqlalchemy-2.0.42-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cae6c2b05326d7c2c7c0519f323f90e0fb9e8afa783c6a05bb9ee92a90d0f04", size = 3250919, upload-time = "2025-07-29T13:22:33.74Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/82/f680e9a636d217aece1b9a8030d18ad2b59b5e216e0c94e03ad86b344af3/sqlalchemy-2.0.42-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f50f7b20677b23cfb35b6afcd8372b2feb348a38e3033f6447ee0704540be894", size = 3180546, upload-time = "2025-07-29T13:26:45.648Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/a2/8c8f6325f153894afa3775584c429cc936353fb1db26eddb60a549d0ff4b/sqlalchemy-2.0.42-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d88a1c0d66d24e229e3938e1ef16ebdbd2bf4ced93af6eff55225f7465cf350", size = 3216683, upload-time = "2025-07-29T13:22:34.977Z" },
+ { url = "https://files.pythonhosted.org/packages/39/44/3a451d7fa4482a8ffdf364e803ddc2cfcafc1c4635fb366f169ecc2c3b11/sqlalchemy-2.0.42-cp313-cp313-win32.whl", hash = "sha256:45c842c94c9ad546c72225a0c0d1ae8ef3f7c212484be3d429715a062970e87f", size = 2093990, upload-time = "2025-07-29T13:16:13.036Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/9e/9bce34f67aea0251c8ac104f7bdb2229d58fb2e86a4ad8807999c4bee34b/sqlalchemy-2.0.42-cp313-cp313-win_amd64.whl", hash = "sha256:eb9905f7f1e49fd57a7ed6269bc567fcbbdac9feadff20ad6bd7707266a91577", size = 2120473, upload-time = "2025-07-29T13:16:14.502Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/55/ba2546ab09a6adebc521bf3974440dc1d8c06ed342cceb30ed62a8858835/sqlalchemy-2.0.42-py3-none-any.whl", hash = "sha256:defcdff7e661f0043daa381832af65d616e060ddb54d3fe4476f51df7eaa1835", size = 1922072, upload-time = "2025-07-29T13:09:17.061Z" },
]
[[package]]
name = "sqlmodel"
-version = "0.0.22"
+version = "0.0.24"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pydantic" },
{ name = "sqlalchemy" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/b5/39/8641040ab0d5e1d8a1c2325ae89a01ae659fc96c61a43d158fb71c9a0bf0/sqlmodel-0.0.22.tar.gz", hash = "sha256:7d37c882a30c43464d143e35e9ecaf945d88035e20117bf5ec2834a23cbe505e", size = 116392 }
+sdist = { url = "https://files.pythonhosted.org/packages/86/4b/c2ad0496f5bdc6073d9b4cef52be9c04f2b37a5773441cc6600b1857648b/sqlmodel-0.0.24.tar.gz", hash = "sha256:cc5c7613c1a5533c9c7867e1aab2fd489a76c9e8a061984da11b4e613c182423", size = 116780, upload-time = "2025-03-07T05:43:32.887Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/dd/b1/3af5104b716c420e40a6ea1b09886cae3a1b9f4538343875f637755cae5b/sqlmodel-0.0.22-py3-none-any.whl", hash = "sha256:a1ed13e28a1f4057cbf4ff6cdb4fc09e85702621d3259ba17b3c230bfb2f941b", size = 28276 },
+ { url = "https://files.pythonhosted.org/packages/16/91/484cd2d05569892b7fef7f5ceab3bc89fb0f8a8c0cde1030d383dbc5449c/sqlmodel-0.0.24-py3-none-any.whl", hash = "sha256:6778852f09370908985b667d6a3ab92910d0d5ec88adcaf23dbc242715ff7193", size = 28622, upload-time = "2025-03-07T05:43:30.37Z" },
]
[[package]]
@@ -1848,9 +2130,9 @@ dependencies = [
{ name = "executing" },
{ name = "pure-eval" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 }
+sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 },
+ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" },
]
[[package]]
@@ -1862,9 +2144,9 @@ dependencies = [
{ name = "pywinpty", marker = "os_name == 'nt'" },
{ name = "tornado" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701 }
+sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154 },
+ { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload-time = "2024-03-12T14:34:36.569Z" },
]
[[package]]
@@ -1874,56 +2156,57 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "webencodings" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085 }
+sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 },
+ { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" },
]
[[package]]
name = "tomli"
version = "2.2.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 },
- { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 },
- { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 },
- { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 },
- { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 },
- { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 },
- { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 },
- { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 },
- { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 },
- { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 },
- { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 },
- { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 },
- { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 },
- { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 },
- { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 },
- { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 },
- { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 },
- { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 },
- { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 },
- { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 },
- { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 },
+sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" },
+ { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" },
+ { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" },
+ { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" },
+ { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" },
+ { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" },
+ { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload-time = "2024-11-27T22:38:32.837Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload-time = "2024-11-27T22:38:34.455Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" },
]
[[package]]
name = "tornado"
-version = "6.4.2"
+version = "6.5.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 }
+sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934, upload-time = "2025-05-22T18:15:38.788Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 },
- { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 },
- { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 },
- { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 },
- { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/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", size = 437173 },
- { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 },
- { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 },
- { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 },
- { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 },
- { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 },
+ { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948, upload-time = "2025-05-22T18:15:20.862Z" },
+ { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112, upload-time = "2025-05-22T18:15:22.591Z" },
+ { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672, upload-time = "2025-05-22T18:15:24.027Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019, upload-time = "2025-05-22T18:15:25.735Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252, upload-time = "2025-05-22T18:15:27.499Z" },
+ { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930, upload-time = "2025-05-22T18:15:29.299Z" },
+ { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351, upload-time = "2025-05-22T18:15:31.038Z" },
+ { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328, upload-time = "2025-05-22T18:15:32.426Z" },
+ { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396, upload-time = "2025-05-22T18:15:34.205Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840, upload-time = "2025-05-22T18:15:36.1Z" },
+ { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload-time = "2025-05-22T18:15:37.433Z" },
]
[[package]]
@@ -1933,23 +2216,23 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 }
+sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 },
+ { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" },
]
[[package]]
name = "traitlets"
version = "5.14.3"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 }
+sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 },
+ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" },
]
[[package]]
name = "trio"
-version = "0.27.0"
+version = "0.30.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "attrs" },
@@ -1959,67 +2242,91 @@ dependencies = [
{ name = "sniffio" },
{ name = "sortedcontainers" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/17/d1/a83dee5be404da7afe5a71783a33b8907bacb935a6dc8c69ab785e4a3eed/trio-0.27.0.tar.gz", hash = "sha256:1dcc95ab1726b2da054afea8fd761af74bad79bd52381b84eae408e983c76831", size = 568064 }
+sdist = { url = "https://files.pythonhosted.org/packages/01/c1/68d582b4d3a1c1f8118e18042464bb12a7c1b75d64d75111b297687041e3/trio-0.30.0.tar.gz", hash = "sha256:0781c857c0c81f8f51e0089929a26b5bb63d57f927728a5586f7e36171f064df", size = 593776, upload-time = "2025-04-21T00:48:19.507Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/3c/83/ec3196c360afffbc5b342ead48d1eb7393dd74fa70bca75d33905a86f211/trio-0.27.0-py3-none-any.whl", hash = "sha256:68eabbcf8f457d925df62da780eff15ff5dc68fd6b367e2dde59f7aaf2a0b884", size = 481734 },
+ { url = "https://files.pythonhosted.org/packages/69/8e/3f6dfda475ecd940e786defe6df6c500734e686c9cd0a0f8ef6821e9b2f2/trio-0.30.0-py3-none-any.whl", hash = "sha256:3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5", size = 499194, upload-time = "2025-04-21T00:48:17.167Z" },
]
[[package]]
name = "trio-websocket"
-version = "0.11.1"
+version = "0.12.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
+ { name = "outcome" },
{ name = "trio" },
{ name = "wsproto" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/dd/36/abad2385853077424a11b818d9fd8350d249d9e31d583cb9c11cd4c85eda/trio-websocket-0.11.1.tar.gz", hash = "sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f", size = 26511 }
+sdist = { url = "https://files.pythonhosted.org/packages/d1/3c/8b4358e81f2f2cfe71b66a267f023a91db20a817b9425dd964873796980a/trio_websocket-0.12.2.tar.gz", hash = "sha256:22c72c436f3d1e264d0910a3951934798dcc5b00ae56fc4ee079d46c7cf20fae", size = 33549, upload-time = "2025-02-25T05:16:58.947Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/48/be/a9ae5f50cad5b6f85bd2574c2c923730098530096e170c1ce7452394d7aa/trio_websocket-0.11.1-py3-none-any.whl", hash = "sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638", size = 17408 },
+ { url = "https://files.pythonhosted.org/packages/c7/19/eb640a397bba49ba49ef9dbe2e7e5c04202ba045b6ce2ec36e9cadc51e04/trio_websocket-0.12.2-py3-none-any.whl", hash = "sha256:df605665f1db533f4a386c94525870851096a223adcb97f72a07e8b4beba45b6", size = 21221, upload-time = "2025-02-25T05:16:57.545Z" },
]
[[package]]
name = "types-python-dateutil"
-version = "2.9.0.20241206"
+version = "2.9.0.20250708"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/a9/60/47d92293d9bc521cd2301e423a358abfac0ad409b3a1606d8fbae1321961/types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb", size = 13802 }
+sdist = { url = "https://files.pythonhosted.org/packages/c9/95/6bdde7607da2e1e99ec1c1672a759d42f26644bbacf939916e086db34870/types_python_dateutil-2.9.0.20250708.tar.gz", hash = "sha256:ccdbd75dab2d6c9696c350579f34cffe2c281e4c5f27a585b2a2438dd1d5c8ab", size = 15834, upload-time = "2025-07-08T03:14:03.382Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/0f/b3/ca41df24db5eb99b00d97f89d7674a90cb6b3134c52fb8121b6d8d30f15c/types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53", size = 14384 },
+ { url = "https://files.pythonhosted.org/packages/72/52/43e70a8e57fefb172c22a21000b03ebcc15e47e97f5cb8495b9c2832efb4/types_python_dateutil-2.9.0.20250708-py3-none-any.whl", hash = "sha256:4d6d0cc1cc4d24a2dc3816024e502564094497b713f7befda4d5bc7a8e3fd21f", size = 17724, upload-time = "2025-07-08T03:14:02.593Z" },
]
[[package]]
name = "typing-extensions"
-version = "4.12.2"
+version = "4.14.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 }
+sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 },
+ { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" },
+]
+
+[[package]]
+name = "typing-inspection"
+version = "0.4.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" },
]
[[package]]
name = "tzdata"
-version = "2024.2"
+version = "2025.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e1/34/943888654477a574a86a98e9896bae89c7aa15078ec29f490fef2f1e5384/tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc", size = 193282 }
+sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd", size = 346586 },
+ { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" },
+]
+
+[[package]]
+name = "undetected-chromedriver"
+version = "3.5.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "requests" },
+ { name = "selenium" },
+ { name = "websockets" },
]
+sdist = { url = "https://files.pythonhosted.org/packages/1f/98/7ab46625ce2317756e4e857fe6ac24b6378c3e8f477da26c95226ed8ccb7/undetected-chromedriver-3.5.5.tar.gz", hash = "sha256:9f945e1435005247abe17de316bcfda85b284a4177fd5f25167c78ced33b65ec", size = 65409, upload-time = "2024-02-17T17:18:36.855Z" }
[[package]]
name = "uri-template"
version = "1.3.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678 }
+sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678, upload-time = "2023-06-21T01:49:05.374Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140 },
+ { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140, upload-time = "2023-06-21T01:49:03.467Z" },
]
[[package]]
name = "urllib3"
-version = "2.2.3"
+version = "2.5.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 }
+sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 },
+ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
]
[package.optional-dependencies]
@@ -2029,15 +2336,15 @@ socks = [
[[package]]
name = "usaddress"
-version = "0.5.11"
+version = "0.5.15"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "probableparsing" },
{ name = "python-crfsuite" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/9e/73/80d6a137655c431404d3179ba104a9807f339bbb55ca18a156d6840b09ed/usaddress-0.5.11.tar.gz", hash = "sha256:eec4c473b94e2a29350ee335f18bac7fe4fa698e08271211dad5fed63bdd3e60", size = 911835 }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/4c/5818a789c29cd1d8b37b875a2574b2dfdfc8efd62877afefe3e412da9ed1/usaddress-0.5.15.tar.gz", hash = "sha256:4afa8af051298ba135e7701bbb18817a6fcb154b815a71542880b1bd928140da", size = 914045, upload-time = "2025-07-10T14:48:02.637Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/3b/41/884d67e033e238788c876c608dc2ec195e2cba313d34016b58400763269f/usaddress-0.5.11-py3-none-any.whl", hash = "sha256:a745be0ff0c525d64463f19f2ec798bb1679a9bb6864b0d9a8b9054023f683b5", size = 67919 },
+ { url = "https://files.pythonhosted.org/packages/63/69/431243d77b744e02dbf298f9629d77d0ac33af457783c0a18ffb86a00d41/usaddress-0.5.15-py3-none-any.whl", hash = "sha256:8013f83279c14fb77f5728f7645b60dfb1f918f69036ace0d7d8aaf90ea0bcdb", size = 69215, upload-time = "2025-07-10T14:48:01.012Z" },
]
[[package]]
@@ -2050,52 +2357,93 @@ dependencies = [
{ name = "yaml-config" },
]
wheels = [
- { url = "https://files.pythonhosted.org/packages/6c/94/c27759db9c3d838c32c601e1fa28692e6bffff1434c748d34c05ff90597a/usaddress_scourgify-0.6.0-py3-none-any.whl", hash = "sha256:2bd1e2136ac70ba2fe412482dcd6cfad40f5298dd49685e105b68fd89f881999", size = 27210 },
+ { url = "https://files.pythonhosted.org/packages/6c/94/c27759db9c3d838c32c601e1fa28692e6bffff1434c748d34c05ff90597a/usaddress_scourgify-0.6.0-py3-none-any.whl", hash = "sha256:2bd1e2136ac70ba2fe412482dcd6cfad40f5298dd49685e105b68fd89f881999", size = 27210, upload-time = "2023-12-14T22:42:11.868Z" },
]
[[package]]
name = "wcwidth"
version = "0.2.13"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 }
+sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload-time = "2024-01-06T02:10:57.829Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 },
+ { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload-time = "2024-01-06T02:10:55.763Z" },
+]
+
+[[package]]
+name = "web-scrape-utils"
+version = "0.1.0"
+source = { git = "https://github.com/jreakin/jre-web-scrape-utils.git?branch=jan25-web-scrape#a707c3eadb4aad48e2c2c3ddbe3c89aaf8402ee2" }
+dependencies = [
+ { name = "icecream" },
+ { name = "selenium" },
+ { name = "undetected-chromedriver" },
]
[[package]]
name = "webcolors"
version = "24.11.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/7b/29/061ec845fb58521848f3739e466efd8250b4b7b98c1b6c5bf4d40b419b7e/webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6", size = 45064 }
+sdist = { url = "https://files.pythonhosted.org/packages/7b/29/061ec845fb58521848f3739e466efd8250b4b7b98c1b6c5bf4d40b419b7e/webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6", size = 45064, upload-time = "2024-11-11T07:43:24.224Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", size = 14934 },
+ { url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", size = 14934, upload-time = "2024-11-11T07:43:22.529Z" },
]
[[package]]
name = "webencodings"
version = "0.5.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 }
+sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 },
+ { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" },
]
[[package]]
name = "websocket-client"
version = "1.8.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da", size = 54648 }
+sdist = { url = "https://files.pythonhosted.org/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da", size = 54648, upload-time = "2024-04-23T22:16:16.976Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826, upload-time = "2024-04-23T22:16:14.422Z" },
+]
+
+[[package]]
+name = "websockets"
+version = "15.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826 },
+ { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload-time = "2025-03-05T20:02:18.832Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload-time = "2025-03-05T20:02:22.286Z" },
+ { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload-time = "2025-03-05T20:02:24.368Z" },
+ { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload-time = "2025-03-05T20:02:25.669Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload-time = "2025-03-05T20:02:26.99Z" },
+ { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload-time = "2025-03-05T20:02:30.291Z" },
+ { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload-time = "2025-03-05T20:02:31.634Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload-time = "2025-03-05T20:02:33.017Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload-time = "2025-03-05T20:02:34.498Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" },
+ { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" },
+ { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" },
+ { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" },
+ { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" },
+ { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" },
]
[[package]]
name = "widgetsnbextension"
-version = "4.0.13"
+version = "4.0.14"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/56/fc/238c424fd7f4ebb25f8b1da9a934a3ad7c848286732ae04263661eb0fc03/widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6", size = 1164730 }
+sdist = { url = "https://files.pythonhosted.org/packages/41/53/2e0253c5efd69c9656b1843892052a31c36d37ad42812b5da45c62191f7e/widgetsnbextension-4.0.14.tar.gz", hash = "sha256:a3629b04e3edb893212df862038c7232f62973373869db5084aed739b437b5af", size = 1097428, upload-time = "2025-04-10T13:01:25.628Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71", size = 2335872 },
+ { url = "https://files.pythonhosted.org/packages/ca/51/5447876806d1088a0f8f71e16542bf350918128d0a69437df26047c8e46f/widgetsnbextension-4.0.14-py3-none-any.whl", hash = "sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575", size = 2196503, upload-time = "2025-04-10T13:01:23.086Z" },
]
[[package]]
@@ -2105,9 +2453,9 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "h11" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/c9/4a/44d3c295350d776427904d73c189e10aeae66d7f555bb2feee16d1e4ba5a/wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", size = 53425 }
+sdist = { url = "https://files.pythonhosted.org/packages/c9/4a/44d3c295350d776427904d73c189e10aeae66d7f555bb2feee16d1e4ba5a/wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", size = 53425, upload-time = "2022-08-23T19:58:21.447Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226 },
+ { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226, upload-time = "2022-08-23T19:58:19.96Z" },
]
[[package]]
@@ -2117,7 +2465,7 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pyyaml" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/ae/d9/001bf4da6c05edbce0aabc9e19a95841c5ac7c1749234d6b1ec96a3b7563/yaml-config-0.1.5.tar.gz", hash = "sha256:5924c92d8e7c49fa9ab2ef8bb3122794b261f217b14e69698a481d4e3ba535b5", size = 7125 }
+sdist = { url = "https://files.pythonhosted.org/packages/ae/d9/001bf4da6c05edbce0aabc9e19a95841c5ac7c1749234d6b1ec96a3b7563/yaml-config-0.1.5.tar.gz", hash = "sha256:5924c92d8e7c49fa9ab2ef8bb3122794b261f217b14e69698a481d4e3ba535b5", size = 7125, upload-time = "2020-06-22T19:59:37.21Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/20/2f/b3ea915cfe22b8388b07d2f712c5f9a9687829064c230cfb75fe962a9472/yaml_config-0.1.5-py2.py3-none-any.whl", hash = "sha256:8d30a65eab4eb303af252350375c75fbae179854d47e26327c7ae0a9177f29be", size = 9509 },
+ { url = "https://files.pythonhosted.org/packages/20/2f/b3ea915cfe22b8388b07d2f712c5f9a9687829064c230cfb75fe962a9472/yaml_config-0.1.5-py2.py3-none-any.whl", hash = "sha256:8d30a65eab4eb303af252350375c75fbae179854d47e26327c7ae0a9177f29be", size = 9509, upload-time = "2020-06-22T19:59:34.058Z" },
]