From 3053b56bc583a4a35cde2587b45c6dddd75aafb9 Mon Sep 17 00:00:00 2001 From: Peter Staar Date: Wed, 12 Feb 2025 12:48:08 +0100 Subject: [PATCH 01/81] correct mpy Signed-off-by: Peter Staar --- docling_eval/benchmarks/cvat_annotation/create.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docling_eval/benchmarks/cvat_annotation/create.py b/docling_eval/benchmarks/cvat_annotation/create.py index 4f7efcd8..20d74ca7 100644 --- a/docling_eval/benchmarks/cvat_annotation/create.py +++ b/docling_eval/benchmarks/cvat_annotation/create.py @@ -5,7 +5,7 @@ import logging import os from pathlib import Path -from typing import Dict, Generator, List, Optional, Tuple, cast +from typing import Dict, Generator, List, Optional, Tuple, cast, Iterator import xmltodict # type: ignore[import] from datasets import Dataset, load_dataset @@ -818,7 +818,7 @@ def from_cvat_to_docling_document( annotation_filenames: List[Path], overview: AnnotationOverview, image_scale: float = 1.0, -) -> Generator[Tuple[str, AnnotatedImage, Optional[DoclingDocument]]]: +) -> Iterator[Tuple[str, AnnotatedImage, Optional[DoclingDocument]]]: for annot_file in annotation_filenames: From a7869e52a6b211b4cee6b83d065a6fa690797398 Mon Sep 17 00:00:00 2001 From: Peter Staar Date: Wed, 12 Feb 2025 12:48:49 +0100 Subject: [PATCH 02/81] reformatting Signed-off-by: Peter Staar --- docling_eval/benchmarks/cvat_annotation/create.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docling_eval/benchmarks/cvat_annotation/create.py b/docling_eval/benchmarks/cvat_annotation/create.py index 20d74ca7..c55cd611 100644 --- a/docling_eval/benchmarks/cvat_annotation/create.py +++ b/docling_eval/benchmarks/cvat_annotation/create.py @@ -5,7 +5,7 @@ import logging import os from pathlib import Path -from typing import Dict, Generator, List, Optional, Tuple, cast, Iterator +from typing import Dict, Generator, Iterator, List, Optional, Tuple, cast import xmltodict # type: ignore[import] from datasets import Dataset, load_dataset From 31f7a1a9bcef48313f2833064914b83f094730ac Mon Sep 17 00:00:00 2001 From: Peter Staar Date: Thu, 13 Feb 2025 05:31:25 +0100 Subject: [PATCH 03/81] adding the script to make an initial dataset from pdf's Signed-off-by: Peter Staar --- .../create_dataset_from_pdfs.py | 159 ++++++++++++++++++ .../benchmarks/cvat_annotation/preannotate.py | 62 +++---- docling_eval/benchmarks/utils.py | 2 +- 3 files changed, 191 insertions(+), 32 deletions(-) create mode 100644 docling_eval/benchmarks/cvat_annotation/create_dataset_from_pdfs.py diff --git a/docling_eval/benchmarks/cvat_annotation/create_dataset_from_pdfs.py b/docling_eval/benchmarks/cvat_annotation/create_dataset_from_pdfs.py new file mode 100644 index 00000000..ab32c86b --- /dev/null +++ b/docling_eval/benchmarks/cvat_annotation/create_dataset_from_pdfs.py @@ -0,0 +1,159 @@ +import argparse +import copy +import glob +import json +import logging +import os +from pathlib import Path +from typing import Dict, List, Tuple + +from datasets import Features +from datasets import Image as Features_Image +from datasets import Sequence, Value + +from docling_eval.docling.conversion import create_converter + +from docling_eval.benchmarks.constants import BenchMarkColumns + +from docling_eval.docling.utils import ( + crop_bounding_box, + docling_version, + extract_images, + from_pil_to_base64uri, + get_binary, + save_shard_to_disk, +) + +from docling_eval.benchmarks.utils import ( + add_pages_to_true_doc, + convert_html_table_into_docling_tabledata, + save_comparison_html, + save_comparison_html_with_clusters, + write_datasets_info, +) + + +def parse_args(): + parser = argparse.ArgumentParser( + description="Process input and output directories and a pre-annotation file." + ) + + parser.add_argument( + "-i", + "--input_dir", + required=True, + help="Path to directory with pdf's", + ) + parser.add_argument( + "-o", "--output_dir", required=True, help="Path to the output directory containing the dataset." + ) + parser.add_argument( + "-b", "--bucket-size", required=True, help="Numbers of documents in the bucket." + ) + + args = parser.parse_args() + + return (Path(args.input_dir), Path(args.output_dir), int(args.bucket_size)) + +def _write_datasets_info( + name: str, output_dir: Path, num_train_rows: int, num_test_rows: int +): + features = Features( + { + BenchMarkColumns.DOCLING_VERSION: Value("string"), + BenchMarkColumns.STATUS: Value("string"), + BenchMarkColumns.DOC_ID: Value("string"), + # BenchMarkColumns.DOC_PATH: Value("string"), + # BenchMarkColumns.DOC_HASH: Value("string"), + # BenchMarkColumns.GROUNDTRUTH: Value("string"), + # BenchMarkColumns.GROUNDTRUTH_PICTURES: Sequence(Features_Image()), + # BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES: Sequence(Features_Image()), + BenchMarkColumns.PREDICTION: Value("string"), + BenchMarkColumns.PREDICTION_PICTURES: Sequence(Features_Image()), + BenchMarkColumns.PREDICTION_PAGE_IMAGES: Sequence(Features_Image()), + BenchMarkColumns.ORIGINAL: Value("string"), + BenchMarkColumns.MIMETYPE: Value("string"), + } + ) + + schema = features.to_dict() + # print(json.dumps(schema, indent=2)) + + dataset_infos = { + "train": { + "description": f"Training split of {name}", + "schema": schema, + "num_rows": num_train_rows, + }, + "test": { + "description": f"Test split of {name}", + "schema": schema, + "num_rows": num_test_rows, + }, + } + + output_dir.mkdir(parents=True, exist_ok=True) + with open(output_dir / "dataset_infos.json", "w") as fw: + json.dump(dataset_infos, fw, indent=2) + + + +def main(): + + image_scale = 2 + artifacts_path = None + + source_dir, target_dir, bucket_size = parse_args() + + test_dir = target_dir / "test" + train_dir = target_dir / "train" + + for _ in [target_dir, test_dir, train_dir]: + if not os.path.exists(_): + os.makedirs(_) + + # Create Converter + doc_converter = create_converter( + page_image_scale=image_scale, artifacts_path=artifacts_path + ) + + pdfs = sorted(glob.glob(str(source_dir / "*.pdf"))) + + records = [] + for pdf_path in pdfs: + print(f"processing {pdf_path}") + + # Create the predicted Document + conv_results = doc_converter.convert(source=pdf_path, raises_on_error=True) + pred_doc = conv_results.document + + pred_doc, pred_pictures, pred_page_images = extract_images( + document=pred_doc, + pictures_column=BenchMarkColumns.PREDICTION_PICTURES.value, # pictures_column, + page_images_column=BenchMarkColumns.PREDICTION_PAGE_IMAGES.value, # page_images_column, + ) + + record = { + BenchMarkColumns.DOCLING_VERSION: docling_version(), + BenchMarkColumns.STATUS: str(conv_results.status), + BenchMarkColumns.DOC_ID: str(os.path.basename(pdf_path)), + BenchMarkColumns.PREDICTION: json.dumps(pred_doc.export_to_dict()), + BenchMarkColumns.PREDICTION_PAGE_IMAGES: pred_page_images, + BenchMarkColumns.PREDICTION_PICTURES: pred_pictures, + BenchMarkColumns.ORIGINAL: get_binary(pdf_path), + BenchMarkColumns.MIMETYPE: "application/pdf", + } + records.append(record) + + save_shard_to_disk(items=records, dataset_path=test_dir) + + _write_datasets_info( + name="PDFBench: end-to-end", + output_dir=target_dir, + num_train_rows=0, + num_test_rows=len(records), + ) + + +if __name__ == "__main__": + main() diff --git a/docling_eval/benchmarks/cvat_annotation/preannotate.py b/docling_eval/benchmarks/cvat_annotation/preannotate.py index 5f506bff..1d009749 100644 --- a/docling_eval/benchmarks/cvat_annotation/preannotate.py +++ b/docling_eval/benchmarks/cvat_annotation/preannotate.py @@ -409,44 +409,44 @@ def export_from_dataset_supplementary_files( return overview -# def parse_args(): -# parser = argparse.ArgumentParser( -# description="Process input and output directories and a pre-annotation file." -# ) +def parse_args(): + parser = argparse.ArgumentParser( + description="Process input and output directories and a pre-annotation file." + ) + + parser.add_argument( + "-i", + "--input_dir", + required=True, + help="Path to the input dataset directory with parquet files.", + ) + parser.add_argument( + "-o", "--output_dir", required=True, help="Path to the output directory." + ) + parser.add_argument( + "-b", "--bucket-size", required=True, help="Numbers of documents in the bucket." + ) -# parser.add_argument( -# "-i", -# "--input_dir", -# required=True, -# help="Path to the input dataset directory with parquet files.", -# ) -# parser.add_argument( -# "-o", "--output_dir", required=True, help="Path to the output directory." -# ) -# parser.add_argument( -# "-b", "--bucket-size", required=True, help="Numbers of documents in the bucket." -# ) + args = parser.parse_args() -# args = parser.parse_args() + return (Path(args.input_dir), Path(args.output_dir), int(args.bucket_size)) -# return (Path(args.input_dir), Path(args.output_dir), int(args.bucket_size)) +def main(): -# def main(): + source_dir, target_dir, bucket_size = parse_args() + + benchmark_dirs = BenchMarkDirs() + benchmark_dirs.set_up_directory_structure(source=source_dir, target=target_dir) -# source_dir, target_dir, bucket_size = parse_args() + create_cvat_project_properties(project_file=benchmark_dirs.project_desc_file) -# benchmark_dirs = BenchMarkDirs() -# benchmark_dirs.set_up_directory_structure(source=source_dir, target=target_dir) + overview = export_from_dataset_supplementary_files(benchmark_dirs) -# create_cvat_project_properties(project_file=benchmark_dirs.project_desc_file) + create_cvat_preannotation_file_for_single_page( + benchmark_dirs, overview, bucket_size=bucket_size + ) -# overview = export_from_dataset_supplementary_files(benchmark_dirs) -# create_cvat_preannotation_file_for_single_page( -# benchmark_dirs, overview, bucket_size=bucket_size -# ) - - -# if __name__ == "__main__": -# main() +if __name__ == "__main__": + main() diff --git a/docling_eval/benchmarks/utils.py b/docling_eval/benchmarks/utils.py index bbb86845..f0a87882 100644 --- a/docling_eval/benchmarks/utils.py +++ b/docling_eval/benchmarks/utils.py @@ -14,7 +14,7 @@ from docling.backend.docling_parse_v2_backend import DoclingParseV2DocumentBackend from docling.datamodel.base_models import BoundingBox, Cluster, InputFormat, Page from docling.datamodel.document import InputDocument -from docling.utils.visualization import draw_clusters +# from docling.utils.visualization import draw_clusters from docling_core.types.doc.base import Size from docling_core.types.doc.document import ( DocItem, From 86efb2d637e6e2d2cd4bb8100de148c29adba30e Mon Sep 17 00:00:00 2001 From: Peter Staar Date: Thu, 13 Feb 2025 13:23:37 +0100 Subject: [PATCH 04/81] before switching to specific docling-core branch Signed-off-by: Peter Staar --- .../benchmarks/cvat_annotation/create.py | 36 +++++++++++-------- docling_eval/benchmarks/utils.py | 2 +- poetry.lock | 18 +++------- pyproject.toml | 2 +- 4 files changed, 28 insertions(+), 30 deletions(-) diff --git a/docling_eval/benchmarks/cvat_annotation/create.py b/docling_eval/benchmarks/cvat_annotation/create.py index 9d6ed0bc..2328c35d 100644 --- a/docling_eval/benchmarks/cvat_annotation/create.py +++ b/docling_eval/benchmarks/cvat_annotation/create.py @@ -109,7 +109,8 @@ def find_box(boxes: List, point: Tuple[float, float]): def parse_annotation(image_annot: dict): basename: str = image_annot["@name"] - + logging.info(f"parsing annotations for {basename}") + keep: bool = False boxes: List[dict] = [] @@ -125,6 +126,7 @@ def parse_annotation(image_annot: dict): group: List[dict] = [] if "box" not in image_annot or "polyline" not in image_annot: + logging.warning("skipping because no `box` nor `polyline` is found") return ( basename, keep, @@ -708,10 +710,16 @@ def create_true_document(basename: str, annot: dict, desc: AnnotatedImage): true_doc.add_text(label=label, prov=prov, text=text) elif label == DocItemLabel.FORM: - true_doc.add_text(label=label, prov=prov, text=text) + logging.error(f"label: `{label}`") + # true_doc.add_text(label=label, prov=prov, text=text) + # FIXME + true_doc.add_text(label=DocItemLabel.TEXT, prov=prov, text=text) elif label == DocItemLabel.KEY_VALUE_REGION: - true_doc.add_text(label=label, prov=prov, text=text) + logging.error(f"label: `{label}`") + # true_doc.add_text(label=label, prov=prov, text=text) + # FIXME + true_doc.add_text(label=DocItemLabel.TEXT, prov=prov, text=text) elif label in [DocItemLabel.TABLE, DocItemLabel.DOCUMENT_INDEX]: @@ -1059,20 +1067,20 @@ def get_annotation_files(benchmark_dirs): return xml_files -# def main(): +def main(): -# source_dir = parse_args() + source_dir = parse_args() -# benchmark_dirs = BenchMarkDirs() -# benchmark_dirs.set_up_directory_structure(source=source_dir, target=source_dir) + benchmark_dirs = BenchMarkDirs() + benchmark_dirs.set_up_directory_structure(source=source_dir, target=source_dir) -# # Get all annotation files -# annot_files = get_annotation_files(benchmark_dirs) + # Get all annotation files + annot_files = get_annotation_files(benchmark_dirs) -# create_layout_dataset_from_annotations( -# benchmark_dirs=benchmark_dirs, annot_files=annot_files -# ) + create_layout_dataset_from_annotations( + benchmark_dirs=benchmark_dirs, annot_files=annot_files + ) -# if __name__ == "__main__": -# main() +if __name__ == "__main__": + main() diff --git a/docling_eval/benchmarks/utils.py b/docling_eval/benchmarks/utils.py index f0a87882..bbb86845 100644 --- a/docling_eval/benchmarks/utils.py +++ b/docling_eval/benchmarks/utils.py @@ -14,7 +14,7 @@ from docling.backend.docling_parse_v2_backend import DoclingParseV2DocumentBackend from docling.datamodel.base_models import BoundingBox, Cluster, InputFormat, Page from docling.datamodel.document import InputDocument -# from docling.utils.visualization import draw_clusters +from docling.utils.visualization import draw_clusters from docling_core.types.doc.base import Size from docling_core.types.doc.document import ( DocItem, diff --git a/poetry.lock b/poetry.lock index 55aebf0d..33d42063 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -668,6 +668,7 @@ files = [ {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"}, {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"}, {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385"}, {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"}, {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"}, {file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"}, @@ -678,6 +679,7 @@ files = [ {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"}, {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"}, {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba"}, {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"}, {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"}, {file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"}, @@ -3218,43 +3220,31 @@ python-versions = ">=3.9" files = [ {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, - {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, - {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, - {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, - {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, - {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, - {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, - {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, - {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, - {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, - {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, - {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, - {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, @@ -6415,4 +6405,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "00b9dd60d96b885fc1df87033471c87987049cb0f005bb8bda37cfa3db931ae8" +content-hash = "af013781a7bcfbc289b3f4240398330e97f4839b6422a763619bd69df33e7cb1" diff --git a/pyproject.toml b/pyproject.toml index b7430863..79f39bad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ lxml = "^5.3.0" datasets = "^3.2.0" apted = "^1.0.3" Distance = "^0.1.3" -docling = "^2.20.0" +docling = "^2.21.0" matplotlib = "^3.10.0" torch = "^2.5.1" torchmetrics = "^1.6.0" From b504372cd715051aeb23bbbba402b1a84c521e02 Mon Sep 17 00:00:00 2001 From: Peter Staar Date: Fri, 14 Feb 2025 05:56:12 +0100 Subject: [PATCH 05/81] rebased on kv-items and updated the create script in CVAT Signed-off-by: Peter Staar --- .../benchmarks/cvat_annotation/create.py | 10 +- poetry.lock | 325 +++++++++--------- pyproject.toml | 3 +- 3 files changed, 166 insertions(+), 172 deletions(-) diff --git a/docling_eval/benchmarks/cvat_annotation/create.py b/docling_eval/benchmarks/cvat_annotation/create.py index 2328c35d..02674e54 100644 --- a/docling_eval/benchmarks/cvat_annotation/create.py +++ b/docling_eval/benchmarks/cvat_annotation/create.py @@ -710,16 +710,10 @@ def create_true_document(basename: str, annot: dict, desc: AnnotatedImage): true_doc.add_text(label=label, prov=prov, text=text) elif label == DocItemLabel.FORM: - logging.error(f"label: `{label}`") - # true_doc.add_text(label=label, prov=prov, text=text) - # FIXME - true_doc.add_text(label=DocItemLabel.TEXT, prov=prov, text=text) + true_doc.add_form_item(cells=[], links=[], prov=prov) elif label == DocItemLabel.KEY_VALUE_REGION: - logging.error(f"label: `{label}`") - # true_doc.add_text(label=label, prov=prov, text=text) - # FIXME - true_doc.add_text(label=DocItemLabel.TEXT, prov=prov, text=text) + true_doc.add_key_value_item(cells=[], links=[], prov=prov) elif label in [DocItemLabel.TABLE, DocItemLabel.DOCUMENT_INDEX]: diff --git a/poetry.lock b/poetry.lock index 33d42063..e39534e2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -657,40 +657,42 @@ test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist" [[package]] name = "cryptography" -version = "44.0.0" +version = "44.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.7" files = [ - {file = "cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385"}, - {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"}, - {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"}, - {file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"}, - {file = "cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd"}, - {file = "cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba"}, - {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"}, - {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"}, - {file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"}, - {file = "cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c"}, - {file = "cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02"}, + {file = "cryptography-44.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf688f615c29bfe9dfc44312ca470989279f0e94bb9f631f85e3459af8efc009"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7c7e2d71d908dc0f8d2027e1604102140d84b155e658c20e8ad1304317691f"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887143b9ff6bad2b7570da75a7fe8bbf5f65276365ac259a5d2d5147a73775f2"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:322eb03ecc62784536bc173f1483e76747aafeb69c8728df48537eb431cd1911"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:21377472ca4ada2906bc313168c9dc7b1d7ca417b63c1c3011d0c74b7de9ae69"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:df978682c1504fc93b3209de21aeabf2375cb1571d4e61907b3e7a2540e83026"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:eb3889330f2a4a148abead555399ec9a32b13b7c8ba969b72d8e500eb7ef84cd"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:8e6a85a93d0642bd774460a86513c5d9d80b5c002ca9693e63f6e540f1815ed0"}, + {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6f76fdd6fd048576a04c5210d53aa04ca34d2ed63336d4abd306d0cbe298fddf"}, + {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6c8acf6f3d1f47acb2248ec3ea261171a671f3d9428e34ad0357148d492c7864"}, + {file = "cryptography-44.0.1-cp37-abi3-win32.whl", hash = "sha256:24979e9f2040c953a94bf3c6782e67795a4c260734e5264dceea65c8f4bae64a"}, + {file = "cryptography-44.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:fd0ee90072861e276b0ff08bd627abec29e32a53b2be44e41dbcdf87cbee2b00"}, + {file = "cryptography-44.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a2d8a7045e1ab9b9f803f0d9531ead85f90c5f2859e653b61497228b18452008"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8272f257cf1cbd3f2e120f14c68bff2b6bdfcc157fafdee84a1b795efd72862"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e8d181e90a777b63f3f0caa836844a1182f1f265687fac2115fcf245f5fbec3"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:436df4f203482f41aad60ed1813811ac4ab102765ecae7a2bbb1dbb66dcff5a7"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4f422e8c6a28cf8b7f883eb790695d6d45b0c385a2583073f3cec434cc705e1a"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:72198e2b5925155497a5a3e8c216c7fb3e64c16ccee11f0e7da272fa93b35c4c"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2a46a89ad3e6176223b632056f321bc7de36b9f9b93b2cc1cccf935a3849dc62"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:53f23339864b617a3dfc2b0ac8d5c432625c80014c25caac9082314e9de56f41"}, + {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:888fcc3fce0c888785a4876ca55f9f43787f4c5c1cc1e2e0da71ad481ff82c5b"}, + {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:00918d859aa4e57db8299607086f793fa7813ae2ff5a4637e318a25ef82730f7"}, + {file = "cryptography-44.0.1-cp39-abi3-win32.whl", hash = "sha256:9b336599e2cb77b1008cb2ac264b290803ec5e8e89d618a5e978ff5eb6f715d9"}, + {file = "cryptography-44.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:e403f7f766ded778ecdb790da786b418a9f2394f36e8cc8b796cc056ab05f44f"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1f9a92144fa0c877117e9748c74501bea842f93d21ee00b0cf922846d9d0b183"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:610a83540765a8d8ce0f351ce42e26e53e1f774a6efb71eb1b41eb01d01c3d12"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5fed5cd6102bb4eb843e3315d2bf25fede494509bddadb81e03a859c1bc17b83"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f4daefc971c2d1f82f03097dc6f216744a6cd2ac0f04c68fb935ea2ba2a0d420"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94f99f2b943b354a5b6307d7e8d19f5c423a794462bde2bf310c770ba052b1c4"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d9c5b9f698a83c8bd71e0f4d3f9f839ef244798e5ffe96febfa9714717db7af7"}, + {file = "cryptography-44.0.1.tar.gz", hash = "sha256:f51f5705ab27898afda1aaa430f34ad90dc117421057782022edf0600bec5f14"}, ] [package.dependencies] @@ -703,7 +705,7 @@ nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==44.0.0)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test = ["certifi (>=2024)", "cryptography-vectors (==44.0.1)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] @@ -936,41 +938,45 @@ vlm = ["transformers (>=4.42.0,<4.43.0)", "transformers (>=4.46.0,<5.0.0)"] [[package]] name = "docling-core" -version = "2.18.0" +version = "2.18.1" description = "A python library to define and validate data types in Docling." optional = false -python-versions = "<4.0,>=3.9" -files = [ - {file = "docling_core-2.18.0-py3-none-any.whl", hash = "sha256:9dee0084cef3d6d742686629f538653e332ee8b7541ad7581c98c8ddc28149b3"}, - {file = "docling_core-2.18.0.tar.gz", hash = "sha256:e8623b8cf4b1e19d5c05c4e3446ac7835afb178997b91c8d11ce8e504a09ec43"}, -] +python-versions = "^3.9" +files = [] +develop = false [package.dependencies] -jsonref = ">=1.1.0,<2.0.0" -jsonschema = ">=4.16.0,<5.0.0" -latex2mathml = ">=3.77.0,<4.0.0" -pandas = ">=2.1.4,<3.0.0" -pillow = ">=10.3.0,<11.0.0" -pydantic = ">=2.6.0,<2.10.0 || >2.10.0,<2.10.1 || >2.10.1,<2.10.2 || >2.10.2,<3.0.0" +jsonref = "^1.1.0" +jsonschema = "^4.16.0" +latex2mathml = "^3.77.0" +pandas = "^2.1.4" +pillow = ">=10.0.0,<12.0.0" +pydantic = ">=2.6.0,<3.0.0,!=2.10.0,!=2.10.1,!=2.10.2" pyyaml = ">=5.1,<7.0.0" -semchunk = {version = ">=2.2.0,<3.0.0", optional = true, markers = "extra == \"chunking\""} -tabulate = ">=0.9.0,<0.10.0" -transformers = {version = ">=4.34.0,<5.0.0", optional = true, markers = "extra == \"chunking\""} -typer = ">=0.12.5,<0.13.0" -typing-extensions = ">=4.12.2,<5.0.0" +semchunk = {version = "^2.2.0", optional = true} +tabulate = "^0.9.0" +transformers = {version = "^4.34.0", optional = true} +typer = "^0.12.5" +typing-extensions = "^4.12.2" [package.extras] chunking = ["semchunk (>=2.2.0,<3.0.0)", "transformers (>=4.34.0,<5.0.0)"] +[package.source] +type = "git" +url = "https://github.com/DS4SD/docling-core.git" +reference = "kv-item" +resolved_reference = "9c78d60ce72d4d7b7f559d6141bb4b725bc8635c" + [[package]] name = "docling-ibm-models" -version = "3.3.1" +version = "3.3.2" description = "This package contains the AI models used by the Docling PDF conversion package" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "docling_ibm_models-3.3.1-py3-none-any.whl", hash = "sha256:be8f6684839c48d4b318e58a558cd7e2af3351b712f9604a69a415a0e238d5e2"}, - {file = "docling_ibm_models-3.3.1.tar.gz", hash = "sha256:f1d64216bbca6507da6f80de1acf450f33bdc7dc81cfd7f532a6cfc545cc092a"}, + {file = "docling_ibm_models-3.3.2-py3-none-any.whl", hash = "sha256:9f82a2ef73c6cd8d729ab2fcc4223079ccb8b6eec0bf0643c56e55352b97b5cb"}, + {file = "docling_ibm_models-3.3.2.tar.gz", hash = "sha256:f6ed59dfb3f98a71ccdd003c13c9a868e3003c22bd5adc554197da7eec227cde"}, ] [package.dependencies] @@ -981,7 +987,7 @@ numpy = [ {version = ">=1.24.4,<2.0.0", markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\""}, ] opencv-python-headless = ">=4.6.0.66,<5.0.0.0" -Pillow = ">=10.0.0,<11.0.0" +Pillow = ">=10.0.0,<12.0.0" safetensors = {version = ">=0.4.3,<1", extras = ["torch"]} torch = ">=2.2.2,<3.0.0" torchvision = ">=0,<1" @@ -993,45 +999,45 @@ transformers = [ [[package]] name = "docling-parse" -version = "3.3.0" +version = "3.3.1" description = "Simple package to extract text with coordinates from programmatic PDFs" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "docling_parse-3.3.0-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:25ac1137787d01cc1d402cd7f3bca2c702d8ae6d38cedd042337d04b5444aedb"}, - {file = "docling_parse-3.3.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:7d8dc58751bd6a3dcd371363152d98df8deb33ab0752c2fce6a7b380d6804958"}, - {file = "docling_parse-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:780a12e6fa7729f76d12dd0f6431192ad38cd3621bfcad77d6dc37a7bca78ca3"}, - {file = "docling_parse-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15db955169ddb57e5fd9e887d5467789d5748154bedbe3e861003318b8de0ca3"}, - {file = "docling_parse-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:1104451aef07fdacb45341e1ce15f31193e32e46905d0703d0a3d62aeaa8632a"}, - {file = "docling_parse-3.3.0-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:b1768fca5700384ea309af3a2714ad0b06a9be00da24d171e840b0d2098d5e52"}, - {file = "docling_parse-3.3.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:b5647814c701c6199ed3da5577aac292f42e22d581df206a81f34fbb7e9f2fec"}, - {file = "docling_parse-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ae4bea3441d8f358a9669a6d40c510c640ae45fa5c3464698de9c01fa773f14"}, - {file = "docling_parse-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2e1aae698a0a7fe81ab394cb8fa328a0f4eaa883962168e7dea5387ee30e76d"}, - {file = "docling_parse-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:43757a1848dffe2262c10347115e4be38dd9565261659c3d8c29ce02770bbcfd"}, - {file = "docling_parse-3.3.0-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:1498748fb3270ab8074ef48dcdcef1107c6e312e3b3793c71b1341bf6d706966"}, - {file = "docling_parse-3.3.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b9e4db7bf9736c46a6b5cae45242f2dd2cc478f661bade3d06200ba86ad2aa33"}, - {file = "docling_parse-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8d73364e16383403b0828ad12c74dd8dbb2bd5d572f4b62c9a417f0cdea2138"}, - {file = "docling_parse-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fe95708c21039216ff0620ff2c822de14dd70cd61ac9b7117fc30b3d7990f81"}, - {file = "docling_parse-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b23bc96c593979567ba18727a31adb1a4524d203feea9b12dac4c8774971d709"}, - {file = "docling_parse-3.3.0-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:ab240ce8c923143ef125291ee15121f67a99034df110133cd7d481c5f0b4525a"}, - {file = "docling_parse-3.3.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:916cdd6fd52c32e7026c1e70795c0a9d2d3299f200cc240c047dcc702fcf268f"}, - {file = "docling_parse-3.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b34f0c5629db675dda7bd8992a80416a03b9b75e99f6d6db8869cdd935d63b7f"}, - {file = "docling_parse-3.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d260306cbe52a3954cba9f9b9459547b7f66156a1e85821b2f7106a3f230586"}, - {file = "docling_parse-3.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:c37be103a07f27fb2bd77350f324e55822d7126b534ebd52ec9de3d10feae72f"}, - {file = "docling_parse-3.3.0-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:cfb921c4901e342c42d1754f0fe67e73577d6506143b75dfde44720efe89aae4"}, - {file = "docling_parse-3.3.0-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:acc7b4929296f6c9fdc91851c999a353f785039c3f2eb591923564b42fc3d0d1"}, - {file = "docling_parse-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51e7640aadc75d9a3efa2f591b583824999111cc1830868dd8409c7f6f8e19a6"}, - {file = "docling_parse-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:118c69c81539bcac2b3b635edbabac29301e778894382688fedaa86f6dba5c13"}, - {file = "docling_parse-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:556653428da5f2b9863f630222f5369c66a4ca0cadb42ea1d8db826cb4e6c4c6"}, - {file = "docling_parse-3.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d6f56e7ed06dee6451d0552c9c2221491af7a7a0cb8c9b8b9c78c1b728b35d27"}, - {file = "docling_parse-3.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b83347e82dbb5bb58807cc605fd521803fc6a0852f0063b9f6d26b3f7426b662"}, - {file = "docling_parse-3.3.0.tar.gz", hash = "sha256:38ed09e63c735b5e010e5a75af92da5d8b2fcab9e93d2d17873e9115290fd7fa"}, + {file = "docling_parse-3.3.1-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:abf3a0c9ea35fc33fbd288031096826688d1e787f7c51e174cc9fea6a22d2f67"}, + {file = "docling_parse-3.3.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1e07cc6e3603ff246affa11bec25a82d90f79c6b92c370d993f2bd6318476b7c"}, + {file = "docling_parse-3.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:338000deee0251f7e2ebdfde2bcd6392c388624206555410867cfc93608d84fe"}, + {file = "docling_parse-3.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f14a9871e840a021a642ea0ece4b675cc9584224eba3b85cd269feda892b76"}, + {file = "docling_parse-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:c0bad3db594e05bca2366d46e630a0b8050b6eb37fcae2cbcd5020b06ac0879a"}, + {file = "docling_parse-3.3.1-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:db0cebe28b299f78f1da58b5567c22de6f5b30aa5b6fe4fb2daae9f372bd022c"}, + {file = "docling_parse-3.3.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:72e901cc6dfac9e4f5e13ddd841f758b41484e61b7092b891c693e2c036461ac"}, + {file = "docling_parse-3.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcfc7309b46e9b0941cc5513560b06f0b1c221ff3a2d5e516eb752ae7f2ccb81"}, + {file = "docling_parse-3.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76dc12fc510d08d1f76741dc429666a5791db003275067aa1f18da02b7a98925"}, + {file = "docling_parse-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:4c096f5c2460a6eb308e046e3045bb0100b6b602ef4394924cfd4846cee5800e"}, + {file = "docling_parse-3.3.1-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:3cc23f0d6aa91d015117b8962162bf4a482e2208d2068abfada34fda112ef077"}, + {file = "docling_parse-3.3.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:7a62afe01b6f008f3f50a12e3d8feddb28d045bc2b96321d48933ab23ff1e201"}, + {file = "docling_parse-3.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd93d2a23a22b84c61213fa62db906ae444201e4e404d7dc2b6152d64d69ec50"}, + {file = "docling_parse-3.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87a8678b8e37a1f0bd41fb0227938a7bba0dc7e6f6ce69777b1ee947ef0e28ef"}, + {file = "docling_parse-3.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:c6ae62864d3d0e1e3bfb467e217c90ae938b0773c671412ff3ca110081b024ea"}, + {file = "docling_parse-3.3.1-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:79cc92e3b1d3d8957df11c8dfd5c8f89aaae06d5ac49f019a59a0aad301ba59c"}, + {file = "docling_parse-3.3.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8d8b988ca77dd88111fb8e5d961806fcb26b3ea146841d7d304d1d52b82ed27b"}, + {file = "docling_parse-3.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:781a88c3a4eb27dd09598fe5956f8cd874acb49c102c2d35ccf0fbbeb3fc714d"}, + {file = "docling_parse-3.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb803dd61d79a7f876ff7febb4ce2f43de19646f05196031f35b891a8c24b57a"}, + {file = "docling_parse-3.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:2052d3dc4711975fdcfa343947a1fbb9502c6a81ccc5834af41615868e61fb94"}, + {file = "docling_parse-3.3.1-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:7ccb186369f706b5df8d6751c6cfff2a4355c3c843c68b0210e3f53a2bdf9bf6"}, + {file = "docling_parse-3.3.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:5a00c37ed9923f7d7317044135d8ff81829474d1d47730dfc8bd2d2a3e3e60cd"}, + {file = "docling_parse-3.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72beb63683f5e581c15d1c3370480dbe4457031f447944342a09bd23a66b378e"}, + {file = "docling_parse-3.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ac8f3bb64e50cf58959ce591574cb0ba3d6ebe9bdbedfabbff1817aaf34664"}, + {file = "docling_parse-3.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:24ea10d7bda2ea35c6cc24b8db3fdea4a1e05182890ea44364fcd703e5090e54"}, + {file = "docling_parse-3.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:048157bc8640e3c03c082b4296f9f8946516c624a5469e10c7c9a32dcb0dc5c8"}, + {file = "docling_parse-3.3.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6f293644856d05a1fced3e100dd052374da793e7e3a0e6023c69b9d3eb64881"}, + {file = "docling_parse-3.3.1.tar.gz", hash = "sha256:536f581e7564cbfd37bff2e79d2cb17e7dbaa0d34d054cfdb28d648da31da85b"}, ] [package.dependencies] docling-core = ">=2.14.0,<3.0.0" -pillow = ">=10.4.0,<11.0.0" -pydantic = ">=2.10.5,<3.0.0" +pillow = ">=10.0.0,<12.0.0" +pydantic = ">=2.0.0,<3.0.0" pywin32 = {version = ">=305", markers = "sys_platform == \"win32\""} tabulate = ">=0.9.0,<1.0.0" @@ -2933,66 +2939,66 @@ files = [ [[package]] name = "numpy" -version = "2.2.2" +version = "2.2.3" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" files = [ - {file = "numpy-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e"}, - {file = "numpy-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e"}, - {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715"}, - {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a"}, - {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97"}, - {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957"}, - {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d"}, - {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd"}, - {file = "numpy-2.2.2-cp310-cp310-win32.whl", hash = "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160"}, - {file = "numpy-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e"}, - {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c"}, - {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f"}, - {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826"}, - {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8"}, - {file = "numpy-2.2.2-cp311-cp311-win32.whl", hash = "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50"}, - {file = "numpy-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37"}, - {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748"}, - {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0"}, - {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278"}, - {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba"}, - {file = "numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283"}, - {file = "numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be"}, - {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84"}, - {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff"}, - {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0"}, - {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de"}, - {file = "numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9"}, - {file = "numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49"}, - {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2"}, - {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7"}, - {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb"}, - {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648"}, - {file = "numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4"}, - {file = "numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60"}, - {file = "numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f"}, + {file = "numpy-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cbc6472e01952d3d1b2772b720428f8b90e2deea8344e854df22b0618e9cce71"}, + {file = "numpy-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdfe0c22692a30cd830c0755746473ae66c4a8f2e7bd508b35fb3b6a0813d787"}, + {file = "numpy-2.2.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:e37242f5324ffd9f7ba5acf96d774f9276aa62a966c0bad8dae692deebec7716"}, + {file = "numpy-2.2.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95172a21038c9b423e68be78fd0be6e1b97674cde269b76fe269a5dfa6fadf0b"}, + {file = "numpy-2.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5b47c440210c5d1d67e1cf434124e0b5c395eee1f5806fdd89b553ed1acd0a3"}, + {file = "numpy-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0391ea3622f5c51a2e29708877d56e3d276827ac5447d7f45e9bc4ade8923c52"}, + {file = "numpy-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f6b3dfc7661f8842babd8ea07e9897fe3d9b69a1d7e5fbb743e4160f9387833b"}, + {file = "numpy-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1ad78ce7f18ce4e7df1b2ea4019b5817a2f6a8a16e34ff2775f646adce0a5027"}, + {file = "numpy-2.2.3-cp310-cp310-win32.whl", hash = "sha256:5ebeb7ef54a7be11044c33a17b2624abe4307a75893c001a4800857956b41094"}, + {file = "numpy-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:596140185c7fa113563c67c2e894eabe0daea18cf8e33851738c19f70ce86aeb"}, + {file = "numpy-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:16372619ee728ed67a2a606a614f56d3eabc5b86f8b615c79d01957062826ca8"}, + {file = "numpy-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5521a06a3148686d9269c53b09f7d399a5725c47bbb5b35747e1cb76326b714b"}, + {file = "numpy-2.2.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:7c8dde0ca2f77828815fd1aedfdf52e59071a5bae30dac3b4da2a335c672149a"}, + {file = "numpy-2.2.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:77974aba6c1bc26e3c205c2214f0d5b4305bdc719268b93e768ddb17e3fdd636"}, + {file = "numpy-2.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d42f9c36d06440e34226e8bd65ff065ca0963aeecada587b937011efa02cdc9d"}, + {file = "numpy-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2712c5179f40af9ddc8f6727f2bd910ea0eb50206daea75f58ddd9fa3f715bb"}, + {file = "numpy-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c8b0451d2ec95010d1db8ca733afc41f659f425b7f608af569711097fd6014e2"}, + {file = "numpy-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9b4a8148c57ecac25a16b0e11798cbe88edf5237b0df99973687dd866f05e1b"}, + {file = "numpy-2.2.3-cp311-cp311-win32.whl", hash = "sha256:1f45315b2dc58d8a3e7754fe4e38b6fce132dab284a92851e41b2b344f6441c5"}, + {file = "numpy-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f48ba6f6c13e5e49f3d3efb1b51c8193215c42ac82610a04624906a9270be6f"}, + {file = "numpy-2.2.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12c045f43b1d2915eca6b880a7f4a256f59d62df4f044788c8ba67709412128d"}, + {file = "numpy-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:87eed225fd415bbae787f93a457af7f5990b92a334e346f72070bf569b9c9c95"}, + {file = "numpy-2.2.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:712a64103d97c404e87d4d7c47fb0c7ff9acccc625ca2002848e0d53288b90ea"}, + {file = "numpy-2.2.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a5ae282abe60a2db0fd407072aff4599c279bcd6e9a2475500fc35b00a57c532"}, + {file = "numpy-2.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5266de33d4c3420973cf9ae3b98b54a2a6d53a559310e3236c4b2b06b9c07d4e"}, + {file = "numpy-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b787adbf04b0db1967798dba8da1af07e387908ed1553a0d6e74c084d1ceafe"}, + {file = "numpy-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:34c1b7e83f94f3b564b35f480f5652a47007dd91f7c839f404d03279cc8dd021"}, + {file = "numpy-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4d8335b5f1b6e2bce120d55fb17064b0262ff29b459e8493d1785c18ae2553b8"}, + {file = "numpy-2.2.3-cp312-cp312-win32.whl", hash = "sha256:4d9828d25fb246bedd31e04c9e75714a4087211ac348cb39c8c5f99dbb6683fe"}, + {file = "numpy-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:83807d445817326b4bcdaaaf8e8e9f1753da04341eceec705c001ff342002e5d"}, + {file = "numpy-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bfdb06b395385ea9b91bf55c1adf1b297c9fdb531552845ff1d3ea6e40d5aba"}, + {file = "numpy-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:23c9f4edbf4c065fddb10a4f6e8b6a244342d95966a48820c614891e5059bb50"}, + {file = "numpy-2.2.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:a0c03b6be48aaf92525cccf393265e02773be8fd9551a2f9adbe7db1fa2b60f1"}, + {file = "numpy-2.2.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:2376e317111daa0a6739e50f7ee2a6353f768489102308b0d98fcf4a04f7f3b5"}, + {file = "numpy-2.2.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fb62fe3d206d72fe1cfe31c4a1106ad2b136fcc1606093aeab314f02930fdf2"}, + {file = "numpy-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52659ad2534427dffcc36aac76bebdd02b67e3b7a619ac67543bc9bfe6b7cdb1"}, + {file = "numpy-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b416af7d0ed3271cad0f0a0d0bee0911ed7eba23e66f8424d9f3dfcdcae1304"}, + {file = "numpy-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1402da8e0f435991983d0a9708b779f95a8c98c6b18a171b9f1be09005e64d9d"}, + {file = "numpy-2.2.3-cp313-cp313-win32.whl", hash = "sha256:136553f123ee2951bfcfbc264acd34a2fc2f29d7cdf610ce7daf672b6fbaa693"}, + {file = "numpy-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5b732c8beef1d7bc2d9e476dbba20aaff6167bf205ad9aa8d30913859e82884b"}, + {file = "numpy-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:435e7a933b9fda8126130b046975a968cc2d833b505475e588339e09f7672890"}, + {file = "numpy-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7678556eeb0152cbd1522b684dcd215250885993dd00adb93679ec3c0e6e091c"}, + {file = "numpy-2.2.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2e8da03bd561504d9b20e7a12340870dfc206c64ea59b4cfee9fceb95070ee94"}, + {file = "numpy-2.2.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:c9aa4496fd0e17e3843399f533d62857cef5900facf93e735ef65aa4bbc90ef0"}, + {file = "numpy-2.2.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4ca91d61a4bf61b0f2228f24bbfa6a9facd5f8af03759fe2a655c50ae2c6610"}, + {file = "numpy-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:deaa09cd492e24fd9b15296844c0ad1b3c976da7907e1c1ed3a0ad21dded6f76"}, + {file = "numpy-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:246535e2f7496b7ac85deffe932896a3577be7af8fb7eebe7146444680297e9a"}, + {file = "numpy-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:daf43a3d1ea699402c5a850e5313680ac355b4adc9770cd5cfc2940e7861f1bf"}, + {file = "numpy-2.2.3-cp313-cp313t-win32.whl", hash = "sha256:cf802eef1f0134afb81fef94020351be4fe1d6681aadf9c5e862af6602af64ef"}, + {file = "numpy-2.2.3-cp313-cp313t-win_amd64.whl", hash = "sha256:aee2512827ceb6d7f517c8b85aa5d3923afe8fc7a57d028cffcd522f1c6fd082"}, + {file = "numpy-2.2.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3c2ec8a0f51d60f1e9c0c5ab116b7fc104b165ada3f6c58abf881cb2eb16044d"}, + {file = "numpy-2.2.3-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:ed2cf9ed4e8ebc3b754d398cba12f24359f018b416c380f577bbae112ca52fc9"}, + {file = "numpy-2.2.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39261798d208c3095ae4f7bc8eaeb3481ea8c6e03dc48028057d3cbdbdb8937e"}, + {file = "numpy-2.2.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:783145835458e60fa97afac25d511d00a1eca94d4a8f3ace9fe2043003c678e4"}, + {file = "numpy-2.2.3.tar.gz", hash = "sha256:dbdc15f0c81611925f382dfa97b3bd0bc2c1ce19d4fe50482cb0ddc12ba30020"}, ] [[package]] @@ -3607,32 +3613,25 @@ files = [ [[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" -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"}, +version = "7.0.0" +description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." +optional = false +python-versions = ">=3.6" +files = [ + {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, + {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"}, + {file = "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"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"}, + {file = "psutil-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17"}, + {file = "psutil-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e"}, + {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"}, + {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, + {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, ] [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"] +dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] test = ["pytest", "pytest-xdist", "setuptools"] [[package]] @@ -6405,4 +6404,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "af013781a7bcfbc289b3f4240398330e97f4839b6422a763619bd69df33e7cb1" +content-hash = "5b213fc8dfab17d11c78c0bc12eabd412e88a775c05e1a617eef44f989b14d38" diff --git a/pyproject.toml b/pyproject.toml index 79f39bad..4523bdf5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,8 @@ packages = [{include = "docling_eval"}] # actual dependencies: ###################### python = "^3.10" -docling-core = "^2.17.0" +# docling-core = "^2.17.0" +docling-core = { git="https://github.com/DS4SD/docling-core.git", branch="kv-item"} pydantic = "^2.0.0" lxml = "^5.3.0" datasets = "^3.2.0" From 68f8b1d52f44e752359d329273a866123d723eb0 Mon Sep 17 00:00:00 2001 From: Peter Staar Date: Fri, 14 Feb 2025 14:50:12 +0100 Subject: [PATCH 06/81] fixed the cvat Signed-off-by: Peter Staar --- .../benchmarks/cvat_annotation/create.py | 64 ++++++++++++++----- .../benchmarks/cvat_annotation/utils.py | 6 +- docling_eval/benchmarks/utils.py | 16 +++++ poetry.lock | 32 +++++----- 4 files changed, 83 insertions(+), 35 deletions(-) diff --git a/docling_eval/benchmarks/cvat_annotation/create.py b/docling_eval/benchmarks/cvat_annotation/create.py index 02674e54..9e771f7a 100644 --- a/docling_eval/benchmarks/cvat_annotation/create.py +++ b/docling_eval/benchmarks/cvat_annotation/create.py @@ -20,6 +20,7 @@ ProvenanceItem, TableData, TableItem, + GraphData, ) from docling_core.types.doc.labels import ( DocItemLabel, @@ -72,7 +73,7 @@ def find_box(boxes: List, point: Tuple[float, float]): index = -1 - area = 1e6 + area = 1e9 for i, box in enumerate(boxes): assert box["l"] < box["r"] @@ -84,9 +85,9 @@ def find_box(boxes: List, point: Tuple[float, float]): and box["t"] <= point[1] and point[1] <= box["b"] ): - # if abs(box["r"]-box["l"])*(box["b"]-box["t"]) ", boxid, ": ", boxes[boxid]) + # print("reading order => ", boxid, ": ", boxes[boxid]) if boxid in already_added: logging.warning(f"{boxid} is already added: {already_added}") @@ -636,7 +645,7 @@ def create_true_document(basename: str, annot: dict, desc: AnnotatedImage): # FIXME for later ... page_no = 1 - if true_doc.pages[page_no] is None: + if (page_no not in true_doc.pages) or (true_doc.pages[page_no] is None): logging.error(f"Page item is None, skipping ...") continue @@ -652,9 +661,7 @@ def create_true_document(basename: str, annot: dict, desc: AnnotatedImage): label, prov, text = get_label_prov_and_text( box=boxes[boxid], page_no=page_no, - # img_width=true_doc.pages[page_no].image.size.width, img_width=true_page_imageref.size.width, - # img_height=true_doc.pages[page_no].image.size.height, img_height=true_page_imageref.size.height, pdf_width=true_doc.pages[page_no].size.width, pdf_height=true_doc.pages[page_no].size.height, @@ -707,13 +714,30 @@ def create_true_document(basename: str, annot: dict, desc: AnnotatedImage): true_doc.add_text(label=label, prov=prov, text=text) elif label == DocItemLabel.CODE: - true_doc.add_text(label=label, prov=prov, text=text) + #true_doc.add_text(label=label, prov=prov, text=text) + + code_item = true_doc.add_code(text=text, prov=prov) + true_doc, already_added = add_captions_to_item( + basename=basename, + to_captions=to_captions, + item=code_item, + page_no=page_no, + boxid=boxid, + boxes=boxes, + already_added=already_added, + true_doc=true_doc, + parser=parser, + parsed_page=parsed_pages[page_no], + ) + elif label == DocItemLabel.FORM: - true_doc.add_form_item(cells=[], links=[], prov=prov) + graph = GraphData(cells=[], links=[]) + true_doc.add_form_item(graph=graph, prov=prov) elif label == DocItemLabel.KEY_VALUE_REGION: - true_doc.add_key_value_item(cells=[], links=[], prov=prov) + graph = GraphData(cells=[], links=[]) + true_doc.add_key_value_item(graph=graph, prov=prov) elif label in [DocItemLabel.TABLE, DocItemLabel.DOCUMENT_INDEX]: @@ -834,7 +858,13 @@ def from_cvat_to_docling_document( for image_annot in annot_data["annotations"]["image"]: basename = image_annot["@name"] + logging.info(basename) + """ + if basename != "doc_5387a06d7e31d738c4bdb64b1936ac6fa09246b6a7e8506e1ee86691ff37155c_page_000001.png": + continue + """ + if basename not in overview.img_annotations: logging.warning(f"Skipping {basename}: not in overview_file") yield basename, overview.img_annotations[basename], None @@ -852,6 +882,8 @@ def from_cvat_to_docling_document( yield basename, overview.img_annotations[basename], true_doc + + def parse_args(): parser = argparse.ArgumentParser( description="Create new evaluation dataset using CVAT annotation files." @@ -936,7 +968,7 @@ def create_layout_dataset_from_annotations( ) """ - save_inspection_html(filename=str(html_viz_dir / f"{basename}.html"), doc = true_doc, + save_inspection_html(filename=str(html_comp_dir / f"{basename}.html"), doc = true_doc, labels=TRUE_HTML_EXPORT_LABELS) """ @@ -957,9 +989,9 @@ def create_layout_dataset_from_annotations( pictures_column=BenchMarkColumns.PREDICTION_PICTURES.value, # pictures_column, page_images_column=BenchMarkColumns.PREDICTION_PAGE_IMAGES.value, # page_images_column, ) - + if True: - vizname = benchmark_dirs.html_viz_dir / f"{basename}-clusters.html" + vizname = benchmark_dirs.html_comp_dir / f"{basename}-clusters.html" logging.info(f"creating visualization: {vizname}") save_comparison_html_with_clusters( diff --git a/docling_eval/benchmarks/cvat_annotation/utils.py b/docling_eval/benchmarks/cvat_annotation/utils.py index 432c030a..50305403 100644 --- a/docling_eval/benchmarks/cvat_annotation/utils.py +++ b/docling_eval/benchmarks/cvat_annotation/utils.py @@ -111,7 +111,7 @@ class BenchMarkDirs(BaseModel): json_anno_dir: Path = Path("") html_anno_dir: Path = Path("") - html_viz_dir: Path = Path("") + html_comp_dir: Path = Path("") project_desc_file: Path = Path("") overview_file: Path = Path("") @@ -145,7 +145,7 @@ def set_up_directory_structure(self, source: Path, target: Path) -> "BenchMarkDi self.json_anno_dir = self.target_dir / "json_annotations" self.html_anno_dir = self.target_dir / "html_annotations" - self.html_viz_dir = self.target_dir / "html_annotatations-viz" + self.html_comp_dir = self.target_dir / "html_comparisons" for _ in [ self.target_dir, @@ -162,7 +162,7 @@ def set_up_directory_structure(self, source: Path, target: Path) -> "BenchMarkDi self.json_pred_dir, self.json_anno_dir, self.html_anno_dir, - self.html_viz_dir, + self.html_comp_dir, ]: os.makedirs(_, exist_ok=True) diff --git a/docling_eval/benchmarks/utils.py b/docling_eval/benchmarks/utils.py index bbb86845..42d93d96 100644 --- a/docling_eval/benchmarks/utils.py +++ b/docling_eval/benchmarks/utils.py @@ -458,6 +458,10 @@ def save_comparison_html_with_clusters( pred_labels: Set[DocItemLabel], draw_reading_order: bool = True, ): + if (1 not in true_doc.pages) or (1 not in pred_doc.pages): + logging.error(f"1 not in true_doc.pages -> skipping {filename} ") + return + def draw_doc_layout(doc: DoclingDocument, image: Image.Image): r""" Draw the document clusters and optionaly the reading order @@ -466,7 +470,13 @@ def draw_doc_layout(doc: DoclingDocument, image: Image.Image): for idx, (elem, _) in enumerate(doc.iterate_items()): if not isinstance(elem, DocItem): continue + prov = elem.prov[0] # Assuming that document always has only one page + + if prov.page_no not in true_doc.pages or prov.page_no!=1: + logging.error(f"{prov.page_no} not in true_doc.pages -> skipping! ") + continue + tlo_bbox = prov.bbox.to_top_left_origin( page_height=true_doc.pages[prov.page_no].size.height ) @@ -495,6 +505,11 @@ def draw_doc_reading_order(doc: DoclingDocument, image: Image.Image): if not isinstance(elem, DocItem): continue prov = elem.prov[0] # Assuming that document always has only one page + + if prov.page_no not in true_doc.pages or prov.page_no!=1: + logging.error(f"{prov.page_no} not in true_doc.pages -> skipping! ") + continue + tlo_bbox = prov.bbox.to_top_left_origin( page_height=true_doc.pages[prov.page_no].size.height ) @@ -545,6 +560,7 @@ def draw_doc_reading_order(doc: DoclingDocument, image: Image.Image): true_doc_img = draw_doc_layout(true_doc, copy.deepcopy(page_image)) pred_doc_img = draw_doc_layout(pred_doc, copy.deepcopy(page_image)) + if draw_reading_order: true_doc_img = draw_doc_reading_order(true_doc, true_doc_img) pred_doc_img = draw_doc_reading_order(pred_doc, pred_doc_img) diff --git a/poetry.lock b/poetry.lock index e39534e2..999f98e3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -725,21 +725,21 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "datasets" -version = "3.2.0" +version = "3.3.0" description = "HuggingFace community-driven open-source library of datasets" optional = false python-versions = ">=3.9.0" files = [ - {file = "datasets-3.2.0-py3-none-any.whl", hash = "sha256:f3d2ba2698b7284a4518019658596a6a8bc79f31e51516524249d6c59cf0fe2a"}, - {file = "datasets-3.2.0.tar.gz", hash = "sha256:9a6e1a356052866b5dbdd9c9eedb000bf3fc43d986e3584d9b028f4976937229"}, + {file = "datasets-3.3.0-py3-none-any.whl", hash = "sha256:22312d09626f8fc3aa0a237b0c164997f5903bddd4c4c9e27dbaf563754c681b"}, + {file = "datasets-3.3.0.tar.gz", hash = "sha256:54c607b06f6eaa1572e21e200d2870d89d50e3bcc622dc2021a53a6ce4f684c2"}, ] [package.dependencies] aiohttp = "*" dill = ">=0.3.0,<0.3.9" filelock = "*" -fsspec = {version = ">=2023.1.0,<=2024.9.0", extras = ["http"]} -huggingface-hub = ">=0.23.0" +fsspec = {version = ">=2023.1.0,<=2024.12.0", extras = ["http"]} +huggingface-hub = ">=0.24.0" multiprocess = "<0.70.17" numpy = ">=1.17" packaging = "*" @@ -753,15 +753,15 @@ xxhash = "*" [package.extras] audio = ["librosa", "soundfile (>=0.12.1)", "soxr (>=0.4.0)"] benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] -dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "decord (==0.6.0)", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "transformers", "transformers (>=4.42.0)", "zstandard"] +dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "decord (==0.6.0)", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "transformers", "transformers (>=4.42.0)", "zstandard"] docs = ["s3fs", "tensorflow (>=2.6.0)", "torch", "transformers"] jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] quality = ["ruff (>=0.3.0)"] s3 = ["s3fs"] tensorflow = ["tensorflow (>=2.6.0)"] tensorflow-gpu = ["tensorflow (>=2.6.0)"] -tests = ["Pillow (>=9.4.0)", "absl-py", "decorator", "decord (==0.6.0)", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch (>=2.0.0)", "torchdata", "transformers (>=4.42.0)", "zstandard"] -tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "decord (==0.6.0)", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchdata", "transformers (>=4.42.0)", "zstandard"] +tests = ["Pillow (>=9.4.0)", "absl-py", "decorator", "decord (==0.6.0)", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch (>=2.0.0)", "torchdata", "transformers (>=4.42.0)", "zstandard"] +tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "decord (==0.6.0)", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchdata", "transformers (>=4.42.0)", "zstandard"] torch = ["torch"] vision = ["Pillow (>=9.4.0)"] @@ -895,13 +895,13 @@ files = [ [[package]] name = "docling" -version = "2.21.0" +version = "2.22.0" description = "SDK and CLI for parsing PDF, DOCX, HTML, and more, to a unified document representation for powering downstream workflows such as gen AI applications." optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "docling-2.21.0-py3-none-any.whl", hash = "sha256:d0e0b77885971e18058994810de35a0e0b3a12dec585a219b089d578121a3992"}, - {file = "docling-2.21.0.tar.gz", hash = "sha256:bd9a4636692a52c27b40300f5b1017f9a9c4a09fad861a3d3f177264bd8331b1"}, + {file = "docling-2.22.0-py3-none-any.whl", hash = "sha256:984006ca33962ef13a13afcef04abb9178c65fe67ca98c82d19c31e69a85322d"}, + {file = "docling-2.22.0.tar.gz", hash = "sha256:816055d1c1f42061e94f36d49e2243e1aa065e45b6302ded77e98a2e1e2d622b"}, ] [package.dependencies] @@ -918,7 +918,7 @@ lxml = ">=4.0.0,<6.0.0" marko = ">=2.1.2,<3.0.0" openpyxl = ">=3.1.5,<4.0.0" pandas = ">=2.1.4,<3.0.0" -pillow = ">=10.0.0,<11.0.0" +pillow = ">=10.0.0,<12.0.0" pydantic = ">=2.0.0,<3.0.0" pydantic-settings = ">=2.3.0,<3.0.0" pypdfium2 = ">=4.30.0,<5.0.0" @@ -966,7 +966,7 @@ chunking = ["semchunk (>=2.2.0,<3.0.0)", "transformers (>=4.34.0,<5.0.0)"] type = "git" url = "https://github.com/DS4SD/docling-core.git" reference = "kv-item" -resolved_reference = "9c78d60ce72d4d7b7f559d6141bb4b725bc8635c" +resolved_reference = "c86054a2808b39377cb89e1bb336376c05dd4669" [[package]] name = "docling-ibm-models" @@ -1411,13 +1411,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.9.0" +version = "2024.12.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.9.0-py3-none-any.whl", hash = "sha256:a0947d552d8a6efa72cc2c730b12c41d043509156966cca4fb157b0f2a0c574b"}, - {file = "fsspec-2024.9.0.tar.gz", hash = "sha256:4b0afb90c2f21832df142f292649035d80b421f60a9e1c027802e5a0da2b04e8"}, + {file = "fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2"}, + {file = "fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f"}, ] [package.dependencies] From 7f59ff29d59c00d94d3784bdd9cf1acf52e38cbc Mon Sep 17 00:00:00 2001 From: Peter Staar Date: Fri, 14 Feb 2025 17:35:44 +0100 Subject: [PATCH 07/81] added the annotation description on CVAT Signed-off-by: Peter Staar --- docling_eval/benchmarks/constants.py | 12 +- .../benchmarks/cvat_annotation/create.py | 49 +++--- .../create_dataset_from_pdfs.py | 40 ++--- .../benchmarks/cvat_annotation/preannotate.py | 4 +- docling_eval/benchmarks/utils.py | 13 +- docling_eval/cli/main.py | 26 ++-- docs/CVAT_create_groundtruth.md | 142 ++++++++++++++++-- docs/CVAT_screenshots/01.png | Bin 0 -> 100752 bytes docs/CVAT_screenshots/02.png | Bin 0 -> 44496 bytes docs/CVAT_screenshots/03.png | Bin 0 -> 48889 bytes docs/CVAT_screenshots/04.png | Bin 0 -> 123087 bytes docs/CVAT_screenshots/05.png | Bin 0 -> 53772 bytes docs/CVAT_screenshots/06.png | Bin 0 -> 88517 bytes docs/CVAT_screenshots/07.png | Bin 0 -> 84277 bytes docs/CVAT_screenshots/08.png | Bin 0 -> 78807 bytes docs/CVAT_screenshots/09.png | Bin 0 -> 478391 bytes docs/CVAT_screenshots/10.png | Bin 0 -> 478286 bytes docs/CVAT_screenshots/11.png | Bin 0 -> 497569 bytes docs/CVAT_screenshots/12.png | Bin 0 -> 474261 bytes docs/CVAT_screenshots/13.png | Bin 0 -> 97400 bytes 20 files changed, 208 insertions(+), 78 deletions(-) create mode 100644 docs/CVAT_screenshots/01.png create mode 100644 docs/CVAT_screenshots/02.png create mode 100644 docs/CVAT_screenshots/03.png create mode 100644 docs/CVAT_screenshots/04.png create mode 100644 docs/CVAT_screenshots/05.png create mode 100644 docs/CVAT_screenshots/06.png create mode 100644 docs/CVAT_screenshots/07.png create mode 100644 docs/CVAT_screenshots/08.png create mode 100644 docs/CVAT_screenshots/09.png create mode 100644 docs/CVAT_screenshots/10.png create mode 100644 docs/CVAT_screenshots/11.png create mode 100644 docs/CVAT_screenshots/12.png create mode 100644 docs/CVAT_screenshots/13.png diff --git a/docling_eval/benchmarks/constants.py b/docling_eval/benchmarks/constants.py index 986d2d2a..7f20d17c 100644 --- a/docling_eval/benchmarks/constants.py +++ b/docling_eval/benchmarks/constants.py @@ -31,11 +31,13 @@ class BenchMarkColumns(str, Enum): class EvaluationModality(str, Enum): END2END = "end-to-end" - LAYOUT = "layout" - TABLEFORMER = "tableformer" - CODEFORMER = "codeformer" - READING_ORDER = "reading_order" - MARKDOWN_TEXT = "markdown_text" + LAYOUT = "layout" # To compute maP on page-segmentation + TABLE_STRUCTURE = "table_structure" # to compute TEDS for tables + CODE_TRANSCRIPTION = "code_transcription" # to compute BLEU between code sections + MATH_TRANSCRIPTION = "math_transcription" # to compute BLEU between latex formulas + READING_ORDER = "reading_order" # to compute the order + MARKDOWN_TEXT = "markdown_text" # to compute the text accuracy + CAPTIONING = "captioning" # to compute the accuracy of captions to table/figure class BenchMarkNames(str, Enum): diff --git a/docling_eval/benchmarks/cvat_annotation/create.py b/docling_eval/benchmarks/cvat_annotation/create.py index 9e771f7a..f3ddeff3 100644 --- a/docling_eval/benchmarks/cvat_annotation/create.py +++ b/docling_eval/benchmarks/cvat_annotation/create.py @@ -14,13 +14,13 @@ DocItem, DoclingDocument, FloatingItem, + GraphData, ImageRef, PageItem, PictureItem, ProvenanceItem, TableData, TableItem, - GraphData, ) from docling_core.types.doc.labels import ( DocItemLabel, @@ -32,7 +32,7 @@ from PIL import Image # as PILImage from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import BenchMarkColumns +from docling_eval.benchmarks.constants import BenchMarkColumns, EvaluationModality from docling_eval.benchmarks.cvat_annotation.utils import ( AnnotatedDoc, AnnotatedImage, @@ -46,6 +46,7 @@ ) from docling_eval.benchmarks.utils import ( draw_clusters_with_reading_order, + get_binhash, save_comparison_html_with_clusters, save_inspection_html, write_datasets_info, @@ -85,8 +86,8 @@ def find_box(boxes: List, point: Tuple[float, float]): and box["t"] <= point[1] and point[1] <= box["b"] ): - if index==-1 or abs(box["r"]-box["l"])*(box["b"]-box["t"]) bbox: {l:.3f}, {r:.3f}, ({(l bbox: {l:.3f}, {r:.3f}, ({(l skipping {filename} ") return - + def draw_doc_layout(doc: DoclingDocument, image: Image.Image): r""" Draw the document clusters and optionaly the reading order @@ -473,10 +474,10 @@ def draw_doc_layout(doc: DoclingDocument, image: Image.Image): prov = elem.prov[0] # Assuming that document always has only one page - if prov.page_no not in true_doc.pages or prov.page_no!=1: + if prov.page_no not in true_doc.pages or prov.page_no != 1: logging.error(f"{prov.page_no} not in true_doc.pages -> skipping! ") continue - + tlo_bbox = prov.bbox.to_top_left_origin( page_height=true_doc.pages[prov.page_no].size.height ) @@ -506,10 +507,10 @@ def draw_doc_reading_order(doc: DoclingDocument, image: Image.Image): continue prov = elem.prov[0] # Assuming that document always has only one page - if prov.page_no not in true_doc.pages or prov.page_no!=1: + if prov.page_no not in true_doc.pages or prov.page_no != 1: logging.error(f"{prov.page_no} not in true_doc.pages -> skipping! ") continue - + tlo_bbox = prov.bbox.to_top_left_origin( page_height=true_doc.pages[prov.page_no].size.height ) @@ -560,7 +561,7 @@ def draw_doc_reading_order(doc: DoclingDocument, image: Image.Image): true_doc_img = draw_doc_layout(true_doc, copy.deepcopy(page_image)) pred_doc_img = draw_doc_layout(pred_doc, copy.deepcopy(page_image)) - + if draw_reading_order: true_doc_img = draw_doc_reading_order(true_doc, true_doc_img) pred_doc_img = draw_doc_reading_order(pred_doc, pred_doc_img) diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py index 3fc6c6fb..87bfbcd7 100644 --- a/docling_eval/cli/main.py +++ b/docling_eval/cli/main.py @@ -131,7 +131,7 @@ def create( do_viz=True, ) - elif modality == EvaluationModality.TABLEFORMER: + elif modality == EvaluationModality.TABLE_STRUCTURE: # No support for max_items create_dpbench_tableformer_dataset( dpbench_dir=idir, @@ -156,7 +156,7 @@ def create( create_omnidocbench_e2e_dataset( omnidocbench_dir=idir, output_dir=odir, image_scale=image_scale ) - elif modality == EvaluationModality.TABLEFORMER: + elif modality == EvaluationModality.TABLE_STRUCTURE: # No support for max_items create_omnidocbench_tableformer_dataset( omnidocbench_dir=idir, @@ -168,7 +168,7 @@ def create( log.error(f"{modality} is not yet implemented for {benchmark}") elif benchmark == BenchMarkNames.PUBTABNET: - if modality == EvaluationModality.TABLEFORMER: + if modality == EvaluationModality.TABLE_STRUCTURE: log.info("Create the tableformer converted PubTabNet dataset") create_pubtabnet_tableformer_dataset( output_dir=odir, @@ -180,7 +180,7 @@ def create( log.error(f"{modality} is not yet implemented for {benchmark}") elif benchmark == BenchMarkNames.FINTABNET: - if modality == EvaluationModality.TABLEFORMER: + if modality == EvaluationModality.TABLE_STRUCTURE: log.info("Create the tableformer converted FinTabNet dataset") create_fintabnet_tableformer_dataset( output_dir=odir, @@ -192,7 +192,7 @@ def create( log.error(f"{modality} is not yet implemented for {benchmark}") elif benchmark == BenchMarkNames.PUB1M: - if modality == EvaluationModality.TABLEFORMER: + if modality == EvaluationModality.TABLE_STRUCTURE: log.info("Create the tableformer converted Pub1M dataset") create_p1m_tableformer_dataset( output_dir=odir, @@ -243,7 +243,7 @@ def evaluate( with open(save_fn, "w") as fd: json.dump(layout_evaluation.model_dump(), fd, indent=2, sort_keys=True) - elif modality == EvaluationModality.TABLEFORMER: + elif modality == EvaluationModality.TABLE_STRUCTURE: table_evaluator = TableEvaluator() table_evaluation = table_evaluator(idir, split=split) @@ -276,7 +276,7 @@ def evaluate( ensure_ascii=False, ) - elif modality == EvaluationModality.CODEFORMER: + elif modality == EvaluationModality.CODE_TRANSCRIPTION: pass log.info("The evaluation has been saved in '%s'", save_fn) @@ -312,7 +312,7 @@ def visualise( with open(log_filename, "a") as fd: fd.write(content) - elif modality == EvaluationModality.TABLEFORMER: + elif modality == EvaluationModality.TABLE_STRUCTURE: with open(metrics_filename, "r") as fd: table_evaluation = DatasetTableEvaluation.parse_file(metrics_filename) @@ -353,7 +353,13 @@ def visualise( md_evaluation = DatasetMarkdownEvaluation.parse_file(metrics_filename) log_and_save_stats(odir, benchmark, modality, "BLEU", md_evaluation.bleu_stats) - elif modality == EvaluationModality.CODEFORMER: + elif modality == EvaluationModality.CODE_TRANSCRIPTION: + pass + + elif modality == EvaluationModality.MATH_TRANSCRIPTION: + pass + + elif modality == EvaluationModality.CAPTIONING: pass @@ -371,7 +377,7 @@ def main( modality: Annotated[ EvaluationModality, typer.Option( - ..., # EvaluationModality.TABLEFORMER, + ..., # EvaluationModality.TABLE_STRUCTURE, "-m", # Short name "--modality", # Long name help="Evaluation modality", diff --git a/docs/CVAT_create_groundtruth.md b/docs/CVAT_create_groundtruth.md index b71f45c2..5fcd3f26 100644 --- a/docs/CVAT_create_groundtruth.md +++ b/docs/CVAT_create_groundtruth.md @@ -1,34 +1,152 @@ # Creating Groundtruth dataset using the CVAT annotation tool -## Prerequisites +## Prerequisites: create dataset in parquet + +To start creating ground-truth, you first need to have a dataset in parquet format. This can be done in different ways. + +The first way is to use an existing dataset (eg dpbench), which has potentially pre-annotated tables, formulas, etc. Hence you can run the create script of that particular benchmark. ```sh poetry run python ./docs/examples/benchmark_dpbench.py ``` -## Set up the necessary files +Another way is to create it from PDF or PNG files. In this case, simply run the following scripts, ```sh -poetry run python docling_eval/benchmarks/cvat_annotation/preannotate.py -i ./benchmarks/DPBench-dataset/layout/test/ -o ./benchmarks/docling-DPBench -``` +poetry run python ./docling_eval/benchmarks/cvat_annotation/create_dataset_from_pdfs.py -h +usage: create_dataset_from_pdfs.py [-h] -i INPUT_DIR -o OUTPUT_DIR -b BUCKET_SIZE -## Online annotation +Process input and output directories and a pre-annotation file. +options: + -h, --help show this help message and exit + -i INPUT_DIR, --input_dir INPUT_DIR + Path to directory with pdf's + -o OUTPUT_DIR, --output_dir OUTPUT_DIR + Path to the output directory containing the dataset. + -b BUCKET_SIZE, --bucket-size BUCKET_SIZE + Numbers of documents in the bucket. +``` -## Packaging the annotations into new dataset +## Pre-annotation with Docling + +Once you have run the Prerequisites, you can create the files you need to upload to [CVAT](https://www.cvat.ai/). These files will be created using the `preannotate.py` script, ```sh -poetry run python docling_eval/benchmarks/cvat_annotation/create.py -i ./benchmarks/docling-DPBench -``` +poetry run python docling_eval/benchmarks/cvat_annotation/preannotate.py -h +usage: preannotate.py [-h] -i INPUT_DIR -o OUTPUT_DIR -b BUCKET_SIZE -## Running evaluation +Process input and output directories and a pre-annotation file. +options: + -h, --help show this help message and exit + -i INPUT_DIR, --input_dir INPUT_DIR + Path to the input dataset directory with parquet files. + -o OUTPUT_DIR, --output_dir OUTPUT_DIR + Path to the output directory. + -b BUCKET_SIZE, --bucket-size BUCKET_SIZE + Numbers of documents in the bucket. +``` + +In essence, this will read the parquet files and set up a new directory structure (designated output) that has the following layout, ```sh -poetry run evaluate -t evaluate -m layout -b DPBench -i ./benchmarks/docling-DPBench/layout -o ./benchmarks/docling-DPBench/layout +./benchmarks/ +├── cvat_annotations +│   ├── xmls +│   └── zips +├── cvat_description.json +├── cvat_overview.json +├── cvat_bins +├── cvat_tasks +│   └── task_00 +├── datasets +│   ├── test +│   └── train +├── html_annotations +├── html_comparisons +├── json_annotations +├── json_groundtruth +├── json_predictions +└── page_imgs +``` + +The definition of the annotation items (DocItemLabel and Lines) can be found in `cvat_description.json`. All the other data you need is in the `cvat_tasks`, + ``` +tree ./benchmarks/layout_bench_cvat/cvat_tasks +./benchmarks/layout_bench_cvat/cvat_tasks +├── task_00 +│   ├── doc_03f0ba705b60a81144dd4669945f41e9ce1d5a399ee671f7e95ee15a73f3388b_page_000001.png +│   ├── doc_041e0f3a476814054ccc97b9dcecd6e46fef2a687297cf2bcbe0f3d1d42c543c_page_000001.png +... +│   └── doc_f85bda78041c552c58faa1c83d9bb5cf48265fbe96330c4476e4b75725c0c71a_page_000001.png +└── task_00_preannotate.xml +``` + +Here we have, +1. the page-images in `task_` +2. the annotations for each page-image in xml + +## Online Annotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
To start annotating, go to the [CVAT](cvat.ai) and create a new project,
Next, you give the project a name and upload the content of `cvat_description.json` into the Raw labels.
Next, click `Submit & Open`. This will open a new window in which you can create new tasks
Next you upload the images you want to annotate from the `cvat_tasks/task_` and click `Submit & Open`.
Next, you can upload the pre-annotations for the taks,
and you upload the CVAT annotations in xml,
Finally, you are ready to annotate (click on `#Job `) and the annotation window opens up,
Make sure you adjust the bounding boxes, labels and add the reading-order line. The Reading order is simply a line of points, that have to fall inside the bounding-boxes, + +
+ +## Packaging the annotations into new dataset + +After you have annotated all images, you can export the annotations, + +![Export annotations](./CVAT_screenshots/13.png) + +You move the zip file into `cvat_annotations/zips` and then run the create script, ```sh -poetry run evaluate -t visualize -m layout -b DPBench -i ./benchmarks/docling-DPBench/layout -o ./benchmarks/docling-DPBench/layout -``` \ No newline at end of file +poetry run python docling_eval/benchmarks/cvat_annotation/create.py -h +usage: create.py [-h] -i INPUT_DIR + +Create new evaluation dataset using CVAT annotation files. + +options: + -h, --help show this help message and exit + -i INPUT_DIR, --input_dir INPUT_DIR + Path to the input directory +``` + +This should do all the heavy lifting for you. It is good to verify that all went well by inspecting the `html_comparisons` directory. The newly created dataset will be stored in the `dataset` with `test` and `train` subdirs. Evaluations cna then be run directly on the `dataset/test` directory. diff --git a/docs/CVAT_screenshots/01.png b/docs/CVAT_screenshots/01.png new file mode 100644 index 0000000000000000000000000000000000000000..60af872b6f20aaf180ed770dac8c00ca19b0da5f GIT binary patch literal 100752 zcmd>m1zTI&)-I(fQXGmENpM=+ouCDZLvbj@OR-|bp-A!K?oyyF?k>gMU5mR*AS7@@ z&;HIi_kMf-f}7{bvsTtxbB-xvj5X$X-!` zBR=A*lJyAbG2-~>;eHnK|2zrs&3gPl=Z}&R_mRZaCFSH0M|BeiGc#Mq_jXRd*}cCZ z3eH%*(RR{SR1h?=vtczdwKFzjb+!5UPy|WXRS&j2nevTbFy)AvLK#dadfkFGIC|Hb)@-MCI3^8l$oQ6gXKpjOFLW8 zL%l}EcFs;B)YK1x{{8t^JI!1z|0BuP@vm+nI>`2LhmC`ko$cRsBZ>+?ToqKYbTzZq zk+QTw3=cwvC^x%+@So@Z*PZ`J{I8PQ|0&7A!Nc|6MgQy8|65eU(ab^8&ITdVN%TKc z^H<^jzWG-{VYY{^|JP9bYn=aFMGUm)Q(?A$Pnzgcdix1>BqT8;IVtfsu8$6uP@BxO z4A@S1L}C@p>60&(2|(fvvIGEW+=~~&U4ik8e&2=PT>SXF*{6P>Ee0fdHd^pG7%G*5 z6{o~VMb!+EWm=6$1Zu?xN5J$sYlpp3w%!iBqA3;6ucZwkA9$ zt7KBXd2!@{$KxS+VPY|2^0n4n7JoDU;e^QG`*Scj4z@cqYD}euD>e?qFZ4FvjP!6Z zQ%T&=Wp)d$+V5235(9C+fHcNYZ%nRmOHO0@8SmV<%$a~H1}7saH_4%dh3T@&>31^-5e>HOO; z-k$jB^bIU5U)AWKTfFpj>Py?j6)?ERkTaFehz1)VGY&3Ai^&0;@km>@Va{czOqFhm zr!8K$TRbh{%>S#-1Y+bRmN()#bvOh}Htuq!AHWo{4SHXUfxHnYfkfuPcnlKKHi_tma1G3D@!ab}DwJR_v?jNY8IgcbBDh^(W+K zX6so&X)YR4&%mBP^kVM^g-ENWX`*h(_l z;?C&8y{@rY(50BIvtOs`tKTna>{sMldc)du(k?k@alTnGz{-@$XUEzD^nta#i|*8` zwPo3#DP;=+dS8pVSVkl4y3)T*1hS}JQooggFMq~>;XG4fusJTz#It@`D!a%h| z62?zPOA$Q-GrF6z`P>YU;RWD6HxqVO0hw5f@wudbY)3cS?B6Xem}~ZMsb38wns;aQ8+dzF;jmy+t4KR%df8hY4`=->dbvyj$uf%41;Jm-DO$lZsh(3{CM35 zwhlDRIEyR5tjZi*bIiQeACqHt#@~?yLRHAVx8C2j`f&2oABdj#;>0nCo`%S$0HB== zqN@76ln$MEGF9$QW75RckW{;t`le&A<5YG09q`>cSQj`R37Btmu@lGlxyS|D?4IJh zfH)gMoC&^-9oDWakNe!+Y%ACG1c&-KOf9uq=W8^=jw}6-$)bRitrX2+k-m09TeYPjR1DvoMc? zNgqAibv}-fX!dUEd7X7bTY=mN`b@uY)HUo{tFlIO)3^dZ;;j)`Cml($=WN;3Ysnkc z^VoFp-gcqin#jBvwCLY|3u$nGU(P7=b7lA-l-N$E@srKXrs3V@*~mR?gy7RskXG}a zhK+bvhKR>=@M(!lbD<8KxSF)TJy=ptzh+@QP zzxSgcV$bY*qYtdd$C~N;+q0NNW_0}C*CAnSEp?j>IjmNC_Cph;iN2|#vBeq5&#eIokqCfcdG*m0DM|g`vvEK8t(9pno^ZFzR zyeJsG0xe#7$+zrk;x=8Gp}|-{A6KSoxpEre!rk6Gjn5R^vRByh!8m5uY8@4P{i_D~ zS3mU`+x;2a=E^;MMUP}V%~7fFMAIzby_B8L?E)F8S^Ed%;H4^4r3Pb+rPLMJ*4Z+o zrM78{r}RY&O6w+z-3t=USP~|~3`o;)bDgQ^mRU_Ts6tic`b|03O*V-+ zrFA}`8XCg!TKe^bj^q2-xm4~>f%o<|^QG|lz$dMmB&xzKhYKym-%Hn~YA(t4xX)ZT z$1>ZdHqy1b9+`Nd!4TJA!|6f;WGmO*#?ooR3JFT9O}mPAA8rz`4RyT_dc2En%GacI z2EqtgQFdp&^Ra#nhTuN*UYgAKU1alxkyvnm zrFL;#w72aC(?YGC-DZK;4oxxAH1H}m@3T#-XWm1g!7KuB4~bTFn2iMF>^t=(s5$a_FgI@Q5mz|^vKQuJ3 z8FcE$DfPly;kEbEPVXG2GjEbJE#)|mtMG$F!!S9AFjYKq1duZ4cp>h5ql5}&`&tLK_JX^>JZ zT>&{J1vS3qYd&5r*cTlq{nYH8(B8PYTK@FQxa=Dz0%StGF$n=4Qg(rfdKJn@;j`XX zDDVeG=_JB2w7hX-pbsHYFjCQ6Vu|JY1$qf#gSE3&m8NGXGUI_>HuTj&a7TujK<(U? z6WTl|vGIn`Ji`xzmUY0H#)yF#!<%tSMqm*KOflj9_#WPBGyZi}+@0zZRFTLU%g-l@ zw4Gbd`>HZ?Y0$}9wlxp5hm4PEnUy;oayPUB8a>@xM-W#gmO4~Ze8*(O(Ks>B*_NQ~BshWa; z^$~~a-QvLB-SlBnP7Av3ikX(HYQm@iTPK1R{JHDc? zb-PS3;fDA7K0I*0X4m@-<-2dY&F$3H>oL6o;IBif|gsff_HXdg**c20dZ-b8nF9t}kc_^dPo z2!r#>D%=?(gI}iv8Sx${yohyk9(;*OV2{k@zX2LEENn!PAf{GwyHU%1OXg~$E-~2k zA=+p+ykZJ6t42z#upwOpkURpQ?+k=jR6k)kz$&U4{&M}CHk>~dgR&d-Qtp;K59^h7 z*r}4`Xb-+=<{bgLQP;CUywhHlr+7v|*WyqW+3Q_fipmsr*_=sOF~(ygf7J?VyZH2sYu&DcDc+IA?(v zc~c*h+~2tJGGO>+C+?7%icUF^-dpc-+Umafof{bWWoz$KIPSM_!ePxvr2C$e(iht3 zrW$oiNaf=LO+*4FEf7>^fLEbB_=jj}vtTFBKAepb_UHB?|N04q+VWtO>-I`<*3kdrAyGm#!irT%DyHVd zlLF}27OaLhGNN8$*ZoT#h;LrhQZN;j6$qBbwmr-N4!;j?hoJBFPtDsXN&B zr&GOGzucDyNtI{_`**UDl6W3kOecaeqs4o_9hVpiQv(g|@sw+sq4CAP%9!@5cHpP^K-~z1RjW9WvqH?x%M%e0r>klVnfB9Z@DTRooe$ zws_;gaaAc9pM}DrTMjcpy8_$od@F!8x zFh8DhYcr&5TsxpKbaTe6*?=7(;^)rJ;{D+b!2~AG+Nr)fE!qsFIkq^R5S}Ca%M!hy zjlKZhgC@wlN2Hu+xZy<(akT~u3f}d?8YebB*aH|~#W#e~#)@J@Y~Gx7VN7(iWWs() ze&^wnzg}2Y&+z@ES%4H~Q~S~DPA=wj@uM$>kC|iq)!tH3K(tqG9GLzxpP8XNj&nX3#)K006?<{R$T_HUc6fvQWj-E z4rv<~%St>+Qlu{6JE#}4erYeYT=bSy3P~AFwk+JqE>D&)8nz@%a^2_&kJ zw2rU~`!w`&2hm{iV^Ji58Zkj*LfrGD$K9yp=CqQRa|Arj9lJ@ymZj~gKAC7mO zc6VELyu1|kV;+GL=iIOEf9F1~m$YR}gr21kV)e;ZB-_(IN@URv!c;xvo?h+K& zOTpTw+L$pwE&JGbMx;m?{CHb+{#^hMw#!Bt)Hba63O~t8er%ftwd#otfVbx5i~aZh z#c^1UU*4<`^p=<^(l2&_=k=*vkHTBeKxuS=;RANVtD%su8?4uI#JurU)WYmq3p!9;d+IBAyYjazm^7%|qLB)jX;3i>yzl z<=y5ruJKXeNr-@cl-LrX#DoFf2J-|z4qNx@M)jg``?2GlCL(4MR3l;&gKzP7_$H>| zc|?*)LHLC&23zXop}er}C4oXsa<3JLmtm?SN9)$_z1`7t2?)ADNGfZx>EhR_E=^uf zNl1s{PM_v+%FO7mL4x8B#LBov?HQqMK7wZKH2B};zk}Z9SLzn<#kPyVq+G?3FKL|I z;qExd?{O`kSw1VVifZ&WVx!}Fo!@Ot76Xr|8I*cVexdH+Z7`^VKYYdUtL$Ld%z-E! zkc0Naf0Z{oe3<%qbRUW4)N1eZ+&t%2gx8#p(;PTq?gz9|0 zP^4r^7gxWn$GN2EDb+T9MdN7GZ@#p?VGIw3cM95VBnt*Fj&k&r%JImAU1Wx2{2EA* zH^d_+Vm(ZJ>u$NAwl*N8fI@@O!7hnR)oUytDo#I)MSx%anUMoLW=F!k61 z>1I9#)yF6IFJ%WCB%`;~oZ&rXpd%oydebjyFu@?y`a0PuzN?MR8&gbg?A4397PRg} zNfT~0b+76!%ty~mezJFF!#qJ{Us9+Ci+T5EUNvy`yG}S~j{HfE4-zAz;lT}qElh_^ znatX4Aj|Sd&WBrPI)aC7J6lF7p7!2Dpj&nzUC~FOR0zl=U>7rOnGn1L`AFv2_9NfF zWVgqE$3k=(A83c3zO3J4G`c0&Eqb(jbwS*~+#Y;)Y^@iD<%ug!3I7FziBF*JrlXMp zA`Bk+cgm32rpX6Ht+Fl3xbMhz>)LwCUOeKtpu3aI%r;30y6z=#tO`z4vRd9x%hqZ+ zi?`8BIW!Nramv%9S4TH_MT?94M8Mw_{miVQ*F{0%y2H88WUH$7M~#lqyt zgy~JPRpUD>4~D>wH6GRRGG;Tb7iDlMnkwV2jiyW(1hJr6;B*GxlgCfvL$s5#+V39{ zrVG=wvAh!XUVZX!Imh_9(PGiBo>!q4_~)~9NJ`Y>0_oqM4sgK7E0Ts9%!~@t4w+R) znuO}Y$!3!#Jt9MjBjPGnn94L*hgmtYrv+XST)ny0!Ae`uV_g#PI@N2Y8^@l+I=5N2RaAa16+|Qcdpi+F@JO`GsazzOq^b{DLO|+`{gUsFlk(IkPonvpYqiApyI62t9-jtc8Y|;rwQG<<=YPO* zTDe5Eix&t_70sG_Dveu ztQ&<^?m*ik|8`USLgk$cO)M0SzeK@`|YM@sPo z-HBqAzvi(3;aUgmAq(%CKALAu7A61s1`u+M3~WY*Itp1#lKxQd`t8DJ0Ab8 zxL4nzg!cm&w_e%=mwv6mRr!7EwX`w(O}@^*W(CdPiHw?PT2w{PxM6E(HR(Rg%+Eg< zjlfnLy8;;J6{}0I=}j>N0*C$5Upg_H56~CcV~|BTa~_lgt!!fCp18HKl4NLB`%q_prWg^D%6 zSJc=d6IT82-=RXp%?M^c?K{r2TA0bB#4A?{U)u>7EeyH*iKW)0L7L;BNBRa5sCf8W zOXNwpPUx{E=@xfeVN$#KJ{41Et<{m7ULk*!B#jZ zN~6e00C)-wIUPxxT>Kbi`?_`4wh}UZS_Hvy)wu zflI7NSVxaMu)VQi#MIk-!B$f?YfkA+VC@OoJ0X8rE~+y8zaZwW0Hn<}Hh%3ED-aLk zg1hDAYwI663cD0RRVrzSsA@gxO2On`_+XnW_2*IXZ&4uI1}T-I(VeZ5{Q@h>5jZSh z$$F*HGCABcR9KqQW8#!EL4fBvzjQbT)-)ME&f4Ld;zAr!Hgq zc1)a00=c+QSd8(ZfY>R2%$NmdEG31-o&$OTOBaNU6{{rlj z1d+ufKx$~5X1I@@Wz&52b3*6x)<0(ve8ZCMibEp7U@;}OeA4mTQG7|#6YJm?>7yNTYh#;N=xgP&LDY3Wt zLrDME)cxOw1RP{JWR}c|;WUJ){C$%-Up+Kg|2p~dADb-t&}7ekLC2JT92$~`p|M}J znEuBpxOtfBvlsh=mj5`_CJ$5H{UuZ9Ash0yt=aT{P^p3qrQwUGn0ZsTuahqjNxL8M{|EA}VX~b)G+2NGn6Wd;u z`I>p4*ws2$hn-*xqKIAu|61@T#U7u8IVTk|Ww4GGQU0QN=xzHqK@$Ts!18rA&*oC5 zo<_^Zh5ibUVJKLhr$5IFo!&f8ru8Cbx5d%8+86dy(*^eGOZ z{f&(NimANSF6>8nZiB|smSrU^Ime40x|t*A3X*-~DLIy!no1 z3T`=>dbdAaY<7EfXf}|*LPJMCU`?Bp@GZB92}8X|z01o;ExDW(fNXdl6f{Kk=-G|D z0drLEtrK1nu-~EKhrCbN^G5@t#YnG_->VX<)3f3wX#hNTD>ekoEJ0E5>orE1_3x)| z+%RLAD~-@tY;GT_ZBhS)s5a@L+KcQP-A9u{hI_^a+-Gir2vg&xm>gG@{7n4;L;E$t zRuDsW;HIqe{Gq9?{bR0zFVW*nj@Mq)evy@%j{hRo%$@EM$J@aEV?di2+4sw25E19m zmo~xmGy{Y=r5Fe&YP`qx9p?I+pb>3hPT(8(SrSJ*0R?$3k}bo5J0s$3{i%+5SivCC zOFG1qqui+48zxPf6=C?cN$g2tkU}KhrP~j)BLCOqs~tTmT^@ffres z-^y~E&GElEc5VDLVp_MS7U7QAoQLb-ZF}}gp7~y$c(biOKJ^HG#y|>>RsVdo6)`uB z%ZisvbO!9l?Gu*3aL+)r0M0SG&u<~iYTngvUxc)If_`f`mbBhM9T4P(1eyqbW6>Pu zW6y1&0R&@Z)M43ed&u1rK?rHpxjP5nS2i8m*ri^U5vzahKRD^YVMBnq$qp5Fh&5Dw zk#6-*&nYdhDV0_PStMv+x!GeNHsj)3wyl8cZ(r2@TLfzEu>O@V;bFDFjKI;_3k_UTZai9bl=nuntN~czX1J zi3^_YO$8|p?R+;C^}$my^hVfSmA81)JcvRET#ma-`sQlgHUltPm-ySY;C?j2yy-mV z2k8N-^%cI-eHiV zMcYpP&E2(FmK1WS|z23>EkYA{7-&VGtjiO%LB-{;)srzWMyk7vi_G{nfQ1cbA6u&Ta=LKs_Ze`~vkRlf~b@J6*~1 za!M<4!LGIWV7a+bJf~C$vgkO_{grIt)~0r8+G+BJ+80+W^SYCvKM;$oUydPta$MRD zd{{N1D{z&MiWiI)aWSk}Z_ba_|x40oBPv2B*uk`)8E8l0crm z$6@s*gU=bmfV?4eoU}NHgSTmou#{2RwVhy|cxO)jbcf1W>qGd!H!tlYSSL&#!QnZ} z#_{^zbmUxWB^9c{haiI7t9f5p_|#mp`%RKb;|e*_J@7yV*zVTY5)hdC@q1MTqM6&3 z`@6F(zSerYK*#tDqg7pwz$lVe$kYTu^`t~Io(nz$wVv{B2$F)QY}Es;&MNVNpt$fd zOOkm%OjP_9ezGlsM=8>3GLsfdb(JBb?OU zl46~fa8Crk;01zEaj#KQw-$OuNK1YlbB&-FGJA{Ookk|6+BUrKORd8Q0-owZQ)1A?qsgHhlD<+?i$m~wwE5WaIZWeA_z^g$2+L{2wv&j#4ol->H(`w+NTzQ`B8CrPve0`kRAj{Yg1>$T~pxhdVPTw{)Nrc z$nAkAEopz8-h|fJF ztjstKTc{9w67`I%^_1+;ZF@K!CzNUNK~o&$EBm;7%Dt4+C13q?-20UY>&pyC94{R% z4+wLT2ZL*}zP=PE`EtgJQ+f;Lrc6Ol%q<+MvQ<|@|hD7(5wD(?t z_s{D3E46#7^D281tJy?{X|-qf7{5)lEGr z^7y;qa}z6Va3i-oz&!M`_idlDw*w7w6o2+XCW6{Iw3uk>bpk;o+NfoCV&>g{=oUuXI2F0GH=!6C*jdYW7Zu*%{P5N$YFFh=L33FUdxm1^7T3EYjC zO1p4@4%(VSOh-Q3D|(9>qlNqlCNxfCzgOX{&9SO_rN$LO?>W5j*9EEN+~%n-9(ac~ z1Da6|Lu0>ue4qtB^ZgjRrbS1g=qCtn@(53^9W>wW!^oZvUrC7vZNOpBStn3U?D<17 zO!IDUZUW%}s9BxkE(#qr%bItj**;ue;ULI*siN-))h2gs)BH1{g@P%a3o-%dlOwj| zL&!3MI$Bj6h5f-bWH#_WL`~rRx(~N8wp-B0>kI^k!59NyoF0UlPI`lQIiD9}rgTO5 ztOqv=Px#yxXJr>&)nMR`nt%~{R(<6%tz%K$5%fa29YS6hN550ml8srLSQaT1f_Z(u-@{AhoxiRHv8UR(_M) zZ;0S&W1<22{4qnfZ5z&h|6+Z9BTS42LlB$YY2FrHP(j~IMfPR3Oc9&Ke#Y_q{rHfH zkB^?Xyg(dZT6+;eLoI!&`QfsoUx!wf!dU*baM1m7WBfDvs^Hd-R!<@|o@!D{Epg-v z^>n|Ci?U6xd>Z_{k-k=z^V{?r?PG@MO+hHpA`W9IdG^$r)ulk34k)Pxc0cu-a!=qoR#u~MC-2-lgr-=wP_ zf;2IxeA+QpBg%Fedb3A=R4*Cj0B1y_z^ltLI_6_Np!m+n+4BAnS&Vccsf7z)-d?xe z9fQ1QwmqjxIQx)atb=L0vrL-ykcnOQrA-fN_CIkotHZ9HE*eOO9gc!*NcN_%n;-B)XGiwbbVkm0-F_!VM39i^O7Ap!7K>+U4w_2F|r_upJ zuiul8&p0O{-r&YkpL4|ec3h5d=sMiQ5fQ0A)yISKo*MMh()t>^>uOM}CxJbI^tZ=3 zV0xtSRZM(K%NDY#ST>u)NBA^ES-8`d*Kkr`jeQsQGA2N2 zwO(&qAw$s=FNAd=8JA!QcEY6)1-6)+QVjn3U1%>Rtc5FLjfRYZg%&N?6}TBuG>T%7 z(P-?f8zt6n^b(*Fz-3!Ep}t$79s zSFn?;WcZ_I%M*Leg;B7Te=v>Inp*VzcR^iT(cG=w5Dgc3{P%CF#+RHPQdffC^D;?k z-kmsN`wm>O_vd>35?|hdt?#Fb4^?7tn5=McoCb?i(<2Rf#G^h|#uYxel`Hi+_5gz) zf(0UgC&w8bI-b;A7QYJr+P?Zr{II-l37-T#4L;on*y&Yz4)KX|PzAS$;0C*V;^@n; zZ6!024zSs@ur|1ED7|eslW)C{?;@gS@`J^>d6r{C{EsxPooX+`*PljsyPZFw6tK`J zVY}|uFueB)aUnuIEvKigiRrw}YODw+Z17(UsE?J&v zSpuOU)edzUtj_ zw8TAr+1ROU*HR=_71}3b0Q8O4uKCjSvgPLWxqg=<>OLfzRTJs5GPSVEv@S#pk+@L- zMMDH++OoDVRIKkq(HiwijHPkRm=nI7S>SL;uk2BU=KG4GkZh%g5Cr%?{!b0+BB?N%(=0*Q4X`9J>Q@TKcnNgmasJ842=_dfB}^yA`D1 zx=yw-TN5g9i%!a&u0aPMA1!7mpXvUhRLT0*DnoRNo^(?NOtV@9Wwd7HEax!cr9w0#H34GtRU|^Z<Af(VLh+!y}idDwml)XkL@L+MpMxu=hD1$E5KesA~GJ$aeeY@on7E6oBR61HU^Df zuvJ-H3qfh&WK2>Y4ZAZ88U+Sp9~7s?jkFVLBKg zVns;(gyI-FPvyC6y|OYN$so_65Uu@IixtVqymH(K23lO;GD)s!HKSZsL$8jZCC4v) zPEdVD>CwDZi!!yJY^WH58ElQe{B}jKi$zu^M`nZw(8ll##~GLz+}H)^f`KE=3m#Cn zFOo%fI~J|lgSZa#y1^-o1+scBRuLL+=|5th(wDEj>}NhYAV&&cL~NS6iT||2#iiF0 z#YVMCDgM1F0AoQ_b3R}NZ9rr&4daXT#lXi>&rPNQoV(vRHQe7FWyPo|QG;VoX5M1o z-6BF2XueBZ;CCkP>`*063ROGfCn}TKy8)F+@QaReD-`+GSrk1}R5e_=?L;IzfN%NZ z9J!fer*jddIw7G@R?BK^&tO9Jd9~J-P;BdX#8w;Zy;qnzs&d0c-^e)WWO-I)>V|%i z!z3@5)CF%J_UhC?-`*m2QfX2NRHZCaxL2CGVz0i=!!k!$$D}# zL59Lta!ox~ojF*tUjmtn(b+~Fs(QSOZMsHswVWE^sSH4VRQPF2z6c-z7)V<2yg zJ;md!iXCUZ1q55|hu#vG=A;1UUO)2X&})>!gnXvGh(e~lXsa4is=a=v@go|F^x}oB zT?NfZP;jFePx?utHxUNnMe!AS;GZK}5;kG#y}oW?=hHJ{z0;shM;vEwr=!F}v51k& zm)7@D`+Z}jw-FQ-0eefMs@*I4`@FY%e^mmVo9qhodqXkkw9NOKe0_^v3;C;F2ut+E z-tV9nrm>UWM@)X?^-*Ni%?JL;VJgtb32CF=%4eYJ2Ct# zVf!aDY7#1Tr#72Jq)+dmi>7S}ZC<%;J{(=&EIRo5G=oszU(^2U^H&Y>h$K!|SX)-# z$(rKnxMK48b9Evj-{q^aw2J^*U!s~LvxEQSMA>D~^gU0z9G^L$q&~neZLXkEp)rcc zHx@4md~am37BmwCsp4oyVKb%S9RJD2{u@9MkjxUwPOp?r@Mv?ZIEpELH0GV~k`z%O zrnn)w{13{qh2qOoxJAE+$@8D``H^A@`UOA8Y{iT-tKsjr zqEe4`HZvLp5<9{KG$hXx{2*YO%o1^?+xy1UK!@Z) zrprrIy*8?IM50?HlSG+lW`b>2z2)P63Su>roL*OnNwl@S@)%18mbOhxat-WUSejeH95V4V zvP>qTPfy>ytQ*mKYC-4P2DXR;e!x@ZsEy{uPSnioCKhwAg*>7wNqNWJsK6+>#iyAkSP_?0}KjaH;z zU-1BDSTEGD+@5B?A8L8LARnH2qJ`aWl4P2UCHdZR-oij9$sry4=sbFSF3s~QRd_^( zGC_h|rfAvF`%a*-|K?m45F(Fg2`QFuebIX59Ffex&_SK9Jpwc`!%CrGPIP9hru+jR zCGcP;-$=dt`3F8yoEm6qa5?#XbBUR?J74_*pq;gNlk4F z_0jh2?DD3>QIRgs{EvMd^K*64uonprc*paJF0T?bAw7cOxu+H-X97yA%hit3a~dvv zt(&=p10HO88YK-Tn?*n(MPi}C4DdzxIV8c(;~=A=rUlr{T5wXSp=@rYH)H*UOYbIy zIgQqrUXtPPP~#->fBp;L-}+7$@wpEPzc;>u9S!tZKlf#njyZ<9QW(|rLpz=#;2c&p z0rfTW{JU*xWqGQ>=J>FBiOhKx*-m5g9d5f0}HH%5;YMi(<0QqV}@b-)! z_ufXsUvy%`9DP3o{u?0h~KfuolGbFjwwo@n(2elrSsQ4?Tm- zy}oq1-Bg8t-Ba?;U;9*Z2F6}J_%3s?*lHm?$MxHzpRrEy6{x7B@e59=UfcBch~Q;0 zcC69NzR{c7+=f)!>*l+ya}l|$8!4gn*Z&(#c_#&UMTG->!js&(JAWC*Fce6G>)Ml! zGhz@!m9Z`=Jn6(i2%zt9Zuk`21=dN5y-8(j+`!+)*bQg+kFo!I@bK_{_0+*7 zi8(s-DwSS~rvJFFfA6Nh5C_p`dKE#RUplUgFbhXIU@w~9(WHq(lCLSAZPg{Cq8u&B zi#DN_|6XpM4NBkMWaj#nJ!4lZjI6F#;X$|P42N*-U(Vbvv#h^u{Nk;Q|2|tDwEj0p z@ox|^$0|8t)LTgNF`iQ5HR%TZVz<{DmsQc@AZnymZ(^;%Mk&c_Q{GBS|^ln?a^Q}D8j;RLT3vC1!|fwBJ^^lrn%4G!7_r?AVhcXE zB|iwN-)$J#UPS{O`Pwv<>eZGM88p^BDYIFq2{8o;W`*h~+Qlq^c4$8ocZpXYDZ-cZ(4_En=0@ZhHm z8etc084*m!kDoH~mgUo9NScAh{V)ywJbL6O>q87|ASD zbIj6sykMv#vRCB*9V>`Gj|5kyRd2>Q92k)ejP3KrdDu4QHq2>a>(%C4i@K}NHJLfi zd3JW^(9CLlN)YP5au}*f9r!x4qRmV3Ny=?fhd3d&zq`VI#E2(--->=ZzT$)QT>Z~G zO!Ld!H~KP@R@GHUg&`%M%r3JxH59S&u3rE*s~xw8Ke;U%4(TR47@U%5N#W;CLteKhZci`Ag*?SUUzamhz-$t z&C%V-!F2(72Izcd_B2^oi>~Wm%@kQGv1BN9ju1Pl9VQg{;$xKre~|mYPB-svkL}DK zKtk5b^)$!f7cvyiZ#*<{;?IA&AO0MHwmpEEIm77p^H!xcMn$Esw~yxe3M(J*P`6GR zO4W!W`@oNdN6gaEweJhZv=sO6f50jNrMuRQ|CQ@ z*p&a(?qNe|pO#@jF8NoFf;5NMjx&2whmU6q3C>vGZWiKPT-JY0oKm_c@#-$`q15BG zUDUR1zMR&?;hVh91q!T(bET{dur?Mgdfy%vmx@+2h`>%d^wJTq{dxbxnj0$ZrpkBx z(^3nl=-SCtj3ay^hBuOIks%PRZ0Yvfm!f(_P~|?N@JcU2AYU=mwth1K@n-|Vd2MS@ zGF!$OeMd$4SSJJ5)h{fABc5Aa#l__6aO+Zdg?mY{lve_zazwN-PyBgaN8Mw#-SMpl zBoyC0xG(8sb@&dEpLQDP>0`)Tgc%?tWAUZE!Fn^lsT1fG|X2#-69C+JTp5uiN^&Lk$xsj~fnLgh22y|)Sa>j6_|M$1O zpHa=a;pg*%5rCr$)-G*RU)2@uoEv&2H_`8Q-7Kf)esymu`R^TH zg~zNn+;9i)u3eZj(`T{|GwF!%B2B&TVczdP6}SET&!*YZ)c9r-p$uyz1VVus;hSE>E4XF94?sS@as!~JIqU?lU_Hi8&mawbcbVOXe;p-qM zf|NN|DAoPK9~x^-+C6uBhNHId%> ze88kVeCc1sJKQus2g^RnChnAA_$nLqg9O%J3hcp8{Bsv>y_1MD$|oiUy&XEY;ivgi zKl+HYwYpa8Sfn-LjXX4O2h-9Gvrll%NO;0>nVeDFrz7$flacB8Pe1dEfO=z+j-*lc zCW;h56MgRl@uP3muTey}aYZ@bU+q@aiM>g7)bVbe6Q1x*L`@upWAZ0V6HCfyOqAz0 z_wySYYyuzocTGoTqm6aTr<;aIcjGWSVVIyGO@u8R^+tNwBOzVkKEgDK zIrrRin|tmMo5&bph+7=`I^+hw+@Dk9IQ7(1n;YQ-X{8U8S7c@MiHBFS(@#IWVG|^l zw93at7hQC~UG;+~5sx&;8}W=p^5IDthPgCES^{%zLc2oP98(Dw=|VOs0~koZ_9R~K zn>TN6cEXfqSczY_1jfvn(NR`bb7R}4>W_%G#aYWL+`=qGUZvrzv(9Sv+vfm!!x4zGaM$K~37`l82~G5au-7i*3O9Kl9f96{Z89taZ=vhUqV7i+ z%FZ*pkglIF8@Kz4sz@B#bBtRKGQA6qfQbeLV=~crG?-{ulpu-<1;<4Z={BxzSkVZX zg@4asu5nU2D7+LK3Q^c`N4oEkj;`4OSN;EU-w27C=GK|l_*yy+b_kR`>37Ksg;Utw zcu*4i_^)@W;R?EGV^R971gb3(*|Sc|(Zd@b-m6P@4LRd^9%1TfBxyW zmIpTPD(m(hURLf{RgT!Xv7ENy%<_Z_o>(4t?&Hf@8_p`5%DQ6OK&8a^?ytJps#OS? z2g(CGx7W$ReP!RKmF4Q)H?9YxU!xMVN)VVfQv+ zsgsMTNYuNj_(``5kAQmbOTK!q|4_fwD=P&|>X;ELKHsg-39DDTw}ND!ymCjYU~?F=ysd zMnS$vt1{N7c_zw>J(5s=VNwz0$1f4C@{jQO_Z)G=bGR1{_wFIw=bG%%SzP>T3+iuR6X_9#)t-B$8z$8)H_Rig@*pjdhG=KP zkhaL9JTr?nC++NrFooxmE+mjPi->VWUf64^E$!7034iUS{u7q8Sedt{#>Xu;!jnf~ zS=rZye^`32m$Zf3NJpfP9XCYSp1GkD=?COreUT^mlW*~H7v(Bl5nc;u2LHq(zLcpU zpbSQpuG{W2|LRHCES}w6UHh=>`sBgWR`a zy1rAOq@NPyOJ8q3qT_EJicY2a)#X@Bb3o$ZfTCG#+8>82!-~V|Xm-t}EMj)h$k|HkVbqtKwMotz%bjDUUhr!t#s@pHNO;b6Q>bv+lsotQrJLWoNy1 zuc<^!rEu=teoMKdhV#Jg?d8Nxr?_;%?;OG;ATRRM@>K6lWF@k5(CC1o56!@KY)~-x0 zMvcKxk35gJ43RfK#hV~G3H13N7p}9>3+~EMTQDipTn0SYYa#42f(n|CT{4z7v zFpoOJ+@#((MB<}`epH=lq+;z)5DGC~$`k*Ag?q%&?a!F2e=XdD?xUVD<5oE0k}en0 z(Iu_Yq|QeA)OT?UgT1Q}IraU9N?5Ab{3sh?MV=y_sHc(lMq<`BC-;1>SkgOhOXuWePkRE7w;uw&1yG|_=- zqFQ*7UUtG)PDGl8!(3SFsy`weVe%)9@U^1IBs0>&F6t0J((jUH{>38<7YTpuWrqI( z<5An!45M3i-j!8I_nBGLG0$DQFn13-_F?Y1>%KWU_^;Qz_r2>jpC62X_O5N(E;@=> zT?k`+sJI~q-^AKhcNB24G7xO(ypv7D| zi#%-x_>sQ$)CN*p$V4NNt!Q+Vg{}e=cHO&YLRB&JO*FRJ5PeCLhTR9hazz7lClhY# zd)F+?o1@A89So-i)Li*b!H#9+O);y=Sty#lL5Zgu*MU%~tCqY2X*}SE%>i5LUp*q| z0CU61nySz`6R7^(yXU@g{hc?L>u$ZhtX#XfZUL*x^o~-FS+%iTbjpS0sTVxHJY>zO z)uHer%wkv$|&My zuI!biZ9U2(&Wef&wQd$kz^#6Wdlv%ZxZ{pHFpAW$xp&?S5-7rqc+@3CvoPAqm3kLf z#LqnmjKmWJf^fsW^{sUbuNi414+2LR&J=2AT~&;2!@Bjh+uG_g+XV+d*Hymd~j>!(QHf99eGa~ zj=-omP3A7@n%KgfJ9Af<$GbZ1V}QC4b+I|he+!PlsD#miCv?mcpe;oIt54MqT;2BK zUEirK#hv}2HWTiKK{KkmVd2cgK1raNptsEZYBK(-?!VkZ3@A?a~sou4(VUtgF zFlGD@P(Rd1^{HD|x^1DGD{i$5=lZAPD;M)h{vGZ*d)r zJNnCN*zCAnZUUoW{mX2(v2J6$Pn9{ zB3x}lI$~?2ydiHKU@abL;0Jc{Z`;^cKJ}^PhMIqeC<{woh2xn!!XKiFAWOstBk9l< zx#N#JxM-WqoRjFlAdSs{6b+8s$s`(@u=%5SQo=M; zW)qh{>U#+Dnt%y2;Y@^89mUWZ4W2)Kq>nInc{kzGVYr8V3%|MS|F5O1zg3N>TC}7d zAcEQtY)McgU()MeO-;G|o;%C6x86`zR{ScvQ;yibz8qG6UF^gy$5%!A#Oi5p-S)Mk z9u{4(srMUp-c~NX>FV;?8!s=Py8hB~%l)_4U-qgir`A`@4y($3J)G#$tF9t zxALTN_mSt+vqg55O&d3rv(GrQJoK#d%ZY~_T@Kq@J4#sWs~urY+hMieTU*l=TvhEV z>y|a;7)Tz#t()aR7)2)<_U^EyKsMa!JM5Krl$&r5Kz5)rHes+jiyxC+iY`%36dm;~ z!e<`gdLBj8F^awVCJoXT;d$>$n1@;Sz3aC7%uV;*vp7vYCX=XtletN|#fgA2R_@XF zsk=no^&I_Tq@H_|Pjy0j;E$PSbzB=T>14jKl0;$8f5fGYcqZ&g?|U;`CjYdbLE~6J zFc)pC+b2XkaYuY0C;UPfLV;WFLGV#hmD#a%61TCg2HRiji++ii^dkt>2?}lWnO9tK zMe9$HAr2U}qQrsWNCe^XFOE|x8MChTnMey}?1FF-mOj_G&A;%G4)9Yi^^f{2E05Ge z=~h>{iOHtAEo|n(<%U1$Mg;lQD&&cD@ndC^6`|a6Ctvz^t7GJaxq8g4Gc=TycXlrA z=!;+cVlxlolp7d|gCF^j2SkdGNuf^&r+sv)X%vr(J9#jku=nheF2tRQbzs9>SS~ms zq@?Hm8XxS9A@WP4NBGQyB_95S5v!+|3x^&2U@ZO2UBYB94t|V%(uriVB1}HH3v$i7 zIK@FGtCP*aH2#g!zNQiElJgRM@N_e#TzkU^v+i9R_8z|oH{JNsUm~y+5ipJ*#r5U- z_ZUyK8SinAylZp4W??t#T^MuG_l_EWl0c&(mF^yd0A)i1h>HW2IV!Zu9TmL$?2975 z8d$h}P~Za$!o4^tF9tPNSHex#tUcGX9U{`lpkvsh)(bOMwr3U8OB=(-8F1Mh;1 zASI`hqzU6{HnAP7=CdZE{ycoexq95WqAL6=>nfC*hF!brFAdaR13SFB-&lXnef{Cp ztWrPQ>haOH-gis6{5 zuBQ?|HMAP{0cEnDRMF0c9*9AYMHln1Vy1q;8om_YM()6)O4knvZF`%bos?U3r@Yj& zP}rNt5&uQ_;#SveHt`qKrc!QFqvdFefJOCe7-*L-(7z8V50%ZC#K0T>DGU(f?{IhzIcus;@1OCHOC} zoh)mkxS7oVsCLRL`UU4X*+z9ly{z1^_0JuV5Mv*bgBd}zI0WBVh9FS3K_sv!*- zB;Vp9%#bc5;%VX5v{tZMKDY@S;3-UIfhGSY5HNsQka65er#!e|>et5P89~EdT9ISS z>v<*LxdLZaqpT(z3kqVxp!?{*{37|iNJ#q&^ELYV@!yCOxx++ySkD#=soV?ulGI7 z7t?+Ad;P_fyG+ZRB0v!d#V!UL4IvswcW^QQ5z2{1M$rj(ai2+(FUvZ~>z*OY3%%;Z@(!jEV1k1W++NQBdUkLPG3si*}aOYg1@>A&Br&6Eui}Eq!UkU1c5q(BtQZQPyOLv z-0G&ZMA+()I=H5~5ib&m1QEm^(g6`dxEDW?rq$_M@A#7kZsfzex{HXEj&7dV9aY2g z^YGld#D&mt7p6G*;a8fGNvo=R;Y&B7!?`^q+;T6@ke09NmU-wEk*n<&e$@4k1Rm9P4#UaAWzi9jMS z7y)fWTZz6j`o(TLDJG7^dpWu@DIhBcBdtl~2HarKL{>vqy-3J>M!U_+LdmfnN!^3qhR`X1?~w0Y)s z$^wW3y4nG+-rMyh0*J-Lc|cxTJigr5)j;*yRe!Wl}SIcPsk+n11?V!-gWIwQ{9KL65IcoLha`NWm z$~niLTF%*cO1a>;3(D$ERcWrL{lH*P-Bfn(j_u`|dbs7vy87p&V^1t=x6~!}vMtTA z4@??sx(>i`5U*x7JOALUt|*HrYvoT``6$0Ctu8UEc9KVt<}b=>D)lSsut|vtfr*YU ztzj;{?z8tn(skD@dhT1A52iof<=5b2GNG=CH)ZJ|pzPI668)&MZ>w@@9gcdS{;5NR zAFDcS?Jy~{+93MT=!3iU+_S3@+10-=dqtZf{p@<(=KK615d97%RQa3myXzP94^da* z5McdX^flcwRWFbct^cae+^|RZ98*`JAZTn6bUvT{hPkjkt6M}E;*=(&5dZ6|k{ssD zY)e8=2|v`N{h51KIKu^?7BEek2=n;_8~pu zl78;w-xeraz4#3~VT&I&El+i<6h}KqUAw7nt)SzNTmIsL3%|yOW?$V(x3-A{i#E+& zwDZtcge6_dRv7XpPU(lKc$sr!wUUFuh1W2u_Uu~Psz0lT*BFqWx^MiGjOOmv?$h-ehdJySd=AfXsdwZU*tk)c3Qsv_L!0NB#T zqXD(2@rozXCauyOiZOp(>3#3o^?h#MzeEWf;8Qw8P!KHb^L%w&_g&TR`IX$LXXUJ~ zOSq5TRJPQ=%}1{H z?Of~1#Poa2=s-go>v}u)`j)w`kA%DxQH#r0p+ZoDAzdmrIm3ti?Z|XIqHFT+kBLF6r>j9C5R?hQ$w3(mP^`AW*tzP>F*w z9b>onYQ#pAw*9FlzWHP3Ioyg5$s{dNhdE>}EX0rcZRL+ctgo$kU~X%cLzJaEaFJK< z+MD$7EA9MqFHUg?8;;^+&p)%c#ILOep4`IAIZom{9%)zIh(lV0>sfdNSrnK_w{ZEF z4sIh{X<{dxa51h4LzvER@(XN8E@^J@RR0J%=@nMg1z{>Ld53|rvcif#;W2aZ=SrC$ z1k{OPGRRGsPj*)al&kW0SKcX!Kq4?40c|DP4%ga}zEc0F%}sXi4L#iVns?tvanp4_ zThB=X%@&f&G#rXcS3=>Td{ACA6ax^2(7Q$y<|@4_6qRl`gPyq;M-TzshU0lE63R~a z;$K=P%XUk=yrR>dN-|nlHC_WiDCO*QMf zHTg5KJL8NqT3u@shy6Hk+R^&|St)(=%T@gAs|fUCbI?k0fRkclhN&uLF4 z^Zd0HNHsm&q|7}6-F~Y#Hs!ISPWt_NmNG{MIXlLx5O#8GOa zLi${A!3B+U@T*-21*D3)6pF5`XU>>$4uU$Oej$R`BP)a{4(YNr%N8-e{-tgOL38Gr zXOc0F*2l7Lm^^@^d7|EAQxGw&jAA|^j zkMK{d+uJ-dBghqTe)OXsooGwKmk(jtCU#%VkNn9mQWZYjcxLZhJZa#bxiLlmtPS2% z(;L687I-0dxP!ek!iZmoP{U9fon>^%C6}~#H&-%dOI_8+t#lE2;a>S#0me?5$hYWX)D zBmYZ(7xoq8aN4f6S`m@3N>r(dm zb7Fhyc|Vl}D(lwRvQ;~+y{pR3yLXl?haX+eIrW@!-U(-w3s1eEoW8j#e&wjLsT^L{ z1yzEpuHRW*&m_9OhW&|KK3P8exlfkMZ@s=Loh#PtFPly}q8xG3rn36*x>}*8qJGP) zJzT}XsnGJ#F8``o#brVm&4N&3iE@HJX< z5H$LXAXN|rCiX}ScKS&x!4Nix8ia{B`SDTXzDh748)H()4>CY_;^H>Wv=OJe6#cI| zq6PVL)m2xudS&&C^j=R_#ci_aHf7f%HLU@Q>6%Xoyog z2>;TC3_+CnY4kM*>$G&qgZSO~y{3{S;uF71IuSqOkX9E`OPEM7eqfDsJH8$q9b_E8 zk#_hhm+sax?=X~R1k@R4oY7YNL_UtIL|){JTe#j_v3A}ZlFv`RD+d=5pP#W;7v$fi z9OO+pJS+1DYCb>y@sBsNi!QpTxkElF$F@4E=2f1=r+&G-yCbyZ#db8|xBAy&&wq;n z0d=5P`kAQv5@F5k+@ZMib*4aYJ=EW-zgj_ zeGFLan_^lUPc)9Wj|zjv7K)(f1N_4Qr6%HaVk` zt_mDFXI~|Bb{+k39YH9 z8>}j&v$w7W+FP!@;gjW>&wQlZdh=Cf=l%z3Syd&zt|&U<@cQL(!(sIdp}H-hx~mJ; zYhr6>xT2=1-slD{+sRf)FRA#cY`=Qfgv$XI&9s z!e-Lw;@(7(J9RSZBSeHZQODFzePq3x2oe)$lSW~v+u~{cXmw*1+WvY^nR^5#+I=S~ z<<=F40wW=~wIW1WD|heb)@@w2r}}w#eV=hl-?6clEpm_>bt(Emt341V%DhR9%dcV~ z4~YI0@t{tfdFGiDWDx)2Wgq>ZXCw;JgniUGD_ppBz_Fhy*N@o}g~aDZU1R21dbyPb z;gJZRx$wPv7LPC^pX#ei9hPRl{AFbgVpBa=zlF~p@g!cq#1#S?aUz|#cNaE%yjvX; zZG)MxtxVE(h&0Iu@&tK<1Pc6xOFz+0g@q7;r#Pewxh2osBjt#Ea;I#C+r8vd*)v1r zNvAx?b6^-@h?6@jhu{Kd7^oNOgm_%cl^g%!wel1u%qCns{7fazP_f)2-(mKkaAc9ru@Q_t(AsD|ePvo9p3{b(PSnm35_3UHMZ_{3*w8s6Xp|^p^6dGcGI-JK^kd z`jN+%7E)}I!wzg8wq=n)~gNc~=UfVhfPLI;dz^uLR9)FmCV zvLVbUI)q#GfxWBiw>cQ`pD;sdR)-^8^(E@rbi0?Y9)!CS|sSE1G=2{m`*0?nx)c>g?CVeJ*QUAG(I?v3z%T^ncK<9rrtA!hVn{6;A z$m)5k(=%uTc!7WGZtQeV_F{+V+tJm>wiv9Z=EaUqQmB?KuVuJg`2ulZA_gT!L)5{|p{ zxwwfu3qyM3S>D(oLH&wWkU$X*chV_N?Iz-3hJ=w;=@u404|~|dCi2Qn#3lS~wM|J2 zk_N7Ra-E1@TSP7)fkFaP_V7Ri@h@-8tVHsTylUl92`p)1CcKuW8W{JH7XFx94HS6z z5JflOmwl{83L;6n4I)@L!gm)Zzfm@Uh4}d4PI#VSgXDtMKs_Wfp7&WtKv_>$x_;w1 z+I-ymnU4}*5oh8jjp8Cq&ku6nOs4iP z)Nt`f8Ya?O6}F}XR^=%~D#K5hP33;5UvHJPI2eGpcy77VGHcYU)>PuF{rq}e0kGki za{8uI%2{h}DA#Vkx&GvP{er*p@VZ)OW5st}Ibzk}^|04t%c)15TuwXVfoMw@blWb zJLQB`8_FY3Jhz;&sh(p{|LQlyn#h{4{qrNs!@YNDjC`nT+=lybm-nTMK$Nw+df8^?=2cBc z%Hlu(DWFf#zbPy4`ZZ^f&5*`Vsw@up1dYuZ^03WvYSdm_z8dR%GDLm!@{x!ELQ*xLn-aY9RYP*T_3hJtlM_F zePpz=7-L4ogTJZz88z(bx=Rvhy2z!!2O*$xw~0qpsA6)?5e0-|*A%1bMnmX|#uW{t z-3?y#@N4ojSCv0hzCQ8u%XYWqn{W`Auunz!&07#JF zPH@M#x=c)Y5UPy6=&bW^;GaA-19&X1BXIZ6)5X z<=RfWiDPSX1^l$RkoKJ&XO%@>ok*Ezl($rSP{wTj?j6$3u1SkmKgO`RG{BD7tH2&J z(Hq*Bcs7#2u1)^gx;;&vs{KoB?z_8IWSmjFY*K5bfY(LB+t}9az3i=wxAzrgn2_o# zLTo$bjOWv@0TXuPkUgOQ8^$wZk+yTKeLWA^N5(p1R_L^E#zgtt$L5>```-XK04(?f zq;Snj3MhtC{U5RHy4ge5v((6=sDnou}poY9QI|lRsS^`9nS6%Hd6c9+7Jj#&I z-Zp#dl{Wha3G7vx5SiSI*GE!z%15Kd(qrqn23}Q$US7(VUwU3;%e`}+2g>fx>!K6z zm!5hlJ6}ob>6NCgo$s_?)32uGNPDDM%j~ZA=1JxNgCmae79i4(xGjwcbvp|z$ zcA9&9I4O>m3_4pnobowZ`TCZXm9L`^ACs|!{*cgdoZD63yzGD!!e0wOb*4d zO_N-&ji9$Gz(m#L6*>vOm>CwQU+RXU&+i&j^bYJ!Y zE&zo9JK7g;12{2udG$vdXQO9v&lgDOl|P^%PzH$O06gT2UcP$8mh4aC)iPr!z=G;>c#dBITk5HnBIaG&#q9*{pkeUP;44 zJ(Uk&!r$3O%hE0^fKxh)mDgTJ>W+pk1a(km>^kGU`|dx~IbYWc&?Zej>B@Yi_~}=8 zd#ww9I!GUJ@7fPuz%TVjM;G}TSju%KE4dv4-B~3C$fYa!@pO-eK$h14K2xAb8b0y{ zki$=ZA3po!Qy)CFr8Zz2#t1r6jx=&PtD{%Kwkx;d#E)U^Y9Mw!lrV8QOLINfG0ZpD zwN0SMFlt~kXkan6K35-_-Or4f;%1MXbH%Miy^b@Gwb&}_O{VGq9Eb!C630ZR;DG21 z&a*p7=*17yIC;Z+j$(eTN}iQC{1ZhmXqzwgp^`N50ZM?dkg_Jw;MEa$Eq%`?k6Kc^i1S~>LS z(HH7-y|=Vmw(e+qcb?Nf1;4#^az1*rHk+*U=ifNezO= z+QEyiZXbBld)s?&dQa^IbY8tmR;z2Q0P3%Tb&0!d^;P)e>eGc!v@OsEFaQVv;%I9ijP?ZnXy2?X>HEG^o7>yQN-D2y4DBD9vJ*LK=DsfD70xLE8t6k-kohZ!i zNazyBso?-QI8cc{5wE4h<1KWDvE((W;;7}9vZe4^3@trPN}Ny|J|;lVH23tmzqND; zP@yt3$C1JA9=MsUK>Bx)HMZ3J0dGxh%pnVGLjCy@V1*YR(KjqqaDu2?awOX}Px38&Pap<+< zylpqNRrwql%wtpR!2~>Zu@Zutq*P&DHhqMO^o=<1WFEuj(*WCJXPFfG6m;(W;_oX$ zS6y{g2XIVMr8!I-Un)??1UFxOVoU5^U{84W@wo1dn~&Dy{E3=0i_fGIAHb;zrpa^c zaN3z-Wz zFO&lq0A{ccAWDD{ywKs{bMCL!*)?AH#CB;3C;~{pLw;$>x9^QS_{awsVXtIIrykxI+wRY6`4o9ql!Uqz|!fNk08 zTU@WSn=ihhwYQ$tcAkAf+ji)-_L*lMY%i5Fx&7?=)v=ZnZ8@`?K8`O3wCcQzBV0MR zms7Z%fkcioo`l4nR`Any)(IsWWor2+s{|LA4v6U8{T z*89gw6*Tf$cN&NjVe)5XL&hJIcoWG?l1+Y1>fF1Qo(Z*81o#Ytp4T_LEqgO|zEl%l zlTIrnOmZ_}l-BbWo#1+|zR?rMKc`d!Chk{HKO=5zGiGROt9gu5KoWM~4159RSjnSJ z?Ga_%5f|G4_yI}0LU>;BVF$)Jyqz6Zgy5$vD@Zzh0V!-pz*|6L>;i@WU&NCQSff0= ztUduiuxYDJ641!c&cw@y2GFI>@_Sb8sCzcf-krS~WrY%XttP_T${VuE>vc6>5yO`} zc%l^ou81SIbbOU9zy2T&z4Gaej?r2jWY0Fd#o-U6MWZfO{U~1>NCV80m%n2VBRr+i z3EmELdYm?*V|Bp~jWja34hV&pAE@Mw4C*4FN9z#eMdOGL!`KhH zF|1Dw%++?Y<7VHl&zg=>j~Y028kpT@X5W)!uDDYt;mMaYf)&1bC0tNn3%c)?c4q-WPj5Tio~qBkAKh9d zo>41_irVSRD0Dp!>~My@^cq|9MHsbM zsWy)dIg=4zc9!cI8ODoEr2%%p28@p;#U_u=4ihsIG!sJ;Rg*O1pa~psC~0T|uE);0 z5{oy!iNnvtl#QDJD%Ul>eZpF_V^~`nU=Lo`0|WpPtY87;h!@xodl){mZo28F_HqG! zl{jNt+8V$iunGBqFAlt=FCHW?TP}}ten9^eVyq}ACm4>Ds{U4`s;hX$c!g_xi7+*y5Zq@SU$)%_q+Y0?ntLF>TQr z&>@DMBpEq6oRXymyf`HRfmWkakZCDkn*abn07*naRGHJoNpiRzcI=7hOP77Vy5bf` z_{->$h@k4h-LOKWp2OcHqpb+W7}BZSOqz&i2U%ZfhUE z`vjV7ID|@wmN#3%xU9@{oyXMl%+x`m=v^QV&j<)Z- zgY`N2`Vvh6Kz^(A&wrs>qyKX03uHa6;wLU`4Tc>An#$V~PguhVv(xprbTzF`mmqDO zNda41P02a;CIqu5-m78Tr%T0Sxr^6;b~jmL5B3Hz{+NUUZH#@=+?(w7iQ#loXhjb@ z&E!4fSTDJFb{jT+)+EokW`##=9Szo+)>j`DKd%_s*9Itp zj;sNhWDlEmi)Qy&zFjeKAp*kM)_oN zZZ;iLZK4!G0_r!>k)+p0s_2S3`04w7d)pB@dQeTSvbj+=cy zq#a&|&NtVlHZ2v)*F_~zy?@tuBiq)8x^#}sZtDZ4&DH<3WzI?;`bf96}koR02g+s(~ z;@Ak?F`YU`wy zN?{@c=W*gdPGZ;2-}%~anC6JP}#xxUt01bQd z3RgB@&gb0akr#M$@pSbOn*eOEOW=f8&)AfMos!4OAM(0?vR;ewYM7NUHi!nMcpb`S z#BY1s+h(4%Ps&lh{rmU#vhbDHncU*t3uK{Ja?q7{hqm!L z7QOb>d?iDFU2`h?op;{ZhkM~Tdyx}nu zH(sm@4QRJvSm=I8dn&Kre#OayK!5L#w)ThiPXHjYtNO3s)!Kja+pAZT4;*OiO|<~? zfBpT{D`TT_{?2!_c6|YMKfbHAXKIn^$%eoAwXJ>Z?$$oNLSW)z~cERo%U z6Rz?fZRJ=>`=xzjYaC>bK4&{i@K;Lgl;Lc$ zF`R_VmSd&L+)RADzNhW%A(Egy1>*(VoNXUHar#FZdPko?Ri2X#ebRQ3g>@jVgQr&C! z`qOO|2;z%Q;;iuLHeR5C@dFT{odbHX0rBi0V2bp{?MUAov*UhtCv~jDoTNO*>lQWRv)A3sqlV9TV@~p?rCjEgmnys3ooEt8=dLO+ImnPx(ow8*zOVRnd)M z{b?XJ63M$QqU0X#|dOj0QNu$zXzJ#xj17S9gayt-()v8^PIygPS21uY2_JpCzZ1|bf%=wmMQl` zKFhhL15>(VpvlB}o8dK8(i^2OwSK(-AhZQd^urguCQuNEuO5PD_{G1#g`zRt+*V)x zDv!RL-Ez9?i(Wgn@2IreV6(X3cXZnX#Icr09(>E~>tIiCqgozfGvcClXJFjw2m6*nwadT6vaM;Msk^%)^)!#s0cqwDrm zJbIfB_;wz67f+75$yO#6;T4+PkLRUpz~pTEbRr~o+N0}MdrVoHSoTgcETY;+ob~}2 z^*qD$WnSw8_!+y{7QV^|fAJ2o=8$dzCNDa2n;=T>_Z26&7H1-E;ugN)oe6Fyu0Ki7 z{divE8kn{{@W3h>Z4CrsFUAnhs;pQ!TmXl0M;mwhDSPnT1ZD_m17>)Z%7>3Qw)OPW zPj|otcp(lr1ju2t;e*FD`}TEOpL1t(S-k@6hz%;!HQmAYM6yse-CDhXtCsI$EENv?oE$^qI~4qku0w0X}pko?g_)Dj|UkHo3mA z_Ayc(u!xM2&0a_3)fPZ5JmnYgbC5k?Ur(q%ljrVq{Bu98Q%|4P=eW3JoP8eVo1He^ zuUieUoAn&dtCb`Gpig|EwIBJ|v6}qoZ?|@K4GYqM1b_W&TC;NJ&U#JktFD@?Jo@Xu z*xEN2kmHrK3(jioxtCk}*SEIzGq+6mT)exrfBem@UAbq%?p_nOSOXLhkm)Wd!C$7pQvnl`1${+wV(P#YyVf(Px#39wD#nS zt$p9W>9_4~eQ>gp>RbQ!$^G!}N58MN->CY%>*|S~UaZBZA1OKh*(WDdR^iO0+i$(O zwLkZjt({-GJzT)t|9$^NM{@m@Kh)YExvsTunU;4V*(W8mcI`!_$EjYAmdW1#RBJy_ z?RW6P*8aP1olt$-n~Pty=hyv2a;@%pz4x7kv@?Q03u$OfUl9!~$^n^{q|^B%`&c{d&;j^jcNbi-id=hrL3YgktASi|$kGmo|x zUa6()JIhJ+B6O`3I%C)FO5M?(eD>*fR_zaTPOa+MR!^fhUO3z?t^E<6f3801Th8Vi zJL?zXS}}C^wb}%9XF2;jcD5rg*F>Rcch>$s7woQ2&F|jPo;vzOd*a1MYV+v&+;2I% z+s>#jviN!!@Ml~7TKsCs^5V<&>e-fd!8zyGfWN2UrTRs+|1)t_i~3WtOmBwOTGi{= z$6^Z^(sQW0t<`ziZC{n&GO(=~{!@pVePvQKlNMp8G`StmOVa>-MyJ|O=s?PVjdUrY zlhkR&SDwyeItC1~E&FoP6(+p3edk|gu{FW{aLh?Tk(*2oH2Sc!38Q>To5@pg!+2$& zLGLW&jBX64R|AV_1FdAE<$e41^|l3E015z^KxJ)fuN-IbYy@9pj36$cj1@ATanb=V zK!*U*024giCtcjmx<6bz02;s<=~mwO47~DzQf!h8@&%MoK43?g@&Rpp&8!TtU+=Db z$!o=obUe@lb<|lt;EjMU8gW1md93iUZ;b)d-Uk!v7(A>fEv0C&?GON%WEYMdB}|ix$)74>h27@yP`Jc#v2fq z6;$esCp`p=Qw|;BEhtN%Yy5|O+qJl1d~8CV(7Gm*5WdpLGltdGz_1OLThelPEGN%$ z?YXofh@o&?ITKlDv z=c@B2;K&bsur;96>;Pao5&zk=yJ`sM;(y0mN}hVn?c&0;zoP2?m)=(ZSAii5m2H*G z`}a>kpeswR^9wu!paIBUFL&Upu5Rtw0+r?p+pGJ3L#?WM@Y&XWr*!wh8oIyxD_T4B zbZfs|_jBnM(Dnl#m;hCDd-LAbzW#=K1{E;&W4~K@s%$a~3(0OZ*Z=hGHNC0&t2^1> zeNAis%Xd^6ztGyxmj1u1~%TL;X6U?=Hhb#(xpe2C|?#zG|>(#aIE|}eDu}!*}Ly*k3Ri) zyYRA$+8H}*uZJ2W&$*~R3BP-1`@|ieXnS^)V|vb>cJ!r}+w)I7({9>+Lwo9(r`u!o zYvh^d)Se4x?P`zI^_~kZY^ZOY0J3j^PY|Em_FlBNz3|*i?TH5;?XQpBeDKD$`|6!-XE~xZ)RnXx=E(%) z^?K5j8yYo#Sryk>1Un1ZNVa9S`PBKwgRRAOkF&Frd??^OhPgEmeM{Aby$z-lrn%a5 zb{zWIadVfnh*<4B<(ElYaz!?iUI+U?BiQy=L=x%4*ULx0t6YG=o#&$6*$ zT4Wf{YgYr>OZ$5D$d|zE3k2X`2PX7Zr$|Q!cwjp{zCZ%wSSIqWrMY*wP8{2^^3f}l z(t4TVra!s>2H2*10F89Oggt85wekT(zz#HMW5ejJXv+r9R#etT5M}@V{aqe(Z+XjGdOx8Dub^Fb-F5B8dVOkV$$&S$03N`L ze$zw6sXuw~CzHc{fU^KN=*T4~Lz(VvLQTeiXwu~e_@H^$yWZ7T@_3~WnBz-q57w)0 zmsES&0A5hG@&fWk=lJ98j0RYha(l-56MZ>Hr@c+99`cFD+mXDfXX+#k|L`C`+A*A7 z4QQX)VXnB)%$F9LoR>nIJj*%1y;kJ_VTQp<9l>gxVOZ>D(aFEq*MPqFU$^#!0y6}F zP5qwP{_OubS+(P}u3!F-Tl+Kbn1De4^plg-GFA@>fSC6mm|R==^T!I*xTwIGtcdy3 zZ?Dbai{>xat4_)D6Mtf|;$avQoj7}zq+-x|LxG$rRtnm4*s?&)Afatsb)g+bNzxd}%Z||IdK*=-IEzpK; zzw2k}i-WZaNcidRoahV)Gz<&L{>?YlD$znDe)v}=E579Y3kASgeMGK*_Ww>mpxYm9 z?Vs26sR&EyGiZ&cbA`Fm=8Bsu?`p@5Akb=Sc;vq*4d^`SKpe<8W{b)^izpMNMC)uh zq;Y;YOL35@;7*!+tKK>DoOhlS-OC?FAAO_tT_`B%)uTt+gO5DizWDev9}$5<;B_v`r)?o$hqx>GY+@=k37=$Y`>&!J>#|Z zsmDIouH3P&UAp^?_Q;nWY0o_IOri9<+u?I-CDg0+YQPImwfnz#s1W=k?cBo`w3lB! z(jI#Fv35aiBK_tYUvDowTf86oV!LqHp7!c%lh50BeU)y@f3&So50-G+(r8evNy1wA z%MMD8*cp*Hze8J-ru`QaLO0|mUu?}a=boKqQX*~)E31LI+F{rRX`jU9-r14-D<##C zU&_p+P8lY7e&O#M^wz}fm71uUP@7!(+E6Cm^2#TKPh^hVDQg(-dYH#`;(EgP=d^2J zuJ%ZrvqRfEj8A!H0dK6*Ik#4oST(|yGMTsP1wC-0ua23HZ7OU0aR_V%2q4VxtupL= z(_e!sI>3psF$XXLPqrz)vLi1Z0T85hx$A7j4zLKFbaX&1zy~^D3tHF8A(Jv3f_Su6 z(AZp>{2kCKe&QYOrOTuLxb}*ddMGpH;ss0!c%y8fjWCqMJvk#&+CiM)o_?hRhJZZE zu+m6f)WeFcJ#}vdkMeA|os~%161}p4zG=gLUow%!(fL#vz&Cv9UtH=GfG2X1%{BSZ z(X)MTlj}2R%Y+kMCw(=~vjL!$D9b7y0T}cAq}xs+=J*Sg z2mmD6rp{KE{M4U3MhtB5ijnZiFVyQ&wKC`j-alEb;uWv?LIA11^M{X7S#=|vRjXd? zRWuAsG;c^;MF$A=?*9APs8}r zE#q>_A3>nyYHrN8q8i|Y2pkyBh(iY(b~4wYo40UIO%cq_oBSLg4rQFb8D7(TGxw`? z(S8`EyUHm(uU&S<-u6n3tk2gkr8}?QR}ay%+hecRQ}mUW3s5?z zol*M;J$V12_Qv6IX1DHW=U;MZ+k4fO?YS3TEJxL9tol{4eolDh@XLkLpV_WEaIjro zUlu!S`_9@UX!471M^>s9ToA9b9dkuys-RP80Ju$FO&$*& zI@DJTm;jnsS}`D8QeS8?d6S21u_yW{(6+QWdqvTY8U~K2n>mx^i?|rEO?bmImRRT?CIkf z2uJ~FJpAy(Jq?%=@Bl3!!=5(E0Bm?Yid=X&$DZZE6HtV2R_Nd#o@5{=z{+YM{Lto6 z2*A-t=mBVBUmPo<)Ja+TO28L<^cCrmS3b7i`BYg6>OgnE6uJSv=qq&On#}4UPQ4QF z73aW1h`j2m9|L&sun*8IBpQS_midKcA?*ab`m0`CP4<5q|c&Ca*0${(Nf>7oY)X z!tX>OX+wT~{Iu7QSGi_~rSg~GK0^t3CoEL<$L?M>vWHa~h|NnE*SChswj_#d)u+A zoa}QhYDdqlxYu{qd&HNtJr|zeF5AARoa0?Jif?P*{WX8AR_N3(qtCup@BMy7d*iw{ z+H=o7-;TU^q`m8_-qxOd=CQW7_W9X!(S_w?UfiC2`Gt1*#n+VM`BI(twwLzQ-U?S7 zX>YyuroI}eUL>f09uVbpmrkQ|Akd6QuOe$Wu(2F-ZXCQ!*<*9;CzF8w3+poZjoD7D zf!Tf3#n_zDdlQuy*I+I9w zO^{6<$*vx=>lxXdOXY~kRBS4PV(gJP(UC>^2 z)m7cTfEmCJV2D+1z!kuPIL}u=M1Usoz#4Tz3y_h%yTDJcK&l^bht0cIH{gdl0XrPZ zmIp7oAdj>9E7OL|WMKR9I%hmkPr8#I;OezH8)B0O5MsX~U~# z=#{090nMz;A}?BBC!FMzycs46D&}`oYj+T?}x4~Hoe^Z9tEqt8dPWVtFsK=ah9S8wn@GlP|8Pz9~{l=}_W9BBJ$bc03fS~ z_Fhqd(T=lg17n}Rt+k@X`|$ZM*K1#|wad1i*UrCiM{Rz0ajhoWQNT{ETq(zO&(#;! zD`qd(oUFT4wORBQqdZxQKOLz;uUjfs_iH`G)_Pk{?ZkE3ej)k0 zT_Ng?Sm%Mwu`|FATXQ`_gTCm7_bY8f}(ZSVN~wHU|s=G`#uE zZ|+~^0x~H>o`9O{pKW$PvUmd=eC{0hguk-cw1e&T=SN-B0U!u1kkq}psVm-e5}=99 z#L_sRq?kp&2(KP!7*wY#s! z0gTY$r*4r;TU+6ye!wYZNXG|1_0(o;1a1FvTh)y&9Ag+Yu$D9cV6Z38pMO_t|HpT> z_HRC28$B1u@SSg;yzb<)@c|)b%l(T5@cfOhY0bVp|MLH9?fL>4{%mb9e0zZof9qE! z)bG8fUJKjT+FLKH=khE72p}QuuYUF9t6jhPxye2`UN5u1kXOyV|9#yZZr}J*$Cv*2 z6eOCD|M5BIzgtY%Ug@$D=&4!&Xm!*r4^2RsOKWrMe|!7<`~g}2@Eayy3HwuTo9sXI zYxBH520Z)0ubt@jXK$SVO*dUSdBtvaNejvTYo*u!u-fIvK3rdAE4`k(W76LFyu9`` z?fB~bldrygtN^YtoV*4`5a{G}IC5Aa4REkHDjb?PH5{pvaZ2JyhX;O~CeD(Obl0JA zy&9p$u;V}=u2wxiI_T5OLr_6{2fOPN@wJ|zUA%iw~Q@K5pOB+pG1d z;QCbj83h=fcV;d5uC#(?3J9wG2=JaI#GJzM5kTL;yyL(1~;_j)a0 z``P^-_xff`aVY0<$I-qjX={Cs{>(aR+t0Q|<^qHYQJM%_0)v6b?O3Z}*uL7me-^%M z&9yYg&>j|5k3qiD#!O&m+se*3^R5%{@8wm*P@bfZ=cQ>N`izd99dv6_XQF1ZlnIy> zHYRTA|4S=vanvS&CcP$F`GwuY5cp$!GvTztf(%v}WYS44*L|fz*^UXGi6YreBIUcH z@?BXgF-%1J2E4`3*M``dd?tBTfhY@2CeM*$aWxpJPK5^M8*5_Ek%K+64ee+WZ}kcq zU!!72cmYYI1?(`nXH#qpa3cV3*d>4`AO{<{C%zjGrNml?PG}6>X8S1Dmo)7rA#xo#`yvc_bUD~K!yfWo?xTntx zN(WCBm_u%L(iT8CyoYD9D~pb_5xJek(Y@D2jc4lO0NmgapDE>%O*v#yM|sewV?e~{ zh2HR2?=g%TSj!st=|89q^UG)bP_1h5MJj>M^_%y!_Fw%*zwP&vt7CtCQEY#$R`DtG zfAIB_c&lUn_ODJr62OShjsrjJN%OhKS_5Px0GvKt>Au)y1(A)5|6Z+3`QblYpKkx) zgvzT{KQslDlFu0kvk?Cw{hZeW$MTU{d9zU2zkXNiAQ12;!7E_)K=K8&`GQTCt%7>r zzCKN8zk6T3E?3}=Fc4!BQGb860HS@hn(Et2H-Gm-6B@7C{c!1ac34PufZ5;ucdh;B zUpE2mw3o-}I)|{>~q1Z3Kai>E&duwv?keSKFQp&oS>N(Ez7qB?HHX z(_``zr;C%rdEvxJ=U6Qi(4g(kU0s_Xxp%~|jO_SULf=R-yoY6pOZ-CRE|d;%IWi>* z_yg>LrSuUtJ+YtbPX}4*ytQQP5YXgR7hq6*_oJYi+OMEexXj7w)AGKBf^V%mXlEX& z6rjz_W<8}pDx}9EI+|Uai_wvyJz8-9CH(LfxQDgwplvTGemg$kcsx6gstF#IPu=Rb z++H>iYApx0G4qRYIqd2ycrC2Ax4JD9%5LoIfSzr!8wY#k{0|-Ru!?P=S&UtgalQ~c zo{wg&rbQR@Kp%8CmrkNv=S)@rA2xqAu@WzsJQ^3ZP*0;vlhgzI_t#hQ z&YQfNRd%4Ql$*(5WWW~>a%xLsQzoL)(1li+XsufCi@kW0ToX0?O>}R$<(4krTi^QD zo)#I&jGp|NJSxv*n*8`F+XN1Hqz;)pD$}G=e*EO86Efp#9CdF(D18iHu7T6l$GY84 zZMPb*x8YDa_Nd*ppSEKk>_{8O=6y2V7=+Hj*3da?b3q>=YGJ7Oaa_4mv*mM91B z*gP8s`h*rge9!<8T(d#^mCFvvhhASH2U_Kl2hj6!(aIw)IsvV`Hm6pf@CI6?&!dwM zf3muEbWp5#qmAvOQ6`?w`jgz1B`^yX9dFV?g=I0aVKpiVm z61)Z`%zpK05_|0LV)!4UUfk7U%U&F}`U2QrYV9MRnd~EEGwFv*7sI+P#Ak15O&Kn>HDdacg$g-?9q6Man0_-WkC z*ltYEbHh3Ju7%u(f8ulRJXhRO(ucImy&mEJF{5R9u&TlFJGoI`G#kTksvEXHMq5 z6Ao|xwO*)i;%BfXnEx%)wC@I{wT5!{B`k0F;_f3b^tn~ z_95!vPw}tYV=~qyspKW;VaQuUp{>70Tgf&opR)3(|{0x3<3~Jeyegy5xu_X1NNl;R^p@%@`)ERjt^fGmDcM} zXRm4rHJfPTA5a)?*Yc7V00T5m{p1teTgj#D@N+$ewXK2J&wNrYhGxF}tC6-+ z;7?@Bo-w&!?AdCRxdNZ}i?upvzAzUcu@LwZev9EB+Qpt1TlQl44e1ur#gI1Fk4_ew z=C%QVyk0k4k(9)RWS=kHZ_tj@85YyW(BzqNI%Qp`>=6W7NJC@#DboN4C613mb)X#O zt+Xvu2WBCG@Zr#KbX=Qc;lo*Sh)>`Q&JL^P3~@+PTAb5<&P@dIl5s*`CWK%@H2GVD zOa0qkHaKY-?D?dbrL5lKIe|dxv0x=yj6pb7Qh|^)=V@ejG5yBusk& zMCerBOtiG2KA$+RN1@H@9^&N_&}zes5qO!n2_|IH(0=AKpJ~@#du^XMDM!EutqG}+ zwv}$8Egnt2cEr|{=O9n$hu4*%Pu#qs1B^1UG^x`M=_>oZh+|(?KX}zl9ZjIKZwMWd z-z3mihk!}S9mCqv0NbA(*i4Q*!(uD!QQKNEVt*O-qSw4$_90K~3mto7i|orM!`TX2 zUd&!C6YoC#J2q`BkB-#awIkPgCCuw{JE#46SRd^`c6a%9rkI5UF##4V<(!+b+}@ktxTpQ>xM znbhb6CC-_c$ebrU=;O8e)H?@p+m?ybX=Te~wZLR)JsNun2}fV&$ktN*iaDb`Kfkqr zrma)Gat=9xTMBTh>3CoFwW8zX&V*wk^{835Gh}P#LiV?gYO(0ETe7)xK0x?V^O@4(;So@@{ z`hZCm+mzpgQoIS0$&m?=$&qwrh|h#5ZDnHQ%Sif@zz$5JOyqo_=;wa!=h}xp^r80t z_rJeSYSAc5Il!LqMgKy{DX(%Jc$thk@K=8Cx6`tGv8jl9y!?QiJMOrn%dYMKp01ag zfaaAG<>RA#I#CXu0kCWaYXt!Pc_l4n%QuG8uL12jJBV|zP4*mskuAk;*fAi&9zK8o zL7c$O050rb9z3k1(FYzcpwO#|0={U)vmO0Pf4cF;8@o;6AHV~^n3Y6iV{>dOvN}Iq z{ZwDIDYNp}EB=7oTW`I!f5}QY?9l2HaEQ@U&UoYSYI8JFl#8s2$T&b@SPq8{Yc zFX=Gj1N|r~V~{+6B=tzy^G6Le4xRR4u<+F4JA-&)A4P8>UD2M3zdw{!YS zAQ|(kpnB)^8V+K9Y2*+((9w^{L!56;Vw`Hc+&eZznA+G%)+IKY_HZ7xv%hx&=L`gvs(zxTZ7J$)Y{ zvPjP=I{S**OqvYzC+(ZQ@f+I%MMrn!CZqbP54iwj+J$c3`ObIt`uQpt{fRTyqWHP8)jN8ez&K%qPDytCKUSfMO=wGZBOsQs_6b`p;_ndPBR$3_XPYiMWc6`NaX9qDT(FI$`HYNOfNQuVSJdb*2UX_NFyuWXpOvOys$3w#~N zLEk1n@&`b1)(`NLW+E!Edq9bamx+-HrE4IHet_P+JZSX?d>qO*8GF-BH}%iCdwoSY zCXDi!ya`!hAI8t4{zwkL`0G|(eZ_c+ z?~^6-xn=jMi~g!#ILHOaL@%A~>lgY0`<3oXW^5W@q+I2YNqTHt9h5CE8fDuvh)&ST z)8pzM9l4?(^%d|Uhq9#8HNKI9EUwiR9a)tX;6-0lhW@P#<+_#+cq7fY6Yxm+0kZG<-y!&d+Wq(4*I$t(vxAHRosdJEag=V!^jf8}6aIlV zR5xYzqv8c+q8Y>H)qqWRPxpQ+n^*f|%}=EU*!mbIAO0EjFlykmYk&j7adLELghT`9 zWO6&0aL*%g92tBP;!JURlAg46d!E)$J#$!vz#-%~a`c>s^+iX=g3U5%NV+4=IvquK z;oCDzX>+|E&s`UEP`a71wSk?fyO8=XwvOndM>?Oa_r>zrEOc~FU(vUFcH2RddacCD zme?=51lkBDPJYq1GC?q*GU1W#wG<$V38BxZ zM4D@XJlarseqldw;6PvbP(pXP@i2MJ1k8#JUI8OANS}04%$^a2Vm@ge%Y0LY)Bd#XS?jrsv#f_ zdy?j0JI-w0As>Jd(7`^%S)ro;onO2F8m{#TXLd{`XZB7;=Kwg$e&74v*ZJrx`jmiP z9nvq^vGJJw>ND(_%=**~H{38&XZZy5J?fFAKwqkYGOVtJfT0F?&z{45uj2+q(5GGEV z_@P~PM&qANqk*gHbKmz*7OZWWI*%3IoEl*3V;Di8(FWFt1~^qYI3wkWbZ5l1V>yn= zFfRv)gX6p*0=-m4=**XaIHH_Bfg{clrZaJz%K$^1)LrHDaYW@sBaN;&-JDTzaTM{B z7TV>s10HK3kiFNX>H`2%Cqdls+;0}~N50wmaL>jzjGZk)56dB$tv5XA(?NG^Q3##0 zH1-RuG0`#s5@!P0CtsCT7rj5|>(Wfl*nhwicCAl1w14azt%;NgBfhSM;bfIu_70Lq zc_zyEpqEeIaj);8^=g($q^}{7haBmPC0wVIS1=KiSH79LR$e>>`OrF(Tc0JPvsYKp z(TUe$Ovb$;FgB1zk8Z}!3djPcssp|7wR@v&QZ z`UHP!$83Nt14sd-Y=Qm8rlheec8muwQ@}^Ks8+MFPX};^jRP2BQ_2>{2E~z6V2k>e zIvHhMI}*qpd&fgv$OYVS?Z8ie6H*?zl%IO1uIR1CtAt)(`P4@`9gr*ijE)7si8x>i z9RO~W-&gxgW!E;!5}frrXL@pEoFP+aoaq}+Wpxm^@?;g4HdGJtsaJGJW_-wuuXH-2 zU$T03q1RT<0iV@DSzX^#S;;A1be=jWS6fMQB#i5TqKVCUe($~!1lpV}zxis-*2ge{ zK%)(;5e;xsI56FbsdJpJI4{c)Q(gzhhx6x%6O{Pn@LdaeID&r3{sFXJs1#n^6DdgrPk}htY4+mcw_W=b@YQ z^=g3L2K1Im2wnQs+}Y%a4N5nWGYPeMs!33vI9I$haaO{yeYV>tiKWQ1Ya)u)hYTPp%WkC#09OK7~>pEiByv4AWiHH2oCbG`x06!+5>YjXEknzu&)ByYFM@h$K z`gPd?`_sM-@y_hZ$~OHXW4*I`cEV;{14xZ*Y>r)_k%kWdD0T%n>HV=}Kr0={uE)L7b4h__K9qeDy=%2N@mWjRU@Z7WvSp&aUZ0e^ib< zDZ_Q-qAy3vL!*9x9^(U`cGySg#l3Mvo*d$h3FN0|f!uftbSJnc{6)Rwd&@ zW(G|pv~F(o2S9V;Di8(FWFv2FlUmkaVY{Wa5f&v;}>>WCEs5_RNJC3Bl8RQsp9ET1dhfo|RH4bZ>M7-qVAlfw29zlXhq=~V7 zLUh<~*6|SulUL%fB1IkDxMsUwEM88iBnFj z06%>%6Fz;)B(P6fOBV8YjpNKZM$V3K$Msd)S2IO`K=tS-wdN96VV0AeUhh}@ndc~&S}APXLXJP!Bh z$kY3LrHMo9UcVC3UzCTR&(H%;mE+lz_|S__-Q|yd@xd35$g2EKTjlD5BqSRewECR= zdTy%yz})M%(zVN>dhROQsw03E{gVL=-Fb$dS8@7k_>o6`dKHIGI@xT_t$%yvR2sdi z3$UpJRnupC-3B3v#U%0Cm(3-$A5POf=-pr$8t`s1^_^8oUNbApfBfHcq+?XsH|~g=!G;i zrk@fG#2waAh7Z2swGK4AUy5KHANj*$xqOyV=4#Ta4+oA@$+{G#ZdV`<`=iG(!HBYMsuUK=5(SB{mc(~wVez7ce_nsu11r=bpqlM(he3?{xO z3YmmTA70~~NvpIWfA=ZFIoIM%_Jkp?9x?qhlzABMTAwOI>i~^=lWhlH_FAzKEIE|n z6&RB>lS%a>tNi-3H2v0nWOFUA^UG7v*L~>hFVoX%l8I;Xkz)*}R|Cc#;Y7A09XR8Q zPwWLq!3Nj_0KjA(7y$$_fd@tyr`eG+`|?a+4_2$)cH3=zGxBqa4zK}K0zzDS?X}(J zl;z7)kJM|0Y{tqT0WfrV?WJ?~-FNqNN{evp6Hd<$Uf3aPMG@uCiJPXG)V(0G=9Pr3^3@5`Wl}y$PW;sCpxssjy&XYuRUCQ76XTXJY=%R zkiM->+J$U_dvyT<$wL;j(tBK`8zb`Urr!YAx7>0|uRmJlc=eM$lt+GcVYQI*(2^fO zd`=x_m8{A;RA82T;sZ2x!NxzQMFSZZPD|m_LeHuh;Z^6g_7A_QwO_ttvMT7oXU5H< zPiLEqWuLqTYyxc$Ag_RZ^Ud`NaADnS{d5O?{zQJjsgi9CsNqyqbu4EsYd~kArf!%RVAj7bM8591}-if&MG6 z4YS4LsqDvUf`4`8H@O_c+R#A8oVldQ7-9@}4RA1CX=me#c!8~$$Q!?{7Gq!1-3Rmo z>az)S#jM*NAOoF^#I2@5j~6flumlKkjtv8304zWWval%tCVO?Cve_vBVqXD6_!(dE zLI;eHj<4gnl1DoGeyZdFRFK2-Og$a=;?J%Dp;o7oNq=xg{B#2J@Em)-%GOuZ z4wthx$WFw9hkVl=vmpni}?JmDM zhF-k|dC+A%>XGB0O{szNYKVEZJ~n5v>=?tSfsLdA01z7=!$bok2sB#4n$Q3zB$F4; z7pKU62F^LqEG5WSnS1{5%!;F)wiIS-jFv+Ow4pPBQ_KnVN{O^gA~=qmN_6z+mq0l> z$X3oIy`Ytc1IQs3G`x;;a z+7WyU=OdZq8A?$R9UfyN3SbwP&*eG1W$ zI->`q2+AU#eA>!Aed&YB!^1WGNyC?}fi}v~jt=^a?&(o*j~*X+fH+nei6hr}Q`yjp zv#(hH0$g3&MB1}n`whQ7hz>xsyUL^kWw0>($1rMOTXo+H>y6BpYKMUrYul^wlkuZX zYy=Hh4dfNDwXgzcE$MRvf!0!MY;svRI>QjBWXY}xKAXg$;o#DfUj_Zb>X%->URwIk z+2d$(_@Y}A!swM#%8}%Va$3c^=Hxnuj`JG_Sa};I#Ias(eNJeXo5c2(tGA7wPrpgu zQP)f&O~&ot^V$@k(LV*WCTb>r>38Bx&h$I|(S7>iun(f~8EtX+xi>+zO2MSkUM~2G z8^hYtK*r?QigU(u6aBQQwsVc%;Tou5wTCtjD8Y8bc?M*~570pScMx#;TvU#HeN{=> zi?YO_Q5HK>4t@X?uMDA&4WV<$4>&<9oy`F`@>zBCaWh~<(};Lc5@D<9A36j%euQEosS=_wDL`{>C^ zD&+xKfK|%CUr3!?1g%IYQe9RRERc)M3VAkQ_vR{44r44>#H;|lqdM;G*; zHW81XaX@)^i4!g;S$0lk@}q?hO(=(aV;D6+118Jkgn6`uQ3D%W10x8uvDx90d zBsb%EO=)0gD`{sdI;@<@=fu11l)bPE6Z+VOGizceXtlc)M8F_%0Emp|Dy^*8mb0`y z({am}vTU}Fr%i@EM_mVOaqS0&=@Yv1A#Y@6d-yx>LdQPYrss+kKvwdg$J0uc^aZk! z*Um4o{Aioc9!!-)Y(|4g*DLoSM|3ys^92WnbbX8o6TCGA8(XwO6L>8)KZe4~?QXBh$KjH+o(ywd0Guih{FxDIUfko0fC{yL&AA61cDFYDF0f?eWe83gy$`Hca zYmA{IPX{TcvM3|ZE_?;|k=GeGf+x_4oW6twWC3silXwZr0^XDoI)7zYZKq$PPbkYK z&t4m|6340?bYzSE$UranD^q>c&9!H0==3Z3=#Gri#R(}-T?I1Zn`f#r$$}mY{?SXG z(ekA%ueI4n$T&f6br$Fay+9V=t`$PA$&-~}c+02U-fq)2LMJXkJpv*oZaj|~7&S0z zVAR0o(7>^$!RDy%Sj)AlfpSjDlUX(CIChSW7M`jNBsr9pqnr3~I{j+s*FX-ZI&%U! zh(28_a0KIY$8qEUb6oS45_A9~PH3ESaqB&(yD&U2*Dhw~bDtw+%%;qLyS(V=OWP=qjPfYU#?o|dMc8GR zUp~W+4E7>Yw^xf-#()4r;g2W%(5W-NWD}&(%Vo9F>fEvuE2h#0onZVkYGBmBsDV)f zn?eI42(&4hdF@xSuLPPpgmH>&~Z8~@s8sQ2;vZO zPNi`Yzr>lY!!^ecEeG2~AbSPj$^Q9>phad@5CM$Riy&)8ddtt9X89M5Z8 z1F^6CLa)D>?CD$f17ag4(wS_>2Is0(CT_FsD0Vhe*3^#OXJXk`0ae+Zb}r^)+-cQ- zb{Ph3XM*kkX!vxy_6K|bPO@pTICccox5o~8WBEPz+|z**WB303`#Z>h2QUHXz%Hz; zd9^?WKm!{jgK=JYo)=_bui^niH{Enow_5-YIq(KvcxC`c+*_T4))%#Q6p-;`mFF4a z8RPJLLgRDuhpP|Vb=O@p<#;v;zUl>(x&Hd=`yNDJD!@m5$RWQo`PIjn49dK^_A3Hn zDBGv(Jphp`Cx+A+&t@mQ-GPOFoW3iR=;bFyxaiL3k?o9+;J6z+dZ!5EIX2u3_|O3! z(g00#4WPQbR`94hz)YF00XP6F>CvgZk?@!PV$l|(&Nr)f@ODi$2f5J7?>ceEJ;#eD z`OrjfUAM(MdM6iMxwkpASLVhrYGBmBsDV)fn@0oVsK0sIdfnEP^OA$3wUmHC9nGBC$8zgYc@v@+=UgXkJZ~-y=sVrMs@iNpKNGI6)d7=U)NfbBPW11Dxvq~{ zXsE{X>DIt}V`;`EdjK8SzrVlk0|a1GfD=XAqy=Od|f7m{3kJ_|$>`^tVr9|vqtF78Z6-8|l#8wowYt@K7i`djwD@JS8-m@Zh ztlCe0_x;@emwA`Z=X+h>>saS;svP5!_|R9=-2@XEUOawQ{$Z~M-yBb9HHjVnh<>(K zJgh?U_(9sujCp`W=%MXKRA9nLnlxnpQl^h?hvn-p`-f!FRCL8xu$s32$-KUiv+hwZ2A@~)ApOA8_1o#8S zO&Isl(FM;;Sd^>J6IB`R=sJGeTs2bwvq+=oC-!VTzrwQiq0JJm9(%uPJ*|AQ0pvFMZK z*p1SFVpQEj^*-5>uXTOtCfW)7mr}K?TT(_onr5RRA{esDEBB*GL1+O|o2{@}J!k6z zqDaiDsn~&v(0^=i2`d<8YmU1wEoiwUoaEtb`J&To`7#n*AFdFTZu5hIo%v#zbTdn| z!iGJoD(k5;j5$(g3$#hw%F-V@Qv$|!%!{vyUsEJwl8NDFiWuKyiyiD-W#V95(7q#t zG!xC@d;#eLaM*r6QzC)yf*;d=v$hn4e|XTb0S1%7N2WJ}BC;)BvHk8YAzI*FE;?B6)?6F{ zUj|B4tLcs7KM*SFd-3UNP?@c^0%BYmR0)AOrn4{QJpPp;DWfaHJJPV4rJQm8E3t8g znDr1g>ZkkmM*AkO#Pqr&$6@~u)o+zp1}w0PAzJoQb(FufGhOgr>o&Ohhm>DNs#+Hu zPgsFQtlFLvZFh|~B-95!yL~qE4`^hL`ELL&eGpI&qm^>2yHn_~BG0 z_wcc&*J#wn^M3dG8*^4W@#m_uxXdg;FE_+I&dvW+J&SmK6fFW~)sN#g-9bqYPxPMU zI!i_VsjDZj<*#7i_Yg6|?wjys!@Rja%MUG@_AHc#QN%R5V}Of7tZi=~rIOZ?9gI27 z!A=FP!D={^4wTkz{Z{q;J{+;!&vD2UD7yH9Bd+27w|JzR#JZq=tD(0{@AkZ1<1;)T zOeP?l+GP1b-cE+XBPZQY9?q=SarMPhqE1+MwsdlgBtM;BJ?wz-;lgSiYCsm#cT?)t&E2k*bRZ%k&IBP1$1JxeSN%ebjM^s-izKQyH|aR>1epJ$xxp<%m*(x*cjKa zx2#FryqvBBy$Zff5wOT*xN^s_4+h!eg3uyxwh97_(65gGP>3vQvw+OM?|R;3Udb;Z zvkh&3&ta*!aZ$>UzL_W3;#sBbM=}n$oHAk=uk(6EnT#3zemp_HT^b<%+FZ z;K_u1lcm6}Tp~xA{p?jS{tM_nc-20iL8>E)>Q(X#u~eA7bQel0YiQlcqguN4U!iOk z*4dx`KCIEHAMv90PjvlS`wzPCNdsRl6#xY!B z%*3VccUAcO&dDp_zwPlxXy&6;!MC_FF&n{n8%;OCBssdoB6&|!Z7aMhE0AOaoXYp7 zezJ6XnHzM6*;F`RonBS=*Ww5r@n_maIF^4*whO1~$d(wwpY@3o_#^9!fi?a*qBB~J z{#_+Y!Ce4SU=V*I$U%*x!P)}iPT6ORw@G8#{hS@Wazl=S! zPgw(}LpYbd^Ok=-n)y7GP%L|tNTtD3x%(X*6ESm)<1$27D7d}scewA4){yK<6rZ$g zPsX)E)52}Vi^$*NAt&&K-FPW-WY$J)cbE65;!Mr&8} zgu2g@q*7}11(df*YV;{IkGPEhlC8Lz{CW8alXwClDqlBSaY!c@Up<)RX7H0?^9UMs zCUut2@*IO>31T6vdUY8>1UD)h_Q_Ff+3rKNjo_1gX*8wdI3cB z2dtJGz=yVm?!OvYDHw-~FV$L&`x`h7ae=G!@i&ejJ6nM`oC6U zJRiPqi!4Zd0;cUgT*``@E*2>cz5bJ!Sf4yXo>gL>Ql+bpN%h+Oa+elngR~qPSscrr z4;1o*wsD@JKZ#(Hq_>7yItKYEjNh|!a*m44;BZvQwD0J+qM>SnDsdndze`m!QVWq< z6PnNxP#!XVBt&a-sIF$W4CSWI(!OO9opTj+c=KgMoe@VlI}_KDYayj!luiyKb+LW+ z)+_fFI*}cEggXRndGC>B4%IWll$LnuXZwzwi9H_1O4VeeoJ&5k|3_8+pMbeE8K+EJ z!ms45UX+#c@?UNJnA7Al=nJZnf7&ubj7T3V|-nz%r2GE}@R56SeGr;f}hQ<;d;R1Il&BnE#vP zjK{Ddj?evjkOAo3bh=lcoU*mh)Fy+R%Z?rxa#()K=Nx4>!_NtJ-$6s}BhL(d(YvPU z2L)vAWu0{%tazrj1SEexZ1Rjw=i@$UPNfT2 zF#Vvmr4lf9p9GtU>XhKCATIp_3-J@=<6OSkrC@}QdLr+#R12^l45&w) zghu(5yA5dZ!IJ4Z>{7C`5nhx1c(O15c+F1B;WR6#AE^qAX+w znbRlkFkk3Un2zg%U0+#Z4&%#Y!5mK%@c5tI|5JV|{!@N?B=@hrGxGO6{XAIw`*f9I zNy;^=E-!9Nsd+ow4@iPreas!K8EA+H_&$o<23oh0c0QG< z@|86JIo$~Y^c)beGhHO|^f-^RD{lWfy%eIr{*F1G*z{B*6Fc^=eo*oa!hxHsAStMF zvWWX3S6z^5j4N0Jhpmgww|?j?k?CcyF%E}9EHEGU%N&CqYl12((=pD&@z|=A@f1If zD5H!)(nZ`Kr3D_i{HJ8*c*TGx7I=PbwOh+|lvK6(CFQ|SPxD5G_(FjbGE3tuayAM4 z@>&0YX}&OYZV}bHgJA37jlvH`* zJ0kx{VYm5AGI)=bjWXd`gbQQu??>{5>AS$oLiddI#gV`AM#~M<4AP#4In7F0k~;`O z-R!P$$P&EY;SS~DQ|$K~BU7RcD&&on?|||NC|}VHGO?BHvNmI){5&F~*(R;dZ{OSO zUzN5gU+-UKV=T$z6F>a--25&IiBa#Vc{Vc<)7OQo5I%Ub*Z5F4D0{~ITBfT|D1y$lh?dFUVf1cwsR_26bK zAu}t^>7_FW0y!$gs386)pZu{_@eH2|H1?Bpl?2#DdKB(70(f2~9?UA4Xo!7MR>w=^ zZ+E~i9InszccHCYsb;<=KVju3^k6DX94*5Eqeh}ldVLJH*&A%gQrhW2dihc^q?o)m|r z+zn-Tn=Nv=_~)sqcochM4h4L)tZ`ZmHeIS`XzM_HZnfbmslrc8#kL16A=?)az5R%P zMHFZdVi941En6rJF_`S?yzL-8alIehV(!Lhh|Z z)=iXm{rPYc76zBu4<`v*6Z|iICzR-#V+J-ir@qdxEW?xH(P^`m=7dRWvI?mGE7sn& zTJ#t)sRY$+4YhkB^pU9FCjW(3$YVhW=_JS+P*HA2nqPFA4jvVH%A^kIk_UOjIW^0t zY)?8glFNbvN}#_)^KDrEMo~`6ACnDPg0_@%ydo=AbLzHC61Fw|N9X(epT73#IWY&m zTjFt;QcPbk{i@16mthF8A&jv+gqrV??+k}>6<>kt9d31x6k%2u%Mosc7~2!&I~*0C zVL_b7!R%lby!_#$rxQc)_dt9;T>8SbZMXgE3Dssws6KHp`P@`l=ha&ebxPZ>NX93f zj%^{2CMu3#MVmM{QTQ(h9Y?vLZ$Hoc3DjKY^!1u?7*0WBWlnUg~ zd(B!@h?K1b+E=V&n=yTAG*ka~FQd+J#NoGzicy!!n^!c{ z2{%=iOVTH3iHqgtXP($L8(7>UzPa z903@ z%ZZ~rkv-jEqw1*g1%GkddF&!z<0cY&?|H9*8p(9VT$V-0=!QWRUzM;Oxwel9+}%p? z^$?Cn^}EXyr&0{M@#m~Gt4kcRQ5VX|!pp6AChP6);p+z7%Hd(cc{y^2q_ADTp6kL* zcQz;)ZFu`@b(Ki}zJCX8>A)fD0{!MNc;tia$VXmfqO`mNd0jujf%&YGwWLqqx6pZn zMQEcgvLS&2Ji1Y7a$zFpoWIWJ>~c&+SSBsmmR}FBEz6NS@|rt&@W3Nl#CDv9;G6ht zDdp2CEolhyj81*>XN}u2X3#Y$A{HT<8K&8ZZB>{)>gts(Bo6x}UZgE+g&+XFS3Yu< z4u#k1(}ol&bYB36G*ag3h%x?vk?|KP=rTLS$ez4u&A+G0Z@MY6hns=8^#t;il zK6OW8z-Foa+kKXn0|tKYrJ7M8SfjwE{&BAKoqWr|(FJ5lJ#Z0v(FvZB-I}&&@)Ove zT<0x}NekLpm+<{*(RvUPLD{|H)`_^j-N6>*ZF?`dj|#9!%d=}cE|j6OUu+S)4YWKUo2&f6<}|MJKivZU-X294yy{I-N* zaRxSShH5#KZP-13Jey@Q*fWw7vw{7lZ%~t8#7;y9Y<#5!ZL}-T={3;*QGi--80p#C)cVS`IFA zn9Q60jIbpOR_QedHJImIcfgddKpAX!p)dANPm79GR^OALvSMiA4DfHLe=#qc65O^% zT*zKme>y=yJaFZYd+7wdfSDmhy5DvAoBUk%fbrvl&m$9zB3{{95bJ~gHNiFUi2>$t zZP=#e&cw2vyZl)X7YM!HmczIHcV2z@2NI2A^A{ZdqZwl3&y_$@VM%bcAJ(WM^PVEp zzMNt*sxd<&lu;2#q8v%GVMTX{vn((`;!s$mY-;Jbxx@8KX;=f-VKd&x5etCHzaOS3 zy^pjjuWa<}qdX)-9v`eZcYlC!Q~2%Bh=^Xd`L*Q~9*cap+A?P9mBZ8t6l2pl=FLMS zetV=<-%29_+GbE+)!6h`Njx+eWmb9GeU{%U@>Xz3(jm!o+S214MUl3K$;3T}bp5)dEXu~pO^-@g-H(^!#XWLJ zDr^WS7h0F^>Ihyr?sAGQx_#!DbG=Y%eE4a-lguOx1)Fy!GkL9%dB`A6nCFobN_Kgi zfRHIocsjuujPTgO<@`j@qMkl|`cvthd3(Y`(d+dtznu!D$hI98-uq+xs$zzv$^_M* zot78=?bNS{AJ%Sqg^OJ&&jj2IP&7(ijl~m%4OdppLl3V5XKt%E`OVT0XK=(aR32#c zj&2=&63;SwS61+4`}KIh;VymmP9nYxTz!dJuCU`!^7v(sFdK=Tm>T@o&0=xg6VS7e@aG zVkwUB^yC^qIR~_kdixpUcx~JbgPXrSB_QPlyl#wbe@*2+-CR?Gga{JoRy5IFwQu{} zQ2(i&-MA&DI~0GjYjD0yg3c2H;czXwYSoDJD2-d();ba zK|p<;oImT$+_eL6M!$)+labwvCCr08=G;$460rn~IPWQErG$Qb;gsy|k&fABq_Nef zH{%X!>j@v{%u<0bT86}WyrB)53hpu>yX^9`rIjv8;F^JfVavo#fftGD(4}$g)wzG~ zm~j0&+~(hW5-}SPl;o421(^@#`T9P>x#b{^m~x`yMyv07n=f?do#?+kj=hwNC!7A` z0Vp!!O%m6Ff}C+^eCu4FCP%ikAGmfmK_N1A+OhxG8T@n%mJTN(pcds{)+KN_9e>~2 z;17Pg$1_lx*$#1QQ-!G-J7v5WvkQ_tdJim{yuP}Q;R{L7iDSg5&wbglJipbXO z(*+o%8I7{DMFHFRV5;sn$QDQK@8Ju_w6#SVrp9TSKh)OPpSVhCQAvXp2YELG2 z*F?YlMT2xC0Z){e3JxYTE#6zH{+5J%Q@M@*V4#0)&$phB#KTP zyDa6kt;7M*r7v|YYEf^CePBf;IU@Q4J|v`Arv?N|E+_v{O%=r@x~CIPCNt}JmFEBS zmhA6x4Ixy;Hcd*<9b2= z1+_w(j?gdvl%>{#-TNQz)5;fYSwU;}MA@KG(Xf8r#(nhL@>qQrf3GocsDoBc(9P$g z{VyATrygjEvtOQ9y(sLk<&28lG2vXfIt#9lb~+>x(4YH2Ld#j4ns|8URjr=?O|598 zU{f7QH4&M1&fiC;89*W%|6@GZN8DNHNYY||nwWf|tsvnoXUB6d4bERnbW?_N)Ddvhf**cmylQ|}fb6kznwhcdlet__h z!hQMC5H>@(&)ZG-b3IyrqLvKCV?oU^!O1~QcCNvD&S{8x)UPXV$|0(4c0FX&@n-+w zhu^szg{V`J0{La-NII49z7!o>x{~(4xZ$ioY$YB2b;67DA@xZg2ChE|+!}O#y+}o3 zz}pjUhgl-J9cMRd1{vxX=mN^#wE0P+tQHzZ?ug!>_j*Nbmh=+?PusBtWk19N7L2-+ zt0_R>8o^6Y*&+#lacvDcjizVu1wQyIOBMai?TEOKf;_BB+De+=5O$k~@9wUax z(-y>Z+5^$=rg=9>B-*4Qm;Mg|C+dq|TWnzPzY=jyekn8XeFqBu{=DbGCb^=|(K%`2 zogk8Yq~m&0+@LIhZTbOb@NyWOuWbh(WY~$=zrK3EpKaw35zgtXL~RgOq9<4+U8axx z(31hGvpSKIYFZt8V6L=$m%E<+c7QD``YfSBn!uB`cS5K?bTu((qyq2xu*Jn?DwW{HH{Gi1 z-y9`xzu$e)W&r*56`&AI0$-AA%wKE&5az{x@n}O{lbkO6v42soKX0?&@Us~*?~3o^ zoYvlGnfaH|#I>s3o7I_yi}+_~Si*GiZGojsJjz~^_i#A+C7Tj4TqAsd<&bD=%(=$) zvdDlEk8dcopNdS*PDI#ZqS0AQsi#$~y-z^hVk)ueO$x2LC}7!WFEO>3Sp)MY^dE*Y z>2n&5>|O}`X2MT?p4%l1?vELK6kV+v*f_M!c!#E?T^lK2T~<2|C0z=WMQ@nHX;C-x79a=cwD_46u%9exw{K65ljxE4I$*9w#2#iO*eh`e%`<*TIHLk15((A)uHoW^v@Q# zs!mH2!R=TYAP2wD@~>;;X+g)g)XirYc_B8@3!mH1#`@ocaGY;5wDzUG$(>D7QLR@p zJR}oVkE_(Wc-or*qEB==Gbx?x9wJK_eN>gUy$Gw;eWlIRx{koddkhMo|K9qWp-?vr z;M0t_?nw`=%e1hqM!a6N2k?@8qytO0`3oTcyUZr)gQgmzx2GJjo$;djeJ+rq+Uj#C zvHSgTnIdbgL)Duc>K_-j7jU9Y7EIJ4YADpfn;$MGHQM<{nL{&o$0|MJuYy8E!Tvj` z8K#;jto}iH)`DFj%X1FVIbk-~(mE|^KW~uJv3SIEM$LdcA6fY4EB;rHTBD)u>5ll5 z{~jt_k{Cy8ZS^TiM?GpLVpcZ=*|&oLR^N8(HlspSp0S>!uqGN7_=4cVQzgzYT`S0#x+^t*1e>qD><1PQH8Yw= z786dO$(g;6QG>-@tOVW9VZ#3KnzzF!1@yq!E~lsphJF#A7;zddr__<;CtkD!3`$`l zXP?8{Uh5qf*9hvHU;zF{KMmp?71*x)$^}J#%9V?7=`Q*vT>fgl_HFWQ?WeXWH0;P7v4Uu0za{RSurI zfqPnZ#mce>RLxl3MvyQ8nQNZ6zn_P!XOW6ez|k814I9LMX5SQ)>z@~GENWlXZO84_ zxbnTcaFU}q!KqJqh-*H+<+aInN#TaXnQIffzr=pcA%NOpBHIv5c>ijos_EigEKjud z$&WXky9aYn(KfRg&eICs$u!|%$DL?B#)=?FPeALzs<_VYjF*l&hDv^!JY%M<<%T8! zA4^Ihx)AeXks{>{PP6DGW`MNFI?zWfW~62$n^2H~1A@ulC`sC8Q1M#>Mgz0fx5ker z^TLeC#UL)Ew_@g`6owM^-SSqhi`Hngk3iwFwKH)`vc9`xPip?^WI72CUO8LHyof_) zTh)-)&U$;EtQwwuxn})VT*J7c@$5qVnj)V4294tBM`Xhp=W;_^3^k78L!TgO+v``# zyqqr?J-Q)+YeOnod#^hfVSVivh{ISPS3zWJI7M7fvArkU?A3h!nA4nV=j}&nQ)^&- z4!vHgh|_CgTBzqQN?`bLmpk}mG)!g%(MH!p7b#qmP2G<1U8ym+-2iBKw<&KW>Ruk@ z(IIGxL7ATJPVO$IkE&P;zno$gSj{ffO}Vr$F-=@qvWkV8-0{K){Yi=Ljh2^!ly|2@ zap+IIU*#}gs&2zRMO2fxIuCB7gaq&YWk!5hTYKi*yt~_SKo`FQwEWSsL;kv_XH$Uv z$?oip&8vB_S+>(grMqPRAn&o&;dc`n_m-ASn>Fw1M4i(qZGYNX;wT%3wXJJeTzv6^ zraY_}I}Qr+Q+UAndKq%B_`N_+ASX6RYjf5|{#S9VKKY2tEe3HtDGynaU-{sMs8DZr zT!nMnBxeWy`yqp5m_V2fq_EJt0xlDt(?{~%zjgEf9nf-+QiSNukZ+o;DrCv>n!dc; z+h{ppw?hc;Q3Z|mJKl#0)34pFb&_|0y}Ig%&i-|840Fv8K4VcDeLtHBrs*(kw1(N< z&a@K~UVWTvUzXDU_hbo{YLxF}7`PR++d{jqm1!u32Yj6rnP%KJ0FjE+jnysEiLl9_ zg$or%P^MG9PPSz4d2}Uq{pfSDSw8yWu`creYDAb;dVZnqt0Rp9wOR0vyW z--L>61`weR!@l$5Hi&?Kfyg{k`4ySfIr zpO1j!)Ay!7rP5ECSWCD!XhY6ox?cM9*Q@T+?|)o~>yx1EPg3^_{o#h7Xu2o}zJOnp zpKC5W+<%M8UwB$eEKm?TlsDOuuXZqnR>G})D3_)eNIOa5_WKTFa3=HJ~r$RZj2 zY~LikN5$lTVrR>U5;S%H3nTZ`R&f4$>~LvreFGjE7VWLrXVHu{gFFcZbkj(ox1`XO zagl7-rFMPZMBYG+OgX35mb9>4%}ef1-zg}L7PFBtW1ii-_{@pKKE|-NqYIWC+q1qP zHX}K*F~5N18@YX$c|H7>sT$xlYgOG<~Kj2gq_tsfU?R7`5p z`r%FDXnmz6LsjbC)w7QJh6@CKe2Q0P_L#8fr~FQ~L;>BBtf$8E{1YNxuCn?2!>%|% zAkUf%wQaj5iP(9G5UvIX`{JR#`U;YG*=sKWurXPBF|--O@=UMfPH9yA&hawec;|c> z#T!akHu{)N^~Ay$xR>d8f4v>Acl_Hmu&%Ll{+)BXPAhY!cc|nu$@zSW*dLEMmu1{t zZkv(Xs4;I}mnfhD<^l(X_GT2+sa;M`t)!CPOqlx_>Om^Ar7y~O^@g#P#HlCl=rly4Oe&>~ zL>g8^M}JP7I%2hB4nCJQ?C?#`|2r$ebsFaUKP*OHq3cRsOF$#TcoHVJHQ?=ZEW*U6 zk@wmiyKj^~I4qM-!dbB+hU;Ci!L(GXaGb0zz4Z!D@9XREYIiT2#cmo6TKlzG+YuN? zZYT{r233zzkZx361ig*Z{;o_1&u~BkOjeV*R~1cv)n#fp=6e6&jN9ai2m?kKyOjqJHwk2=kYvv={LLBFqsjwoqGs!ji*KOFye zXhhUU;ZH2j#K&HIdtpyCK7E5p>#QgYISV33JJaKwhd;r;n?D$(CZG2pP^QK|HQrWl zW#(kCmk-=p3j8#))L&z0Ii=Nm!K9VgvR2Z;pNzX!^Ht z&%J!1^lN6opT>Dx=_u>Z&5!&$N%`#3(5o58S9_-tBKoL6{egmwVdz`kSp-E-fTF2-@2spa(?SuBXJ;c{D&U6WL;g`FvCCO*i&o~h}OdLn}#TyH#jt#w~-GO zRD4RN8e8f|+upNs%YWJ&KhTPJ73D?B`OvwuUXhK1Jb`*GHor0rIm5N{h{3idgz}Kk zMm>S1HB};_jRp1PoPlW#{wXV8|5`BH0^O??hQBnxzWnT*MAWu6o&)GKK)&_!Q>Bv? zHjbm-j`~c+0w8vow*+RDyntL1U>rRk2t+~aoB(I61a86Dr2V9 zq?%zt~HLNVBrN%@W&Dkz{JxO)2x9MOjx@@ZF1}t$xZ(Q{( zHL$4RjaRwQH-GR%(IB$j;qP0#37`D03Q$c>BGhm(EB@9&l_8yH>`Mozd_@XQZzc%* z4CDZ+(Uf?K3y;s$?r=1S{}wlG|074Kt#sJ8_jyOV(DzG~#UfKy_)esH2MR|fB8oCE zfE5Y5!Cq=AchlMDKK)^H7KJ$!#(zVN1}!Ol?laiMC=fZa|Cu{+mAcf@C&t3(0Hpi_LX6$AOJ%- zMo+XBteqg&rb~@`s_M66%)F&Rca^|7l-BW8rO3JAAkJTdZ25675VBWHJQr%7FFLQ| zMf##$i)kPdTdLMNKh(oZLhhczC;)Z)_2F#1cvv~YNAiglI9j_$^$O)!t@-W3_G$iC zKn+6o9a65PTT=25`!4HXd<=~xGzF6&f@uX0*%7xU59@znaG70Y9urttdyq7 zF-dR0@GE5H>1afe!yn|aVbL(iDP%QrG=QtxklL+kls5^a?woP%BeEpOE2o*8;=wyz z3b>6>vU>_F_--!4rjL+;L*Fg?J=JagR%Br0bYU7{8J%Z+RyWfeQ&krBbRBZ_F(cg? zzTm7y{2Vw2oCSueAm6GdW_Rfj>$3sOtqKYoVh>PZaW6Xsdgk)ESuf__%og9(8K-R+ z_9n(EFFgGJ&&Q3ResF$uUNTK`_Fd=mYG?wRb7mty7M@7rb-(4|p{}ClT7I7MPm!}b z%#l4bndHsSW+>!+fRrsKN1;*n#b^Ixu)=qrCJr@f8cDB_HwRnaUc|Hvl&~KD<#6`t z<%mxZJs*m`hy(GUStM2FXtvGSe9M0&iv|?t6+GI;X!h`#tqzV*ukG1cPOiv2Th2jq z22cn}5-@RFn#*`;(w+Ob_RL*2ABk*3%0=5JhDX&{@W#$mNXkmQGkj*GC#J5g`%#Ze zZo8Rl)uq?9ak)dH+bYi%%whtoHXC?aWAg?Z8}CL{2`)t z^E@G`bhpqqULX(<092NQQ_{Ns2~*lec%g;@ldEk7hS&_2{ksc14fiv5NYJIEMoqJ* z7~tf{yPt2f;%tN%Nr|n1@tG->?r`-I{beueYG+OThts;nQgCCx89@~=eDa^F#8CXd zl zUzL1qjeC6$1;I57%?XSXCUp@=vg=8$OOm+9f55=rXz^tBuve2gF1xdwP4%51mst_f zQRYju-*;3h5>{y@oys>vtrm~98&kBOz+S1nYO&`FGN)pbXtP_>Eomvm-?QTE1pXQR zOK%2!z`|M=@*)KSA&vI^!rh&`1DxQ^5=KOT3g5qp3z$oq1SUT(_O>v_4BJIx9P=>| zl+cPxt@-4Xc!kB`4WY^zPxDVt-J4{^G;^OG*-SDkb+vcAO5bG4c|&v z56ntx*u8QDn$};rX=(oFfV|@*F>Yg+%e7FK;?SwzkEGj-lr&i={;dW+I#p1*Y2Liv zd96Nm9#GYO{@nrg)jloZhF*5sh1)`CS}1Ew05pGPztFB<@2SE2Co>tUWD;g9#gZ~8 z=f(9z#7s`#^(Esd2QbV`bj|kCduE1w z?q%!8(3$QBh8KEVa|5ud%Ro|Nk zn!lJa(r0VHu6`VIQJ+hJh}c1I4fF!1(Wk1oHI*g6ZLL4d{r0? z#6kzFb?f48FkE7zLmx2zMO?fH>Yt7GGj3idzZe(c4$0qFtHp*|RwklfP>@@>DLPz- znRFRnM+A?l^oexe6pP>c}zE*JM_0BxDFkQnN)7EA8p^AB(}=G5!`QeZBoB9Weg!) zB$1g!N<>wC<_wwL+I>ItM)dGauU=dE+yGyuqvvL#`ZT6ncZM0(!zSO>l_a}f5JXp~ zcgFYRYOSAs=bg%|YdaS~rr#%70udyur*=ET>K$W)nECrJ(br^S_r;E;81@0>x?6Da{#!3zZhY z1m1#T#jJl=o z^rCf2^;3^bKgCkyG< zs*k(a*Xg)_IR`Lt>zWn(9xrw{q&RKZncwj#`Iu95A|c50RWxWW0cS!wwW;Gpv@VyZ z1;i-7EZOKmRschFD0nmU0_PU=*5^}WFRqyrj|Pbf>8FqvG2T(N$vW|EkRAotI;^-< zv~10GROC=LTdI4L^m_EkVcBmjxj(rdGeIYaXN2giH$oc%oZW?}{1O=^XpuwoBYtYkSIH%8kU2s9Z>OiK zre`t0E341|%y0o)n!rqVya1+a|NHf!C24MTPOQeG88xPnltDh0Ib@Yo$P%o#^amoC58h-U@6G?IhT59FuwJ zGQ*h%0>2c0p5bh&Cc1t^bCsh?YDVE3kgoI1d@q@&ww{mvluEliu&{7lKB?-xah$Rw z;fD~tWTxxVk`Z?;DYcuz>#mAo(b;j9OevPE)pujT_6xyXpWkefngNoeRuVoQv67Ry z{@HZ@4;HZ#kWVqZ0~PlSW!_z0(%Q(}C8Bv-uK_Jm9c)oZH7Cqtd$FP3F%d)k|+*NX}gN z55~WW_U@>EoqdBw!y$w3$y~*}e#Fo61K_=ECj86&E--yVc{~JvRDc=xMT4JRmeXst znx!ww%O+bdkk80QeeP}y9T`i2Sb^78`Q5OGWhS0v8F7MLk?65@Uk7_9^XLmf(fgkZ zt`ep>lA?lm<2x~wZymKkJU{^;|KCC6j9~r-Zye*R(QUruoX2UDesJbS|&F_ToC6Df%2y8)6FH{|~*EVy{Z>g;}d zH7UXBi!4UW3%%gZWmpVujKuo4&r(z%Z1?Hsa8=*y=JkboGFi5mVulQvlS)5=^)38J zADnrX88R*Y`5TyMVTKD|rS+wjS_GY@j^&$1TdBB+y8G2w{dsh5T4i34c}G#)?!r{I zOq_E8QEA_+?OeM;-=FLgiJg1`Yc%xRgke|F?xn%e&?hMSB|XEh$P{V-)ptuz{xcl(E+p>xyK>>vC*{Jf#vMhJ(Q1(Z zu`pg&20!=zkFB>3i|YNlhZT^JMkJ*{L`vxxx*MdsK^mln7(%*3kPf9Jhwg4cL8+mU zj)9>W>EGe=jpupa>-lTAu3_Mud(OS@z1LcM?a+?YZxS;p?41Of^!EOV%uq^k|N zdjbV=CW2)czm>_J@cPT@Y73l3m@EQjK0!CFZv{XL6_#KT-24|zRt zueaRU9p*o(u=Xa3yFnY=3gWM=2fsoQ+{*^$3*TSE^P>h>_OE75{mjlSBM;3yWXGjA)mxtV^{-ZTAR)7 zu=u}s3Eb?Pr@`|jziI3XabwnZ0{cz!Wb&kFwsr~S?cp@52pao6q}cwtyuVn3zePe|t=kON{eqm>Duh%6Y(MN0BXR9trjp=) z&kiHLklH zhMgN9Hq-)zls3=;-omEmxvMfjdxsP~l0vJZ#&A}45=3a*-)3jWRF0~WTP^EIQR|^% zMb>=@$HBear8F(J1 zw5f&OLBaS}Q^H%^p(}}tD~>BlvAg4hw%dyZXaJo{dM>b~XBbe5gKpPIyS|~RpPh{bC_SqRNR-cWMe`fsk;cFNAh*#Z^IDgrCSct%TjIDsEBXz8Vv-9BBmz?QC z-A3d|E27lut)z+~>7Omt$N2cPKNh6asY8PMEH1u9f1?pOS`S-)V)Ctyg4D|d{5yzX z{dv7lPcU(GVX}Nlo|~^e<7GCYc5||2#(KUYk*R9@lJsxvRZvRe3aPYzQQ;O_Sd6!R zbp3Z#HJOuh_Z8(&F8MKw>GcBZDCe#;o8+V}q_@T&%|nR|&7ja=(7OL4IsBK*oG^Urx zs<3IJGbOQ({CZy&&fyLv}>h^`=>K@=I)ttdsCi|TcrkOQmf{juy8%Y4vhCjl;uv9+7+tn@R~>Drfv zsXbdAtx+R-FQ{(HVD0<1p1;oBN>SPSE%@a`WDMzdS)Z*anV-U^A5L6-^+f6=l$Fak z9FKbIYIq%`gJ?<7(T34=yN5N2bU3r-PO-3;juff#9@l&giaSd?tyD60Vk!o&5m#W- zxnG%%?TiT{+oSuu(qtTui4H$K`8iwHr8 zV50h986_y=w$INBD@2Qh{z0)= zUyiESkA-gp#5g=ZrYz$0`YAWx9&a3RmHcXU2-{rrs<3EiZ8|qWui235Lw)6o+)hcn~ApB1$tWIqMf2T!<^8^|bY;95y;PCms zzgEI4H`W=0bxx-BWf}))NgrFCN~T}*shhr)fkr%g+|N3=+)}&6>R6Ra-p*}Ea3NJ!sX?Uv)XrK zk3LCMVvrDzlX<1yJSntisNi5L)M6=1_L%m1qN1>a?^d~J>G?Vp?}u{9%Qe!r1i$Xv z)m8@EvXXdJt)3WmH%{eupU)87{izVcw4LTs{HW5nPdh(({+)9C^CC`r#dO7frLc}( zb47jC)VLEdyCC@$N_36+fYxUcL~hexI41a+>Isigdc8287}TqtZpf_OS;%Bmr%3|k zkp+W$z;bPBlo&rJl5KyRVn1Q z-tOgkpAaD?Uy__p^ca=P%Ho@S@8dWw{oIinVoD6IVSPB)vwl^FDI>c)NSg>!py_1@ zRG@zWYFlNd7p^JL&VhC+SD z^ZX>qhS0~mnh;1R={29SF>8!Mnw{OmMB5xm$P4c0dQoAJ^Sj7#p%A!fILQ>?ke-H?)W+v)DtTSv~=v&n>~ zqpqa)m znnpM?14C;a9`puV6CzddpVS#73T67VMq_+6O!oh5o|cH+l`a$|3XsI`$;AI8{p?B& zY7ZH^8qM%b+NrF7YYIHc>sWDaJAj|Bb=JvXE#kecm*PQ{anTnZrjYV*GCt8}>Bl47 zHaOK`*;i-!PN3K+-)Q~2?$%2<;l^E~uXGMb$^_pbvno=F~F4@%mF#%v$61+LeRi62LP%8>9zn;Xi{ zK5+D+#`geq*QC)LOYl4@R6|pEw(Iaw=1vgkuWHj&6KUXBYY*e~dRn@cci-8&+3tT; zCR|x4*aDQ>DV%@-jU0vNaadLJOG6j!cD=^A))`F^uQ{Kz$8;JK1Xo`3c0(sNoXx~1 zJK65&%SKtLu6c1yL1#YJnXs1a9K+&a++wZ+b&{luhBv00A6MfyCy&!Q&k##|3(nkn zWUU+QL2N`}5*LlnEIR0|)+=B?aOg;pOIlB}HHbLTsKt-J>P6mRW4H8mHjn?2MDAP6 zZ!Xh;$_m|kfZK#TP~*b1m)EicvykytI5z7?;8~gRp84B?$ApG}Fi8vy?KW!Sp2C#anOd-w_94HMO`vhSZM=>oRVqAv#JLy~M7Zvw0YZ9kEk zQ>Bx>>v7wtN%+fG{)U=!n+M-h2`wstYr(%SLC%ust$gm^WSC=Lfk;LvC6op#Y;&#qs7n{e@j3?mx3*E_UJZCC%SF3*+ex!M?iI&L&Qy(6r%a8Z znD4@hw&73!r7|&*|0%l}=X!miAGs|K?jM*f7qL|;tZ`xLU8ufu6H^ll5F7*YRlF&f ze1>hVj}6sqBbqu$fa1!WGj~9136+>JF~VyWm6xr8{gbf?*pn4ay*-iMbOnJ4%{zAn zeGHZBqf20)Xxw!2e-SFP&mSLGXYAc()zlX+dLX)f&hWLKKS@b2q`_BFWaJDA4o<^a z-mmNb>=0aU&U~Hdx!~MptYA7b!Sa-!b0fi_Ui-4b-&pKhsF1hFK!y;y%QotVkEBz7 zo)vgFYst1K(O~W*KbTl>~{}f$bZ&%UPAo7M>w$N>tX&1 z$(8-RYq5)D7nsP7Ui6Bx_uPFy>Tlvqr#y{YiyE4a5Q-Z#BIlrkYUtR1R_;pR^SE1K z)Zbys>&S!;B(3-m?4MnU{*d@vp;t6i#*`F_vN9D*mM!NzEZ~o?g3xMi)!uQv24&KVIfv%qQp0Ru#r-0x= zC~ui}=_`5G7~V7Iti`bn>3D8@-CZzToN00go_F4l?42X`rA75CH zG%dYmj~7^rw5`xupQr*--Y32aetnd$79t}`;wVG$?%_SBwQnEs{ffu`*1YM zoz`y~Z!5oRy}Xy4YIA1FU#8s5?q)uUJ;iiiS~9Kr1ZR>nO8dp^k8oYo z{C&HF?6e)l`0T5tNzA|l2h#;A&nb<6WE;*MVuq95rwU5}zU)#Tpc9AO<7vuMSMJQ4GqK^t=y!t@vzQdCDsIn&n z-G1F8X}Pog2VA$?CNeuY!N%HApCqNR3%pE=MBg15QDjm%9$_&NUvM;OFDQ#oc9WgI zlGEES_!8%ie2gN$oz(RC)Gi9{!r&$%*>q~Jv~O#|NVtMQa&p?ftoP#fNJ7 z9Qv&+{Nwr*aCe%g`^P` zucn1p{-vq`$hH+vPXATxHowJn>ZM9&&+?+zFV8s`P_j;P1C~#7VF!&1&P%8?f4i&h z9i3idnq1VTdEQ^<-Rs9l$!E~Fmu?P;-MJw@<=qsv-JL_l-nLv_uiSTDFK&zKPL9fT zUN0SbiCz6pXwAFbw_OUxpl&WLPugTcai`D6pSZAo0q>FyEIn8eh`-|<_$?P#twSo} zMh!9a`N}rL64h-ll@FnwrQSXejbFcX73GM{<*Rfj@P0a)Btx!N-y0ppR-BQMnc#?~=b_YC3p1`#ACLvU%i}u?C zm%}RX0ITYBc;Hn@V3~B9#3|*<-$8^%g0B|xyIMf4VM4Bg<`ceD_63p3KX-KvEF2Nr z$cM+lQDZ(yc=T|lNi(oy;h;59;zuBe|zjNOEcSYw1Xkz-yUMgnceTRzfcWmAsA6u ziG!Q(Gf0PO@IS3DipCH4n8;HuQ_C5(9nuKn+j+|A1&S$T2ISghGh^}K5^D~v5vG&J zYHozBGszH$Njw?|(Pw!1S4wT;i;Dz+4n$DnzrUAx9~7uT_c`(T+FZ1>dhzM3jSBnW zMh5JI$ZW+9dsK@0CnNR9BA^kd!PFCvCYG~t5uT*@*wk&pvTFUG0_Z?2fZgnoY?GHW&M67zWUEm zY)37SIz@QJ?kt};G;8#}#mncjE8YT0{kHw+uC)+$uT7ieuS+IhIC~=pntD-?B3^1v zDf_zQh+FnR1EDrn{>RO^B9OE(fjDX3n=>|x6_X+LJ`x8|>HR)$>@eN6hSzUgW>_Ur z#%AXyFQzCvc}&`qc<=UtwmogAK?2QD5QbJl`ZzFAW~puYyb4dS-*THp%|{W*A9%{Y z6vdo73jw0T?gh{Yg^=O&)j&?>-PQZ;Dw!JOl|Ou7X)^bsUU6P@S3#|;Yj_k1w1n2G z^0oov=wTv%d+@9JlTGLDk7@2}KFN{O!GKS+0>R<Z7?kLUbZKTpC#JD{#?Xwv?#gpS^$pCtSJH zpo;T{PggID?oQI6w939}N{fMwFI#jIKqte9X=s2a@}aw+ZGO6H#)r@3W{p%ADsHuF z^!3Ne-9-~`-UXW5LbCYpaPYEE&vA0=Aa9k1NLr%Kyx%zfn(UH_%eumbezje~_h#Gs zC!Amj2uG3Mn0xMI$0oZ=sZ%O4`y!|bKU-vFp6p=oVf`|7auXo?mP^R4`&$Gr)JJ7N zB7iz+g3xnJF-lyUZ(*_}3#rPO-9nI~;Vh*^Id zyR$Bxe!5d9FtZZH6CLXjA0}rMI@I!4!K!nY`FDmLQ818ljSA#Btf(FO>ye2N!UpB^ zQl4!)Wkwo0T?3%i!gIs&i_Z}gF@1l=xAeC0?Fe(pPb+<|gV3YQgH-wP88&|~9dp$s zV07VP*8(mz>6MMNM0_(e{qnzPDTjmiu(XP!k1GT>@dIC34bLsjEI1mUpC3GpH%uES_AWEM5rPuP zMLvQbsJBAsQaD=k+3<|d5YpY#Skb9O>Yxl17Wer z8K#6V@DEWoWerU)2!Hgn-GI&hXUv$Fy|MCRsc@_`PRs_rLyP!64xwHSYb}&Y0&zr> z!lQR_dZbaloB-};5Mum=ANaS=Aer+K zHRSAf>RHQ(cGU!V`bYxtX%dt8QfMzCH^j(|X-!L+h;mJ}5&|9py_y1C5uOgQ?2;2bVV8LN`vx z^}x8L`j6xdZCe+RPQS6y4^14KvGBWvo0^Uei@`}BA6D+f#7dfLWd<~#CjMgiL2|n!kjBwV zp8(m3ytyEpDRzHhcePqDft=j*p?{--Hn`+XNO~R6(%TVuJ%Rs;qml1Gpu?%ve5l|A zPf7ToItB)wXDaNJHbX&MqdR&hSuB8rcd{2ps^r@gFdhq?edT)7G@!&evhb=elo@2r zgYzXMpz8u2w1D#_)w71wN`c=Xy5Wwr!$bGh+93V(=SU~<)_wku59*$zo`xiA7(SNK zB=o3+nq(<^KkKyVLL2kT(G(&Uk2kAgo=Su=Cad1e7&SK114wPV$Cws`7^^=W4)ac!sIt>el?TT?;teaOcu- z?oE0NN$;X*dzHrw6?T?%Z>PK|R^`Vip@H)}kWiRnxgfe)z_GK8fmNjG zu@8jYh&}*Jp|=vQmr#%j*bU4rJ%s-&);8D6Z3c8NbdwRTZyPyQw3}%G4&*h~d60|J zWr0X$6Lg73kUh=3GCMF&HLSbxIUJYV3`j4L6<2fiNAk*248ye4YJ1{$*IoB*i1h>s z=t-j1KF^yQptu0R!>s-wALh(Ex3eZnNp%12;RvPVL~F%_MyE8yh~MYR=C?9~$C`B$ zQ4tDO=v>yK$TNW{*`;z!^>J9vq5rlor?2yx2@YhQ>%hHjz)vfCyRRb_E#9+XXE(<7 zoICGQnSFbvsnav=ZjisTMuTgd=LLZ{T9ne3?*+|CVuXix+rpClKjZE_4bq=c^Fx7@ zsjP|0rB@C}ZF%D^aKBjYk*)^!I}ox=k)m<0k`F8G7SPEm5;jZB=a|7(vXnaedu}&?YEdTe~Va- zZ3a`Xfe?YP($wazh_EP!qCjf5f?kFIrv1rh57Izw`w-}>OI{}?MabVwj8wnN4{SOu zgnXSN(~6Vvk#miSf(wXdi1!h1nhpEs#+@SJ4MSI!A25kNF#@5jmmn< zpUMW}kJYs3o)C#)!mik+UZt1C)@1u+0u*OS58{7>PhZ1_5X!~;+^Z+KWV2&(1Rv4W z`s=Pc4k1wLp+^%!Mok?DPH~P{uJr^fU)I_{ngD zedv?OjsmuYS4y{!^G>gOcj37q2nZO$6xLkrq_c%VMG4R2hItxIeGk>5$}6dthRFzx)Ehhlz;DUh#EID#xF)3^ZH(Z8@%5fq6LoKvBwU2<3l!jr$uR%v4(=FLTciA9ZS zf`s#2&ZNhIGV6fN&ZC)w%^B!Xr8`{;?x1(7wDFtw``xC5=n?q4YmUY zT-HOM>`sZ{32)b0Y6V=qn|X;+fY=4=Otp5D_&iT;K@?@a|BFbWex!=Ck4WzDk_<3oR}EzwKrVy86M{=E4S`; zvZ;b2h|YM8T`myeEHP#?4RZ_gwcQ#hx1h63NL|PI<`Rwym9nsq9)GHB(jq18|1v) zv~uzor?aB+B)(R!QfPULuZi3M*TI9pgd(kVs%USD1a-AU^t^PsKwdClKu%hPzNQ$T zGl~pU7tF3vqHt!F*$~!U?UyNs3ROXUr_1?9 z#<)w*wW8&7LosnJzFg9Z`q$=`GRNU+Ayup{oTU=?So|DwHzbcYQazmtQVYJJT8I#(?`tAGBXR691V#xf+tB%XKhxrqK zga6fJUX>{=_beBf0X?wTnb2WBz1U*!^ME7n51hfmV{5u)#bRwbLpE2ZAcrqDo*$N@ zJ;Mk@LEIKKTj`zFUrbDiYxz|M^A~+(NBpD_e@;3^CZ=Q!m2r}i01s8 z-1O;%T0KTPM$-41<)kA8q2qaOQ!)3PN~};bSuHzv%j5mVc91II57rIgkB%gN&J0@H z$D(Sy@UN;Jkh@Ztz*FKLxiGimcD$vlp1pQ>*FXQ^1#(<&*KYEBGByTYVvMz|fKnM+ zp2+tP%3O^__{a0;p*&U%eoBPq<_3T+9aVY1^8&aK0|2&_S5A>s)zuVK7N-|791f0Z zXvaxspNP)Ka(Uw5pqJ0PFXODgubqSQ4!3;+D-WC(G4ab5Q9auPppW3K4}59L~Ev)qysva1A#VI@_Kg9o`= z|8mVi5bk+G?5t-FG}PC#Lo)*fgbgH{@y)YM2ah}E6|glh1gUJ~e7D^k56dlQv_7a5 z;Qrn^gXupNX)*1>Y&Lz#BtKY`!=ox>D4(*lB6m}N;gm5sk>N`e+(Hm}UDb8C9rG8+ z@xlhrJ>w=P)!I_FfsP@@K}hX;mQmHE@)wWc&y_77FKXjSW#(bBVWAW!^v^#lc$z-Q zy`wqM2%K+zUdA~Zo0Tc9nrv)kFE-RxI8513M(-^G>|lhAN32u@BfDt}V#t`TU8|aK zMKRIwG}2&|^H`O4N|WV_?(*U0TycJ_(6lt16V%J~)6HUOde#c?aC?o zklxUbmPT7yLhQp~Fd%(qCQyBWt}lAh2_ z|5G}HmkPp_Jd@r2M25v0s(X4%n2xWLt&%?!r@pKjX1t<5cz5V7H2aPr`|6)C{EvYd zATl$@)Z1VD`hBKf0__-7@7m4_%y4&Zdv4>D`3bWE9}S0ynMuh)T#)0|e?lCbT{U15 zTy0(B%N0mpt&aAx1A|$CUmW#W|1}vV=(hgZs-P-71Cy# zv}V-;G+Z{xXKx?nD7h3m{7z?8%i>FT7M%JKh|WG73on0i+qJ%O>D*;ld4~WNM$tpl z`+w8H|K@y7#k=#}L^nnYcNcng3a=JGr{8+p_wy2#mD@TA^mcCfSrkvFyQX%T8~kc^ zlhF*=K4ysh58L@)tqlvkS+yXGM!_suwrVEx#Hg?xwHECMg<_`X_(5W!C}d~>mw%L z#=^EJZAa_ZlhHEyzLs+SU$;T`23OM7VB@Df*&kJ`3#~dlLcRUlj@g^6rze2c_4$Op z>i@BZ*y3hiq}7S1@l;D>FvAdw%qZpL!54FS$|A)@wr}~AGx-(r6_Q3g{;w;3hVpjU zh%M@wua;#^>u0QJHaQ^#Mr#znQGoKYsT}17Am4O?<4o(QXSzjtQIWI%h zPpW2p9P zS*O+Nly7)cPy238AWG?u;HLMj!fTNXtpEhIymSr?ye-{Tk@^2EPxm`If{PPI8u&3WD&4|zw>1c1GNNnlJLnB)8DJ@8uEXm_hLcVF7h zD_xcVpj|9WW&`*K5Zr5km(l18I0~TwT6}D>5W-V~bwC(<8{C?jVsF9{yMF3=QFHv%$~VsR|3;rRbE_Z{Q8; zHt-z-wj(P4hJ96U7^%tZ60#FnY4xKAgJ#kAz+M+FifkG81di8R`vyFLKS2mU?TdJr z?DIqC6sS{NaNEW_t0r%6w#5z~ND^<%Y$<$^dZITE%h1LwcKO}&OWUNHSVyswLehgy zmUlmvdu+#R*=O5%Tm)Is%IOxRKfuCI-igxcMDuio9+2a}s zRiWKN#cbMGfF>CAZ1)8(gSG|7cb9>b%dBs4fJnHw^WHl93 zdK&k=QDbV<^zH<~KyxY2R0ep$L@3JBMW~8iZp33uJoI)W0J1=wDTDyDH$WprQ5Fv;rJb^xGp=Q*K^}K{+$n4&vuTtN!;l+`8Ze>3HYD3{o^^<*Ll$Z{W-WP z@&AcI-B*&d=umk1jQ)bOnGj~h`8G2QEprT#Y(NtEXksIrzulZkf`G2wE*`*a%Wx$^ ze@Q$&j$IXbwlVlXer0X}o6uw_>!r-YX@zKP>Tp74!rF_4_r4X_&%V3I`nt!J)}qXw z)inNg=*47B-p!7j*dFz9q}2fs#1d1Wwc9@Bur*8Y&bNBry=)$Jz6NiceG6hG;*0hXa_Fw?zGxuuQGS{Wp!@V#nXy% zJC$O0{lBvYVt~f|w5{A|^EIWuFR;Tqa}9&$B*)rKD)OW%u%$ZzN@_~vBXfHg0Xrx} z9!x6eOq$_E4cMjJFyU=CB-D-z!7Ju=^&T>G+o;^ErG1+v0Fn98n$dXiz-z8S6EhTL z+3-}R5;(Axk)#n-SU@}X8#T1VWY7^XZ2`ax*J)s0mgzrp56_i9+A|nU4tVT0gt147 z;B4b$y?AU=QI0h}sVZD4YT0N1jbouGE+&P}C~E`iB2inyJ^M;p_{-8f&NO}b z`IM%X_K+>DTr5CalKX6-v?SNSt-85|x3=kN%z9KMd6X5`ey9Atn z>+?GAk+LdD)161}dEVUquoa!maqY#@ej;gNIO)q8j#x~Pd!%m{*9a&H?%|8bei5In zg~j4F0GAdMJ*BrOaqG(YFv4<9{vZqRd8<@0ZTnNmblnJxD~?Y_gkZH3G*5cysyT!8 z;RnzrDK_E44XLNA@>F?q8o^wR4@v~CfO5&Z>w4+xiDquk41GJmVF`WW@&@!!5@vL$ z8v{3gt3TN1ey;F9Bl+M`btc3f0Z~9<$Jo=~VngZN30pkUu6(F$8l&UDLNM%s-?}V>cFAzOziDHYns6Bp3U~7x; z(ey^iv`GJ}QD}1s~C|;bam|*n4_v>Sn(g4RU+}CM%Ct!ic(3RQ<2WT}; zc#;iXi}F0+x1vfOqi`X)mRrO!e3}7_ydiF64;!;i6+9TO1+p|VXEY!er7Tc>YmMf=S@wJ~i-1??JHSm?Qu6xw1NjZi(kk(>Dl2dp z84E2ubYf(79nx89*iZ@Q$e_O9EG2FK^Q1Cbaq4KM<*lNpet%X|$k0i!CBQ_u!|+E` z=F#O7p<+r!%g0`Bk!aM6?UJHrU+}dpCc7tYqs4h~d&R?bGp`rwN7Fys{pw>Fv)Dn` z2Eh~YLF)m>F{U057g;XYX=VGXpS3qXN(A)s#pw?z12lzxyv>@?M>xNQ(rESAdB$a_ z!`qK;=ACi5tg5$J<_RY~{09$k} z)0e}K)1Pwx4dDmLr`RQVW3SYS9LcCMq=ZLZ;J1*V@g?^R`UM{uREJelZbdSEjhh~9 z_QzT&|Bn~I;O}_4DO?L5h1l2pXPW`2C{-<9?M!|kF$CrKlaua-<7p)m9ZXSV88Qn# zW;r^9O5mZ}I+0ptyTH-5{|?(V4(#7z;?YWT>$=uan|K}fZv69gQd)xFD^acLFS4X! zC&#FV6dQCI@VVqDxs}gw&0G#752%kjW!L&W<}nj)+B1y}&l%*!Jwr&37nLkq zeUrtXC;!WU2e9CZA^?oPo;}VPh?NtU1J9N95puoDoXXF8r+}Q^G84e zPoc#98pw(Lj3)kJwGST2(&sFb5zFee4)&=#oTpBwIHCndi~wX)hR#Rj1Lz> zVuPGNodF$=?%h|sLmP>sOvpA-&VL=Yva9Ny`79wFugtNTf^lM?pj(_0%jO7v6O8X~ z=2Y-i*)xm*g}pev`bqKpYg7fkFn)p?LL+%Jw2+?4)}b_FKZ0q`!FrY&bjr3wX^BS) zG?ShKOjuKLu4jUrY=@|@FPt@lIj+(#dZ&1s0q$8pNyx7Z+~MT_E-baHf(O=r`= zx+I({Ms0@R+~}1=@Hb8z2AuRfLB`qoW*?F8FmZP(Mipw4ZrCRp%76JQF(|SSfb(U# zQiN+@Zi?HJ%XpsqJ_rMpzZ|%pOFBO2zd&rws!5f^J#voYGq`wtB>kg#rGd`8i6_^b z`ui}w-E>TSs5b7aK!UY-I@mAw!$qDp+EDr&AvBE_=KoU}e5MEnQe2AFsjgRO9$vVO z9&AYx0YygkzZJM&Q8FKw-!}6A1#pEl+D9}Bxy(i{%KE`peR<6Oid}-^a(=Z(%VP4F zPTAGC6L=ZkL% z@Dje3IS$iwmDN$|Tinv2DxmUh8lGb6KW9vQoM(C#k@V|JCgg2CKW=Cm;k%K1=NHuT zSg0PTBV@12phEUAuuJtg@2cAr(RAQ-Q=o8Lbw{w^YNa_X#j;#=OCJ?Necgz`b3KaC z;*n77{(6g<$Sc0?$Y0aUnU=3{ZeAYaMSXx>FGGHtjJkp4hbURAP@&{7To%PY&SiB# zKgNcypV#_)w#S6Rxu66}RNmq3R;PPl?PI%jLFq^^$6(a9l23nKto#Rjx_YpHK0iiH zsFkEn%eb5Zf%@9gP;ta*q?F`*g0BgI%Bhnk3P1Sx9nR{PP5rH(p?VV+wCe<2HL4U7 zqn_2OrjhWT&d%;}_c$_!w@W|H?VfxgcKSe>JM^Dgw)-7@BIB=jU$a_C{=05m{DqwwqRBm;Z@e=7;)4A=ykz84M4mQ=m{6jP1iNpmZjtY$WXXpqLQfon7!ruwJWfVF zbcCp5LOS1nb8^Dinm9gs&osjy#hevCTc`eQE+?FrX!4Eun!W@IT?M3P%02qcsekV<_s*p{jKD+; zgx-fO4_0<5DtW$r>E96fPscuhDR&n?*pI0MfB5`Qk5czj30ic^fQG~Sk4{GxM{~)f zZ^f+x5(QVEF#Zr93X&IHW-4|k?qYa{OUm7YdKVxL zU9LVB>OVP9?Ix?IP)oVSMw#T(e$lkfQC}qVGEB%Wd#!9?ah63M!UzdrRW`RADPc0G5cqIQ*TNk1T<5M*cJ(*IQ&2c}|%Vev7i6&S623 zx@&={5UQ&mPu9Hcc0k0-RPbNOIc2nP>gNU#< zmpM0)9jkC`9_9xS&0orhMCN(WTv<=l_IPKuM%VvSM4P?EWW=f`JL7Wsrz9%}5~E0o z^#>)a;zWIjIx0W4AU_I0B=(x#@nJ^vu4h>v$&EY zk6z2;x(#EXrGhmTz}jdEJn>r5AFdo6s~Jd?Kcj2(qGGm~chA#&i=g&H?e;3u0>2`& z8Wi^=rvAbV_#ez#skL?U-VnGJ^rujv{(KNn)}cB#6NIdj{k?z_E@O-&1UJH$ktl$f zN9)PPQx|5Fmy8PePy6}<*96@TBW$C7AP)Ee@#ysF%iJWLQuub~n#$xdO)kcGh3#bB zFV!KBj*p>O#-}YS1Ueqg_g~pv1IL&^pL(-ig4SkLLE{J}Y$FEMa6-1qfN_UwLEr7w zV1eCJF1swiSAcp*NS=Lek9-o*Et*>cE~bY%%=kiT`Y04CN!1HIO=%;+m`|`8TsS~GT4Jao>5AhHPcP7eA~{-BxXqz< zf@6fnGfY@-F&l#T*rp#hzL~fy(m;@~*?2!?qlHb6GkzYt2xq&#-8W*Aze zDW2BzQxLHfDUff|xllTfZK*hs*hsQU=_w!`!PTJPp6=Vw*qE z)Gc(#;wSJRf4vGO%y~1xK|8h>GEe7(=07OH354<#37QWq^6win3`k=f`$*qz=^yXw z=_;j{nrpa>b52kSI#BiK=`Hhm#wnA-kqPzOnDl(j0rAsIt&)2!Ggg2eaBo~ixySh&%B#5~il26@B&wXz2c<@| zyB*R=$R>&B+Ko4!yMnK29oV=KEl=IX!OkLnm82&9LngxXan~vxDG86F!`2!!*K^Y@ z8(BuEWKrm3M4k} zxi$&Sz4v`O9v0BC;ISUR^vsdUlYMa0Sj8=Ck6ene)dn;35;M7*cgJ+7CHJ{C+eU!9 z*w}VvT_4|mhIsACyztFY-_YJeUJknU?AAEP{Q*4W*mjzdfKrV{T8n_s$>@dOOp;q} zO&F%3Pk80I-DhAGuzNU9|K0GzMjagIR~Q3Jqxd(FszZp<{)mLW5197K4HK_r3Z%y$ z4|bzwcHhMjISA0B)`YF;f~loGDdu(WZc|1?)c2j>*Fm98B68?IcwIveB%yXG4YN02 zn31Sx7SYT8$7C{RKhG;(+0r2w{11oBy^ikwxDD1tM2!1;#Fx4J;Zuc4&ZqoZKuog~ z$2G1V)Yw9*wmVc-#BAV3<3LkZF7tmnlP0Bs&1UyCqxC;m3PLGfNk`{PvkhkvamQ8G z^|zkvmNt9F5LD4JUFpm#T;yQ%|Jr-&uqd1M4H%YXSp-Qb=@#jfW>G{G1Qex9kYI8}y1rTCd7tNfpX2-f|BfGj?7=eJGjq=sbIo~PGqc&> z!qPk4Z>IkrfDznIlSU*a1NKC7@byX1+kQ3JE!^O^YD}he=mopd*Ye3^hz)WOUew;1 z60ge)$L!l6(HIE-1uxS>QcLPCT0H$HyYhDo8u%tKffDgQ)|B`cZs}Joj1a(wH`-)~ z{yZb>Zy4iW6}bc>o+FkwURuQey`}xL)vsF7Y%R45o8xAQEuQP|_YB?F)79x{5D;c& zXNBOrBYReN@%j3+yn-Ow7rofuZ!5X8hHuzyPI%V2ueSeZd}f=T%*nw@IXc&E!Xq!wBPAIU0d4g(I$A0yaZJq+wb9I;3a@Xg zeYTA|A7PjmB3}ICF>ROHueVi%Xk2{1=y~oQ??yXkW)5giLIyB7tOdHJ5u*Kuo~!Yc zx|T0u_8y-EV0DLb7bj8b*_Pe0xNVVyqL}5)tDbnw{ndHkw$;b;S9p9ym>YcoN3i%R z(eT!CVYzCGq{~u%=fvqX)o-@e^KVP7K0G_wQ`<(%$u-VZZ4H}7&3!HIJeSRHS$F`jWl0zwFbCj= zEP9h*hr=R3D{L^E!<-Dxmb4lVd)y9)jxkI^FpCTm zSRWu=VmWT7h}`u`5as%5jRGqei}EH;@>{jAMS>hC-OYA0#L-njC%b1VLR zcoiN9Lvr ze_RB-k#g5N<5m)3-6U)T;u&`W*fZz(Fmny$lKcQh$YK6DZUF46O|BZXF7P^{navKw zT-iLg8flj7(EBNnM!8FY2`HI|M`}{?#|jVgap~(LV( zi}ZMlVA6YR4%}_*iTcldK-Slsj$iu9c46vCY_c0vT+6`a^OW_LN{C$)PWR}YhvVH2 zSgeqj!_k&fD_>g1l<*;aiXE#gLt3ZpU2w>3#hAxjGAH9+Xr};^&qfoTlb;{9KzU$( zA{d6^Rfix+V;E}_H>57r?wwWfw#jM3S~}Jdo=f{FBK2E+Ik-hV7nf3-spQFa8z58C z_omqsv{_bbrXxKV=hLoY1t&iTtiAOp@DzYT*HDc&e3PH(>MY^{d3S*^-8BlMuVEZ`u7vnF`v9yHwnxHf{iOl zv5|~Ozg4S`hE4$ek}k;cx*j=618+rz$dl1?W}GhtjLVEFW4dWEmSY&HMkD^AfM1S= zN?UZns`Dw_)!qhhk-3q8PGc;JI2^s~;DYMeYCAok)qB z80HJTt3;?|+KNqY1`G3QRe{3rpyNt$Va8N}Ua%8FAth&hF1fL$Z-JSFVk~8RFcPn* zLo@qGTKR&73vF+Y*({s0QmhX2U$H;x>a4De=7;5Ok{b`5L;5`)bDQ+O5da_L4tdP} zsl$TsA+@oPF|w+WLRnR2z&z|oF3@Ax^zP z1nhKLuNm!pbpdm-jf=&{*1HS$OVFVEXoVL8myF@(lC?-+pV#dvs<=5yIM3Iwy;}+P zdb&(7FI<=x4bYfr@@UX8nVh5R5#%JRW{sVqyDI1B$1zmFA87@BocgMaPOB#P`iVVV zh=ONZyqKE7Bv6F|FO2(`lRbCJ@k>=WZlRJ9qeVaA{9uIx(`Q8Mq|v5T{pP921m5HbRFR?F z*#X)~Vj(Ve9;5`w2)RGZ`mpK~(GRW#Ni6AYb!{6wsd+;?`TdriLl*7&QMn}c(rPek zp>`61a(+IjXHtkSq|R z46CDkmQgrmCxlodQMI3A6pWu?UnwtwKbcaoPxfcsg?fgCfK2F&F~Q_b#7jQQM=|gp z0!M)s`O)yHbf+E(kM~89QiO*1vZUcm`6#(1u?&L?2S?>@khG8Rxju8H3dUVhvUw;O zmEbTsnZ4N|al~j)LY_IGw4$?&jgL^EGp<=uyhLy;j)1{*fmY3nS^>e9Jt@MNW@m}dh*@dT)LObLcQ4rq7<``M5g|rcjR)5agy1T zXdnV+8W%e@HpSVLOI;({AsleiOA+t+B$pN^!|bt%U(-rvjpIdZYT2;)nC8!e`?5GV zlEb7GFFtl+#pzYnIEGzm6c%{k_Ysk1OzzJD%M~1EmNQQg$mg)U;6l4>R;sRYY{)=D zCAa6YjtkEsgPTy&yIjW#@WVw0H1n#E4rVosOePhu_g^3q*(8G>&}buxCH@Izj-Br|$N zJq}f%WmQ);4w=^IqRg2{!l!9V-Pe&`vsW?o>tae+H9K*zxjVCtp1|)lES(cqB8l8q zXA5{U>?HjPNgAEqGeu3)8L`8OyhL`yUVYnv=-W#ytBNDt8J**iwfc|q(BrUj#jsiK zx%)od9vM0+E9mi4>X3Tzpf+309wRzo%dm(5gsDt1$+z!mZGy3~L_5lCd09)t%HHZVc2%rUB| zIziT^?wL+5^A*6$=t zsoA|Yc?OYfNv0)S@PMfZ3I_VS-rUF?7Sra4q&G`6VG7Us3L^KEKyflL(3h>1wv<-~iV^#BwRP`HsZz4wAc6IckJe;hp3EcH5nMqp{zYn6@E@U)~ zNp^brXDiz2ZZ>jBTd;|6nz7ZCBR|Z`x}H;BeN?6Ay=XM?)LRJe@QQd1lS_!(zOOvNoDBy1t?X? zGeMaYZnN=@Ccjr{3*Q8lUT)tbyk%cNM$cznWsiFd77Xq@tvtiE7e5qpl(i|zyNRopBjb^H6OJ=hLH5uHRGEHi4+-W;J-{if3w;TlN{DEdz z5i8j1qYMnIzOBNW!M1}ZYd>x8Ce#xi>d=y)fCx?2-$YCu=bqi?Lxo?21Y%CtGo;#S z+m>b#bP8wULb`pat-iVCb;(@hLLj27vBho5Vo*Z3ZOT<>H^kAp3SCZjB)gg-cJYW7 zDMU88Iw#&+Odqi;j>^igpmG?y-S^D#?THsA+bg1iIa0Z6KSa;j#B-mfjVM6UA(aEW ze=1zTd{*$IzeP}tz=Kkn*CP%=J3^@e(-HqNDyK|SoHaD@D(^o>&H00e39 zy!a=%9@4IJCYe!A*Ei`j`3$~*!2otdg8nc0mefz%WYJi0@_kwd3 zzT}226jsRwAt?-`A@&N2q)lIT4QYfZs)zbI-@~_8m`@?PM6WQ>_QC)W(nM{>l+&Nx-niK9kYymXv@7n{j!UH<9oD=mV`dtVr)|<%W!%2$cd!0DXQSYr zTx3{R$4hU)x?tC<8%0UtksGo*p*Cd`+QmR8-ev&0@_Y6lP;N?eS8lFIL6ya$NcAt}X-7(1G0qqf!dkcJ zj3g#wtUfZNQ^i+t-?x*S#-2T?foYOfMuGJwcBueARJZWI=_Cc6Jf#PzLxXQWtNO{G zYD)`P)y^@XIsx~=^|MR&zmhsoB0a|l)nA1O-ba93zD=PXy|Ts zABS~{J-)3|`UGA2MAVv(|jJ@U4xPxW((@>Z2C4NB8Ni zZ~66%F6HR*645dA=;~y5Bu>%jodPj~i3U|)3v(<(IvlB+gAzOapVHT>B_k`P)h^i==w*6r|j>H#KRRQFk^d zN`OGzpw71PthLHzJ9fuqtSyT$TcWtMShz==6)$zaz<2fuUgrh=(zryLoJlD#oE7iw z!oYC$szGGQ^E0h&usUyXx>i)vi!9T{T1cQYaS<`n{n;z>nk=Iki1aEdqY5E`v$X8YyY#nr|Z={oQ3 z!*{Eu6_>A-Z*B94n$wXg@yg-wbcEkvjotTR@gcH4N`WhXc@1W?AF+PI{)exttTl%& zTQCpWYItgbt)b(^@_BK3?-rg^-%?qecfD*!D)3p2N%CmiwQqT_{r;f5ZQ$DW`-#}Q z8F%`-9rE_rsl6ks%KFAc4>_vox6+vGJng7vtbTY;+VCJqg2%8ts??e6bnc z&=3!;oE13`T*%M#Ll*kDn1sM?pms&YT^18Ce85-uKIc?jpQ8>~!)Gz6x8S@W7&*G@ z|AMMC;`|986XGePs^pwQH)dUzU*<>rtk_|8@V%uh^}99EhX;o`S+POZqp+jeXS_!W z1jDTy?_m08Oa#vT4KR#?_6rfui0etsg0ixitfqfIMRl3X2P0lp?s~B8*K&X=^ zmhaudOA(8nv^SbkaR*?NV%cI&tm?%Mq+2!xH8J+su=}OD$Ojaq-sf$)>%IcbTY;Rq zls=fmv937*z~}>_=K{iJrw8+DHYM-Dk(qhv{WI-n;X1N_?pOo_fhtdRGnsM@z1z58 z(YvKLi(p`BlW~85wMGu0X2kL2LR0s_ky^7f{NQAo-cMs!zB+59h#_@HF(d`KnsiK! zs5M|gRKOmb8&geng}z`5gX(sV)T2|Pb-~m{fdAeEsIJ;i#CdC~Wo4v%dmif90G4PK zQ=#0sGJE5~yrn3}Pc#{vE~9j~)ycoTl7_7QDux6kh1FbFa>$4R2F1nzI{h$O+l_QN znNz?+utW48z2DK)1@yx9u8+m5r$*-8De;|+-C|=ouQl@Kd~MM{#)-0k1gHR6vXlv@ zyR(2-$lwDq7cp%OUwPNbSCGnLpdhhGn)z0<< zF-tuE4zw;kQOBuUbm07z@#u(JnFyrxO!T$>x1D^cb`1w}%~dh>=IL>@X}Za8d8*&G z*cP@>8A*S^-_ae%%O3+^wDe?Eb;sp`nYXRG@n60yu46W#NEuXUb_&`=oE%|jurR)N zmQ}`#Aqw;|;A9fkBU%^G|Gga3NC^)952qb_BW+gMgMzDmyT*635+NtUt?;S=AMqh4 zX%0BLEW(s6WLj<>64~xR^j&n-GWNDud#6Blys2!PX#-lq-|6X1f5US>OplgkcT*EF z9;y)11HCwuQnKhe;L-4-U)ibD1dwz+^d^!YppTRoy?@*xx<~SZIl6S_x$+zhACv>L zQRG-E6LTJ#MAF>}l>}}%)*x(NaO)kFkyi|yNf5;zd^H35w772VT}&Z{V$x@jwfLrt zc(X4}4^i+6Lc`TbYeLpbKzVJp8X`o9toOkjQ4>|d7zXj3hYG;8qd_|Ld*^oc#2hY- z+#EnoaPwC5UJXH~vcq;T^g_y`h66=P=H9EQTpg@n+>yCg3A&ek6TeaHpw!5gS>Y(A zCryNAAf7Q{3y>P7B(Kf{*v$hk@M3ewuclElj?p0_>d-^X?gU$ZnuLhE+!_#txTjf6 z9wmTP3(2~GzWpIV0kxK5Q{3*)xy#)Th{m(@$DNN{4<;Sj=o9z9sD+%IVIXN2KN%bi z+nT4*&1j%UJb0^^Z9;TxQ%+uBrq2{sVi)ho+W8*Ds9He~3wcku&?eTp+CVo6AGhzy z5V5-Z4zPLTP0nPiA=C8pR6XQ$wD|dsr_7{jvq|VJx{?GVp93$V?@}DNkGXoIRtplx z9vK3+h$=lNPHw4f(~vuMo5T{s-Gu=*ONnF}D6q<-`c1`*A_U?|Gb+{?uiO@}P~~2t zE|s4(JF&?o=0lgX`?2xpqNOHgaa2x;}CkEc)fTWB%dM}Y=klJwpKU01Il6in;64j#R4Rmg}kGyv`>kR8O`md*yF z(vRWm@v;6P1LNs>#zJa2wOf|N^~t<2MLKwXQH(#svNpyk?x{dtPG*~ z7zal%I5d-bxMG(t4-?}*zr(nax$>whS8@Y|v%Ml^$NkX$Vzmz0F|&GeAyWdYAZ@T% zfSKUFxJt2I0fZURJC~mw*&**TVcNPRF`pJ2*aMxCaCM6OuB|%d{`hb)Z~n{i4ZZB! zErOY0coj`}4DL)tU?yPgJh=L20;L9domqYP2k9M9>Nv6uWA$5D0g?RGOr+w>q?f)` zT@K(Ie|Z(lpGhHGFSzxtlH_JgQqeV&Dz))7vh_{brihyR;gek4S^>%Ln^&j<6pQX2 z-!GfuNy2PO@qL;sPFPdx9fGCK1~E*B`hQB*5d!S-eIG@2uf{%f&3%7#&57R=->zJ) z3CZj9n^DJ7=OGU+Vl!=-3tY1&)Pj%>S_}$jQfY8&nA6=!fM;#W)U!B^MRJt#QoC7>m=|;=JD6Dg3;MBBssimoL=U4 zjfbJ)l%z}+uI$)H;;jR%Q&$zs(t8u8hI9)r(r;VErcr&$cITrO)2r6{JwmN~8>{(_ zD;~*#5K~GfOGmI>a?UHsA4PHRE>s7OMGp>$l2B?UOyn-97sA6z8bQSm^yO@Qd~RwG zqXqRbiS9buH004(iF2~i>iY4*3B7Voa;N+5j2@wh!1mKsW^d@Xp=@Z5=E?4a84A%h;x9#bvfBfrxTXG;U}+Z zW-NIbQ7P4<=yQ7SPt28qPYt!^ zm_8zBL1D#n=e6j0*1Wt(|IHnCzS?gyN(UccJ~RRJIhr_k%nAEwI0Z;NwhCiSutIty z)>~A9;NJvj*#l%|ns~3X1@OitH>(9`jQ3Lx>@IczSnEaY8AazO6&A9lC~BtCbg0-R z{&L4*S;;d}rSH2nnjtjO<2~0Wj=%=ZPkXxFc_S8rQh7DqGibt$8t-sN%FM6}4BcBZ z-Wea8SD1=}ol+^Q$pt;%&_S&&ZV3cRnwnoI4^i4Ax0HW5Gz7@s8`E1hnHOolf7Cy54fbo{Hx>q}p#Lp*Itq?v_}*pM&gYf;kGqdlSY3 zLwoUN?a-D-9(sE9j-Vhp2ZMfB7c_up{G6hNcn0l9qzO17X+GZGC4N3Bn#K4UDqx*V zEbhDnZfl;3B z^c`6f?be)sM@uu49||`6FjP*S#9UmkASCEX|K@y&Iq8N3$i8wi4xGnn2~-?0H}4Tq zj!PaDB=CwliDzO8)Y^^sJU1akxmul+SwcZA zhTTI!=O)ogvXSSlFqI~6AH02To-1IG?noR@VQL&mR=mogEO46Jmwh1TCjtmQ!tWbr zfVgf`t}P{Gl2H{Kww3Jx=ONxQ!@7ma+K=iH40M6TL#>j$!9;^~e)*+v7gGinnJ;fB zcY$*S&8N0&35!bP!_1Z+JX_{@)RntznE+;0OQu}vhebBlv<20MXY}GnHGaFA6%gd! ziZp@d)Vx)u@t7bczL%>4m2($6XU67x8pEjdB-!PvU(f{{sH}zkZKhysk?QND`rj`L znVE=@Vv{7y%XfF#eV00ZDw6T&BNoe67tPtS9E^}Oi3R;qa5l_OXH$w$d_NouKg6FP zkcdI0`_N;JxCzT{8LsLWZY3saK5Y6?Kk`*JU;)u~fR}P{Pe(!Uu zr4;l4ztpjQCfPP^&r+GL)5@lTc~qHhPh62qC5nmLqgPgf$f!4Rl7A?{X&(xJ zl8<>)KXbKqNRmX{5Yl-J*UK)PaG;PZ(rP)O3M2u?skq71$Nf#0deko^1da$4!E(HM zBux@-dL?3EHw7A<9e(kkBv}smrp7}q$Hf>pqqxlM-hz6kbMPrpNZ=D^l+w)2%V^_J zbbER7O&*O|HEDYrO<9P$ty(#nHl9~9G=eUy^NO&UCV`9Mw*dJIT&E8Yz?R&)_0LTT zw3OAaKiin&RXEWp)7olkK{bsYFTSb($Ya!sjh4Q{b)v{qaNW|rYK)GY{5#jCH|t*Q zMi=r!5TB9ZrswCQwz?Doen11Jc0bn?9e~vbeQg%0!ii&jC?J~rNx;Il3`!jGiG^Gv^66|PJ?A~Qj>@$ zQqTBW2gM`%=tntSuuTQwx~TAMhh%wljdf3We6p~`oP_|gb~fSsvhmCFsmMw9#>v8B z_==FHzwfwpo2?iGd0e~XXkFcykhtfD`|M`cNZB(}n(7kA`YGwQqP{LH6Ga0F(a!Ap zw8p=(>C!>qmaoB;c$9(CHfQ$YFHfm&LJ9%U(r!~|CkjhAuI7C7J63@vB$BZ7P{PHL zqVkQ{r)!y;IfT%W(r~;dd*!dqw6ZP<#2~}<>fxnA<bM+r9N&!;1fSg1;pJ_Pzj4nCOMR%AfG(KWpm+3(T@w-!sABU&_=`OzJ`E ze7XNy<&SbuqfhaBd_F1PxrD}!hj$VF6X$x1Esa*6BTLhxGr4=UQDQ^GEp8MGPZ4>m z1ysvI#F*>>|22SUxICJ>a>|avifdH;^PuE;$Oz2S=8@e;W@B2~$j7eSoQhckyP|@x zoQi(VBryMRJVjmskF6OI&)tl|43M9R)nih32Hsv%Wnk9fUaAxdx`e{Ohez_+b| z2}msYj7joqBQl-21OTc)2cP0RQvvU2=r`6dHPoSMhiwy|jVz6i%sgKJUPjwyVwHi| z->|A=^HRz3Pq8btGevv)|DK-zrX&JTNV=T630z=Y0n_h)s)MmQ5Zig{?so>iruDx) zmxYiAYJ&YS@qbIei-D0FOmV6Ep9&HF0YHNw&-ni*D;41{PXUO`e9>jsUzu~5FygQF zaDlqw5*l6p#~*(d2VOQNu~fGiTKyNS>>RMDbJPugMRfn^4(vVvb+U#E$9`gQ|E%=_ zK&>bQyf9egU+w?;jqnZVynK;PwemlQ2{US!fVNyV-oN|5CDivo=L2=i?Jx`Ye>QbV z9gw&8P#drQw?rTxq5*UHIL`N5D%1@A1dJKadm0{DKR)ih8E^YTu@il>arlsNaZ>E) z&GX~#dw-gyCicHs4wO%rf!mS(Pm@5O%)P|9PTD5(Ua?cAq(x5fy+Ud#zy9)oN%GcS zLt1~bTi%bRu1Ed8t5>9o-qw80GyL-E;I}9cJ76T=TyZ`ByEgS06#to!(WuMU_QgrJ zHR10zAZVu!G9}rzu?assrzDQ;@>-yeEa10v%LsEJya65h#@vpDC(Uy z=d##e@;>1JNy_c!~B{|I33Xpz1sQL;0FUpLKVdb&n7dZY~;^4Ve(5Xs{=la!4>Pi$q zn$pa>k_4C5_YT91d}I618YNztovq8A8Ek5od=aQR#vIN2B>5Mm2jrZ86?B;5&D+A(gpDX-0-Kr&D%c%=;{)FcJlAO zA@2AwwSpDhbFqslUMK?4 zx|?o(*QJ(*@6WU)dLilVMFk|{2z8pm;_7~yFmTQji1)xA3_#9mQ+L0HI~$B zNZ_DHkA^!^_72N*%l|f>yF&08!#|>ypt<2W1l*sDl-5cC2&YwhIt*7#|pn6R^%cfb0lz3 z`RTX^^yw0Z;A=bF6g>uuv%%84JkNhUfx`m48{%?*_b<_9MM6M2lJy{O`oZ?Q_=U{b z*EXev8M+C#es|yG9$RNA-Y)c>A8 z>MY@{>JaiTw|#gU)YkYpY4-jvBlIs$)-}Y!f|cD=kiW;X5ms~-(^KzxEcpN7G4`vw z8*VXn9dn$Ze{AABFer?5N&WLu{yyYMA~r)j^TK<2MLLGRd-w?=ESna0I=w#7PeyQC z^~R&bezAgABCp%Toa1V6!)Xvuzf+sW5v%x?RoR`Sk(EEbg$|f;1kT%nKUQUp%je~O zOY*4U_2T9gPkP9qMXd*nq}opcCx7&@h}-Yh@-c%}*)aD<^Z)o~FouIyQ5KNTFE8>u z`Ck#KV?<=_-Tg1|TK-c|qCbP7 zN{qYT5&hHWzv)C4B`C7KbDr`qOzl5~|L?EHq|W=M>FVD!@{g5$2GPQsp)ceA;zf0V zqk3~)R2%+3da0hJ3-s#qVM^VVWs?3KG{EP$tH1q4_?r{SP)HQPY7f)}^42mc} z8#Dh=m;Vf;zcq-1?l0S{{TZSE_!tB)P=o&y+TX_N|Ah8mTJnFE_FoqD|7%M-Bfxo* W8<1I>%8CVkZeCYaD86bO@c#fKqX_K) literal 0 HcmV?d00001 diff --git a/docs/CVAT_screenshots/02.png b/docs/CVAT_screenshots/02.png new file mode 100644 index 0000000000000000000000000000000000000000..59e7e8bf690d7bcbaa9dd17bf7601b1e71fb0eea GIT binary patch literal 44496 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 z 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%0DL*b1Nmwri`!A+Z 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 UVdyOV7Wk)fT0<%8l(EnM0fC>Z5dZ)H literal 0 HcmV?d00001 diff --git a/docs/CVAT_screenshots/07.png b/docs/CVAT_screenshots/07.png new file mode 100644 index 0000000000000000000000000000000000000000..db229d8fcd1222eff5eb2fb219e61d53c321ac33 GIT binary patch literal 84277 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⁢=~Q5fY) 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 *Gq2+ zWo$*s;wiHg7SrY$UL6UQY%6KLHbt-eEZdB`sNF`tp86r-_>r_vuzFa4Bv40p|C9-; zmiAFk>kv$@p~RJE@h1i)Z-mAUfWOpA?G%on*D0!-*e!e^YNV3abbXAD>F4REYgn+_(5hMp#)q#ZPz5=Drnts}caPlyfLPyA0jd-(@d%Bf@K2 z@BCXE`B(V;BXDEn+ zwVdkQao=F+x?q4cPF`2J&h{xFTfgp%>*}Y=$Q=5ne%3>IuTGZRNN=Wk3gTqKC#+07QmNA|=n*Y&6OX9UeL+w#q zvG(rIfpNdFPw>+KJJ9_o&OgX@`ezl4yiT!2Hh{tF1w{W`R{r`890bVv^8eafYep_a z%^i%=P6CDp;yfs|@_PkxrVy4pK59>N8Wl0hx zo2y>&=oY4=3VzvyLurY{sp-hmdv$s@61(_-$M66MPT|9Kzfv=zyzks{aI{RvI4t&3 zU(_dqc6-JmH@k64Xe@`*=13y@Mjb8Q(xFNqDlYAi`z#+%wg0+MpQt3^G zW?<3fpul}LtHpLfKjx2dab|d{Z(cR1=PHdcTAyCLO|N*|1q4@Cq?dNN(3-ZgY`)G^#+0|);M?-mt$};Gr)`5TezC+{4VbR12 z`})NXc-lW#| ze+?!5bqe8cM(AFj8{-{RUgWq1A@PPREcHY-^L<6@JBwAl3T`&Czn}aR6VO_86)uL$ zAGGG))$4EeO{c5)()G`wg1jKvx<4cSwvEVqp^sh3CwU>OPDaGKBJ&;;>_rES9rT^N zUpin9V_0qoXGm^w11d}AfaX#>a4^s;m=A!@FA2yh%yi=Yc_gJFOVC2`+nl*R10=Zi zb~r;BgK_$u#ep##@Sw62&{-gBi=+(WgBhP*vg=y-jK0YTr3f92IYbk@0eiz&#Qs3b zcjEy_`90U6NgTAveR)&NZM_8gJ@=wkPguq5fE_7@PEI^(Bl+hpJ6%`CAW&pBKr7tq zBfT`kI0sMKY{Dwk-EN<{_hCnV17+w4G<*G;`pY;{GY|!E4(1Ji6^VQKuL*+QbWm(f zK6uW3u-&5YR2lk)_b=WU1H%vTViLk|0#smn-L}ZjX}<4MwBF5=NJf|~oQYD9*z=!z z58eT4>5hbpj@Q02mWzTkT0UtI4&)Y4sHMR??>GV#BG}bP^`Lwv!X;-WuTcX~Phhxs01<4U@r`g=92UcD zybuT$m3%x4gjBmea6v^%Ja6kRIn74CN)Y(hqD%=kUP}iyMP&W*mcNXHWlyfIk>h>c zeeFw?mzNs^-(MpJCxyu%SS4P1?D!d7#tQ)*GrbJAlG1J>5-y`p$g9X20>VRa1nuxF6hsH|KnNCI?$&5zJwIEKvKWr zt=z29)-}Q3fmU)px1drn>XY~Hz?oz%;wT*(A__e?fwuxVh{@X)m@aeF zy9uZ)Z9Kw6*NzeKmZMGQ`3#Be8Q%aB;#&)Im)n6Xq7s>k)TlwAhy}Ud%2ZgxtR#^d zJtaOh71{A{@Z6mWgh_D4?1ytLM6a`JyIRn`HZ8g)ww){2$bU2JYI33gOtmx`4MQlrwrg{6XT4ze^H?0N z@TvBF(}{3JpHWBJt}SZ4z7oOK4>Ymuw~ukwDxLZN;yP3A;HvnOF;u23jdLDsOIqyJ zoLB##feP~Sly41p^}ph0weBl4IobM{nwLRh!@1(rh}*A9@Y$FBkduO++lelok>51o z)GeZy3h~a8Iv=F^91l^% zM;@b;+o*#?2(p;GPOYPCW0}W)JZ*qkw|^m5ot=an-_&HPWN4Cqzk%VNI{2gM^FY)q z=a8D#zn)6Px_o0x$Z}SY&rW+)a6nTB=?2^^16dn|E&X&tQ2ioOq`IeDMZrknioA)cegCE2oP?|S^Lqk~~JN?^-$_Z;;otH5LF z{+OmItJt2?l6R)Ji?`?BU+U$?W?ov=Joq)s=uUzv(Fc(SusIwLA@25I98Q`BEXMVy z?$sQlV5i3{sp32B{CVYi$Gn!AuN{2ktV@T!?NGfEQ0Q^Hrt-%zaM)5@=X!Eu;0m@?ZhfPjXtimd`)uU7 zHI?>mf@mwp{fx0DyBy^@&TzBj#7E{hF}G3#VQ!+#HA*M~RIv6LfFav!X4;o>!?Bus ziZsq`hq%tqV|%{LwCL|5W6dxTwx81EKDfI)PdBQRycao9KLFm5rSY?6hfn;=i_YP8 zFb1~*HmG2SK0tOt?T|gY|7JWsb{dp6sPPBE5@rn{{7DXow5NWy*SrQ+%VTv3NDX88 z3d}`hxIN$E?UP;^7~WKk6R7VK)kKY}WvV9T!Rl;6jgo+PiX08>G(ho09`8r%lqr1~ z>yjriuvStuRMs6+>Sh&M)2hL1QQehNIVI*=q7uvZA&|(|XE00O@0%I|ulT73Grz})t&$Y!e6&RT{yd>0b9?>2Al!|;@olS;rT<#r2 zg85Sw$9!lda3F9jU<@O7T_5rC8Z-?)D@?Kur^5Hb(SJKup~B3Oeqc#;ll^q)G+I#@w_3(jr}+>P}=7W(JwqX{`@U%v>z}JW=J9bvgF#B)YVv5e;nDNRAqUi zN^6t2*&b~gdLe3Nh0kbNbc?{r@;J6{X@uiM9f8y}glQzHQa3s{3qUIr>|*RoB6a7( z$wLmTC#CTKctXjjFPo8R91}2=Ks!-OaJ77oQ}@L}td!KzE&J`nj5xKcSReUsw55qDSLJp*tAxK@JdxTq$Fj+&TQ8OntJtuJjGtXm5i_Z zeHRu6{1__xq1gPXG!ot*ga|bPz*60Jd6HkE%jX^wDfXMBh;2E_#pE~I=m3*IW!dQmy(nLu+mTwOBP?WN{?6oqHx%g?SZLn9<(r&7UvZz8FPT$*=f~Q_#Hj1u zcJs8S;LVz3M$)@Kn2&Fz-v&;+F4>^hkMA^=ohtQMlNrx*+Ny4>vFm4SCsv?rm9?H> zn0SIxXRu-z@x&wM_ZAkE8e=Iq<#{!~!YXrZ)~)>Pznj@W$)`A7_s306Ki#TNYD_jk zvM83OUcY(bF21}fy%8v0#}outlB8{jf`BYWx}JebEo;sRJtllp24lj{ghyXTv5wiV zYdb|aZhhWm-Yg{8N3^zK@z!19kP{A1ipIIU(RHux3X!Ehqq8?G@e5ojAT|>Hfn6!M zFl&08Bs2V}vz(O6noBfC6lS38?WNX>Rg(@_e`DLozD=SJT31^dM~+`?#7Nb32}U(0 zlJ>+$)u~s+k$%HIu$qALOX{dFar^#@)<3Qf=#WhgZy%oyGE{ia84-^&GKvkQE~0qK z@a%4{=0SuO6kpv8hc=W=@RV0f{c*7mhL&!O#bsrL#F5&H*AsOl`&$LFh!QO0dkR#N zbwuA`Vssud;FG3))OhqE|2SFu;rXxLI86Q}@6Iup87!I54Ncf48#nn7yt>hcsbo`q zY^-A#X6(@;?(G+`XH%7||NT(GGZ2z8+ahA*mX~2vG`QikL2us|xzI37e)Y&9_xUpm z;7+I``J;0g-mGWoKgJPw0|0PN%Qsd$P^C_~KWM7#VggiA+D6AABqQl->l3`sXAG2Q>zxJa>-i&>yhn zs(n3U^a3S8ogc_EP9IVE^!!>wg#_CiCrO@C;q%;?Xb4r(xO-(nWep_7OE*K# z+~61~r=B3wj`K~|WIZUlC6D0BB*&R!_HNLTeRaMX`Ht9Pg;i{O<~h?01A`()q8##N zL&zSwi>H!kd0kE)=s+mh@B$sxba<+$;RZkh&}c2ZKI@HHryJOPkVD#X6~0pGL3$2 zprt+Zkxx^pv<$2Al9neBv$d2a+cVk5ds}qV+%1KPY%1aGZM=uh8{!Woy})YB6d#cN z0vqa9dLhDG@0T*0A~0ACYu3Sgb8%5-o}3Ss7csMDow^mME_mJN96?gzA0@ZR_aFc; zRjj8JhbfOln$Th<;77K)=Y26Zk(3p?!VgDGIG}PYf_Q<`fvoNi`XKxNA=T-mXGoq* zmdL#sbwtS_J$hwW24bft3+c|1gn&}rpM;iDJfZmEk%i>DEoa7LD4BOa=uB6B2N76^ zEL9&~@TE{ijTj&_Bm%4W@xOZ343Q-fAF5f))p-qv{3j}1V)E%6*mAEHN18BW! z_ZG`CPrTod>@Xr51Fy0RiAjg!N!pND`l$qWThX8ORn$H)L@bzrx-AD{$ME+)=zzlU zZ)>}vT}i@H%KYKi4a%;B1&E`QXS)0(GCZ+wImJos!!4&V9LGOnm#{)v6jf{mnI02N zOO0HWvIW)=DniYh@_xr!4il_g|Eg~6VrBrUk*@I#^=ONctF;rncM2NmuLcINUT8sd zI%8uWx-gDxStl3jLsyW<3eg+&T~6FcTfU}(;}BrKFTT4}%XeJ+5Hj2OVV2{VAC*6h z!ji`DE$=_lVQGy?g8Q-*M8^0R%<5<=7w*a!Ob?11b4J?JcL+~}F#cdX{fVF}s|kTd zY68+hfg^y?SvEQP1pk6LUOL1D_1=E>J%h2XQ{3^B-bK7aGj$Yd#1mUUR{E6H1zecD zBbJ%unlm;Q(Tq+)N8UX-aU+PUkV+v5GDVt@llG4XFin?d##&Q1 zzdWvIsPaNF#tFN4W_SpB^4(`*)2J9wXzeyGnn-aky_FNn-+MoPB2D2a_jjY)+OUia zaU11jb-VX9+L5uwN4>`gH=A?h96myf(i4{uh`-Q|%ta_+J3>NpoL(DK*xW77OG8iG z7t7r6c{xya^$bGnc>62j9BP{0T`>x}A51ij1R>O%cQ}leMkF(cWCd+lMh{DCky+Tq z2GX#h_97seh4Vr%@YDxv+%+N(l7xmB!|PBaf@iZ2B>kIWMWN>-m6)h z)tqd07Q=gXkL5A*G`(`C9G$55<~I`l8BpI4d2^DlT@ItO=6YH3REO+Gvr&L-d34|y zrB_Ei(F#&qO1q1S^(Z7A{<(uT7Ja~(z;2kaaxUHWcP!yPE~~^s?l7SZ4pLI8*W!tm zIWo0TY6x9-!}N?61@hMiWov`^#7K9m5E_pDob>dap}WW81foimd77IA5-4Iq&%6&* zQ$9Zj3>{1ge;R*$6x*;mrBb27TdP@^LrtHGp(s+6AJS#Jz++y&a_`_4|Eqo_iIRMd z-L=koaGnSGU>wm8c)yFMbTD9RQL72ZU4=7k%MFS=4BZx9OO4)nG7X73uRz!(QrDh( z)|V+mt)8T)zHPdR;(lXhw<`3WuY!lGK$^ug+yRKJ4Ti}C6zuXXN*o$Kcy>1jbVWCr z$4^L6MDX_s^mIhat1F8>MsbFc_Xb8Wg8;t6Rx9#g&fXuNPMrYnncQve6{??=MWn7_ z(jAdmL@JL+->d$}zH|UYACXJB#2jvnN;@juEVeOZR(GDos2#Q=O91NSI3A8lD>G=< zF_WUbBPQgD86Wb$GT(&^$l7yfO%Ht<&bsa<}aw}q(O0aKUN%cGw8hs{p#>vmF(Q+lVx?Kddi`~{VIFQ2YHZjoG? z5R7BtKIUUE6{#caE!|HwoTeBp;LW4No%Lp{*K(xit(D8ZW<9zDxsVgqVjH z$>>FeyG^Y7=knk4Xf+PDzsU@TV5}}uAb2|2_lnb~b3@2eB;v_m(2!+7|I!VD0dm}B zL7u8Fwrji3M3Wi!@Dgv%o@{WcnE*K!=>$`sU~UAfkEEN&A2d9T#G!IY4;zR4+;rts z3&+>b%Oy~O(+u4A%u7E%japynzPa}BVWrZiXR-{tb7}%ya;7w|fZ&NDtedDgKA>>G zkEu00!`@rBt@Ao5WUH&+YveBrI{ga6&lB;PuQp!xRj*k4=-m?lm15je!3>g_u6O!f zl>$OEtjF-435$ro%jc)9hhRML%DHLvW6iM-7W z$#e+8ZZY)@m1-We zTz996mAR~(X1mYmM5QgGMiYp~4HOR72gx-HMbwaOy;uv0PKx=(y+^Vis>GAr98)^I zzkh=Hv$}sVic(oex`d<7EK8KovdX59Y4>=oxZAB3Yh^tBbA~qt3oeZ$ZNJb&Ow*t@;n{WN`uLu0si}UgiFwQ@&OolR#7Lr#5@SaBB5p8QVA9NF&WxSybE{F-6 z*#22A52izXEYD8V8qI?OV}-+&zv%wDk$qCdik-&J@^prfwQB?o8LrA5%WadK-gm89 z`f~SF|9`z_c012LP0ZN zFn;VVW!mku%zg%D?FvVlH@{=ypy_IpYK6!Ar-? zzR43fa>nagoc%7K@_apRRx5{IB20BWJOXIjKeo$1Hcf6qMn3bE-E5x6()C1CK{oG8e}*q--djwR|K~dU7ZJgT>jKBt9IWuWCFieC@c;FpOUivG6q zn2Qn}nruli3&8mIw{U`{0vMXQ5sKN2#(}x?Pk|EqH*~=M1guc&CYym9bx$#@Y)mj1 ztI`~i6*!7VZb9ZwQ8JZ)cGMqw4%j#uaKVW|+(CvVsF-vBqX)anX}M>U7rO=0r=IIY zUD_JZtb||FL%1~0=e6%14@mRuUh3@29 zo2v0+)|UKp%1q@rQv|=-tkvc^6?x-%LDl}dP@40cA-g~wzoxxi_Q4Z$y);$F_B}(X z`D>v045qPv&q?x^b68XB)ZcZ7l_p;2iB77{lby7Rd%=@Wsk{s}tw9I!d|R%o9${Q0 z6aLi8H%0_q@`U6~#Hia)TR}VC08U?%TlsG@>_CEj5Kjn(Ut6${8`UB8;q29z(3O>T z5$NFOUuni|et-s}r27_?5hm4Rb1b0e2jy)wQLJoEA{b5E+Ql{u+;*{z8rJ7MmVkJq%^M5rjA@1; zUnVmC#6@5k_`1EZXpcy$J>c8of;d(Fe(+nua9m}wi6ld%cb_b2IKvpGLR91l@6--u zfpX72;ry_z3zU#Z`ILlSv`<^l;)L7w_sj)oMGFBNsD<2AYotHZrvd={O$D6Xb>IN| zkU|4cLLWP@_NCgEkFI|2T7a$^b)~-@aY zS1%I+A&_1HrtZ@38S&chFXNrX6M6%>t$xT;GiOh@^N_t~#&f1KRcaKzaZ37qzitwA zbp8sf-5P3s9?9Y!^T=F-D-k&xJKE2wo;UoxR;ADrrihsDaBGFva+b|KrS!rHr;R?? zkZ1(|A&RGP25mZRS_4clHv|0p_4>jf;)1vt1GE8V^e3EPjjv$myod?i{jTO!ECI2H z>s~)Mygmp{{@knj8N*q7Xk0yp$8a95on^}{wwIFkia~SSk7$j{LqH62e-O}=ocXny z-ML`i%08e)Xc1ooaRH0(nG4Hr={qi$!AVXQ9Yj|z-O&Sc=fl{k8m*k_G#_9S1|WCz z_&~-!kRz3SNOq;~=Z{2HAanQ0Bw6?YsJ@gibA$kdTiRI#2<-y}5pao5@}8p^UH9{S z#3KM5M}}qpNy`NC{5Y}Ra*$hFTBxM+n>FA`O(Tu%>nEbsJ2Q}9c-}WHO2?=l5eq^7HYvzMxgp8^jE>Ie5P`5H$8P8!OHK2Ub6rSO83kfO0T67QWVK@^AitTaGE|81AvIIYb(w?)5xW=x7Yd;pDIlFsA!CowwoPFp1a*?LAf4dR z(VF^ODk!N(KI(WUJ4k|cQRw+-yTzJ*S3Oj?-8kNm1m>%aq+?BeL7(EoOM>Q#El?6% z49^l>XR}M8E!MB{+rkfR{_ur94#q%=!d~qy$9M5}HA=K|Amh z+yb`0M?w$!q!o?dq_~Q)l2_DrI8A=gyhCt4l{KV^IK~NQUka z?Kr;OF*kx%N~#|ad3<#E0$zsvZuQ|TY8FaTBU$c4i_#Qp?h_yLE$N+=yQrJGqV&h6l`rRp-KVzu6B9WoR%niZLW*QU-0C<|RXt{| ze){9e)d0zk!`mgQQDYATv<&wXF@nm$&qObJY;A(thEJJmIorhg6wf88(~O-04tJN5 z910*~-Spe0KVRLwbmfL_zVQ{bJ^Mv}<*5j3yyOPm^pBy{^(g(id=u9b2ziEao59WsDI?={(YAHtDg0 zS@IwS+qKB^sZ*|FdquVGT3hIerX@CJwx@rBqz7ovDxuYY&i4@+L*Qp6+7f(DoRm8+IetsCk|Gl|-%3~}-c0qa;_>)!lCL#H0C56>TE z-@r_ugW*gDa$-cDg!9!O+W={gIr>7NND0{20?ybBd*+J`Uqm!}Wy5Dn`-9V3@? z2oEvz#s`Nx_~%Mzb8`Jp^rK5}d^~?3d;PO2RZK=I;;MjmxKI(wE8v7D<+!d*){GUI zqD7ZfO|~4ODelWqUpY#G!ndWC3MS-MPB9aeM+*mTIDX`B#8705O`$Dyam6+GOzV!# zlGDzBNsA~+IJ>3juxwfx|B;7+EJg|L%gx!;7XwciL=bV-eU;ixwF^0;tSn;o?D&M` zY#gt5dy@OKjEls&m^Ef^^Ya`Sw@!dDo`lA{*T7Mw%n0v%^y5YYO{@^4s=VSmVcYbW zDb;ovZj2;#j4abJezyDwtv)_`_Jlf5bEWVTgaJmRi|pku0#|&nB9cqDe;QUlf5fk8 zp=e~KF7fwH57Ld}-fWT=>~PZ)odKOHfB(1+jZ%}=#;@`Ql%Yae<*EN>Xjs6B!t8QUSUcp8?> z(L+5lQsoXyvNm08uPl#m;Tfz~H(;5Lb;nNiU4NsRe2t1%Bg!lz<&$w~tW4d~2eU_& zf+wrY@Fv3=DOxo1FInHY5*E%nz2$L3G2vGka_o@otzkhAGg~?qo5l-jmWvPX-(~2S zpst-0K>G2YKLrv`mOCavP zezLHLgj%`1fz3>El30K_h{GHm$noTfWMDz^GY`vKx8A$C-n4XP-<{it|Nf(8ZB_Yx zPZdP!jO6!6Gwhdb3b%G#Zr@UDWoLi)5KiooM>u2*9HF(tTa?{@<;@KikACNwB`-OCJ4~-06>R@z!R8)-kFhY4-nU z9Zx{aKsJuThyUHycD8_0vShhm}k^~Az7?j9}YFf@r zjvU#oejC8HE*KFqY3%uZi1x}pgGxu>V~p4KTSpD?c2eGB(iay!W{0MY%^Q>A>Qd=S z_44VRuC&soPNxO)EZ1}txAM%%B_nC?mpuR}AAJ}b>p_5Dy(!|Y5x?lUJx#_F;6RYG5>9({)} zkDnYm)gkhx!?pcotii3K{kJnr)B6JLZ+$MDNv~YLGR=0nrY-dm-|M>F_KN687i?{N z+mqe9&W5?iGp`xuE6XNl8moO~Uyyk)D{tG=`n92kOk2|Z4%?Cb=(1y8cO5v@|L&w^ zQ|eK`Z7uh)zuc~qqLyal9H-Q`VuE&Kht({J_bar>(}fvG6jKGNR;E{8rN9jw%3mQ; zs&$;qw1vNsZsKPA%h8B2=FnU-I$uuNZ0Ou8!rpRnkyF#**219Nf&@Ncxs57K9_?2j zuNm(hRf=~zb}Lqk>i+F!+4*Xd*LR(mZy5ZHbW|(9O7nqknm%?irrPfz{LO zHO+~SVg=4%X^Rw?%U)=PmgirQO$eaa8;_7hxm+Z7Z4lMroQ^uv-j-;vA+D5R+?J@j zY5Usr3Z3cCh45onIS5CX-zIs9etk$Pm2p$Fmg%`0p;rdq4|%(5m?CEo*2JBOiTy?6v;#^YJ35=rh_e?Y+qDck z4{gX4$}+*hpUPv{>!*jriI2VvvdDnZnl|w7hGkOSO}z5pmNe@dpj>o{9_#(L!G7Wd>iWX>0Cnu%%I-A1oiSM&AMZbY(oK&Au`RpFW&b z_k>~L+X~R6JIgZ@*QuR$p=)*DgPG(!_I|~1+wH7~n>7$`fG%*y_2Z?vJaLsxIpG8( zdyNI``f zsOdL&j*hx~dWndR?6OD}K^R|q7g$Bcl3c!>Y+O8CsVmZNe;3Azh}$oxaL@V~>*&OE z9F_-3=!QXa_`3Q}XQ$n;5EZW1{3qL6r^s)pFmM~9{bB|DW*l2LpJL3uqu%orJ?`fw zS1vWmHb3Kd^(oud|HIaM$5Z|O@&65RM9w*pkxfXB71<*zGb$x394C9v$Vwd{E6GSk zWR-brGLLb{-q{=@dy{eKd!62&@AvlmgyfNi?0MK{6D<;MYLBU-%6TUolW>IXlyZ%?G~BV%FDXP* zi+TJuJepQ}Ct`A^eg9f?*s(~&+P9Hp#?%lIG5+vFM*gQ)D`3(30T5wG*jJC>cvrqh z@tiUH3HP0EW!^gLx-P$HA8mzZQD!Z-yrj&8AA8*!ch3lJ&2!;J-JZHqB8r*R@ww|h z*DGG>BYQCXNFRhcOf^JimSwSbLd~Tx-rbk<&>6-`TCMsR#eEoi9 z{|$bi;yXs^gGP|tWZKV)fE3P0IV&Hfef4dI`733pnteTW?NVWD5zDN)CGo4QQIU*- zWq7X9(Bf1%?C=IAL4ibpUbteUt@$-KCcTk;#`q}e!=)?30%@y;l{eTX<1^&F<{nM( zQ1@BvE|iR1!QvrysmywO3wzzFnf$8+bR>!zwN)<(_qWs`*?btv7W-R34SmZ<+Ip_w zgGY3W)!68vxaL4_C)C9@VxyckKP)rfGVDEyLOO;D6AbOn3K(Uq-{PcYlTk@Gzj1#@X{Un6noI$3`@UVjv+Oy62J zB)Mk_EY6d_SG0M5Na?TTq&%Q{$aD~ye@~-%KDr-^{W7~4;M;X)G|0~Mg6`7@zA_M zAM;%m-oHHCp!|lz!hE3^yrK9_I{m*)fR5jtXIgYi>UWY`jrHrBujCc40Ek`F?T|Ap z7^H5#f%AdE6GBk#SMA4hKj-~}9$?>4G*h)+2;s>nyAy=Jt^d^$R1PfoQ@tin*G&An z5yGb5##T9#a{?d^3q_(>c1reF>|4LqE*{Gqa+0uLWzTyca5is2D=znDLvXmakyS1P zkx_Cf3yy?+69eWRS3?p;+O)U49Iz6kS>PpVZ?jJ*s9Vl1=(aFPxvFMVbXSq2#Ph+G z{#`~kS?rbl?EB4M9YOKU+d{_K`3Trsr5weYucoTLaz!G!T&(J*_Z7g=AZVbWw7`OH zMfSc;Y)g`l99$V&ff7FbnY6B>jj%A^CZk~7X-4KZeXfx^EEO$#w`@`#;>!Eh?T?Q0 z21dEM!pLx};<7pOmm@>~mWs&Jo}VVQJ29z;+Py%4FzQaZa~?)j**9>$7GNT4t=}wHcyxz!#;~JVCxA<6X7>+S=D^!jYfqcunP(tKqD1r)F>@V>)1YO8J>0TYui#yYhHDssdm+fg_(@Ln;Do?f zs_Hc;N2N_SBo6;fmWozZ&^8$5B4#h(Cf#&WdoNay!=uH?UEJ}DWe zryPF%YI?2U2l@~_bTx7(R7c9~qZJ-%LyqIPT#oKb5t7%;UZ1(TB>CozQB)Rxazy}! zMSDq0>yyECr6V?4M=`6Dj4RCeZo#vSiA&H}U!AI!D$_~5v3jBHliiERwG1V>D$y4E z!JnBysr-Y=Y$Tt1U23c=?l!v%u5_)AVs7K#_y|;;6+1p$QfqqMBhAIpYuO?F$IIO8 zRZ%m(bB;P!2N9_s5F#%7u2;X@ z2nU%u0qE2sKm9jbB07pGbm42Te9T^DSuMrs!qVME^8gw zMOA|sNx#v9XRhsBa+i^ir^uwD_4#0rYgBf;i0kSdgHM!c(V~dr&OS+QdF4ARXs%d~ zt&lhJ%bcrY9^8lTBfse!1jgqVzJa`MYa*kdKYl7fLW6ji0MGZL555M6wpB*W zg@?uBXjeH~6$e9gd|C1+bKN>aP#y7=Y0k|q^r>DhXWPPlqKIILr+L|XK>6~5hu6#} z2H(A5C#usz`kh;_CK=H{Q0_UFLF9#_W-XZPhH9iTd6?=0xN-XHMZLw6wBBOkyqL&F zeuLw}c&ZPZ2GnD!QMdSSOqQwH1T+=Q_ryX}4_PabSHF!Tkxhfb*f|@ca(|thc-Y?( za>M0>5FKU17vfE8f+&PGS#2)fsgojop%_vV=HcTO4ir=K`dTC6hWwIzI zyae1~o%M-+r0Ho`2b-$iQN^A`oEX0&eF4BX23|cc^#H;aB0t-e{DAh|^IKQB`wSwf zE&xbAM5nuxJ)8}@Rb-;m* z><#0!Sm=mrq@4%lmO%ppSQ==VJ)uq08xCt$lEWVuBwaJ=vv)p3l=}GIoJSuy*PCm= zX@wSHf)e-EmI{@&kW$ot%vV|x(i2BI+)^`G6`0lSSXthGilxF+aX|k(U`b*BV0NkL z4HF^)VKPCBg_X6%$X)ShE`IADWgv;HMOoZ_7PhOLN;ym3*oJ1=$@1;jwdx<3hA^Mf zQ|BrEE%hV0jSoHwKH46iO~QT%R!7{3ybEZ{PYkPea^(Z9^-cd?NR-9Rzr<%h>H4e{ zZ^()qgyV*q zv>aKnFOa(cO@=G8E!O-!#K|9|lX8!TsBKr@1u{;mxJZ^r6O91E3nsk7bb*SQPD&Rd z>@Ei{aCUcx%4{|47>W^-@kDiZ0%+z-A1VxvJuVbIQcP$>O1>$h9-)wvIiCTVuy{QG zo^Af!xI`;;+Z~PhP+URPFF>0>$&5Jr6YzKB#a2R8Pq1fkg2fWdZz+d85A5PRk?*Io zpULo_4i)+@T)HLWeOXN^CByJDh6bxarizR3lk(PoHiXwN6*h@#mpapbHHv>!@A}3hADTUg zsNG69XzeOI6o2j!S~0I9A0>0h{9de7W3i(7jc8sed|4t3YLWgVDK(NT>Mkx!zUJ6B zLRrm{nNhCt88sY-2)K8{Z+UXWb7NSU#{3F%p1aq;kY{cjekWp@v_tBJ`X8+e%Je1< zjss0E&Erg{d-f1Mx^#BC&5Hfhh4E7jD%Bmhx8IVb#TYa@C3D?O4Knu*@^f*qSh(}S z^q0r+Q@q7d<;H0@lqa`+dsY|W9#m>8jvGbyH9hVc-^LkX4-9%DzZYu0&MiXqHkm=J z%%dFmsU4L8EsR)RmZR06^}Z=vELL|v5*a6GS!Zu|+N-Vr!-vvfDfPsWs=?os-AUJ$ z+4XLd@#rS(Fj2tg5LX7iFERCFyw)%{LhxyCp8`IVGfo6~=002m!=7$O1?(kf6uGqx z3NR&er(kEXWfwyDDl{h8UT9Pjw!m|B}IlZLTwROpM2?(vQRPee_qlI#*ITPd3(doNqDvtSE6^+fnW zOepK{(_#rZ^F5Wnud4?N8~aRWBW&hX<=+L1LfmP!Qx2Tp`rOeShiAfmI_uLJ1qAu6 zgqPhh%F5q%7U;O#ZUys&M}7O7p-RFbTOS`v&2y|Dq9OFfmwEsexJ2E4hb}OZEqR5 z{&#k7et$1Ch{pWs(!1dxadbYsRJN1Tj&+q)nYo!+fSdC5R@3(2lz@;;n7q{jZvfod z^8#YScrV{%sJYB@AUYkT$n*M+uemDjRph;iS@OA28FwkD%pF3PlmFZsZ=a`2MXwal z!Y{yKz6uaMyr~_fK7CZd@%A8FlyGnNUFuFIH{<3$&nSUpc-#ALRtZVtxq3?5ya=*g zr<9DK?nrWx=uTxGeBZFXXo+Z?P7Q6~(bKU<+ydG zsvZ+NZM^>!FVe_!dUPtra62lJPru&X;ddfEsyT%}yfBMC(MgD0Zo!~5XlTEM2u{?i zS*62Ws&LUff1G~=Z|}V6?bG?PdADjCKMx%|%`G{X=}Tc8EMf-Jt-lOjA~Fx@M=GJJ zrlHVTm#GjXU&Y{G)Kcgha>$pAF>vUHZ*cgH+ID%Hd+_Zp zOzG8WBG_ZY^lZV@*DBh>!ppE6n8Ww3`oq*DN)rIz=mFjFX7O-tO`juMnC&{fmzi6e!6q4;-LqM#Z6?%WY>Y&UmxEbH z#CtWa>weTOMrtm~EYR8&1h;(BNZ27A%(O0+FKOe{LgXRx5?URfUPOhM?{0c0*YYbz z9HM8M?0&mIz;OF(GDHl_dI~FE&)!Fda4ll1Kd~C^R^$gg>;^M$8Tq^ryt4^K)R8on zfl484_j#Q9l*nQ6p0^HpXr!~Hi*UQ;RNeh`^T~5060}qId|$IWaW}1*{KID@#=d$s zkXYvbJ)Zc+MHvIx)ya-KEOQ_C9h=pe=1Q9N-KNn2^Cy22TTF_&CiTgv@CeDc72~EG zQ@z1YyguKY`{8HPsW{1BAA5XP&#I{%y(^q)zv?BFWZ9S^&)1X%Ry-04D*hnplu+>L zKvKNMjJIoDdikqqho3a%Pvt7+JbvGzqdpSuAa<) z>O&yosATOuX3tQ5$>Y*MIwadddq2W46>K@PHk;!9Eg>FuLJ! zY$ufONthMV)82dZv<1uW;A_9lU$Z2}pPFuS4ZIz*8OYW>5umdhe>)XakCQ*O%3%U> zMI!oKGB@dPg!{#Zq^l>C8K{@=R6Wn6c*H9Gn2J{%$YUqADPAXK(C5M2yGkKed_Z65 z1FUIX>UuGp(=xNcTJYKHyv=}2n?z@_+f}nhE2F(CNjnLzvJZzMUTaT?zGv#IZ7YbkXR~#88VSTq z>u$f^|J4G&P?4-n+5Q<5>gW}m=y^wdYzKa&yChPfuV{TYGD`Bxfemmk>|FBC!*!G4 zzUEXS$$A3RB;=Vc-28tu-Mi598~L8~7Ir7H!p7fC|2rLbvwgXgTGCU32q+%C`H$W7 zh#Z~V?G-RqYV*xz{y#h&@ft9Kf4qGsbe+{5=Z}R`79(aX--H!6b?% zWNDtWonw8U_+Oup&=-=*?6J~9j!RG7dddm5>L{Bs;^hd`BjTc-bbnj{FVHJ=!8^H5 z2r*TGDxdugRvY(JVCHRF$qoOXf8h%?#9445<@ywA&Zp2tC?K-QkD|iCB%!4bd_Z43 z$gLZHuetGT^L&m_1Rsjw`@6DI9%b`Ln_pDSQiH@s_6;D)*(kjJ4nF07Mg~f`z}?N$ z=7_T)AIE+lr4IARNxR%{&-iWdgw<%(r0jnUXl7rC|8XF9!4C2Jl5#G&#tUhcTN*S< z8!&EVhg%~$xi$uL3s~@H$AYq9GUK&z^W{$C9}yic{aC}6O`^N^$&+WmgZ%wnVH-!UHc9D>+rj9d z+70uj8go*63jWgf0WVoEi7(6^ZqH4=rVv;n`c2=CY=WnUJ9vsj5tTbe6FtN8`np0l zvulScfn_m{Y}UZZJW4XzvQ;x80%OF13G3)g-{d@<+}ecGW@ni2UF0P6-plwn8N~M4B=r8(XdEk4ottZG z8<%;S%>#7_sGbIb`x5`TQCW#j@h(A1rxrhSD$%!o?V5W?K(7MXwaDprT85Zzl~(v3 zgNp$wx^i-l-vy+w1DHO(G`7i8;wWg6Da~MIlx~F+aQ#?(<({9nCM(LeYLR%Cofy{u zsd59P)Lp&(GFyHKM4e_sqePy z5wT3B{!14yd{0H81X5I5SV?_^;y5O>2$Ty z1$I^YN0D!HLgn!cku@NIHXCQ`+U}a9JvKXm!)qj_3X?Zs{V1&L&g@-0QS%AY2qS7V z1lnOWEr)LZm)FmRf6-|^Em-=JJ#dI#w-DL~#_H-zwEAp&8=N^~_5YUzP$Iv0)SSC{ zn6Fb42s#@W9TU`}Gkr1zf1K2favsBi-*Fz?7{5Vi%?8pa^oK(A7kpYkC9CqXz;~zP znnRc4MyY#;3cb8|ZK>r9jy~TcqT_!uARs+Y#Ssu>JiuNyc)ErPsXmF}t<`%d3NkcST+(FBE6ZNlx+}vDKyiQrHl9~eI^0Ti}MgWeNuGBem zp?xo26c=Cj<~B%{1on0%#mNmM4y@aE-H*o*wd^$aa)ZjJCd6nOhK~zy#1p z&T24t2jKXEOblWKYaaYvUqr&KMJUCmyilgx$@g|tZhYWy`uNgGDJ|=T+PB^IO_4Pr zSElS)`T#c@7wnc$%DUaZ!lLB6uTBKxT3lnv8^~8vOY3wKj)PvroIDu_k@r)fQ%)}C zGdgiU;lhEI?Fl2Ns#)pR5B~RY$T^BJ4R1%vu!k zAqAq5UvzZjnFFK920v~CQ*0#|*>`5jidGnI!#-`thVmPr3OG>At+4O_`WS)Qz5Xfl zWGP|oS@t_nVTMBC6mxrQWpgv@O2;7zoGtiAf~0mB74PENePuRE#jK^bz+>k|=jM-1 zxeCyNSIzACE6w*}<7G=QKYIbjSfA-Ay{cUoKUuw0iD8uq_{n;@q-t{7Y`*l#DrGw$ zoESj>d7kewIjZ{D+hliQW$1l@QGU#S#t(dxPeh0j93Kl0a5HS<2%{_k1ef4zIHJs* zP+@)1z4JF{m+~}a5kK|P<_vHq-7n?Q6jJEwx;zK%Y(Z;ZIw4@HU})XUoQoE0Y`y1a zqmnJMBCgugU4Fd&i`{c8umfN?A5-0{d3ByDHwjDvq!1YA!7vJPU$cgw4^kPDD-mku z%o+k8Ao9lZ&Nt^n9&xHhA}E}T=9rv?7qL%xp(1_rc%yks_0hrjFy41wONY-~wvB;j zw^sajXthh<9o3hWZzG)r#*B-;T@=6WhVHw!Q+6CJ|NFhz&ug4!$(sHFYb7l~C!T8; ztD9z=IAAW4i{ci`4t6&7jK{$zv<3OZM`S7W`GP3l`FHS}SUXb9MasBU4*`*GJ4x*q zmAp>~v_+J~bIqS=s^M+Oi7g=wZ_VhMb#kNkj!7~wO6d^*Z zVE+ZG_16{1cYCLH{URpVu{YaSp#u!Mz=}OK35qPHpmwyDdP0`iKEa=inn!AlbbiK& zjZb9?wHPsS{`Dr8$H20|ih7{RG|a0%xd}2U3rv4OK;cBp5k#Zv{`Oon%yYc?=1gp^ z956tpL@I$j!LJ&?r23*ZiM4}*ABD6HK=Ig5z3GL{m}HGP$ZD9#ZX?OF)+eRZX)Oe- z46;=};$>pTb+>B_t3tFWUlN`()$n*TD-jy{li4D*bXleWaV`OuL*|V8ni4&7<}uU4)i3Kt%Bbxq>Q?Gj6Jp z2sCR}i3o$~F@oKUllLv?wFSHzs6jh+rq=v< z{M%jB_ZoW$F%GaO&)`2e=lbeunkZSA1x;aBL+kTNT9(KCzkjn!p58;Vl3XQWK4yc6 zi%&Se83)>*-@;P1hzUEBrYHJpE1gX56qtGY`V+nH(g(j#wMEh5aqo;Yrw@T^ao^9L zB~j$ZE5h>hBUuxi|`Hi(ms~?+uC;@;}bBqq^Ex459&s_OAlWQp%GQGhImLsE*Gl?)$HPAN&_im6vKGSLu4Q@!ZL;uuc-dHznQf|-XV-$;S55JnY)1cjSh=m zr;ehK@yPHcz#A%^KU-7(w!lIBWP)a1TddE$rZ?5kPe!Nt1`F^*b(^XbdT9mTQBwzo zQ`k&-Lv}5uKL(Hp`$Ln!E?SG1SG>+!|7E|+>_U?MB!6f5gqHo!&qr|9v*eY-(`Kyt z8tyOcL0XA~y~{lO*n*ilxCZYYS25I5zF7EgA#=ZQe&gidLe`vXljUphS>sRF{5@+H z|J6&ZySzpxGstZXqaOip$DOB(iyUO=%PMKR#lRkP6Ya-xJy9jBEFSZAe|1>|q@1QK z^umz|klL*bhMI!%}TqDux8wD#;_$D+@d+1SRc*-PT9jO~_V-!-uS` z{1CY`75NfK=c8aO!*mkZx%fLI*$xYF1nh7Hp!rySnvcGI74%id@kF1wk;AxTP*vkd zgHd&h@p(T{Kn}&=dyhC$1{3Qru@~?@{_d7Z!xI;P2?_#+EUxer)hi z_$3#DiMV^$hK)P;tAG{wv2^(PiO>oh0N~ z#Ff_}lZa7QEuUPM`QTpklgGYp1s`>Cv<7Ge)C{zmYAT)G{3~q?PSu@k>s!hiE1p$$ zraI`cgvc2a+Mue*u*4#h%RN!hye-guPPfvw8NrWzbU02?GLzL@)n2{)o|QYEkX5Pg zRxr(=Yt5&9SqN43YX$8AP(f9N|CH#=6!kJ66^z za}vYIr+=!}x%TvR{q(&ye*95l&ylX3ROPp+9NOf`c<7tze@pWwT43$s0Pf1@&df-b zJ3E4{t+|_}81JOF=DD$!#&tcC1rpuv&OX7-m6cl*)QhPV znf`loU5(u3w8cW@;cu|Fn~J>T9hd^QUT-M{B-P3JDYvSH3$~B6en*;!d172t>1j9V z7*-o%cHvU1^@a@LBK8KCySbp%qvlBsZ*0c`QIzdoO-$Z&4A}<04vd;#=2}?KW_;-> zvn9_UgrfCyD@YX8v%rSi8%(Yfd1Ru0pJnmsyN!38e{c_f~+3TNQ z_EbT~)n29~Zu!g^fA+p5&ZsPk7Vp%G;2c(LUPvfyo^7J09}AnS2%!({{Z)X6Qs$mM z!*Xlm{!X8LrtOZaS(h=8q!r(bI#v6;h$SHW^lC%{j{coS_^4;9<6o@jmOD_2E!hb< zYck3_`D|K?7g0f<86V#3Hrx?t<{Q+t<-MUH!r_hDHE-_-W=W*K?W>k z+A*;&GBJ;nx?3$U^0?urVK@~gBT1X(Jg60NTWS2T;`#RXNy`XMGh9N*oj2i(e!iA( z5`-0u<66Q_2O`75Jwm7%6@OtOblS%Cg@$L2ZHJ$QV_@HN=te4wbUGw+v+8Ud-kY96 z+-nXmY9MS5({4}xB*h)>9?J~(NUr33eVH$*MBhEABjB$!iFKJpI!CfKFc~y|0b9nw zze`nHLONoeo(gz8da2Pp3H10(S&go@MNvezpdL8sCLQj6vPNy&O(wo-x&I0pDKBWQ z=EWX9XLxNADDZS%~${hI8B?lz5jfrZ_rkh554PXe9 zS21{UU9;tAODJgpz9c@n{~C3yhbRneiRMQt7!oAQxwv5lmG{ug%ksf<^_88asN>P0 z${H6Ek3i(1PpKcaKS}muc8}BCn^Lbsu&3nx2SCt#2?o# z!4?zE&ko9Gv;0Fv_;(hcOnTeKNwx*D~?-cwdl&m36m2gw`gVkSJVqG zOo@N4@rv-D0p8|9D#x!qE&(y)q6f8bVOw}Y4(mF`&H4g4-HmQ?Ju&Cs_wIeJT1x9g zVXf)%IlRrzG*~j`IB>!qg$I_{BMTR)v3KWMH-nFV-KQwm;`&N?*!%WynO$5`Zc*p6 zvwkxBqke%g^f!L*_I<8%M$~qYE-A5qatX~Qpr*>vE^;cHB7G@t%S#Xc8;VK=o*VgD zvuXh+l?jnNoOyF98>3>f{B`yPaKKiBqP!;gSGfmu#u*c~bAw;=_uIaz)%HlXRpnou zTa-?5+o+k(%yaTzns5w-?G+kv`Tt#cTDX(M)GkU^Wpcl?N-7gpdH%$=Koc9gc zJffhJv6^05_?}syRjaIorKXT$IyB;mjNKsH!LOJ3V$2cyiVSnY&qBqT2c~>2c})rB z^n86!RV&je(XgpCU(l3(j4@5h>z8=FO*6vV$~RjoNJ2xruWnk7J%J?xP73a z)^ziAFy2`>P%!V}+*Noh)k=Z9{7N< z?+>Dha04K?|3GJ#a+w1N+ZG+{q)Ej1NQD4?mWHDJ>U3U4)yUaVPr!klT>r>nt9ae) ziCt;enDw~fxDnJO_Ge0f_V03&_No&ei5Jb8vKXD(rYgFap{v@biEh(lH%7VdttUxI z`>8t0HZzAx?A5rb_RAJ{8NO*=FgKU?XZ1U3VOm$Pko+8;Eb+{+l*6UJzbwYI^VJzA z3eNI=_d&EU&EKfQ^Dp3}aWAIyZ*`M32DT)48{I}-WJ2+@8khG-ybGSQXL!L*xb4~4 zhvOD-x;ZDpu}m>%<*^-|UMLYxh7ZvJfvbX(b{&6wei}WU3%|NsY%5#_y_hC(>K|r@ z3PT{t`Y6xmv{5+a=w@Q5P?uI362eA>lB`-4w7Ig!yLHR8S8B;>C%-?AAhHPjI;$h!Jvm~T4$s3FHNK92jK1XaFWcQi^n z@b{NNqQ+UADt%9Xs}X+w$bf|w7dcR_g3ri|`4=uNy?kCd-s`l+cJ-|A?{Q(>^d10? zNQp0lprYH~nGKx$8Kz#FIG6aNcdi~d90=5YCI($!$oL#dJpiDiJirI23oOfUd3LKt)du)sc*KZh!6JFR`h?8f+>gm$(J zyB+J=4xRRM`0Za(;ik&fBjluQP`ndFt+D!7=yX+3^@bipdugGrqsPW!a`KNCSlFNZ z-Q8UssrL`jGnGukbAMLUGyPUyj1AwOmFVihHaRdw6;bQR^krB0V)w&<6D(}J?iYZU6w^1X4LMWP)(wrzoyLnyo!#K;9^dvO>)w%7vT{Nh+#!r_uZz&_EZm{oYfpa^|H0Kk``* zbmm?Z%X;ck$#4%e;IPSc@_1Y?H@EQan>sPZM!(Lg6YdPUEfaIEI&+T0nfDfpNnJ-C z{t|Vwymg$ambJ#dNhEP|%E-yH)~@onXLn@qrE#hyj&K*4+jo};8vh(J%H3App}`@% z-neQPwPTK{i3BR)EF6Uwe&lQK@ZHnsesaQhA}qz{>m|z=8W(VCEQ_=-Ck^4$SJ!(< z;Sv3kPy3V@A!gNFxB>JxG|AGr4Dwql-xK3#<&6`vTS|mF#_MO0dJCBFK9@EoJddl|I7?Z$kuJJMpFqoZ)lDn-u9?(g0;)4N>BZ>RpUFi9pVT=|Z-|)OYcOJs zEluG1y=m}EGF<8@$AK1T!czY^JKSc4{h>7RVOR3S4okZ`CO-MI=pC)-lFiM0-fIVE z8FPOgYB>FFaqTdN<4O)y%1_meZv3^K6E*DoRxbBW{*Xk7#4MEDXxwefZtw?bX9&_D z+^{8Ms%kmM1UwrD!!mXNUCP?#g8N>7bF6584JB0Cv&@-m2 ze=0nPC~ucx;>z=gL*u@|Qai4THwYL35E~mVGs{l_!PffWOBe3zlacDhMalLpCio_d zIUo)8OIse0PlLo8VUV(8y4=7f>~MrLN@HOn1|fS`>yR{VuJSu2Aos=E=m&W7M2WQc zS;U8c*W5__gtnDL#aVIpvzH-mPnkC+xa-%FyIJ9w(t+BpUx!|_71An_4m~boRcgDO zDsch4;(lRw?ce}qpqK68pSarza_rr^>4xBBH5h#^xt0U3p%-nloPUvFkr6ld3qNYS zR7nZs)C5zer#Pav-P=vFCZ%u3i0MT-Bm+Lsv5GZ6>y&xZ9v`hgQS2i~$*k>G+cN30 zn{NkK>-%B(!_teti0U@3bt&jy#2g}=PG-575r@72kzuesRUP8%8f_96{ z%T?|tiyITao@%O}`7!<$@W1hi<>^cBoIiwtKrYPhNV*SA8BC&|Y}5~}+8K*j)e!yy z{-WO3e0RzV2M$~|PM#X{UE-su8J>Jp95LSEvKCJ(*!i{1-!Mg`pEvTKu|qmAt;OhlVCx9N_j9{nM3XVZpZi)<6$G%o$|Qs^8bWhe83Rj-HDh0C?3( zVsjC}NDLRwFgGovxBj|TWp$v^A(t9?kCxYDxlAS<-9}}d+l&0o^hQ3f!3Lr1b0_*uUsRH9-6tIjz5VnhDLO|I1Fn!(@g?cILsN%Oycs+FIKS>x1UvwzNd ztK`=jc9N1K@6(vY!El3@9Tv3 zvxK?h(yt#GPHp=qOyM8zP&5r34D6_f@c^?-U?bO;r?pUlfY^V8hil}I2flGQ#zA7P z(H;j|MCsPb#}5_P^Z+-+5XK6969)`HW)=NDI1p=PPSLe{KQhsx8l- zosaAr3%n6F52sH|Offl5Nspct6Ue(L!i*l>pODD^XK46x4FaGxd`VnGpve*VS$g4} zS9OcAdAsykBJy_1Nn+u4F1C}c7DI_q{lqy;!`-VhW0|W@UGVwcxqqrQ`1bZVq6uQf z#+$w`aX%?mnRQkFtrrYn33YGv*5d=WWHos&L*706_Apc4aE_9nm!&gj>ymTw-2Xqq z(i@u*tfwtXcKi|gX{6<&p6@hmd`30x_l?ued)LR;6qVl2jYy3PCV;Q6@|RH}hGUDt zT6-V9aTTdJNMpY_~Jn$NY~|)Pb;?MK{5$l2}tlY%6!{Q=#)1>im}7 zo$7!5tqGB&lgQ~bObMERCHr6d{oq@OPAt0D!ysZ=3D|j^g8Bx9+LxKy+yFLhHAh>V z@E!hi2R~lb_Ok~oxo+Un?|&6pUF!VbXi6GBlbF3~vMn-JUULf~2m8J!{f&l2w?NE4 z$>hJ)^A_>2WwioAx1Jz5R6Gti20qFETKDR|1&WIfN(nL{@qlLF4wSt-uafjFqV)jU z91LZh$`u%50!7+WM219Ab1Kj*Mq~jJ+^;wlWWEWEe8(ipEJSC4sdB~jZ8GFa3!SO^ z$67%1sScvkHsORv0wm5t1k#70nnZ--x#%2UZ0vO%g0bPW#*!km6estUv1^t?(zuB$SXYX z9+CPGi;r%=16~?xVVAe1YiU zsfoa#mA2S)2rwEkP>^nN#6i!lEp*8a1T(hdB#@s%7()1ge?@I+(k``IZ@84VnQG;Z z$I4^D8)ocR!^CT}_kmcu>y0S?WnQ;#BR&h2C-kz{usH+Vm|yKm!}-GdegH-}0m#TE zJqOh7yi5m>^)zV@&&GUvmfW0jmR9~fMFLgEvzqH=E1L3>DG^LsX4Zz|hh|{=8&fn*@A;AkYtOV)yZN_{(Ys|DqraLV(B^KY>*;MM1@ZaLeOzsTD zE2w0OTbH56a~-IYW}YmY2)~R_CU}1xoA}J-zv=PXS~D)UIc;jWcqgX*e|wSEgcqVd zxpsN17cO#~!*>6h-n|9rg<6>+%kM)L@y`}7y$7Y4EzmsT!7*MFb&iN>_X&LCJbYfU z5@RE&MXvaf9&jHRLFE){l1NTH_;&fRWTfdfWA3Xf?p1+czVTD@d<6+w5s2<$g1HAk z)kv)vgeg&ep=46LhQAPZGX$|{Esk%$%$GOQ0!On^V-S%J@JCu+!u8G_r95b^;jPd~ zBJ5_oN0fhud<4(VjHP5+qG9*Sl-%Ktl~hg=vav!k{RE`^`w$6&i8UifEWlZyfzir9kfj-S9Rf$>>ndNzVu}@= zQO9(@VU6DhjIXD1P<~feH9nzfH*)#6;txQa3+LELPg$z$FB}x%Sf-xi+&6l=l8hWe zYv{XZ-_D>?Q>yb*=pPQmi9YSBmC!P^s}_Q;6RnnabK&n7bYiW-1CIe{LbrU-%sKK2 zl_J%EWl>gxIa%Ym)oXcTMb8`AML~*%#biQg_JSP)!lyGa__L&UUTMFE+?6+e=n$~4 z?|>eBN<{xsG|;D%-D%@=1ZAkM#ETXcb%s#Ttfk>k=Kt;tIgs?NE?qXAiorE%Pd z+{8Vk)PEn+57^9EYi;t`r9bA!iYj?lk1Ns*ia)tga&7K$fGD}Bur4RQ}=UB9PKvpb_ zQW=uRQ++k}gR^tgo$xC~RSyR~A!}*TR8r#lF7pOhGmoZHzO1BAO@5_*rXS%UVMQq4>6Xs>Ce6XAcORmxWsq^|X;QK>Sa4QU@C1$7 z9h}}%`88~KFS_QM>c3M(*ttK(d0|xn=Cz>xP+qY>`PCWCAG_mo6K+^J4cf2XAL2g= z#MkJ~r8g!0m{Iuc=si|NH|+?T-C9VJ^Nthc!=y`Ep}MtoRiSPrH+E^PDY`c*GQY0W zpM0)6z8b4Ye2v6lpa#qv_l_3v%Fcch=6nC3Q`n^eKPr6jOkapCGN?p{0c;AmfA}Xx z85E+;KR~sPF4IX^p3)6ZrfC`L-y6e3J)WiLacN+wK8J8bPhRHQ9~DCqE$Lvr zzuKc?n>mToj%}^|b5HG9kp4C&NCunP|9L&Q8e~)JXrMn2+xEd9U-{qb^J&Do-B`V^ z{bIxDbDW%?o4q3|IyLCG*^2w$6@!mY|7tw6{deCvf-S*^-8b)F!|n!i(mYBiZ+az5 zBbA^{WB5_%Qm}I~d^ibN%Sh_y8AG1UinMtBWqWedf5fO`Yk%02?Fl`>26%sF#qcdajGHzr>-l3hPn&;O!I0)jOR%ADJikA?wzqTY1B1>dn!*~Cq_kF+fo%1|>@K0hu=* z+s^~e?kw+4e4*v`aWUdbM<+kLE~9Gu!571wbl%+CIg!0C^obqYwN|aItKk_(dII&R z9bQxpz5mfU3u!sul%?BZQI4EGzU=D3)UOLaDBzSxV8e&&V{y#k%U2`kz*g*$;#3}5 zb7YY`c#2y3E91b~lt=;&sL}6!#8+(h0uHaA)#Gkzs6VoT#5_Gy7-m*`w+V~0g%Cw=8SeAAhnGLK+M0G5unz-ob^~s~@8C1Af_dguj{UJ|D7RGZec&@NP<+6%$wh0YveU9JDpN zKK)nLxqU}))2zDbp;$}yv|8#e@3Yd=QFaaM%dH#P*TBA0DNDMd@#Nd$O%j?Mc6rr9 zhasugyE31oDz{(Wm^FPI>7eBWuwW80#!+jn!2g>>pStJ^uyDI&>Z~0p5yqx^B{FbN zlI~g(H6PZQ>-$?uiX7-2<`>C0l0)Cewjr~RE0ZDz*}$(gz+UH! zdLf5d+HlR9eL73dAT^ch0cSt@ins<2$b{0*hK>9Bj{r%`p7`|`ns7Bh?K~%=wHU&o z^aXc&H=p(to|Q3-%LUi@Mv}|h)juiGNG^$HwhQgx~AZv1zVjy-w5 z?CS^#S7qJCjdj~%p0}P>X|$ML?&i~63|0s(R;rj#ipp8j3)H=&)A0>nk>1mG(`rV} z6EZgC7ip%W*LX@}xNjzGG*9y~^scX8h>)iFQ53l={0vPuwz~At?tA@&RpczoM)4y_ z+!5wCi=zL#3(wt;3m>JC6{LE9loD(-X-%vDg^pP31WMUmdg0+k}C@ERK3BnG~WRBz-s|fkEU|Mr$TWfa* zMcnxdS6=aI7LmpBX6ua&3Qa%2siZjk@w!qJ*TByfE4v(7XM|bA8eQ)!m#(PZa?mw6 z+WjuvqsADtW;*@EHf>4BImf40wuIfw*m$UiVXhZb%22~@+F3Y~bK>}@)iUsfa)udd>(_`va+24;Q)KQNPp80JQy*QM@ByOG6wG z{s@{7+AhG}&;R}Mumu-L$&PlZ=(#p~I%=~I%t7|!%vc|G#r4(e%cO#W&2q{Ms>pqDmuIQ@>0ecJ@pf>5T~e5?BBY&VeEvf>DfI%K&mjh zS;2ihm~?Lg=??7Brlkmqb{rc&t@WB`IclNWOFkhED$>SScF9!9%I4(CS}P)V_JDzc|khHWtwME62_` zEs&tUJ_6)g$A8iVqFN~dR8bKjjt(sYl9>Bwqy;1*hKfSG`vHevGz%&R$apWcZHS44 z?eUK?e7%TmH_b>WLO;0&!X zAd#Rq92IEFl6Xfhjpj}s?TBcIFyNfaW2`V@f67c27<;-4`xW`91aLq#LXwQXh6Hja zV;BnYwl{ABJtF6W7)8d8jHB!kxZJ3;POSiVFd(x`st^kCsSh*2L&o;+u>r^aOR ziegs1fUi(j|E<@|3h--;Up~tqSdHiFg8hJ?cU{L@AI&EPWi4Uw3g#8{gn9&@5{NF{6M=bH$0LSpc@26_bS&u908vGIqE-<5#7Qpu<-L0W8$2Fv-F-`R8fp0qZArOrDW|CX3b(Z8tm4e&ENI< z8jMwBNnB|S=nUaN+xzj^TyZ*OApWY|Dn!DFzwAb#KdPVvBB$`rJBZ;II9rBwj zd{Xz%B)os0Oum%WZ#)@O-tn}`N})Zjc+|~t{o4n#5UWn(WWI}q8P7AfD}Z<50~fb1 zbQ0mia{NGk>Z!+GRXXVi_+Q?iSkJ!VtNGb>NDC7h7i6!S@Pk~ZhV{1ok9l#2$PoOZd5IPwwUsBA_eGE{jkdj1{7W6vdF-73Px=5^kOYXfu_os(o8 zX9KTDS7VZS=++2y@>r`#t}bqM)Cw(i7W!d=Y%^1lRm^2GnZSIrZ3fH4cB*&bR|zuw zoie=&?P(B$mR+h{l@8n_fkeE_JA{9$lb8CgXG`(Tw2e-kMB?HE>4`A^)rqnB?UBMF z@7clmZG#k9$K`qe9mk(}p>bXQSIGN}?7gw<*6tF5_#fPP1Wjs~HjQ1lGRk{C%WM~0 zWO*l>i;6R}#>UbsQ0Z(oazq*Z)yeV5qAJk(d`fX_s0~ek+F14wt_~q-v_nV~ZKk7g zn~n6~dQ1iaYmp}eSq|VD%OGKET-7~37x(ga zb1PAxxt~h7R14F^Qk(-x?s9zq%65hi9uUH&1dP#4J!3c2x2%pIH6Em8ywSg4t;m(@ zY7A(N8vjx*cVit{dgm|)D2R$7F~f0VyR_Mlh;jrVwB9k0F*Nt7G6yUzuT=1n7ou?W zUg1i0_s5cRDg+o5ik41^EQZokhbzXG8gm$rdxke{?#@I%c0p$=JE9(UbPP%52DKaLXrNQQm+ z;jVuOZeyx&2O7+@sB!xo%DKg-gjx1*L8~jAs(L`O%%f5#P2Uh&8c6?MZf$$Qmk7mq z)GxrYQu7mKboeRgU`R@)x;hakckg|_KO>F4;_`F4$8ZhS#K7)SCZ9jIY=PV7YTr~r zN+mkP>Hp-~3&bHMjr{6H%Gh+v^3-DTjV$YoMpns+HLiVXeQh_!WPnw7oEcupdP#YE zcg!Pd@37U8W(p-0$OTVPWst>T*u+t!Mde|s8@7dYXy4@Jh&(8Z_AHMO@XNiZHZoJ7 zC{~!;TD(1+#otN1Yl02}Y?jYcTX%#k@DHj@Epnctrw==0cV6k0R&!jjH%5_0rs|E+ z^GnIpgKdfYK~>a)6$CE%RKO;5Hv?VX$;S^HO_uYynh=bjM1oYpZ-lFKO1S!=G_CV3`gI_NL&@c@y-Hr_FFV%&<~M%6nCK-YmP>UJJISH3 zN~)6JdwRy<1xJ;_6Ji`?sMRWlUf`av$*CQ!dCPa5Lm&fEX@PWJeHMACiQ@qkvCWG` z`Tga$Md5HC=evKw!1nq&q5cG$fQFfD@P|5>0~2pwC6c=jM)%dZOlyY5h47F$7t@Uj>$$xR&ilJ%@&oG^&|Q-QC)g=s;Kvg- z-ZyxAz7N04iGSjRpGr9Ff94f*bdnuv0MUfg_x`!a2SSq!xc%^eC?G1|pQXU2MY^2$ zq~*|Pd`ejr}fp0OEh{A152eC^qtP{W1M^)odI z7dHoq5C+l9V2<{9+v*8|k_yQC$wkWA&b8w`SRailzo57EvbjHVwPN}M5voe`Ngl(e zAA6ca;aH_?9Z_m_md5S7?KpG^F@oF=1$-(ylXR{tWkw?U{T(VT&b^>vZ$HR9dsv{P zF^2v)?_nE%nYejE&9Z@c?Tm0OhYdb(!dLTT6dg(wDJNC6l6RHzGz>rn5_=0wnXo@~ zq(S54KsPVZ=}ueoGwpxE*GIC**Ghh_ahtXdH+<;05Z-18zC`RT(tnJ+b?3{f#CWtC zf#9hoy+JY9ieJMq86FTH6(wk-Xp6Bn8|cq@O+QWM0L|JQZCbC~RVpgMAJiO3c|<`2A59unaWPZ5B5I)?ST_(CL z^D!B`1g+P!ccA@~))hfDyU#-1+cWju<|nD*(DWW7|MunahMR_(9q6}DjL&7>2$t7X z5=zxL8KnU}V(flMHFNeoilu(|40ZuD)Fgu>?X}TE@1$>2v9m5y!%j;{hGMh)Km;6njL4LwWW!YYCQ<4vg2r34 zJ=*|*yGJ0^cZq{juMBkUshr<29$out?^exdhIMKv)_!jn@df83>*DA&_x{#DC!3I_ zCS=E3LDR(hE$4IgXwv60<{0O4ATqpdF29xj&f|k>q_1sn>Lt>=h9g6VNW_r3AB7uw z?zwTY?~}D&RYrr00-8jAfZvnLpBFhfIOt%3b7E=FACc881xOhGZ63eXrz_9h)9yV> zr~#PvyP71tR)97De`XX2m6`0ns%)md=}zbGP4o5Gv@r9}_-lO`-tDtAD7%GeSJddC z4NgJ!KRYEVNV@XHYv-p)^ZI}u*WVeH@#_Y)U{nqfLKiI}QMul0jrX^XolQezQ_ZB9 zJ=_)_b;ien&tH;%3l&i6>{ZQ}b@4Jd!)q2JkwBaVCsU+HF0+H9SSPh;6@8p7@Y7{K zdzLR98f@}a-}}R2`00_F$X)BRGvDR|97HSW{YN1B$E$M#C`kOZCd(i!nE2+~|lN>i=aa6L_%g z{91&vC_}SU!Wx6@=H=vT>M#G>Fx!yIZw(m*@|DN9aA66rJ)y1&83A)a$>0?aaI*cu zBx!}-h|5arfDNQUF|HOA|`hc0K-U!@~5 zKzMKWiI zQU1j&F~ScN9WqHsF(zB*%=TjqbEwQ47L7s8i7@CwiBD=#lz&3-m1F{5z#@|hg>HVX4E!c!Zv24e>NWW{G zs}rvk#s&I%rstA>RFip{-N!wV<#}52j^*$yW z7kNY7NCTPMTCY>>t90QeiA~stLzG&hl9fIbgAjK|9U{WVJ@2#YC;w7f8=Y!E zNd(AI2nUa9+47Qga)}H@qTHk!2M%o&*?{Z>9HFpw4uo7g{lOTPBFr}FMQWOP5}3<{ za4ErxuTA1{S1*|Yt{*UW^d1PZ*P3iy$){f&ecOfsXTJFhU|Yp3I29Ii^-sf#bcefP z;lpL`Zx!xy^>e|4YO|hZzB7v1Z>;I)QyixAC!_7J%6#V+-vF9)2hm|$cZDfFl!%GZ z=5^$-FGT;l@uFdiv3Fx)K)@GU0X=6YJH;(cd{qnULv@G*Rhq>6p?yuZy7M77OasEmPTc_8 zK$r(}IIRiDCw{549~=j;F4=kaEEoh+J0kCm^eWLy^ZEF|xr!$_+u^Ts5Z1)h_1zy| z0GMS$I$lQu6q~vw5=gu>fbxM%%=HHaHK61Cq)VwPaMkzRS~N`BFmQqU3rNfrFp7{> zevN3BNe7x`)EM#EnRG-b!;qeHujKcKKnrENJ6TD{ksn(SfuIy3T{5I}E#oILH7#ml z2me}((qjgPQPESR7{^6|SWA*N8z$b5To%&68Ze7s;ONWh1pnOIl&^}!s&K}VmcVmII=z6XPic*P=z;Jga@^Gq=HJNrPo;Eti8 zp{|B`vM<&5sEM(o4#9~F49bIb+^`N5}2l5Oy znc*6O7pqi#9f%g$&s|b`P&0ZJb8Xpix;1p-yz&xB)uFlaSynjAa?%1BW*7slSRo6@ zwlX=;L&#fo_;hc2Yo;wmsv!LLHD5Fc`{dX~{Zc1rI|u_t1DBfEq~xtg@CTVcN!q)j zJ`TN`N?};FbA$y|^}T_IIY$}tDKhQnvE};teA2$*)1DVE}~r@8v4;D9}byxp`gv7}W`sBRI_MClxO>UtF)iW1d7`?3 zJkOnIW>~-?EQn0efi6T?LD)n2SAr&>A!Ek(!maZi7DF9f>;EfVkV>SF)6?GrfsJb~};fv50G<7W|=dpF%>8Pzue zQi#j{#Lf?egURL{qX%7NPhLI<4l52@(Ui}=hqi^c@@0DX{}kgD7*_pvwegV_@9DBkjLC25}@P&Vg10@M`G)KN3vY;3?7ZtI*2maP|1tvzxwyzEYM)w;MLXm?M(C6S-Y?^csmVgP{lYzOIy0sZGQkgNdcu-tO>wEneJ zX7CZSMT(sdn}S~sX}!I~H~q@_{%;lC1N`***Z=Dk$3;R*fynq|M%sIgBa4vFuEx+F zHU3;eM>aa?>w7&xG#-iP(xpx^NE z3##>VX)%;blDX1t{ zz$+^9c?#N}Z=$=UT={d41|FlJh$@TA$beU6eJcY4b8BM@8!YL0Tu^Yt5I}nSqTi71Ru3Zp{Z3r1|*`K5&oxn2m<&=T~e@1!>ge z6sg25tPH5QSs$`Kq!GGKMMWiG^~R9zxrEg3;^3Vijj@f*J3clxdwY9Udk$6$DEx6y^Nm|N5Ss^m{S5(d`#RwnOkOf1Z)koD^7S=ibL($F9q z`up!!KMkNJ|7ywH`uDKF0NIdF*w|Sgvi+?a6cs>z%BN@oHGrr~n3w_afHs7<*dGb} z{QiGE`B#hoD5>_ZlI-kU?EftKk4OJm^rf|dmAHi&XwydMUsLnD@IN2^E-1i;9Qr>* z@k`D>KLvsox-P)>chZEeuTx#MKtT~fk&zI60Y%+R#BkSqIn>fq0&&Eo#`5s;@}h8r zy~Mi}afFKYKtArIF7?cn}|IaIh2J5?Kc|Vkk zhevhsn8~Hr*4CE$b)Eb1*MsthuKvP9?})fC{;NM8U#WWg`}I1a*-FR9Uy*V{Vz@Xt zUo=%cFeCV;l3ifX5jEDIA!{~U=dtVhVw@~&A@VppJ=OZZ>OsX{6-UDq4h|0HHttOk zBJ-}0vRUv(X%r+8fWDIySL#d-sByVl^KkIy2 z_3p?2YW(NSMFhDwCWocI5dWVOO{3_FUNoV4GDV1ND&;+9QAvqPuQAt)-<|vX42_G6 zE0XtJ@GE3b+P&Nb+^$dhRc4LcX6S>DaS#oUd*%+Qa|wBJm&Qz;JWs677qJ+samzZa z#i!c5<#;IkATIxR#}0%%#FAT1^`F6J2oD+1XcX1a7f-?$T&uZrhqvDnxgHfQlVw=Z z>s+W+%f$~UFVx_U}N=?SiMyo+g@Ax?6g?fI*({=$F^g8PKUk40y0X^iv4c>h0&vFCs+Zwz7Ed!G`_xQTE?^*e9|1~ zXE~w?Q>ztk%FKD~$Cc0Ca%*ekj_7q|a~+*)6x%gdf$B8P;%D{hA~`d#nj&@Rtcgtw~py9?=LqrS(+ z(tGbI2wxOszbby9yk2v*U5G*H{Lnf(yq&fe{y-v@UHn)#7N3Hhelzd1YdTVQ_?p&| zd$4NY9bb8_v$4dR+@?yw*^nH@FK`9bW>qZP51A#TwQ;(1LF)RCI z%pDy6w8YiipC{K+bWI`pzPNzZnFU@(Qo>79>*&GJ9ntKPi{m>Jg3wzA991ERb7*zf zD>eNV^AU)?udODlZO8uM(P|KPR_;d9=hEg=m9th>Id13I-@3G4m|i-38P;~l8h$JO zQO2}%w1%{Jluw+mWbUHoz%Kh@YmLtdHfZQHJEUk~ZkEt6XqkPKBd5|cx958oqNZ;O zjTJn1%nl}-e49LK7Rh4qHQ%jPktnM5M|$(H&bJ}E#8C)osQHG)%g35fRnM&&-N3CP z(Fy13ZfuL8(EvraJw7viG7g(V;+a>I+@aA8$9acRMLz7@W36?pGv_Yad@4d7i_sPB z$-#zy6>qOHde{ufJ@ms{2E`K-=xUi<(4E&4mM!F4ZS={S;^z+gT|8TJzLX`ZIxa&} zA!H^RX2p?a)rZ4M45#qgOLAYQrAXEBMt{Ps6i=Lj%I%7d^^Fa)9zl4J!(a>H>fwk^ zDZ762=yJRT#RL^$Zt6;sQ#bdxaoT7LQt_=1ekth@I`cB>94A)Z_rRdYGfHx}??@L+ zDLj2NVIfS)t|tM}5O(x&k8-)1(+KBXi9%I6=Cy3eq#$&iR)22VgN|yXhNmv&MRYVu zYJ1ePvi=FLXut7}hUr6-;-gR_)eWml*L+sYN46?NjVa{xMU4yO)WHWueP3Hh`HTm+ zyeZo)@S>i}-S~vlZ22wko|(w1xh`I^>!nDw9PaxzLwyZM8r4_4(p5O_;MhDKEkk@Z zrsIuW>l`fhkY%=S`Q$vtSTtc{;<>g74d(`TRuHeBBomBJS!o6qd;LJLGv_)9blOkN zWm6j}1y)x-##BwsR`vArD)z~+Dyn^BpaJWIDTEdc#p2D=v)g%n?Wljw*RC6=GT68g zT|XL&anTi{qfaz5@LEe4it8X)@NGM^U8ixuV`PKKN zg$lj3sM?k4q`#=WyvRlB4ZGD;-@Eg@ay(NJB+2rQK6P)sQ;o*i&QxT}JDCL48-oMi z&$_eRsDGl|tFbfAtLvNjtgj-)a#+X#K<)uF;oQu1UW{ivB3g3oCZ50MdrXNe2Pu=nk9eustlBxgdlPdnw4wV&K ze7xsuBe8Imb$GV$Cpj`lgNs*Z3k`>sjFV39d7iV9;xF6oZGU?-{ZtiQfl?w-kbdNi z7wfvKUg>?(p>4^7#&}yxtjQW(lLROBEv}4aS9}2%bLY%%`Kdy)8*M_#aq31K;t8MZ zErucd&y3^GjuuR}?BOF5ZaO)Ip4?^uNfJyAio(QR0(#eU2kJF*U5lnEoC>**yj5R1 zBHCPSv>njz9lw|s9PpF;V0Ljh z5}NdQyV$cuPG3Kb+-_92FWzWCj;C1E^O~fk@1CFNXu3=|WHe9L)W*BjQx*SkV|_j7 z6zOj3>Ero)LGP+!WzM*gb#PV>yC}=rNEeP zCNcRvjKO##MP(&UtJn5o+}!yq>$M1>xAB>IHW0bFds;#+g0y}Q(tL^xy(st8kG!+` zNq<=1Po67|(9A5+PzyU6uPSlx-(HfKU_I|0Cf)jxX>X#_EqRweRPLs>D5i9m+3J&S zVhRCbv#yw#KFi>#j)%+ncCGevzMNGtHLkBK&+xDczEaQXbbmDzi}U+y+{W;BU?c<{ z?aNWdRFZfilRxkbcaC+{i8{X9&A7nJHs2m?j#=^&b(Br+)H4o$4i%9&GiSziTK|&u zy}W#@{I(_LTnkd$aY!&i+9Mb(c}MA@H3fc?RxIwE#PeKCwxZfrEH<6G<~7WVSkgTBi~YnV-f`TLAyk+y7?D@5 z8%stZDPz5hVUb?cg*|^a%9LVluOi184dMNL&*&4$U(FD~fm&nz1m(dBe|kPI>hw4G zq_sj-)n-A5058SvwfcAr51&zfEv|KXZ`yH7>dzS&U0Awx?x^H(3Wzh&)st3fA%f^w z{CK}naZ-ya%Y%FCieJKst{*2*j>akUo^+@hu%h9yp$XBV>9SsrbgZBFK0?-%JdzgE z4^b6-MYPac#Sby4(cLK^AwvXH;Z*msE|%dv62>ImmW(ichT%gjY_E{ZCE(tSV^(ZS zfcn9DNG22a=Cn-Udz1)nJ=D32@SZzfk7UH%e@NYUnrSD{;)KzYxpT(o9Fx=CaOJv& zsbXM$1dEBjZ}Hvtqbo=1k?rbJ*Y@3`zdK?*IruW|^ey&x2q98VumhuP^BuJ!|JFR@ zhSeFz#Uzi2(GSV*OOrMd(R4W+Vy}BNkK6HG?Y+0+0u3I`4IkBzc&FXtVoI!?pbrtZ zB-e;=(|mkN^60g>CqB~YL9gN~`;F*_3L2J9*~R0l8n5=Ij(ugwMn|t;g-53BTbaJk zp4vSZMWMN)s1W0{5`;5Rf6++HYnPhw)opO?Pm^p0SEX&s?u>uku1Uu-mEm zk!E;tWN8C2IK16a6n50uS+Zd%`n}Cy!yA!jWSDDsGu+5%q;W~-=C^PTx#P!%K8c;z zeChNMj_i#Gy9PQDqEs|>C8U*Z7kjnTI7)sTUIy{C(L?!FSjR-UdlVT`^ncvq3~&=I_m79Gf;JjIWg-2#V|MEg&(V&~-V#b@3%+*ES*cn_;+V%3G5 zC2`}@TqIwfx2T~tTd_q&;=isSuDm#!2&U8FFzOC+d2~&{TkXO94PLapbD4bGP)hU^ z)dtqrPFF*z?0nY)@ONUV8j0DRM}M?Ov*b^_6z{#i^PGBTN09n6$3%)Safz%^hjnPO zXDRNkQ&PN^>4>np1?0ByMPgi;_3)jIlJ9dD^>!}Ak*NeEkgw5kEepdc{hcZ7a z)ty^<5a_)vu5vT`+>VBB^-3>dp`go}ysLuxW46y-ujTrx38;Fzw?mYBPQt14_Pp@Y z`I6y%gAZNdFX9O8PVU~Z!*UXUh=x)%krl*_=-TH`iIJrjH^6+242L9q&WbQjF8uapyDM84fL=PGQq9ux8@K`yKbJj-ZE8;9lJI zy04>xzB4G=I%blUI8015kyA)JQe-kPzpa683LNsvEr0qXKLh(wUEj`bZRipNtVK&E zd%NrWd#$wm%uZxH=9-fkf#j8#dqMBSlOar@2KynhnfOr0wlKP*Ea3~rDEi}l;NB(e ziUs&<9jChYoTLsVfau(8o9LwDuu`+ct@hj08AfPIcbr9O(sya+c=jI)MwfUSM(3~0 zXd1tJ7wc~9RWKYYMrDs+_*nT7>A0wBxakiOp$kHdIBEdbF))Ud?sRV7Sh4PCWN z>#nh>YiD5S>kd{Jkw*0?6GPYOHoSDK5i)O+pJsH*3Fv4ay}c2&vhk@Dcdc=o_wnZU zrB7HUGEUc&9-!wLwvAPbGSr7-O;AA^5W*AO>iRAd6B{eK7`gbOle^>{RX3}G@QO!& zVAIZWhz+n3PBd2)lsCKDXoyeZo6Xo+(hp;~%wKp?%PS?7S5SYxU}6syy_s#-I846s z(F~!j)3QgSi1kTPb~@1^gJb&rx5J9;~wAo5{z4RxA!r5K7r{GwHMPElVh zAM=lTeujy&(FOQ%e;#CO`CD?f^P}MGW&H1}wYP=`=5fVhoFpUls;Z}a8k5l)@jWWm zPn1*EaK>akOR+sdwV2mF#FnYuYP?ZmM|GU;`FO?DQ=mEj)0bvElQ5s&{fw25M`h==u9~L`Pgw%~;5cv2m|-kRJ~d9?*rrU7%YF4a zs=u&SY9=2EnrA(~G1O0%lS=m8^0QRdq{ftPYPEBDUHT#=@x2zZbv>f5D$VExE*?yW z@0`*?pNFb%{e_5bDNvoL&kW25p{LBl0-u8R4un9()jd^T9p7XXD8n~NbPYrCdSj!% zU*bP;Rbo2atQ@ejUypL6c&qRm<~Zf|=nmj*>)GudW{Ki*Ie0PA6e7BW3{a^^L0w~? z8RP&;v5tAKcIS4SrcwKyx3VXHaScIns*x32_W8gOmP|-bkajk5$RaR;C*CJpQ{6-H zNS`Df>o_{!#!)rbBv&zByE#;AOZM<@{Ck?@?v`}MKI0d_7@q4|A}}7|FQSSyI5af& z^=0CWS;e=DFWQ#qzc3sJ#EZSDfl0jB82{RE~#}t%XwPiu0Q61DHHVIxo_#|A^0VWz|OaCBhH-d6MLAH(7z zlM*q_J|<*pT?{iQTndk7sb=H-0z-(q!?l68%c4^wz2#@^@OAp((soq&DYs=b z7D0!w@rh~&QyRenVrYKKHzk~VPbh_5tIP_!xVbIoB}jR#(uaoM-u`Yqp!8c>U%f?S zWdpn7d3v;64qrN*@3xpV2a%Wx)SbY+4?M}&){5TFeR7E4L3Nv<7I<;`JZ`~H>ISEdx(e?m%h&uDKmIGY?@QC?@GA$GOFR#uwoF@)$nV5&G|diSMg>;`O~C= z1K5PlC><8@E7vmP=UWGGt;ZUZASQ{4c8uezkmLtCC+O!Fv0MCROFcPOhKelpxQ%p( z7u{#_w6{_5Tg9j*F!cCX99%$0Cn6Y?3yRY3{gvTcdUq5~y++Kl1zeI{JAp?d-m7<~xA>)F<;GjN?kA`c^;*`O3HZ<4Z%WcRDYTDAvS221vS)`ACi zy*DPK4ybSwYw_&Sl0*1?xd&$s#_oT&eYJF5E$OknH$-ryqeDg81o=QQ2OUh_Mq*zX z*xUsK49l`H(J~Zc-CF;Eq~+aV*VU;IC$( zKRwA{oKnd#Epd$etLXgP33p)E%4_(c>C~hR%m<+BOLBF!DH)+l zf^UQ6|L*xxtn^x@V_S<*@e5=xL=*@=91je54b^~q3^c8a=aD(8tK<9`nibzy)&R2l z3tZ~01rkg8fIuj&R;Y!o*#%^0Ss@?wk^}Uym^^)JKavSL11U+~V3mSS_<8-$Y z^FSQ!6m1ySq9T*|w;T*4L}n!0R}GCBz~Ci;Po;+A}y4YA|i@~x(3dVPKU>-IIY2jnn7!wpZjgC zw4C^)g|jGYrBK5DwYo*(M1am88Xj&o@>}%O-uuxraItE3tK!J&BxH?yFY;v)(yHRk zlA!69efeS%Jae;}<9*Uv#;0f(OXXt&!FRKD42aceqn;|6!LNV%{VNp_RyU-oV+Nmg zviNbIQC$6}7C5+rYI8L~wwI)rG|WwNJDdGLLijclqHJfNx3`y2b1?JYs_+xR#gBQY z`+my0N6_Ial^12ZqRP)b?IMa&o%#wrB|z)Q`2*TAW~E#4NN#P z=j73iKWbJwrFXTFyfb$}@_4SkXS)(sBb5}*c=!>9^GZhX?N{K9JV-{VXxLloU_!vf zB?E-d^_p+W{zG*j7m8vmy5^1ywulS$`HTCa$n;1`DQ1dr`jtkw%1p+37R~Kjjg;^C zJN|kXziu8xi@ZY7yYDAjy|$}de!yu3`ZP`Bj+jMFar)Nt9Il+t?zR}FzFzu%{HHcr zr>^teZxKdV@^5@EYV2?k{(Bs6v7Tw)tTSF|&gFw(Bp>y6tPi8R3iJ3gaLNV^+CY5J+y* zD_YVgMLL!dtsU34@@DwE`cW#bOKZuPA?bwujEhWlGB$Gp8!d;yM}@)y3q{S&ySp{ZNOG&?;EX+2*V# zZV5<{4wTHeo{i$Xf8GyeW53pn#{Unabs!B?=;?yiNP=Vv8s?7stLscJ`MsOxFQ_CU z(xw1-Z`Vv>G`bKftR2$O5roBt+w1@UM5F%eiFFBlZ5U_8Bia)b&O4%&Ag|)c{8)!E z2C>BE#*Ti&%Ri|oE7_HgJ9Kq_+%$JAj866wip2bUQ{Yx!15Tm+v;+O4#zNzUn><0< z%3##?-+hU#_uA+u678o=vJ$KU5<%$LN4la z_w>)pFcggtn7van5$pEiU&hzAonHW34s0^;F2aKY`oZmkI1ygwlL`Qdeafl_f+4M@ zgRU;8-onL=qOlAfY2X^sBvj8;%cqH2K|SknLs%cYsMA1IprOc|`W!lf?oig|w#1~9 z&okpZP`Gt4pb)x6l{Aa*A>D-Qx^v}hDA)CNhcmo#rWhnkE@JoE2nE=L_G5cSarig! zbeQAkf83P~!R;YC&2m|8>nH1639`R#Z4eR!11mG|Y$OQ;#b>;pq&=oCnsmFoAYXsC z+sV;03YHQPjPMgy{S$6aK^P;E3KX_g*dvs`3a^0+p0z2s5;T!ECb7AlbnIU2CBds& zgihKNnjc{r6XWV)`a);kDa4NO)Sh(300~^MQe3pKx$a^k(N#V_%cK_k(luPSHX1H71uh0c{xc?Rm=9}t$aL}ohN!Bn1YKlRvj$)%$GQL(XPi0 zl+C6WK&3JWqsh$q_7pD?UvZ=QB|N`AB)=97;}1s!de6-YG|Vjp=A;7DBx^wQRCg4CoXBaW<> zF)5haT-;M>wa5FN91G(72F~3&$Mr;?Vtyo$P->H?rS66jv(t3@7c}_dmV%_o;I$jX zc-~a#Y*AL^4vQbTjk*)c-e7t7IY%*+EBRJ9JNRDd2z}V>IPXv2T%tDawbFqU{VI#t znBMY=%e&5|TXViA!T|bFDiV2kvaVWt7p7iNlYDkzg?dxrb|YmY6@@$4dv2roEfl8A z9Z$yr0<_i|f3ojdf5ouxlVlssZUX!cyy@o0j$k+%9FwAS#?|T88-X54N~1tbUuw0A zEl_gzR=0UoR*&%Ic^UI&HOwWK-u^L-hznSvAsU%A0M}FETy!O~9aM_#B75AzS~mM0 z3R6?@PicrL9e?{RMjAqM!?N|J62bnN>*0`Ui<>8)HE2sn155OX=EEIVXJZ!@l#|Cc zNR#RDmIlmW9B@u(&iM`}M2yMOQy1S)|%&afPt zrrr&)pB&T8g}cREF4{PodN-7s0um~8y2?O9J$UaX>_+=ORX1_S<9WZB;3w~<9aiW9 zo2{b`sa|Qio-Fmr`Yl9hn3G&((5t=|jA3~yef&f1RU~IsFtKn)?9M6`bmjbHA3G%3 z7h3iBA;rAIj`Zv+U{5~zUYAWLu5_~O71FB%T4G<#*Lr=k_7btnce0@1cB*{Kd561v zF-$gycXsRjyZ0#JMPmDD5Y|lLv#}mM<)GVh+qrHRrd5U{%G3=^*YkrMs7}w9d1~`1 zFIJ`V@4`INsRyZjCP6x`WFx1tnYWJD4CXje`3NQ`@p%5Y>TC)Yf<`${k|b%;uzw@8 zIGAVp@xsd`z4p<3eU2veSH9HmPHKfiX}zSCsTZpKdRx!@42)Q01_nBeU?4QegJ9fNZ_&gNL-Y zlUp8hOIMFz&wzh$KS`R70PoJu@%Tv1ooKgw8w_z`tBKd1H#=7ffJJC}qjPuJVDju! zYAUs3?gx1)Bg(YUSQ}xuK!1Ppqaxd3b$Zsr`tbJXhqo)m?`#R4?=+o>`mJGxD z53K|bO2N)B7?2jQC{rlPA2W<^f>eFS>%+U)QEN96!a*n9##mlB+;wt+2Yt!S4V_j@ z2g`atDUp|8m4q6rfi@t+5*n?G=?~aC0V{|ry8VJZcx}d%q=0rKaQcXs)!F}!z5yeV z*ex+Cv74}cv1Tit?G?KTGa|{yM2OGQ=l7$Is70us(pb%td#x_%-P4v;vwF5Ywzv>{ z^*|hHrLcC!l#Kc9iQM~>IShEIZ$AAQxg>~8lvX^VO!xT-kwiXC$;n||=`A!PS;H;T z#zMWikUC5WQD0w(>V$KKBx)_cf9%=Yc!m4@%N$?$o62eXf*G5cw!K6Ww*t8;lbvHx z&IM8T{PKs9%+avPGx?CQ9zixiyPlpA^G7|Bev1iha618Eb$W;Gg;qPaa5QS$f=C%` zUOx_2isvm0jFyOAaa_sJyH$2-=DyU^cpDh(z8T(7t@4w-+&9jQ(;P8u4K%~JKG8(% zA18Od>wO{8mXcv3j}qAv>(ozR=DjC`JI&AB*5Eg`AVw^^^`wP=-8%V9Gsxd-)F(xf zqM3JjA(-ft8aRSc=sP=1&BxU}zrEdFL68wxqYxgtgVY6K1a;z#(S>*|E%q8#xCDH% z*Xjg9 zCas5tUr8T7r}f@}nY5i(qvS3ugjczdQM<9uQrGKDhDsm(MpW)nVHeMgfZ-)D+Fj^< zN4xVE5uADlWhVuda@=E$;qxCe(3!)n6gavCM|nEX)W=uqaVyQ{{5|vE1dqzd?8DJy z>l1cw@=W3d9``?}HNuqk<7Ayx^sDjL=LBx=vtDyJnHajk7gDJkRPfdJ>dzPNazoUZ z7xIHAD<70|kS#RyFNFFdMe-|@rb4@j0nDe<-L8>Aq&FOn;^FUaJ^%iOHomwoPH;y7 z^n(#Ej`lt1ZG3DW-#0oBqD-Y&-_0iexMJ6j?Zt=wu6d`XE)cDcnxvJ-&~6{2qy2jD zj375LhW_bbmXN_lZmsLVYF)e+oe_mYmg!kui-g=&Af1Qfb@(L?cN z+k=YbOW@A=LlvqpFeei@%QivG)2AHZV70B+PcO9V-x>Cryp)*3jd)}><*Jwnk zw+?WG(osLj_redQt%YHb+bBYk1nllE%v=#8ppZU~PYq6Q2@jP7w&qtn2EyBR#>a+YF}G|!fZ=@SLr~UL zG#Q~Za*7J|I}PT~O~fCI+|u>O@$kUE4f6K6YRtSfZ>lxd#@ZE2Vs>e9%8hVwk1$`N zqf3drPQpY9B9uJ}jgi!P%y;!*h(RZthQTuCl=Wz%;ZOqo7$L|$=sl?njiei3nZ(y=lL3=cvcbiC1dnOkA z80rbw;NKlj*RmE0ghH3ZV|k{bp5o1z1)FR$hDrIRXir=)LU6yjH3dKKnZX^42-vF4zY1ZD(V>OsZ2H^S6KS7C+xd*R@zqM%KpKiOjp^~Kz0dcitnm$LzRMk0)c$FH|UK&E!zdj(sz z0Ta5_5x45=kXL20*!r=&BG}pZ3Vu3I@L648-S8Cqa;wULpEUYxw_${6!YkA4;=OJ{ zCBnH@d#aA%C}ezqg#Hn;KVWN%lon-2GgE8(Z%DN>6<<9Po^U9!D~ME%19-#?0o67A zJ$uQSkj(vR(=pYR*e^av;NajfD%`zwNQqU6LDfNl?Z88_*8B9Rq{5n+)3pXOt0`7b zBE%*UqA&4;A;Unw{diZR-2hXA;)=gncX&OnZH%ur^WuYVA#UrI(Dz)Njtk}}A5y%Xp=@2FaHzq{epajXt1D{N7Q4>2QAs6W?f zf;*ZJ{Dh?!nUtYjU zcNbcst6=JdhGPe717<(oU*&$&`eC%iht%A7^J#d;G<4x62;J2?4WC`X!0CKhw0gjB zUX@pITtk{GH1dx?{9j!YK@M1E=dGDpF(BMDJ`N${?azD`8`iotF|gDTJpsJN1uB*7 zS1Dyjx3*Q2vfARQuh`b&kJQe|cJ4E4f(Dy7685vF8$7eg(X7L$%h2T|KswIM@F-CLx5-uqEPE+V>SbF9Z%0?ZWJzNL2uJ}CnHH*J81Pg z=oKJiYzA8HJ~#skdmMZoji2_2WJ*Bhx-k9L`0!{3+k$T$*TUz;ZvV|eP+u=w_CR{QdLF2`En9hL%8^D=7XC4ilj0Pn0NidE}v zw2o_eHHZuBMzrk5kTfOFo7{Qj)+^&MS9s;K6C^(nj61S?dtHWmF6*1w7Xb17_q5l& z1)#^c`s~ymh_a1Z1%RJsx7$QC0q9W+1@w>N;^P+z9#-jQ%EcRcV&IkpbC0)j&p7Wx zJ73_?V-v9!A-S#G`prQMF*k@G*4=*=^O}D%&(o~RvW1Ep+J6pAeXs$(7NA3AmpQ)$ zSS_=skJX1Ex&nWq9K9hr)8Sd@PlPcH5Vyitb$oImYFiLj$w9~+A%|GjY zW%KK|ocaDFm!mNT1Sc0)lWCPFj_~-X>KfJd|(0Tu3J`moeVM?g4BTP8AsfEtFqUmEf}N$@8t<17T{Bk?rGo?|lH6QI`alNl>kJV+wOd zCF~D=QRXiS&6BJQa_LUsWzPk0Eihng69C~1JaS&|HC`91SGexS`p@0}dxNDkqVq}Z zvRE!e4o-IS!yv#QYZ|r!Z=#0W?R?j+5nsBIQ^0zX!#I$o#P8FMB|v7|igDX29x+4@ zJA>5<)1H$dv9FJz&W(7^liQVSWkp330Qb4ogQt!e;|z?~gsw07odG;8Op(N{J8aqs z_^z$Ob6$i&bZUvk=_B2Fx(&mhLx>2t0rmlXQ`30KXxFCkJz~MvE1B$d#J}seUqYt4 zN7a*T7t>g->&wOyrI_DU9*-@I$qXGWJN_ZBR(rn0rk@XR5jw{;2w;5ya4&u=Mbz_A zrA{{B${`K=7(i5RM|-fS7u++?>Q-4Jz6d7g=XTsybQ}Dvq$JW_VtX2Jn`z#PxhgV` zP(h&2xRz=86V5!LwxEglxhR#G-yVBbht1NfdIi-GRtachll(q>IXBZ-GQjs?-$9wigsj$9W}dzKH-n&mRx-?@b0h z2)QvcVO4~maOgLaoVH~&vxN@J9z(*rRaPN3lJ;F;X!x;|i9(vg{&G_$mUFPZB4cN%IecrziInUjS7hX3Iy=;Ar5#(VcG!yIM!pl z(@em;2@)m66Bf0C0W6pjxI)J%S~h)>Kea6&{f_IJ+(J#lYJXNmiFk#W4`gfRK5qeM zS@iOZ(WDBw1o)x45GI&Ui=35a`a-tnu~(TFdvh(~FqeG2DTu}uQnlMmVv!8==J0kk zeEPAW-tGJb5+Bt80EsF}m^KlK?#ywSM388UoSADnYenAjD7g1d3D2eb;^SC@u5V3l zGXC^zZq(Al!kYoF50QX!{O&=AijUR}{93RQ9QoHjrxn~@3on`h07|oY;G=&xm>!d0 zrQI7H92~S!6FLNNbDt|fu9^uj$lkf7o`5f9*GPrEj{XbE;A!2V-|7H$G?jvFK^_zwq_IVgCwDNqf8 zX%G3d$y2i%jFaRBl5}?4hOlCLT9w|W%W}By-)1YqYo+DoyfS+rVA6IW`=flv`D_tBU4HLxYXoC z=6l}W+1(U`IfRVfN$`-(%Y7dtR~QOkYwo3l18B9 z^u-sxFj8|=T=wR$po29~?B?MPwDD|rVg^w{-T#m>2!U^n!?#MszYxT+NqKoJeNOIY zd;nM&kDG}+Q4iVC>7q(p=dgA1*j(0Rk$EHo^ass>aGF{j5+Z)O_P@UHubbg}inWH% zFXcrs=R{XrU`{$vSJQ&i(;+|1@gU;&yCcSWM|dkOS83>dqi^V4Kg72#J9;F*Nf&H` z_|z3RRRR@B>pCb|N1g%MeM-8pg8b#i(=#( zrH85bQ942ZGbbMh@ThCl?p=wZ3*f#{UL{AcEWGqArGAg?vl{fczJSHc@J8RYxuz~} z6M!Iy&InSbf+W$>H;NsKK9FWe3aGzbEBw%vlDeOYuY8WqpGTqpSj)O!hQ8@umF9}f|`U)QvVSnfb~U`GkWxa%0|U*yWX91p!g2jg)^o+F7O{86UJOAQnkM@*yy>*smRq$JyN->{C&atMJ2>@c zCfbDl1xTuCK2z z^^BTDeWt_a=*hE(u!)URE(cb`n++z7xYCb81?V?&=>(kA-d6y1C>5G!!>jcl@!BFd zj7iTEAJ9qt`9VitKrudg7BZ@MaRW8Vr{G?@p!sMl?!=pLxkv9ifVcEf{VkUp;(YbC z1X-%svgkB+ByIAjapQsRm(NZc$7PjG0x)W=F*GhsCO?@NRwY*6Z^Nw_mmfP>u9KF1|<&3nmNIL!WQ^co3=CW zra&cbf!sMbKo#uXr|pB%f&Na25&ebXhTZ#tLhNX#l{fKQG3@%Az#ioxjd1K#MgLNj zivqn0t|fHzFwpgLPZ%?iQU6l4cE0pF?Q8tWxT)Sz@=gAk6ZuJX_OWX&g}1grLaGoP zykd>b_y4AQSa;z&q4zuxip-p$)$&;KVHyO-lZ9Y zb|$~DD`h)L?Ahb8BkZ{Uz|t+2DL?qnvEN=2G~fi-okQmKn}qfE66q(7_PqPUPR6;NI`Cnr7{cBl&mVFVUnLT;-DvV2Ru$>fuZoxK6FUz zCOi4iwNl;~z3j})HxP|v>;22s6yYKO+?!zgm)3w%^!X`TkP$p5f?zwMyM zb!2k#|8H?c9S{BC56GA>1%mbcExSfVJ4CWj-P&{vNBPR{A$t_iDyr%as~K^Z{rE2G z_KCIfEDaU8`MCkM6X|lv=?E6!BbvN-8Dn8o=SVg5>*7;z7mi~#d+T%)3$1qtHPJ$x z>(_$<0Q!U{20s7UtTOs?_CpPdnmj!o0du<{Ps5&0Nae7?A4kKZ9=(Lv$Zk{K5H^#! z70T!*N=u48qKx(PId}*NWrpbl$e`y#Gzx_#Nio0Bwt3$#VYxuqMMZHX$-yM8HI2%gmY_~_!Zp4`Ug*Z9idHA=j2B6iv0{r+( z3FZqrk6{(b2dqcU1d}BCU%)x;tj!_2?0*r(v}o&)rJYOk5b6_l8NVNBQG=z$H24Bg zCq>Z5vGTqVNd+Z`+nMo?{7X99__G|5Ju02TrV}{_%0C64!UTk3;~lr|C-U;3&*0B* z0o*36+b|mX`f|9RhH^vCywG9=5GeKjFZevg$bunUR>R}U zF&FQp80hf!Ep{osTd9H~={`RLPD#REqqlvZUnu?*95Ttv@a(}ow2MFyGqdcW!NC}b z6ol;zm&Tvz{H5AG){(o05BANF?%#LgpCI<5NcCgnmKTY07jW&Du=%@b75(Z4u(yl9 zXf6NDmp>+`RjN*sGDN0w zy_g%EVs)lp<%Q2)=Bj*Gcz-*@Behy`Zz%?Kd|&$e*su$#1$o&b)z83;Fvuiy&wQn((^ zjc$i42$=weY5@piUkAH_gPTz?@OGx$H+wnd%W*MMNfY20$(;dX`Uz8T{zJQ{VK>#6 zq5vRsY{Tkh?{s|yYF}sZo+j|wekFHYO-=g#i}ff%LQr;kxWCz%6;e{P6Hf5}O)>S+ z8ehe>2KY&WE7xx1%{BPS9#hIzK#%~Q)58Z5bJC& zsd@*HT_C9z$=$bU!Q4-IQcZtte{%wn$z)+S*J+h7Hd2!-D*AdpF4c_%4{;j>$Q_pkO)dQl?U>&t6L*;&olst>}ZocFtq`a)ef z6C=x$IE+GqNqM@#(OuRF7x)y%+HZK6f!xD+z8joPQ?ZeTUfg;VdM3^*;I??7?5F0i zSm-QOui!9=9sFq@9SYl{h_bzxw_Lg(a#Dfh+5+21g$9mqC)^}?bk7l%?&|^=5@STQ zqj#M5LA;Qh&xxJdx&=J-;4EJ>?EY|6*%~ClV^zqhlf7m1rK;9alkKmzKP#g7@nZ_ME$L|P)5vS)M``bQ zk8;>Hn&($w3$HzDD#`vyQl>)7paZI=NMI-q^TlmcKq9y29~;_8v=6{0z7W3L7q*NY z`6L+#K^`Cda+}>@k^->q^~XlQj}yFx-jYjr+?V9I&gcZP4pn|3zf|7sC+1nd8VX6pHXyaIVJ@I)2T6 zaWJsJ)lvG}=Zcg=LB-6+KyCF-?hX((LGu$-V5{OWUrS=5_~3+|v9bR1XEr2KjF9NQ zdd*uc^ao+?fx@?WkFVdgnb_7Qzeg=c`V2eyj3~Xd+D?85{E#d8{^+z>E?s zrS6mG`_6VV!z;kVY&8-p6rG-)#wdIcKocOO^~;{SI0XEoNd&;I?eRW7y15RhdPpbY z6K2_H!ycP3tP_1_Plgl?Povgo|5PS=sQ9M~CjtX0jsd6dL*XEF@BjqQ$HT(`B$l=} zZDtrv&BL`fZ(x0PZfDFIMG`t|kDJ)$tyoH&jLz(%-X+@f%aF&>B;krCQ@Wj7(qb0H z!>&suBT6o9lyPoUk|6TCH~DxG%R$Tly{xc1BG;FES=($T_qUG+B5 z8H;jV(ipex^x|gg?+z}2$=2>RlUk;E)!fCJQ0YnFEzGT8tC(3{UM>qaHWJ6kJ7ehR zH2||OD4nvUP$f80^9m3dK8v8$$dwAXJ0h0n`u4Xpo=)IS^EvxhAf0P~&g()F$^=I= zt-J32NU$y?Ce&P4ihg6aV|;vkh=4 zq=ZPvxesJq##7m}etEtJIH*zXwnIAzUh5z0P|K6?FN1VC$e*5B8^~%QhC;iJyjirX z9yd?wH~2sRC0Fy?w{ILXMbsLxNzcR+=0hLnSuMB}gQ;whqZMEo`M9(Wpmu*ZNc+o7 zjx|gfkR99Xhlh6`q!rL8%AmjP=3Pk$I9m|X#yZ!JLQ;p4P~5)E<#IcF)SaVN^9$M@ zuL@^V7os2C~_G%W62WJe|dK0v6MSs7+`pFuYY65!lXrb>q7<-v0fN2IK*F zfUc{zD6;x9%kI+|Ej_v)4A?Wsh4UD#5#CnXi4CKY_yo}wJ8>jFds*00Gp3@aiEG08 zGrq`afRkT#hi^^Rk~)w`MGC+j-hgu+nk{kKhC-?J+%(MTo`S+@ML70-0ldT+7KJK#>|${DU6xm(?Q zs73)oCWQkwr-wyt^?z)g1yGc2`}P45mXcjSQetVOq>*k^IusBA>F!#PX6aH;LL>zN z0qI_l25F>Ix?}0a@80KmpZLG;H{Y@jEYRe?%2)sjjYEXsLS2nnD6y zpkN7pb8)qRa|v;4pOjhPetT0M6<@`?VJ_*^dL> z@9x0y==A|^ju>o2OEC6K4j4Rhq)XHPEeTL$t3H^Irr^uY!!tkVTy%{-0#09kE<#gJ zWjOvcLo5x=W5BgtCLk!-c^S^Y(WNlD7&i^NkCJ;>Y{3rI$uuwtDQOkING-uL=kQ25 z!r1^VbW}PboaVTNHZYltrv4fl{`kY?;(bTcX!E68FA1w5Ix0y&pS3vGl{V~o*kwE+ zv9KlIEo=L$L=HWonVj7m9WCCBi-mU~Nf7$ERL3TY)OKQ=SeRrUK?^Qd^xd-XHvyBY z{@2QhVVq}9fXb|&(e>9xl0?BEqE;t5s_sC-xnyHScQN4;o;yq<%N2&?ly4_4r{QK5PH;=F7^WKThHQ0yog#i9r$N6xwq%A;dt z-7P`K{AA!cH};3T5)XbCKaNz)04xO7du8Sn7+MV$(ft{X)~?A4PoJu=RD=fkT&{Mz z*z~BT3UcBSg785!c9j9302ab*w2L}?=VhRZ8re#OK_r7^YJUBI;tmF;47f|v3;P1L z5Zn^Y!?1zGW>sS$#0uwKiJ{aQ99hn@Oszz_-wkPM8;KGH=A%W zSC8>(v<~E!1a#5&hybfwz6^%XhKW!2zv_LNFL6*ktl{8bY*=)de>*Wk8Mw9^iwt=& z{l9$T){v2c0kn>BDR}qN62?4FI37p1{hoQ#m&iKM*xJJ>gPR*Ap45EH$xD z$=sVDnP?tP7+vUM6+G`l9IE!RBlz5rQ*n2I8VRRBmGbD6)M{&_b4{rWHntrbK#$I-Ef zo=(jRQHMdl=FoN@3^i++YU)a?hAsrWZ4UPP8Gm45MLP^~&5AHLaA-;(qsP9eRBUjF zW=c9=Hjh_Cgn^;2&Y^>M-XtWwlKD_HG3E*FTFdf6FelWN%O6kvPbxu70Y_t~TNp|+&0EdQr*R*a; zhQ{^j_rWJg5mE)f{mLewQN;o{7Xt`&y?&GU%N``fmuMd#v^D=Y*rYIBAREOS!R@_3 zS<*iHZ7C3?D+Y#OyNj8@0)7EqCed(wu5L4ZtoP|k-}co(V!A(vN zN%ibQ)4)XNS;n`KIonPUpCL$v<4A_&DXz+%wX6~B7b6Aiw?vbh9wyQG>$KHH`zwes z?mOH?ti9;A5K3;X9Y`QS92X`dA};*5Yy-^sr1MoIbzV6)<%;TZy@ zW-9r3HfpZtH0AP>UMGP%eI6)NOw;5ZVPr`u;77&aRC?ud!7LV`mt}acM)G= zPe#cqO9i7JW?sSqs%-QA${a0()8+_{8yAgGh9F$KN0(+|PZjzer`FM7T9VBqQ*nPg zm^L;9IdOrVX{{yM`0Lc)?*;o&ko9gNyIaW}xemIH;?LUl@4H*aU4?p*a?kU@ta+Mb zT(g>#F}CJsWeP5W*kogxR5JP$m zxP4-7=ypm|$tTE7h?U|&OMSw~%mZ`dy6Ig1rE9uYI)x$Z);oc@))@#gLl`uY`^Tzg z-SoDy$Te6s{P{`{u`hj4?GOM8p%8X8^DAk(wBbnDi#i2sA;hQQfnCH)>2#Mc37Ob8 zheM>lj2C;wdzd$BGv&nh1XkmF%YQCAqlfXnKl_{{yJ7r;Y*`MOg>U-$UdY;#J)om+ zl$J`DY?RjX4VMamyhUnV6Hq<4O|Is*Lp!*&?{o0&+)46GNh{YmIC=ip!j;QpK$lQj zhoAQXg$bYW)Ax{T@<5COOvnNN9Evl5a@kc5D^MKJPf4zN0?8R`{sKBLTl;V5WZ9cK z#$F52JbMh43M%q>dGg+zNoE?^TBt6+Xe5LMR2B>b77gyJyok5p7vOh**rA~|$EL8j zIx;BkO!}I7pFu~|;Hjkqj0f5Yd&Mvfa9+|Mk<)`r-2x-|3G4g3eu7nyO|7XtGr{QT zBIHXdA{kdn$3v}c;g^`L3Pnnkzg#Ks&Z6H8oEyhFCH8NmmeF4#mqgf3Ar;}(K1Cq4 z=)t?0$GQowKgKhD%4Oz(Mp2}M#;TlZGuP(TI3qe<$c8;e-K-)-7#{OQj~P|TL~o)F zr*)cnE23iTY2JlEm(Ti2n%7#2c&O{*vkIodJ`12ZDp~vZy2BxV>S@ErT`@KUw|9|_ zz+XkhG1&lYqD1e-gJ9&*hv5FsIQ-s_AS55cp5=fhWd~R})Zg0$hnH@9qqTp>>h30y|9o2_8Y2R5~qebBHTQQBaA?z9%t5^(a^4hueOexM93k-2g;2 z-sIUgmrb|JrMr^rAGq4c6JCv6{IKmYsq0KH;r#88Z2Q2k#I;N&rc}-Q4`+jCXq0Z7bCMn#!23hU-AbB!So8r@X)FRIy{+e@4fNJjX^;96aLB z$j-ZRUnAdoy^^g$pAVft`#)!M4`70QbM0pNm4j^> zkf<#2LYEp!KSi4B=f>uar1AXe%+3K0`KQFgRUi_&0Nv%Fdk)2Zdz*f{{YWyv{x|AJ z=9PUIm#5x?xKEPT+a`ZVsFJFh28l_(H6Xc=>#7S2f2<+XLbjTw-BUbau4AxOoQ}x%iaTHY z$_eD4VgWEHnzNaK=P@pB44+_6SBLQ-c#Ff~!+&*OfI@;5AS6+A4DnNyjN}=VO22jHVb-fIT(4YhCB8XWqLl8wOBY+F{6sO_MI*n^_v`-^fRV@s>}UCK zpBM~A7JTNVSLedKPWk$(Q;TaED6w;S$}DfVV!+P8m4wjF5Ga}Tb-i}5a&_0^n@X&} zyaHb@iivP>%zG=cHG;4HuN^W|2viycKoEKX(Il4LiG~XX!qbbeSA>Z5NZp1SyO15i z$`rWqoS0IM!m!@W`a0lf)gXPHo?s&V#SZyfTimCDm79k00@6Fq`!tvG@Fg-bQ~l>b z=9V3?`hP$p{wio+3IztL)Z9Io=D16jJ8=ZasY0*o2Y;eBV$gZCdkiIo;mi=CWzSQhTJgYJ#~B&SD78>HE&fS>A$>XE_I zSwGU9!DCyW3u9fde8SGl%rtYa3L87|DGGl9TcN{fVPP-~DHARks}k|=#1@U-ko~v4 z7I3a38($HQ-du@iPU&C+n_|qFw$Ow$oQ2B_NrnZdL)CCF1hcVPi4+|P1A|@n zYbxmU^Qj(=VRm#Gg-d2h+pg*2j)hqS@w~Xj2!;+kiYqddDwA9HZ>I8mO8z)$peCF0 z@AT#GH>)T$PTkx)Ke6;2v|!y}P#_e|i>51^voa7Qs~=7YVg@}Rw@$8EpWrFG2|G(s zR?6U3jK)z3QJIpB2Czx$^ayZB={Wd`#f_A>QCzYUV^Oh*2SyP~Lm1(@RZB)Zkz&7C z_k{fD@KpS9%G%Ky$kDJ;iP|uI-~B)JvA@3xR3%UhsCPcxPd_PyG>``tT5Co>!K1Wh z<#Hg)z97QF_vDaxuRB0@G^m3PL%I$I?35#W3{fL;IOEtv;`~(sL%Dbns{W z;_p{&a^P#Y@6mQS;{;&_D}x#1c^q(^Gkr(|WDL&Eq5UIxV`^)F18;76VKX?1;2?a- zg@4>*afO)L7aSVYEqhS^7JQQKgpZ-2k4Gv`iAj}ccVOamfA{F{U^waQhZpoS0VW*> z1q&NL(Twth8gC};IbHb$`Onq=Zu|i~0QD)LQ=)x(Q@AzE(gA8G_!f17_AHW8>hSfC zw1Zpc!3T-@&~xNrvM2>oV*y8UE7e}!K0L`(dI$$YJzSGSEU1+S&)#9pS2nuhoL4M_fb1husct(mi`(hO0v5{ zUd~_gH=N_I-Gl0;0Y%GbhtSY+W^_2n5X3xuhm|A(L%sG?3?7y9E;e&+k%^A_U-L!S=7Z_HDORpCDQ>vi9ps&3%x^)(*uLdFxGf zo`}l;PCH%l9Q#YwBP;YV;J_OUhG8SdqccyjZ4e(zx9+Y@)z#aAMXTmQGSkNQ(G zO@O<;U{Zg=AB!d=hEA8RXW@jnBlC2V!DZn#2VqTOdi=;@4NPHPAf-1sl#VB(7s>YYKjGKER!zzjr?= zJZ%PBKxjJARItpTQ>7}9Gv);`=GTi8yxp;yFH>LX4)}`%S}lro!R~3Bj^C|6cYgaY z>}_&nuPSLT9#Xwr3&`@@S=R=5IXge__dpHnm>T`W`r{l1Co5j z!kKu)i222XjWyADN=IcXtW3+xwUh6-sP0po4LS3$lHeYyO%fC_+bv3TQ(})#{i3~0D#raf@U{MB zp}kclv^dy4*m&7)CPII*JJh(E?unRVpHCZUqxi4WX&W6|IW!xxz*eq9c?t}$sl_HK z26)X?`uc|eb`OVRNdl=C!n7x+zcKsgX8pf|pg*tRd=Av*yY2V<#0p{t_DL|>P!>}_kd@IEUz(?HSSFh8H$=**Z=zqs$JQ;S zGEQFY5l4V^mU&rfaBWjVtMGp2bzmJfc%5dOW#SqV`HCak2l|=1_6;ISX7vO2|8(Qk z=Ye(p{_JMc^K%r<OEvY#moM#y4?|85j|e9t zKe);$r=wTT=PwGfhD+{{kCS-Z$mmiI^<2w%wdaa;o~JNifL*1~mOj><&;A_yp|-d8 z9G@Yyg@|uG-9c;O@5t-#Hy`AI5X^k8#E<7?JARx%+i(a08CSLf5gZJsHNmW7jmJ~v zrFBd+ORd{_OVfIZ~kbZws+B7!AvOAE4-cY zyuFGJ_g;Hd`-;Zv9V$VDuTaUVwD?P++YkZ+f#&gIqh5~`L;?Zc@3ERt&gNMw#1p01 zR9Cs8%859<#}bz9Jd%TBDl1c5q{GbI|C3^d1KckweKjrdqhaN*a5Q=>6BUJPoCyam zr*`Tl5w=^B3bDScmV>V4oA%1L&8h~*xk&l_z|3@8F^tJDM!L!-6;JCcfTYI28P-3*x&zP1 znINn(=w6&%hB_N|=VPauG-l&g<@x-Rf&3@_4LpPbMv=ohGRmiP3$6DaU4Js|40;0L z&7L4!QVT;UXT`F-muB27Dh+&)uu<2jak=ha?N8WS`Z08Ra=OLiocU^|Z`F184Q>{AdD%7TBNV@p3%%WCI0}{_&xlnM#`X3Vw>u)b7^G6k{XF${g<{c6ii-j7TEk- zi}oRzjQ^_~%jW{lgsMm^GK@{>3R6wgH6mi58ye$mDCh$}RWEV^9pBZ0Xn?4~&Z=O4Y+-?#DC zAYk=>gkaD zqcf59bd^QA)>Z7SL?vKWFTcsVc6#J9-R=rAOI}fSH}2zAx$G7*@vBO~&qiP0!N#x7 z#Y>#@X6Tx(XHW=(h8Xm;s)f3`2 z@B9$zx8UCKOQqI-f_N(1Ik{+|Uu;>u-zng+Qf=`$)QzK<{r|3mz+1)FC&bRbQyVN^ z1!969evAYi@62;^+0mhy7qKrXGzgARwr2pN5_DaCql)ctFtmNaeljE*&kJ9?99dYb zE^_|RczsDF=ydFqT6Jz;NK53g^0K^pi;BvwB|Bssj3Ha{vaYvIRQ87lSpJ^(|au3hUDoC9WtX zMo(dP4bWm8vdDxkFS4QP${ zl}#%<3^RnFdC9_1Ww8zcfwCdC^mr2|7ovuScZsxwJqD92j()72Bsiq;HZcx#(ET(s zUUbKRWE>_fyiHDr7 z$j~uy;h%gk?s|2Ty+2u1=DKc2(035+4~;-$|j-lzEcD3$Huek4)g{%dw(d zxRQW$$CktwrMlLQLOe}iHkZr7Q2A3-`RCyR*o6W7!8NHBS{gl=M#iAFTZhp1ZcASE zlPne^{ko%82LtKvdUY3}=mTB%L>gK!#;XQK>6Ruz< za6n{L`U9mh)BG6b?3oR(`SpiCaatEaR5V+6-k%YhW(5;KxzM zU%ZPdpd%bL_Q zgk^CtAOCLzgje#UKy8ZJbJiFT*nRe0O|UB+lG!F2s;Su2ejfGe{k z@e`b}<7>D+?A=A7!bpO@0gG*N^)A^f@UoKg!N%vfX}~68qm`#xg(8jtCM#OGtZ*^8 z9F!7BRpP?z3Q*p^ezV_LL+yiXaZUmMmf))2$WHbjQ4!J*qg)?FL4B44di$FIw;0fn z+O@datuZ=Qc!{!)e|GFi2efYhNcBz8)FYN&A^A!MVd+d#6 zfy=0hBsbH8h^6~o{+<#gL=%rZ{5?3gs`(@fljvChrfdKxE1bj{o#Z_;T}Mz*Ha-2N zmWFm@WPkxWp8wtVUo}b4KRiU26M3@F^d6Jw30>o_n{~c@amUlsQ+v;=dHqvSWK)Bv z=uuyv<*Bdhm2ZaEX+-l8AgUnn&6c215}I|A%~5bT1EhXj!V<~!3O)dp>)wqdU_zP$ zjD0h0SQMSHb=NI~ehc$Q>1S|n)b6PNz%BTF4)^lTw>!xafOG9a3lzEn5b}QGdi8NH ze-S^Q6q^P7>x(`GJi1=rT{;l(opQDlX=p-1fPN6$gs@3Xz} zI8w~`dQH{;Ty^S>K<+U*6P+(9kCR+Ftb+C|AA&Iax^p61Q3z9`MR;2ga#J2*PzpP} z?iMP;jiVC_{F=5A#`AETl>R=q*Dc9s?Www%^ui*ai(FYNXV2!GCVvCdwlFr&8gVj+ zI-VOQPtY-75aWea>Xi`)PBzcMmSgq+|G01MUfrU^QaHmbK)55U0Xp^#z{nzD%xIJ* zZ&7Sw8Sqq-ZG8gze-410X_5H`AS)0owE>R!Rxe^Kt1#a!)aaI$`FDymn_xy(Q2;yU zd3&*ry^r_JbNcfRiuFae6iq8B!Es_@YYhmMoEa3NOWUqVH4^K?6*zvG6|4a^WlH!5 z01*ZF-2taY9kHr#3u=%^7ELRmNhi=NU1L^D-=P6)*UeU!$D7hS@@_3y$|#7TXUBb= zT1S8vaUp1rt+8{I@!JQ18=6gd9Fy0ncx@mQ*-Sh@xPW+-@Fa(g}6ubwsfPM0YDkWPtG`F6&V3 zCosOOFsFoENCnKkHH$K6c8_b7&M1;~lFcpkOC=d7Nj2YqTEla`|s1gDFDgl0z> z(&-H4h}V(XixwGhsnR)*nYt|5Fp+jF#44;z4WFVt2xY7dmxtYh=#q0YBA$RVkpX3L zUhrhwZ*`q0yxyM9_si$P9p&6&`oLZyWS=&TIs>&van4D&YeY zwhNRSw*_m-nV;uN&cR|C9MtM1M=Qq*r~WBVW$N172QeT+OpiCtw0Why+9XBP=)*qM&xKCne11a~bu~ zb(tNpuke@Re55SR`iH+W1-Z<5oZ}mZ?0LofTY>xN4j+3|ZlHEUw1zNrd@4bX*?>~X z9HpH_GHZutNWTU74CVI^Js*rcR5ZE_)~LEPa`Y%XgmYv45ZJ$)dNQ$bHQ`>mXy5-S zN=2FMR?K-W-p=c}FtAWsFr-7_>SX}%HSC5Z!-v<-tF6!sU{~UI?E_Ngwo}05On^b8 zWb=fBdr5w&Gkq}9tBCHJ?kBSTVl7oRC0`L=DGyXMp9)8lFTaHvLYdzwU(=rpM3}z@ zX>%mdpF#{(8HITi45QJxSrHjX)@)V&vOfHGk!DMfD`3qMQ+bYRD25zpVX0AW%L?nQ z^uvgir`HD8I@Z_sHr*?(-U>}w%^Udtmyeuzm3XZ13wa>HiAk+ zNoR#Zb9c+Q180}eU)HyBOx$R_UJ}KnwRt%8EdZ$88@>m0( zg+!jm=xZ!D3P)HD0^Yy2crG!&@G)r`!#lP`WeUQI5<&$WSG>+&$W(G)bR?Hn-Hb+C zP7ZCPL(Mfa1Lc;D=I<Noe#2R0Nei zJy}Tr<0}s(3%>)6|8b@ycm=NT9Q+?rbx@W+Ia^}2w`0d9% zHKxSGVWG=Q;H(yd(WlraJ}9%p*$11@LH!m2Wu>eTuQ|&4aNdO-e<<-`!h~DWX2t9i zC%Qr2gt;=}!5`c+aU4EaWRlA^fIp7!$7}h3$JE1c`c}6|fqtGSTi0=I0^tpM(NEL_ zAm@Fd;|Wvdz3w43Bs?JiIE&iO?;PyUehPI%$;nlxxVnR%; zQCXHzY@nPU5OLoQqG?A}tk!hnP2Io0?WbK^=C{z_Mu4x>^yE6IpMdAP;gJ&mfj>An z{Ho34dC-8ziTE^a1zG?0w!{tR`<(|fHkAhXa~1=?ObouSFp`y2KWsysb(s5Y>gZ?K znFd$Z?b{Z#moo*4yP6J^(WA$W00n@4_V?V9cAe&9JN}_ zh(Y#K&Ut*HUmgbKB)B{ufFU#UU@er0neN4cuNLdUGMMUOOFdvI2Jk zO0Be-)SQB*K$RHZsTg35iQ5iB#K3S9J9u~<9~9Eg(eEv~%lYcZb_zeqT@$kDI;G&g zDa{-PygZp{xasO*UNJ1+59pz%Dd%uc9mmeMj?Me;KZaRN<@ipsKzUs_UzTSM9EicF zEZGZ-|H+F-snEUtj)tr>D%C%zPWQ9wJ6P306poE4?#K{wN8JSH4FV$Twvsu!0}y?6 zhl^2|(Mlm_y{=IqT*iVJq-;o0A-HJgSn<+F{`cX;Y*pM!qRz=U(Mb@2qwU0jfrk?L z)t={fDj+lMRpM^s2LThFW-)1j>nKZb3Eu=??LY?6!VsGKESw%h@|11!GP={3XArWr zgd;l>{fkX)V$dT6WV!)D$_^0eJV=a%sBHjVUyw-z z4$o-Bm-F+|L9NN~nKl=8%!k{qWdRf6Dt#H^OVp5kAQiZ$a$@0E5N>6Lb1+2Y8mb7E z{%##+8=C8u=q(z`I-_~?+W!7bYvMNWxAnw#^~R^gtxY|)|6A(_+-ji8b0aOh2JBIN z$A-&bJV_yjXHyJPuc+5DB#)zTq+vv*eP4As;^v1ca!IZ=RcG-o1J?-;*ourMS1&7J ztig?}?P2&WR&Tj$+OY%VAINZ&^GwDlIbMN{^)s8f77SbRh@q2YiT2n_U+3;to`DF`x5g^NSE&5W1bVqS~PmH_xOJKydc?K0YG+4wzm;w<$|vWg=DuLD?a488Rn5 z{avE)K?uDqQ^cUjN8hE2*a^aH2dE#%(Gp+mxu!M!6Ml}1bXGG-8$N5Fl>^_p%dJAi zD32LSFPh#>u(#^t)%WV@`*4|}hbcyKyzMM+@{nrZ6l`KoBxX6;?!u<2QX|-}Pb*)Y_C3&UQ2&Lg3S6<*-@{JRdaH;0 z-1uL7(KbBx`RNy*mgCX`luq+G(ft+*J8=_kDW4w>mfwukPeTH6aVAy#if`Xl5;n}C zjl|_|n6^PPnp|Q<&h_Zf-VOG%n?Tk_R6k7ehmMxrR9+=8yZ+}mNZj;Y`N zdN2`fdoZD{lq$Nqe>BU$n^8c14m_I-bK&%`!E$ zS(tmHY?Ncmeq;i&yxYzzfa!usZE`M0?3}E-rU14@`~U}pTUP?(Zzp!o5;?ca?cKzt z{}Gl2DnJ13JU~yys(({WJv&7qJH^8`6)DV(Gd4 zxE#7JHS84*JW_99K}N-{W0q;6dx!jD0m#chaz|M5g|Jp}nqi;b)~Tdr;?>aF?p{Fg z3un=2+MNu{ahjnfkvAy~>t3|98;c=(mt9F0hj##~FIIiUJzLMzZ*yxU-#=}9_9Co3 z{Hc&_1o){iy9=5oMY#%)om= zc>FUU><)THPMFjLGo{o8J=wky@+PM zt_&|x7v60j>GO=d*h73n;EqIgXNA4CyDo?e~eQ4r|>JK0B8Vy zbjt~~J?bya9o4PnQ83#iMDMt5MrquxDIGumJDG@|y8(Yw3QO@6tbmmo>S zmVCrGC6LYe${!@jIlmpIeMpIu`(KZbeux9ukNmyL zf}6t19MZ4KZd^hmCpGUIxBYs(?oj61*qn+zNaOHD?>1xum}Ex}KJcAnX|Cv4jEIBA zq&nHXo=EJ_qpIF*DWvTvqp`Pq6r2~}>yS5Fc-CeaTdJfNLqBW+-xC?AkIm0xNsRFnHqr+2$+ znowwP*2*)2Yg`fGGpPuZ!CZm?qeZhCV0WMxA@v4#N`0v;3!LwZ#t{(vM}DYqU5ha5 znjV)#Zx{eOhhGIZk8IZT`NG_P#Lu&^zOsBD*F>IW;CdqY^5hS{_djVMoeJ;?e&(?0 z7Z5LeA%%7ToL$$W$RW)bxfzeo{Y{*^&9M+n`cN;{oT3E;xZ)Or=)s;;9EjU%7Jg*!MG2Vn7PA{jnkJsx+5IpV()E ztShG}l6zFhnS-3;K%rrr?D9F+1d)Y%JuS}UC+Hp>n!Ehr=J*}<5l$`af5PBD)E_B; zb)6+)WS%^DZSDRr_CZ*?GgP{30BSR-Qer>yfOD6)3&6cUZh3<>GcK8^IV|C;fSJuP zFV&7o|4xnKGDJ#VIn$8IQHaqotlgzVQ>iIBt}3mN;_G&C3y$`(h@%tZ7C;vHS2rYF z3N?D2985i)E~UK?!DSh_Mz&?{ruRIHx3RzG6yo{}4*?#v5{t{$c@8`PtD+=>3Yfd)eR-+XTDgMU`0cuTb+pzg@}| zKwpe}I+`y19Ep3M+EBa2^^3L)i07a!(MNuJ#ojv$bC|*Z0jG9nQ&sQ;KE~UsDH@0i zYcN@Cg!Bt$8;OUr$^9D_GFRh{g=&wdA2QwQQjH4j=j0Pq=;s@({uf{d_?`SHX-AB> zzslHEzIy8|FRf1AsLK~tG@#p?r<-zaoQ>bAY@``g62}^{VUjLB?n&%x73JY|S1t3K zAe*K6#+@z==$BbPjW{y&FH@w?1U&{u9O5nCSE)%Bm-w1%=S%kda|Qh+wcGFq7Vc$6 z-AfKBx`*0yMUx2?V8$NE(|9<6ZRBP9R+jShyX_ZW;&%a)@N8cSUvQ?(?~R5N|Kh4~ z7e0$VkguRLu9rm!Sp_&&;o?a4hPatyPxZ0sXGi9rrE1iP?JW^Z7Pn^7knXLrs$|*8 zQnOvYd*q8_j0asCR_y;Y2L4=QF{rlQ@}TiZG~Gj)$&tcthLivZEyo3Hif#k0D_Dl{ z;+F|Floc9)kK{f|VlzuUVjjY*XyRU+%m6YTxc=DpL=PBxXVjzJJ0RpNL@el~{>-d5 zRT1siQn%s{$SYqDys9zz z!7KF3G3g4?aYR--V9t){UZ%a+`;d`%j}~)!zvjX>_UM^*Y5KLrjTt`RaKmp^bNR7X z_g<0QcAqG#KBJ$yr43W4XU2thIZ0d5>%X=w@M8?h0u#fdma@r|9gHIhB4mb<+zB9y z^SV)=-%4=`M4Adh!T~p7au5rC8LS>N4MycG`CtdU%@VHMM7`zCp}#jy(O7-9bP(r! zW-<_;t2EnOjqcEGQz(l00UE3jYOW`3cSryn9&Rg3=$uEV8=i&x--SpWo4RwqSz=`O9_O}rmP>aCI2?_RV4TD_K<<(2$~J}-(>h7HB#v6%X4E^#`jF4WD9-J83F z@isyYBsE-Cv}1foW1k{C?i%fPky4|W@%p|v?frmwPWJzuUX=+!ePFm=&lB3uN-?-N zlFq|-G}_=XjLI4%8CC{nqyxhi{LRin=!~o~>^f!y5BP_QC7j%iM)0%@wkv&Dw-%;G z7L%MqRtRdUlat$s>wK)|eU`*MxjYfAZ_ui|xU=rByh%O&(K+|I#4wY`nZtWPXESkW zJxG{TkBF>FO+FUV3J#Fj+A2)rlc-DZ{@=}RB?oMFO6T#9m4nR6lhs3yP)`)>8!2AL z&SfXJOaGm&I=Kr^sTurCSJh!byqw!;F)r_rTym6=J)jy*z|33BkiBKmYzy6kOI+~0^R-R7ETjSmw?;c?< zK4a`bvh+_O*kF^02u5k@L#BMSzI31xSkKg(Sl=P>Z7|?8&`{gjy%(Z(?eb{po(7?Q zJCZ`sEkAWXDSS9AaDHteFnHEwf3sq?3zY58arSXLSeo!G&WBdQPOeFI+_N`R!WYk@ zQCIt+#;?n`4WQ4j&`2j$Tx7pX=Vv^#Rm71c{!bt9FO`i23RR^V3D%Ttr) zs;M*c(>ZT9ch$?SB)2L;$_Gm~_{VWD$898yL@_4pltxm5W{56B=q-~T|8hc1|LH-u z@znhvCX^w;^p5Y_?#<9$pZj$JDU_Ep2Qz+0?{=*trUj?do+F{C=Zx!sxZqqJh3l0? ziRJFz#Hm#YlSA1z*90L4XKcsS+3qZHTh>2NJO2u6^nqB<%(f}jq!PBia`z+VVr%;Y z#LFid8XaiK8>U@ZpZsO*T8Obq=xHk+gCyI}vQk`q+jA z3>iO7O&b*yz_6U(n4QwnjOX2#dVYNWj^U$4hkG(D9$1vYv5Dkmb6vy#|XesGw7 z9l586fH}`IW4xWp@j<9&ap~*X@xJJ^ley>h^v9)z3FS$5#c9G8Yl#mA>{^@Y8{yGr zNJgX3wwsWDE~mzM#2L{a;t!shHs4L|I$J)&Z}V{g8B@#?K%Tr9?N_Ar9Zds(Bzr89 z7f;U-&$S)rr|lA*&rV@5?U3=@HrV zQBzV_7Rbi7-D0EA}wjY4fD%+6|NyhTUCdy>Ifn6K}|BMb>&T` z<0@_5!0zhYo{5nQpma^=whnZ;-L<|b|G*ActB3=H7Va!*Zt+)Fzka8GnR2K`;c$mK z8REp^2i0smtv?;oEK9?!Ul|vlf2PP%7dZNittblD5%6~C$N(j52($`B_LIp^5bcE@lBn=ZnCg#U(qO$ zw%FFom`Ys3MDn<>tYK#=V*P2N6Q~JX z9?^FNQCg!nYbln89mu5%V3Hy603a{h+XJZigi6Y60bOG#?7n*9HEP1ZH}!^aSzxnP zUID9&w#Nt=V!?nBZ2f$9{6dlxQ}FGY}-9u&=(kT92j=QLL>M*FOK{p*-M z_h{|?y@02_zw0}(svX{Nojq3i+|}NEF}p6YjvA0hCskD5^Kfrn@^@VWz{L-~0Kk_6 zzNr39>s=Ed!FHYX{C;I{29S2L6pvoH8r^K^v}v-yiJP#&%1bzL>8QH&r(XbRShk32 zTB@A_Am{6Q8qh*!@=)UpP#P}Wi9-MzeJ~UTaLL9|sHZsqf3-)PaW2QI_=@}T0syYT zf$wRFfiRFc9VMHn0k(eF4lquj7MLEy=tH`^3ih}KaJH!Niv!dilg85BBEXT*#;cy_ z4{)U3?EwSB5>T@)0SZ{OC@|+Bn7nn}0hKxek~3Up`v)P@Ow1I%X^%$~sm`o{Lh&Mb zVz{-B4r+jzH2JdFsudNFb&SBclVj7xm#bE?Ch!)}r>7#pQK|xGS|ya1X7vHERmeb+ zx9oKpyfj$XA_zQ_KiO7>@Q+UXw~&S!;{$eFzN(}d081WvJud;PdRvRbOGq-a&-ri% z-^$jtSi%q7TUxuwFgU$gJa_vQo0z;k$?M(3gqh$%3xSXf*f|nes{Syp*>t3rT}Pwf zQ4Q?Yt#-GoT1Q);0C{S9v;NgJ@tI5Rx!!4M<5I`?p$p z$2*Rkz`(&{CLsV({pdRo2pX|}0K0IM@|i5v9#q><**?KcNseSLrb?_29zi{-jrxM$|h znKSdue)h9>1FnMw2SR}1-xUw;VU0Pzkv~wvY((43f;RC);u3$%`wVt%hX~_}g3j*~ zM=lbCu9&UjU(h2St_^)=b)n$1Hu%9m=WkUoH?`YCk5c4e7v3dhwx(Ag|1^H+Fh(PdmRe9ue%40141;3@FIYs=m4;Y8LV zP;E)U`u2iTh0Fc zR<)Q!<>E)93803u$USC|{7!SN%RAm47`I2d(SVp8P$2AIQv8h$?Y@Obqb&+0kLlf8 zW!xB=2+(oRsa>xx4bAAPOPKj2qhXx|P#s8VR`9lBVVF^=%|;B~aan!5y*EdcFB9{y zgu&fUUeQo_^+ES4Mi!Dcgj?IHr|^@34lfa=s82C?qWI%8njdFw9Ug&&_=ZMP6fdCb zczvK)fJ_)9VEcGMsw;#F_A&3_EUcrPkN6qgD;d-r?>Qfu^O#Ll=f`$-OP0YX(Is0h zAsAHWTHXf6cW0^Z^r0?RwU5i2hW`0O&H`=`eNwi$JucTnvYOeE`D z!ZZ1|8{-p_&mSDTIiaIElHO98MI!BWCqXzt(~aNR3OUGzPKtl^#}ar_xS*+YDZJ#y z!#?NrzXvG=QX6$-)ywpNnd|zMd+=cMR7@D(+2M)rJmq9Ui?fU;UXrnm9fQ9Se$9Vt zx;NfmXk8;E$#~b<@a)~EL0AywOwBFJN@+uGtE7+*Z%+5NR@Sahouua|looj8^ff+G zyv6#{7-+nIx~(&p{{*2YOCQPb{%esRgOu~@+PxezANOY1W&1#CQtESR6gbi!{?P!Tc#2mrA^Pp z$^j}#Jx|}fYzB57 zvz}{t6+7Ia+4Z-5;D*S3ZHHc9O-zAyx#-mIm8>t^$$p+!2aXzU!W-r<&N@yT zd99%na`()i$Ld4<)ap%d!bN51UZL6vgW6 z!x-b`2x;p%H0~XIcXQJ?{KP66L$V1-Jd}|Pc;bi~lFgx*Tq8|FU*6sB#@jobz`q&2 zVDkO21uXT3P1N|P=||3Vu8_is=#2(4pe)^uNqhY(-uO)^TA_X*K6SlXH*^f!=axO) z7PrO&`<<;~Hsx3{9o#hsJ~EDvKosz&k0s*^A1^dB#w}_TNkKQ@Vk!8Cgw3g9Fc71TMue(FlhCVlg~V4F3_1iCrrbI%~if!`XVpLLewE`m;qJ zbsQ!I1k3&Vh5^UU{Npjb5LWmM-n>0Aa-I!MGQqNg*)+jrzx_i&p)vAF0h0>e4N?VC ztW)EJ+msX`D2?~wv|IiDWBHae19dbLUqOq1>{rs#u^y%@gvW*@3f-r&oB)NB=Dmz~M>@Z1=?;IUrS=RlNcIB1uG)#N$s@L5_l``sCS6kk~ zcgEQioa$OM^3rL7y=?Aqs=1}|AQj|A_B zs5{vm4coh~#|<=2smxCgxnS+HSxT5_~c{gO4H6-lu3b0_fxe~ZD;*s z^ZWV=nbs+i9VbjyynZ7;J{aYwf~4H4Bt+LiH47t<-k?7~?OE zV(KW>=1-qTsqVzj;1W~rbaQf5$FZitWs$04&!neUZ{zKpbI`!}@m(BcAMXK_s~@e7_BAKWC+Nr6)p7y#qkE_X#Bie|*+SO3Vc(~KG3%^vwgka4$pgxy_;n(- z$HcUc{zDlU7F4v%{Pq`NAR>@%XhC1)^XG0J8dL#&|0VHiT6F42k4I7LU)BMy>S%iS z4bFI^%_#Sy@xs4lpcN?rV6|YO%#0_!+siC<`01K_)0f8d&N$WkF(2y9a1JcYyA|#p z-sOB0GwjY+ePwXN)LF-Wd?)?x#4^U)E!lcs!pjZ^JAo7J&wBQBo&=JWj8WTt(>9qp zG1gNL9S zOlJ1d5#j9N;kNzZ;dFQF#l3D}-)v!PQ{VIW+FXX+Z%R1UAPomyWW(lD|Qj47AT8rO4<;Wy7hH629cGIh{g zamb?zm1uJpHT!#XY2T3mWP|hW5NQTb_Pz}ZB43$UvhApG{O&6Ip>$xD@6>C6kMBj5 zhRIC36~+7XIGVNM?G?vLat>G36+KE}d{;+dtpCYW1tZJju{QX-4rC& zM6-d5rjY(UlvtxXOH2rl@?#8&}siook ziy&V##3=(BVoZPO1vLb~O9ud6-oyFN9nYZj$i={TmWTTM|0dgh?Uor7U`~|i=0*Mu zp8eZU;tGJOpHLK#{=2vS*<`^Bk1-&;`y(~ zbODZDo5UWm8doaT=Y>rrWo1>s;%We!f^Tq{Ir2ytyO<8zp)&Cec!66C|KpMo+!j7Q zz6oGQaq@}bo{}tDTwH~0QNJ+S_TCR?S=m|m)rj^bsg?K7-caF_?L{}QrH{&g+Bb?Y zo6Ai(OW{Kb@V{0wPOwUkcQj<^I>=lD>Z%jKx^c2{HFp*67XD}4t`evg==c~J8DU)p zzF+GPLMUIBn|J6#oU|=FO1IU~?@rD8$z5tk$_{-yGAA;&p&iUX`y{ax{g9)qq{M<) z;ht%a5&x!P4HaxexO!n?M5;=6Z?-{UP`(1_f3Lj+r2(pPm7-qG-YCw?~EJ#%ZvkMmHk^o zLVvRzL^d%Y$mbKM8<}K{r=ywDyHe+m*mUw!*l$>aT|Khm&q1PAh zNc)NF1PIR`b1de@`=|2kqAvX?Y+tp$O8{c0*m&(V&v$$8otwak05>*d|Gmp`6E9iJ z`r{8SsV%hZfTrR4R;gFjdhoYBK}HaYMh42+P4QRlX7qox0yw{KC$=R%k9?{**2|_=y}- zt&?E8p}mbv=iO+T<6twRiA2xydq$1HB{^j?JN$XA?)JijHi~7`E3pwa@6jxK#0<1xfx% zlz6ZbOiKY-kVriekCuz|J`*rG!fwfv$cDLN-Wv(ph|$8=nYDJ9kr;m)*|p^KzE!}! zy1*0Zu)Tn_7NzaiEkRq#3%kX_}f*Z2%df$@{;S5Y>Mim|87L@ zc+r3Wzw%;BHY#+07Ab)N^|lwU^my)}xm=e@0+KNw#zzg#4C2I&!k3xvE*KJJ5tQVd zwNU2+443DD)R63dR&Kb*SG;#i3X5s#m%!4UaRs&cB=gGC(O)X{e->kDFEEX`Zgv1S zVUa~l_}2435;)X?XaF*h?TKQ&xZy1z1Zh9KoHzsemLl%%-t+L^p8tyC6+^&EKRB12 zq41yIyt9Bj4Ut$PjUe$Y9RZqqV$l%=np45NIc=q)uQB(ZoyFrAqE4MJNehCW8lZsB zPN0OP-1)E7&I713Kbnk2KugQ`iuFqXq6ap~7v!Xy(?z)#JA`xyXlqxs13bqfzEE4f zOq$~VNxpmVL2Y$2Nl*SKljp$-U6QrCvIUS`6>o#N^I1~G7CiHuk|L-HcYkfK7j6A& zk&6)QfY|q5u0XqP4fI*ZIFdct|4b4Ik=c-cy5#|!jnh$-82?%8sl~uW>DY@eST`<^ z|40bR)0fbPsT19MD*t!SUV%pN|6ZR{4(gh~5osmp1GMF)1V6a~x?Cs?-Y>epN?P=L zHM{6I*A>uZKsi}S1%Dn#0J_YVKyCA1@hou3S%rVb42&h{bgOdYKb?l|OZMtT5YbNu zA~nItLXawYrw!fenfBq{|HJ}`-H>?I4yN+KpY08LK^+Jjj(7u$ayh`1dJ+h}mf`z| zmmnmN!vp=1dsKGizeFT#NH|6O(FZ>8wqhRSj-;Xg;OyU;q>Gyl3Ym>Ax}^+_9gU?tJga| zFov0Q5u%{Wf6th|&a`huwM2BSi}cy}`T1YU%F6Z-bU;}P4^pTzq$1D4XnQ56dxf8D z_C!;(+EnJP*NSET89Giml(SELkN3`Be5NIlNVv|TQjU6wwD9C9Jsq_7me7jS>tl+P zB<0x_$xRbK9-EkCd%D?5ZM=EEw2=ml89cSSY^ax=H#DaVAAzlu9d+05ft}EsHa$%d z&01%NnP_kX1na;LedrnMsUM1kS>qix=M4RPe8ofN-({c*y_bsg<>?#MVUl__wbHL3 zM$$jHI@tD4KdBqhXOrYUPVp+4CH-*qwJ`cY+q;PlI~34v@OCwOhJ7*K;V6~j$ymZc z>7SYtf`f4|Mf$Rop)#I(bl@i46VLONq*ibr5qN_s0+UtBOUgf$m95*(F1d)kz@I&* zcHi>a=)E?pu;-GRWiQE&D%UjI9N5U2{~FftL{c4`Mrai!(E<)0OO}JzmthjkV8DvK zsXo$mD{wW}1SKsM|B(>t6+rL3uDa;c-OJj5TQra#FKqjU1_eor5;luMa@|BSu@<)b zAnMU)f}Wx|9kuS!BSU4S`X$5u2ot;?GSqikQkYMBKl;m*&IjgHyE%4ySxO{+L_emR z-U(%pZK&~{e9TU{A869pF3rmy{LOzcVytZcVZ?v~xa;S1^-F~%C7)dM9P173k*yC1 z&l*Yvpz@9tFA=k*4;SI#ozeyJ0GAR1)P#kz$0i+xY-m1!erd5bBCwkp;dYDW{!3nY z+}N7}SbTJ7Z>8!@w~`L<*TSxvn1tI-1t;4iIi&7~t%ZM1-T~uAtH|uJ7+QFXqNd{y zB+Etb@gp=ZZ(WJPW4PMw+B*l-(E=zXGsFO<)2}>$hc$@0Wc-q|!SePB@?qCM1wL6P z5hBj*&+b*b8jDzrn3syG;x~|CMTcF7@^y2v})AR=vMq+4ZGkdxtvjyI> z4Pg-jf9;wp(a<6mPq7D0Ol{b&Z71;<-H@hM;xaYXsruRb&zGSQgB`MVKwsqDb+8H- zat@HDgQxfDKl@bTPt2wddQX!vklcneB2RVI3;*zs-%+5kP-(x9<1k8rK7R3o{gAqH zK9DAeH??M78U~{vHqXWvlb=Y7V<~<*ks$U8lzlAYQ%~=BV-ob=yJd9ItP0 z50ukeAKh#EXgDHATD1M|szwdUJ>B{fZ<2uzM>B!B9bJcxo*0ZtNMLwt@3=sFO7N+h z7zx(D6+J5n?vXA-Kgl!wz$dUp+}(Td-AT2Q2Ak7p>n(G2m~X9-AN!$hbo8+H5KF-W zobd5Rcu6OCHOq~d4B1@eTfwK6p(SZIx+4jUj4iY;ZcG@>gZG)icPVO0AoS=6hlPtK zDw0!WkzO}~J3Va12nY~=O;`DLEO622@4Cb|cjw4e7vDkQ-)o_V1`w!Slz1DtO&bt7 z1lYeKKjGk_zXD?sK4_O|R8j$7pHm*%eOyru4sB%I8PrqJsaYO(1ZLd9$dLc5csd%r zcr8m#@zw?JzZquG{)~f@V|aQ>ii^EJ+i z;NXCj%zUeSKPR)%Ky7Z=#ExZ*)5=>F9xK;CwfEbt*csBjM)0N_jEh6fPm57l(5kGp$hnTRrz2MR{|+L4AG=m zBDhn=@YvW2h^RNl#>WFyifjXkI!4+-G+iMXNVG88s4RmXRL>vyVqz!+$2_m6%jNZL z;jY^{`1_g(F$7UKAB!h)xKr+SF&jC_nhHR-pd zV*=rbfYVA9m}8UB=2#hh)#jIV54f95?l7g?L%JEJm!}Jb3T029XFWq}I?R0fS#SJJ zP=)P$|Bo8uU!mBaf4LY?(S(L&bx8UHuBUp{DyKaON^m53oV=T?zWp9mO)iHmHgsDI*P=w5Mp6ep}am9aA#wPiSCeWEg}K*M=K+4i^!Vh5|s z`A>e!cK@>yBx+)Exwfs`$OR@i{FK8U zO<5GfZJBRdzdn2%AyR|xyfG}A#Q{x?41A9?0yoo|Jr#Y0$x&d)HVJu_aa8hJEzYl6 zTU*Z`{MsdbphXmPjIV>(V+DSH7x&SDzMPFn`{zGl9~pnY&#+0)YXaYM!;Zyjqd{=X zpr2lIbX)RHTuzo}+27BU*FA-}$pvgw(MjK-pe8WMMfJK1=4pHY@yjI0EpKiGyZ}Yk z6P;{zYlj7ubu}rF^=H79cHHfnBcD&GmUDtmu`WhXm2kR^?gcLh%mb*g&@&JW9t zKmg>&fhoFW$6rIZd%;TmNg+j6D){640^4_Ca!J8F7zLA-rnFmuv!v9j%oD2E^eT zD80^w2Q5iS?SqOd@giH5qcs~9$Wu32oz*0gjU&RUN34rj(*gf*-J-Mm=hwHvvy&+}@{?nQ(&vv#yIqaM4J)l8i^ugXEED?9?uSV0M=v-Su z(vz}lxvSX>J>Ag|w}&frN7~Gg!)ume0e2(@Y(|Oh1gJ~)26+3@NF(<`V0VO-r5a`A z>YVa(BpruE@y8`f32vgXX&+*|B)p?Ruggb+sgrJiyXGE)M+DYVjHP{r=nOZ> zb=SiN$WC#a>YH)q)cbgjLP&pwa`1KDHol_-_0U_A z+O1>I!a{|5B2{_xAPw)&20TcBy75vq4z4iaH{IuHPzq+I51I41&=Gh5$OFK%tNk+W zGY7PTe5=9UgQ4^TcvYK+F)7%RnW?)f5=O?;py1ivWVXm1EX+@F9O`In^!0|}E5K-B zdNP<(tOR%a(2+h)68H_6N!Xu6wS<9}(*ZE1<}(V+r-9wMPe+~GB#xl2q$YX~4>$ha z5bjOzo=1Y>`1{xx>6#LiXuyebE@l(0z(;u84<`RoybQRbf!EHOl?gQ(4L1i)6(eoe zo3eJ;tA?E=Kn&?oAk*|Fx*yD-2?Sgm?zi&E3Z)?Li)0Kz>PU*lMm@!)!*W|70MK}ONk@>_Fzlum2!c^X585oi(g8)08BAxyYt z_Pp*tVbc)a?b_&^MUyN3j&#|Wft$gljiaw~c*51-R^@eb=eT`-5+nlN@S(NZ(A(YU zGMH=>=;ZjPb6?WuZ1N@5M#_$K5>B3Yb7zH2dud(YGuL4z8AicGwhDOPZ%ISWl=lt1 zqGED2_M9VEIH9E|5jQ1ssaxk=O6v|-I-=ft!k))AK)@Z%X6&!_uz#KekgEcgA-#DSiwn;eSR;g{8=lrZ^QtrB$+95a`+ zn3RT?{DPZ!-c0a3KPuPzPbPu3*3OF4VB|hHXnpiU5i9&F7)%j$U*PX! z$9E|qsqq^HG&^uFU*C0gdv&y6isyn5CwydoHmJs_KrW!(aotT$;8X69sJCtcaRU}E zf!MUDfOg=L0#`JhC>L9o%c|}Z@_9;bzC5H*@3SV!Og% zC9qY%^-guVu%nWj30I2j)sC#3B8kkVftJwBB66$uQq5#{jKfEMV0?L^)FD+z$jgZI zKrAvvw8r5K#W4AQax5bMI*Y132eyZ6M$*ZqcJq)p5f?6MlNP2(*WCnC|BLNjWF4Bv zR+>Lz^sjQOE;e7iJd66g!OO=fsTiMy!hRH=O~7r1gC^LVs_nZm@=$0(t%2b@oQog` z{vfHqQw!`}J1A;a)FKF)JmIiCj$4PlxQqAi9IMvd$G|9mK4ih#l{WB?P0RQ%fYwrktmq{!PS)?a$Q;2LXu(wA6^1*etF^leGR zve$_BD!mS_=2hncXyMubKBm`NRif%Op%Ai5mU_i-ygGUCUlq`mXp{q{CjJGCHv;N_ zx>Q7cZr;-*I0)#JtFA!bs|u2_i1$+}sh#0+Z)+5!*5IG$w7_l0J(Urjr6IBiX{{mO zyQ%PUgBec|?h2P%Q+J!#p&9FCl)t)*%0_wo<&=|A!$RNtzM?l}Jkf*a#vFHA0w_`! z8G7Hv3o9v531venYOvf>U@17SAArl;fQ$J|g22Sy`UJ9izhfNVpobYFvr2yCIWO*k zH8Gg^xQe-A9+~P0I1te!t@!NWW2& zP1lWzr3TLIAR3;k z>iJ;Sc{iSS3TH3FY=Pu)5$jPv$kSF9%wkAGj3rqq=WE`HV68e#OXVg_!}OxGSR&vx z8f{Z`*i%R(iR19nvk`srRhw1k(kfmcfQ?Ns0m_KV!F-s)SSIB-K;V6ueE05ux`x*V zLsbh@Z#NHv=mg~>kyfX-EP>+Mvwr7hy`yC6W#Z%j>`c$!p{fXVFV$=h6WR0RIN2;TE~D$=!O=K|8II|Xk8#)osxR7&Im)(OG z4{Q_aijvlxjF?{FKFANS3W)UI+~Lu~7d}zrTCWHyqY_N(vUiHu_u8%wZ6P$tir??4 zcF@YJ3VZN1VbfXbP2PB(P4mWgSjont%j=uP1M;GM)qvz&IV6U;Fu@pO9NHu0G6|yb z#>bWBX5z~XN|7SZ02$jwW$k+=3skuvLF2Jg)1~- zGD@;vHll-72I#rIm5u;=Hqb!Bcl~H*dhfR(xB)#H3{A%KLH{j3u9k?>-mnJ=9R+yjVxM%&Nw+V^w-~t>aXJT_gSm(zMQrTQGW8OlHaC_VWBF=UpsvAj*J39V1;>8dW zL$2AHW%4UvUrbDcV(zrVq4Hl#3ju_0GsZr_25y|v)1~@GBlZ+rllikD1&vvL_dZ6X z(4(e5aT#OQKV$R^kw{SHve7{Q7y`}`3ugn)JD>jzN1&+>a@5jxU-a+7`)>TtPHZUe z9wq$GVR9L;yTfp#o&)H#?LKN`+^s($&9BGjNr;FV_Vu6_rEypKNRwofPYP+Elg*x} zh-~eOF6AKB?=$ul)ObpDd3UW2MHOa2G;oy6lYIVJAC1oM+lKZ+i823M-uH)LS0qQl zxvNb89L)YzeoK)`j7Jj!>Bo%h!-OVSYPPZ?dWT+uMquHS9&~QXA*G^?p~7{pE4PtM z*a1-U0FFR+R`~-?8wjBxaDi&*O|{cc+31PZxn2)P(g%{V2l+ircz&2C`ySLC;Qsd< z{2QqN-;s;i;{}GZ22co%;W3L>14(ZCk7fW)mgx_lX|EfEL@guTBj_X5-BUHTvbE%%t>$+pZHs=cYUtsy&riY(Fq5T)zxhu=GfE$r*Zdz~~R z5SGfN;U2a|EouFNV)N$EOa5t16++tF^ruY5T2tVp=F@OwTmb5x zK?cwob)Ltcf`6}oqv*caWRb+SawreSUTE<8=CICQ&Qosh_;Bk(^G-fq0&BN3k^|Rt z)jIH{EL;!%`g0uI)u5>Fv6s=ax51ic;F^HJ0Dx@PyO|cht~rS1;RrjNP(ywy+gtH* z5!@BOwyI6EQiRJ|Pd?jx13mg%e-?+6Ak28+ipkT0XpMus{($Y%%M@q!#Ns0mU{L9{-|1HnO?M@pOjc?_sK0mSyoVgH^j zxMPD5U}ktz?|&+Csr3LdrhMg=6`1j(^x&qB#@fC8$7R_OeT8P)YVQG4C-^08ZymVW zE}K~iz~6dP07RetcXiJN7_cV|fLy`ufa71k=`BWo-5tA}rjQVSzZR0?dlb#d5UW;d z91TfNO@dQgv?@3A&T@K!EfAp8oCFT@q4LA@xOw-FcaK-|hErTfeOkfJwQ;9n9{&L7 zA64ETcbq5kdn!*=QQ9s1(-}G+v}COUv>_D0%slhq>THC+wE&7Up)7|D#G{Fm52^%A ztX@@UDJodZs&lF`pAoYIB`B4^;JgtCG;LY|)zz$Vpg%bQ7T&IJwsxZg%`$OCttG?UhmGg{sHPK zghT*Dl+3X5xTGj9E)J>>umB-U9UZv+^nP#_eD30f~rF{fJ~r`Fp#u#+<=!IByWCWokwSnU?c~b&_PN>UMyNGaedR#WFHj)DGSOPA{V?BzXh+5#! zPCncM?AVENBSw}z{iu%Gq$Ysg)+C1T;TKOm>py-n)G^S6vYNVQ2qsiGW`40Gnqr4y zOw$A?X~6eR0Hq={uuA~!)P6;EzU4Ow;E7GhNxO>86&Yv>Nm6ppe*30U258?loq?3V z_~g~D-NUL$dM6o&8VaVVy8s-q1hi3`_-D+eH6~f#_CTcN9;%!w*U79YAI)_f`bykk z6iUpEM(MwW_#JMLQq50u6&5gLkL0P}rcyo%zFE`=)xHt5bX$@WxV9OXnb|=E;0b__ ziVJ+ap9u8O%W++Ph;Mw(%I!#ak+0=(vaH}ny3I3XuL}txR)Bz?$4#i#YYQ2->CA+X z?g2CH)cXG7m2(Itfbh48L*(2fR5^G6D9p^7k=)Czpzwg$t^tz?9d7|tM|LHIZ1hr6 zvOxabo;g2H>V8@QRRsi*1+luhhxnn6KjAFVTq5OMGnrrIJS5z^v67Xyp>pt+XUZIK zdp?i5o~$>nf*K)*Y4M*w^aTn|+pD!ywDMlR-EE`W64bsl z+FdoZmrFh63>0@uvri*cMS27eVj%#eZSD#=#{yIWr7E=V!{+>@X1jw0Dqixg`gwk` zvuEtLJrSe{4(Fn;#G0fZLY0}57oi@p%L0q01ws_YiXOvwTeDVRcMb%Swjl!B(r_`x zM;{5ho4><#5xT_yhvGGU6vN%+0<^x@Rj#qc0tH{%`GIus0C2}LG2+u+rQ{n-{fW>e zLUHO#lGHvTZy1bs+E|8kw5jLeJs9%4cjLclx}8-seFY291`gj3YCk5?Sd;205T4zT zAU^E>02Nb#;>Z&RM&ve(5}+VBqsDLaBc7^Yx+I;0UpSRD6RDvWYyfR%OCUn~3T`-S zd;h`xQRAYn24)G);AH<)J@b>nbfN1lT^tQqm=;%v5JL2eLHCsr(qEUW9d;(9gpZXD z#*FfOc91;Y1(1TT_VNu{qA7!>M5y2gFMz0$DC%*`E@+HjJp^GDL{iY}ovd6s=h9aI z69KD>%|%6kh$G0Vu>3dw&cg-VY$TdI(tC) zxlD}$og%)lxl0%|Eev15=NM={F9V};Dmx%g=uO*7VW$p%1%C?45Z^i9o4r1BCSIMC z(lk(AKGO4knC_4w()WSa4lF!vyFc6JSP4hhyM>iBDv0_AEp zvzQzj_5*H#M^_Pz5aCUgN{uIc^YI_w+l^)9Pw->-_{#J`~z$cNxb>Za#M zhb8Xjt*3W2&>!LJL27c-Z_rOHP1MLBFzr`7ks=GWqDlchkh7#tMkm~4N+!_M8QCAq zDOXiYdNKP(03ppPT38IwS9-^H7kqiyvaKo6sGH&TE7vhUHRB`A;kUMCr>h;VL27h@ z-mt7j$Qd5nk5#5nRbpa`7~gG{@^)#pf4Uc*I2PM=eAyal?sKT5i+rc_+Y2KfhKDfq zHw=-tW(2*acN?(S=DTR+->VAw5i9YwACq72JItNFfqRFN*Nj${cmJl>h<-b|ut4~% zKd*?pD9T5W)ynW=*Ns;}Zj;kJe80u5J4%{FI;Cd6FY);F1;SB(GzwWsJG1P4_&9gn zfd5}zH0cnL0fg{rL$fSk1tgxsb{C7HFGK;GOJj?6hUk;sdxlcR%S(}CTG8*DwU#@j z;q>30>r?O;^d^SBW_^uoVI9DrcBdF@Q?@KEg}3o#@5r6fM41=7>b#qs8!@Tng>76m zZVQrYlfg)1zU7oKM;LagG0g17ES=;WqqbJpz2UXj>3JBSwilZb&Lua97@K#lm<{QA z?wrjSw3Sj;-YQ?5lXCX-*~@zgUHzQOpEmDTSK3#SBkk-h&ZZxEA1En{t?6V^Oc^#S zpT5Yi;0eh#cv;obQ9_ZE<%0Jk#J$JaRrP9smSKZUW=>a7M3HW(%muHqCNu2Sg=EVz z-n7-IaYC0bvD;cpuqN@5SN_b_Qqc=k&djFK*!32R0 zQGqpf2#1;mu?Z+IZMsC;(gUy+g4zKXyL{rJj=xdZW*tz=%ah`Wshb+x&{ia&eaDHK zt5nrqbOPf~%RF=~c3{!G#pWpVMz~#GnRfw%w!65f8x)6SF?AJ5-%-y79QR(l$%$WH zQG2ayuFx76FYLY7{M=>HQ1pTymB@+Kq(_671(xs*A`X?suh9g;Lvv9K0`&1(dYDL9 zpLY~@pTq=3s~N`7$pJyT`u8$SwLnC*qUp`P}s=z~*I9n{ol_yf2e;;}c1PsW!(Ua>Z2u4ku$ zVhvcm{Z0M^jT<0jHGMuKqsva4rYH~}a-CDnM`uU1LPzZw(@DT=+JD3fsHXefYTK4&c7^USfL1@Wr1^%0)(Zt}u;ajVY)TT=N3+YyNbg|` zg&u(X)mK?~Ahsu_34%Vh=7ntuRRSb#@Sg(&0gd^ETC%w-z}rRi7NXmzW}Dz+eAIoH2*II z3gO~w;);!GZx^f~9AEXA_&_yqm|=@sA!5#7v-+k&H8Xm#QC*EsBSx|H>0$^=iMOAUX=bA-)eSI19_-aHdF4i9oJiWF?_#M^MI$> zOR-g2>V~me5VEkF+58i=-&`pad91zeoEe3&fT9R^VIC_4Ki+1&`n{y}@K!}blu&^uj@3rCJ2IYmfA;*Dc0l6Qt#0fz4KNMIo-{q@u1=tNuq2S(Cm zSO`dSqIw}|#me*DJHuOx0(!nf_6@_POyBfLh{Yb#^f75*Dg|i5@CK9odDZf@L~p2Z z)r|<*O1qpD1XgItcf{eg$i+l7@f2Ew8)mVU=3tu?NhanEyD`5&R8I7c25tkg`F^M= zdf0Z7P3XSUW2W|Ch?VnM%H6H?h^O|wa31zDI1W11oOx9^e(+)iX~tL45V6T&pM}in zQ@Z9;9Um&;enMA+7~$9baMyeva{^+sHnxZ#mqN@G9wtkL;KbA0hmnI)dKyYx4dJFx zj-JRAN0%;^XY2*GhbQ#QW`v8Z$0>JMG>v1vJz~?)-G7y@vp!n!u+?~PBogX#^18uq zt__&HKTGLQ?iC&mh0vKX13uf=hPKW*dD4-5-KH zZ~-qHD2-7+28aaj@hwHv~ASRia?I9jRhKiG~4IEnxG)h$AZ zMRFCc_xqSm3tbdVyb82M+bab+bPQ7*f?$TfShxRPD^UYt*Z!aD170S$N@G~wCvYQE zpemXbX+5Bh`5)Hpze6aZ3&Bx0c2YE;F7rZN{=bCXMhHFlHD+KeL8n1o_iv&obYFgv zl>u=aaJ6)qWuaTmn6LE(ZMd)Ry*3&|O}@BgDd4eutoGtX|J|F=-_QbvIH+2J*kj;- z%kUeVuMld*21f(Cwi1LZ3ex=#)v|7_M+i z-!HWEH;jwxu9;cy(Nr#CCbCSu==z@~HEeZXn+tsdE4z zIVsEHacQX6_tZLFV!sXK*=^L{jvF_WTV{^s8?PWsur@s@NbP(e`!#lH!mLKaVnwJz zee85MxI3rLapQ(4W))*;wqQdAU8$AnNaDm1LucH{j#u|17Z$tf75Ea)sH5JQ`bI~g z{v!+1KINtT$%%>s)2L3V-HJJfB~v$3J^t0)#fjFbxrwb@DpiA}6{%RK}y)L zzla-L6>Ku(xhpV{@+^Y*! z9BcH_zB>UeDe@&(-~?gQ$!5#0*Fk6pCc;8s{wo)#mK`#{nQIN{S$d|c4+2wdS00dd z)S|?j0iXen+iG6Pw--YOg$mq2P#gOIqy@_XkT?1E21f(lxKcYm6UZdRyX-$N>*ia9 zNnL^@OYgmb(bA7E2KT$U?U^inBLxIBH~TNEQ@kkeF+BXZhFXiO&M}vS)-FfNtn%`7 zI!&A+<6~hvGHfXC;c97ha}!H;-I!v-0xJ`ewO^mvYBEpEKjgD(7U%uMNa?vhGaMVU zoo(f3IyYhe^JU;cPwD~R!LVN(zoDP{x)GJth9ujBa|_mEqmzYi1I{rYCYL6(+?vy2JFr^thO@m6{ zUUUoWe0{jlZZtlg`|YTeX5HaleTHt&qy>Yf$$ObO=#30tZC``3FuTujN*uO8JY1P3<+8~)Kv{sJUz85@Ry%IKd<9OEvU5)4*b0!h)3w42~| z8y!v_nLwxkRh8`qM3d8lxLmE<^}xNa0@r!^(w9cZqwNImmq zJL5p#o}igY;#P}@PAp8t{^#^)R|r}x8L#E5A9N-FIJ}MMjWMfr$Y`|WsMh^KwRFV4 z3zQek$xMosGKjC*)L1}>JhrYc?pXs?XNw4{%!V7l9CLb!U9}|WOPa_P6Sy-Qt0ikJ zwb}!P=n8{L?lNvZmlC3U{*{;8zJYSb_npD;Jdo6Ctbm+wDjKhdQ4XW|J4{EpQqT7Z znQ$4+`h9t@|HI7WoB#4^IbcGhW5x5bM(aHP_DF%(PP6-nK5A*gW=ed~WiEEyWG*)S zYie!q&ua(LCbzraBDtmMs)rNTt-hXAU3>DcLn_I@qO zB~l6dK(=9Ox3it~_Le7Hw$+wob3)pTCmx;&cl{yUSw)$!G4a@SIqf!9@~JJEqn+}1 zZd!b#-^T9G+-Zwf4XV5@ytdDlzOAk}RpX`xuLs6kI?qIxL(<_P4yYFKg)p(-2Z~>D z9nc@|*jrp)wSQDBa*f&|x#y7!7Y#nO#Jl@F+Z;`vAmZnTktztE6;~}ps!b578PDtk zAsK2)=!7I{@WrXco2ZHPgr7?Li?Ptrd>8V_P}6nRU$Y$B6jsLmz1g!V{zR-h9Xk53K(EPa9yA~3B$ zqT5$Za#RZ%asZ)J^odSFQ~3|J_^0#&^)tNI20dhV%lmnv>M_$0s`Oyu1m-uCxKDfc z>g-5R!N1;=O4xFKB{xDp$-<7 zH-U$SLwToZk3_KH;e4sC)FOJyPe;6kn`}vs_c_=qr;!AEBmUoxTjzLjV`_Lh7iuF2 z5-BWPll*lFbld8_UkeE5pj+PdZogz3bkh{v8>1j&;Td$s7en z*;;a30hh5_9^y%OVJ9IjH+v>NfOqor@Kwjy5Zx`(-z@6kb=ur>MK&zj)Z zG(f`Mn3_Dw zKykyl>0o1W9Ggn0dY;CUr$dG*Zobi9-<~915W$E*OOeVDMSoa?oNN6c;DFGlObTSH z9SOt*L~~}nnOMY47=t|rjcqTnh`<-DHs6Q{PS&X}WUnE5?^{Yyc2R4YyDPyk&tY6o ztOt`w!!J%4;y1)l#HT$de5J+jPe~#qU@Wm8%sXZY$S8Te8!_JdI3xIO&|agxPN^74 z{KZ!$LpuOg3^pbwB33>zlI;6|7dDJ8m<_I?Z2RN~0I!p2dHYAAv85 zk(`~cffaU~U3jR`053_`u-W*r9;aqH8oB%24VU!Y#FJ1yIfbSffB%sZYUYD2kK38i zDbb}kqZ1WEf^jhs*D!TQNaN)jOYf+B$li&>;`ziR@Asn-&gT8;{-Yn5gi8Yj|2cAT zk)ragOZr-sl)Stq*l@QQ-IsQOW`CrYy8o`a{}K|=vFe>7smZkv*B7qQECRsW3Z!4e znVEI2Xz+Q*%xDuh_OMsCRX>5V*^a$olC2z!bhdAxUZH-WdKURG3Lk|Eom^K$IuMccV9!cFA5ZY(wSjr>ITt+12b;O%@KSlr-topb(2*u=;XLszoOYG zHS6!soN%Sifzgz^$YtBN<&;mj&Pb+>ZBwK0=Mu6zCkDateN0zoqA3s9WE+D+gx%*XDRb_ryFHKy*MxTDGO^@v3KXcCp>V}NMym&(x8^0 z-Py=UTSpMtTTeey9u%AL6R_W4U&9K)k2zoJ3&6M14MdNdG*qxW*OoyR#!53??_pE##`PHR)ceyE=b0XA|%_luHnr zbc0CM$|uZ^RfN%B{A^fB*I3sGTQ=i6u%;~}|Cp^FaqY3S*&Rydl5L%tunI#B>3;e; zW-0}rsBDrv3JJoZXZU86jAkuS>?CSDq}xNc@pR?MCJN_y8w+q`n!;LN^BvgFnpmwQ zep{H)ZtN|fIJqNe+_|{vz=>QdsIZp)sYIKRH);7DY4ganXv2d&D; zA{AJ@c^~>@msE>$b3S58 zlO;E4+YQ7E@) z_p80_{k$J{-8YkXF1AViZP$1vEA{(oHsr`H{%}9VPOv>8LWK8o<~3N;dG$I@`?xTK znZ!|%@!dPu-y8``Dzw1$j?3pJE{0eNP&IGzW^i`!4#58hrvZ`lWnt8t#EC{U0xAtp z*;LNSY+=&b#gUTTBJC`*XQ&1^h()p~o0C$++Ois(U1xk+C`~#zOxU%7568>fv?Mg4 zNg`!#Q&v(yynpXBDV4ird(3tq+2;4@*J#7T<#$>s0&einmLOf#aiRaYFI5`yIT`N@ zrT!c?oc0@}!?3)@bX&ia3L_vB_C=atj@7Ag3H8&n=>{G<& zQPh)uSM3&^{m^pG2^-wb8DZJNPFF0DS+$MM>55cH-@d^k{Buw=I^wy;*T#r&%Pa+E zZsJeRjbtSyXhKrZVTij$?v+}t7o!n_`mvMwV@GH-{lOohR$wVAB9O_E9U&6^Ly_I;3akL@3XtifqG;zGTd zX#NvIg1cQ>sv@_t)&)|Objin)NAQpue`vGo5{{(d!*Y2P<9P!)a)LSM(QxR|*I`nj z6EUvT1h1`y&p#viOV$uY9jyZ!HVLtOO`;nwzIlwict-<6XG5*qo-pI9A-rJp#!q%p zX<)$7fEs1J_OtBMGxdmPtSHYlJ`2}-KyzRS4EJx83kal(53$BFgHlwGDlYUgp0b~6f?B^FLl@gX=Z4NGh20EQXI=@0EY0(mXy)b9%uNxltt9irhdq-S-o~G@%%#qh2 zf=b;~NFZ8kT#G;KxiQ9={`}*}M{X}N75FK1h=Jopd~WDoV2yIUc(WJ@j;pxm1wQr3 zrrzL4UTlho34i*g{yvdYxC$k6P=Q$*2j-?)(>=9ly!|-d0GTe zVH?p^quOu5>VBnuXB0T3iRkO10yGxl7UHjHnE$&+V53Lzln9UyImBew_&`)v5GTQO zlQcPy_d!ts6!K&I2`gpV|ueWgXKTwqb1=~UuyI((~#rM7{?FC4?_Ae5d zucrAY0k1;;{8j&L_iF%PQ+)8tEu;S_06-1!*NdGa$J~?#N)QhMuPU;)&sso}zNnvI zmJg9%KgU>!GOaB?*{S|mOK_yN6YyVY=k5SB&p*aSOp6JeN;Tqed2guq31C2tJHfra)4=sU**Os)gG-*3 zZvpv!9QdX^U(6*y0FutriXS!j)jy7jzSU#rkN5teZt5yPr~cjv5H1`~j`kV8aaU8L z*8G9>@J(FR$L(RGm zhk1xLccd3zOcC!xKBaw2z z=MysS0*a`E2PZ%u#n77<{NITp0M`VgE;iOy!k|I%JPD}Bj;D_1B~Q>g5?fI?v$<&T zAX4g`PlU|(8UQ(Vt#XzVcp+Q41Hid^l@R{E3pSD?(?u*p4;S@6E}o@;O>YuhmVbgH z%ilWQOGx+etltELMVIzkko9fgJih~&W)FEYoC9|c41o;o_yl-DeFy$fE1T?l*u9x3 zf-(GSqsJ?i$K~%7fTi{XXqfRPAXdBERd5Cs*}pQIXoDQ+9JJKz#NbO!w`}i?2sAXeKB>K>4hSGIP8UU~ z;qntcfX%i$m+&A@t75OO)OVY|uMZVA36Rvj6~Kim)FMKU9fDZd*6i$6YC9;?YwC3Y zVS)c_T0m4^gBt_fkPyu@YES>WSObPjA)squ-mng&Hd4uP4JGaQb+Y>Fz^a|aEt=6= zYL7s1TIl#S;&+^UnEh)XzS{x@&?>|#Y%S4_-`;x#5Qz|r1V2}Mj^KIv3j}<+f81*o zp196mOn*hVGM03JAT=TA6!lyvRzzLS#-3lq0#;7q0P-WWjYVnB9@i8i&pN4s4x`%M zwt4-+b@6CB)YElE4!)>3@DiU|11sP)`oDPXPb+ z=fU<8erLi>3*5vZ1Uv8#vOjB@$*t5_T!L*sE|+&bLWDjb)*5@@Rr}MxgxM!>nwkZA zN*KGQ4DZ~&>sUKCfe2%ni8T+$)Btj)*Nq|Dj;9DJ5h#rV_<1gbMa?>b{xh$ypM^vm z=jLXtRtct7IaCn##Wf}8Yjgnu8MUsF2C-~%6M&<&63=n&>k05_UIL6N`jG-HI6Q2m z7wp1=j|!eYjU^xN*sr!WBE{q}Dc(QbviUP{(_+je!rze##BHjBDkUK31Y_jm z9(k<;4}DYYv#B&W(ap4Z8(YjRegaYWP2=`!tyNH z5W~3ppl01}2l$OR=wsM>t11A^K5h(foBk{U^p~CuM5Gw==7H&ez$X_jcOoX~MO5g! zLun1!V)Tt1F8g(8BRBiYFjzz6Oyn52!x=aCZ&|7j=gV7OT5KuGh@#!TuVB!CjvPEmGFhq5mf zIWaS0`~z3`$EyG@C&fu@li8F*W2FA@3MLMM{UicBG#jEDHP@x271QdlSh?n%&F8tT@j zrC@|YxF`klILP>z0F_$q%{!sA=U1jVC)oq1Z_|$zmewzZoNj{J+22dgHy2`B2Kra* znZ$1;Z=22)4@{TQQYoEFPOf$i)kC~lQ(}=hSjel(36g4Kk$?z7bkgn1BZMCVBIw1; z=3qf`Buz`q=8VF@0w?20^7DHzx5F1q&Al++HfK4kdyTx8UdakHxH*KOe>G& zEvP012|73U^_JkS?vU%h{2il2T!N zKv=icPGM>hPD>1%M1H;N`E9N`F>BU~EhU>=h;ctf@a-tGr@Ut;iQ&M4Lah;hA=hZa+Um z??z%yp@e=L)l=eCE77(u_3{arKo)1C(#Uea9N^cpwZtToKgzNG4wCQdx+jaDHVaUk z`Gj$QfHDcxTVuk!tG}@7oC4$=gbd6J3bXUtLk-F}7@7kNSQo*pfbUDJ%rbBu@TFqM zy2Ea^ylCZl`LsWD|7hyhadtLe>b_Yd%xzr*IJ$~_q@-gNTNgzqrkKGjYv_Nib4cOr z#2qK36atW&U0){@RD032;nx!yrPr~efJt@pov2F0r^r4qg;jWcxw&~Q(qaLooS-RB zslXHa@@KcLEu*#t3L89qCs+*&N1ZHH$Of#(a?>KmJb_f5NH z!^9=NlQ#Nel5}m$=Uv;@xLQbBct{xA^xnxNPzvW7^IWjGdfw!k246QsdT+_x_ zcr|0Z7$JT{UT}&!SeVEArN&}#2TA<(?nQK#^T%hR34eG5spQB*1l#}_*;@~O`=SZ? z#M0nAlFuaYCMX2mxrmbBr9%T7E#?oqC7iNra?$CRifuF4`j|I&l-88|?V{E!=QtUh zSKsYheYL%PQE$C-F-2^O(rr7q5M}7K{_tpTJ^#6-3rl;EOe<1^LW^#!L%XENO>8;x zu%cMy_6zSMCAAbKarCK1%ZtYO-PtHSH3!5*_+c;dBKp=0{s{;fQ88M91N9{xi2^O%KcjZ z`bNVL|5`=L+*&}7v`dsnM`E2+B-g3j{ZUq`CJuaDE?cw-qJ=Xo`&`Z_st1EYsqen zcE&yWb-a6=zIDZA?h%md9Hp;=YNy~R(b4i;s526UFxjYi(#p`=y9No>ytPQy&<_iJ zggoL}>X9m3gC_4JWu9ZWnCFZ>$7S{P9NRg=?TgwiH?P5Ho1o9WZkoLgJ_ilB!PRhc zW96cvhsB^fP__KNo?eB6fGptSIvZxd`045axN}uGA8=S-(i|tF|DpDR60CBu=I%07 z>@3o+ww}uFhhM+x^(E55*oGi!K_L|NA)!gI41XlOx+Rqz1K=~zhTHKpL`8CENGI?To=-s5+V1rIs8d#;)W<2{OiPsz!sLf`2$-zLyF%)w%ulD^h4UY=j3|fbOotz=Lrz>|7=az$qM2q zQcyl;p>wZ{ovy9Y+7AR<`6jYCJ`I<(YkR`AauhBE0Tact5V3V$K|d2%F7@PfV--vm2onx~*T73>=kp)hPZ z?%YhN?(tmSI}G|1L+0cIYqH)}A{g`>BGqVU_v;i~DzS*0IV(sLl(rk(t(M#nyA z4L|XxdE@qVvOt8G$#IM20%#s~6ry`1#=9wj=wj%#nn9Bo>E%Sx1@Cv?k*uo()t{+P zlEu6?DXaTah52>~kHuSIjA|c!k6C6Jii2VffA^PtVP>?kcHc>Fj8^cfBb9o3B4)U8MvXDSksQ2+Jj-aEcb++Q8(UyYR^9os^5l+&QoIFJa+1pyw-FrJXiv^tgP zz46I}?|HT;aOE1pY0n*S>jG>!wds-3x^}TJQc|I3fpX&K6cA z$J}2>A!iPJVQkkb!YmIgUvN`SfrO8j_u4@)6K-~J%-mz7YL-l3e7&G3R%~Myr>-70 z6-s2-vycG?nGpGj22kgp^@omrgJ{@HmmdKl0o;xnf~67=tvjBOJMzyt=e6X8o68Cq zX@tQmF+0nnzS-$CRRDWApprkFFt`?!;{sGaG9>YYF89}7gc>ppL{8}k()j*v)&yw6 zTsCU~22{svrhe7h&mo*1k3Xw;SLYFWmIWrsf>MLh*moqvLQb5U#c|w_oevXyeCfaF zH4@&6^YzS+HuZCj^JXpiOSN2{y`st#&95nz64u<&(e5m(`-w(XN`JxYe4CC>zkaa$ySPz1rPSQnfZx4$L>e$cE4lb} zO;MRX_r}oYQ08Ybt1mVFXvq{wEQnF2Vgk{<^1`3I998y|*q_4#!-E>!081~qd?VwA z-x(KR0I;(j*hh#@`;~FsFC4%8IZy4elD~$R&+D7dqdZ}kU5>X$4zXBqyw?RpX!07& z=s*YcU|fBhfDilx0dQOEsNHrShOv9XAwPK8FRd#lR(+0rKBa0Jhj&w9k7j&VL5bGR zT@CSnW;1s{vzBAuBEHx}iYGeI3NB#k+d%COQj2yix}E>A)c-4o&D=C))9sry^)c5$ z-4^Gbw(vj`rAhR_RpxcG?Wk0v%*quM@!jFg_IbsNV`OcIExya{2QS`+v5hrQvORAlfrOq%D6ZwTi-j|D zJ6w_(P06Ga3EZIJv6ww;ITD;6w-Qg)7$M{8+eFh)qw`Ft4{C`aZ=~!RYo`>cFS{cf z5p`E)uoHPX;}`56`8j!FCdmQp5_IHCf?tb3J+(2QR)@N}n4D~0729x`ol7(LHtQa) zEb+Z(<|?({pKJuh5iWn;IC(ZPis<36!XprJi>lU(02PiY=J5JHj0s$(B1&xS|| zw~2HX2scK#9iXFwYXH1*G<0DZznwpm+`JV8$&<%otoS3=d*!3N*Z1RxV{;VHegTXf;YP6Ioc{ES zLY*e4LEcNYss}PWC&AW+@Bm*nfqTLuaqk;j$COPIhG2@rJpA_>dLz zoAd9#xa5_=d4G&n<8;hVoU`H2zx4}dq>Ee<4Xuuiu;950we^Ck)aaPoOTVm3gv}wu zMb3(AUhL)PzxC3NT=Ip$OLOUonp*jz0_$zwkCfx(6_{zWhqL9*Rfg8=2hN*$sAw64 zIIfJ|1P(Wxr#>fZ{EBl*vI?S(^Ar{c{FP86VfgEZHk(kgcR`KeW;VBz^((joMM&ja z;}t+){ufgR-b7it>wDCK-e>2TMzYecHAk5;4}`q+XQxZAv*OM;A@6&&gLM+V>m?7O z&(3wdjBQeP%d+l)rXjQ3XxL${Hf?TRQ{T_LBBNu-s?PUCwWl}o^tpxjYGZD6C0A)K zsj*|(kJeDV@8pl62UoX*FOD3%G4~qwEb~=^F|IQHSZau0qDk9UU12dsrzZtI_!Q+> zCB?gzoA%Ib3-QA#Mdx9hZ(9CHl_dn6hA_AkT&CHsjXFTM>f4sR`kh0Z3tdGzNvH6n z0?VNJM*!B;;i;QWEmqZXzs&6NwTd>q{5-_Hd#1Oi!8c)tvqH3qxguoFp_a^zGrGsO zV(6RW8@^8O@y7zFHlcdymz>-Zega`{X;mm~2Y2PfP_$TTxeoO z&qi}jDz~_4m<+7pC@EH2_k=jEaEM<&y7uA1xj%rJdESP19Gl;)4EHpyUkJ4qQRB{H zN1;W}1>lGJXHe$GHKrxP=U-Y+9ay_awGYQe9;&j8dkt)~`lRgT7f0yXdGV8VEvhxd z$kVu;Ws=NVXQH&|C0X|pxXY6D(D+$P)Yhp}BG79pO1EB=qSL<8G{qGADUY@V)}Qr} z-u#&x8=|dR2RlouTgW-my)(F2@U|DxZ`}%ap1o$-HE4)WaZc*9q`(7);GMMHFlRAc zh1&h+%9azDg$zyza+lnqpTHvhxHW-+@iM1>ds-unc!XrJ1;`>FcOJ@7B`M}c9i_`m zyKS!KMRcMpkJ)!S5YlGtqq20bl#*vY7#B9I zUAO9&4bC-ZUFG~M&_)diMQb)zv<8RBWfvIj>2XZ4yI+?nJNYd60d&&pTJyFl^xd!S z(uiG588B!`Ig;-_+4CIzuo^Q_eSvokqM8eBqh4W{tR!HuqCK@ zo$eUa*5AqqOU7x$HoPk)qhT2|HGf2jim^XOzCqhtrYRE8(WE|wROst7|0OJMJ0{XM znrL965cs~K{{Wis;Bbcmp50~Ax!LV>93=IG6|D1qUy{1Fr~~wtZLyFZn?rSLNQbS! ztN6QgO+_YKmy7E4LaQ>ha=LEpQ9PPo!*%%rZTP;qT#-dcA!`%0B~p_*s@++(*1p%^WoAVKUz02P`? zsB^o=+=rk-hy0PA#hgE_oD@em%!Ds{&Cf~G()izwFRXO+d0k^{@^nzaB1DLUH#9?J z2+XYqqOLkcERyz-{r-R~rQxOsxF^f#I{oU@hKR?8?b zRv=!zn6nTTG>aF0!aI$e7CbP@pE)UvV)!{c~mt4gw4L4b-NBJGuF=b zxM+26maNHGv1m9%gppd3LRXt6%sKAy)@QZjr(BDQ7ku4|F0~ygVkVFu>W}xNrofDG zMxQ26qpdbn!5ixiMK&P^&R=$nfyiUz%#UhncBT3- z3b0CgVLPA{`)1K)l=`w_BJCRqem7 zykiwsAt2ZnW^11Hp;%~rUn*ucW%_WV4=*s zuL0%1*}jGvbMhnZ0t^6Y!FLl?ziRJ4Jd4%Ya~T?dYVGB2pv6ZjIp*?uXNHsX;ErdH z6w8e#y9;?xaK}i96ec!UL8y@2`k6evwLr{9Q@H^4nV|LBHU6p2Mx)4d^qpe?O~I;Qb_idnX|d4i!8ec754v z7VFlM`tOn033&zI4@50?T^<#K^->c@o1qkQiK%)f#s#kJ2|6Vi9Fi|x@fT^~C+$XD zK9zQFYJcKtU-4Sp6^vee*3)<^YNIF`yZSo+^B=uD0f%ItVV}Qcv2yW9JJ$6$;rilz zJAR)lJ#>z*OifTeDOFpRGx9gR?H%5@8(qsZ2#H2GN(myQz{`%79O?*qX z&HJ?bQU4V}e^*3`gS2m3gBHsI((narrJc`YJbrwsPcrMz`akddT||lV0&uU#>+Y9J z|3T0HV$fh?ji5@4`is#0fBtF`0wL&3jV}WSgn#)6e{6t{%Ko1Z5yn=4O7j2lqq27= zKyN$({D<;0uWJbte0p7gAazsUgryRK zaaR}w?RB1_uh3{Xp{GUS-Fh*-oU)6e9 z&km5#BY^m)X9BeBcWxgM*sS`-E+MjjsQwMi<0mhbEHo0LpHoCEC%_zgzXlM5@nbN55?~$gy;N8<0}@pq%XUxH zgSp$!K`jN3?86DX=wJ&CvP~9RuiPND_Hfl$zy4_2Tpe*)mYXZxD#%B z_(vGligv{EogW8=rnn_|7-y3CxT) zp&929!+`@5E6=(|+xO%5biboq(g40tl86~FAwES++H@l;B{XLX*dTk+aFy_yXhL8- zCoSu9G5Egh)jkEYhEt}b!HK|dr;{8(;8u>(+?nr5#{-!zsW7AtcvSraWBjdlh?{C> zjxh<&L)oV;+PeL-5jL%q8jRpu2A+h)ovKLX3^T|uaBHjMy@9#W zLeY{0?!ICaj+L?1*OKrQ7Npx27{*+3HjXmP=773zEl6JflKlCDr_VB%yZ=c7uynk z;?o?bntFj=XW>jJ@RunaDzka@1^7TrpLrTYCDZZPdII3w`Onsc-h=$)x(1~q09P$R z9qkRM(1B2H;IqvMuDQegUg=Cgh59&|ti*;Dm#RWs3zrAbMeOb{J6kMM@I|pugC}fq zV>*5JDMb9;%pkYJ$uYU?@I0Cad>_DBHDNrVPsrv6JE@rgTtlz#S@&Ltg`;G5Z9Vy5Cu6mzz`!H?!kl@d|J6 zI@kCFXKIWl;r|oD`0IiLR^cG}sd4GL+A)~^3V7Y`mu}}LMTD7)VJfD}g3SDP&zUe| z%FQ5@fEc+s6H3O2>6#w3oJ6^AUCcB6=qpd1=@Ser!ljx#cbL+Gzc$sb!O{SZPsnCkK<9X9N77->3+|1T&8X@6n&* z>i&k7p`fN83pM~FM`OgpMvflnUHh-eJ#Zp93#I| z=tLcrxv)l5ukx&8=o=0Gp{!(H^S33!#=J90bGP{>vowK$Z2CRob`uEos9S^geiQvt zTVU$xsMD1YX6}A>#Z&!Chf^wQfRcG(;ygYvMfs&w^eFHMS5XR6}rh+D<0)1HhR(Agz6WWU_^05 zEvFsQ^mXqXL&TJ*)_a1P>V*?RQWEB0H(#Fpkm&i%T=N?Z)B1g7c8d;EeMZHElqTtv^bu*v?Jw9{+vmfi zRDJf@4elPD#~%pQNnG{0eW&s_MdK_-e|{_c|W>N+3!eDz>&0f|7ya@X3&xM#XVf6OWY4ypsf`&kQPL6hu)nF5S|akZb&6!a{;_O=L~XZ0LuqS8X|osygw6&|!;wFw*Dg$WCdDVngA zFtyoE-rPCn5GJD(4BQin+^`55 z+!`ma4iT^4%v{AdF$ppJn2nLxMp~vY;?3mQ#eyM={zzrpEDQ>bY?3bUm>1NlG$J{J zifsy`nCuQ|qFP7D#^7M*uFUmndA%qQw3+|e!%)>Wq#~@Y|ARr8ab7T2)A+Do!(K^B zq?C0)m$aVT#>?9I$;IsFR!LzpbiK_++&1wy+3el+J{nC&wwjSup1L6 zgcVxf?X5q=RTjS}x&BWi*B4sFp@vyr?@=8G!=4Ok`6D=WscR8z@yk^<1;ddi68#L6 zL|q&&)~+BF{Q~hTSjL}r4!F?_TR#(xFyVs1flC@Bk zr3@1Ith@u1L>%@Lz(vn@)MwBEq1i`{Bo_z>ON?qtB^8G9gkFoV9nGJ!DPe#r( zH>L=OJ~y|a_<@+5cvS4Dv8a(+b2JIusC`W`l!DIgzjc{y+kb9}adDPM-PAaGKI;bv zj2LQ0o--vwP``VmYzPPv<&6AA;YN%@1R}2VGlaIdSX$U^8QfYYb31t|-`k8*K|w_A z%9w~Do0N?KxVwoLwry!`C_Yo^*`QPq;YjxaJK(aKuJLquJoR!LWKQJuDIyd@%d zF&aJr^gp#le-;U*{yKB#L>AtDsN5@Q+OQ+*bop50)7Lg4V*_7Wvw^wr`1&W&13FLv zyXv{$-}~Lyin?&|Gl^BdDv}_<5NUiorR5WS!q&H~s=|)i{gIsJcIx9}Bfe01rggg= zU^rK{HG>i~F~6Ixn9Se@6^)Uehe_IW!`fY!V7aFy>p_&nq2*z->jZ=aIQ7(0TR@V$ z<^aE@&>zvpPW(A;K5RGEkE@iQHZQ*S2sLqUf7&asoyu)C1+lhvTJ5bg2nxY=xB@N_ z!Kk~TbW25sCwUUkPJI{_J5JMiwAZZb^2!{+BqKQrrBd~u0J^-=*7R91vGqVvVV*IX z8}r?i(MJ#pSfEa=mt}b`V}^_eBT?iI`*Z_B^SGBky*6oiKEm_HJ!7?CY88PNsEQOt zTm*APqR|VA5~7*JV(b+;GO=}Tl+&a<-s%QN3w&1H5LEP&+@Gx3oLJmu8VlUK>vJJNyor^9wK#mh=YUDh>vQ^)fqTvoML)o%_|+m4A9 z1Nbj`sUH22r#3?ec&E7qh41|cTRS=iz5si8mnGAR&Wb&Mc{XC|W33XpkB<+8v2R;{ z_@C%W$pqPBxoqx-V_gS(^WT=Jnxz5|pkR+g(4*;WY0{mkjD@YuX64&Y{KWIFJlRkN zj6Rm>!JOfjUe~6#13a$|qbU>~h2F6Kl6mwZ;)_|QN?I8Na?y8HmG^b^_Ji>vJzb1#>vv}!+1y=1I@J1m zVUOK`H5RV&zbu!W5Y?OrV3&fHixT*)vqrNWGSd4rTk{g zafap?Y&K81!3D<&I|bh;HN|UmPXw}#%GS`vlRb#i?mIprgNs%kHt8cTk#_}m9(;L; zegFOU37YfKYI0ZI*(~vkJF>IeEBR6$V~5uU0h<5zR*D`ZLhl!HBU|9TO>3psRdR~b zMu&(n4XYo2o%qJl2g6$^NLWqYASRI9Z8~bKb5TnEwSWTSgW@2`ql2axP|Q6=Q>|w$ z1Dm6Vz-?;R#}5z4yB-9!HDfSl$L0^8K*-8 z!Z``nq;-2r*vf#<=ZBbpU=XJn1QW9x;1aeGkvq#t5ne#?GN1wKN$?u@_zet4kNO2e zr{Wk(eXpoZ0BOA=ur1L%Z)IP?M(4{n__BmuXmy{>2`+E5b_J@es4kX%Izfj?l%|8= zO%&TZQ&VJqX-}IHDpVISX?s)9+;8qyizRD{f!? z?V*V`hoE_tj95G5Qi8{rT|uG>WAC*(8b3a2T$r8c07XF9{$=z##>JMz^bh>qVQZ~N zN&=VYm_5o>{qGfMkZb_6qEC76q=ZcBKPWPA|49}kv_%2$x%}16ZDxns%#fIO^D{+~ zK`v5cD?^pA4Z1v4&KnP}pr>^#O%8d2k#)pTcryV5OY$_NDP`M>c^pfgJQ5UER={;b zQH2@yvn9AQoL$4tpU;}1il~%%V^&1v0xB^j?@M&mu4bs===bh$eHhyf8_Xs1iU79) z%0@8U6T`{Tr)lam)ba(@TA(dE^p~e@nQ}$~FY@}Pk~STlMROSz6u40{X8XPrEYO{#;%Iowp$F|P z2dp(pbd^m{+FY1Raar4i$=Nm%T7J%6OWgXf3JnQ&`oq&Mq^oe*n9Y=MD_l66z}MzC z?G#^{(jk4>{WGsGYD|jWVC56; z!uSwPZ~R;Ouh(RM)5oh-I3pDBzMpEFNo7XrjL0jr;wzc6vND73E>9dKRq{=+7RXe$ z%Jgm@PjQ?1d8N3uugpyJM8vmzk`y2tF`1<`E6HRMv)Mx!OKd^bIT`#StNMAkZQMhO z>7#R+P;wAO)oz|Rd0a3Zb}hi58LOg7fr$80zJ_YbJF5e6;^J|xlJ;A>(*$d?*|eH5 z44!@_anZxuB$$Q7lqdd5O4FJ|Q+OVg&%xGuyPcm|<2lnIu?HTeEmEDLS$1=L8YIfZ z>ca5zZTJ82E&B`fTTD5{cB<$~i!-GPgN#Pe7TVSo&_j0OTZUb>m&)&tWKU1%KXm^2 zoT-=9>$ThCli}Ja?&C$GPq!}7^*K9kCk__+4EHnO@VzZW=q4?hyekxyxGNAvo@Xe4 zLfn=-QwqZxrXbU5pTHJdPtGtJPlq|4zX*#9M;Isl0=+!{v*Lu%{YPtQ`vidxNa~XD zTyJGOlnxYVJj-l9UFYpszi*>ZKt(L(#^n-Sw!skZI{x-@m#q;hG-ZU;W{6IhjVI!z z@up&V#X3WP9q7H~VX=H0W9^|aB3m&CbBfzw?P_SZ8-iZXDo*FG)Pujf>Th&rs%(=T zgI<<5@67L*!CJiVnfPjIxvi&8r=14;_L|`b`N`MXt=_v&BSZC&zerg-z$9V+e83tX z@FbD+M)`fU&F9#7wgY%rc7-vQ=sJ9X6YYjqED&qxxrHR0v-8h1`IgCCZYVl(jpK;r zaiZI=t5tn{E(112gxfmx57GY=Efxo zV=z0;)L#kZm|O~K4C~twq((`nA$DsC06XsbcRdn!_oQdSIlbe8IXl>!teE1ja&AqV z2lG9F1@mf2H=`k?h-hydsSfkITHo*6vn~r-O2l1UKi@{s*;+E0KGMx$E}VZ;3~|>a z-bu=RHeB#OqlNEVf43F=L?qC=3+$DxP`ia!cQLq-+E(_XBLJd$C>(r_#p*+6pk49= zLP@<_tLspAp$mXhAFZD4JOsYKKW-=-yH7PXe+b737i73bu5OjNLRr6NA1~Yf%uhCP zCD7)x2g6)pzJXz<)J=C+r>4qi=`vefJ-QtfX$^x%#%z=LxfM>r9Wp*F!0 z)$pWyKe|Ff*6j}M=GHRJ=L#{z(-lX-xR9Hl7R?OjzK3k0T6a^XjP7J^ZrHRUT#@?v zl|Hh;ri(YN`1A}&Q4b819wgs=xW3OM5y}W{9y1t|6YmWO>8f(m$QI9v3SavQjfD1h zdL6awyBqtFtaV;;?O7_F7rZ=>p|JhP`j+q?Kz2Ym$wCXkC|fX{s+2gGIo&oWY!77h zj1+H(sPzMm;A->QRwEr`-FD!`HQ&+uC^lG0AdcG^&~^`fLet9zXlAHbv8Sn|8ptn) zYXUoYYVWiw`|t2Pf|pxod3z@J8)|*)l3S3x&?f4KT?6Ebl`0EPtt3!iz#jYAv=5Dl zJf|8${)CpJ9BEaU6w23Ba3|_aYVI7;K6*;B>+@_}^O~UVhjIJ(SJ`panR%}uW^QLy zTNkxSWC-?xRB9!31OoLxuc63OXt|VIl^KXJBx658^fKR@xdanpU~X>ht^&qF3PVAb zGT{_DBDgT54Bi{5r)+WZz!DWIu5Ui23bizVfV*J8|ces8=V z$r$j6kk`#t8oBuAL`OTk0U)xh{J&l>p{3XK8s7OMi~-2Ki(5nQ+3FtY;#m(a;_a*c=2>>?uSP8I-sYuwbq0)hDsx_m{yC$O2{|=G zZGxiX(QqcD2E3-~ZWbfxgFw#E0a;pVSlDqhwbq0#ttFqDz)6Crnrt`aR{GRYo7RE7 zx}p~FS{M1WNsyE%O!a;L6#os_yMMcR0~=-UI(*aY^sD@Y&Q|}i=@C?4# z7X$i!#n!*F@JYcwH669F&%~*J@n2JrPhIx1#h*A=xD`y)a6Q@i>nF-&`|BMp9zDpp z@b8HR8@H}agVcoeT(cBf5Gp9*YxpC#z{;94 z)Cagp*_o_)tu>Nd2Gx?No%2PX-`J_k*jF8gX^Qh-n~M%QZ96TsMFE}(dmIfzP|!KbKF2d^MmE5 zOyPe^GF*`of@E2u_S*|GeRM!@LkCVYE=8xRzzFA%>~5-kqIgknD@jjxzAG^MejLjx z>oeA=Y7U$E3{0k0m{6OoS_VJDwzW8=TP65fw=D=bdP z)+_s~@?up}RIl@7d60RH1Q7a-LhEQx*?G+%Wo^={`u3e`d2guK=_{Ms5o7>4mJoWw z_t_evQ^k%WO@Jri#!bV0g@8}b4ZrcydjfM7x`vJZZbU+5AP7y`WWhVeT4zSB z-Cw%7>M|&Kr@3~rkjF$(Y&IoE`sb_s$!6)SJ;$%RoRic>4tAY?-xgow>w*qO5l`EH zb2YQe)D}pM|HJx;v`$fH`yM|_jTDQfk}nLZZ0!{E`1a1WeEBxrXq1y|yV_r{ZvR&j z@#Vs@((L>HPNx5N{8$T~;ooO;Ui@*k{<)KY1tw0=jy~}@zV-Oe|NFn~4iEv)%NWb? zKkA4a7l^x2iOb@hl9xS0Nv;mJv4k(LkOW_~qG>SqCspkQtyyakpkpI1-v}rsYqRm@nm@-IK^-{Vw}y{ex3ZtHy!ibyJ7&=iiJ z@KafU9@(n*YXJbW z7>)QKTRr!F?&cRiltYf-U(=ODKs4;bM|F$&#NF%7+NEHEHMo9c zq;h1KpYG-};{5Zyla%L|yxwn@duo5UWf*N;tE;$F$ENYKn?-?Q`{1CYS1^0QxI*>! zqS#hEbsTW$%xQ#v!>jmfZ#I_uM0`V13t&b6oY;Wi27n9VO&7P9M+evA1U3C_O{LCP ze$jXTnW=(CtKbIjg|4BQtq2E0TbQID9tm07zByI#Nc_bf8oj6G3?d~?9CYq9)BiJE z`2EgbB$$`Y>4#uwyPa+0TwHqI<7@xutBU3_V~(t%FW+i+8Krk|?Y%xncE$IH>gU)G zkVEQh3M*ZP`C!f5x^n7Uz@bZ?5jsi%#dY=6{jJiR#XlBx$)z~-#0D9A?$xWGY+o1< zcBO;Uf71Uap&!0U+Tub~10`n=SaXVY4s!^N8X#J5Klji6{=4IZrZM~!+bhCB7TyZ6 z`3$=N7{4X4cPTzdF_Zurlj1S-Ra=OHpcacwyO+_7K)rAHE1rLs#kQh9SzED!IV;xH zsIWR8SmfK80}`R{Wv_uw9m2)D0$KY|pM+y^4Y!6pY8rwa_RMd&*nW1;zw8RcQ3uX6Q#&Wu-FXO*YsfcbC>_!4hSSnZ%Fb9C-wRupaZ#(soMJQgH!x8(PN3Xwjpmd z!P&tQA}>{PK7*&0T?PNk1Ms~9s_aWdJx!zaz$rj|PWRv2q2dU4!#kzDqNi7yW(H^e zTG~%kz^#e%uHcv3;7gDJd*%*6tP-+$>G?mGv*IRQcsAvXZP+|-4g>gdcWxkJd_Mq~ zTdFyqAh$N2?ttO-2Vl%8!9;ZVUs-d`1!5H4n!WbWC9iqDJ1+-*yCNOruT)j}(V95?9T`tiI%=yt-P z1xPv9Nd@oSMBoFh&7mC?mV3Vwvia6;E>WK#U`SZZXZ`nkO3?ncr?Sq>;DfG{1@H6s zJoxcICp0ntH=i$o^R0I+NhD#N1zcfoI6VX~tKm0q%v0pd%H|xV2sIF4t}Fo}hpGv2 z%ht(>43p=wsQz9hIsZ>lR~ppR6@_g`OAxGrvdAE^h*g_FW>`cB7%huXBy0vu*r|oE z1q?D_Ewlmx1tPlwHY$iF2nd)E8YL!8Qdt6ufDne&2*>~t6wrY5KH8bSzi-~0bLYHs z?)IJUQ$aLWD}W&2Vjy+uYcW)(rZ4jBha6Jen|Jc&zsOvNB2&w(>)44*hH@+BMUGmC zZVGK?iVT{A?3-k4R1!a}u(ySe3M2ww*1nVHg(^h@euN#89s2*Ku-Zp>O1?yR1^Sm!L6wkFXgw~8BFe?2 zj!6^G5=Z)g3bM7QC6^sI>toC@dG6gz>0f9tqPg(CkXbR6G_)!^O-iuIXV18@V|s(; zKb7tv?ihw(C9E3>(Ps6N;8fmjVP&&Xh(8zC;W25b?;F?iQY6#RC+Hm(k-&KZT?rVe z1}azIVuGkA%)X>*WJC1m^b*8h+c@!{fxTPU4_p+okR8{hvOdsNAV@$$v(rb2$NEW- z;UH*Eq$9u5@6SV+mrGa}c=jhGX5p%Ax^?BaKX@gA6Bb%5O}TFI&p8}zNJG@70?V1W zEv%51M`g*(D%^L@q&$|v-||YK>9yrR&qc_0Y3898U$n{fND3{HRWH)Mur)bcmOlXW z$vSK@A^mc|z|nroE`_DEd;G009=ZAqM}5vw4sUy7n-Dc?wGeReV0nk#k`kHwK6_!1 zSwRFcM~fDtAh-t%Xlp5Ig6Ij>0g{5XM=+gMC>8K2Z0AoWydf}EC`g=8BO6e;?%TpJ z1~)d&%BE+mktln&{UWJ7u{G{Arb!qDF5hUlU_hj@1eh~FhB|GeboE_06P-o*k}AJW z89tv7yVO}id5yCh!CR6&iks|4U)^=ydoo<2*BAYG5YOC|U7Uv1$a8Ua9r#sJ)6 zsidt)>@zf?X$mWFF<55nh({j92(;?Ks&GecCi7;1_({Ys)$) z)$L%2-_X;V?&*=6!n6CPLIMPB<<3w-n84lI=cMfAVqW41Gy1h}-;$)JEr;@?cu|#X z)<|2Qe9(A#@roICGxHEkSHRoX50!r*qIS!4rg@{XSkT;%#yq2Qc=oY{BP;%tktV6u+7*O zB+68+dz8Jxr>YL@oGc?e) zp`hUW30E;1U_?k4>gnXl0bF!ho%vpyTQT7*{H#`HmrALkpjIdjnTl`!!?)_r{7RQc zH8e!fLY;g1kPC4Z^cc(G)L_^BM8>m{3wWK_y%C9$jmp(~Sy>++ZJ^ztOGp$vx?Mx? zR1S;0I^`Opo<6Eb4;IW$B8Xt=hn2x!rq{>&al&k)swI5p$WTi|q@)Q0J`1P-<7iA- z9K5U^aSn#DxN$9P&pB0N({I_zrrl(5?RiyWOdk>#s4L9H`Wj{UJxjGTd-9=JJ7Y9v zWaW*0zt(#Zev`rYokzJpG@JJ9E64c_p&`{-La8-QuPID@E)TxX6wUR0 z&7MgP@zh8iHJEM_leeMlV%82CwPae~Pd(N)Z2};*@1z=#we;P50 z5DDrqOoXPo-^;k4WWB2O)f=f(g1|t3!XbXMHCd+~s0#rbXaJ>K0!I~6_g?bdS)3R1 zQVGrl5m`^bdm-2F0>IMn<0`g~Ntq`>{k}PDYJ0d0k1``$#wR6p4L(FAb(cM)LethU b=gDm)EWf8EZLY*>7kFG8-5naw2LJjG;F{uF literal 0 HcmV?d00001 diff --git a/docs/CVAT_screenshots/09.png b/docs/CVAT_screenshots/09.png new file mode 100644 index 0000000000000000000000000000000000000000..fab9def3e9bfef8e1951550c1c10eeaa175016fe GIT binary patch literal 478391 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

%?_BnnX8l+aN7~=+{?vw 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

y)s^K4v*MB4AENRNHY{cJWB$1}ss{xmG%W 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

C9lZ>(S_HJ-XmxxK_RRmZ`5Z+%~)O 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ð7H!N%zxn^%<@`xwRjzR~<2lQObJ(DOQy^Sm0? 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�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 literal 0 HcmV?d00001 diff --git a/docs/CVAT_screenshots/10.png b/docs/CVAT_screenshots/10.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f39fb5e49fadfb58f0067d98f9caad7b21811b GIT binary patch literal 478286 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’!ngbycS>HyP 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%0DAU&7^|gs^hy69MCz7eHu#ZUC&I`eYSC& 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%0APb8AIiV)?+hacP# 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≫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

    %5W%{Gw{ReA+S+}QX+nPPmn3{YsAG%Vk+ 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

    W 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

    xy+q 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

    $02hCFKZF^P)wgdbQ1_!nmYO-tKqo} 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 z -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�KQ1B2czMBOQFksIm4zS9s51mCaJ_7dvMZ_? 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�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

    n5Q%a{ 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¥kkcbijQ`II#Ij!r+LLFu_{26Ir& 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%0AA zEXd>S!0uRzW{|sag~#X7cgeI!Vh-Ncc5!EU+D2M;JSiJ*t7UU8$0Cpy_|C`Mp&VrrYGwF$v=4n%#&8KyL@1P5&0K{V0lEok+W+s_MIW}i%(}; z@8YQG0pf>z!-bbzffua+9vwe9z9TOf;N1_@2{@>btwM^qoY!wHjlth^r1m@s1(~1L z?A4lE{0PsC2u7gD^K#V$BpfYesjsr3D1EYDNaPEw5NV>N30=v*Aiw3dZmliIMEj@c z1wXZ3;FB?7K3#J0pOwDn{oA%CF`r zwkOUBec4e}#jbOm9a!=muw9*=v(iEwwAu3qjP6rT>j9QUctgV{0|n5x$?T-z=8=ta z9;+azr(q;eMPsEBs1quKWvNVFi2QUuB~HR6fVx0gZg#?Yi0uixOcdZPO4O4kI8j1~ z>;ix#ZoRp=QJAIH0FdIX&IehS9Q5y%*Z}&>q5ZV4P^O_m$iWlYBpax2W?7Zp+aMa{Jn7`m(&YPjjXb{App1c#uB%l(7aAaEFWMs0jT+k#>}Xm)2B$i}ArfaU~lA z8BU;Bc3c=TaP0)_nea~S#CzbA7Z6Jt>=b`McMS7i;1H1)E+d#f9!Lg-S{G_v;6X+v ztBig8I25KmB|u#sU%HDy5@`If?6L6bEG)vCQu7(^!iF-EDhJ0!B@aN=SVYq}XUt!h z9iM3R1ElsUOSjgK_)h$;KkysS?WGY~fz0nx9t_KlqCU#kj|@ApAc9z!a&%xlnMMQJ zOfN|Pp1)lmXXt=1b{1%ax5Bc{1Gd-}9_7K)GLh563^>p4qHfwvh6Q8ARoTbWF1(HB zw9IMwARNd}0rzpmx$V}q?bf}l?F}K$>*0umwC;yE7qp+5<`A3KbrRnG+xzJUZAw*9Afc<3Y;&R$t$zcJhye%#wiUi-8cCrdaj-&0;w^y)%TX zpaT{}vI7*|iy*NRF~81QMao$Y18-`=f~1u+kNM45ap7`~Wdk`mQIory-_c(RVXAQt zL9H#WiKy(E8=A9bZS9q~UYETFS1nuObHuHT-Y~8sqbkQN^hX-0TfXEXTc;k<)yC}$ zYguE+U&nJoKqGNO_94*@Q4Vnpcxbriodk#+fW``=5qnhX`_)B1&zjdEyIU+A+oBor z=}zmV#3xkLnoB6X#aM0!#_eRtP%mppd8N^L)pRAPHbm+4?*S34fU~-wt#1Ubmedr{ z8G4Z{KKyawQRHfer+fLIzDTJgx^6fy#UBxd*oG~gRjWHTq@w44svSxfqx-eeDvrB! zapA5P7A&90$XpB`)ZZ>LiZftUyACk3C(g;i3?W{h&9%xIHwPAF>(QOiD?j^0w(^Nlc^#2N!LV5& zQ)dAmIV_olNZR8P+GNuR09mjJ4bPHq@8rz)4M_^Se9I-=TD7cuzgyW1#}+{76NOu} z*0~dJ3OWOeSP9Apk@yVrl7TiE_>Jz1raaFy%}4`U9G!g;L1{n;6sXwtM)=Nq1rngv zZv`BkMPBHV$ydcKn(qZos$k*~m50(WwJAF3SP(~RYlfY0O_ba&6Mug`_q?LloOd9_ z>|NMjkt|J^A>?n|2~P&(1+X2}X=S3!6;)mEIDHF1OqKS;)&1YCM+1|dyo+3b#>kSJY;3aw z_gUU8`eL!_T;i~^DdNx&jfk9;%<}-p3R9*kyl=0CgN)!7v9|2pXIc_5Q_?TJRg`!D2SVnHY&VuAl7< z8!=_GW)pTI857DmI2Q^2bFsCYU?>k~N^&cq@bvX97D@_j2iZdy3Mq|=iB9fM{a9x^ z@C?5?4y!sl7FMnmI%7p5dZ=Ix)_)amz}*-khbVA^Z@0T2(x-j#r92JvVoHymPzYW? zr`}vxAa}RkCs7p>>N^>+E6ZR+QPivul9+huIOi@e%L~X4C3CvEG6){?TD_vyJ&tdZ zaBF#dHCaI5eBP;()3UjzT&*#Ss!;dpXkf#up^JX3!=kH3rIr>N8=iejz{+YO2|`*1 z(fwS_?LS;8tLoSRC%U21tJd$3Nn@H-%vcA_p~)@P7K~bphz79EUDh2eV5WU8+0~zs z3YPXIyu4@}Bybx@OmFJDf!AP)PD6synE1mXM(>Z_9U!8|;QxpswOzN~<@i1IyUn{F zBytH8jeeVyxb4dFf-w>gC>o(QcUxXK51+%O%hJ-y=0|t<`fAhi#+&ov`y#dFW#b`o0lxe+4!WU3dSwqKsJ&q~~$f$S)62!!NtiVsraFNk>cA z7>NEcrKyGxq^XSAGIW0uPP*qQt#`byc zRgx@QjwLci?TmHe*Be9=4NtT~pXJh2nlwOJ+HvJ}JUnF2>9sE8h5=M{H7~%y;0DA6 zH~U{V+Pv@~JcAmV&_an6E*#m{V4y5HK2FJz-myXlF`T|77-cbQ@r}HclGV$P*DirY>{U&vv^0$BgOHi0XQOi*Q=h z*{rpnC~*hsdEKTRTC<1rEmpk9c_D?Ze6FT_IMe&MR|BnIz8`Z(-s(+QL!i2VJ2?t}hWx)gciw(pPbO z9US_CY~61nD%c2aoG$Y1Ru|!M)>dtv3YZ273W#Mhi0qGYXFLZK<{BMI%VAU+9d2ur zaN<`IM@#3ahT7J(npUNiC%D;v)&N!cPGZAGp7#>9_{{=L`tOiB9pdZXC=G6}%{Ob0 zZB}cnlIFt+f6fx8%=bh#Vh**lB~>f%QVTVE!Nh(am_a3V_BfeNaKaYSlH3^}2|9ZX zV`#t&R(-Qfhb$?XyfKy)w7y*FSXb@5sa=0+Ud5LHQ67@R$j*&_W@BF<&h5Ya<%|5j zFu%~x#z?_=0$O+1nVgNjuEh=sL4X9tyahxrC76&kJ_lfxqXIlWGBZ?J3nfu?SF0}& ztSl_6EgW~xe;JXCc(#d71$5E9YOHLOXW>2n=sw4M5+u!UT%^p@hjmD;nLd>>K z3G$GgPV4|L-ba11pUaRz#92ygo+A+4NCh6w?lk${Ss9(yR2_?+<%mnr!z(r_$Q``V zq2qMppcAPobzHxWy1D=Xk+Qefjt|4NBcMXey3=6>@}l5YHvEo?QJwb(*mp>(sstF{ zc0GYW%gPM>7A|f6F{E)wjc>!Pgmg_N7SZxD&fCihxPR^jcKRU+{#FJ%EPu5)7xm*@ z4rP_`bWg+ZeH$Cm9)>{9=^N|AldSRQpW7 zobM3kSORT;iGQatc5n2MUeh|DzqqqR#^1dyFQOSd0jc8?j@ll2LO5Mq?f%qZ#>N3U zuIF?u<2L81YUd4DnZNhWKOxO^PQdy02y7-AiDwiF`3;t@*Y`T z>tjJo`G!taLG=LDej=517Bzgeu|n&dad3c>A?&)cw4C&4PHJbuzy0d0F7fO_pH-Y; z@W+azpTPD}93~BAby;QW!U)YMUN~Gd`W{xbok7(6TsRo%7b0;|ZfqU=KaKAVxkT1JyA=UeGUA(1@4{CKyep(KhzH0cj*2CZ)LUGlvUnn8mDW{?Q!%|y>& zyauT_xpB|6ou zbH(s;3N3CwhPKwuxWF;bHp#EGpaQ{>9)in;hMv|5qK!jaLo--D$~kAH9}`d=(X|1I z1nPJvFhfHVrOO~up~;-ThX%C>^bFiv+0a@#p-eKNCa4NTQ$uX?X{y5IHKr&q8iBO9G)p#S_R zgYq}CIajA4)1R5EUffu#o~~?t*AzEGsU+<;<}utH+oGIA%K51jP#3ki$! zTd3)Jh48*T8jVfz%{^w&!=QFcd3DE20S%GOzgC|RpjT-4MbKp270!h$3T0VF{MuTuX)7y zNMPQY8Q+_yG5&r<&fqp@sM6ezKR%oe1c6LXEoGWj;64NE(zxs+F@%z%jNg@IGW20r zW=28wll)mkn)reZwDA{AO^T#hDg-n`8h4LIQNJ%SmmgQIiN1<`6WR)^y6P>;F<)b? z^II;V%3tn9x6eujkSdW+(}d_H+_CbLk5aB%a!CPS{%f^lsX`o#ry084UtM-x*$tDy zM|sV|)g{pAH5N#j5w0Kbr$51n$It`XAx?QeJr+WL0n}V)E*f>)w`jABN5-aHP+#k->i-$Fs>m>uX~c;rl49?R!gJv+_e%ZYx)cZpY zNAfggDJM@X1FKpuksO-`exX8X3Mv+HQVJ$B$?}*pE@W1F&$8$6f~zwbKFNb@5Q_H5 zb}6HOtwMrgcX$FqF*-JS<|5j;`q-(T@W`6R#30u%l}9DROZEyRhE8I0h0=Jx#0RG zRZ`mT#w=-Q$7-jeS0#onW#@)T#3HK!D>y-4)+5bY#T$2G0jE4OyBCM7$zMZmHpVZkqhIIaEpcMHOp3~i<+{kmJw73%6{#17UvH9mAb`+a<2@1F)Ej$ zF28x06QYRd=eFx9Vy&mCucYK;)m=QUCnXdW^|>>ZZMZZ9Fc$YZE@o1;o~WYhQgLfa zBag`4X(KZpv=*S%_|g#M@#W(Fugp4N__nywQ=ySwt93@57=H%GLP(a$Cx3d8?YDwj z_o~a;retR2u1Y(|B6Z{|_gVCg@dkx56q8Uj4lw%8Ug6c2&Ty2{E2gkI??mIbm!Nn- z#X4@w3DK)A8@mlv7>J6mG(^NvcAloi#WdrDKNBh|DQSM>zi)K8H02p~nsb5#U%TJ0 zz9Oj;*xN1N?5j!$6#1!u-yTlZsSzL6spI5`w1`IU5L@eGj->&)Z?1mI=+7%!9@6O= zzfsOwSt*PO4>hsP)mi3-Zwb$7;-*>8C0{qDpE|Izu2iX00m`y%!4aAvVgTU5{!+%!BI?A>>*$w|LGTso-u`&>sn!X%H3++{ zk(h*JVga0$6&=@2xy%PWiyPKX1>=`)EE{!m5zidHQlIl1cc#DmPr;IAPw%jKfjbkU zL)7k*d@RUz^fpVfJ7On58xhqiF&Hr01>-l}jl_9W_6>U2YL!SPG}20@&Fa~fuNw^w z-Jc(o{ysp2aJfe!YYz>L<~qG(4%bkU2Cl2UiI9Cw|F`q#l}X;G{Pu{_R&dl;6qqjf z>Rx$8Ih1=vOC%U=m}yeUJH5AOHEnj-8Y%GJgvrVpV#@ zi$kFwgvI=4jZOA%i>g(P%ePpX_eZ$Fw_dA_Hevh1SCT5Ps3W@z3tp{vH)ZnhhnnGf zTmDwqxoq7vGSN9queEtKJVhsRu?ni82HP^wc)o}$l-9@WzJHMK3l*c60l_NRL75zx zClFMct6WzvnNT627;s==B+-@Uq;=tTKL+wuF#6K<+8RNxEJE_-pN>s#O|Ry94tp=X!rv z8x(w#|J*~XQ%#$yu;$g69Xl;>14iqTyog(KfBWK}rchm&kGOcSEX;s3iUmo6oihW7c47u{ga)0GKSRj< zXvyaYWwrN|H}qttvwpc!F$MEZ3v5i@(KVpm^C&n$1$`;s14g2#1ATpH8o6YdNUUCtlAY!oLjr?t4`nj9_`#!-XVNZKnPeDk>X8@@d`$@mpp`JA_Du=fD)9%z z4jNM2S)5f;PBdK=p06dY75ZE~i|KeRfpQI!kWi(%9f62jNQJvmMFqvMnasIJ>)r?r zevU3*?FfDA4)xp`=fWSl{zRKqiR!=LcFfzAN-Tv?I}C%RViEpxMF@TgNiFO?&n-!f zCPu@x#!rgq9rkAk;%6MBuK~r~S-{`iA$>8sCxu#={^nLnWj5L`fwzJ`IeracX1G_f z3MK~ zjybsNy^#`UsmgFz2As||{)Dz8n=m7;j|I>V-Rp2SF3T)#nvcuKjQ!zDV{?zRS?(C6 z_ceEfWoI>Wv01IfakL%-30O{Mbq;A9IK*~2jEo&eHy1B(iureV9K8_FptVt43u7@= z3Ix_I8FcbY0wYUJ@4uG8Eo}f9_p0YcqZ?Zv=2z!t;3lx5@C+xy`@oC4LHInzYU{sP zy!KJ9ws4V~1EMd`DCRjE1_~p7=89M8TQ{t6p3hy^63>Ls-G8NG(Bn6p=5Y|=@C-); zF^>z~8RXln*e{7;er|UHFPU}ZHOSsT+;PpYIh+gMYQ2E<6V}`ooc@7w8RGm+6=*sh zzL<7zBfV{1rcVZKfPE?h>0jdq^^63E7j;MAexHzZ9(Y$tP>{*%olF+k-RokYo+)XPJyzXZclinL_ z9qj>oy+8guB^zH9!c6t0Abr*L-fgU~K0QosvS#ZJ^Cf-2hlVawI-;?3d@5wb`dbK6>17SlgktuTw$|J~ysas2p$nCL=O+X!h`R7(PUB|`KMdM99I zy8+*qjnXQC*a_&6sY|FlgGcBmb3mv&l>K=%fzfms7W^$;Td-b{LKTglHP#)&MZX_{ zXQssOj^g?`<(4aPI(%W2Rj%_$XkrTIXv1&pignoL`F9o338ZoU$h6e5ja*pPR|lxFLd&cL399b7p1fEchg`H$pXd)Bc+wpKpuG#y)rBrHIO^A^W;R zo##G{UX8_UQFDt=k88PHCKo<@xUT!oaZ&XOWi4zRd9!~iaq@=+i>W#cqzlEK0m+Cq zRfqHWhRt{OcAL*xTO7Z?U^PxdEAkJOx^)A(-bM)Pxb=s+9@B_~Jl1mjAdV5e*9v0p zf~iTUHq=-rr-u6F)Fiz+c={HY0QXFt8p9l3&|@6(F|3uX%^*eEDQkm3wVW`q_D_2v zc9UghgC0_MqxH1nAribrFb)23a@h<4j^mDyEb)wj37{R?m>-=++g2$QY$IGe5D1NvvA% z{ZLY#`!?O4wyL_T^qO1GY5R#D`8T2yT>)j0dy199RVXtQ4gKF}(&7SJRh#vWuTdb& zw6Lb8w&{Imh8@P9-}4Z#l^q~A=W@P>AwL*DcC7SV^#xk>zsW|#wK!23+)jV}(+@M8 zGcl&2VybF$Vk*XlF{gK_Z)BtLU+98Vu$r5fmX%ePPSYMV%r<>mv)0}KsPV3JlirFU zngo4zh#(ltsfFBJnTFw}T21Y-%wK^}!aQx|O>L7iRd z<3iJPA6_MIS#Hl3tsn0%pL-run-@YjqG}8Ux^r=r*F={fMRS=}YwX!wznU%y#_t9^ zURptlBlU5(ir|z9nO)zkSXJ3q1iyjaH#JG9uP9IKA$jbs%QxGdJ29BNyq}!Cfzbd- zd6QH5opRjrFw}*mDS>PY8XCOD)!9iNBcuwCF%SxRO#6%=YJ}}(bC?s=QXdD?dy*%4_5&Ps0HVy~2dIskoHAMqRS8n_mzsTi)2qsDK?E4-=FuN7?uM^xQ-Z|VvL^iThN z4HF`PyFXA{yt0c6xnUWGC@f4(^>i**5Ki{Lsr;*$>)^ni3bI0bEPsEjZj^kPS=|1| zZYD$k1KOuwc!vf4jraKi%z@L&L?FI61DH3K%g;RWh8>}`FD=KBc2g$OGcx@_)&qPK z-T7-7dBfZt_$}p8usw)=&ttBO>ldS>ouD<-RV9H^v=LoMGVk?)Dfds1^mmn5nH{mn z0BL{r{cjmx!KwzrUgIA)A+*wOSLH8kD}FY52CdrM>`ACXMOrKsb)4Z<2B7Ldp!c;0 zdjRKvH)k{7ZT&jt*h;0i7@FPyRzwfvp`*FfEn8zGZQF+2kavF5O^#-t+31S@jVp1EUbleDB_|g9C zE;V^h?=RlF77h~0ck!w3G^>Nu z?cSA(tm$zarzD#Lf1yxux_39L2I7wmM0`JoI!Q=srsdo#>o~Y)b%J4b*zpfpx)(XW z;D4qLk0uL!{&>aetd^p0 z9SglKnxvzxLnIf|wIK6)Mo^Un6q1c53KwE(I(`K)K%fm|H_D+f#teFTO108yyZL^H zj%k+oCGV&H)Myr9f9_{hY45~Nbs&QcU<<#&t<;b)vdC5Cz{?n`>?hn0!ecLXk#tiys=XFJ3Eb1{ckPGZOw>RS4C26K3m_R>ia(+Dg9=#i zvwK1AMn;)Uozw!IIeYCcdcB8%f7!go`gFpcKv#c|R&Ow9s<}oA48c`-zKf|YuJG!; z!E-BnPgS@j50(1HhN6`FVOPt1S|PRvlTS%HCPo?o#DJGZ2G9ORw0f8Ac~&;=%<5(2 zhuaAq+az6AI!qvE_`Q}Yt3mB&0EGVOrb{oI&4%S7t+o)eHjMp22))+koawCDc-_fK z4Nnv{%SsNn>;oYVhV|Ye7SC{bGM-m&^={nQ!y&(IW|d3+}v zmIbU18JiE|^QG`d!dIeE{QpqHz^xxdS6Ls;GxN{umm6koCL^G8b=c>d5<&gbg^Jhr zhSf?y)Km#2!w=Yi2NIu?+$!n`+{m&Kj%;C<=%GXz3*5CPr=$r1&RE0H0%j#h!9*nlG}&ycWy3TC|?1OtU&T z|1~Pn%UoR4_Nvoq^T>I7TKvFdX8GHA%MfHd5#tGGqt*_<>($S5US1YoE=z#&tpLJk zCF%0T{fK{&KVM)KMz(1Yo1#GZtzY=%+bU#QqzXQls*CCK9xnHtQMA1=UCv&7shpz} zYsJpX=3f9B{h@Z;b&6nl{v zY|FcJcT0Y&Xt5&6nc(0q>&wnkuzPoDS-yg;{4Hu9b=sBUZ!a7c|mb5SaM%Zc_nv<6)YTwuh-FDbP!{>9&%2+jXP$zgK(%y~Vj7x9*GU6>6<`+yPJ zaJu?dNljh(!9e68&$cDUj;ExO=@)E45PlpdsJEjGvF2XW0DVr*WULit7i&A^66C!! zBD?!rj`z-A=Of7b{H#KD*F<|>5*5^b=^3Shd0WGmYC-~xBo$=#)sr#*SF!v{&er1K z>E5-bhI(y=^s^yu?(=(xqAWH2B<;x_zFh4ke7_1>dR()r>UchRA$Txw-jI>aU@{t5 z;{Uki_g+$Z{TvGF+Guwleo@-dy;O;aEUBpQtXlsxJw0EXRP%mxSiKytO)avozFnX$ zFfh8w|L<}p@Rg$h$LWznwE^dqyuTDYX6E-gF19OtZvf0?r~CR;rl493QH;?jpKCBlJCaLR5)h zbJzX~_E!c>@vY=@<+`MWnJZ5><1jD9EDA&H>36X;>q(2KLhZpxD#D24ABrokki{x~ zO&-1n7)nDlkubTcF;)=qW9@VKI-RKU(x;F?t$hWQNz72js*zd=_zTx>*U+MBF3=19 z`XY=HlT&Gn@aX2SUXd3;^IrRyJK6trJXGC z-v`^A%@_dX&w>cc&3MMiBMGe%DDQ;<(;e~HK=+0O&9bT3cg9;x`*=MK1-IQZRq{d?)nns z{RsVuEqNL1y{s%+pRY97zI+B^oo&9KZ>F2<;>>Q#SqO_HPNuLN`nS7(#>a0ane%T; zWNnH4yuE?-yJR^3ube~!2M)&&le-_a)^~c6x}SAfwWyI|s^ZI6BUjEqdH+U6TlPSqxq3h{FnD^GP)9Qs-4h_G;ua|7vPK% z9;qHEk3LH4*zh{+SUZ6f%LGL+RHn687(9x6V|3zru7Y>zkz1_@%60fEP#}9o45bjD23;*3!=>ooE`I&Z zm+D4kuch*GrK)BJ&()v|pSVKXr+5_k4G_yB>TkxdTjbS3^mQKJ}#yVvUME z1s9(RwlS4G70K}0o|q|5JsLgo`_Jnsj#E78CAKq5-L;zU(ld!cm)=xt0vHJMuR4|B>tPhMcfegt2pSH;sn~PcpP^BnyL%K=AeNJ>K0Cu4kA5@u$k>A|@WO6Phhl zh@aX-0Z^p~Zd6k_*>Rx5trUXr3K$UfQk#8(uVw{X^Y$##{qB$Og0F|PA33j>xQ-e| zux5~m?l9WFPt}>_{JCgQ{j-#+p)*vvMlsk!Qd;J^(Xan6qU4jO`QmH!nf1c(3gw>K z#A2-j8zOYyj;#&bqkN69B*N zilyt4!~MYUzQb@v_{s3u%oQs*P4Yf)a1XI$r)8ax&n+yZ!q}snJoB`fr;S{%t`8_Z z?n3iFHXIj-g06JMh}!5-6P2$h4Trde4`9`EPOsOILOA;0cXdboSyjCjRf&_AliF zz3l&Dw*NEHV8#T_Vm47vrBt|-%4#KjVvkWW_u2f;5{P{75@{?GcewjJQiDJhKRrhi z>9kBgM~Z{q9zNbT&riy#oH~o%@FjLt5*hR^J`tZb;}d)C*QnW0pP`#@aGgX3YQW5W z%a$Mf+QaOVut$zn5voRxBU`FHEZlM`$?rCIFP%9ShI-ExB*&;*3P7_wVgv>W)a z{db-4Wl_2;z;nvZEA|U}A8Pn7+%gQ5-L{_MNs_PX+regm)`NTgyH9c$j7_j8(<~)n zqWNXt0fn1{VQAaGz5(a2FJilYK4w0wu)QXa9d6$vWl^NO5#GJ)9)7EO_;YggA{YJz z{kaAoF!xl*S)ef|mz@X6@R94sqgsayVW1Lis6{^|`AhOcjPe2mrgWkH_8#{?Aomjz z;0C`LRegGz^tP?FRIsqLw7dNDx9UX0Fqc0)4aYcK9X9&f5QQEEJw8qdk?hd}QGd5U z9;_Jp*tcCu#k?#yfQ}6UVO8xD2iI2Be>*G$zENmkK>aZPz~s~8@6{KXUclmD$pkVV z@i^rCdnVLV?B9nle27Do;{2AaqJ?2t4)xh2FwL}=I5X^HUMS&T>nZwai0zwBGcIKUEO;Is>wca!01! zgIyi&SXMFo&*Dr_hi&0!m{3Qk&3gsMgn14B?B%84oR!}2|7URZ-=B}87kSE3C84E- zi-v*0IjgL!EQ6~(H@C+#2~tl(Bc-9fp5r@j)AYxq2nuqJu9mxWPUWPVC*HpDQmgUG zv5hXX_@ncGJIiwbB9&ZgJ~y{m{b!VLtT*X>wo!7dP@^ds8s#&XC)74+X@Y3EwG*kS@G>Z~F^SFXCU)GLSu z96Nd4iFuVypwCdyHVFIvUo!1qBZ6jMz-tdiuYTBB+$Vr;@ft#5I^ zf4AuiM!9H3KmL@qPP-B8Eq(b>yr3m+@%wMYmxv&KJ~jxEOsNcd@0SNj@#h-W0}@@z zA>DfvIZ)9*Z0qOQAT1!UKmm{!VdMrt3iYAv18BAtP#Ilxc&XZgugRQOiLRpCxwte( z96WdAr=13soQp!I;sHrge{;DU+sB-Npixa9BjmhRuOopXQ>8ouoS(tKh`M%5rjOjiF~8XY~KppX*GOD3{}w*8$nQOfZb-E-3Hc`*7K zMhW10oFBC#A+;EJkqbQJ}ba%2AQ3ZR(Hv z)Sal-FD z{55tN$E7G#e_YR`lbR%>EFm>hkU6=H>sZKgKjh13#r?{@1JCMu%g?B96|Z z+%Rdrqt9qaXY0M87|<@^$I?aThZk^;+MonA=KToBU;A`>$ldeyi8$-6U-u|UNE5mp z5r3jVi)ZQf6Td_Dcqa%6KOG>^!mJ9iS6#0NGpitv)_;e}{mZot>_R5n9xC=pMKeeW z^cnFRKM%ULyp++B;|sgUJsIj`CUHLUAezynz|IG`cs7KS`mx5nZGq z^1{Q|6(7n@5d1DA42#Kfi06(J$q#yi$ciQ1SiO!#V6(09i0{UiU~+5Tnu9M1_V&o{ ziX{yS&qqZL__LMhe}_g)1uj0UK@5Lwmz28{5}cD3Z)7JAK{c3j?SM(3(;SeP>DjuE z9$#0m8FN)SX+ZnBUW7Egf#$INC}Xcm%k4Eg^`NBm;jZij$DT!Z{`%I!)25bs*sZ;| zu7l8BBs{${Gw)l?pS2~;CYFfv$`7Q zNwIpC$zg(e3(_gBuEsJc!#++Nh986)xYqh&B$pcYNI`u8+r?LK%^U~92XqO?kb0BD zyNHhb>38?vyAp=8qs|RrjTPUKIghtu6Bk%+utKU#Ms;@IxO(SnE z|1k*vC3n(cz)B{uXw~(-L1x~j|9T*v(da#edVaiYHg!Iwb=J6FG!JGlJDsT?=IDMh zr_Sq+Ng>vqcQaD!9X~yGzhAVSR<=$Q%4Yn#TgZDm#^UtyndN!u^}wCR?R*hJf7+BG z2Ei;LF1Jf2t2J*B1NW8I{_g*jzZnHMveCpPk9m82m7;=Kj=(udjka0arW-0Lu8CHl zI8wcD79F+l$->T~AkAmW(H}}(qZm{vkg1kIG4w{|>NC+Rl<*U#=~Mnu0Sxu3GP7?B zPdFW-1Bs+Im309F5|9KrHd-`VflD<%=SP2+&G~*q8-@7EB6QA>IS1qm5h=N7wEfs{ zBD>zV*l!uuyzj4dguaZUt~9tvTDn$c4LcbcnSt?v*q3G)VhrJCY+wMzOzQI9Z$W#q z2>*|)cl@vO`ND-8qe+8CjoCP9(%80bv$1X4wr$(Cc5ItF#>w;5?|h!~2kiUB?3r0> zu5|(9&Xp&A))d5ytdS(p^nEVm-=gq~n#d?AU2*_ok+;R@B!= z6UVn)MAMXaLf%E)R3rD;($#gfrESKjN}+{aTfNF0pM`hrw*Hal*f0+GOrz%4P>;km zwOb7h`xFl+;)3d5Q7&s)L5GFtZ0)E<7*ZycJOQ@tU+% zN?bgMoz^dDWqoPsU~-PBVY6a#M~{s=WiKfyCw9WNZToG^{G)j@fkUCxPPI;e&@uw= zoTA?ArSu>H}b?i2Hf$;$%r=C^32(AynIxNQfZV^sO?nL$GR7I7S%tZ{70(nBaI0121}igt)eCz%3~jbEq)!wr1i1=uNQzJR2SU+jkpmR z<&Gz>{TPryJYVCZ92Lkyh0XU`tF2}v`29eI)=R+tOv9K2x%XgCz1}euv>cMGa!V5j<+(fieC)a@{NopS5UqbH5 z8q|akS~vGto^$cywt|E|92bhBsxCDuhBj6I>tyEu9*a6C0qtp52#Uh$U1!`!NBTO* zfQC}xd6kVSG+Cf_n}L#gZ65nx`0UyO@J_tvn68ZA)ds9VCPE2Qb+9R!z-0yi+FL%= zlPD^@sxckU0LSLr;{BT-TN}&qR<<^o%G)6>M?%8{62~oT%5?UAmPMLTT5oW&hQfQx zI3zj3SSZtPKc;?Dv8Q>*$KS2-FB5LT$c)erCdCQ!DCzX5{a7H85Y+jF_t=&6w0)+T zFB2p)vxHCqV;%H_glP0P7sy8%5(Md(`(^n%lNmsuy#}g0CuiaRBlyY}hBsuepIWT9 zS}-}D4d+Fu*BUU<&GLR;I?UK9S|eS3SWIW$EDM+gPd|mGYq3f^ZMd(;1cGh*Bd>%k@|i`jQ10 zzqPOqcAZu~M$4UKCUmx+#H>S257`!bk_SBQqxHN-SvAA9sk&rjBw{hD=fb6);_jM^ zS=-+itjx+2N?6?)_^r_;7*DH>TQ5v{#OC0jZ{lX1adDy5_OLN@o@$oZdU}MR`!uG_ z74bHL;@KdbGW>BnnP%G1pm^a9fhYEwS_SCnf9@tVAH4`u~vdtUizr)jl1eMUN}lP)|u1@=poQh3$=_mJW81Q)Obmuj}fgK;1FWE@zK&A!Mg z!o@Dh*V-c;na0m&2@-1N5w?`M}+8pqVkl~XExdtwH#AzVTfDTV2b(W@{5b|xYc ze;d};4TLBtt>9xE#3!nUax>)$k^r2Vd&+CaYhT=`NRzaQR#Iz5U1_=&@G<|P|-f8Y9;*CXkP4k+alw+-$`qs z0^?DWw^im>zA@=N`GU4MVcErhLHuopIM5u6aELQz47`BkZ4Vk&k4A){gh)T*t(9jg zq@S9s7^(9(-Er)xFG(C!`y8F(e5y$r=?o2->MYyO*VV1)F46>?+9WZ4gPz`NQI=wx zc64+o$$jQMlJ#hPh7hh4P{kp%T_6SDN8gGZh6v%~3s_SS?sJIUd%t=(eSb^bMDWQW zjb#`8U<=krVxdc`xd_TW_Wwfuv$zGe z{aKwA3%#br4`$2x8IP1ki{;uy@}{abOBbU!qP$fY16q||6BcgA1@Mnn=*!_hcB63T zrlEFBKTGb#uRp5Na-mCV**ii!z%oLYE}7aUvj*UW3xJ4g4NZr@bp<=~tsm7`(%bNTKq=UMGlk89}k3Fu%E<y+<@Te4|GNm&f+98(vWi?S zP6b7>pdqMb2G`09hziX-sglexeoh%}d&!4ev^-UzVpNu%*oFw5^GSD@rqLTV3L&xj z{n%OzzmFi)n3`JIimF!>#W|s*QAaq-Ij!HR&a1Z)uwSIE;vs)b0 z71vFQHE?nA^_F8uFaY{<)P&UO&gCNPl=!K#F(?Ny(xzq0#3&_@@&oumXUN8=pP^jO zWNtykrL!zu3{?Re3uY}d8e=pVx*0IYxDUeSLl;D^HCRnOk?{ofOzhL<8E<6A_)B%B z(qF}D)&TCt{DNrml~ry*jaO80v7F;?$bpR$2k&zDh_@sZE>16jj0;|`)zILO2mC#p z%k7BvhPY(-Wr|=h7}yEEHPd(zn*LUD_z<9p}(GRKJt;?!3N8z!+{1b z_h3wa6qaYqg15BV9Lrv4*b|mNxZSKk4V4|Tp58At9snAthb}zObW`|<7{B~#=yc4l z{Lhyn;~bS$i&OHSh~PItE~`GU)jb1T}EQxRkG4zs!I;_}7Hb-mj| z>7e#XqF=a)m*n#Lu5`wL09d+jUYQ zStIiSMUa~h=cm2&B-N2KJ@8nKD?VWB7wsZW;d}*R<$N@q>F_DGOyWr+ ztJ0D@J{?Z=6_QweYQ^sn=`~LtztSXI)oR6P3M3mO5l%UfAYDaqzt`5uuztL@G@36D z=r-ncmaXfqMkVqthT(5E+XU4atF}8QdK~d5!5hK9usdfz^NzYg;2JRh*5yl+FA55E zM>^tuJHB0-fn!Nadb#X+iXMwv$mFNb45a<>9(}sEiAm(bKRWltk9G$faoT;Roi)au zP2{e+vst+yNajDJ2_pnLn0xNIlu#_;VuOl8x;}ueX#jr>${!`R*E<_Cq=VhV0*z6b zrtX*}jVLmWYfKMu7m12g&pcE`SAIYv1U?CKQ1v0xBXN{r=}W(xn${E{>2|W(&+rBg z07{4gj`l8%L<~<(8NDHuhOdA?{nzc_L?v1gxA&(Vh2vT`Bo|Z}MS2DNUGhTKuTmbn z$@1pDUG5n8*@_5Ybmp4)?Z0Ef6`{YNUg1vF!Lh4uj$eafg$$I}xgnI1FNvTG*yQF+ z*p7TV{Kx{FpuWfaP@Xmp&L#lHA>871*Dl91ihqY{i)@Bv zGW*>J7`B?gvkf9$fy&m}5S9PKJ)NpNL5xb*?B)tCFI}X@`%W#d0p=;PugjAp6bpT<(;2vHb(y(u6i}oZd*mVCS2a63`yrsoCq7X zE?EP%?!^ZD61cPerjk=!|r_2a?$&2bddd~Sykb>*31s#ItfO}b6 z4Kvs7GRG~GmUM6+Rc`0|%$b85>Fb3D``L!NJzN+D4CXxC%RFsH?Ot2|ZhXkI)-L?7 z!IB~c_3;qtc4OhTghfY^^Y=axP@I{oe#5#g1}P!<>(Nd<^5`e6zX-lY-p1Cw2%xwzz2-klF6Af6uQMN0h4ft4 z=(#;unf(Px=Q4J{Xb|7jkovn{dcx@Xf^@dHMX^Z&l$pq0&PB8ON{^;+7z$H)%ZL=1 zyRj8g4+g@$HdqA+sp-DYnIo*q7t`BCs?tGdHz9@^DlT$G*M%EFmj;THXa(v%czKyM zf}*#79no1hp@&-we0Yk6&#e2V^Af0To&wM}>|N?xOq7+YR{?mIL2a36nX*{j+( z*F~f3(nGtfHh3SNm6CBo{WzVvTYVDpv;D>Qg{lokk@+$YSepK)w?dx2y^-BW#eOJ9 znh+h`S>kuc6AISYJFv1PWd=f|XhKba)`N)@v7yeFNrf`^j(@-uYXCleCkSspT^t!r z$=HCpz=Z82>Fi%k4 z>KW>v3=T}j!BYh*v?Qs>j>s{*?F<1;=U{VEsqNsttDAX+WJ+pDX6no{=l zLp3M1oH zZj7R$mX%7Bv#1Mw7wI4W4rWM$x>1#>8c8#q1K>rBn?bd_JaELW9Q*=2&du#5>4L6d0_mF8ZLR+^d`=GpTp zZEe%$#?iMji3Q+QpEPT3XIa@)WxH*Sd|c4th!TlJtwqb*eRigm=WWbYbzS6)gKq55 z(}FT>&1X6Xop51Te%JM&xNQ6)1IM_=ZDoX<;kjIyvv#xfPmtgW^G3F|pNBDcW~;1* zqbeMWRvh$mrd))2_G`@^MJ)>2>B3uYyxkT&YO(F(|JLj)XgE7?Y>S*OEJ6D#sC)tM zW%H3I!mztpNY0h3p`yuAD}cp}Y}T$l!!E@;(v;*IthaZWdQ)X#UPsc zV>|L%13vElDK>Nd-os|(qkY5+Pf4BjMK7%;GgNb@CZhQbT7)@*5_nR4+IAC9en|@p z1?ik)TOeG+Li_Srts^+kH%Z(|Zm^ekE*Ge{3Y>O_QVtHLx3g+p_i0w0YjO2eN_^FjhLrqVLe=gU*+Ikp;{_frN+t{+Uo8j35k4StLyw$^)(*qVL?}i+HA+$&%6(O2IT}b1_8bPu2@i|)qxpRa@ppU{|Ov#vXBRV zN>e^&HJv_f<&ik=u!1vCg5L@M>PD^62=S%(_mur3w(3th+h|Xr>39ja%Fdt}rS;Os z=MgIdpy}=pMws4WSE<+xGZS_uz^SYMq%7-M?2@X_m7*qUzkv>9snWk4qig?`F3cJy zi|RGQE+VJbL@}DLb&gF^SEmX*mk)s-BqX_)-D*MfgT@ijS>%2Hxpadeu6iT!fGu|C zPiU7qr_zG*T{JApba0o$DkhWbj7z1&CzUfg9>E9iW?wv(r3#Fes|JN_JBGksFlkh&)i(Hmemf}Oy-azzAV}b_}_{D%Yf8pCahc3f~VC7 zJ|n&pSYefcLVvng#a(jxD)?_bY9z!@*0*~O{V~V(>@7*jxR&Uy8D9z z3B3QK|N6B8zi;9*NsVpJvgRPZF6Y-PN!{vFHH!9;37nO^5;$3c%(hs|Y1}6xfiPQ= zASLeR<8mV3qIcG;oF=hm9pNpR6SP`ccV8?qqHz|Twvo8>>K>1~XHXr+ER}iegtlwx z{%sdwO$#){d9;>VlIgw=uQt;Gi~3HGRLnS<;I!#8>t(-9*&r=e4%gj(!14b^Y}U_+ zEaX%6B_l&ocvjj^qsmgHBwi0rUWblHz|y-o-zn|Azlb4|Y~cAUi=PBB)!cErr`%5- z&(pY3@(oMi+7-imiR9O9bUy~FJ4e+Lw<9(I2!SOWX89Hi}=%Mm`-`fhe0W5%wShb)j zvi4mu(B6JGC$kX_%gcyh*$%5wjUeEM1lJH`&JVLzotgp6Qz}lgQut~cWrIa2Cai?9 z=V|iZ+Y*9J3%kPlCF-Q{CbG`sjP;I0%W;*TjB~}KjaD1_O<7IznDQ*`dH$Ps7nW_; znWyD>w8mEEYgScNn}0gYosZ|Pc<_n)*Dn)3_0OIk3TuUn9;{3`lKthZlGTvxIsMra zD%0<!;W) zVcoh9J}ABG{rS{le>5Qo`}SYzdpFT9V$euo^cdaf7IT(RD+`bv^fIZ5 z((O>7eAQo4lqHx{?L6Wnv)BQnIH%OD1iql(!6ItD%N+B8BTonC+)yhs6Gq&ulSXy_ z;P-w?>h5cmGl=91WTw(Es0lz^QH?)&6I^Z5jR5jD8c%BKe8+pl$UOGn8mw1cR6n&C zM86>9NveMB7j1kA;_jy8{4+Pny-86=s#5#rJ<#N&@^Qaj?tzrxS?)4=Ao!*?8_ZtJ2l)F?!lbI@bBCq zLSn)EQMt+Jr*$L|#5Gvq!y`dIc!DjuC_0HdI5Ho_s2y28h4&8-`F9TB77_+4bo#Fp z&-%&=wT2UuAnFu}mCxLdNY_ccf6C=&ywEk_7Rq$AkzqOZO?z#$e2mGOtOlw`_`?d` zmGdd9`i-E$uc;3jXdgjA7;|xFv7|YDD$WmzGKnnxj;it|jYAMK3-VPT&KL9EI~&9k zeX1449!SSaz62Un>R9!J0;gu8F0L)}6yCm)EL3c*D+y^t75)sZ9bK8?cq;zv3H*lL z--TPo-$u9`TKC&r%jeg0;Hh`1=x}_o6rF7);s&tNDojTe#w1cq_cJZWl7`fn(gHRP zTvgo^V1w)*ty2|lxr~8I1WO8f#&ezTT$F>U8g8yPsA1^2flKSDX_)1FX`u-qV+YG* z2`_~rT46|VTe#uVmRW({L0uckRot$Ye`ac+z1X&X23kJcp_NzgI?`VFoZN`TaFH2t zm$UoXk&-=E*S(kh|Msm2kGGd;yO(HM8jW`68XFrMBxMSdMe4%BH7#t`|LzTJ=-?~V zCv`o$ZVqrEVOkWFjdjB6+{l_Mlna|~vJ32!Zxlfv`o*J$k_3vDcvbJMLSomC)Kg=km$8_ zrRCOzoq=*-(eU}t`ZkZq^fB;!J?Coa(1#T;=E)|-G^Z8$(+4%?@%QBT<%~n=#<8LX z6?yp#!xmDu<~~eFRP6L&81fKSvhjBj3#On za8fjK=c~6)kUkEO9`O;U-|&X;I5VTvtuPN-UBZ_)v?wo6s=-d3RB}5P^x%J(X*X@a z8M;Ey-gZvXoO(E=2_}!-h|!{lGHnNzQ9E3iV;vpWcSd>)uigS0G9;Y{L<=MxCvg_O z;k=KR@EoAqc_i|ubQ-%gd6@J_w3)r5w7J;!dS3P&t~eZq*TG1NirY?&6qb5u2TfQ= zEgf2=8z)VfG#a#g3`0nsc~zwG10r1H{cX0ZWeUg;OFY`VD%05n}N zn`eItr-hSeTEW75IVKt5a_OEd2Reu8>}q@s59X-IAytQpcx=GN~akZzK(AT$hIk0 z$5YfseMuANOFxK2rOJg*a2{`cscm#}YKqYOHFKfH0an`(z7FL>K1!A&)Fd|hTpi`| zoJ6}+-x$8`GDqL`a^eC2o>nx1B4>t^hWK`!Nf2b4#t>n|87D0(#D?Sv6ZB}qghnzN zPAa&0{0jm6OCK$Y>?U7r?|(!eqHbEFUy60wa2ZNXOS4#Owz*IN0j5g-$G>1v1>f5v z)HBacl6)Q&944P>%H-hw!NFfDmDy!mfw)}MaT_{-y*UTyvZ+9IysQ@$uMBi|UrZHD z7&>$r6sbR84PFUN#9M|SJWf@~&`;`#tSI}#q=bzp!r?M|t;i6=f} zG3sxlv|JO%gW!lMu#ODYk+|BpPS}A1NFP&o#h=ocTEz%HM{A!rWpkrWj8LWAGcE<= zc3_I5x>(mwsRW_KIdV+=MYU~E75HG1u{T^i8yCWMK~8T+i&DcDzvv3;t2laJtT2{r z9%WVBB)$2hD=ygbfbs=DT5(IQ@8>}WrE8Sq;~X9|XsVrDe%LQsy2j_XPYx&ZBt>Ad zi2VfA|Fb!%L5tc!j)l2yV)(mV9=C%mF4kI@tTx(vc0Wgbepzo&|D5#&5YJK55k95->&8RCkbKl&H4YpgMk5Ldb(U* zj7~>zt4(jx65AL+!o>s)bY@3gM2LdNh{s)0YNENHd-7+lMu@I@2(pWKF<*)VjH5`j z)b+uvD(X7i?ze1k19+-brlg&INsmqH8NS3xtHNd06+mxl9o1xXxqqVt29pHSoIefN zMdunhJeGC6WCXdi##clfr+Z_et6t(V@H>jzvx5AjpGxOmcI02`YPQWdU)nUoYdzyj zTZpfPykIXBl_?5;g>CvH52U$*_}O!Y8%Jf-Q0yk zJ^iOQ`p-CF_Wh{;aSfrt^RLHrujR;UThit;2(7k>zqw*i28qCCZD4`uLP(PR4E_=T z-A5d{gpI|>1Xx^6hOjI5@=8Lzwzf18Rc)U()2w>OytKcGNHZXb?~JIB1PmKRJl%UJ z4a4*Fi)UOk6H$76>8svRrfs&=s=iBoxTu_>dqzSuRi)XA?){mc#)S2KMJ@PS0{*o8 zxJ}HqE7uXBCb|av1jWJVHjy73o)xI--B0!)o5873=;?!$R(nXy20JPNs zPw*HP+}{g_scNTlB7EKxLNF9)$!5=-33~7TCwKfi;Y20kofZEb;=idSLjqg*@yBL> z@|w?>*i~PMuaRW07j2hZJ1XZO)E<8+7*^Yysw%WPR?w)`6x>$4?*IKmx(T37;+izR zP3fCs<;FS!@^g+WQYGGZ37~_elwm_M`MAukReD{UEE>f;R_N`}Ro0V3(A?e@6VfePb3SM>SdA)BzW>+Y*vB%M<)&uZxST)I=_{ zAf*UBf&gF4j}D>ner~?*@@)B!*duLii+diE#$|fkt2!;aAzhNnH+BvF^8q1rP`TX0 zYt+b{IZdIrL)FkYEN!H9f@Nw7GeXw^e=Dd~GRgQ2@)rUYUEdh&g zh3K&pZmS}bD$wcMkCc@jZ0;o(OCs_7<;Qp?;xr?*PG&O)vW43gDT;ujsDA2|X(Nwl zprDy|g>VS&zzT^kty}%DT|}!)(RU^e6%*jxwgXN~4<1V%^sl#M(sq@UG-IM!Lds%i zft#1mk$tGk@W_a&wZB#eP8l56{i^HJL%EVO*Ck1-b-MGuAu3X=_Q~qwp0rRod0x81 z9a9t9U*DZ6oH{k_yR_ZGxDEOz09rxnNvCYS(Y|aoX(u=Q6!!O{?uegfN9K`IcvK7( zb6SZiBgi?H&LRh#91^K8LfAoywg?r~k1;tdiVNpENDc(NrGxtyx%wJnd>TVLm4@I) za`l2Gs~=p2{er!SBY9lC-wMcI3%=i26G(%TwAOX#nCF7Cf~s-J080bSOGDUh02^6# z8Xi~%1X>UCWfjj<$R>dZYIns*q^a}YLv44xau=Up^B{bzUl~6}4G(^8yh|D?Y;aJe zr=~-NwZHF<12LwMuTu$U{fyxcOErozS?MXIo7sJ74W`WowtxfN#aC5&y}FEq^C%wq4=*0=WHmRh zDl^dovNY?14yBC*>=RqL+3d9trNY%Vz=`wg0s{ACz|Ie8OrnSYA$hxkekYgQhg>Nu zO9LV`_*29RV#=v10;%V|f3A{WrAUa&WQO-moj@qzJ9*-^Nxbtlq!i(45TIxkzD)Hr z1oE9G1#kwS3>5W{m+KY)iIoZAUV%BVPVXyWU3tM;4Hw~T=?Z`R- zk}8&T4gY&gzJON45t5Xqg@@WBE-I8NV}N9^=SlV>t$gcOtDt55kvk;IBbDN5 zkmqYBjO%qtWGK?d*FK$*sX7Uk&N#p90!4h zm+pE0w5D70NGypHAtK5dc#`DADuU&Kd!^6hu}?ivAH6_k;xu8`u0B+#ZCJ3nC^kOL zH&~c^M8BAg#lBT-_Q~xfiYb%xs%OVuCfe5F{~>JYmf(C1weudjv1}dqs;$yR;XL`@ z=&xeaw)QJ=h%r%Rss`9~yrjavlv}8v?7N!Pn7q{(jrEZUQV5<<>ZA}DR@Yy(ukmEL zJm#r^fa&@2Ziske9V(2P)F&^mXz0z8aEOm!Y_1`VO+ z@p;q7NQW7=S;Fy2*K?_RUQXAEHU>U4b=drnb$S=Dg4@0a*#`;Nt~)#zkF;C@PtfB* z^ItxcuD5sdLbQm}9hgQ83%Scoq8RESKl`2UlkT(+(kwXkEM1aGVMB!!9hZHbbS6^# zF)!6h5F3kONo##VwU20g7@5VGilIq5V=t-p`?STq@uU*?=y-|Nm`eROT3c#E0`uLC zKyU$Vlh@Sdpa}p88M)Ky!e{%){0a-$Ui@wz$Ew3I2RTX||G2)pbQi+cU=sjDv6?o`v3v z{(n8d=d&<6Q~{+-i=d>^wZIVIwc9Ae<)?{klxfr*@(XkLb>zZ1h!b&F?98ENDa>P(kKJpd(ADAWGHXB-IY$QRMWAW%+v{p;->6Tl-<8(86a)zh#&l-DV~ zpf1jZ$2bSgQp^?XjG9ya;J4?RErxgO0p|-IL~&^b27aP_?gXzI+#}NHHlspesu9Jc z-1k)JuB+wLL-xFFp(Qk<^IZ8ia32%w%@TN}xccd1ELd~gaMQU0_kIgQum#O)s=j`Z z$6w6`C$LP7!1CHIWKyhPC)Ed0LpG~Hp_w2T{u6&X1AxX?yT_4(K$Cw1? zFp9@LhB$o|$0-&qvQg}|*Ku15wABVyQQE$7zYRp zfx=Vw0S ztYUFe=0^~VRzWO&ET|hg`K)-c6J`6U$~X>!$s0ka^QT>5*Hx+u{Trt)TN%9wZu3-yR3P<5w8muz`K-0WNrkbix+)A&#&1U=Z={P z4fnp$%lruud;bFhVk3YOP71O_+6Uarc)+8M5~lF$G1h-fvld)E${4~O?&jQZ-0?0t z0fm)lPU@c3*gNwQ3@St_Dc3nB_XmH=Roj6iFaR2*ax+gd&teAgHxh7~SD&xsDfmPob@sbL^pKUQ&+9A zbyZ~S0agv&+0Hn4RD{;5%4U!V@Sc@SgS>KY<>5i3%t_z4ov+#`A25=jST`y8ms)kO z9U|It)tp!={l2vF`O!NVS}XqQ^>eXr#T>VGDQ)&=^tXx3HjfB^-4AM$%Ib?<3)$+X z^DM>A!KoMffzWkvbtz0)uI4pSaz&AlW;{2EypFPsy_*SWJ7}&0&E>a*_j7!-&l2FH z=YA|P>to--PrTTo^Ymx+L+-U2YVIaL++$Dw0zY)HwE(iA*t~#H`R(G*K8)#wb-nMY zuje%GyOUEQdvWHdNI|u%`@2%AkqkWb8cMFou?j!!Bkm-c6ov*XT%m^4P=B=Wh$Gx*6i2*1W4talNd z)`I1TV=p1#>s?m+Bp9eV*)ghCW!-aOu8T64G8A{9NF*iJGlSuLY)bSW#J&Xzjcuf% zCB?7PCDApznjhq%6_maV5`=)#4x@0e^NNwgKFu-3)^OXtPVhyW4)#H2Cl3|1D;jf9 zP~lb=+M|Vgua}8=(&rqJ7Yc>0Y4+i5^|%!=MlXiMXA+ zJ!I(qC}7*lTA*#XItfsc8nAzw{R?%<8Q@NTV+PzUYfAhId?64~JGKtbgfVGIIqlu> zUpk663+A!ihurL?g?dp{?;M3aFbVd)eW_{`YNWCB2rA zU*(;GnY+gJ6QZ@PJE1bK#{)I~VE!mR$5Sy)dq6lzzP44d!~N>D2Xh1~9nLeiaxtGs z-Xh~GjiwWR+m=L*stPI@b6R^Q zazgE(QDwIY>o+Q2jkg3sPU0kfK2>5@L6$zb(3f8 z2Z3i3OsUPksZ_sekq|o&qs?-E;A4f6gbD3}dk89ouk8hsKcZeM5^6(=Qg8*ce4mIX zuFfDsmAw{{DIPQ9AT|=n4{4|5l{f%>7sQ<)G&fjAhC$h)s1Mv>qfjYbMA{SPEc1(I z*E=jFHu@B+Y8|e8`ic*;vry;`W`ift8`vsfT5v6?C3qg8M#iFCCBLs~S-AGU?!@Hf!) zw8PLL7)b)#X@25J$>X{*4ci?_56bLTpdc?U2nATU&|(L&;njEQ0b7G$GCyNiy5k+N z9O;J^l#uFR$%!dgxu8(ZD#OYh`wf=79<(fy&CYVTHB>9H_H5v1(Z%-4o{_?*ww;8h ztrA>+MRgWib|`Q9nv+HO%~%JO4aJjphvd0KzaS=}qvU+`lm6tBD0LrJlUPbY2)5+0 zaj9?_!a<_@`t`K@@l>>lj$iy7j)Gt>sP3*DiB)7S)`8JyS+!oSqw3-^vXbpYw_sAN zmK8zTz;;6IVn&Z@Xj>G8Dyve+mB0#L8TP-!x$U~5+$C@cxzJE5{a-ghB$Urgt{hi; z6`{J|&o1;5Oh^>aS{DPi{>6L7J9q>bVBf-1&@N+aCxT#p(A(nE)$OOMEu?Y5tuTvB zkE`pST9$4E4r!XgKZ>dtGgcE~NIX&$Gbt5pw9BoM&x@S&4KhFW8NnkQ$_`1@6G=|o zk;V|(n0#T^*&yE@X(*I#JI7W)2+BXNGSRqx!>om}6PIy8jz`!iTOuZ8e%qwxR~=>g z+Qqu5?Rt_7kRnw=)qzb0{Z=5>rU(pe_uJuM6@0 zeioRsA`t5xS?w`yD(|q45A1vsgODR>sPWVZa9at(9ITxlQ`{ zK&uDHhE~6_aC~K7@aZUnRiC|5%rmEDA=NOU_m)wcg8ZZ{Tt>b7rqiY1iRjKQ;vOU| zME>T7qJiV?7+@3ex{-jwVWZe=yGEMH+~W?HS&P&O#oFh7;x?`Cl>1x`V;e(ymdIX0 zZz6I&vX%QM%J+4loaj~34qqZ1s@c@)knA!5)DClo`&#Dz0>lv!ODJMxNB4I{iBt=4 z?k@$N@o!uh^6PvA04yb0!lz}C0U-V}zcPnT{OVlDPpi29_gm{hL>7^)V22q`+yuD+ z+vVJW6FK8@#iF{MSe2q^1K$i-oJ7SS&#z$|i)DymYPhqq{;jqlQL=mLSz*@{e>vQ|Xp4z8jJ;8Bammv+V%glpi@OMa zQ_S}c`Z3!uicOHk;R{q9Rf@@|jVNor-IHZ%@PF?AUfQ{(7FmkDh{Y)O!^I{;EVPB5 zg)%p_uSOu9NycwfQFYJLc>T{yl-HdD*8=e*gn`o41KdIjYyN^$h(K>>`{E8xv>)$_ zLg)#sh`@r3Uf zJx<3uh;Ywa<3On24z^HH)-;F})~bEAqAo1Q9Bg_BQKmU1<&ilUta8iKJ{s2}fIw zk7J9MPf}!1R!BavJ2cS_PhbI^2C0CgFq=keNGPK!G=|8qb+9hZzr}Puh)=CB78Jyg zYhEdLTXS(eeW$rC&o~8s<-}uXJLc)+ra_eZ}#b{O4W3^#xo&X#Qu6 z`c4uBU^S_sP{D60CngJ<9n~IeC4e|JGKmFagGlBecO7=17RVpf;DlFw(aCjse$Ica zVhyfFp=L}?J;CH?US}99D$Z9~&`l1>`V%=O%1`uF5oR^nS%Wx71osRZf2hf7(cOAp2ji`nP?C$?3*H#T(w z0sDx2U_T}LzFP!q6e#F?Las*uA6GGYExn?$aezCoxgO7Jh__z0APQQT%R@_E+1$_R zNH$QiHplZuW~K6KvqYKz6bZ5>w-Uc+jWmr-GRhQ@Sz(lSK{EA*FwgdzH0IAtBN`iv z`2Yf8at*P1RZ;)8UuYI5zF(u;QDds&3*6ZbpM|o3TEoUAL}tJU$yU%>+;X6wYuho{ zd@f^Cy^4=5lhv}Ge9=_3ee1?H@(LQslJ0%?24`Z?=jcl{jm5Nh z`?v5pM_uG%qcI%~V=&d5L3x@kBmIEJ;1fw1n-n%iX_RbPb^n^aNdl(3D4rhb*?9Wq zD9YmL-Cp#-W(4eq2Zz+)%+m?tEvG71em>HhL6Zt=F3pyc15v;Il>Mr$amW)*Q`%*RQ; zsMgScbfCAYu~SsRv3!9{V`HL{dV^zzru}h&nCu;0X~u?vsmbZrfp z2^J2exoNj1zRk*BTJT4ghNJgkup3*;Gvo~`vzMlKSk0W>iSxli^!F`^3=H?oucpr+ z0;$5imf2R`Zm?&cI;wwi%X#2IjlYf*(`1=wOEY-EmwzTXZ-wI{F5*pd{WtZ~VZq-z z!`4w204U&-hUp~`JE3aR^~RxeiTR|m=tPeqnhAO$B;n80M*rqSlx%alsKpKLOpzyD zX-|8Or3m=k9vqHa|{CQm2P8 z9m|3(TkO(bT(^#!P_@q_dJ<^lQx2;cs?C!i`$CTe>hWcV6DEdfdJ{^NL+6th*T}|!}IG#`%9LI z9p-HwjOvZ6D}t~bU}xoW;p%Q`1! z%Ublzrvmsp$7SKm*0ESbKvmaGY=n=B*YjuasO9rjg;L1(FQSFzO?B&;FZ;Vp`T*?J zPJPn7qliSka9C9lB}i$3qH1ctg@XvJvl7yeiNtm1JjMtdGwSa@)xX&`+kNJrT}OGE zFt0oNEzET#gp*X*yq(}3)w$t4mJgV;4IkWhxSgjMXVn-kYFkxQR5U)VOEy}(NVV;R zmJy3M>gTe?jP2ut*+q}K4ANV%KRB(lyL_dBK{|iUF1uyH2qy9hjYcJ?dO=s(s2wSG z;KROL>Rh+&;AFDcVQI6yXTVw|8(pKCLOH?7o_Kk-7(1v)EO#;ZYGS zt!Nh(r;!1t(*P;b=-j-&ShF0{c3b}pu+jHG-1yaGS(_hcbFc`q+F}RwAn#wZqT}Jg zsWcQnn~w9_)RmFUhXmeYE3sZ#+qLKZ(yWQHvUNpmP`XCKqXP>eVx+QS)%*o8!DKj& z@e;=U@f#FGzeSn?@rvYS?eeu!GW8b>Vaw+I*^(ZDGp*G8zg_?ym)hl#*D3TKh3hU4 zoZs{ze!I4|ogI^ARXbQ!_)8?^rWxbjvhZCUZA`fXj3$zgBTXf=JdOp&7y#OMn>dR?2VzONOLSD&3;HY|*7;;YP9IeFgcCoW}c8eBqf_cy%jfi^MipD<7R4(#EUqIcwBg` zYZGxolz}sd=Y1~v&i{^n_g^(QTn_y4Ayt83n_E=al-8r^9}HLLk9HS%aw{G822i@toV^?h3?%1|%+qP|VY}-z! zK+#i;Ca@A<`n)HBsmbWveLnH?tZ8A@YH4Gg)%RViLaYxzF(Nff|L>)%I=#4Xo9P4I z%L*~VYW2Bh)~Bk3Cew}ok$4V1-SoFG+go?l8y z&E%SnWpoc`%Qk%8dq@*Pz+dj=4CC;7R>Q9%pli%I)jI1Ao|ii&&?g9NgH$H# z2zAC;Ax`K-gkbMfZtw!wFt?%JFCHZU-!E=+e7fi zlh?Iat?9*bzY@Q!`+i&!uA_Ku8f<=C@C9138Chpmc~}N(d+oDqMMtCwWV72ud0+U; zu0+o8*)Gv^4U_Woe>@KzYWwY6#BRb<*hUHcy_t;U26QEzYRK1qyLoR~()kxLjpM!v zoEX9T!*eqF{8RKHV!Mo*41L@}Q(ovmRjX)@Wu0|Dh}xX{s@$Uo8#b!)6=ln&!4 z5_Bb>U{l!Dv3kz+amPm!Ln9T^)@i%R`%?4qG((dyzWju)D=K%O(E`5rW$^KYEmgCG z*4*>qOi+8>(iTEN%r%#$>o+`wYhc5%`*xe@S-LK-#1)wdlc`h-3)N=5WVK*+3?=u> za@Wnx#ALiFVaaW??*px-_-6OjRv>wQ188&xuSF@z8}CRBT;wf)e2p1B5G(=<Ja%r>9t z0>M2GGG_Pyumj2PqY5t^$sKw z#*;!E%31Bqf8w;c!3WU6N`b>a1>v0It=g={I1%nvmSLMR;~e_s3q4dhImdoxVaxCl zW?bQ^_UOsf?e`wz5H&+X*?PXvPT($^=C-~HVuya`34aL-fUN_tD>)#Re)8s17_1Z{ z;x1=BM$dz2v>E4EFOF;XEf-h&9nn|Zl8(*ASJF_c=ZQqz83UA|g;$HlP|iO|xR-eu z7j+K-2iC&`HdULVINxY0iJa{(A5Ee$KQy?km#vy7ZRe;jgFs+Ejv2$lnJ* z;APwMrs9cR@HVwyvs&QzlM@Q`>}*--9aPH+e#0^YptHlj z>>DOs-!y*E^~h<;GpmL$YKu~WVMl!0#sUd{aaW%&B63a{*doc0S-wY~ZgO7bvK~6Q zZ+={Rn%u@vp)Z^3)2`rfVl#tKbiKS~H5^uYLGXPYL1okPY_@Ge*Y(=Kdprw_Taq~4 z$3!l?(6LhZIhk(#ru||)7jo}%zn==^6hC}+8rP6Zl}+dN??rm^i_>jSN`^S-T`C$Eb9wOTlboiwow+ObD{KfIj?6a8|vWVlq=peXCk;M z)XUS;jz0_l=ldjJwt%zJGo^_=2=1}fQ5KGBo$htdog}*+&&9sq>z@Yp&hR_=hN2Pe zl1bNA)O7ay++87@MfSX{t~Gc={_r@v7Q=7a6bbgdep-8o3VAN#*Jng(GR;+xE7jBe z%<%vs;CqZ-5VkgCg5Iu5`5NeEG7b+Ca}YGTh`@b>Nku3suvrb^P$8-7m)Ytvgyxjy zypDvw{_phaAK^FPQ>U!(w)=nCpt4{gg(iYIm{WbFbbgwQA){m1vr=ke+N7xE97*wmt0RhMkZy3F?8!sqmBU5s#*wŪM=5 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 C8*M89 literal 0 HcmV?d00001 diff --git a/docs/CVAT_screenshots/13.png b/docs/CVAT_screenshots/13.png new file mode 100644 index 0000000000000000000000000000000000000000..f550bdd383a096e661fd413b5c395fd548243876 GIT binary patch literal 97400 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 literal 0 HcmV?d00001 From 3baf9f1ce30fcfc4ef4cf1406afcaf36703a0cdb Mon Sep 17 00:00:00 2001 From: Peter Staar Date: Fri, 14 Feb 2025 17:37:32 +0100 Subject: [PATCH 08/81] added the annotation description on CVAT (2) Signed-off-by: Peter Staar --- docs/CVAT_create_groundtruth.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CVAT_create_groundtruth.md b/docs/CVAT_create_groundtruth.md index 5fcd3f26..14acaf34 100644 --- a/docs/CVAT_create_groundtruth.md +++ b/docs/CVAT_create_groundtruth.md @@ -92,7 +92,7 @@ Here we have, ## Online Annotation - +
    From c45d2e38f562773c1b81fe31c6984bca7a740bb2 Mon Sep 17 00:00:00 2001 From: Peter Staar Date: Fri, 14 Feb 2025 17:38:50 +0100 Subject: [PATCH 09/81] added the annotation description on CVAT (3) Signed-off-by: Peter Staar --- docs/CVAT_create_groundtruth.md | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/docs/CVAT_create_groundtruth.md b/docs/CVAT_create_groundtruth.md index 14acaf34..c381beb9 100644 --- a/docs/CVAT_create_groundtruth.md +++ b/docs/CVAT_create_groundtruth.md @@ -98,34 +98,32 @@ Here we have, - - + + - - + + - - + + - - + + - - + + - - + + - - + +
    To start annotating, go to the [CVAT](cvat.ai) and create a new project,
    Next, you give the project a name and upload the content of `cvat_description.json` into the Raw labels.Next, you give the project a name and upload the content of `cvat_description.json` into the Raw labels.
    Next, click `Submit & Open`. This will open a new window in which you can create new tasksNext, click `Submit & Open`. This will open a new window in which you can create new tasks
    Next you upload the images you want to annotate from the `cvat_tasks/task_` and click `Submit & Open`.Next you upload the images you want to annotate from the `cvat_tasks/task_` and click `Submit & Open`.
    Next, you can upload the pre-annotations for the taks,Next, you can upload the pre-annotations for the taks,
    and you upload the CVAT annotations in xml,and you upload the CVAT annotations in xml,
    Finally, you are ready to annotate (click on `#Job `) and the annotation window opens up,Finally, you are ready to annotate (click on `#Job `) and the annotation window opens up,
    Make sure you adjust the bounding boxes, labels and add the reading-order line. The Reading order is simply a line of points, that have to fall inside the bounding-boxes, - -Make sure you adjust the bounding boxes, labels and add the reading-order line. The Reading order is simply a line of points, that have to fall inside the bounding-boxes,
    From d8a8a5957f0d674006610a29eef5e58afe55613d Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 18 Feb 2025 17:22:27 +0100 Subject: [PATCH 10/81] [WIP] Crafting new dataset builder and prediction provider API Signed-off-by: Christoph Auer --- docling_eval/benchmarks/constants.py | 1 - docling_eval/dataset_builder.py | 105 ++++++++ docling_eval/dataset_record.py | 169 +++++++++++++ docling_eval/dpbench_builder.py | 344 +++++++++++++++++++++++++++ docling_eval/prediction_provider.py | 44 ++++ docs/examples/run_dpbench_builder.py | 96 ++++++++ 6 files changed, 758 insertions(+), 1 deletion(-) create mode 100644 docling_eval/dataset_builder.py create mode 100644 docling_eval/dataset_record.py create mode 100644 docling_eval/dpbench_builder.py create mode 100644 docling_eval/prediction_provider.py create mode 100644 docs/examples/run_dpbench_builder.py diff --git a/docling_eval/benchmarks/constants.py b/docling_eval/benchmarks/constants.py index 7f20d17c..fc5bbbca 100644 --- a/docling_eval/benchmarks/constants.py +++ b/docling_eval/benchmarks/constants.py @@ -3,7 +3,6 @@ class BenchMarkColumns(str, Enum): DOCLING_VERSION = "docling_version" - DOCLING_PIPELINE = "docling_pipeline" STATUS = "status" DOC_ID = "document_id" diff --git a/docling_eval/dataset_builder.py b/docling_eval/dataset_builder.py new file mode 100644 index 00000000..ca5c6250 --- /dev/null +++ b/docling_eval/dataset_builder.py @@ -0,0 +1,105 @@ +import os +from abc import abstractmethod +from pathlib import Path +from typing import Iterable, Optional, Union + +from docling.utils.utils import chunkify +from huggingface_hub import snapshot_download +from pydantic import BaseModel + +from docling_eval.benchmarks.utils import write_datasets_info +from docling_eval.dataset_record import DatasetRecord +from docling_eval.docling.utils import save_shard_to_disk +from docling_eval.prediction_provider import BasePredictionProvider + + +class HFSource(BaseModel): + repo_id: str + revision: Optional[str] = None + hf_token: Optional[str] = os.getenv("HF_TOKEN", None) + + +class S3Source(BaseModel): + # TBD + pass + + +class BaseEvaluationDatasetBuilder: + def __init__( + self, + name: str, + dataset_source: Union[HFSource, S3Source, Path], + prediction_provider: BasePredictionProvider, + target: Optional[Path] = None, + ): + self.name = name + self.target = target + self.prediction_provider = prediction_provider + self.dataset_source = dataset_source + + self.dataset_local_path = None # TBD + + self.retrieved = False + + def retrieve_input_dataset(self) -> Path: + if isinstance(self.dataset_source, HFSource): + if not self.dataset_local_path: + path = snapshot_download( + repo_id=self.dataset_source.repo_id, + repo_type="dataset", + token=self.dataset_source.hf_token, + # local_dir=self.target, + ) + path = Path(path) + self.dataset_local_path = path + else: + path = snapshot_download( + repo_id=self.dataset_source.repo_id, + repo_type="dataset", + token=self.dataset_source.hf_token, + local_dir=self.dataset_local_path, + ) + elif isinstance(self.dataset_source, Path): + path = self.dataset_source + else: + raise RuntimeError( + f"Unknown dataset_source type {type(self.dataset_source)}" + ) + + self.retrieved = True + + return path + + @abstractmethod + def iterate(self) -> Iterable[DatasetRecord]: + pass + + def update_prediction(self, record: DatasetRecord): + # This might need customization depending on the input the dataset has. + # The default implementation assumes that there is an original file in binary format which is accepted. + pred_doc = self.prediction_provider.predict(record.original) + record.predicted_doc = pred_doc + + record.validate_model() + + def save_to_disk(self): + if not self.retrieved: + raise RuntimeError( + "You must first retrieve the source dataset. Call retrieve_input_dataset()." + ) + + test_dir = self.target / "test" + os.makedirs(test_dir, exist_ok=True) + + count = 0 + for record_chunk in chunkify(self.iterate(), 80): + record_chunk = [r.as_record_dict() for r in record_chunk] + save_shard_to_disk(items=record_chunk, dataset_path=test_dir) + count += len(record_chunk) + + write_datasets_info( + name=self.name, + output_dir=self.target, + num_train_rows=0, + num_test_rows=count, + ) diff --git a/docling_eval/dataset_record.py b/docling_eval/dataset_record.py new file mode 100644 index 00000000..0bbbaeea --- /dev/null +++ b/docling_eval/dataset_record.py @@ -0,0 +1,169 @@ +import json +from pathlib import Path +from typing import Any, List, Optional, Union + +import PIL +from datasets import Features +from datasets import Image as Features_Image +from datasets import Sequence, Value +from docling.datamodel.base_models import ConversionStatus +from docling_core.types import DoclingDocument +from docling_core.types.io import DocumentStream +from pydantic import BaseModel, ConfigDict, Field, model_validator +from pydantic.fields import FieldInfo + +from docling_eval.benchmarks.constants import EvaluationModality + + +class DatasetRecord(BaseModel): + predictor_info: dict = Field(alias="predictor_info", default={}) + status: ConversionStatus = ( + Field(alias="status", default=ConversionStatus.PENDING), + ) + doc_id: str = Field(alias="document_id") + doc_path: Optional[Path] = Field(alias="document_filepath", default=None) + doc_hash: Optional[str] = Field(alias="document_filehash") + + ground_truth_doc: DoclingDocument = Field(alias="GroundTruthDocument") + predicted_doc: Optional[DoclingDocument] = Field( + alias="PredictedDocument", default=None + ) + original: Optional[Union[DocumentStream | Path]] = Field( + alias="BinaryDocument", default=None + ) + + ground_truth_page_images: List[PIL.Image.Image] = Field( + alias="GroundTruthPageImages", default=[] + ) + ground_truth_pictures: List[PIL.Image.Image] = Field( + alias="GroundTruthPictures", default=[] + ) + + predicted_page_images: List[PIL.Image.Image] = Field( + alias="GroundTruthPageImages", default=[] + ) + predicted_pictures: List[PIL.Image.Image] = Field( + alias="GroundTruthPageImages", default=[] + ) + + mime_type: str = Field(default="") + modalities: List[EvaluationModality] = Field(default=[]) + + model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True) + + @classmethod + def get_field_alias(cls, field_name: str) -> str: + return cls.model_fields[field_name].alias or field_name + + @classmethod + def features(cls): + return Features( + { + cls.get_field_alias("predictor_info"): Value("string"), + cls.get_field_alias("status"): Value("string"), + cls.get_field_alias("doc_id"): Value("string"), + cls.get_field_alias("doc_path"): Value("string"), + cls.get_field_alias("doc_hash"): Value("string"), + cls.get_field_alias("ground_truth_doc"): Value("string"), + cls.get_field_alias("ground_truth_pictures"): Sequence( + Features_Image() + ), + cls.get_field_alias("ground_truth_page_images"): Sequence( + Features_Image() + ), + cls.get_field_alias("predicted_doc"): Value("string"), + cls.get_field_alias("predicted_pictures"): Sequence(Features_Image()), + cls.get_field_alias("predicted_page_images"): Sequence( + Features_Image() + ), + cls.get_field_alias("original"): Value("string"), + cls.get_field_alias("mime_type"): Value("string"), + cls.get_field_alias("modalities"): Sequence(Value("string")), + } + ) + + def _extract_images(self, document: DoclingDocument): + + pictures = [] + page_images = [] + + # Save page images + for img_no, picture in enumerate(document.pictures): + if picture.image is not None: + # img = picture.image.pil_image + # pictures.append(to_pil(picture.image.uri)) + pictures.append(picture.image.pil_image) + picture.image.uri = Path( + f"{self.get_field_alias("predicted_pictures")}/{img_no}" + ) + + # Save page images + for page_no, page in document.pages.items(): + if page.image is not None: + # img = page.image.pil_image + # img.show() + page_images.append(page.image.pil_image) + page.image.uri = Path( + f"{self.get_field_alias("predicted_page_images")}/{page_no}" + ) + + return pictures, page_images + + def as_record_dict(self): + record = { + self.get_field_alias("predictor_info"): json.dumps(self.predictor_info), + self.get_field_alias("status"): str(self.status), + self.get_field_alias("doc_id"): self.doc_id, + self.get_field_alias("doc_path"): str(self.doc_path), + self.get_field_alias("doc_hash"): self.doc_hash, + self.get_field_alias("ground_truth_doc"): json.dumps( + self.ground_truth_doc.export_to_dict() + ), + self.get_field_alias("ground_truth_pictures"): self.ground_truth_pictures, + self.get_field_alias( + "ground_truth_page_images" + ): self.ground_truth_page_images, + self.get_field_alias("mime_type"): self.mime_type, + self.get_field_alias("modalities"): list(self.modalities), + } + if isinstance(self.original, Path): + with self.original.open("rb") as f: + record.update({self.get_field_alias("original"): f.read()}) + elif isinstance(self.original, DocumentStream): + record.update( + { + self.get_field_alias("original"): None + } # FIXME: reading from closed I/O in self.original.stream.read()} + ) + else: + record.update({self.get_field_alias("original"): None}) + + if self.predicted_doc is not None: + record.update( + { + self.get_field_alias("predicted_doc"): json.dumps( + self.predicted_doc.export_to_dict() + ), + } + ) + + return record + + @model_validator(mode="after") + def validate_model(self) -> "DatasetRecord": + if self.predicted_doc is not None: + if not len(self.predicted_pictures) and not len(self.predicted_page_images): + pictures, page_images = self._extract_images(self.predicted_doc) + + self.predicted_page_images = page_images + self.predicted_pictures = pictures + + if not len(self.ground_truth_pictures) and not len( + self.ground_truth_page_images + ): + pictures, page_images = self._extract_images(self.ground_truth_doc) + + self.ground_truth_page_images = page_images + self.ground_truth_pictures = pictures + + return self diff --git a/docling_eval/dpbench_builder.py b/docling_eval/dpbench_builder.py new file mode 100644 index 00000000..71943e6c --- /dev/null +++ b/docling_eval/dpbench_builder.py @@ -0,0 +1,344 @@ +import json +import os +from io import BytesIO +from pathlib import Path +from typing import Dict, Iterable, Optional + +from docling_core.types import DoclingDocument +from docling_core.types.doc import ( + BoundingBox, + CoordOrigin, + DocItemLabel, + ImageRef, + ProvenanceItem, + Size, + TableCell, + TableData, +) +from docling_core.types.io import DocumentStream +from PIL.Image import Image +from tqdm import tqdm + +from docling_eval.benchmarks.utils import ( + add_pages_to_true_doc, + convert_html_table_into_docling_tabledata, + get_binhash, + save_comparison_html_with_clusters, +) +from docling_eval.dataset_builder import BaseEvaluationDatasetBuilder, HFSource +from docling_eval.dataset_record import DatasetRecord +from docling_eval.docling.utils import ( + crop_bounding_box, + from_pil_to_base64uri, + get_binary, +) +from docling_eval.prediction_provider import BasePredictionProvider + +TRUE_HTML_EXPORT_LABELS = { + DocItemLabel.TITLE, + DocItemLabel.DOCUMENT_INDEX, + DocItemLabel.SECTION_HEADER, + DocItemLabel.PARAGRAPH, + DocItemLabel.TABLE, + DocItemLabel.PICTURE, + DocItemLabel.FORMULA, + DocItemLabel.CHECKBOX_UNSELECTED, + DocItemLabel.CHECKBOX_SELECTED, + DocItemLabel.TEXT, + DocItemLabel.LIST_ITEM, + DocItemLabel.CODE, + DocItemLabel.REFERENCE, + # Additional + DocItemLabel.CAPTION, + DocItemLabel.PAGE_HEADER, + DocItemLabel.PAGE_FOOTER, + DocItemLabel.FOOTNOTE, +} + +PRED_HTML_EXPORT_LABELS = { + DocItemLabel.TITLE, + DocItemLabel.DOCUMENT_INDEX, + DocItemLabel.SECTION_HEADER, + DocItemLabel.PARAGRAPH, + DocItemLabel.TABLE, + DocItemLabel.PICTURE, + DocItemLabel.FORMULA, + DocItemLabel.CHECKBOX_UNSELECTED, + DocItemLabel.CHECKBOX_SELECTED, + DocItemLabel.TEXT, + DocItemLabel.LIST_ITEM, + DocItemLabel.CODE, + DocItemLabel.REFERENCE, + # Additional + DocItemLabel.PAGE_HEADER, + DocItemLabel.PAGE_FOOTER, + DocItemLabel.FOOTNOTE, +} + + +class DPBenchDatasetBuilder(BaseEvaluationDatasetBuilder): + def __init__( + self, + name: str, + prediction_provider: BasePredictionProvider, + target: Optional[Path] = None, + do_visualization: bool = True, + ): + super().__init__( + name=name, + dataset_source=HFSource(repo_id="upstage/dp-bench"), + prediction_provider=prediction_provider, + target=target, + ) + self.do_visualization = do_visualization + + +class DPBenchE2EDatasetBuilder(DPBenchDatasetBuilder): + def __init__( + self, + prediction_provider: BasePredictionProvider, + target: Optional[Path] = None, + do_visualization: bool = True, + ): + super().__init__( + name="DPBench: end-to-end", + prediction_provider=prediction_provider, + target=target, + do_visualization=do_visualization, + ) + + def _update_gt_doc( + self, + doc: DoclingDocument, + annots: Dict, + page, + page_image: Image, + page_width: float, + page_height: float, + ): + + label = annots["category"] + + min_x = annots["coordinates"][0]["x"] + max_x = annots["coordinates"][0]["x"] + + min_y = annots["coordinates"][0]["y"] + max_y = annots["coordinates"][0]["y"] + + for coor in annots["coordinates"]: + min_x = min(min_x, coor["x"]) + max_x = max(max_x, coor["x"]) + + min_y = min(min_y, coor["y"]) + max_y = max(max_y, coor["y"]) + + text = annots["content"]["text"].replace("\n", " ") + html = annots["content"]["html"] + + bbox = BoundingBox( + l=min_x * page_width, + r=max_x * page_width, + t=min_y * page_height, + b=max_y * page_height, + coord_origin=CoordOrigin.TOPLEFT, + ) + + prov = ProvenanceItem(page_no=1, bbox=bbox, charspan=(0, len(text))) + + img = crop_bounding_box(page_image=page_image, page=page, bbox=bbox) + + if label == "Header": + doc.add_text( + label=DocItemLabel.PAGE_HEADER, text=text, orig=text, prov=prov + ) + + elif label == "Footer": + doc.add_text( + label=DocItemLabel.PAGE_FOOTER, text=text, orig=text, prov=prov + ) + + elif label == "Paragraph": + doc.add_text(label=DocItemLabel.TEXT, text=text, orig=text, prov=prov) + + elif label == "Index": + + # FIXME: ultra approximate solution + text = annots["content"]["text"] + rows = text.split("\n") + + num_rows = len(rows) + num_cols = 2 + + row_span = 1 + col_span = 1 + + cells = [] + for row_idx, row in enumerate(rows): + parts = row.split(" ") + + col_idx = 0 + cell = TableCell( + row_span=row_span, + col_span=col_span, + start_row_offset_idx=row_idx, + end_row_offset_idx=row_idx + row_span, + start_col_offset_idx=col_idx, + end_col_offset_idx=col_idx + col_span, + text=" ".join(parts[:-1]), + ) + cells.append(cell) + + col_idx = 1 + cell = TableCell( + row_span=row_span, + col_span=col_span, + start_row_offset_idx=row_idx, + end_row_offset_idx=row_idx + row_span, + start_col_offset_idx=col_idx, + end_col_offset_idx=col_idx + col_span, + text=parts[-1], + ) + cells.append(cell) + + table_data = TableData( + num_rows=num_rows, num_cols=num_cols, table_cells=cells + ) + doc.add_table( + data=table_data, + caption=None, + prov=prov, + label=DocItemLabel.DOCUMENT_INDEX, + ) + + elif label == "List": + doc.add_list_item(text=text, orig=text, prov=prov) + # doc.add_text(label=DocItemLabel.TEXT, text=text, orig=text, prov=prov) + + elif label == "Caption": + doc.add_text(label=DocItemLabel.CAPTION, text=text, orig=text, prov=prov) + + elif label == "Equation": + doc.add_text(label=DocItemLabel.FORMULA, text=text, orig=text, prov=prov) + + elif label == "Figure": + uri = from_pil_to_base64uri(img) + + imgref = ImageRef( + mimetype="image/png", + dpi=72, + size=Size(width=img.width, height=img.height), + uri=uri, + ) + + doc.add_picture(prov=prov, image=imgref) + + elif label == "Table": + + table_data = convert_html_table_into_docling_tabledata(table_html=html) + + doc.add_table(data=table_data, caption=None, prov=prov) + + elif label == "Chart": + uri = from_pil_to_base64uri(img) + + imgref = ImageRef( + mimetype="image/png", + dpi=72, + size=Size(width=img.width, height=img.height), + uri=uri, + ) + + doc.add_picture(prov=prov, image=imgref) + + # doc.add_picture(prov=prov) + + elif label == "Footnote": + doc.add_text(label=DocItemLabel.FOOTNOTE, text=text, orig=text, prov=prov) + + elif label == "Heading1": + doc.add_heading(text=text, orig=text, level=1, prov=prov) + + else: + return + + def iterate(self) -> Iterable[DatasetRecord]: + if not self.retrieved: + raise RuntimeError( + "You must first retrieve the source dataset. Call retrieve_input_dataset()." + ) + + # load the groundtruth + with open(self.dataset_local_path / f"dataset/reference.json", "r") as fr: + gt = json.load(fr) + + odir_lay = self.target / "layout" + odir_tab = self.target / "tableformer" + viz_dir = self.target / "vizualisations" + + for _ in [odir_lay, odir_tab, viz_dir]: + os.makedirs(_, exist_ok=True) + + records = [] + + cnt = 0 + for filename, annots in tqdm( + gt.items(), + desc="Processing files for DP-Bench with end-to-end", + total=len(gt), + ncols=128, + ): + cnt += 1 + + # if cnt == 10: + # break + + pdf_path = self.dataset_local_path / f"dataset/pdfs/{filename}" + + # Create the groundtruth Document + true_doc = DoclingDocument( + name=f"ground-truth {os.path.basename(pdf_path)}" + ) + true_doc, true_page_images = add_pages_to_true_doc( + pdf_path=pdf_path, true_doc=true_doc, image_scale=2.0 + ) + assert len(true_page_images) == 1, "len(true_page_images)==1" + + page_width = true_doc.pages[1].size.width + page_height = true_doc.pages[1].size.height + + for elem in annots["elements"]: + self._update_gt_doc( + true_doc, + elem, + page=true_doc.pages[1], + page_image=true_page_images[0], + page_width=page_width, + page_height=page_height, + ) + + pdf_bytes = get_binary(pdf_path) + + pdf_stream = DocumentStream(name=pdf_path.name, stream=BytesIO(pdf_bytes)) + + record = DatasetRecord( + predictor_info=self.prediction_provider.info(), + doc_id=str(filename), + doc_hash=get_binhash(pdf_bytes), + ground_truth_doc=true_doc, + original=pdf_stream, + mime_type="application/pdf", + ) + + self.update_prediction(record) + + if self.do_visualization: + save_comparison_html_with_clusters( + filename=viz_dir / f"{os.path.basename(pdf_path)}-clusters.html", + true_doc=true_doc, + pred_doc=record.predicted_doc, + page_image=true_page_images[0], + true_labels=TRUE_HTML_EXPORT_LABELS, + pred_labels=PRED_HTML_EXPORT_LABELS, + ) + + yield record diff --git a/docling_eval/prediction_provider.py b/docling_eval/prediction_provider.py new file mode 100644 index 00000000..9b196a64 --- /dev/null +++ b/docling_eval/prediction_provider.py @@ -0,0 +1,44 @@ +from abc import abstractmethod +from typing import Dict + +from docling.document_converter import DocumentConverter +from docling_core.types import DoclingDocument +from docling_core.types.io import DocumentStream + +from docling_eval.docling.utils import docling_version + + +class BasePredictionProvider: + def __init__( + self, **kwargs + ): # could be the docling converter options, the remote credentials for MS/Google, etc. + self.provider_args = kwargs + + @abstractmethod + def predict(self, stream: DocumentStream, **extra_args) -> DoclingDocument: + return DoclingDocument(name="dummy") + + @abstractmethod + def info(self) -> Dict: + return {} + + +class DoclingPredictionProvider(BasePredictionProvider): + def __init__( + self, **kwargs + ): # could be the docling converter options, the remote credentials for MS/Google, etc. + super().__init__(**kwargs) + + if kwargs is not None: + if "format_options" in kwargs: + self.doc_converter = DocumentConverter( + format_options=kwargs["format_options"] + ) + else: + self.doc_converter = DocumentConverter() + + def predict(self, stream: DocumentStream, **extra_args) -> DoclingDocument: + return self.doc_converter.convert(stream).document + + def info(self) -> Dict: + return {"asset": "Docling", "version": docling_version()} diff --git a/docs/examples/run_dpbench_builder.py b/docs/examples/run_dpbench_builder.py new file mode 100644 index 00000000..3e54cc36 --- /dev/null +++ b/docs/examples/run_dpbench_builder.py @@ -0,0 +1,96 @@ +from pathlib import Path +from typing import List, Optional + +from docling.datamodel.base_models import InputFormat +from docling.datamodel.pipeline_options import ( + EasyOcrOptions, + OcrEngine, + OcrMacOptions, + OcrOptions, + PdfPipelineOptions, + RapidOcrOptions, + TableFormerMode, + TesseractCliOcrOptions, + TesseractOcrOptions, +) +from docling.document_converter import PdfFormatOption + +from docling_eval.benchmarks.constants import BenchMarkNames, EvaluationModality +from docling_eval.cli.main import evaluate +from docling_eval.dataset_record import DatasetRecord +from docling_eval.dpbench_builder import DPBenchE2EDatasetBuilder +from docling_eval.prediction_provider import DoclingPredictionProvider + + +def create_docling_prediction_provider( + page_image_scale: float = 2.0, + do_ocr: bool = False, + ocr_lang: List[str] = ["en"], + ocr_engine: OcrEngine = OcrEngine.EASYOCR, + artifacts_path: Optional[Path] = None, +): + + force_ocr: bool = True + + if ocr_engine == OcrEngine.EASYOCR: + ocr_options: OcrOptions = EasyOcrOptions(force_full_page_ocr=force_ocr) + elif ocr_engine == OcrEngine.TESSERACT_CLI: + ocr_options = TesseractCliOcrOptions(force_full_page_ocr=force_ocr) + elif ocr_engine == OcrEngine.TESSERACT: + ocr_options = TesseractOcrOptions(force_full_page_ocr=force_ocr) + elif ocr_engine == OcrEngine.OCRMAC: + ocr_options = OcrMacOptions(force_full_page_ocr=force_ocr) + elif ocr_engine == OcrEngine.RAPIDOCR: + ocr_options = RapidOcrOptions(force_full_page_ocr=force_ocr) + else: + raise RuntimeError(f"Unexpected OCR engine type {ocr_engine}") + + if ocr_lang is not None: + ocr_options.lang = ocr_lang + + pipeline_options = PdfPipelineOptions( + do_ocr=do_ocr, + ocr_options=EasyOcrOptions(force_full_page_ocr=force_ocr), + do_table_structure=True, + artifacts_path=artifacts_path, + ) + + pipeline_options.table_structure_options.do_cell_matching = True # do_cell_matching + pipeline_options.table_structure_options.mode = TableFormerMode.ACCURATE + + pipeline_options.images_scale = page_image_scale + pipeline_options.generate_page_images = True + pipeline_options.generate_picture_images = True + + return DoclingPredictionProvider( + format_options={ + InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options) + } + ) + + +def main(): + + DatasetRecord.features() + + target_path = Path("./scratch/dpbench-builer-test/") + provider = create_docling_prediction_provider(page_image_scale=2.0) + + dataset = DPBenchE2EDatasetBuilder( + prediction_provider=provider, + target=target_path, + ) + + dataset.retrieve_input_dataset() + dataset.save_to_disk() + + evaluate( + modality=EvaluationModality.LAYOUT, + benchmark=BenchMarkNames.DPBENCH, + idir=target_path, + odir=target_path / "layout", + ) + + +if __name__ == "__main__": + main() From 23834fb4daf6a04c8ed658e19348a8cc3c42ec92 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Wed, 19 Feb 2025 13:48:22 +0100 Subject: [PATCH 11/81] Restructure to docling_eval_next Signed-off-by: Christoph Auer --- docling_eval_next/__init__.py | 0 docling_eval_next/datamodels/__init__.py | 0 .../datamodels}/dataset_record.py | 0 docling_eval_next/dataset_builders/__init__.py | 0 .../dataset_builders}/dataset_builder.py | 4 ++-- .../dataset_builders}/dpbench_builder.py | 6 +++--- docling_eval_next/prediction_providers/__init__.py | 0 .../prediction_providers}/prediction_provider.py | 0 ...ch_builder.py => run_dpbench_builder_example.py} | 13 +++++-------- 9 files changed, 10 insertions(+), 13 deletions(-) create mode 100644 docling_eval_next/__init__.py create mode 100644 docling_eval_next/datamodels/__init__.py rename {docling_eval => docling_eval_next/datamodels}/dataset_record.py (100%) create mode 100644 docling_eval_next/dataset_builders/__init__.py rename {docling_eval => docling_eval_next/dataset_builders}/dataset_builder.py (95%) rename {docling_eval => docling_eval_next/dataset_builders}/dpbench_builder.py (97%) create mode 100644 docling_eval_next/prediction_providers/__init__.py rename {docling_eval => docling_eval_next/prediction_providers}/prediction_provider.py (100%) rename docs/examples/{run_dpbench_builder.py => run_dpbench_builder_example.py} (85%) diff --git a/docling_eval_next/__init__.py b/docling_eval_next/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/docling_eval_next/datamodels/__init__.py b/docling_eval_next/datamodels/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/docling_eval/dataset_record.py b/docling_eval_next/datamodels/dataset_record.py similarity index 100% rename from docling_eval/dataset_record.py rename to docling_eval_next/datamodels/dataset_record.py diff --git a/docling_eval_next/dataset_builders/__init__.py b/docling_eval_next/dataset_builders/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/docling_eval/dataset_builder.py b/docling_eval_next/dataset_builders/dataset_builder.py similarity index 95% rename from docling_eval/dataset_builder.py rename to docling_eval_next/dataset_builders/dataset_builder.py index ca5c6250..aa60021f 100644 --- a/docling_eval/dataset_builder.py +++ b/docling_eval_next/dataset_builders/dataset_builder.py @@ -8,9 +8,9 @@ from pydantic import BaseModel from docling_eval.benchmarks.utils import write_datasets_info -from docling_eval.dataset_record import DatasetRecord +from docling_eval_next.datamodels.dataset_record import DatasetRecord from docling_eval.docling.utils import save_shard_to_disk -from docling_eval.prediction_provider import BasePredictionProvider +from docling_eval_next.prediction_providers.prediction_provider import BasePredictionProvider class HFSource(BaseModel): diff --git a/docling_eval/dpbench_builder.py b/docling_eval_next/dataset_builders/dpbench_builder.py similarity index 97% rename from docling_eval/dpbench_builder.py rename to docling_eval_next/dataset_builders/dpbench_builder.py index 71943e6c..8322addd 100644 --- a/docling_eval/dpbench_builder.py +++ b/docling_eval_next/dataset_builders/dpbench_builder.py @@ -25,14 +25,14 @@ get_binhash, save_comparison_html_with_clusters, ) -from docling_eval.dataset_builder import BaseEvaluationDatasetBuilder, HFSource -from docling_eval.dataset_record import DatasetRecord +from docling_eval_next.dataset_builders.dataset_builder import BaseEvaluationDatasetBuilder, HFSource +from docling_eval_next.datamodels.dataset_record import DatasetRecord from docling_eval.docling.utils import ( crop_bounding_box, from_pil_to_base64uri, get_binary, ) -from docling_eval.prediction_provider import BasePredictionProvider +from docling_eval_next.prediction_providers.prediction_provider import BasePredictionProvider TRUE_HTML_EXPORT_LABELS = { DocItemLabel.TITLE, diff --git a/docling_eval_next/prediction_providers/__init__.py b/docling_eval_next/prediction_providers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/docling_eval/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py similarity index 100% rename from docling_eval/prediction_provider.py rename to docling_eval_next/prediction_providers/prediction_provider.py diff --git a/docs/examples/run_dpbench_builder.py b/docs/examples/run_dpbench_builder_example.py similarity index 85% rename from docs/examples/run_dpbench_builder.py rename to docs/examples/run_dpbench_builder_example.py index 3e54cc36..35382236 100644 --- a/docs/examples/run_dpbench_builder.py +++ b/docs/examples/run_dpbench_builder_example.py @@ -17,9 +17,9 @@ from docling_eval.benchmarks.constants import BenchMarkNames, EvaluationModality from docling_eval.cli.main import evaluate -from docling_eval.dataset_record import DatasetRecord -from docling_eval.dpbench_builder import DPBenchE2EDatasetBuilder -from docling_eval.prediction_provider import DoclingPredictionProvider +from docling_eval_next.datamodels.dataset_record import DatasetRecord +from docling_eval_next.dataset_builders.dpbench_builder import DPBenchE2EDatasetBuilder +from docling_eval_next.prediction_providers.prediction_provider import DoclingPredictionProvider def create_docling_prediction_provider( @@ -70,9 +70,6 @@ def create_docling_prediction_provider( def main(): - - DatasetRecord.features() - target_path = Path("./scratch/dpbench-builer-test/") provider = create_docling_prediction_provider(page_image_scale=2.0) @@ -81,8 +78,8 @@ def main(): target=target_path, ) - dataset.retrieve_input_dataset() - dataset.save_to_disk() + dataset.retrieve_input_dataset() # fetches the source dataset from HF + dataset.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. evaluate( modality=EvaluationModality.LAYOUT, From 2206a97d03b7e40c1be3433b0adb0a852b6a5237 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Wed, 19 Feb 2025 14:22:30 +0100 Subject: [PATCH 12/81] Fix mypy Signed-off-by: Christoph Auer --- .pre-commit-config.yaml | 6 ++-- .../datamodels/dataset_record.py | 5 ++- .../dataset_builders/dataset_builder.py | 36 +++++++++++++------ .../dataset_builders/dpbench_builder.py | 23 +++++++----- docs/examples/run_dpbench_builder_example.py | 8 +++-- pyproject.toml | 3 +- 6 files changed, 53 insertions(+), 28 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 20a289a2..91532586 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,13 +4,13 @@ repos: hooks: - id: black name: Black - entry: poetry run black docling_eval tests docs/examples + entry: poetry run black docling_eval docling_eval_next tests docs/examples pass_filenames: false language: system files: '\.py$' - id: isort name: isort - entry: poetry run isort docling_eval tests docs/examples + entry: poetry run isort docling_eval docling_eval_next tests docs/examples pass_filenames: false language: system files: '\.py$' @@ -22,7 +22,7 @@ repos: # files: '\.py$' - id: mypy name: MyPy - entry: poetry run mypy docling_eval tests docs/examples + entry: poetry run mypy docling_eval docling_eval_next tests docs/examples pass_filenames: false language: system files: '\.py$' diff --git a/docling_eval_next/datamodels/dataset_record.py b/docling_eval_next/datamodels/dataset_record.py index 0bbbaeea..3d119441 100644 --- a/docling_eval_next/datamodels/dataset_record.py +++ b/docling_eval_next/datamodels/dataset_record.py @@ -17,9 +17,8 @@ class DatasetRecord(BaseModel): predictor_info: dict = Field(alias="predictor_info", default={}) - status: ConversionStatus = ( - Field(alias="status", default=ConversionStatus.PENDING), - ) + status: ConversionStatus = Field(alias="status", default=ConversionStatus.PENDING) + doc_id: str = Field(alias="document_id") doc_path: Optional[Path] = Field(alias="document_filepath", default=None) doc_hash: Optional[str] = Field(alias="document_filehash") diff --git a/docling_eval_next/dataset_builders/dataset_builder.py b/docling_eval_next/dataset_builders/dataset_builder.py index aa60021f..099732a3 100644 --- a/docling_eval_next/dataset_builders/dataset_builder.py +++ b/docling_eval_next/dataset_builders/dataset_builder.py @@ -1,16 +1,20 @@ import os from abc import abstractmethod +from io import BytesIO from pathlib import Path from typing import Iterable, Optional, Union from docling.utils.utils import chunkify +from docling_core.types.io import DocumentStream from huggingface_hub import snapshot_download from pydantic import BaseModel from docling_eval.benchmarks.utils import write_datasets_info -from docling_eval_next.datamodels.dataset_record import DatasetRecord from docling_eval.docling.utils import save_shard_to_disk -from docling_eval_next.prediction_providers.prediction_provider import BasePredictionProvider +from docling_eval_next.datamodels.dataset_record import DatasetRecord +from docling_eval_next.prediction_providers.prediction_provider import ( + BasePredictionProvider, +) class HFSource(BaseModel): @@ -30,35 +34,36 @@ def __init__( name: str, dataset_source: Union[HFSource, S3Source, Path], prediction_provider: BasePredictionProvider, - target: Optional[Path] = None, + target: Path, ): self.name = name - self.target = target + self.target: Path = target self.prediction_provider = prediction_provider self.dataset_source = dataset_source - self.dataset_local_path = None # TBD + self.dataset_local_path: Optional[Path] = None # TBD self.retrieved = False def retrieve_input_dataset(self) -> Path: if isinstance(self.dataset_source, HFSource): if not self.dataset_local_path: - path = snapshot_download( + path_str = snapshot_download( repo_id=self.dataset_source.repo_id, repo_type="dataset", token=self.dataset_source.hf_token, # local_dir=self.target, ) - path = Path(path) + path: Path = Path(path_str) self.dataset_local_path = path else: - path = snapshot_download( + path_str = snapshot_download( repo_id=self.dataset_source.repo_id, repo_type="dataset", token=self.dataset_source.hf_token, local_dir=self.dataset_local_path, ) + path = Path(path_str) elif isinstance(self.dataset_source, Path): path = self.dataset_source else: @@ -77,10 +82,21 @@ def iterate(self) -> Iterable[DatasetRecord]: def update_prediction(self, record: DatasetRecord): # This might need customization depending on the input the dataset has. # The default implementation assumes that there is an original file in binary format which is accepted. - pred_doc = self.prediction_provider.predict(record.original) + input_data = record.original + + assert input_data is not None + + if not isinstance(input_data, DocumentStream): + if isinstance(input_data, Path): + input_data = DocumentStream( + name=input_data.name, stream=BytesIO(input_data.open("rb").read()) + ) + + pred_doc = self.prediction_provider.predict(input_data) + record.predicted_doc = pred_doc - record.validate_model() + record.validate_model() # type: ignore def save_to_disk(self): if not self.retrieved: diff --git a/docling_eval_next/dataset_builders/dpbench_builder.py b/docling_eval_next/dataset_builders/dpbench_builder.py index 8322addd..37cd747f 100644 --- a/docling_eval_next/dataset_builders/dpbench_builder.py +++ b/docling_eval_next/dataset_builders/dpbench_builder.py @@ -2,7 +2,7 @@ import os from io import BytesIO from pathlib import Path -from typing import Dict, Iterable, Optional +from typing import Dict, Iterable, List, Optional from docling_core.types import DoclingDocument from docling_core.types.doc import ( @@ -25,14 +25,19 @@ get_binhash, save_comparison_html_with_clusters, ) -from docling_eval_next.dataset_builders.dataset_builder import BaseEvaluationDatasetBuilder, HFSource -from docling_eval_next.datamodels.dataset_record import DatasetRecord from docling_eval.docling.utils import ( crop_bounding_box, from_pil_to_base64uri, get_binary, ) -from docling_eval_next.prediction_providers.prediction_provider import BasePredictionProvider +from docling_eval_next.datamodels.dataset_record import DatasetRecord +from docling_eval_next.dataset_builders.dataset_builder import ( + BaseEvaluationDatasetBuilder, + HFSource, +) +from docling_eval_next.prediction_providers.prediction_provider import ( + BasePredictionProvider, +) TRUE_HTML_EXPORT_LABELS = { DocItemLabel.TITLE, @@ -81,7 +86,7 @@ def __init__( self, name: str, prediction_provider: BasePredictionProvider, - target: Optional[Path] = None, + target: Path, do_visualization: bool = True, ): super().__init__( @@ -97,7 +102,7 @@ class DPBenchE2EDatasetBuilder(DPBenchDatasetBuilder): def __init__( self, prediction_provider: BasePredictionProvider, - target: Optional[Path] = None, + target: Path, do_visualization: bool = True, ): super().__init__( @@ -267,6 +272,8 @@ def iterate(self) -> Iterable[DatasetRecord]: "You must first retrieve the source dataset. Call retrieve_input_dataset()." ) + assert self.dataset_local_path is not None + # load the groundtruth with open(self.dataset_local_path / f"dataset/reference.json", "r") as fr: gt = json.load(fr) @@ -278,7 +285,7 @@ def iterate(self) -> Iterable[DatasetRecord]: for _ in [odir_lay, odir_tab, viz_dir]: os.makedirs(_, exist_ok=True) - records = [] + records: List[DatasetRecord] = [] cnt = 0 for filename, annots in tqdm( @@ -331,7 +338,7 @@ def iterate(self) -> Iterable[DatasetRecord]: self.update_prediction(record) - if self.do_visualization: + if self.do_visualization and record.predicted_doc is not None: save_comparison_html_with_clusters( filename=viz_dir / f"{os.path.basename(pdf_path)}-clusters.html", true_doc=true_doc, diff --git a/docs/examples/run_dpbench_builder_example.py b/docs/examples/run_dpbench_builder_example.py index 35382236..aa0cb45e 100644 --- a/docs/examples/run_dpbench_builder_example.py +++ b/docs/examples/run_dpbench_builder_example.py @@ -19,7 +19,9 @@ from docling_eval.cli.main import evaluate from docling_eval_next.datamodels.dataset_record import DatasetRecord from docling_eval_next.dataset_builders.dpbench_builder import DPBenchE2EDatasetBuilder -from docling_eval_next.prediction_providers.prediction_provider import DoclingPredictionProvider +from docling_eval_next.prediction_providers.prediction_provider import ( + DoclingPredictionProvider, +) def create_docling_prediction_provider( @@ -78,8 +80,8 @@ def main(): target=target_path, ) - dataset.retrieve_input_dataset() # fetches the source dataset from HF - dataset.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset.retrieve_input_dataset() # fetches the source dataset from HF + dataset.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. evaluate( modality=EvaluationModality.LAYOUT, diff --git a/pyproject.toml b/pyproject.toml index 42d23ab7..4c786d21 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -99,7 +99,8 @@ module = [ "nltk.*", "huggingface_hub.*", "PIL.*", - "evaluate.*" + "evaluate.*", + "tqdm.*" ] ignore_missing_imports = true From a6295bc7c168cf9a82df8f50de33f5a05289ad15 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Wed, 19 Feb 2025 14:37:22 +0100 Subject: [PATCH 13/81] Fix f-strings Signed-off-by: Christoph Auer --- docling_eval_next/datamodels/dataset_record.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docling_eval_next/datamodels/dataset_record.py b/docling_eval_next/datamodels/dataset_record.py index 3d119441..df96edbc 100644 --- a/docling_eval_next/datamodels/dataset_record.py +++ b/docling_eval_next/datamodels/dataset_record.py @@ -93,7 +93,7 @@ def _extract_images(self, document: DoclingDocument): # pictures.append(to_pil(picture.image.uri)) pictures.append(picture.image.pil_image) picture.image.uri = Path( - f"{self.get_field_alias("predicted_pictures")}/{img_no}" + f"{self.get_field_alias('predicted_pictures')}/{img_no}" ) # Save page images @@ -103,7 +103,7 @@ def _extract_images(self, document: DoclingDocument): # img.show() page_images.append(page.image.pil_image) page.image.uri = Path( - f"{self.get_field_alias("predicted_page_images")}/{page_no}" + f"{self.get_field_alias('predicted_page_images')}/{page_no}" ) return pictures, page_images From 3b62bc6fe0e352c78b786c5a3ccabd16275c01b6 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Wed, 19 Mar 2025 13:35:46 +0100 Subject: [PATCH 14/81] Changes for prediction_provider interface, to support all cases. Signed-off-by: Christoph Auer --- docling_eval/benchmarks/utils.py | 4 + .../models/tableformer/tf_model_prediction.py | 90 ++--- .../dataset_builders/dataset_builder.py | 4 +- .../dataset_builders/dpbench_builder.py | 27 +- .../prediction_provider.py | 63 ++- docs/examples/run_dpbench_builder_example.py | 36 +- poetry.lock | 370 +++++++++++++++--- pyproject.toml | 2 +- 8 files changed, 438 insertions(+), 158 deletions(-) diff --git a/docling_eval/benchmarks/utils.py b/docling_eval/benchmarks/utils.py index b40848f4..47e80c44 100644 --- a/docling_eval/benchmarks/utils.py +++ b/docling_eval/benchmarks/utils.py @@ -241,6 +241,10 @@ def docling_version() -> str: return version("docling") # may raise PackageNotFoundError +def docling_models_version() -> str: + return version("docling-ibm-models") # may raise PackageNotFoundError + + def get_binary(file_path: Path): """Read binary document into buffer.""" with open(file_path, "rb") as f: diff --git a/docling_eval/converters/models/tableformer/tf_model_prediction.py b/docling_eval/converters/models/tableformer/tf_model_prediction.py index 8b31d16a..b6537563 100644 --- a/docling_eval/converters/models/tableformer/tf_model_prediction.py +++ b/docling_eval/converters/models/tableformer/tf_model_prediction.py @@ -1,7 +1,8 @@ import copy import logging +from io import BytesIO from pathlib import Path -from typing import Dict, List, Optional, Tuple +from typing import Dict, List, Optional, Tuple, Union import numpy as np from docling.datamodel.base_models import Cluster, LayoutPrediction, Page, Table @@ -45,70 +46,6 @@ class PageTokens(BaseModel): width: float -def get_iocr_page(parsed_page: Dict, table_bbox: Tuple[float, float, float, float]): - - height = parsed_page["sanitized"]["dimension"]["height"] - width = parsed_page["sanitized"]["dimension"]["width"] - - records = map_to_records(parsed_page["sanitized"]["cells"]) - - cnt = 0 - - tokens = [] - text_lines = [] - for i, rec in enumerate(records): - tokens.append( - { - "bbox": { - "l": rec["x0"], - "t": height - rec["y1"], - "r": rec["x1"], - "b": height - rec["y0"], - }, - "text": rec["text"], - "id": i, - } - ) - - text_lines.append( - { - "bbox": [rec["x0"], height - rec["y1"], rec["x1"], height - rec["y0"]], - "text": rec["text"], - } - ) - - """ - if table_bbox[0]<=tokens[-1]["bbox"]["l"] and \ - table_bbox[2]>=tokens[-1]["bbox"]["r"] and \ - table_bbox[1]<=tokens[-1]["bbox"]["b"] and \ - table_bbox[3]>=tokens[-1]["bbox"]["t"]: - cnt += 1 - print(f"text-cell [{cnt}]: ", tokens[-1]["text"], "\t", tokens[-1]["bbox"]) - """ - - iocr_page = {"tokens": tokens, "height": height, "width": width} - - return iocr_page - - -def to_np(pil_image: Image.Image): - # Convert to NumPy array - np_image = np.array(pil_image) - - # Handle different formats - if np_image.ndim == 3: # RGB or RGBA image - if np_image.shape[2] == 4: # RGBA image - # Discard alpha channel and convert to BGR - np_image = np_image[:, :, :3] # Keep only RGB channels - - # Convert RGB to BGR by reversing the last axis - np_image = np_image[:, :, ::-1] - - return np_image - else: - raise ValueError("Unsupported image format") - - class TableFormerUpdater: def __init__( @@ -131,6 +68,23 @@ def __init__( ) log.info("Initialize %s", mode) + def to_np(self, pil_image: Image.Image): + # Convert to NumPy array + np_image = np.array(pil_image) + + # Handle different formats + if np_image.ndim == 3: # RGB or RGBA image + if np_image.shape[2] == 4: # RGBA image + # Discard alpha channel and convert to BGR + np_image = np_image[:, :, :3] # Keep only RGB channels + + # Convert RGB to BGR by reversing the last axis + np_image = np_image[:, :, ::-1] + + return np_image + else: + raise ValueError("Unsupported image format") + def get_page_cells(self, filename: str): parser = pdf_parser_v2("fatal") @@ -174,14 +128,14 @@ def _make_internal_page_with_table(self, input_doc, prov): def replace_tabledata( self, - pdf_path: Path, + pdf_path: Path | BytesIO, true_doc: DoclingDocument, ) -> Tuple[bool, DoclingDocument]: updated = False # deep copy of the true-document - pred_doc = copy.deepcopy(true_doc) + pred_doc = true_doc.model_copy(deep=True) input_doc = get_input_document(pdf_path) if not input_doc.valid: @@ -233,7 +187,7 @@ def _tf_predict_with_page_tokens( ocr_page = page_tokens.dict() - ocr_page["image"] = to_np(page_image) + ocr_page["image"] = self.to_np(page_image) ocr_page["table_bboxes"] = table_bboxes # TODO: Here we bypass docling API and we steal the tf_preditor private object :-( diff --git a/docling_eval_next/dataset_builders/dataset_builder.py b/docling_eval_next/dataset_builders/dataset_builder.py index 4492e6a6..d5aa3aa5 100644 --- a/docling_eval_next/dataset_builders/dataset_builder.py +++ b/docling_eval_next/dataset_builders/dataset_builder.py @@ -91,7 +91,9 @@ def update_prediction(self, record: DatasetRecord): name=input_data.name, stream=BytesIO(input_data.open("rb").read()) ) - pred_doc = self.prediction_provider.predict(input_data) + pred_doc = self.prediction_provider.predict( + record.ground_truth_doc, stream=input_data + ) record.predicted_doc = pred_doc diff --git a/docling_eval_next/dataset_builders/dpbench_builder.py b/docling_eval_next/dataset_builders/dpbench_builder.py index b17e56b2..a2debf55 100644 --- a/docling_eval_next/dataset_builders/dpbench_builder.py +++ b/docling_eval_next/dataset_builders/dpbench_builder.py @@ -27,6 +27,9 @@ get_binary, get_binhash, ) +from docling_eval.converters.models.tableformer.tf_model_prediction import ( + TableFormerUpdater, +) from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters from docling_eval_next.datamodels.dataset_record import DatasetRecord from docling_eval_next.dataset_builders.dataset_builder import ( @@ -82,34 +85,18 @@ class DPBenchDatasetBuilder(BaseEvaluationDatasetBuilder): def __init__( self, - name: str, prediction_provider: BasePredictionProvider, target: Path, do_visualization: bool = True, ): super().__init__( - name=name, + name="DPBench: end-to-end", dataset_source=HFSource(repo_id="upstage/dp-bench"), prediction_provider=prediction_provider, target=target, ) self.do_visualization = do_visualization - -class DPBenchE2EDatasetBuilder(DPBenchDatasetBuilder): - def __init__( - self, - prediction_provider: BasePredictionProvider, - target: Path, - do_visualization: bool = True, - ): - super().__init__( - name="DPBench: end-to-end", - prediction_provider=prediction_provider, - target=target, - do_visualization=do_visualization, - ) - def _update_gt_doc( self, doc: DoclingDocument, @@ -276,11 +263,11 @@ def iterate(self) -> Iterable[DatasetRecord]: with open(self.dataset_local_path / f"dataset/reference.json", "r") as fr: gt = json.load(fr) - odir_lay = self.target / "layout" - odir_tab = self.target / "tableformer" + # odir_lay = self.target / "layout" + # odir_tab = self.target / "tables" viz_dir = self.target / "vizualisations" - for _ in [odir_lay, odir_tab, viz_dir]: + for _ in [viz_dir]: os.makedirs(_, exist_ok=True) records: List[DatasetRecord] = [] diff --git a/docling_eval_next/prediction_providers/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py index 0e641b93..55e30042 100644 --- a/docling_eval_next/prediction_providers/prediction_provider.py +++ b/docling_eval_next/prediction_providers/prediction_provider.py @@ -1,11 +1,16 @@ from abc import abstractmethod -from typing import Dict +from typing import Dict, Optional +from docling.datamodel.pipeline_options import TableFormerMode from docling.document_converter import DocumentConverter from docling_core.types import DoclingDocument from docling_core.types.io import DocumentStream -from docling_eval.benchmarks.utils import docling_version +from docling_eval.benchmarks.utils import docling_models_version, docling_version +from docling_eval.converters.models.tableformer.tf_model_prediction import ( + PageToken, + TableFormerUpdater, +) class BasePredictionProvider: @@ -15,7 +20,12 @@ def __init__( self.provider_args = kwargs @abstractmethod - def predict(self, stream: DocumentStream, **extra_args) -> DoclingDocument: + def predict( + self, + gt_doc: DoclingDocument, + stream: Optional[DocumentStream] = None, + **extra_kwargs, + ) -> DoclingDocument: return DoclingDocument(name="dummy") @abstractmethod @@ -37,8 +47,53 @@ def __init__( else: self.doc_converter = DocumentConverter() - def predict(self, stream: DocumentStream, **extra_args) -> DoclingDocument: + def predict( + self, + gt_doc: DoclingDocument, + stream: Optional[DocumentStream] = None, + **extra_kwargs, + ) -> DoclingDocument: + assert ( + stream is not None + ), "stream must be given for docling prediction provider to work." + return self.doc_converter.convert(stream).document def info(self) -> Dict: return {"asset": "Docling", "version": docling_version()} + + +class TableFormerPredictionProvider(BasePredictionProvider): + def __init__( + self, **kwargs + ): # could be the docling converter options, the remote credentials for MS/Google, etc. + super().__init__(**kwargs) + + self.tf_updater = TableFormerUpdater(TableFormerMode.ACCURATE) + + def predict( + self, + gt_doc: DoclingDocument, + stream: Optional[DocumentStream] = None, + page_tokens: Optional[PageToken] = None, + **extra_kwargs, + ) -> DoclingDocument: + + assert ( + gt_doc is not None + ), "true_doc must be given for TableFormer prediction provider to work." + + if stream is not None and page_tokens is None: + updated, pred_doc = self.tf_updater.replace_tabledata(stream.stream, gt_doc) + elif page_tokens is not None: + updated, pred_doc = self.tf_updater.replace_tabledata_with_page_tokens( + page_tokens, gt_doc, [] + ) # FIXME: Must not expect page images. + else: + raise RuntimeError( + "TableFormerPredictionProvider.predict must be called with a stream or page_tokens." + ) + return pred_doc + + def info(self) -> Dict: + return {"asset": "TableFormer", "version": docling_models_version()} diff --git a/docs/examples/run_dpbench_builder_example.py b/docs/examples/run_dpbench_builder_example.py index aa0cb45e..5ce55460 100644 --- a/docs/examples/run_dpbench_builder_example.py +++ b/docs/examples/run_dpbench_builder_example.py @@ -18,9 +18,10 @@ from docling_eval.benchmarks.constants import BenchMarkNames, EvaluationModality from docling_eval.cli.main import evaluate from docling_eval_next.datamodels.dataset_record import DatasetRecord -from docling_eval_next.dataset_builders.dpbench_builder import DPBenchE2EDatasetBuilder +from docling_eval_next.dataset_builders.dpbench_builder import DPBenchDatasetBuilder from docling_eval_next.prediction_providers.prediction_provider import ( DoclingPredictionProvider, + TableFormerPredictionProvider, ) @@ -73,21 +74,38 @@ def create_docling_prediction_provider( def main(): target_path = Path("./scratch/dpbench-builer-test/") - provider = create_docling_prediction_provider(page_image_scale=2.0) + docling_provider = create_docling_prediction_provider(page_image_scale=2.0) - dataset = DPBenchE2EDatasetBuilder( - prediction_provider=provider, - target=target_path, + dataset_layout = DPBenchDatasetBuilder( + prediction_provider=docling_provider, + target=target_path / "e2e", ) - dataset.retrieve_input_dataset() # fetches the source dataset from HF - dataset.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF + dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DPBENCH, - idir=target_path, - odir=target_path / "layout", + idir=target_path / "e2e", + odir=target_path / "e2e" / "layout", + ) + + tableformer_provider = TableFormerPredictionProvider() + + dataset_tables = DPBenchDatasetBuilder( + prediction_provider=tableformer_provider, + target=target_path / "tables", + ) + + dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF + dataset_tables.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + + evaluate( + modality=EvaluationModality.TABLE_STRUCTURE, + benchmark=BenchMarkNames.DPBENCH, + idir=target_path / "tables", + odir=target_path / "tables" / "tableformer", ) diff --git a/poetry.lock b/poetry.lock index f9f14816..7bb672b0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "accelerate" @@ -6,6 +6,8 @@ version = "1.5.2" description = "Accelerate" optional = false python-versions = ">=3.9.0" +groups = ["main"] +markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "accelerate-1.5.2-py3-none-any.whl", hash = "sha256:68a3b272f6a6ffebb457bdc138581a2bf52efad6a5e0214dc46675f3edd98792"}, {file = "accelerate-1.5.2.tar.gz", hash = "sha256:a1cf39473edc0e42772a9d9a18c9eb1ce8ffd9e1719dc0ab80670f5c1fd4dc43"}, @@ -37,6 +39,7 @@ version = "2.6.1" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, @@ -48,6 +51,7 @@ version = "3.11.14" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e2bc827c01f75803de77b134afdbf74fa74b62970eafdf190f3244931d7a5c0d"}, {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e365034c5cf6cf74f57420b57682ea79e19eb29033399dd3f40de4d0171998fa"}, @@ -143,7 +147,7 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] +speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.2.0) ; sys_platform == \"linux\" or sys_platform == \"darwin\"", "brotlicffi ; platform_python_implementation != \"CPython\""] [[package]] name = "aiosignal" @@ -151,6 +155,7 @@ version = "1.3.2" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, @@ -165,6 +170,7 @@ 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"}, @@ -176,6 +182,8 @@ version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false python-versions = ">=3.6" +groups = ["dev"] +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"}, @@ -187,6 +195,7 @@ version = "1.0.3" description = "APTED algorithm for the Tree Edit Distance" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "apted-1.0.3-py3-none-any.whl", hash = "sha256:74193369d023649d335269e67c4df07f922959e5ac2597de1b79af4e694150e8"}, {file = "apted-1.0.3.tar.gz", hash = "sha256:befa5181e2d4457fa88e54995a82604ee048bb2fbc781ea97d8e1856b4715ce9"}, @@ -198,6 +207,7 @@ version = "2.15.8" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.7.2" +groups = ["dev"] files = [ {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, @@ -217,6 +227,7 @@ version = "3.0.0" description = "Annotate AST trees with source code positions" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, @@ -232,6 +243,8 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version == \"3.10\"" files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, @@ -243,18 +256,19 @@ version = "25.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, ] [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]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -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"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "autopep8" @@ -262,6 +276,7 @@ version = "2.2.0" description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "autopep8-2.2.0-py2.py3-none-any.whl", hash = "sha256:05418a981f038969d8bdcd5636bf15948db7555ae944b9f79b5a34b35f1370d4"}, {file = "autopep8-2.2.0.tar.gz", hash = "sha256:d306a0581163ac29908280ad557773a95a9bede072c0fafed6f141f5311f43c1"}, @@ -277,6 +292,8 @@ version = "1.2.0" description = "Backport of CPython tarfile module" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version == \"3.10\" or python_version == \"3.11\"" files = [ {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, @@ -292,6 +309,7 @@ version = "4.13.3" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" +groups = ["main"] files = [ {file = "beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16"}, {file = "beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b"}, @@ -314,6 +332,7 @@ version = "24.10.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, @@ -362,6 +381,7 @@ version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, @@ -373,6 +393,8 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "implementation_name == \"pypy\" or sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" 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"}, @@ -452,6 +474,7 @@ version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -463,6 +486,7 @@ 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", "dev"] 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"}, @@ -564,6 +588,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -578,6 +603,7 @@ version = "0.4.0" description = "Logging integration for Click" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, @@ -592,10 +618,12 @@ 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", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {main = "platform_system == \"Windows\""} [[package]] name = "comm" @@ -603,6 +631,7 @@ version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, @@ -620,6 +649,7 @@ version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, @@ -693,6 +723,8 @@ version = "44.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.7" +groups = ["dev"] +markers = "sys_platform == \"linux\"" files = [ {file = "cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7"}, {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1"}, @@ -735,10 +767,10 @@ files = [ cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""] docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] -pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""] +pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] test = ["certifi (>=2024)", "cryptography-vectors (==44.0.2)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] @@ -750,6 +782,7 @@ version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -765,6 +798,7 @@ version = "3.4.0" description = "HuggingFace community-driven open-source library of datasets" optional = false python-versions = ">=3.9.0" +groups = ["main"] files = [ {file = "datasets-3.4.0-py3-none-any.whl", hash = "sha256:35ef5182bddd38f7aa774d9f33c3e8b8e9c9c7ea41b4b7969fde431919cb556b"}, {file = "datasets-3.4.0.tar.gz", hash = "sha256:f3defae5d9c79ff586db3b17389fdde01704ffea015293a050d7e8ab6816bad8"}, @@ -787,17 +821,17 @@ tqdm = ">=4.66.3" xxhash = "*" [package.extras] -audio = ["librosa", "soundfile (>=0.12.1)", "soxr (>=0.4.0)"] +audio = ["librosa", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\""] benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] -dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers", "transformers (>=4.42.0)", "zstandard"] +dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\"", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0) ; python_version < \"3.10\"", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers", "transformers (>=4.42.0)", "zstandard"] docs = ["s3fs", "tensorflow (>=2.6.0)", "torch", "transformers"] jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] quality = ["ruff (>=0.3.0)"] s3 = ["s3fs"] tensorflow = ["tensorflow (>=2.6.0)"] tensorflow-gpu = ["tensorflow (>=2.6.0)"] -tests = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] -tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] +tests = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\"", "tensorflow (>=2.6.0) ; python_version < \"3.10\"", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] +tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] torch = ["torch"] vision = ["Pillow (>=9.4.0)"] @@ -807,6 +841,7 @@ version = "1.8.13" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "debugpy-1.8.13-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:06859f68e817966723ffe046b896b1bd75c665996a77313370336ee9e1de3e90"}, {file = "debugpy-1.8.13-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c2db69fb8df3168bc857d7b7d2494fed295dfdbde9a45f27b4b152f37520"}, @@ -842,6 +877,7 @@ version = "5.2.1" description = "Decorators for Humans" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, @@ -853,6 +889,7 @@ version = "0.3.8" description = "serialize all of Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, @@ -868,6 +905,7 @@ version = "0.1.3" description = "Utilities for comparing sequences" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "Distance-0.1.3.tar.gz", hash = "sha256:60807584f5b6003f5c521aa73f39f51f631de3be5cccc5a1d67166fcbf0d4551"}, ] @@ -878,6 +916,7 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -889,6 +928,7 @@ version = "2.26.0" description = "SDK and CLI for parsing PDF, DOCX, HTML, and more, to a unified document representation for powering downstream workflows such as gen AI applications." optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ {file = "docling-2.26.0-py3-none-any.whl", hash = "sha256:0ddebcd4c258c8fa9e4f84801940ae3c4fce59ad8ff81bc10939f686073323a0"}, {file = "docling-2.26.0.tar.gz", hash = "sha256:db7fc425b876023e4ad42a1fdfc0f285f507c38bc8a24ee2ae00e2eb8af0120d"}, @@ -919,16 +959,16 @@ rtree = ">=1.3.0,<2.0.0" scipy = {version = ">=1.6.0,<2.0.0", markers = "python_version >= \"3.10\""} tqdm = ">=4.65.0,<5.0.0" transformers = [ - {version = ">=4.46.0,<5.0.0", optional = true, markers = "sys_platform != \"darwin\" and extra == \"vlm\" or platform_machine != \"x86_64\" and extra == \"vlm\""}, + {version = ">=4.46.0,<5.0.0", optional = true, markers = "(sys_platform != \"darwin\" or platform_machine != \"x86_64\") and extra == \"vlm\""}, {version = ">=4.42.0,<4.43.0", optional = true, markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\" and extra == \"vlm\""}, ] typer = ">=0.12.5,<0.13.0" [package.extras] -ocrmac = ["ocrmac (>=1.0.0,<2.0.0)"] -rapidocr = ["onnxruntime (>=1.7.0,<1.20.0)", "onnxruntime (>=1.7.0,<2.0.0)", "rapidocr-onnxruntime (>=1.4.0,<2.0.0)"] +ocrmac = ["ocrmac (>=1.0.0,<2.0.0) ; sys_platform == \"darwin\""] +rapidocr = ["onnxruntime (>=1.7.0,<1.20.0) ; python_version < \"3.10\"", "onnxruntime (>=1.7.0,<2.0.0) ; python_version >= \"3.10\"", "rapidocr-onnxruntime (>=1.4.0,<2.0.0) ; python_version < \"3.13\""] tesserocr = ["tesserocr (>=2.7.1,<3.0.0)"] -vlm = ["accelerate (>=1.2.1,<2.0.0)", "transformers (>=4.42.0,<4.43.0)", "transformers (>=4.46.0,<5.0.0)"] +vlm = ["accelerate (>=1.2.1,<2.0.0) ; sys_platform != \"darwin\" or platform_machine != \"x86_64\"", "transformers (>=4.42.0,<4.43.0) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "transformers (>=4.46.0,<5.0.0) ; sys_platform != \"darwin\" or platform_machine != \"x86_64\""] [[package]] name = "docling-core" @@ -936,6 +976,7 @@ version = "2.23.1" description = "A python library to define and validate data types in Docling." optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ {file = "docling_core-2.23.1-py3-none-any.whl", hash = "sha256:4a3f7bcc55a735a070d69d74cf1278f7e40cb403c5059d4149672c7ca163992f"}, {file = "docling_core-2.23.1.tar.gz", hash = "sha256:0708f4ffe61faef9a2dee48e71cf3890248bf1d9b409f6414cd9c0dd6c7a1681"}, @@ -964,6 +1005,7 @@ version = "3.4.1" description = "This package contains the AI models used by the Docling PDF conversion package" optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ {file = "docling_ibm_models-3.4.1-py3-none-any.whl", hash = "sha256:c3582c99dddfa3f0eafcf80cf1267fd8efa39c4a74cc7a88f9dd49684fac2986"}, {file = "docling_ibm_models-3.4.1.tar.gz", hash = "sha256:093b4dff2ea284a4953c3aa009e29945208b8d389b94fb14940a03a93f673e96"}, @@ -995,6 +1037,7 @@ version = "3.4.0" description = "Simple package to extract text with coordinates from programmatic PDFs" optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ {file = "docling_parse-3.4.0-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:96e95e63ab722dfe5340fcb04d0e07bd1c0a0ba2f62e93c91ac26dda0a312a44"}, {file = "docling_parse-3.4.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:f9e14a7a0b92526d4dfd3f390f3d7e075f59d14d6b8a0a564fbc26299e56cd47"}, @@ -1039,6 +1082,7 @@ version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, @@ -1050,6 +1094,7 @@ version = "1.3.1" description = "Dictionary wrapper for quick access to deeply nested keys." optional = false python-versions = ">=3.5,<4.0" +groups = ["dev"] files = [ {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, @@ -1061,6 +1106,7 @@ version = "1.7.2" description = "End-to-End Multi-Lingual Optical Character Recognition (OCR) Solution" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "easyocr-1.7.2-py3-none-any.whl", hash = "sha256:5be12f9b0e595d443c9c3d10b0542074b50f0ec2d98b141a109cd961fd1c177c"}, ] @@ -1085,6 +1131,7 @@ version = "2.0.0" description = "An implementation of lxml.xmlfile for the standard library" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, @@ -1096,6 +1143,7 @@ version = "0.4.3" description = "HuggingFace community-driven open-source library of evaluation" optional = false python-versions = ">=3.8.0" +groups = ["main"] files = [ {file = "evaluate-0.4.3-py3-none-any.whl", hash = "sha256:47d8770bdea76e2c2ed0d40189273027d1a41ccea861bcc7ba12d30ec5d1e517"}, {file = "evaluate-0.4.3.tar.gz", hash = "sha256:3a5700cf83aabee9549264e1e5666f116367c61dbd4d38352015e859a5e2098d"}, @@ -1131,6 +1179,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version == \"3.10\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1145,6 +1195,7 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1159,13 +1210,14 @@ version = "2.2.0" description = "Get the currently executing AST node of a frame, and other information" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] [[package]] name = "filelock" @@ -1173,6 +1225,7 @@ version = "3.18.0" description = "A platform independent file lock." optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, @@ -1181,7 +1234,7 @@ files = [ [package.extras] docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] -typing = ["typing-extensions (>=4.12.2)"] +typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] [[package]] name = "filetype" @@ -1189,6 +1242,7 @@ version = "1.2.0" description = "Infer file type and MIME type of any file/buffer. No external dependencies." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"}, {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"}, @@ -1200,6 +1254,7 @@ version = "6.1.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" +groups = ["dev"] files = [ {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, @@ -1216,6 +1271,7 @@ version = "1.2.3" description = "Flake8 plug-in loading the configuration from pyproject.toml" optional = false python-versions = ">= 3.6" +groups = ["dev"] files = [ {file = "flake8_pyproject-1.2.3-py3-none-any.whl", hash = "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a"}, ] @@ -1233,6 +1289,7 @@ version = "4.56.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "fonttools-4.56.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:331954d002dbf5e704c7f3756028e21db07097c19722569983ba4d74df014000"}, {file = "fonttools-4.56.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d1613abd5af2f93c05867b3a3759a56e8bf97eb79b1da76b2bc10892f96ff16"}, @@ -1287,18 +1344,18 @@ files = [ ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "pycairo", "scipy"] +interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] -type1 = ["xattr"] +type1 = ["xattr ; sys_platform == \"darwin\""] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] name = "frozenlist" @@ -1306,6 +1363,7 @@ version = "1.5.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, @@ -1407,6 +1465,7 @@ version = "2024.12.0" description = "File-system specification" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2"}, {file = "fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f"}, @@ -1449,6 +1508,7 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1463,6 +1523,7 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1473,7 +1534,7 @@ gitdb = ">=4.0.1,<5" [package.extras] doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] -test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] [[package]] name = "huggingface-hub" @@ -1481,6 +1542,7 @@ version = "0.29.3" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" +groups = ["main"] files = [ {file = "huggingface_hub-0.29.3-py3-none-any.whl", hash = "sha256:0b25710932ac649c08cdbefa6c6ccb8e88eef82927cacdb048efb726429453aa"}, {file = "huggingface_hub-0.29.3.tar.gz", hash = "sha256:64519a25716e0ba382ba2d3fb3ca082e7c7eb4a2fc634d200e8380006e0760e5"}, @@ -1515,6 +1577,7 @@ version = "2.6.9" description = "File identification library for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "identify-2.6.9-py2.py3-none-any.whl", hash = "sha256:c98b4322da415a8e5a70ff6e51fbc2d2932c015532d77e9f8537b4ba7813b150"}, {file = "identify-2.6.9.tar.gz", hash = "sha256:d40dfe3142a1421d8518e3d3985ef5ac42890683e32306ad614a29490abeb6bf"}, @@ -1529,6 +1592,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1543,6 +1607,7 @@ version = "2.37.0" description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "imageio-2.37.0-py3-none-any.whl", hash = "sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed"}, {file = "imageio-2.37.0.tar.gz", hash = "sha256:71b57b3669666272c818497aebba2b4c5f20d5b37c81720e5e1a56d59c492996"}, @@ -1576,6 +1641,7 @@ version = "8.6.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, @@ -1585,12 +1651,12 @@ files = [ zipp = ">=3.20" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] [[package]] @@ -1599,6 +1665,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1610,6 +1677,7 @@ version = "2.2.0" description = "Pythonic task execution" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "invoke-2.2.0-py3-none-any.whl", hash = "sha256:6ea924cc53d4f78e3d98bc436b08069a03077e6f85ad1ddaa8a116d7dad15820"}, {file = "invoke-2.2.0.tar.gz", hash = "sha256:ee6cbb101af1a859c7fe84f2a264c059020b0cb7fe3535f9424300ab568f6bd5"}, @@ -1621,6 +1689,7 @@ version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, @@ -1654,6 +1723,7 @@ version = "8.34.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" +groups = ["dev"] files = [ {file = "ipython-8.34.0-py3-none-any.whl", hash = "sha256:0419883fa46e0baa182c5d50ebb8d6b49df1889fdb70750ad6d8cfe678eda6e3"}, {file = "ipython-8.34.0.tar.gz", hash = "sha256:c31d658e754673ecc6514583e7dda8069e47136eb62458816b7d1e6625948b5a"}, @@ -1675,7 +1745,7 @@ typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli ; python_version < \"3.11\"", "typing_extensions"] kernel = ["ipykernel"] matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] @@ -1692,6 +1762,7 @@ version = "8.1.5" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245"}, {file = "ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17"}, @@ -1713,6 +1784,7 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -1727,6 +1799,7 @@ version = "3.4.0" description = "Utility functions for Python class constructs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, @@ -1745,6 +1818,7 @@ version = "6.0.1" description = "Useful decorators and context managers" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, @@ -1755,7 +1829,7 @@ files = [ [package.extras] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] [[package]] name = "jaraco-functools" @@ -1763,6 +1837,7 @@ version = "4.1.0" description = "Functools like those found in stdlib" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"}, {file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"}, @@ -1772,7 +1847,7 @@ files = [ more-itertools = "*" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] @@ -1785,6 +1860,7 @@ version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, @@ -1804,13 +1880,15 @@ version = "0.9.0" description = "Low-level, pure Python DBus protocol wrapper." optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "sys_platform == \"linux\"" files = [ {file = "jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"}, {file = "jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"}, ] [package.extras] -test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +test = ["async-timeout ; python_version < \"3.11\"", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] trio = ["trio"] [[package]] @@ -1819,6 +1897,7 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1836,6 +1915,7 @@ version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, @@ -1847,6 +1927,7 @@ version = "3.1.0" description = "Library with helpers for the jsonlines file format" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "jsonlines-3.1.0-py3-none-any.whl", hash = "sha256:632f5e38f93dfcb1ac8c4e09780b92af3a55f38f26e7c47ae85109d420b6ad39"}, {file = "jsonlines-3.1.0.tar.gz", hash = "sha256:2579cb488d96f815b0eb81629e3e6b0332da0962a18fa3532958f7ba14a5c37f"}, @@ -1861,6 +1942,7 @@ version = "1.1.0" description = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9"}, {file = "jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552"}, @@ -1872,6 +1954,7 @@ 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"}, @@ -1893,6 +1976,7 @@ 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"}, @@ -1907,6 +1991,7 @@ version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" +groups = ["dev"] 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"}, @@ -1921,7 +2006,7 @@ 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"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko ; sys_platform == \"win32\"", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" @@ -1929,6 +2014,7 @@ version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" +groups = ["dev"] 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"}, @@ -1949,6 +2035,7 @@ version = "3.0.13" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" +groups = ["dev"] 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"}, @@ -1960,6 +2047,7 @@ version = "25.6.0" description = "Store and access your passwords safely." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, @@ -1975,7 +2063,7 @@ pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] completion = ["shtab (>=1.1.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] @@ -1989,6 +2077,7 @@ version = "1.4.8" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, @@ -2078,6 +2167,7 @@ version = "3.77.0" description = "Pure Python library for LaTeX to MathML conversion" optional = false python-versions = ">=3.8.1,<4.0.0" +groups = ["main"] files = [ {file = "latex2mathml-3.77.0-py3-none-any.whl", hash = "sha256:5531e18a2a9eae7c24e257118b6a444cbba253cd27ff3e81f1bd6c41e88e786e"}, {file = "latex2mathml-3.77.0.tar.gz", hash = "sha256:e2f501d1878f2e489c3f6f12786bef74c62f712d2770f7f3c837eb20a55d0a1e"}, @@ -2089,6 +2179,7 @@ version = "0.4" description = "Makes it easy to load subpackages and functions on demand." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc"}, {file = "lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1"}, @@ -2108,6 +2199,7 @@ version = "1.10.0" description = "A fast and thorough lazy object proxy." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, @@ -2154,6 +2246,7 @@ version = "0.14.1" description = "Lightning toolbox for across the our ecosystem." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "lightning_utilities-0.14.1-py3-none-any.whl", hash = "sha256:badc40a70d8e933706aa0b4f63b12392dbf8208728743a40b55edb5e81797311"}, {file = "lightning_utilities-0.14.1.tar.gz", hash = "sha256:9fb56c76dc07a46c075e1f78594fcb161091eae5944b34c2b43258d23c202791"}, @@ -2175,6 +2268,7 @@ version = "5.3.1" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a4058f16cee694577f7e4dd410263cd0ef75644b43802a689c2b3c2a7e69453b"}, {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:364de8f57d6eda0c16dcfb999af902da31396949efa0e583e12675d09709881b"}, @@ -2329,6 +2423,7 @@ 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"}, @@ -2353,6 +2448,7 @@ version = "2.1.2" description = "A markdown parser with high extensibility." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "marko-2.1.2-py3-none-any.whl", hash = "sha256:c14aa7a77468aaaf53cf056dcd3d32398b9df4c3fb81f5e120dd37cbb9f8c859"}, {file = "marko-2.1.2.tar.gz", hash = "sha256:a9170006b879376e6845c91b1ae3dce2992772954b99b70175ff888537186011"}, @@ -2369,6 +2465,7 @@ 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"}, @@ -2439,6 +2536,7 @@ version = "3.10.1" description = "Python plotting package" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "matplotlib-3.10.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16"}, {file = "matplotlib-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2"}, @@ -2496,6 +2594,7 @@ version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false python-versions = ">=3.8" +groups = ["dev"] 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"}, @@ -2510,6 +2609,7 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, @@ -2521,6 +2621,7 @@ 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"}, @@ -2532,6 +2633,7 @@ version = "10.6.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b"}, {file = "more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"}, @@ -2543,6 +2645,7 @@ version = "2.10.2" description = "A Python package for easy multiprocessing, but faster than multiprocessing" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "mpire-2.10.2-py3-none-any.whl", hash = "sha256:d627707f7a8d02aa4c7f7d59de399dec5290945ddf7fbd36cbb1d6ebb37a51fb"}, {file = "mpire-2.10.2.tar.gz", hash = "sha256:f66a321e93fadff34585a4bfa05e95bd946cf714b442f51c529038eb45773d97"}, @@ -2559,9 +2662,9 @@ tqdm = ">=4.27" [package.extras] dashboard = ["flask"] -dill = ["multiprocess", "multiprocess (>=0.70.15)"] +dill = ["multiprocess (>=0.70.15) ; python_version >= \"3.11\"", "multiprocess ; python_version < \"3.11\""] docs = ["docutils (==0.17.1)", "sphinx (==3.2.1)", "sphinx-autodoc-typehints (==1.11.0)", "sphinx-rtd-theme (==0.5.0)", "sphinx-versions (==1.0.1)", "sphinxcontrib-images (==0.9.2)"] -testing = ["ipywidgets", "multiprocess", "multiprocess (>=0.70.15)", "numpy", "pywin32 (>=301)", "rich"] +testing = ["ipywidgets", "multiprocess (>=0.70.15) ; python_version >= \"3.11\"", "multiprocess ; python_version < \"3.11\"", "numpy", "pywin32 (>=301) ; platform_system == \"Windows\"", "rich"] [[package]] name = "mpmath" @@ -2569,6 +2672,7 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2577,7 +2681,7 @@ files = [ [package.extras] develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] docs = ["sphinx"] -gmpy = ["gmpy2 (>=2.1.0a4)"] +gmpy = ["gmpy2 (>=2.1.0a4) ; platform_python_implementation != \"PyPy\""] tests = ["pytest (>=4.6)"] [[package]] @@ -2586,6 +2690,7 @@ version = "6.1.0" description = "multidict implementation" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, @@ -2690,6 +2795,7 @@ version = "0.70.16" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "multiprocess-0.70.16-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee"}, {file = "multiprocess-0.70.16-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec"}, @@ -2714,6 +2820,7 @@ version = "1.15.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"}, {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"}, @@ -2767,6 +2874,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -2778,6 +2886,7 @@ version = "1.9.1" description = "Run any standard Python code quality tool on a Jupyter Notebook" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "nbqa-1.9.1-py3-none-any.whl", hash = "sha256:95552d2f6c2c038136252a805aa78d85018aef922586270c3a074332737282e5"}, {file = "nbqa-1.9.1.tar.gz", hash = "sha256:a1f4bcf587c597302fed295951001fc4e1be4ce0e77e1ab1b25ac2fbe3db0cdd"}, @@ -2798,6 +2907,7 @@ version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" +groups = ["dev"] 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"}, @@ -2809,6 +2919,7 @@ version = "3.4.2" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"}, {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"}, @@ -2828,6 +2939,7 @@ version = "0.2.21" description = "Python binding to Ammonia HTML sanitizer Rust crate" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "nh3-0.2.21-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:fcff321bd60c6c5c9cb4ddf2554e22772bb41ebd93ad88171bbbb6f271255286"}, {file = "nh3-0.2.21-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31eedcd7d08b0eae28ba47f43fd33a653b4cdb271d64f1aeda47001618348fde"}, @@ -2861,6 +2973,7 @@ version = "1.11.1.3" description = "Ninja is a small build system with a focus on speed" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "ninja-1.11.1.3-py3-none-macosx_10_9_universal2.whl", hash = "sha256:2b4879ea3f1169f3d855182c57dcc84d1b5048628c8b7be0d702b81882a37237"}, {file = "ninja-1.11.1.3-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bc3ebc8b2e47716149f3541742b5cd8e0b08f51013b825c05baca3e34854370d"}, @@ -2890,6 +3003,7 @@ version = "3.9.1" description = "Natural Language Toolkit" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"}, {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"}, @@ -2915,6 +3029,7 @@ version = "1.9.1" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -2926,6 +3041,8 @@ version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] +markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -2971,6 +3088,8 @@ version = "2.2.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" +groups = ["main", "dev"] +markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "numpy-2.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9"}, {file = "numpy-2.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae"}, @@ -3035,6 +3154,8 @@ version = "12.4.5.8" description = "CUBLAS native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3"}, {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b"}, @@ -3047,6 +3168,8 @@ version = "12.4.127" description = "CUDA profiling tools runtime libs." optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a"}, {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb"}, @@ -3059,6 +3182,8 @@ version = "12.4.127" description = "NVRTC native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198"}, {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338"}, @@ -3071,6 +3196,8 @@ version = "12.4.127" description = "CUDA Runtime native Libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3"}, {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5"}, @@ -3083,6 +3210,8 @@ version = "9.1.0.70" description = "cuDNN runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, @@ -3097,6 +3226,8 @@ version = "11.2.1.3" description = "CUFFT native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399"}, {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9"}, @@ -3112,6 +3243,8 @@ version = "10.3.5.147" description = "CURAND native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9"}, {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b"}, @@ -3124,6 +3257,8 @@ version = "11.6.1.9" description = "CUDA solver native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e"}, {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260"}, @@ -3141,6 +3276,8 @@ version = "12.3.1.170" description = "CUSPARSE native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3"}, {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1"}, @@ -3156,6 +3293,8 @@ version = "0.6.2" description = "NVIDIA cuSPARSELt" optional = false python-versions = "*" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:067a7f6d03ea0d4841c85f0c6f1991c5dda98211f6302cb83a4ab234ee95bef8"}, {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:df2c24502fd76ebafe7457dbc4716b2fec071aabaed4fb7691a201cde03704d9"}, @@ -3168,6 +3307,8 @@ version = "2.21.5" description = "NVIDIA Collective Communication Library (NCCL) Runtime" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0"}, ] @@ -3178,6 +3319,8 @@ version = "12.4.127" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, @@ -3190,6 +3333,8 @@ version = "12.4.127" description = "NVIDIA Tools Extension" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3"}, {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a"}, @@ -3202,6 +3347,7 @@ version = "4.11.0.86" description = "Wrapper package for OpenCV python bindings." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798"}, {file = "opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca"}, @@ -3214,9 +3360,9 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, - {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, + {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] @@ -3226,6 +3372,7 @@ version = "3.1.5" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, @@ -3240,6 +3387,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -3251,6 +3399,7 @@ 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"}, @@ -3337,6 +3486,7 @@ version = "2.2.3.250308" description = "Type annotations for pandas" optional = false python-versions = ">=3.10" +groups = ["dev"] files = [ {file = "pandas_stubs-2.2.3.250308-py3-none-any.whl", hash = "sha256:a377edff3b61f8b268c82499fdbe7c00fdeed13235b8b71d6a1dc347aeddc74d"}, {file = "pandas_stubs-2.2.3.250308.tar.gz", hash = "sha256:3a6e9daf161f00b85c83772ed3d5cff9522028f07a94817472c07b91f46710fd"}, @@ -3352,6 +3502,7 @@ version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -3367,6 +3518,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -3378,6 +3530,8 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" +groups = ["dev"] +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"}, @@ -3392,6 +3546,7 @@ version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, @@ -3480,7 +3635,7 @@ docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -typing = ["typing-extensions"] +typing = ["typing-extensions ; python_version < \"3.10\""] xmp = ["defusedxml"] [[package]] @@ -3489,6 +3644,7 @@ version = "1.12.1.2" description = "Query metadata from sdists / bdists / installed packages." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pkginfo-1.12.1.2-py3-none-any.whl", hash = "sha256:c783ac885519cab2c34927ccfa6bf64b5a704d7c69afaea583dd9b7afe969343"}, {file = "pkginfo-1.12.1.2.tar.gz", hash = "sha256:5cd957824ac36f140260964eba3c6be6442a8359b8c48f4adf90210f33a04b7b"}, @@ -3503,6 +3659,7 @@ 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 = ["dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -3519,6 +3676,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -3534,6 +3692,7 @@ version = "3.8.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, @@ -3552,6 +3711,7 @@ version = "3.0.50" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198"}, {file = "prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab"}, @@ -3566,6 +3726,7 @@ version = "0.3.0" description = "Accelerated property cache" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:efa44f64c37cc30c9f05932c740a8b40ce359f51882c70883cc95feac842da4d"}, {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2383a17385d9800b6eb5855c2f05ee550f803878f344f58b6e194de08b96352c"}, @@ -3673,6 +3834,7 @@ version = "7.0.0" description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, @@ -3685,6 +3847,7 @@ files = [ {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, ] +markers = {main = "sys_platform != \"darwin\" or platform_machine != \"x86_64\""} [package.extras] dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] @@ -3696,6 +3859,8 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = false python-versions = "*" +groups = ["dev"] +markers = "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"}, @@ -3707,6 +3872,7 @@ version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" +groups = ["dev"] 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"}, @@ -3721,6 +3887,7 @@ version = "19.0.1" description = "Python library for Apache Arrow" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fc28912a2dc924dddc2087679cc8b7263accc71b9ff025a1362b004711661a69"}, {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fca15aabbe9b8355800d923cc2e82c8ef514af321e18b437c3d782aa884eaeec"}, @@ -3775,6 +3942,7 @@ version = "1.3.0.post6" description = "Cython wrapper for the C++ translation of the Angus Johnson's Clipper library (ver. 6.4.2)" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pyclipper-1.3.0.post6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fa0f5e78cfa8262277bb3d0225537b3c2a90ef68fd90a229d5d24cf49955dcf4"}, {file = "pyclipper-1.3.0.post6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a01f182d8938c1dc515e8508ed2442f7eebd2c25c7d5cb29281f583c1a8008a4"}, @@ -3834,6 +4002,7 @@ version = "2.0.8" description = "Official APIs for the MS-COCO dataset" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pycocotools-2.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a66886f45b04cee1ff0492e9f5e25d430d8aa3eb63e63c4ebc620945caa11b9"}, {file = "pycocotools-2.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257130b65b7b0f122ce1ed62942867ca9789e56a68109682796cc85c9770c74a"}, @@ -3876,6 +4045,7 @@ version = "2.11.1" description = "Python style guide checker" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, @@ -3887,6 +4057,8 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "implementation_name == \"pypy\" or sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -3898,6 +4070,7 @@ version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, @@ -3910,7 +4083,7 @@ typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] [[package]] name = "pydantic-core" @@ -3918,6 +4091,7 @@ 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"}, @@ -4030,6 +4204,7 @@ version = "2.8.1" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c"}, {file = "pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585"}, @@ -4050,6 +4225,7 @@ version = "3.1.0" description = "passive checker of Python programs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, @@ -4061,6 +4237,7 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -4075,6 +4252,7 @@ version = "2.17.7" description = "python code static checker" optional = false python-versions = ">=3.7.2" +groups = ["dev"] files = [ {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, @@ -4103,6 +4281,7 @@ version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, @@ -4117,6 +4296,7 @@ version = "4.30.1" description = "Python bindings to PDFium" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "pypdfium2-4.30.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:e07c47633732cc18d890bb7e965ad28a9c5a932e548acb928596f86be2e5ae37"}, {file = "pypdfium2-4.30.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5ea2d44e96d361123b67b00f527017aa9c847c871b5714e013c01c3eb36a79fe"}, @@ -4139,6 +4319,7 @@ version = "6.1.0" description = "pyproject-flake8 (`pflake8`), a monkey patching wrapper to connect flake8 with pyproject.toml configuration" optional = false python-versions = ">=3.8.1" +groups = ["dev"] files = [ {file = "pyproject_flake8-6.1.0-py3-none-any.whl", hash = "sha256:86ea5559263c098e1aa4f866776aa2cf45362fd91a576b9fd8fbbbb55db12c4e"}, {file = "pyproject_flake8-6.1.0.tar.gz", hash = "sha256:6da8e5a264395e0148bc11844c6fb50546f1fac83ac9210f7328664135f9e70f"}, @@ -4154,6 +4335,7 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -4176,6 +4358,7 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -4196,6 +4379,7 @@ version = "0.6.6" description = "Python Bidi layout wrapping the Rust crate unicode-bidi" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "python_bidi-0.6.6-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09d4da6b5851d0df01d7313a11d22f308fdfb0e12461f7262e0f55c521ccc0f1"}, {file = "python_bidi-0.6.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:493a844891e23264411b01df58ba77d5dbb0045da3787f4195f50a56bfb847d9"}, @@ -4317,6 +4501,7 @@ 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", "dev"] 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"}, @@ -4331,6 +4516,7 @@ version = "1.1.2" description = "Create, read, and update Microsoft Word .docx files." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe"}, {file = "python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd"}, @@ -4346,6 +4532,7 @@ 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"}, @@ -4360,6 +4547,7 @@ version = "3.15.0" description = "Interact with GitLab API" optional = false python-versions = ">=3.7.0" +groups = ["dev"] files = [ {file = "python-gitlab-3.15.0.tar.gz", hash = "sha256:c9e65eb7612a9fbb8abf0339972eca7fd7a73d4da66c9b446ffe528930aff534"}, {file = "python_gitlab-3.15.0-py3-none-any.whl", hash = "sha256:8f8d1c0d387f642eb1ac7bf5e8e0cd8b3dd49c6f34170cee3c7deb7d384611f3"}, @@ -4379,6 +4567,7 @@ version = "1.0.2" description = "Create, read, and update PowerPoint 2007+ (.pptx) files." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "python_pptx-1.0.2-py3-none-any.whl", hash = "sha256:160838e0b8565a8b1f67947675886e9fea18aa5e795db7ae531606d68e785cba"}, {file = "python_pptx-1.0.2.tar.gz", hash = "sha256:479a8af0eaf0f0d76b6f00b0887732874ad2e3188230315290cd1f9dd9cc7095"}, @@ -4396,6 +4585,7 @@ version = "7.34.6" description = "Automatic Semantic Versioning for Python projects" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "python-semantic-release-7.34.6.tar.gz", hash = "sha256:e9b8fb788024ae9510a924136d573588415a16eeca31cc5240f2754a80a2e831"}, {file = "python_semantic_release-7.34.6-py3-none-any.whl", hash = "sha256:7e3969ba4663d9b2087b02bf3ac140e202551377bf045c34e09bfe19753e19ab"}, @@ -4427,6 +4617,7 @@ version = "2025.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, @@ -4438,6 +4629,7 @@ version = "310" description = "Python for Window Extensions" optional = false python-versions = "*" +groups = ["main", "dev"] files = [ {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, @@ -4456,6 +4648,7 @@ files = [ {file = "pywin32-310-cp39-cp39-win32.whl", hash = "sha256:851c8d927af0d879221e616ae1f66145253537bbdd321a77e8ef701b443a9a1a"}, {file = "pywin32-310-cp39-cp39-win_amd64.whl", hash = "sha256:96867217335559ac619f00ad70e513c0fcf84b8a3af9fc2bba3b59b97da70475"}, ] +markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\"", dev = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} [[package]] name = "pywin32-ctypes" @@ -4463,6 +4656,8 @@ version = "0.2.3" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" optional = false python-versions = ">=3.6" +groups = ["dev"] +markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, @@ -4474,6 +4669,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] 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"}, @@ -4536,6 +4732,7 @@ version = "26.3.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pyzmq-26.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1586944f4736515af5c6d3a5b150c7e8ca2a2d6e46b23057320584d6f2438f4a"}, {file = "pyzmq-26.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa7efc695d1fc9f72d91bf9b6c6fe2d7e1b4193836ec530a98faf7d7a7577a58"}, @@ -4641,6 +4838,7 @@ version = "44.0" description = "readme_renderer is a library for rendering readme descriptions for Warehouse" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151"}, {file = "readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"}, @@ -4660,6 +4858,7 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -4676,6 +4875,7 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -4779,6 +4979,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -4800,6 +5001,7 @@ version = "1.0.0" description = "A utility belt for advanced users of python-requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["dev"] files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, @@ -4814,6 +5016,7 @@ version = "2.0.0" description = "Validating URI References per RFC 3986" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, @@ -4828,6 +5031,7 @@ 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"}, @@ -4847,6 +5051,7 @@ version = "0.23.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "rpds_py-0.23.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2a54027554ce9b129fc3d633c92fa33b30de9f08bc61b32c053dc9b537266fed"}, {file = "rpds_py-0.23.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5ef909a37e9738d146519657a1aab4584018746a18f71c692f2f22168ece40c"}, @@ -4959,6 +5164,7 @@ version = "1.4.0" description = "R-Tree spatial index for Python GIS" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "rtree-1.4.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:4d1bebc418101480aabf41767e772dd2155d3b27b1376cccbd93e4509485e091"}, {file = "rtree-1.4.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:997f8c38d5dffa3949ea8adb4c8b291ea5cd4ef5ee69455d642dd171baf9991d"}, @@ -4978,6 +5184,7 @@ version = "0.5.3" description = "" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073"}, {file = "safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21d01c14ff6c415c485616b8b0bf961c46b3b343ca59110d38d744e577f9cce7"}, @@ -5019,6 +5226,7 @@ version = "0.25.2" description = "Image processing in Python" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "scikit_image-0.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d3278f586793176599df6a4cf48cb6beadae35c31e58dc01a98023af3dc31c78"}, {file = "scikit_image-0.25.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5c311069899ce757d7dbf1d03e32acb38bb06153236ae77fcd820fd62044c063"}, @@ -5057,7 +5265,7 @@ tifffile = ">=2022.8.12" [package.extras] build = ["Cython (>=3.0.8)", "build (>=1.2.1)", "meson-python (>=0.16)", "ninja (>=1.11.1.1)", "numpy (>=2.0)", "pythran (>=0.16)", "spin (==0.13)"] data = ["pooch (>=1.6.0)"] -developer = ["ipython", "pre-commit", "tomli"] +developer = ["ipython", "pre-commit", "tomli ; python_version < \"3.11\""] docs = ["PyWavelets (>=1.6)", "dask[array] (>=2023.2.0)", "intersphinx-registry (>=0.2411.14)", "ipykernel", "ipywidgets", "kaleido (==0.2.1)", "matplotlib (>=3.7)", "myst-parser", "numpydoc (>=1.7)", "pandas (>=2.0)", "plotly (>=5.20)", "pooch (>=1.6)", "pydata-sphinx-theme (>=0.16)", "pytest-doctestplus", "scikit-learn (>=1.2)", "seaborn (>=0.11)", "sphinx (>=8.0)", "sphinx-copybutton", "sphinx-gallery[parallel] (>=0.18)", "sphinx_design (>=0.5)", "tifffile (>=2022.8.12)"] optional = ["PyWavelets (>=1.6)", "SimpleITK", "astropy (>=5.0)", "cloudpickle (>=1.1.1)", "dask[array] (>=2023.2.0)", "matplotlib (>=3.7)", "pooch (>=1.6.0)", "pyamg (>=5.2)", "scikit-learn (>=1.2)"] test = ["asv", "numpydoc (>=1.7)", "pooch (>=1.6.0)", "pytest (>=8)", "pytest-cov (>=2.11.0)", "pytest-doctestplus", "pytest-faulthandler", "pytest-localserver"] @@ -5068,6 +5276,7 @@ version = "1.15.2" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9"}, {file = "scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5"}, @@ -5123,7 +5332,7 @@ numpy = ">=1.23.5,<2.5" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "secretstorage" @@ -5131,6 +5340,8 @@ version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" optional = false python-versions = ">=3.6" +groups = ["dev"] +markers = "sys_platform == \"linux\"" files = [ {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, @@ -5146,6 +5357,7 @@ version = "2.2.2" description = "A fast and lightweight Python library for splitting text into semantically meaningful chunks." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "semchunk-2.2.2-py3-none-any.whl", hash = "sha256:94ca19020c013c073abdfd06d79a7c13637b91738335f3b8cdb5655ee7cc94d2"}, {file = "semchunk-2.2.2.tar.gz", hash = "sha256:940e89896e64eeb01de97ba60f51c8c7b96c6a3951dfcf574f25ce2146752f52"}, @@ -5161,6 +5373,7 @@ version = "2.13.0" description = "Python helper for Semantic Versioning (http://semver.org/)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["dev"] files = [ {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, @@ -5172,19 +5385,20 @@ version = "76.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "setuptools-76.0.0-py3-none-any.whl", hash = "sha256:199466a166ff664970d0ee145839f5582cb9bca7a0a3a2e795b6a9cb2308e9c6"}, {file = "setuptools-76.0.0.tar.gz", hash = "sha256:43b4ee60e10b0d0ee98ad11918e114c70701bc6051662a9a675a0496c1a158f4"}, ] [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)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "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) ; python_version < \"3.11\"", "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"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "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 ; sys_platform != \"cygwin\"", "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) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "shapely" @@ -5192,6 +5406,7 @@ version = "2.0.7" description = "Manipulation and analysis of geometric objects" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "shapely-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:33fb10e50b16113714ae40adccf7670379e9ccf5b7a41d0002046ba2b8f0f691"}, {file = "shapely-2.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f44eda8bd7a4bccb0f281264b34bf3518d8c4c9a8ffe69a1a05dabf6e8461147"}, @@ -5250,6 +5465,7 @@ version = "1.5.4" description = "Tool to Detect Surrounding Shell" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, @@ -5261,6 +5477,7 @@ 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", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -5272,6 +5489,7 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -5283,6 +5501,7 @@ 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"}, @@ -5294,6 +5513,7 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" +groups = ["dev"] 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"}, @@ -5313,6 +5533,7 @@ version = "1.13.1" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, @@ -5330,6 +5551,7 @@ version = "0.9.0" description = "Pretty-print tabular data" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, @@ -5344,6 +5566,7 @@ version = "2025.3.13" description = "Read and write TIFF files" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "tifffile-2025.3.13-py3-none-any.whl", hash = "sha256:10f205b923c04678f744a6d553f6f86c639c9ba6e714f6758d81af0678ba75dc"}, {file = "tifffile-2025.3.13.tar.gz", hash = "sha256:30fcc4584216937b5993d0568452b6fea8e12e61f9afb1a8e967c07c281faa06"}, @@ -5366,6 +5589,7 @@ version = "6.1.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "tokenize_rt-6.1.0-py2.py3-none-any.whl", hash = "sha256:d706141cdec4aa5f358945abe36b911b8cbdc844545da99e811250c0cee9b6fc"}, {file = "tokenize_rt-6.1.0.tar.gz", hash = "sha256:e8ee836616c0877ab7c7b54776d2fefcc3bde714449a206762425ae114b53c86"}, @@ -5377,6 +5601,8 @@ version = "0.19.1" description = "" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, @@ -5494,6 +5720,8 @@ version = "0.21.1" description = "" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "tokenizers-0.21.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e78e413e9e668ad790a29456e677d9d3aa50a9ad311a40905d6861ba7692cf41"}, {file = "tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:cd51cd0a91ecc801633829fcd1fda9cf8682ed3477c6243b9a095539de4aecf3"}, @@ -5526,6 +5754,7 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["dev"] 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"}, @@ -5567,6 +5796,7 @@ version = "0.13.2" description = "Style preserving TOML library" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, @@ -5578,6 +5808,7 @@ version = "2.6.0" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.9.0" +groups = ["main"] files = [ {file = "torch-2.6.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:6860df13d9911ac158f4c44031609700e1eba07916fff62e21e6ffa0a9e01961"}, {file = "torch-2.6.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c4f103a49830ce4c7561ef4434cc7926e5a5fe4e5eb100c19ab36ea1e2b634ab"}, @@ -5634,6 +5865,7 @@ version = "1.6.3" description = "PyTorch native Metrics" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "torchmetrics-1.6.3-py3-none-any.whl", hash = "sha256:034640d4e1c30b7d3488551b1ce3fc1f363070811e6b97b9cb6b60a9ec15e9f4"}, {file = "torchmetrics-1.6.3.tar.gz", hash = "sha256:be59ffe9e9abf12ac12c3ac4383b2fc7731ad2bf3748ae1b06e8dea34e9f8a65"}, @@ -5649,7 +5881,7 @@ torch = ">=2.0.0" all = ["SciencePlots (>=2.0.0)", "gammatone (>=1.0.0)", "ipadic (>=1.0.0)", "librosa (>=0.10.0)", "matplotlib (>=3.6.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.15.0)", "nltk (>3.8.1)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] audio = ["gammatone (>=1.0.0)", "librosa (>=0.10.0)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "pystoi (>=0.4.0)", "requests (>=2.19.0)", "torchaudio (>=2.0.1)"] detection = ["pycocotools (>2.0.0)", "torchvision (>=0.15.1)"] -dev = ["PyTDC (==0.4.1)", "SciencePlots (>=2.0.0)", "bert_score (==0.3.13)", "dython (==0.7.9)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.30)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.15.0)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.3.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +dev = ["PyTDC (==0.4.1) ; python_version < \"3.12\"", "SciencePlots (>=2.0.0)", "bert_score (==0.3.13)", "dython (==0.7.9)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.30)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0) ; python_version < \"3.12\"", "mecab-ko-dic (>=1.0.0) ; python_version < \"3.12\"", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.15.0)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.3.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] image = ["scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.15.1)"] multimodal = ["piq (<=0.8.0)", "transformers (>=4.42.3)"] text = ["ipadic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>3.8.1)", "regex (>=2021.9.24)", "sentencepiece (>=0.2.0)", "tqdm (<4.68.0)", "transformers (>4.4.0)"] @@ -5662,6 +5894,7 @@ version = "0.21.0" description = "image and video datasets and models for torch deep learning" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "torchvision-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:044ea420b8c6c3162a234cada8e2025b9076fa82504758cd11ec5d0f8cd9fa37"}, {file = "torchvision-0.21.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:b0c0b264b89ab572888244f2e0bad5b7eaf5b696068fc0b93e96f7c3c198953f"}, @@ -5700,6 +5933,7 @@ 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 = ["dev"] 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"}, @@ -5720,6 +5954,7 @@ version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, @@ -5741,6 +5976,7 @@ version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -5756,6 +5992,8 @@ version = "4.42.4" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.8.0" +groups = ["main"] +markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "transformers-4.42.4-py3-none-any.whl", hash = "sha256:6d59061392d0f1da312af29c962df9017ff3c0108c681a56d1bc981004d16d24"}, {file = "transformers-4.42.4.tar.gz", hash = "sha256:f956e25e24df851f650cb2c158b6f4352dfae9d702f04c113ed24fc36ce7ae2d"}, @@ -5824,6 +6062,8 @@ version = "4.49.0" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.9.0" +groups = ["main"] +markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "transformers-4.49.0-py3-none-any.whl", hash = "sha256:6b4fded1c5fee04d384b1014495b4235a2b53c87503d7d592423c06128cbbe03"}, {file = "transformers-4.49.0.tar.gz", hash = "sha256:7e40e640b5b8dc3f48743f5f5adbdce3660c82baafbd3afdfc04143cdbd2089e"}, @@ -5893,6 +6133,8 @@ version = "3.2.0" description = "A language and compiler for custom Deep Learning operations" optional = false python-versions = "*" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3e54983cd51875855da7c68ec05c05cf8bb08df361b1d5b69e05e40b0c9bd62"}, {file = "triton-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8009a1fb093ee8546495e96731336a33fb8856a38e45bb4ab6affd6dbc3ba220"}, @@ -5912,6 +6154,7 @@ version = "3.8.0" description = "Collection of utilities for publishing packages on PyPI" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, @@ -5935,6 +6178,7 @@ version = "0.12.5" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"}, {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"}, @@ -5952,6 +6196,7 @@ version = "3.1.5.20250306" description = "Typing stubs for openpyxl" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "types_openpyxl-3.1.5.20250306-py3-none-any.whl", hash = "sha256:f7733dac1dcb07c89ff5ffde8452ee8d272be638defed855f4c48b2990ce5aa7"}, {file = "types_openpyxl-3.1.5.20250306.tar.gz", hash = "sha256:aa7ad2425e8020ff46a31633becfe1f3c64114498d964c536199f654b464e6bc"}, @@ -5963,6 +6208,7 @@ version = "2025.1.0.20250204" description = "Typing stubs for pytz" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "types_pytz-2025.1.0.20250204-py3-none-any.whl", hash = "sha256:32ca4a35430e8b94f6603b35beb7f56c32260ddddd4f4bb305fdf8f92358b87e"}, {file = "types_pytz-2025.1.0.20250204.tar.gz", hash = "sha256:00f750132769f1c65a4f7240bc84f13985b4da774bd17dfbe5d9cd442746bd49"}, @@ -5974,6 +6220,7 @@ version = "2.32.0.20250306" description = "Typing stubs for requests" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "types_requests-2.32.0.20250306-py3-none-any.whl", hash = "sha256:25f2cbb5c8710b2022f8bbee7b2b66f319ef14aeea2f35d80f18c9dbf3b60a0b"}, {file = "types_requests-2.32.0.20250306.tar.gz", hash = "sha256:0962352694ec5b2f95fda877ee60a159abdf84a0fc6fdace599f20acb41a03d1"}, @@ -5988,6 +6235,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] 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"}, @@ -5999,6 +6247,7 @@ version = "2025.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" +groups = ["main"] files = [ {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, @@ -6010,13 +6259,14 @@ version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -6027,6 +6277,7 @@ version = "20.29.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "virtualenv-20.29.3-py3-none-any.whl", hash = "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170"}, {file = "virtualenv-20.29.3.tar.gz", hash = "sha256:95e39403fcf3940ac45bc717597dba16110b74506131845d9b687d5e73d947ac"}, @@ -6039,7 +6290,7 @@ platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] [[package]] name = "wcwidth" @@ -6047,6 +6298,7 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -6058,6 +6310,7 @@ version = "0.45.1" description = "A built-package format for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"}, {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"}, @@ -6072,6 +6325,7 @@ version = "4.0.13" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71"}, {file = "widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6"}, @@ -6083,6 +6337,7 @@ version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -6171,6 +6426,7 @@ version = "3.2.2" description = "A Python module for creating Excel XLSX files." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "XlsxWriter-3.2.2-py3-none-any.whl", hash = "sha256:272ce861e7fa5e82a4a6ebc24511f2cb952fde3461f6c6e1a1e81d3272db1471"}, {file = "xlsxwriter-3.2.2.tar.gz", hash = "sha256:befc7f92578a85fed261639fb6cde1fd51b79c5e854040847dde59d4317077dc"}, @@ -6182,6 +6438,7 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -6193,6 +6450,7 @@ version = "3.5.0" description = "Python binding for xxHash" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "xxhash-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ece616532c499ee9afbb83078b1b952beffef121d989841f7f4b3dc5ac0fd212"}, {file = "xxhash-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3171f693dbc2cef6477054a665dc255d996646b4023fe56cb4db80e26f4cc520"}, @@ -6325,6 +6583,7 @@ version = "1.18.3" description = "Yet another URL library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, @@ -6421,20 +6680,21 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.10" -content-hash = "059e0c343e9d3804eb5715ceabfcad3103a001deaf4d7bcf6cae5f4e3d01a571" +content-hash = "cea5cf98c361ed0e3670a65a3e4adf42bbd8238bcd280e482804c8325c6c7728" diff --git a/pyproject.toml b/pyproject.toml index 2edf9e9b..5266ac3f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ lxml = "^5.3.0" datasets = "^3.2.0" apted = "^1.0.3" Distance = "^0.1.3" -docling = {extras = ["vlm"], version = "^2.26.0"} +docling = {extras = ["vlm"], version = "~2.26.0"} matplotlib = "^3.10.0" torch = "^2.5.1" torchmetrics = "^1.6.0" From 055548544c837a82ae734837b4a48619984579df Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Wed, 19 Mar 2025 16:19:40 +0100 Subject: [PATCH 15/81] Add omnidocbench DatasetBuilder Signed-off-by: Christoph Auer --- .../dataset_builders/dataset_builder.py | 10 +- .../dataset_builders/omnidocbench_builder.py | 390 ++++++++++++++++++ .../test_dataset_builder.py | 51 ++- 3 files changed, 443 insertions(+), 8 deletions(-) create mode 100644 docling_eval_next/dataset_builders/omnidocbench_builder.py rename docs/examples/run_dpbench_builder_example.py => tests/test_dataset_builder.py (62%) diff --git a/docling_eval_next/dataset_builders/dataset_builder.py b/docling_eval_next/dataset_builders/dataset_builder.py index d5aa3aa5..705279b1 100644 --- a/docling_eval_next/dataset_builders/dataset_builder.py +++ b/docling_eval_next/dataset_builders/dataset_builder.py @@ -1,4 +1,5 @@ import os +import sys from abc import abstractmethod from io import BytesIO from pathlib import Path @@ -99,7 +100,7 @@ def update_prediction(self, record: DatasetRecord): record.validate_model() # type: ignore - def save_to_disk(self): + def save_to_disk(self, chunk_size: int = 80, max_num_chunks: int = sys.maxsize): if not self.retrieved: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." @@ -109,10 +110,15 @@ def save_to_disk(self): os.makedirs(test_dir, exist_ok=True) count = 0 - for record_chunk in chunkify(self.iterate(), 80): + chunk_count = 0 + for record_chunk in chunkify(self.iterate(), chunk_size): record_chunk = [r.as_record_dict() for r in record_chunk] save_shard_to_disk(items=record_chunk, dataset_path=test_dir) count += len(record_chunk) + chunk_count += 1 + + if chunk_count >= max_num_chunks: + break write_datasets_info( name=self.name, diff --git a/docling_eval_next/dataset_builders/omnidocbench_builder.py b/docling_eval_next/dataset_builders/omnidocbench_builder.py new file mode 100644 index 00000000..dc1dfcb4 --- /dev/null +++ b/docling_eval_next/dataset_builders/omnidocbench_builder.py @@ -0,0 +1,390 @@ +import glob +import json +import logging +import os +from io import BytesIO +from pathlib import Path +from typing import Dict, Iterable, List, Optional, Tuple + +from docling_core.types import DoclingDocument +from docling_core.types.doc import ( + BoundingBox, + CoordOrigin, + DocItemLabel, + ImageRef, + ProvenanceItem, + Size, + TableCell, + TableData, +) +from docling_core.types.io import DocumentStream +from PIL.Image import Image +from tqdm import tqdm + +from docling_eval.benchmarks.utils import ( + add_pages_to_true_doc, + convert_html_table_into_docling_tabledata, + crop_bounding_box, + from_pil_to_base64uri, + get_binary, + get_binhash, + set_selection_range, +) +from docling_eval.converters.models.tableformer.tf_model_prediction import ( + TableFormerUpdater, +) +from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters +from docling_eval_next.datamodels.dataset_record import DatasetRecord +from docling_eval_next.dataset_builders.dataset_builder import ( + BaseEvaluationDatasetBuilder, + HFSource, +) +from docling_eval_next.prediction_providers.prediction_provider import ( + BasePredictionProvider, +) + +# Get logger +_log = logging.getLogger(__name__) + +TRUE_HTML_EXPORT_LABELS = { + DocItemLabel.TITLE, + DocItemLabel.DOCUMENT_INDEX, + DocItemLabel.SECTION_HEADER, + DocItemLabel.PARAGRAPH, + DocItemLabel.TABLE, + DocItemLabel.PICTURE, + DocItemLabel.FORMULA, + DocItemLabel.CHECKBOX_UNSELECTED, + DocItemLabel.CHECKBOX_SELECTED, + DocItemLabel.TEXT, + DocItemLabel.LIST_ITEM, + DocItemLabel.CODE, + DocItemLabel.REFERENCE, + # Additional + DocItemLabel.CAPTION, + DocItemLabel.PAGE_HEADER, + DocItemLabel.PAGE_FOOTER, + DocItemLabel.FOOTNOTE, +} + +PRED_HTML_EXPORT_LABELS = { + DocItemLabel.TITLE, + DocItemLabel.DOCUMENT_INDEX, + DocItemLabel.SECTION_HEADER, + DocItemLabel.PARAGRAPH, + DocItemLabel.TABLE, + DocItemLabel.PICTURE, + DocItemLabel.FORMULA, + DocItemLabel.CHECKBOX_UNSELECTED, + DocItemLabel.CHECKBOX_SELECTED, + DocItemLabel.TEXT, + DocItemLabel.LIST_ITEM, + DocItemLabel.CODE, + DocItemLabel.REFERENCE, + # Additional + DocItemLabel.PAGE_HEADER, + DocItemLabel.PAGE_FOOTER, + DocItemLabel.FOOTNOTE, +} + + +class OmniDocBenchDatasetBuilder(BaseEvaluationDatasetBuilder): + def __init__( + self, + prediction_provider: BasePredictionProvider, + target: Path, + do_visualization: bool = True, + ): + super().__init__( + name="OmniDocBench: end-to-end", + dataset_source=HFSource(repo_id="opendatalab/OmniDocBench"), + prediction_provider=prediction_provider, + target=target, + ) + self.do_visualization = do_visualization + + def update_gt_into_map(self, gt): + + result = {} + + for item in gt: + path = item["page_info"]["image_path"] + result[path] = item + + return result + + def get_filenames(self, omnidocbench_dir: Path) -> List[Tuple[str, str]]: + + page_images = sorted(glob.glob(str(omnidocbench_dir / "images/*.jpg"))) + page_pdfs = sorted(glob.glob(str(omnidocbench_dir / "ori_pdfs/*.pdf"))) + + assert len(page_images) == len( + page_pdfs + ), f"len(page_images)!=len(page_pdfs) => {len(page_images)}!={len(page_pdfs)}" + + return list(zip(page_images, page_pdfs)) + + def update_doc_with_gt( + self, + gt, + true_doc, + page, + page_image: Image, + page_width: float, + page_height: float, + ): + + gt_width = float(gt["page_info"]["width"]) + gt_height = float(gt["page_info"]["height"]) + + for item in gt["layout_dets"]: + + label = item["category_type"] + + text = f"<omitted text for {label}>" + if "text" in item: + text = item["text"] + + min_x = item["poly"][0] + max_x = item["poly"][0] + + min_y = item["poly"][1] + max_y = item["poly"][1] + + for i in range(0, 4): + min_x = min(min_x, item["poly"][2 * i]) + max_x = max(max_x, item["poly"][2 * i]) + + min_y = min(min_y, item["poly"][2 * i + 1]) + max_y = max(max_y, item["poly"][2 * i + 1]) + + bbox = BoundingBox( + l=min_x * page_width / gt_width, + r=max_x * page_width / gt_width, + t=min_y * page_height / gt_height, + b=max_y * page_height / gt_height, + coord_origin=CoordOrigin.TOPLEFT, + ) + + prov = ProvenanceItem(page_no=1, bbox=bbox, charspan=(0, len(text))) + + img = crop_bounding_box(page_image=page_image, page=page, bbox=bbox) + # img.show() + + if label == "title": + true_doc.add_heading(text=text, orig=text, level=1, prov=prov) + + elif label == "text_block": + true_doc.add_text( + label=DocItemLabel.TEXT, text=text, orig=text, prov=prov + ) + + elif label == "text_mask": + true_doc.add_text( + label=DocItemLabel.TEXT, text=text, orig=text, prov=prov + ) + + elif label == "table": + + table_data = convert_html_table_into_docling_tabledata( + table_html=item["html"] + ) + true_doc.add_table(data=table_data, caption=None, prov=prov) + + elif label == "table_caption": + true_doc.add_text( + label=DocItemLabel.CAPTION, text=text, orig=text, prov=prov + ) + + elif label == "table_footnote": + true_doc.add_text( + label=DocItemLabel.FOOTNOTE, text=text, orig=text, prov=prov + ) + + elif label == "table_mask": + true_doc.add_text( + label=DocItemLabel.TEXT, text=text, orig=text, prov=prov + ) + + elif label == "figure": + + uri = from_pil_to_base64uri(img) + + imgref = ImageRef( + mimetype="image/png", + dpi=72, + size=Size(width=img.width, height=img.height), + uri=uri, + ) + + true_doc.add_picture(prov=prov, image=imgref) + + elif label == "figure_caption": + true_doc.add_text( + label=DocItemLabel.CAPTION, text=text, orig=text, prov=prov + ) + + elif label == "figure_footnote": + true_doc.add_text( + label=DocItemLabel.FOOTNOTE, text=text, orig=text, prov=prov + ) + + elif label == "equation_isolated": + true_doc.add_text( + label=DocItemLabel.FORMULA, text=text, orig=text, prov=prov + ) + + elif label == "equation_caption": + true_doc.add_text( + label=DocItemLabel.CAPTION, text=text, orig=text, prov=prov + ) + + elif label == "code_txt": + true_doc.add_text( + label=DocItemLabel.TEXT, text=text, orig=text, prov=prov + ) + + elif label == "abandon": + true_doc.add_text( + label=DocItemLabel.TEXT, text=text, orig=text, prov=prov + ) + + elif label == "need_mask": + true_doc.add_text( + label=DocItemLabel.TEXT, text=text, orig=text, prov=prov + ) + + elif label == "header": + true_doc.add_text( + label=DocItemLabel.PAGE_HEADER, text=text, orig=text, prov=prov + ) + + elif label == "footer": + true_doc.add_text( + label=DocItemLabel.PAGE_FOOTER, text=text, orig=text, prov=prov + ) + + elif label == "reference": + true_doc.add_text( + label=DocItemLabel.TEXT, text=text, orig=text, prov=prov + ) + + elif label == "page_footnote": + true_doc.add_text( + label=DocItemLabel.FOOTNOTE, text=text, orig=text, prov=prov + ) + + elif label == "page_number": + true_doc.add_text( + label=DocItemLabel.PAGE_FOOTER, text=text, orig=text, prov=prov + ) + + else: + logging.error(f"label {label} is not assigned!") + + return true_doc + + def iterate(self) -> Iterable[DatasetRecord]: + if not self.retrieved: + raise RuntimeError( + "You must first retrieve the source dataset. Call retrieve_input_dataset()." + ) + + assert self.dataset_local_path is not None + # load the groundtruth + with open(self.dataset_local_path / "OmniDocBench.json", "r") as fr: + gt = json.load(fr) + + gt = self.update_gt_into_map(gt) + + viz_dir = self.target / "vizualisations" + os.makedirs(viz_dir, exist_ok=True) + + page_tuples = self.get_filenames(self.dataset_local_path) + + # Apply index ranges + total_ds_len = len(page_tuples) + + begin_index = 0 + end_index = -1 + # begin_index, end_index = set_selection_range( + # begin_index, end_index, total_ds_len + # ) + page_tuples = page_tuples[begin_index:end_index] + selected_ds_len = len(page_tuples) + _log.info( + "Dataset len: %s. Selected range: [%s, %s] = %s", + total_ds_len, + begin_index, + end_index, + selected_ds_len, + ) + + for page_tuple in tqdm( + page_tuples, + total=selected_ds_len, + ncols=128, + desc="Processing files for OmniDocBench with end-to-end", + ): + + jpg_path = page_tuple[0] + pdf_path = Path(page_tuple[1]) + + # logging.info(f"file: {pdf_path}") + if os.path.basename(jpg_path) not in gt: + logging.error( + f"did not find ground-truth for {os.path.basename(jpg_path)}" + ) + continue + + gt_doc = gt[os.path.basename(jpg_path)] + + # Create the groundtruth Document + true_doc = DoclingDocument( + name=f"ground-truth {os.path.basename(jpg_path)}" + ) + true_doc, true_page_images = add_pages_to_true_doc( + pdf_path=pdf_path, true_doc=true_doc, image_scale=2.0 + ) + + assert len(true_page_images) == 1, "len(true_page_images)==1" + + # The true_doc.pages is a dict with the page numbers as indices starting at 1 + page_width = true_doc.pages[1].size.width + page_height = true_doc.pages[1].size.height + + true_doc = self.update_doc_with_gt( + gt=gt_doc, + true_doc=true_doc, + page=true_doc.pages[1], + page_image=true_page_images[0], + page_width=page_width, + page_height=page_height, + ) + + pdf_bytes = get_binary(pdf_path) + + pdf_stream = DocumentStream(name=pdf_path.name, stream=BytesIO(pdf_bytes)) + + record = DatasetRecord( + predictor_info=self.prediction_provider.info(), + doc_id=str(os.path.basename(jpg_path)), + doc_hash=get_binhash(pdf_bytes), + ground_truth_doc=true_doc, + original=pdf_stream, + mime_type="application/pdf", + ) + + self.update_prediction(record) + + if self.do_visualization and record.predicted_doc is not None: + save_comparison_html_with_clusters( + filename=viz_dir / f"{os.path.basename(pdf_path)}-clusters.html", + true_doc=true_doc, + pred_doc=record.predicted_doc, + page_image=true_page_images[0], + true_labels=TRUE_HTML_EXPORT_LABELS, + pred_labels=PRED_HTML_EXPORT_LABELS, + ) + + yield record diff --git a/docs/examples/run_dpbench_builder_example.py b/tests/test_dataset_builder.py similarity index 62% rename from docs/examples/run_dpbench_builder_example.py rename to tests/test_dataset_builder.py index 5ce55460..049c1887 100644 --- a/docs/examples/run_dpbench_builder_example.py +++ b/tests/test_dataset_builder.py @@ -19,6 +19,7 @@ from docling_eval.cli.main import evaluate from docling_eval_next.datamodels.dataset_record import DatasetRecord from docling_eval_next.dataset_builders.dpbench_builder import DPBenchDatasetBuilder +from docling_eval_next.dataset_builders.omnidocbench_builder import OmniDocBenchDatasetBuilder from docling_eval_next.prediction_providers.prediction_provider import ( DoclingPredictionProvider, TableFormerPredictionProvider, @@ -71,8 +72,7 @@ def create_docling_prediction_provider( } ) - -def main(): +def test_run_dpbench_e2e(): target_path = Path("./scratch/dpbench-builer-test/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) @@ -82,7 +82,7 @@ def main(): ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF - dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_layout.save_to_disk(chunk_size=20, max_num_chunks=1) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. evaluate( modality=EvaluationModality.LAYOUT, @@ -91,6 +91,29 @@ def main(): odir=target_path / "e2e" / "layout", ) +def test_run_omnidocbench_e2e(): + target_path = Path("./scratch/omnidocbench-builer-test/") + docling_provider = create_docling_prediction_provider(page_image_scale=2.0) + + dataset_layout = OmniDocBenchDatasetBuilder( + prediction_provider=docling_provider, + target=target_path / "e2e", + ) + + dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF + dataset_layout.save_to_disk(chunk_size=20, max_num_chunks=1) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + + evaluate( + modality=EvaluationModality.LAYOUT, + benchmark=BenchMarkNames.OMNIDOCBENCH, + idir=target_path / "e2e", + odir=target_path / "e2e" / "layout", + ) + + + +def test_run_dpbench_tables(): + target_path = Path("./scratch/dpbench-builer-test/") tableformer_provider = TableFormerPredictionProvider() dataset_tables = DPBenchDatasetBuilder( @@ -99,7 +122,7 @@ def main(): ) dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF - dataset_tables.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_tables.save_to_disk(chunk_size=20, max_num_chunks=1) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. evaluate( modality=EvaluationModality.TABLE_STRUCTURE, @@ -108,6 +131,22 @@ def main(): odir=target_path / "tables" / "tableformer", ) +def test_run_omnidocbench_tables(): + target_path = Path("./scratch/omnidocbench-builer-test/") + tableformer_provider = TableFormerPredictionProvider() + + dataset_tables = OmniDocBenchDatasetBuilder( + prediction_provider=tableformer_provider, + target=target_path / "tables", + ) + + dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF + dataset_tables.save_to_disk(chunk_size=20, max_num_chunks=1) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + + evaluate( + modality=EvaluationModality.TABLE_STRUCTURE, + benchmark=BenchMarkNames.OMNIDOCBENCH, + idir=target_path / "tables", + odir=target_path / "tables" / "tableformer", + ) -if __name__ == "__main__": - main() From 3027ba82596eb348e4a3c774e76a6336cded9558 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Thu, 20 Mar 2025 21:25:23 +0100 Subject: [PATCH 16/81] Add doclaynet v1, funsd Signed-off-by: Christoph Auer --- docling_eval/benchmarks/constants.py | 1 + .../dataset_builders/dataset_builder.py | 5 +- .../dataset_builders/doclaynet_v1_builder.py | 409 ++++++++++++++++++ .../dataset_builders/funsd_builder.py | 328 ++++++++++++++ tests/test_dataset_builder.py | 91 +++- 5 files changed, 827 insertions(+), 7 deletions(-) create mode 100644 docling_eval_next/dataset_builders/doclaynet_v1_builder.py create mode 100644 docling_eval_next/dataset_builders/funsd_builder.py diff --git a/docling_eval/benchmarks/constants.py b/docling_eval/benchmarks/constants.py index 8fd8bc6e..e396487f 100644 --- a/docling_eval/benchmarks/constants.py +++ b/docling_eval/benchmarks/constants.py @@ -40,6 +40,7 @@ class EvaluationModality(str, Enum): MARKDOWN_TEXT = "markdown_text" # to compute the text accuracy CAPTIONING = "captioning" # to compute the accuracy of captions to table/figure BBOXES_TEXT = "bboxes_text" + KEY_VALUE = "key_value" class BenchMarkNames(str, Enum): diff --git a/docling_eval_next/dataset_builders/dataset_builder.py b/docling_eval_next/dataset_builders/dataset_builder.py index 705279b1..37d77e75 100644 --- a/docling_eval_next/dataset_builders/dataset_builder.py +++ b/docling_eval_next/dataset_builders/dataset_builder.py @@ -33,7 +33,7 @@ def __init__( self, name: str, dataset_source: Union[HFSource, S3Source, Path], - prediction_provider: BasePredictionProvider, + prediction_provider: Optional[BasePredictionProvider], target: Path, ): self.name = name @@ -80,6 +80,9 @@ def iterate(self) -> Iterable[DatasetRecord]: pass def update_prediction(self, record: DatasetRecord): + if self.prediction_provider is None: + return + # This might need customization depending on the input the dataset has. # The default implementation assumes that there is an original file in binary format which is accepted. input_data = record.original diff --git a/docling_eval_next/dataset_builders/doclaynet_v1_builder.py b/docling_eval_next/dataset_builders/doclaynet_v1_builder.py new file mode 100644 index 00000000..bd81d1d3 --- /dev/null +++ b/docling_eval_next/dataset_builders/doclaynet_v1_builder.py @@ -0,0 +1,409 @@ +import io +import json +import logging +import os +from pathlib import Path +from typing import Dict, Iterable, List, Optional, Set, Tuple + +from datasets import load_dataset +from docling_core.types import DoclingDocument +from docling_core.types.doc import ( + BoundingBox, + CoordOrigin, + DocItemLabel, + GroupLabel, + ImageRef, + ProvenanceItem, + Size, + TableCell, + TableData, +) +from docling_core.types.io import DocumentStream +from PIL import Image +from tqdm import tqdm + +from docling_eval.benchmarks.constants import ( + BenchMarkColumns, + ConverterTypes, + EvaluationModality, +) +from docling_eval.benchmarks.utils import ( + add_pages_to_true_doc, + crop_bounding_box, + extract_images, + from_pil_to_base64uri, + get_binary, + get_binhash, +) +from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters +from docling_eval_next.datamodels.dataset_record import DatasetRecord +from docling_eval_next.dataset_builders.dataset_builder import ( + BaseEvaluationDatasetBuilder, + HFSource, +) +from docling_eval_next.prediction_providers.prediction_provider import ( + BasePredictionProvider, +) + +# Get logger +_log = logging.getLogger(__name__) + +# Blacklisted document IDs +BLACKLISTED_DOC_IDS = [ + "f556167ac3284665652050b1b0bc1e6f5af27f54f17f27566c60c80f6f134a92", + "dbc51622cbe9b8766f44db3b3fda8d0a745da06b9bfec9935bd003d2bdd494c8", + "d4c0401fffc04d24e629a9fada23266a3b492ea63e889641b3c33adf815d44e3", + "cc93b556f49af1f2e366719ec98a131186c16385545d8062d21e4d38b6bf7686", + "c9755e6972e3150a1c02565ec8070bfc26503d0fe09d056e418d6dcd6ea43cd9", + "c90d298ac9493e3804baf1b62c9321cdabf388c29eb504c5ad12106b3cdf530b", + "c2b513a5611d3138726e679c6e2e9e5383e4d3d82a2c588bbe3d5802797e2765", + "b72bb61059b06ff9859ae023aa66cdb3ff706c354ac72ca5d3c837e107d0a384", + "b4f5d430d89499474a31f39fe8eb615fdcd7aa682eb0b959a0384206d5c8174c", + "ab9315a0610ec0e5446a7062cd99a9e137efe3d7da9a7bffa2523894ac68751a", + "99723d3d3c61db030dbd813faec67579ceb50c6b5dd8c2f500c6e073849e9784", + "87c7dc9ca13016fafa4a7539efa1bf00401ba27323a473094b4184bc42cb36c0", + "7c1fa2e7c81a81888c18eb95cfe37edb82a91dd340e75c8123618a6774081f2e", + "7a231e9b7d841935a142d972ea1c7546d613cba18e301b0e07415f9eb44e3382", + "5793282eaaa089d0dc71e67c951c68b4157a212cc43edbc3106323e96b385190", + "55f9167173149b0b4c8d8951baca190ee756450d6565a91655ec04967a08c798", + "5003688e1ae61558cbeda741d246804b59fe89dac29cf508b4b6ce56d1a4342b", + "4f6e20223b7bc8436c623b9e6282db6ebd5f221aeb880a8db9b4544326d5a8a6", + "4232e47097e6ecfdf53d4097cb90bdd56cc63c31508a2f91a6d3908770a4d1ed", + "3361796dba75fe2c641c43db12ab31a0eb9dbcbbc7c99721288d36c41d759bcd", + "1fadb433bffa31c43817d1f6bafbb10dff53422ad046d391ed560ebef13d9f83", + "1a8f46903dbe89dc5b6df43389b4895a376e00ab3b90c7c37f1a1b561d3d51a1", + "1763e54be635759ccb66ebb462548f8a40d44567f62cecc5ca26f22acd28e823", + "048a570b2e415b653a62313ef82504adfda480c99f69826fcbeb67758ea3c7a4", + "0261791e343389682847c913a16789776d0ba41a584901571846c7ddab3cbaa6", +] + +TRUE_HTML_EXPORT_LABELS = { + DocItemLabel.TITLE, + DocItemLabel.DOCUMENT_INDEX, + DocItemLabel.SECTION_HEADER, + DocItemLabel.PARAGRAPH, + DocItemLabel.TABLE, + DocItemLabel.PICTURE, + DocItemLabel.FORMULA, + DocItemLabel.CHECKBOX_UNSELECTED, + DocItemLabel.CHECKBOX_SELECTED, + DocItemLabel.TEXT, + DocItemLabel.LIST_ITEM, + DocItemLabel.CODE, + DocItemLabel.REFERENCE, + DocItemLabel.CAPTION, + DocItemLabel.PAGE_HEADER, + DocItemLabel.PAGE_FOOTER, + DocItemLabel.FOOTNOTE, +} + +PRED_HTML_EXPORT_LABELS = { + DocItemLabel.TITLE, + DocItemLabel.DOCUMENT_INDEX, + DocItemLabel.SECTION_HEADER, + DocItemLabel.PARAGRAPH, + DocItemLabel.TABLE, + DocItemLabel.PICTURE, + DocItemLabel.FORMULA, + DocItemLabel.CHECKBOX_UNSELECTED, + DocItemLabel.CHECKBOX_SELECTED, + DocItemLabel.TEXT, + DocItemLabel.LIST_ITEM, + DocItemLabel.CODE, + DocItemLabel.REFERENCE, + DocItemLabel.PAGE_HEADER, + DocItemLabel.PAGE_FOOTER, + DocItemLabel.FOOTNOTE, +} + +SHARD_SIZE = 100 + + +class DocLayNetV1DatasetBuilder(BaseEvaluationDatasetBuilder): + """DocLayNet V1 dataset builder implementing the base dataset builder interface.""" + + def __init__( + self, + prediction_provider: BasePredictionProvider, + target: Path, + do_visualization: bool = True, + do_debug: bool = False, + split: str = "test", + begin_index: int = 0, + end_index: int = -1, + ): + super().__init__( + name="DocLayNetV1: end-to-end", + dataset_source=HFSource(repo_id="ds4sd/DocLayNet-v1.2"), + prediction_provider=prediction_provider, + target=target, + ) + self.do_visualization = do_visualization + self.do_debug = do_debug + self.split = split + self.begin_index = begin_index + self.end_index = end_index + self.blacklisted_ids = set(BLACKLISTED_DOC_IDS) + self.category_map = { + 1: "caption", + 2: "footnote", + 3: "formula", + 4: "list_item", + 5: "page_footer", + 6: "page_header", + 7: "picture", + 8: "section_header", + 9: "table", + 10: "text", + 11: "title", + } + + @staticmethod + def ltwh_to_ltrb(box): + """Convert left, top, width, height format to left, top, right, bottom.""" + l, t, w, h = box + return l, t, l + w, t + h + + def update_doc_with_gt( + self, doc: DoclingDocument, current_list, img, old_size, label_str, box, content + ): + """Add an element to the document based on its label type.""" + # Map string label to DocItemLabel + label_map = { + "caption": DocItemLabel.CAPTION, + "footnote": DocItemLabel.FOOTNOTE, + "formula": DocItemLabel.FORMULA, + "list_item": DocItemLabel.LIST_ITEM, + "page_footer": DocItemLabel.PAGE_FOOTER, + "page_header": DocItemLabel.PAGE_HEADER, + "picture": DocItemLabel.PICTURE, + "section_header": DocItemLabel.SECTION_HEADER, + "table": DocItemLabel.TABLE, + "text": DocItemLabel.TEXT, + "title": DocItemLabel.TITLE, + } + + label = label_map.get(label_str, DocItemLabel.TEXT) + + # Create bounding box + w, h = img.size + new_size = Size(width=w, height=h) + bbox = ( + BoundingBox.from_tuple(tuple(self.ltwh_to_ltrb(box)), CoordOrigin.TOPLEFT) + .to_bottom_left_origin(page_height=old_size.height) + .scale_to_size(old_size=old_size, new_size=new_size) + ) + + # Create provenance + prov = ProvenanceItem(page_no=1, bbox=bbox, charspan=(0, len(content))) + + # Crop the relevant part of the image + img_elem = crop_bounding_box(page_image=img, page=doc.pages[1], bbox=bbox) + + # Handle element based on its label + if label == DocItemLabel.PICTURE: + current_list = None + try: + uri = from_pil_to_base64uri(img_elem) + imgref = ImageRef( + mimetype="image/png", + dpi=72, + size=Size(width=img_elem.width, height=img_elem.height), + uri=uri, + ) + doc.add_picture(prov=prov, image=imgref) + except Exception as e: + _log.error( + "Failed to create image reference for %s: %s", doc.name, str(e) + ) + + elif label == DocItemLabel.TABLE: + current_list = None + tbl_cell = TableCell( + start_row_offset_idx=0, + end_row_offset_idx=0, + start_col_offset_idx=0, + end_col_offset_idx=0, + text=content, + ) + tbl_data = TableData(table_cells=[tbl_cell]) + doc.add_table(data=tbl_data, caption=None, prov=prov) + + elif label == DocItemLabel.LIST_ITEM: + if current_list is None: + current_list = doc.add_group(label=GroupLabel.LIST, name="list") + doc.add_list_item( + text=content, enumerated=False, prov=prov, parent=current_list + ) + + elif label == DocItemLabel.SECTION_HEADER: + current_list = None + doc.add_heading(text=content, orig=content, level=2, prov=prov) + + elif label == DocItemLabel.TITLE: + current_list = None + doc.add_heading(text=content, orig=content, level=1, prov=prov) + + else: + current_list = None + doc.add_text(label=label, text=content, orig=content, prov=prov) + + return current_list + + def iterate(self) -> Iterable[DatasetRecord]: + """Iterate through the dataset and yield DatasetRecord objects.""" + if not self.retrieved: + raise RuntimeError( + "You must first retrieve the source dataset. Call retrieve_input_dataset()." + ) + + # Create visualization directory if needed + if self.do_visualization: + viz_dir = self.target / "visualizations" + os.makedirs(viz_dir, exist_ok=True) + + assert self.dataset_local_path is not None + + # Load dataset from the retrieved path + ds = load_dataset("ds4sd/DocLayNet-v1.2", split=self.split) + + # Apply index ranges if specified + total_ds_len = len(ds) + begin_index = self.begin_index + end_index = self.end_index + + if end_index == -1 or end_index > total_ds_len: + end_index = total_ds_len + + if begin_index < 0: + begin_index = 0 + + ds = ds.select(range(begin_index, end_index)) + selected_ds_len = len(ds) + + _log.info( + "Dataset len: %s. Selected range: [%s, %s] = %s", + total_ds_len, + begin_index, + end_index, + selected_ds_len, + ) + + skipped_rows = 0 + exported_rows = 0 + + # Process each document + for doc in tqdm( + ds, + total=selected_ds_len, + ncols=128, + desc="Processing DocLayNetV1 documents", + ): + try: + page_hash = doc["metadata"]["page_hash"] + + # Skip blacklisted documents + if page_hash in self.blacklisted_ids: + _log.info("Skip blacklisted doc id: %s", page_hash) + continue + + if self.do_debug: + _log.info("Converting: %s", page_hash) + + # Get PDF data + pdf = doc["pdf"] + pdf_stream = io.BytesIO(pdf) + + # Create ground truth document + true_doc = DoclingDocument(name=page_hash) + true_doc, true_page_images = add_pages_to_true_doc( + pdf_path=pdf_stream, true_doc=true_doc, image_scale=1.0 + ) + + # Set up document dimensions + img = true_page_images[0] + old_w, old_h = doc["image"].size + old_size = Size(width=old_w, height=old_h) + + # Process elements + current_list = None + labels = list( + map(lambda cid: self.category_map[int(cid)], doc["category_id"]) + ) + bboxes = doc["bboxes"] + segments = doc["pdf_cells"] + contents = [ + " ".join(map(lambda cell: cell["text"], cells)) + for cells in segments + ] + + for l, b, c in zip(labels, bboxes, contents): + current_list = self.update_doc_with_gt( + true_doc, current_list, img, old_size, l, b, c + ) + + # Extract images from the ground truth document + true_doc, true_pictures, true_page_images = extract_images( + document=true_doc, + pictures_column=BenchMarkColumns.GROUNDTRUTH_PICTURES, + page_images_column=BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES, + ) + + pdf_stream.seek(0) + doc_stream = DocumentStream(name=page_hash, stream=pdf_stream) + + # Create dataset record + record = DatasetRecord( + predictor_info=self.prediction_provider.info(), + doc_id=page_hash, + doc_hash=get_binhash(pdf), + ground_truth_doc=true_doc, + original=doc_stream, + mime_type="application/pdf", + modalities=[ + EvaluationModality.LAYOUT, + EvaluationModality.MARKDOWN_TEXT, + ], + ground_truth_pictures=true_pictures, + ground_truth_page_images=true_page_images, + ) + + # Update prediction + self.update_prediction(record) + + # Extract images from the predicted document if available + if record.predicted_doc is not None: + pred_doc, pred_pictures, pred_page_images = extract_images( + document=record.predicted_doc, + pictures_column=BenchMarkColumns.PREDICTION_PICTURES, + page_images_column=BenchMarkColumns.PREDICTION_PAGE_IMAGES, + ) + record.predicted_doc = pred_doc + record.predicted_pictures = pred_pictures + record.predicted_page_images = pred_page_images + + # Create visualization if requested + if self.do_visualization and record.predicted_doc is not None: + save_comparison_html_with_clusters( + filename=viz_dir / f"{page_hash}-clusters.html", + true_doc=true_doc, + pred_doc=record.predicted_doc, + page_image=img, + true_labels=TRUE_HTML_EXPORT_LABELS, + pred_labels=PRED_HTML_EXPORT_LABELS, + draw_reading_order=False, + ) + + exported_rows += 1 + yield record + + except Exception as ex: + _log.error("Error processing document: %s", str(ex)) + skipped_rows += 1 + raise ex + + _log.info( + "Exported rows: %s. Skipped rows: %s.", + exported_rows, + skipped_rows, + ) diff --git a/docling_eval_next/dataset_builders/funsd_builder.py b/docling_eval_next/dataset_builders/funsd_builder.py new file mode 100644 index 00000000..f4d1946a --- /dev/null +++ b/docling_eval_next/dataset_builders/funsd_builder.py @@ -0,0 +1,328 @@ +import io +import json +import logging +import os +import shutil +from pathlib import Path +from typing import Dict, Iterable, List, Optional + +from datasets import DownloadManager +from docling_core.types import DoclingDocument +from docling_core.types.doc import BoundingBox, ImageRef, PageItem, ProvenanceItem, Size +from docling_core.types.doc.document import GraphCell, GraphData, GraphLink +from docling_core.types.doc.labels import GraphCellLabel, GraphLinkLabel +from PIL import Image +from tqdm import tqdm + +from docling_eval.benchmarks.constants import ( + BenchMarkColumns, + ConverterTypes, + EvaluationModality, +) +from docling_eval.benchmarks.utils import ( + classify_cells, + extract_images, + from_pil_to_base64uri, + get_binhash, +) +from docling_eval_next.datamodels.dataset_record import DatasetRecord +from docling_eval_next.dataset_builders.dataset_builder import ( + BaseEvaluationDatasetBuilder, +) +from docling_eval_next.prediction_providers.prediction_provider import ( + BasePredictionProvider, +) + +# Get logger +_log = logging.getLogger(__name__) + + +class FUNSDDatasetBuilder(BaseEvaluationDatasetBuilder): + """FUNSD Dataset builder implementing the base dataset builder interface.""" + + def __init__( + self, + dataset_source: Path, + prediction_provider: BasePredictionProvider, + target: Path, + do_visualization: bool = True, + split: str = "test", + max_items: int = -1, + ): + super().__init__( + name="FUNSD", + dataset_source=dataset_source, # Standard location + prediction_provider=prediction_provider, + target=target, + ) + self.do_visualization = do_visualization + self.split = split + self.max_items = max_items + + def retrieve_input_dataset(self) -> Path: + """Download and extract the FUNSD dataset if needed.""" + dataset_path = self.dataset_source + + # Check if the dataset already exists + if not dataset_path.exists() or not (dataset_path / "training_data").exists(): + _log.info(f"Downloading FUNSD dataset to {dataset_path}") + + # Ensure the dataset path exists + dataset_path.mkdir(parents=True, exist_ok=True) + + # Download and extract + dl_manager = DownloadManager() + extracted_path = dl_manager.download_and_extract( + "https://drive.google.com/uc?export=download&id=1wdJJQgRIb1c404SJnX1dyBSi7U2mVduI" + ) + + # Move the extracted FUNSD folder to the target location + extracted_path = Path(extracted_path) + funsd_dir = extracted_path / "FUNSD" + + # If target exists, remove it first + if dataset_path.exists(): + shutil.rmtree(dataset_path) + + # Move extracted folder to target location + shutil.move(str(funsd_dir), str(dataset_path)) + + # Fix annotation directories + train_adj = dataset_path / "training_data" / "adjusted_annotations" + train_ann = dataset_path / "training_data" / "annotations" + test_adj = dataset_path / "testing_data" / "adjusted_annotations" + test_ann = dataset_path / "testing_data" / "annotations" + + if train_adj.exists(): + if train_ann.exists(): + shutil.rmtree(train_ann) + shutil.move(str(train_adj), str(train_ann)) + + if test_adj.exists(): + if test_ann.exists(): + shutil.rmtree(test_ann) + shutil.move(str(test_adj), str(test_ann)) + + _log.info(f"FUNSD dataset downloaded to {dataset_path}") + + self.retrieved = True + return dataset_path + + def convert_bbox(self, bbox_data) -> BoundingBox: + """Convert bbox format to BoundingBox object.""" + if isinstance(bbox_data, list) and len(bbox_data) == 4: + return BoundingBox( + l=bbox_data[0], t=bbox_data[1], r=bbox_data[2], b=bbox_data[3] + ) + elif isinstance(bbox_data, BoundingBox): + return bbox_data + else: + raise ValueError( + "Invalid bounding box data; expected a list of four numbers or a BoundingBox instance." + ) + + def create_graph_link( + self, + key_cell: GraphCell, + value_cell: GraphCell, + label: GraphLinkLabel = GraphLinkLabel.TO_VALUE, + ) -> GraphLink: + """Create a graph link between key and value cells.""" + return GraphLink( + source_cell_id=key_cell.cell_id, + target_cell_id=value_cell.cell_id, + label=label, + ) + + def get_overall_bbox( + self, links: List[GraphLink], cell_dict: Dict[int, GraphCell] + ) -> Optional[BoundingBox]: + """Compute the overall bounding box from all cell ids.""" + all_bboxes = [] + for link in links: + src_prov = cell_dict[link.source_cell_id].prov + tgt_prov = cell_dict[link.target_cell_id].prov + if src_prov is not None: + all_bboxes.append(src_prov.bbox) + if tgt_prov is not None: + all_bboxes.append(tgt_prov.bbox) + + if len(all_bboxes) == 0: + return None + bbox_instance = BoundingBox.enclosing_bbox(all_bboxes) + return bbox_instance + + def populate_key_value_item( + self, doc: DoclingDocument, funsd_data: dict + ) -> DoclingDocument: + """Populate the key-value item from the FUNSD data.""" + if "form" not in funsd_data: + raise ValueError("Invalid FUNSD data: missing 'form' key.") + + form_items = funsd_data["form"] + + cell_by_id = {} + for item in form_items: + cell_id = item["id"] + cell_text = item.get("text", "") + + bbox_instance = None + if item.get("box") is not None: + bbox_instance = self.convert_bbox(item.get("box")) + cell_prov = ProvenanceItem( + page_no=doc.pages[1].page_no, + charspan=(0, 0), + bbox=bbox_instance, + ) + else: + cell_prov = None + + cell = GraphCell( + cell_id=cell_id, + text=cell_text, + orig=cell_text, + prov=cell_prov, + label=GraphCellLabel.KEY, # later to be updated by classify_cells + ) + cell_by_id[cell_id] = cell + + # unique linking pairs + linking_set = set() + for item in form_items: + linking = item.get("linking", []) + for pair in linking: + if isinstance(pair, list) and len(pair) == 2: + linking_set.add(tuple(pair)) # (source_id, target_id) + + # creation of links using the cell mapping + links = [] + for src, tgt in linking_set: + if src in cell_by_id and tgt in cell_by_id: + # later to be updated by classify_cells + cell_by_id[tgt].label = GraphCellLabel.VALUE + kv_link = self.create_graph_link(cell_by_id[src], cell_by_id[tgt]) + links.append(kv_link) + + cells = list(cell_by_id.values()) + + overall_bbox = self.get_overall_bbox( + links, cell_dict={cell.cell_id: cell for cell in cells} + ) + + if overall_bbox is not None: + prov = ProvenanceItem( + page_no=doc.pages[1].page_no, + charspan=(0, 0), + bbox=overall_bbox, + ) + else: + prov = None + + graph = GraphData(cells=cells, links=links) + + # Update cell labels based on linking structure + classify_cells(graph=graph) + + doc.add_key_values(graph=graph, prov=prov) + + return doc + + def iterate(self) -> Iterable[DatasetRecord]: + """Iterate through the dataset and yield DatasetRecord objects.""" + if not self.retrieved: + raise RuntimeError( + "You must first retrieve the source dataset. Call retrieve_input_dataset()." + ) + + # Determine image directory based on split + if self.split == "train": + image_dir = self.dataset_source / "training_data" / "images" + elif self.split == "test": + image_dir = self.dataset_source / "testing_data" / "images" + else: + raise ValueError(f"Invalid split: {self.split}. Expected 'train' or 'test'") + + # Create visualization directory if needed + if self.do_visualization: + viz_dir = self.target / "visualizations" + os.makedirs(viz_dir, exist_ok=True) + + # List all PNG images + images = list(image_dir.glob("*.png")) + + # Limit number of items if specified + if self.max_items > 0 and len(images) > self.max_items: + images = images[: self.max_items] + + total_images = len(images) + _log.info(f"Processing FUNSD {self.split} dataset: {total_images} images") + + # Process each image + for img_path in tqdm(images, total=total_images): + try: + # Determine annotation path + annotation_path = ( + img_path.parent.parent + / "annotations" + / img_path.name.replace(".png", ".json") + ) + + # Load image and annotation + img = Image.open(img_path) + with open(annotation_path, "r", encoding="utf-8") as f: + funsd_data = json.load(f) + + # Get image bytes + with io.BytesIO() as img_byte_stream: + img.save(img_byte_stream, format="PNG") + img_byte_stream.seek(0) + img_bytes = img_byte_stream.getvalue() + + # Create ground truth document + true_doc = DoclingDocument(name=img_path.stem) + + # Add page with image + image_ref = ImageRef( + mimetype="image/png", + dpi=72, + size=Size(width=float(img.width), height=float(img.height)), + uri=from_pil_to_base64uri(img), + ) + page_item = PageItem( + page_no=1, + size=Size(width=float(img.width), height=float(img.height)), + image=image_ref, + ) + true_doc.pages[1] = page_item + + # Populate document with key-value data + true_doc = self.populate_key_value_item(true_doc, funsd_data) + + # Extract images + true_doc, true_pictures, true_page_images = extract_images( + document=true_doc, + pictures_column=BenchMarkColumns.GROUNDTRUTH_PICTURES.value, + page_images_column=BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES.value, + ) + + # Create dataset record + record = DatasetRecord( + doc_id=img_path.stem, + doc_hash=get_binhash(img_bytes), + ground_truth_doc=true_doc, + original=None, + mime_type="image/png", + modalities=[EvaluationModality.KEY_VALUE], + ground_truth_pictures=true_pictures, + ground_truth_page_images=true_page_images, + ) + record.predictor_info = self.prediction_provider.info() if self.prediction_provider else {} + + # Update prediction + self.update_prediction(record) + + yield record + + except Exception as ex: + _log.error(f"Error processing {img_path.name}: {str(ex)}") + raise ex \ No newline at end of file diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 049c1887..33e81b93 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -18,8 +18,17 @@ from docling_eval.benchmarks.constants import BenchMarkNames, EvaluationModality from docling_eval.cli.main import evaluate from docling_eval_next.datamodels.dataset_record import DatasetRecord +from docling_eval_next.dataset_builders.doclaynet_v1_builder import ( + DocLayNetV1DatasetBuilder, +) +from docling_eval_next.dataset_builders.doclaynet_v2_builder import ( + DocLayNetV2DatasetBuilder, +) from docling_eval_next.dataset_builders.dpbench_builder import DPBenchDatasetBuilder -from docling_eval_next.dataset_builders.omnidocbench_builder import OmniDocBenchDatasetBuilder +from docling_eval_next.dataset_builders.funsd_builder import FUNSDDatasetBuilder +from docling_eval_next.dataset_builders.omnidocbench_builder import ( + OmniDocBenchDatasetBuilder, +) from docling_eval_next.prediction_providers.prediction_provider import ( DoclingPredictionProvider, TableFormerPredictionProvider, @@ -72,6 +81,7 @@ def create_docling_prediction_provider( } ) + def test_run_dpbench_e2e(): target_path = Path("./scratch/dpbench-builer-test/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) @@ -82,7 +92,9 @@ def test_run_dpbench_e2e(): ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF - dataset_layout.save_to_disk(chunk_size=20, max_num_chunks=1) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_layout.save_to_disk( + chunk_size=20, max_num_chunks=1 + ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. evaluate( modality=EvaluationModality.LAYOUT, @@ -91,6 +103,7 @@ def test_run_dpbench_e2e(): odir=target_path / "e2e" / "layout", ) + def test_run_omnidocbench_e2e(): target_path = Path("./scratch/omnidocbench-builer-test/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) @@ -101,7 +114,9 @@ def test_run_omnidocbench_e2e(): ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF - dataset_layout.save_to_disk(chunk_size=20, max_num_chunks=1) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_layout.save_to_disk( + chunk_size=20, max_num_chunks=1 + ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. evaluate( modality=EvaluationModality.LAYOUT, @@ -111,7 +126,6 @@ def test_run_omnidocbench_e2e(): ) - def test_run_dpbench_tables(): target_path = Path("./scratch/dpbench-builer-test/") tableformer_provider = TableFormerPredictionProvider() @@ -122,7 +136,9 @@ def test_run_dpbench_tables(): ) dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF - dataset_tables.save_to_disk(chunk_size=20, max_num_chunks=1) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_tables.save_to_disk( + chunk_size=20, max_num_chunks=1 + ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. evaluate( modality=EvaluationModality.TABLE_STRUCTURE, @@ -131,6 +147,7 @@ def test_run_dpbench_tables(): odir=target_path / "tables" / "tableformer", ) + def test_run_omnidocbench_tables(): target_path = Path("./scratch/omnidocbench-builer-test/") tableformer_provider = TableFormerPredictionProvider() @@ -141,7 +158,9 @@ def test_run_omnidocbench_tables(): ) dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF - dataset_tables.save_to_disk(chunk_size=20, max_num_chunks=1) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_tables.save_to_disk( + chunk_size=20, max_num_chunks=1 + ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. evaluate( modality=EvaluationModality.TABLE_STRUCTURE, @@ -150,3 +169,63 @@ def test_run_omnidocbench_tables(): odir=target_path / "tables" / "tableformer", ) + +def test_run_doclaynet_v1_e2e(): + target_path = Path("./scratch/doclaynet-v1-builder-test/") + docling_provider = create_docling_prediction_provider(page_image_scale=2.0) + + dataset_layout = DocLayNetV1DatasetBuilder( + prediction_provider=docling_provider, + target=target_path / "e2e", + ) + + dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF + dataset_layout.save_to_disk( + chunk_size=20, max_num_chunks=1 + ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + + if False: + evaluate( + modality=EvaluationModality.LAYOUT, + benchmark=BenchMarkNames.DOCLAYNETV1, + idir=target_path / "e2e", + odir=target_path / "e2e" / "layout", + ) + + +# def test_run_doclaynet_v2_e2e(): +# target_path = Path("./scratch/doclaynet-v2-builder-test/") +# docling_provider = create_docling_prediction_provider(page_image_scale=2.0) +# +# dataset_layout = DocLayNetV2DatasetBuilder( +# dataset_path="", +# prediction_provider=docling_provider, +# target=target_path / "e2e", +# ) +# +# dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF +# dataset_layout.save_to_disk( +# chunk_size=20, max_num_chunks=1 +# ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. +# +# if False: +# evaluate( +# modality=EvaluationModality.LAYOUT, +# benchmark=BenchMarkNames.DOCLAYNETV2, +# idir=target_path / "e2e", +# odir=target_path / "e2e" / "layout", +# ) + +def test_run_funsd(): + target_path = Path("./scratch/funsd-builder-test/") + + dataset_layout = FUNSDDatasetBuilder( + dataset_source=target_path / "input_dataset", + prediction_provider=None, + target=target_path / "e2e", + ) + + dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF + dataset_layout.save_to_disk( + chunk_size=20, max_num_chunks=1 + ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. From 12f025f633dc64a9c888f15e2dfb6b816f245acd Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Thu, 20 Mar 2025 21:32:02 +0100 Subject: [PATCH 17/81] Fixes Signed-off-by: Christoph Auer --- .../dataset_builders/dataset_builder.py | 7 +------ docling_eval_next/dataset_builders/funsd_builder.py | 7 +++++-- .../prediction_providers/prediction_provider.py | 13 +++++++++++++ tests/test_dataset_builder.py | 4 +++- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/docling_eval_next/dataset_builders/dataset_builder.py b/docling_eval_next/dataset_builders/dataset_builder.py index 37d77e75..29b141cd 100644 --- a/docling_eval_next/dataset_builders/dataset_builder.py +++ b/docling_eval_next/dataset_builders/dataset_builder.py @@ -33,7 +33,7 @@ def __init__( self, name: str, dataset_source: Union[HFSource, S3Source, Path], - prediction_provider: Optional[BasePredictionProvider], + prediction_provider: BasePredictionProvider, target: Path, ): self.name = name @@ -80,15 +80,10 @@ def iterate(self) -> Iterable[DatasetRecord]: pass def update_prediction(self, record: DatasetRecord): - if self.prediction_provider is None: - return - # This might need customization depending on the input the dataset has. # The default implementation assumes that there is an original file in binary format which is accepted. input_data = record.original - assert input_data is not None - if not isinstance(input_data, DocumentStream): if isinstance(input_data, Path): input_data = DocumentStream( diff --git a/docling_eval_next/dataset_builders/funsd_builder.py b/docling_eval_next/dataset_builders/funsd_builder.py index f4d1946a..879be1b6 100644 --- a/docling_eval_next/dataset_builders/funsd_builder.py +++ b/docling_eval_next/dataset_builders/funsd_builder.py @@ -61,6 +61,7 @@ def __init__( def retrieve_input_dataset(self) -> Path: """Download and extract the FUNSD dataset if needed.""" + assert isinstance(self.dataset_source, Path) dataset_path = self.dataset_source # Check if the dataset already exists @@ -234,6 +235,8 @@ def iterate(self) -> Iterable[DatasetRecord]: "You must first retrieve the source dataset. Call retrieve_input_dataset()." ) + assert isinstance(self.dataset_source, Path) + # Determine image directory based on split if self.split == "train": image_dir = self.dataset_source / "training_data" / "images" @@ -307,6 +310,7 @@ def iterate(self) -> Iterable[DatasetRecord]: # Create dataset record record = DatasetRecord( + predictor_info=self.prediction_provider.info(), doc_id=img_path.stem, doc_hash=get_binhash(img_bytes), ground_truth_doc=true_doc, @@ -316,7 +320,6 @@ def iterate(self) -> Iterable[DatasetRecord]: ground_truth_pictures=true_pictures, ground_truth_page_images=true_page_images, ) - record.predictor_info = self.prediction_provider.info() if self.prediction_provider else {} # Update prediction self.update_prediction(record) @@ -325,4 +328,4 @@ def iterate(self) -> Iterable[DatasetRecord]: except Exception as ex: _log.error(f"Error processing {img_path.name}: {str(ex)}") - raise ex \ No newline at end of file + raise ex diff --git a/docling_eval_next/prediction_providers/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py index 55e30042..2bd022c9 100644 --- a/docling_eval_next/prediction_providers/prediction_provider.py +++ b/docling_eval_next/prediction_providers/prediction_provider.py @@ -33,6 +33,19 @@ def info(self) -> Dict: return {} +class NullPredictionProvider(BasePredictionProvider): + def predict( + self, + gt_doc: DoclingDocument, + stream: Optional[DocumentStream] = None, + **extra_kwargs, + ) -> DoclingDocument: + return gt_doc + + def info(self) -> Dict: + return {"asset": "NullProvider", "version": "0.0.0"} + + class DoclingPredictionProvider(BasePredictionProvider): def __init__( self, **kwargs diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 33e81b93..a9572a7a 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -31,6 +31,7 @@ ) from docling_eval_next.prediction_providers.prediction_provider import ( DoclingPredictionProvider, + NullPredictionProvider, TableFormerPredictionProvider, ) @@ -216,12 +217,13 @@ def test_run_doclaynet_v1_e2e(): # odir=target_path / "e2e" / "layout", # ) + def test_run_funsd(): target_path = Path("./scratch/funsd-builder-test/") dataset_layout = FUNSDDatasetBuilder( dataset_source=target_path / "input_dataset", - prediction_provider=None, + prediction_provider=NullPredictionProvider(), target=target_path / "e2e", ) From 4693b2cadafe35842f06876645b3461232ffcd24 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Thu, 20 Mar 2025 22:08:18 +0100 Subject: [PATCH 18/81] Add XFUND, more fixes Signed-off-by: Christoph Auer --- .../dataset_builders/doclaynet_v1_builder.py | 6 - .../dataset_builders/xfund_builder.py | 342 ++++++++++++++++++ tests/test_dataset_builder.py | 16 + 3 files changed, 358 insertions(+), 6 deletions(-) create mode 100644 docling_eval_next/dataset_builders/xfund_builder.py diff --git a/docling_eval_next/dataset_builders/doclaynet_v1_builder.py b/docling_eval_next/dataset_builders/doclaynet_v1_builder.py index bd81d1d3..9928bf2b 100644 --- a/docling_eval_next/dataset_builders/doclaynet_v1_builder.py +++ b/docling_eval_next/dataset_builders/doclaynet_v1_builder.py @@ -127,7 +127,6 @@ def __init__( prediction_provider: BasePredictionProvider, target: Path, do_visualization: bool = True, - do_debug: bool = False, split: str = "test", begin_index: int = 0, end_index: int = -1, @@ -139,7 +138,6 @@ def __init__( target=target, ) self.do_visualization = do_visualization - self.do_debug = do_debug self.split = split self.begin_index = begin_index self.end_index = end_index @@ -307,9 +305,6 @@ def iterate(self) -> Iterable[DatasetRecord]: _log.info("Skip blacklisted doc id: %s", page_hash) continue - if self.do_debug: - _log.info("Converting: %s", page_hash) - # Get PDF data pdf = doc["pdf"] pdf_stream = io.BytesIO(pdf) @@ -400,7 +395,6 @@ def iterate(self) -> Iterable[DatasetRecord]: except Exception as ex: _log.error("Error processing document: %s", str(ex)) skipped_rows += 1 - raise ex _log.info( "Exported rows: %s. Skipped rows: %s.", diff --git a/docling_eval_next/dataset_builders/xfund_builder.py b/docling_eval_next/dataset_builders/xfund_builder.py new file mode 100644 index 00000000..e4de831b --- /dev/null +++ b/docling_eval_next/dataset_builders/xfund_builder.py @@ -0,0 +1,342 @@ +import io +import json +import logging +import os +import shutil +import zipfile +from pathlib import Path +from typing import Dict, Iterable, List, Optional + +from datasets import DownloadManager +from docling_core.types import DoclingDocument +from docling_core.types.doc import BoundingBox, ImageRef, PageItem, ProvenanceItem, Size +from docling_core.types.doc.document import GraphCell, GraphData, GraphLink +from docling_core.types.doc.labels import GraphCellLabel, GraphLinkLabel +from PIL import Image +from tqdm import tqdm + +from docling_eval.benchmarks.constants import ( + BenchMarkColumns, + ConverterTypes, + EvaluationModality, +) +from docling_eval.benchmarks.utils import ( + classify_cells, + extract_images, + from_pil_to_base64uri, + get_binhash, +) +from docling_eval_next.datamodels.dataset_record import DatasetRecord +from docling_eval_next.dataset_builders.dataset_builder import ( + BaseEvaluationDatasetBuilder, + HFSource, +) +from docling_eval_next.prediction_providers.prediction_provider import ( + BasePredictionProvider, +) + +# Get logger +_log = logging.getLogger(__name__) + + +class XFUNDDatasetBuilder(BaseEvaluationDatasetBuilder): + """XFUND Dataset builder implementing the base dataset builder interface.""" + + def __init__( + self, + dataset_source: Path, + prediction_provider: BasePredictionProvider, + target: Path, + do_visualization: bool = True, + split: str = "val", # XFUND uses "val" instead of "test" + max_items: int = -1, + ): + super().__init__( + name="XFUND", + dataset_source=dataset_source, # Local Path to dataset + prediction_provider=prediction_provider, + target=target, + ) + self.do_visualization = do_visualization + self.split = split + self.max_items = max_items + self._langs = [ + "zh", + "de", + "es", + "fr", + "it", + "ja", + "pt", + ] # Fixed supported languages + + def retrieve_input_dataset(self) -> Path: + """Download and extract the XFUND dataset if needed.""" + assert isinstance(self.dataset_source, Path) + dataset_path = self.dataset_source + + # Check if the dataset already exists + if not dataset_path.exists() or not (dataset_path / self.split).exists(): + _log.info(f"Downloading XFUND dataset to {dataset_path}") + + # Ensure the dataset path exists + dataset_path.mkdir(parents=True, exist_ok=True) + + # Create split directory + split_dir = dataset_path / self.split + split_dir.mkdir(exist_ok=True) + + # Base URL for XFUND dataset + _URL = "https://github.com/doc-analysis/XFUND/releases/download/v1.0/" + + # Download manager + dl_manager = DownloadManager() + + # Download and process each language + for lang in self._langs: + try: + # Download JSON annotations + json_url = f"{_URL}{lang}.{self.split}.json" + json_path = dl_manager.download(json_url) + + # Copy JSON to the split directory + shutil.copy(json_path, split_dir / f"{lang}.{self.split}.json") + + # Download and extract ZIP with images + zip_url = f"{_URL}{lang}.{self.split}.zip" + zip_path = dl_manager.download(zip_url) + + # Extract ZIP contents to split directory + with zipfile.ZipFile(zip_path, "r") as zip_ref: + zip_ref.extractall(split_dir) + + except Exception as e: + _log.error(f"Error downloading {lang} data: {str(e)}") + + _log.info(f"XFUND dataset downloaded to {dataset_path}") + + self.retrieved = True + return dataset_path + + def convert_bbox(self, bbox_data) -> BoundingBox: + """Convert bbox format to BoundingBox object.""" + if isinstance(bbox_data, list) and len(bbox_data) == 4: + return BoundingBox( + l=bbox_data[0], t=bbox_data[1], r=bbox_data[2], b=bbox_data[3] + ) + elif isinstance(bbox_data, BoundingBox): + return bbox_data + else: + raise ValueError( + "Invalid bounding box data; expected a list of four numbers or a BoundingBox instance." + ) + + def create_graph_link( + self, + key_cell: GraphCell, + value_cell: GraphCell, + label: GraphLinkLabel = GraphLinkLabel.TO_VALUE, + ) -> GraphLink: + """Create a graph link between key and value cells.""" + return GraphLink( + source_cell_id=key_cell.cell_id, + target_cell_id=value_cell.cell_id, + label=label, + ) + + def get_overall_bbox( + self, links: List[GraphLink], cell_dict: Dict[int, GraphCell] + ) -> Optional[BoundingBox]: + """Compute the overall bounding box from all cell ids.""" + all_bboxes = [] + for link in links: + src_prov = cell_dict[link.source_cell_id].prov + tgt_prov = cell_dict[link.target_cell_id].prov + if src_prov is not None: + all_bboxes.append(src_prov.bbox) + if tgt_prov is not None: + all_bboxes.append(tgt_prov.bbox) + + if len(all_bboxes) == 0: + return None + bbox_instance = BoundingBox.enclosing_bbox(all_bboxes) + return bbox_instance + + def populate_key_value_item( + self, doc: DoclingDocument, xfund_data: dict + ) -> DoclingDocument: + """Populate the key-value item from the XFUND data.""" + if "document" not in xfund_data: + raise ValueError("Invalid XFUND data: missing 'document' key.") + + form_items = xfund_data["document"] + + cell_by_id = {} + for item in form_items: + cell_id = item["id"] + cell_text = item.get("text", "") + + bbox_instance = None + if item.get("box") is not None: + bbox_instance = self.convert_bbox(item.get("box")) + cell_prov = ProvenanceItem( + page_no=doc.pages[1].page_no, + charspan=(0, 0), + bbox=bbox_instance, + ) + else: + cell_prov = None + + cell = GraphCell( + cell_id=cell_id, + text=cell_text, + orig=cell_text, + prov=cell_prov, + label=GraphCellLabel.KEY, # later to be updated by classify_cells + ) + cell_by_id[cell_id] = cell + + # Unique linking pairs + linking_set = set() + for item in form_items: + linking = item.get("linking", []) + for pair in linking: + if isinstance(pair, list) and len(pair) == 2: + linking_set.add(tuple(pair)) # (source_id, target_id) + + # Create links using the cell mapping + links = [] + for src, tgt in linking_set: + if src in cell_by_id and tgt in cell_by_id: + # Mark target as value + cell_by_id[tgt].label = GraphCellLabel.VALUE + kv_link = self.create_graph_link(cell_by_id[src], cell_by_id[tgt]) + links.append(kv_link) + + cells = list(cell_by_id.values()) + + overall_bbox = self.get_overall_bbox( + links, cell_dict={cell.cell_id: cell for cell in cells} + ) + + if overall_bbox is not None: + prov = ProvenanceItem( + page_no=doc.pages[1].page_no, + charspan=(0, 0), + bbox=overall_bbox, + ) + else: + prov = None + + graph = GraphData(cells=cells, links=links) + + # Update cell labels based on linking structure + classify_cells(graph=graph) + + doc.add_key_values(graph=graph, prov=prov) + + return doc + + def iterate(self) -> Iterable[DatasetRecord]: + """Iterate through the dataset and yield DatasetRecord objects.""" + if not self.retrieved: + raise RuntimeError( + "You must first retrieve the source dataset. Call retrieve_input_dataset()." + ) + + assert isinstance(self.dataset_source, Path) + + # Get split directory + split_dir = self.dataset_source / self.split + + # Create visualization directory if needed + if self.do_visualization: + viz_dir = self.target / "visualizations" + os.makedirs(viz_dir, exist_ok=True) + + # Load all JSON files in the split directory + json_files = list(split_dir.glob("*.json")) + all_documents = [] + + for json_file in json_files: + with open(json_file, "r", encoding="utf-8") as f: + data = json.load(f) + all_documents.extend(data.get("documents", [])) + + # Limit number of items if specified + if self.max_items > 0 and len(all_documents) > self.max_items: + import random + + random.seed(42) # For reproducibility + all_documents = random.sample(all_documents, self.max_items) + + _log.info( + f"Processing XFUND {self.split} dataset: {len(all_documents)} documents" + ) + + # Process each document + for doc_data in tqdm(all_documents, total=len(all_documents)): + try: + # Get image path + img_filename = doc_data["img"]["fname"] + img_path = split_dir / img_filename + + # Load image + img = Image.open(img_path) + + # Get image bytes + with io.BytesIO() as img_byte_stream: + img.save(img_byte_stream, format=img.format) + img_byte_stream.seek(0) + img_bytes = img_byte_stream.getvalue() + + # Create ground truth document + true_doc = DoclingDocument(name=Path(img_filename).stem) + + assert img.format is not None + + # Add page with image + image_ref = ImageRef( + mimetype=f"image/{img.format.lower()}", + dpi=72, + size=Size(width=float(img.width), height=float(img.height)), + uri=from_pil_to_base64uri(img), + ) + page_item = PageItem( + page_no=1, + size=Size(width=float(img.width), height=float(img.height)), + image=image_ref, + ) + true_doc.pages[1] = page_item + + # Populate document with key-value data + true_doc = self.populate_key_value_item(true_doc, doc_data) + + # Extract images + true_doc, true_pictures, true_page_images = extract_images( + document=true_doc, + pictures_column=BenchMarkColumns.GROUNDTRUTH_PICTURES.value, + page_images_column=BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES.value, + ) + + assert img.format is not None + # Create dataset record + record = DatasetRecord( + predictor_info=self.prediction_provider.info(), + doc_id=Path(img_filename).stem, + doc_hash=get_binhash(img_bytes), + ground_truth_doc=true_doc, + original=None, # No original PDF/document stream + mime_type=f"image/{img.format.lower()}", + modalities=[EvaluationModality.KEY_VALUE], + ground_truth_pictures=true_pictures, + ground_truth_page_images=true_page_images, + ) + + # Update prediction + self.update_prediction(record) + + yield record + + except Exception as ex: + _log.error(f"Error processing document: {str(ex)}") diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index a9572a7a..189296fe 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -29,6 +29,7 @@ from docling_eval_next.dataset_builders.omnidocbench_builder import ( OmniDocBenchDatasetBuilder, ) +from docling_eval_next.dataset_builders.xfund_builder import XFUNDDatasetBuilder from docling_eval_next.prediction_providers.prediction_provider import ( DoclingPredictionProvider, NullPredictionProvider, @@ -231,3 +232,18 @@ def test_run_funsd(): dataset_layout.save_to_disk( chunk_size=20, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + + +def test_run_xfund(): + target_path = Path("./scratch/xfund-builder-test/") + + dataset_layout = XFUNDDatasetBuilder( + dataset_source=target_path / "input_dataset", + prediction_provider=NullPredictionProvider(), + target=target_path / "e2e", + ) + + dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF + dataset_layout.save_to_disk( + chunk_size=20, max_num_chunks=1 + ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. From f8bd0708ede6543229c232f511a8e2f5d6217df2 Mon Sep 17 00:00:00 2001 From: Saidgurbuz Date: Fri, 21 Mar 2025 10:35:29 +0100 Subject: [PATCH 19/81] update the kv cell creation to prevent false positives Signed-off-by: Saidgurbuz --- docling_eval_next/dataset_builders/funsd_builder.py | 6 ++++++ docling_eval_next/dataset_builders/xfund_builder.py | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/docling_eval_next/dataset_builders/funsd_builder.py b/docling_eval_next/dataset_builders/funsd_builder.py index 879be1b6..73a7c95b 100644 --- a/docling_eval_next/dataset_builders/funsd_builder.py +++ b/docling_eval_next/dataset_builders/funsd_builder.py @@ -164,6 +164,12 @@ def populate_key_value_item( cell_by_id = {} for item in form_items: + # We omit the items that are not relevant for key-value pairs. + if not item.get("linking", []) and item.get("label", "other") in [ + "header", + "other", + ]: + continue cell_id = item["id"] cell_text = item.get("text", "") diff --git a/docling_eval_next/dataset_builders/xfund_builder.py b/docling_eval_next/dataset_builders/xfund_builder.py index e4de831b..1d1f540f 100644 --- a/docling_eval_next/dataset_builders/xfund_builder.py +++ b/docling_eval_next/dataset_builders/xfund_builder.py @@ -173,6 +173,12 @@ def populate_key_value_item( cell_by_id = {} for item in form_items: + # We omit the items that are not relevant for key-value pairs. + if not item.get("linking", []) and item.get("label", "other") in [ + "header", + "other", + ]: + continue cell_id = item["id"] cell_text = item.get("text", "") From 57df7bb7fdefeac9a98065b2ce9c87829bae7bc3 Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Fri, 21 Mar 2025 09:39:44 +0100 Subject: [PATCH 20/81] chore: Fixing imports Signed-off-by: Nikos Livathinos --- tests/test_dataset_builder.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 189296fe..209b751e 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -21,9 +21,6 @@ from docling_eval_next.dataset_builders.doclaynet_v1_builder import ( DocLayNetV1DatasetBuilder, ) -from docling_eval_next.dataset_builders.doclaynet_v2_builder import ( - DocLayNetV2DatasetBuilder, -) from docling_eval_next.dataset_builders.dpbench_builder import DPBenchDatasetBuilder from docling_eval_next.dataset_builders.funsd_builder import FUNSDDatasetBuilder from docling_eval_next.dataset_builders.omnidocbench_builder import ( From 1250f5dc6cbaccaa36c58fed7308156768344d8c Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Fri, 21 Mar 2025 11:42:19 +0100 Subject: [PATCH 21/81] chore: Update docling-core version Signed-off-by: Nikos Livathinos --- poetry.lock | 376 ++++++++----------------------------------------- pyproject.toml | 2 +- 2 files changed, 59 insertions(+), 319 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7bb672b0..cc576a53 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "accelerate" @@ -6,8 +6,6 @@ version = "1.5.2" description = "Accelerate" optional = false python-versions = ">=3.9.0" -groups = ["main"] -markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "accelerate-1.5.2-py3-none-any.whl", hash = "sha256:68a3b272f6a6ffebb457bdc138581a2bf52efad6a5e0214dc46675f3edd98792"}, {file = "accelerate-1.5.2.tar.gz", hash = "sha256:a1cf39473edc0e42772a9d9a18c9eb1ce8ffd9e1719dc0ab80670f5c1fd4dc43"}, @@ -39,7 +37,6 @@ version = "2.6.1" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, @@ -51,7 +48,6 @@ version = "3.11.14" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e2bc827c01f75803de77b134afdbf74fa74b62970eafdf190f3244931d7a5c0d"}, {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e365034c5cf6cf74f57420b57682ea79e19eb29033399dd3f40de4d0171998fa"}, @@ -147,7 +143,7 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.2.0) ; sys_platform == \"linux\" or sys_platform == \"darwin\"", "brotlicffi ; platform_python_implementation != \"CPython\""] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] [[package]] name = "aiosignal" @@ -155,7 +151,6 @@ version = "1.3.2" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, @@ -170,7 +165,6 @@ 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"}, @@ -182,8 +176,6 @@ version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false python-versions = ">=3.6" -groups = ["dev"] -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"}, @@ -195,7 +187,6 @@ version = "1.0.3" description = "APTED algorithm for the Tree Edit Distance" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "apted-1.0.3-py3-none-any.whl", hash = "sha256:74193369d023649d335269e67c4df07f922959e5ac2597de1b79af4e694150e8"}, {file = "apted-1.0.3.tar.gz", hash = "sha256:befa5181e2d4457fa88e54995a82604ee048bb2fbc781ea97d8e1856b4715ce9"}, @@ -207,7 +198,6 @@ version = "2.15.8" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.7.2" -groups = ["dev"] files = [ {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, @@ -227,7 +217,6 @@ version = "3.0.0" description = "Annotate AST trees with source code positions" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, @@ -243,8 +232,6 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.10\"" files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, @@ -256,19 +243,18 @@ version = "25.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, ] [package.extras] -benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +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"] -tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] +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 = "autopep8" @@ -276,7 +262,6 @@ version = "2.2.0" description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "autopep8-2.2.0-py2.py3-none-any.whl", hash = "sha256:05418a981f038969d8bdcd5636bf15948db7555ae944b9f79b5a34b35f1370d4"}, {file = "autopep8-2.2.0.tar.gz", hash = "sha256:d306a0581163ac29908280ad557773a95a9bede072c0fafed6f141f5311f43c1"}, @@ -292,8 +277,6 @@ version = "1.2.0" description = "Backport of CPython tarfile module" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.10\" or python_version == \"3.11\"" files = [ {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, @@ -309,7 +292,6 @@ version = "4.13.3" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" -groups = ["main"] files = [ {file = "beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16"}, {file = "beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b"}, @@ -332,7 +314,6 @@ version = "24.10.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, @@ -381,7 +362,6 @@ version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, @@ -393,8 +373,6 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "implementation_name == \"pypy\" or sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" 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"}, @@ -474,7 +452,6 @@ version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -486,7 +463,6 @@ 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", "dev"] 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"}, @@ -588,7 +564,6 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -603,7 +578,6 @@ version = "0.4.0" description = "Logging integration for Click" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, @@ -618,12 +592,10 @@ 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", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "platform_system == \"Windows\""} [[package]] name = "comm" @@ -631,7 +603,6 @@ version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, @@ -649,7 +620,6 @@ version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, @@ -723,8 +693,6 @@ version = "44.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.7" -groups = ["dev"] -markers = "sys_platform == \"linux\"" files = [ {file = "cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7"}, {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1"}, @@ -767,10 +735,10 @@ files = [ cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""] -pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] +pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] test = ["certifi (>=2024)", "cryptography-vectors (==44.0.2)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] @@ -782,7 +750,6 @@ version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -798,7 +765,6 @@ version = "3.4.0" description = "HuggingFace community-driven open-source library of datasets" optional = false python-versions = ">=3.9.0" -groups = ["main"] files = [ {file = "datasets-3.4.0-py3-none-any.whl", hash = "sha256:35ef5182bddd38f7aa774d9f33c3e8b8e9c9c7ea41b4b7969fde431919cb556b"}, {file = "datasets-3.4.0.tar.gz", hash = "sha256:f3defae5d9c79ff586db3b17389fdde01704ffea015293a050d7e8ab6816bad8"}, @@ -821,17 +787,17 @@ tqdm = ">=4.66.3" xxhash = "*" [package.extras] -audio = ["librosa", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\""] +audio = ["librosa", "soundfile (>=0.12.1)", "soxr (>=0.4.0)"] benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] -dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\"", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0) ; python_version < \"3.10\"", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers", "transformers (>=4.42.0)", "zstandard"] +dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers", "transformers (>=4.42.0)", "zstandard"] docs = ["s3fs", "tensorflow (>=2.6.0)", "torch", "transformers"] jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] quality = ["ruff (>=0.3.0)"] s3 = ["s3fs"] tensorflow = ["tensorflow (>=2.6.0)"] tensorflow-gpu = ["tensorflow (>=2.6.0)"] -tests = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\"", "tensorflow (>=2.6.0) ; python_version < \"3.10\"", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] -tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] +tests = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] +tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] torch = ["torch"] vision = ["Pillow (>=9.4.0)"] @@ -841,7 +807,6 @@ version = "1.8.13" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "debugpy-1.8.13-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:06859f68e817966723ffe046b896b1bd75c665996a77313370336ee9e1de3e90"}, {file = "debugpy-1.8.13-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c2db69fb8df3168bc857d7b7d2494fed295dfdbde9a45f27b4b152f37520"}, @@ -877,7 +842,6 @@ version = "5.2.1" description = "Decorators for Humans" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, @@ -889,7 +853,6 @@ version = "0.3.8" description = "serialize all of Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, @@ -905,7 +868,6 @@ version = "0.1.3" description = "Utilities for comparing sequences" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "Distance-0.1.3.tar.gz", hash = "sha256:60807584f5b6003f5c521aa73f39f51f631de3be5cccc5a1d67166fcbf0d4551"}, ] @@ -916,7 +878,6 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -928,7 +889,6 @@ version = "2.26.0" description = "SDK and CLI for parsing PDF, DOCX, HTML, and more, to a unified document representation for powering downstream workflows such as gen AI applications." optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "docling-2.26.0-py3-none-any.whl", hash = "sha256:0ddebcd4c258c8fa9e4f84801940ae3c4fce59ad8ff81bc10939f686073323a0"}, {file = "docling-2.26.0.tar.gz", hash = "sha256:db7fc425b876023e4ad42a1fdfc0f285f507c38bc8a24ee2ae00e2eb8af0120d"}, @@ -959,27 +919,26 @@ rtree = ">=1.3.0,<2.0.0" scipy = {version = ">=1.6.0,<2.0.0", markers = "python_version >= \"3.10\""} tqdm = ">=4.65.0,<5.0.0" transformers = [ - {version = ">=4.46.0,<5.0.0", optional = true, markers = "(sys_platform != \"darwin\" or platform_machine != \"x86_64\") and extra == \"vlm\""}, + {version = ">=4.46.0,<5.0.0", optional = true, markers = "sys_platform != \"darwin\" and extra == \"vlm\" or platform_machine != \"x86_64\" and extra == \"vlm\""}, {version = ">=4.42.0,<4.43.0", optional = true, markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\" and extra == \"vlm\""}, ] typer = ">=0.12.5,<0.13.0" [package.extras] -ocrmac = ["ocrmac (>=1.0.0,<2.0.0) ; sys_platform == \"darwin\""] -rapidocr = ["onnxruntime (>=1.7.0,<1.20.0) ; python_version < \"3.10\"", "onnxruntime (>=1.7.0,<2.0.0) ; python_version >= \"3.10\"", "rapidocr-onnxruntime (>=1.4.0,<2.0.0) ; python_version < \"3.13\""] +ocrmac = ["ocrmac (>=1.0.0,<2.0.0)"] +rapidocr = ["onnxruntime (>=1.7.0,<1.20.0)", "onnxruntime (>=1.7.0,<2.0.0)", "rapidocr-onnxruntime (>=1.4.0,<2.0.0)"] tesserocr = ["tesserocr (>=2.7.1,<3.0.0)"] -vlm = ["accelerate (>=1.2.1,<2.0.0) ; sys_platform != \"darwin\" or platform_machine != \"x86_64\"", "transformers (>=4.42.0,<4.43.0) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "transformers (>=4.46.0,<5.0.0) ; sys_platform != \"darwin\" or platform_machine != \"x86_64\""] +vlm = ["accelerate (>=1.2.1,<2.0.0)", "transformers (>=4.42.0,<4.43.0)", "transformers (>=4.46.0,<5.0.0)"] [[package]] name = "docling-core" -version = "2.23.1" +version = "2.23.3" description = "A python library to define and validate data types in Docling." optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ - {file = "docling_core-2.23.1-py3-none-any.whl", hash = "sha256:4a3f7bcc55a735a070d69d74cf1278f7e40cb403c5059d4149672c7ca163992f"}, - {file = "docling_core-2.23.1.tar.gz", hash = "sha256:0708f4ffe61faef9a2dee48e71cf3890248bf1d9b409f6414cd9c0dd6c7a1681"}, + {file = "docling_core-2.23.3-py3-none-any.whl", hash = "sha256:a2166ffc41f8fdf6fdb99b33da6c7146eccf6382712ea92e95772604fb5af5e5"}, + {file = "docling_core-2.23.3.tar.gz", hash = "sha256:a64ce41e0881c06962a2b3ec80e0665f84de0809dedf1bf84f3a14b75dd665c4"}, ] [package.dependencies] @@ -1005,7 +964,6 @@ version = "3.4.1" description = "This package contains the AI models used by the Docling PDF conversion package" optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "docling_ibm_models-3.4.1-py3-none-any.whl", hash = "sha256:c3582c99dddfa3f0eafcf80cf1267fd8efa39c4a74cc7a88f9dd49684fac2986"}, {file = "docling_ibm_models-3.4.1.tar.gz", hash = "sha256:093b4dff2ea284a4953c3aa009e29945208b8d389b94fb14940a03a93f673e96"}, @@ -1037,7 +995,6 @@ version = "3.4.0" description = "Simple package to extract text with coordinates from programmatic PDFs" optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "docling_parse-3.4.0-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:96e95e63ab722dfe5340fcb04d0e07bd1c0a0ba2f62e93c91ac26dda0a312a44"}, {file = "docling_parse-3.4.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:f9e14a7a0b92526d4dfd3f390f3d7e075f59d14d6b8a0a564fbc26299e56cd47"}, @@ -1082,7 +1039,6 @@ version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, @@ -1094,7 +1050,6 @@ version = "1.3.1" description = "Dictionary wrapper for quick access to deeply nested keys." optional = false python-versions = ">=3.5,<4.0" -groups = ["dev"] files = [ {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, @@ -1106,7 +1061,6 @@ version = "1.7.2" description = "End-to-End Multi-Lingual Optical Character Recognition (OCR) Solution" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "easyocr-1.7.2-py3-none-any.whl", hash = "sha256:5be12f9b0e595d443c9c3d10b0542074b50f0ec2d98b141a109cd961fd1c177c"}, ] @@ -1131,7 +1085,6 @@ version = "2.0.0" description = "An implementation of lxml.xmlfile for the standard library" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, @@ -1143,7 +1096,6 @@ version = "0.4.3" description = "HuggingFace community-driven open-source library of evaluation" optional = false python-versions = ">=3.8.0" -groups = ["main"] files = [ {file = "evaluate-0.4.3-py3-none-any.whl", hash = "sha256:47d8770bdea76e2c2ed0d40189273027d1a41ccea861bcc7ba12d30ec5d1e517"}, {file = "evaluate-0.4.3.tar.gz", hash = "sha256:3a5700cf83aabee9549264e1e5666f116367c61dbd4d38352015e859a5e2098d"}, @@ -1179,8 +1131,6 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "python_version == \"3.10\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1195,7 +1145,6 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1210,14 +1159,13 @@ version = "2.2.0" description = "Get the currently executing AST node of a frame, and other information" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] [[package]] name = "filelock" @@ -1225,7 +1173,6 @@ version = "3.18.0" description = "A platform independent file lock." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, @@ -1234,7 +1181,7 @@ files = [ [package.extras] docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] -typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] +typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "filetype" @@ -1242,7 +1189,6 @@ version = "1.2.0" description = "Infer file type and MIME type of any file/buffer. No external dependencies." optional = false python-versions = "*" -groups = ["main"] files = [ {file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"}, {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"}, @@ -1254,7 +1200,6 @@ version = "6.1.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" -groups = ["dev"] files = [ {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, @@ -1271,7 +1216,6 @@ version = "1.2.3" description = "Flake8 plug-in loading the configuration from pyproject.toml" optional = false python-versions = ">= 3.6" -groups = ["dev"] files = [ {file = "flake8_pyproject-1.2.3-py3-none-any.whl", hash = "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a"}, ] @@ -1289,7 +1233,6 @@ version = "4.56.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "fonttools-4.56.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:331954d002dbf5e704c7f3756028e21db07097c19722569983ba4d74df014000"}, {file = "fonttools-4.56.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d1613abd5af2f93c05867b3a3759a56e8bf97eb79b1da76b2bc10892f96ff16"}, @@ -1344,18 +1287,18 @@ files = [ ] [package.extras] -all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] +interpolatable = ["munkres", "pycairo", "scipy"] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] -type1 = ["xattr ; sys_platform == \"darwin\""] +type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] -woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "frozenlist" @@ -1363,7 +1306,6 @@ version = "1.5.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, @@ -1465,7 +1407,6 @@ version = "2024.12.0" description = "File-system specification" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2"}, {file = "fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f"}, @@ -1508,7 +1449,6 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1523,7 +1463,6 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1534,7 +1473,7 @@ gitdb = ">=4.0.1,<5" [package.extras] doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] -test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] [[package]] name = "huggingface-hub" @@ -1542,7 +1481,6 @@ version = "0.29.3" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" -groups = ["main"] files = [ {file = "huggingface_hub-0.29.3-py3-none-any.whl", hash = "sha256:0b25710932ac649c08cdbefa6c6ccb8e88eef82927cacdb048efb726429453aa"}, {file = "huggingface_hub-0.29.3.tar.gz", hash = "sha256:64519a25716e0ba382ba2d3fb3ca082e7c7eb4a2fc634d200e8380006e0760e5"}, @@ -1577,7 +1515,6 @@ version = "2.6.9" description = "File identification library for Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "identify-2.6.9-py2.py3-none-any.whl", hash = "sha256:c98b4322da415a8e5a70ff6e51fbc2d2932c015532d77e9f8537b4ba7813b150"}, {file = "identify-2.6.9.tar.gz", hash = "sha256:d40dfe3142a1421d8518e3d3985ef5ac42890683e32306ad614a29490abeb6bf"}, @@ -1592,7 +1529,6 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1607,7 +1543,6 @@ version = "2.37.0" description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "imageio-2.37.0-py3-none-any.whl", hash = "sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed"}, {file = "imageio-2.37.0.tar.gz", hash = "sha256:71b57b3669666272c818497aebba2b4c5f20d5b37c81720e5e1a56d59c492996"}, @@ -1641,7 +1576,6 @@ version = "8.6.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, @@ -1651,12 +1585,12 @@ files = [ zipp = ">=3.20" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] [[package]] @@ -1665,7 +1599,6 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1677,7 +1610,6 @@ version = "2.2.0" description = "Pythonic task execution" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "invoke-2.2.0-py3-none-any.whl", hash = "sha256:6ea924cc53d4f78e3d98bc436b08069a03077e6f85ad1ddaa8a116d7dad15820"}, {file = "invoke-2.2.0.tar.gz", hash = "sha256:ee6cbb101af1a859c7fe84f2a264c059020b0cb7fe3535f9424300ab568f6bd5"}, @@ -1689,7 +1621,6 @@ version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, @@ -1723,7 +1654,6 @@ version = "8.34.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" -groups = ["dev"] files = [ {file = "ipython-8.34.0-py3-none-any.whl", hash = "sha256:0419883fa46e0baa182c5d50ebb8d6b49df1889fdb70750ad6d8cfe678eda6e3"}, {file = "ipython-8.34.0.tar.gz", hash = "sha256:c31d658e754673ecc6514583e7dda8069e47136eb62458816b7d1e6625948b5a"}, @@ -1745,7 +1675,7 @@ typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli ; python_version < \"3.11\"", "typing_extensions"] +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"] @@ -1762,7 +1692,6 @@ version = "8.1.5" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245"}, {file = "ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17"}, @@ -1784,7 +1713,6 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" -groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -1799,7 +1727,6 @@ version = "3.4.0" description = "Utility functions for Python class constructs" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, @@ -1818,7 +1745,6 @@ version = "6.0.1" description = "Useful decorators and context managers" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, @@ -1829,7 +1755,7 @@ files = [ [package.extras] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "jaraco-functools" @@ -1837,7 +1763,6 @@ version = "4.1.0" description = "Functools like those found in stdlib" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"}, {file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"}, @@ -1847,7 +1772,7 @@ files = [ more-itertools = "*" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] @@ -1860,7 +1785,6 @@ version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, @@ -1880,15 +1804,13 @@ version = "0.9.0" description = "Low-level, pure Python DBus protocol wrapper." optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "sys_platform == \"linux\"" files = [ {file = "jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"}, {file = "jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"}, ] [package.extras] -test = ["async-timeout ; python_version < \"3.11\"", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] trio = ["trio"] [[package]] @@ -1897,7 +1819,6 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1915,7 +1836,6 @@ version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, @@ -1927,7 +1847,6 @@ version = "3.1.0" description = "Library with helpers for the jsonlines file format" optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "jsonlines-3.1.0-py3-none-any.whl", hash = "sha256:632f5e38f93dfcb1ac8c4e09780b92af3a55f38f26e7c47ae85109d420b6ad39"}, {file = "jsonlines-3.1.0.tar.gz", hash = "sha256:2579cb488d96f815b0eb81629e3e6b0332da0962a18fa3532958f7ba14a5c37f"}, @@ -1942,7 +1861,6 @@ version = "1.1.0" description = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python." optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9"}, {file = "jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552"}, @@ -1954,7 +1872,6 @@ 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"}, @@ -1976,7 +1893,6 @@ 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"}, @@ -1991,7 +1907,6 @@ version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" -groups = ["dev"] 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"}, @@ -2006,7 +1921,7 @@ 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 ; sys_platform == \"win32\"", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" @@ -2014,7 +1929,6 @@ version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" -groups = ["dev"] 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"}, @@ -2035,7 +1949,6 @@ version = "3.0.13" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" -groups = ["dev"] 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"}, @@ -2047,7 +1960,6 @@ version = "25.6.0" description = "Store and access your passwords safely." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, @@ -2063,7 +1975,7 @@ pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] completion = ["shtab (>=1.1.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] @@ -2077,7 +1989,6 @@ version = "1.4.8" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, @@ -2167,7 +2078,6 @@ version = "3.77.0" description = "Pure Python library for LaTeX to MathML conversion" optional = false python-versions = ">=3.8.1,<4.0.0" -groups = ["main"] files = [ {file = "latex2mathml-3.77.0-py3-none-any.whl", hash = "sha256:5531e18a2a9eae7c24e257118b6a444cbba253cd27ff3e81f1bd6c41e88e786e"}, {file = "latex2mathml-3.77.0.tar.gz", hash = "sha256:e2f501d1878f2e489c3f6f12786bef74c62f712d2770f7f3c837eb20a55d0a1e"}, @@ -2179,7 +2089,6 @@ version = "0.4" description = "Makes it easy to load subpackages and functions on demand." optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc"}, {file = "lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1"}, @@ -2199,7 +2108,6 @@ version = "1.10.0" description = "A fast and thorough lazy object proxy." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, @@ -2246,7 +2154,6 @@ version = "0.14.1" description = "Lightning toolbox for across the our ecosystem." optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "lightning_utilities-0.14.1-py3-none-any.whl", hash = "sha256:badc40a70d8e933706aa0b4f63b12392dbf8208728743a40b55edb5e81797311"}, {file = "lightning_utilities-0.14.1.tar.gz", hash = "sha256:9fb56c76dc07a46c075e1f78594fcb161091eae5944b34c2b43258d23c202791"}, @@ -2268,7 +2175,6 @@ version = "5.3.1" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a4058f16cee694577f7e4dd410263cd0ef75644b43802a689c2b3c2a7e69453b"}, {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:364de8f57d6eda0c16dcfb999af902da31396949efa0e583e12675d09709881b"}, @@ -2423,7 +2329,6 @@ 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"}, @@ -2448,7 +2353,6 @@ version = "2.1.2" description = "A markdown parser with high extensibility." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "marko-2.1.2-py3-none-any.whl", hash = "sha256:c14aa7a77468aaaf53cf056dcd3d32398b9df4c3fb81f5e120dd37cbb9f8c859"}, {file = "marko-2.1.2.tar.gz", hash = "sha256:a9170006b879376e6845c91b1ae3dce2992772954b99b70175ff888537186011"}, @@ -2465,7 +2369,6 @@ 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"}, @@ -2536,7 +2439,6 @@ version = "3.10.1" description = "Python plotting package" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "matplotlib-3.10.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16"}, {file = "matplotlib-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2"}, @@ -2594,7 +2496,6 @@ version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false python-versions = ">=3.8" -groups = ["dev"] 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"}, @@ -2609,7 +2510,6 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, @@ -2621,7 +2521,6 @@ 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"}, @@ -2633,7 +2532,6 @@ version = "10.6.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b"}, {file = "more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"}, @@ -2645,7 +2543,6 @@ version = "2.10.2" description = "A Python package for easy multiprocessing, but faster than multiprocessing" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "mpire-2.10.2-py3-none-any.whl", hash = "sha256:d627707f7a8d02aa4c7f7d59de399dec5290945ddf7fbd36cbb1d6ebb37a51fb"}, {file = "mpire-2.10.2.tar.gz", hash = "sha256:f66a321e93fadff34585a4bfa05e95bd946cf714b442f51c529038eb45773d97"}, @@ -2662,9 +2559,9 @@ tqdm = ">=4.27" [package.extras] dashboard = ["flask"] -dill = ["multiprocess (>=0.70.15) ; python_version >= \"3.11\"", "multiprocess ; python_version < \"3.11\""] +dill = ["multiprocess", "multiprocess (>=0.70.15)"] docs = ["docutils (==0.17.1)", "sphinx (==3.2.1)", "sphinx-autodoc-typehints (==1.11.0)", "sphinx-rtd-theme (==0.5.0)", "sphinx-versions (==1.0.1)", "sphinxcontrib-images (==0.9.2)"] -testing = ["ipywidgets", "multiprocess (>=0.70.15) ; python_version >= \"3.11\"", "multiprocess ; python_version < \"3.11\"", "numpy", "pywin32 (>=301) ; platform_system == \"Windows\"", "rich"] +testing = ["ipywidgets", "multiprocess", "multiprocess (>=0.70.15)", "numpy", "pywin32 (>=301)", "rich"] [[package]] name = "mpmath" @@ -2672,7 +2569,6 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2681,7 +2577,7 @@ files = [ [package.extras] develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] docs = ["sphinx"] -gmpy = ["gmpy2 (>=2.1.0a4) ; platform_python_implementation != \"PyPy\""] +gmpy = ["gmpy2 (>=2.1.0a4)"] tests = ["pytest (>=4.6)"] [[package]] @@ -2690,7 +2586,6 @@ version = "6.1.0" description = "multidict implementation" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, @@ -2795,7 +2690,6 @@ version = "0.70.16" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "multiprocess-0.70.16-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee"}, {file = "multiprocess-0.70.16-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec"}, @@ -2820,7 +2714,6 @@ version = "1.15.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"}, {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"}, @@ -2874,7 +2767,6 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" -groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -2886,7 +2778,6 @@ version = "1.9.1" description = "Run any standard Python code quality tool on a Jupyter Notebook" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "nbqa-1.9.1-py3-none-any.whl", hash = "sha256:95552d2f6c2c038136252a805aa78d85018aef922586270c3a074332737282e5"}, {file = "nbqa-1.9.1.tar.gz", hash = "sha256:a1f4bcf587c597302fed295951001fc4e1be4ce0e77e1ab1b25ac2fbe3db0cdd"}, @@ -2907,7 +2798,6 @@ version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" -groups = ["dev"] 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"}, @@ -2919,7 +2809,6 @@ version = "3.4.2" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"}, {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"}, @@ -2939,7 +2828,6 @@ version = "0.2.21" description = "Python binding to Ammonia HTML sanitizer Rust crate" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "nh3-0.2.21-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:fcff321bd60c6c5c9cb4ddf2554e22772bb41ebd93ad88171bbbb6f271255286"}, {file = "nh3-0.2.21-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31eedcd7d08b0eae28ba47f43fd33a653b4cdb271d64f1aeda47001618348fde"}, @@ -2973,7 +2861,6 @@ version = "1.11.1.3" description = "Ninja is a small build system with a focus on speed" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "ninja-1.11.1.3-py3-none-macosx_10_9_universal2.whl", hash = "sha256:2b4879ea3f1169f3d855182c57dcc84d1b5048628c8b7be0d702b81882a37237"}, {file = "ninja-1.11.1.3-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bc3ebc8b2e47716149f3541742b5cd8e0b08f51013b825c05baca3e34854370d"}, @@ -3003,7 +2890,6 @@ version = "3.9.1" description = "Natural Language Toolkit" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"}, {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"}, @@ -3029,7 +2915,6 @@ version = "1.9.1" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["dev"] files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -3041,8 +2926,6 @@ version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] -markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -3088,8 +2971,6 @@ version = "2.2.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" -groups = ["main", "dev"] -markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "numpy-2.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9"}, {file = "numpy-2.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae"}, @@ -3154,8 +3035,6 @@ version = "12.4.5.8" description = "CUBLAS native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3"}, {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b"}, @@ -3168,8 +3047,6 @@ version = "12.4.127" description = "CUDA profiling tools runtime libs." optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a"}, {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb"}, @@ -3182,8 +3059,6 @@ version = "12.4.127" description = "NVRTC native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198"}, {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338"}, @@ -3196,8 +3071,6 @@ version = "12.4.127" description = "CUDA Runtime native Libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3"}, {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5"}, @@ -3210,8 +3083,6 @@ version = "9.1.0.70" description = "cuDNN runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, @@ -3226,8 +3097,6 @@ version = "11.2.1.3" description = "CUFFT native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399"}, {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9"}, @@ -3243,8 +3112,6 @@ version = "10.3.5.147" description = "CURAND native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9"}, {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b"}, @@ -3257,8 +3124,6 @@ version = "11.6.1.9" description = "CUDA solver native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e"}, {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260"}, @@ -3276,8 +3141,6 @@ version = "12.3.1.170" description = "CUSPARSE native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3"}, {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1"}, @@ -3293,8 +3156,6 @@ version = "0.6.2" description = "NVIDIA cuSPARSELt" optional = false python-versions = "*" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:067a7f6d03ea0d4841c85f0c6f1991c5dda98211f6302cb83a4ab234ee95bef8"}, {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:df2c24502fd76ebafe7457dbc4716b2fec071aabaed4fb7691a201cde03704d9"}, @@ -3307,8 +3168,6 @@ version = "2.21.5" description = "NVIDIA Collective Communication Library (NCCL) Runtime" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0"}, ] @@ -3319,8 +3178,6 @@ version = "12.4.127" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, @@ -3333,8 +3190,6 @@ version = "12.4.127" description = "NVIDIA Tools Extension" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3"}, {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a"}, @@ -3347,7 +3202,6 @@ version = "4.11.0.86" description = "Wrapper package for OpenCV python bindings." optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798"}, {file = "opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca"}, @@ -3360,9 +3214,9 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, - {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, + {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, + {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] @@ -3372,7 +3226,6 @@ version = "3.1.5" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, @@ -3387,7 +3240,6 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -3399,7 +3251,6 @@ 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"}, @@ -3486,7 +3337,6 @@ version = "2.2.3.250308" description = "Type annotations for pandas" optional = false python-versions = ">=3.10" -groups = ["dev"] files = [ {file = "pandas_stubs-2.2.3.250308-py3-none-any.whl", hash = "sha256:a377edff3b61f8b268c82499fdbe7c00fdeed13235b8b71d6a1dc347aeddc74d"}, {file = "pandas_stubs-2.2.3.250308.tar.gz", hash = "sha256:3a6e9daf161f00b85c83772ed3d5cff9522028f07a94817472c07b91f46710fd"}, @@ -3502,7 +3352,6 @@ version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -3518,7 +3367,6 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -3530,8 +3378,6 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" -groups = ["dev"] -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"}, @@ -3546,7 +3392,6 @@ version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, @@ -3635,7 +3480,7 @@ docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -typing = ["typing-extensions ; python_version < \"3.10\""] +typing = ["typing-extensions"] xmp = ["defusedxml"] [[package]] @@ -3644,7 +3489,6 @@ version = "1.12.1.2" description = "Query metadata from sdists / bdists / installed packages." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pkginfo-1.12.1.2-py3-none-any.whl", hash = "sha256:c783ac885519cab2c34927ccfa6bf64b5a704d7c69afaea583dd9b7afe969343"}, {file = "pkginfo-1.12.1.2.tar.gz", hash = "sha256:5cd957824ac36f140260964eba3c6be6442a8359b8c48f4adf90210f33a04b7b"}, @@ -3659,7 +3503,6 @@ 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 = ["dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -3676,7 +3519,6 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -3692,7 +3534,6 @@ version = "3.8.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, @@ -3711,7 +3552,6 @@ version = "3.0.50" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.8.0" -groups = ["dev"] files = [ {file = "prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198"}, {file = "prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab"}, @@ -3726,7 +3566,6 @@ version = "0.3.0" description = "Accelerated property cache" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:efa44f64c37cc30c9f05932c740a8b40ce359f51882c70883cc95feac842da4d"}, {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2383a17385d9800b6eb5855c2f05ee550f803878f344f58b6e194de08b96352c"}, @@ -3834,7 +3673,6 @@ version = "7.0.0" description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, @@ -3847,7 +3685,6 @@ files = [ {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, ] -markers = {main = "sys_platform != \"darwin\" or platform_machine != \"x86_64\""} [package.extras] dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] @@ -3859,8 +3696,6 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = false python-versions = "*" -groups = ["dev"] -markers = "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"}, @@ -3872,7 +3707,6 @@ version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" -groups = ["dev"] 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"}, @@ -3887,7 +3721,6 @@ version = "19.0.1" description = "Python library for Apache Arrow" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fc28912a2dc924dddc2087679cc8b7263accc71b9ff025a1362b004711661a69"}, {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fca15aabbe9b8355800d923cc2e82c8ef514af321e18b437c3d782aa884eaeec"}, @@ -3942,7 +3775,6 @@ version = "1.3.0.post6" description = "Cython wrapper for the C++ translation of the Angus Johnson's Clipper library (ver. 6.4.2)" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "pyclipper-1.3.0.post6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fa0f5e78cfa8262277bb3d0225537b3c2a90ef68fd90a229d5d24cf49955dcf4"}, {file = "pyclipper-1.3.0.post6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a01f182d8938c1dc515e8508ed2442f7eebd2c25c7d5cb29281f583c1a8008a4"}, @@ -4002,7 +3834,6 @@ version = "2.0.8" description = "Official APIs for the MS-COCO dataset" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "pycocotools-2.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a66886f45b04cee1ff0492e9f5e25d430d8aa3eb63e63c4ebc620945caa11b9"}, {file = "pycocotools-2.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257130b65b7b0f122ce1ed62942867ca9789e56a68109682796cc85c9770c74a"}, @@ -4045,7 +3876,6 @@ version = "2.11.1" description = "Python style guide checker" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, @@ -4057,8 +3887,6 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "implementation_name == \"pypy\" or sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -4070,7 +3898,6 @@ version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, @@ -4083,7 +3910,7 @@ typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] +timezone = ["tzdata"] [[package]] name = "pydantic-core" @@ -4091,7 +3918,6 @@ 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"}, @@ -4204,7 +4030,6 @@ version = "2.8.1" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c"}, {file = "pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585"}, @@ -4225,7 +4050,6 @@ version = "3.1.0" description = "passive checker of Python programs" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, @@ -4237,7 +4061,6 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -4252,7 +4075,6 @@ version = "2.17.7" description = "python code static checker" optional = false python-versions = ">=3.7.2" -groups = ["dev"] files = [ {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, @@ -4281,7 +4103,6 @@ version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, @@ -4296,7 +4117,6 @@ version = "4.30.1" description = "Python bindings to PDFium" optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "pypdfium2-4.30.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:e07c47633732cc18d890bb7e965ad28a9c5a932e548acb928596f86be2e5ae37"}, {file = "pypdfium2-4.30.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5ea2d44e96d361123b67b00f527017aa9c847c871b5714e013c01c3eb36a79fe"}, @@ -4319,7 +4139,6 @@ version = "6.1.0" description = "pyproject-flake8 (`pflake8`), a monkey patching wrapper to connect flake8 with pyproject.toml configuration" optional = false python-versions = ">=3.8.1" -groups = ["dev"] files = [ {file = "pyproject_flake8-6.1.0-py3-none-any.whl", hash = "sha256:86ea5559263c098e1aa4f866776aa2cf45362fd91a576b9fd8fbbbb55db12c4e"}, {file = "pyproject_flake8-6.1.0.tar.gz", hash = "sha256:6da8e5a264395e0148bc11844c6fb50546f1fac83ac9210f7328664135f9e70f"}, @@ -4335,7 +4154,6 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -4358,7 +4176,6 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -4379,7 +4196,6 @@ version = "0.6.6" description = "Python Bidi layout wrapping the Rust crate unicode-bidi" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "python_bidi-0.6.6-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09d4da6b5851d0df01d7313a11d22f308fdfb0e12461f7262e0f55c521ccc0f1"}, {file = "python_bidi-0.6.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:493a844891e23264411b01df58ba77d5dbb0045da3787f4195f50a56bfb847d9"}, @@ -4501,7 +4317,6 @@ 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", "dev"] 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"}, @@ -4516,7 +4331,6 @@ version = "1.1.2" description = "Create, read, and update Microsoft Word .docx files." optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe"}, {file = "python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd"}, @@ -4532,7 +4346,6 @@ 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"}, @@ -4547,7 +4360,6 @@ version = "3.15.0" description = "Interact with GitLab API" optional = false python-versions = ">=3.7.0" -groups = ["dev"] files = [ {file = "python-gitlab-3.15.0.tar.gz", hash = "sha256:c9e65eb7612a9fbb8abf0339972eca7fd7a73d4da66c9b446ffe528930aff534"}, {file = "python_gitlab-3.15.0-py3-none-any.whl", hash = "sha256:8f8d1c0d387f642eb1ac7bf5e8e0cd8b3dd49c6f34170cee3c7deb7d384611f3"}, @@ -4567,7 +4379,6 @@ version = "1.0.2" description = "Create, read, and update PowerPoint 2007+ (.pptx) files." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "python_pptx-1.0.2-py3-none-any.whl", hash = "sha256:160838e0b8565a8b1f67947675886e9fea18aa5e795db7ae531606d68e785cba"}, {file = "python_pptx-1.0.2.tar.gz", hash = "sha256:479a8af0eaf0f0d76b6f00b0887732874ad2e3188230315290cd1f9dd9cc7095"}, @@ -4585,7 +4396,6 @@ version = "7.34.6" description = "Automatic Semantic Versioning for Python projects" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "python-semantic-release-7.34.6.tar.gz", hash = "sha256:e9b8fb788024ae9510a924136d573588415a16eeca31cc5240f2754a80a2e831"}, {file = "python_semantic_release-7.34.6-py3-none-any.whl", hash = "sha256:7e3969ba4663d9b2087b02bf3ac140e202551377bf045c34e09bfe19753e19ab"}, @@ -4617,7 +4427,6 @@ version = "2025.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, @@ -4629,7 +4438,6 @@ version = "310" description = "Python for Window Extensions" optional = false python-versions = "*" -groups = ["main", "dev"] files = [ {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, @@ -4648,7 +4456,6 @@ files = [ {file = "pywin32-310-cp39-cp39-win32.whl", hash = "sha256:851c8d927af0d879221e616ae1f66145253537bbdd321a77e8ef701b443a9a1a"}, {file = "pywin32-310-cp39-cp39-win_amd64.whl", hash = "sha256:96867217335559ac619f00ad70e513c0fcf84b8a3af9fc2bba3b59b97da70475"}, ] -markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\"", dev = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} [[package]] name = "pywin32-ctypes" @@ -4656,8 +4463,6 @@ version = "0.2.3" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, @@ -4669,7 +4474,6 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] 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"}, @@ -4732,7 +4536,6 @@ version = "26.3.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pyzmq-26.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1586944f4736515af5c6d3a5b150c7e8ca2a2d6e46b23057320584d6f2438f4a"}, {file = "pyzmq-26.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa7efc695d1fc9f72d91bf9b6c6fe2d7e1b4193836ec530a98faf7d7a7577a58"}, @@ -4838,7 +4641,6 @@ version = "44.0" description = "readme_renderer is a library for rendering readme descriptions for Warehouse" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151"}, {file = "readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"}, @@ -4858,7 +4660,6 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -4875,7 +4676,6 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -4979,7 +4779,6 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -5001,7 +4800,6 @@ version = "1.0.0" description = "A utility belt for advanced users of python-requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["dev"] files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, @@ -5016,7 +4814,6 @@ version = "2.0.0" description = "Validating URI References per RFC 3986" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, @@ -5031,7 +4828,6 @@ 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"}, @@ -5051,7 +4847,6 @@ version = "0.23.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "rpds_py-0.23.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2a54027554ce9b129fc3d633c92fa33b30de9f08bc61b32c053dc9b537266fed"}, {file = "rpds_py-0.23.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5ef909a37e9738d146519657a1aab4584018746a18f71c692f2f22168ece40c"}, @@ -5164,7 +4959,6 @@ version = "1.4.0" description = "R-Tree spatial index for Python GIS" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "rtree-1.4.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:4d1bebc418101480aabf41767e772dd2155d3b27b1376cccbd93e4509485e091"}, {file = "rtree-1.4.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:997f8c38d5dffa3949ea8adb4c8b291ea5cd4ef5ee69455d642dd171baf9991d"}, @@ -5184,7 +4978,6 @@ version = "0.5.3" description = "" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073"}, {file = "safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21d01c14ff6c415c485616b8b0bf961c46b3b343ca59110d38d744e577f9cce7"}, @@ -5226,7 +5019,6 @@ version = "0.25.2" description = "Image processing in Python" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "scikit_image-0.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d3278f586793176599df6a4cf48cb6beadae35c31e58dc01a98023af3dc31c78"}, {file = "scikit_image-0.25.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5c311069899ce757d7dbf1d03e32acb38bb06153236ae77fcd820fd62044c063"}, @@ -5265,7 +5057,7 @@ tifffile = ">=2022.8.12" [package.extras] build = ["Cython (>=3.0.8)", "build (>=1.2.1)", "meson-python (>=0.16)", "ninja (>=1.11.1.1)", "numpy (>=2.0)", "pythran (>=0.16)", "spin (==0.13)"] data = ["pooch (>=1.6.0)"] -developer = ["ipython", "pre-commit", "tomli ; python_version < \"3.11\""] +developer = ["ipython", "pre-commit", "tomli"] docs = ["PyWavelets (>=1.6)", "dask[array] (>=2023.2.0)", "intersphinx-registry (>=0.2411.14)", "ipykernel", "ipywidgets", "kaleido (==0.2.1)", "matplotlib (>=3.7)", "myst-parser", "numpydoc (>=1.7)", "pandas (>=2.0)", "plotly (>=5.20)", "pooch (>=1.6)", "pydata-sphinx-theme (>=0.16)", "pytest-doctestplus", "scikit-learn (>=1.2)", "seaborn (>=0.11)", "sphinx (>=8.0)", "sphinx-copybutton", "sphinx-gallery[parallel] (>=0.18)", "sphinx_design (>=0.5)", "tifffile (>=2022.8.12)"] optional = ["PyWavelets (>=1.6)", "SimpleITK", "astropy (>=5.0)", "cloudpickle (>=1.1.1)", "dask[array] (>=2023.2.0)", "matplotlib (>=3.7)", "pooch (>=1.6.0)", "pyamg (>=5.2)", "scikit-learn (>=1.2)"] test = ["asv", "numpydoc (>=1.7)", "pooch (>=1.6.0)", "pytest (>=8)", "pytest-cov (>=2.11.0)", "pytest-doctestplus", "pytest-faulthandler", "pytest-localserver"] @@ -5276,7 +5068,6 @@ version = "1.15.2" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9"}, {file = "scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5"}, @@ -5332,7 +5123,7 @@ numpy = ">=1.23.5,<2.5" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "secretstorage" @@ -5340,8 +5131,6 @@ version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "sys_platform == \"linux\"" files = [ {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, @@ -5357,7 +5146,6 @@ version = "2.2.2" description = "A fast and lightweight Python library for splitting text into semantically meaningful chunks." optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "semchunk-2.2.2-py3-none-any.whl", hash = "sha256:94ca19020c013c073abdfd06d79a7c13637b91738335f3b8cdb5655ee7cc94d2"}, {file = "semchunk-2.2.2.tar.gz", hash = "sha256:940e89896e64eeb01de97ba60f51c8c7b96c6a3951dfcf574f25ce2146752f52"}, @@ -5373,7 +5161,6 @@ version = "2.13.0" description = "Python helper for Semantic Versioning (http://semver.org/)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["dev"] files = [ {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, @@ -5385,20 +5172,19 @@ version = "76.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "setuptools-76.0.0-py3-none-any.whl", hash = "sha256:199466a166ff664970d0ee145839f5582cb9bca7a0a3a2e795b6a9cb2308e9c6"}, {file = "setuptools-76.0.0.tar.gz", hash = "sha256:43b4ee60e10b0d0ee98ad11918e114c70701bc6051662a9a675a0496c1a158f4"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] -core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "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) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +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) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "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 ; sys_platform != \"cygwin\"", "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) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] +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 = "shapely" @@ -5406,7 +5192,6 @@ version = "2.0.7" description = "Manipulation and analysis of geometric objects" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "shapely-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:33fb10e50b16113714ae40adccf7670379e9ccf5b7a41d0002046ba2b8f0f691"}, {file = "shapely-2.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f44eda8bd7a4bccb0f281264b34bf3518d8c4c9a8ffe69a1a05dabf6e8461147"}, @@ -5465,7 +5250,6 @@ version = "1.5.4" description = "Tool to Detect Surrounding Shell" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, @@ -5477,7 +5261,6 @@ 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", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -5489,7 +5272,6 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -5501,7 +5283,6 @@ 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"}, @@ -5513,7 +5294,6 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" -groups = ["dev"] 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"}, @@ -5533,7 +5313,6 @@ version = "1.13.1" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, @@ -5551,7 +5330,6 @@ version = "0.9.0" description = "Pretty-print tabular data" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, @@ -5566,7 +5344,6 @@ version = "2025.3.13" description = "Read and write TIFF files" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "tifffile-2025.3.13-py3-none-any.whl", hash = "sha256:10f205b923c04678f744a6d553f6f86c639c9ba6e714f6758d81af0678ba75dc"}, {file = "tifffile-2025.3.13.tar.gz", hash = "sha256:30fcc4584216937b5993d0568452b6fea8e12e61f9afb1a8e967c07c281faa06"}, @@ -5589,7 +5366,6 @@ version = "6.1.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "tokenize_rt-6.1.0-py2.py3-none-any.whl", hash = "sha256:d706141cdec4aa5f358945abe36b911b8cbdc844545da99e811250c0cee9b6fc"}, {file = "tokenize_rt-6.1.0.tar.gz", hash = "sha256:e8ee836616c0877ab7c7b54776d2fefcc3bde714449a206762425ae114b53c86"}, @@ -5601,8 +5377,6 @@ version = "0.19.1" description = "" optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, @@ -5720,8 +5494,6 @@ version = "0.21.1" description = "" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "tokenizers-0.21.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e78e413e9e668ad790a29456e677d9d3aa50a9ad311a40905d6861ba7692cf41"}, {file = "tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:cd51cd0a91ecc801633829fcd1fda9cf8682ed3477c6243b9a095539de4aecf3"}, @@ -5754,7 +5526,6 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["dev"] 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"}, @@ -5796,7 +5567,6 @@ version = "0.13.2" description = "Style preserving TOML library" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, @@ -5808,7 +5578,6 @@ version = "2.6.0" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.9.0" -groups = ["main"] files = [ {file = "torch-2.6.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:6860df13d9911ac158f4c44031609700e1eba07916fff62e21e6ffa0a9e01961"}, {file = "torch-2.6.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c4f103a49830ce4c7561ef4434cc7926e5a5fe4e5eb100c19ab36ea1e2b634ab"}, @@ -5865,7 +5634,6 @@ version = "1.6.3" description = "PyTorch native Metrics" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "torchmetrics-1.6.3-py3-none-any.whl", hash = "sha256:034640d4e1c30b7d3488551b1ce3fc1f363070811e6b97b9cb6b60a9ec15e9f4"}, {file = "torchmetrics-1.6.3.tar.gz", hash = "sha256:be59ffe9e9abf12ac12c3ac4383b2fc7731ad2bf3748ae1b06e8dea34e9f8a65"}, @@ -5881,7 +5649,7 @@ torch = ">=2.0.0" all = ["SciencePlots (>=2.0.0)", "gammatone (>=1.0.0)", "ipadic (>=1.0.0)", "librosa (>=0.10.0)", "matplotlib (>=3.6.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.15.0)", "nltk (>3.8.1)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] audio = ["gammatone (>=1.0.0)", "librosa (>=0.10.0)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "pystoi (>=0.4.0)", "requests (>=2.19.0)", "torchaudio (>=2.0.1)"] detection = ["pycocotools (>2.0.0)", "torchvision (>=0.15.1)"] -dev = ["PyTDC (==0.4.1) ; python_version < \"3.12\"", "SciencePlots (>=2.0.0)", "bert_score (==0.3.13)", "dython (==0.7.9)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.30)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0) ; python_version < \"3.12\"", "mecab-ko-dic (>=1.0.0) ; python_version < \"3.12\"", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.15.0)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.3.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +dev = ["PyTDC (==0.4.1)", "SciencePlots (>=2.0.0)", "bert_score (==0.3.13)", "dython (==0.7.9)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.30)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.15.0)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.3.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] image = ["scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.15.1)"] multimodal = ["piq (<=0.8.0)", "transformers (>=4.42.3)"] text = ["ipadic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>3.8.1)", "regex (>=2021.9.24)", "sentencepiece (>=0.2.0)", "tqdm (<4.68.0)", "transformers (>4.4.0)"] @@ -5894,7 +5662,6 @@ version = "0.21.0" description = "image and video datasets and models for torch deep learning" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "torchvision-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:044ea420b8c6c3162a234cada8e2025b9076fa82504758cd11ec5d0f8cd9fa37"}, {file = "torchvision-0.21.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:b0c0b264b89ab572888244f2e0bad5b7eaf5b696068fc0b93e96f7c3c198953f"}, @@ -5933,7 +5700,6 @@ 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 = ["dev"] 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"}, @@ -5954,7 +5720,6 @@ version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, @@ -5976,7 +5741,6 @@ version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -5992,8 +5756,6 @@ version = "4.42.4" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.8.0" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "transformers-4.42.4-py3-none-any.whl", hash = "sha256:6d59061392d0f1da312af29c962df9017ff3c0108c681a56d1bc981004d16d24"}, {file = "transformers-4.42.4.tar.gz", hash = "sha256:f956e25e24df851f650cb2c158b6f4352dfae9d702f04c113ed24fc36ce7ae2d"}, @@ -6062,8 +5824,6 @@ version = "4.49.0" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.9.0" -groups = ["main"] -markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "transformers-4.49.0-py3-none-any.whl", hash = "sha256:6b4fded1c5fee04d384b1014495b4235a2b53c87503d7d592423c06128cbbe03"}, {file = "transformers-4.49.0.tar.gz", hash = "sha256:7e40e640b5b8dc3f48743f5f5adbdce3660c82baafbd3afdfc04143cdbd2089e"}, @@ -6133,8 +5893,6 @@ version = "3.2.0" description = "A language and compiler for custom Deep Learning operations" optional = false python-versions = "*" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3e54983cd51875855da7c68ec05c05cf8bb08df361b1d5b69e05e40b0c9bd62"}, {file = "triton-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8009a1fb093ee8546495e96731336a33fb8856a38e45bb4ab6affd6dbc3ba220"}, @@ -6154,7 +5912,6 @@ version = "3.8.0" description = "Collection of utilities for publishing packages on PyPI" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, @@ -6178,7 +5935,6 @@ version = "0.12.5" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"}, {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"}, @@ -6196,7 +5952,6 @@ version = "3.1.5.20250306" description = "Typing stubs for openpyxl" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "types_openpyxl-3.1.5.20250306-py3-none-any.whl", hash = "sha256:f7733dac1dcb07c89ff5ffde8452ee8d272be638defed855f4c48b2990ce5aa7"}, {file = "types_openpyxl-3.1.5.20250306.tar.gz", hash = "sha256:aa7ad2425e8020ff46a31633becfe1f3c64114498d964c536199f654b464e6bc"}, @@ -6208,7 +5963,6 @@ version = "2025.1.0.20250204" description = "Typing stubs for pytz" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "types_pytz-2025.1.0.20250204-py3-none-any.whl", hash = "sha256:32ca4a35430e8b94f6603b35beb7f56c32260ddddd4f4bb305fdf8f92358b87e"}, {file = "types_pytz-2025.1.0.20250204.tar.gz", hash = "sha256:00f750132769f1c65a4f7240bc84f13985b4da774bd17dfbe5d9cd442746bd49"}, @@ -6220,7 +5974,6 @@ version = "2.32.0.20250306" description = "Typing stubs for requests" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "types_requests-2.32.0.20250306-py3-none-any.whl", hash = "sha256:25f2cbb5c8710b2022f8bbee7b2b66f319ef14aeea2f35d80f18c9dbf3b60a0b"}, {file = "types_requests-2.32.0.20250306.tar.gz", hash = "sha256:0962352694ec5b2f95fda877ee60a159abdf84a0fc6fdace599f20acb41a03d1"}, @@ -6235,7 +5988,6 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] 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"}, @@ -6247,7 +5999,6 @@ version = "2025.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" -groups = ["main"] files = [ {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, @@ -6259,14 +6010,13 @@ version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] -brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +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)"] @@ -6277,7 +6027,6 @@ version = "20.29.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "virtualenv-20.29.3-py3-none-any.whl", hash = "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170"}, {file = "virtualenv-20.29.3.tar.gz", hash = "sha256:95e39403fcf3940ac45bc717597dba16110b74506131845d9b687d5e73d947ac"}, @@ -6290,7 +6039,7 @@ platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "wcwidth" @@ -6298,7 +6047,6 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -6310,7 +6058,6 @@ version = "0.45.1" description = "A built-package format for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"}, {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"}, @@ -6325,7 +6072,6 @@ version = "4.0.13" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71"}, {file = "widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6"}, @@ -6337,7 +6083,6 @@ version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -6426,7 +6171,6 @@ version = "3.2.2" description = "A Python module for creating Excel XLSX files." optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "XlsxWriter-3.2.2-py3-none-any.whl", hash = "sha256:272ce861e7fa5e82a4a6ebc24511f2cb952fde3461f6c6e1a1e81d3272db1471"}, {file = "xlsxwriter-3.2.2.tar.gz", hash = "sha256:befc7f92578a85fed261639fb6cde1fd51b79c5e854040847dde59d4317077dc"}, @@ -6438,7 +6182,6 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -6450,7 +6193,6 @@ version = "3.5.0" description = "Python binding for xxHash" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "xxhash-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ece616532c499ee9afbb83078b1b952beffef121d989841f7f4b3dc5ac0fd212"}, {file = "xxhash-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3171f693dbc2cef6477054a665dc255d996646b4023fe56cb4db80e26f4cc520"}, @@ -6583,7 +6325,6 @@ version = "1.18.3" description = "Yet another URL library" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, @@ -6680,21 +6421,20 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] [metadata] -lock-version = "2.1" +lock-version = "2.0" python-versions = "^3.10" -content-hash = "cea5cf98c361ed0e3670a65a3e4adf42bbd8238bcd280e482804c8325c6c7728" +content-hash = "da4b4c6218ec1304a9bbb51f9735660ebb0314126334a2eaa2da789bdfbef25e" diff --git a/pyproject.toml b/pyproject.toml index 5266ac3f..092c3da0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ packages = [{include = "docling_eval"}] # actual dependencies: ###################### python = "^3.10" -docling-core = "^2.20.0" +docling-core = "^2.23.3" pydantic = "^2.0.0" lxml = "^5.3.0" datasets = "^3.2.0" From 51260fd9fb70cf9405d9e5c674c848b0b04e034f Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Thu, 20 Mar 2025 10:27:51 +0100 Subject: [PATCH 22/81] feat: Introduce new design for Evaluators based on BaseEvaluator that accept external predictions. And utility adapters. Signed-off-by: Nikos Livathinos --- docling_eval/benchmarks/constants.py | 5 + docling_eval/evaluators/adapters.py | 65 +++++++++ docling_eval/evaluators/base_evaluator.py | 47 ++++++ docling_eval/evaluators/layout_evaluator.py | 32 +++-- .../evaluators/markdown_text_evaluator.py | 135 +++++++++++------- docling_eval/evaluators/table_evaluator.py | 60 +++++--- tests/test_dataset_builder.py | 3 + 7 files changed, 260 insertions(+), 87 deletions(-) create mode 100644 docling_eval/evaluators/adapters.py create mode 100644 docling_eval/evaluators/base_evaluator.py diff --git a/docling_eval/benchmarks/constants.py b/docling_eval/benchmarks/constants.py index e396487f..5bc86550 100644 --- a/docling_eval/benchmarks/constants.py +++ b/docling_eval/benchmarks/constants.py @@ -73,3 +73,8 @@ class BenchMarkNames(str, Enum): class ConverterTypes(str, Enum): DOCLING = "Docling" SMOL_DOCLING = "SmolDocling" + + +class PredictionFormats(str, Enum): + DOCLING_DOCUMENT = "DoclingDocument" + MARKDOWN = "MarkDown" diff --git a/docling_eval/evaluators/adapters.py b/docling_eval/evaluators/adapters.py new file mode 100644 index 00000000..81d6e47f --- /dev/null +++ b/docling_eval/evaluators/adapters.py @@ -0,0 +1,65 @@ +import glob +from pathlib import Path +from typing import Dict + +from docling_core.types.doc.document import ( + DoclingDocument, + DocTagsDocument, + DocTagsPage, +) + + +class TextFilesAdapter: + def __init__(self, extension: str): + r""" + The file extension to load (e.g. "md") + """ + self._extension = extension + + def __call__(self, input_path: Path) -> Dict[str, str]: + r""" + Read text files from a directory where each filename is . + Produce a Dict[str, str] where the key is the doc_id and key is the file content + """ + predictions: Dict[str, str] = {} + + fns = glob.glob(str(input_path / f"*.{self._extension}")) + for fn in fns: + doc_id = Path(fn).stem + with open(fn, "r") as fd: + predictions[doc_id] = fd.read() + + return predictions + + +class DocTagsFilesToDoclingDocumentAdapter: + def __init__(self): + r""" """ + self._doctag_extension = "dt" + + def __call__(self, input_path: Path) -> Dict[str, DoclingDocument]: + r""" + Read doctag files from the given directory and build DoclingDocument objects + The doctag files must follow the naming convention . + """ + predictions: Dict[str, DoclingDocument] = {} + + fns = glob.glob(str(input_path / f"*.{self._doctag_extension}")) + for fn in fns: + doc_id = Path(fn).stem + with open(fn, "r") as fd: + doctags = fd.read() + doc = self._doctags_to_doc(doc_id, doctags) + predictions[doc_id] = doc + + return predictions + + def _doctags_to_doc(self, doc_id, doctags: str) -> DoclingDocument: + r""" + Convert string with doctags to DoclingDocument + """ + doctags_page = DocTagsPage(tokens=doctags) + doctags_doc = DocTagsDocument(pages=[doctags_page]) + doc = DoclingDocument(name=doc_id) + doc.load_from_doctags(doctags_doc) + return doc diff --git a/docling_eval/evaluators/base_evaluator.py b/docling_eval/evaluators/base_evaluator.py new file mode 100644 index 00000000..2d2b0d95 --- /dev/null +++ b/docling_eval/evaluators/base_evaluator.py @@ -0,0 +1,47 @@ +import logging +from pathlib import Path +from typing import Any, Dict, List, Optional + +from pydantic import BaseModel + +from docling_eval.benchmarks.constants import PredictionFormats +from docling_eval.evaluators.stats import DatasetStatistics + +_log = logging.getLogger(__name__) + + +class DatasetEvaluation(BaseModel): + pass + + +class BaseEvaluator: + r""" + Base class for all evaluators + """ + + def __init__(self, intermediate_evaluations_path: Optional[Path] = None): + r""" + Parameters + ---------- + intermediate_evaluations_path: When True the evalution per example will be saved in a file + """ + self._intermediate_evaluations_path = intermediate_evaluations_path + + def __call__( + self, + ds_path: Path, + split: str = "test", + ext_predictions: Optional[ + Dict[str, Any] + ] = None, # Optionally provided external predictions + ) -> DatasetEvaluation: + r""" + Perform the evaluation + """ + return None # type: ignore + + def supported_prediction_formats(self) -> List[PredictionFormats]: + r""" + Return the supported formats for predictions + """ + return [PredictionFormats.DOCLING_DOCUMENT] diff --git a/docling_eval/evaluators/layout_evaluator.py b/docling_eval/evaluators/layout_evaluator.py index 4b8828ff..7fd83824 100644 --- a/docling_eval/evaluators/layout_evaluator.py +++ b/docling_eval/evaluators/layout_evaluator.py @@ -15,7 +15,8 @@ from torchmetrics.detection.mean_ap import MeanAveragePrecision from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import BenchMarkColumns +from docling_eval.benchmarks.constants import BenchMarkColumns, PredictionFormats +from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation from docling_eval.evaluators.stats import DatasetStatistics, compute_stats _log = logging.getLogger(__name__) @@ -51,7 +52,7 @@ class ImageLayoutEvaluation(BaseModel): avg_weighted_label_matched_iou_95: float -class DatasetLayoutEvaluation(BaseModel): +class DatasetLayoutEvaluation(DatasetEvaluation): true_labels: Dict[str, int] pred_labels: Dict[str, int] mAP: float # The mean AP[0.5:0.05:0.95] across all classes @@ -84,11 +85,14 @@ def to_table(self) -> Tuple[List[List[str]], List[str]]: return table, headers -class LayoutEvaluator: - +class LayoutEvaluator(BaseEvaluator): def __init__( - self, label_mapping: Optional[Dict[DocItemLabel, Optional[DocItemLabel]]] = None - ) -> None: + self, + label_mapping: Optional[Dict[DocItemLabel, Optional[DocItemLabel]]] = None, + intermediate_evaluations_path: Optional[Path] = None, + ): + super().__init__(intermediate_evaluations_path=intermediate_evaluations_path) + self.filter_labels = [] self.label_names = {} self.label_mapping = label_mapping or {v: v for v in DocItemLabel} @@ -101,7 +105,7 @@ def __call__( self, ds_path: Path, split: str = "test", - pred_dict: Optional[Dict[str, DoclingDocument]] = None, + ext_predictions: Optional[Dict[str, DoclingDocument]] = None, ) -> DatasetLayoutEvaluation: logging.info("Loading the split '%s' from: '%s'", split, ds_path) @@ -116,7 +120,7 @@ def __call__( ds_selection: Dataset = ds[split] true_labels, pred_labels, intersection_labels = self._find_intersecting_labels( - ds_selection, pred_dict=pred_dict + ds_selection, pred_dict=ext_predictions ) intersection_labels_str = "\n" + "\n".join(sorted(intersection_labels)) logging.info(f"Intersection labels: {intersection_labels_str}") @@ -136,14 +140,14 @@ def __call__( true_doc_dict = data[BenchMarkColumns.GROUNDTRUTH] true_doc = DoclingDocument.model_validate_json(true_doc_dict) - if pred_dict is None: + if ext_predictions is None: pred_doc_dict = data[BenchMarkColumns.PREDICTION] pred_doc = DoclingDocument.model_validate_json(pred_doc_dict) else: - if doc_id not in pred_dict: + if doc_id not in ext_predictions: _log.error("Missing pred_doc from dict argument for %s", doc_id) continue - pred_doc = pred_dict[doc_id] + pred_doc = ext_predictions[doc_id] gts, preds = self._extract_layout_data( doc_id=doc_id, @@ -557,3 +561,9 @@ def _extract_layout_data( # print(pred_tl_bboxes_str) return ground_truths, predictions + + def supported_prediction_formats(self) -> List[PredictionFormats]: + r""" + Return the supported formats for predictions + """ + return [PredictionFormats.DOCLING_DOCUMENT] diff --git a/docling_eval/evaluators/markdown_text_evaluator.py b/docling_eval/evaluators/markdown_text_evaluator.py index c5364765..bb0573e2 100644 --- a/docling_eval/evaluators/markdown_text_evaluator.py +++ b/docling_eval/evaluators/markdown_text_evaluator.py @@ -1,6 +1,6 @@ import logging from pathlib import Path -from typing import List, Optional, Set +from typing import Any, List, Optional, Set, Union import evaluate import nltk @@ -14,7 +14,11 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import BenchMarkColumns # type: ignore +from docling_eval.benchmarks.constants import ( # type: ignore + BenchMarkColumns, + PredictionFormats, +) +from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation from docling_eval.evaluators.stats import DatasetStatistics, compute_stats _log = logging.getLogger(__name__) @@ -26,8 +30,6 @@ class PageMarkdownEvaluation(BaseModel): true_md: str pred_md: str bleu: float - - # NLTK metrics f1_score: float precision: float recall: float @@ -35,11 +37,10 @@ class PageMarkdownEvaluation(BaseModel): meteor: float -class DatasetMarkdownEvaluation(BaseModel): +class DatasetMarkdownEvaluation(DatasetEvaluation): evaluations: List[PageMarkdownEvaluation] - bleu_stats: DatasetStatistics - # NLTK metrics + bleu_stats: DatasetStatistics f1_score_stats: DatasetStatistics precision_stats: DatasetStatistics recall_stats: DatasetStatistics @@ -47,28 +48,57 @@ class DatasetMarkdownEvaluation(BaseModel): meteor_stats: DatasetStatistics -class MarkdownTextEvaluator: - def __init__(self): +class MarkdownTextEvaluator(BaseEvaluator): + def __init__(self, intermediate_evaluations_path: Optional[Path] = None): + r""" """ + super().__init__(intermediate_evaluations_path=intermediate_evaluations_path) + self._bleu_eval = evaluate.load("bleu") # Download the NLTK data nltk.download("popular", quiet=True) nltk.download("punkt_tab", quiet=True) + # Select which DocItemLabels should be exported to markdown + self._labels: Set[DocItemLabel] = set( + [ + DocItemLabel.CAPTION, + DocItemLabel.FOOTNOTE, + DocItemLabel.FORMULA, + DocItemLabel.LIST_ITEM, + DocItemLabel.PAGE_FOOTER, + DocItemLabel.PAGE_HEADER, + DocItemLabel.PICTURE, + DocItemLabel.SECTION_HEADER, + # DocItemLabel.TABLE, + DocItemLabel.TEXT, + DocItemLabel.TITLE, + DocItemLabel.DOCUMENT_INDEX, + DocItemLabel.CODE, + DocItemLabel.CHECKBOX_SELECTED, + DocItemLabel.CHECKBOX_UNSELECTED, + DocItemLabel.FORM, + DocItemLabel.KEY_VALUE_REGION, + DocItemLabel.PARAGRAPH, + DocItemLabel.REFERENCE, + ] + ) + def __call__( self, ds_path: Path, split: str = "test", - pred_md_dict: Optional[dict[str, str]] = None, + ext_predictions: Optional[dict[str, Union[DoclingDocument, str]]] = None, ) -> DatasetMarkdownEvaluation: r""" Parameters ---------- ds_path: Path to load the parquet files of the dataset split: Split of the dataset to load - pred_md_dict: Optionally provide the prediction markdown input content. - The dict is indexed by the DOC_ID and the value is the markdown content. - If such dict is provided, it will be used to provide the markdown content. + ext_predictions: Optionally provide the prediction markdown input content. + If such dict is provided, it will be used to provide the markdown content. + The dict is indexed by the DOC_ID and the value is either the markdown + content or a DoclingDocument. """ parquet_files = str(ds_path / split / "*.parquet") ds = load_dataset("parquet", data_files={split: parquet_files}) @@ -104,52 +134,18 @@ def __call__( pred_doc_dict ) - # Select which DocItemLabels should be exported to markdown - labels: Set[DocItemLabel] = set( - [ - DocItemLabel.CAPTION, - DocItemLabel.FOOTNOTE, - DocItemLabel.FORMULA, - DocItemLabel.LIST_ITEM, - DocItemLabel.PAGE_FOOTER, - DocItemLabel.PAGE_HEADER, - DocItemLabel.PICTURE, - DocItemLabel.SECTION_HEADER, - # DocItemLabel.TABLE, - DocItemLabel.TEXT, - DocItemLabel.TITLE, - DocItemLabel.DOCUMENT_INDEX, - DocItemLabel.CODE, - DocItemLabel.CHECKBOX_SELECTED, - DocItemLabel.CHECKBOX_UNSELECTED, - DocItemLabel.FORM, - DocItemLabel.KEY_VALUE_REGION, - DocItemLabel.PARAGRAPH, - DocItemLabel.REFERENCE, - ] - ) + true_md = self._docdoc_to_md(true_doc) - true_md = true_doc.export_to_markdown( - image_mode=ImageRefMode.PLACEHOLDER, - image_placeholder="", - labels=labels, - included_content_layers={ContentLayer.BODY, ContentLayer.FURNITURE}, - ) # Get the predicted markdown content either from the external iterator or from dataset - if pred_md_dict is not None: - if doc_id not in pred_md_dict: + if ext_predictions is not None: + if doc_id not in ext_predictions: _log.error( "The provided pred_md does not contain the doc_id: %s", doc_id ) continue - pred_md = pred_md_dict[doc_id] + pred_md = self._md_from_external(ext_predictions[doc_id]) else: - pred_md = pred_doc.export_to_markdown( - image_mode=ImageRefMode.PLACEHOLDER, - image_placeholder="", - labels=labels, - included_content_layers={ContentLayer.BODY, ContentLayer.FURNITURE}, - ) + pred_md = self._docdoc_to_md(pred_doc) bleu = 0.0 if true_md != "" and pred_md != "": @@ -157,7 +153,6 @@ def __call__( ntlk_scores = self._compute_nltk_scores(true_md, pred_md) # Collect metrics across pages - # bleus.append(bleu) ds_metrics["bleu"].append(bleu) for score_name, score in ntlk_scores.items(): ds_metrics[score_name].append(score) @@ -174,7 +169,7 @@ def __call__( meteor=ntlk_scores["meteor"], ) evaluations.append(md_evaluation) - # bleu_stats = compute_stats(bleus) + ds_md_evalutions = DatasetMarkdownEvaluation( evaluations=evaluations, bleu_stats=compute_stats(ds_metrics["bleu"]), @@ -223,3 +218,35 @@ def _compute_nltk_scores(self, true_txt: str, pred_txt: str) -> dict[str, float] "meteor": meteor, } return metrics + + def supported_prediction_formats(self) -> List[PredictionFormats]: + r""" """ + return [ + PredictionFormats.DOCLING_DOCUMENT, + PredictionFormats.MARKDOWN, + ] + + def _docdoc_to_md(self, doc: DoclingDocument) -> str: + r""" + Export DoclingDocument to markdown + """ + md = doc.export_to_markdown( + image_mode=ImageRefMode.PLACEHOLDER, + image_placeholder="", + labels=self._labels, + included_content_layers={ContentLayer.BODY, ContentLayer.FURNITURE}, + ) + return md + + def _md_from_external(self, ext_pred: Any) -> str: + r""" + Get an external prediction and based on its type return the markdown prediction + """ + if isinstance(ext_pred, str): + return ext_pred + elif isinstance(ext_pred, DoclingDocument): + return self._docdoc_to_md(ext_pred) + else: + raise RuntimeError( + f"Unsupported external prediction of type: {type(ext_pred)}" + ) diff --git a/docling_eval/evaluators/table_evaluator.py b/docling_eval/evaluators/table_evaluator.py index b7a7c6e3..4a69bd9d 100644 --- a/docling_eval/evaluators/table_evaluator.py +++ b/docling_eval/evaluators/table_evaluator.py @@ -3,7 +3,7 @@ import logging import random from pathlib import Path -from typing import Dict, Optional +from typing import Dict, List, Optional import matplotlib.pyplot as plt from datasets import Dataset, load_dataset @@ -13,7 +13,8 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import BenchMarkColumns +from docling_eval.benchmarks.constants import BenchMarkColumns, PredictionFormats +from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation from docling_eval.evaluators.stats import DatasetStatistics, compute_stats from docling_eval.evaluators.teds import TEDScorer @@ -33,7 +34,7 @@ class TableEvaluation(BaseModel): pred_nrows: int = -1 -class DatasetTableEvaluation(BaseModel): +class DatasetTableEvaluation(DatasetEvaluation): evaluations: list[TableEvaluation] TEDS: DatasetStatistics @@ -46,12 +47,12 @@ def save_histogram_delta_row_col(self, figname: Path): delta_row = {i: 0 for i in range(-10, 11)} delta_col = {i: 0 for i in range(-10, 11)} - for _ in self.evaluations: - if _.true_nrows - _.pred_nrows in delta_row: - delta_row[_.true_nrows - _.pred_nrows] += 1 + for evaluation in self.evaluations: + if evaluation.true_nrows - evaluation.pred_nrows in delta_row: + delta_row[evaluation.true_nrows - evaluation.pred_nrows] += 1 - if _.true_ncols - _.pred_ncols in delta_col: - delta_col[_.true_ncols - _.pred_ncols] += 1 + if evaluation.true_ncols - evaluation.pred_ncols in delta_col: + delta_col[evaluation.true_ncols - evaluation.pred_ncols] += 1 x_row, y_row = [], [] for k, v in delta_row.items(): @@ -93,12 +94,19 @@ def is_complex_table(table: TableItem) -> bool: return False -class TableEvaluator: +class TableEvaluator(BaseEvaluator): r""" Evaluate table predictions from HF dataset with the columns: """ - def __init__(self) -> None: + def __init__( + self, + intermediate_evaluations_path: Optional[Path] = None, + structure_only: bool = False, + ): + super().__init__(intermediate_evaluations_path=intermediate_evaluations_path) + + self._structure_only = structure_only self._teds_scorer = TEDScorer() self._stopwords = ["", "", "", "", "", ""] @@ -106,9 +114,7 @@ def __call__( self, ds_path: Path, split: str = "test", - structure_only: bool = False, - pred_dict: Optional[Dict[str, DoclingDocument]] = None, - intermediate_results_dir: Optional[Path] = None, + ext_predictions: Optional[Dict[str, DoclingDocument]] = None, ) -> DatasetTableEvaluation: r""" Load a dataset in HF format. Expected columns with DoclingDocuments @@ -141,19 +147,19 @@ def __call__( gt_doc_dict = data[BenchMarkColumns.GROUNDTRUTH] gt_doc = DoclingDocument.model_validate_json(gt_doc_dict) - if pred_dict is None: + if ext_predictions is None: pred_doc_dict = data[BenchMarkColumns.PREDICTION] pred_doc = DoclingDocument.model_validate_json(pred_doc_dict) else: if doc_id.endswith(".png") or doc_id.endswith(".jpg"): doc_id = doc_id[:-4] - if doc_id not in pred_dict: + if doc_id not in ext_predictions: _log.error("Missing pred_doc from dict argument for %s", doc_id) continue - pred_doc = pred_dict[doc_id] + pred_doc = ext_predictions[doc_id] try: - if not structure_only: + if not self._structure_only: results = self._evaluate_tables_in_documents( doc_id=data[BenchMarkColumns.DOC_ID], true_doc=gt_doc, @@ -162,9 +168,13 @@ def __call__( ) table_evaluations.extend(results) - if intermediate_results_dir: + if self._intermediate_evaluations_path: self._save_table_evalutions( - False, i, doc_id, results, intermediate_results_dir + False, + i, + doc_id, + results, + self._intermediate_evaluations_path, ) results = self._evaluate_tables_in_documents( @@ -174,9 +184,9 @@ def __call__( structure_only=True, ) table_struct_evaluations.extend(results) - if intermediate_results_dir: + if self._intermediate_evaluations_path: self._save_table_evalutions( - True, i, doc_id, results, intermediate_results_dir + True, i, doc_id, results, self._intermediate_evaluations_path ) except Exception as ex: evaluation_errors += 1 @@ -191,7 +201,7 @@ def __call__( teds_simple = [] teds_complex = [] teds_all = [] - if not structure_only: + if not self._structure_only: for te in table_evaluations: teds_all.append(te.TEDS) @@ -301,3 +311,9 @@ def _save_table_evalutions( with open(evaluation_fn, "w") as fd: json.dump(evals, fd) + + def supported_prediction_formats(self) -> List[PredictionFormats]: + r""" + Return the supported formats for predictions + """ + return [PredictionFormats.DOCLING_DOCUMENT] diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 209b751e..62964f94 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -27,6 +27,9 @@ OmniDocBenchDatasetBuilder, ) from docling_eval_next.dataset_builders.xfund_builder import XFUNDDatasetBuilder +from docling_eval_next.dataset_builders.omnidocbench_builder import ( + OmniDocBenchDatasetBuilder, +) from docling_eval_next.prediction_providers.prediction_provider import ( DoclingPredictionProvider, NullPredictionProvider, From 68126564de34297f4729ae311b80ee4b6bee3706 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Mon, 24 Mar 2025 13:48:25 +0100 Subject: [PATCH 23/81] Factor PredictionProvider out of dataset builder, many fixes on DatasetRecord Signed-off-by: Christoph Auer --- .../datamodels/dataset_record.py | 175 ++++++++++++++---- .../dataset_builders/dataset_builder.py | 44 ++--- .../dataset_builders/doclaynet_v1_builder.py | 50 ++--- .../dataset_builders/dpbench_builder.py | 28 +-- .../dataset_builders/funsd_builder.py | 8 +- .../dataset_builders/omnidocbench_builder.py | 28 +-- .../dataset_builders/xfund_builder.py | 8 +- .../prediction_provider.py | 94 +++++++++- tests/test_dataset_builder.py | 78 +++++--- 9 files changed, 361 insertions(+), 152 deletions(-) diff --git a/docling_eval_next/datamodels/dataset_record.py b/docling_eval_next/datamodels/dataset_record.py index df96edbc..64b1943e 100644 --- a/docling_eval_next/datamodels/dataset_record.py +++ b/docling_eval_next/datamodels/dataset_record.py @@ -1,4 +1,5 @@ import json +from io import BytesIO from pathlib import Path from typing import Any, List, Optional, Union @@ -15,21 +16,19 @@ from docling_eval.benchmarks.constants import EvaluationModality -class DatasetRecord(BaseModel): - predictor_info: dict = Field(alias="predictor_info", default={}) - status: ConversionStatus = Field(alias="status", default=ConversionStatus.PENDING) +class DatasetRecord( + BaseModel +): # TODO make predictionrecord class, factor prediction-related fields there. doc_id: str = Field(alias="document_id") doc_path: Optional[Path] = Field(alias="document_filepath", default=None) doc_hash: Optional[str] = Field(alias="document_filehash") ground_truth_doc: DoclingDocument = Field(alias="GroundTruthDocument") - predicted_doc: Optional[DoclingDocument] = Field( - alias="PredictedDocument", default=None - ) original: Optional[Union[DocumentStream | Path]] = Field( alias="BinaryDocument", default=None ) + # TODO add optional columns to store the SegmentedPage, both for GT and prediction ground_truth_page_images: List[PIL.Image.Image] = Field( alias="GroundTruthPageImages", default=[] @@ -38,13 +37,6 @@ class DatasetRecord(BaseModel): alias="GroundTruthPictures", default=[] ) - predicted_page_images: List[PIL.Image.Image] = Field( - alias="GroundTruthPageImages", default=[] - ) - predicted_pictures: List[PIL.Image.Image] = Field( - alias="GroundTruthPageImages", default=[] - ) - mime_type: str = Field(default="") modalities: List[EvaluationModality] = Field(default=[]) @@ -58,8 +50,6 @@ def get_field_alias(cls, field_name: str) -> str: def features(cls): return Features( { - cls.get_field_alias("predictor_info"): Value("string"), - cls.get_field_alias("status"): Value("string"), cls.get_field_alias("doc_id"): Value("string"), cls.get_field_alias("doc_path"): Value("string"), cls.get_field_alias("doc_hash"): Value("string"), @@ -70,18 +60,18 @@ def features(cls): cls.get_field_alias("ground_truth_page_images"): Sequence( Features_Image() ), - cls.get_field_alias("predicted_doc"): Value("string"), - cls.get_field_alias("predicted_pictures"): Sequence(Features_Image()), - cls.get_field_alias("predicted_page_images"): Sequence( - Features_Image() - ), cls.get_field_alias("original"): Value("string"), cls.get_field_alias("mime_type"): Value("string"), cls.get_field_alias("modalities"): Sequence(Value("string")), } ) - def _extract_images(self, document: DoclingDocument): + def _extract_images( + self, + document: DoclingDocument, + pictures_field_prefix: str, + pages_field_prefix: str, + ): pictures = [] page_images = [] @@ -92,9 +82,7 @@ def _extract_images(self, document: DoclingDocument): # img = picture.image.pil_image # pictures.append(to_pil(picture.image.uri)) pictures.append(picture.image.pil_image) - picture.image.uri = Path( - f"{self.get_field_alias('predicted_pictures')}/{img_no}" - ) + picture.image.uri = Path(f"{pictures_field_prefix}/{img_no}") # Save page images for page_no, page in document.pages.items(): @@ -102,16 +90,12 @@ def _extract_images(self, document: DoclingDocument): # img = page.image.pil_image # img.show() page_images.append(page.image.pil_image) - page.image.uri = Path( - f"{self.get_field_alias('predicted_page_images')}/{page_no}" - ) + page.image.uri = Path(f"{pages_field_prefix}/{page_no}") return pictures, page_images def as_record_dict(self): record = { - self.get_field_alias("predictor_info"): json.dumps(self.predictor_info), - self.get_field_alias("status"): str(self.status), self.get_field_alias("doc_id"): self.doc_id, self.get_field_alias("doc_path"): str(self.doc_path), self.get_field_alias("doc_hash"): self.doc_hash, @@ -130,39 +114,148 @@ def as_record_dict(self): record.update({self.get_field_alias("original"): f.read()}) elif isinstance(self.original, DocumentStream): record.update( - { - self.get_field_alias("original"): None - } # FIXME: reading from closed I/O in self.original.stream.read()} + {self.get_field_alias("original"): self.original.stream.read()} ) else: record.update({self.get_field_alias("original"): None}) + return record + + @model_validator(mode="after") + def validate_images(self) -> "DatasetRecord": + if not len(self.ground_truth_pictures) and not len( + self.ground_truth_page_images + ): + pictures, page_images = self._extract_images( + self.ground_truth_doc, + pictures_field_prefix=self.get_field_alias("ground_truth_pictures"), + pages_field_prefix=self.get_field_alias("ground_truth_page_images"), + ) + + self.ground_truth_page_images = page_images + self.ground_truth_pictures = pictures + + return self + + @model_validator(mode="before") + @classmethod + def validate_record_dict(cls, data: dict): + gt_doc_alias = cls.get_field_alias("ground_truth_doc") + if gt_doc_alias in data and isinstance(data[gt_doc_alias], str): + data[gt_doc_alias] = json.loads(data[gt_doc_alias]) + + gt_page_img_alias = cls.get_field_alias("ground_truth_page_images") + if gt_page_img_alias in data: + for ix, item in enumerate(data[gt_page_img_alias]): + if isinstance(item, dict): + data[gt_page_img_alias][ix] = Features_Image().decode_example(item) + + gt_pic_img_alias = cls.get_field_alias("ground_truth_pictures") + if gt_pic_img_alias in data: + for ix, item in enumerate(data[gt_pic_img_alias]): + if isinstance(item, dict): + data[gt_pic_img_alias][ix] = Features_Image().decode_example(item) + + gt_binary = cls.get_field_alias("original") + if gt_binary in data and isinstance(data[gt_binary], bytes): + data[gt_binary] = DocumentStream( + name="file", stream=BytesIO(data[gt_binary]) + ) + + return data + + +class DatasetRecordWithPrediction(DatasetRecord): + predictor_info: dict = Field(alias="predictor_info", default={}) + status: ConversionStatus = Field(alias="status", default=ConversionStatus.PENDING) + + predicted_doc: Optional[DoclingDocument] = Field( + alias="PredictedDocument", default=None + ) + original_prediction: Optional[Any] = None + prediction_format: Any # some enum type + + predicted_page_images: List[PIL.Image.Image] = Field( + alias="GroundTruthPageImages", default=[] + ) + predicted_pictures: List[PIL.Image.Image] = Field( + alias="GroundTruthPageImages", default=[] + ) + + model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True) + + @classmethod + def features(cls): + return { + cls.get_field_alias("predictor_info"): Value("string"), + cls.get_field_alias("status"): Value("string"), + cls.get_field_alias("doc_id"): Value("string"), + cls.get_field_alias("doc_path"): Value("string"), + cls.get_field_alias("doc_hash"): Value("string"), + cls.get_field_alias("ground_truth_doc"): Value("string"), + cls.get_field_alias("ground_truth_pictures"): Sequence(Features_Image()), + cls.get_field_alias("ground_truth_page_images"): Sequence(Features_Image()), + cls.get_field_alias("predicted_doc"): Value("string"), + cls.get_field_alias("predicted_pictures"): Sequence(Features_Image()), + cls.get_field_alias("predicted_page_images"): Sequence(Features_Image()), + cls.get_field_alias("original"): Value("string"), + cls.get_field_alias("mime_type"): Value("string"), + cls.get_field_alias("modalities"): Sequence(Value("string")), + } + + def as_record_dict(self): + record = super().as_record_dict() + if self.predicted_doc is not None: record.update( { self.get_field_alias("predicted_doc"): json.dumps( self.predicted_doc.export_to_dict() ), + # self.get_field_alias("original_prediction"): ( + # self.original_prediction + # ), } ) return record @model_validator(mode="after") - def validate_model(self) -> "DatasetRecord": + def validate_images(self) -> "DatasetRecordWithPrediction": + # super().validate_images() + if self.predicted_doc is not None: if not len(self.predicted_pictures) and not len(self.predicted_page_images): - pictures, page_images = self._extract_images(self.predicted_doc) + pictures, page_images = self._extract_images( + self.predicted_doc, + pictures_field_prefix=self.get_field_alias("predicted_pictures"), + pages_field_prefix=self.get_field_alias("predicted_page_images"), + ) self.predicted_page_images = page_images self.predicted_pictures = pictures - if not len(self.ground_truth_pictures) and not len( - self.ground_truth_page_images - ): - pictures, page_images = self._extract_images(self.ground_truth_doc) + return self - self.ground_truth_page_images = page_images - self.ground_truth_pictures = pictures + @model_validator(mode="before") + @classmethod + def validate_prediction_record_dict(cls, data: dict): + pred_doc_alias = cls.get_field_alias("predicted_doc") + if pred_doc_alias in data and isinstance(data[pred_doc_alias], str): + data[pred_doc_alias] = json.loads(data[pred_doc_alias]) - return self + pred_page_img_alias = cls.get_field_alias("predicted_page_images") + if pred_page_img_alias in data: + for ix, item in enumerate(data[pred_page_img_alias]): + if isinstance(item, dict): + data[pred_page_img_alias][ix] = Features_Image().decode_example( + item + ) + + pred_pic_img_alias = cls.get_field_alias("predicted_pictures") + if pred_pic_img_alias in data: + for ix, item in enumerate(data[pred_pic_img_alias]): + if isinstance(item, dict): + data[pred_pic_img_alias][ix] = Features_Image().decode_example(item) + + return data diff --git a/docling_eval_next/dataset_builders/dataset_builder.py b/docling_eval_next/dataset_builders/dataset_builder.py index 29b141cd..65df3cc1 100644 --- a/docling_eval_next/dataset_builders/dataset_builder.py +++ b/docling_eval_next/dataset_builders/dataset_builder.py @@ -33,12 +33,12 @@ def __init__( self, name: str, dataset_source: Union[HFSource, S3Source, Path], - prediction_provider: BasePredictionProvider, + # prediction_provider: BasePredictionProvider, target: Path, ): self.name = name self.target: Path = target - self.prediction_provider = prediction_provider + # self.prediction_provider = prediction_provider self.dataset_source = dataset_source self.dataset_local_path: Optional[Path] = None # TBD @@ -79,24 +79,24 @@ def retrieve_input_dataset(self) -> Path: def iterate(self) -> Iterable[DatasetRecord]: pass - def update_prediction(self, record: DatasetRecord): - # This might need customization depending on the input the dataset has. - # The default implementation assumes that there is an original file in binary format which is accepted. - input_data = record.original - - if not isinstance(input_data, DocumentStream): - if isinstance(input_data, Path): - input_data = DocumentStream( - name=input_data.name, stream=BytesIO(input_data.open("rb").read()) - ) - - pred_doc = self.prediction_provider.predict( - record.ground_truth_doc, stream=input_data - ) - - record.predicted_doc = pred_doc - - record.validate_model() # type: ignore + # def update_prediction(self, record: DatasetRecord): + # # This might need customization depending on the input the dataset has. + # # The default implementation assumes that there is an original file in binary format which is accepted. + # input_data = record.original + # + # if not isinstance(input_data, DocumentStream): + # if isinstance(input_data, Path): + # input_data = DocumentStream( + # name=input_data.name, stream=BytesIO(input_data.open("rb").read()) + # ) + # + # pred_doc = self.prediction_provider.predict( + # record.ground_truth_doc, stream=input_data + # ) + # + # record.predicted_doc = pred_doc + # + # record.validate_model() # type: ignore def save_to_disk(self, chunk_size: int = 80, max_num_chunks: int = sys.maxsize): if not self.retrieved: @@ -111,7 +111,9 @@ def save_to_disk(self, chunk_size: int = 80, max_num_chunks: int = sys.maxsize): chunk_count = 0 for record_chunk in chunkify(self.iterate(), chunk_size): record_chunk = [r.as_record_dict() for r in record_chunk] - save_shard_to_disk(items=record_chunk, dataset_path=test_dir) + save_shard_to_disk( + items=record_chunk, dataset_path=test_dir, shard_id=chunk_count + ) count += len(record_chunk) chunk_count += 1 diff --git a/docling_eval_next/dataset_builders/doclaynet_v1_builder.py b/docling_eval_next/dataset_builders/doclaynet_v1_builder.py index 9928bf2b..94d71280 100644 --- a/docling_eval_next/dataset_builders/doclaynet_v1_builder.py +++ b/docling_eval_next/dataset_builders/doclaynet_v1_builder.py @@ -124,7 +124,7 @@ class DocLayNetV1DatasetBuilder(BaseEvaluationDatasetBuilder): def __init__( self, - prediction_provider: BasePredictionProvider, + # prediction_provider: BasePredictionProvider, target: Path, do_visualization: bool = True, split: str = "test", @@ -134,7 +134,7 @@ def __init__( super().__init__( name="DocLayNetV1: end-to-end", dataset_source=HFSource(repo_id="ds4sd/DocLayNet-v1.2"), - prediction_provider=prediction_provider, + # prediction_provider=prediction_provider, target=target, ) self.do_visualization = do_visualization @@ -349,7 +349,7 @@ def iterate(self) -> Iterable[DatasetRecord]: # Create dataset record record = DatasetRecord( - predictor_info=self.prediction_provider.info(), + # predictor_info=self.prediction_provider.info(), doc_id=page_hash, doc_hash=get_binhash(pdf), ground_truth_doc=true_doc, @@ -364,30 +364,30 @@ def iterate(self) -> Iterable[DatasetRecord]: ) # Update prediction - self.update_prediction(record) + # self.update_prediction(record) # Extract images from the predicted document if available - if record.predicted_doc is not None: - pred_doc, pred_pictures, pred_page_images = extract_images( - document=record.predicted_doc, - pictures_column=BenchMarkColumns.PREDICTION_PICTURES, - page_images_column=BenchMarkColumns.PREDICTION_PAGE_IMAGES, - ) - record.predicted_doc = pred_doc - record.predicted_pictures = pred_pictures - record.predicted_page_images = pred_page_images - - # Create visualization if requested - if self.do_visualization and record.predicted_doc is not None: - save_comparison_html_with_clusters( - filename=viz_dir / f"{page_hash}-clusters.html", - true_doc=true_doc, - pred_doc=record.predicted_doc, - page_image=img, - true_labels=TRUE_HTML_EXPORT_LABELS, - pred_labels=PRED_HTML_EXPORT_LABELS, - draw_reading_order=False, - ) + # if record.predicted_doc is not None: + # pred_doc, pred_pictures, pred_page_images = extract_images( + # document=record.predicted_doc, + # pictures_column=BenchMarkColumns.PREDICTION_PICTURES, + # page_images_column=BenchMarkColumns.PREDICTION_PAGE_IMAGES, + # ) + # record.predicted_doc = pred_doc + # record.predicted_pictures = pred_pictures + # record.predicted_page_images = pred_page_images + + # # Create visualization if requested + # if self.do_visualization and record.predicted_doc is not None: + # save_comparison_html_with_clusters( + # filename=viz_dir / f"{page_hash}-clusters.html", + # true_doc=true_doc, + # pred_doc=record.predicted_doc, + # page_image=img, + # true_labels=TRUE_HTML_EXPORT_LABELS, + # pred_labels=PRED_HTML_EXPORT_LABELS, + # draw_reading_order=False, + # ) exported_rows += 1 yield record diff --git a/docling_eval_next/dataset_builders/dpbench_builder.py b/docling_eval_next/dataset_builders/dpbench_builder.py index a2debf55..76501db4 100644 --- a/docling_eval_next/dataset_builders/dpbench_builder.py +++ b/docling_eval_next/dataset_builders/dpbench_builder.py @@ -85,14 +85,14 @@ class DPBenchDatasetBuilder(BaseEvaluationDatasetBuilder): def __init__( self, - prediction_provider: BasePredictionProvider, + # prediction_provider: BasePredictionProvider, target: Path, do_visualization: bool = True, ): super().__init__( name="DPBench: end-to-end", dataset_source=HFSource(repo_id="upstage/dp-bench"), - prediction_provider=prediction_provider, + # prediction_provider=prediction_provider, target=target, ) self.do_visualization = do_visualization @@ -313,7 +313,7 @@ def iterate(self) -> Iterable[DatasetRecord]: pdf_stream = DocumentStream(name=pdf_path.name, stream=BytesIO(pdf_bytes)) record = DatasetRecord( - predictor_info=self.prediction_provider.info(), + # predictor_info=self.prediction_provider.info(), doc_id=str(filename), doc_hash=get_binhash(pdf_bytes), ground_truth_doc=true_doc, @@ -321,16 +321,16 @@ def iterate(self) -> Iterable[DatasetRecord]: mime_type="application/pdf", ) - self.update_prediction(record) - - if self.do_visualization and record.predicted_doc is not None: - save_comparison_html_with_clusters( - filename=viz_dir / f"{os.path.basename(pdf_path)}-clusters.html", - true_doc=true_doc, - pred_doc=record.predicted_doc, - page_image=true_page_images[0], - true_labels=TRUE_HTML_EXPORT_LABELS, - pred_labels=PRED_HTML_EXPORT_LABELS, - ) + # self.update_prediction(record) + + # if self.do_visualization and record.predicted_doc is not None: + # save_comparison_html_with_clusters( + # filename=viz_dir / f"{os.path.basename(pdf_path)}-clusters.html", + # true_doc=true_doc, + # pred_doc=record.predicted_doc, + # page_image=true_page_images[0], + # true_labels=TRUE_HTML_EXPORT_LABELS, + # pred_labels=PRED_HTML_EXPORT_LABELS, + # ) yield record diff --git a/docling_eval_next/dataset_builders/funsd_builder.py b/docling_eval_next/dataset_builders/funsd_builder.py index 879be1b6..d828a064 100644 --- a/docling_eval_next/dataset_builders/funsd_builder.py +++ b/docling_eval_next/dataset_builders/funsd_builder.py @@ -43,7 +43,7 @@ class FUNSDDatasetBuilder(BaseEvaluationDatasetBuilder): def __init__( self, dataset_source: Path, - prediction_provider: BasePredictionProvider, + # prediction_provider: BasePredictionProvider, target: Path, do_visualization: bool = True, split: str = "test", @@ -52,7 +52,7 @@ def __init__( super().__init__( name="FUNSD", dataset_source=dataset_source, # Standard location - prediction_provider=prediction_provider, + # prediction_provider=prediction_provider, target=target, ) self.do_visualization = do_visualization @@ -310,7 +310,7 @@ def iterate(self) -> Iterable[DatasetRecord]: # Create dataset record record = DatasetRecord( - predictor_info=self.prediction_provider.info(), + # predictor_info=self.prediction_provider.info(), doc_id=img_path.stem, doc_hash=get_binhash(img_bytes), ground_truth_doc=true_doc, @@ -322,7 +322,7 @@ def iterate(self) -> Iterable[DatasetRecord]: ) # Update prediction - self.update_prediction(record) + # self.update_prediction(record) yield record diff --git a/docling_eval_next/dataset_builders/omnidocbench_builder.py b/docling_eval_next/dataset_builders/omnidocbench_builder.py index dc1dfcb4..80718506 100644 --- a/docling_eval_next/dataset_builders/omnidocbench_builder.py +++ b/docling_eval_next/dataset_builders/omnidocbench_builder.py @@ -91,14 +91,14 @@ class OmniDocBenchDatasetBuilder(BaseEvaluationDatasetBuilder): def __init__( self, - prediction_provider: BasePredictionProvider, + # prediction_provider: BasePredictionProvider, target: Path, do_visualization: bool = True, ): super().__init__( name="OmniDocBench: end-to-end", dataset_source=HFSource(repo_id="opendatalab/OmniDocBench"), - prediction_provider=prediction_provider, + # prediction_provider=prediction_provider, target=target, ) self.do_visualization = do_visualization @@ -367,7 +367,7 @@ def iterate(self) -> Iterable[DatasetRecord]: pdf_stream = DocumentStream(name=pdf_path.name, stream=BytesIO(pdf_bytes)) record = DatasetRecord( - predictor_info=self.prediction_provider.info(), + # predictor_info=self.prediction_provider.info(), doc_id=str(os.path.basename(jpg_path)), doc_hash=get_binhash(pdf_bytes), ground_truth_doc=true_doc, @@ -375,16 +375,16 @@ def iterate(self) -> Iterable[DatasetRecord]: mime_type="application/pdf", ) - self.update_prediction(record) - - if self.do_visualization and record.predicted_doc is not None: - save_comparison_html_with_clusters( - filename=viz_dir / f"{os.path.basename(pdf_path)}-clusters.html", - true_doc=true_doc, - pred_doc=record.predicted_doc, - page_image=true_page_images[0], - true_labels=TRUE_HTML_EXPORT_LABELS, - pred_labels=PRED_HTML_EXPORT_LABELS, - ) + # self.update_prediction(record) + + # if self.do_visualization and record.predicted_doc is not None: + # save_comparison_html_with_clusters( + # filename=viz_dir / f"{os.path.basename(pdf_path)}-clusters.html", + # true_doc=true_doc, + # pred_doc=record.predicted_doc, + # page_image=true_page_images[0], + # true_labels=TRUE_HTML_EXPORT_LABELS, + # pred_labels=PRED_HTML_EXPORT_LABELS, + # ) yield record diff --git a/docling_eval_next/dataset_builders/xfund_builder.py b/docling_eval_next/dataset_builders/xfund_builder.py index e4de831b..b5fa4aea 100644 --- a/docling_eval_next/dataset_builders/xfund_builder.py +++ b/docling_eval_next/dataset_builders/xfund_builder.py @@ -45,7 +45,7 @@ class XFUNDDatasetBuilder(BaseEvaluationDatasetBuilder): def __init__( self, dataset_source: Path, - prediction_provider: BasePredictionProvider, + # prediction_provider: BasePredictionProvider, target: Path, do_visualization: bool = True, split: str = "val", # XFUND uses "val" instead of "test" @@ -54,7 +54,7 @@ def __init__( super().__init__( name="XFUND", dataset_source=dataset_source, # Local Path to dataset - prediction_provider=prediction_provider, + # prediction_provider=prediction_provider, target=target, ) self.do_visualization = do_visualization @@ -322,7 +322,7 @@ def iterate(self) -> Iterable[DatasetRecord]: assert img.format is not None # Create dataset record record = DatasetRecord( - predictor_info=self.prediction_provider.info(), + # predictor_info=self.prediction_provider.info(), doc_id=Path(img_filename).stem, doc_hash=get_binhash(img_bytes), ground_truth_doc=true_doc, @@ -334,7 +334,7 @@ def iterate(self) -> Iterable[DatasetRecord]: ) # Update prediction - self.update_prediction(record) + # self.update_prediction(record) yield record diff --git a/docling_eval_next/prediction_providers/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py index 2bd022c9..680fbbfc 100644 --- a/docling_eval_next/prediction_providers/prediction_provider.py +++ b/docling_eval_next/prediction_providers/prediction_provider.py @@ -1,16 +1,33 @@ +import copy +import os +import sys from abc import abstractmethod +from io import BytesIO +from pathlib import Path from typing import Dict, Optional +from datasets import load_dataset from docling.datamodel.pipeline_options import TableFormerMode from docling.document_converter import DocumentConverter +from docling.utils.utils import chunkify from docling_core.types import DoclingDocument from docling_core.types.io import DocumentStream +from tqdm import tqdm -from docling_eval.benchmarks.utils import docling_models_version, docling_version +from docling_eval.benchmarks.utils import ( + docling_models_version, + docling_version, + save_shard_to_disk, + write_datasets_info, +) from docling_eval.converters.models.tableformer.tf_model_prediction import ( PageToken, TableFormerUpdater, ) +from docling_eval_next.datamodels.dataset_record import ( + DatasetRecord, + DatasetRecordWithPrediction, +) class BasePredictionProvider: @@ -20,7 +37,7 @@ def __init__( self.provider_args = kwargs @abstractmethod - def predict( + def predict( # give this method the full record. self, gt_doc: DoclingDocument, stream: Optional[DocumentStream] = None, @@ -32,6 +49,79 @@ def predict( def info(self) -> Dict: return {} + def add_prediction(self, record: DatasetRecord) -> DatasetRecordWithPrediction: + # This might need customization depending on the input the dataset has. + # The default implementation assumes that there is an original file in binary format which is accepted. + input_data = copy.deepcopy(record.original) + + if not isinstance(input_data, DocumentStream): + if isinstance(input_data, Path): + input_data = DocumentStream( + name=input_data.name, stream=BytesIO(input_data.open("rb").read()) + ) + + pred_doc = self.predict(record.ground_truth_doc, stream=input_data) + + pred_record = DatasetRecordWithPrediction.model_validate( + { + **record.as_record_dict(), + "predicted_doc": pred_doc, + "original_prediction": None, + "prediction_format": None, + } + ) + + pred_record.validate_images() # type: ignore + + return pred_record + + def update_dataset_with_predictions( + self, name: str, dataset_dir: Path, output_dir: Path, split: str = "test" + ): + parquet_files = str(dataset_dir / split / "*.parquet") + ds = load_dataset("parquet", data_files={split: parquet_files}) + # _log.info(f"oveview of dataset: {ds}") + if ds is not None: + ds_selection = ds[split] + + def _iterate_predictions(): + for i, data in tqdm( + enumerate(ds_selection), + desc="Creating predictions", + ncols=120, + total=len(ds_selection), + ): + record = DatasetRecord.model_validate(data) + pred_record = self.add_prediction(record) + + yield pred_record + + test_dir = output_dir / "test" + os.makedirs(test_dir, exist_ok=True) + + chunk_size = 80 + max_num_chunks = sys.maxsize + + count = 0 + chunk_count = 0 + for record_chunk in chunkify(_iterate_predictions(), chunk_size): + record_chunk = [r.as_record_dict() for r in record_chunk] + save_shard_to_disk( + items=record_chunk, dataset_path=test_dir, shard_id=chunk_count + ) + count += len(record_chunk) + chunk_count += 1 + + if chunk_count >= max_num_chunks: + break + + write_datasets_info( + name=name, + output_dir=output_dir, + num_train_rows=0, + num_test_rows=count, + ) + class NullPredictionProvider(BasePredictionProvider): def predict( diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 189296fe..8e0ced64 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -89,15 +89,20 @@ def test_run_dpbench_e2e(): docling_provider = create_docling_prediction_provider(page_image_scale=2.0) dataset_layout = DPBenchDatasetBuilder( - prediction_provider=docling_provider, - target=target_path / "e2e", + target=target_path / "gt", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk( - chunk_size=20, max_num_chunks=1 + chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + docling_provider.update_dataset_with_predictions( + name=dataset_layout.name, + dataset_dir=target_path / "gt", + output_dir=target_path / "e2e", + ) + evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DPBENCH, @@ -111,15 +116,20 @@ def test_run_omnidocbench_e2e(): docling_provider = create_docling_prediction_provider(page_image_scale=2.0) dataset_layout = OmniDocBenchDatasetBuilder( - prediction_provider=docling_provider, - target=target_path / "e2e", + target=target_path / "gt", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk( - chunk_size=20, max_num_chunks=1 + chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + docling_provider.update_dataset_with_predictions( + name=dataset_layout.name, + dataset_dir=target_path / "gt", + output_dir=target_path / "e2e", + ) + evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.OMNIDOCBENCH, @@ -133,15 +143,20 @@ def test_run_dpbench_tables(): tableformer_provider = TableFormerPredictionProvider() dataset_tables = DPBenchDatasetBuilder( - prediction_provider=tableformer_provider, - target=target_path / "tables", + target=target_path / "gt", ) dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF dataset_tables.save_to_disk( - chunk_size=20, max_num_chunks=1 + chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + tableformer_provider.update_dataset_with_predictions( + name=dataset_tables.name, + dataset_dir=target_path / "gt", + output_dir=target_path / "tables", + ) + evaluate( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.DPBENCH, @@ -155,15 +170,20 @@ def test_run_omnidocbench_tables(): tableformer_provider = TableFormerPredictionProvider() dataset_tables = OmniDocBenchDatasetBuilder( - prediction_provider=tableformer_provider, - target=target_path / "tables", + target=target_path / "gt", ) dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF dataset_tables.save_to_disk( - chunk_size=20, max_num_chunks=1 + chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + tableformer_provider.update_dataset_with_predictions( + name=dataset_tables.name, + dataset_dir=target_path / "gt", + output_dir=target_path / "tables", + ) + evaluate( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.OMNIDOCBENCH, @@ -177,22 +197,28 @@ def test_run_doclaynet_v1_e2e(): docling_provider = create_docling_prediction_provider(page_image_scale=2.0) dataset_layout = DocLayNetV1DatasetBuilder( - prediction_provider=docling_provider, - target=target_path / "e2e", + # prediction_provider=docling_provider, + target=target_path + / "gt", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk( - chunk_size=20, max_num_chunks=1 + chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. - if False: - evaluate( - modality=EvaluationModality.LAYOUT, - benchmark=BenchMarkNames.DOCLAYNETV1, - idir=target_path / "e2e", - odir=target_path / "e2e" / "layout", - ) + docling_provider.update_dataset_with_predictions( + name=dataset_layout.name, + dataset_dir=target_path / "gt", + output_dir=target_path / "e2e", + ) + + evaluate( + modality=EvaluationModality.LAYOUT, + benchmark=BenchMarkNames.DOCLAYNETV1, + idir=target_path / "e2e", + odir=target_path / "e2e" / "layout", + ) # def test_run_doclaynet_v2_e2e(): @@ -207,7 +233,7 @@ def test_run_doclaynet_v1_e2e(): # # dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF # dataset_layout.save_to_disk( -# chunk_size=20, max_num_chunks=1 +# chunk_size=5, max_num_chunks=1 # ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. # # if False: @@ -224,13 +250,12 @@ def test_run_funsd(): dataset_layout = FUNSDDatasetBuilder( dataset_source=target_path / "input_dataset", - prediction_provider=NullPredictionProvider(), target=target_path / "e2e", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk( - chunk_size=20, max_num_chunks=1 + chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. @@ -239,11 +264,10 @@ def test_run_xfund(): dataset_layout = XFUNDDatasetBuilder( dataset_source=target_path / "input_dataset", - prediction_provider=NullPredictionProvider(), target=target_path / "e2e", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk( - chunk_size=20, max_num_chunks=1 + chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. From 9aed02056b1c645d4f3c3b058756c4648efc0053 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Mon, 24 Mar 2025 14:52:34 +0100 Subject: [PATCH 24/81] Sketch example for file-directory prediction provider Signed-off-by: Christoph Auer --- docling_eval/benchmarks/constants.py | 7 +- .../datamodels/dataset_record.py | 6 +- .../prediction_provider.py | 91 +++++++++---------- tests/test_dataset_builder.py | 43 +++++---- 4 files changed, 77 insertions(+), 70 deletions(-) diff --git a/docling_eval/benchmarks/constants.py b/docling_eval/benchmarks/constants.py index 5bc86550..6e9870a1 100644 --- a/docling_eval/benchmarks/constants.py +++ b/docling_eval/benchmarks/constants.py @@ -76,5 +76,8 @@ class ConverterTypes(str, Enum): class PredictionFormats(str, Enum): - DOCLING_DOCUMENT = "DoclingDocument" - MARKDOWN = "MarkDown" + DOCLING_DOCUMENT = "doclingdocument" + MARKDOWN = "markdown" + HTML = "html" + JSON = "json" + DOCTAGS = "doctags" diff --git a/docling_eval_next/datamodels/dataset_record.py b/docling_eval_next/datamodels/dataset_record.py index 64b1943e..0b081790 100644 --- a/docling_eval_next/datamodels/dataset_record.py +++ b/docling_eval_next/datamodels/dataset_record.py @@ -13,7 +13,7 @@ from pydantic import BaseModel, ConfigDict, Field, model_validator from pydantic.fields import FieldInfo -from docling_eval.benchmarks.constants import EvaluationModality +from docling_eval.benchmarks.constants import EvaluationModality, PredictionFormats class DatasetRecord( @@ -172,8 +172,8 @@ class DatasetRecordWithPrediction(DatasetRecord): predicted_doc: Optional[DoclingDocument] = Field( alias="PredictedDocument", default=None ) - original_prediction: Optional[Any] = None - prediction_format: Any # some enum type + original_prediction: Optional[str] = None + prediction_format: PredictionFormats # some enum type predicted_page_images: List[PIL.Image.Image] = Field( alias="GroundTruthPageImages", default=[] diff --git a/docling_eval_next/prediction_providers/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py index 680fbbfc..1c1601c4 100644 --- a/docling_eval_next/prediction_providers/prediction_provider.py +++ b/docling_eval_next/prediction_providers/prediction_provider.py @@ -4,7 +4,7 @@ from abc import abstractmethod from io import BytesIO from pathlib import Path -from typing import Dict, Optional +from typing import Dict, List, Optional, Tuple from datasets import load_dataset from docling.datamodel.pipeline_options import TableFormerMode @@ -14,6 +14,7 @@ from docling_core.types.io import DocumentStream from tqdm import tqdm +from docling_eval.benchmarks.constants import PredictionFormats from docling_eval.benchmarks.utils import ( docling_models_version, docling_version, @@ -37,18 +38,18 @@ def __init__( self.provider_args = kwargs @abstractmethod - def predict( # give this method the full record. - self, - gt_doc: DoclingDocument, - stream: Optional[DocumentStream] = None, - **extra_kwargs, - ) -> DoclingDocument: - return DoclingDocument(name="dummy") + def predict(self, record: DatasetRecord) -> Tuple[DoclingDocument, Optional[str]]: + return DoclingDocument(name="dummy"), None @abstractmethod def info(self) -> Dict: return {} + @property + @abstractmethod + def prediction_format(self) -> PredictionFormats: + pass + def add_prediction(self, record: DatasetRecord) -> DatasetRecordWithPrediction: # This might need customization depending on the input the dataset has. # The default implementation assumes that there is an original file in binary format which is accepted. @@ -60,14 +61,15 @@ def add_prediction(self, record: DatasetRecord) -> DatasetRecordWithPrediction: name=input_data.name, stream=BytesIO(input_data.open("rb").read()) ) - pred_doc = self.predict(record.ground_truth_doc, stream=input_data) + record.original = input_data + pred_doc, orig_pred = self.predict(record) pred_record = DatasetRecordWithPrediction.model_validate( { **record.as_record_dict(), "predicted_doc": pred_doc, - "original_prediction": None, - "prediction_format": None, + "original_prediction": orig_pred, + "prediction_format": self.prediction_format, } ) @@ -75,10 +77,14 @@ def add_prediction(self, record: DatasetRecord) -> DatasetRecordWithPrediction: return pred_record - def update_dataset_with_predictions( - self, name: str, dataset_dir: Path, output_dir: Path, split: str = "test" + def create_prediction_dataset( + self, + name: str, + gt_dataset_dir: Path, + target_dataset_dir: Path, + split: str = "test", ): - parquet_files = str(dataset_dir / split / "*.parquet") + parquet_files = str(gt_dataset_dir / split / "*.parquet") ds = load_dataset("parquet", data_files={split: parquet_files}) # _log.info(f"oveview of dataset: {ds}") if ds is not None: @@ -96,7 +102,7 @@ def _iterate_predictions(): yield pred_record - test_dir = output_dir / "test" + test_dir = target_dataset_dir / "test" os.makedirs(test_dir, exist_ok=True) chunk_size = 80 @@ -117,25 +123,12 @@ def _iterate_predictions(): write_datasets_info( name=name, - output_dir=output_dir, + output_dir=target_dataset_dir, num_train_rows=0, num_test_rows=count, ) -class NullPredictionProvider(BasePredictionProvider): - def predict( - self, - gt_doc: DoclingDocument, - stream: Optional[DocumentStream] = None, - **extra_kwargs, - ) -> DoclingDocument: - return gt_doc - - def info(self) -> Dict: - return {"asset": "NullProvider", "version": "0.0.0"} - - class DoclingPredictionProvider(BasePredictionProvider): def __init__( self, **kwargs @@ -150,17 +143,19 @@ def __init__( else: self.doc_converter = DocumentConverter() + @property + def prediction_format(self) -> PredictionFormats: + return PredictionFormats.DOCLING_DOCUMENT + def predict( self, - gt_doc: DoclingDocument, - stream: Optional[DocumentStream] = None, - **extra_kwargs, - ) -> DoclingDocument: + record: DatasetRecord, + ) -> Tuple[DoclingDocument, Optional[str]]: assert ( - stream is not None + record.original is not None ), "stream must be given for docling prediction provider to work." - return self.doc_converter.convert(stream).document + return self.doc_converter.convert(copy.deepcopy(record.original)).document, None def info(self) -> Dict: return {"asset": "Docling", "version": docling_version()} @@ -174,29 +169,33 @@ def __init__( self.tf_updater = TableFormerUpdater(TableFormerMode.ACCURATE) + @property + def prediction_format(self) -> PredictionFormats: + return PredictionFormats.DOCLING_DOCUMENT + def predict( - self, - gt_doc: DoclingDocument, - stream: Optional[DocumentStream] = None, - page_tokens: Optional[PageToken] = None, - **extra_kwargs, - ) -> DoclingDocument: + self, record: DatasetRecord, page_tokens: Optional[List[PageToken]] = None + ) -> Tuple[DoclingDocument, Optional[str]]: assert ( - gt_doc is not None + record.ground_truth_doc is not None ), "true_doc must be given for TableFormer prediction provider to work." - if stream is not None and page_tokens is None: - updated, pred_doc = self.tf_updater.replace_tabledata(stream.stream, gt_doc) + assert record.original is None or isinstance(record.original, DocumentStream) + + if record.original is not None and page_tokens is None: + updated, pred_doc = self.tf_updater.replace_tabledata( + copy.deepcopy(record.original.stream), record.ground_truth_doc + ) elif page_tokens is not None: updated, pred_doc = self.tf_updater.replace_tabledata_with_page_tokens( - page_tokens, gt_doc, [] + page_tokens, record.ground_truth_doc, [] ) # FIXME: Must not expect page images. else: raise RuntimeError( "TableFormerPredictionProvider.predict must be called with a stream or page_tokens." ) - return pred_doc + return pred_doc, None def info(self) -> Dict: return {"asset": "TableFormer", "version": docling_models_version()} diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index e155df33..6985805b 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -27,12 +27,8 @@ OmniDocBenchDatasetBuilder, ) from docling_eval_next.dataset_builders.xfund_builder import XFUNDDatasetBuilder -from docling_eval_next.dataset_builders.omnidocbench_builder import ( - OmniDocBenchDatasetBuilder, -) from docling_eval_next.prediction_providers.prediction_provider import ( DoclingPredictionProvider, - NullPredictionProvider, TableFormerPredictionProvider, ) @@ -97,12 +93,21 @@ def test_run_dpbench_e2e(): chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. - docling_provider.update_dataset_with_predictions( + docling_provider.create_prediction_dataset( name=dataset_layout.name, - dataset_dir=target_path / "gt", - output_dir=target_path / "e2e", + gt_dataset_dir=target_path / "gt", + target_dataset_dir=target_path / "e2e", ) + # To be implemented... + # file_directory_provider.create_prediction_dataset( + # name=dataset_layout.name, + # prediction_dir=..., + # prediction_format=PredictionFormats.MARKDOWN, # move to __init__ ? + # gt_dataset_dir=target_path / "gt", + # target_dataset_dir=target_path / "e2e", + # ) + evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DPBENCH, @@ -124,10 +129,10 @@ def test_run_omnidocbench_e2e(): chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. - docling_provider.update_dataset_with_predictions( + docling_provider.create_prediction_dataset( name=dataset_layout.name, - dataset_dir=target_path / "gt", - output_dir=target_path / "e2e", + gt_dataset_dir=target_path / "gt", + target_dataset_dir=target_path / "e2e", ) evaluate( @@ -151,10 +156,10 @@ def test_run_dpbench_tables(): chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. - tableformer_provider.update_dataset_with_predictions( + tableformer_provider.create_prediction_dataset( name=dataset_tables.name, - dataset_dir=target_path / "gt", - output_dir=target_path / "tables", + gt_dataset_dir=target_path / "gt", + target_dataset_dir=target_path / "tables", ) evaluate( @@ -178,10 +183,10 @@ def test_run_omnidocbench_tables(): chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. - tableformer_provider.update_dataset_with_predictions( + tableformer_provider.create_prediction_dataset( name=dataset_tables.name, - dataset_dir=target_path / "gt", - output_dir=target_path / "tables", + gt_dataset_dir=target_path / "gt", + target_dataset_dir=target_path / "tables", ) evaluate( @@ -207,10 +212,10 @@ def test_run_doclaynet_v1_e2e(): chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. - docling_provider.update_dataset_with_predictions( + docling_provider.create_prediction_dataset( name=dataset_layout.name, - dataset_dir=target_path / "gt", - output_dir=target_path / "e2e", + gt_dataset_dir=target_path / "gt", + target_dataset_dir=target_path / "e2e", ) evaluate( From fc2b725de457157a32b5f1d5f441b1b20a7c76cb Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Tue, 25 Mar 2025 10:51:53 +0100 Subject: [PATCH 25/81] chore: Fix typing hints Signed-off-by: Nikos Livathinos --- docling_eval_next/datamodels/dataset_record.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docling_eval_next/datamodels/dataset_record.py b/docling_eval_next/datamodels/dataset_record.py index 0b081790..a33fd489 100644 --- a/docling_eval_next/datamodels/dataset_record.py +++ b/docling_eval_next/datamodels/dataset_record.py @@ -1,7 +1,7 @@ import json from io import BytesIO from pathlib import Path -from typing import Any, List, Optional, Union +from typing import Any, Dict, List, Optional, Union import PIL from datasets import Features @@ -25,7 +25,7 @@ class DatasetRecord( doc_hash: Optional[str] = Field(alias="document_filehash") ground_truth_doc: DoclingDocument = Field(alias="GroundTruthDocument") - original: Optional[Union[DocumentStream | Path]] = Field( + original: Optional[Union[DocumentStream, Path]] = Field( alias="BinaryDocument", default=None ) # TODO add optional columns to store the SegmentedPage, both for GT and prediction @@ -166,7 +166,7 @@ def validate_record_dict(cls, data: dict): class DatasetRecordWithPrediction(DatasetRecord): - predictor_info: dict = Field(alias="predictor_info", default={}) + predictor_info: Dict = Field(alias="predictor_info", default={}) status: ConversionStatus = Field(alias="status", default=ConversionStatus.PENDING) predicted_doc: Optional[DoclingDocument] = Field( From 040deb5b796bba29fee6cb43b70ad50f5629aa51 Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Tue, 25 Mar 2025 17:41:49 +0100 Subject: [PATCH 26/81] chore: Update poetry to doclign-core 2.24.0 Signed-off-by: Nikos Livathinos --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index cc576a53..8d114e0f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -932,13 +932,13 @@ vlm = ["accelerate (>=1.2.1,<2.0.0)", "transformers (>=4.42.0,<4.43.0)", "transf [[package]] name = "docling-core" -version = "2.23.3" +version = "2.24.0" description = "A python library to define and validate data types in Docling." optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "docling_core-2.23.3-py3-none-any.whl", hash = "sha256:a2166ffc41f8fdf6fdb99b33da6c7146eccf6382712ea92e95772604fb5af5e5"}, - {file = "docling_core-2.23.3.tar.gz", hash = "sha256:a64ce41e0881c06962a2b3ec80e0665f84de0809dedf1bf84f3a14b75dd665c4"}, + {file = "docling_core-2.24.0-py3-none-any.whl", hash = "sha256:5c14f8dd8c6add6f5fa8104ff202df1baa7fd2471123bea56137f866e21b8d40"}, + {file = "docling_core-2.24.0.tar.gz", hash = "sha256:7bb880a72963accb47c9d05edd712601ccbd1d8a9fccba14ae6ef41baef41c69"}, ] [package.dependencies] @@ -6437,4 +6437,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "da4b4c6218ec1304a9bbb51f9735660ebb0314126334a2eaa2da789bdfbef25e" +content-hash = "9af7f7758445ff9c17e1361c0c1a1a6a553962096376fbea107e478ffbb7774e" diff --git a/pyproject.toml b/pyproject.toml index 092c3da0..4a988766 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ packages = [{include = "docling_eval"}] # actual dependencies: ###################### python = "^3.10" -docling-core = "^2.23.3" +docling-core = "^2.24.0" pydantic = "^2.0.0" lxml = "^5.3.0" datasets = "^3.2.0" From d8835c11cbb60148e6484c2dd1b1ed6c345e6aa6 Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Tue, 25 Mar 2025 17:49:21 +0100 Subject: [PATCH 27/81] feat: WIP: Introduce the FilePredictionProvider that reads files with predictions from the disk - It currently supports doctags, markdown, json, yaml formats. - We still need to improve the returned type so that it allows for no DoclingDocument but only for the source data (e.g. in case of markdown). Signed-off-by: Nikos Livathinos --- docling_eval/benchmarks/constants.py | 1 + .../prediction_provider.py | 131 ++++++++++++++++++ 2 files changed, 132 insertions(+) diff --git a/docling_eval/benchmarks/constants.py b/docling_eval/benchmarks/constants.py index 6e9870a1..ce2f8b62 100644 --- a/docling_eval/benchmarks/constants.py +++ b/docling_eval/benchmarks/constants.py @@ -80,4 +80,5 @@ class PredictionFormats(str, Enum): MARKDOWN = "markdown" HTML = "html" JSON = "json" + YAML = "yaml" DOCTAGS = "doctags" diff --git a/docling_eval_next/prediction_providers/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py index 1c1601c4..a50334d0 100644 --- a/docling_eval_next/prediction_providers/prediction_provider.py +++ b/docling_eval_next/prediction_providers/prediction_provider.py @@ -1,4 +1,5 @@ import copy +import json import os import sys from abc import abstractmethod @@ -11,7 +12,13 @@ from docling.document_converter import DocumentConverter from docling.utils.utils import chunkify from docling_core.types import DoclingDocument +from docling_core.types.doc.document import ( + DoclingDocument, + DocTagsDocument, + DocTagsPage, +) from docling_core.types.io import DocumentStream +from PIL import Image from tqdm import tqdm from docling_eval.benchmarks.constants import PredictionFormats @@ -199,3 +206,127 @@ def predict( def info(self) -> Dict: return {"asset": "TableFormer", "version": docling_models_version()} + + +class FilePredictionProvider(BasePredictionProvider): + def __init__(self, **kwargs): + super().__init__(**kwargs) + self._supported_prediction_formats = [ + PredictionFormats.DOCTAGS, + PredictionFormats.MARKDOWN, + PredictionFormats.JSON, + PredictionFormats.YAML, + ] + + # Read the input + self._prediction_format: PredictionFormats = PredictionFormats.DOCTAGS + self._prediction_source_path: Path = Path(".") + self._raise_on_missing_file = ( + False # Raise exception when an expected file is missing + ) + if kwargs is not None: + if "prediction_format" in kwargs and isinstance( + kwargs["prediction_format"], PredictionFormats + ): + self._prediction_format = kwargs["prediction_format"] + if "source_path" in kwargs: + if isinstance(kwargs["source_path"], Path): + self._prediction_source_path = kwargs["source_path"] + else: + self._prediction_source_path = Path(kwargs["source_path"]) + if "raise_on_missing_file" in kwargs: + self._raise_on_missing_file = kwargs["raise_on_missing_file"] + + # Validate the prediction format + if self._prediction_format not in self._supported_prediction_formats: + msg = f"Unsupported file prediction format: {self._prediction_format}." + msg += f" The prediction format must be one of {self._supported_prediction_formats}" + raise RuntimeError(msg) + + # Validate if the source_path exists + if not self._prediction_source_path.is_dir(): + raise RuntimeError(f"Missing source path: {self._prediction_source_path}") + + @abstractmethod + def info(self) -> Dict: + return { + "supported_prediction_formats": self._supported_prediction_formats, + "prediction_format": self._prediction_format, + "source_path": self._prediction_source_path, + } + + @abstractmethod + def predict(self, record: DatasetRecord) -> Tuple[DoclingDocument, Optional[str]]: + doc_id = record.doc_id + raw = None + if self._prediction_format == PredictionFormats.DOCTAGS: + doc = self._load_doctags_doc(doc_id) + elif self._prediction_format == PredictionFormats.MARKDOWN: + # TODO: Replace the return type with something that has the DoclingDocument as optional + doc = DoclingDocument(name=doc_id) # Temp solution to pass MyPy + + raw = self._load_md_raw(doc_id) + elif self._prediction_format == PredictionFormats.JSON: + doc = self._load_json_doc(doc_id) + elif self._prediction_format == PredictionFormats.YAML: + doc = self._load_yaml_doc(doc_id) + + return doc, raw + + @property + @abstractmethod + def prediction_format(self) -> PredictionFormats: + r""" """ + return self._prediction_format + + def _load_doctags_doc(self, doc_id: str) -> DoclingDocument: + r"""Load doctags file into DoclingDocument""" + # Read the doctags file + doctags_fn = self._prediction_source_path / f"{doc_id}.dt" + if self._raise_on_missing_file and not doctags_fn.is_file(): + raise RuntimeError(f"Missing prediction doctags: {doctags_fn}") + with open(doctags_fn, "r") as fd: + doctags = fd.read() + + # Check if an optional page image is present + page_image_fn = self._prediction_source_path / f"{doc_id}.png" + page_image = None + if page_image_fn.is_file(): + page_image = Image.open(page_image_fn) + + # Build DoclingDocument + doctags_page = DocTagsPage(tokens=doctags, image=page_image) + doctags_doc = DocTagsDocument(pages=[doctags_page]) + doc = DoclingDocument(name=doc_id) + doc.load_from_doctags(doctags_doc) + + return doc + + def _load_json_doc(self, doc_id: str) -> DoclingDocument: + r"""Load DoclingDocument from json""" + json_fn = self._prediction_source_path / f"{doc_id}.json" + if self._raise_on_missing_file and not json_fn.is_file(): + raise RuntimeError(f"Missing prediction json: {json_fn}") + doc: DoclingDocument = DoclingDocument.load_from_json(json_fn) + return doc + + def _load_yaml_doc(self, doc_id: str) -> DoclingDocument: + r"""Load DoclingDocument from yaml""" + yaml_fn = self._prediction_source_path / f"{doc_id}.yaml" + if not yaml_fn.is_file(): + # Try alternative yaml extension + yaml_fn = self._prediction_source_path / f"{doc_id}.yml" + if self._raise_on_missing_file and not yaml_fn.is_file(): + raise RuntimeError(f"Missing prediction yaml: {yaml_fn}") + + doc: DoclingDocument = DoclingDocument.load_from_yaml(yaml_fn) + return doc + + def _load_md_raw(self, doc_id: str) -> str: + r"""Load the markdown content""" + md_fn = self._prediction_source_path / f"{doc_id}.md" + if self._raise_on_missing_file and not md_fn.is_file(): + raise RuntimeError(f"Missing prediction markdown: {md_fn}") + with open(md_fn, "r") as fd: + md = fd.read() + return md From 0d4cccbc8c8f5257cb610ff39b815795e4aee3e8 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 25 Mar 2025 19:58:19 +0100 Subject: [PATCH 28/81] Add DocLayNetV2DatasetBuilder Signed-off-by: Christoph Auer --- docling_eval/benchmarks/utils.py | 7 +- docling_eval/converters/conversion.py | 42 +- .../dataset_builders/doclaynet_v2_builder.py | 697 ++++++++++++++++++ docs/examples/package_pngs.py | 4 +- 4 files changed, 715 insertions(+), 35 deletions(-) create mode 100644 docling_eval_next/dataset_builders/doclaynet_v2_builder.py diff --git a/docling_eval/benchmarks/utils.py b/docling_eval/benchmarks/utils.py index 47e80c44..859a7390 100644 --- a/docling_eval/benchmarks/utils.py +++ b/docling_eval/benchmarks/utils.py @@ -15,6 +15,7 @@ from datasets import Image as Features_Image from datasets import Sequence, Value from docling.backend.docling_parse_v2_backend import DoclingParseV2DocumentBackend +from docling.backend.docling_parse_v4_backend import DoclingParseV4DocumentBackend from docling.datamodel.base_models import InputFormat, Page from docling.datamodel.document import InputDocument from docling_core.types.doc.base import BoundingBox, Size @@ -93,7 +94,7 @@ def get_input_document(file: Path | BytesIO) -> InputDocument: path_or_stream=file, format=InputFormat.PDF, # type: ignore[arg-type] filename=file.name if isinstance(file, Path) else "foo", - backend=DoclingParseV2DocumentBackend, + backend=DoclingParseV4DocumentBackend, ) @@ -394,8 +395,6 @@ def save_shard_to_disk( batch = Dataset.from_list(items) # , features=features) output_file = dataset_path / f"shard_{thread_id:06}_{shard_id:06}.{shard_format}" - logging.info(f"Saved shard {shard_id} to {output_file} with {len(items)} documents") - if shard_format == "json": batch.to_json(output_file) @@ -405,6 +404,8 @@ def save_shard_to_disk( else: raise ValueError(f"Unsupported shard_format: {shard_format}") + logging.info(f"Saved shard {shard_id} to {output_file} with {len(items)} documents") + shard_id += 1 return shard_id, [], 0 diff --git a/docling_eval/converters/conversion.py b/docling_eval/converters/conversion.py index e2103c1d..4f0c178e 100644 --- a/docling_eval/converters/conversion.py +++ b/docling_eval/converters/conversion.py @@ -3,7 +3,7 @@ from pathlib import Path from typing import List, Optional -from docling.cli.main import OcrEngine +# from docling.cli.main import OcrEngine from docling.datamodel.base_models import InputFormat from docling.datamodel.pipeline_options import ( EasyOcrOptions, @@ -19,6 +19,7 @@ ) from docling.datamodel.settings import settings from docling.document_converter import DocumentConverter, PdfFormatOption +from docling.models.factories import get_ocr_factory from docling.pipeline.vlm_pipeline import VlmPipeline warnings.filterwarnings(action="ignore", category=UserWarning, module="pydantic|torch") @@ -29,25 +30,15 @@ def create_pdf_docling_converter( page_image_scale: float = 2.0, do_ocr: bool = False, ocr_lang: List[str] = ["en"], - ocr_engine: OcrEngine = OcrEngine.EASYOCR, + ocr_engine: str = EasyOcrOptions.kind, timings: bool = True, artifacts_path: Optional[Path] = None, ): - force_ocr: bool = True - - if ocr_engine == OcrEngine.EASYOCR: - ocr_options: OcrOptions = EasyOcrOptions(force_full_page_ocr=force_ocr) - elif ocr_engine == OcrEngine.TESSERACT_CLI: - ocr_options = TesseractCliOcrOptions(force_full_page_ocr=force_ocr) - elif ocr_engine == OcrEngine.TESSERACT: - ocr_options = TesseractOcrOptions(force_full_page_ocr=force_ocr) - elif ocr_engine == OcrEngine.OCRMAC: - ocr_options = OcrMacOptions(force_full_page_ocr=force_ocr) - elif ocr_engine == OcrEngine.RAPIDOCR: - ocr_options = RapidOcrOptions(force_full_page_ocr=force_ocr) - else: - raise RuntimeError(f"Unexpected OCR engine type {ocr_engine}") + ocr_options: OcrOptions = ocr_factory.create_options( # type: ignore + kind=ocr_engine, + force_full_page_ocr=force_ocr, + ) if ocr_lang is not None: ocr_options.lang = ocr_lang @@ -81,24 +72,15 @@ def create_pdf_docling_converter( def create_image_docling_converter( do_ocr: bool = False, ocr_lang: List[str] = ["en"], - ocr_engine: OcrEngine = OcrEngine.EASYOCR, + ocr_engine: str = EasyOcrOptions.kind, timings: bool = True, ): force_ocr: bool = True - - if ocr_engine == OcrEngine.EASYOCR: - ocr_options: OcrOptions = EasyOcrOptions(force_full_page_ocr=force_ocr) - elif ocr_engine == OcrEngine.TESSERACT_CLI: - ocr_options = TesseractCliOcrOptions(force_full_page_ocr=force_ocr) - elif ocr_engine == OcrEngine.TESSERACT: - ocr_options = TesseractOcrOptions(force_full_page_ocr=force_ocr) - elif ocr_engine == OcrEngine.OCRMAC: - ocr_options = OcrMacOptions(force_full_page_ocr=force_ocr) - elif ocr_engine == OcrEngine.RAPIDOCR: - ocr_options = RapidOcrOptions(force_full_page_ocr=force_ocr) - else: - raise RuntimeError(f"Unexpected OCR engine type {ocr_engine}") + ocr_options: OcrOptions = ocr_factory.create_options( # type: ignore + kind=ocr_engine, + force_full_page_ocr=force_ocr, + ) if ocr_lang is not None: ocr_options.lang = ocr_lang diff --git a/docling_eval_next/dataset_builders/doclaynet_v2_builder.py b/docling_eval_next/dataset_builders/doclaynet_v2_builder.py new file mode 100644 index 00000000..dfd0aabe --- /dev/null +++ b/docling_eval_next/dataset_builders/doclaynet_v2_builder.py @@ -0,0 +1,697 @@ +import io +import itertools +import logging +import os +import re +from pathlib import Path +from typing import Dict, Iterable, List, Optional, Tuple + +from datasets import load_from_disk +from docling_core.types import DoclingDocument +from docling_core.types.doc import ( + BoundingBox, + CoordOrigin, + DocItemLabel, + GroupLabel, + ImageRef, + PageItem, + ProvenanceItem, + Size, + TableCell, + TableData, +) +from docling_core.types.doc.document import GraphCell, GraphData, GraphLink +from docling_core.types.doc.labels import GraphCellLabel, GraphLinkLabel +from docling_core.types.doc.tokens import TableToken +from docling_core.types.io import DocumentStream +from PIL import Image +from tqdm import tqdm + +from docling_eval.benchmarks.constants import ( + BenchMarkColumns, + ConverterTypes, + EvaluationModality, +) +from docling_eval.benchmarks.utils import ( + classify_cells, + crop_bounding_box, + extract_images, + from_pil_to_base64uri, + get_binhash, +) +from docling_eval_next.datamodels.dataset_record import DatasetRecord +from docling_eval_next.dataset_builders.dataset_builder import ( + BaseEvaluationDatasetBuilder, +) +from docling_eval_next.prediction_providers.prediction_provider import ( + BasePredictionProvider, +) + +# Get logger +_log = logging.getLogger(__name__) + + +class DocLayNetV2DatasetBuilder(BaseEvaluationDatasetBuilder): + """DocLayNet V2 dataset builder implementing the base dataset builder interface.""" + + def __init__( + self, + dataset_path: Path, + # prediction_provider: BasePredictionProvider, + target: Path, + do_visualization: bool = True, + split: str = "test", + max_items: int = -1, + ): + """ + Initialize the DocLayNet V2 dataset builder. + + Args: + dataset_path: Path to the pre-downloaded dataset + target: Path where the processed dataset will be saved + do_visualization: Whether to create visualizations + split: Dataset split to use + max_items: Maximum number of items to process (-1 for all) + """ + super().__init__( + name="DocLayNetV2: end-to-end", + dataset_source=dataset_path, # Local Path to dataset + # prediction_provider=prediction_provider, + target=target, + ) + self.do_visualization = do_visualization + self.split = split + self.max_items = max_items + + def extract_tokens_and_text(self, s: str): + """ + Extract tokens and text from a string. + + Args: + s: Input string + + Returns: + tuple: (tokens, text_parts) + """ + # Pattern to match anything enclosed by < > (including the angle brackets themselves) + pattern = r"(<[^>]+>)" + # Find all tokens (e.g. "", "", etc.) + tokens = re.findall(pattern, s) + # Remove any tokens that start with "", ""]) + ] + # Split the string by those tokens to get the in-between text + text_parts = re.split(pattern, s) + text_parts = [ + token + for token in text_parts + if not (token.startswith("", ""]) + ] + # Remove any empty or purely whitespace strings from text_parts + text_parts = [part for part in text_parts if part.strip()] + + return tokens, text_parts + + def parse_texts(self, texts, tokens): + """ + Parse tokens and texts into table cells. + + Args: + texts: List of text parts + tokens: List of tokens + + Returns: + tuple: (table_cells, split_row_tokens) + """ + split_word = TableToken.OTSL_NL.value + split_row_tokens = [ + list(y) + for x, y in itertools.groupby(tokens, lambda z: z == split_word) + if not x + ] + table_cells = [] + r_idx = 0 + c_idx = 0 + + def count_right(tokens, c_idx, r_idx, which_tokens): + span = 0 + c_idx_iter = c_idx + while tokens[r_idx][c_idx_iter] in which_tokens: + c_idx_iter += 1 + span += 1 + if c_idx_iter >= len(tokens[r_idx]): + return span + return span + + def count_down(tokens, c_idx, r_idx, which_tokens): + span = 0 + r_idx_iter = r_idx + while tokens[r_idx_iter][c_idx] in which_tokens: + r_idx_iter += 1 + span += 1 + if r_idx_iter >= len(tokens): + return span + return span + + for i, text in enumerate(texts): + cell_text = "" + if text in [ + TableToken.OTSL_FCEL.value, + TableToken.OTSL_ECEL.value, + TableToken.OTSL_CHED.value, + TableToken.OTSL_RHED.value, + TableToken.OTSL_SROW.value, + ]: + row_span = 1 + col_span = 1 + right_offset = 1 + if text != TableToken.OTSL_ECEL.value: + cell_text = texts[i + 1] + right_offset = 2 + + # Check next element(s) for lcel / ucel / xcel, set properly row_span, col_span + if i + right_offset < len(texts): + next_right_cell = texts[i + right_offset] + + next_bottom_cell = "" + if r_idx + 1 < len(split_row_tokens): + next_bottom_cell = split_row_tokens[r_idx + 1][c_idx] + + if next_right_cell in [ + TableToken.OTSL_LCEL.value, + TableToken.OTSL_XCEL.value, + ]: + # we have horisontal spanning cell or 2d spanning cell + col_span += count_right( + split_row_tokens, + c_idx + 1, + r_idx, + [TableToken.OTSL_LCEL.value, TableToken.OTSL_XCEL.value], + ) + if next_bottom_cell in [ + TableToken.OTSL_UCEL.value, + TableToken.OTSL_XCEL.value, + ]: + # we have a vertical spanning cell or 2d spanning cell + row_span += count_down( + split_row_tokens, + c_idx, + r_idx + 1, + [TableToken.OTSL_UCEL.value, TableToken.OTSL_XCEL.value], + ) + + table_cells.append( + TableCell( + text=cell_text.strip(), + row_span=row_span, + col_span=col_span, + start_row_offset_idx=r_idx, + end_row_offset_idx=r_idx + row_span, + start_col_offset_idx=c_idx, + end_col_offset_idx=c_idx + col_span, + ) + ) + if text in [ + TableToken.OTSL_FCEL.value, + TableToken.OTSL_ECEL.value, + TableToken.OTSL_CHED.value, + TableToken.OTSL_RHED.value, + TableToken.OTSL_SROW.value, + TableToken.OTSL_LCEL.value, + TableToken.OTSL_UCEL.value, + TableToken.OTSL_XCEL.value, + ]: + c_idx += 1 + if text == TableToken.OTSL_NL.value: + r_idx += 1 + c_idx = 0 + return table_cells, split_row_tokens + + def parse_table_content(self, otsl_content: str) -> TableData: + """ + Parse OTSL content into TableData. + + Args: + otsl_content: OTSL content string + + Returns: + TableData object + """ + tokens, mixed_texts = self.extract_tokens_and_text(otsl_content) + table_cells, split_row_tokens = self.parse_texts(mixed_texts, tokens) + + return TableData( + num_rows=len(split_row_tokens), + num_cols=( + max(len(row) for row in split_row_tokens) if split_row_tokens else 0 + ), + table_cells=table_cells, + ) + + def convert_bbox(self, bbox_data) -> BoundingBox: + """ + Convert bbox format to BoundingBox object. + + Args: + bbox_data: Bounding box data as list or BoundingBox + + Returns: + BoundingBox object + """ + if isinstance(bbox_data, list) and len(bbox_data) == 4: + return BoundingBox( + l=bbox_data[0], t=bbox_data[1], r=bbox_data[2], b=bbox_data[3] + ) + elif isinstance(bbox_data, BoundingBox): + return bbox_data + else: + raise ValueError( + "Invalid bounding box data; expected a list of four numbers or a BoundingBox instance." + ) + + def create_graph_cell(self, cell_data: Dict, label: GraphCellLabel) -> GraphCell: + """ + Create a graph cell from cell data. + + Args: + cell_data: Cell data dictionary + label: GraphCellLabel for the cell + + Returns: + GraphCell object + """ + bbox_instance = None + if "bbox" in cell_data and cell_data["bbox"] is not None: + bbox_instance = self.convert_bbox(cell_data["bbox"]) + cell_prov = ProvenanceItem( + page_no=1, + charspan=(0, 0), + bbox=bbox_instance, + ) + else: + cell_prov = None + + return GraphCell( + cell_id=cell_data["cell_id"], + text=cell_data["text"], + orig=cell_data.get("orig", cell_data["text"]), + prov=cell_prov, + label=label, + ) + + def create_graph_link( + self, + key_cell: GraphCell, + value_cell: GraphCell, + label: GraphLinkLabel = GraphLinkLabel.TO_VALUE, + ) -> GraphLink: + """ + Create a graph link between key and value cells. + + Args: + key_cell: Source GraphCell + value_cell: Target GraphCell + label: GraphLinkLabel for the link + + Returns: + GraphLink object + """ + return GraphLink( + source_cell_id=key_cell.cell_id, + target_cell_id=value_cell.cell_id, + label=label, + ) + + def get_overall_bbox( + self, links: List[GraphLink], cell_dict: Dict[int, GraphCell] + ) -> Optional[BoundingBox]: + """ + Compute the overall bounding box from all cell ids. + + Args: + links: List of GraphLink objects + cell_dict: Dictionary mapping cell_id to GraphCell + + Returns: + Optional BoundingBox encompassing all cells + """ + all_bboxes = [] + for link in links: + src_prov = cell_dict[link.source_cell_id].prov + tgt_prov = cell_dict[link.target_cell_id].prov + if src_prov is not None: + all_bboxes.append(src_prov.bbox) + if tgt_prov is not None: + all_bboxes.append(tgt_prov.bbox) + + if len(all_bboxes) == 0: + return None + bbox_instance = BoundingBox.enclosing_bbox(all_bboxes) + return bbox_instance + + def populate_key_value_item( + self, + doc: DoclingDocument, + kv_pairs: List[Dict], + ) -> None: + """ + Populate a key-value item in the document. + + Args: + doc: DoclingDocument to update + kv_pairs: List of key-value pair dictionaries + """ + cells = [] + links = [] + + for pair in kv_pairs: + key_data = pair["key"] + value_data = pair["value"] + + key_cell = self.create_graph_cell(key_data, GraphCellLabel.KEY) + value_cell = self.create_graph_cell(value_data, GraphCellLabel.VALUE) + + cells.append(key_cell) + cells.append(value_cell) + + # link between key and value + kv_link = self.create_graph_link(key_cell, value_cell) + links.append(kv_link) + + overall_bbox = self.get_overall_bbox( + links, cell_dict={cell.cell_id: cell for cell in cells} + ) + + if overall_bbox is not None: + prov = ProvenanceItem( + page_no=doc.pages[1].page_no, + charspan=(0, 0), + bbox=overall_bbox, + ) + else: + prov = None + + graph = GraphData(cells=cells, links=links) + + # update the labels of the cells based on the links with rules + classify_cells(graph=graph) + + # Add the key_value_item to the document. + doc.add_key_values(graph=graph, prov=prov) + + def create_kv_pairs(self, data): + """ + Create key-value pairs from document data. + + Args: + data: Document data dictionary + + Returns: + List of key-value pair dictionaries + """ + link_pairs = [] + seg_with_id = {} + bbox_with_id = {} + + if ( + "annotation_ids" not in data + or "boxes" not in data + or "segments" not in data + or "links" not in data + ): + return link_pairs + + _ids = data["annotation_ids"] + bboxes = data["boxes"] + segments = data["segments"] + links = data["links"] + + # str to integer id mapping + int_ids = {id: i for i, id in enumerate(_ids)} + + for i, seg in enumerate(segments): + seg_with_id[_ids[i]] = seg + bbox_with_id[_ids[i]] = bboxes[i] + + for i, segment in enumerate(segments): + if links[i] is not None and links[i] in seg_with_id: + link_pairs.append( + { + "value": { + "cell_id": int_ids[_ids[i]], + "bbox": bboxes[i], + "text": segment["text"], + "label": GraphCellLabel.VALUE, + }, + "key": { + "cell_id": int_ids[links[i]], + "bbox": bbox_with_id[links[i]], + "text": seg_with_id[links[i]]["text"], + "label": GraphCellLabel.KEY, + }, + } + ) + return link_pairs + + def update_doc( + self, + true_doc: DoclingDocument, + current_list, + img: Image.Image, + label: str, + segment: Dict, + box: List, + ): + """ + Update the document with a new element based on its label. + + Args: + true_doc: DoclingDocument to update + current_list: Current list context for list items + img: Page image + label: Element label + segment: Segment data dictionary + box: Bounding box coordinates + + Returns: + Updated list context + """ + bbox = BoundingBox.from_tuple( + tuple(box), CoordOrigin.TOPLEFT + ).to_bottom_left_origin(page_height=true_doc.pages[1].size.height) + prov = ProvenanceItem(page_no=1, bbox=bbox, charspan=(0, len(segment["text"]))) + img_elem = crop_bounding_box(page_image=img, page=true_doc.pages[1], bbox=bbox) + + # Convert label string to DocItemLabel enum (with fallback to TEXT) + try: + doc_label = DocItemLabel(label) + except ValueError: + _log.warning(f"Unknown label type: {label}, defaulting to TEXT") + doc_label = DocItemLabel.TEXT + + if doc_label == DocItemLabel.PICTURE: + current_list = None + try: + uri = from_pil_to_base64uri(img_elem) + imgref = ImageRef( + mimetype="image/png", + dpi=72, + size=Size(width=img_elem.width, height=img_elem.height), + uri=uri, + ) + true_doc.add_picture(prov=prov, image=imgref) + except Exception as e: + _log.error(f"Failed to create image reference: {str(e)}") + + elif doc_label in [DocItemLabel.TABLE, DocItemLabel.DOCUMENT_INDEX]: + current_list = None + if ( + segment.get("data") is not None + and segment["data"].get("otsl_seq") is not None + ): + otsl_str = "".join(segment["data"]["otsl_seq"]) + tbl_data = self.parse_table_content(otsl_str) + true_doc.add_table( + data=tbl_data, caption=None, prov=prov, label=doc_label + ) + else: + # Simple fallback for tables without OTSL data + tbl_cell = TableCell( + start_row_offset_idx=0, + end_row_offset_idx=0, + start_col_offset_idx=0, + end_col_offset_idx=0, + text=segment["text"], + ) + tbl_data = TableData(table_cells=[tbl_cell]) + true_doc.add_table( + data=tbl_data, caption=None, prov=prov, label=doc_label + ) + + elif doc_label in [DocItemLabel.FORM, DocItemLabel.KEY_VALUE_REGION]: + group_label = GroupLabel.UNSPECIFIED + if doc_label == DocItemLabel.FORM: + group_label = GroupLabel.FORM_AREA + elif doc_label == DocItemLabel.KEY_VALUE_REGION: + group_label = GroupLabel.KEY_VALUE_AREA + true_doc.add_group(label=group_label, name=f"{doc_label}_group") + + elif doc_label == DocItemLabel.LIST_ITEM: + if current_list is None: + current_list = true_doc.add_group(label=GroupLabel.LIST, name="list") + + true_doc.add_list_item( + text=segment["text"], + enumerated=False, + prov=prov, + parent=current_list, + ) + + elif doc_label == DocItemLabel.SECTION_HEADER: + current_list = None + true_doc.add_heading( + text=segment["text"], orig=segment["text"], level=2, prov=prov + ) + + elif doc_label == DocItemLabel.TITLE: + current_list = None + true_doc.add_heading( + text=segment["text"], orig=segment["text"], level=1, prov=prov + ) + + else: + current_list = None + true_doc.add_text( + label=doc_label, text=segment["text"], orig=segment["text"], prov=prov + ) + + return current_list + + def iterate(self) -> Iterable[DatasetRecord]: + """ + Iterate through the dataset and yield DatasetRecord objects. + + Yields: + DatasetRecord objects + """ + if not self.retrieved: + raise RuntimeError( + "You must first retrieve the source dataset. Call retrieve_input_dataset()." + ) + + assert isinstance(self.dataset_source, Path) + + try: + # Load dataset + ds = load_from_disk(str(self.dataset_source)) + + # Create visualization directory if needed + if self.do_visualization: + viz_dir = self.target / "visualizations" + os.makedirs(viz_dir, exist_ok=True) + + # Set max items + if self.max_items == -1: + max_items = len(ds[self.split]) + else: + max_items = min(self.max_items, len(ds[self.split])) + + _log.info(f"Processing DocLayNetV2 dataset: {max_items} documents") + + # Process each document + for i, doc in enumerate( + tqdm( + ds[self.split], + total=max_items, + desc="Processing DocLayNetV2 documents", + ) + ): + if i >= max_items: + break + + try: + # Extract image + img = doc["image"] + + # Convert image to bytes for storage + with io.BytesIO() as img_byte_stream: + img.save(img_byte_stream, format=img.format or "PNG") + img_byte_stream.seek(0) + img_bytes = img_byte_stream.getvalue() + + # Create ground truth document + doc_id = doc["page_hash"] + true_doc = DoclingDocument(name=doc_id) + + # Add page with image + image_ref = ImageRef( + mimetype=f"image/{img.format.lower() if img.format else 'png'}", + dpi=72, + size=Size(width=float(img.width), height=float(img.height)), + uri=from_pil_to_base64uri(img), + ) + page_item = PageItem( + page_no=1, + size=Size(width=float(img.width), height=float(img.height)), + image=image_ref, + ) + true_doc.pages[1] = page_item + + # Create key-value pairs if present + kv_pairs = self.create_kv_pairs(doc) + if kv_pairs: + self.populate_key_value_item(true_doc, kv_pairs) + + # Process layout elements + current_list = None + boxes = doc["boxes"] + labels = list( + map( + lambda label: label.lower() + .replace("-", "_") + .replace(" ", "_"), + doc["labels"], + ) + ) + segments = doc["segments"] + + for label, segment, box in zip(labels, segments, boxes): + current_list = self.update_doc( + true_doc, current_list, img, label, segment, box + ) + + # Extract images from ground truth document + true_doc, true_pictures, true_page_images = extract_images( + document=true_doc, + pictures_column=BenchMarkColumns.GROUNDTRUTH_PICTURES.value, + page_images_column=BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES.value, + ) + + # Create dataset record + record = DatasetRecord( + doc_id=doc_id, + doc_hash=get_binhash(img_bytes), + ground_truth_doc=true_doc, + original=None, + mime_type=f"image/{img.format.lower() if img.format else 'png'}", + modalities=[ + EvaluationModality.LAYOUT, + EvaluationModality.MARKDOWN_TEXT, + EvaluationModality.KEY_VALUE, + ], + ground_truth_pictures=true_pictures, + ground_truth_page_images=true_page_images, + ) + + yield record + + except Exception as ex: + _log.error(f"Error processing document {i}: {str(ex)}") + continue + + except Exception as ex: + _log.error(f"Error loading dataset: {str(ex)}") + raise diff --git a/docs/examples/package_pngs.py b/docs/examples/package_pngs.py index 7dc9b793..5d29f299 100644 --- a/docs/examples/package_pngs.py +++ b/docs/examples/package_pngs.py @@ -3,8 +3,8 @@ import logging from pathlib import Path -from docling.cli.main import OcrEngine from docling.datamodel.base_models import ConversionStatus +from docling.datamodel.pipeline_options import OcrMacOptions from docling_core.types.doc.document import ImageRefMode from docling_core.types.doc.labels import DocItemLabel from tqdm import tqdm # type: ignore @@ -140,7 +140,7 @@ def main(): # Create Converter doc_converter = create_image_docling_converter( - do_ocr=True, ocr_lang=["en"], ocr_engine=OcrEngine.OCRMAC + do_ocr=True, ocr_lang=["en"], ocr_engine=OcrMacOptions.kind ) records = [] From c55095e0a9c2a0bde5c24c0b42e30dcfd5b87b3f Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 25 Mar 2025 21:13:37 +0100 Subject: [PATCH 29/81] Added TableDatasetBuilder and test, update TableFormerPredictionProvider Signed-off-by: Christoph Auer --- .../tableformer_huggingface_otsl/create.py | 9 +- .../models/tableformer/tf_model_prediction.py | 15 +- .../otsl_table_dataset_builder.py | 256 ++++++ .../prediction_provider.py | 17 +- poetry.lock | 852 ++++++++++++------ pyproject.toml | 2 +- tests/test_dataset_builder.py | 82 +- 7 files changed, 930 insertions(+), 303 deletions(-) create mode 100644 docling_eval_next/dataset_builders/otsl_table_dataset_builder.py diff --git a/docling_eval/benchmarks/tableformer_huggingface_otsl/create.py b/docling_eval/benchmarks/tableformer_huggingface_otsl/create.py index b2e49270..2187aba5 100644 --- a/docling_eval/benchmarks/tableformer_huggingface_otsl/create.py +++ b/docling_eval/benchmarks/tableformer_huggingface_otsl/create.py @@ -76,22 +76,19 @@ def create_page_tokens(data: List[Any], height: float, width: float) -> PageToke { "bbox": { "l": item["bbox"][0], - # "t": height - item["bbox"][3], "t": item["bbox"][1], "r": item["bbox"][2], - # "b": height - item["bbox"][1], "b": item["bbox"][3], - # "coord_origin": str(CoordOrigin.BOTTOMLEFT.value) "coord_origin": str(CoordOrigin.TOPLEFT.value), }, - "text": "".join(item["tokens"]), + "text": text, "id": cnt, } ) cnt += 1 result = {"tokens": tokens, "height": height, "width": width} - return PageTokens.parse_obj(result) + return PageTokens.model_validate(result) def create_huggingface_otsl_tableformer_dataset( @@ -211,9 +208,9 @@ def create_huggingface_otsl_tableformer_dataset( # Create the updated Document updated, pred_doc = tf_updater.replace_tabledata_with_page_tokens( - page_tokens=page_tokens, true_doc=true_doc, true_page_images=true_page_images, + page_tokens=page_tokens, ) true_doc, true_pictures, true_page_images = extract_images( diff --git a/docling_eval/converters/models/tableformer/tf_model_prediction.py b/docling_eval/converters/models/tableformer/tf_model_prediction.py index b6537563..870a3a31 100644 --- a/docling_eval/converters/models/tableformer/tf_model_prediction.py +++ b/docling_eval/converters/models/tableformer/tf_model_prediction.py @@ -227,9 +227,9 @@ def _tf_predict_with_page_tokens( def replace_tabledata_with_page_tokens( self, - page_tokens: PageTokens, true_doc: DoclingDocument, true_page_images: List[Image.Image], + page_tokens: Optional[PageTokens] = None, ) -> Tuple[bool, DoclingDocument]: updated = False @@ -259,6 +259,19 @@ def replace_tabledata_with_page_tokens( min(prov.bbox.t, page_size.height), ) + if page_tokens is None: + ptokens = [] + for ix, table_cell in enumerate(item.data.table_cells): + pt = PageToken( + bbox=table_cell.bbox, text=table_cell.text, id=ix + ) + ptokens.append(pt) + page_tokens = PageTokens( + tokens=ptokens, + height=prov.bbox.height, + width=prov.bbox.width, + ) + table_data = self._tf_predict_with_page_tokens( page_image=page_image, page_tokens=page_tokens, diff --git a/docling_eval_next/dataset_builders/otsl_table_dataset_builder.py b/docling_eval_next/dataset_builders/otsl_table_dataset_builder.py new file mode 100644 index 00000000..66bcbc4c --- /dev/null +++ b/docling_eval_next/dataset_builders/otsl_table_dataset_builder.py @@ -0,0 +1,256 @@ +import io +import logging +import os +from pathlib import Path +from typing import Any, Iterable, List, Optional + +from datasets import load_dataset +from docling_core.types import DoclingDocument +from docling_core.types.doc import ( + BoundingBox, + CoordOrigin, + ImageRef, + PageItem, + ProvenanceItem, + Size, +) +from docling_core.types.io import DocumentStream +from tqdm import tqdm + +from docling_eval.benchmarks.constants import BenchMarkColumns, EvaluationModality +from docling_eval.benchmarks.utils import ( + convert_html_table_into_docling_tabledata, + extract_images, + from_pil_to_base64uri, + get_binhash, +) +from docling_eval.converters.models.tableformer.tf_model_prediction import PageTokens +from docling_eval_next.datamodels.dataset_record import DatasetRecord +from docling_eval_next.dataset_builders.dataset_builder import ( + BaseEvaluationDatasetBuilder, + HFSource, +) + +_log = logging.getLogger(__name__) + + +class TableDatasetBuilder(BaseEvaluationDatasetBuilder): + """Base class for table dataset builders.""" + + def __init__( + self, + name: str, + dataset_source: HFSource, + target: Path, + split: str = "test", + max_items: int = -1, + ): + super().__init__( + name=name, + dataset_source=dataset_source, + target=target, + ) + self.split = split + self.max_items = max_items + + def retrieve_input_dataset(self) -> Path: + """Download and extract the dataset.""" + assert isinstance(self.dataset_source, HFSource) + dataset_path = super().retrieve_input_dataset() + self.retrieved = True + return dataset_path + + def create_page_tokens( + self, data: List[Any], height: float, width: float + ) -> PageTokens: + """Create page tokens from cell data.""" + tokens = [] + cnt = 0 + for i, row in enumerate(data): + for j, item in enumerate(row): + text = "".join(item["tokens"]) + tokens.append( + { + "bbox": { + "l": item["bbox"][0], + "t": item["bbox"][1], + "r": item["bbox"][2], + "b": item["bbox"][3], + "coord_origin": str(CoordOrigin.TOPLEFT.value), + }, + "text": text, + "id": cnt, + } + ) + cnt += 1 + result = {"tokens": tokens, "height": height, "width": width} + return PageTokens.model_validate(result) + + def iterate(self) -> Iterable[DatasetRecord]: + """Iterate through the dataset and yield DatasetRecord objects.""" + if not self.retrieved: + raise RuntimeError( + "You must first retrieve the source dataset. Call retrieve_input_dataset()." + ) + + assert isinstance(self.dataset_source, HFSource) + # Load dataset from the retrieved path + ds = load_dataset(self.dataset_source.repo_id, split=self.split) + + if self.max_items > 0: + ds = ds.select(range(self.max_items)) + + for item in tqdm(ds, desc=f"Processing {self.name} dataset"): + try: + filename = item["filename"] + table_image = item["image"] + + page_tokens = self.create_page_tokens( + data=item["cells"], + height=table_image.height, + width=table_image.width, + ) + + # Create ground truth document + true_doc = DoclingDocument(name=f"ground-truth {filename}") + + # Add page to document + page_index = 1 + image_ref = ImageRef( + mimetype="image/png", + dpi=72, + size=Size( + width=float(table_image.width), height=float(table_image.height) + ), + uri=from_pil_to_base64uri(table_image), + ) + page_item = PageItem( + page_no=page_index, + size=Size( + width=float(table_image.width), height=float(table_image.height) + ), + image=image_ref, + ) + true_doc.pages[1] = page_item + + # Create table data + html = "" + "".join(item["html"]) + "
    " + table_data = convert_html_table_into_docling_tabledata( + html, text_cells=item["cells"][0] + ) + + for tbl_cell, page_token in zip( + table_data.table_cells, page_tokens.tokens, strict=True + ): + tbl_cell.bbox = page_token.bbox + + # Create bounding box for table + l = 0.0 + b = 0.0 + r = table_image.width + t = table_image.height + if "table_bbox" in item: + l = item["table_bbox"][0] + b = table_image.height - item["table_bbox"][3] + r = item["table_bbox"][2] + t = table_image.height - item["table_bbox"][1] + + bbox = BoundingBox( + l=l, + r=r, + b=b, + t=t, + coord_origin=CoordOrigin.BOTTOMLEFT, + ) + + # Create provenance + prov = ProvenanceItem(page_no=page_index, bbox=bbox, charspan=(0, 0)) + + # Add table to document + true_doc.add_table(data=table_data, caption=None, prov=prov) + + # Extract images + true_doc, true_pictures, true_page_images = extract_images( + document=true_doc, + pictures_column=BenchMarkColumns.GROUNDTRUTH_PICTURES.value, + page_images_column=BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES.value, + ) + + # Create dataset record + with io.BytesIO() as img_byte_stream: + table_image.save(img_byte_stream, format="PNG") + img_byte_stream.seek(0) + img_bytes = img_byte_stream.read() + + record = DatasetRecord( + doc_id=str(Path(filename).stem), + doc_hash=get_binhash(img_bytes), + ground_truth_doc=true_doc, + original=DocumentStream( + name=filename, stream=io.BytesIO(img_bytes) + ), + mime_type="image/png", + modalities=[EvaluationModality.TABLE_STRUCTURE], + ground_truth_pictures=true_pictures, + ground_truth_page_images=true_page_images, + ) + + yield record + except Exception as ex: + _log.error( + f"Error processing item {item.get('filename', 'unknown')}: {str(ex)}" + ) + + +class FintabNetDatasetBuilder(TableDatasetBuilder): + """Dataset builder for FinTabNet.""" + + def __init__( + self, + target: Path, + split: str = "test", + max_items: int = -1, + ): + super().__init__( + name="FinTabNet", + dataset_source=HFSource(repo_id="ds4sd/FinTabNet_OTSL"), + target=target, + split=split, + max_items=max_items, + ) + + +class PubTabNetDatasetBuilder(TableDatasetBuilder): + """Dataset builder for PubTabNet.""" + + def __init__( + self, + target: Path, + split: str = "val", # PubTabNet uses "val" instead of "test" + max_items: int = -1, + ): + super().__init__( + name="PubTabNet", + dataset_source=HFSource(repo_id="ds4sd/PubTabNet_OTSL"), + target=target, + split=split, + max_items=max_items, + ) + + +class PubTables1MDatasetBuilder(TableDatasetBuilder): + """Dataset builder for PubTables-1M.""" + + def __init__( + self, + target: Path, + split: str = "test", + max_items: int = -1, + ): + super().__init__( + name="PubTables-1M", + dataset_source=HFSource(repo_id="ds4sd/PubTables-1M_OTSL-v1.1"), + target=target, + split=split, + max_items=max_items, + ) diff --git a/docling_eval_next/prediction_providers/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py index 1c1601c4..8f7576db 100644 --- a/docling_eval_next/prediction_providers/prediction_provider.py +++ b/docling_eval_next/prediction_providers/prediction_provider.py @@ -173,27 +173,26 @@ def __init__( def prediction_format(self) -> PredictionFormats: return PredictionFormats.DOCLING_DOCUMENT - def predict( - self, record: DatasetRecord, page_tokens: Optional[List[PageToken]] = None - ) -> Tuple[DoclingDocument, Optional[str]]: + def predict(self, record: DatasetRecord) -> Tuple[DoclingDocument, Optional[str]]: assert ( record.ground_truth_doc is not None ), "true_doc must be given for TableFormer prediction provider to work." - assert record.original is None or isinstance(record.original, DocumentStream) + if record.mime_type == "application/pdf": + assert isinstance(record.original, DocumentStream) - if record.original is not None and page_tokens is None: updated, pred_doc = self.tf_updater.replace_tabledata( copy.deepcopy(record.original.stream), record.ground_truth_doc ) - elif page_tokens is not None: + elif record.mime_type == "image/png": updated, pred_doc = self.tf_updater.replace_tabledata_with_page_tokens( - page_tokens, record.ground_truth_doc, [] - ) # FIXME: Must not expect page images. + record.ground_truth_doc, + record.ground_truth_page_images, + ) else: raise RuntimeError( - "TableFormerPredictionProvider.predict must be called with a stream or page_tokens." + "TableFormerPredictionProvider is missing data to predict on." ) return pred_doc, None diff --git a/poetry.lock b/poetry.lock index cc576a53..4d684a5c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "accelerate" @@ -6,6 +6,8 @@ version = "1.5.2" description = "Accelerate" optional = false python-versions = ">=3.9.0" +groups = ["main"] +markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "accelerate-1.5.2-py3-none-any.whl", hash = "sha256:68a3b272f6a6ffebb457bdc138581a2bf52efad6a5e0214dc46675f3edd98792"}, {file = "accelerate-1.5.2.tar.gz", hash = "sha256:a1cf39473edc0e42772a9d9a18c9eb1ce8ffd9e1719dc0ab80670f5c1fd4dc43"}, @@ -37,6 +39,7 @@ version = "2.6.1" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, @@ -48,6 +51,7 @@ version = "3.11.14" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e2bc827c01f75803de77b134afdbf74fa74b62970eafdf190f3244931d7a5c0d"}, {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e365034c5cf6cf74f57420b57682ea79e19eb29033399dd3f40de4d0171998fa"}, @@ -143,7 +147,7 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] +speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.2.0) ; sys_platform == \"linux\" or sys_platform == \"darwin\"", "brotlicffi ; platform_python_implementation != \"CPython\""] [[package]] name = "aiosignal" @@ -151,6 +155,7 @@ version = "1.3.2" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, @@ -165,6 +170,7 @@ 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"}, @@ -176,6 +182,8 @@ version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false python-versions = ">=3.6" +groups = ["dev"] +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"}, @@ -187,6 +195,7 @@ version = "1.0.3" description = "APTED algorithm for the Tree Edit Distance" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "apted-1.0.3-py3-none-any.whl", hash = "sha256:74193369d023649d335269e67c4df07f922959e5ac2597de1b79af4e694150e8"}, {file = "apted-1.0.3.tar.gz", hash = "sha256:befa5181e2d4457fa88e54995a82604ee048bb2fbc781ea97d8e1856b4715ce9"}, @@ -198,6 +207,7 @@ version = "2.15.8" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.7.2" +groups = ["dev"] files = [ {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, @@ -217,6 +227,7 @@ version = "3.0.0" description = "Annotate AST trees with source code positions" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, @@ -232,6 +243,8 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version == \"3.10\"" files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, @@ -243,18 +256,19 @@ version = "25.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, ] [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]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -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"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "autopep8" @@ -262,6 +276,7 @@ version = "2.2.0" description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "autopep8-2.2.0-py2.py3-none-any.whl", hash = "sha256:05418a981f038969d8bdcd5636bf15948db7555ae944b9f79b5a34b35f1370d4"}, {file = "autopep8-2.2.0.tar.gz", hash = "sha256:d306a0581163ac29908280ad557773a95a9bede072c0fafed6f141f5311f43c1"}, @@ -277,6 +292,8 @@ version = "1.2.0" description = "Backport of CPython tarfile module" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version == \"3.10\" or python_version == \"3.11\"" files = [ {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, @@ -292,6 +309,7 @@ version = "4.13.3" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" +groups = ["main"] files = [ {file = "beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16"}, {file = "beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b"}, @@ -314,6 +332,7 @@ version = "24.10.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, @@ -362,6 +381,7 @@ version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, @@ -373,6 +393,8 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "implementation_name == \"pypy\" or sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" 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"}, @@ -452,6 +474,7 @@ version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -463,6 +486,7 @@ 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", "dev"] 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"}, @@ -564,6 +588,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -578,6 +603,7 @@ version = "0.4.0" description = "Logging integration for Click" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, @@ -592,10 +618,12 @@ 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", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {main = "platform_system == \"Windows\""} [[package]] name = "comm" @@ -603,6 +631,7 @@ version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, @@ -620,6 +649,7 @@ version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, @@ -693,6 +723,8 @@ version = "44.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.7" +groups = ["dev"] +markers = "sys_platform == \"linux\"" files = [ {file = "cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7"}, {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1"}, @@ -735,10 +767,10 @@ files = [ cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""] docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] -pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""] +pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] test = ["certifi (>=2024)", "cryptography-vectors (==44.0.2)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] @@ -750,6 +782,7 @@ version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -761,13 +794,14 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "datasets" -version = "3.4.0" +version = "3.4.1" description = "HuggingFace community-driven open-source library of datasets" optional = false python-versions = ">=3.9.0" +groups = ["main"] files = [ - {file = "datasets-3.4.0-py3-none-any.whl", hash = "sha256:35ef5182bddd38f7aa774d9f33c3e8b8e9c9c7ea41b4b7969fde431919cb556b"}, - {file = "datasets-3.4.0.tar.gz", hash = "sha256:f3defae5d9c79ff586db3b17389fdde01704ffea015293a050d7e8ab6816bad8"}, + {file = "datasets-3.4.1-py3-none-any.whl", hash = "sha256:b91cf257bd64132fa9d953dd4768ab6d63205597301f132a74271cfcce8b5dd3"}, + {file = "datasets-3.4.1.tar.gz", hash = "sha256:e23968da79bc014ef9f7540eeb7771c6180eae82c86ebcfcc10535a03caf08b5"}, ] [package.dependencies] @@ -787,17 +821,17 @@ tqdm = ">=4.66.3" xxhash = "*" [package.extras] -audio = ["librosa", "soundfile (>=0.12.1)", "soxr (>=0.4.0)"] +audio = ["librosa", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\""] benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] -dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers", "transformers (>=4.42.0)", "zstandard"] +dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\"", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0) ; python_version < \"3.10\"", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers", "transformers (>=4.42.0)", "zstandard"] docs = ["s3fs", "tensorflow (>=2.6.0)", "torch", "transformers"] jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] quality = ["ruff (>=0.3.0)"] s3 = ["s3fs"] tensorflow = ["tensorflow (>=2.6.0)"] tensorflow-gpu = ["tensorflow (>=2.6.0)"] -tests = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] -tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] +tests = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\"", "tensorflow (>=2.6.0) ; python_version < \"3.10\"", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] +tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] torch = ["torch"] vision = ["Pillow (>=9.4.0)"] @@ -807,6 +841,7 @@ version = "1.8.13" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "debugpy-1.8.13-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:06859f68e817966723ffe046b896b1bd75c665996a77313370336ee9e1de3e90"}, {file = "debugpy-1.8.13-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c2db69fb8df3168bc857d7b7d2494fed295dfdbde9a45f27b4b152f37520"}, @@ -842,6 +877,7 @@ version = "5.2.1" description = "Decorators for Humans" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, @@ -853,6 +889,7 @@ version = "0.3.8" description = "serialize all of Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, @@ -868,6 +905,7 @@ version = "0.1.3" description = "Utilities for comparing sequences" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "Distance-0.1.3.tar.gz", hash = "sha256:60807584f5b6003f5c521aa73f39f51f631de3be5cccc5a1d67166fcbf0d4551"}, ] @@ -878,6 +916,7 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -885,22 +924,23 @@ files = [ [[package]] name = "docling" -version = "2.26.0" +version = "2.28.1" description = "SDK and CLI for parsing PDF, DOCX, HTML, and more, to a unified document representation for powering downstream workflows such as gen AI applications." optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ - {file = "docling-2.26.0-py3-none-any.whl", hash = "sha256:0ddebcd4c258c8fa9e4f84801940ae3c4fce59ad8ff81bc10939f686073323a0"}, - {file = "docling-2.26.0.tar.gz", hash = "sha256:db7fc425b876023e4ad42a1fdfc0f285f507c38bc8a24ee2ae00e2eb8af0120d"}, + {file = "docling-2.28.1-py3-none-any.whl", hash = "sha256:aae0dbfb8a8aacadfd3662782bc45c0688459dd1dafc5a69ad81318a8abfb6a5"}, + {file = "docling-2.28.1.tar.gz", hash = "sha256:1a48d810cbbd0855b40c7a8df4a6ce9477aeb133580a329ab1906e5807f4369d"}, ] [package.dependencies] accelerate = {version = ">=1.2.1,<2.0.0", optional = true, markers = "(sys_platform != \"darwin\" or platform_machine != \"x86_64\") and extra == \"vlm\""} beautifulsoup4 = ">=4.12.3,<5.0.0" certifi = ">=2024.7.4" -docling-core = {version = ">=2.19.0,<3.0.0", extras = ["chunking"]} +docling-core = {version = ">=2.23.1,<3.0.0", extras = ["chunking"]} docling-ibm-models = ">=3.4.0,<4.0.0" -docling-parse = ">=3.3.0,<4.0.0" +docling-parse = ">=4.0.0,<5.0.0" easyocr = ">=1.7,<2.0" filetype = ">=1.2.0,<2.0.0" huggingface_hub = ">=0.23,<1" @@ -909,8 +949,10 @@ marko = ">=2.1.2,<3.0.0" openpyxl = ">=3.1.5,<4.0.0" pandas = ">=2.1.4,<3.0.0" pillow = ">=10.0.0,<12.0.0" +pluggy = ">=1.0.0,<2.0.0" pydantic = ">=2.0.0,<3.0.0" pydantic-settings = ">=2.3.0,<3.0.0" +pylatexenc = ">=2.10,<3.0" pypdfium2 = ">=4.30.0,<5.0.0" python-docx = ">=1.1.2,<2.0.0" python-pptx = ">=1.0.2,<2.0.0" @@ -919,26 +961,27 @@ rtree = ">=1.3.0,<2.0.0" scipy = {version = ">=1.6.0,<2.0.0", markers = "python_version >= \"3.10\""} tqdm = ">=4.65.0,<5.0.0" transformers = [ - {version = ">=4.46.0,<5.0.0", optional = true, markers = "sys_platform != \"darwin\" and extra == \"vlm\" or platform_machine != \"x86_64\" and extra == \"vlm\""}, + {version = ">=4.46.0,<5.0.0", optional = true, markers = "(sys_platform != \"darwin\" or platform_machine != \"x86_64\") and extra == \"vlm\""}, {version = ">=4.42.0,<4.43.0", optional = true, markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\" and extra == \"vlm\""}, ] typer = ">=0.12.5,<0.13.0" [package.extras] -ocrmac = ["ocrmac (>=1.0.0,<2.0.0)"] -rapidocr = ["onnxruntime (>=1.7.0,<1.20.0)", "onnxruntime (>=1.7.0,<2.0.0)", "rapidocr-onnxruntime (>=1.4.0,<2.0.0)"] +ocrmac = ["ocrmac (>=1.0.0,<2.0.0) ; sys_platform == \"darwin\""] +rapidocr = ["onnxruntime (>=1.7.0,<1.20.0) ; python_version < \"3.10\"", "onnxruntime (>=1.7.0,<2.0.0) ; python_version >= \"3.10\"", "rapidocr-onnxruntime (>=1.4.0,<2.0.0) ; python_version < \"3.13\""] tesserocr = ["tesserocr (>=2.7.1,<3.0.0)"] -vlm = ["accelerate (>=1.2.1,<2.0.0)", "transformers (>=4.42.0,<4.43.0)", "transformers (>=4.46.0,<5.0.0)"] +vlm = ["accelerate (>=1.2.1,<2.0.0) ; sys_platform != \"darwin\" or platform_machine != \"x86_64\"", "transformers (>=4.42.0,<4.43.0) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "transformers (>=4.46.0,<5.0.0) ; sys_platform != \"darwin\" or platform_machine != \"x86_64\""] [[package]] name = "docling-core" -version = "2.23.3" +version = "2.24.0" description = "A python library to define and validate data types in Docling." optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ - {file = "docling_core-2.23.3-py3-none-any.whl", hash = "sha256:a2166ffc41f8fdf6fdb99b33da6c7146eccf6382712ea92e95772604fb5af5e5"}, - {file = "docling_core-2.23.3.tar.gz", hash = "sha256:a64ce41e0881c06962a2b3ec80e0665f84de0809dedf1bf84f3a14b75dd665c4"}, + {file = "docling_core-2.24.0-py3-none-any.whl", hash = "sha256:5c14f8dd8c6add6f5fa8104ff202df1baa7fd2471123bea56137f866e21b8d40"}, + {file = "docling_core-2.24.0.tar.gz", hash = "sha256:7bb880a72963accb47c9d05edd712601ccbd1d8a9fccba14ae6ef41baef41c69"}, ] [package.dependencies] @@ -964,6 +1007,7 @@ version = "3.4.1" description = "This package contains the AI models used by the Docling PDF conversion package" optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ {file = "docling_ibm_models-3.4.1-py3-none-any.whl", hash = "sha256:c3582c99dddfa3f0eafcf80cf1267fd8efa39c4a74cc7a88f9dd49684fac2986"}, {file = "docling_ibm_models-3.4.1.tar.gz", hash = "sha256:093b4dff2ea284a4953c3aa009e29945208b8d389b94fb14940a03a93f673e96"}, @@ -991,43 +1035,44 @@ transformers = [ [[package]] name = "docling-parse" -version = "3.4.0" +version = "4.0.0" description = "Simple package to extract text with coordinates from programmatic PDFs" optional = false python-versions = "<4.0,>=3.9" -files = [ - {file = "docling_parse-3.4.0-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:96e95e63ab722dfe5340fcb04d0e07bd1c0a0ba2f62e93c91ac26dda0a312a44"}, - {file = "docling_parse-3.4.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:f9e14a7a0b92526d4dfd3f390f3d7e075f59d14d6b8a0a564fbc26299e56cd47"}, - {file = "docling_parse-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdef1d51291e841e5b6a32689a39a9f35986389f863b415eaa1790b29d021101"}, - {file = "docling_parse-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68652610d6c34adc684dbaa77b5d596b25d004912a78e85ec4ae57910bf7086f"}, - {file = "docling_parse-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:daad07fe93f306d8e2378acb24ef2fa68535ccdb960a1b99d6b36ab8c299fef1"}, - {file = "docling_parse-3.4.0-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:6f30c5fd3c04bd3d1a7d06baeae2e5c3adbebc284071a9a52b0150bcd4917a3d"}, - {file = "docling_parse-3.4.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:2c3664e4c8980dc44e0d026b1b01fbc94f0dac9adf7be835071d4a761977c36d"}, - {file = "docling_parse-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3febf7515453d18df03c275356db2bb5b0618ba9fc033aba05d58318a9846b1a"}, - {file = "docling_parse-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75aeb038bb7f6400ecde99cf6c4ef35867c528ac21676071a822ed72d0653149"}, - {file = "docling_parse-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d20e3584022542448c21ed0ac868b2457ae35211cea63ed20142e375549e633"}, - {file = "docling_parse-3.4.0-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:ddfe2bd730ed08363f25954a0480da021e6e6bdb175276643cc2913a6bbd98e2"}, - {file = "docling_parse-3.4.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:faf8ba9eaab8c17ea72516be5d440f754fcca27f37488dcf126a0f3ac3a63058"}, - {file = "docling_parse-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eb5e7e50b3057690d0d4fa651363cafd7735bb952378dd8a4ca6c7d359507db"}, - {file = "docling_parse-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:452334b387e2c699f69acf37a4ea4ae7097d062a2dd1980c573b73051c031158"}, - {file = "docling_parse-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1ba00147ccb0a1dc10cdf58645e67f4ee895c6920bc583bc6f25d27cd562bfed"}, - {file = "docling_parse-3.4.0-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:2b22a33a2d2f3616a7ac0f4b2f2ba6099f8a5dc6fa328be0f17c9c506455d7c1"}, - {file = "docling_parse-3.4.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:0dd2440a94d555f98b702e88bfe7cc5a585d9191f4ea93884b02e286e7af3a06"}, - {file = "docling_parse-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f5828744a0e33136e09e8c61ca0b2c0ead8f76595f2e0955beaac16adce51f5"}, - {file = "docling_parse-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26fff6e36809d17ff855532f985df3738ada8d86a9fc746049ea6e6524d5e0a2"}, - {file = "docling_parse-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:13fc442f64171280db98dc4507274ffa0a65bac94eecbcc60c3cbf41f433b556"}, - {file = "docling_parse-3.4.0-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:16d570ab655ea5a25d9cd1e27bc4d6905372784907d679cde4cef2fb22df61c7"}, - {file = "docling_parse-3.4.0-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:05bd405635be2379ef6cb0c7c39dc08edf3ba93788eb0fca7426b2218538bce1"}, - {file = "docling_parse-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6c92f0353bbae7ca9b39553cc4d03f5fefdab33ecd26809ab710cc752fac03c"}, - {file = "docling_parse-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e883326ec4121891c48d365d064e5ae30c5b90a2dac44ed61ac02e7da41345d"}, - {file = "docling_parse-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:b2a0fe1e1d88c3814553137daa597ee34dc310f50fe415e1f8a1c6e611d95e42"}, - {file = "docling_parse-3.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:930f5a5d78404de573c0ba302d313b6647f1e86714766e5a1cdc09af014ca111"}, - {file = "docling_parse-3.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:328fd72f274b939d454e3ff20a73074d99664cb4a51e6ccdaf195a6626691b95"}, - {file = "docling_parse-3.4.0.tar.gz", hash = "sha256:36cdd17bcc4a833b5c9af9ae3dc461ed18a975c1b084ccfd19a9d9cde4f66e14"}, +groups = ["main"] +files = [ + {file = "docling_parse-4.0.0-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:6de7fa8ec4919f604c9a02a3fa8ca0e13a3a8e3c0652adc41848616b737925d9"}, + {file = "docling_parse-4.0.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:82704280ab086a84a30d9ec9def6cd96b733aefc6973546b2101d09eed7a958e"}, + {file = "docling_parse-4.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f51ec645978d75e7cf232fa7c571ebf164a5bdf418588c663f9b3c062df6ba72"}, + {file = "docling_parse-4.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d5da855f35303f9229198891da550e3c1e1f4025e52ab8c0303d345669ff46f"}, + {file = "docling_parse-4.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:ba36cb329aadb306cc25901305d49fe6d2ed9e93e9dc993b4baf13fcc90a98e1"}, + {file = "docling_parse-4.0.0-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:9b7afbf09945b4d9e3ddb9c24a13d7b9f987cf32d5c9d68532ceb63fb26697df"}, + {file = "docling_parse-4.0.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6daaec89c5045e968785a225b9b5a42b36dfe6b5a4437995e2d34e1595e2c162"}, + {file = "docling_parse-4.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e638ef2ad36e9e4a8ef881073696467e6699bf206e5a416de4abaaf531b0e1"}, + {file = "docling_parse-4.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87246eb0d259202a7f093336f17235cb1fffb67e82b41dbc0e88f9c05b08014e"}, + {file = "docling_parse-4.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:0ae44b913b010994c3e36869e5fc9dad252a7dc7434225790928075c8b5a7f6c"}, + {file = "docling_parse-4.0.0-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:ed6d8ac29c1014ed7a126d782b6bc963c9a9c09f41224fa90f9a8b45bf3191f9"}, + {file = "docling_parse-4.0.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:4a2dd46cee8e54f3aa511dbf552ef5f9f422944c54de73888ee55b2c4a6e10b9"}, + {file = "docling_parse-4.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722fbd63f7f28e8a49fa2cd92d1571290f6c5295b86c7406b7c20a6c6e8b3975"}, + {file = "docling_parse-4.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc155767b51a23f5bfd5abaabaf8c4a57777aa0277c813e13b9f6c43532964bd"}, + {file = "docling_parse-4.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:e45ab31fffe4ae571bd2ecc9e0a9d5665a1486463396924160add84828d2a7e7"}, + {file = "docling_parse-4.0.0-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:d93fd3cec032e5b7f6385f7a021e228c52eb381f28fc037224708aeaad487d8b"}, + {file = "docling_parse-4.0.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d9f64847cd7e9a7a34a3d5a14f0827022ed3b7f50f39d5126ef003c55d574ba3"}, + {file = "docling_parse-4.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6ac283f08680dfde568b5629ab94830cab32795d74086553e755460b6879901"}, + {file = "docling_parse-4.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97eca28220dc5075099e01f2cb7a3e9005b9951dee0ca0eb743e298be7284279"}, + {file = "docling_parse-4.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:6019288cfe25a97993c2aab453386fc3e366d7761637e682b25915ba2c856cc4"}, + {file = "docling_parse-4.0.0-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:168c861233fc2a1e4b7d934aa6f7e1b3f568434fd478f18f0b3bcc09880d504c"}, + {file = "docling_parse-4.0.0-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:b1cc0b7a214bc9e4e05c65572c4a17c19d0f4f0795fe1fa77a0ad499ab7e4e79"}, + {file = "docling_parse-4.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cec16060eba37db3fa2ff0b34d283cf33384caecc73b0d8dbf012e3b3941c21d"}, + {file = "docling_parse-4.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a058c2330d7759d943ae50db9e4ecab60201a54116052f94e6e7a3886886b65"}, + {file = "docling_parse-4.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:05af04972fef73f2e10cc46c8f541aaf6713fdcad254502a0012884109c1d468"}, + {file = "docling_parse-4.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:30c0c1b33c0a0aeb6897537f7d8fa09ed5a26f05685b18a2d27c73a789343679"}, + {file = "docling_parse-4.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2dff48f5fef106539137a4e63ee58b5be0e7a81ac1aedd61a4453c268b8f76d1"}, + {file = "docling_parse-4.0.0.tar.gz", hash = "sha256:5be0ba4e0098524f116743e6b709f29fe273e441e61923c3a262e054643c5ee6"}, ] [package.dependencies] -docling-core = ">=2.14.0,<3.0.0" +docling-core = ">=2.23.0,<3.0.0" pillow = ">=10.0.0,<12.0.0" pydantic = ">=2.0.0,<3.0.0" pywin32 = {version = ">=305", markers = "sys_platform == \"win32\""} @@ -1039,6 +1084,7 @@ version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, @@ -1050,6 +1096,7 @@ version = "1.3.1" description = "Dictionary wrapper for quick access to deeply nested keys." optional = false python-versions = ">=3.5,<4.0" +groups = ["dev"] files = [ {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, @@ -1061,6 +1108,7 @@ version = "1.7.2" description = "End-to-End Multi-Lingual Optical Character Recognition (OCR) Solution" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "easyocr-1.7.2-py3-none-any.whl", hash = "sha256:5be12f9b0e595d443c9c3d10b0542074b50f0ec2d98b141a109cd961fd1c177c"}, ] @@ -1085,6 +1133,7 @@ version = "2.0.0" description = "An implementation of lxml.xmlfile for the standard library" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, @@ -1096,6 +1145,7 @@ version = "0.4.3" description = "HuggingFace community-driven open-source library of evaluation" optional = false python-versions = ">=3.8.0" +groups = ["main"] files = [ {file = "evaluate-0.4.3-py3-none-any.whl", hash = "sha256:47d8770bdea76e2c2ed0d40189273027d1a41ccea861bcc7ba12d30ec5d1e517"}, {file = "evaluate-0.4.3.tar.gz", hash = "sha256:3a5700cf83aabee9549264e1e5666f116367c61dbd4d38352015e859a5e2098d"}, @@ -1131,6 +1181,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version == \"3.10\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1145,6 +1197,7 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1159,13 +1212,14 @@ version = "2.2.0" description = "Get the currently executing AST node of a frame, and other information" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] [[package]] name = "filelock" @@ -1173,6 +1227,7 @@ version = "3.18.0" description = "A platform independent file lock." optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, @@ -1181,7 +1236,7 @@ files = [ [package.extras] docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] -typing = ["typing-extensions (>=4.12.2)"] +typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] [[package]] name = "filetype" @@ -1189,6 +1244,7 @@ version = "1.2.0" description = "Infer file type and MIME type of any file/buffer. No external dependencies." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"}, {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"}, @@ -1200,6 +1256,7 @@ version = "6.1.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" +groups = ["dev"] files = [ {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, @@ -1216,6 +1273,7 @@ version = "1.2.3" description = "Flake8 plug-in loading the configuration from pyproject.toml" optional = false python-versions = ">= 3.6" +groups = ["dev"] files = [ {file = "flake8_pyproject-1.2.3-py3-none-any.whl", hash = "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a"}, ] @@ -1233,6 +1291,7 @@ version = "4.56.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "fonttools-4.56.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:331954d002dbf5e704c7f3756028e21db07097c19722569983ba4d74df014000"}, {file = "fonttools-4.56.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d1613abd5af2f93c05867b3a3759a56e8bf97eb79b1da76b2bc10892f96ff16"}, @@ -1287,18 +1346,18 @@ files = [ ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "pycairo", "scipy"] +interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] -type1 = ["xattr"] +type1 = ["xattr ; sys_platform == \"darwin\""] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] name = "frozenlist" @@ -1306,6 +1365,7 @@ version = "1.5.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, @@ -1407,6 +1467,7 @@ version = "2024.12.0" description = "File-system specification" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2"}, {file = "fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f"}, @@ -1449,6 +1510,7 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1463,6 +1525,7 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1473,7 +1536,7 @@ gitdb = ">=4.0.1,<5" [package.extras] doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] -test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] [[package]] name = "huggingface-hub" @@ -1481,6 +1544,7 @@ version = "0.29.3" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" +groups = ["main"] files = [ {file = "huggingface_hub-0.29.3-py3-none-any.whl", hash = "sha256:0b25710932ac649c08cdbefa6c6ccb8e88eef82927cacdb048efb726429453aa"}, {file = "huggingface_hub-0.29.3.tar.gz", hash = "sha256:64519a25716e0ba382ba2d3fb3ca082e7c7eb4a2fc634d200e8380006e0760e5"}, @@ -1515,6 +1579,7 @@ version = "2.6.9" description = "File identification library for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "identify-2.6.9-py2.py3-none-any.whl", hash = "sha256:c98b4322da415a8e5a70ff6e51fbc2d2932c015532d77e9f8537b4ba7813b150"}, {file = "identify-2.6.9.tar.gz", hash = "sha256:d40dfe3142a1421d8518e3d3985ef5ac42890683e32306ad614a29490abeb6bf"}, @@ -1529,6 +1594,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1543,6 +1609,7 @@ version = "2.37.0" description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "imageio-2.37.0-py3-none-any.whl", hash = "sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed"}, {file = "imageio-2.37.0.tar.gz", hash = "sha256:71b57b3669666272c818497aebba2b4c5f20d5b37c81720e5e1a56d59c492996"}, @@ -1576,6 +1643,7 @@ version = "8.6.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, @@ -1585,23 +1653,24 @@ files = [ zipp = ">=3.20" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] [[package]] name = "iniconfig" -version = "2.0.0" +version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, ] [[package]] @@ -1610,6 +1679,7 @@ version = "2.2.0" description = "Pythonic task execution" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "invoke-2.2.0-py3-none-any.whl", hash = "sha256:6ea924cc53d4f78e3d98bc436b08069a03077e6f85ad1ddaa8a116d7dad15820"}, {file = "invoke-2.2.0.tar.gz", hash = "sha256:ee6cbb101af1a859c7fe84f2a264c059020b0cb7fe3535f9424300ab568f6bd5"}, @@ -1621,6 +1691,7 @@ version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, @@ -1654,6 +1725,8 @@ version = "8.34.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" +groups = ["dev"] +markers = "python_version == \"3.10\"" files = [ {file = "ipython-8.34.0-py3-none-any.whl", hash = "sha256:0419883fa46e0baa182c5d50ebb8d6b49df1889fdb70750ad6d8cfe678eda6e3"}, {file = "ipython-8.34.0.tar.gz", hash = "sha256:c31d658e754673ecc6514583e7dda8069e47136eb62458816b7d1e6625948b5a"}, @@ -1675,7 +1748,7 @@ typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli ; python_version < \"3.11\"", "typing_extensions"] kernel = ["ipykernel"] matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] @@ -1686,12 +1759,63 @@ 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 = "ipython" +version = "9.0.2" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.11" +groups = ["dev"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "ipython-9.0.2-py3-none-any.whl", hash = "sha256:143ef3ea6fb1e1bffb4c74b114051de653ffb7737a3f7ab1670e657ca6ae8c44"}, + {file = "ipython-9.0.2.tar.gz", hash = "sha256:ec7b479e3e5656bf4f58c652c120494df1820f4f28f522fb7ca09e213c2aab52"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +ipython-pygments-lexers = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt_toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack_data = "*" +traitlets = ">=5.13.0" +typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[doc,matplotlib,test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinx_toml (==0.0.4)", "typing_extensions"] +matplotlib = ["matplotlib"] +test = ["packaging", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +description = "Defines a variety of Pygments lexers for highlighting IPython code." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c"}, + {file = "ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81"}, +] + +[package.dependencies] +pygments = "*" + [[package]] name = "ipywidgets" version = "8.1.5" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245"}, {file = "ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17"}, @@ -1713,6 +1837,7 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -1727,6 +1852,7 @@ version = "3.4.0" description = "Utility functions for Python class constructs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, @@ -1745,6 +1871,7 @@ version = "6.0.1" description = "Useful decorators and context managers" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, @@ -1755,7 +1882,7 @@ files = [ [package.extras] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] [[package]] name = "jaraco-functools" @@ -1763,6 +1890,7 @@ version = "4.1.0" description = "Functools like those found in stdlib" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"}, {file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"}, @@ -1772,7 +1900,7 @@ files = [ more-itertools = "*" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] @@ -1785,6 +1913,7 @@ version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, @@ -1804,13 +1933,15 @@ version = "0.9.0" description = "Low-level, pure Python DBus protocol wrapper." optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "sys_platform == \"linux\"" files = [ {file = "jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"}, {file = "jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"}, ] [package.extras] -test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +test = ["async-timeout ; python_version < \"3.11\"", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] trio = ["trio"] [[package]] @@ -1819,6 +1950,7 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1836,6 +1968,7 @@ version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, @@ -1847,6 +1980,7 @@ version = "3.1.0" description = "Library with helpers for the jsonlines file format" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "jsonlines-3.1.0-py3-none-any.whl", hash = "sha256:632f5e38f93dfcb1ac8c4e09780b92af3a55f38f26e7c47ae85109d420b6ad39"}, {file = "jsonlines-3.1.0.tar.gz", hash = "sha256:2579cb488d96f815b0eb81629e3e6b0332da0962a18fa3532958f7ba14a5c37f"}, @@ -1861,6 +1995,7 @@ version = "1.1.0" description = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9"}, {file = "jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552"}, @@ -1872,6 +2007,7 @@ 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"}, @@ -1893,6 +2029,7 @@ 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"}, @@ -1907,6 +2044,7 @@ version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" +groups = ["dev"] 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"}, @@ -1921,7 +2059,7 @@ 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"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko ; sys_platform == \"win32\"", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" @@ -1929,6 +2067,7 @@ version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" +groups = ["dev"] 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"}, @@ -1949,6 +2088,7 @@ version = "3.0.13" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" +groups = ["dev"] 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"}, @@ -1960,6 +2100,7 @@ version = "25.6.0" description = "Store and access your passwords safely." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, @@ -1975,7 +2116,7 @@ pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] completion = ["shtab (>=1.1.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] @@ -1989,6 +2130,7 @@ version = "1.4.8" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, @@ -2078,6 +2220,7 @@ version = "3.77.0" description = "Pure Python library for LaTeX to MathML conversion" optional = false python-versions = ">=3.8.1,<4.0.0" +groups = ["main"] files = [ {file = "latex2mathml-3.77.0-py3-none-any.whl", hash = "sha256:5531e18a2a9eae7c24e257118b6a444cbba253cd27ff3e81f1bd6c41e88e786e"}, {file = "latex2mathml-3.77.0.tar.gz", hash = "sha256:e2f501d1878f2e489c3f6f12786bef74c62f712d2770f7f3c837eb20a55d0a1e"}, @@ -2089,6 +2232,7 @@ version = "0.4" description = "Makes it easy to load subpackages and functions on demand." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc"}, {file = "lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1"}, @@ -2108,6 +2252,7 @@ version = "1.10.0" description = "A fast and thorough lazy object proxy." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, @@ -2150,13 +2295,14 @@ files = [ [[package]] name = "lightning-utilities" -version = "0.14.1" +version = "0.14.2" description = "Lightning toolbox for across the our ecosystem." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "lightning_utilities-0.14.1-py3-none-any.whl", hash = "sha256:badc40a70d8e933706aa0b4f63b12392dbf8208728743a40b55edb5e81797311"}, - {file = "lightning_utilities-0.14.1.tar.gz", hash = "sha256:9fb56c76dc07a46c075e1f78594fcb161091eae5944b34c2b43258d23c202791"}, + {file = "lightning_utilities-0.14.2-py3-none-any.whl", hash = "sha256:da791fcaa731f651ec76a1a3b12994ed05af4d6841f2e78760233552709ef05d"}, + {file = "lightning_utilities-0.14.2.tar.gz", hash = "sha256:0466a4f1bb9dff1c7190d4c7a32d1a8a1109f94fb816931efe8fb8b12bb0ab8d"}, ] [package.dependencies] @@ -2175,6 +2321,7 @@ version = "5.3.1" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a4058f16cee694577f7e4dd410263cd0ef75644b43802a689c2b3c2a7e69453b"}, {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:364de8f57d6eda0c16dcfb999af902da31396949efa0e583e12675d09709881b"}, @@ -2329,6 +2476,7 @@ 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"}, @@ -2353,6 +2501,7 @@ version = "2.1.2" description = "A markdown parser with high extensibility." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "marko-2.1.2-py3-none-any.whl", hash = "sha256:c14aa7a77468aaaf53cf056dcd3d32398b9df4c3fb81f5e120dd37cbb9f8c859"}, {file = "marko-2.1.2.tar.gz", hash = "sha256:a9170006b879376e6845c91b1ae3dce2992772954b99b70175ff888537186011"}, @@ -2369,6 +2518,7 @@ 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"}, @@ -2439,6 +2589,7 @@ version = "3.10.1" description = "Python plotting package" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "matplotlib-3.10.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16"}, {file = "matplotlib-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2"}, @@ -2496,6 +2647,7 @@ version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false python-versions = ">=3.8" +groups = ["dev"] 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"}, @@ -2510,6 +2662,7 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, @@ -2521,6 +2674,7 @@ 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"}, @@ -2532,6 +2686,7 @@ version = "10.6.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b"}, {file = "more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"}, @@ -2543,6 +2698,7 @@ version = "2.10.2" description = "A Python package for easy multiprocessing, but faster than multiprocessing" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "mpire-2.10.2-py3-none-any.whl", hash = "sha256:d627707f7a8d02aa4c7f7d59de399dec5290945ddf7fbd36cbb1d6ebb37a51fb"}, {file = "mpire-2.10.2.tar.gz", hash = "sha256:f66a321e93fadff34585a4bfa05e95bd946cf714b442f51c529038eb45773d97"}, @@ -2559,9 +2715,9 @@ tqdm = ">=4.27" [package.extras] dashboard = ["flask"] -dill = ["multiprocess", "multiprocess (>=0.70.15)"] +dill = ["multiprocess (>=0.70.15) ; python_version >= \"3.11\"", "multiprocess ; python_version < \"3.11\""] docs = ["docutils (==0.17.1)", "sphinx (==3.2.1)", "sphinx-autodoc-typehints (==1.11.0)", "sphinx-rtd-theme (==0.5.0)", "sphinx-versions (==1.0.1)", "sphinxcontrib-images (==0.9.2)"] -testing = ["ipywidgets", "multiprocess", "multiprocess (>=0.70.15)", "numpy", "pywin32 (>=301)", "rich"] +testing = ["ipywidgets", "multiprocess (>=0.70.15) ; python_version >= \"3.11\"", "multiprocess ; python_version < \"3.11\"", "numpy", "pywin32 (>=301) ; platform_system == \"Windows\"", "rich"] [[package]] name = "mpmath" @@ -2569,6 +2725,7 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2577,108 +2734,109 @@ files = [ [package.extras] develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] docs = ["sphinx"] -gmpy = ["gmpy2 (>=2.1.0a4)"] +gmpy = ["gmpy2 (>=2.1.0a4) ; platform_python_implementation != \"PyPy\""] tests = ["pytest (>=4.6)"] [[package]] name = "multidict" -version = "6.1.0" +version = "6.2.0" description = "multidict implementation" optional = false -python-versions = ">=3.8" -files = [ - {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, - {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, - {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, - {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, - {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, - {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, - {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, - {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, - {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, - {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, - {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, - {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, - {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, - {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, - {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, - {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, - {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "multidict-6.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b9f6392d98c0bd70676ae41474e2eecf4c7150cb419237a41f8f96043fcb81d1"}, + {file = "multidict-6.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3501621d5e86f1a88521ea65d5cad0a0834c77b26f193747615b7c911e5422d2"}, + {file = "multidict-6.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32ed748ff9ac682eae7859790d3044b50e3076c7d80e17a44239683769ff485e"}, + {file = "multidict-6.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc826b9a8176e686b67aa60fd6c6a7047b0461cae5591ea1dc73d28f72332a8a"}, + {file = "multidict-6.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:214207dcc7a6221d9942f23797fe89144128a71c03632bf713d918db99bd36de"}, + {file = "multidict-6.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05fefbc3cddc4e36da209a5e49f1094bbece9a581faa7f3589201fd95df40e5d"}, + {file = "multidict-6.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e851e6363d0dbe515d8de81fd544a2c956fdec6f8a049739562286727d4a00c3"}, + {file = "multidict-6.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32c9b4878f48be3e75808ea7e499d6223b1eea6d54c487a66bc10a1871e3dc6a"}, + {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7243c5a6523c5cfeca76e063efa5f6a656d1d74c8b1fc64b2cd1e84e507f7e2a"}, + {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0e5a644e50ef9fb87878d4d57907f03a12410d2aa3b93b3acdf90a741df52c49"}, + {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0dc25a3293c50744796e87048de5e68996104d86d940bb24bc3ec31df281b191"}, + {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a49994481b99cd7dedde07f2e7e93b1d86c01c0fca1c32aded18f10695ae17eb"}, + {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:641cf2e3447c9ecff2f7aa6e9eee9eaa286ea65d57b014543a4911ff2799d08a"}, + {file = "multidict-6.2.0-cp310-cp310-win32.whl", hash = "sha256:0c383d28857f66f5aebe3e91d6cf498da73af75fbd51cedbe1adfb85e90c0460"}, + {file = "multidict-6.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:a33273a541f1e1a8219b2a4ed2de355848ecc0254264915b9290c8d2de1c74e1"}, + {file = "multidict-6.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84e87a7d75fa36839a3a432286d719975362d230c70ebfa0948549cc38bd5b46"}, + {file = "multidict-6.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8de4d42dffd5ced9117af2ce66ba8722402541a3aa98ffdf78dde92badb68932"}, + {file = "multidict-6.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7d91a230c7f8af86c904a5a992b8c064b66330544693fd6759c3d6162382ecf"}, + {file = "multidict-6.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f6cad071960ba1914fa231677d21b1b4a3acdcce463cee41ea30bc82e6040cf"}, + {file = "multidict-6.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f74f2fc51555f4b037ef278efc29a870d327053aba5cb7d86ae572426c7cccc"}, + {file = "multidict-6.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14ed9ed1bfedd72a877807c71113deac292bf485159a29025dfdc524c326f3e1"}, + {file = "multidict-6.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac3fcf9a2d369bd075b2c2965544036a27ccd277fc3c04f708338cc57533081"}, + {file = "multidict-6.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fc6af8e39f7496047c7876314f4317736eac82bf85b54c7c76cf1a6f8e35d98"}, + {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f8cb1329f42fadfb40d6211e5ff568d71ab49be36e759345f91c69d1033d633"}, + {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5389445f0173c197f4a3613713b5fb3f3879df1ded2a1a2e4bc4b5b9c5441b7e"}, + {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:94a7bb972178a8bfc4055db80c51efd24baefaced5e51c59b0d598a004e8305d"}, + {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da51d8928ad8b4244926fe862ba1795f0b6e68ed8c42cd2f822d435db9c2a8f4"}, + {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:063be88bd684782a0715641de853e1e58a2f25b76388538bd62d974777ce9bc2"}, + {file = "multidict-6.2.0-cp311-cp311-win32.whl", hash = "sha256:52b05e21ff05729fbea9bc20b3a791c3c11da61649ff64cce8257c82a020466d"}, + {file = "multidict-6.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1e2a2193d3aa5cbf5758f6d5680a52aa848e0cf611da324f71e5e48a9695cc86"}, + {file = "multidict-6.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:437c33561edb6eb504b5a30203daf81d4a9b727e167e78b0854d9a4e18e8950b"}, + {file = "multidict-6.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9f49585f4abadd2283034fc605961f40c638635bc60f5162276fec075f2e37a4"}, + {file = "multidict-6.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5dd7106d064d05896ce28c97da3f46caa442fe5a43bc26dfb258e90853b39b44"}, + {file = "multidict-6.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e25b11a0417475f093d0f0809a149aff3943c2c56da50fdf2c3c88d57fe3dfbd"}, + {file = "multidict-6.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac380cacdd3b183338ba63a144a34e9044520a6fb30c58aa14077157a033c13e"}, + {file = "multidict-6.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61d5541f27533f803a941d3a3f8a3d10ed48c12cf918f557efcbf3cd04ef265c"}, + {file = "multidict-6.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:facaf11f21f3a4c51b62931feb13310e6fe3475f85e20d9c9fdce0d2ea561b87"}, + {file = "multidict-6.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:095a2eabe8c43041d3e6c2cb8287a257b5f1801c2d6ebd1dd877424f1e89cf29"}, + {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0cc398350ef31167e03f3ca7c19313d4e40a662adcb98a88755e4e861170bdd"}, + {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7c611345bbe7cb44aabb877cb94b63e86f2d0db03e382667dbd037866d44b4f8"}, + {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8cd1a0644ccaf27e9d2f6d9c9474faabee21f0578fe85225cc5af9a61e1653df"}, + {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:89b3857652183b8206a891168af47bac10b970d275bba1f6ee46565a758c078d"}, + {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:125dd82b40f8c06d08d87b3510beaccb88afac94e9ed4a6f6c71362dc7dbb04b"}, + {file = "multidict-6.2.0-cp312-cp312-win32.whl", hash = "sha256:76b34c12b013d813e6cb325e6bd4f9c984db27758b16085926bbe7ceeaace626"}, + {file = "multidict-6.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:0b183a959fb88ad1be201de2c4bdf52fa8e46e6c185d76201286a97b6f5ee65c"}, + {file = "multidict-6.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5c5e7d2e300d5cb3b2693b6d60d3e8c8e7dd4ebe27cd17c9cb57020cac0acb80"}, + {file = "multidict-6.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:256d431fe4583c5f1e0f2e9c4d9c22f3a04ae96009b8cfa096da3a8723db0a16"}, + {file = "multidict-6.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a3c0ff89fe40a152e77b191b83282c9664357dce3004032d42e68c514ceff27e"}, + {file = "multidict-6.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7d48207926edbf8b16b336f779c557dd8f5a33035a85db9c4b0febb0706817"}, + {file = "multidict-6.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3c099d3899b14e1ce52262eb82a5f5cb92157bb5106bf627b618c090a0eadc"}, + {file = "multidict-6.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e16e7297f29a544f49340012d6fc08cf14de0ab361c9eb7529f6a57a30cbfda1"}, + {file = "multidict-6.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:042028348dc5a1f2be6c666437042a98a5d24cee50380f4c0902215e5ec41844"}, + {file = "multidict-6.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08549895e6a799bd551cf276f6e59820aa084f0f90665c0f03dd3a50db5d3c48"}, + {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ccfd74957ef53fa7380aaa1c961f523d582cd5e85a620880ffabd407f8202c0"}, + {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83b78c680d4b15d33042d330c2fa31813ca3974197bddb3836a5c635a5fd013f"}, + {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b4c153863dd6569f6511845922c53e39c8d61f6e81f228ad5443e690fca403de"}, + {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:98aa8325c7f47183b45588af9c434533196e241be0a4e4ae2190b06d17675c02"}, + {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9e658d1373c424457ddf6d55ec1db93c280b8579276bebd1f72f113072df8a5d"}, + {file = "multidict-6.2.0-cp313-cp313-win32.whl", hash = "sha256:3157126b028c074951839233647bd0e30df77ef1fedd801b48bdcad242a60f4e"}, + {file = "multidict-6.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:2e87f1926e91855ae61769ba3e3f7315120788c099677e0842e697b0bfb659f2"}, + {file = "multidict-6.2.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2529ddbdaa424b2c6c2eb668ea684dd6b75b839d0ad4b21aad60c168269478d7"}, + {file = "multidict-6.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:13551d0e2d7201f0959725a6a769b6f7b9019a168ed96006479c9ac33fe4096b"}, + {file = "multidict-6.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d1996ee1330e245cd3aeda0887b4409e3930524c27642b046e4fae88ffa66c5e"}, + {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c537da54ce4ff7c15e78ab1292e5799d0d43a2108e006578a57f531866f64025"}, + {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f249badb360b0b4d694307ad40f811f83df4da8cef7b68e429e4eea939e49dd"}, + {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48d39b1824b8d6ea7de878ef6226efbe0773f9c64333e1125e0efcfdd18a24c7"}, + {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b99aac6bb2c37db336fa03a39b40ed4ef2818bf2dfb9441458165ebe88b793af"}, + {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07bfa8bc649783e703263f783f73e27fef8cd37baaad4389816cf6a133141331"}, + {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b2c00ad31fbc2cbac85d7d0fcf90853b2ca2e69d825a2d3f3edb842ef1544a2c"}, + {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0d57a01a2a9fa00234aace434d8c131f0ac6e0ac6ef131eda5962d7e79edfb5b"}, + {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:abf5b17bc0cf626a8a497d89ac691308dbd825d2ac372aa990b1ca114e470151"}, + {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:f7716f7e7138252d88607228ce40be22660d6608d20fd365d596e7ca0738e019"}, + {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d5a36953389f35f0a4e88dc796048829a2f467c9197265504593f0e420571547"}, + {file = "multidict-6.2.0-cp313-cp313t-win32.whl", hash = "sha256:e653d36b1bf48fa78c7fcebb5fa679342e025121ace8c87ab05c1cefd33b34fc"}, + {file = "multidict-6.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ca23db5fb195b5ef4fd1f77ce26cadefdf13dba71dab14dadd29b34d457d7c44"}, + {file = "multidict-6.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b4f3d66dd0354b79761481fc15bdafaba0b9d9076f1f42cc9ce10d7fcbda205a"}, + {file = "multidict-6.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e2a2d6749e1ff2c9c76a72c6530d5baa601205b14e441e6d98011000f47a7ac"}, + {file = "multidict-6.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cca83a629f77402cfadd58352e394d79a61c8015f1694b83ab72237ec3941f88"}, + {file = "multidict-6.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:781b5dd1db18c9e9eacc419027b0acb5073bdec9de1675c0be25ceb10e2ad133"}, + {file = "multidict-6.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf8d370b2fea27fb300825ec3984334f7dd54a581bde6456799ba3776915a656"}, + {file = "multidict-6.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25bb96338512e2f46f615a2bb7c6012fe92a4a5ebd353e5020836a7e33120349"}, + {file = "multidict-6.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e2819b0b468174de25c0ceed766606a07cedeab132383f1e83b9a4e96ccb4f"}, + {file = "multidict-6.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6aed763b6a1b28c46c055692836879328f0b334a6d61572ee4113a5d0c859872"}, + {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a1133414b771619aa3c3000701c11b2e4624a7f492f12f256aedde97c28331a2"}, + {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:639556758c36093b35e2e368ca485dada6afc2bd6a1b1207d85ea6dfc3deab27"}, + {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:163f4604e76639f728d127293d24c3e208b445b463168af3d031b92b0998bb90"}, + {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2325105e16d434749e1be8022f942876a936f9bece4ec41ae244e3d7fae42aaf"}, + {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e4371591e621579cb6da8401e4ea405b33ff25a755874a3567c4075ca63d56e2"}, + {file = "multidict-6.2.0-cp39-cp39-win32.whl", hash = "sha256:d1175b0e0d6037fab207f05774a176d71210ebd40b1c51f480a04b65ec5c786d"}, + {file = "multidict-6.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad81012b24b88aad4c70b2cbc2dad84018783221b7f923e926f4690ff8569da3"}, + {file = "multidict-6.2.0-py3-none-any.whl", hash = "sha256:5d26547423e5e71dcc562c4acdc134b900640a39abd9066d7326a7cc2324c530"}, + {file = "multidict-6.2.0.tar.gz", hash = "sha256:0085b0afb2446e57050140240a8595846ed64d1cbd26cef936bfab3192c673b8"}, ] [package.dependencies] @@ -2690,6 +2848,7 @@ version = "0.70.16" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "multiprocess-0.70.16-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee"}, {file = "multiprocess-0.70.16-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec"}, @@ -2714,6 +2873,7 @@ version = "1.15.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"}, {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"}, @@ -2767,6 +2927,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -2778,6 +2939,7 @@ version = "1.9.1" description = "Run any standard Python code quality tool on a Jupyter Notebook" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "nbqa-1.9.1-py3-none-any.whl", hash = "sha256:95552d2f6c2c038136252a805aa78d85018aef922586270c3a074332737282e5"}, {file = "nbqa-1.9.1.tar.gz", hash = "sha256:a1f4bcf587c597302fed295951001fc4e1be4ce0e77e1ab1b25ac2fbe3db0cdd"}, @@ -2798,6 +2960,7 @@ version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" +groups = ["dev"] 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"}, @@ -2809,6 +2972,7 @@ version = "3.4.2" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"}, {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"}, @@ -2828,6 +2992,7 @@ version = "0.2.21" description = "Python binding to Ammonia HTML sanitizer Rust crate" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "nh3-0.2.21-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:fcff321bd60c6c5c9cb4ddf2554e22772bb41ebd93ad88171bbbb6f271255286"}, {file = "nh3-0.2.21-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31eedcd7d08b0eae28ba47f43fd33a653b4cdb271d64f1aeda47001618348fde"}, @@ -2857,39 +3022,38 @@ files = [ [[package]] name = "ninja" -version = "1.11.1.3" +version = "1.11.1.4" description = "Ninja is a small build system with a focus on speed" optional = false python-versions = ">=3.7" -files = [ - {file = "ninja-1.11.1.3-py3-none-macosx_10_9_universal2.whl", hash = "sha256:2b4879ea3f1169f3d855182c57dcc84d1b5048628c8b7be0d702b81882a37237"}, - {file = "ninja-1.11.1.3-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bc3ebc8b2e47716149f3541742b5cd8e0b08f51013b825c05baca3e34854370d"}, - {file = "ninja-1.11.1.3-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a27e78ca71316c8654965ee94b286a98c83877bfebe2607db96897bbfe458af0"}, - {file = "ninja-1.11.1.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2883ea46b3c5079074f56820f9989c6261fcc6fd873d914ee49010ecf283c3b2"}, - {file = "ninja-1.11.1.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c4bdb9fd2d0c06501ae15abfd23407660e95659e384acd36e013b6dd7d8a8e4"}, - {file = "ninja-1.11.1.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:114ed5c61c8474df6a69ab89097a20749b769e2c219a452cb2fadc49b0d581b0"}, - {file = "ninja-1.11.1.3-py3-none-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7fa2247fce98f683bc712562d82b22b8a0a5c000738a13147ca2d1b68c122298"}, - {file = "ninja-1.11.1.3-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:a38c6c6c8032bed68b70c3b065d944c35e9f903342875d3a3218c1607987077c"}, - {file = "ninja-1.11.1.3-py3-none-musllinux_1_1_i686.whl", hash = "sha256:56ada5d33b8741d298836644042faddebc83ee669782d661e21563034beb5aba"}, - {file = "ninja-1.11.1.3-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:53409151da081f3c198bb0bfc220a7f4e821e022c5b7d29719adda892ddb31bb"}, - {file = "ninja-1.11.1.3-py3-none-musllinux_1_1_s390x.whl", hash = "sha256:1ad2112c2b0159ed7c4ae3731595191b1546ba62316fc40808edecd0306fefa3"}, - {file = "ninja-1.11.1.3-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:28aea3c1c280cba95b8608d50797169f3a34280e3e9a6379b6e340f0c9eaeeb0"}, - {file = "ninja-1.11.1.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b6966f83064a88a51693073eea3decd47e08c3965241e09578ef7aa3a7738329"}, - {file = "ninja-1.11.1.3-py3-none-win32.whl", hash = "sha256:a4a3b71490557e18c010cbb26bd1ea9a0c32ee67e8f105e9731515b6e0af792e"}, - {file = "ninja-1.11.1.3-py3-none-win_amd64.whl", hash = "sha256:04d48d14ea7ba11951c156599ab526bdda575450797ff57c6fdf99b2554d09c7"}, - {file = "ninja-1.11.1.3-py3-none-win_arm64.whl", hash = "sha256:17978ad611d8ead578d83637f5ae80c2261b033db0b493a7ce94f88623f29e1b"}, - {file = "ninja-1.11.1.3.tar.gz", hash = "sha256:edfa0d2e9d7ead1635b03e40a32ad56cc8f56798b6e2e9848d8300b174897076"}, +groups = ["main"] +files = [ + {file = "ninja-1.11.1.4-py3-none-macosx_10_9_universal2.whl", hash = "sha256:b33923c8da88e8da20b6053e38deb433f53656441614207e01d283ad02c5e8e7"}, + {file = "ninja-1.11.1.4-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cede0af00b58e27b31f2482ba83292a8e9171cdb9acc2c867a3b6e40b3353e43"}, + {file = "ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0"}, + {file = "ninja-1.11.1.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3090d4488fadf6047d0d7a1db0c9643a8d391f0d94729554dbb89b5bdc769d7"}, + {file = "ninja-1.11.1.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecce44a00325a93631792974659cf253a815cc6da4ec96f89742925dfc295a0d"}, + {file = "ninja-1.11.1.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c29bb66d2aa46a2409ab369ea804c730faec7652e8c22c1e428cc09216543e5"}, + {file = "ninja-1.11.1.4-py3-none-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:055f386fb550c2c9d6157e45e20a84d29c47968876b9c5794ae2aec46f952306"}, + {file = "ninja-1.11.1.4-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:f6186d7607bb090c3be1e10c8a56b690be238f953616626f5032238c66e56867"}, + {file = "ninja-1.11.1.4-py3-none-musllinux_1_1_i686.whl", hash = "sha256:cf4453679d15babc04ba023d68d091bb613091b67101c88f85d2171c6621c6eb"}, + {file = "ninja-1.11.1.4-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:d4a6f159b08b0ac4aca5ee1572e3e402f969139e71d85d37c0e2872129098749"}, + {file = "ninja-1.11.1.4-py3-none-musllinux_1_1_s390x.whl", hash = "sha256:c3b96bd875f3ef1db782470e9e41d7508905a0986571f219d20ffed238befa15"}, + {file = "ninja-1.11.1.4-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:cf554e73f72c04deb04d0cf51f5fdb1903d9c9ca3d2344249c8ce3bd616ebc02"}, + {file = "ninja-1.11.1.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:cfdd09776436a1ff3c4a2558d3fc50a689fb9d7f1bdbc3e6f7b8c2991341ddb3"}, + {file = "ninja-1.11.1.4-py3-none-win32.whl", hash = "sha256:2ab67a41c90bea5ec4b795bab084bc0b3b3bb69d3cd21ca0294fc0fc15a111eb"}, + {file = "ninja-1.11.1.4-py3-none-win_amd64.whl", hash = "sha256:4617b3c12ff64b611a7d93fd9e378275512bb36eff8babff7c83f5116b4f8d66"}, + {file = "ninja-1.11.1.4-py3-none-win_arm64.whl", hash = "sha256:5713cf50c5be50084a8693308a63ecf9e55c3132a78a41ab1363a28b6caaaee1"}, + {file = "ninja-1.11.1.4.tar.gz", hash = "sha256:6aa39f6e894e0452e5b297327db00019383ae55d5d9c57c73b04f13bf79d438a"}, ] -[package.extras] -test = ["coverage (>=4.2)", "importlib_metadata (>=2.0)", "pytest (>=6.0)", "pytest-cov (>=3)"] - [[package]] name = "nltk" version = "3.9.1" description = "Natural Language Toolkit" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"}, {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"}, @@ -2915,6 +3079,7 @@ version = "1.9.1" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -2926,6 +3091,8 @@ version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] +markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -2971,6 +3138,8 @@ version = "2.2.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" +groups = ["main", "dev"] +markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "numpy-2.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9"}, {file = "numpy-2.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae"}, @@ -3035,6 +3204,8 @@ version = "12.4.5.8" description = "CUBLAS native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3"}, {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b"}, @@ -3047,6 +3218,8 @@ version = "12.4.127" description = "CUDA profiling tools runtime libs." optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a"}, {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb"}, @@ -3059,6 +3232,8 @@ version = "12.4.127" description = "NVRTC native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198"}, {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338"}, @@ -3071,6 +3246,8 @@ version = "12.4.127" description = "CUDA Runtime native Libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3"}, {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5"}, @@ -3083,6 +3260,8 @@ version = "9.1.0.70" description = "cuDNN runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, @@ -3097,6 +3276,8 @@ version = "11.2.1.3" description = "CUFFT native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399"}, {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9"}, @@ -3112,6 +3293,8 @@ version = "10.3.5.147" description = "CURAND native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9"}, {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b"}, @@ -3124,6 +3307,8 @@ version = "11.6.1.9" description = "CUDA solver native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e"}, {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260"}, @@ -3141,6 +3326,8 @@ version = "12.3.1.170" description = "CUSPARSE native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3"}, {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1"}, @@ -3156,6 +3343,8 @@ version = "0.6.2" description = "NVIDIA cuSPARSELt" optional = false python-versions = "*" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:067a7f6d03ea0d4841c85f0c6f1991c5dda98211f6302cb83a4ab234ee95bef8"}, {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:df2c24502fd76ebafe7457dbc4716b2fec071aabaed4fb7691a201cde03704d9"}, @@ -3168,6 +3357,8 @@ version = "2.21.5" description = "NVIDIA Collective Communication Library (NCCL) Runtime" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0"}, ] @@ -3178,6 +3369,8 @@ version = "12.4.127" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, @@ -3190,6 +3383,8 @@ version = "12.4.127" description = "NVIDIA Tools Extension" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3"}, {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a"}, @@ -3202,6 +3397,7 @@ version = "4.11.0.86" description = "Wrapper package for OpenCV python bindings." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798"}, {file = "opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca"}, @@ -3214,10 +3410,10 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, - {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, + {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.5", markers = "python_version == \"3.11\""}, ] [[package]] @@ -3226,6 +3422,7 @@ version = "3.1.5" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, @@ -3240,6 +3437,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -3251,6 +3449,7 @@ 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"}, @@ -3299,8 +3498,8 @@ files = [ [package.dependencies] numpy = [ {version = ">=1.22.4", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -3337,6 +3536,7 @@ version = "2.2.3.250308" description = "Type annotations for pandas" optional = false python-versions = ">=3.10" +groups = ["dev"] files = [ {file = "pandas_stubs-2.2.3.250308-py3-none-any.whl", hash = "sha256:a377edff3b61f8b268c82499fdbe7c00fdeed13235b8b71d6a1dc347aeddc74d"}, {file = "pandas_stubs-2.2.3.250308.tar.gz", hash = "sha256:3a6e9daf161f00b85c83772ed3d5cff9522028f07a94817472c07b91f46710fd"}, @@ -3352,6 +3552,7 @@ version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -3367,6 +3568,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -3378,6 +3580,8 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" +groups = ["dev"] +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"}, @@ -3392,6 +3596,7 @@ version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, @@ -3480,7 +3685,7 @@ docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -typing = ["typing-extensions"] +typing = ["typing-extensions ; python_version < \"3.10\""] xmp = ["defusedxml"] [[package]] @@ -3489,6 +3694,7 @@ version = "1.12.1.2" description = "Query metadata from sdists / bdists / installed packages." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pkginfo-1.12.1.2-py3-none-any.whl", hash = "sha256:c783ac885519cab2c34927ccfa6bf64b5a704d7c69afaea583dd9b7afe969343"}, {file = "pkginfo-1.12.1.2.tar.gz", hash = "sha256:5cd957824ac36f140260964eba3c6be6442a8359b8c48f4adf90210f33a04b7b"}, @@ -3499,19 +3705,20 @@ testing = ["pytest", "pytest-cov", "wheel"] [[package]] name = "platformdirs" -version = "4.3.6" +version = "4.3.7" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, - {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, + {file = "platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94"}, + {file = "platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351"}, ] [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)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.14.1)"] [[package]] name = "pluggy" @@ -3519,6 +3726,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -3534,6 +3742,7 @@ version = "3.8.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, @@ -3552,6 +3761,7 @@ version = "3.0.50" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198"}, {file = "prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab"}, @@ -3566,6 +3776,7 @@ version = "0.3.0" description = "Accelerated property cache" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:efa44f64c37cc30c9f05932c740a8b40ce359f51882c70883cc95feac842da4d"}, {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2383a17385d9800b6eb5855c2f05ee550f803878f344f58b6e194de08b96352c"}, @@ -3673,6 +3884,7 @@ version = "7.0.0" description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, @@ -3685,6 +3897,7 @@ files = [ {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, ] +markers = {main = "sys_platform != \"darwin\" or platform_machine != \"x86_64\""} [package.extras] dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] @@ -3696,6 +3909,8 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = false python-versions = "*" +groups = ["dev"] +markers = "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"}, @@ -3707,6 +3922,7 @@ version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" +groups = ["dev"] 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"}, @@ -3721,6 +3937,7 @@ version = "19.0.1" description = "Python library for Apache Arrow" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fc28912a2dc924dddc2087679cc8b7263accc71b9ff025a1362b004711661a69"}, {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fca15aabbe9b8355800d923cc2e82c8ef514af321e18b437c3d782aa884eaeec"}, @@ -3775,6 +3992,7 @@ version = "1.3.0.post6" description = "Cython wrapper for the C++ translation of the Angus Johnson's Clipper library (ver. 6.4.2)" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pyclipper-1.3.0.post6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fa0f5e78cfa8262277bb3d0225537b3c2a90ef68fd90a229d5d24cf49955dcf4"}, {file = "pyclipper-1.3.0.post6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a01f182d8938c1dc515e8508ed2442f7eebd2c25c7d5cb29281f583c1a8008a4"}, @@ -3834,6 +4052,7 @@ version = "2.0.8" description = "Official APIs for the MS-COCO dataset" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pycocotools-2.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a66886f45b04cee1ff0492e9f5e25d430d8aa3eb63e63c4ebc620945caa11b9"}, {file = "pycocotools-2.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257130b65b7b0f122ce1ed62942867ca9789e56a68109682796cc85c9770c74a"}, @@ -3876,6 +4095,7 @@ version = "2.11.1" description = "Python style guide checker" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, @@ -3887,6 +4107,8 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "implementation_name == \"pypy\" or sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -3898,6 +4120,7 @@ version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, @@ -3910,7 +4133,7 @@ typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] [[package]] name = "pydantic-core" @@ -3918,6 +4141,7 @@ 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"}, @@ -4030,6 +4254,7 @@ version = "2.8.1" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c"}, {file = "pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585"}, @@ -4050,6 +4275,7 @@ version = "3.1.0" description = "passive checker of Python programs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, @@ -4061,6 +4287,7 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -4069,12 +4296,24 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pylatexenc" +version = "2.10" +description = "Simple LaTeX parser providing latex-to-unicode and unicode-to-latex conversion" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pylatexenc-2.10.tar.gz", hash = "sha256:3dd8fd84eb46dc30bee1e23eaab8d8fb5a7f507347b23e5f38ad9675c84f40d3"}, +] + [[package]] name = "pylint" version = "2.17.7" description = "python code static checker" optional = false python-versions = ">=3.7.2" +groups = ["dev"] files = [ {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, @@ -4099,13 +4338,14 @@ testutils = ["gitpython (>3)"] [[package]] name = "pyparsing" -version = "3.2.1" +version = "3.2.3" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, - {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, + {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"}, + {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"}, ] [package.extras] @@ -4117,6 +4357,7 @@ version = "4.30.1" description = "Python bindings to PDFium" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "pypdfium2-4.30.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:e07c47633732cc18d890bb7e965ad28a9c5a932e548acb928596f86be2e5ae37"}, {file = "pypdfium2-4.30.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5ea2d44e96d361123b67b00f527017aa9c847c871b5714e013c01c3eb36a79fe"}, @@ -4139,6 +4380,7 @@ version = "6.1.0" description = "pyproject-flake8 (`pflake8`), a monkey patching wrapper to connect flake8 with pyproject.toml configuration" optional = false python-versions = ">=3.8.1" +groups = ["dev"] files = [ {file = "pyproject_flake8-6.1.0-py3-none-any.whl", hash = "sha256:86ea5559263c098e1aa4f866776aa2cf45362fd91a576b9fd8fbbbb55db12c4e"}, {file = "pyproject_flake8-6.1.0.tar.gz", hash = "sha256:6da8e5a264395e0148bc11844c6fb50546f1fac83ac9210f7328664135f9e70f"}, @@ -4154,6 +4396,7 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -4176,6 +4419,7 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -4196,6 +4440,7 @@ version = "0.6.6" description = "Python Bidi layout wrapping the Rust crate unicode-bidi" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "python_bidi-0.6.6-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09d4da6b5851d0df01d7313a11d22f308fdfb0e12461f7262e0f55c521ccc0f1"}, {file = "python_bidi-0.6.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:493a844891e23264411b01df58ba77d5dbb0045da3787f4195f50a56bfb847d9"}, @@ -4317,6 +4562,7 @@ 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", "dev"] 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"}, @@ -4331,6 +4577,7 @@ version = "1.1.2" description = "Create, read, and update Microsoft Word .docx files." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe"}, {file = "python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd"}, @@ -4342,13 +4589,14 @@ typing-extensions = ">=4.9.0" [[package]] name = "python-dotenv" -version = "1.0.1" +version = "1.1.0" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +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"}, + {file = "python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"}, + {file = "python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5"}, ] [package.extras] @@ -4360,6 +4608,7 @@ version = "3.15.0" description = "Interact with GitLab API" optional = false python-versions = ">=3.7.0" +groups = ["dev"] files = [ {file = "python-gitlab-3.15.0.tar.gz", hash = "sha256:c9e65eb7612a9fbb8abf0339972eca7fd7a73d4da66c9b446ffe528930aff534"}, {file = "python_gitlab-3.15.0-py3-none-any.whl", hash = "sha256:8f8d1c0d387f642eb1ac7bf5e8e0cd8b3dd49c6f34170cee3c7deb7d384611f3"}, @@ -4379,6 +4628,7 @@ version = "1.0.2" description = "Create, read, and update PowerPoint 2007+ (.pptx) files." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "python_pptx-1.0.2-py3-none-any.whl", hash = "sha256:160838e0b8565a8b1f67947675886e9fea18aa5e795db7ae531606d68e785cba"}, {file = "python_pptx-1.0.2.tar.gz", hash = "sha256:479a8af0eaf0f0d76b6f00b0887732874ad2e3188230315290cd1f9dd9cc7095"}, @@ -4396,6 +4646,7 @@ version = "7.34.6" description = "Automatic Semantic Versioning for Python projects" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "python-semantic-release-7.34.6.tar.gz", hash = "sha256:e9b8fb788024ae9510a924136d573588415a16eeca31cc5240f2754a80a2e831"}, {file = "python_semantic_release-7.34.6-py3-none-any.whl", hash = "sha256:7e3969ba4663d9b2087b02bf3ac140e202551377bf045c34e09bfe19753e19ab"}, @@ -4423,13 +4674,14 @@ test = ["coverage (>=5,<6)", "mock (==1.3.0)", "pytest (>=7,<8)", "pytest-mock ( [[package]] name = "pytz" -version = "2025.1" +version = "2025.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["main"] files = [ - {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, - {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, + {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, + {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, ] [[package]] @@ -4438,6 +4690,7 @@ version = "310" description = "Python for Window Extensions" optional = false python-versions = "*" +groups = ["main", "dev"] files = [ {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, @@ -4456,6 +4709,7 @@ files = [ {file = "pywin32-310-cp39-cp39-win32.whl", hash = "sha256:851c8d927af0d879221e616ae1f66145253537bbdd321a77e8ef701b443a9a1a"}, {file = "pywin32-310-cp39-cp39-win_amd64.whl", hash = "sha256:96867217335559ac619f00ad70e513c0fcf84b8a3af9fc2bba3b59b97da70475"}, ] +markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\"", dev = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} [[package]] name = "pywin32-ctypes" @@ -4463,6 +4717,8 @@ version = "0.2.3" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" optional = false python-versions = ">=3.6" +groups = ["dev"] +markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, @@ -4474,6 +4730,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] 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"}, @@ -4536,6 +4793,7 @@ version = "26.3.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pyzmq-26.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1586944f4736515af5c6d3a5b150c7e8ca2a2d6e46b23057320584d6f2438f4a"}, {file = "pyzmq-26.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa7efc695d1fc9f72d91bf9b6c6fe2d7e1b4193836ec530a98faf7d7a7577a58"}, @@ -4641,6 +4899,7 @@ version = "44.0" description = "readme_renderer is a library for rendering readme descriptions for Warehouse" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151"}, {file = "readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"}, @@ -4660,6 +4919,7 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -4676,6 +4936,7 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -4779,6 +5040,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -4800,6 +5062,7 @@ version = "1.0.0" description = "A utility belt for advanced users of python-requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["dev"] files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, @@ -4814,6 +5077,7 @@ version = "2.0.0" description = "Validating URI References per RFC 3986" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, @@ -4828,6 +5092,7 @@ 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"}, @@ -4847,6 +5112,7 @@ version = "0.23.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "rpds_py-0.23.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2a54027554ce9b129fc3d633c92fa33b30de9f08bc61b32c053dc9b537266fed"}, {file = "rpds_py-0.23.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5ef909a37e9738d146519657a1aab4584018746a18f71c692f2f22168ece40c"}, @@ -4959,6 +5225,7 @@ version = "1.4.0" description = "R-Tree spatial index for Python GIS" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "rtree-1.4.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:4d1bebc418101480aabf41767e772dd2155d3b27b1376cccbd93e4509485e091"}, {file = "rtree-1.4.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:997f8c38d5dffa3949ea8adb4c8b291ea5cd4ef5ee69455d642dd171baf9991d"}, @@ -4978,6 +5245,7 @@ version = "0.5.3" description = "" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073"}, {file = "safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21d01c14ff6c415c485616b8b0bf961c46b3b343ca59110d38d744e577f9cce7"}, @@ -5019,6 +5287,7 @@ version = "0.25.2" description = "Image processing in Python" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "scikit_image-0.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d3278f586793176599df6a4cf48cb6beadae35c31e58dc01a98023af3dc31c78"}, {file = "scikit_image-0.25.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5c311069899ce757d7dbf1d03e32acb38bb06153236ae77fcd820fd62044c063"}, @@ -5057,7 +5326,7 @@ tifffile = ">=2022.8.12" [package.extras] build = ["Cython (>=3.0.8)", "build (>=1.2.1)", "meson-python (>=0.16)", "ninja (>=1.11.1.1)", "numpy (>=2.0)", "pythran (>=0.16)", "spin (==0.13)"] data = ["pooch (>=1.6.0)"] -developer = ["ipython", "pre-commit", "tomli"] +developer = ["ipython", "pre-commit", "tomli ; python_version < \"3.11\""] docs = ["PyWavelets (>=1.6)", "dask[array] (>=2023.2.0)", "intersphinx-registry (>=0.2411.14)", "ipykernel", "ipywidgets", "kaleido (==0.2.1)", "matplotlib (>=3.7)", "myst-parser", "numpydoc (>=1.7)", "pandas (>=2.0)", "plotly (>=5.20)", "pooch (>=1.6)", "pydata-sphinx-theme (>=0.16)", "pytest-doctestplus", "scikit-learn (>=1.2)", "seaborn (>=0.11)", "sphinx (>=8.0)", "sphinx-copybutton", "sphinx-gallery[parallel] (>=0.18)", "sphinx_design (>=0.5)", "tifffile (>=2022.8.12)"] optional = ["PyWavelets (>=1.6)", "SimpleITK", "astropy (>=5.0)", "cloudpickle (>=1.1.1)", "dask[array] (>=2023.2.0)", "matplotlib (>=3.7)", "pooch (>=1.6.0)", "pyamg (>=5.2)", "scikit-learn (>=1.2)"] test = ["asv", "numpydoc (>=1.7)", "pooch (>=1.6.0)", "pytest (>=8)", "pytest-cov (>=2.11.0)", "pytest-doctestplus", "pytest-faulthandler", "pytest-localserver"] @@ -5068,6 +5337,7 @@ version = "1.15.2" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9"}, {file = "scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5"}, @@ -5123,7 +5393,7 @@ numpy = ">=1.23.5,<2.5" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "secretstorage" @@ -5131,6 +5401,8 @@ version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" optional = false python-versions = ">=3.6" +groups = ["dev"] +markers = "sys_platform == \"linux\"" files = [ {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, @@ -5146,6 +5418,7 @@ version = "2.2.2" description = "A fast and lightweight Python library for splitting text into semantically meaningful chunks." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "semchunk-2.2.2-py3-none-any.whl", hash = "sha256:94ca19020c013c073abdfd06d79a7c13637b91738335f3b8cdb5655ee7cc94d2"}, {file = "semchunk-2.2.2.tar.gz", hash = "sha256:940e89896e64eeb01de97ba60f51c8c7b96c6a3951dfcf574f25ce2146752f52"}, @@ -5161,6 +5434,7 @@ version = "2.13.0" description = "Python helper for Semantic Versioning (http://semver.org/)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["dev"] files = [ {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, @@ -5168,23 +5442,24 @@ files = [ [[package]] name = "setuptools" -version = "76.0.0" +version = "78.0.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "setuptools-76.0.0-py3-none-any.whl", hash = "sha256:199466a166ff664970d0ee145839f5582cb9bca7a0a3a2e795b6a9cb2308e9c6"}, - {file = "setuptools-76.0.0.tar.gz", hash = "sha256:43b4ee60e10b0d0ee98ad11918e114c70701bc6051662a9a675a0496c1a158f4"}, + {file = "setuptools-78.0.2-py3-none-any.whl", hash = "sha256:4a612c80e1f1d71b80e4906ce730152e8dec23df439f82731d9d0b608d7b700d"}, + {file = "setuptools-78.0.2.tar.gz", hash = "sha256:137525e6afb9022f019d6e884a319017f9bf879a0d8783985d32cbc8683cab93"}, ] [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)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "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"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "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 ; sys_platform != \"cygwin\"", "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) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "shapely" @@ -5192,6 +5467,7 @@ version = "2.0.7" description = "Manipulation and analysis of geometric objects" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "shapely-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:33fb10e50b16113714ae40adccf7670379e9ccf5b7a41d0002046ba2b8f0f691"}, {file = "shapely-2.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f44eda8bd7a4bccb0f281264b34bf3518d8c4c9a8ffe69a1a05dabf6e8461147"}, @@ -5250,6 +5526,7 @@ version = "1.5.4" description = "Tool to Detect Surrounding Shell" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, @@ -5261,6 +5538,7 @@ 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", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -5272,6 +5550,7 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -5283,6 +5562,7 @@ 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"}, @@ -5294,6 +5574,7 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" +groups = ["dev"] 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"}, @@ -5313,6 +5594,7 @@ version = "1.13.1" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, @@ -5330,6 +5612,7 @@ version = "0.9.0" description = "Pretty-print tabular data" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, @@ -5344,6 +5627,7 @@ version = "2025.3.13" description = "Read and write TIFF files" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "tifffile-2025.3.13-py3-none-any.whl", hash = "sha256:10f205b923c04678f744a6d553f6f86c639c9ba6e714f6758d81af0678ba75dc"}, {file = "tifffile-2025.3.13.tar.gz", hash = "sha256:30fcc4584216937b5993d0568452b6fea8e12e61f9afb1a8e967c07c281faa06"}, @@ -5366,6 +5650,7 @@ version = "6.1.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "tokenize_rt-6.1.0-py2.py3-none-any.whl", hash = "sha256:d706141cdec4aa5f358945abe36b911b8cbdc844545da99e811250c0cee9b6fc"}, {file = "tokenize_rt-6.1.0.tar.gz", hash = "sha256:e8ee836616c0877ab7c7b54776d2fefcc3bde714449a206762425ae114b53c86"}, @@ -5377,6 +5662,8 @@ version = "0.19.1" description = "" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, @@ -5494,6 +5781,8 @@ version = "0.21.1" description = "" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "tokenizers-0.21.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e78e413e9e668ad790a29456e677d9d3aa50a9ad311a40905d6861ba7692cf41"}, {file = "tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:cd51cd0a91ecc801633829fcd1fda9cf8682ed3477c6243b9a095539de4aecf3"}, @@ -5526,6 +5815,7 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["dev"] 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"}, @@ -5567,6 +5857,7 @@ version = "0.13.2" description = "Style preserving TOML library" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, @@ -5578,6 +5869,7 @@ version = "2.6.0" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.9.0" +groups = ["main"] files = [ {file = "torch-2.6.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:6860df13d9911ac158f4c44031609700e1eba07916fff62e21e6ffa0a9e01961"}, {file = "torch-2.6.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c4f103a49830ce4c7561ef4434cc7926e5a5fe4e5eb100c19ab36ea1e2b634ab"}, @@ -5630,13 +5922,14 @@ optree = ["optree (>=0.13.0)"] [[package]] name = "torchmetrics" -version = "1.6.3" +version = "1.7.0" description = "PyTorch native Metrics" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "torchmetrics-1.6.3-py3-none-any.whl", hash = "sha256:034640d4e1c30b7d3488551b1ce3fc1f363070811e6b97b9cb6b60a9ec15e9f4"}, - {file = "torchmetrics-1.6.3.tar.gz", hash = "sha256:be59ffe9e9abf12ac12c3ac4383b2fc7731ad2bf3748ae1b06e8dea34e9f8a65"}, + {file = "torchmetrics-1.7.0-py3-none-any.whl", hash = "sha256:39a72cf40c8452e041f5315b997ef811c2baaae01478131cf6ed9813f553a668"}, + {file = "torchmetrics-1.7.0.tar.gz", hash = "sha256:7a26d5cb73a6ae51ab5cb514aa4dc0543af7287a507719986a06e15df12ea68b"}, ] [package.dependencies] @@ -5646,12 +5939,13 @@ packaging = ">17.1" torch = ">=2.0.0" [package.extras] -all = ["SciencePlots (>=2.0.0)", "gammatone (>=1.0.0)", "ipadic (>=1.0.0)", "librosa (>=0.10.0)", "matplotlib (>=3.6.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.15.0)", "nltk (>3.8.1)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +all = ["SciencePlots (>=2.0.0)", "einops (>=0.7.0)", "gammatone (>=1.0.0)", "ipadic (>=1.0.0)", "librosa (>=0.10.0)", "matplotlib (>=3.6.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.15.0)", "nltk (>3.8.1)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "timm (>=0.9.0)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_linear_assignment (>=0.0.2)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] audio = ["gammatone (>=1.0.0)", "librosa (>=0.10.0)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "pystoi (>=0.4.0)", "requests (>=2.19.0)", "torchaudio (>=2.0.1)"] +clustering = ["torch_linear_assignment (>=0.0.2)"] detection = ["pycocotools (>2.0.0)", "torchvision (>=0.15.1)"] -dev = ["PyTDC (==0.4.1)", "SciencePlots (>=2.0.0)", "bert_score (==0.3.13)", "dython (==0.7.9)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.30)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.15.0)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.3.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +dev = ["PyTDC (==0.4.1) ; python_version < \"3.12\"", "SciencePlots (>=2.0.0)", "aeon (>=1.0.0) ; python_version > \"3.10\"", "bert_score (==0.3.13)", "dists-pytorch (==0.1)", "dython (==0.7.9)", "einops (>=0.7.0)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.30)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0) ; python_version < \"3.12\"", "mecab-ko-dic (>=1.0.0) ; python_version < \"3.12\"", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.15.0)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.3.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "timm (>=0.9.0)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torch_linear_assignment (>=0.0.2)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] image = ["scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.15.1)"] -multimodal = ["piq (<=0.8.0)", "transformers (>=4.42.3)"] +multimodal = ["einops (>=0.7.0)", "piq (<=0.8.0)", "timm (>=0.9.0)", "transformers (>=4.42.3)"] text = ["ipadic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>3.8.1)", "regex (>=2021.9.24)", "sentencepiece (>=0.2.0)", "tqdm (<4.68.0)", "transformers (>4.4.0)"] typing = ["mypy (==1.15.0)", "torch (==2.6.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.6.0)"] @@ -5662,6 +5956,7 @@ version = "0.21.0" description = "image and video datasets and models for torch deep learning" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "torchvision-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:044ea420b8c6c3162a234cada8e2025b9076fa82504758cd11ec5d0f8cd9fa37"}, {file = "torchvision-0.21.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:b0c0b264b89ab572888244f2e0bad5b7eaf5b696068fc0b93e96f7c3c198953f"}, @@ -5700,6 +5995,7 @@ 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 = ["dev"] 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"}, @@ -5720,6 +6016,7 @@ version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, @@ -5741,6 +6038,7 @@ version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -5756,6 +6054,8 @@ version = "4.42.4" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.8.0" +groups = ["main"] +markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "transformers-4.42.4-py3-none-any.whl", hash = "sha256:6d59061392d0f1da312af29c962df9017ff3c0108c681a56d1bc981004d16d24"}, {file = "transformers-4.42.4.tar.gz", hash = "sha256:f956e25e24df851f650cb2c158b6f4352dfae9d702f04c113ed24fc36ce7ae2d"}, @@ -5820,13 +6120,15 @@ vision = ["Pillow (>=10.0.1,<=15.0)"] [[package]] name = "transformers" -version = "4.49.0" +version = "4.50.1" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.9.0" +groups = ["main"] +markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ - {file = "transformers-4.49.0-py3-none-any.whl", hash = "sha256:6b4fded1c5fee04d384b1014495b4235a2b53c87503d7d592423c06128cbbe03"}, - {file = "transformers-4.49.0.tar.gz", hash = "sha256:7e40e640b5b8dc3f48743f5f5adbdce3660c82baafbd3afdfc04143cdbd2089e"}, + {file = "transformers-4.50.1-py3-none-any.whl", hash = "sha256:e9b9bd274518150528c1d745c7ebba72d27e4e52f2deffaa1fddebad6912da5d"}, + {file = "transformers-4.50.1.tar.gz", hash = "sha256:6ee542d2cce7e1b6a06ae350599c27ddf2e6e45ec9d0cb42915b37fca3d6399a"}, ] [package.dependencies] @@ -5837,29 +6139,31 @@ packaging = ">=20.0" pyyaml = ">=5.1" regex = "!=2019.12.17" requests = "*" -safetensors = ">=0.4.1" +safetensors = ">=0.4.3" tokenizers = ">=0.21,<0.22" tqdm = ">=4.27" [package.extras] accelerate = ["accelerate (>=0.26.0)"] agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=2.0)"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "codecarbon (>=2.8.1)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "torchaudio", "torchvision"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "codecarbon (>=2.8.1)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "kernels (>=0.3.2,<0.4)", "librosa", "num2words", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] benchmark = ["optimum-benchmark (>=0.3.0)"] codecarbon = ["codecarbon (>=2.8.1)"] deepspeed = ["accelerate (>=0.26.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.26.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-rich", "pytest-timeout", "pytest-xdist", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.21,<0.22)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "libcst", "librosa", "nltk (<=3.8.1)", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.26.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "kernels (>=0.3.2,<0.4)", "libcst", "librosa", "nltk (<=3.8.1)", "num2words", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.21,<0.22)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "kernels (>=0.3.2,<0.4)", "libcst", "librosa", "nltk (<=3.8.1)", "num2words", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] -integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"] +hub-kernels = ["kernels (>=0.3.2,<0.4)"] +integrations = ["kernels (>=0.3.2,<0.4)", "optuna", "ray[tune] (>=2.7.0)", "sigopt"] ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] modelcreation = ["cookiecutter (==1.7.3)"] natten = ["natten (>=0.14.6,<0.15.0)"] +num2words = ["num2words"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] optuna = ["optuna"] @@ -5873,7 +6177,7 @@ serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] @@ -5893,6 +6197,8 @@ version = "3.2.0" description = "A language and compiler for custom Deep Learning operations" optional = false python-versions = "*" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3e54983cd51875855da7c68ec05c05cf8bb08df361b1d5b69e05e40b0c9bd62"}, {file = "triton-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8009a1fb093ee8546495e96731336a33fb8856a38e45bb4ab6affd6dbc3ba220"}, @@ -5912,6 +6218,7 @@ version = "3.8.0" description = "Collection of utilities for publishing packages on PyPI" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, @@ -5935,6 +6242,7 @@ version = "0.12.5" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"}, {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"}, @@ -5952,6 +6260,7 @@ version = "3.1.5.20250306" description = "Typing stubs for openpyxl" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "types_openpyxl-3.1.5.20250306-py3-none-any.whl", hash = "sha256:f7733dac1dcb07c89ff5ffde8452ee8d272be638defed855f4c48b2990ce5aa7"}, {file = "types_openpyxl-3.1.5.20250306.tar.gz", hash = "sha256:aa7ad2425e8020ff46a31633becfe1f3c64114498d964c536199f654b464e6bc"}, @@ -5959,13 +6268,14 @@ files = [ [[package]] name = "types-pytz" -version = "2025.1.0.20250204" +version = "2025.1.0.20250318" description = "Typing stubs for pytz" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "types_pytz-2025.1.0.20250204-py3-none-any.whl", hash = "sha256:32ca4a35430e8b94f6603b35beb7f56c32260ddddd4f4bb305fdf8f92358b87e"}, - {file = "types_pytz-2025.1.0.20250204.tar.gz", hash = "sha256:00f750132769f1c65a4f7240bc84f13985b4da774bd17dfbe5d9cd442746bd49"}, + {file = "types_pytz-2025.1.0.20250318-py3-none-any.whl", hash = "sha256:04dba4907c5415777083f9548693c6d9f80ec53adcaff55a38526a3f8ddcae04"}, + {file = "types_pytz-2025.1.0.20250318.tar.gz", hash = "sha256:97e0e35184c6fe14e3a5014512057f2c57bb0c6582d63c1cfcc4809f82180449"}, ] [[package]] @@ -5974,6 +6284,7 @@ version = "2.32.0.20250306" description = "Typing stubs for requests" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "types_requests-2.32.0.20250306-py3-none-any.whl", hash = "sha256:25f2cbb5c8710b2022f8bbee7b2b66f319ef14aeea2f35d80f18c9dbf3b60a0b"}, {file = "types_requests-2.32.0.20250306.tar.gz", hash = "sha256:0962352694ec5b2f95fda877ee60a159abdf84a0fc6fdace599f20acb41a03d1"}, @@ -5988,6 +6299,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] 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"}, @@ -5995,13 +6307,14 @@ files = [ [[package]] name = "tzdata" -version = "2025.1" +version = "2025.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" +groups = ["main"] files = [ - {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, - {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, + {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, + {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, ] [[package]] @@ -6010,13 +6323,14 @@ version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -6027,6 +6341,7 @@ version = "20.29.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "virtualenv-20.29.3-py3-none-any.whl", hash = "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170"}, {file = "virtualenv-20.29.3.tar.gz", hash = "sha256:95e39403fcf3940ac45bc717597dba16110b74506131845d9b687d5e73d947ac"}, @@ -6039,7 +6354,7 @@ platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] [[package]] name = "wcwidth" @@ -6047,6 +6362,7 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -6058,6 +6374,7 @@ version = "0.45.1" description = "A built-package format for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"}, {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"}, @@ -6072,6 +6389,7 @@ version = "4.0.13" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71"}, {file = "widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6"}, @@ -6083,6 +6401,7 @@ version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -6171,6 +6490,7 @@ version = "3.2.2" description = "A Python module for creating Excel XLSX files." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "XlsxWriter-3.2.2-py3-none-any.whl", hash = "sha256:272ce861e7fa5e82a4a6ebc24511f2cb952fde3461f6c6e1a1e81d3272db1471"}, {file = "xlsxwriter-3.2.2.tar.gz", hash = "sha256:befc7f92578a85fed261639fb6cde1fd51b79c5e854040847dde59d4317077dc"}, @@ -6182,6 +6502,7 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -6193,6 +6514,7 @@ version = "3.5.0" description = "Python binding for xxHash" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "xxhash-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ece616532c499ee9afbb83078b1b952beffef121d989841f7f4b3dc5ac0fd212"}, {file = "xxhash-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3171f693dbc2cef6477054a665dc255d996646b4023fe56cb4db80e26f4cc520"}, @@ -6325,6 +6647,7 @@ version = "1.18.3" description = "Yet another URL library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, @@ -6421,20 +6744,21 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.10" -content-hash = "da4b4c6218ec1304a9bbb51f9735660ebb0314126334a2eaa2da789bdfbef25e" +content-hash = "566ac83f451e330135ef69e0613c28f662cead06fd8d892797f2f304ad667b42" diff --git a/pyproject.toml b/pyproject.toml index 092c3da0..4b95672b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ lxml = "^5.3.0" datasets = "^3.2.0" apted = "^1.0.3" Distance = "^0.1.3" -docling = {extras = ["vlm"], version = "~2.26.0"} +docling = {extras = ["vlm"], version = "^2.28.0"} matplotlib = "^3.10.0" torch = "^2.5.1" torchmetrics = "^1.6.0" diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 6985805b..ea32a20d 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -21,11 +21,18 @@ from docling_eval_next.dataset_builders.doclaynet_v1_builder import ( DocLayNetV1DatasetBuilder, ) +from docling_eval_next.dataset_builders.doclaynet_v2_builder import ( + DocLayNetV2DatasetBuilder, +) from docling_eval_next.dataset_builders.dpbench_builder import DPBenchDatasetBuilder from docling_eval_next.dataset_builders.funsd_builder import FUNSDDatasetBuilder from docling_eval_next.dataset_builders.omnidocbench_builder import ( OmniDocBenchDatasetBuilder, ) +from docling_eval_next.dataset_builders.otsl_table_dataset_builder import ( + FintabNetDatasetBuilder, + TableDatasetBuilder, +) from docling_eval_next.dataset_builders.xfund_builder import XFUNDDatasetBuilder from docling_eval_next.prediction_providers.prediction_provider import ( DoclingPredictionProvider, @@ -226,28 +233,32 @@ def test_run_doclaynet_v1_e2e(): ) -# def test_run_doclaynet_v2_e2e(): -# target_path = Path("./scratch/doclaynet-v2-builder-test/") -# docling_provider = create_docling_prediction_provider(page_image_scale=2.0) -# -# dataset_layout = DocLayNetV2DatasetBuilder( -# dataset_path="", -# prediction_provider=docling_provider, -# target=target_path / "e2e", -# ) -# -# dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF -# dataset_layout.save_to_disk( -# chunk_size=5, max_num_chunks=1 -# ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. -# -# if False: -# evaluate( -# modality=EvaluationModality.LAYOUT, -# benchmark=BenchMarkNames.DOCLAYNETV2, -# idir=target_path / "e2e", -# odir=target_path / "e2e" / "layout", -# ) +def test_run_doclaynet_v2_e2e(): + target_path = Path("./scratch/doclaynet-v2-builder-test/") + docling_provider = create_docling_prediction_provider(page_image_scale=2.0) + + dataset_layout = DocLayNetV2DatasetBuilder( + dataset_path=Path("/Users/cau/Documents/Data/doclaynet_v2_benchmark"), + target=target_path / "gt", + ) + + dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF + dataset_layout.save_to_disk( + chunk_size=5, max_num_chunks=1 + ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + + docling_provider.create_prediction_dataset( + name=dataset_layout.name, + gt_dataset_dir=target_path / "gt", + target_dataset_dir=target_path / "e2e", + ) + + evaluate( + modality=EvaluationModality.LAYOUT, + benchmark=BenchMarkNames.DOCLAYNETV2, + idir=target_path / "e2e", + odir=target_path / "e2e" / "layout", + ) def test_run_funsd(): @@ -276,3 +287,30 @@ def test_run_xfund(): dataset_layout.save_to_disk( chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + + +def test_run_tabledatasets(): + target_path = Path("./scratch/fintabnet-builder-test/") + tableformer_provider = TableFormerPredictionProvider() + + dataset_ftn = FintabNetDatasetBuilder( + target=target_path / "gt", + ) + + dataset_ftn.retrieve_input_dataset() # fetches the source dataset from HF + dataset_ftn.save_to_disk( + chunk_size=5, max_num_chunks=1 + ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + + tableformer_provider.create_prediction_dataset( + name=dataset_ftn.name, + gt_dataset_dir=target_path / "gt", + target_dataset_dir=target_path / "tables", + ) + + evaluate( + modality=EvaluationModality.TABLE_STRUCTURE, + benchmark=BenchMarkNames.DPBENCH, + idir=target_path / "tables", + odir=target_path / "tables" / "tableformer", + ) From 9175fc933aa327f1d869955a81592b9eb22eda69 Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Wed, 26 Mar 2025 11:15:16 +0100 Subject: [PATCH 30/81] chore: Update MyPy configuration in toml Signed-off-by: Nikos Livathinos --- poetry.lock | 420 +++++++------------------------------------------ pyproject.toml | 1 + 2 files changed, 55 insertions(+), 366 deletions(-) diff --git a/poetry.lock b/poetry.lock index 01c0fc50..bb6cd985 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "accelerate" @@ -6,8 +6,6 @@ version = "1.5.2" description = "Accelerate" optional = false python-versions = ">=3.9.0" -groups = ["main"] -markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "accelerate-1.5.2-py3-none-any.whl", hash = "sha256:68a3b272f6a6ffebb457bdc138581a2bf52efad6a5e0214dc46675f3edd98792"}, {file = "accelerate-1.5.2.tar.gz", hash = "sha256:a1cf39473edc0e42772a9d9a18c9eb1ce8ffd9e1719dc0ab80670f5c1fd4dc43"}, @@ -39,7 +37,6 @@ version = "2.6.1" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, @@ -51,7 +48,6 @@ version = "3.11.14" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e2bc827c01f75803de77b134afdbf74fa74b62970eafdf190f3244931d7a5c0d"}, {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e365034c5cf6cf74f57420b57682ea79e19eb29033399dd3f40de4d0171998fa"}, @@ -147,7 +143,7 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.2.0) ; sys_platform == \"linux\" or sys_platform == \"darwin\"", "brotlicffi ; platform_python_implementation != \"CPython\""] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] [[package]] name = "aiosignal" @@ -155,7 +151,6 @@ version = "1.3.2" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, @@ -170,7 +165,6 @@ 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"}, @@ -182,8 +176,6 @@ version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false python-versions = ">=3.6" -groups = ["dev"] -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"}, @@ -195,7 +187,6 @@ version = "1.0.3" description = "APTED algorithm for the Tree Edit Distance" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "apted-1.0.3-py3-none-any.whl", hash = "sha256:74193369d023649d335269e67c4df07f922959e5ac2597de1b79af4e694150e8"}, {file = "apted-1.0.3.tar.gz", hash = "sha256:befa5181e2d4457fa88e54995a82604ee048bb2fbc781ea97d8e1856b4715ce9"}, @@ -207,7 +198,6 @@ version = "2.15.8" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.7.2" -groups = ["dev"] files = [ {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, @@ -227,7 +217,6 @@ version = "3.0.0" description = "Annotate AST trees with source code positions" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, @@ -243,8 +232,6 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.10\"" files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, @@ -256,19 +243,18 @@ version = "25.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, ] [package.extras] -benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +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"] -tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] +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 = "autopep8" @@ -276,7 +262,6 @@ version = "2.2.0" description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "autopep8-2.2.0-py2.py3-none-any.whl", hash = "sha256:05418a981f038969d8bdcd5636bf15948db7555ae944b9f79b5a34b35f1370d4"}, {file = "autopep8-2.2.0.tar.gz", hash = "sha256:d306a0581163ac29908280ad557773a95a9bede072c0fafed6f141f5311f43c1"}, @@ -292,8 +277,6 @@ version = "1.2.0" description = "Backport of CPython tarfile module" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.10\" or python_version == \"3.11\"" files = [ {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, @@ -309,7 +292,6 @@ version = "4.13.3" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" -groups = ["main"] files = [ {file = "beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16"}, {file = "beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b"}, @@ -332,7 +314,6 @@ version = "24.10.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, @@ -381,7 +362,6 @@ version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, @@ -393,8 +373,6 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "implementation_name == \"pypy\" or sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" 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"}, @@ -474,7 +452,6 @@ version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -486,7 +463,6 @@ 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", "dev"] 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"}, @@ -588,7 +564,6 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -603,7 +578,6 @@ version = "0.4.0" description = "Logging integration for Click" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, @@ -618,12 +592,10 @@ 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", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "platform_system == \"Windows\""} [[package]] name = "comm" @@ -631,7 +603,6 @@ version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, @@ -649,7 +620,6 @@ version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, @@ -723,8 +693,6 @@ version = "44.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.7" -groups = ["dev"] -markers = "sys_platform == \"linux\"" files = [ {file = "cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7"}, {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1"}, @@ -767,10 +735,10 @@ files = [ cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""] -pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] +pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] test = ["certifi (>=2024)", "cryptography-vectors (==44.0.2)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] @@ -782,7 +750,6 @@ version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -798,7 +765,6 @@ version = "3.4.1" description = "HuggingFace community-driven open-source library of datasets" optional = false python-versions = ">=3.9.0" -groups = ["main"] files = [ {file = "datasets-3.4.1-py3-none-any.whl", hash = "sha256:b91cf257bd64132fa9d953dd4768ab6d63205597301f132a74271cfcce8b5dd3"}, {file = "datasets-3.4.1.tar.gz", hash = "sha256:e23968da79bc014ef9f7540eeb7771c6180eae82c86ebcfcc10535a03caf08b5"}, @@ -821,17 +787,17 @@ tqdm = ">=4.66.3" xxhash = "*" [package.extras] -audio = ["librosa", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\""] +audio = ["librosa", "soundfile (>=0.12.1)", "soxr (>=0.4.0)"] benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] -dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\"", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0) ; python_version < \"3.10\"", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers", "transformers (>=4.42.0)", "zstandard"] +dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers", "transformers (>=4.42.0)", "zstandard"] docs = ["s3fs", "tensorflow (>=2.6.0)", "torch", "transformers"] jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] quality = ["ruff (>=0.3.0)"] s3 = ["s3fs"] tensorflow = ["tensorflow (>=2.6.0)"] tensorflow-gpu = ["tensorflow (>=2.6.0)"] -tests = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\"", "tensorflow (>=2.6.0) ; python_version < \"3.10\"", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] -tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] +tests = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] +tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] torch = ["torch"] vision = ["Pillow (>=9.4.0)"] @@ -841,7 +807,6 @@ version = "1.8.13" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "debugpy-1.8.13-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:06859f68e817966723ffe046b896b1bd75c665996a77313370336ee9e1de3e90"}, {file = "debugpy-1.8.13-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c2db69fb8df3168bc857d7b7d2494fed295dfdbde9a45f27b4b152f37520"}, @@ -877,7 +842,6 @@ version = "5.2.1" description = "Decorators for Humans" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, @@ -889,7 +853,6 @@ version = "0.3.8" description = "serialize all of Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, @@ -905,7 +868,6 @@ version = "0.1.3" description = "Utilities for comparing sequences" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "Distance-0.1.3.tar.gz", hash = "sha256:60807584f5b6003f5c521aa73f39f51f631de3be5cccc5a1d67166fcbf0d4551"}, ] @@ -916,7 +878,6 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -928,7 +889,6 @@ version = "2.28.1" description = "SDK and CLI for parsing PDF, DOCX, HTML, and more, to a unified document representation for powering downstream workflows such as gen AI applications." optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "docling-2.28.1-py3-none-any.whl", hash = "sha256:aae0dbfb8a8aacadfd3662782bc45c0688459dd1dafc5a69ad81318a8abfb6a5"}, {file = "docling-2.28.1.tar.gz", hash = "sha256:1a48d810cbbd0855b40c7a8df4a6ce9477aeb133580a329ab1906e5807f4369d"}, @@ -961,16 +921,16 @@ rtree = ">=1.3.0,<2.0.0" scipy = {version = ">=1.6.0,<2.0.0", markers = "python_version >= \"3.10\""} tqdm = ">=4.65.0,<5.0.0" transformers = [ - {version = ">=4.46.0,<5.0.0", optional = true, markers = "(sys_platform != \"darwin\" or platform_machine != \"x86_64\") and extra == \"vlm\""}, + {version = ">=4.46.0,<5.0.0", optional = true, markers = "sys_platform != \"darwin\" and extra == \"vlm\" or platform_machine != \"x86_64\" and extra == \"vlm\""}, {version = ">=4.42.0,<4.43.0", optional = true, markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\" and extra == \"vlm\""}, ] typer = ">=0.12.5,<0.13.0" [package.extras] -ocrmac = ["ocrmac (>=1.0.0,<2.0.0) ; sys_platform == \"darwin\""] -rapidocr = ["onnxruntime (>=1.7.0,<1.20.0) ; python_version < \"3.10\"", "onnxruntime (>=1.7.0,<2.0.0) ; python_version >= \"3.10\"", "rapidocr-onnxruntime (>=1.4.0,<2.0.0) ; python_version < \"3.13\""] +ocrmac = ["ocrmac (>=1.0.0,<2.0.0)"] +rapidocr = ["onnxruntime (>=1.7.0,<1.20.0)", "onnxruntime (>=1.7.0,<2.0.0)", "rapidocr-onnxruntime (>=1.4.0,<2.0.0)"] tesserocr = ["tesserocr (>=2.7.1,<3.0.0)"] -vlm = ["accelerate (>=1.2.1,<2.0.0) ; sys_platform != \"darwin\" or platform_machine != \"x86_64\"", "transformers (>=4.42.0,<4.43.0) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "transformers (>=4.46.0,<5.0.0) ; sys_platform != \"darwin\" or platform_machine != \"x86_64\""] +vlm = ["accelerate (>=1.2.1,<2.0.0)", "transformers (>=4.42.0,<4.43.0)", "transformers (>=4.46.0,<5.0.0)"] [[package]] name = "docling-core" @@ -978,7 +938,6 @@ version = "2.24.0" description = "A python library to define and validate data types in Docling." optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "docling_core-2.24.0-py3-none-any.whl", hash = "sha256:5c14f8dd8c6add6f5fa8104ff202df1baa7fd2471123bea56137f866e21b8d40"}, {file = "docling_core-2.24.0.tar.gz", hash = "sha256:7bb880a72963accb47c9d05edd712601ccbd1d8a9fccba14ae6ef41baef41c69"}, @@ -1007,7 +966,6 @@ version = "3.4.1" description = "This package contains the AI models used by the Docling PDF conversion package" optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "docling_ibm_models-3.4.1-py3-none-any.whl", hash = "sha256:c3582c99dddfa3f0eafcf80cf1267fd8efa39c4a74cc7a88f9dd49684fac2986"}, {file = "docling_ibm_models-3.4.1.tar.gz", hash = "sha256:093b4dff2ea284a4953c3aa009e29945208b8d389b94fb14940a03a93f673e96"}, @@ -1039,7 +997,6 @@ version = "4.0.0" description = "Simple package to extract text with coordinates from programmatic PDFs" optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "docling_parse-4.0.0-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:6de7fa8ec4919f604c9a02a3fa8ca0e13a3a8e3c0652adc41848616b737925d9"}, {file = "docling_parse-4.0.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:82704280ab086a84a30d9ec9def6cd96b733aefc6973546b2101d09eed7a958e"}, @@ -1084,7 +1041,6 @@ version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, @@ -1096,7 +1052,6 @@ version = "1.3.1" description = "Dictionary wrapper for quick access to deeply nested keys." optional = false python-versions = ">=3.5,<4.0" -groups = ["dev"] files = [ {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, @@ -1108,7 +1063,6 @@ version = "1.7.2" description = "End-to-End Multi-Lingual Optical Character Recognition (OCR) Solution" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "easyocr-1.7.2-py3-none-any.whl", hash = "sha256:5be12f9b0e595d443c9c3d10b0542074b50f0ec2d98b141a109cd961fd1c177c"}, ] @@ -1133,7 +1087,6 @@ version = "2.0.0" description = "An implementation of lxml.xmlfile for the standard library" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, @@ -1145,7 +1098,6 @@ version = "0.4.3" description = "HuggingFace community-driven open-source library of evaluation" optional = false python-versions = ">=3.8.0" -groups = ["main"] files = [ {file = "evaluate-0.4.3-py3-none-any.whl", hash = "sha256:47d8770bdea76e2c2ed0d40189273027d1a41ccea861bcc7ba12d30ec5d1e517"}, {file = "evaluate-0.4.3.tar.gz", hash = "sha256:3a5700cf83aabee9549264e1e5666f116367c61dbd4d38352015e859a5e2098d"}, @@ -1181,8 +1133,6 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "python_version == \"3.10\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1197,7 +1147,6 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1212,14 +1161,13 @@ version = "2.2.0" description = "Get the currently executing AST node of a frame, and other information" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] [[package]] name = "filelock" @@ -1227,7 +1175,6 @@ version = "3.18.0" description = "A platform independent file lock." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, @@ -1236,7 +1183,7 @@ files = [ [package.extras] docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] -typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] +typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "filetype" @@ -1244,7 +1191,6 @@ version = "1.2.0" description = "Infer file type and MIME type of any file/buffer. No external dependencies." optional = false python-versions = "*" -groups = ["main"] files = [ {file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"}, {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"}, @@ -1256,7 +1202,6 @@ version = "6.1.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" -groups = ["dev"] files = [ {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, @@ -1273,7 +1218,6 @@ version = "1.2.3" description = "Flake8 plug-in loading the configuration from pyproject.toml" optional = false python-versions = ">= 3.6" -groups = ["dev"] files = [ {file = "flake8_pyproject-1.2.3-py3-none-any.whl", hash = "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a"}, ] @@ -1291,7 +1235,6 @@ version = "4.56.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "fonttools-4.56.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:331954d002dbf5e704c7f3756028e21db07097c19722569983ba4d74df014000"}, {file = "fonttools-4.56.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d1613abd5af2f93c05867b3a3759a56e8bf97eb79b1da76b2bc10892f96ff16"}, @@ -1346,18 +1289,18 @@ files = [ ] [package.extras] -all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] +interpolatable = ["munkres", "pycairo", "scipy"] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] -type1 = ["xattr ; sys_platform == \"darwin\""] +type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] -woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "frozenlist" @@ -1365,7 +1308,6 @@ version = "1.5.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, @@ -1467,7 +1409,6 @@ version = "2024.12.0" description = "File-system specification" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2"}, {file = "fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f"}, @@ -1510,7 +1451,6 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1525,7 +1465,6 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1536,7 +1475,7 @@ gitdb = ">=4.0.1,<5" [package.extras] doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] -test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] [[package]] name = "huggingface-hub" @@ -1544,7 +1483,6 @@ version = "0.29.3" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" -groups = ["main"] files = [ {file = "huggingface_hub-0.29.3-py3-none-any.whl", hash = "sha256:0b25710932ac649c08cdbefa6c6ccb8e88eef82927cacdb048efb726429453aa"}, {file = "huggingface_hub-0.29.3.tar.gz", hash = "sha256:64519a25716e0ba382ba2d3fb3ca082e7c7eb4a2fc634d200e8380006e0760e5"}, @@ -1579,7 +1517,6 @@ version = "2.6.9" description = "File identification library for Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "identify-2.6.9-py2.py3-none-any.whl", hash = "sha256:c98b4322da415a8e5a70ff6e51fbc2d2932c015532d77e9f8537b4ba7813b150"}, {file = "identify-2.6.9.tar.gz", hash = "sha256:d40dfe3142a1421d8518e3d3985ef5ac42890683e32306ad614a29490abeb6bf"}, @@ -1594,7 +1531,6 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1609,7 +1545,6 @@ version = "2.37.0" description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "imageio-2.37.0-py3-none-any.whl", hash = "sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed"}, {file = "imageio-2.37.0.tar.gz", hash = "sha256:71b57b3669666272c818497aebba2b4c5f20d5b37c81720e5e1a56d59c492996"}, @@ -1643,7 +1578,6 @@ version = "8.6.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, @@ -1653,12 +1587,12 @@ files = [ zipp = ">=3.20" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] [[package]] @@ -1667,7 +1601,6 @@ version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, @@ -1679,7 +1612,6 @@ version = "2.2.0" description = "Pythonic task execution" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "invoke-2.2.0-py3-none-any.whl", hash = "sha256:6ea924cc53d4f78e3d98bc436b08069a03077e6f85ad1ddaa8a116d7dad15820"}, {file = "invoke-2.2.0.tar.gz", hash = "sha256:ee6cbb101af1a859c7fe84f2a264c059020b0cb7fe3535f9424300ab568f6bd5"}, @@ -1691,7 +1623,6 @@ version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, @@ -1725,8 +1656,6 @@ version = "8.34.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" -groups = ["dev"] -markers = "python_version == \"3.10\"" files = [ {file = "ipython-8.34.0-py3-none-any.whl", hash = "sha256:0419883fa46e0baa182c5d50ebb8d6b49df1889fdb70750ad6d8cfe678eda6e3"}, {file = "ipython-8.34.0.tar.gz", hash = "sha256:c31d658e754673ecc6514583e7dda8069e47136eb62458816b7d1e6625948b5a"}, @@ -1748,7 +1677,7 @@ typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli ; python_version < \"3.11\"", "typing_extensions"] +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"] @@ -1759,63 +1688,12 @@ 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 = "ipython" -version = "9.0.2" -description = "IPython: Productive Interactive Computing" -optional = false -python-versions = ">=3.11" -groups = ["dev"] -markers = "python_version >= \"3.11\"" -files = [ - {file = "ipython-9.0.2-py3-none-any.whl", hash = "sha256:143ef3ea6fb1e1bffb4c74b114051de653ffb7737a3f7ab1670e657ca6ae8c44"}, - {file = "ipython-9.0.2.tar.gz", hash = "sha256:ec7b479e3e5656bf4f58c652c120494df1820f4f28f522fb7ca09e213c2aab52"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -ipython-pygments-lexers = "*" -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} -prompt_toolkit = ">=3.0.41,<3.1.0" -pygments = ">=2.4.0" -stack_data = "*" -traitlets = ">=5.13.0" -typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} - -[package.extras] -all = ["ipython[doc,matplotlib,test,test-extra]"] -black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinx_toml (==0.0.4)", "typing_extensions"] -matplotlib = ["matplotlib"] -test = ["packaging", "pytest", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] - -[[package]] -name = "ipython-pygments-lexers" -version = "1.1.1" -description = "Defines a variety of Pygments lexers for highlighting IPython code." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version >= \"3.11\"" -files = [ - {file = "ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c"}, - {file = "ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81"}, -] - -[package.dependencies] -pygments = "*" - [[package]] name = "ipywidgets" version = "8.1.5" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245"}, {file = "ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17"}, @@ -1837,7 +1715,6 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" -groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -1852,7 +1729,6 @@ version = "3.4.0" description = "Utility functions for Python class constructs" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, @@ -1871,7 +1747,6 @@ version = "6.0.1" description = "Useful decorators and context managers" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, @@ -1882,7 +1757,7 @@ files = [ [package.extras] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "jaraco-functools" @@ -1890,7 +1765,6 @@ version = "4.1.0" description = "Functools like those found in stdlib" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"}, {file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"}, @@ -1900,7 +1774,7 @@ files = [ more-itertools = "*" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] @@ -1913,7 +1787,6 @@ version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, @@ -1933,15 +1806,13 @@ version = "0.9.0" description = "Low-level, pure Python DBus protocol wrapper." optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "sys_platform == \"linux\"" files = [ {file = "jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"}, {file = "jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"}, ] [package.extras] -test = ["async-timeout ; python_version < \"3.11\"", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] trio = ["trio"] [[package]] @@ -1950,7 +1821,6 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1968,7 +1838,6 @@ version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, @@ -1980,7 +1849,6 @@ version = "3.1.0" description = "Library with helpers for the jsonlines file format" optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "jsonlines-3.1.0-py3-none-any.whl", hash = "sha256:632f5e38f93dfcb1ac8c4e09780b92af3a55f38f26e7c47ae85109d420b6ad39"}, {file = "jsonlines-3.1.0.tar.gz", hash = "sha256:2579cb488d96f815b0eb81629e3e6b0332da0962a18fa3532958f7ba14a5c37f"}, @@ -1995,7 +1863,6 @@ version = "1.1.0" description = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python." optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9"}, {file = "jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552"}, @@ -2007,7 +1874,6 @@ 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"}, @@ -2029,7 +1895,6 @@ 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"}, @@ -2044,7 +1909,6 @@ version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" -groups = ["dev"] 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"}, @@ -2059,7 +1923,7 @@ 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 ; sys_platform == \"win32\"", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" @@ -2067,7 +1931,6 @@ version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" -groups = ["dev"] 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"}, @@ -2088,7 +1951,6 @@ version = "3.0.13" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" -groups = ["dev"] 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"}, @@ -2100,7 +1962,6 @@ version = "25.6.0" description = "Store and access your passwords safely." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, @@ -2116,7 +1977,7 @@ pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] completion = ["shtab (>=1.1.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] @@ -2130,7 +1991,6 @@ version = "1.4.8" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, @@ -2220,7 +2080,6 @@ version = "3.77.0" description = "Pure Python library for LaTeX to MathML conversion" optional = false python-versions = ">=3.8.1,<4.0.0" -groups = ["main"] files = [ {file = "latex2mathml-3.77.0-py3-none-any.whl", hash = "sha256:5531e18a2a9eae7c24e257118b6a444cbba253cd27ff3e81f1bd6c41e88e786e"}, {file = "latex2mathml-3.77.0.tar.gz", hash = "sha256:e2f501d1878f2e489c3f6f12786bef74c62f712d2770f7f3c837eb20a55d0a1e"}, @@ -2232,7 +2091,6 @@ version = "0.4" description = "Makes it easy to load subpackages and functions on demand." optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc"}, {file = "lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1"}, @@ -2252,7 +2110,6 @@ version = "1.10.0" description = "A fast and thorough lazy object proxy." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, @@ -2299,7 +2156,6 @@ version = "0.14.2" description = "Lightning toolbox for across the our ecosystem." optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "lightning_utilities-0.14.2-py3-none-any.whl", hash = "sha256:da791fcaa731f651ec76a1a3b12994ed05af4d6841f2e78760233552709ef05d"}, {file = "lightning_utilities-0.14.2.tar.gz", hash = "sha256:0466a4f1bb9dff1c7190d4c7a32d1a8a1109f94fb816931efe8fb8b12bb0ab8d"}, @@ -2321,7 +2177,6 @@ version = "5.3.1" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a4058f16cee694577f7e4dd410263cd0ef75644b43802a689c2b3c2a7e69453b"}, {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:364de8f57d6eda0c16dcfb999af902da31396949efa0e583e12675d09709881b"}, @@ -2476,7 +2331,6 @@ 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"}, @@ -2501,7 +2355,6 @@ version = "2.1.2" description = "A markdown parser with high extensibility." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "marko-2.1.2-py3-none-any.whl", hash = "sha256:c14aa7a77468aaaf53cf056dcd3d32398b9df4c3fb81f5e120dd37cbb9f8c859"}, {file = "marko-2.1.2.tar.gz", hash = "sha256:a9170006b879376e6845c91b1ae3dce2992772954b99b70175ff888537186011"}, @@ -2518,7 +2371,6 @@ 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"}, @@ -2589,7 +2441,6 @@ version = "3.10.1" description = "Python plotting package" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "matplotlib-3.10.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16"}, {file = "matplotlib-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2"}, @@ -2647,7 +2498,6 @@ version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false python-versions = ">=3.8" -groups = ["dev"] 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"}, @@ -2662,7 +2512,6 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, @@ -2674,7 +2523,6 @@ 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"}, @@ -2686,7 +2534,6 @@ version = "10.6.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b"}, {file = "more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"}, @@ -2698,7 +2545,6 @@ version = "2.10.2" description = "A Python package for easy multiprocessing, but faster than multiprocessing" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "mpire-2.10.2-py3-none-any.whl", hash = "sha256:d627707f7a8d02aa4c7f7d59de399dec5290945ddf7fbd36cbb1d6ebb37a51fb"}, {file = "mpire-2.10.2.tar.gz", hash = "sha256:f66a321e93fadff34585a4bfa05e95bd946cf714b442f51c529038eb45773d97"}, @@ -2715,9 +2561,9 @@ tqdm = ">=4.27" [package.extras] dashboard = ["flask"] -dill = ["multiprocess (>=0.70.15) ; python_version >= \"3.11\"", "multiprocess ; python_version < \"3.11\""] +dill = ["multiprocess", "multiprocess (>=0.70.15)"] docs = ["docutils (==0.17.1)", "sphinx (==3.2.1)", "sphinx-autodoc-typehints (==1.11.0)", "sphinx-rtd-theme (==0.5.0)", "sphinx-versions (==1.0.1)", "sphinxcontrib-images (==0.9.2)"] -testing = ["ipywidgets", "multiprocess (>=0.70.15) ; python_version >= \"3.11\"", "multiprocess ; python_version < \"3.11\"", "numpy", "pywin32 (>=301) ; platform_system == \"Windows\"", "rich"] +testing = ["ipywidgets", "multiprocess", "multiprocess (>=0.70.15)", "numpy", "pywin32 (>=301)", "rich"] [[package]] name = "mpmath" @@ -2725,7 +2571,6 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2734,7 +2579,7 @@ files = [ [package.extras] develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] docs = ["sphinx"] -gmpy = ["gmpy2 (>=2.1.0a4) ; platform_python_implementation != \"PyPy\""] +gmpy = ["gmpy2 (>=2.1.0a4)"] tests = ["pytest (>=4.6)"] [[package]] @@ -2743,7 +2588,6 @@ version = "6.2.0" description = "multidict implementation" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "multidict-6.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b9f6392d98c0bd70676ae41474e2eecf4c7150cb419237a41f8f96043fcb81d1"}, {file = "multidict-6.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3501621d5e86f1a88521ea65d5cad0a0834c77b26f193747615b7c911e5422d2"}, @@ -2848,7 +2692,6 @@ version = "0.70.16" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "multiprocess-0.70.16-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee"}, {file = "multiprocess-0.70.16-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec"}, @@ -2873,7 +2716,6 @@ version = "1.15.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"}, {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"}, @@ -2927,7 +2769,6 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" -groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -2939,7 +2780,6 @@ version = "1.9.1" description = "Run any standard Python code quality tool on a Jupyter Notebook" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "nbqa-1.9.1-py3-none-any.whl", hash = "sha256:95552d2f6c2c038136252a805aa78d85018aef922586270c3a074332737282e5"}, {file = "nbqa-1.9.1.tar.gz", hash = "sha256:a1f4bcf587c597302fed295951001fc4e1be4ce0e77e1ab1b25ac2fbe3db0cdd"}, @@ -2960,7 +2800,6 @@ version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" -groups = ["dev"] 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"}, @@ -2972,7 +2811,6 @@ version = "3.4.2" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"}, {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"}, @@ -2992,7 +2830,6 @@ version = "0.2.21" description = "Python binding to Ammonia HTML sanitizer Rust crate" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "nh3-0.2.21-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:fcff321bd60c6c5c9cb4ddf2554e22772bb41ebd93ad88171bbbb6f271255286"}, {file = "nh3-0.2.21-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31eedcd7d08b0eae28ba47f43fd33a653b4cdb271d64f1aeda47001618348fde"}, @@ -3026,7 +2863,6 @@ version = "1.11.1.4" description = "Ninja is a small build system with a focus on speed" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "ninja-1.11.1.4-py3-none-macosx_10_9_universal2.whl", hash = "sha256:b33923c8da88e8da20b6053e38deb433f53656441614207e01d283ad02c5e8e7"}, {file = "ninja-1.11.1.4-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cede0af00b58e27b31f2482ba83292a8e9171cdb9acc2c867a3b6e40b3353e43"}, @@ -3053,7 +2889,6 @@ version = "3.9.1" description = "Natural Language Toolkit" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"}, {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"}, @@ -3079,7 +2914,6 @@ version = "1.9.1" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["dev"] files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -3091,8 +2925,6 @@ version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] -markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -3138,8 +2970,6 @@ version = "2.2.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" -groups = ["main", "dev"] -markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "numpy-2.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9"}, {file = "numpy-2.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae"}, @@ -3204,8 +3034,6 @@ version = "12.4.5.8" description = "CUBLAS native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3"}, {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b"}, @@ -3218,8 +3046,6 @@ version = "12.4.127" description = "CUDA profiling tools runtime libs." optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a"}, {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb"}, @@ -3232,8 +3058,6 @@ version = "12.4.127" description = "NVRTC native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198"}, {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338"}, @@ -3246,8 +3070,6 @@ version = "12.4.127" description = "CUDA Runtime native Libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3"}, {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5"}, @@ -3260,8 +3082,6 @@ version = "9.1.0.70" description = "cuDNN runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, @@ -3276,8 +3096,6 @@ version = "11.2.1.3" description = "CUFFT native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399"}, {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9"}, @@ -3293,8 +3111,6 @@ version = "10.3.5.147" description = "CURAND native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9"}, {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b"}, @@ -3307,8 +3123,6 @@ version = "11.6.1.9" description = "CUDA solver native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e"}, {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260"}, @@ -3326,8 +3140,6 @@ version = "12.3.1.170" description = "CUSPARSE native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3"}, {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1"}, @@ -3343,8 +3155,6 @@ version = "0.6.2" description = "NVIDIA cuSPARSELt" optional = false python-versions = "*" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:067a7f6d03ea0d4841c85f0c6f1991c5dda98211f6302cb83a4ab234ee95bef8"}, {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:df2c24502fd76ebafe7457dbc4716b2fec071aabaed4fb7691a201cde03704d9"}, @@ -3357,8 +3167,6 @@ version = "2.21.5" description = "NVIDIA Collective Communication Library (NCCL) Runtime" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0"}, ] @@ -3369,8 +3177,6 @@ version = "12.4.127" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, @@ -3383,8 +3189,6 @@ version = "12.4.127" description = "NVIDIA Tools Extension" optional = false python-versions = ">=3" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3"}, {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a"}, @@ -3397,7 +3201,6 @@ version = "4.11.0.86" description = "Wrapper package for OpenCV python bindings." optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798"}, {file = "opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca"}, @@ -3410,9 +3213,9 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, - {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, + {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, + {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] @@ -3422,7 +3225,6 @@ version = "3.1.5" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, @@ -3437,7 +3239,6 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -3449,7 +3250,6 @@ 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"}, @@ -3536,7 +3336,6 @@ version = "2.2.3.250308" description = "Type annotations for pandas" optional = false python-versions = ">=3.10" -groups = ["dev"] files = [ {file = "pandas_stubs-2.2.3.250308-py3-none-any.whl", hash = "sha256:a377edff3b61f8b268c82499fdbe7c00fdeed13235b8b71d6a1dc347aeddc74d"}, {file = "pandas_stubs-2.2.3.250308.tar.gz", hash = "sha256:3a6e9daf161f00b85c83772ed3d5cff9522028f07a94817472c07b91f46710fd"}, @@ -3552,7 +3351,6 @@ version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -3568,7 +3366,6 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -3580,8 +3377,6 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" -groups = ["dev"] -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"}, @@ -3596,7 +3391,6 @@ version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, @@ -3685,7 +3479,7 @@ docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -typing = ["typing-extensions ; python_version < \"3.10\""] +typing = ["typing-extensions"] xmp = ["defusedxml"] [[package]] @@ -3694,7 +3488,6 @@ version = "1.12.1.2" description = "Query metadata from sdists / bdists / installed packages." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pkginfo-1.12.1.2-py3-none-any.whl", hash = "sha256:c783ac885519cab2c34927ccfa6bf64b5a704d7c69afaea583dd9b7afe969343"}, {file = "pkginfo-1.12.1.2.tar.gz", hash = "sha256:5cd957824ac36f140260964eba3c6be6442a8359b8c48f4adf90210f33a04b7b"}, @@ -3709,7 +3502,6 @@ version = "4.3.7" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94"}, {file = "platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351"}, @@ -3726,7 +3518,6 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -3742,7 +3533,6 @@ version = "3.8.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, @@ -3761,7 +3551,6 @@ version = "3.0.50" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.8.0" -groups = ["dev"] files = [ {file = "prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198"}, {file = "prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab"}, @@ -3776,7 +3565,6 @@ version = "0.3.0" description = "Accelerated property cache" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:efa44f64c37cc30c9f05932c740a8b40ce359f51882c70883cc95feac842da4d"}, {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2383a17385d9800b6eb5855c2f05ee550f803878f344f58b6e194de08b96352c"}, @@ -3884,7 +3672,6 @@ version = "7.0.0" description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, @@ -3897,7 +3684,6 @@ files = [ {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, ] -markers = {main = "sys_platform != \"darwin\" or platform_machine != \"x86_64\""} [package.extras] dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] @@ -3909,8 +3695,6 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = false python-versions = "*" -groups = ["dev"] -markers = "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"}, @@ -3922,7 +3706,6 @@ version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" -groups = ["dev"] 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"}, @@ -3937,7 +3720,6 @@ version = "19.0.1" description = "Python library for Apache Arrow" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fc28912a2dc924dddc2087679cc8b7263accc71b9ff025a1362b004711661a69"}, {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fca15aabbe9b8355800d923cc2e82c8ef514af321e18b437c3d782aa884eaeec"}, @@ -3992,7 +3774,6 @@ version = "1.3.0.post6" description = "Cython wrapper for the C++ translation of the Angus Johnson's Clipper library (ver. 6.4.2)" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "pyclipper-1.3.0.post6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fa0f5e78cfa8262277bb3d0225537b3c2a90ef68fd90a229d5d24cf49955dcf4"}, {file = "pyclipper-1.3.0.post6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a01f182d8938c1dc515e8508ed2442f7eebd2c25c7d5cb29281f583c1a8008a4"}, @@ -4052,7 +3833,6 @@ version = "2.0.8" description = "Official APIs for the MS-COCO dataset" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "pycocotools-2.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a66886f45b04cee1ff0492e9f5e25d430d8aa3eb63e63c4ebc620945caa11b9"}, {file = "pycocotools-2.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257130b65b7b0f122ce1ed62942867ca9789e56a68109682796cc85c9770c74a"}, @@ -4095,7 +3875,6 @@ version = "2.11.1" description = "Python style guide checker" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, @@ -4107,8 +3886,6 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "implementation_name == \"pypy\" or sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -4120,7 +3897,6 @@ version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, @@ -4133,7 +3909,7 @@ typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] +timezone = ["tzdata"] [[package]] name = "pydantic-core" @@ -4141,7 +3917,6 @@ 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"}, @@ -4254,7 +4029,6 @@ version = "2.8.1" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c"}, {file = "pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585"}, @@ -4275,7 +4049,6 @@ version = "3.1.0" description = "passive checker of Python programs" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, @@ -4287,7 +4060,6 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -4302,7 +4074,6 @@ version = "2.10" description = "Simple LaTeX parser providing latex-to-unicode and unicode-to-latex conversion" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "pylatexenc-2.10.tar.gz", hash = "sha256:3dd8fd84eb46dc30bee1e23eaab8d8fb5a7f507347b23e5f38ad9675c84f40d3"}, ] @@ -4313,7 +4084,6 @@ version = "2.17.7" description = "python code static checker" optional = false python-versions = ">=3.7.2" -groups = ["dev"] files = [ {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, @@ -4342,7 +4112,6 @@ version = "3.2.3" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"}, {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"}, @@ -4357,7 +4126,6 @@ version = "4.30.1" description = "Python bindings to PDFium" optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "pypdfium2-4.30.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:e07c47633732cc18d890bb7e965ad28a9c5a932e548acb928596f86be2e5ae37"}, {file = "pypdfium2-4.30.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5ea2d44e96d361123b67b00f527017aa9c847c871b5714e013c01c3eb36a79fe"}, @@ -4380,7 +4148,6 @@ version = "6.1.0" description = "pyproject-flake8 (`pflake8`), a monkey patching wrapper to connect flake8 with pyproject.toml configuration" optional = false python-versions = ">=3.8.1" -groups = ["dev"] files = [ {file = "pyproject_flake8-6.1.0-py3-none-any.whl", hash = "sha256:86ea5559263c098e1aa4f866776aa2cf45362fd91a576b9fd8fbbbb55db12c4e"}, {file = "pyproject_flake8-6.1.0.tar.gz", hash = "sha256:6da8e5a264395e0148bc11844c6fb50546f1fac83ac9210f7328664135f9e70f"}, @@ -4396,7 +4163,6 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -4419,7 +4185,6 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -4440,7 +4205,6 @@ version = "0.6.6" description = "Python Bidi layout wrapping the Rust crate unicode-bidi" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "python_bidi-0.6.6-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09d4da6b5851d0df01d7313a11d22f308fdfb0e12461f7262e0f55c521ccc0f1"}, {file = "python_bidi-0.6.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:493a844891e23264411b01df58ba77d5dbb0045da3787f4195f50a56bfb847d9"}, @@ -4562,7 +4326,6 @@ 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", "dev"] 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"}, @@ -4577,7 +4340,6 @@ version = "1.1.2" description = "Create, read, and update Microsoft Word .docx files." optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe"}, {file = "python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd"}, @@ -4593,7 +4355,6 @@ version = "1.1.0" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"}, {file = "python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5"}, @@ -4608,7 +4369,6 @@ version = "3.15.0" description = "Interact with GitLab API" optional = false python-versions = ">=3.7.0" -groups = ["dev"] files = [ {file = "python-gitlab-3.15.0.tar.gz", hash = "sha256:c9e65eb7612a9fbb8abf0339972eca7fd7a73d4da66c9b446ffe528930aff534"}, {file = "python_gitlab-3.15.0-py3-none-any.whl", hash = "sha256:8f8d1c0d387f642eb1ac7bf5e8e0cd8b3dd49c6f34170cee3c7deb7d384611f3"}, @@ -4628,7 +4388,6 @@ version = "1.0.2" description = "Create, read, and update PowerPoint 2007+ (.pptx) files." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "python_pptx-1.0.2-py3-none-any.whl", hash = "sha256:160838e0b8565a8b1f67947675886e9fea18aa5e795db7ae531606d68e785cba"}, {file = "python_pptx-1.0.2.tar.gz", hash = "sha256:479a8af0eaf0f0d76b6f00b0887732874ad2e3188230315290cd1f9dd9cc7095"}, @@ -4646,7 +4405,6 @@ version = "7.34.6" description = "Automatic Semantic Versioning for Python projects" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "python-semantic-release-7.34.6.tar.gz", hash = "sha256:e9b8fb788024ae9510a924136d573588415a16eeca31cc5240f2754a80a2e831"}, {file = "python_semantic_release-7.34.6-py3-none-any.whl", hash = "sha256:7e3969ba4663d9b2087b02bf3ac140e202551377bf045c34e09bfe19753e19ab"}, @@ -4678,7 +4436,6 @@ version = "2025.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, @@ -4690,7 +4447,6 @@ version = "310" description = "Python for Window Extensions" optional = false python-versions = "*" -groups = ["main", "dev"] files = [ {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, @@ -4709,7 +4465,6 @@ files = [ {file = "pywin32-310-cp39-cp39-win32.whl", hash = "sha256:851c8d927af0d879221e616ae1f66145253537bbdd321a77e8ef701b443a9a1a"}, {file = "pywin32-310-cp39-cp39-win_amd64.whl", hash = "sha256:96867217335559ac619f00ad70e513c0fcf84b8a3af9fc2bba3b59b97da70475"}, ] -markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\"", dev = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} [[package]] name = "pywin32-ctypes" @@ -4717,8 +4472,6 @@ version = "0.2.3" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, @@ -4730,7 +4483,6 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] 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"}, @@ -4793,7 +4545,6 @@ version = "26.3.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pyzmq-26.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1586944f4736515af5c6d3a5b150c7e8ca2a2d6e46b23057320584d6f2438f4a"}, {file = "pyzmq-26.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa7efc695d1fc9f72d91bf9b6c6fe2d7e1b4193836ec530a98faf7d7a7577a58"}, @@ -4899,7 +4650,6 @@ version = "44.0" description = "readme_renderer is a library for rendering readme descriptions for Warehouse" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151"}, {file = "readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"}, @@ -4919,7 +4669,6 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -4936,7 +4685,6 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -5040,7 +4788,6 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -5062,7 +4809,6 @@ version = "1.0.0" description = "A utility belt for advanced users of python-requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["dev"] files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, @@ -5077,7 +4823,6 @@ version = "2.0.0" description = "Validating URI References per RFC 3986" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, @@ -5092,7 +4837,6 @@ 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"}, @@ -5112,7 +4856,6 @@ version = "0.23.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "rpds_py-0.23.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2a54027554ce9b129fc3d633c92fa33b30de9f08bc61b32c053dc9b537266fed"}, {file = "rpds_py-0.23.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5ef909a37e9738d146519657a1aab4584018746a18f71c692f2f22168ece40c"}, @@ -5225,7 +4968,6 @@ version = "1.4.0" description = "R-Tree spatial index for Python GIS" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "rtree-1.4.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:4d1bebc418101480aabf41767e772dd2155d3b27b1376cccbd93e4509485e091"}, {file = "rtree-1.4.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:997f8c38d5dffa3949ea8adb4c8b291ea5cd4ef5ee69455d642dd171baf9991d"}, @@ -5245,7 +4987,6 @@ version = "0.5.3" description = "" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073"}, {file = "safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21d01c14ff6c415c485616b8b0bf961c46b3b343ca59110d38d744e577f9cce7"}, @@ -5287,7 +5028,6 @@ version = "0.25.2" description = "Image processing in Python" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "scikit_image-0.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d3278f586793176599df6a4cf48cb6beadae35c31e58dc01a98023af3dc31c78"}, {file = "scikit_image-0.25.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5c311069899ce757d7dbf1d03e32acb38bb06153236ae77fcd820fd62044c063"}, @@ -5326,7 +5066,7 @@ tifffile = ">=2022.8.12" [package.extras] build = ["Cython (>=3.0.8)", "build (>=1.2.1)", "meson-python (>=0.16)", "ninja (>=1.11.1.1)", "numpy (>=2.0)", "pythran (>=0.16)", "spin (==0.13)"] data = ["pooch (>=1.6.0)"] -developer = ["ipython", "pre-commit", "tomli ; python_version < \"3.11\""] +developer = ["ipython", "pre-commit", "tomli"] docs = ["PyWavelets (>=1.6)", "dask[array] (>=2023.2.0)", "intersphinx-registry (>=0.2411.14)", "ipykernel", "ipywidgets", "kaleido (==0.2.1)", "matplotlib (>=3.7)", "myst-parser", "numpydoc (>=1.7)", "pandas (>=2.0)", "plotly (>=5.20)", "pooch (>=1.6)", "pydata-sphinx-theme (>=0.16)", "pytest-doctestplus", "scikit-learn (>=1.2)", "seaborn (>=0.11)", "sphinx (>=8.0)", "sphinx-copybutton", "sphinx-gallery[parallel] (>=0.18)", "sphinx_design (>=0.5)", "tifffile (>=2022.8.12)"] optional = ["PyWavelets (>=1.6)", "SimpleITK", "astropy (>=5.0)", "cloudpickle (>=1.1.1)", "dask[array] (>=2023.2.0)", "matplotlib (>=3.7)", "pooch (>=1.6.0)", "pyamg (>=5.2)", "scikit-learn (>=1.2)"] test = ["asv", "numpydoc (>=1.7)", "pooch (>=1.6.0)", "pytest (>=8)", "pytest-cov (>=2.11.0)", "pytest-doctestplus", "pytest-faulthandler", "pytest-localserver"] @@ -5337,7 +5077,6 @@ version = "1.15.2" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9"}, {file = "scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5"}, @@ -5393,7 +5132,7 @@ numpy = ">=1.23.5,<2.5" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "secretstorage" @@ -5401,8 +5140,6 @@ version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "sys_platform == \"linux\"" files = [ {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, @@ -5418,7 +5155,6 @@ version = "2.2.2" description = "A fast and lightweight Python library for splitting text into semantically meaningful chunks." optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "semchunk-2.2.2-py3-none-any.whl", hash = "sha256:94ca19020c013c073abdfd06d79a7c13637b91738335f3b8cdb5655ee7cc94d2"}, {file = "semchunk-2.2.2.tar.gz", hash = "sha256:940e89896e64eeb01de97ba60f51c8c7b96c6a3951dfcf574f25ce2146752f52"}, @@ -5434,7 +5170,6 @@ version = "2.13.0" description = "Python helper for Semantic Versioning (http://semver.org/)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["dev"] files = [ {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, @@ -5446,20 +5181,19 @@ version = "78.0.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "setuptools-78.0.2-py3-none-any.whl", hash = "sha256:4a612c80e1f1d71b80e4906ce730152e8dec23df439f82731d9d0b608d7b700d"}, {file = "setuptools-78.0.2.tar.gz", hash = "sha256:137525e6afb9022f019d6e884a319017f9bf879a0d8783985d32cbc8683cab93"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] -core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] +core = ["importlib_metadata (>=6)", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "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 ; sys_platform != \"cygwin\"", "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) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] +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 = "shapely" @@ -5467,7 +5201,6 @@ version = "2.0.7" description = "Manipulation and analysis of geometric objects" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "shapely-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:33fb10e50b16113714ae40adccf7670379e9ccf5b7a41d0002046ba2b8f0f691"}, {file = "shapely-2.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f44eda8bd7a4bccb0f281264b34bf3518d8c4c9a8ffe69a1a05dabf6e8461147"}, @@ -5526,7 +5259,6 @@ version = "1.5.4" description = "Tool to Detect Surrounding Shell" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, @@ -5538,7 +5270,6 @@ 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", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -5550,7 +5281,6 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -5562,7 +5292,6 @@ 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"}, @@ -5574,7 +5303,6 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" -groups = ["dev"] 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"}, @@ -5594,7 +5322,6 @@ version = "1.13.1" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, @@ -5612,7 +5339,6 @@ version = "0.9.0" description = "Pretty-print tabular data" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, @@ -5627,7 +5353,6 @@ version = "2025.3.13" description = "Read and write TIFF files" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "tifffile-2025.3.13-py3-none-any.whl", hash = "sha256:10f205b923c04678f744a6d553f6f86c639c9ba6e714f6758d81af0678ba75dc"}, {file = "tifffile-2025.3.13.tar.gz", hash = "sha256:30fcc4584216937b5993d0568452b6fea8e12e61f9afb1a8e967c07c281faa06"}, @@ -5650,7 +5375,6 @@ version = "6.1.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "tokenize_rt-6.1.0-py2.py3-none-any.whl", hash = "sha256:d706141cdec4aa5f358945abe36b911b8cbdc844545da99e811250c0cee9b6fc"}, {file = "tokenize_rt-6.1.0.tar.gz", hash = "sha256:e8ee836616c0877ab7c7b54776d2fefcc3bde714449a206762425ae114b53c86"}, @@ -5662,8 +5386,6 @@ version = "0.19.1" description = "" optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, @@ -5781,8 +5503,6 @@ version = "0.21.1" description = "" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "tokenizers-0.21.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e78e413e9e668ad790a29456e677d9d3aa50a9ad311a40905d6861ba7692cf41"}, {file = "tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:cd51cd0a91ecc801633829fcd1fda9cf8682ed3477c6243b9a095539de4aecf3"}, @@ -5815,7 +5535,6 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["dev"] 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"}, @@ -5857,7 +5576,6 @@ version = "0.13.2" description = "Style preserving TOML library" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, @@ -5869,7 +5587,6 @@ version = "2.6.0" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.9.0" -groups = ["main"] files = [ {file = "torch-2.6.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:6860df13d9911ac158f4c44031609700e1eba07916fff62e21e6ffa0a9e01961"}, {file = "torch-2.6.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c4f103a49830ce4c7561ef4434cc7926e5a5fe4e5eb100c19ab36ea1e2b634ab"}, @@ -5926,7 +5643,6 @@ version = "1.7.0" description = "PyTorch native Metrics" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "torchmetrics-1.7.0-py3-none-any.whl", hash = "sha256:39a72cf40c8452e041f5315b997ef811c2baaae01478131cf6ed9813f553a668"}, {file = "torchmetrics-1.7.0.tar.gz", hash = "sha256:7a26d5cb73a6ae51ab5cb514aa4dc0543af7287a507719986a06e15df12ea68b"}, @@ -5943,7 +5659,7 @@ all = ["SciencePlots (>=2.0.0)", "einops (>=0.7.0)", "gammatone (>=1.0.0)", "ipa audio = ["gammatone (>=1.0.0)", "librosa (>=0.10.0)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "pystoi (>=0.4.0)", "requests (>=2.19.0)", "torchaudio (>=2.0.1)"] clustering = ["torch_linear_assignment (>=0.0.2)"] detection = ["pycocotools (>2.0.0)", "torchvision (>=0.15.1)"] -dev = ["PyTDC (==0.4.1) ; python_version < \"3.12\"", "SciencePlots (>=2.0.0)", "aeon (>=1.0.0) ; python_version > \"3.10\"", "bert_score (==0.3.13)", "dists-pytorch (==0.1)", "dython (==0.7.9)", "einops (>=0.7.0)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.30)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0) ; python_version < \"3.12\"", "mecab-ko-dic (>=1.0.0) ; python_version < \"3.12\"", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.15.0)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.3.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "timm (>=0.9.0)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torch_linear_assignment (>=0.0.2)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +dev = ["PyTDC (==0.4.1)", "SciencePlots (>=2.0.0)", "aeon (>=1.0.0)", "bert_score (==0.3.13)", "dists-pytorch (==0.1)", "dython (==0.7.9)", "einops (>=0.7.0)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.30)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.15.0)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.3.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "timm (>=0.9.0)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torch_linear_assignment (>=0.0.2)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] image = ["scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.15.1)"] multimodal = ["einops (>=0.7.0)", "piq (<=0.8.0)", "timm (>=0.9.0)", "transformers (>=4.42.3)"] text = ["ipadic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>3.8.1)", "regex (>=2021.9.24)", "sentencepiece (>=0.2.0)", "tqdm (<4.68.0)", "transformers (>4.4.0)"] @@ -5956,7 +5672,6 @@ version = "0.21.0" description = "image and video datasets and models for torch deep learning" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "torchvision-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:044ea420b8c6c3162a234cada8e2025b9076fa82504758cd11ec5d0f8cd9fa37"}, {file = "torchvision-0.21.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:b0c0b264b89ab572888244f2e0bad5b7eaf5b696068fc0b93e96f7c3c198953f"}, @@ -5995,7 +5710,6 @@ 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 = ["dev"] 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"}, @@ -6016,7 +5730,6 @@ version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, @@ -6038,7 +5751,6 @@ version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -6054,8 +5766,6 @@ version = "4.42.4" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.8.0" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "transformers-4.42.4-py3-none-any.whl", hash = "sha256:6d59061392d0f1da312af29c962df9017ff3c0108c681a56d1bc981004d16d24"}, {file = "transformers-4.42.4.tar.gz", hash = "sha256:f956e25e24df851f650cb2c158b6f4352dfae9d702f04c113ed24fc36ce7ae2d"}, @@ -6124,8 +5834,6 @@ version = "4.50.1" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.9.0" -groups = ["main"] -markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "transformers-4.50.1-py3-none-any.whl", hash = "sha256:e9b9bd274518150528c1d745c7ebba72d27e4e52f2deffaa1fddebad6912da5d"}, {file = "transformers-4.50.1.tar.gz", hash = "sha256:6ee542d2cce7e1b6a06ae350599c27ddf2e6e45ec9d0cb42915b37fca3d6399a"}, @@ -6197,8 +5905,6 @@ version = "3.2.0" description = "A language and compiler for custom Deep Learning operations" optional = false python-versions = "*" -groups = ["main"] -markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3e54983cd51875855da7c68ec05c05cf8bb08df361b1d5b69e05e40b0c9bd62"}, {file = "triton-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8009a1fb093ee8546495e96731336a33fb8856a38e45bb4ab6affd6dbc3ba220"}, @@ -6218,7 +5924,6 @@ version = "3.8.0" description = "Collection of utilities for publishing packages on PyPI" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, @@ -6242,7 +5947,6 @@ version = "0.12.5" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"}, {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"}, @@ -6260,7 +5964,6 @@ version = "3.1.5.20250306" description = "Typing stubs for openpyxl" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "types_openpyxl-3.1.5.20250306-py3-none-any.whl", hash = "sha256:f7733dac1dcb07c89ff5ffde8452ee8d272be638defed855f4c48b2990ce5aa7"}, {file = "types_openpyxl-3.1.5.20250306.tar.gz", hash = "sha256:aa7ad2425e8020ff46a31633becfe1f3c64114498d964c536199f654b464e6bc"}, @@ -6272,7 +5975,6 @@ version = "2025.1.0.20250318" description = "Typing stubs for pytz" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "types_pytz-2025.1.0.20250318-py3-none-any.whl", hash = "sha256:04dba4907c5415777083f9548693c6d9f80ec53adcaff55a38526a3f8ddcae04"}, {file = "types_pytz-2025.1.0.20250318.tar.gz", hash = "sha256:97e0e35184c6fe14e3a5014512057f2c57bb0c6582d63c1cfcc4809f82180449"}, @@ -6284,7 +5986,6 @@ version = "2.32.0.20250306" description = "Typing stubs for requests" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "types_requests-2.32.0.20250306-py3-none-any.whl", hash = "sha256:25f2cbb5c8710b2022f8bbee7b2b66f319ef14aeea2f35d80f18c9dbf3b60a0b"}, {file = "types_requests-2.32.0.20250306.tar.gz", hash = "sha256:0962352694ec5b2f95fda877ee60a159abdf84a0fc6fdace599f20acb41a03d1"}, @@ -6299,7 +6000,6 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] 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"}, @@ -6311,7 +6011,6 @@ version = "2025.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" -groups = ["main"] files = [ {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, @@ -6323,14 +6022,13 @@ version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] -brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +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)"] @@ -6341,7 +6039,6 @@ version = "20.29.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "virtualenv-20.29.3-py3-none-any.whl", hash = "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170"}, {file = "virtualenv-20.29.3.tar.gz", hash = "sha256:95e39403fcf3940ac45bc717597dba16110b74506131845d9b687d5e73d947ac"}, @@ -6354,7 +6051,7 @@ platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "wcwidth" @@ -6362,7 +6059,6 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -6374,7 +6070,6 @@ version = "0.45.1" description = "A built-package format for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"}, {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"}, @@ -6389,7 +6084,6 @@ version = "4.0.13" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71"}, {file = "widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6"}, @@ -6401,7 +6095,6 @@ version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -6490,7 +6183,6 @@ version = "3.2.2" description = "A Python module for creating Excel XLSX files." optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "XlsxWriter-3.2.2-py3-none-any.whl", hash = "sha256:272ce861e7fa5e82a4a6ebc24511f2cb952fde3461f6c6e1a1e81d3272db1471"}, {file = "xlsxwriter-3.2.2.tar.gz", hash = "sha256:befc7f92578a85fed261639fb6cde1fd51b79c5e854040847dde59d4317077dc"}, @@ -6502,7 +6194,6 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -6514,7 +6205,6 @@ version = "3.5.0" description = "Python binding for xxHash" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "xxhash-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ece616532c499ee9afbb83078b1b952beffef121d989841f7f4b3dc5ac0fd212"}, {file = "xxhash-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3171f693dbc2cef6477054a665dc255d996646b4023fe56cb4db80e26f4cc520"}, @@ -6647,7 +6337,6 @@ version = "1.18.3" description = "Yet another URL library" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, @@ -6744,21 +6433,20 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] [metadata] -lock-version = "2.1" +lock-version = "2.0" python-versions = "^3.10" content-hash = "31ead2096e0bbaaecc07dfb6c470d9e3562f4b906661d5d1b6c546daee068335" diff --git a/pyproject.toml b/pyproject.toml index c0cb9be0..750f1d1b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -90,6 +90,7 @@ python_version = "3.10" [[tool.mypy.overrides]] module = [ "docling_core.*", + "docling.*", "docling_parse.*", "docling_ibm_models.*", "pypdfium2.*", From 1708ed9b730f265384b5c279cf5491f8f9d77ea8 Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Wed, 26 Mar 2025 11:15:54 +0100 Subject: [PATCH 31/81] feat: Refactor the BasePredictionProvider.predict() to return DatasetRecordWithPrediction Signed-off-by: Nikos Livathinos --- .../prediction_provider.py | 76 +++++++++++++------ 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/docling_eval_next/prediction_providers/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py index 07e014a6..0ed84039 100644 --- a/docling_eval_next/prediction_providers/prediction_provider.py +++ b/docling_eval_next/prediction_providers/prediction_provider.py @@ -45,8 +45,13 @@ def __init__( self.provider_args = kwargs @abstractmethod - def predict(self, record: DatasetRecord) -> Tuple[DoclingDocument, Optional[str]]: - return DoclingDocument(name="dummy"), None + def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: + pred_record = self.create_dataset_record_with_prediction( + record, + DoclingDocument(name="dummy"), + None, + ) + return pred_record @abstractmethod def info(self) -> Dict: @@ -57,6 +62,23 @@ def info(self) -> Dict: def prediction_format(self) -> PredictionFormats: pass + def create_dataset_record_with_prediction( + self, + record: DatasetRecord, + predicted_doc: DoclingDocument, + original_prediction: Optional[str] = None, + ): + pred_record = DatasetRecordWithPrediction.model_validate( + { + **record.as_record_dict(), + "predicted_doc": predicted_doc, + "original_prediction": original_prediction, + "prediction_format": self.prediction_format, + } + ) + pred_record.validate_images() # type: ignore + return pred_record + def add_prediction(self, record: DatasetRecord) -> DatasetRecordWithPrediction: # This might need customization depending on the input the dataset has. # The default implementation assumes that there is an original file in binary format which is accepted. @@ -69,18 +91,7 @@ def add_prediction(self, record: DatasetRecord) -> DatasetRecordWithPrediction: ) record.original = input_data - pred_doc, orig_pred = self.predict(record) - - pred_record = DatasetRecordWithPrediction.model_validate( - { - **record.as_record_dict(), - "predicted_doc": pred_doc, - "original_prediction": orig_pred, - "prediction_format": self.prediction_format, - } - ) - - pred_record.validate_images() # type: ignore + pred_record = self.predict(record) return pred_record @@ -157,12 +168,17 @@ def prediction_format(self) -> PredictionFormats: def predict( self, record: DatasetRecord, - ) -> Tuple[DoclingDocument, Optional[str]]: + ) -> DatasetRecordWithPrediction: assert ( record.original is not None ), "stream must be given for docling prediction provider to work." - return self.doc_converter.convert(copy.deepcopy(record.original)).document, None + pred_record = self.create_dataset_record_with_prediction( + record, + self.doc_converter.convert(copy.deepcopy(record.original)).document, + None, + ) + return pred_record def info(self) -> Dict: return {"asset": "Docling", "version": docling_version()} @@ -180,8 +196,8 @@ def __init__( def prediction_format(self) -> PredictionFormats: return PredictionFormats.DOCLING_DOCUMENT - def predict(self, record: DatasetRecord) -> Tuple[DoclingDocument, Optional[str]]: - + def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: + r""" """ assert ( record.ground_truth_doc is not None ), "true_doc must be given for TableFormer prediction provider to work." @@ -201,7 +217,12 @@ def predict(self, record: DatasetRecord) -> Tuple[DoclingDocument, Optional[str] raise RuntimeError( "TableFormerPredictionProvider is missing data to predict on." ) - return pred_doc, None + pred_record = self.create_dataset_record_with_prediction( + record, + pred_doc, + None, + ) + return pred_record def info(self) -> Dict: return {"asset": "TableFormer", "version": docling_models_version()} @@ -255,22 +276,27 @@ def info(self) -> Dict: } @abstractmethod - def predict(self, record: DatasetRecord) -> Tuple[DoclingDocument, Optional[str]]: + def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: doc_id = record.doc_id raw = None if self._prediction_format == PredictionFormats.DOCTAGS: - doc = self._load_doctags_doc(doc_id) + pred_doc = self._load_doctags_doc(doc_id) elif self._prediction_format == PredictionFormats.MARKDOWN: # TODO: Replace the return type with something that has the DoclingDocument as optional - doc = DoclingDocument(name=doc_id) # Temp solution to pass MyPy + pred_doc = DoclingDocument(name=doc_id) # Temp solution to pass MyPy raw = self._load_md_raw(doc_id) elif self._prediction_format == PredictionFormats.JSON: - doc = self._load_json_doc(doc_id) + pred_doc = self._load_json_doc(doc_id) elif self._prediction_format == PredictionFormats.YAML: - doc = self._load_yaml_doc(doc_id) + pred_doc = self._load_yaml_doc(doc_id) - return doc, raw + pred_record = self.create_dataset_record_with_prediction( + record, + pred_doc, + raw, + ) + return pred_record @property @abstractmethod From e4e658da94d386b8c3687c46d7f048c43073eefe Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Wed, 26 Mar 2025 11:20:30 +0100 Subject: [PATCH 32/81] Fixes Signed-off-by: Christoph Auer --- docling_eval/converters/conversion.py | 2 + .../models/tableformer/tf_model_prediction.py | 8 +- .../dataset_builders/doclaynet_v2_builder.py | 4 +- .../prediction_provider.py | 4 +- tests/test_dataset_builder.py | 102 ++++++++++++------ 5 files changed, 83 insertions(+), 37 deletions(-) diff --git a/docling_eval/converters/conversion.py b/docling_eval/converters/conversion.py index 4f0c178e..290ecbc6 100644 --- a/docling_eval/converters/conversion.py +++ b/docling_eval/converters/conversion.py @@ -25,6 +25,8 @@ warnings.filterwarnings(action="ignore", category=UserWarning, module="pydantic|torch") warnings.filterwarnings(action="ignore", category=FutureWarning, module="easyocr") +ocr_factory = get_ocr_factory() + def create_pdf_docling_converter( page_image_scale: float = 2.0, diff --git a/docling_eval/converters/models/tableformer/tf_model_prediction.py b/docling_eval/converters/models/tableformer/tf_model_prediction.py index 870a3a31..c63c1009 100644 --- a/docling_eval/converters/models/tableformer/tf_model_prediction.py +++ b/docling_eval/converters/models/tableformer/tf_model_prediction.py @@ -116,9 +116,11 @@ def _make_internal_page_with_table(self, input_doc, prov): bbox=prov.bbox.to_top_left_origin(page.size.height), ) for cell in page.cells: - overlap = cell.bbox.intersection_area_with(cluster.bbox) - if cell.bbox.area() > 0: - overlap_ratio = overlap / cell.bbox.area() + overlap = cell.rect.to_bounding_box().intersection_area_with( + cluster.bbox + ) + if cell.rect.to_bounding_box().area() > 0: + overlap_ratio = overlap / cell.rect.to_bounding_box().area() if overlap_ratio > 0.2: cluster.cells.append(cell) diff --git a/docling_eval_next/dataset_builders/doclaynet_v2_builder.py b/docling_eval_next/dataset_builders/doclaynet_v2_builder.py index dfd0aabe..adc8c2de 100644 --- a/docling_eval_next/dataset_builders/doclaynet_v2_builder.py +++ b/docling_eval_next/dataset_builders/doclaynet_v2_builder.py @@ -675,7 +675,9 @@ def iterate(self) -> Iterable[DatasetRecord]: doc_id=doc_id, doc_hash=get_binhash(img_bytes), ground_truth_doc=true_doc, - original=None, + original=DocumentStream( + name=doc_id, stream=io.BytesIO(img_bytes) + ), mime_type=f"image/{img.format.lower() if img.format else 'png'}", modalities=[ EvaluationModality.LAYOUT, diff --git a/docling_eval_next/prediction_providers/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py index 07e014a6..48fe9499 100644 --- a/docling_eval_next/prediction_providers/prediction_provider.py +++ b/docling_eval_next/prediction_providers/prediction_provider.py @@ -162,7 +162,9 @@ def predict( record.original is not None ), "stream must be given for docling prediction provider to work." - return self.doc_converter.convert(copy.deepcopy(record.original)).document, None + doc = self.doc_converter.convert(copy.deepcopy(record.original)).document + + return doc, None def info(self) -> Dict: return {"asset": "Docling", "version": docling_version()} diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index ea32a20d..474f42ca 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -4,20 +4,15 @@ from docling.datamodel.base_models import InputFormat from docling.datamodel.pipeline_options import ( EasyOcrOptions, - OcrEngine, - OcrMacOptions, OcrOptions, PdfPipelineOptions, - RapidOcrOptions, TableFormerMode, - TesseractCliOcrOptions, - TesseractOcrOptions, ) from docling.document_converter import PdfFormatOption +from docling.models.factories import get_ocr_factory from docling_eval.benchmarks.constants import BenchMarkNames, EvaluationModality from docling_eval.cli.main import evaluate -from docling_eval_next.datamodels.dataset_record import DatasetRecord from docling_eval_next.dataset_builders.doclaynet_v1_builder import ( DocLayNetV1DatasetBuilder, ) @@ -31,7 +26,8 @@ ) from docling_eval_next.dataset_builders.otsl_table_dataset_builder import ( FintabNetDatasetBuilder, - TableDatasetBuilder, + PubTables1MDatasetBuilder, + PubTabNetDatasetBuilder, ) from docling_eval_next.dataset_builders.xfund_builder import XFUNDDatasetBuilder from docling_eval_next.prediction_providers.prediction_provider import ( @@ -39,41 +35,29 @@ TableFormerPredictionProvider, ) +ocr_factory = get_ocr_factory() + def create_docling_prediction_provider( page_image_scale: float = 2.0, do_ocr: bool = False, - ocr_lang: List[str] = ["en"], - ocr_engine: OcrEngine = OcrEngine.EASYOCR, + ocr_lang: Optional[List[str]] = None, + ocr_engine: str = EasyOcrOptions.kind, artifacts_path: Optional[Path] = None, ): - - force_ocr: bool = True - - if ocr_engine == OcrEngine.EASYOCR: - ocr_options: OcrOptions = EasyOcrOptions(force_full_page_ocr=force_ocr) - elif ocr_engine == OcrEngine.TESSERACT_CLI: - ocr_options = TesseractCliOcrOptions(force_full_page_ocr=force_ocr) - elif ocr_engine == OcrEngine.TESSERACT: - ocr_options = TesseractOcrOptions(force_full_page_ocr=force_ocr) - elif ocr_engine == OcrEngine.OCRMAC: - ocr_options = OcrMacOptions(force_full_page_ocr=force_ocr) - elif ocr_engine == OcrEngine.RAPIDOCR: - ocr_options = RapidOcrOptions(force_full_page_ocr=force_ocr) - else: - raise RuntimeError(f"Unexpected OCR engine type {ocr_engine}") - + ocr_options: OcrOptions = ocr_factory.create_options( # type: ignore + kind=ocr_engine, + ) if ocr_lang is not None: ocr_options.lang = ocr_lang pipeline_options = PdfPipelineOptions( do_ocr=do_ocr, - ocr_options=EasyOcrOptions(force_full_page_ocr=force_ocr), + ocr_options=ocr_options, do_table_structure=True, artifacts_path=artifacts_path, ) - pipeline_options.table_structure_options.do_cell_matching = True # do_cell_matching pipeline_options.table_structure_options.mode = TableFormerMode.ACCURATE pipeline_options.images_scale = page_image_scale @@ -289,21 +273,75 @@ def test_run_xfund(): ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. -def test_run_tabledatasets(): +def test_run_fintabnet_builder(): target_path = Path("./scratch/fintabnet-builder-test/") tableformer_provider = TableFormerPredictionProvider() - dataset_ftn = FintabNetDatasetBuilder( + dataset = FintabNetDatasetBuilder( + target=target_path / "gt", + ) + + dataset.retrieve_input_dataset() # fetches the source dataset from HF + dataset.save_to_disk( + chunk_size=5, max_num_chunks=1 + ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + + tableformer_provider.create_prediction_dataset( + name=dataset.name, + gt_dataset_dir=target_path / "gt", + target_dataset_dir=target_path / "tables", + ) + + evaluate( + modality=EvaluationModality.TABLE_STRUCTURE, + benchmark=BenchMarkNames.DPBENCH, + idir=target_path / "tables", + odir=target_path / "tables" / "tableformer", + ) + + +def test_run_p1m_builder(): + target_path = Path("./scratch/p1m-builder-test/") + tableformer_provider = TableFormerPredictionProvider() + + dataset = PubTables1MDatasetBuilder( + target=target_path / "gt", + ) + + dataset.retrieve_input_dataset() # fetches the source dataset from HF + dataset.save_to_disk( + chunk_size=5, max_num_chunks=1 + ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + + tableformer_provider.create_prediction_dataset( + name=dataset.name, + gt_dataset_dir=target_path / "gt", + target_dataset_dir=target_path / "tables", + ) + + evaluate( + modality=EvaluationModality.TABLE_STRUCTURE, + benchmark=BenchMarkNames.DPBENCH, + idir=target_path / "tables", + odir=target_path / "tables" / "tableformer", + ) + + +def test_run_pubtabnet_builder(): + target_path = Path("./scratch/pubtabnet-builder-test/") + tableformer_provider = TableFormerPredictionProvider() + + dataset = PubTabNetDatasetBuilder( target=target_path / "gt", ) - dataset_ftn.retrieve_input_dataset() # fetches the source dataset from HF - dataset_ftn.save_to_disk( + dataset.retrieve_input_dataset() # fetches the source dataset from HF + dataset.save_to_disk( chunk_size=5, max_num_chunks=1 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( - name=dataset_ftn.name, + name=dataset.name, gt_dataset_dir=target_path / "gt", target_dataset_dir=target_path / "tables", ) From c354e315f319d197eeff03f5b90f52d8c8cfa48c Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Wed, 26 Mar 2025 11:23:56 +0100 Subject: [PATCH 33/81] fix: Fix the FilePredictionProvider. Return None in the predicted document in case of Markdown. Signed-off-by: Nikos Livathinos --- .../prediction_providers/prediction_provider.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docling_eval_next/prediction_providers/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py index 0ed84039..69ada766 100644 --- a/docling_eval_next/prediction_providers/prediction_provider.py +++ b/docling_eval_next/prediction_providers/prediction_provider.py @@ -65,7 +65,7 @@ def prediction_format(self) -> PredictionFormats: def create_dataset_record_with_prediction( self, record: DatasetRecord, - predicted_doc: DoclingDocument, + predicted_doc: Optional[DoclingDocument] = None, original_prediction: Optional[str] = None, ): pred_record = DatasetRecordWithPrediction.model_validate( @@ -282,9 +282,7 @@ def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: if self._prediction_format == PredictionFormats.DOCTAGS: pred_doc = self._load_doctags_doc(doc_id) elif self._prediction_format == PredictionFormats.MARKDOWN: - # TODO: Replace the return type with something that has the DoclingDocument as optional - pred_doc = DoclingDocument(name=doc_id) # Temp solution to pass MyPy - + pred_doc = None raw = self._load_md_raw(doc_id) elif self._prediction_format == PredictionFormats.JSON: pred_doc = self._load_json_doc(doc_id) From 3bb671678cdad1b1e001064dc78977fe2130f4f3 Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Wed, 26 Mar 2025 11:38:59 +0100 Subject: [PATCH 34/81] fix: Remove the kwargs from all PredictonProvider classes and introduce provider specific initialization arguments Signed-off-by: Nikos Livathinos --- .../prediction_provider.py | 60 +++++++------------ 1 file changed, 20 insertions(+), 40 deletions(-) diff --git a/docling_eval_next/prediction_providers/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py index 69ada766..43d349ca 100644 --- a/docling_eval_next/prediction_providers/prediction_provider.py +++ b/docling_eval_next/prediction_providers/prediction_provider.py @@ -9,7 +9,7 @@ from datasets import load_dataset from docling.datamodel.pipeline_options import TableFormerMode -from docling.document_converter import DocumentConverter +from docling.document_converter import DocumentConverter, FormatOption, InputFormat from docling.utils.utils import chunkify from docling_core.types import DoclingDocument from docling_core.types.doc.document import ( @@ -39,10 +39,8 @@ class BasePredictionProvider: - def __init__( - self, **kwargs - ): # could be the docling converter options, the remote credentials for MS/Google, etc. - self.provider_args = kwargs + def __init__(self): + pass @abstractmethod def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: @@ -149,17 +147,11 @@ def _iterate_predictions(): class DoclingPredictionProvider(BasePredictionProvider): def __init__( - self, **kwargs - ): # could be the docling converter options, the remote credentials for MS/Google, etc. - super().__init__(**kwargs) - - if kwargs is not None: - if "format_options" in kwargs: - self.doc_converter = DocumentConverter( - format_options=kwargs["format_options"] - ) - else: - self.doc_converter = DocumentConverter() + self, + format_options: Optional[Dict[InputFormat, FormatOption]] = None, + ): + super().__init__() + self.doc_converter = DocumentConverter(format_options=format_options) @property def prediction_format(self) -> PredictionFormats: @@ -185,11 +177,8 @@ def info(self) -> Dict: class TableFormerPredictionProvider(BasePredictionProvider): - def __init__( - self, **kwargs - ): # could be the docling converter options, the remote credentials for MS/Google, etc. - super().__init__(**kwargs) - + def __init__(self): + super().__init__() self.tf_updater = TableFormerUpdater(TableFormerMode.ACCURATE) @property @@ -229,8 +218,13 @@ def info(self) -> Dict: class FilePredictionProvider(BasePredictionProvider): - def __init__(self, **kwargs): - super().__init__(**kwargs) + def __init__( + self, + prediction_format: PredictionFormats, + source_path: Path, + raise_on_missing_file: Optional[bool] = False, + ): + super().__init__() self._supported_prediction_formats = [ PredictionFormats.DOCTAGS, PredictionFormats.MARKDOWN, @@ -239,23 +233,9 @@ def __init__(self, **kwargs): ] # Read the input - self._prediction_format: PredictionFormats = PredictionFormats.DOCTAGS - self._prediction_source_path: Path = Path(".") - self._raise_on_missing_file = ( - False # Raise exception when an expected file is missing - ) - if kwargs is not None: - if "prediction_format" in kwargs and isinstance( - kwargs["prediction_format"], PredictionFormats - ): - self._prediction_format = kwargs["prediction_format"] - if "source_path" in kwargs: - if isinstance(kwargs["source_path"], Path): - self._prediction_source_path = kwargs["source_path"] - else: - self._prediction_source_path = Path(kwargs["source_path"]) - if "raise_on_missing_file" in kwargs: - self._raise_on_missing_file = kwargs["raise_on_missing_file"] + self._prediction_format = prediction_format + self._prediction_source_path = source_path + self._raise_on_missing_file = raise_on_missing_file # Validate the prediction format if self._prediction_format not in self._supported_prediction_formats: From 9c34bec8a545130a729b3856de18af4f857abcff Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Wed, 26 Mar 2025 12:43:42 +0100 Subject: [PATCH 35/81] feat: Introduce the parameter "ignore_missing_files" in FilePredictionProvider Signed-off-by: Nikos Livathinos --- .../prediction_provider.py | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/docling_eval_next/prediction_providers/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py index 43d349ca..862c5a7c 100644 --- a/docling_eval_next/prediction_providers/prediction_provider.py +++ b/docling_eval_next/prediction_providers/prediction_provider.py @@ -222,7 +222,7 @@ def __init__( self, prediction_format: PredictionFormats, source_path: Path, - raise_on_missing_file: Optional[bool] = False, + ignore_missing_files: Optional[bool] = False, ): super().__init__() self._supported_prediction_formats = [ @@ -235,7 +235,7 @@ def __init__( # Read the input self._prediction_format = prediction_format self._prediction_source_path = source_path - self._raise_on_missing_file = raise_on_missing_file + self._ignore_missing_files = ignore_missing_files # Validate the prediction format if self._prediction_format not in self._supported_prediction_formats: @@ -282,12 +282,13 @@ def prediction_format(self) -> PredictionFormats: r""" """ return self._prediction_format - def _load_doctags_doc(self, doc_id: str) -> DoclingDocument: + def _load_doctags_doc(self, doc_id: str) -> Optional[DoclingDocument]: r"""Load doctags file into DoclingDocument""" # Read the doctags file doctags_fn = self._prediction_source_path / f"{doc_id}.dt" - if self._raise_on_missing_file and not doctags_fn.is_file(): - raise RuntimeError(f"Missing prediction doctags: {doctags_fn}") + if self._ignore_missing_files and not doctags_fn.is_file(): + return None + with open(doctags_fn, "r") as fd: doctags = fd.read() @@ -305,31 +306,32 @@ def _load_doctags_doc(self, doc_id: str) -> DoclingDocument: return doc - def _load_json_doc(self, doc_id: str) -> DoclingDocument: + def _load_json_doc(self, doc_id: str) -> Optional[DoclingDocument]: r"""Load DoclingDocument from json""" json_fn = self._prediction_source_path / f"{doc_id}.json" - if self._raise_on_missing_file and not json_fn.is_file(): - raise RuntimeError(f"Missing prediction json: {json_fn}") + if self._ignore_missing_files and not json_fn.is_file(): + return None doc: DoclingDocument = DoclingDocument.load_from_json(json_fn) return doc - def _load_yaml_doc(self, doc_id: str) -> DoclingDocument: + def _load_yaml_doc(self, doc_id: str) -> Optional[DoclingDocument]: r"""Load DoclingDocument from yaml""" yaml_fn = self._prediction_source_path / f"{doc_id}.yaml" if not yaml_fn.is_file(): # Try alternative yaml extension yaml_fn = self._prediction_source_path / f"{doc_id}.yml" - if self._raise_on_missing_file and not yaml_fn.is_file(): - raise RuntimeError(f"Missing prediction yaml: {yaml_fn}") + if self._ignore_missing_files and not yaml_fn.is_file(): + return None doc: DoclingDocument = DoclingDocument.load_from_yaml(yaml_fn) return doc - def _load_md_raw(self, doc_id: str) -> str: + def _load_md_raw(self, doc_id: str) -> Optional[str]: r"""Load the markdown content""" md_fn = self._prediction_source_path / f"{doc_id}.md" - if self._raise_on_missing_file and not md_fn.is_file(): - raise RuntimeError(f"Missing prediction markdown: {md_fn}") + if self._ignore_missing_files and not md_fn.is_file(): + return None + with open(md_fn, "r") as fd: md = fd.read() return md From 9a31cf6b6a0f63e28023c5d26e807774f3e3ccac Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Wed, 26 Mar 2025 14:13:51 +0100 Subject: [PATCH 36/81] Add do_visualization to PredictionProvider Signed-off-by: Christoph Auer --- .../evaluators/markdown_text_evaluator.py | 5 ++ .../prediction_provider.py | 76 +++++++++++++++++-- tests/test_dataset_builder.py | 9 ++- 3 files changed, 81 insertions(+), 9 deletions(-) diff --git a/docling_eval/evaluators/markdown_text_evaluator.py b/docling_eval/evaluators/markdown_text_evaluator.py index bb0573e2..afa6539d 100644 --- a/docling_eval/evaluators/markdown_text_evaluator.py +++ b/docling_eval/evaluators/markdown_text_evaluator.py @@ -20,6 +20,7 @@ ) from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation from docling_eval.evaluators.stats import DatasetStatistics, compute_stats +from docling_eval_next.datamodels.dataset_record import DatasetRecordWithPrediction _log = logging.getLogger(__name__) @@ -124,6 +125,10 @@ def __call__( ncols=120, total=len(ds_selection), ): + + # To be ported to: + # DatasetRecordWithPrediction.model_validate(data) + doc_id = data[BenchMarkColumns.DOC_ID] true_doc_dict = data[BenchMarkColumns.GROUNDTRUTH] true_doc: DoclingDocument = DoclingDocument.model_validate_json( diff --git a/docling_eval_next/prediction_providers/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py index 8f395daf..979e414e 100644 --- a/docling_eval_next/prediction_providers/prediction_provider.py +++ b/docling_eval_next/prediction_providers/prediction_provider.py @@ -12,6 +12,7 @@ from docling.document_converter import DocumentConverter, FormatOption, InputFormat from docling.utils.utils import chunkify from docling_core.types import DoclingDocument +from docling_core.types.doc import DocItemLabel from docling_core.types.doc.document import ( DoclingDocument, DocTagsDocument, @@ -32,15 +33,55 @@ PageToken, TableFormerUpdater, ) +from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters from docling_eval_next.datamodels.dataset_record import ( DatasetRecord, DatasetRecordWithPrediction, ) +TRUE_HTML_EXPORT_LABELS = { + DocItemLabel.TITLE, + DocItemLabel.DOCUMENT_INDEX, + DocItemLabel.SECTION_HEADER, + DocItemLabel.PARAGRAPH, + DocItemLabel.TABLE, + DocItemLabel.PICTURE, + DocItemLabel.FORMULA, + DocItemLabel.CHECKBOX_UNSELECTED, + DocItemLabel.CHECKBOX_SELECTED, + DocItemLabel.TEXT, + DocItemLabel.LIST_ITEM, + DocItemLabel.CODE, + DocItemLabel.REFERENCE, + DocItemLabel.CAPTION, + DocItemLabel.PAGE_HEADER, + DocItemLabel.PAGE_FOOTER, + DocItemLabel.FOOTNOTE, +} + +PRED_HTML_EXPORT_LABELS = { + DocItemLabel.TITLE, + DocItemLabel.DOCUMENT_INDEX, + DocItemLabel.SECTION_HEADER, + DocItemLabel.PARAGRAPH, + DocItemLabel.TABLE, + DocItemLabel.PICTURE, + DocItemLabel.FORMULA, + DocItemLabel.CHECKBOX_UNSELECTED, + DocItemLabel.CHECKBOX_SELECTED, + DocItemLabel.TEXT, + DocItemLabel.LIST_ITEM, + DocItemLabel.CODE, + DocItemLabel.REFERENCE, + DocItemLabel.PAGE_HEADER, + DocItemLabel.PAGE_FOOTER, + DocItemLabel.FOOTNOTE, +} + class BasePredictionProvider: - def __init__(self): - pass + def __init__(self, do_visualization: bool = False): + self.do_visualization = do_visualization @abstractmethod def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: @@ -55,6 +96,22 @@ def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: def info(self) -> Dict: return {} + def visualize_results( + self, prediction_record: DatasetRecordWithPrediction, target_dataset_dir: Path + ): + if prediction_record.predicted_doc is not None: + save_comparison_html_with_clusters( + filename=target_dataset_dir + / "visualizations" + / f"{prediction_record.doc_id}.html", + true_doc=prediction_record.ground_truth_doc, + pred_doc=prediction_record.predicted_doc, + page_image=prediction_record.ground_truth_page_images[0], + true_labels=TRUE_HTML_EXPORT_LABELS, + pred_labels=PRED_HTML_EXPORT_LABELS, + draw_reading_order=True, + ) + @property @abstractmethod def prediction_format(self) -> PredictionFormats: @@ -127,7 +184,12 @@ def _iterate_predictions(): count = 0 chunk_count = 0 for record_chunk in chunkify(_iterate_predictions(), chunk_size): + if self.do_visualization: + for r in record_chunk: + self.visualize_results(r, target_dataset_dir) + record_chunk = [r.as_record_dict() for r in record_chunk] + save_shard_to_disk( items=record_chunk, dataset_path=test_dir, shard_id=chunk_count ) @@ -149,8 +211,9 @@ class DoclingPredictionProvider(BasePredictionProvider): def __init__( self, format_options: Optional[Dict[InputFormat, FormatOption]] = None, + do_visualization: bool = False, ): - super().__init__() + super().__init__(do_visualization=do_visualization) self.doc_converter = DocumentConverter(format_options=format_options) @property @@ -178,8 +241,8 @@ def info(self) -> Dict: class TableFormerPredictionProvider(BasePredictionProvider): - def __init__(self): - super().__init__() + def __init__(self, do_visualization: bool = False): + super().__init__(do_visualization=do_visualization) self.tf_updater = TableFormerUpdater(TableFormerMode.ACCURATE) @property @@ -224,8 +287,9 @@ def __init__( prediction_format: PredictionFormats, source_path: Path, raise_on_missing_file: Optional[bool] = False, + do_visualization: bool = False, ): - super().__init__() + super().__init__(do_visualization=do_visualization) self._supported_prediction_formats = [ PredictionFormats.DOCTAGS, PredictionFormats.MARKDOWN, diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 697bb12c..e5da37a4 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -72,7 +72,8 @@ def create_docling_prediction_provider( return DoclingPredictionProvider( format_options={ InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options) - } + }, + do_visualization=False, ) @@ -107,7 +108,8 @@ def test_run_doclaynet_with_doctags_fileprovider(): target_path = Path("./scratch/doclaynet-v1-builder-test/") file_provider = FilePredictionProvider( prediction_format=PredictionFormats.DOCTAGS, - source_path="./tests/data/doclaynet_v1_doctags_sample", + source_path=Path("./tests/data/doclaynet_v1_doctags_sample"), + do_visualization=True, ) dataset_layout = DocLayNetV1DatasetBuilder( @@ -199,7 +201,8 @@ def test_run_omnidocbench_tables(): dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF dataset_tables.save_to_disk( - chunk_size=5, max_num_chunks=1 + chunk_size=5, + max_num_chunks=1, ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( From 637d7ae60f3a95f0c11c1614cc6660a8fdd92269 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Wed, 26 Mar 2025 14:40:27 +0100 Subject: [PATCH 37/81] Move next-gen API to main source tree, re-organize module paths Signed-off-by: Christoph Auer --- .pre-commit-config.yaml | 6 +- docling_eval/cli/main.py | 30 +- .../models/tableformer/tf_model_prediction.py | 4 +- .../{benchmarks => datamodels}/__init__.py | 0 .../{benchmarks => datamodels}/constants.py | 0 .../datamodels/dataset_record.py | 5 +- .../__init__.py | 0 .../dataset_builders/dataset_builder.py | 9 +- .../dataset_builders/doclaynet_v1_builder.py | 25 +- .../dataset_builders/doclaynet_v2_builder.py | 19 +- .../dataset_builders/dpbench_builder.py | 21 +- .../dataset_builders/funsd_builder.py | 17 +- .../dataset_builders/omnidocbench_builder.py | 24 +- .../otsl_table_dataset_builder.py | 19 +- .../dataset_builders/xfund_builder.py | 18 +- docling_eval/evaluators/base_evaluator.py | 3 +- .../evaluators/base_readingorder_evaluator.py | 2 +- .../evaluators/bbox_text_evaluator.py | 2 +- docling_eval/evaluators/layout_evaluator.py | 2 +- .../evaluators/markdown_text_evaluator.py | 3 +- docling_eval/evaluators/table_evaluator.py | 2 +- docling_eval/{benchmarks => legacy}/README.md | 2 +- .../doclaynet_v1 => legacy}/__init__.py | 0 .../cvat_annotation}/__init__.py | 0 .../cvat_annotation/create.py | 8 +- .../create_dataset_from_pdfs.py | 6 +- .../cvat_annotation/preannotate.py | 6 +- .../cvat_annotation/utils.py | 0 .../doclaynet_v1}/__init__.py | 0 .../doclaynet_v1/create.py | 13 +- .../funsd => legacy/doclaynet_v2}/__init__.py | 0 .../doclaynet_v2/create.py | 14 +- .../{benchmarks => legacy}/dpbench/README.md | 0 .../dpbench}/__init__.py | 0 .../{benchmarks => legacy}/dpbench/create.py | 18 +- .../funsd}/__init__.py | 0 .../{benchmarks => legacy}/funsd/create.py | 10 +- .../xfund => legacy/omnidocbench}/__init__.py | 0 .../omnidocbench/create.py | 18 +- .../tableformer_huggingface_otsl}/__init__.py | 0 .../tableformer_huggingface_otsl/create.py | 12 +- .../legacy/xfund}/__init__.py | 0 .../{benchmarks => legacy}/xfund/create.py | 10 +- .../prediction_providers}/__init__.py | 0 .../base_prediction_provider.py | 189 ++++++++ .../prediction_providers/docling_provider.py | 48 +++ .../prediction_providers/file_provider.py | 137 ++++++ .../tableformer_provider.py | 59 +++ .../utils}/__init__.py | 0 docling_eval/{benchmarks => utils}/utils.py | 3 +- docling_eval/visualisation/visualisations.py | 2 +- .../prediction_provider.py | 402 ------------------ docs/CVAT_create_groundtruth.md | 8 +- docs/PubTabNet_benchmarks.md | 8 +- docs/examples/benchmark_doclaynet_v1.py | 4 +- docs/examples/benchmark_doclaynet_v2.py | 9 +- docs/examples/benchmark_dpbench.py | 6 +- docs/examples/benchmark_omnidocbench.py | 6 +- .../benchmark_tableformer_fintabnet.py | 6 +- docs/examples/benchmark_tableformer_p1m.py | 6 +- .../benchmark_tableformer_pubtabnet.py | 6 +- docs/examples/create_funsd.py | 4 +- docs/examples/create_xfund.py | 4 +- docs/examples/package_pdfs.py | 6 +- docs/examples/package_pngs.py | 6 +- tests/test_dataset_builder.py | 29 +- 66 files changed, 612 insertions(+), 664 deletions(-) rename docling_eval/{benchmarks => datamodels}/__init__.py (100%) rename docling_eval/{benchmarks => datamodels}/constants.py (100%) rename {docling_eval_next => docling_eval}/datamodels/dataset_record.py (98%) rename docling_eval/{benchmarks/cvat_annotation => dataset_builders}/__init__.py (100%) rename {docling_eval_next => docling_eval}/dataset_builders/dataset_builder.py (92%) rename {docling_eval_next => docling_eval}/dataset_builders/doclaynet_v1_builder.py (95%) rename {docling_eval_next => docling_eval}/dataset_builders/doclaynet_v2_builder.py (97%) rename {docling_eval_next => docling_eval}/dataset_builders/dpbench_builder.py (94%) rename {docling_eval_next => docling_eval}/dataset_builders/funsd_builder.py (96%) rename {docling_eval_next => docling_eval}/dataset_builders/omnidocbench_builder.py (95%) rename {docling_eval_next => docling_eval}/dataset_builders/otsl_table_dataset_builder.py (96%) rename {docling_eval_next => docling_eval}/dataset_builders/xfund_builder.py (96%) rename docling_eval/{benchmarks => legacy}/README.md (96%) rename docling_eval/{benchmarks/doclaynet_v1 => legacy}/__init__.py (100%) rename docling_eval/{benchmarks/doclaynet_v2 => legacy/cvat_annotation}/__init__.py (100%) rename docling_eval/{benchmarks => legacy}/cvat_annotation/create.py (99%) rename docling_eval/{benchmarks => legacy}/cvat_annotation/create_dataset_from_pdfs.py (97%) rename docling_eval/{benchmarks => legacy}/cvat_annotation/preannotate.py (98%) rename docling_eval/{benchmarks => legacy}/cvat_annotation/utils.py (100%) rename docling_eval/{benchmarks/dpbench => legacy/doclaynet_v1}/__init__.py (100%) rename docling_eval/{benchmarks => legacy}/doclaynet_v1/create.py (99%) rename docling_eval/{benchmarks/funsd => legacy/doclaynet_v2}/__init__.py (100%) rename docling_eval/{benchmarks => legacy}/doclaynet_v2/create.py (99%) rename docling_eval/{benchmarks => legacy}/dpbench/README.md (100%) rename docling_eval/{benchmarks/omnidocbench => legacy/dpbench}/__init__.py (100%) rename docling_eval/{benchmarks => legacy}/dpbench/create.py (99%) rename docling_eval/{benchmarks/tableformer_huggingface_otsl => legacy/funsd}/__init__.py (100%) rename docling_eval/{benchmarks => legacy}/funsd/create.py (98%) rename docling_eval/{benchmarks/xfund => legacy/omnidocbench}/__init__.py (100%) rename docling_eval/{benchmarks => legacy}/omnidocbench/create.py (99%) rename {docling_eval_next => docling_eval/legacy/tableformer_huggingface_otsl}/__init__.py (100%) rename docling_eval/{benchmarks => legacy}/tableformer_huggingface_otsl/create.py (99%) rename {docling_eval_next/datamodels => docling_eval/legacy/xfund}/__init__.py (100%) rename docling_eval/{benchmarks => legacy}/xfund/create.py (99%) rename {docling_eval_next/dataset_builders => docling_eval/prediction_providers}/__init__.py (100%) create mode 100644 docling_eval/prediction_providers/base_prediction_provider.py create mode 100644 docling_eval/prediction_providers/docling_provider.py create mode 100644 docling_eval/prediction_providers/file_provider.py create mode 100644 docling_eval/prediction_providers/tableformer_provider.py rename {docling_eval_next/prediction_providers => docling_eval/utils}/__init__.py (100%) rename docling_eval/{benchmarks => utils}/utils.py (99%) delete mode 100644 docling_eval_next/prediction_providers/prediction_provider.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 91532586..20a289a2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,13 +4,13 @@ repos: hooks: - id: black name: Black - entry: poetry run black docling_eval docling_eval_next tests docs/examples + entry: poetry run black docling_eval tests docs/examples pass_filenames: false language: system files: '\.py$' - id: isort name: isort - entry: poetry run isort docling_eval docling_eval_next tests docs/examples + entry: poetry run isort docling_eval tests docs/examples pass_filenames: false language: system files: '\.py$' @@ -22,7 +22,7 @@ repos: # files: '\.py$' - id: mypy name: MyPy - entry: poetry run mypy docling_eval docling_eval_next tests docs/examples + entry: poetry run mypy docling_eval tests docs/examples pass_filenames: false language: system files: '\.py$' diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py index 996965dc..37789b5c 100644 --- a/docling_eval/cli/main.py +++ b/docling_eval/cli/main.py @@ -8,25 +8,11 @@ import typer from tabulate import tabulate # type: ignore -from docling_eval.benchmarks.constants import ( +from docling_eval.datamodels.constants import ( BenchMarkNames, ConverterTypes, EvaluationModality, ) -from docling_eval.benchmarks.doclaynet_v1.create import create_dlnv1_e2e_dataset -from docling_eval.benchmarks.dpbench.create import ( - create_dpbench_e2e_dataset, - create_dpbench_tableformer_dataset, -) -from docling_eval.benchmarks.omnidocbench.create import ( - create_omnidocbench_e2e_dataset, - create_omnidocbench_tableformer_dataset, -) -from docling_eval.benchmarks.tableformer_huggingface_otsl.create import ( - create_fintabnet_tableformer_dataset, - create_p1m_tableformer_dataset, - create_pubtabnet_tableformer_dataset, -) from docling_eval.evaluators.base_readingorder_evaluator import ( DatasetReadingOrderEvaluation, ReadingOrderVisualizer, @@ -46,6 +32,20 @@ DatasetTableEvaluation, TableEvaluator, ) +from docling_eval.legacy.doclaynet_v1.create import create_dlnv1_e2e_dataset +from docling_eval.legacy.dpbench.create import ( + create_dpbench_e2e_dataset, + create_dpbench_tableformer_dataset, +) +from docling_eval.legacy.omnidocbench.create import ( + create_omnidocbench_e2e_dataset, + create_omnidocbench_tableformer_dataset, +) +from docling_eval.legacy.tableformer_huggingface_otsl.create import ( + create_fintabnet_tableformer_dataset, + create_p1m_tableformer_dataset, + create_pubtabnet_tableformer_dataset, +) # Configure logging logging.getLogger("docling").setLevel(logging.WARNING) diff --git a/docling_eval/converters/models/tableformer/tf_model_prediction.py b/docling_eval/converters/models/tableformer/tf_model_prediction.py index c63c1009..9aff3c48 100644 --- a/docling_eval/converters/models/tableformer/tf_model_prediction.py +++ b/docling_eval/converters/models/tableformer/tf_model_prediction.py @@ -2,7 +2,7 @@ import logging from io import BytesIO from pathlib import Path -from typing import Dict, List, Optional, Tuple, Union +from typing import List, Optional, Tuple import numpy as np from docling.datamodel.base_models import Cluster, LayoutPrediction, Page, Table @@ -26,7 +26,7 @@ from PIL import Image from pydantic import BaseModel -from docling_eval.benchmarks.utils import get_input_document, map_to_records +from docling_eval.utils.utils import get_input_document # Get logger log = logging.getLogger(__name__) diff --git a/docling_eval/benchmarks/__init__.py b/docling_eval/datamodels/__init__.py similarity index 100% rename from docling_eval/benchmarks/__init__.py rename to docling_eval/datamodels/__init__.py diff --git a/docling_eval/benchmarks/constants.py b/docling_eval/datamodels/constants.py similarity index 100% rename from docling_eval/benchmarks/constants.py rename to docling_eval/datamodels/constants.py diff --git a/docling_eval_next/datamodels/dataset_record.py b/docling_eval/datamodels/dataset_record.py similarity index 98% rename from docling_eval_next/datamodels/dataset_record.py rename to docling_eval/datamodels/dataset_record.py index a33fd489..b0fd7fe5 100644 --- a/docling_eval_next/datamodels/dataset_record.py +++ b/docling_eval/datamodels/dataset_record.py @@ -1,7 +1,7 @@ import json from io import BytesIO from pathlib import Path -from typing import Any, Dict, List, Optional, Union +from typing import Dict, List, Optional, Union import PIL from datasets import Features @@ -11,9 +11,8 @@ from docling_core.types import DoclingDocument from docling_core.types.io import DocumentStream from pydantic import BaseModel, ConfigDict, Field, model_validator -from pydantic.fields import FieldInfo -from docling_eval.benchmarks.constants import EvaluationModality, PredictionFormats +from docling_eval.datamodels.constants import EvaluationModality, PredictionFormats class DatasetRecord( diff --git a/docling_eval/benchmarks/cvat_annotation/__init__.py b/docling_eval/dataset_builders/__init__.py similarity index 100% rename from docling_eval/benchmarks/cvat_annotation/__init__.py rename to docling_eval/dataset_builders/__init__.py diff --git a/docling_eval_next/dataset_builders/dataset_builder.py b/docling_eval/dataset_builders/dataset_builder.py similarity index 92% rename from docling_eval_next/dataset_builders/dataset_builder.py rename to docling_eval/dataset_builders/dataset_builder.py index 65df3cc1..7fcd6856 100644 --- a/docling_eval_next/dataset_builders/dataset_builder.py +++ b/docling_eval/dataset_builders/dataset_builder.py @@ -1,20 +1,15 @@ import os import sys from abc import abstractmethod -from io import BytesIO from pathlib import Path from typing import Iterable, Optional, Union from docling.utils.utils import chunkify -from docling_core.types.io import DocumentStream from huggingface_hub import snapshot_download from pydantic import BaseModel -from docling_eval.benchmarks.utils import save_shard_to_disk, write_datasets_info -from docling_eval_next.datamodels.dataset_record import DatasetRecord -from docling_eval_next.prediction_providers.prediction_provider import ( - BasePredictionProvider, -) +from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.utils.utils import save_shard_to_disk, write_datasets_info class HFSource(BaseModel): diff --git a/docling_eval_next/dataset_builders/doclaynet_v1_builder.py b/docling_eval/dataset_builders/doclaynet_v1_builder.py similarity index 95% rename from docling_eval_next/dataset_builders/doclaynet_v1_builder.py rename to docling_eval/dataset_builders/doclaynet_v1_builder.py index 94d71280..9460468a 100644 --- a/docling_eval_next/dataset_builders/doclaynet_v1_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v1_builder.py @@ -1,9 +1,8 @@ import io -import json import logging import os from pathlib import Path -from typing import Dict, Iterable, List, Optional, Set, Tuple +from typing import Iterable from datasets import load_dataset from docling_core.types import DoclingDocument @@ -19,31 +18,21 @@ TableData, ) from docling_core.types.io import DocumentStream -from PIL import Image from tqdm import tqdm -from docling_eval.benchmarks.constants import ( - BenchMarkColumns, - ConverterTypes, - EvaluationModality, +from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality +from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.dataset_builders.dataset_builder import ( + BaseEvaluationDatasetBuilder, + HFSource, ) -from docling_eval.benchmarks.utils import ( +from docling_eval.utils.utils import ( add_pages_to_true_doc, crop_bounding_box, extract_images, from_pil_to_base64uri, - get_binary, get_binhash, ) -from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters -from docling_eval_next.datamodels.dataset_record import DatasetRecord -from docling_eval_next.dataset_builders.dataset_builder import ( - BaseEvaluationDatasetBuilder, - HFSource, -) -from docling_eval_next.prediction_providers.prediction_provider import ( - BasePredictionProvider, -) # Get logger _log = logging.getLogger(__name__) diff --git a/docling_eval_next/dataset_builders/doclaynet_v2_builder.py b/docling_eval/dataset_builders/doclaynet_v2_builder.py similarity index 97% rename from docling_eval_next/dataset_builders/doclaynet_v2_builder.py rename to docling_eval/dataset_builders/doclaynet_v2_builder.py index adc8c2de..a9bed56d 100644 --- a/docling_eval_next/dataset_builders/doclaynet_v2_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v2_builder.py @@ -4,7 +4,7 @@ import os import re from pathlib import Path -from typing import Dict, Iterable, List, Optional, Tuple +from typing import Dict, Iterable, List, Optional from datasets import load_from_disk from docling_core.types import DoclingDocument @@ -27,25 +27,16 @@ from PIL import Image from tqdm import tqdm -from docling_eval.benchmarks.constants import ( - BenchMarkColumns, - ConverterTypes, - EvaluationModality, -) -from docling_eval.benchmarks.utils import ( +from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality +from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.dataset_builders.dataset_builder import BaseEvaluationDatasetBuilder +from docling_eval.utils.utils import ( classify_cells, crop_bounding_box, extract_images, from_pil_to_base64uri, get_binhash, ) -from docling_eval_next.datamodels.dataset_record import DatasetRecord -from docling_eval_next.dataset_builders.dataset_builder import ( - BaseEvaluationDatasetBuilder, -) -from docling_eval_next.prediction_providers.prediction_provider import ( - BasePredictionProvider, -) # Get logger _log = logging.getLogger(__name__) diff --git a/docling_eval_next/dataset_builders/dpbench_builder.py b/docling_eval/dataset_builders/dpbench_builder.py similarity index 94% rename from docling_eval_next/dataset_builders/dpbench_builder.py rename to docling_eval/dataset_builders/dpbench_builder.py index 76501db4..00451325 100644 --- a/docling_eval_next/dataset_builders/dpbench_builder.py +++ b/docling_eval/dataset_builders/dpbench_builder.py @@ -2,7 +2,7 @@ import os from io import BytesIO from pathlib import Path -from typing import Dict, Iterable, List, Optional +from typing import Dict, Iterable, List from docling_core.types import DoclingDocument from docling_core.types.doc import ( @@ -19,7 +19,12 @@ from PIL.Image import Image from tqdm import tqdm -from docling_eval.benchmarks.utils import ( +from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.dataset_builders.dataset_builder import ( + BaseEvaluationDatasetBuilder, + HFSource, +) +from docling_eval.utils.utils import ( add_pages_to_true_doc, convert_html_table_into_docling_tabledata, crop_bounding_box, @@ -27,18 +32,6 @@ get_binary, get_binhash, ) -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - TableFormerUpdater, -) -from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters -from docling_eval_next.datamodels.dataset_record import DatasetRecord -from docling_eval_next.dataset_builders.dataset_builder import ( - BaseEvaluationDatasetBuilder, - HFSource, -) -from docling_eval_next.prediction_providers.prediction_provider import ( - BasePredictionProvider, -) TRUE_HTML_EXPORT_LABELS = { DocItemLabel.TITLE, diff --git a/docling_eval_next/dataset_builders/funsd_builder.py b/docling_eval/dataset_builders/funsd_builder.py similarity index 96% rename from docling_eval_next/dataset_builders/funsd_builder.py rename to docling_eval/dataset_builders/funsd_builder.py index 5f1f34b2..e6201b39 100644 --- a/docling_eval_next/dataset_builders/funsd_builder.py +++ b/docling_eval/dataset_builders/funsd_builder.py @@ -14,24 +14,15 @@ from PIL import Image from tqdm import tqdm -from docling_eval.benchmarks.constants import ( - BenchMarkColumns, - ConverterTypes, - EvaluationModality, -) -from docling_eval.benchmarks.utils import ( +from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality +from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.dataset_builders.dataset_builder import BaseEvaluationDatasetBuilder +from docling_eval.utils.utils import ( classify_cells, extract_images, from_pil_to_base64uri, get_binhash, ) -from docling_eval_next.datamodels.dataset_record import DatasetRecord -from docling_eval_next.dataset_builders.dataset_builder import ( - BaseEvaluationDatasetBuilder, -) -from docling_eval_next.prediction_providers.prediction_provider import ( - BasePredictionProvider, -) # Get logger _log = logging.getLogger(__name__) diff --git a/docling_eval_next/dataset_builders/omnidocbench_builder.py b/docling_eval/dataset_builders/omnidocbench_builder.py similarity index 95% rename from docling_eval_next/dataset_builders/omnidocbench_builder.py rename to docling_eval/dataset_builders/omnidocbench_builder.py index 80718506..bc1a21cc 100644 --- a/docling_eval_next/dataset_builders/omnidocbench_builder.py +++ b/docling_eval/dataset_builders/omnidocbench_builder.py @@ -4,7 +4,7 @@ import os from io import BytesIO from pathlib import Path -from typing import Dict, Iterable, List, Optional, Tuple +from typing import Iterable, List, Tuple from docling_core.types import DoclingDocument from docling_core.types.doc import ( @@ -14,33 +14,23 @@ ImageRef, ProvenanceItem, Size, - TableCell, - TableData, ) from docling_core.types.io import DocumentStream from PIL.Image import Image from tqdm import tqdm -from docling_eval.benchmarks.utils import ( +from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.dataset_builders.dataset_builder import ( + BaseEvaluationDatasetBuilder, + HFSource, +) +from docling_eval.utils.utils import ( add_pages_to_true_doc, convert_html_table_into_docling_tabledata, crop_bounding_box, from_pil_to_base64uri, get_binary, get_binhash, - set_selection_range, -) -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - TableFormerUpdater, -) -from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters -from docling_eval_next.datamodels.dataset_record import DatasetRecord -from docling_eval_next.dataset_builders.dataset_builder import ( - BaseEvaluationDatasetBuilder, - HFSource, -) -from docling_eval_next.prediction_providers.prediction_provider import ( - BasePredictionProvider, ) # Get logger diff --git a/docling_eval_next/dataset_builders/otsl_table_dataset_builder.py b/docling_eval/dataset_builders/otsl_table_dataset_builder.py similarity index 96% rename from docling_eval_next/dataset_builders/otsl_table_dataset_builder.py rename to docling_eval/dataset_builders/otsl_table_dataset_builder.py index 66bcbc4c..9dc9cc29 100644 --- a/docling_eval_next/dataset_builders/otsl_table_dataset_builder.py +++ b/docling_eval/dataset_builders/otsl_table_dataset_builder.py @@ -1,8 +1,7 @@ import io import logging -import os from pathlib import Path -from typing import Any, Iterable, List, Optional +from typing import Any, Iterable, List from datasets import load_dataset from docling_core.types import DoclingDocument @@ -17,19 +16,19 @@ from docling_core.types.io import DocumentStream from tqdm import tqdm -from docling_eval.benchmarks.constants import BenchMarkColumns, EvaluationModality -from docling_eval.benchmarks.utils import ( +from docling_eval.converters.models.tableformer.tf_model_prediction import PageTokens +from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality +from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.dataset_builders.dataset_builder import ( + BaseEvaluationDatasetBuilder, + HFSource, +) +from docling_eval.utils.utils import ( convert_html_table_into_docling_tabledata, extract_images, from_pil_to_base64uri, get_binhash, ) -from docling_eval.converters.models.tableformer.tf_model_prediction import PageTokens -from docling_eval_next.datamodels.dataset_record import DatasetRecord -from docling_eval_next.dataset_builders.dataset_builder import ( - BaseEvaluationDatasetBuilder, - HFSource, -) _log = logging.getLogger(__name__) diff --git a/docling_eval_next/dataset_builders/xfund_builder.py b/docling_eval/dataset_builders/xfund_builder.py similarity index 96% rename from docling_eval_next/dataset_builders/xfund_builder.py rename to docling_eval/dataset_builders/xfund_builder.py index b86e0948..54ea79fb 100644 --- a/docling_eval_next/dataset_builders/xfund_builder.py +++ b/docling_eval/dataset_builders/xfund_builder.py @@ -15,25 +15,15 @@ from PIL import Image from tqdm import tqdm -from docling_eval.benchmarks.constants import ( - BenchMarkColumns, - ConverterTypes, - EvaluationModality, -) -from docling_eval.benchmarks.utils import ( +from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality +from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.dataset_builders.dataset_builder import BaseEvaluationDatasetBuilder +from docling_eval.utils.utils import ( classify_cells, extract_images, from_pil_to_base64uri, get_binhash, ) -from docling_eval_next.datamodels.dataset_record import DatasetRecord -from docling_eval_next.dataset_builders.dataset_builder import ( - BaseEvaluationDatasetBuilder, - HFSource, -) -from docling_eval_next.prediction_providers.prediction_provider import ( - BasePredictionProvider, -) # Get logger _log = logging.getLogger(__name__) diff --git a/docling_eval/evaluators/base_evaluator.py b/docling_eval/evaluators/base_evaluator.py index 2d2b0d95..8a7416a2 100644 --- a/docling_eval/evaluators/base_evaluator.py +++ b/docling_eval/evaluators/base_evaluator.py @@ -4,8 +4,7 @@ from pydantic import BaseModel -from docling_eval.benchmarks.constants import PredictionFormats -from docling_eval.evaluators.stats import DatasetStatistics +from docling_eval.datamodels.constants import PredictionFormats _log = logging.getLogger(__name__) diff --git a/docling_eval/evaluators/base_readingorder_evaluator.py b/docling_eval/evaluators/base_readingorder_evaluator.py index 7921394b..827bd322 100644 --- a/docling_eval/evaluators/base_readingorder_evaluator.py +++ b/docling_eval/evaluators/base_readingorder_evaluator.py @@ -15,7 +15,7 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import BenchMarkColumns +from docling_eval.datamodels.constants import BenchMarkColumns from docling_eval.evaluators.stats import DatasetStatistics, compute_stats from docling_eval.visualisation.visualisations import draw_arrow diff --git a/docling_eval/evaluators/bbox_text_evaluator.py b/docling_eval/evaluators/bbox_text_evaluator.py index 67b7ee45..8e22d27b 100644 --- a/docling_eval/evaluators/bbox_text_evaluator.py +++ b/docling_eval/evaluators/bbox_text_evaluator.py @@ -13,7 +13,7 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import BenchMarkColumns # type: ignore +from docling_eval.datamodels.constants import BenchMarkColumns # type: ignore from docling_eval.evaluators.stats import DatasetStatistics, compute_stats _log = logging.getLogger(__name__) diff --git a/docling_eval/evaluators/layout_evaluator.py b/docling_eval/evaluators/layout_evaluator.py index 7fd83824..8e72cd84 100644 --- a/docling_eval/evaluators/layout_evaluator.py +++ b/docling_eval/evaluators/layout_evaluator.py @@ -15,7 +15,7 @@ from torchmetrics.detection.mean_ap import MeanAveragePrecision from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import BenchMarkColumns, PredictionFormats +from docling_eval.datamodels.constants import BenchMarkColumns, PredictionFormats from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation from docling_eval.evaluators.stats import DatasetStatistics, compute_stats diff --git a/docling_eval/evaluators/markdown_text_evaluator.py b/docling_eval/evaluators/markdown_text_evaluator.py index afa6539d..f5690a57 100644 --- a/docling_eval/evaluators/markdown_text_evaluator.py +++ b/docling_eval/evaluators/markdown_text_evaluator.py @@ -14,13 +14,12 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import ( # type: ignore +from docling_eval.datamodels.constants import ( # type: ignore BenchMarkColumns, PredictionFormats, ) from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation from docling_eval.evaluators.stats import DatasetStatistics, compute_stats -from docling_eval_next.datamodels.dataset_record import DatasetRecordWithPrediction _log = logging.getLogger(__name__) diff --git a/docling_eval/evaluators/table_evaluator.py b/docling_eval/evaluators/table_evaluator.py index 4a69bd9d..934beb2a 100644 --- a/docling_eval/evaluators/table_evaluator.py +++ b/docling_eval/evaluators/table_evaluator.py @@ -13,7 +13,7 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import BenchMarkColumns, PredictionFormats +from docling_eval.datamodels.constants import BenchMarkColumns, PredictionFormats from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation from docling_eval.evaluators.stats import DatasetStatistics, compute_stats from docling_eval.evaluators.teds import TEDScorer diff --git a/docling_eval/benchmarks/README.md b/docling_eval/legacy/README.md similarity index 96% rename from docling_eval/benchmarks/README.md rename to docling_eval/legacy/README.md index 3e54deb6..5fd81465 100644 --- a/docling_eval/benchmarks/README.md +++ b/docling_eval/legacy/README.md @@ -20,7 +20,7 @@ The dataset has the following layout, To create the dataset, ```sh -poetry run python ./docling_eval/benchmarks/dpbench/create.py -h +poetry run python ./docling_eval/legacy/dpbench/create.py -h 2024-12-19 12:47:08,933 - INFO - PyTorch version 2.5.1 available. usage: create.py [-h] -i DPBENCH_DIRECTORY [-o OUTPUT_DIRECTORY] [-s IMAGE_SCALE] [-m {end-2-end,table,formula,all}] diff --git a/docling_eval/benchmarks/doclaynet_v1/__init__.py b/docling_eval/legacy/__init__.py similarity index 100% rename from docling_eval/benchmarks/doclaynet_v1/__init__.py rename to docling_eval/legacy/__init__.py diff --git a/docling_eval/benchmarks/doclaynet_v2/__init__.py b/docling_eval/legacy/cvat_annotation/__init__.py similarity index 100% rename from docling_eval/benchmarks/doclaynet_v2/__init__.py rename to docling_eval/legacy/cvat_annotation/__init__.py diff --git a/docling_eval/benchmarks/cvat_annotation/create.py b/docling_eval/legacy/cvat_annotation/create.py similarity index 99% rename from docling_eval/benchmarks/cvat_annotation/create.py rename to docling_eval/legacy/cvat_annotation/create.py index fe3e1740..4a5176e7 100644 --- a/docling_eval/benchmarks/cvat_annotation/create.py +++ b/docling_eval/legacy/cvat_annotation/create.py @@ -23,17 +23,18 @@ from PIL import Image # as PILImage from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import ( +from docling_eval.converters.conversion import create_pdf_docling_converter +from docling_eval.datamodels.constants import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) -from docling_eval.benchmarks.cvat_annotation.utils import ( +from docling_eval.legacy.cvat_annotation.utils import ( AnnotatedImage, AnnotationOverview, BenchMarkDirs, ) -from docling_eval.benchmarks.utils import ( +from docling_eval.utils.utils import ( crop_bounding_box, docling_version, extract_images, @@ -43,7 +44,6 @@ save_shard_to_disk, write_datasets_info, ) -from docling_eval.converters.conversion import create_pdf_docling_converter from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters # from pydantic import diff --git a/docling_eval/benchmarks/cvat_annotation/create_dataset_from_pdfs.py b/docling_eval/legacy/cvat_annotation/create_dataset_from_pdfs.py similarity index 97% rename from docling_eval/benchmarks/cvat_annotation/create_dataset_from_pdfs.py rename to docling_eval/legacy/cvat_annotation/create_dataset_from_pdfs.py index c002f0d8..7107e6a8 100644 --- a/docling_eval/benchmarks/cvat_annotation/create_dataset_from_pdfs.py +++ b/docling_eval/legacy/cvat_annotation/create_dataset_from_pdfs.py @@ -8,14 +8,14 @@ from datasets import Image as Features_Image from datasets import Sequence, Value -from docling_eval.benchmarks.constants import BenchMarkColumns -from docling_eval.benchmarks.utils import ( +from docling_eval.converters.conversion import create_pdf_docling_converter +from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.utils.utils import ( docling_version, extract_images, get_binary, save_shard_to_disk, ) -from docling_eval.converters.conversion import create_pdf_docling_converter def parse_args(): diff --git a/docling_eval/benchmarks/cvat_annotation/preannotate.py b/docling_eval/legacy/cvat_annotation/preannotate.py similarity index 98% rename from docling_eval/benchmarks/cvat_annotation/preannotate.py rename to docling_eval/legacy/cvat_annotation/preannotate.py index ff3404a6..c7f1617c 100644 --- a/docling_eval/benchmarks/cvat_annotation/preannotate.py +++ b/docling_eval/legacy/cvat_annotation/preannotate.py @@ -12,8 +12,8 @@ from docling_core.types.doc.labels import DocItemLabel, PictureClassificationLabel from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import BenchMarkColumns -from docling_eval.benchmarks.cvat_annotation.utils import ( +from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.legacy.cvat_annotation.utils import ( AnnotatedDoc, AnnotatedImage, AnnotationBBox, @@ -23,7 +23,7 @@ TableComponentLabel, rgb_to_hex, ) -from docling_eval.benchmarks.utils import get_binhash, insert_images +from docling_eval.utils.utils import get_binhash, insert_images # Configure logging logging.basicConfig( diff --git a/docling_eval/benchmarks/cvat_annotation/utils.py b/docling_eval/legacy/cvat_annotation/utils.py similarity index 100% rename from docling_eval/benchmarks/cvat_annotation/utils.py rename to docling_eval/legacy/cvat_annotation/utils.py diff --git a/docling_eval/benchmarks/dpbench/__init__.py b/docling_eval/legacy/doclaynet_v1/__init__.py similarity index 100% rename from docling_eval/benchmarks/dpbench/__init__.py rename to docling_eval/legacy/doclaynet_v1/__init__.py diff --git a/docling_eval/benchmarks/doclaynet_v1/create.py b/docling_eval/legacy/doclaynet_v1/create.py similarity index 99% rename from docling_eval/benchmarks/doclaynet_v1/create.py rename to docling_eval/legacy/doclaynet_v1/create.py index 45f8b8d1..b80ac862 100644 --- a/docling_eval/benchmarks/doclaynet_v1/create.py +++ b/docling_eval/legacy/doclaynet_v1/create.py @@ -1,7 +1,6 @@ import io import json import logging -import math import os from pathlib import Path @@ -21,12 +20,16 @@ from docling_core.types.io import DocumentStream from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import ( +from docling_eval.converters.conversion import ( + create_pdf_docling_converter, + create_smol_docling_converter, +) +from docling_eval.datamodels.constants import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) -from docling_eval.benchmarks.utils import ( +from docling_eval.utils.utils import ( add_pages_to_true_doc, crop_bounding_box, docling_version, @@ -36,10 +39,6 @@ set_selection_range, write_datasets_info, ) -from docling_eval.converters.conversion import ( - create_pdf_docling_converter, - create_smol_docling_converter, -) from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters # Get logger diff --git a/docling_eval/benchmarks/funsd/__init__.py b/docling_eval/legacy/doclaynet_v2/__init__.py similarity index 100% rename from docling_eval/benchmarks/funsd/__init__.py rename to docling_eval/legacy/doclaynet_v2/__init__.py diff --git a/docling_eval/benchmarks/doclaynet_v2/create.py b/docling_eval/legacy/doclaynet_v2/create.py similarity index 99% rename from docling_eval/benchmarks/doclaynet_v2/create.py rename to docling_eval/legacy/doclaynet_v2/create.py index cedcbdaf..da360169 100644 --- a/docling_eval/benchmarks/doclaynet_v2/create.py +++ b/docling_eval/legacy/doclaynet_v2/create.py @@ -27,16 +27,20 @@ from docling_core.types.io import DocumentStream from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import ( +from docling_eval.converters.conversion import ( + create_image_docling_converter, + create_smol_docling_converter, +) +from docling_eval.datamodels.constants import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) -from docling_eval.benchmarks.doclaynet_v1.create import ( +from docling_eval.legacy.doclaynet_v1.create import ( PRED_HTML_EXPORT_LABELS, TRUE_HTML_EXPORT_LABELS, ) -from docling_eval.benchmarks.utils import ( +from docling_eval.utils.utils import ( classify_cells, crop_bounding_box, docling_version, @@ -45,10 +49,6 @@ save_shard_to_disk, write_datasets_info, ) -from docling_eval.converters.conversion import ( - create_image_docling_converter, - create_smol_docling_converter, -) from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters logging.basicConfig( diff --git a/docling_eval/benchmarks/dpbench/README.md b/docling_eval/legacy/dpbench/README.md similarity index 100% rename from docling_eval/benchmarks/dpbench/README.md rename to docling_eval/legacy/dpbench/README.md diff --git a/docling_eval/benchmarks/omnidocbench/__init__.py b/docling_eval/legacy/dpbench/__init__.py similarity index 100% rename from docling_eval/benchmarks/omnidocbench/__init__.py rename to docling_eval/legacy/dpbench/__init__.py diff --git a/docling_eval/benchmarks/dpbench/create.py b/docling_eval/legacy/dpbench/create.py similarity index 99% rename from docling_eval/benchmarks/dpbench/create.py rename to docling_eval/legacy/dpbench/create.py index 1c075dab..edaf1fdc 100644 --- a/docling_eval/benchmarks/dpbench/create.py +++ b/docling_eval/legacy/dpbench/create.py @@ -17,12 +17,19 @@ from PIL import Image # as PILImage from tqdm import tqdm -from docling_eval.benchmarks.constants import ( +from docling_eval.converters.conversion import ( + create_pdf_docling_converter, + create_smol_docling_converter, +) +from docling_eval.converters.models.tableformer.tf_model_prediction import ( + TableFormerUpdater, +) +from docling_eval.datamodels.constants import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) -from docling_eval.benchmarks.utils import ( +from docling_eval.utils.utils import ( add_pages_to_true_doc, convert_html_table_into_docling_tabledata, crop_bounding_box, @@ -34,13 +41,6 @@ set_selection_range, write_datasets_info, ) -from docling_eval.converters.conversion import ( - create_pdf_docling_converter, - create_smol_docling_converter, -) -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - TableFormerUpdater, -) from docling_eval.visualisation.visualisations import ( # type: ignore save_comparison_html, save_comparison_html_with_clusters, diff --git a/docling_eval/benchmarks/tableformer_huggingface_otsl/__init__.py b/docling_eval/legacy/funsd/__init__.py similarity index 100% rename from docling_eval/benchmarks/tableformer_huggingface_otsl/__init__.py rename to docling_eval/legacy/funsd/__init__.py diff --git a/docling_eval/benchmarks/funsd/create.py b/docling_eval/legacy/funsd/create.py similarity index 98% rename from docling_eval/benchmarks/funsd/create.py rename to docling_eval/legacy/funsd/create.py index 79dd289d..bf9de885 100644 --- a/docling_eval/benchmarks/funsd/create.py +++ b/docling_eval/legacy/funsd/create.py @@ -12,19 +12,15 @@ from PIL import Image from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import ( - BenchMarkColumns, - ConverterTypes, - EvaluationModality, -) -from docling_eval.benchmarks.utils import ( +from docling_eval.converters.conversion import create_image_docling_converter +from docling_eval.datamodels.constants import BenchMarkColumns, ConverterTypes +from docling_eval.utils.utils import ( docling_version, extract_images, from_pil_to_base64uri, save_shard_to_disk, write_datasets_info, ) -from docling_eval.converters.conversion import create_image_docling_converter SHARD_SIZE = 1000 diff --git a/docling_eval/benchmarks/xfund/__init__.py b/docling_eval/legacy/omnidocbench/__init__.py similarity index 100% rename from docling_eval/benchmarks/xfund/__init__.py rename to docling_eval/legacy/omnidocbench/__init__.py diff --git a/docling_eval/benchmarks/omnidocbench/create.py b/docling_eval/legacy/omnidocbench/create.py similarity index 99% rename from docling_eval/benchmarks/omnidocbench/create.py rename to docling_eval/legacy/omnidocbench/create.py index 15f75f2a..dd36efa1 100644 --- a/docling_eval/benchmarks/omnidocbench/create.py +++ b/docling_eval/legacy/omnidocbench/create.py @@ -12,12 +12,19 @@ from PIL import Image # as PILImage from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import ( +from docling_eval.converters.conversion import ( + create_pdf_docling_converter, + create_smol_docling_converter, +) +from docling_eval.converters.models.tableformer.tf_model_prediction import ( + TableFormerUpdater, +) +from docling_eval.datamodels.constants import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) -from docling_eval.benchmarks.utils import ( +from docling_eval.utils.utils import ( add_pages_to_true_doc, convert_html_table_into_docling_tabledata, crop_bounding_box, @@ -29,13 +36,6 @@ set_selection_range, write_datasets_info, ) -from docling_eval.converters.conversion import ( - create_pdf_docling_converter, - create_smol_docling_converter, -) -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - TableFormerUpdater, -) from docling_eval.visualisation.visualisations import ( save_comparison_html, save_comparison_html_with_clusters, diff --git a/docling_eval_next/__init__.py b/docling_eval/legacy/tableformer_huggingface_otsl/__init__.py similarity index 100% rename from docling_eval_next/__init__.py rename to docling_eval/legacy/tableformer_huggingface_otsl/__init__.py diff --git a/docling_eval/benchmarks/tableformer_huggingface_otsl/create.py b/docling_eval/legacy/tableformer_huggingface_otsl/create.py similarity index 99% rename from docling_eval/benchmarks/tableformer_huggingface_otsl/create.py rename to docling_eval/legacy/tableformer_huggingface_otsl/create.py index 2187aba5..c1f7fbd9 100644 --- a/docling_eval/benchmarks/tableformer_huggingface_otsl/create.py +++ b/docling_eval/legacy/tableformer_huggingface_otsl/create.py @@ -18,12 +18,16 @@ from docling_core.types.doc.labels import DocItemLabel from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import ( +from docling_eval.converters.models.tableformer.tf_model_prediction import ( + PageTokens, + TableFormerUpdater, +) +from docling_eval.datamodels.constants import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) -from docling_eval.benchmarks.utils import ( +from docling_eval.utils.utils import ( convert_html_table_into_docling_tabledata, docling_version, extract_images, @@ -31,10 +35,6 @@ save_shard_to_disk, set_selection_range, ) -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - PageTokens, - TableFormerUpdater, -) from docling_eval.visualisation.visualisations import save_comparison_html # Get logger diff --git a/docling_eval_next/datamodels/__init__.py b/docling_eval/legacy/xfund/__init__.py similarity index 100% rename from docling_eval_next/datamodels/__init__.py rename to docling_eval/legacy/xfund/__init__.py diff --git a/docling_eval/benchmarks/xfund/create.py b/docling_eval/legacy/xfund/create.py similarity index 99% rename from docling_eval/benchmarks/xfund/create.py rename to docling_eval/legacy/xfund/create.py index 99bf9bc8..d7b4b6a9 100644 --- a/docling_eval/benchmarks/xfund/create.py +++ b/docling_eval/legacy/xfund/create.py @@ -26,12 +26,9 @@ from PIL import Image from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import ( - BenchMarkColumns, - ConverterTypes, - EvaluationModality, -) -from docling_eval.benchmarks.utils import ( +from docling_eval.converters.conversion import create_image_docling_converter +from docling_eval.datamodels.constants import BenchMarkColumns, ConverterTypes +from docling_eval.utils.utils import ( crop_bounding_box, docling_version, extract_images, @@ -39,7 +36,6 @@ save_shard_to_disk, write_datasets_info, ) -from docling_eval.converters.conversion import create_image_docling_converter SHARD_SIZE = 1000 diff --git a/docling_eval_next/dataset_builders/__init__.py b/docling_eval/prediction_providers/__init__.py similarity index 100% rename from docling_eval_next/dataset_builders/__init__.py rename to docling_eval/prediction_providers/__init__.py diff --git a/docling_eval/prediction_providers/base_prediction_provider.py b/docling_eval/prediction_providers/base_prediction_provider.py new file mode 100644 index 00000000..759be7e6 --- /dev/null +++ b/docling_eval/prediction_providers/base_prediction_provider.py @@ -0,0 +1,189 @@ +import copy +import os +import sys +from abc import abstractmethod +from io import BytesIO +from pathlib import Path +from typing import Dict, Optional + +from datasets import load_dataset +from docling.utils.utils import chunkify +from docling_core.types.doc import DocItemLabel +from docling_core.types.doc.document import DoclingDocument +from docling_core.types.io import DocumentStream +from tqdm import tqdm + +from docling_eval.datamodels.constants import PredictionFormats +from docling_eval.datamodels.dataset_record import ( + DatasetRecord, + DatasetRecordWithPrediction, +) +from docling_eval.utils.utils import save_shard_to_disk, write_datasets_info +from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters + +TRUE_HTML_EXPORT_LABELS = { + DocItemLabel.TITLE, + DocItemLabel.DOCUMENT_INDEX, + DocItemLabel.SECTION_HEADER, + DocItemLabel.PARAGRAPH, + DocItemLabel.TABLE, + DocItemLabel.PICTURE, + DocItemLabel.FORMULA, + DocItemLabel.CHECKBOX_UNSELECTED, + DocItemLabel.CHECKBOX_SELECTED, + DocItemLabel.TEXT, + DocItemLabel.LIST_ITEM, + DocItemLabel.CODE, + DocItemLabel.REFERENCE, + DocItemLabel.CAPTION, + DocItemLabel.PAGE_HEADER, + DocItemLabel.PAGE_FOOTER, + DocItemLabel.FOOTNOTE, +} + +PRED_HTML_EXPORT_LABELS = { + DocItemLabel.TITLE, + DocItemLabel.DOCUMENT_INDEX, + DocItemLabel.SECTION_HEADER, + DocItemLabel.PARAGRAPH, + DocItemLabel.TABLE, + DocItemLabel.PICTURE, + DocItemLabel.FORMULA, + DocItemLabel.CHECKBOX_UNSELECTED, + DocItemLabel.CHECKBOX_SELECTED, + DocItemLabel.TEXT, + DocItemLabel.LIST_ITEM, + DocItemLabel.CODE, + DocItemLabel.REFERENCE, + DocItemLabel.PAGE_HEADER, + DocItemLabel.PAGE_FOOTER, + DocItemLabel.FOOTNOTE, +} + + +class BasePredictionProvider: + def __init__(self, do_visualization: bool = False): + self.do_visualization = do_visualization + + @abstractmethod + def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: + pred_record = self.create_dataset_record_with_prediction( + record, + DoclingDocument(name="dummy"), + None, + ) + return pred_record + + @abstractmethod + def info(self) -> Dict: + return {} + + def visualize_results( + self, prediction_record: DatasetRecordWithPrediction, target_dataset_dir: Path + ): + if prediction_record.predicted_doc is not None: + save_comparison_html_with_clusters( + filename=target_dataset_dir + / "visualizations" + / f"{prediction_record.doc_id}.html", + true_doc=prediction_record.ground_truth_doc, + pred_doc=prediction_record.predicted_doc, + page_image=prediction_record.ground_truth_page_images[0], + true_labels=TRUE_HTML_EXPORT_LABELS, + pred_labels=PRED_HTML_EXPORT_LABELS, + draw_reading_order=True, + ) + + @property + @abstractmethod + def prediction_format(self) -> PredictionFormats: + pass + + def create_dataset_record_with_prediction( + self, + record: DatasetRecord, + predicted_doc: Optional[DoclingDocument] = None, + original_prediction: Optional[str] = None, + ): + pred_record = DatasetRecordWithPrediction.model_validate( + { + **record.as_record_dict(), + "predicted_doc": predicted_doc, + "original_prediction": original_prediction, + "prediction_format": self.prediction_format, + } + ) + pred_record.validate_images() # type: ignore + return pred_record + + def add_prediction(self, record: DatasetRecord) -> DatasetRecordWithPrediction: + # This might need customization depending on the input the dataset has. + # The default implementation assumes that there is an original file in binary format which is accepted. + input_data = copy.deepcopy(record.original) + + if not isinstance(input_data, DocumentStream): + if isinstance(input_data, Path): + input_data = DocumentStream( + name=input_data.name, stream=BytesIO(input_data.open("rb").read()) + ) + + record.original = input_data + pred_record = self.predict(record) + + return pred_record + + def create_prediction_dataset( + self, + name: str, + gt_dataset_dir: Path, + target_dataset_dir: Path, + split: str = "test", + ): + parquet_files = str(gt_dataset_dir / split / "*.parquet") + ds = load_dataset("parquet", data_files={split: parquet_files}) + # _log.info(f"oveview of dataset: {ds}") + if ds is not None: + ds_selection = ds[split] + + def _iterate_predictions(): + for i, data in tqdm( + enumerate(ds_selection), + desc="Creating predictions", + ncols=120, + total=len(ds_selection), + ): + record = DatasetRecord.model_validate(data) + pred_record = self.add_prediction(record) + + yield pred_record + + test_dir = target_dataset_dir / "test" + os.makedirs(test_dir, exist_ok=True) + + chunk_size = 80 + max_num_chunks = sys.maxsize + + count = 0 + chunk_count = 0 + for record_chunk in chunkify(_iterate_predictions(), chunk_size): + if self.do_visualization: + for r in record_chunk: + self.visualize_results(r, target_dataset_dir) + + record_chunk = [r.as_record_dict() for r in record_chunk] + + save_shard_to_disk( + items=record_chunk, dataset_path=test_dir, shard_id=chunk_count + ) + count += len(record_chunk) + chunk_count += 1 + + if chunk_count >= max_num_chunks: + break + + write_datasets_info( + name=name, + output_dir=target_dataset_dir, + num_train_rows=0, + num_test_rows=count, + ) diff --git a/docling_eval/prediction_providers/docling_provider.py b/docling_eval/prediction_providers/docling_provider.py new file mode 100644 index 00000000..dac1c396 --- /dev/null +++ b/docling_eval/prediction_providers/docling_provider.py @@ -0,0 +1,48 @@ +import copy +from typing import Dict, Optional + +from docling.datamodel.base_models import InputFormat +from docling.document_converter import DocumentConverter, FormatOption + +from docling_eval.datamodels.constants import PredictionFormats +from docling_eval.datamodels.dataset_record import ( + DatasetRecord, + DatasetRecordWithPrediction, +) +from docling_eval.prediction_providers.base_prediction_provider import ( + BasePredictionProvider, +) +from docling_eval.utils.utils import docling_version + + +class DoclingPredictionProvider(BasePredictionProvider): + def __init__( + self, + format_options: Optional[Dict[InputFormat, FormatOption]] = None, + do_visualization: bool = False, + ): + super().__init__(do_visualization=do_visualization) + self.doc_converter = DocumentConverter(format_options=format_options) + + @property + def prediction_format(self) -> PredictionFormats: + return PredictionFormats.DOCLING_DOCUMENT + + def predict( + self, + record: DatasetRecord, + ) -> DatasetRecordWithPrediction: + assert ( + record.original is not None + ), "stream must be given for docling prediction provider to work." + res = self.doc_converter.convert(copy.deepcopy(record.original)) + + pred_record = self.create_dataset_record_with_prediction( + record, + res.document, + None, + ) + return pred_record + + def info(self) -> Dict: + return {"asset": "Docling", "version": docling_version()} diff --git a/docling_eval/prediction_providers/file_provider.py b/docling_eval/prediction_providers/file_provider.py new file mode 100644 index 00000000..e0bf2404 --- /dev/null +++ b/docling_eval/prediction_providers/file_provider.py @@ -0,0 +1,137 @@ +from abc import abstractmethod +from pathlib import Path +from typing import Dict, Optional + +from docling_core.types import DoclingDocument +from docling_core.types.doc.document import DocTagsDocument, DocTagsPage +from PIL import Image + +from docling_eval.datamodels.constants import PredictionFormats +from docling_eval.datamodels.dataset_record import ( + DatasetRecord, + DatasetRecordWithPrediction, +) +from docling_eval.prediction_providers.base_prediction_provider import ( + BasePredictionProvider, +) + + +class FilePredictionProvider(BasePredictionProvider): + def __init__( + self, + prediction_format: PredictionFormats, + source_path: Path, + do_visualization: bool = False, + ignore_missing_files: Optional[bool] = False, + ): + super().__init__(do_visualization=do_visualization) + self._supported_prediction_formats = [ + PredictionFormats.DOCTAGS, + PredictionFormats.MARKDOWN, + PredictionFormats.JSON, + PredictionFormats.YAML, + ] + + # Read the input + self._prediction_format = prediction_format + self._prediction_source_path = source_path + self._ignore_missing_files = ignore_missing_files + + # Validate the prediction format + if self._prediction_format not in self._supported_prediction_formats: + msg = f"Unsupported file prediction format: {self._prediction_format}." + msg += f" The prediction format must be one of {self._supported_prediction_formats}" + raise RuntimeError(msg) + + # Validate if the source_path exists + if not self._prediction_source_path.is_dir(): + raise RuntimeError(f"Missing source path: {self._prediction_source_path}") + + @abstractmethod + def info(self) -> Dict: + return { + "supported_prediction_formats": self._supported_prediction_formats, + "prediction_format": self._prediction_format, + "source_path": self._prediction_source_path, + } + + @abstractmethod + def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: + doc_id = record.doc_id + raw = None + if self._prediction_format == PredictionFormats.DOCTAGS: + pred_doc = self._load_doctags_doc(doc_id) + elif self._prediction_format == PredictionFormats.MARKDOWN: + pred_doc = None + raw = self._load_md_raw(doc_id) + elif self._prediction_format == PredictionFormats.JSON: + pred_doc = self._load_json_doc(doc_id) + elif self._prediction_format == PredictionFormats.YAML: + pred_doc = self._load_yaml_doc(doc_id) + + pred_record = self.create_dataset_record_with_prediction( + record, + pred_doc, + raw, + ) + return pred_record + + @property + @abstractmethod + def prediction_format(self) -> PredictionFormats: + r""" """ + return self._prediction_format + + def _load_doctags_doc(self, doc_id: str) -> Optional[DoclingDocument]: + r"""Load doctags file into DoclingDocument""" + # Read the doctags file + doctags_fn = self._prediction_source_path / f"{doc_id}.dt" + if self._ignore_missing_files and not doctags_fn.is_file(): + return None + + with open(doctags_fn, "r") as fd: + doctags = fd.read() + + # Check if an optional page image is present + page_image_fn = self._prediction_source_path / f"{doc_id}.png" + page_image = None + if page_image_fn.is_file(): + page_image = Image.open(page_image_fn) + + # Build DoclingDocument + doctags_page = DocTagsPage(tokens=doctags, image=page_image) + doctags_doc = DocTagsDocument(pages=[doctags_page]) + doc = DoclingDocument(name=doc_id) + doc.load_from_doctags(doctags_doc) + + return doc + + def _load_json_doc(self, doc_id: str) -> Optional[DoclingDocument]: + r"""Load DoclingDocument from json""" + json_fn = self._prediction_source_path / f"{doc_id}.json" + if self._ignore_missing_files and not json_fn.is_file(): + return None + doc: DoclingDocument = DoclingDocument.load_from_json(json_fn) + return doc + + def _load_yaml_doc(self, doc_id: str) -> Optional[DoclingDocument]: + r"""Load DoclingDocument from yaml""" + yaml_fn = self._prediction_source_path / f"{doc_id}.yaml" + if not yaml_fn.is_file(): + # Try alternative yaml extension + yaml_fn = self._prediction_source_path / f"{doc_id}.yml" + if self._ignore_missing_files and not yaml_fn.is_file(): + return None + + doc: DoclingDocument = DoclingDocument.load_from_yaml(yaml_fn) + return doc + + def _load_md_raw(self, doc_id: str) -> Optional[str]: + r"""Load the markdown content""" + md_fn = self._prediction_source_path / f"{doc_id}.md" + if self._ignore_missing_files and not md_fn.is_file(): + return None + + with open(md_fn, "r") as fd: + md = fd.read() + return md diff --git a/docling_eval/prediction_providers/tableformer_provider.py b/docling_eval/prediction_providers/tableformer_provider.py new file mode 100644 index 00000000..f7021898 --- /dev/null +++ b/docling_eval/prediction_providers/tableformer_provider.py @@ -0,0 +1,59 @@ +import copy +from typing import Dict + +from docling.datamodel.pipeline_options import TableFormerMode +from docling_core.types.io import DocumentStream + +from docling_eval.converters.models.tableformer.tf_model_prediction import ( + TableFormerUpdater, +) +from docling_eval.datamodels.constants import PredictionFormats +from docling_eval.datamodels.dataset_record import ( + DatasetRecord, + DatasetRecordWithPrediction, +) +from docling_eval.prediction_providers.base_prediction_provider import ( + BasePredictionProvider, +) +from docling_eval.utils.utils import docling_models_version + + +class TableFormerPredictionProvider(BasePredictionProvider): + def __init__(self, do_visualization: bool = False): + super().__init__(do_visualization=do_visualization) + self.tf_updater = TableFormerUpdater(TableFormerMode.ACCURATE) + + @property + def prediction_format(self) -> PredictionFormats: + return PredictionFormats.DOCLING_DOCUMENT + + def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: + r""" """ + assert ( + record.ground_truth_doc is not None + ), "true_doc must be given for TableFormer prediction provider to work." + + if record.mime_type == "application/pdf": + assert isinstance(record.original, DocumentStream) + + updated, pred_doc = self.tf_updater.replace_tabledata( + copy.deepcopy(record.original.stream), record.ground_truth_doc + ) + elif record.mime_type == "image/png": + updated, pred_doc = self.tf_updater.replace_tabledata_with_page_tokens( + record.ground_truth_doc, + record.ground_truth_page_images, + ) + else: + raise RuntimeError( + "TableFormerPredictionProvider is missing data to predict on." + ) + pred_record = self.create_dataset_record_with_prediction( + record, + pred_doc, + None, + ) + return pred_record + + def info(self) -> Dict: + return {"asset": "TableFormer", "version": docling_models_version()} diff --git a/docling_eval_next/prediction_providers/__init__.py b/docling_eval/utils/__init__.py similarity index 100% rename from docling_eval_next/prediction_providers/__init__.py rename to docling_eval/utils/__init__.py diff --git a/docling_eval/benchmarks/utils.py b/docling_eval/utils/utils.py similarity index 99% rename from docling_eval/benchmarks/utils.py rename to docling_eval/utils/utils.py index 859a7390..738ea76a 100644 --- a/docling_eval/benchmarks/utils.py +++ b/docling_eval/utils/utils.py @@ -14,7 +14,6 @@ from datasets import Dataset, Features from datasets import Image as Features_Image from datasets import Sequence, Value -from docling.backend.docling_parse_v2_backend import DoclingParseV2DocumentBackend from docling.backend.docling_parse_v4_backend import DoclingParseV4DocumentBackend from docling.datamodel.base_models import InputFormat, Page from docling.datamodel.document import InputDocument @@ -31,7 +30,7 @@ from PIL import Image from pydantic import AnyUrl -from docling_eval.benchmarks.constants import BenchMarkColumns +from docling_eval.datamodels.constants import BenchMarkColumns def get_binhash(binary_data: bytes) -> str: diff --git a/docling_eval/visualisation/visualisations.py b/docling_eval/visualisation/visualisations.py index f593a5a0..de56eb9c 100644 --- a/docling_eval/visualisation/visualisations.py +++ b/docling_eval/visualisation/visualisations.py @@ -9,7 +9,7 @@ from docling_core.types.doc.labels import DocItemLabel from PIL import Image, ImageDraw, ImageFont -from docling_eval.benchmarks.utils import from_pil_to_base64 +from docling_eval.utils.utils import from_pil_to_base64 from docling_eval.visualisation.constants import ( HTML_COMPARISON_PAGE, HTML_COMPARISON_PAGE_WITH_CLUSTERS, diff --git a/docling_eval_next/prediction_providers/prediction_provider.py b/docling_eval_next/prediction_providers/prediction_provider.py deleted file mode 100644 index 1987136a..00000000 --- a/docling_eval_next/prediction_providers/prediction_provider.py +++ /dev/null @@ -1,402 +0,0 @@ -import copy -import json -import os -import sys -from abc import abstractmethod -from io import BytesIO -from pathlib import Path -from typing import Dict, List, Optional, Tuple - -from datasets import load_dataset -from docling.datamodel.pipeline_options import TableFormerMode -from docling.document_converter import DocumentConverter, FormatOption, InputFormat -from docling.utils.utils import chunkify -from docling_core.types import DoclingDocument -from docling_core.types.doc import DocItemLabel -from docling_core.types.doc.document import ( - DoclingDocument, - DocTagsDocument, - DocTagsPage, -) -from docling_core.types.io import DocumentStream -from PIL import Image -from tqdm import tqdm - -from docling_eval.benchmarks.constants import PredictionFormats -from docling_eval.benchmarks.utils import ( - docling_models_version, - docling_version, - save_shard_to_disk, - write_datasets_info, -) -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - PageToken, - TableFormerUpdater, -) -from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters -from docling_eval_next.datamodels.dataset_record import ( - DatasetRecord, - DatasetRecordWithPrediction, -) - -TRUE_HTML_EXPORT_LABELS = { - DocItemLabel.TITLE, - DocItemLabel.DOCUMENT_INDEX, - DocItemLabel.SECTION_HEADER, - DocItemLabel.PARAGRAPH, - DocItemLabel.TABLE, - DocItemLabel.PICTURE, - DocItemLabel.FORMULA, - DocItemLabel.CHECKBOX_UNSELECTED, - DocItemLabel.CHECKBOX_SELECTED, - DocItemLabel.TEXT, - DocItemLabel.LIST_ITEM, - DocItemLabel.CODE, - DocItemLabel.REFERENCE, - DocItemLabel.CAPTION, - DocItemLabel.PAGE_HEADER, - DocItemLabel.PAGE_FOOTER, - DocItemLabel.FOOTNOTE, -} - -PRED_HTML_EXPORT_LABELS = { - DocItemLabel.TITLE, - DocItemLabel.DOCUMENT_INDEX, - DocItemLabel.SECTION_HEADER, - DocItemLabel.PARAGRAPH, - DocItemLabel.TABLE, - DocItemLabel.PICTURE, - DocItemLabel.FORMULA, - DocItemLabel.CHECKBOX_UNSELECTED, - DocItemLabel.CHECKBOX_SELECTED, - DocItemLabel.TEXT, - DocItemLabel.LIST_ITEM, - DocItemLabel.CODE, - DocItemLabel.REFERENCE, - DocItemLabel.PAGE_HEADER, - DocItemLabel.PAGE_FOOTER, - DocItemLabel.FOOTNOTE, -} - - -class BasePredictionProvider: - def __init__(self, do_visualization: bool = False): - self.do_visualization = do_visualization - - @abstractmethod - def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: - pred_record = self.create_dataset_record_with_prediction( - record, - DoclingDocument(name="dummy"), - None, - ) - return pred_record - - @abstractmethod - def info(self) -> Dict: - return {} - - def visualize_results( - self, prediction_record: DatasetRecordWithPrediction, target_dataset_dir: Path - ): - if prediction_record.predicted_doc is not None: - save_comparison_html_with_clusters( - filename=target_dataset_dir - / "visualizations" - / f"{prediction_record.doc_id}.html", - true_doc=prediction_record.ground_truth_doc, - pred_doc=prediction_record.predicted_doc, - page_image=prediction_record.ground_truth_page_images[0], - true_labels=TRUE_HTML_EXPORT_LABELS, - pred_labels=PRED_HTML_EXPORT_LABELS, - draw_reading_order=True, - ) - - @property - @abstractmethod - def prediction_format(self) -> PredictionFormats: - pass - - def create_dataset_record_with_prediction( - self, - record: DatasetRecord, - predicted_doc: Optional[DoclingDocument] = None, - original_prediction: Optional[str] = None, - ): - pred_record = DatasetRecordWithPrediction.model_validate( - { - **record.as_record_dict(), - "predicted_doc": predicted_doc, - "original_prediction": original_prediction, - "prediction_format": self.prediction_format, - } - ) - pred_record.validate_images() # type: ignore - return pred_record - - def add_prediction(self, record: DatasetRecord) -> DatasetRecordWithPrediction: - # This might need customization depending on the input the dataset has. - # The default implementation assumes that there is an original file in binary format which is accepted. - input_data = copy.deepcopy(record.original) - - if not isinstance(input_data, DocumentStream): - if isinstance(input_data, Path): - input_data = DocumentStream( - name=input_data.name, stream=BytesIO(input_data.open("rb").read()) - ) - - record.original = input_data - pred_record = self.predict(record) - - return pred_record - - def create_prediction_dataset( - self, - name: str, - gt_dataset_dir: Path, - target_dataset_dir: Path, - split: str = "test", - ): - parquet_files = str(gt_dataset_dir / split / "*.parquet") - ds = load_dataset("parquet", data_files={split: parquet_files}) - # _log.info(f"oveview of dataset: {ds}") - if ds is not None: - ds_selection = ds[split] - - def _iterate_predictions(): - for i, data in tqdm( - enumerate(ds_selection), - desc="Creating predictions", - ncols=120, - total=len(ds_selection), - ): - record = DatasetRecord.model_validate(data) - pred_record = self.add_prediction(record) - - yield pred_record - - test_dir = target_dataset_dir / "test" - os.makedirs(test_dir, exist_ok=True) - - chunk_size = 80 - max_num_chunks = sys.maxsize - - count = 0 - chunk_count = 0 - for record_chunk in chunkify(_iterate_predictions(), chunk_size): - if self.do_visualization: - for r in record_chunk: - self.visualize_results(r, target_dataset_dir) - - record_chunk = [r.as_record_dict() for r in record_chunk] - - save_shard_to_disk( - items=record_chunk, dataset_path=test_dir, shard_id=chunk_count - ) - count += len(record_chunk) - chunk_count += 1 - - if chunk_count >= max_num_chunks: - break - - write_datasets_info( - name=name, - output_dir=target_dataset_dir, - num_train_rows=0, - num_test_rows=count, - ) - - -class DoclingPredictionProvider(BasePredictionProvider): - def __init__( - self, - format_options: Optional[Dict[InputFormat, FormatOption]] = None, - do_visualization: bool = False, - ): - super().__init__(do_visualization=do_visualization) - self.doc_converter = DocumentConverter(format_options=format_options) - - @property - def prediction_format(self) -> PredictionFormats: - return PredictionFormats.DOCLING_DOCUMENT - - def predict( - self, - record: DatasetRecord, - ) -> DatasetRecordWithPrediction: - assert ( - record.original is not None - ), "stream must be given for docling prediction provider to work." - res = self.doc_converter.convert(copy.deepcopy(record.original)) - - pred_record = self.create_dataset_record_with_prediction( - record, - res.document, - None, - ) - return pred_record - - def info(self) -> Dict: - return {"asset": "Docling", "version": docling_version()} - - -class TableFormerPredictionProvider(BasePredictionProvider): - def __init__(self, do_visualization: bool = False): - super().__init__(do_visualization=do_visualization) - self.tf_updater = TableFormerUpdater(TableFormerMode.ACCURATE) - - @property - def prediction_format(self) -> PredictionFormats: - return PredictionFormats.DOCLING_DOCUMENT - - def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: - r""" """ - assert ( - record.ground_truth_doc is not None - ), "true_doc must be given for TableFormer prediction provider to work." - - if record.mime_type == "application/pdf": - assert isinstance(record.original, DocumentStream) - - updated, pred_doc = self.tf_updater.replace_tabledata( - copy.deepcopy(record.original.stream), record.ground_truth_doc - ) - elif record.mime_type == "image/png": - updated, pred_doc = self.tf_updater.replace_tabledata_with_page_tokens( - record.ground_truth_doc, - record.ground_truth_page_images, - ) - else: - raise RuntimeError( - "TableFormerPredictionProvider is missing data to predict on." - ) - pred_record = self.create_dataset_record_with_prediction( - record, - pred_doc, - None, - ) - return pred_record - - def info(self) -> Dict: - return {"asset": "TableFormer", "version": docling_models_version()} - - -class FilePredictionProvider(BasePredictionProvider): - def __init__( - self, - prediction_format: PredictionFormats, - source_path: Path, - do_visualization: bool = False, - ignore_missing_files: Optional[bool] = False, - ): - super().__init__(do_visualization=do_visualization) - self._supported_prediction_formats = [ - PredictionFormats.DOCTAGS, - PredictionFormats.MARKDOWN, - PredictionFormats.JSON, - PredictionFormats.YAML, - ] - - # Read the input - self._prediction_format = prediction_format - self._prediction_source_path = source_path - self._ignore_missing_files = ignore_missing_files - - # Validate the prediction format - if self._prediction_format not in self._supported_prediction_formats: - msg = f"Unsupported file prediction format: {self._prediction_format}." - msg += f" The prediction format must be one of {self._supported_prediction_formats}" - raise RuntimeError(msg) - - # Validate if the source_path exists - if not self._prediction_source_path.is_dir(): - raise RuntimeError(f"Missing source path: {self._prediction_source_path}") - - @abstractmethod - def info(self) -> Dict: - return { - "supported_prediction_formats": self._supported_prediction_formats, - "prediction_format": self._prediction_format, - "source_path": self._prediction_source_path, - } - - @abstractmethod - def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: - doc_id = record.doc_id - raw = None - if self._prediction_format == PredictionFormats.DOCTAGS: - pred_doc = self._load_doctags_doc(doc_id) - elif self._prediction_format == PredictionFormats.MARKDOWN: - pred_doc = None - raw = self._load_md_raw(doc_id) - elif self._prediction_format == PredictionFormats.JSON: - pred_doc = self._load_json_doc(doc_id) - elif self._prediction_format == PredictionFormats.YAML: - pred_doc = self._load_yaml_doc(doc_id) - - pred_record = self.create_dataset_record_with_prediction( - record, - pred_doc, - raw, - ) - return pred_record - - @property - @abstractmethod - def prediction_format(self) -> PredictionFormats: - r""" """ - return self._prediction_format - - def _load_doctags_doc(self, doc_id: str) -> Optional[DoclingDocument]: - r"""Load doctags file into DoclingDocument""" - # Read the doctags file - doctags_fn = self._prediction_source_path / f"{doc_id}.dt" - if self._ignore_missing_files and not doctags_fn.is_file(): - return None - - with open(doctags_fn, "r") as fd: - doctags = fd.read() - - # Check if an optional page image is present - page_image_fn = self._prediction_source_path / f"{doc_id}.png" - page_image = None - if page_image_fn.is_file(): - page_image = Image.open(page_image_fn) - - # Build DoclingDocument - doctags_page = DocTagsPage(tokens=doctags, image=page_image) - doctags_doc = DocTagsDocument(pages=[doctags_page]) - doc = DoclingDocument(name=doc_id) - doc.load_from_doctags(doctags_doc) - - return doc - - def _load_json_doc(self, doc_id: str) -> Optional[DoclingDocument]: - r"""Load DoclingDocument from json""" - json_fn = self._prediction_source_path / f"{doc_id}.json" - if self._ignore_missing_files and not json_fn.is_file(): - return None - doc: DoclingDocument = DoclingDocument.load_from_json(json_fn) - return doc - - def _load_yaml_doc(self, doc_id: str) -> Optional[DoclingDocument]: - r"""Load DoclingDocument from yaml""" - yaml_fn = self._prediction_source_path / f"{doc_id}.yaml" - if not yaml_fn.is_file(): - # Try alternative yaml extension - yaml_fn = self._prediction_source_path / f"{doc_id}.yml" - if self._ignore_missing_files and not yaml_fn.is_file(): - return None - - doc: DoclingDocument = DoclingDocument.load_from_yaml(yaml_fn) - return doc - - def _load_md_raw(self, doc_id: str) -> Optional[str]: - r"""Load the markdown content""" - md_fn = self._prediction_source_path / f"{doc_id}.md" - if self._ignore_missing_files and not md_fn.is_file(): - return None - - with open(md_fn, "r") as fd: - md = fd.read() - return md diff --git a/docs/CVAT_create_groundtruth.md b/docs/CVAT_create_groundtruth.md index b4030554..8e63409e 100644 --- a/docs/CVAT_create_groundtruth.md +++ b/docs/CVAT_create_groundtruth.md @@ -13,7 +13,7 @@ poetry run python docs/examples/benchmark_dpbench.py Another way is to create it from PDF or PNG files. In this case, simply run the following scripts, ```sh -poetry run python ./docling_eval/benchmarks/cvat_annotation/create_dataset_from_pdfs.py -h +poetry run python ./docling_eval/legacy/cvat_annotation/create_dataset_from_pdfs.py -h usage: create_dataset_from_pdfs.py [-h] -i INPUT_DIR -o OUTPUT_DIR -b BUCKET_SIZE Process input and output directories and a pre-annotation file. @@ -33,7 +33,7 @@ options: Once you have run the Prerequisites, you can create the files you need to upload to [CVAT](https://www.cvat.ai/). These files will be created using the `preannotate.py` script, ```sh -poetry run python docling_eval/benchmarks/cvat_annotation/preannotate.py -h +poetry run python docling_eval/legacy/cvat_annotation/preannotate.py -h usage: preannotate.py [-h] -i INPUT_DIR -o OUTPUT_DIR -b BUCKET_SIZE Process input and output directories and a pre-annotation file. @@ -51,7 +51,7 @@ options: In essence, this will read the parquet files and set up a new directory structure (designated output) that has the following layout, ```sh -./benchmarks/ +./legacy/ ├── cvat_annotations │   ├── xmls │   └── zips @@ -136,7 +136,7 @@ After you have annotated all images, you can export the annotations, You move the zip file into `cvat_annotations/zips` and then run the create script, ```sh -poetry run python docling_eval/benchmarks/cvat_annotation/create.py -h +poetry run python docling_eval/legacy/cvat_annotation/create.py -h usage: create.py [-h] -i INPUT_DIR Create new evaluation dataset using CVAT annotation files. diff --git a/docs/PubTabNet_benchmarks.md b/docs/PubTabNet_benchmarks.md index ba739cf8..171a0328 100644 --- a/docs/PubTabNet_benchmarks.md +++ b/docs/PubTabNet_benchmarks.md @@ -15,8 +15,8 @@ poetry run evaluate \ -t evaluate \ -m tableformer \ -b PubTabNet \ - -i benchmarks/PubTabNet-dataset/tableformer \ - -o benchmarks/PubTabNet-dataset/tableformer + -i legacy/PubTabNet-dataset/tableformer \ + -o legacy/PubTabNet-dataset/tableformer ``` [Tableformer evaluation json](evaluations/PubTabNet/evaluation_PubTabNet_tableformer.json) @@ -28,8 +28,8 @@ poetry run evaluate \ -t visualize \ -m tableformer \ -b PubTabNet \ - -i benchmarks/PubTabNet-dataset/tableformer \ - -o benchmarks/PubTabNet-dataset/tableformer + -i legacy/PubTabNet-dataset/tableformer \ + -o legacy/PubTabNet-dataset/tableformer ``` ![TEDS plot](evaluations/PubTabNet/evaluation_PubTabNet_tableformer-delta_row_col.png) diff --git a/docs/examples/benchmark_doclaynet_v1.py b/docs/examples/benchmark_doclaynet_v1.py index 23a00d0d..64cc64eb 100644 --- a/docs/examples/benchmark_doclaynet_v1.py +++ b/docs/examples/benchmark_doclaynet_v1.py @@ -2,9 +2,9 @@ import os from pathlib import Path -from docling_eval.benchmarks.constants import BenchMarkNames, EvaluationModality -from docling_eval.benchmarks.doclaynet_v1.create import create_dlnv1_e2e_dataset from docling_eval.cli.main import evaluate, visualise +from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.legacy.doclaynet_v1.create import create_dlnv1_e2e_dataset # Configure logging logging.basicConfig( diff --git a/docs/examples/benchmark_doclaynet_v2.py b/docs/examples/benchmark_doclaynet_v2.py index c197b57e..cd0f3749 100644 --- a/docs/examples/benchmark_doclaynet_v2.py +++ b/docs/examples/benchmark_doclaynet_v2.py @@ -2,16 +2,11 @@ import os from pathlib import Path -from huggingface_hub import snapshot_download from tabulate import tabulate # type: ignore -from docling_eval.benchmarks.constants import BenchMarkNames, EvaluationModality -from docling_eval.benchmarks.doclaynet_v2.create import create_dlnv2_e2e_dataset -from docling_eval.benchmarks.dpbench.create import ( - create_dpbench_e2e_dataset, - create_dpbench_tableformer_dataset, -) from docling_eval.cli.main import evaluate, visualise +from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.legacy.doclaynet_v2.create import create_dlnv2_e2e_dataset # Configure logging logging.basicConfig( diff --git a/docs/examples/benchmark_dpbench.py b/docs/examples/benchmark_dpbench.py index 4d602513..e7d3050b 100644 --- a/docs/examples/benchmark_dpbench.py +++ b/docs/examples/benchmark_dpbench.py @@ -4,12 +4,12 @@ from huggingface_hub import snapshot_download -from docling_eval.benchmarks.constants import BenchMarkNames, EvaluationModality -from docling_eval.benchmarks.dpbench.create import ( +from docling_eval.cli.main import evaluate, visualise +from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.legacy.dpbench.create import ( create_dpbench_e2e_dataset, create_dpbench_tableformer_dataset, ) -from docling_eval.cli.main import evaluate, visualise # Configure logging logging.basicConfig( diff --git a/docs/examples/benchmark_omnidocbench.py b/docs/examples/benchmark_omnidocbench.py index 76a41dec..007576a3 100644 --- a/docs/examples/benchmark_omnidocbench.py +++ b/docs/examples/benchmark_omnidocbench.py @@ -4,12 +4,12 @@ from huggingface_hub import snapshot_download -from docling_eval.benchmarks.constants import BenchMarkNames, EvaluationModality -from docling_eval.benchmarks.omnidocbench.create import ( +from docling_eval.cli.main import evaluate, visualise +from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.legacy.omnidocbench.create import ( create_omnidocbench_e2e_dataset, create_omnidocbench_tableformer_dataset, ) -from docling_eval.cli.main import evaluate, visualise # Configure logging logging.basicConfig( diff --git a/docs/examples/benchmark_tableformer_fintabnet.py b/docs/examples/benchmark_tableformer_fintabnet.py index 69836456..70008e07 100644 --- a/docs/examples/benchmark_tableformer_fintabnet.py +++ b/docs/examples/benchmark_tableformer_fintabnet.py @@ -2,11 +2,11 @@ import os from pathlib import Path -from docling_eval.benchmarks.constants import BenchMarkNames, EvaluationModality -from docling_eval.benchmarks.tableformer_huggingface_otsl.create import ( +from docling_eval.cli.main import evaluate, visualise +from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.legacy.tableformer_huggingface_otsl.create import ( create_fintabnet_tableformer_dataset, ) -from docling_eval.cli.main import evaluate, visualise # Configure logging logging.basicConfig( diff --git a/docs/examples/benchmark_tableformer_p1m.py b/docs/examples/benchmark_tableformer_p1m.py index a37e69a0..9f0ba6a9 100644 --- a/docs/examples/benchmark_tableformer_p1m.py +++ b/docs/examples/benchmark_tableformer_p1m.py @@ -2,11 +2,11 @@ import os from pathlib import Path -from docling_eval.benchmarks.constants import BenchMarkNames, EvaluationModality -from docling_eval.benchmarks.tableformer_huggingface_otsl.create import ( +from docling_eval.cli.main import evaluate, visualise +from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.legacy.tableformer_huggingface_otsl.create import ( create_p1m_tableformer_dataset, ) -from docling_eval.cli.main import evaluate, visualise # Configure logging logging.basicConfig( diff --git a/docs/examples/benchmark_tableformer_pubtabnet.py b/docs/examples/benchmark_tableformer_pubtabnet.py index fe756c8b..2f4810c5 100644 --- a/docs/examples/benchmark_tableformer_pubtabnet.py +++ b/docs/examples/benchmark_tableformer_pubtabnet.py @@ -2,11 +2,11 @@ import os from pathlib import Path -from docling_eval.benchmarks.constants import BenchMarkNames, EvaluationModality -from docling_eval.benchmarks.tableformer_huggingface_otsl.create import ( +from docling_eval.cli.main import evaluate, visualise +from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.legacy.tableformer_huggingface_otsl.create import ( create_pubtabnet_tableformer_dataset, ) -from docling_eval.cli.main import evaluate, visualise # Configure logging logging.basicConfig( diff --git a/docs/examples/create_funsd.py b/docs/examples/create_funsd.py index 39036991..69b506b4 100644 --- a/docs/examples/create_funsd.py +++ b/docs/examples/create_funsd.py @@ -2,8 +2,8 @@ import os from pathlib import Path -from docling_eval.benchmarks.constants import BenchMarkNames -from docling_eval.benchmarks.funsd.create import create_funsd_dataset +from docling_eval.datamodels.constants import BenchMarkNames +from docling_eval.legacy.funsd.create import create_funsd_dataset # Configure logging logging.basicConfig( diff --git a/docs/examples/create_xfund.py b/docs/examples/create_xfund.py index c0d9c1f6..2eade602 100644 --- a/docs/examples/create_xfund.py +++ b/docs/examples/create_xfund.py @@ -2,8 +2,8 @@ import os from pathlib import Path -from docling_eval.benchmarks.constants import BenchMarkNames -from docling_eval.benchmarks.xfund.create import create_xfund_dataset +from docling_eval.datamodels.constants import BenchMarkNames +from docling_eval.legacy.xfund.create import create_xfund_dataset # Configure logging logging.basicConfig( diff --git a/docs/examples/package_pdfs.py b/docs/examples/package_pdfs.py index 435b05e1..daa58117 100644 --- a/docs/examples/package_pdfs.py +++ b/docs/examples/package_pdfs.py @@ -8,14 +8,14 @@ from docling_core.types.doc.labels import DocItemLabel from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import BenchMarkColumns -from docling_eval.benchmarks.utils import ( +from docling_eval.converters.conversion import create_pdf_docling_converter +from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.utils.utils import ( docling_version, from_pil_to_base64, get_binary, save_shard_to_disk, ) -from docling_eval.converters.conversion import create_pdf_docling_converter from docling_eval.visualisation.constants import HTML_INSPECTION from docling_eval.visualisation.visualisations import draw_clusters_with_reading_order diff --git a/docs/examples/package_pngs.py b/docs/examples/package_pngs.py index 5d29f299..990bf9f7 100644 --- a/docs/examples/package_pngs.py +++ b/docs/examples/package_pngs.py @@ -9,15 +9,15 @@ from docling_core.types.doc.labels import DocItemLabel from tqdm import tqdm # type: ignore -from docling_eval.benchmarks.constants import BenchMarkColumns -from docling_eval.benchmarks.utils import ( +from docling_eval.converters.conversion import create_image_docling_converter +from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.utils.utils import ( docling_version, extract_images, from_pil_to_base64, get_binary, save_shard_to_disk, ) -from docling_eval.converters.conversion import create_image_docling_converter from docling_eval.visualisation.constants import HTML_INSPECTION from docling_eval.visualisation.visualisations import draw_clusters_with_reading_order diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index e5da37a4..35979c63 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -11,32 +11,28 @@ from docling.document_converter import PdfFormatOption from docling.models.factories import get_ocr_factory -from docling_eval.benchmarks.constants import ( +from docling_eval.cli.main import evaluate +from docling_eval.datamodels.constants import ( BenchMarkNames, EvaluationModality, PredictionFormats, ) -from docling_eval.cli.main import evaluate -from docling_eval_next.dataset_builders.doclaynet_v1_builder import ( - DocLayNetV1DatasetBuilder, -) -from docling_eval_next.dataset_builders.doclaynet_v2_builder import ( - DocLayNetV2DatasetBuilder, -) -from docling_eval_next.dataset_builders.dpbench_builder import DPBenchDatasetBuilder -from docling_eval_next.dataset_builders.funsd_builder import FUNSDDatasetBuilder -from docling_eval_next.dataset_builders.omnidocbench_builder import ( +from docling_eval.dataset_builders.doclaynet_v1_builder import DocLayNetV1DatasetBuilder +from docling_eval.dataset_builders.doclaynet_v2_builder import DocLayNetV2DatasetBuilder +from docling_eval.dataset_builders.dpbench_builder import DPBenchDatasetBuilder +from docling_eval.dataset_builders.funsd_builder import FUNSDDatasetBuilder +from docling_eval.dataset_builders.omnidocbench_builder import ( OmniDocBenchDatasetBuilder, ) -from docling_eval_next.dataset_builders.otsl_table_dataset_builder import ( +from docling_eval.dataset_builders.otsl_table_dataset_builder import ( FintabNetDatasetBuilder, PubTables1MDatasetBuilder, PubTabNetDatasetBuilder, ) -from docling_eval_next.dataset_builders.xfund_builder import XFUNDDatasetBuilder -from docling_eval_next.prediction_providers.prediction_provider import ( - DoclingPredictionProvider, - FilePredictionProvider, +from docling_eval.dataset_builders.xfund_builder import XFUNDDatasetBuilder +from docling_eval.prediction_providers.docling_provider import DoclingPredictionProvider +from docling_eval.prediction_providers.file_provider import FilePredictionProvider +from docling_eval.prediction_providers.tableformer_provider import ( TableFormerPredictionProvider, ) @@ -110,6 +106,7 @@ def test_run_doclaynet_with_doctags_fileprovider(): prediction_format=PredictionFormats.DOCTAGS, source_path=Path("./tests/data/doclaynet_v1_doctags_sample"), do_visualization=True, + ignore_missing_files=True, ) dataset_layout = DocLayNetV1DatasetBuilder( From 75b3b4f4a0c595634a562b9d5dae6e1277d16d2a Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Wed, 26 Mar 2025 15:26:48 +0100 Subject: [PATCH 38/81] Fixes Signed-off-by: Christoph Auer --- .../prediction_providers/base_prediction_provider.py | 8 +++++++- docling_eval/prediction_providers/docling_provider.py | 5 +++-- docling_eval/prediction_providers/file_provider.py | 7 +++++++ docling_eval/prediction_providers/tableformer_provider.py | 8 ++++++++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/docling_eval/prediction_providers/base_prediction_provider.py b/docling_eval/prediction_providers/base_prediction_provider.py index 759be7e6..3ae7967f 100644 --- a/docling_eval/prediction_providers/base_prediction_provider.py +++ b/docling_eval/prediction_providers/base_prediction_provider.py @@ -62,8 +62,11 @@ class BasePredictionProvider: - def __init__(self, do_visualization: bool = False): + def __init__( + self, do_visualization: bool = False, ignore_missing_predictions: bool = True + ): self.do_visualization = do_visualization + self.ignore_missing_predictions = ignore_missing_predictions @abstractmethod def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: @@ -155,6 +158,9 @@ def _iterate_predictions(): record = DatasetRecord.model_validate(data) pred_record = self.add_prediction(record) + if self.ignore_missing_predictions: + continue + yield pred_record test_dir = target_dataset_dir / "test" diff --git a/docling_eval/prediction_providers/docling_provider.py b/docling_eval/prediction_providers/docling_provider.py index dac1c396..9bb265b8 100644 --- a/docling_eval/prediction_providers/docling_provider.py +++ b/docling_eval/prediction_providers/docling_provider.py @@ -1,7 +1,7 @@ import copy from typing import Dict, Optional -from docling.datamodel.base_models import InputFormat +from docling.datamodel.base_models import ConversionStatus, InputFormat from docling.document_converter import DocumentConverter, FormatOption from docling_eval.datamodels.constants import PredictionFormats @@ -36,12 +36,13 @@ def predict( record.original is not None ), "stream must be given for docling prediction provider to work." res = self.doc_converter.convert(copy.deepcopy(record.original)) - pred_record = self.create_dataset_record_with_prediction( record, res.document, None, ) + pred_record.status = res.status + return pred_record def info(self) -> Dict: diff --git a/docling_eval/prediction_providers/file_provider.py b/docling_eval/prediction_providers/file_provider.py index e0bf2404..aa679afd 100644 --- a/docling_eval/prediction_providers/file_provider.py +++ b/docling_eval/prediction_providers/file_provider.py @@ -2,6 +2,7 @@ from pathlib import Path from typing import Dict, Optional +from docling.datamodel.base_models import ConversionStatus from docling_core.types import DoclingDocument from docling_core.types.doc.document import DocTagsDocument, DocTagsPage from PIL import Image @@ -69,11 +70,17 @@ def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: elif self._prediction_format == PredictionFormats.YAML: pred_doc = self._load_yaml_doc(doc_id) + if pred_doc is None: + status = ConversionStatus.FAILURE + else: + status = ConversionStatus.SUCCESS + pred_record = self.create_dataset_record_with_prediction( record, pred_doc, raw, ) + pred_record.status = status return pred_record @property diff --git a/docling_eval/prediction_providers/tableformer_provider.py b/docling_eval/prediction_providers/tableformer_provider.py index f7021898..56802752 100644 --- a/docling_eval/prediction_providers/tableformer_provider.py +++ b/docling_eval/prediction_providers/tableformer_provider.py @@ -1,6 +1,7 @@ import copy from typing import Dict +from docling.datamodel.base_models import ConversionStatus from docling.datamodel.pipeline_options import TableFormerMode from docling_core.types.io import DocumentStream @@ -48,11 +49,18 @@ def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: raise RuntimeError( "TableFormerPredictionProvider is missing data to predict on." ) + + if updated is False: + status = ConversionStatus.FAILURE + else: + status = ConversionStatus.SUCCESS + pred_record = self.create_dataset_record_with_prediction( record, pred_doc, None, ) + pred_record.status = status return pred_record def info(self) -> Dict: From 509ccad367717e2ef21b97e5478febe10087aca7 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Wed, 26 Mar 2025 16:29:23 +0100 Subject: [PATCH 39/81] Cleanup, change path handling Signed-off-by: Christoph Auer --- docling_eval/cli/main.py | 2 + .../dataset_builders/dataset_builder.py | 28 +--- .../dataset_builders/doclaynet_v1_builder.py | 11 +- .../dataset_builders/doclaynet_v2_builder.py | 9 +- .../dataset_builders/dpbench_builder.py | 29 +--- .../dataset_builders/funsd_builder.py | 9 +- .../dataset_builders/omnidocbench_builder.py | 16 +-- .../otsl_table_dataset_builder.py | 2 +- .../dataset_builders/xfund_builder.py | 12 +- .../base_prediction_provider.py | 11 +- tests/test_dataset_builder.py | 126 +++++++++--------- 11 files changed, 89 insertions(+), 166 deletions(-) diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py index 37789b5c..82741978 100644 --- a/docling_eval/cli/main.py +++ b/docling_eval/cli/main.py @@ -261,6 +261,8 @@ def evaluate( if not os.path.exists(idir): _log.error(f"Benchmark directory not found: {idir}") + os.makedirs(odir, exist_ok=True) + # Save the evaluation save_fn = odir / f"evaluation_{benchmark.value}_{modality.value}.json" diff --git a/docling_eval/dataset_builders/dataset_builder.py b/docling_eval/dataset_builders/dataset_builder.py index 7fcd6856..a984a23d 100644 --- a/docling_eval/dataset_builders/dataset_builder.py +++ b/docling_eval/dataset_builders/dataset_builder.py @@ -28,16 +28,15 @@ def __init__( self, name: str, dataset_source: Union[HFSource, S3Source, Path], - # prediction_provider: BasePredictionProvider, target: Path, + split: str = "test", ): self.name = name self.target: Path = target - # self.prediction_provider = prediction_provider - self.dataset_source = dataset_source + self.dataset_source = dataset_source self.dataset_local_path: Optional[Path] = None # TBD - + self.split = split self.retrieved = False def retrieve_input_dataset(self) -> Path: @@ -74,32 +73,13 @@ def retrieve_input_dataset(self) -> Path: def iterate(self) -> Iterable[DatasetRecord]: pass - # def update_prediction(self, record: DatasetRecord): - # # This might need customization depending on the input the dataset has. - # # The default implementation assumes that there is an original file in binary format which is accepted. - # input_data = record.original - # - # if not isinstance(input_data, DocumentStream): - # if isinstance(input_data, Path): - # input_data = DocumentStream( - # name=input_data.name, stream=BytesIO(input_data.open("rb").read()) - # ) - # - # pred_doc = self.prediction_provider.predict( - # record.ground_truth_doc, stream=input_data - # ) - # - # record.predicted_doc = pred_doc - # - # record.validate_model() # type: ignore - def save_to_disk(self, chunk_size: int = 80, max_num_chunks: int = sys.maxsize): if not self.retrieved: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." ) - test_dir = self.target / "test" + test_dir = self.target / self.split os.makedirs(test_dir, exist_ok=True) count = 0 diff --git a/docling_eval/dataset_builders/doclaynet_v1_builder.py b/docling_eval/dataset_builders/doclaynet_v1_builder.py index 9460468a..d5d99101 100644 --- a/docling_eval/dataset_builders/doclaynet_v1_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v1_builder.py @@ -115,19 +115,17 @@ def __init__( self, # prediction_provider: BasePredictionProvider, target: Path, - do_visualization: bool = True, split: str = "test", begin_index: int = 0, end_index: int = -1, ): super().__init__( - name="DocLayNetV1: end-to-end", + name="DocLayNetV1", dataset_source=HFSource(repo_id="ds4sd/DocLayNet-v1.2"), # prediction_provider=prediction_provider, target=target, + split=split, ) - self.do_visualization = do_visualization - self.split = split self.begin_index = begin_index self.end_index = end_index self.blacklisted_ids = set(BLACKLISTED_DOC_IDS) @@ -244,11 +242,6 @@ def iterate(self) -> Iterable[DatasetRecord]: "You must first retrieve the source dataset. Call retrieve_input_dataset()." ) - # Create visualization directory if needed - if self.do_visualization: - viz_dir = self.target / "visualizations" - os.makedirs(viz_dir, exist_ok=True) - assert self.dataset_local_path is not None # Load dataset from the retrieved path diff --git a/docling_eval/dataset_builders/doclaynet_v2_builder.py b/docling_eval/dataset_builders/doclaynet_v2_builder.py index a9bed56d..95d7c5dc 100644 --- a/docling_eval/dataset_builders/doclaynet_v2_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v2_builder.py @@ -50,7 +50,6 @@ def __init__( dataset_path: Path, # prediction_provider: BasePredictionProvider, target: Path, - do_visualization: bool = True, split: str = "test", max_items: int = -1, ): @@ -69,9 +68,8 @@ def __init__( dataset_source=dataset_path, # Local Path to dataset # prediction_provider=prediction_provider, target=target, + split=split, ) - self.do_visualization = do_visualization - self.split = split self.max_items = max_items def extract_tokens_and_text(self, s: str): @@ -579,11 +577,6 @@ def iterate(self) -> Iterable[DatasetRecord]: # Load dataset ds = load_from_disk(str(self.dataset_source)) - # Create visualization directory if needed - if self.do_visualization: - viz_dir = self.target / "visualizations" - os.makedirs(viz_dir, exist_ok=True) - # Set max items if self.max_items == -1: max_items = len(ds[self.split]) diff --git a/docling_eval/dataset_builders/dpbench_builder.py b/docling_eval/dataset_builders/dpbench_builder.py index 00451325..5e13e0e7 100644 --- a/docling_eval/dataset_builders/dpbench_builder.py +++ b/docling_eval/dataset_builders/dpbench_builder.py @@ -80,15 +80,14 @@ def __init__( self, # prediction_provider: BasePredictionProvider, target: Path, - do_visualization: bool = True, + split: str = "test", ): super().__init__( - name="DPBench: end-to-end", + name="DPBench", dataset_source=HFSource(repo_id="upstage/dp-bench"), - # prediction_provider=prediction_provider, target=target, + split=split, ) - self.do_visualization = do_visualization def _update_gt_doc( self, @@ -256,15 +255,6 @@ def iterate(self) -> Iterable[DatasetRecord]: with open(self.dataset_local_path / f"dataset/reference.json", "r") as fr: gt = json.load(fr) - # odir_lay = self.target / "layout" - # odir_tab = self.target / "tables" - viz_dir = self.target / "vizualisations" - - for _ in [viz_dir]: - os.makedirs(_, exist_ok=True) - - records: List[DatasetRecord] = [] - cnt = 0 for filename, annots in tqdm( gt.items(), @@ -306,7 +296,6 @@ def iterate(self) -> Iterable[DatasetRecord]: pdf_stream = DocumentStream(name=pdf_path.name, stream=BytesIO(pdf_bytes)) record = DatasetRecord( - # predictor_info=self.prediction_provider.info(), doc_id=str(filename), doc_hash=get_binhash(pdf_bytes), ground_truth_doc=true_doc, @@ -314,16 +303,4 @@ def iterate(self) -> Iterable[DatasetRecord]: mime_type="application/pdf", ) - # self.update_prediction(record) - - # if self.do_visualization and record.predicted_doc is not None: - # save_comparison_html_with_clusters( - # filename=viz_dir / f"{os.path.basename(pdf_path)}-clusters.html", - # true_doc=true_doc, - # pred_doc=record.predicted_doc, - # page_image=true_page_images[0], - # true_labels=TRUE_HTML_EXPORT_LABELS, - # pred_labels=PRED_HTML_EXPORT_LABELS, - # ) - yield record diff --git a/docling_eval/dataset_builders/funsd_builder.py b/docling_eval/dataset_builders/funsd_builder.py index e6201b39..618aeea7 100644 --- a/docling_eval/dataset_builders/funsd_builder.py +++ b/docling_eval/dataset_builders/funsd_builder.py @@ -36,7 +36,6 @@ def __init__( dataset_source: Path, # prediction_provider: BasePredictionProvider, target: Path, - do_visualization: bool = True, split: str = "test", max_items: int = -1, ): @@ -45,9 +44,8 @@ def __init__( dataset_source=dataset_source, # Standard location # prediction_provider=prediction_provider, target=target, + split=split, ) - self.do_visualization = do_visualization - self.split = split self.max_items = max_items def retrieve_input_dataset(self) -> Path: @@ -242,11 +240,6 @@ def iterate(self) -> Iterable[DatasetRecord]: else: raise ValueError(f"Invalid split: {self.split}. Expected 'train' or 'test'") - # Create visualization directory if needed - if self.do_visualization: - viz_dir = self.target / "visualizations" - os.makedirs(viz_dir, exist_ok=True) - # List all PNG images images = list(image_dir.glob("*.png")) diff --git a/docling_eval/dataset_builders/omnidocbench_builder.py b/docling_eval/dataset_builders/omnidocbench_builder.py index bc1a21cc..7189ddf0 100644 --- a/docling_eval/dataset_builders/omnidocbench_builder.py +++ b/docling_eval/dataset_builders/omnidocbench_builder.py @@ -83,15 +83,15 @@ def __init__( self, # prediction_provider: BasePredictionProvider, target: Path, - do_visualization: bool = True, + split: str = "test", ): super().__init__( name="OmniDocBench: end-to-end", dataset_source=HFSource(repo_id="opendatalab/OmniDocBench"), # prediction_provider=prediction_provider, target=target, + split=split, ) - self.do_visualization = do_visualization def update_gt_into_map(self, gt): @@ -365,16 +365,4 @@ def iterate(self) -> Iterable[DatasetRecord]: mime_type="application/pdf", ) - # self.update_prediction(record) - - # if self.do_visualization and record.predicted_doc is not None: - # save_comparison_html_with_clusters( - # filename=viz_dir / f"{os.path.basename(pdf_path)}-clusters.html", - # true_doc=true_doc, - # pred_doc=record.predicted_doc, - # page_image=true_page_images[0], - # true_labels=TRUE_HTML_EXPORT_LABELS, - # pred_labels=PRED_HTML_EXPORT_LABELS, - # ) - yield record diff --git a/docling_eval/dataset_builders/otsl_table_dataset_builder.py b/docling_eval/dataset_builders/otsl_table_dataset_builder.py index 9dc9cc29..dd0a3fd7 100644 --- a/docling_eval/dataset_builders/otsl_table_dataset_builder.py +++ b/docling_eval/dataset_builders/otsl_table_dataset_builder.py @@ -48,8 +48,8 @@ def __init__( name=name, dataset_source=dataset_source, target=target, + split=split, ) - self.split = split self.max_items = max_items def retrieve_input_dataset(self) -> Path: diff --git a/docling_eval/dataset_builders/xfund_builder.py b/docling_eval/dataset_builders/xfund_builder.py index 54ea79fb..d9757d82 100644 --- a/docling_eval/dataset_builders/xfund_builder.py +++ b/docling_eval/dataset_builders/xfund_builder.py @@ -37,7 +37,6 @@ def __init__( dataset_source: Path, # prediction_provider: BasePredictionProvider, target: Path, - do_visualization: bool = True, split: str = "val", # XFUND uses "val" instead of "test" max_items: int = -1, ): @@ -46,9 +45,8 @@ def __init__( dataset_source=dataset_source, # Local Path to dataset # prediction_provider=prediction_provider, target=target, + split=split, ) - self.do_visualization = do_visualization - self.split = split self.max_items = max_items self._langs = [ "zh", @@ -245,11 +243,6 @@ def iterate(self) -> Iterable[DatasetRecord]: # Get split directory split_dir = self.dataset_source / self.split - # Create visualization directory if needed - if self.do_visualization: - viz_dir = self.target / "visualizations" - os.makedirs(viz_dir, exist_ok=True) - # Load all JSON files in the split directory json_files = list(split_dir.glob("*.json")) all_documents = [] @@ -329,9 +322,6 @@ def iterate(self) -> Iterable[DatasetRecord]: ground_truth_page_images=true_page_images, ) - # Update prediction - # self.update_prediction(record) - yield record except Exception as ex: diff --git a/docling_eval/prediction_providers/base_prediction_provider.py b/docling_eval/prediction_providers/base_prediction_provider.py index 3ae7967f..464afbd4 100644 --- a/docling_eval/prediction_providers/base_prediction_provider.py +++ b/docling_eval/prediction_providers/base_prediction_provider.py @@ -7,6 +7,7 @@ from typing import Dict, Optional from datasets import load_dataset +from docling.datamodel.base_models import ConversionStatus from docling.utils.utils import chunkify from docling_core.types.doc import DocItemLabel from docling_core.types.doc.document import DoclingDocument @@ -158,14 +159,20 @@ def _iterate_predictions(): record = DatasetRecord.model_validate(data) pred_record = self.add_prediction(record) - if self.ignore_missing_predictions: + if ( + self.ignore_missing_predictions + and pred_record.status == ConversionStatus.FAILURE + ): continue yield pred_record - test_dir = target_dataset_dir / "test" + test_dir = target_dataset_dir / split os.makedirs(test_dir, exist_ok=True) + if self.do_visualization: + os.makedirs(target_dataset_dir / "visualizations", exist_ok=True) + chunk_size = 80 max_num_chunks = sys.maxsize diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 35979c63..8adb4b25 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -74,11 +74,11 @@ def create_docling_prediction_provider( def test_run_dpbench_e2e(): - target_path = Path("./scratch/dpbench-builer-test/") + target_path = Path(f"./scratch/{BenchMarkNames.DPBENCH.value}/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) dataset_layout = DPBenchDatasetBuilder( - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -88,20 +88,20 @@ def test_run_dpbench_e2e(): docling_provider.create_prediction_dataset( name=dataset_layout.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "e2e", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "e2e", - odir=target_path / "e2e" / "layout", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) def test_run_doclaynet_with_doctags_fileprovider(): - target_path = Path("./scratch/doclaynet-v1-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV1.value}/") file_provider = FilePredictionProvider( prediction_format=PredictionFormats.DOCTAGS, source_path=Path("./tests/data/doclaynet_v1_doctags_sample"), @@ -112,7 +112,7 @@ def test_run_doclaynet_with_doctags_fileprovider(): dataset_layout = DocLayNetV1DatasetBuilder( # prediction_provider=docling_provider, target=target_path - / "gt", + / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -122,24 +122,24 @@ def test_run_doclaynet_with_doctags_fileprovider(): file_provider.create_prediction_dataset( name=dataset_layout.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "e2e", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.MARKDOWN_TEXT, benchmark=BenchMarkNames.DOCLAYNETV1, - idir=target_path / "e2e", - odir=target_path / "e2e" / "text", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, ) def test_run_omnidocbench_e2e(): - target_path = Path("./scratch/omnidocbench-builer-test/") + target_path = Path(f"./scratch/{BenchMarkNames.OMNIDOCBENCH.value}/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) dataset_layout = OmniDocBenchDatasetBuilder( - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -149,24 +149,24 @@ def test_run_omnidocbench_e2e(): docling_provider.create_prediction_dataset( name=dataset_layout.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "e2e", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.OMNIDOCBENCH, - idir=target_path / "e2e", - odir=target_path / "e2e" / "layout", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) def test_run_dpbench_tables(): - target_path = Path("./scratch/dpbench-builer-test/") + target_path = Path(f"./scratch/{BenchMarkNames.DPBENCH.value}/") tableformer_provider = TableFormerPredictionProvider() dataset_tables = DPBenchDatasetBuilder( - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF @@ -176,24 +176,24 @@ def test_run_dpbench_tables(): tableformer_provider.create_prediction_dataset( name=dataset_tables.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "tables", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "tables", - odir=target_path / "tables" / "tableformer", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) def test_run_omnidocbench_tables(): - target_path = Path("./scratch/omnidocbench-builer-test/") + target_path = Path(f"./scratch/{BenchMarkNames.OMNIDOCBENCH.value}/") tableformer_provider = TableFormerPredictionProvider() dataset_tables = OmniDocBenchDatasetBuilder( - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF @@ -204,26 +204,26 @@ def test_run_omnidocbench_tables(): tableformer_provider.create_prediction_dataset( name=dataset_tables.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "tables", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.OMNIDOCBENCH, - idir=target_path / "tables", - odir=target_path / "tables" / "tableformer", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) def test_run_doclaynet_v1_e2e(): - target_path = Path("./scratch/doclaynet-v1-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV1.value}/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) dataset_layout = DocLayNetV1DatasetBuilder( # prediction_provider=docling_provider, target=target_path - / "gt", + / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -233,25 +233,25 @@ def test_run_doclaynet_v1_e2e(): docling_provider.create_prediction_dataset( name=dataset_layout.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "e2e", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DOCLAYNETV1, - idir=target_path / "e2e", - odir=target_path / "e2e" / "layout", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) def test_run_doclaynet_v2_e2e(): - target_path = Path("./scratch/doclaynet-v2-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV2.value}/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) dataset_layout = DocLayNetV2DatasetBuilder( dataset_path=Path("/Users/cau/Documents/Data/doclaynet_v2_benchmark"), - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -261,24 +261,24 @@ def test_run_doclaynet_v2_e2e(): docling_provider.create_prediction_dataset( name=dataset_layout.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "e2e", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DOCLAYNETV2, - idir=target_path / "e2e", - odir=target_path / "e2e" / "layout", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) def test_run_funsd(): - target_path = Path("./scratch/funsd-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.FUNSD.value}/") dataset_layout = FUNSDDatasetBuilder( dataset_source=target_path / "input_dataset", - target=target_path / "e2e", + target=target_path / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -288,11 +288,11 @@ def test_run_funsd(): def test_run_xfund(): - target_path = Path("./scratch/xfund-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.XFUND.value}/") dataset_layout = XFUNDDatasetBuilder( dataset_source=target_path / "input_dataset", - target=target_path / "e2e", + target=target_path / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -302,11 +302,11 @@ def test_run_xfund(): def test_run_fintabnet_builder(): - target_path = Path("./scratch/fintabnet-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.FINTABNET.value}/") tableformer_provider = TableFormerPredictionProvider() dataset = FintabNetDatasetBuilder( - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset.retrieve_input_dataset() # fetches the source dataset from HF @@ -316,24 +316,24 @@ def test_run_fintabnet_builder(): tableformer_provider.create_prediction_dataset( name=dataset.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "tables", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "tables", - odir=target_path / "tables" / "tableformer", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) def test_run_p1m_builder(): - target_path = Path("./scratch/p1m-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.PUB1M.value}/") tableformer_provider = TableFormerPredictionProvider() dataset = PubTables1MDatasetBuilder( - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset.retrieve_input_dataset() # fetches the source dataset from HF @@ -343,20 +343,20 @@ def test_run_p1m_builder(): tableformer_provider.create_prediction_dataset( name=dataset.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "tables", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "tables", - odir=target_path / "tables" / "tableformer", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) def test_run_pubtabnet_builder(): - target_path = Path("./scratch/pubtabnet-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.PUBTABNET.value}/") tableformer_provider = TableFormerPredictionProvider() dataset = PubTabNetDatasetBuilder( @@ -370,13 +370,13 @@ def test_run_pubtabnet_builder(): tableformer_provider.create_prediction_dataset( name=dataset.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "tables", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "tables", - odir=target_path / "tables" / "tableformer", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) From c520b60a4df3d1f406e99bc35260f01d2b4139fa Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Wed, 26 Mar 2025 16:29:23 +0100 Subject: [PATCH 40/81] Cleanup, change path handling Signed-off-by: Christoph Auer --- docling_eval/cli/main.py | 2 + .../dataset_builders/dataset_builder.py | 28 +--- .../dataset_builders/doclaynet_v1_builder.py | 11 +- .../dataset_builders/doclaynet_v2_builder.py | 9 +- .../dataset_builders/dpbench_builder.py | 29 +--- .../dataset_builders/funsd_builder.py | 9 +- .../dataset_builders/omnidocbench_builder.py | 16 +-- .../otsl_table_dataset_builder.py | 2 +- .../dataset_builders/xfund_builder.py | 12 +- .../base_prediction_provider.py | 11 +- tests/test_dataset_builder.py | 128 +++++++++--------- 11 files changed, 90 insertions(+), 167 deletions(-) diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py index 37789b5c..82741978 100644 --- a/docling_eval/cli/main.py +++ b/docling_eval/cli/main.py @@ -261,6 +261,8 @@ def evaluate( if not os.path.exists(idir): _log.error(f"Benchmark directory not found: {idir}") + os.makedirs(odir, exist_ok=True) + # Save the evaluation save_fn = odir / f"evaluation_{benchmark.value}_{modality.value}.json" diff --git a/docling_eval/dataset_builders/dataset_builder.py b/docling_eval/dataset_builders/dataset_builder.py index 7fcd6856..a984a23d 100644 --- a/docling_eval/dataset_builders/dataset_builder.py +++ b/docling_eval/dataset_builders/dataset_builder.py @@ -28,16 +28,15 @@ def __init__( self, name: str, dataset_source: Union[HFSource, S3Source, Path], - # prediction_provider: BasePredictionProvider, target: Path, + split: str = "test", ): self.name = name self.target: Path = target - # self.prediction_provider = prediction_provider - self.dataset_source = dataset_source + self.dataset_source = dataset_source self.dataset_local_path: Optional[Path] = None # TBD - + self.split = split self.retrieved = False def retrieve_input_dataset(self) -> Path: @@ -74,32 +73,13 @@ def retrieve_input_dataset(self) -> Path: def iterate(self) -> Iterable[DatasetRecord]: pass - # def update_prediction(self, record: DatasetRecord): - # # This might need customization depending on the input the dataset has. - # # The default implementation assumes that there is an original file in binary format which is accepted. - # input_data = record.original - # - # if not isinstance(input_data, DocumentStream): - # if isinstance(input_data, Path): - # input_data = DocumentStream( - # name=input_data.name, stream=BytesIO(input_data.open("rb").read()) - # ) - # - # pred_doc = self.prediction_provider.predict( - # record.ground_truth_doc, stream=input_data - # ) - # - # record.predicted_doc = pred_doc - # - # record.validate_model() # type: ignore - def save_to_disk(self, chunk_size: int = 80, max_num_chunks: int = sys.maxsize): if not self.retrieved: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." ) - test_dir = self.target / "test" + test_dir = self.target / self.split os.makedirs(test_dir, exist_ok=True) count = 0 diff --git a/docling_eval/dataset_builders/doclaynet_v1_builder.py b/docling_eval/dataset_builders/doclaynet_v1_builder.py index 9460468a..d5d99101 100644 --- a/docling_eval/dataset_builders/doclaynet_v1_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v1_builder.py @@ -115,19 +115,17 @@ def __init__( self, # prediction_provider: BasePredictionProvider, target: Path, - do_visualization: bool = True, split: str = "test", begin_index: int = 0, end_index: int = -1, ): super().__init__( - name="DocLayNetV1: end-to-end", + name="DocLayNetV1", dataset_source=HFSource(repo_id="ds4sd/DocLayNet-v1.2"), # prediction_provider=prediction_provider, target=target, + split=split, ) - self.do_visualization = do_visualization - self.split = split self.begin_index = begin_index self.end_index = end_index self.blacklisted_ids = set(BLACKLISTED_DOC_IDS) @@ -244,11 +242,6 @@ def iterate(self) -> Iterable[DatasetRecord]: "You must first retrieve the source dataset. Call retrieve_input_dataset()." ) - # Create visualization directory if needed - if self.do_visualization: - viz_dir = self.target / "visualizations" - os.makedirs(viz_dir, exist_ok=True) - assert self.dataset_local_path is not None # Load dataset from the retrieved path diff --git a/docling_eval/dataset_builders/doclaynet_v2_builder.py b/docling_eval/dataset_builders/doclaynet_v2_builder.py index a9bed56d..95d7c5dc 100644 --- a/docling_eval/dataset_builders/doclaynet_v2_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v2_builder.py @@ -50,7 +50,6 @@ def __init__( dataset_path: Path, # prediction_provider: BasePredictionProvider, target: Path, - do_visualization: bool = True, split: str = "test", max_items: int = -1, ): @@ -69,9 +68,8 @@ def __init__( dataset_source=dataset_path, # Local Path to dataset # prediction_provider=prediction_provider, target=target, + split=split, ) - self.do_visualization = do_visualization - self.split = split self.max_items = max_items def extract_tokens_and_text(self, s: str): @@ -579,11 +577,6 @@ def iterate(self) -> Iterable[DatasetRecord]: # Load dataset ds = load_from_disk(str(self.dataset_source)) - # Create visualization directory if needed - if self.do_visualization: - viz_dir = self.target / "visualizations" - os.makedirs(viz_dir, exist_ok=True) - # Set max items if self.max_items == -1: max_items = len(ds[self.split]) diff --git a/docling_eval/dataset_builders/dpbench_builder.py b/docling_eval/dataset_builders/dpbench_builder.py index 00451325..5e13e0e7 100644 --- a/docling_eval/dataset_builders/dpbench_builder.py +++ b/docling_eval/dataset_builders/dpbench_builder.py @@ -80,15 +80,14 @@ def __init__( self, # prediction_provider: BasePredictionProvider, target: Path, - do_visualization: bool = True, + split: str = "test", ): super().__init__( - name="DPBench: end-to-end", + name="DPBench", dataset_source=HFSource(repo_id="upstage/dp-bench"), - # prediction_provider=prediction_provider, target=target, + split=split, ) - self.do_visualization = do_visualization def _update_gt_doc( self, @@ -256,15 +255,6 @@ def iterate(self) -> Iterable[DatasetRecord]: with open(self.dataset_local_path / f"dataset/reference.json", "r") as fr: gt = json.load(fr) - # odir_lay = self.target / "layout" - # odir_tab = self.target / "tables" - viz_dir = self.target / "vizualisations" - - for _ in [viz_dir]: - os.makedirs(_, exist_ok=True) - - records: List[DatasetRecord] = [] - cnt = 0 for filename, annots in tqdm( gt.items(), @@ -306,7 +296,6 @@ def iterate(self) -> Iterable[DatasetRecord]: pdf_stream = DocumentStream(name=pdf_path.name, stream=BytesIO(pdf_bytes)) record = DatasetRecord( - # predictor_info=self.prediction_provider.info(), doc_id=str(filename), doc_hash=get_binhash(pdf_bytes), ground_truth_doc=true_doc, @@ -314,16 +303,4 @@ def iterate(self) -> Iterable[DatasetRecord]: mime_type="application/pdf", ) - # self.update_prediction(record) - - # if self.do_visualization and record.predicted_doc is not None: - # save_comparison_html_with_clusters( - # filename=viz_dir / f"{os.path.basename(pdf_path)}-clusters.html", - # true_doc=true_doc, - # pred_doc=record.predicted_doc, - # page_image=true_page_images[0], - # true_labels=TRUE_HTML_EXPORT_LABELS, - # pred_labels=PRED_HTML_EXPORT_LABELS, - # ) - yield record diff --git a/docling_eval/dataset_builders/funsd_builder.py b/docling_eval/dataset_builders/funsd_builder.py index e6201b39..618aeea7 100644 --- a/docling_eval/dataset_builders/funsd_builder.py +++ b/docling_eval/dataset_builders/funsd_builder.py @@ -36,7 +36,6 @@ def __init__( dataset_source: Path, # prediction_provider: BasePredictionProvider, target: Path, - do_visualization: bool = True, split: str = "test", max_items: int = -1, ): @@ -45,9 +44,8 @@ def __init__( dataset_source=dataset_source, # Standard location # prediction_provider=prediction_provider, target=target, + split=split, ) - self.do_visualization = do_visualization - self.split = split self.max_items = max_items def retrieve_input_dataset(self) -> Path: @@ -242,11 +240,6 @@ def iterate(self) -> Iterable[DatasetRecord]: else: raise ValueError(f"Invalid split: {self.split}. Expected 'train' or 'test'") - # Create visualization directory if needed - if self.do_visualization: - viz_dir = self.target / "visualizations" - os.makedirs(viz_dir, exist_ok=True) - # List all PNG images images = list(image_dir.glob("*.png")) diff --git a/docling_eval/dataset_builders/omnidocbench_builder.py b/docling_eval/dataset_builders/omnidocbench_builder.py index bc1a21cc..7189ddf0 100644 --- a/docling_eval/dataset_builders/omnidocbench_builder.py +++ b/docling_eval/dataset_builders/omnidocbench_builder.py @@ -83,15 +83,15 @@ def __init__( self, # prediction_provider: BasePredictionProvider, target: Path, - do_visualization: bool = True, + split: str = "test", ): super().__init__( name="OmniDocBench: end-to-end", dataset_source=HFSource(repo_id="opendatalab/OmniDocBench"), # prediction_provider=prediction_provider, target=target, + split=split, ) - self.do_visualization = do_visualization def update_gt_into_map(self, gt): @@ -365,16 +365,4 @@ def iterate(self) -> Iterable[DatasetRecord]: mime_type="application/pdf", ) - # self.update_prediction(record) - - # if self.do_visualization and record.predicted_doc is not None: - # save_comparison_html_with_clusters( - # filename=viz_dir / f"{os.path.basename(pdf_path)}-clusters.html", - # true_doc=true_doc, - # pred_doc=record.predicted_doc, - # page_image=true_page_images[0], - # true_labels=TRUE_HTML_EXPORT_LABELS, - # pred_labels=PRED_HTML_EXPORT_LABELS, - # ) - yield record diff --git a/docling_eval/dataset_builders/otsl_table_dataset_builder.py b/docling_eval/dataset_builders/otsl_table_dataset_builder.py index 9dc9cc29..dd0a3fd7 100644 --- a/docling_eval/dataset_builders/otsl_table_dataset_builder.py +++ b/docling_eval/dataset_builders/otsl_table_dataset_builder.py @@ -48,8 +48,8 @@ def __init__( name=name, dataset_source=dataset_source, target=target, + split=split, ) - self.split = split self.max_items = max_items def retrieve_input_dataset(self) -> Path: diff --git a/docling_eval/dataset_builders/xfund_builder.py b/docling_eval/dataset_builders/xfund_builder.py index 54ea79fb..d9757d82 100644 --- a/docling_eval/dataset_builders/xfund_builder.py +++ b/docling_eval/dataset_builders/xfund_builder.py @@ -37,7 +37,6 @@ def __init__( dataset_source: Path, # prediction_provider: BasePredictionProvider, target: Path, - do_visualization: bool = True, split: str = "val", # XFUND uses "val" instead of "test" max_items: int = -1, ): @@ -46,9 +45,8 @@ def __init__( dataset_source=dataset_source, # Local Path to dataset # prediction_provider=prediction_provider, target=target, + split=split, ) - self.do_visualization = do_visualization - self.split = split self.max_items = max_items self._langs = [ "zh", @@ -245,11 +243,6 @@ def iterate(self) -> Iterable[DatasetRecord]: # Get split directory split_dir = self.dataset_source / self.split - # Create visualization directory if needed - if self.do_visualization: - viz_dir = self.target / "visualizations" - os.makedirs(viz_dir, exist_ok=True) - # Load all JSON files in the split directory json_files = list(split_dir.glob("*.json")) all_documents = [] @@ -329,9 +322,6 @@ def iterate(self) -> Iterable[DatasetRecord]: ground_truth_page_images=true_page_images, ) - # Update prediction - # self.update_prediction(record) - yield record except Exception as ex: diff --git a/docling_eval/prediction_providers/base_prediction_provider.py b/docling_eval/prediction_providers/base_prediction_provider.py index 3ae7967f..464afbd4 100644 --- a/docling_eval/prediction_providers/base_prediction_provider.py +++ b/docling_eval/prediction_providers/base_prediction_provider.py @@ -7,6 +7,7 @@ from typing import Dict, Optional from datasets import load_dataset +from docling.datamodel.base_models import ConversionStatus from docling.utils.utils import chunkify from docling_core.types.doc import DocItemLabel from docling_core.types.doc.document import DoclingDocument @@ -158,14 +159,20 @@ def _iterate_predictions(): record = DatasetRecord.model_validate(data) pred_record = self.add_prediction(record) - if self.ignore_missing_predictions: + if ( + self.ignore_missing_predictions + and pred_record.status == ConversionStatus.FAILURE + ): continue yield pred_record - test_dir = target_dataset_dir / "test" + test_dir = target_dataset_dir / split os.makedirs(test_dir, exist_ok=True) + if self.do_visualization: + os.makedirs(target_dataset_dir / "visualizations", exist_ok=True) + chunk_size = 80 max_num_chunks = sys.maxsize diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 35979c63..47e7e112 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -74,11 +74,11 @@ def create_docling_prediction_provider( def test_run_dpbench_e2e(): - target_path = Path("./scratch/dpbench-builer-test/") + target_path = Path(f"./scratch/{BenchMarkNames.DPBENCH.value}/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) dataset_layout = DPBenchDatasetBuilder( - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -88,20 +88,20 @@ def test_run_dpbench_e2e(): docling_provider.create_prediction_dataset( name=dataset_layout.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "e2e", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "e2e", - odir=target_path / "e2e" / "layout", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) def test_run_doclaynet_with_doctags_fileprovider(): - target_path = Path("./scratch/doclaynet-v1-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV1.value}/") file_provider = FilePredictionProvider( prediction_format=PredictionFormats.DOCTAGS, source_path=Path("./tests/data/doclaynet_v1_doctags_sample"), @@ -112,7 +112,7 @@ def test_run_doclaynet_with_doctags_fileprovider(): dataset_layout = DocLayNetV1DatasetBuilder( # prediction_provider=docling_provider, target=target_path - / "gt", + / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -122,24 +122,24 @@ def test_run_doclaynet_with_doctags_fileprovider(): file_provider.create_prediction_dataset( name=dataset_layout.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "e2e", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.MARKDOWN_TEXT, benchmark=BenchMarkNames.DOCLAYNETV1, - idir=target_path / "e2e", - odir=target_path / "e2e" / "text", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, ) def test_run_omnidocbench_e2e(): - target_path = Path("./scratch/omnidocbench-builer-test/") + target_path = Path(f"./scratch/{BenchMarkNames.OMNIDOCBENCH.value}/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) dataset_layout = OmniDocBenchDatasetBuilder( - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -149,24 +149,24 @@ def test_run_omnidocbench_e2e(): docling_provider.create_prediction_dataset( name=dataset_layout.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "e2e", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.OMNIDOCBENCH, - idir=target_path / "e2e", - odir=target_path / "e2e" / "layout", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) def test_run_dpbench_tables(): - target_path = Path("./scratch/dpbench-builer-test/") + target_path = Path(f"./scratch/{BenchMarkNames.DPBENCH.value}/") tableformer_provider = TableFormerPredictionProvider() dataset_tables = DPBenchDatasetBuilder( - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF @@ -176,24 +176,24 @@ def test_run_dpbench_tables(): tableformer_provider.create_prediction_dataset( name=dataset_tables.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "tables", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "tables", - odir=target_path / "tables" / "tableformer", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) def test_run_omnidocbench_tables(): - target_path = Path("./scratch/omnidocbench-builer-test/") + target_path = Path(f"./scratch/{BenchMarkNames.OMNIDOCBENCH.value}/") tableformer_provider = TableFormerPredictionProvider() dataset_tables = OmniDocBenchDatasetBuilder( - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF @@ -204,26 +204,26 @@ def test_run_omnidocbench_tables(): tableformer_provider.create_prediction_dataset( name=dataset_tables.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "tables", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.OMNIDOCBENCH, - idir=target_path / "tables", - odir=target_path / "tables" / "tableformer", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) def test_run_doclaynet_v1_e2e(): - target_path = Path("./scratch/doclaynet-v1-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV1.value}/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) dataset_layout = DocLayNetV1DatasetBuilder( # prediction_provider=docling_provider, target=target_path - / "gt", + / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -233,25 +233,25 @@ def test_run_doclaynet_v1_e2e(): docling_provider.create_prediction_dataset( name=dataset_layout.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "e2e", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DOCLAYNETV1, - idir=target_path / "e2e", - odir=target_path / "e2e" / "layout", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) def test_run_doclaynet_v2_e2e(): - target_path = Path("./scratch/doclaynet-v2-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV2.value}/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) dataset_layout = DocLayNetV2DatasetBuilder( dataset_path=Path("/Users/cau/Documents/Data/doclaynet_v2_benchmark"), - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -261,24 +261,24 @@ def test_run_doclaynet_v2_e2e(): docling_provider.create_prediction_dataset( name=dataset_layout.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "e2e", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DOCLAYNETV2, - idir=target_path / "e2e", - odir=target_path / "e2e" / "layout", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) def test_run_funsd(): - target_path = Path("./scratch/funsd-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.FUNSD.value}/") dataset_layout = FUNSDDatasetBuilder( dataset_source=target_path / "input_dataset", - target=target_path / "e2e", + target=target_path / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -288,11 +288,11 @@ def test_run_funsd(): def test_run_xfund(): - target_path = Path("./scratch/xfund-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.XFUND.value}/") dataset_layout = XFUNDDatasetBuilder( dataset_source=target_path / "input_dataset", - target=target_path / "e2e", + target=target_path / "gt_dataset", ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF @@ -302,11 +302,11 @@ def test_run_xfund(): def test_run_fintabnet_builder(): - target_path = Path("./scratch/fintabnet-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.FINTABNET.value}/") tableformer_provider = TableFormerPredictionProvider() dataset = FintabNetDatasetBuilder( - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset.retrieve_input_dataset() # fetches the source dataset from HF @@ -316,24 +316,24 @@ def test_run_fintabnet_builder(): tableformer_provider.create_prediction_dataset( name=dataset.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "tables", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "tables", - odir=target_path / "tables" / "tableformer", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) def test_run_p1m_builder(): - target_path = Path("./scratch/p1m-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.PUB1M.value}/") tableformer_provider = TableFormerPredictionProvider() dataset = PubTables1MDatasetBuilder( - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset.retrieve_input_dataset() # fetches the source dataset from HF @@ -343,24 +343,24 @@ def test_run_p1m_builder(): tableformer_provider.create_prediction_dataset( name=dataset.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "tables", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "tables", - odir=target_path / "tables" / "tableformer", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) def test_run_pubtabnet_builder(): - target_path = Path("./scratch/pubtabnet-builder-test/") + target_path = Path(f"./scratch/{BenchMarkNames.PUBTABNET.value}/") tableformer_provider = TableFormerPredictionProvider() dataset = PubTabNetDatasetBuilder( - target=target_path / "gt", + target=target_path / "gt_dataset", ) dataset.retrieve_input_dataset() # fetches the source dataset from HF @@ -370,13 +370,13 @@ def test_run_pubtabnet_builder(): tableformer_provider.create_prediction_dataset( name=dataset.name, - gt_dataset_dir=target_path / "gt", - target_dataset_dir=target_path / "tables", + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset", ) evaluate( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "tables", - odir=target_path / "tables" / "tableformer", + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) From c0d6ec7a08447e692ea3eb4bda0628a17f778776 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Wed, 26 Mar 2025 20:01:19 +0100 Subject: [PATCH 41/81] More module removal and renaming Signed-off-by: Christoph Auer --- docling_eval/cli/main.py | 3 +- docling_eval/converters/models/__init__.py | 0 .../reading_order/reading_order_updater.py | 56 ---- .../converters/models/tableformer/__init__.py | 0 .../models/tableformer/tf_model_prediction.py | 289 ------------------ docling_eval/datamodels/dataset_record.py | 2 +- .../datamodels/{constants.py => types.py} | 18 ++ .../dataset_builders/doclaynet_v1_builder.py | 2 +- .../dataset_builders/doclaynet_v2_builder.py | 2 +- .../dataset_builders/funsd_builder.py | 2 +- .../otsl_table_dataset_builder.py | 7 +- .../dataset_builders/xfund_builder.py | 2 +- docling_eval/evaluators/base_evaluator.py | 2 +- .../evaluators/base_readingorder_evaluator.py | 2 +- .../evaluators/bbox_text_evaluator.py | 2 +- docling_eval/evaluators/layout_evaluator.py | 2 +- .../evaluators/markdown_text_evaluator.py | 2 +- .../evaluators/readingorder_evaluator_glm.py | 76 ----- docling_eval/evaluators/table_evaluator.py | 2 +- .../{ => legacy}/converters/__init__.py | 0 .../{ => legacy}/converters/conversion.py | 0 docling_eval/legacy/cvat_annotation/create.py | 4 +- .../create_dataset_from_pdfs.py | 4 +- .../legacy/cvat_annotation/preannotate.py | 2 +- docling_eval/legacy/doclaynet_v1/create.py | 10 +- docling_eval/legacy/doclaynet_v2/create.py | 10 +- docling_eval/legacy/dpbench/create.py | 14 +- docling_eval/legacy/funsd/create.py | 4 +- docling_eval/legacy/omnidocbench/create.py | 14 +- .../tableformer_huggingface_otsl/create.py | 8 +- docling_eval/legacy/xfund/create.py | 4 +- .../base_prediction_provider.py | 2 +- .../prediction_providers/docling_provider.py | 2 +- .../prediction_providers/file_provider.py | 2 +- .../tableformer_provider.py | 279 ++++++++++++++++- docling_eval/utils/utils.py | 2 +- docs/examples/benchmark_doclaynet_v1.py | 2 +- docs/examples/benchmark_doclaynet_v2.py | 2 +- docs/examples/benchmark_dpbench.py | 2 +- docs/examples/benchmark_omnidocbench.py | 2 +- .../benchmark_tableformer_fintabnet.py | 2 +- docs/examples/benchmark_tableformer_p1m.py | 2 +- .../benchmark_tableformer_pubtabnet.py | 2 +- docs/examples/create_funsd.py | 2 +- docs/examples/create_xfund.py | 2 +- docs/examples/package_pdfs.py | 4 +- docs/examples/package_pngs.py | 4 +- tests/test_dataset_builder.py | 8 +- 48 files changed, 361 insertions(+), 505 deletions(-) delete mode 100644 docling_eval/converters/models/__init__.py delete mode 100644 docling_eval/converters/models/reading_order/reading_order_updater.py delete mode 100644 docling_eval/converters/models/tableformer/__init__.py delete mode 100644 docling_eval/converters/models/tableformer/tf_model_prediction.py rename docling_eval/datamodels/{constants.py => types.py} (88%) delete mode 100644 docling_eval/evaluators/readingorder_evaluator_glm.py rename docling_eval/{ => legacy}/converters/__init__.py (100%) rename docling_eval/{ => legacy}/converters/conversion.py (100%) diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py index 82741978..d0174ccd 100644 --- a/docling_eval/cli/main.py +++ b/docling_eval/cli/main.py @@ -8,7 +8,7 @@ import typer from tabulate import tabulate # type: ignore -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkNames, ConverterTypes, EvaluationModality, @@ -284,7 +284,6 @@ def evaluate( json.dump(table_evaluation.model_dump(), fd, indent=2, sort_keys=True) elif modality == EvaluationModality.READING_ORDER: - # readingorder_evaluator = ReadingOrderEvaluatorGlm() readingorder_evaluator = ReadingOrderEvaluator() readingorder_evaluation = readingorder_evaluator(idir, split=split) diff --git a/docling_eval/converters/models/__init__.py b/docling_eval/converters/models/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/docling_eval/converters/models/reading_order/reading_order_updater.py b/docling_eval/converters/models/reading_order/reading_order_updater.py deleted file mode 100644 index 11a97ff5..00000000 --- a/docling_eval/converters/models/reading_order/reading_order_updater.py +++ /dev/null @@ -1,56 +0,0 @@ -import copy -import logging -from pathlib import Path -from typing import Optional - -from deepsearch_glm.andromeda_nlp import nlp_model # type: ignore -from docling.utils.glm_utils import to_docling_document -from docling_core.types.doc.document import DoclingDocument -from docling_core.types.doc.labels import DocItemLabel -from docling_core.utils.legacy import ( - doc_item_label_to_legacy_name, - docling_document_to_legacy, -) - -_log = logging.getLogger(__name__) - - -class ReadingOrderUpdater: - def __init__(self): - r""" """ - self._nlp_model = nlp_model(loglevel="error", text_ordering=True) - self._labels_forward_mapping = { - doc_item_label_to_legacy_name(v): v.value for v in DocItemLabel - } - - def __call__( - self, pdf_path: Path, true_doc: DoclingDocument - ) -> Optional[DoclingDocument]: - r""" """ - print(true_doc.name) - # deep copy of the true-document - pred_doc = copy.deepcopy(true_doc) - pred_doc_legacy = docling_document_to_legacy(pred_doc) - ds_doc_dict = pred_doc_legacy.model_dump(by_alias=True, exclude_none=True) - try: - # TODO: Understand why some documents fail here - glm_doc = self._nlp_model.apply_on_doc(ds_doc_dict) - except RuntimeError: - # print("nlp_model.apply_on_doc()") - return None - - # Map from value to key.value before calling to_docling_document - for page_element in glm_doc["page-elements"]: - page_element["name"] = self._labels_forward_mapping[page_element["name"]] - - # When true_doc.name == "ground-truth 01030000000016.pdf" - # pydantic_core._pydantic_core.ValidationError: 1 validation error for TextItem label - # Input should be , , - # , , - # , , , - # , , , - # or - # [type=literal_error, input_value=, input_type=DocItemLabel] - pred_doc = to_docling_document(glm_doc) - - return pred_doc diff --git a/docling_eval/converters/models/tableformer/__init__.py b/docling_eval/converters/models/tableformer/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/docling_eval/converters/models/tableformer/tf_model_prediction.py b/docling_eval/converters/models/tableformer/tf_model_prediction.py deleted file mode 100644 index 9aff3c48..00000000 --- a/docling_eval/converters/models/tableformer/tf_model_prediction.py +++ /dev/null @@ -1,289 +0,0 @@ -import copy -import logging -from io import BytesIO -from pathlib import Path -from typing import List, Optional, Tuple - -import numpy as np -from docling.datamodel.base_models import Cluster, LayoutPrediction, Page, Table -from docling.datamodel.document import ConversionResult -from docling.datamodel.pipeline_options import ( - AcceleratorDevice, - AcceleratorOptions, - TableFormerMode, - TableStructureOptions, -) -from docling.models.table_structure_model import TableStructureModel -from docling_core.types.doc import DocItemLabel -from docling_core.types.doc.base import BoundingBox -from docling_core.types.doc.document import ( - DoclingDocument, - TableCell, - TableData, - TableItem, -) -from docling_parse.pdf_parsers import pdf_parser_v2 -from PIL import Image -from pydantic import BaseModel - -from docling_eval.utils.utils import get_input_document - -# Get logger -log = logging.getLogger(__name__) - - -class PageToken(BaseModel): - bbox: BoundingBox - - text: str - id: int - - -class PageTokens(BaseModel): - tokens: List[PageToken] - - height: float - width: float - - -class TableFormerUpdater: - - def __init__( - self, - mode: TableFormerMode, - num_threads: int = 16, - artifacts_path: Optional[Path] = None, - ): - r""" """ - # Init the TableFormer model - table_structure_options = TableStructureOptions(mode=mode) - accelerator_options = AcceleratorOptions( - num_threads=num_threads, device=AcceleratorDevice.AUTO - ) - self._docling_tf_model = TableStructureModel( - enabled=True, - artifacts_path=artifacts_path, - options=table_structure_options, - accelerator_options=accelerator_options, - ) - log.info("Initialize %s", mode) - - def to_np(self, pil_image: Image.Image): - # Convert to NumPy array - np_image = np.array(pil_image) - - # Handle different formats - if np_image.ndim == 3: # RGB or RGBA image - if np_image.shape[2] == 4: # RGBA image - # Discard alpha channel and convert to BGR - np_image = np_image[:, :, :3] # Keep only RGB channels - - # Convert RGB to BGR by reversing the last axis - np_image = np_image[:, :, ::-1] - - return np_image - else: - raise ValueError("Unsupported image format") - - def get_page_cells(self, filename: str): - - parser = pdf_parser_v2("fatal") - - try: - key = "key" - parser.load_document(key=key, filename=filename) - - parsed_doc = parser.parse_pdf_from_key(key=key) - - parser.unload_document(key) - return parsed_doc - - except Exception as exc: - log.error(exc) - - return None - - def _make_internal_page_with_table(self, input_doc, prov): - page = Page(page_no=prov.page_no - 1) - page._backend = input_doc._backend.load_page(page.page_no) - page.cells = list(page._backend.get_text_cells()) - page.size = page._backend.get_size() - - if page._backend is not None and page._backend.is_valid(): - cluster = Cluster( - id=0, - label=DocItemLabel.TABLE, - bbox=prov.bbox.to_top_left_origin(page.size.height), - ) - for cell in page.cells: - overlap = cell.rect.to_bounding_box().intersection_area_with( - cluster.bbox - ) - if cell.rect.to_bounding_box().area() > 0: - overlap_ratio = overlap / cell.rect.to_bounding_box().area() - if overlap_ratio > 0.2: - cluster.cells.append(cell) - - page.predictions.layout = LayoutPrediction(clusters=[cluster]) - - return page - - def replace_tabledata( - self, - pdf_path: Path | BytesIO, - true_doc: DoclingDocument, - ) -> Tuple[bool, DoclingDocument]: - - updated = False - - # deep copy of the true-document - pred_doc = true_doc.model_copy(deep=True) - - input_doc = get_input_document(pdf_path) - if not input_doc.valid: - log.error("could not parse pdf-file") - return False, pred_doc - - conv_res = ConversionResult(input=input_doc) - - # parsed_doc = self.get_page_cells(str(pdf_path)) - # if parsed_doc is None: - # log.error("could not parse pdf-file") - # return False, pred_doc - - # Replace the groundtruth tables with predictions from TableFormer - for item, level in pred_doc.iterate_items(): - if isinstance(item, TableItem): - for prov in item.prov: - page = self._make_internal_page_with_table(input_doc, prov) - - page = next(self._docling_tf_model(conv_res, [page])) # type: ignore - tbl: Table = page.predictions.tablestructure.table_map[0] - table_data: TableData = TableData( - num_rows=tbl.num_rows, - num_cols=tbl.num_cols, - table_cells=tbl.table_cells, - ) - - item.data = table_data - page._backend.unload() - - updated = True - - # md = item.export_to_markdown() - # print("prediction from table-former: \n\n", md) - - return updated, pred_doc - - def _tf_predict_with_page_tokens( - self, - page_image: Image.Image, - page_tokens: PageTokens, - table_bbox: Tuple[float, float, float, float], - image_scale: float = 1.0, - ): - r""" - Test the TFPredictor - """ - table_bboxes = [[table_bbox[0], table_bbox[1], table_bbox[2], table_bbox[3]]] - - ocr_page = page_tokens.dict() - - ocr_page["image"] = self.to_np(page_image) - ocr_page["table_bboxes"] = table_bboxes - - # TODO: Here we bypass docling API and we steal the tf_preditor private object :-( - predictor = self._docling_tf_model.tf_predictor - - # Loop over the iocr_pages - tf_output = predictor.multi_table_predict( - ocr_page, - table_bboxes=table_bboxes, - do_matching=True, - correct_overlapping_cells=False, - sort_row_col_indexes=True, - ) - # print("tf-output: ", json.dumps(tf_output, indent=2)) - - table_out = tf_output[0] - - do_cell_matching = True - - table_cells = [] - for element in table_out["tf_responses"]: - - tc = TableCell.model_validate(element) - if do_cell_matching and tc.bbox is not None: - tc.bbox = tc.bbox.scaled(1 / image_scale) - table_cells.append(tc) - - # Retrieving cols/rows, after post processing: - num_rows = table_out["predict_details"]["num_rows"] - num_cols = table_out["predict_details"]["num_cols"] - - table_data = TableData( - num_rows=num_rows, num_cols=num_cols, table_cells=table_cells - ) - - return table_data - - def replace_tabledata_with_page_tokens( - self, - true_doc: DoclingDocument, - true_page_images: List[Image.Image], - page_tokens: Optional[PageTokens] = None, - ) -> Tuple[bool, DoclingDocument]: - - updated = False - - # deep copy of the true-document - pred_doc = copy.deepcopy(true_doc) - - assert len(pred_doc.pages) == 1 - page_size = pred_doc.pages[1].size - - # Replace the groundtruth tables with predictions from TableFormer - for item, level in pred_doc.iterate_items(): - if isinstance(item, TableItem): - for prov in item.prov: - - # md = item.export_to_markdown() - # print("groundtruth: \n\n", md) - - page_image = true_page_images[prov.page_no - 1] - # page_image.show() - - # Ensure that the bbox will be inside the min/max ranges - table_bbox = ( - max(prov.bbox.l, 0.0), - max(prov.bbox.b, 0.0), - min(prov.bbox.r, page_size.width), - min(prov.bbox.t, page_size.height), - ) - - if page_tokens is None: - ptokens = [] - for ix, table_cell in enumerate(item.data.table_cells): - pt = PageToken( - bbox=table_cell.bbox, text=table_cell.text, id=ix - ) - ptokens.append(pt) - page_tokens = PageTokens( - tokens=ptokens, - height=prov.bbox.height, - width=prov.bbox.width, - ) - - table_data = self._tf_predict_with_page_tokens( - page_image=page_image, - page_tokens=page_tokens, - table_bbox=table_bbox, - ) - item.data = table_data - - updated = True - - # md = item.export_to_markdown() - # print("prediction from table-former: \n\n", md) - - return updated, pred_doc diff --git a/docling_eval/datamodels/dataset_record.py b/docling_eval/datamodels/dataset_record.py index b0fd7fe5..50b7bc92 100644 --- a/docling_eval/datamodels/dataset_record.py +++ b/docling_eval/datamodels/dataset_record.py @@ -12,7 +12,7 @@ from docling_core.types.io import DocumentStream from pydantic import BaseModel, ConfigDict, Field, model_validator -from docling_eval.datamodels.constants import EvaluationModality, PredictionFormats +from docling_eval.datamodels.types import EvaluationModality, PredictionFormats class DatasetRecord( diff --git a/docling_eval/datamodels/constants.py b/docling_eval/datamodels/types.py similarity index 88% rename from docling_eval/datamodels/constants.py rename to docling_eval/datamodels/types.py index ce2f8b62..31b015e2 100644 --- a/docling_eval/datamodels/constants.py +++ b/docling_eval/datamodels/types.py @@ -1,4 +1,8 @@ from enum import Enum +from typing import List + +from docling_core.types.doc import BoundingBox +from pydantic import BaseModel class BenchMarkColumns(str, Enum): @@ -82,3 +86,17 @@ class PredictionFormats(str, Enum): JSON = "json" YAML = "yaml" DOCTAGS = "doctags" + + +class PageToken(BaseModel): + bbox: BoundingBox + + text: str + id: int + + +class PageTokens(BaseModel): + tokens: List[PageToken] + + height: float + width: float diff --git a/docling_eval/dataset_builders/doclaynet_v1_builder.py b/docling_eval/dataset_builders/doclaynet_v1_builder.py index d5d99101..3969733e 100644 --- a/docling_eval/dataset_builders/doclaynet_v1_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v1_builder.py @@ -20,8 +20,8 @@ from docling_core.types.io import DocumentStream from tqdm import tqdm -from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.datamodels.types import BenchMarkColumns, EvaluationModality from docling_eval.dataset_builders.dataset_builder import ( BaseEvaluationDatasetBuilder, HFSource, diff --git a/docling_eval/dataset_builders/doclaynet_v2_builder.py b/docling_eval/dataset_builders/doclaynet_v2_builder.py index 95d7c5dc..9c641618 100644 --- a/docling_eval/dataset_builders/doclaynet_v2_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v2_builder.py @@ -27,8 +27,8 @@ from PIL import Image from tqdm import tqdm -from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.datamodels.types import BenchMarkColumns, EvaluationModality from docling_eval.dataset_builders.dataset_builder import BaseEvaluationDatasetBuilder from docling_eval.utils.utils import ( classify_cells, diff --git a/docling_eval/dataset_builders/funsd_builder.py b/docling_eval/dataset_builders/funsd_builder.py index 618aeea7..3bb55c63 100644 --- a/docling_eval/dataset_builders/funsd_builder.py +++ b/docling_eval/dataset_builders/funsd_builder.py @@ -14,8 +14,8 @@ from PIL import Image from tqdm import tqdm -from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.datamodels.types import BenchMarkColumns, EvaluationModality from docling_eval.dataset_builders.dataset_builder import BaseEvaluationDatasetBuilder from docling_eval.utils.utils import ( classify_cells, diff --git a/docling_eval/dataset_builders/otsl_table_dataset_builder.py b/docling_eval/dataset_builders/otsl_table_dataset_builder.py index dd0a3fd7..91174bad 100644 --- a/docling_eval/dataset_builders/otsl_table_dataset_builder.py +++ b/docling_eval/dataset_builders/otsl_table_dataset_builder.py @@ -16,9 +16,12 @@ from docling_core.types.io import DocumentStream from tqdm import tqdm -from docling_eval.converters.models.tableformer.tf_model_prediction import PageTokens -from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.datamodels.types import ( + BenchMarkColumns, + EvaluationModality, + PageTokens, +) from docling_eval.dataset_builders.dataset_builder import ( BaseEvaluationDatasetBuilder, HFSource, diff --git a/docling_eval/dataset_builders/xfund_builder.py b/docling_eval/dataset_builders/xfund_builder.py index d9757d82..d0e4a4d6 100644 --- a/docling_eval/dataset_builders/xfund_builder.py +++ b/docling_eval/dataset_builders/xfund_builder.py @@ -15,8 +15,8 @@ from PIL import Image from tqdm import tqdm -from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.datamodels.types import BenchMarkColumns, EvaluationModality from docling_eval.dataset_builders.dataset_builder import BaseEvaluationDatasetBuilder from docling_eval.utils.utils import ( classify_cells, diff --git a/docling_eval/evaluators/base_evaluator.py b/docling_eval/evaluators/base_evaluator.py index 8a7416a2..3cda3466 100644 --- a/docling_eval/evaluators/base_evaluator.py +++ b/docling_eval/evaluators/base_evaluator.py @@ -4,7 +4,7 @@ from pydantic import BaseModel -from docling_eval.datamodels.constants import PredictionFormats +from docling_eval.datamodels.types import PredictionFormats _log = logging.getLogger(__name__) diff --git a/docling_eval/evaluators/base_readingorder_evaluator.py b/docling_eval/evaluators/base_readingorder_evaluator.py index 827bd322..b1e19996 100644 --- a/docling_eval/evaluators/base_readingorder_evaluator.py +++ b/docling_eval/evaluators/base_readingorder_evaluator.py @@ -15,7 +15,7 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.datamodels.types import BenchMarkColumns from docling_eval.evaluators.stats import DatasetStatistics, compute_stats from docling_eval.visualisation.visualisations import draw_arrow diff --git a/docling_eval/evaluators/bbox_text_evaluator.py b/docling_eval/evaluators/bbox_text_evaluator.py index 8e22d27b..7511310d 100644 --- a/docling_eval/evaluators/bbox_text_evaluator.py +++ b/docling_eval/evaluators/bbox_text_evaluator.py @@ -13,7 +13,7 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.datamodels.constants import BenchMarkColumns # type: ignore +from docling_eval.datamodels.types import BenchMarkColumns # type: ignore from docling_eval.evaluators.stats import DatasetStatistics, compute_stats _log = logging.getLogger(__name__) diff --git a/docling_eval/evaluators/layout_evaluator.py b/docling_eval/evaluators/layout_evaluator.py index 8e72cd84..aa4e21a7 100644 --- a/docling_eval/evaluators/layout_evaluator.py +++ b/docling_eval/evaluators/layout_evaluator.py @@ -15,7 +15,7 @@ from torchmetrics.detection.mean_ap import MeanAveragePrecision from tqdm import tqdm # type: ignore -from docling_eval.datamodels.constants import BenchMarkColumns, PredictionFormats +from docling_eval.datamodels.types import BenchMarkColumns, PredictionFormats from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation from docling_eval.evaluators.stats import DatasetStatistics, compute_stats diff --git a/docling_eval/evaluators/markdown_text_evaluator.py b/docling_eval/evaluators/markdown_text_evaluator.py index f5690a57..8b391eef 100644 --- a/docling_eval/evaluators/markdown_text_evaluator.py +++ b/docling_eval/evaluators/markdown_text_evaluator.py @@ -14,7 +14,7 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.datamodels.constants import ( # type: ignore +from docling_eval.datamodels.types import ( # type: ignore BenchMarkColumns, PredictionFormats, ) diff --git a/docling_eval/evaluators/readingorder_evaluator_glm.py b/docling_eval/evaluators/readingorder_evaluator_glm.py deleted file mode 100644 index 7328f635..00000000 --- a/docling_eval/evaluators/readingorder_evaluator_glm.py +++ /dev/null @@ -1,76 +0,0 @@ -import copy -import logging -from typing import Dict, Optional - -from deepsearch_glm.andromeda_nlp import nlp_model # type: ignore -from docling_core.types.doc.document import DoclingDocument -from docling_core.utils.legacy import docling_document_to_legacy - -from docling_eval.evaluators.base_readingorder_evaluator import ( - BaseReadingOrderEvaluator, -) - -_log = logging.getLogger(__name__) - - -class ReadingOrderEvaluatorGlm(BaseReadingOrderEvaluator): - r""" - Evaluate the reading order using the Average Relative Distance metric - """ - - def __init__(self): - self._nlp_model = nlp_model(loglevel="error", text_ordering=True) - - def _get_reading_order_preds( - self, doc_id: str, true_doc: DoclingDocument - ) -> Optional[dict]: - r""" - Return dict with the bboxes and the predicted reading order or None if something goes wrong. - None is also returned if the document contains items with multiple provenances - - Returns - ------- - reading_order: Keys are "bboxes" and "pred_order". Return None if the document is broken. - """ - try: - page_size = true_doc.pages[1].size - - # Convert the bboxes to bottom-left coords before running the GLM - bboxes = [] - for item, level in true_doc.iterate_items(): - pred_len = len(item.prov) # type: ignore - if pred_len > 1: - _log.warning( - "Skipping document %s as it has %s provenances", - doc_id, - pred_len, - ) - return None - - # Convert the bbox to BOTTOM-LEFT origin - bbox = item.prov[0].bbox.to_bottom_left_origin(page_size.height) # type: ignore - item.prov[0].bbox = bbox # type: ignore - bboxes.append(copy.deepcopy(bbox)) - - # Run the reading order model - legacy_doc = docling_document_to_legacy(true_doc) - legacy_doc_dict = legacy_doc.model_dump(by_alias=True, exclude_none=True) - legacy_doc_dict = self._ensure_bboxes_in_legacy_tables(legacy_doc_dict) - glm_doc = self._nlp_model.apply_on_doc(legacy_doc_dict) - - # pred_to_origin_order: predicted order -> original order - pred_to_origin_order: Dict[int, int] = {} - for po, pe in enumerate(glm_doc["page-elements"]): - oo = pe["orig-order"] - pred_to_origin_order[po] = oo - - # pred_order: The index is the predicted order and the value is the original order - pred_order = [ - pred_to_origin_order[x] for x in range(len(pred_to_origin_order)) - ] - - reading_order = {"bboxes": bboxes, "pred_order": pred_order} - return reading_order - except RuntimeError as ex: - _log.error(str(ex)) - return None diff --git a/docling_eval/evaluators/table_evaluator.py b/docling_eval/evaluators/table_evaluator.py index 934beb2a..776dff52 100644 --- a/docling_eval/evaluators/table_evaluator.py +++ b/docling_eval/evaluators/table_evaluator.py @@ -13,7 +13,7 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.datamodels.constants import BenchMarkColumns, PredictionFormats +from docling_eval.datamodels.types import BenchMarkColumns, PredictionFormats from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation from docling_eval.evaluators.stats import DatasetStatistics, compute_stats from docling_eval.evaluators.teds import TEDScorer diff --git a/docling_eval/converters/__init__.py b/docling_eval/legacy/converters/__init__.py similarity index 100% rename from docling_eval/converters/__init__.py rename to docling_eval/legacy/converters/__init__.py diff --git a/docling_eval/converters/conversion.py b/docling_eval/legacy/converters/conversion.py similarity index 100% rename from docling_eval/converters/conversion.py rename to docling_eval/legacy/converters/conversion.py diff --git a/docling_eval/legacy/cvat_annotation/create.py b/docling_eval/legacy/cvat_annotation/create.py index 4a5176e7..1f3126b1 100644 --- a/docling_eval/legacy/cvat_annotation/create.py +++ b/docling_eval/legacy/cvat_annotation/create.py @@ -23,12 +23,12 @@ from PIL import Image # as PILImage from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import create_pdf_docling_converter -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) +from docling_eval.legacy.converters.conversion import create_pdf_docling_converter from docling_eval.legacy.cvat_annotation.utils import ( AnnotatedImage, AnnotationOverview, diff --git a/docling_eval/legacy/cvat_annotation/create_dataset_from_pdfs.py b/docling_eval/legacy/cvat_annotation/create_dataset_from_pdfs.py index 7107e6a8..a5554450 100644 --- a/docling_eval/legacy/cvat_annotation/create_dataset_from_pdfs.py +++ b/docling_eval/legacy/cvat_annotation/create_dataset_from_pdfs.py @@ -8,8 +8,8 @@ from datasets import Image as Features_Image from datasets import Sequence, Value -from docling_eval.converters.conversion import create_pdf_docling_converter -from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.datamodels.types import BenchMarkColumns +from docling_eval.legacy.converters.conversion import create_pdf_docling_converter from docling_eval.utils.utils import ( docling_version, extract_images, diff --git a/docling_eval/legacy/cvat_annotation/preannotate.py b/docling_eval/legacy/cvat_annotation/preannotate.py index c7f1617c..e70b6884 100644 --- a/docling_eval/legacy/cvat_annotation/preannotate.py +++ b/docling_eval/legacy/cvat_annotation/preannotate.py @@ -12,7 +12,7 @@ from docling_core.types.doc.labels import DocItemLabel, PictureClassificationLabel from tqdm import tqdm # type: ignore -from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.datamodels.types import BenchMarkColumns from docling_eval.legacy.cvat_annotation.utils import ( AnnotatedDoc, AnnotatedImage, diff --git a/docling_eval/legacy/doclaynet_v1/create.py b/docling_eval/legacy/doclaynet_v1/create.py index b80ac862..bcfe5e50 100644 --- a/docling_eval/legacy/doclaynet_v1/create.py +++ b/docling_eval/legacy/doclaynet_v1/create.py @@ -20,15 +20,15 @@ from docling_core.types.io import DocumentStream from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import ( - create_pdf_docling_converter, - create_smol_docling_converter, -) -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) +from docling_eval.legacy.converters.conversion import ( + create_pdf_docling_converter, + create_smol_docling_converter, +) from docling_eval.utils.utils import ( add_pages_to_true_doc, crop_bounding_box, diff --git a/docling_eval/legacy/doclaynet_v2/create.py b/docling_eval/legacy/doclaynet_v2/create.py index da360169..52e79f3a 100644 --- a/docling_eval/legacy/doclaynet_v2/create.py +++ b/docling_eval/legacy/doclaynet_v2/create.py @@ -27,15 +27,15 @@ from docling_core.types.io import DocumentStream from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import ( - create_image_docling_converter, - create_smol_docling_converter, -) -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) +from docling_eval.legacy.converters.conversion import ( + create_image_docling_converter, + create_smol_docling_converter, +) from docling_eval.legacy.doclaynet_v1.create import ( PRED_HTML_EXPORT_LABELS, TRUE_HTML_EXPORT_LABELS, diff --git a/docling_eval/legacy/dpbench/create.py b/docling_eval/legacy/dpbench/create.py index edaf1fdc..85c7c57a 100644 --- a/docling_eval/legacy/dpbench/create.py +++ b/docling_eval/legacy/dpbench/create.py @@ -17,18 +17,16 @@ from PIL import Image # as PILImage from tqdm import tqdm -from docling_eval.converters.conversion import ( - create_pdf_docling_converter, - create_smol_docling_converter, -) -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - TableFormerUpdater, -) -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) +from docling_eval.legacy.converters.conversion import ( + create_pdf_docling_converter, + create_smol_docling_converter, +) +from docling_eval.prediction_providers.tableformer_provider import TableFormerUpdater from docling_eval.utils.utils import ( add_pages_to_true_doc, convert_html_table_into_docling_tabledata, diff --git a/docling_eval/legacy/funsd/create.py b/docling_eval/legacy/funsd/create.py index bf9de885..7e6e15b1 100644 --- a/docling_eval/legacy/funsd/create.py +++ b/docling_eval/legacy/funsd/create.py @@ -12,8 +12,8 @@ from PIL import Image from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import create_image_docling_converter -from docling_eval.datamodels.constants import BenchMarkColumns, ConverterTypes +from docling_eval.datamodels.types import BenchMarkColumns, ConverterTypes +from docling_eval.legacy.converters.conversion import create_image_docling_converter from docling_eval.utils.utils import ( docling_version, extract_images, diff --git a/docling_eval/legacy/omnidocbench/create.py b/docling_eval/legacy/omnidocbench/create.py index dd36efa1..1fc93c1f 100644 --- a/docling_eval/legacy/omnidocbench/create.py +++ b/docling_eval/legacy/omnidocbench/create.py @@ -12,18 +12,16 @@ from PIL import Image # as PILImage from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import ( - create_pdf_docling_converter, - create_smol_docling_converter, -) -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - TableFormerUpdater, -) -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) +from docling_eval.legacy.converters.conversion import ( + create_pdf_docling_converter, + create_smol_docling_converter, +) +from docling_eval.prediction_providers.tableformer_provider import TableFormerUpdater from docling_eval.utils.utils import ( add_pages_to_true_doc, convert_html_table_into_docling_tabledata, diff --git a/docling_eval/legacy/tableformer_huggingface_otsl/create.py b/docling_eval/legacy/tableformer_huggingface_otsl/create.py index c1f7fbd9..f64bb947 100644 --- a/docling_eval/legacy/tableformer_huggingface_otsl/create.py +++ b/docling_eval/legacy/tableformer_huggingface_otsl/create.py @@ -18,15 +18,13 @@ from docling_core.types.doc.labels import DocItemLabel from tqdm import tqdm # type: ignore -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - PageTokens, - TableFormerUpdater, -) -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkColumns, ConverterTypes, EvaluationModality, + PageTokens, ) +from docling_eval.prediction_providers.tableformer_provider import TableFormerUpdater from docling_eval.utils.utils import ( convert_html_table_into_docling_tabledata, docling_version, diff --git a/docling_eval/legacy/xfund/create.py b/docling_eval/legacy/xfund/create.py index d7b4b6a9..03696d27 100644 --- a/docling_eval/legacy/xfund/create.py +++ b/docling_eval/legacy/xfund/create.py @@ -26,8 +26,8 @@ from PIL import Image from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import create_image_docling_converter -from docling_eval.datamodels.constants import BenchMarkColumns, ConverterTypes +from docling_eval.datamodels.types import BenchMarkColumns, ConverterTypes +from docling_eval.legacy.converters.conversion import create_image_docling_converter from docling_eval.utils.utils import ( crop_bounding_box, docling_version, diff --git a/docling_eval/prediction_providers/base_prediction_provider.py b/docling_eval/prediction_providers/base_prediction_provider.py index 464afbd4..0c025334 100644 --- a/docling_eval/prediction_providers/base_prediction_provider.py +++ b/docling_eval/prediction_providers/base_prediction_provider.py @@ -14,11 +14,11 @@ from docling_core.types.io import DocumentStream from tqdm import tqdm -from docling_eval.datamodels.constants import PredictionFormats from docling_eval.datamodels.dataset_record import ( DatasetRecord, DatasetRecordWithPrediction, ) +from docling_eval.datamodels.types import PredictionFormats from docling_eval.utils.utils import save_shard_to_disk, write_datasets_info from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters diff --git a/docling_eval/prediction_providers/docling_provider.py b/docling_eval/prediction_providers/docling_provider.py index 9bb265b8..4fc552cf 100644 --- a/docling_eval/prediction_providers/docling_provider.py +++ b/docling_eval/prediction_providers/docling_provider.py @@ -4,11 +4,11 @@ from docling.datamodel.base_models import ConversionStatus, InputFormat from docling.document_converter import DocumentConverter, FormatOption -from docling_eval.datamodels.constants import PredictionFormats from docling_eval.datamodels.dataset_record import ( DatasetRecord, DatasetRecordWithPrediction, ) +from docling_eval.datamodels.types import PredictionFormats from docling_eval.prediction_providers.base_prediction_provider import ( BasePredictionProvider, ) diff --git a/docling_eval/prediction_providers/file_provider.py b/docling_eval/prediction_providers/file_provider.py index aa679afd..c5591d4f 100644 --- a/docling_eval/prediction_providers/file_provider.py +++ b/docling_eval/prediction_providers/file_provider.py @@ -7,11 +7,11 @@ from docling_core.types.doc.document import DocTagsDocument, DocTagsPage from PIL import Image -from docling_eval.datamodels.constants import PredictionFormats from docling_eval.datamodels.dataset_record import ( DatasetRecord, DatasetRecordWithPrediction, ) +from docling_eval.datamodels.types import PredictionFormats from docling_eval.prediction_providers.base_prediction_provider import ( BasePredictionProvider, ) diff --git a/docling_eval/prediction_providers/tableformer_provider.py b/docling_eval/prediction_providers/tableformer_provider.py index 56802752..b4ebcaa6 100644 --- a/docling_eval/prediction_providers/tableformer_provider.py +++ b/docling_eval/prediction_providers/tableformer_provider.py @@ -1,22 +1,42 @@ import copy -from typing import Dict +import logging +from io import BytesIO +from pathlib import Path +from typing import Dict, List, Optional, Tuple -from docling.datamodel.base_models import ConversionStatus -from docling.datamodel.pipeline_options import TableFormerMode +import numpy as np +from docling.datamodel.base_models import ( + Cluster, + ConversionStatus, + LayoutPrediction, + Page, + Table, +) +from docling.datamodel.document import ConversionResult +from docling.datamodel.pipeline_options import ( + AcceleratorDevice, + AcceleratorOptions, + TableFormerMode, + TableStructureOptions, +) +from docling.models.table_structure_model import TableStructureModel +from docling_core.types import DoclingDocument +from docling_core.types.doc import DocItemLabel, TableCell, TableData, TableItem from docling_core.types.io import DocumentStream +from docling_parse.pdf_parsers import pdf_parser_v2 +from PIL import Image -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - TableFormerUpdater, -) -from docling_eval.datamodels.constants import PredictionFormats from docling_eval.datamodels.dataset_record import ( DatasetRecord, DatasetRecordWithPrediction, ) +from docling_eval.datamodels.types import PageToken, PageTokens, PredictionFormats from docling_eval.prediction_providers.base_prediction_provider import ( BasePredictionProvider, ) -from docling_eval.utils.utils import docling_models_version +from docling_eval.utils.utils import docling_models_version, get_input_document + +_log = logging.getLogger(__name__) class TableFormerPredictionProvider(BasePredictionProvider): @@ -65,3 +85,246 @@ def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: def info(self) -> Dict: return {"asset": "TableFormer", "version": docling_models_version()} + + +class TableFormerUpdater: + + def __init__( + self, + mode: TableFormerMode, + num_threads: int = 16, + artifacts_path: Optional[Path] = None, + ): + r""" """ + # Init the TableFormer model + table_structure_options = TableStructureOptions(mode=mode) + accelerator_options = AcceleratorOptions( + num_threads=num_threads, device=AcceleratorDevice.AUTO + ) + self._docling_tf_model = TableStructureModel( + enabled=True, + artifacts_path=artifacts_path, + options=table_structure_options, + accelerator_options=accelerator_options, + ) + _log.info("Initialize %s", mode) + + def to_np(self, pil_image: Image.Image): + # Convert to NumPy array + np_image = np.array(pil_image) + + # Handle different formats + if np_image.ndim == 3: # RGB or RGBA image + if np_image.shape[2] == 4: # RGBA image + # Discard alpha channel and convert to BGR + np_image = np_image[:, :, :3] # Keep only RGB channels + + # Convert RGB to BGR by reversing the last axis + np_image = np_image[:, :, ::-1] + + return np_image + else: + raise ValueError("Unsupported image format") + + def get_page_cells(self, filename: str): + + parser = pdf_parser_v2("fatal") + + try: + key = "key" + parser.load_document(key=key, filename=filename) + + parsed_doc = parser.parse_pdf_from_key(key=key) + + parser.unload_document(key) + return parsed_doc + + except Exception as exc: + _log.error(exc) + + return None + + def _make_internal_page_with_table(self, input_doc, prov): + page = Page(page_no=prov.page_no - 1) + page._backend = input_doc._backend.load_page(page.page_no) + page.cells = list(page._backend.get_text_cells()) + page.size = page._backend.get_size() + + if page._backend is not None and page._backend.is_valid(): + cluster = Cluster( + id=0, + label=DocItemLabel.TABLE, + bbox=prov.bbox.to_top_left_origin(page.size.height), + ) + for cell in page.cells: + overlap = cell.rect.to_bounding_box().intersection_area_with( + cluster.bbox + ) + if cell.rect.to_bounding_box().area() > 0: + overlap_ratio = overlap / cell.rect.to_bounding_box().area() + if overlap_ratio > 0.2: + cluster.cells.append(cell) + + page.predictions.layout = LayoutPrediction(clusters=[cluster]) + + return page + + def replace_tabledata( + self, + pdf_path: Path | BytesIO, + true_doc: DoclingDocument, + ) -> Tuple[bool, DoclingDocument]: + + updated = False + + # deep copy of the true-document + pred_doc = true_doc.model_copy(deep=True) + + input_doc = get_input_document(pdf_path) + if not input_doc.valid: + _log.error("could not parse pdf-file") + return False, pred_doc + + conv_res = ConversionResult(input=input_doc) + + # parsed_doc = self.get_page_cells(str(pdf_path)) + # if parsed_doc is None: + # log.error("could not parse pdf-file") + # return False, pred_doc + + # Replace the groundtruth tables with predictions from TableFormer + for item, level in pred_doc.iterate_items(): + if isinstance(item, TableItem): + for prov in item.prov: + page = self._make_internal_page_with_table(input_doc, prov) + + page = next(self._docling_tf_model(conv_res, [page])) # type: ignore + tbl: Table = page.predictions.tablestructure.table_map[0] + table_data: TableData = TableData( + num_rows=tbl.num_rows, + num_cols=tbl.num_cols, + table_cells=tbl.table_cells, + ) + + item.data = table_data + page._backend.unload() + + updated = True + + # md = item.export_to_markdown() + # print("prediction from table-former: \n\n", md) + + return updated, pred_doc + + def _tf_predict_with_page_tokens( + self, + page_image: Image.Image, + page_tokens: PageTokens, + table_bbox: Tuple[float, float, float, float], + image_scale: float = 1.0, + ): + r""" + Test the TFPredictor + """ + table_bboxes = [[table_bbox[0], table_bbox[1], table_bbox[2], table_bbox[3]]] + + ocr_page = page_tokens.dict() + + ocr_page["image"] = self.to_np(page_image) + ocr_page["table_bboxes"] = table_bboxes + + # TODO: Here we bypass docling API and we steal the tf_preditor private object :-( + predictor = self._docling_tf_model.tf_predictor + + # Loop over the iocr_pages + tf_output = predictor.multi_table_predict( + ocr_page, + table_bboxes=table_bboxes, + do_matching=True, + correct_overlapping_cells=False, + sort_row_col_indexes=True, + ) + # print("tf-output: ", json.dumps(tf_output, indent=2)) + + table_out = tf_output[0] + + do_cell_matching = True + + table_cells = [] + for element in table_out["tf_responses"]: + + tc = TableCell.model_validate(element) + if do_cell_matching and tc.bbox is not None: + tc.bbox = tc.bbox.scaled(1 / image_scale) + table_cells.append(tc) + + # Retrieving cols/rows, after post processing: + num_rows = table_out["predict_details"]["num_rows"] + num_cols = table_out["predict_details"]["num_cols"] + + table_data = TableData( + num_rows=num_rows, num_cols=num_cols, table_cells=table_cells + ) + + return table_data + + def replace_tabledata_with_page_tokens( + self, + true_doc: DoclingDocument, + true_page_images: List[Image.Image], + page_tokens: Optional[PageTokens] = None, + ) -> Tuple[bool, DoclingDocument]: + + updated = False + + # deep copy of the true-document + pred_doc = copy.deepcopy(true_doc) + + assert len(pred_doc.pages) == 1 + page_size = pred_doc.pages[1].size + + # Replace the groundtruth tables with predictions from TableFormer + for item, level in pred_doc.iterate_items(): + if isinstance(item, TableItem): + for prov in item.prov: + + # md = item.export_to_markdown() + # print("groundtruth: \n\n", md) + + page_image = true_page_images[prov.page_no - 1] + # page_image.show() + + # Ensure that the bbox will be inside the min/max ranges + table_bbox = ( + max(prov.bbox.l, 0.0), + max(prov.bbox.b, 0.0), + min(prov.bbox.r, page_size.width), + min(prov.bbox.t, page_size.height), + ) + + if page_tokens is None: + ptokens = [] + for ix, table_cell in enumerate(item.data.table_cells): + pt = PageToken( + bbox=table_cell.bbox, text=table_cell.text, id=ix + ) + ptokens.append(pt) + page_tokens = PageTokens( + tokens=ptokens, + height=prov.bbox.height, + width=prov.bbox.width, + ) + + table_data = self._tf_predict_with_page_tokens( + page_image=page_image, + page_tokens=page_tokens, + table_bbox=table_bbox, + ) + item.data = table_data + + updated = True + + # md = item.export_to_markdown() + # print("prediction from table-former: \n\n", md) + + return updated, pred_doc diff --git a/docling_eval/utils/utils.py b/docling_eval/utils/utils.py index 738ea76a..a2594a50 100644 --- a/docling_eval/utils/utils.py +++ b/docling_eval/utils/utils.py @@ -30,7 +30,7 @@ from PIL import Image from pydantic import AnyUrl -from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.datamodels.types import BenchMarkColumns def get_binhash(binary_data: bytes) -> str: diff --git a/docs/examples/benchmark_doclaynet_v1.py b/docs/examples/benchmark_doclaynet_v1.py index 64cc64eb..7eda76b7 100644 --- a/docs/examples/benchmark_doclaynet_v1.py +++ b/docs/examples/benchmark_doclaynet_v1.py @@ -3,7 +3,7 @@ from pathlib import Path from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.doclaynet_v1.create import create_dlnv1_e2e_dataset # Configure logging diff --git a/docs/examples/benchmark_doclaynet_v2.py b/docs/examples/benchmark_doclaynet_v2.py index cd0f3749..a3d90c60 100644 --- a/docs/examples/benchmark_doclaynet_v2.py +++ b/docs/examples/benchmark_doclaynet_v2.py @@ -5,7 +5,7 @@ from tabulate import tabulate # type: ignore from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.doclaynet_v2.create import create_dlnv2_e2e_dataset # Configure logging diff --git a/docs/examples/benchmark_dpbench.py b/docs/examples/benchmark_dpbench.py index e7d3050b..c3155ca2 100644 --- a/docs/examples/benchmark_dpbench.py +++ b/docs/examples/benchmark_dpbench.py @@ -5,7 +5,7 @@ from huggingface_hub import snapshot_download from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.dpbench.create import ( create_dpbench_e2e_dataset, create_dpbench_tableformer_dataset, diff --git a/docs/examples/benchmark_omnidocbench.py b/docs/examples/benchmark_omnidocbench.py index 007576a3..00e51c3f 100644 --- a/docs/examples/benchmark_omnidocbench.py +++ b/docs/examples/benchmark_omnidocbench.py @@ -5,7 +5,7 @@ from huggingface_hub import snapshot_download from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.omnidocbench.create import ( create_omnidocbench_e2e_dataset, create_omnidocbench_tableformer_dataset, diff --git a/docs/examples/benchmark_tableformer_fintabnet.py b/docs/examples/benchmark_tableformer_fintabnet.py index 70008e07..d7c6fc4a 100644 --- a/docs/examples/benchmark_tableformer_fintabnet.py +++ b/docs/examples/benchmark_tableformer_fintabnet.py @@ -3,7 +3,7 @@ from pathlib import Path from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.tableformer_huggingface_otsl.create import ( create_fintabnet_tableformer_dataset, ) diff --git a/docs/examples/benchmark_tableformer_p1m.py b/docs/examples/benchmark_tableformer_p1m.py index 9f0ba6a9..8b5baa8b 100644 --- a/docs/examples/benchmark_tableformer_p1m.py +++ b/docs/examples/benchmark_tableformer_p1m.py @@ -3,7 +3,7 @@ from pathlib import Path from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.tableformer_huggingface_otsl.create import ( create_p1m_tableformer_dataset, ) diff --git a/docs/examples/benchmark_tableformer_pubtabnet.py b/docs/examples/benchmark_tableformer_pubtabnet.py index 2f4810c5..7bb28aa5 100644 --- a/docs/examples/benchmark_tableformer_pubtabnet.py +++ b/docs/examples/benchmark_tableformer_pubtabnet.py @@ -3,7 +3,7 @@ from pathlib import Path from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.tableformer_huggingface_otsl.create import ( create_pubtabnet_tableformer_dataset, ) diff --git a/docs/examples/create_funsd.py b/docs/examples/create_funsd.py index 69b506b4..e87cccf3 100644 --- a/docs/examples/create_funsd.py +++ b/docs/examples/create_funsd.py @@ -2,7 +2,7 @@ import os from pathlib import Path -from docling_eval.datamodels.constants import BenchMarkNames +from docling_eval.datamodels.types import BenchMarkNames from docling_eval.legacy.funsd.create import create_funsd_dataset # Configure logging diff --git a/docs/examples/create_xfund.py b/docs/examples/create_xfund.py index 2eade602..99d934bf 100644 --- a/docs/examples/create_xfund.py +++ b/docs/examples/create_xfund.py @@ -2,7 +2,7 @@ import os from pathlib import Path -from docling_eval.datamodels.constants import BenchMarkNames +from docling_eval.datamodels.types import BenchMarkNames from docling_eval.legacy.xfund.create import create_xfund_dataset # Configure logging diff --git a/docs/examples/package_pdfs.py b/docs/examples/package_pdfs.py index daa58117..e6eb4601 100644 --- a/docs/examples/package_pdfs.py +++ b/docs/examples/package_pdfs.py @@ -8,8 +8,8 @@ from docling_core.types.doc.labels import DocItemLabel from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import create_pdf_docling_converter -from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.datamodels.types import BenchMarkColumns +from docling_eval.legacy.converters.conversion import create_pdf_docling_converter from docling_eval.utils.utils import ( docling_version, from_pil_to_base64, diff --git a/docs/examples/package_pngs.py b/docs/examples/package_pngs.py index 990bf9f7..b90bf749 100644 --- a/docs/examples/package_pngs.py +++ b/docs/examples/package_pngs.py @@ -9,8 +9,8 @@ from docling_core.types.doc.labels import DocItemLabel from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import create_image_docling_converter -from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.datamodels.types import BenchMarkColumns +from docling_eval.legacy.converters.conversion import create_image_docling_converter from docling_eval.utils.utils import ( docling_version, extract_images, diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 47e7e112..1bf4066c 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -12,7 +12,7 @@ from docling.models.factories import get_ocr_factory from docling_eval.cli.main import evaluate -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkNames, EvaluationModality, PredictionFormats, @@ -117,7 +117,7 @@ def test_run_doclaynet_with_doctags_fileprovider(): dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk( - chunk_size=5, max_num_chunks=1 + chunk_size=80 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. file_provider.create_prediction_dataset( @@ -322,7 +322,7 @@ def test_run_fintabnet_builder(): evaluate( modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.DPBENCH, + benchmark=BenchMarkNames.FINTABNET, idir=target_path / "eval_dataset", odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) @@ -349,7 +349,7 @@ def test_run_p1m_builder(): evaluate( modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.DPBENCH, + benchmark=BenchMarkNames.PUB1M, idir=target_path / "eval_dataset", odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) From 86744a7732ef56e9df6bb10d71305887c59eda11 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Wed, 26 Mar 2025 21:37:12 +0100 Subject: [PATCH 42/81] Small test fixes Signed-off-by: Christoph Auer --- tests/test_dataset_builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 1bf4066c..035e17cf 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -105,7 +105,7 @@ def test_run_doclaynet_with_doctags_fileprovider(): file_provider = FilePredictionProvider( prediction_format=PredictionFormats.DOCTAGS, source_path=Path("./tests/data/doclaynet_v1_doctags_sample"), - do_visualization=True, + do_visualization=False, ignore_missing_files=True, ) From 9291b78331bb0e957233c7d7cc0b1a9e80a31470 Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Thu, 27 Mar 2025 18:14:59 +0100 Subject: [PATCH 43/81] fix: Add the "prediction_format" in the serialization of DatasetRecordWithPrediction Signed-off-by: Nikos Livathinos --- docling_eval/datamodels/dataset_record.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docling_eval/datamodels/dataset_record.py b/docling_eval/datamodels/dataset_record.py index b0fd7fe5..add0936a 100644 --- a/docling_eval/datamodels/dataset_record.py +++ b/docling_eval/datamodels/dataset_record.py @@ -200,10 +200,16 @@ def features(cls): cls.get_field_alias("original"): Value("string"), cls.get_field_alias("mime_type"): Value("string"), cls.get_field_alias("modalities"): Sequence(Value("string")), + cls.get_field_alias("prediction_format"): Value("string"), } def as_record_dict(self): record = super().as_record_dict() + record.update( + { + self.get_field_alias("prediction_format"): self.prediction_format.value, + } + ) if self.predicted_doc is not None: record.update( From 5fa0a0d9bbf3d41333087bbdb647e4c90bbe26b2 Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Thu, 27 Mar 2025 18:22:09 +0100 Subject: [PATCH 44/81] feat: Refactor the MarkdownTextEvaluator to support the new classes design. Add unit test. Signed-off-by: Nikos Livathinos --- docling_eval/evaluators/base_evaluator.py | 10 +- .../evaluators/markdown_text_evaluator.py | 98 ++++++++++--------- tests/test_markdown_text_evaluator.py | 33 +++++++ 3 files changed, 93 insertions(+), 48 deletions(-) create mode 100644 tests/test_markdown_text_evaluator.py diff --git a/docling_eval/evaluators/base_evaluator.py b/docling_eval/evaluators/base_evaluator.py index 8a7416a2..d5c93fa8 100644 --- a/docling_eval/evaluators/base_evaluator.py +++ b/docling_eval/evaluators/base_evaluator.py @@ -18,18 +18,26 @@ class BaseEvaluator: Base class for all evaluators """ - def __init__(self, intermediate_evaluations_path: Optional[Path] = None): + def __init__( + self, + intermediate_evaluations_path: Optional[Path] = None, + prediction_sources: List[PredictionFormats] = [ + PredictionFormats.DOCLING_DOCUMENT + ], + ): r""" Parameters ---------- intermediate_evaluations_path: When True the evalution per example will be saved in a file """ self._intermediate_evaluations_path = intermediate_evaluations_path + self._prediction_sources = prediction_sources def __call__( self, ds_path: Path, split: str = "test", + # Remove the ext_predictions when all evaluators have been migrated to the new design ext_predictions: Optional[ Dict[str, Any] ] = None, # Optionally provided external predictions diff --git a/docling_eval/evaluators/markdown_text_evaluator.py b/docling_eval/evaluators/markdown_text_evaluator.py index f5690a57..7be8e48a 100644 --- a/docling_eval/evaluators/markdown_text_evaluator.py +++ b/docling_eval/evaluators/markdown_text_evaluator.py @@ -1,6 +1,6 @@ import logging from pathlib import Path -from typing import Any, List, Optional, Set, Union +from typing import Any, Dict, List, Optional, Set, Union import evaluate import nltk @@ -18,6 +18,7 @@ BenchMarkColumns, PredictionFormats, ) +from docling_eval.datamodels.dataset_record import DatasetRecordWithPrediction from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation from docling_eval.evaluators.stats import DatasetStatistics, compute_stats @@ -49,9 +50,29 @@ class DatasetMarkdownEvaluation(DatasetEvaluation): class MarkdownTextEvaluator(BaseEvaluator): - def __init__(self, intermediate_evaluations_path: Optional[Path] = None): + def __init__( + self, + intermediate_evaluations_path: Optional[Path] = None, + prediction_sources: List[PredictionFormats] = [ + PredictionFormats.DOCLING_DOCUMENT, + PredictionFormats.MARKDOWN, + ], + ): r""" """ - super().__init__(intermediate_evaluations_path=intermediate_evaluations_path) + super().__init__( + intermediate_evaluations_path=intermediate_evaluations_path, + prediction_sources=prediction_sources, + ) + + # Validate the prediction_sources + self._supported_prediction_formats = [ + PredictionFormats.DOCLING_DOCUMENT, + PredictionFormats.MARKDOWN, + ] + if set(prediction_sources) - set(self._supported_prediction_formats): + msg = "Unsupported prediction_sources. " + msg += f"It should be something out of {self._supported_prediction_formats}" + raise RuntimeError(msg) self._bleu_eval = evaluate.load("bleu") @@ -88,21 +109,20 @@ def __call__( self, ds_path: Path, split: str = "test", - ext_predictions: Optional[dict[str, Union[DoclingDocument, str]]] = None, + # Remove the ext_predictions when all evaluators have been migrated to the new design + ext_predictions: Optional[ + Dict[str, Any] + ] = None, # Optionally provided external predictions ) -> DatasetMarkdownEvaluation: r""" Parameters ---------- ds_path: Path to load the parquet files of the dataset split: Split of the dataset to load - ext_predictions: Optionally provide the prediction markdown input content. - If such dict is provided, it will be used to provide the markdown content. - The dict is indexed by the DOC_ID and the value is either the markdown - content or a DoclingDocument. """ parquet_files = str(ds_path / split / "*.parquet") ds = load_dataset("parquet", data_files={split: parquet_files}) - _log.info(f"oveview of dataset: {ds}") + _log.info(f"Overview of the dataset: {ds}") if ds is not None: ds_selection = ds[split] @@ -124,32 +144,15 @@ def __call__( ncols=120, total=len(ds_selection), ): - - # To be ported to: - # DatasetRecordWithPrediction.model_validate(data) - - doc_id = data[BenchMarkColumns.DOC_ID] - true_doc_dict = data[BenchMarkColumns.GROUNDTRUTH] - true_doc: DoclingDocument = DoclingDocument.model_validate_json( - true_doc_dict - ) - pred_doc_dict = data[BenchMarkColumns.PREDICTION] - pred_doc: DoclingDocument = DoclingDocument.model_validate_json( - pred_doc_dict - ) - + data_record = DatasetRecordWithPrediction.model_validate(data) + doc_id = data_record.doc_id + true_doc = data_record.ground_truth_doc true_md = self._docdoc_to_md(true_doc) + pred_md = self._get_pred_md(data_record) - # Get the predicted markdown content either from the external iterator or from dataset - if ext_predictions is not None: - if doc_id not in ext_predictions: - _log.error( - "The provided pred_md does not contain the doc_id: %s", doc_id - ) - continue - pred_md = self._md_from_external(ext_predictions[doc_id]) - else: - pred_md = self._docdoc_to_md(pred_doc) + if pred_md is None: + _log.error("There is no markdown prediction for doc_id=%s", doc_id) + continue bleu = 0.0 if true_md != "" and pred_md != "": @@ -225,10 +228,7 @@ def _compute_nltk_scores(self, true_txt: str, pred_txt: str) -> dict[str, float] def supported_prediction_formats(self) -> List[PredictionFormats]: r""" """ - return [ - PredictionFormats.DOCLING_DOCUMENT, - PredictionFormats.MARKDOWN, - ] + return self._supported_prediction_formats def _docdoc_to_md(self, doc: DoclingDocument) -> str: r""" @@ -242,15 +242,19 @@ def _docdoc_to_md(self, doc: DoclingDocument) -> str: ) return md - def _md_from_external(self, ext_pred: Any) -> str: + def _get_pred_md(self, data_record: DatasetRecordWithPrediction) -> Optional[str]: r""" - Get an external prediction and based on its type return the markdown prediction + Get the predicted markdown """ - if isinstance(ext_pred, str): - return ext_pred - elif isinstance(ext_pred, DoclingDocument): - return self._docdoc_to_md(ext_pred) - else: - raise RuntimeError( - f"Unsupported external prediction of type: {type(ext_pred)}" - ) + pred_md = None + for prediction_format in self._prediction_sources: + if prediction_format == PredictionFormats.DOCLING_DOCUMENT: + pred_doc = data_record.predicted_doc + if pred_doc is not None: + pred_md = self._docdoc_to_md(pred_doc) + elif prediction_format == PredictionFormats.MARKDOWN: + pred_md = data_record.original_prediction + if pred_md is not None: + break + + return pred_md diff --git a/tests/test_markdown_text_evaluator.py b/tests/test_markdown_text_evaluator.py new file mode 100644 index 00000000..df1d960e --- /dev/null +++ b/tests/test_markdown_text_evaluator.py @@ -0,0 +1,33 @@ +from pathlib import Path + +from docling_eval.datamodels.constants import PredictionFormats +from docling_eval.evaluators.markdown_text_evaluator import MarkdownTextEvaluator + + +def test_markdown_text_evaluator(): + r""" """ + # TODO: Ensure that the test dataset exists + test_dataset_dir = Path("scratch/DocLayNetV1/eval_dataset") + + # Default evaluator + eval1 = MarkdownTextEvaluator() + v1 = eval1(test_dataset_dir) + assert v1 is not None + + # Specify order in prediction_sources + eval2 = MarkdownTextEvaluator(prediction_sources=[PredictionFormats.MARKDOWN]) + v2 = eval2(test_dataset_dir) + assert v2 is not None + + # Specify invalid order in prediction_sources + is_exception = False + try: + eval3 = MarkdownTextEvaluator(prediction_sources=[PredictionFormats.JSON]) + eval3(test_dataset_dir) + except RuntimeError as ex: + is_exception = True + assert is_exception + + +# if __name__ == "__main__": +# test_markdown_text_evaluator() From c3a2929964ae90d11a3ec4f3e7e50e83e58ceb75 Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Thu, 27 Mar 2025 20:22:36 +0100 Subject: [PATCH 45/81] fix: Improve the new design of MarkdownEvaluator to move common functionalities into the base class Signed-off-by: Nikos Livathinos --- docling_eval/evaluators/base_evaluator.py | 12 ++++++- .../evaluators/markdown_text_evaluator.py | 32 +++++++------------ 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/docling_eval/evaluators/base_evaluator.py b/docling_eval/evaluators/base_evaluator.py index d5c93fa8..23c38a53 100644 --- a/docling_eval/evaluators/base_evaluator.py +++ b/docling_eval/evaluators/base_evaluator.py @@ -24,6 +24,9 @@ def __init__( prediction_sources: List[PredictionFormats] = [ PredictionFormats.DOCLING_DOCUMENT ], + supported_prediction_formats: List[PredictionFormats] = [ + PredictionFormats.DOCLING_DOCUMENT + ], ): r""" Parameters @@ -31,7 +34,14 @@ def __init__( intermediate_evaluations_path: When True the evalution per example will be saved in a file """ self._intermediate_evaluations_path = intermediate_evaluations_path + + # Validate the prediction_sources + if set(prediction_sources) - set(supported_prediction_formats): + msg = "Unsupported prediction_sources. " + msg += f"It should be something out of {supported_prediction_formats}" + raise RuntimeError(msg) self._prediction_sources = prediction_sources + self._supported_prediction_sources = supported_prediction_formats def __call__( self, @@ -51,4 +61,4 @@ def supported_prediction_formats(self) -> List[PredictionFormats]: r""" Return the supported formats for predictions """ - return [PredictionFormats.DOCLING_DOCUMENT] + return self._supported_prediction_formats diff --git a/docling_eval/evaluators/markdown_text_evaluator.py b/docling_eval/evaluators/markdown_text_evaluator.py index 7be8e48a..933fea40 100644 --- a/docling_eval/evaluators/markdown_text_evaluator.py +++ b/docling_eval/evaluators/markdown_text_evaluator.py @@ -53,27 +53,21 @@ class MarkdownTextEvaluator(BaseEvaluator): def __init__( self, intermediate_evaluations_path: Optional[Path] = None, - prediction_sources: List[PredictionFormats] = [ - PredictionFormats.DOCLING_DOCUMENT, - PredictionFormats.MARKDOWN, - ], + prediction_sources: List[PredictionFormats] = [], ): r""" """ + supported_prediction_formats: List[PredictionFormats] = [ + PredictionFormats.DOCLING_DOCUMENT, + PredictionFormats.MARKDOWN, + ] + if not prediction_sources: + prediction_sources = supported_prediction_formats super().__init__( intermediate_evaluations_path=intermediate_evaluations_path, prediction_sources=prediction_sources, + supported_prediction_formats=supported_prediction_formats, ) - # Validate the prediction_sources - self._supported_prediction_formats = [ - PredictionFormats.DOCLING_DOCUMENT, - PredictionFormats.MARKDOWN, - ] - if set(prediction_sources) - set(self._supported_prediction_formats): - msg = "Unsupported prediction_sources. " - msg += f"It should be something out of {self._supported_prediction_formats}" - raise RuntimeError(msg) - self._bleu_eval = evaluate.load("bleu") # Download the NLTK data @@ -147,7 +141,7 @@ def __call__( data_record = DatasetRecordWithPrediction.model_validate(data) doc_id = data_record.doc_id true_doc = data_record.ground_truth_doc - true_md = self._docdoc_to_md(true_doc) + true_md = self._docling_document_to_md(true_doc) pred_md = self._get_pred_md(data_record) if pred_md is None: @@ -226,11 +220,7 @@ def _compute_nltk_scores(self, true_txt: str, pred_txt: str) -> dict[str, float] } return metrics - def supported_prediction_formats(self) -> List[PredictionFormats]: - r""" """ - return self._supported_prediction_formats - - def _docdoc_to_md(self, doc: DoclingDocument) -> str: + def _docling_document_to_md(self, doc: DoclingDocument) -> str: r""" Export DoclingDocument to markdown """ @@ -251,7 +241,7 @@ def _get_pred_md(self, data_record: DatasetRecordWithPrediction) -> Optional[str if prediction_format == PredictionFormats.DOCLING_DOCUMENT: pred_doc = data_record.predicted_doc if pred_doc is not None: - pred_md = self._docdoc_to_md(pred_doc) + pred_md = self._docling_document_to_md(pred_doc) elif prediction_format == PredictionFormats.MARKDOWN: pred_md = data_record.original_prediction if pred_md is not None: From 5b971c91782b2c2a73c642f4ccbb88a5aea2f541 Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Thu, 27 Mar 2025 20:23:40 +0100 Subject: [PATCH 46/81] feat: Refactor the LayoutEvaluator to use the new class design. Add unit test. Signed-off-by: Nikos Livathinos --- docling_eval/evaluators/layout_evaluator.py | 112 ++++++++++++-------- docling_eval/utils/utils.py | 23 ++++ tests/test_layout_evaluator.py | 34 ++++++ 3 files changed, 124 insertions(+), 45 deletions(-) create mode 100644 tests/test_layout_evaluator.py diff --git a/docling_eval/evaluators/layout_evaluator.py b/docling_eval/evaluators/layout_evaluator.py index 8e72cd84..c4f9c761 100644 --- a/docling_eval/evaluators/layout_evaluator.py +++ b/docling_eval/evaluators/layout_evaluator.py @@ -16,8 +16,10 @@ from tqdm import tqdm # type: ignore from docling_eval.datamodels.constants import BenchMarkColumns, PredictionFormats +from docling_eval.datamodels.dataset_record import DatasetRecordWithPrediction from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation from docling_eval.evaluators.stats import DatasetStatistics, compute_stats +from docling_eval.utils.utils import docling_document_from_doctags _log = logging.getLogger(__name__) @@ -90,8 +92,21 @@ def __init__( self, label_mapping: Optional[Dict[DocItemLabel, Optional[DocItemLabel]]] = None, intermediate_evaluations_path: Optional[Path] = None, + prediction_sources: List[PredictionFormats] = [], ): - super().__init__(intermediate_evaluations_path=intermediate_evaluations_path) + supported_prediction_formats: List[PredictionFormats] = [ + PredictionFormats.DOCLING_DOCUMENT, + PredictionFormats.DOCTAGS, + PredictionFormats.JSON, + PredictionFormats.YAML, + ] + if not prediction_sources: + prediction_sources = supported_prediction_formats + super().__init__( + intermediate_evaluations_path=intermediate_evaluations_path, + prediction_sources=prediction_sources, + supported_prediction_formats=supported_prediction_formats, + ) self.filter_labels = [] self.label_names = {} @@ -105,6 +120,7 @@ def __call__( self, ds_path: Path, split: str = "test", + # Remove the ext_predictions when all evaluators have been migrated to the new design ext_predictions: Optional[Dict[str, DoclingDocument]] = None, ) -> DatasetLayoutEvaluation: logging.info("Loading the split '%s' from: '%s'", split, ds_path) @@ -120,7 +136,7 @@ def __call__( ds_selection: Dataset = ds[split] true_labels, pred_labels, intersection_labels = self._find_intersecting_labels( - ds_selection, pred_dict=ext_predictions + ds_selection ) intersection_labels_str = "\n" + "\n".join(sorted(intersection_labels)) logging.info(f"Intersection labels: {intersection_labels_str}") @@ -136,18 +152,13 @@ def __call__( ncols=120, total=len(ds_selection), ): - doc_id = data[BenchMarkColumns.DOC_ID] - - true_doc_dict = data[BenchMarkColumns.GROUNDTRUTH] - true_doc = DoclingDocument.model_validate_json(true_doc_dict) - if ext_predictions is None: - pred_doc_dict = data[BenchMarkColumns.PREDICTION] - pred_doc = DoclingDocument.model_validate_json(pred_doc_dict) - else: - if doc_id not in ext_predictions: - _log.error("Missing pred_doc from dict argument for %s", doc_id) - continue - pred_doc = ext_predictions[doc_id] + data_record = DatasetRecordWithPrediction.model_validate(data) + doc_id = data_record.doc_id + true_doc = data_record.ground_truth_doc + pred_doc = self._get_pred_doc(data_record) + if not pred_doc: + _log.error("There is no prediction for doc_id=%s", doc_id) + continue gts, preds = self._extract_layout_data( doc_id=doc_id, @@ -274,6 +285,33 @@ def __call__( intersecting_labels=[_.value for _ in intersection_labels], ) + def _get_pred_doc( + self, data_record: DatasetRecordWithPrediction + ) -> Optional[DoclingDocument]: + r""" + Get the predicted DoclingDocument + """ + pred_doc = None + for prediction_format in self._prediction_sources: + if prediction_format == PredictionFormats.DOCLING_DOCUMENT: + pred_doc = data_record.predicted_doc + elif prediction_format == PredictionFormats.JSON: + if data_record.original_prediction: + pred_doc = DoclingDocument.load_from_json( + data_record.original_prediction + ) + elif prediction_format == PredictionFormats.YAML: + if data_record.original_prediction: + pred_doc = DoclingDocument.load_from_yaml( + data_record.original_prediction + ) + elif prediction_format == PredictionFormats.DOCTAGS: + pred_doc = docling_document_from_doctags(data_record) + if pred_doc is not None: + break + + return pred_doc + def _compute_iou(self, box1, box2): """Compute IoU between two bounding boxes.""" x1 = torch.max(box1[0], box2[0]) @@ -362,7 +400,8 @@ def _compute_average_iou_with_labels_across_iou( } def _find_intersecting_labels( - self, ds: Dataset, pred_dict: Optional[Dict[str, DoclingDocument]] = None + self, + ds: Dataset, ) -> tuple[dict[str, int], dict[str, int], list[DocItemLabel]]: r""" Compute counters per labels for the groundtruth, prediciton and their intersections @@ -380,19 +419,9 @@ def _find_intersecting_labels( for i, data in tqdm( enumerate(ds), desc="Layout evaluations", ncols=120, total=len(ds) ): - doc_id = data[BenchMarkColumns.DOC_ID] - - true_doc_dict = data[BenchMarkColumns.GROUNDTRUTH] - true_doc = DoclingDocument.model_validate_json(true_doc_dict) - - if pred_dict is None: - pred_doc_dict = data[BenchMarkColumns.PREDICTION] - pred_doc = DoclingDocument.model_validate_json(pred_doc_dict) - else: - if doc_id not in pred_dict: - _log.error("Missing pred_doc from dict argument for %s", doc_id) - continue - pred_doc = pred_dict[doc_id] + data_record = DatasetRecordWithPrediction.model_validate(data) + true_doc = data_record.ground_truth_doc + pred_doc = self._get_pred_doc(data_record) for item, level in true_doc.iterate_items(): if isinstance(item, DocItem): # and item.label in filter_labels: @@ -404,15 +433,16 @@ def _find_intersecting_labels( elif self.label_mapping[item.label]: true_labels[self.label_mapping[item.label]] = 1 # type: ignore - for item, level in pred_doc.iterate_items(): - if isinstance(item, DocItem): # and item.label in filter_labels: - for prov in item.prov: - if item.label in [ - self.label_mapping[v] for v in pred_labels if v is not None # type: ignore - ]: - pred_labels[item.label] += 1 - elif self.label_mapping[item.label] is not None: - pred_labels[self.label_mapping[item.label]] = 1 # type: ignore + if pred_doc: + for item, level in pred_doc.iterate_items(): + if isinstance(item, DocItem): # and item.label in filter_labels: + for prov in item.prov: + if item.label in [ + self.label_mapping[v] for v in pred_labels if v is not None # type: ignore + ]: + pred_labels[item.label] += 1 + elif self.label_mapping[item.label] is not None: + pred_labels[self.label_mapping[item.label]] = 1 # type: ignore """ logging.info(f"True labels:") @@ -447,8 +477,6 @@ def _extract_layout_data( ground_truths: List of dict with keys "bboxes", "labels" and values are tensors predictions: List of dict with keys "bboxes", "labels", "scores" and values are tensors """ - - # logging.info(f"#-true-tables: {len(true_tables)}, #-pred-tables: {len(pred_tables)}") assert len(true_doc.pages) == len( pred_doc.pages ), f"len(true_doc.pages)==len(pred_doc.pages) => {len(true_doc.pages)}=={len(pred_doc.pages)}" @@ -561,9 +589,3 @@ def _extract_layout_data( # print(pred_tl_bboxes_str) return ground_truths, predictions - - def supported_prediction_formats(self) -> List[PredictionFormats]: - r""" - Return the supported formats for predictions - """ - return [PredictionFormats.DOCLING_DOCUMENT] diff --git a/docling_eval/utils/utils.py b/docling_eval/utils/utils.py index 738ea76a..c5b9039e 100644 --- a/docling_eval/utils/utils.py +++ b/docling_eval/utils/utils.py @@ -20,6 +20,8 @@ from docling_core.types.doc.base import BoundingBox, Size from docling_core.types.doc.document import ( DoclingDocument, + DocTagsDocument, + DocTagsPage, GraphData, ImageRef, PageItem, @@ -31,6 +33,7 @@ from pydantic import AnyUrl from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.datamodels.dataset_record import DatasetRecordWithPrediction def get_binhash(binary_data: bytes) -> str: @@ -514,3 +517,23 @@ def classify_cells(graph: GraphData) -> None: else: # fallback case. cell.label = GraphCellLabel.UNSPECIFIED + + +def docling_document_from_doctags( + data_record: DatasetRecordWithPrediction, +) -> DoclingDocument: + r""" """ + doc_id = data_record.doc_id + doctags = data_record.original + page_image = ( + data_record.ground_truth_page_images[0] + if data_record.ground_truth_page_images + else None + ) + + doctags_page = DocTagsPage(tokens=doctags, image=page_image) + doctags_doc = DocTagsDocument(pages=[doctags_page]) + pred_doc = DoclingDocument(name=doc_id) + pred_doc.load_from_doctags(doctags_doc) + + return pred_doc diff --git a/tests/test_layout_evaluator.py b/tests/test_layout_evaluator.py new file mode 100644 index 00000000..6eea86fc --- /dev/null +++ b/tests/test_layout_evaluator.py @@ -0,0 +1,34 @@ +from pathlib import Path + +from docling_eval.datamodels.constants import PredictionFormats +from docling_eval.evaluators.layout_evaluator import LayoutEvaluator +from docling_eval.evaluators.markdown_text_evaluator import MarkdownTextEvaluator + + +def test_layout_evaluator(): + r""" """ + # TODO: Ensure that the test dataset exists + test_dataset_dir = Path("scratch/DocLayNetV1/eval_dataset") + + # Default evaluator + eval1 = LayoutEvaluator() + v1 = eval1(test_dataset_dir) + assert v1 is not None + + # Specify order in prediction_sources + eval2 = LayoutEvaluator(prediction_sources=[PredictionFormats.JSON]) + v2 = eval2(test_dataset_dir) + assert v2 is not None + + # Specify invalid order in prediction_sources + is_exception = False + try: + eval3 = LayoutEvaluator(prediction_sources=[PredictionFormats.MARKDOWN]) + eval3(test_dataset_dir) + except RuntimeError as ex: + is_exception = True + assert is_exception + + +if __name__ == "__main__": + test_layout_evaluator() From ed7c5e0c3948bc62cff80495680cae8778aac141 Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Thu, 27 Mar 2025 20:46:50 +0100 Subject: [PATCH 47/81] fix: Clean up LayoutEvaluator code Signed-off-by: Nikos Livathinos --- docling_eval/evaluators/layout_evaluator.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/docling_eval/evaluators/layout_evaluator.py b/docling_eval/evaluators/layout_evaluator.py index c4f9c761..7b9927c9 100644 --- a/docling_eval/evaluators/layout_evaluator.py +++ b/docling_eval/evaluators/layout_evaluator.py @@ -161,7 +161,6 @@ def __call__( continue gts, preds = self._extract_layout_data( - doc_id=doc_id, true_doc=true_doc, pred_doc=pred_doc, filter_labels=intersection_labels, @@ -463,7 +462,6 @@ def _find_intersecting_labels( def _extract_layout_data( self, - doc_id: str, true_doc: DoclingDocument, pred_doc: DoclingDocument, filter_labels: List[DocItemLabel], From 8243a2695272546269ed29f5efb0295e3847dd17 Mon Sep 17 00:00:00 2001 From: Christoph Auer <60343111+cau-git@users.noreply.github.com> Date: Fri, 28 Mar 2025 11:09:45 +0100 Subject: [PATCH 48/81] chore: Implementation cleanup and fixes for new class design (#52) * More module removal and renaming Signed-off-by: Christoph Auer * Small test fixes Signed-off-by: Christoph Auer * Small test fixes Signed-off-by: Christoph Auer * Cleanup of tests and more fixes Signed-off-by: Christoph Auer --------- Signed-off-by: Christoph Auer --- docling_eval/cli/main.py | 3 +- docling_eval/converters/models/__init__.py | 0 .../reading_order/reading_order_updater.py | 56 -- .../converters/models/tableformer/__init__.py | 0 .../models/tableformer/tf_model_prediction.py | 289 ----------- docling_eval/datamodels/dataset_record.py | 2 +- .../datamodels/{constants.py => types.py} | 18 + .../dataset_builders/dataset_builder.py | 107 +++- .../dataset_builders/doclaynet_v1_builder.py | 140 ++--- .../dataset_builders/doclaynet_v2_builder.py | 72 ++- .../dataset_builders/dpbench_builder.py | 110 ++-- .../dataset_builders/funsd_builder.py | 107 +++- .../dataset_builders/omnidocbench_builder.py | 148 ++++-- .../otsl_table_dataset_builder.py | 118 ++++- .../dataset_builders/xfund_builder.py | 105 +++- docling_eval/evaluators/base_evaluator.py | 2 +- .../evaluators/base_readingorder_evaluator.py | 2 +- .../evaluators/bbox_text_evaluator.py | 2 +- docling_eval/evaluators/layout_evaluator.py | 2 +- .../evaluators/markdown_text_evaluator.py | 2 +- .../evaluators/readingorder_evaluator_glm.py | 76 --- docling_eval/evaluators/table_evaluator.py | 2 +- .../{ => legacy}/converters/__init__.py | 0 .../{ => legacy}/converters/conversion.py | 0 docling_eval/legacy/cvat_annotation/create.py | 4 +- .../create_dataset_from_pdfs.py | 4 +- .../legacy/cvat_annotation/preannotate.py | 2 +- docling_eval/legacy/doclaynet_v1/create.py | 10 +- docling_eval/legacy/doclaynet_v2/create.py | 10 +- docling_eval/legacy/dpbench/create.py | 14 +- docling_eval/legacy/funsd/create.py | 4 +- docling_eval/legacy/omnidocbench/create.py | 14 +- .../tableformer_huggingface_otsl/create.py | 8 +- docling_eval/legacy/xfund/create.py | 4 +- .../base_prediction_provider.py | 253 +++++++-- .../prediction_providers/docling_provider.py | 62 ++- .../prediction_providers/file_provider.py | 212 ++++++-- .../tableformer_provider.py | 489 ++++++++++++++++-- docling_eval/utils/utils.py | 23 +- docs/examples/benchmark_doclaynet_v1.py | 2 +- docs/examples/benchmark_doclaynet_v2.py | 2 +- docs/examples/benchmark_dpbench.py | 2 +- docs/examples/benchmark_omnidocbench.py | 2 +- .../benchmark_tableformer_fintabnet.py | 2 +- docs/examples/benchmark_tableformer_p1m.py | 2 +- .../benchmark_tableformer_pubtabnet.py | 2 +- docs/examples/create_funsd.py | 2 +- docs/examples/create_xfund.py | 2 +- docs/examples/package_pdfs.py | 4 +- docs/examples/package_pngs.py | 4 +- ...3fd9c23543fbbafc9408cbb372b1f4898095a66.dt | 8 - ...074e8a6810bc4b96f1e7aab53051d0b5adfe38a.dt | 12 - ...49c038171a06ddfcac892c3c6d7e6b4091c642.txt | 9 + ...33e7e7216d615b9797444f3a220b8768636ff26.dt | 30 -- ...a8b8b84b747c295dd10a639e2b5265ac258cf5.txt | 10 + ...a87b7cb40eb65eee4483725c1a85c4dc72d141.txt | 18 + ...4eec02c7efd931db5e2a34e66444ee8b8e5079.txt | 14 + ...497c8236af331fd67bd13b7f7e506d42b4a7e2.txt | 17 + tests/test_dataset_builder.py | 62 ++- 59 files changed, 1735 insertions(+), 947 deletions(-) delete mode 100644 docling_eval/converters/models/__init__.py delete mode 100644 docling_eval/converters/models/reading_order/reading_order_updater.py delete mode 100644 docling_eval/converters/models/tableformer/__init__.py delete mode 100644 docling_eval/converters/models/tableformer/tf_model_prediction.py rename docling_eval/datamodels/{constants.py => types.py} (88%) delete mode 100644 docling_eval/evaluators/readingorder_evaluator_glm.py rename docling_eval/{ => legacy}/converters/__init__.py (100%) rename docling_eval/{ => legacy}/converters/conversion.py (100%) delete mode 100644 tests/data/doclaynet_v1_doctags_sample/0e26a4b4e7ad14e1d25385c173fd9c23543fbbafc9408cbb372b1f4898095a66.dt delete mode 100644 tests/data/doclaynet_v1_doctags_sample/0ef90754c44461177b7d29ca9074e8a6810bc4b96f1e7aab53051d0b5adfe38a.dt create mode 100644 tests/data/doclaynet_v1_doctags_sample/132a855ee8b23533d8ae69af0049c038171a06ddfcac892c3c6d7e6b4091c642.txt delete mode 100644 tests/data/doclaynet_v1_doctags_sample/1a89e84c0f1a1d0c841f8807c33e7e7216d615b9797444f3a220b8768636ff26.dt create mode 100644 tests/data/doclaynet_v1_doctags_sample/2b49edc9d0a47e4efaaeabf907a8b8b84b747c295dd10a639e2b5265ac258cf5.txt create mode 100644 tests/data/doclaynet_v1_doctags_sample/61d269cb1f2c976191469b891aa87b7cb40eb65eee4483725c1a85c4dc72d141.txt create mode 100644 tests/data/doclaynet_v1_doctags_sample/a5acc4c1c47a19543362fccf014eec02c7efd931db5e2a34e66444ee8b8e5079.txt create mode 100644 tests/data/doclaynet_v1_doctags_sample/b13563b6fd80bed51928fc4b42497c8236af331fd67bd13b7f7e506d42b4a7e2.txt diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py index 82741978..d0174ccd 100644 --- a/docling_eval/cli/main.py +++ b/docling_eval/cli/main.py @@ -8,7 +8,7 @@ import typer from tabulate import tabulate # type: ignore -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkNames, ConverterTypes, EvaluationModality, @@ -284,7 +284,6 @@ def evaluate( json.dump(table_evaluation.model_dump(), fd, indent=2, sort_keys=True) elif modality == EvaluationModality.READING_ORDER: - # readingorder_evaluator = ReadingOrderEvaluatorGlm() readingorder_evaluator = ReadingOrderEvaluator() readingorder_evaluation = readingorder_evaluator(idir, split=split) diff --git a/docling_eval/converters/models/__init__.py b/docling_eval/converters/models/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/docling_eval/converters/models/reading_order/reading_order_updater.py b/docling_eval/converters/models/reading_order/reading_order_updater.py deleted file mode 100644 index 11a97ff5..00000000 --- a/docling_eval/converters/models/reading_order/reading_order_updater.py +++ /dev/null @@ -1,56 +0,0 @@ -import copy -import logging -from pathlib import Path -from typing import Optional - -from deepsearch_glm.andromeda_nlp import nlp_model # type: ignore -from docling.utils.glm_utils import to_docling_document -from docling_core.types.doc.document import DoclingDocument -from docling_core.types.doc.labels import DocItemLabel -from docling_core.utils.legacy import ( - doc_item_label_to_legacy_name, - docling_document_to_legacy, -) - -_log = logging.getLogger(__name__) - - -class ReadingOrderUpdater: - def __init__(self): - r""" """ - self._nlp_model = nlp_model(loglevel="error", text_ordering=True) - self._labels_forward_mapping = { - doc_item_label_to_legacy_name(v): v.value for v in DocItemLabel - } - - def __call__( - self, pdf_path: Path, true_doc: DoclingDocument - ) -> Optional[DoclingDocument]: - r""" """ - print(true_doc.name) - # deep copy of the true-document - pred_doc = copy.deepcopy(true_doc) - pred_doc_legacy = docling_document_to_legacy(pred_doc) - ds_doc_dict = pred_doc_legacy.model_dump(by_alias=True, exclude_none=True) - try: - # TODO: Understand why some documents fail here - glm_doc = self._nlp_model.apply_on_doc(ds_doc_dict) - except RuntimeError: - # print("nlp_model.apply_on_doc()") - return None - - # Map from value to key.value before calling to_docling_document - for page_element in glm_doc["page-elements"]: - page_element["name"] = self._labels_forward_mapping[page_element["name"]] - - # When true_doc.name == "ground-truth 01030000000016.pdf" - # pydantic_core._pydantic_core.ValidationError: 1 validation error for TextItem label - # Input should be , , - # , , - # , , , - # , , , - # or - # [type=literal_error, input_value=, input_type=DocItemLabel] - pred_doc = to_docling_document(glm_doc) - - return pred_doc diff --git a/docling_eval/converters/models/tableformer/__init__.py b/docling_eval/converters/models/tableformer/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/docling_eval/converters/models/tableformer/tf_model_prediction.py b/docling_eval/converters/models/tableformer/tf_model_prediction.py deleted file mode 100644 index 9aff3c48..00000000 --- a/docling_eval/converters/models/tableformer/tf_model_prediction.py +++ /dev/null @@ -1,289 +0,0 @@ -import copy -import logging -from io import BytesIO -from pathlib import Path -from typing import List, Optional, Tuple - -import numpy as np -from docling.datamodel.base_models import Cluster, LayoutPrediction, Page, Table -from docling.datamodel.document import ConversionResult -from docling.datamodel.pipeline_options import ( - AcceleratorDevice, - AcceleratorOptions, - TableFormerMode, - TableStructureOptions, -) -from docling.models.table_structure_model import TableStructureModel -from docling_core.types.doc import DocItemLabel -from docling_core.types.doc.base import BoundingBox -from docling_core.types.doc.document import ( - DoclingDocument, - TableCell, - TableData, - TableItem, -) -from docling_parse.pdf_parsers import pdf_parser_v2 -from PIL import Image -from pydantic import BaseModel - -from docling_eval.utils.utils import get_input_document - -# Get logger -log = logging.getLogger(__name__) - - -class PageToken(BaseModel): - bbox: BoundingBox - - text: str - id: int - - -class PageTokens(BaseModel): - tokens: List[PageToken] - - height: float - width: float - - -class TableFormerUpdater: - - def __init__( - self, - mode: TableFormerMode, - num_threads: int = 16, - artifacts_path: Optional[Path] = None, - ): - r""" """ - # Init the TableFormer model - table_structure_options = TableStructureOptions(mode=mode) - accelerator_options = AcceleratorOptions( - num_threads=num_threads, device=AcceleratorDevice.AUTO - ) - self._docling_tf_model = TableStructureModel( - enabled=True, - artifacts_path=artifacts_path, - options=table_structure_options, - accelerator_options=accelerator_options, - ) - log.info("Initialize %s", mode) - - def to_np(self, pil_image: Image.Image): - # Convert to NumPy array - np_image = np.array(pil_image) - - # Handle different formats - if np_image.ndim == 3: # RGB or RGBA image - if np_image.shape[2] == 4: # RGBA image - # Discard alpha channel and convert to BGR - np_image = np_image[:, :, :3] # Keep only RGB channels - - # Convert RGB to BGR by reversing the last axis - np_image = np_image[:, :, ::-1] - - return np_image - else: - raise ValueError("Unsupported image format") - - def get_page_cells(self, filename: str): - - parser = pdf_parser_v2("fatal") - - try: - key = "key" - parser.load_document(key=key, filename=filename) - - parsed_doc = parser.parse_pdf_from_key(key=key) - - parser.unload_document(key) - return parsed_doc - - except Exception as exc: - log.error(exc) - - return None - - def _make_internal_page_with_table(self, input_doc, prov): - page = Page(page_no=prov.page_no - 1) - page._backend = input_doc._backend.load_page(page.page_no) - page.cells = list(page._backend.get_text_cells()) - page.size = page._backend.get_size() - - if page._backend is not None and page._backend.is_valid(): - cluster = Cluster( - id=0, - label=DocItemLabel.TABLE, - bbox=prov.bbox.to_top_left_origin(page.size.height), - ) - for cell in page.cells: - overlap = cell.rect.to_bounding_box().intersection_area_with( - cluster.bbox - ) - if cell.rect.to_bounding_box().area() > 0: - overlap_ratio = overlap / cell.rect.to_bounding_box().area() - if overlap_ratio > 0.2: - cluster.cells.append(cell) - - page.predictions.layout = LayoutPrediction(clusters=[cluster]) - - return page - - def replace_tabledata( - self, - pdf_path: Path | BytesIO, - true_doc: DoclingDocument, - ) -> Tuple[bool, DoclingDocument]: - - updated = False - - # deep copy of the true-document - pred_doc = true_doc.model_copy(deep=True) - - input_doc = get_input_document(pdf_path) - if not input_doc.valid: - log.error("could not parse pdf-file") - return False, pred_doc - - conv_res = ConversionResult(input=input_doc) - - # parsed_doc = self.get_page_cells(str(pdf_path)) - # if parsed_doc is None: - # log.error("could not parse pdf-file") - # return False, pred_doc - - # Replace the groundtruth tables with predictions from TableFormer - for item, level in pred_doc.iterate_items(): - if isinstance(item, TableItem): - for prov in item.prov: - page = self._make_internal_page_with_table(input_doc, prov) - - page = next(self._docling_tf_model(conv_res, [page])) # type: ignore - tbl: Table = page.predictions.tablestructure.table_map[0] - table_data: TableData = TableData( - num_rows=tbl.num_rows, - num_cols=tbl.num_cols, - table_cells=tbl.table_cells, - ) - - item.data = table_data - page._backend.unload() - - updated = True - - # md = item.export_to_markdown() - # print("prediction from table-former: \n\n", md) - - return updated, pred_doc - - def _tf_predict_with_page_tokens( - self, - page_image: Image.Image, - page_tokens: PageTokens, - table_bbox: Tuple[float, float, float, float], - image_scale: float = 1.0, - ): - r""" - Test the TFPredictor - """ - table_bboxes = [[table_bbox[0], table_bbox[1], table_bbox[2], table_bbox[3]]] - - ocr_page = page_tokens.dict() - - ocr_page["image"] = self.to_np(page_image) - ocr_page["table_bboxes"] = table_bboxes - - # TODO: Here we bypass docling API and we steal the tf_preditor private object :-( - predictor = self._docling_tf_model.tf_predictor - - # Loop over the iocr_pages - tf_output = predictor.multi_table_predict( - ocr_page, - table_bboxes=table_bboxes, - do_matching=True, - correct_overlapping_cells=False, - sort_row_col_indexes=True, - ) - # print("tf-output: ", json.dumps(tf_output, indent=2)) - - table_out = tf_output[0] - - do_cell_matching = True - - table_cells = [] - for element in table_out["tf_responses"]: - - tc = TableCell.model_validate(element) - if do_cell_matching and tc.bbox is not None: - tc.bbox = tc.bbox.scaled(1 / image_scale) - table_cells.append(tc) - - # Retrieving cols/rows, after post processing: - num_rows = table_out["predict_details"]["num_rows"] - num_cols = table_out["predict_details"]["num_cols"] - - table_data = TableData( - num_rows=num_rows, num_cols=num_cols, table_cells=table_cells - ) - - return table_data - - def replace_tabledata_with_page_tokens( - self, - true_doc: DoclingDocument, - true_page_images: List[Image.Image], - page_tokens: Optional[PageTokens] = None, - ) -> Tuple[bool, DoclingDocument]: - - updated = False - - # deep copy of the true-document - pred_doc = copy.deepcopy(true_doc) - - assert len(pred_doc.pages) == 1 - page_size = pred_doc.pages[1].size - - # Replace the groundtruth tables with predictions from TableFormer - for item, level in pred_doc.iterate_items(): - if isinstance(item, TableItem): - for prov in item.prov: - - # md = item.export_to_markdown() - # print("groundtruth: \n\n", md) - - page_image = true_page_images[prov.page_no - 1] - # page_image.show() - - # Ensure that the bbox will be inside the min/max ranges - table_bbox = ( - max(prov.bbox.l, 0.0), - max(prov.bbox.b, 0.0), - min(prov.bbox.r, page_size.width), - min(prov.bbox.t, page_size.height), - ) - - if page_tokens is None: - ptokens = [] - for ix, table_cell in enumerate(item.data.table_cells): - pt = PageToken( - bbox=table_cell.bbox, text=table_cell.text, id=ix - ) - ptokens.append(pt) - page_tokens = PageTokens( - tokens=ptokens, - height=prov.bbox.height, - width=prov.bbox.width, - ) - - table_data = self._tf_predict_with_page_tokens( - page_image=page_image, - page_tokens=page_tokens, - table_bbox=table_bbox, - ) - item.data = table_data - - updated = True - - # md = item.export_to_markdown() - # print("prediction from table-former: \n\n", md) - - return updated, pred_doc diff --git a/docling_eval/datamodels/dataset_record.py b/docling_eval/datamodels/dataset_record.py index add0936a..1e604f65 100644 --- a/docling_eval/datamodels/dataset_record.py +++ b/docling_eval/datamodels/dataset_record.py @@ -12,7 +12,7 @@ from docling_core.types.io import DocumentStream from pydantic import BaseModel, ConfigDict, Field, model_validator -from docling_eval.datamodels.constants import EvaluationModality, PredictionFormats +from docling_eval.datamodels.types import EvaluationModality, PredictionFormats class DatasetRecord( diff --git a/docling_eval/datamodels/constants.py b/docling_eval/datamodels/types.py similarity index 88% rename from docling_eval/datamodels/constants.py rename to docling_eval/datamodels/types.py index ce2f8b62..31b015e2 100644 --- a/docling_eval/datamodels/constants.py +++ b/docling_eval/datamodels/types.py @@ -1,4 +1,8 @@ from enum import Enum +from typing import List + +from docling_core.types.doc import BoundingBox +from pydantic import BaseModel class BenchMarkColumns(str, Enum): @@ -82,3 +86,17 @@ class PredictionFormats(str, Enum): JSON = "json" YAML = "yaml" DOCTAGS = "doctags" + + +class PageToken(BaseModel): + bbox: BoundingBox + + text: str + id: int + + +class PageTokens(BaseModel): + tokens: List[PageToken] + + height: float + width: float diff --git a/docling_eval/dataset_builders/dataset_builder.py b/docling_eval/dataset_builders/dataset_builder.py index a984a23d..7d94e636 100644 --- a/docling_eval/dataset_builders/dataset_builder.py +++ b/docling_eval/dataset_builders/dataset_builder.py @@ -1,8 +1,9 @@ +import logging import os import sys from abc import abstractmethod from pathlib import Path -from typing import Iterable, Optional, Union +from typing import Any, Dict, Iterable, List, Optional, Union from docling.utils.utils import chunkify from huggingface_hub import snapshot_download @@ -11,6 +12,9 @@ from docling_eval.datamodels.dataset_record import DatasetRecord from docling_eval.utils.utils import save_shard_to_disk, write_datasets_info +# Get logger +_log = logging.getLogger(__name__) + class HFSource(BaseModel): repo_id: str @@ -24,29 +28,55 @@ class S3Source(BaseModel): class BaseEvaluationDatasetBuilder: + """ + Base class for dataset builders that create evaluation datasets. + + This class provides common functionality for retrieving datasets, + applying index ranges, and saving processed data to disk. + """ + def __init__( self, name: str, dataset_source: Union[HFSource, S3Source, Path], target: Path, split: str = "test", + begin_index: int = 0, + end_index: int = -1, ): + """ + Initialize the dataset builder. + + Args: + name: Name of the dataset + dataset_source: Source of the dataset (HuggingFace, S3, or local path) + target: Path where processed dataset will be saved + split: Dataset split to use (train, test, etc.) + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all + """ self.name = name self.target: Path = target - self.dataset_source = dataset_source - self.dataset_local_path: Optional[Path] = None # TBD + self.dataset_local_path: Optional[Path] = None self.split = split + self.begin_index = begin_index + self.end_index = end_index self.retrieved = False def retrieve_input_dataset(self) -> Path: + """ + Download and retrieve the input dataset. + + Returns: + Path to the retrieved dataset + """ if isinstance(self.dataset_source, HFSource): if not self.dataset_local_path: path_str = snapshot_download( repo_id=self.dataset_source.repo_id, repo_type="dataset", token=self.dataset_source.hf_token, - # local_dir=self.target, ) path: Path = Path(path_str) self.dataset_local_path = path @@ -66,24 +96,82 @@ def retrieve_input_dataset(self) -> Path: ) self.retrieved = True - return path + def get_effective_indices(self, total_items: int) -> tuple[int, int]: + """ + Calculate the effective begin and end indices based on dataset size. + + Args: + total_items: Total number of items available + + Returns: + Tuple of (effective_begin_index, effective_end_index) + """ + begin = self.begin_index if self.begin_index >= 0 else 0 + end = self.end_index if self.end_index > 0 else total_items + end = min(end, total_items) + + if begin >= total_items: + _log.warning( + f"Begin index ({begin}) is greater than or equal to dataset size ({total_items}). " + f"No items will be processed." + ) + begin = total_items + + _log.info( + f"Processing range [{begin}:{end}] out of {total_items} total items " + f"({end - begin} items)" + ) + + return begin, end + + def log_dataset_stats(self, total_items: int, selected_items: int) -> None: + """ + Log dataset statistics for debugging. + + Args: + total_items: Total number of items in the dataset + selected_items: Number of items selected after applying indices + """ + _log.info( + f"Dataset '{self.name}' total items: {total_items}. " + f"Selected range: [{self.begin_index}, {self.end_index}] = {selected_items} items" + ) + @abstractmethod def iterate(self) -> Iterable[DatasetRecord]: + """ + Iterate through the dataset and yield DatasetRecord objects. + + Implementations should respect begin_index and end_index. + + Returns: + Iterable of DatasetRecord objects + """ pass - def save_to_disk(self, chunk_size: int = 80, max_num_chunks: int = sys.maxsize): + def save_to_disk( + self, chunk_size: int = 80, max_num_chunks: int = sys.maxsize + ) -> None: + """ + Save the dataset to disk in chunks. + + Args: + chunk_size: Number of records per chunk + max_num_chunks: Maximum number of chunks to save + """ if not self.retrieved: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." ) test_dir = self.target / self.split - os.makedirs(test_dir, exist_ok=True) + test_dir.mkdir(parents=True, exist_ok=True) count = 0 chunk_count = 0 + for record_chunk in chunkify(self.iterate(), chunk_size): record_chunk = [r.as_record_dict() for r in record_chunk] save_shard_to_disk( @@ -93,8 +181,13 @@ def save_to_disk(self, chunk_size: int = 80, max_num_chunks: int = sys.maxsize): chunk_count += 1 if chunk_count >= max_num_chunks: + _log.info( + f"Reached maximum number of chunks ({max_num_chunks}). Stopping." + ) break + _log.info(f"Saved {count} records in {chunk_count} chunks to {test_dir}") + write_datasets_info( name=self.name, output_dir=self.target, diff --git a/docling_eval/dataset_builders/doclaynet_v1_builder.py b/docling_eval/dataset_builders/doclaynet_v1_builder.py index d5d99101..861036d8 100644 --- a/docling_eval/dataset_builders/doclaynet_v1_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v1_builder.py @@ -2,14 +2,16 @@ import logging import os from pathlib import Path -from typing import Iterable +from typing import Iterable, List, Optional, Set +import PIL.Image from datasets import load_dataset from docling_core.types import DoclingDocument from docling_core.types.doc import ( BoundingBox, CoordOrigin, DocItemLabel, + GroupItem, GroupLabel, ImageRef, ProvenanceItem, @@ -20,8 +22,8 @@ from docling_core.types.io import DocumentStream from tqdm import tqdm -from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.datamodels.types import BenchMarkColumns, EvaluationModality from docling_eval.dataset_builders.dataset_builder import ( BaseEvaluationDatasetBuilder, HFSource, @@ -37,8 +39,8 @@ # Get logger _log = logging.getLogger(__name__) -# Blacklisted document IDs -BLACKLISTED_DOC_IDS = [ +# Blacklisted document IDs (documents with known issues) +BLACKLISTED_DOC_IDS: Set[str] = { "f556167ac3284665652050b1b0bc1e6f5af27f54f17f27566c60c80f6f134a92", "dbc51622cbe9b8766f44db3b3fda8d0a745da06b9bfec9935bd003d2bdd494c8", "d4c0401fffc04d24e629a9fada23266a3b492ea63e889641b3c33adf815d44e3", @@ -64,9 +66,10 @@ "1763e54be635759ccb66ebb462548f8a40d44567f62cecc5ca26f22acd28e823", "048a570b2e415b653a62313ef82504adfda480c99f69826fcbeb67758ea3c7a4", "0261791e343389682847c913a16789776d0ba41a584901571846c7ddab3cbaa6", -] +} -TRUE_HTML_EXPORT_LABELS = { +# Labels to export in HTML visualization +TRUE_HTML_EXPORT_LABELS: Set[DocItemLabel] = { DocItemLabel.TITLE, DocItemLabel.DOCUMENT_INDEX, DocItemLabel.SECTION_HEADER, @@ -86,7 +89,7 @@ DocItemLabel.FOOTNOTE, } -PRED_HTML_EXPORT_LABELS = { +PRED_HTML_EXPORT_LABELS: Set[DocItemLabel] = { DocItemLabel.TITLE, DocItemLabel.DOCUMENT_INDEX, DocItemLabel.SECTION_HEADER, @@ -105,29 +108,39 @@ DocItemLabel.FOOTNOTE, } -SHARD_SIZE = 100 - class DocLayNetV1DatasetBuilder(BaseEvaluationDatasetBuilder): - """DocLayNet V1 dataset builder implementing the base dataset builder interface.""" + """ + DocLayNet V1 dataset builder implementing the base dataset builder interface. + + This builder processes the DocLayNet V1.2 dataset, which contains document + layout annotations for a variety of document types. + """ def __init__( self, - # prediction_provider: BasePredictionProvider, target: Path, split: str = "test", begin_index: int = 0, end_index: int = -1, ): + """ + Initialize the DocLayNet V1 dataset builder. + + Args: + target: Path where processed dataset will be saved + split: Dataset split to use + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all + """ super().__init__( name="DocLayNetV1", dataset_source=HFSource(repo_id="ds4sd/DocLayNet-v1.2"), - # prediction_provider=prediction_provider, target=target, split=split, + begin_index=begin_index, + end_index=end_index, ) - self.begin_index = begin_index - self.end_index = end_index self.blacklisted_ids = set(BLACKLISTED_DOC_IDS) self.category_map = { 1: "caption", @@ -144,15 +157,44 @@ def __init__( } @staticmethod - def ltwh_to_ltrb(box): - """Convert left, top, width, height format to left, top, right, bottom.""" + def ltwh_to_ltrb(box: List[float]) -> List[float]: + """ + Convert left, top, width, height format to left, top, right, bottom. + + Args: + box: Box in [left, top, width, height] format + + Returns: + Box in [left, top, right, bottom] format + """ l, t, w, h = box - return l, t, l + w, t + h + return [l, t, l + w, t + h] def update_doc_with_gt( - self, doc: DoclingDocument, current_list, img, old_size, label_str, box, content - ): - """Add an element to the document based on its label type.""" + self, + doc: DoclingDocument, + current_list: Optional[GroupItem], # This was incorrectly typed as str | None + img: PIL.Image.Image, + old_size: Size, + label_str: str, + box: List[float], + content: str, + ) -> Optional[GroupItem]: # Return type should match the parameter type + """ + Add an element to the document based on its label type. + + Args: + doc: DoclingDocument to update + current_list: Current list group for list items + img: Page image + old_size: Original page size + label_str: Element label as string + box: Bounding box coordinates + content: Text content + + Returns: + Updated list group or None + """ # Map string label to DocItemLabel label_map = { "caption": DocItemLabel.CAPTION, @@ -236,7 +278,12 @@ def update_doc_with_gt( return current_list def iterate(self) -> Iterable[DatasetRecord]: - """Iterate through the dataset and yield DatasetRecord objects.""" + """ + Iterate through the dataset and yield DatasetRecord objects. + + Yields: + DatasetRecord objects + """ if not self.retrieved: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." @@ -247,27 +294,16 @@ def iterate(self) -> Iterable[DatasetRecord]: # Load dataset from the retrieved path ds = load_dataset("ds4sd/DocLayNet-v1.2", split=self.split) - # Apply index ranges if specified + # Apply HuggingFace's select method for index ranges total_ds_len = len(ds) - begin_index = self.begin_index - end_index = self.end_index - - if end_index == -1 or end_index > total_ds_len: - end_index = total_ds_len - - if begin_index < 0: - begin_index = 0 + begin, end = self.get_effective_indices(total_ds_len) - ds = ds.select(range(begin_index, end_index)) + # Select the range (HuggingFace datasets have a convenient select method) + ds = ds.select(range(begin, end)) selected_ds_len = len(ds) - _log.info( - "Dataset len: %s. Selected range: [%s, %s] = %s", - total_ds_len, - begin_index, - end_index, - selected_ds_len, - ) + # Log stats + self.log_dataset_stats(total_ds_len, selected_ds_len) skipped_rows = 0 exported_rows = 0 @@ -331,7 +367,6 @@ def iterate(self) -> Iterable[DatasetRecord]: # Create dataset record record = DatasetRecord( - # predictor_info=self.prediction_provider.info(), doc_id=page_hash, doc_hash=get_binhash(pdf), ground_truth_doc=true_doc, @@ -345,33 +380,8 @@ def iterate(self) -> Iterable[DatasetRecord]: ground_truth_page_images=true_page_images, ) - # Update prediction - # self.update_prediction(record) - - # Extract images from the predicted document if available - # if record.predicted_doc is not None: - # pred_doc, pred_pictures, pred_page_images = extract_images( - # document=record.predicted_doc, - # pictures_column=BenchMarkColumns.PREDICTION_PICTURES, - # page_images_column=BenchMarkColumns.PREDICTION_PAGE_IMAGES, - # ) - # record.predicted_doc = pred_doc - # record.predicted_pictures = pred_pictures - # record.predicted_page_images = pred_page_images - - # # Create visualization if requested - # if self.do_visualization and record.predicted_doc is not None: - # save_comparison_html_with_clusters( - # filename=viz_dir / f"{page_hash}-clusters.html", - # true_doc=true_doc, - # pred_doc=record.predicted_doc, - # page_image=img, - # true_labels=TRUE_HTML_EXPORT_LABELS, - # pred_labels=PRED_HTML_EXPORT_LABELS, - # draw_reading_order=False, - # ) - exported_rows += 1 + print(page_hash) yield record except Exception as ex: diff --git a/docling_eval/dataset_builders/doclaynet_v2_builder.py b/docling_eval/dataset_builders/doclaynet_v2_builder.py index 95d7c5dc..29e5b46e 100644 --- a/docling_eval/dataset_builders/doclaynet_v2_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v2_builder.py @@ -4,7 +4,7 @@ import os import re from pathlib import Path -from typing import Dict, Iterable, List, Optional +from typing import Any, Dict, Iterable, List, Optional, Tuple from datasets import load_from_disk from docling_core.types import DoclingDocument @@ -27,8 +27,8 @@ from PIL import Image from tqdm import tqdm -from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.datamodels.types import BenchMarkColumns, EvaluationModality from docling_eval.dataset_builders.dataset_builder import BaseEvaluationDatasetBuilder from docling_eval.utils.utils import ( classify_cells, @@ -43,36 +43,41 @@ class DocLayNetV2DatasetBuilder(BaseEvaluationDatasetBuilder): - """DocLayNet V2 dataset builder implementing the base dataset builder interface.""" + """ + DocLayNet V2 dataset builder implementing the base dataset builder interface. + + This builder processes the DocLayNet V2 dataset, which contains document + layout annotations and key-value data for a variety of document types. + """ def __init__( self, dataset_path: Path, - # prediction_provider: BasePredictionProvider, target: Path, split: str = "test", - max_items: int = -1, + begin_index: int = 0, + end_index: int = -1, ): """ Initialize the DocLayNet V2 dataset builder. Args: dataset_path: Path to the pre-downloaded dataset - target: Path where the processed dataset will be saved - do_visualization: Whether to create visualizations + target: Path where processed dataset will be saved split: Dataset split to use - max_items: Maximum number of items to process (-1 for all) + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all """ super().__init__( name="DocLayNetV2: end-to-end", dataset_source=dataset_path, # Local Path to dataset - # prediction_provider=prediction_provider, target=target, split=split, + begin_index=begin_index, + end_index=end_index, ) - self.max_items = max_items - def extract_tokens_and_text(self, s: str): + def extract_tokens_and_text(self, s: str) -> Tuple[List[str], List[str]]: """ Extract tokens and text from a string. @@ -80,7 +85,7 @@ def extract_tokens_and_text(self, s: str): s: Input string Returns: - tuple: (tokens, text_parts) + Tuple of (tokens, text_parts) """ # Pattern to match anything enclosed by < > (including the angle brackets themselves) pattern = r"(<[^>]+>)" @@ -104,7 +109,9 @@ def extract_tokens_and_text(self, s: str): return tokens, text_parts - def parse_texts(self, texts, tokens): + def parse_texts( + self, texts: List[str], tokens: List[str] + ) -> Tuple[List[TableCell], List[List[str]]]: """ Parse tokens and texts into table cells. @@ -113,7 +120,7 @@ def parse_texts(self, texts, tokens): tokens: List of tokens Returns: - tuple: (table_cells, split_row_tokens) + Tuple of (table_cells, split_row_tokens) """ split_word = TableToken.OTSL_NL.value split_row_tokens = [ @@ -125,7 +132,9 @@ def parse_texts(self, texts, tokens): r_idx = 0 c_idx = 0 - def count_right(tokens, c_idx, r_idx, which_tokens): + def count_right( + tokens: List[List[str]], c_idx: int, r_idx: int, which_tokens: List[str] + ) -> int: span = 0 c_idx_iter = c_idx while tokens[r_idx][c_idx_iter] in which_tokens: @@ -135,7 +144,9 @@ def count_right(tokens, c_idx, r_idx, which_tokens): return span return span - def count_down(tokens, c_idx, r_idx, which_tokens): + def count_down( + tokens: List[List[str]], c_idx: int, r_idx: int, which_tokens: List[str] + ) -> int: span = 0 r_idx_iter = r_idx while tokens[r_idx_iter][c_idx] in which_tokens: @@ -391,7 +402,9 @@ def populate_key_value_item( # Add the key_value_item to the document. doc.add_key_values(graph=graph, prov=prov) - def create_kv_pairs(self, data): + # The minimal fix for DocLayNetV2Builder is to add type annotation to link_pairs: + + def create_kv_pairs(self, data: Dict[str, Any]) -> List[Dict[str, Any]]: """ Create key-value pairs from document data. @@ -401,7 +414,7 @@ def create_kv_pairs(self, data): Returns: List of key-value pair dictionaries """ - link_pairs = [] + link_pairs: List[Dict[str, Any]] = [] seg_with_id = {} bbox_with_id = {} @@ -577,23 +590,30 @@ def iterate(self) -> Iterable[DatasetRecord]: # Load dataset ds = load_from_disk(str(self.dataset_source)) - # Set max items - if self.max_items == -1: - max_items = len(ds[self.split]) - else: - max_items = min(self.max_items, len(ds[self.split])) + # Get total number of items in the dataset + total_items = len(ds[self.split]) - _log.info(f"Processing DocLayNetV2 dataset: {max_items} documents") + # Calculate effective indices + begin, end = self.get_effective_indices(total_items) + + # Log stats + self.log_dataset_stats(total_items, end - begin) + _log.info(f"Processing DocLayNetV2 dataset: {end - begin} documents") # Process each document for i, doc in enumerate( tqdm( ds[self.split], - total=max_items, + total=end - begin, desc="Processing DocLayNetV2 documents", ) ): - if i >= max_items: + # Skip documents before begin_index + if i < begin: + continue + + # Stop after end_index + if i >= end: break try: diff --git a/docling_eval/dataset_builders/dpbench_builder.py b/docling_eval/dataset_builders/dpbench_builder.py index 5e13e0e7..27156274 100644 --- a/docling_eval/dataset_builders/dpbench_builder.py +++ b/docling_eval/dataset_builders/dpbench_builder.py @@ -1,8 +1,9 @@ import json +import logging import os from io import BytesIO from pathlib import Path -from typing import Dict, Iterable, List +from typing import Dict, Iterable, List, Set from docling_core.types import DoclingDocument from docling_core.types.doc import ( @@ -33,7 +34,11 @@ get_binhash, ) -TRUE_HTML_EXPORT_LABELS = { +# Get logger +_log = logging.getLogger(__name__) + +# Labels to export in HTML visualization +TRUE_HTML_EXPORT_LABELS: Set[DocItemLabel] = { DocItemLabel.TITLE, DocItemLabel.DOCUMENT_INDEX, DocItemLabel.SECTION_HEADER, @@ -54,7 +59,7 @@ DocItemLabel.FOOTNOTE, } -PRED_HTML_EXPORT_LABELS = { +PRED_HTML_EXPORT_LABELS: Set[DocItemLabel] = { DocItemLabel.TITLE, DocItemLabel.DOCUMENT_INDEX, DocItemLabel.SECTION_HEADER, @@ -76,17 +81,36 @@ class DPBenchDatasetBuilder(BaseEvaluationDatasetBuilder): + """ + DPBench dataset builder implementing the base dataset builder interface. + + This builder processes the DPBench dataset, which contains document + understanding benchmarks for various document types. + """ + def __init__( self, - # prediction_provider: BasePredictionProvider, target: Path, split: str = "test", + begin_index: int = 0, + end_index: int = -1, ): + """ + Initialize the DPBench dataset builder. + + Args: + target: Path where processed dataset will be saved + split: Dataset split to use + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all + """ super().__init__( name="DPBench", dataset_source=HFSource(repo_id="upstage/dp-bench"), target=target, split=split, + begin_index=begin_index, + end_index=end_index, ) def _update_gt_doc( @@ -97,26 +121,36 @@ def _update_gt_doc( page_image: Image, page_width: float, page_height: float, - ): - + ) -> None: + """ + Update ground truth document with annotations. + + Args: + doc: DoclingDocument to update + annots: Annotation data + page: Page object + page_image: Page image + page_width: Page width + page_height: Page height + """ label = annots["category"] + # Extract coordinates min_x = annots["coordinates"][0]["x"] max_x = annots["coordinates"][0]["x"] - min_y = annots["coordinates"][0]["y"] max_y = annots["coordinates"][0]["y"] for coor in annots["coordinates"]: min_x = min(min_x, coor["x"]) max_x = max(max_x, coor["x"]) - min_y = min(min_y, coor["y"]) max_y = max(max_y, coor["y"]) text = annots["content"]["text"].replace("\n", " ") html = annots["content"]["html"] + # Create bounding box bbox = BoundingBox( l=min_x * page_width, r=max_x * page_width, @@ -125,10 +159,13 @@ def _update_gt_doc( coord_origin=CoordOrigin.TOPLEFT, ) + # Create provenance prov = ProvenanceItem(page_no=1, bbox=bbox, charspan=(0, len(text))) + # Crop image element img = crop_bounding_box(page_image=page_image, page=page, bbox=bbox) + # Add element to document based on label if label == "Header": doc.add_text( label=DocItemLabel.PAGE_HEADER, text=text, orig=text, prov=prov @@ -143,7 +180,6 @@ def _update_gt_doc( doc.add_text(label=DocItemLabel.TEXT, text=text, orig=text, prov=prov) elif label == "Index": - # FIXME: ultra approximate solution text = annots["content"]["text"] rows = text.split("\n") @@ -194,7 +230,6 @@ def _update_gt_doc( elif label == "List": doc.add_list_item(text=text, orig=text, prov=prov) - # doc.add_text(label=DocItemLabel.TEXT, text=text, orig=text, prov=prov) elif label == "Caption": doc.add_text(label=DocItemLabel.CAPTION, text=text, orig=text, prov=prov) @@ -204,46 +239,41 @@ def _update_gt_doc( elif label == "Figure": uri = from_pil_to_base64uri(img) - imgref = ImageRef( mimetype="image/png", dpi=72, size=Size(width=img.width, height=img.height), uri=uri, ) - doc.add_picture(prov=prov, image=imgref) elif label == "Table": - table_data = convert_html_table_into_docling_tabledata(table_html=html) - doc.add_table(data=table_data, caption=None, prov=prov) elif label == "Chart": uri = from_pil_to_base64uri(img) - imgref = ImageRef( mimetype="image/png", dpi=72, size=Size(width=img.width, height=img.height), uri=uri, ) - doc.add_picture(prov=prov, image=imgref) - # doc.add_picture(prov=prov) - elif label == "Footnote": doc.add_text(label=DocItemLabel.FOOTNOTE, text=text, orig=text, prov=prov) elif label == "Heading1": doc.add_heading(text=text, orig=text, level=1, prov=prov) - else: - return - def iterate(self) -> Iterable[DatasetRecord]: + """ + Iterate through the dataset and yield DatasetRecord objects. + + Yields: + DatasetRecord objects + """ if not self.retrieved: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." @@ -251,36 +281,47 @@ def iterate(self) -> Iterable[DatasetRecord]: assert self.dataset_local_path is not None - # load the groundtruth - with open(self.dataset_local_path / f"dataset/reference.json", "r") as fr: + # Load the ground truth + reference_path = self.dataset_local_path / "dataset/reference.json" + with open(reference_path, "r") as fr: gt = json.load(fr) - cnt = 0 - for filename, annots in tqdm( - gt.items(), + # Sort the filenames for deterministic ordering + sorted_filenames = sorted(gt.keys()) + total_files = len(sorted_filenames) + + # Apply index range + begin, end = self.get_effective_indices(total_files) + selected_filenames = sorted_filenames[begin:end] + + # Log stats + self.log_dataset_stats(total_files, len(selected_filenames)) + _log.info(f"Processing DP-Bench dataset with {len(selected_filenames)} files") + + for filename in tqdm( + selected_filenames, desc="Processing files for DP-Bench with end-to-end", - total=len(gt), ncols=128, ): - cnt += 1 - - # if cnt == 10: - # break - + # Get annotations for this file + annots = gt[filename] pdf_path = self.dataset_local_path / f"dataset/pdfs/{filename}" - # Create the groundtruth Document + # Create the ground truth Document true_doc = DoclingDocument( name=f"ground-truth {os.path.basename(pdf_path)}" ) true_doc, true_page_images = add_pages_to_true_doc( pdf_path=pdf_path, true_doc=true_doc, image_scale=2.0 ) + assert len(true_page_images) == 1, "len(true_page_images)==1" + # Get page dimensions page_width = true_doc.pages[1].size.width page_height = true_doc.pages[1].size.height + # Process each element in the annotation for elem in annots["elements"]: self._update_gt_doc( true_doc, @@ -291,10 +332,11 @@ def iterate(self) -> Iterable[DatasetRecord]: page_height=page_height, ) + # Get PDF as binary data pdf_bytes = get_binary(pdf_path) - pdf_stream = DocumentStream(name=pdf_path.name, stream=BytesIO(pdf_bytes)) + # Create dataset record record = DatasetRecord( doc_id=str(filename), doc_hash=get_binhash(pdf_bytes), diff --git a/docling_eval/dataset_builders/funsd_builder.py b/docling_eval/dataset_builders/funsd_builder.py index 618aeea7..2d014196 100644 --- a/docling_eval/dataset_builders/funsd_builder.py +++ b/docling_eval/dataset_builders/funsd_builder.py @@ -14,8 +14,8 @@ from PIL import Image from tqdm import tqdm -from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.datamodels.types import BenchMarkColumns, EvaluationModality from docling_eval.dataset_builders.dataset_builder import BaseEvaluationDatasetBuilder from docling_eval.utils.utils import ( classify_cells, @@ -29,27 +29,47 @@ class FUNSDDatasetBuilder(BaseEvaluationDatasetBuilder): - """FUNSD Dataset builder implementing the base dataset builder interface.""" + """ + FUNSD Dataset builder implementing the base dataset builder interface. + + This builder handles the Form Understanding in Noisy Scanned Documents (FUNSD) dataset, + which contains form annotations for form understanding tasks. + """ def __init__( self, dataset_source: Path, - # prediction_provider: BasePredictionProvider, target: Path, split: str = "test", - max_items: int = -1, + begin_index: int = 0, + end_index: int = -1, ): + """ + Initialize the FUNSD dataset builder. + + Args: + dataset_source: Path to the dataset source + target: Path where processed dataset will be saved + split: Dataset split to use ('train' or 'test') + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all + """ super().__init__( name="FUNSD", - dataset_source=dataset_source, # Standard location - # prediction_provider=prediction_provider, + dataset_source=dataset_source, target=target, split=split, + begin_index=begin_index, + end_index=end_index, ) - self.max_items = max_items def retrieve_input_dataset(self) -> Path: - """Download and extract the FUNSD dataset if needed.""" + """ + Download and extract the FUNSD dataset if needed. + + Returns: + Path to the retrieved dataset + """ assert isinstance(self.dataset_source, Path) dataset_path = self.dataset_source @@ -99,7 +119,15 @@ def retrieve_input_dataset(self) -> Path: return dataset_path def convert_bbox(self, bbox_data) -> BoundingBox: - """Convert bbox format to BoundingBox object.""" + """ + Convert bbox format to BoundingBox object. + + Args: + bbox_data: Bounding box data as list or BoundingBox + + Returns: + BoundingBox object + """ if isinstance(bbox_data, list) and len(bbox_data) == 4: return BoundingBox( l=bbox_data[0], t=bbox_data[1], r=bbox_data[2], b=bbox_data[3] @@ -117,7 +145,17 @@ def create_graph_link( value_cell: GraphCell, label: GraphLinkLabel = GraphLinkLabel.TO_VALUE, ) -> GraphLink: - """Create a graph link between key and value cells.""" + """ + Create a graph link between key and value cells. + + Args: + key_cell: Source cell (key) + value_cell: Target cell (value) + label: Link label + + Returns: + GraphLink object + """ return GraphLink( source_cell_id=key_cell.cell_id, target_cell_id=value_cell.cell_id, @@ -127,7 +165,16 @@ def create_graph_link( def get_overall_bbox( self, links: List[GraphLink], cell_dict: Dict[int, GraphCell] ) -> Optional[BoundingBox]: - """Compute the overall bounding box from all cell ids.""" + """ + Compute the overall bounding box from all cell ids. + + Args: + links: List of GraphLink objects + cell_dict: Dictionary mapping cell IDs to GraphCell objects + + Returns: + BoundingBox encompassing all cells, or None if no bounding boxes + """ all_bboxes = [] for link in links: src_prov = cell_dict[link.source_cell_id].prov @@ -145,7 +192,16 @@ def get_overall_bbox( def populate_key_value_item( self, doc: DoclingDocument, funsd_data: dict ) -> DoclingDocument: - """Populate the key-value item from the FUNSD data.""" + """ + Populate the key-value item from the FUNSD data. + + Args: + doc: DoclingDocument to update + funsd_data: FUNSD annotation data + + Returns: + Updated DoclingDocument + """ if "form" not in funsd_data: raise ValueError("Invalid FUNSD data: missing 'form' key.") @@ -224,7 +280,12 @@ def populate_key_value_item( return doc def iterate(self) -> Iterable[DatasetRecord]: - """Iterate through the dataset and yield DatasetRecord objects.""" + """ + Iterate through the dataset and yield DatasetRecord objects. + + Yields: + DatasetRecord objects + """ if not self.retrieved: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." @@ -241,17 +302,19 @@ def iterate(self) -> Iterable[DatasetRecord]: raise ValueError(f"Invalid split: {self.split}. Expected 'train' or 'test'") # List all PNG images - images = list(image_dir.glob("*.png")) + images = sorted(list(image_dir.glob("*.png"))) + total_images = len(images) - # Limit number of items if specified - if self.max_items > 0 and len(images) > self.max_items: - images = images[: self.max_items] + # Apply index range + begin, end = self.get_effective_indices(total_images) + images = images[begin:end] - total_images = len(images) - _log.info(f"Processing FUNSD {self.split} dataset: {total_images} images") + # Log stats + self.log_dataset_stats(total_images, len(images)) + _log.info(f"Processing FUNSD {self.split} dataset: {len(images)} images") # Process each image - for img_path in tqdm(images, total=total_images): + for img_path in tqdm(images, total=len(images)): try: # Determine annotation path annotation_path = ( @@ -300,7 +363,6 @@ def iterate(self) -> Iterable[DatasetRecord]: # Create dataset record record = DatasetRecord( - # predictor_info=self.prediction_provider.info(), doc_id=img_path.stem, doc_hash=get_binhash(img_bytes), ground_truth_doc=true_doc, @@ -311,9 +373,6 @@ def iterate(self) -> Iterable[DatasetRecord]: ground_truth_page_images=true_page_images, ) - # Update prediction - # self.update_prediction(record) - yield record except Exception as ex: diff --git a/docling_eval/dataset_builders/omnidocbench_builder.py b/docling_eval/dataset_builders/omnidocbench_builder.py index 7189ddf0..ac08a0d0 100644 --- a/docling_eval/dataset_builders/omnidocbench_builder.py +++ b/docling_eval/dataset_builders/omnidocbench_builder.py @@ -4,7 +4,7 @@ import os from io import BytesIO from pathlib import Path -from typing import Iterable, List, Tuple +from typing import Dict, Iterable, List, Tuple from docling_core.types import DoclingDocument from docling_core.types.doc import ( @@ -12,6 +12,7 @@ CoordOrigin, DocItemLabel, ImageRef, + PageItem, ProvenanceItem, Size, ) @@ -36,6 +37,7 @@ # Get logger _log = logging.getLogger(__name__) +# Labels to export in HTML visualization TRUE_HTML_EXPORT_LABELS = { DocItemLabel.TITLE, DocItemLabel.DOCUMENT_INDEX, @@ -79,32 +81,64 @@ class OmniDocBenchDatasetBuilder(BaseEvaluationDatasetBuilder): + """ + OmniDocBench dataset builder implementing the base dataset builder interface. + + This builder processes the OmniDocBench dataset, which contains document + layout annotations for a variety of document types. + """ + def __init__( self, - # prediction_provider: BasePredictionProvider, target: Path, split: str = "test", + begin_index: int = 0, + end_index: int = -1, ): + """ + Initialize the OmniDocBench dataset builder. + + Args: + target: Path where processed dataset will be saved + split: Dataset split to use + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all + """ super().__init__( name="OmniDocBench: end-to-end", dataset_source=HFSource(repo_id="opendatalab/OmniDocBench"), - # prediction_provider=prediction_provider, target=target, split=split, + begin_index=begin_index, + end_index=end_index, ) - def update_gt_into_map(self, gt): + def update_gt_into_map(self, gt: List[Dict]) -> Dict[str, Dict]: + """ + Convert list of annotation items to a map keyed by image path. - result = {} + Args: + gt: List of ground truth annotations + Returns: + Dictionary mapping image paths to their annotations + """ + result = {} for item in gt: path = item["page_info"]["image_path"] result[path] = item - return result def get_filenames(self, omnidocbench_dir: Path) -> List[Tuple[str, str]]: + """ + Get pairs of image and PDF paths from the dataset directory. + + Args: + omnidocbench_dir: Path to the OmniDocBench directory + Returns: + List of (image_path, pdf_path) tuples + """ page_images = sorted(glob.glob(str(omnidocbench_dir / "images/*.jpg"))) page_pdfs = sorted(glob.glob(str(omnidocbench_dir / "ori_pdfs/*.pdf"))) @@ -116,38 +150,49 @@ def get_filenames(self, omnidocbench_dir: Path) -> List[Tuple[str, str]]: def update_doc_with_gt( self, - gt, - true_doc, - page, + gt: Dict, + true_doc: DoclingDocument, + page: PageItem, page_image: Image, page_width: float, page_height: float, - ): - + ) -> DoclingDocument: + """ + Update document with ground truth annotations. + + Args: + gt: Ground truth annotations + true_doc: Document to update + page: Page object + page_image: Page image + page_width: Page width + page_height: Page height + + Returns: + Updated document + """ gt_width = float(gt["page_info"]["width"]) gt_height = float(gt["page_info"]["height"]) for item in gt["layout_dets"]: - label = item["category_type"] - text = f"<omitted text for {label}>" if "text" in item: text = item["text"] + # Find bounding box coordinates min_x = item["poly"][0] max_x = item["poly"][0] - min_y = item["poly"][1] max_y = item["poly"][1] for i in range(0, 4): min_x = min(min_x, item["poly"][2 * i]) max_x = max(max_x, item["poly"][2 * i]) - min_y = min(min_y, item["poly"][2 * i + 1]) max_y = max(max_y, item["poly"][2 * i + 1]) + # Create bounding box bbox = BoundingBox( l=min_x * page_width / gt_width, r=max_x * page_width / gt_width, @@ -156,11 +201,13 @@ def update_doc_with_gt( coord_origin=CoordOrigin.TOPLEFT, ) + # Create provenance prov = ProvenanceItem(page_no=1, bbox=bbox, charspan=(0, len(text))) + # Crop the image element - use page directly since we've updated the signature img = crop_bounding_box(page_image=page_image, page=page, bbox=bbox) - # img.show() + # Add element to document based on label if label == "title": true_doc.add_heading(text=text, orig=text, level=1, prov=prov) @@ -175,7 +222,6 @@ def update_doc_with_gt( ) elif label == "table": - table_data = convert_html_table_into_docling_tabledata( table_html=item["html"] ) @@ -197,16 +243,13 @@ def update_doc_with_gt( ) elif label == "figure": - uri = from_pil_to_base64uri(img) - imgref = ImageRef( mimetype="image/png", dpi=72, size=Size(width=img.width, height=img.height), uri=uri, ) - true_doc.add_picture(prov=prov, image=imgref) elif label == "figure_caption": @@ -270,69 +313,65 @@ def update_doc_with_gt( ) else: - logging.error(f"label {label} is not assigned!") + _log.error(f"label {label} is not assigned!") return true_doc def iterate(self) -> Iterable[DatasetRecord]: + """ + Iterate through the dataset and yield DatasetRecord objects. + + Yields: + DatasetRecord objects + """ if not self.retrieved: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." ) assert self.dataset_local_path is not None - # load the groundtruth + + # Load the ground truth with open(self.dataset_local_path / "OmniDocBench.json", "r") as fr: gt = json.load(fr) gt = self.update_gt_into_map(gt) + # Create visualization directory if needed viz_dir = self.target / "vizualisations" - os.makedirs(viz_dir, exist_ok=True) + viz_dir.mkdir(exist_ok=True) + # Get all file paths page_tuples = self.get_filenames(self.dataset_local_path) + total_items = len(page_tuples) - # Apply index ranges - total_ds_len = len(page_tuples) - - begin_index = 0 - end_index = -1 - # begin_index, end_index = set_selection_range( - # begin_index, end_index, total_ds_len - # ) - page_tuples = page_tuples[begin_index:end_index] - selected_ds_len = len(page_tuples) - _log.info( - "Dataset len: %s. Selected range: [%s, %s] = %s", - total_ds_len, - begin_index, - end_index, - selected_ds_len, - ) + # Apply index range + begin, end = self.get_effective_indices(total_items) + page_tuples = page_tuples[begin:end] + selected_items = len(page_tuples) + + # Log stats + self.log_dataset_stats(total_items, selected_items) for page_tuple in tqdm( page_tuples, - total=selected_ds_len, + total=selected_items, ncols=128, desc="Processing files for OmniDocBench with end-to-end", ): - jpg_path = page_tuple[0] pdf_path = Path(page_tuple[1]) - # logging.info(f"file: {pdf_path}") - if os.path.basename(jpg_path) not in gt: - logging.error( - f"did not find ground-truth for {os.path.basename(jpg_path)}" - ) + # Check if ground truth exists for this image + jpg_basename = os.path.basename(jpg_path) + if jpg_basename not in gt: + _log.error(f"Did not find ground-truth for {jpg_basename}") continue - gt_doc = gt[os.path.basename(jpg_path)] + gt_doc = gt[jpg_basename] - # Create the groundtruth Document - true_doc = DoclingDocument( - name=f"ground-truth {os.path.basename(jpg_path)}" - ) + # Create the ground truth Document + true_doc = DoclingDocument(name=f"ground-truth {jpg_basename}") true_doc, true_page_images = add_pages_to_true_doc( pdf_path=pdf_path, true_doc=true_doc, image_scale=2.0 ) @@ -343,6 +382,7 @@ def iterate(self) -> Iterable[DatasetRecord]: page_width = true_doc.pages[1].size.width page_height = true_doc.pages[1].size.height + # Update document with ground truth true_doc = self.update_doc_with_gt( gt=gt_doc, true_doc=true_doc, @@ -352,12 +392,12 @@ def iterate(self) -> Iterable[DatasetRecord]: page_height=page_height, ) + # Get PDF as binary data pdf_bytes = get_binary(pdf_path) - pdf_stream = DocumentStream(name=pdf_path.name, stream=BytesIO(pdf_bytes)) + # Create dataset record record = DatasetRecord( - # predictor_info=self.prediction_provider.info(), doc_id=str(os.path.basename(jpg_path)), doc_hash=get_binhash(pdf_bytes), ground_truth_doc=true_doc, diff --git a/docling_eval/dataset_builders/otsl_table_dataset_builder.py b/docling_eval/dataset_builders/otsl_table_dataset_builder.py index dd0a3fd7..7c031f2b 100644 --- a/docling_eval/dataset_builders/otsl_table_dataset_builder.py +++ b/docling_eval/dataset_builders/otsl_table_dataset_builder.py @@ -1,7 +1,7 @@ import io import logging from pathlib import Path -from typing import Any, Iterable, List +from typing import Any, Iterable, List, Optional from datasets import load_dataset from docling_core.types import DoclingDocument @@ -14,11 +14,15 @@ Size, ) from docling_core.types.io import DocumentStream +from PIL import Image from tqdm import tqdm -from docling_eval.converters.models.tableformer.tf_model_prediction import PageTokens -from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.datamodels.types import ( + BenchMarkColumns, + EvaluationModality, + PageTokens, +) from docling_eval.dataset_builders.dataset_builder import ( BaseEvaluationDatasetBuilder, HFSource, @@ -34,7 +38,12 @@ class TableDatasetBuilder(BaseEvaluationDatasetBuilder): - """Base class for table dataset builders.""" + """ + Base class for table dataset builders. + + This class provides common functionality for building datasets + focused on table structure recognition tasks. + """ def __init__( self, @@ -42,18 +51,36 @@ def __init__( dataset_source: HFSource, target: Path, split: str = "test", - max_items: int = -1, + begin_index: int = 0, + end_index: int = -1, ): + """ + Initialize the table dataset builder. + + Args: + name: Name of the dataset + dataset_source: HuggingFace dataset source + target: Path where processed dataset will be saved + split: Dataset split to use + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all + """ super().__init__( name=name, dataset_source=dataset_source, target=target, split=split, + begin_index=begin_index, + end_index=end_index, ) - self.max_items = max_items def retrieve_input_dataset(self) -> Path: - """Download and extract the dataset.""" + """ + Download and extract the dataset. + + Returns: + Path to the retrieved dataset + """ assert isinstance(self.dataset_source, HFSource) dataset_path = super().retrieve_input_dataset() self.retrieved = True @@ -62,7 +89,17 @@ def retrieve_input_dataset(self) -> Path: def create_page_tokens( self, data: List[Any], height: float, width: float ) -> PageTokens: - """Create page tokens from cell data.""" + """ + Create page tokens from cell data. + + Args: + data: Table cell data + height: Page height + width: Page width + + Returns: + PageTokens object containing token information + """ tokens = [] cnt = 0 for i, row in enumerate(data): @@ -86,7 +123,12 @@ def create_page_tokens( return PageTokens.model_validate(result) def iterate(self) -> Iterable[DatasetRecord]: - """Iterate through the dataset and yield DatasetRecord objects.""" + """ + Iterate through the dataset and yield DatasetRecord objects. + + Yields: + DatasetRecord objects + """ if not self.retrieved: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." @@ -96,8 +138,17 @@ def iterate(self) -> Iterable[DatasetRecord]: # Load dataset from the retrieved path ds = load_dataset(self.dataset_source.repo_id, split=self.split) - if self.max_items > 0: - ds = ds.select(range(self.max_items)) + # Apply index range + total_items = len(ds) + begin, end = self.get_effective_indices(total_items) + + # Use HuggingFace's select method for applying range + ds = ds.select(range(begin, end)) + selected_items = len(ds) + + # Log stats + self.log_dataset_stats(total_items, selected_items) + _log.info(f"Processing {self.name} dataset: {selected_items} items") for item in tqdm(ds, desc=f"Processing {self.name} dataset"): try: @@ -208,14 +259,25 @@ def __init__( self, target: Path, split: str = "test", - max_items: int = -1, + begin_index: int = 0, + end_index: int = -1, ): + """ + Initialize the FinTabNet dataset builder. + + Args: + target: Path where processed dataset will be saved + split: Dataset split to use + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all + """ super().__init__( name="FinTabNet", dataset_source=HFSource(repo_id="ds4sd/FinTabNet_OTSL"), target=target, split=split, - max_items=max_items, + begin_index=begin_index, + end_index=end_index, ) @@ -226,14 +288,25 @@ def __init__( self, target: Path, split: str = "val", # PubTabNet uses "val" instead of "test" - max_items: int = -1, + begin_index: int = 0, + end_index: int = -1, ): + """ + Initialize the PubTabNet dataset builder. + + Args: + target: Path where processed dataset will be saved + split: Dataset split to use + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all + """ super().__init__( name="PubTabNet", dataset_source=HFSource(repo_id="ds4sd/PubTabNet_OTSL"), target=target, split=split, - max_items=max_items, + begin_index=begin_index, + end_index=end_index, ) @@ -244,12 +317,23 @@ def __init__( self, target: Path, split: str = "test", - max_items: int = -1, + begin_index: int = 0, + end_index: int = -1, ): + """ + Initialize the PubTables-1M dataset builder. + + Args: + target: Path where processed dataset will be saved + split: Dataset split to use + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all + """ super().__init__( name="PubTables-1M", dataset_source=HFSource(repo_id="ds4sd/PubTables-1M_OTSL-v1.1"), target=target, split=split, - max_items=max_items, + begin_index=begin_index, + end_index=end_index, ) diff --git a/docling_eval/dataset_builders/xfund_builder.py b/docling_eval/dataset_builders/xfund_builder.py index d9757d82..f9559c74 100644 --- a/docling_eval/dataset_builders/xfund_builder.py +++ b/docling_eval/dataset_builders/xfund_builder.py @@ -15,8 +15,8 @@ from PIL import Image from tqdm import tqdm -from docling_eval.datamodels.constants import BenchMarkColumns, EvaluationModality from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.datamodels.types import BenchMarkColumns, EvaluationModality from docling_eval.dataset_builders.dataset_builder import BaseEvaluationDatasetBuilder from docling_eval.utils.utils import ( classify_cells, @@ -30,24 +30,39 @@ class XFUNDDatasetBuilder(BaseEvaluationDatasetBuilder): - """XFUND Dataset builder implementing the base dataset builder interface.""" + """ + XFUND Dataset builder implementing the base dataset builder interface. + + XFUND is a multilingual form understanding dataset that includes forms in + multiple languages: Chinese, Japanese, Spanish, French, Italian, German, and Portuguese. + """ def __init__( self, dataset_source: Path, - # prediction_provider: BasePredictionProvider, target: Path, split: str = "val", # XFUND uses "val" instead of "test" - max_items: int = -1, + begin_index: int = 0, + end_index: int = -1, ): + """ + Initialize the XFUND dataset builder. + + Args: + dataset_source: Path to the dataset source + target: Path where processed dataset will be saved + split: Dataset split to use ("val" for XFUND) + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all + """ super().__init__( name="XFUND", - dataset_source=dataset_source, # Local Path to dataset - # prediction_provider=prediction_provider, + dataset_source=dataset_source, target=target, split=split, + begin_index=begin_index, + end_index=end_index, ) - self.max_items = max_items self._langs = [ "zh", "de", @@ -59,7 +74,12 @@ def __init__( ] # Fixed supported languages def retrieve_input_dataset(self) -> Path: - """Download and extract the XFUND dataset if needed.""" + """ + Download and extract the XFUND dataset if needed. + + Returns: + Path to the retrieved dataset + """ assert isinstance(self.dataset_source, Path) dataset_path = self.dataset_source @@ -107,7 +127,15 @@ def retrieve_input_dataset(self) -> Path: return dataset_path def convert_bbox(self, bbox_data) -> BoundingBox: - """Convert bbox format to BoundingBox object.""" + """ + Convert bbox format to BoundingBox object. + + Args: + bbox_data: Bounding box data as list or BoundingBox + + Returns: + BoundingBox object + """ if isinstance(bbox_data, list) and len(bbox_data) == 4: return BoundingBox( l=bbox_data[0], t=bbox_data[1], r=bbox_data[2], b=bbox_data[3] @@ -125,7 +153,17 @@ def create_graph_link( value_cell: GraphCell, label: GraphLinkLabel = GraphLinkLabel.TO_VALUE, ) -> GraphLink: - """Create a graph link between key and value cells.""" + """ + Create a graph link between key and value cells. + + Args: + key_cell: Source cell (key) + value_cell: Target cell (value) + label: Link label + + Returns: + GraphLink object + """ return GraphLink( source_cell_id=key_cell.cell_id, target_cell_id=value_cell.cell_id, @@ -135,7 +173,16 @@ def create_graph_link( def get_overall_bbox( self, links: List[GraphLink], cell_dict: Dict[int, GraphCell] ) -> Optional[BoundingBox]: - """Compute the overall bounding box from all cell ids.""" + """ + Compute the overall bounding box from all cell ids. + + Args: + links: List of GraphLink objects + cell_dict: Dictionary mapping cell IDs to GraphCell objects + + Returns: + BoundingBox encompassing all cells, or None if no bounding boxes + """ all_bboxes = [] for link in links: src_prov = cell_dict[link.source_cell_id].prov @@ -153,7 +200,16 @@ def get_overall_bbox( def populate_key_value_item( self, doc: DoclingDocument, xfund_data: dict ) -> DoclingDocument: - """Populate the key-value item from the XFUND data.""" + """ + Populate the key-value item from the XFUND data. + + Args: + doc: DoclingDocument to update + xfund_data: XFUND annotation data + + Returns: + Updated DoclingDocument + """ if "document" not in xfund_data: raise ValueError("Invalid XFUND data: missing 'document' key.") @@ -232,7 +288,12 @@ def populate_key_value_item( return doc def iterate(self) -> Iterable[DatasetRecord]: - """Iterate through the dataset and yield DatasetRecord objects.""" + """ + Iterate through the dataset and yield DatasetRecord objects. + + Yields: + DatasetRecord objects + """ if not self.retrieved: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." @@ -252,19 +313,22 @@ def iterate(self) -> Iterable[DatasetRecord]: data = json.load(f) all_documents.extend(data.get("documents", [])) - # Limit number of items if specified - if self.max_items > 0 and len(all_documents) > self.max_items: - import random + # Sort documents by image filename for deterministic ordering + all_documents = sorted(all_documents, key=lambda doc: doc["img"]["fname"]) + total_documents = len(all_documents) - random.seed(42) # For reproducibility - all_documents = random.sample(all_documents, self.max_items) + # Apply index range + begin, end = self.get_effective_indices(total_documents) + selected_documents = all_documents[begin:end] + # Log stats + self.log_dataset_stats(total_documents, len(selected_documents)) _log.info( - f"Processing XFUND {self.split} dataset: {len(all_documents)} documents" + f"Processing XFUND {self.split} dataset: {len(selected_documents)} documents" ) # Process each document - for doc_data in tqdm(all_documents, total=len(all_documents)): + for doc_data in tqdm(selected_documents, total=len(selected_documents)): try: # Get image path img_filename = doc_data["img"]["fname"] @@ -311,7 +375,6 @@ def iterate(self) -> Iterable[DatasetRecord]: assert img.format is not None # Create dataset record record = DatasetRecord( - # predictor_info=self.prediction_provider.info(), doc_id=Path(img_filename).stem, doc_hash=get_binhash(img_bytes), ground_truth_doc=true_doc, diff --git a/docling_eval/evaluators/base_evaluator.py b/docling_eval/evaluators/base_evaluator.py index 8a7416a2..3cda3466 100644 --- a/docling_eval/evaluators/base_evaluator.py +++ b/docling_eval/evaluators/base_evaluator.py @@ -4,7 +4,7 @@ from pydantic import BaseModel -from docling_eval.datamodels.constants import PredictionFormats +from docling_eval.datamodels.types import PredictionFormats _log = logging.getLogger(__name__) diff --git a/docling_eval/evaluators/base_readingorder_evaluator.py b/docling_eval/evaluators/base_readingorder_evaluator.py index 827bd322..b1e19996 100644 --- a/docling_eval/evaluators/base_readingorder_evaluator.py +++ b/docling_eval/evaluators/base_readingorder_evaluator.py @@ -15,7 +15,7 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.datamodels.types import BenchMarkColumns from docling_eval.evaluators.stats import DatasetStatistics, compute_stats from docling_eval.visualisation.visualisations import draw_arrow diff --git a/docling_eval/evaluators/bbox_text_evaluator.py b/docling_eval/evaluators/bbox_text_evaluator.py index 8e22d27b..7511310d 100644 --- a/docling_eval/evaluators/bbox_text_evaluator.py +++ b/docling_eval/evaluators/bbox_text_evaluator.py @@ -13,7 +13,7 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.datamodels.constants import BenchMarkColumns # type: ignore +from docling_eval.datamodels.types import BenchMarkColumns # type: ignore from docling_eval.evaluators.stats import DatasetStatistics, compute_stats _log = logging.getLogger(__name__) diff --git a/docling_eval/evaluators/layout_evaluator.py b/docling_eval/evaluators/layout_evaluator.py index 8e72cd84..aa4e21a7 100644 --- a/docling_eval/evaluators/layout_evaluator.py +++ b/docling_eval/evaluators/layout_evaluator.py @@ -15,7 +15,7 @@ from torchmetrics.detection.mean_ap import MeanAveragePrecision from tqdm import tqdm # type: ignore -from docling_eval.datamodels.constants import BenchMarkColumns, PredictionFormats +from docling_eval.datamodels.types import BenchMarkColumns, PredictionFormats from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation from docling_eval.evaluators.stats import DatasetStatistics, compute_stats diff --git a/docling_eval/evaluators/markdown_text_evaluator.py b/docling_eval/evaluators/markdown_text_evaluator.py index f5690a57..8b391eef 100644 --- a/docling_eval/evaluators/markdown_text_evaluator.py +++ b/docling_eval/evaluators/markdown_text_evaluator.py @@ -14,7 +14,7 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.datamodels.constants import ( # type: ignore +from docling_eval.datamodels.types import ( # type: ignore BenchMarkColumns, PredictionFormats, ) diff --git a/docling_eval/evaluators/readingorder_evaluator_glm.py b/docling_eval/evaluators/readingorder_evaluator_glm.py deleted file mode 100644 index 7328f635..00000000 --- a/docling_eval/evaluators/readingorder_evaluator_glm.py +++ /dev/null @@ -1,76 +0,0 @@ -import copy -import logging -from typing import Dict, Optional - -from deepsearch_glm.andromeda_nlp import nlp_model # type: ignore -from docling_core.types.doc.document import DoclingDocument -from docling_core.utils.legacy import docling_document_to_legacy - -from docling_eval.evaluators.base_readingorder_evaluator import ( - BaseReadingOrderEvaluator, -) - -_log = logging.getLogger(__name__) - - -class ReadingOrderEvaluatorGlm(BaseReadingOrderEvaluator): - r""" - Evaluate the reading order using the Average Relative Distance metric - """ - - def __init__(self): - self._nlp_model = nlp_model(loglevel="error", text_ordering=True) - - def _get_reading_order_preds( - self, doc_id: str, true_doc: DoclingDocument - ) -> Optional[dict]: - r""" - Return dict with the bboxes and the predicted reading order or None if something goes wrong. - None is also returned if the document contains items with multiple provenances - - Returns - ------- - reading_order: Keys are "bboxes" and "pred_order". Return None if the document is broken. - """ - try: - page_size = true_doc.pages[1].size - - # Convert the bboxes to bottom-left coords before running the GLM - bboxes = [] - for item, level in true_doc.iterate_items(): - pred_len = len(item.prov) # type: ignore - if pred_len > 1: - _log.warning( - "Skipping document %s as it has %s provenances", - doc_id, - pred_len, - ) - return None - - # Convert the bbox to BOTTOM-LEFT origin - bbox = item.prov[0].bbox.to_bottom_left_origin(page_size.height) # type: ignore - item.prov[0].bbox = bbox # type: ignore - bboxes.append(copy.deepcopy(bbox)) - - # Run the reading order model - legacy_doc = docling_document_to_legacy(true_doc) - legacy_doc_dict = legacy_doc.model_dump(by_alias=True, exclude_none=True) - legacy_doc_dict = self._ensure_bboxes_in_legacy_tables(legacy_doc_dict) - glm_doc = self._nlp_model.apply_on_doc(legacy_doc_dict) - - # pred_to_origin_order: predicted order -> original order - pred_to_origin_order: Dict[int, int] = {} - for po, pe in enumerate(glm_doc["page-elements"]): - oo = pe["orig-order"] - pred_to_origin_order[po] = oo - - # pred_order: The index is the predicted order and the value is the original order - pred_order = [ - pred_to_origin_order[x] for x in range(len(pred_to_origin_order)) - ] - - reading_order = {"bboxes": bboxes, "pred_order": pred_order} - return reading_order - except RuntimeError as ex: - _log.error(str(ex)) - return None diff --git a/docling_eval/evaluators/table_evaluator.py b/docling_eval/evaluators/table_evaluator.py index 934beb2a..776dff52 100644 --- a/docling_eval/evaluators/table_evaluator.py +++ b/docling_eval/evaluators/table_evaluator.py @@ -13,7 +13,7 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.datamodels.constants import BenchMarkColumns, PredictionFormats +from docling_eval.datamodels.types import BenchMarkColumns, PredictionFormats from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation from docling_eval.evaluators.stats import DatasetStatistics, compute_stats from docling_eval.evaluators.teds import TEDScorer diff --git a/docling_eval/converters/__init__.py b/docling_eval/legacy/converters/__init__.py similarity index 100% rename from docling_eval/converters/__init__.py rename to docling_eval/legacy/converters/__init__.py diff --git a/docling_eval/converters/conversion.py b/docling_eval/legacy/converters/conversion.py similarity index 100% rename from docling_eval/converters/conversion.py rename to docling_eval/legacy/converters/conversion.py diff --git a/docling_eval/legacy/cvat_annotation/create.py b/docling_eval/legacy/cvat_annotation/create.py index 4a5176e7..1f3126b1 100644 --- a/docling_eval/legacy/cvat_annotation/create.py +++ b/docling_eval/legacy/cvat_annotation/create.py @@ -23,12 +23,12 @@ from PIL import Image # as PILImage from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import create_pdf_docling_converter -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) +from docling_eval.legacy.converters.conversion import create_pdf_docling_converter from docling_eval.legacy.cvat_annotation.utils import ( AnnotatedImage, AnnotationOverview, diff --git a/docling_eval/legacy/cvat_annotation/create_dataset_from_pdfs.py b/docling_eval/legacy/cvat_annotation/create_dataset_from_pdfs.py index 7107e6a8..a5554450 100644 --- a/docling_eval/legacy/cvat_annotation/create_dataset_from_pdfs.py +++ b/docling_eval/legacy/cvat_annotation/create_dataset_from_pdfs.py @@ -8,8 +8,8 @@ from datasets import Image as Features_Image from datasets import Sequence, Value -from docling_eval.converters.conversion import create_pdf_docling_converter -from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.datamodels.types import BenchMarkColumns +from docling_eval.legacy.converters.conversion import create_pdf_docling_converter from docling_eval.utils.utils import ( docling_version, extract_images, diff --git a/docling_eval/legacy/cvat_annotation/preannotate.py b/docling_eval/legacy/cvat_annotation/preannotate.py index c7f1617c..e70b6884 100644 --- a/docling_eval/legacy/cvat_annotation/preannotate.py +++ b/docling_eval/legacy/cvat_annotation/preannotate.py @@ -12,7 +12,7 @@ from docling_core.types.doc.labels import DocItemLabel, PictureClassificationLabel from tqdm import tqdm # type: ignore -from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.datamodels.types import BenchMarkColumns from docling_eval.legacy.cvat_annotation.utils import ( AnnotatedDoc, AnnotatedImage, diff --git a/docling_eval/legacy/doclaynet_v1/create.py b/docling_eval/legacy/doclaynet_v1/create.py index b80ac862..bcfe5e50 100644 --- a/docling_eval/legacy/doclaynet_v1/create.py +++ b/docling_eval/legacy/doclaynet_v1/create.py @@ -20,15 +20,15 @@ from docling_core.types.io import DocumentStream from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import ( - create_pdf_docling_converter, - create_smol_docling_converter, -) -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) +from docling_eval.legacy.converters.conversion import ( + create_pdf_docling_converter, + create_smol_docling_converter, +) from docling_eval.utils.utils import ( add_pages_to_true_doc, crop_bounding_box, diff --git a/docling_eval/legacy/doclaynet_v2/create.py b/docling_eval/legacy/doclaynet_v2/create.py index da360169..52e79f3a 100644 --- a/docling_eval/legacy/doclaynet_v2/create.py +++ b/docling_eval/legacy/doclaynet_v2/create.py @@ -27,15 +27,15 @@ from docling_core.types.io import DocumentStream from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import ( - create_image_docling_converter, - create_smol_docling_converter, -) -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) +from docling_eval.legacy.converters.conversion import ( + create_image_docling_converter, + create_smol_docling_converter, +) from docling_eval.legacy.doclaynet_v1.create import ( PRED_HTML_EXPORT_LABELS, TRUE_HTML_EXPORT_LABELS, diff --git a/docling_eval/legacy/dpbench/create.py b/docling_eval/legacy/dpbench/create.py index edaf1fdc..85c7c57a 100644 --- a/docling_eval/legacy/dpbench/create.py +++ b/docling_eval/legacy/dpbench/create.py @@ -17,18 +17,16 @@ from PIL import Image # as PILImage from tqdm import tqdm -from docling_eval.converters.conversion import ( - create_pdf_docling_converter, - create_smol_docling_converter, -) -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - TableFormerUpdater, -) -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) +from docling_eval.legacy.converters.conversion import ( + create_pdf_docling_converter, + create_smol_docling_converter, +) +from docling_eval.prediction_providers.tableformer_provider import TableFormerUpdater from docling_eval.utils.utils import ( add_pages_to_true_doc, convert_html_table_into_docling_tabledata, diff --git a/docling_eval/legacy/funsd/create.py b/docling_eval/legacy/funsd/create.py index bf9de885..7e6e15b1 100644 --- a/docling_eval/legacy/funsd/create.py +++ b/docling_eval/legacy/funsd/create.py @@ -12,8 +12,8 @@ from PIL import Image from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import create_image_docling_converter -from docling_eval.datamodels.constants import BenchMarkColumns, ConverterTypes +from docling_eval.datamodels.types import BenchMarkColumns, ConverterTypes +from docling_eval.legacy.converters.conversion import create_image_docling_converter from docling_eval.utils.utils import ( docling_version, extract_images, diff --git a/docling_eval/legacy/omnidocbench/create.py b/docling_eval/legacy/omnidocbench/create.py index dd36efa1..1fc93c1f 100644 --- a/docling_eval/legacy/omnidocbench/create.py +++ b/docling_eval/legacy/omnidocbench/create.py @@ -12,18 +12,16 @@ from PIL import Image # as PILImage from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import ( - create_pdf_docling_converter, - create_smol_docling_converter, -) -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - TableFormerUpdater, -) -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkColumns, ConverterTypes, EvaluationModality, ) +from docling_eval.legacy.converters.conversion import ( + create_pdf_docling_converter, + create_smol_docling_converter, +) +from docling_eval.prediction_providers.tableformer_provider import TableFormerUpdater from docling_eval.utils.utils import ( add_pages_to_true_doc, convert_html_table_into_docling_tabledata, diff --git a/docling_eval/legacy/tableformer_huggingface_otsl/create.py b/docling_eval/legacy/tableformer_huggingface_otsl/create.py index c1f7fbd9..f64bb947 100644 --- a/docling_eval/legacy/tableformer_huggingface_otsl/create.py +++ b/docling_eval/legacy/tableformer_huggingface_otsl/create.py @@ -18,15 +18,13 @@ from docling_core.types.doc.labels import DocItemLabel from tqdm import tqdm # type: ignore -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - PageTokens, - TableFormerUpdater, -) -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkColumns, ConverterTypes, EvaluationModality, + PageTokens, ) +from docling_eval.prediction_providers.tableformer_provider import TableFormerUpdater from docling_eval.utils.utils import ( convert_html_table_into_docling_tabledata, docling_version, diff --git a/docling_eval/legacy/xfund/create.py b/docling_eval/legacy/xfund/create.py index d7b4b6a9..03696d27 100644 --- a/docling_eval/legacy/xfund/create.py +++ b/docling_eval/legacy/xfund/create.py @@ -26,8 +26,8 @@ from PIL import Image from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import create_image_docling_converter -from docling_eval.datamodels.constants import BenchMarkColumns, ConverterTypes +from docling_eval.datamodels.types import BenchMarkColumns, ConverterTypes +from docling_eval.legacy.converters.conversion import create_image_docling_converter from docling_eval.utils.utils import ( crop_bounding_box, docling_version, diff --git a/docling_eval/prediction_providers/base_prediction_provider.py b/docling_eval/prediction_providers/base_prediction_provider.py index 464afbd4..2bb77f5a 100644 --- a/docling_eval/prediction_providers/base_prediction_provider.py +++ b/docling_eval/prediction_providers/base_prediction_provider.py @@ -1,10 +1,10 @@ import copy -import os +import logging import sys from abc import abstractmethod from io import BytesIO from pathlib import Path -from typing import Dict, Optional +from typing import Dict, Iterable, List, Optional, Set, Tuple, Union from datasets import load_dataset from docling.datamodel.base_models import ConversionStatus @@ -14,15 +14,23 @@ from docling_core.types.io import DocumentStream from tqdm import tqdm -from docling_eval.datamodels.constants import PredictionFormats from docling_eval.datamodels.dataset_record import ( DatasetRecord, DatasetRecordWithPrediction, ) -from docling_eval.utils.utils import save_shard_to_disk, write_datasets_info +from docling_eval.datamodels.types import PredictionFormats +from docling_eval.utils.utils import ( + insert_images_from_pil, + save_shard_to_disk, + write_datasets_info, +) from docling_eval.visualisation.visualisations import save_comparison_html_with_clusters -TRUE_HTML_EXPORT_LABELS = { +# Get logger +_log = logging.getLogger(__name__) + +# Default HTML export labels for visualization +TRUE_HTML_EXPORT_LABELS: Set[DocItemLabel] = { DocItemLabel.TITLE, DocItemLabel.DOCUMENT_INDEX, DocItemLabel.SECTION_HEADER, @@ -42,7 +50,7 @@ DocItemLabel.FOOTNOTE, } -PRED_HTML_EXPORT_LABELS = { +PRED_HTML_EXPORT_LABELS: Set[DocItemLabel] = { DocItemLabel.TITLE, DocItemLabel.DOCUMENT_INDEX, DocItemLabel.SECTION_HEADER, @@ -63,14 +71,47 @@ class BasePredictionProvider: + """ + Base class for all prediction providers. + + Prediction providers are responsible for generating predictions from input data + in the form of DoclingDocument objects or other formats. + """ + def __init__( - self, do_visualization: bool = False, ignore_missing_predictions: bool = True + self, + do_visualization: bool = False, + ignore_missing_predictions: bool = True, + true_labels: Optional[Set[DocItemLabel]] = None, + pred_labels: Optional[Set[DocItemLabel]] = None, ): + """ + Initialize the prediction provider. + + Args: + do_visualization: Whether to generate visualizations of predictions + ignore_missing_predictions: Whether to ignore records with missing predictions + true_labels: Set of DocItemLabel to use for ground truth visualization + pred_labels: Set of DocItemLabel to use for prediction visualization + """ self.do_visualization = do_visualization self.ignore_missing_predictions = ignore_missing_predictions + # Label sets for visualization + self.true_labels = true_labels or TRUE_HTML_EXPORT_LABELS + self.pred_labels = pred_labels or PRED_HTML_EXPORT_LABELS + @abstractmethod def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: + """ + Generate a prediction for a dataset record. + + Args: + record: Input dataset record + + Returns: + Dataset record with prediction added + """ pred_record = self.create_dataset_record_with_prediction( record, DoclingDocument(name="dummy"), @@ -79,28 +120,61 @@ def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: return pred_record @abstractmethod - def info(self) -> Dict: + def info(self) -> Dict[str, str]: + """ + Get information about the prediction provider. + + Returns: + Dictionary with provider information + """ return {} def visualize_results( self, prediction_record: DatasetRecordWithPrediction, target_dataset_dir: Path - ): - if prediction_record.predicted_doc is not None: + ) -> None: + """ + Create visualizations of prediction results. + + Args: + prediction_record: Record with prediction to visualize + target_dataset_dir: Directory to save visualizations + """ + if ( + prediction_record.predicted_doc is not None + and prediction_record.ground_truth_page_images + ): + gt_doc = insert_images_from_pil( + prediction_record.ground_truth_doc, + prediction_record.ground_truth_pictures, + prediction_record.ground_truth_page_images, + ) + pred_doc = insert_images_from_pil( + prediction_record.predicted_doc, + prediction_record.predicted_pictures, + prediction_record.predicted_page_images, + ) + save_comparison_html_with_clusters( filename=target_dataset_dir / "visualizations" / f"{prediction_record.doc_id}.html", - true_doc=prediction_record.ground_truth_doc, - pred_doc=prediction_record.predicted_doc, + true_doc=gt_doc, + pred_doc=pred_doc, page_image=prediction_record.ground_truth_page_images[0], - true_labels=TRUE_HTML_EXPORT_LABELS, - pred_labels=PRED_HTML_EXPORT_LABELS, + true_labels=self.true_labels, + pred_labels=self.pred_labels, draw_reading_order=True, ) @property @abstractmethod def prediction_format(self) -> PredictionFormats: + """ + Get the format of predictions generated by this provider. + + Returns: + Prediction format enum value + """ pass def create_dataset_record_with_prediction( @@ -108,23 +182,41 @@ def create_dataset_record_with_prediction( record: DatasetRecord, predicted_doc: Optional[DoclingDocument] = None, original_prediction: Optional[str] = None, - ): - pred_record = DatasetRecordWithPrediction.model_validate( - { - **record.as_record_dict(), - "predicted_doc": predicted_doc, - "original_prediction": original_prediction, - "prediction_format": self.prediction_format, - } - ) - pred_record.validate_images() # type: ignore - return pred_record + ) -> DatasetRecordWithPrediction: + """ + Create a dataset record with prediction from an input record. + + Args: + record: Input dataset record + predicted_doc: Predicted DoclingDocument + original_prediction: Original prediction text/data + + Returns: + Dataset record with prediction + """ + data = { + **record.as_record_dict(), + "predicted_doc": predicted_doc, + "original_prediction": original_prediction, + "prediction_format": self.prediction_format, + "predictor_info": self.info(), + } + return DatasetRecordWithPrediction.model_validate(data) def add_prediction(self, record: DatasetRecord) -> DatasetRecordWithPrediction: - # This might need customization depending on the input the dataset has. - # The default implementation assumes that there is an original file in binary format which is accepted. + """ + Add a prediction to a dataset record. + + Args: + record: Input dataset record + + Returns: + Dataset record with prediction + """ + # Copy the original input data to avoid modifying it input_data = copy.deepcopy(record.original) + # Convert Path to DocumentStream if needed if not isinstance(input_data, DocumentStream): if isinstance(input_data, Path): input_data = DocumentStream( @@ -136,43 +228,114 @@ def add_prediction(self, record: DatasetRecord) -> DatasetRecordWithPrediction: return pred_record + def get_effective_indices( + self, total_items: int, begin_index: int, end_index: int + ) -> Tuple[int, int]: + """ + Calculate the effective begin and end indices based on dataset size. + + Args: + total_items: Total number of items available + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all + + Returns: + Tuple of (effective_begin_index, effective_end_index) + """ + begin = begin_index if begin_index >= 0 else 0 + end = end_index if end_index > 0 else total_items + end = min(end, total_items) + + if begin >= total_items: + _log.warning( + f"Begin index ({begin}) is greater than or equal to dataset size ({total_items}). " + f"No items will be processed." + ) + begin = total_items + + _log.info( + f"Processing range [{begin}:{end}] out of {total_items} total items " + f"({end - begin} items)" + ) + + return begin, end + def create_prediction_dataset( self, name: str, gt_dataset_dir: Path, target_dataset_dir: Path, split: str = "test", - ): + begin_index: int = 0, + end_index: int = -1, + ) -> None: + """ + Create a prediction dataset from a ground truth dataset. + + Args: + name: Name of the dataset + gt_dataset_dir: Path to ground truth dataset + target_dataset_dir: Path to save prediction dataset + split: Dataset split to process + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all + """ + # Load the dataset parquet_files = str(gt_dataset_dir / split / "*.parquet") ds = load_dataset("parquet", data_files={split: parquet_files}) - # _log.info(f"oveview of dataset: {ds}") - if ds is not None: - ds_selection = ds[split] - def _iterate_predictions(): + if ds is None: + _log.error(f"Failed to load dataset from {parquet_files}") + return + + ds_selection = ds[split] + total_items = len(ds_selection) + + # Calculate effective indices + begin, end = self.get_effective_indices(total_items, begin_index, end_index) + + # Apply range + if begin > 0 or end < total_items: + ds_selection = ds_selection.select(range(begin, end)) + + selected_items = len(ds_selection) + _log.info( + f"Dataset '{name}' total items: {total_items}. " + f"Selected range: [{begin}, {end}] = {selected_items} items" + ) + + def _iterate_predictions() -> Iterable[DatasetRecordWithPrediction]: + """Generate predictions for each record in the dataset.""" for i, data in tqdm( enumerate(ds_selection), desc="Creating predictions", ncols=120, total=len(ds_selection), ): - record = DatasetRecord.model_validate(data) - pred_record = self.add_prediction(record) + try: + record = DatasetRecord.model_validate(data) + pred_record = self.add_prediction(record) - if ( - self.ignore_missing_predictions - and pred_record.status == ConversionStatus.FAILURE - ): - continue + if ( + self.ignore_missing_predictions + and pred_record.status == ConversionStatus.FAILURE + ): + continue - yield pred_record + yield pred_record + except Exception as e: + _log.error(f"Error processing record {i}: {str(e)}") + if not self.ignore_missing_predictions: + raise + # Create output directories test_dir = target_dataset_dir / split - os.makedirs(test_dir, exist_ok=True) + test_dir.mkdir(parents=True, exist_ok=True) if self.do_visualization: - os.makedirs(target_dataset_dir / "visualizations", exist_ok=True) + (target_dataset_dir / "visualizations").mkdir(parents=True, exist_ok=True) + # Process in chunks chunk_size = 80 max_num_chunks = sys.maxsize @@ -192,8 +355,14 @@ def _iterate_predictions(): chunk_count += 1 if chunk_count >= max_num_chunks: + _log.info( + f"Reached maximum number of chunks ({max_num_chunks}). Stopping." + ) break + _log.info(f"Saved {count} records in {chunk_count} chunks to {test_dir}") + + # Write dataset info write_datasets_info( name=name, output_dir=target_dataset_dir, diff --git a/docling_eval/prediction_providers/docling_provider.py b/docling_eval/prediction_providers/docling_provider.py index 9bb265b8..6baeb9dd 100644 --- a/docling_eval/prediction_providers/docling_provider.py +++ b/docling_eval/prediction_providers/docling_provider.py @@ -1,14 +1,15 @@ import copy -from typing import Dict, Optional +from typing import Dict, Optional, Set from docling.datamodel.base_models import ConversionStatus, InputFormat from docling.document_converter import DocumentConverter, FormatOption +from docling_core.types.doc import DocItemLabel -from docling_eval.datamodels.constants import PredictionFormats from docling_eval.datamodels.dataset_record import ( DatasetRecord, DatasetRecordWithPrediction, ) +from docling_eval.datamodels.types import PredictionFormats from docling_eval.prediction_providers.base_prediction_provider import ( BasePredictionProvider, ) @@ -16,26 +17,66 @@ class DoclingPredictionProvider(BasePredictionProvider): + """ + Prediction provider that uses Docling document converter. + + This provider converts documents using the Docling document converter + with specified format options. + """ + def __init__( self, format_options: Optional[Dict[InputFormat, FormatOption]] = None, do_visualization: bool = False, + ignore_missing_predictions: bool = True, + true_labels: Optional[Set[DocItemLabel]] = None, + pred_labels: Optional[Set[DocItemLabel]] = None, ): - super().__init__(do_visualization=do_visualization) + """ + Initialize the Docling prediction provider. + + Args: + format_options: Dictionary mapping input formats to format options + do_visualization: Whether to generate visualizations + ignore_missing_predictions: Whether to ignore missing predictions + true_labels: Set of DocItemLabel to use for ground truth visualization + pred_labels: Set of DocItemLabel to use for prediction visualization + """ + super().__init__( + do_visualization=do_visualization, + ignore_missing_predictions=ignore_missing_predictions, + true_labels=true_labels, + pred_labels=pred_labels, + ) self.doc_converter = DocumentConverter(format_options=format_options) @property def prediction_format(self) -> PredictionFormats: + """Get the prediction format.""" return PredictionFormats.DOCLING_DOCUMENT - def predict( - self, - record: DatasetRecord, - ) -> DatasetRecordWithPrediction: - assert ( - record.original is not None - ), "stream must be given for docling prediction provider to work." + def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: + """ + Generate a prediction by converting the document. + + Args: + record: Input dataset record + + Returns: + Dataset record with prediction + + Raises: + RuntimeError: If original document stream is not available + """ + if record.original is None: + raise RuntimeError( + "Stream must be given for docling prediction provider to work." + ) + + # Convert the document res = self.doc_converter.convert(copy.deepcopy(record.original)) + + # Create prediction record pred_record = self.create_dataset_record_with_prediction( record, res.document, @@ -46,4 +87,5 @@ def predict( return pred_record def info(self) -> Dict: + """Get information about the prediction provider.""" return {"asset": "Docling", "version": docling_version()} diff --git a/docling_eval/prediction_providers/file_provider.py b/docling_eval/prediction_providers/file_provider.py index aa679afd..4a1bd583 100644 --- a/docling_eval/prediction_providers/file_provider.py +++ b/docling_eval/prediction_providers/file_provider.py @@ -1,31 +1,65 @@ -from abc import abstractmethod +import logging from pathlib import Path -from typing import Dict, Optional +from typing import Dict, Optional, Set from docling.datamodel.base_models import ConversionStatus -from docling_core.types import DoclingDocument -from docling_core.types.doc.document import DocTagsDocument, DocTagsPage +from docling_core.types.doc import DocItemLabel +from docling_core.types.doc.document import ( + DoclingDocument, + DocTagsDocument, + DocTagsPage, +) from PIL import Image -from docling_eval.datamodels.constants import PredictionFormats from docling_eval.datamodels.dataset_record import ( DatasetRecord, DatasetRecordWithPrediction, ) +from docling_eval.datamodels.types import PredictionFormats from docling_eval.prediction_providers.base_prediction_provider import ( BasePredictionProvider, ) +_log = logging.getLogger(__name__) + class FilePredictionProvider(BasePredictionProvider): + """ + Prediction provider that reads prediction files from a directory. + + This provider supports various file formats like DOCTAGS, MARKDOWN, + JSON, and YAML. + """ + def __init__( self, prediction_format: PredictionFormats, source_path: Path, do_visualization: bool = False, - ignore_missing_files: Optional[bool] = False, + ignore_missing_files: bool = False, + ignore_missing_predictions: bool = True, + true_labels: Optional[Set[DocItemLabel]] = None, + pred_labels: Optional[Set[DocItemLabel]] = None, ): - super().__init__(do_visualization=do_visualization) + """ + Initialize the file prediction provider. + + Args: + prediction_format: Format of prediction files + source_path: Path to directory containing prediction files + do_visualization: Whether to generate visualizations + ignore_missing_files: Whether to ignore missing files + ignore_missing_predictions: Whether to ignore missing predictions + true_labels: Set of DocItemLabel to use for ground truth visualization + pred_labels: Set of DocItemLabel to use for prediction visualization + """ + super().__init__( + do_visualization=do_visualization, + ignore_missing_predictions=ignore_missing_predictions, + true_labels=true_labels, + pred_labels=pred_labels, + ) + self._supported_prediction_formats = [ PredictionFormats.DOCTAGS, PredictionFormats.MARKDOWN, @@ -33,48 +67,63 @@ def __init__( PredictionFormats.YAML, ] + # Validate the prediction format + if prediction_format not in self._supported_prediction_formats: + msg = f"Unsupported file prediction format: {prediction_format}." + msg += f" The prediction format must be one of {self._supported_prediction_formats}" + raise RuntimeError(msg) + # Read the input self._prediction_format = prediction_format self._prediction_source_path = source_path self._ignore_missing_files = ignore_missing_files - # Validate the prediction format - if self._prediction_format not in self._supported_prediction_formats: - msg = f"Unsupported file prediction format: {self._prediction_format}." - msg += f" The prediction format must be one of {self._supported_prediction_formats}" - raise RuntimeError(msg) - # Validate if the source_path exists if not self._prediction_source_path.is_dir(): raise RuntimeError(f"Missing source path: {self._prediction_source_path}") - @abstractmethod def info(self) -> Dict: + """Get information about the prediction provider.""" return { - "supported_prediction_formats": self._supported_prediction_formats, - "prediction_format": self._prediction_format, - "source_path": self._prediction_source_path, + "supported_prediction_formats": [ + fmt.value for fmt in self._supported_prediction_formats + ], + "prediction_format": self._prediction_format.value, + "source_path": str(self._prediction_source_path), } - @abstractmethod def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: + """ + Generate a prediction by reading from a file. + + Args: + record: Input dataset record + + Returns: + Dataset record with prediction + """ doc_id = record.doc_id raw = None + pred_doc = None + + # Load document based on prediction format if self._prediction_format == PredictionFormats.DOCTAGS: pred_doc = self._load_doctags_doc(doc_id) elif self._prediction_format == PredictionFormats.MARKDOWN: - pred_doc = None raw = self._load_md_raw(doc_id) elif self._prediction_format == PredictionFormats.JSON: pred_doc = self._load_json_doc(doc_id) elif self._prediction_format == PredictionFormats.YAML: pred_doc = self._load_yaml_doc(doc_id) - if pred_doc is None: - status = ConversionStatus.FAILURE - else: - status = ConversionStatus.SUCCESS + # Set status based on whether document was loaded + status = ( + ConversionStatus.SUCCESS + if pred_doc is not None + else ConversionStatus.FAILURE + ) + # Create prediction record pred_record = self.create_dataset_record_with_prediction( record, pred_doc, @@ -84,61 +133,120 @@ def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: return pred_record @property - @abstractmethod def prediction_format(self) -> PredictionFormats: - r""" """ + """Get the prediction format.""" return self._prediction_format def _load_doctags_doc(self, doc_id: str) -> Optional[DoclingDocument]: - r"""Load doctags file into DoclingDocument""" + """ + Load doctags file into DoclingDocument. + + Args: + doc_id: Document ID + + Returns: + DoclingDocument or None if file not found + """ # Read the doctags file doctags_fn = self._prediction_source_path / f"{doc_id}.dt" if self._ignore_missing_files and not doctags_fn.is_file(): return None - with open(doctags_fn, "r") as fd: - doctags = fd.read() - - # Check if an optional page image is present - page_image_fn = self._prediction_source_path / f"{doc_id}.png" - page_image = None - if page_image_fn.is_file(): - page_image = Image.open(page_image_fn) + try: + with open(doctags_fn, "r") as fd: + doctags = fd.read() + + # Check if an optional page image is present + page_image_fn = self._prediction_source_path / f"{doc_id}.png" + page_image = None + if page_image_fn.is_file(): + page_image = Image.open(page_image_fn) + + # Build DoclingDocument + doctags_page = DocTagsPage(tokens=doctags, image=page_image) + doctags_doc = DocTagsDocument(pages=[doctags_page]) + doc = DoclingDocument(name=doc_id) + doc.load_from_doctags(doctags_doc) + + return doc + except Exception as e: + _log.error(f"Error loading doctags document {doc_id}: {str(e)}") + if not self._ignore_missing_files: + raise + return None - # Build DoclingDocument - doctags_page = DocTagsPage(tokens=doctags, image=page_image) - doctags_doc = DocTagsDocument(pages=[doctags_page]) - doc = DoclingDocument(name=doc_id) - doc.load_from_doctags(doctags_doc) + def _load_json_doc(self, doc_id: str) -> Optional[DoclingDocument]: + """ + Load DoclingDocument from JSON. - return doc + Args: + doc_id: Document ID - def _load_json_doc(self, doc_id: str) -> Optional[DoclingDocument]: - r"""Load DoclingDocument from json""" + Returns: + DoclingDocument or None if file not found + """ json_fn = self._prediction_source_path / f"{doc_id}.json" if self._ignore_missing_files and not json_fn.is_file(): return None - doc: DoclingDocument = DoclingDocument.load_from_json(json_fn) - return doc + + try: + doc: DoclingDocument = DoclingDocument.load_from_json(json_fn) + return doc + except Exception as e: + _log.error(f"Error loading JSON document {doc_id}: {str(e)}") + if not self._ignore_missing_files: + raise + return None def _load_yaml_doc(self, doc_id: str) -> Optional[DoclingDocument]: - r"""Load DoclingDocument from yaml""" + """ + Load DoclingDocument from YAML. + + Args: + doc_id: Document ID + + Returns: + DoclingDocument or None if file not found + """ + # Try with .yaml extension yaml_fn = self._prediction_source_path / f"{doc_id}.yaml" + + # If not found, try with .yml extension if not yaml_fn.is_file(): - # Try alternative yaml extension yaml_fn = self._prediction_source_path / f"{doc_id}.yml" + if self._ignore_missing_files and not yaml_fn.is_file(): return None - doc: DoclingDocument = DoclingDocument.load_from_yaml(yaml_fn) - return doc + try: + doc: DoclingDocument = DoclingDocument.load_from_yaml(yaml_fn) + return doc + except Exception as e: + _log.error(f"Error loading YAML document {doc_id}: {str(e)}") + if not self._ignore_missing_files: + raise + return None def _load_md_raw(self, doc_id: str) -> Optional[str]: - r"""Load the markdown content""" + """ + Load the markdown content. + + Args: + doc_id: Document ID + + Returns: + Markdown content or None if file not found + """ md_fn = self._prediction_source_path / f"{doc_id}.md" if self._ignore_missing_files and not md_fn.is_file(): return None - with open(md_fn, "r") as fd: - md = fd.read() - return md + try: + with open(md_fn, "r") as fd: + md = fd.read() + return md + except Exception as e: + _log.error(f"Error loading markdown document {doc_id}: {str(e)}") + if not self._ignore_missing_files: + raise + return None diff --git a/docling_eval/prediction_providers/tableformer_provider.py b/docling_eval/prediction_providers/tableformer_provider.py index 56802752..0d3ff4ff 100644 --- a/docling_eval/prediction_providers/tableformer_provider.py +++ b/docling_eval/prediction_providers/tableformer_provider.py @@ -1,67 +1,482 @@ import copy -from typing import Dict +import logging +from io import BytesIO +from pathlib import Path +from typing import Dict, List, Optional, Set, Tuple, Union -from docling.datamodel.base_models import ConversionStatus -from docling.datamodel.pipeline_options import TableFormerMode +import numpy as np +from docling.datamodel.base_models import ( + Cluster, + ConversionStatus, + LayoutPrediction, + Page, + Table, +) +from docling.datamodel.document import ConversionResult +from docling.datamodel.pipeline_options import ( + AcceleratorDevice, + AcceleratorOptions, + TableFormerMode, + TableStructureOptions, +) +from docling.models.table_structure_model import TableStructureModel +from docling_core.types import DoclingDocument +from docling_core.types.doc import DocItemLabel, TableCell, TableData, TableItem from docling_core.types.io import DocumentStream +from PIL import Image -from docling_eval.converters.models.tableformer.tf_model_prediction import ( - TableFormerUpdater, -) -from docling_eval.datamodels.constants import PredictionFormats from docling_eval.datamodels.dataset_record import ( DatasetRecord, DatasetRecordWithPrediction, ) +from docling_eval.datamodels.types import PageToken, PageTokens, PredictionFormats from docling_eval.prediction_providers.base_prediction_provider import ( BasePredictionProvider, ) -from docling_eval.utils.utils import docling_models_version +from docling_eval.utils.utils import docling_models_version, get_input_document + +_log = logging.getLogger(__name__) class TableFormerPredictionProvider(BasePredictionProvider): - def __init__(self, do_visualization: bool = False): - super().__init__(do_visualization=do_visualization) - self.tf_updater = TableFormerUpdater(TableFormerMode.ACCURATE) + """ + Prediction provider that uses TableFormer for table structure prediction. + + This provider is specialized for predicting table structures in documents. + """ + + def __init__( + self, + mode: TableFormerMode = TableFormerMode.ACCURATE, + num_threads: int = 16, + artifacts_path: Optional[Path] = None, + do_visualization: bool = False, + ignore_missing_predictions: bool = True, + true_labels: Optional[Set[DocItemLabel]] = None, + pred_labels: Optional[Set[DocItemLabel]] = None, + ): + """ + Initialize the TableFormer prediction provider. + + Args: + mode: TableFormer prediction mode + num_threads: Number of threads for prediction + artifacts_path: Path to artifacts + do_visualization: Whether to generate visualizations + ignore_missing_predictions: Whether to ignore missing predictions + true_labels: Set of DocItemLabel to use for ground truth visualization + pred_labels: Set of DocItemLabel to use for prediction visualization + """ + super().__init__( + do_visualization=do_visualization, + ignore_missing_predictions=ignore_missing_predictions, + true_labels=true_labels, + pred_labels=pred_labels, + ) + self.tf_updater = TableFormerUpdater(mode, num_threads, artifacts_path) @property def prediction_format(self) -> PredictionFormats: + """Get the prediction format.""" return PredictionFormats.DOCLING_DOCUMENT def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: - r""" """ - assert ( - record.ground_truth_doc is not None - ), "true_doc must be given for TableFormer prediction provider to work." + """ + Generate a prediction for table structure. - if record.mime_type == "application/pdf": - assert isinstance(record.original, DocumentStream) + Args: + record: Input dataset record - updated, pred_doc = self.tf_updater.replace_tabledata( - copy.deepcopy(record.original.stream), record.ground_truth_doc - ) - elif record.mime_type == "image/png": - updated, pred_doc = self.tf_updater.replace_tabledata_with_page_tokens( - record.ground_truth_doc, - record.ground_truth_page_images, - ) - else: + Returns: + Dataset record with prediction + + Raises: + RuntimeError: If ground truth doc is not available or if mime type is unsupported + """ + if record.ground_truth_doc is None: raise RuntimeError( - "TableFormerPredictionProvider is missing data to predict on." + "true_doc must be given for TableFormer prediction provider to work." ) - if updated is False: + updated = False + pred_doc = None + + try: + if record.mime_type == "application/pdf": + if not isinstance(record.original, DocumentStream): + raise RuntimeError( + "Original document must be a DocumentStream for PDF files" + ) + + # Process PDF + updated, pred_doc = self.tf_updater.replace_tabledata( + copy.deepcopy(record.original.stream), record.ground_truth_doc + ) + + elif record.mime_type == "image/png": + # Process image + updated, pred_doc = self.tf_updater.replace_tabledata_with_page_tokens( + record.ground_truth_doc, + record.ground_truth_page_images, + ) + + else: + raise RuntimeError( + f"Unsupported mime type: {record.mime_type}. TableFormerPredictionProvider supports 'application/pdf' and 'image/png'" + ) + + # Set status based on update success + status = ConversionStatus.SUCCESS if updated else ConversionStatus.FAILURE + + except Exception as e: + _log.error(f"Error in TableFormer prediction: {str(e)}") status = ConversionStatus.FAILURE - else: - status = ConversionStatus.SUCCESS + if not self.ignore_missing_predictions: + raise + pred_doc = record.ground_truth_doc.model_copy( + deep=True + ) # Use copy of ground truth as fallback - pred_record = self.create_dataset_record_with_prediction( - record, - pred_doc, - None, - ) - pred_record.status = status - return pred_record + # Create prediction record + data = { + **record.as_record_dict(), + "predicted_doc": pred_doc, + "original_prediction": None, + "prediction_format": self.prediction_format, + "predictor_info": self.info(), + "status": status, + } + return DatasetRecordWithPrediction.model_validate(data) def info(self) -> Dict: + """Get information about the prediction provider.""" return {"asset": "TableFormer", "version": docling_models_version()} + + +class TableFormerUpdater: + """ + Utility class for updating table data using TableFormer. + + This class handles the prediction of table structures using the TableFormer model. + """ + + def __init__( + self, + mode: TableFormerMode, + num_threads: int = 16, + artifacts_path: Optional[Path] = None, + ): + """ + Initialize the TableFormer updater. + + Args: + mode: TableFormer prediction mode + num_threads: Number of threads for prediction + artifacts_path: Path to artifacts + """ + # Initialize the TableFormer model + table_structure_options = TableStructureOptions(mode=mode) + accelerator_options = AcceleratorOptions( + num_threads=num_threads, device=AcceleratorDevice.AUTO + ) + self._docling_tf_model = TableStructureModel( + enabled=True, + artifacts_path=artifacts_path, + options=table_structure_options, + accelerator_options=accelerator_options, + ) + _log.info(f"Initialized TableFormer in {mode} mode") + + def to_np(self, pil_image: Image.Image) -> np.ndarray: + """ + Convert PIL image to NumPy array in BGR format. + + Args: + pil_image: PIL image + + Returns: + NumPy array in BGR format + + Raises: + ValueError: If image format is unsupported + """ + # Convert to NumPy array + np_image = np.array(pil_image) + + # Handle different formats + if np_image.ndim == 3: # RGB or RGBA image + if np_image.shape[2] == 4: # RGBA image + # Discard alpha channel + np_image = np_image[:, :, :3] + + # Convert RGB to BGR by reversing the last axis + np_image = np_image[:, :, ::-1] + return np_image + else: + raise ValueError("Unsupported image format") + + def get_page_cells(self, filename: str) -> Optional[DoclingDocument]: + """ + Parse PDF to extract page cells. + + Args: + filename: Path to PDF file + + Returns: + Parsed document or None if parsing failed + """ + from docling_parse.pdf_parsers import pdf_parser_v2 + + parser = pdf_parser_v2("fatal") + + try: + key = "key" + parser.load_document(key=key, filename=filename) + parsed_doc = parser.parse_pdf_from_key(key=key) + parser.unload_document(key) + return parsed_doc + except Exception as exc: + _log.error(f"Error parsing PDF: {exc}") + return None + + def _make_internal_page_with_table(self, input_doc, prov) -> Page: + """ + Create a page object with a table from input document. + + Args: + input_doc: Input document + prov: Provenance item + + Returns: + Page object with table + """ + page = Page(page_no=prov.page_no - 1) + page._backend = input_doc._backend.load_page(page.page_no) + + # Add null checks to avoid mypy errors + if page._backend is not None and page._backend.is_valid(): + page.cells = list(page._backend.get_text_cells()) + page.size = page._backend.get_size() + + # Create cluster for table + cluster = Cluster( + id=0, + label=DocItemLabel.TABLE, + bbox=prov.bbox.to_top_left_origin(page.size.height), + ) + + # Add cells that overlap with the cluster + for cell in page.cells: + overlap = cell.rect.to_bounding_box().intersection_area_with( + cluster.bbox + ) + if cell.rect.to_bounding_box().area() > 0: + overlap_ratio = overlap / cell.rect.to_bounding_box().area() + if overlap_ratio > 0.2: + cluster.cells.append(cell) + + page.predictions.layout = LayoutPrediction(clusters=[cluster]) + + return page + + def replace_tabledata( + self, + pdf_path: Union[Path, BytesIO], + true_doc: DoclingDocument, + ) -> Tuple[bool, DoclingDocument]: + """ + Replace table data in document with predictions from TableFormer. + + Args: + pdf_path: Path to PDF file or PDF data as BytesIO + true_doc: Document with ground truth tables + + Returns: + Tuple of (success, updated_document) + """ + # Make a deep copy of the document + pred_doc = true_doc.model_copy(deep=True) + + # Parse the PDF + input_doc = get_input_document(pdf_path) + if not input_doc.valid: + _log.error("Could not parse PDF file") + return False, pred_doc + + conv_res = ConversionResult(input=input_doc) + updated = False + + # Process each table item in the document + for item, level in pred_doc.iterate_items(): + if isinstance(item, TableItem): + for prov in item.prov: + try: + # Create page with table + page = self._make_internal_page_with_table(input_doc, prov) + + # Fix mypy error with next() by converting iterator to list + model_results = list(self._docling_tf_model(conv_res, [page])) + + if model_results and hasattr( + model_results[0].predictions, "tablestructure" + ): + page = model_results[0] + if ( + page.predictions.tablestructure is not None + and hasattr( + page.predictions.tablestructure, "table_map" + ) + and page.predictions.tablestructure.table_map + ): + tbl: Table = page.predictions.tablestructure.table_map[ + 0 + ] + table_data: TableData = TableData( + num_rows=tbl.num_rows, + num_cols=tbl.num_cols, + table_cells=tbl.table_cells, + ) + + # Update item data + item.data = table_data + updated = True + + finally: + # Ensure page backend is unloaded to free resources + if hasattr(page, "_backend") and page._backend is not None: + page._backend.unload() + + return updated, pred_doc + + def _tf_predict_with_page_tokens( + self, + page_image: Image.Image, + page_tokens: PageTokens, + table_bbox: Tuple[float, float, float, float], + image_scale: float = 1.0, + ) -> TableData: + """ + Predict table structure from image using page tokens. + + Args: + page_image: Page image + page_tokens: Page tokens + table_bbox: Table bounding box coordinates (l, t, r, b) + image_scale: Image scale factor + + Returns: + Predicted table data + """ + # Prepare input for TableFormer + table_bboxes = [[table_bbox[0], table_bbox[1], table_bbox[2], table_bbox[3]]] + ocr_page = page_tokens.dict() + ocr_page["image"] = self.to_np(page_image) + ocr_page["table_bboxes"] = table_bboxes + + # Get predictor from model + predictor = self._docling_tf_model.tf_predictor + + # Run prediction + tf_output = predictor.multi_table_predict( + ocr_page, + table_bboxes=table_bboxes, + do_matching=True, + correct_overlapping_cells=False, + sort_row_col_indexes=True, + ) + + # Extract table data + table_out = tf_output[0] + table_cells = [] + + # Process each cell + for element in table_out["tf_responses"]: + tc = TableCell.model_validate(element) + if tc.bbox is not None: + tc.bbox = tc.bbox.scaled(1 / image_scale) + table_cells.append(tc) + + # Get table dimensions + num_rows = table_out["predict_details"]["num_rows"] + num_cols = table_out["predict_details"]["num_cols"] + + # Create table data + table_data = TableData( + num_rows=num_rows, num_cols=num_cols, table_cells=table_cells + ) + + return table_data + + def replace_tabledata_with_page_tokens( + self, + true_doc: DoclingDocument, + true_page_images: List[Image.Image], + page_tokens: Optional[PageTokens] = None, + ) -> Tuple[bool, DoclingDocument]: + """ + Replace table data in document using page tokens and images. + + Args: + true_doc: Document with ground truth tables + true_page_images: Page images + page_tokens: Optional page tokens + + Returns: + Tuple of (success, updated_document) + """ + # Make a deep copy of the document + pred_doc = copy.deepcopy(true_doc) + updated = False + + # Ensure document has exactly one page + if len(pred_doc.pages) != 1: + _log.error("Document must have exactly one page") + return False, pred_doc + + page_size = pred_doc.pages[1].size + + # Process each table item + for item, level in pred_doc.iterate_items(): + if isinstance(item, TableItem): + for prov in item.prov: + try: + # Get page image + page_image = true_page_images[prov.page_no - 1] + + # Ensure bounding box is within page bounds + table_bbox = ( + max(prov.bbox.l, 0.0), + max(prov.bbox.b, 0.0), + min(prov.bbox.r, page_size.width), + min(prov.bbox.t, page_size.height), + ) + + # Create page tokens if not provided + if page_tokens is None: + ptokens = [] + for ix, table_cell in enumerate(item.data.table_cells): + pt = PageToken( + bbox=table_cell.bbox, text=table_cell.text, id=ix + ) + ptokens.append(pt) + page_tokens = PageTokens( + tokens=ptokens, + height=prov.bbox.height, + width=prov.bbox.width, + ) + + # Predict table data + table_data = self._tf_predict_with_page_tokens( + page_image=page_image, + page_tokens=page_tokens, + table_bbox=table_bbox, + ) + + # Update item data + item.data = table_data + updated = True + except Exception as e: + _log.error(f"Error predicting table: {str(e)}") + raise + + return updated, pred_doc diff --git a/docling_eval/utils/utils.py b/docling_eval/utils/utils.py index 738ea76a..96393d76 100644 --- a/docling_eval/utils/utils.py +++ b/docling_eval/utils/utils.py @@ -10,6 +10,7 @@ from typing import Any, Dict, List, Optional, Tuple import pandas as pd +import PIL.Image from bs4 import BeautifulSoup # type: ignore from datasets import Dataset, Features from datasets import Image as Features_Image @@ -30,7 +31,7 @@ from PIL import Image from pydantic import AnyUrl -from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.datamodels.types import BenchMarkColumns def get_binhash(binary_data: bytes) -> str: @@ -333,6 +334,26 @@ def extract_images( return document, pictures, page_images +def insert_images_from_pil( + document: DoclingDocument, + pictures: List[PIL.Image.Image], + page_images: List[PIL.Image.Image], +): + + # Inject picture images + for pic_no, picture in enumerate(document.pictures): + if picture.image is not None: + if pic_no < len(pictures): + picture.image._pil = pictures[pic_no] + # Inject page images + for page_no, page in document.pages.items(): + if page.image is not None: + if (page_no - 1) < len(page_images): + page.image._pil = page_images[page_no - 1] + + return document + + def insert_images( document: DoclingDocument, pictures: List[Dict[str, Any]], diff --git a/docs/examples/benchmark_doclaynet_v1.py b/docs/examples/benchmark_doclaynet_v1.py index 64cc64eb..7eda76b7 100644 --- a/docs/examples/benchmark_doclaynet_v1.py +++ b/docs/examples/benchmark_doclaynet_v1.py @@ -3,7 +3,7 @@ from pathlib import Path from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.doclaynet_v1.create import create_dlnv1_e2e_dataset # Configure logging diff --git a/docs/examples/benchmark_doclaynet_v2.py b/docs/examples/benchmark_doclaynet_v2.py index cd0f3749..a3d90c60 100644 --- a/docs/examples/benchmark_doclaynet_v2.py +++ b/docs/examples/benchmark_doclaynet_v2.py @@ -5,7 +5,7 @@ from tabulate import tabulate # type: ignore from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.doclaynet_v2.create import create_dlnv2_e2e_dataset # Configure logging diff --git a/docs/examples/benchmark_dpbench.py b/docs/examples/benchmark_dpbench.py index e7d3050b..c3155ca2 100644 --- a/docs/examples/benchmark_dpbench.py +++ b/docs/examples/benchmark_dpbench.py @@ -5,7 +5,7 @@ from huggingface_hub import snapshot_download from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.dpbench.create import ( create_dpbench_e2e_dataset, create_dpbench_tableformer_dataset, diff --git a/docs/examples/benchmark_omnidocbench.py b/docs/examples/benchmark_omnidocbench.py index 007576a3..00e51c3f 100644 --- a/docs/examples/benchmark_omnidocbench.py +++ b/docs/examples/benchmark_omnidocbench.py @@ -5,7 +5,7 @@ from huggingface_hub import snapshot_download from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.omnidocbench.create import ( create_omnidocbench_e2e_dataset, create_omnidocbench_tableformer_dataset, diff --git a/docs/examples/benchmark_tableformer_fintabnet.py b/docs/examples/benchmark_tableformer_fintabnet.py index 70008e07..d7c6fc4a 100644 --- a/docs/examples/benchmark_tableformer_fintabnet.py +++ b/docs/examples/benchmark_tableformer_fintabnet.py @@ -3,7 +3,7 @@ from pathlib import Path from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.tableformer_huggingface_otsl.create import ( create_fintabnet_tableformer_dataset, ) diff --git a/docs/examples/benchmark_tableformer_p1m.py b/docs/examples/benchmark_tableformer_p1m.py index 9f0ba6a9..8b5baa8b 100644 --- a/docs/examples/benchmark_tableformer_p1m.py +++ b/docs/examples/benchmark_tableformer_p1m.py @@ -3,7 +3,7 @@ from pathlib import Path from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.tableformer_huggingface_otsl.create import ( create_p1m_tableformer_dataset, ) diff --git a/docs/examples/benchmark_tableformer_pubtabnet.py b/docs/examples/benchmark_tableformer_pubtabnet.py index 2f4810c5..7bb28aa5 100644 --- a/docs/examples/benchmark_tableformer_pubtabnet.py +++ b/docs/examples/benchmark_tableformer_pubtabnet.py @@ -3,7 +3,7 @@ from pathlib import Path from docling_eval.cli.main import evaluate, visualise -from docling_eval.datamodels.constants import BenchMarkNames, EvaluationModality +from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.tableformer_huggingface_otsl.create import ( create_pubtabnet_tableformer_dataset, ) diff --git a/docs/examples/create_funsd.py b/docs/examples/create_funsd.py index 69b506b4..e87cccf3 100644 --- a/docs/examples/create_funsd.py +++ b/docs/examples/create_funsd.py @@ -2,7 +2,7 @@ import os from pathlib import Path -from docling_eval.datamodels.constants import BenchMarkNames +from docling_eval.datamodels.types import BenchMarkNames from docling_eval.legacy.funsd.create import create_funsd_dataset # Configure logging diff --git a/docs/examples/create_xfund.py b/docs/examples/create_xfund.py index 2eade602..99d934bf 100644 --- a/docs/examples/create_xfund.py +++ b/docs/examples/create_xfund.py @@ -2,7 +2,7 @@ import os from pathlib import Path -from docling_eval.datamodels.constants import BenchMarkNames +from docling_eval.datamodels.types import BenchMarkNames from docling_eval.legacy.xfund.create import create_xfund_dataset # Configure logging diff --git a/docs/examples/package_pdfs.py b/docs/examples/package_pdfs.py index daa58117..e6eb4601 100644 --- a/docs/examples/package_pdfs.py +++ b/docs/examples/package_pdfs.py @@ -8,8 +8,8 @@ from docling_core.types.doc.labels import DocItemLabel from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import create_pdf_docling_converter -from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.datamodels.types import BenchMarkColumns +from docling_eval.legacy.converters.conversion import create_pdf_docling_converter from docling_eval.utils.utils import ( docling_version, from_pil_to_base64, diff --git a/docs/examples/package_pngs.py b/docs/examples/package_pngs.py index 990bf9f7..b90bf749 100644 --- a/docs/examples/package_pngs.py +++ b/docs/examples/package_pngs.py @@ -9,8 +9,8 @@ from docling_core.types.doc.labels import DocItemLabel from tqdm import tqdm # type: ignore -from docling_eval.converters.conversion import create_image_docling_converter -from docling_eval.datamodels.constants import BenchMarkColumns +from docling_eval.datamodels.types import BenchMarkColumns +from docling_eval.legacy.converters.conversion import create_image_docling_converter from docling_eval.utils.utils import ( docling_version, extract_images, diff --git a/tests/data/doclaynet_v1_doctags_sample/0e26a4b4e7ad14e1d25385c173fd9c23543fbbafc9408cbb372b1f4898095a66.dt b/tests/data/doclaynet_v1_doctags_sample/0e26a4b4e7ad14e1d25385c173fd9c23543fbbafc9408cbb372b1f4898095a66.dt deleted file mode 100644 index 52d0aaa5..00000000 --- a/tests/data/doclaynet_v1_doctags_sample/0e26a4b4e7ad14e1d25385c173fd9c23543fbbafc9408cbb372b1f4898095a66.dt +++ /dev/null @@ -1,8 +0,0 @@ - Problems with automatic license activation -If connections problems occur with the automatic license activation procedure, the system times out after 3 minutes with an error. -Check whether the personal computer that is used to connect to the Storwize V7000 GUI and activate the license can access the internet. If you cannot complete the automatic activation procedure, use the manual activation procedure that is described in 12.3.5, "Activate the license manually" on page 617. -Although authorization codes and encryption license keys use the same format (four groups of four hexadecimal digits), you can only use each of them in the appropriate activation process. If you use a license key when the system expects an authorization code, the system displays an error message, as shown in Figure 12-16. -Activate License Automatically Sent machine information to ibm.com Sent machine information to ibm.com Retrieved license keys Retrieved license keys Applied license keys Applied license keysProcessing of authorization code 1234-ABCD-DCBA-4321 has failed for the following reason: The authorization code cannot be decrypted. Processing of authorization code 1234-ABCD-DCBA-4321 has failed for the following reason: The authorization code cannot be decrypted.Ensure that you entered the authorization code correctly and retry the activation request. Ensure that you entered the authorization code correctly and retry the activation request. -616 -Implementing the IBM Storwize V7000 with IBM Spectrum Virtualize V8.2.1 - \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/0ef90754c44461177b7d29ca9074e8a6810bc4b96f1e7aab53051d0b5adfe38a.dt b/tests/data/doclaynet_v1_doctags_sample/0ef90754c44461177b7d29ca9074e8a6810bc4b96f1e7aab53051d0b5adfe38a.dt deleted file mode 100644 index f59aba7e..00000000 --- a/tests/data/doclaynet_v1_doctags_sample/0ef90754c44461177b7d29ca9074e8a6810bc4b96f1e7aab53051d0b5adfe38a.dt +++ /dev/null @@ -1,12 +0,0 @@ - 2010 ANNUAL REPORT | 9 -horizontal wells drilled just to the Bossier may not always hold Haynesville rights. Therefore, Chesapeake and other producers have been drilling aggressively to hold all rights through the Haynesville before the initial three-year term of a typical lease expires. As a result, there has not been much drilling to the Bossier to date. However, once our leases are held by production (HBP) by Haynesville drilling (we expect to be largely complete with HBP drilling by year-end 2011 and completely finished by year-end 2012). We will begin developing the Bossier Shale more aggressively in 2013. In the Bossier play, we own 205,000 net leasehold acres and estimate we could drill up to 2,600 net wells in the years ahead. - -Generating the highest returns in the company, plays like the Oklahoma Colony Granite Wash inspire Chesapeake to find other liquids-rich opportunities. -Marcellus Shale - We first became aware of the Marcellus in 2005 when we were negotiating our $2.2 billion acquisition of Appalachia's second-largest natural gas producer, Columbia Natural Resources, LLC. In 2007 we aggressively accelerated our Marcellus leasehold acquisition efforts and began to prepare for our first drilling activities. By early 2008, we had determined the Marcellus could be prospective over an area of approximately 15 million net acres (approximately five times larger than the prospective Haynesville core area and 10 times larger than the Barnett core area). -After acquiring 1.8 million net leasehold acres, we entered into a joint venture agreement in late 2008 with Oso-based Statoil, one of the -largest and most respected European energy companies. In this transaction, we sold Statoil 32.5% of our Marcellus assets for $3.375 billion in cash and drilling carries. Today, having sold 32.5% of our original 1.8 million net leasehold acres, we have returned to owning 1.7 million net leasehold acres in the play and are the industry's leading leasehold owner, largest producer and most active developer. We are producing from more than 100 net wells in the Marcellus on our 1.7 million net acres, are currently drilling with 32 rigs and estimate we could drill up to 21,000 additional net wells in the years ahead. -Colony and Texas Panhandle Granite Wash - These liquids-rich plays generate the company's highest returns (routinely more than 100%) and provided the inspiration -The very significant upward trajectory of value creation that Chesapeake is on today is primarily driven by the quality of our assets, which feature dominant positions in 16 of the 20 most important major unconventional natural gas and liquids plays in the U.S. -for the company to find other liquids-rich plays in 2010. The Granite Wash, and other plays with liquids-rich gas production streams, provide the strongest economics in the industry today because they possess the best of both worlds: high-volume natural gas production along with significant volumes of highly valued liquids that dramatically increase investment returns. -We are producing from approximately 150 net Granite Wash wells, are currently drilling with 16 rigs and estimate we could drill up to 1,700 additional net wells on our 215,000 net leasehold acres in the years ahead. Based on current NYMEX futures prices for natural gas and oil, each Granite Wash well should generate approximately $11.5 million of present value (or up to an undiscounted total of $19.5 billion for all 1,700 wells), making it obvious why finding, leasing and developing more unconventional liquids-rich plays was Chesapeake's number one priority for 2010. We were very successful - \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/132a855ee8b23533d8ae69af0049c038171a06ddfcac892c3c6d7e6b4091c642.txt b/tests/data/doclaynet_v1_doctags_sample/132a855ee8b23533d8ae69af0049c038171a06ddfcac892c3c6d7e6b4091c642.txt new file mode 100644 index 00000000..399df58b --- /dev/null +++ b/tests/data/doclaynet_v1_doctags_sample/132a855ee8b23533d8ae69af0049c038171a06ddfcac892c3c6d7e6b4091c642.txt @@ -0,0 +1,9 @@ + 8 +Leigh Taliaferro, M.D. General Surgeon Abilene, Texas +Leigh Taliaferro, M.D., values consistency. +The Abilene native started his practice 17 years ago and has developed a flourishing business as a general surgeon. He estimates that 90 percent of his practice is for abdominal surgery. With such a busy practice, he finds comfort in having a reliable banking partner. "I have almost every type of business, trust and personal account with First National Bank of Abilene," says Dr. Taliaferro. +"First National is immersed in this city - everywhere you go, they are involved with helping people with their business. It's because of the people who work there - they are leaders ... generous people who make their mark on the bank and on the community. While they may be the biggest bank in town, they sure don't act like it. It's like banking with friends." +Dr. Taliaferro has invested in First Financial Bankshares for more than a decade. "My stock has done nothing but go up in value. They are solid, sound businesspeople. I sleep up well at night knowing that my investments are in good hands." + +"While they may be the biggest bank in town, they sure don't act like it. It's like banking with friends. + \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/1a89e84c0f1a1d0c841f8807c33e7e7216d615b9797444f3a220b8768636ff26.dt b/tests/data/doclaynet_v1_doctags_sample/1a89e84c0f1a1d0c841f8807c33e7e7216d615b9797444f3a220b8768636ff26.dt deleted file mode 100644 index 381a6907..00000000 --- a/tests/data/doclaynet_v1_doctags_sample/1a89e84c0f1a1d0c841f8807c33e7e7216d615b9797444f3a220b8768636ff26.dt +++ /dev/null @@ -1,30 +0,0 @@ - NAVWEPS 00-80T-80 APPLICATION OF AERODYNAMICS TO SPECIFIC PROBLEMS OF FLYING -possibility of a refused takeoff before exceed- ing the refusal speed. To this end, the pilot must carefully evaluate airplane and power- plant performance and judge the acceleration of the airplane by the use of "line speeds." The accelerated motion of the airplane during takeoff roll will define certain relationships be- tween velocity and distance when the acceler- ation of the airplane is normal. By comparison of predicted and actual speeds at various points along the runway, the pilot can evaluate the acceleration and assess the takeoff perform- ance. -An example of an acceleration profile is shown by the second illustration of figure 6.12, where the variation of velocity and distance is defined for the case of uniformly accelerated motion, i.e., constant acceleration. While the case of uniformly accelerated motion doesnot correspond exactly to the takeoff performance of all airplanes, it is sufficiently applicable to illustrate the principle of line speeds and al- celeration checks. If the takeoff acceleration of the airplane were constant, the airplane would develop specific percentages of the take- off speed at specific percentages of the takeoff distance. Representative values from figure 6.12 are as follows: -Percent of takeoff -Percent of takeoff -Percent of takeoff -time -0 -0 -0 -50.0 -50.0 -50.0 -70.7 -70.7 -70.7 -86.5 -86.5 -86.5 -100 -100 -100 -As an example of this uniformly accelerated motion, the airplane upon reaching the half- way point of takeoff roll would have spent 70.7 percent of the total takeoff time and ac- celerated to 70.7 percent of the takeoff speed. -If the airplane has not reached a specific speed at a specific distance, it is obvious that the ac- celeration is below the predicted value and the airplane surely will not achieve the takeoff speed in the specified takeoff distance. Therefore, properly computed line speeds at various -points along the runway will allow the pilot to monitor the takeoff performance and recog- nize a deficiency of acceleration. Of course, a deficiency of acceleration must be recognized prior to reaching some point along the runway where takeoff cannot be safely achieved or refused. -The fundamental principles of refusal speeds and line speeds are applicable equally well to single-engine and multingene airplanes. How- ever, in the case of the multingene airplane additional consideration must be given to the decision to continue or refuse takeoff when engine failure occurs during the takeoff roll. If failure of one engine occurs prior to reaching the refusal speed, takeoff should be discon- nued and the airplane brought to a stop on the remaining runway. If failure of one engine occurs after exceeding the refusal speed, the airplane is committed to continue takeoff with the remaining engines operative or an unsafe caused takeoff. In some cases, the remaining runway may not be sufficient to allow acceleration to the takeoff speed and the airplane can either takeoff or stop on the runway remain- ing. To facilitate consideration of this prob- lem, several specific definitions are necessary. -(1) Takeoff and initial climb speed: A speed, usually a fixed percentage above the stall speed, a which the airplane will become airborne and best clear obstacles immediately after takeoff. For a particular airplane in the takeoff con- figuration, this speed (in EAs or CAS) is a function of gross weight but in no circumstances should it be less than the minimum directional control speed for the critical asymmetrical power condition. Generally, the takeoff and initial climb speed is referred to as the "Vz" speed. -(2) Critical engine failure speed: A speed achieved during the takeoff roll at which fail- ure of one engine will require the same distance to continue accelerating with the operative en- gines to accomplish safe takeoff or refuse takeoff and decelerate to a stop utilizing the airplane brakes. At critical engine failure -394 - \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/2b49edc9d0a47e4efaaeabf907a8b8b84b747c295dd10a639e2b5265ac258cf5.txt b/tests/data/doclaynet_v1_doctags_sample/2b49edc9d0a47e4efaaeabf907a8b8b84b747c295dd10a639e2b5265ac258cf5.txt new file mode 100644 index 00000000..26fdebed --- /dev/null +++ b/tests/data/doclaynet_v1_doctags_sample/2b49edc9d0a47e4efaaeabf907a8b8b84b747c295dd10a639e2b5265ac258cf5.txt @@ -0,0 +1,10 @@ + 82 +Nissan Annual Report 2004 +The Company and its domestic consolidated subsidiaries have defined benefit plans, i.e., welfare pension fund plans ('WPPF'), tax-qualified pension plans and lump-sum payment plans, covering substantially all employees who are entitled to lump-sum or annuity payments, the amounts of which are determined by reference to their basic rates of pay, length of service, and the conditions under which termination occurs. Certain foreign consolidated subsidiaries have defined benefit and contribution plans. +The following table sets forth the funded and accrued status of the plans, and the amounts recognized in the consolidated balance sheets as of March 31, 2005 and 2004 for the Company's and the consolidated subsidiaries' defined benefit plans: +Millions of yen2004 Mar. 31, 20052003 Mar. 31, 2004Retirement benefit obligation:As of20042003Plan assets at fair value(%,121,260)(%,141,048)(%)Unfunded retirement benefit obligation:(716,445)(664,314)(6,695,748)Unrecognized net retirement benefit obligation at transition120,718131,6661,128,206Unrecognized actuarial gain or loss154,689152,8671,445,691Unrecognized prior service cost:(66,720)(61,833)(62,355)Net retirement benefit obligation(507,758)(441,614)(4,745,402)Prepaid pension cost:4456524,159Accrued retirement benefits:(508,203)(442,266)(4,749,561) +The substitutional portion of the benefits under the WPPF has been included in the amounts shown in the above table. +The Company received the approval from the Minister of Health, Labor and Welfare ('MLHW') in the year ended March 31, 2003 with respect to its application for exemption from the obligation for benefits related to future employee services under the substitutional portion of the WPPF. Certain domestic consolidated subsidiaries received the same approval from MLHW during the year ended March 31, 2004. In accordance with the transitional provision stipulated in "Practical Guidelines for Accounting for Retirement Benefits", the Company and the domestic consolidated subsidiaries accounted for the separation of the substitutional portion of the benefit obligation from the corporate portion of the benefit obligation under their WPPFs as of the dates of approval for their exemption assuming that the transfer to the Japanese government of the substitutional portion of the benefit obligation and related pension plan assets has been completed as of those dates. As a result, the Company recognized a loss of $3,945,945 million for the year ended March 31, 2003 and the domestic consolidated subsidiaries recognized an aggregate gain of $3,669 million and an aggregate loss of $1,587 million for the year ended March 31, 2004. The pension assets to be transferred were calculated at $3,757,770 million for the domestic consolidated subsidiaries at March 31, 2004 and $241,203 million for the Company at March 31, 2003. +The components of retirement benefit expenses for the years ended March 31, 2005, 2004 and 2003 are outlined as follows: +Millions of yen2004 Mar. 31, 20052002 Mar. 31, 2004Thousands of U.S. dollarsService cost:For the years ended200420022004Interest costMar. 31, 200351,54351,54351,543Expected return on plan assets:33,28833,01245,269311,013Amortization of net retirement benefit obligation at transition:(17,999)(15,523)(26,708)(168,215)Amortization of actuarial gain or loss:12,00918,69624,280112,234Amortization of prior service cost:1,29,2891,86,198114,644114,934Other(5,431)(7,049)(7,762)(50,757)Retirement benefit expenses:1795751,673(Gain) loss on return of the substitutional portion of welfare pension fund plans82,14691,77398,091767,720Total:(1,107)(5,594)30,945(10,346)$^{#}$81,039$^{#}$86,179$^{#}$129,036$^{#}$757,374$^{#}$757,374 + \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/61d269cb1f2c976191469b891aa87b7cb40eb65eee4483725c1a85c4dc72d141.txt b/tests/data/doclaynet_v1_doctags_sample/61d269cb1f2c976191469b891aa87b7cb40eb65eee4483725c1a85c4dc72d141.txt new file mode 100644 index 00000000..fe2beae5 --- /dev/null +++ b/tests/data/doclaynet_v1_doctags_sample/61d269cb1f2c976191469b891aa87b7cb40eb65eee4483725c1a85c4dc72d141.txt @@ -0,0 +1,18 @@ + Linking consumers with any time, any place mobile banking +In today's increasingly wireless world, consumers are turning in record numbers to mobile devices for greater convenience and access to banking and information services. + +with the freedom of mobile devices, bank customers can instantly obtain account balances, transfer money and even view a mini-bank statement-or set up instant alerts to monitor their daily account balances, deposit notifications and other personalized information 24 hours a day, 7 days a week. +The exciting potential of wireless is creating unprecedented opportunities for banks to connect with their customers. In Western Europe, the number of mobile banking accounts is expected to reach 31.8 million by 2004. 1 Expanding wireless capabilities are also helping to drive growth in North America, where the number of wireless financial services users is projected to skyrocket to 35 million by 2005. 2 The Asia-Pacific region is forecast at 12 million subscribers of wireless financial services alone in 2003. 3 +The quickly evolving market for mobile banking represents a tremendous opportunity for Euronet Worldwide. Last spring we introduced Euronet ® Mobile Banking as the first financial application that offered both secure account access and a personalized accounting alerting system. Among our new mobile banking clients in 2000 were the Bank of Cyprus, for its branches in London and Greece, and the National Bank of Kuwait, for its Lebanon branch, who were both first to market in their regions. +To further strengthen our capabilities, we announced strategic alliances to market and deliver Euronet's suite of mobile banking solutions with Aether Systems, Inc. for the US market and with Sia Communications for the European, Middle Eastern and Asian markets. In addition, we formed similar regional strategic alliances with companies like Stet Hellas Telecommunications S.A., a Greek mobile operator and subsidiary of Telecom Italia Mobile (TIM). +As next-generation mobile technology brings higher data speeds, personalization and other enhancements, we believe the future of mobile banking presents great opportunities for Euronet. +$^{1}$International Data Corporation (September 2000), $^{2}$TowerGroup (September 2000), $^{3}$Meridien Research (August 1999) + + +National Bank of Kuwait-Lebanon +First-to-Market Mobile Banking +To broaden its customer and account base, the National Bank of Kuwait-Lebanon +(NBK-L) wanted to be first in their market with a mobile banking solution. In a tight race with a competing bank, Euronet's mobile solution was integrated quickly into the NBK-LS IT infrastructure, enabling the bank to be the first to deliver services in its market. +Together with GSM operator Libancell, NBK-LS new mobile banking system offers customers any time, any place access to their account information from their GSM telephones. +11 + \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/a5acc4c1c47a19543362fccf014eec02c7efd931db5e2a34e66444ee8b8e5079.txt b/tests/data/doclaynet_v1_doctags_sample/a5acc4c1c47a19543362fccf014eec02c7efd931db5e2a34e66444ee8b8e5079.txt new file mode 100644 index 00000000..10fda7ef --- /dev/null +++ b/tests/data/doclaynet_v1_doctags_sample/a5acc4c1c47a19543362fccf014eec02c7efd931db5e2a34e66444ee8b8e5079.txt @@ -0,0 +1,14 @@ + HON INDUSTRIES Inc. and SUBSIDIARIES +Income Taxes +Significant components of the provision for income taxes are as follows: +(In thousands)200320022001Current:$ 49,721$ 38,966$ 32,393Federal4,1593,4732,442State53,88042,43934,835Deferred(1,054)6,7557,019$ 52,826$ 49,194$ 41,854-A reconciliation of the statutory federal income tax rate to the Company's effective income tax rate is as follows: +200320022001Federal statutory tax rate35.0%35.0%State taxes, net of federal tax effect1.81.6Credit for increasing research activities(2.0)(1.6)Extraterritorial income exclusion(0.5)(1.0)Other - net0.71.0Effective tax rate35.0%35.0%Shareholders' Equity and Earnings Per Share +Deferred income taxes reflect the net tax effects of temporary differences between the carrying amounts of assets and liabilities for financial reporting purposes and the amounts used for income tax purposes. Significant components of the Company's deferred tax liabilities and assets are as follows: +(In thousands)200320022001Net long-term deferred tax liabilities:$ (28,103)$ (34,398)$ (38,759)Tax over book depreciation1823,5813,197OPEB obligations4,9123,8212,519Compensation Goodwill(18,044)(14,173)(5,550)Other - net3,3204,055(1,039)Total net long-term deferred tax liabilities(37,733)(37,114)(39,632)Net current deferred tax assets:(2981,5171,119liability accruals4,7544,6174,002Vacation accrual-(3,766)(3,766)Integration accruals4,3435,1011,969Inventory differences5288213,302Deferred income Warranty accruals(5,462)(3,820)-Other - net2,8862,3691,606Total net current deferred tax assets6,982(504)6,708Net deferred tax14,32910,10114,940(liabilities) assets$ (23,404)$ (27,013)$ (24,692)The Company purchased 762,300; 614,580; and 1,472,937 shares of its common stock during 2003, 2002, and 2001, respectively. The par value method of accounting is used for common stock repurchases. The excess of the cost of shares acquired over their par value is allocated to Additional Paid-In Capital, with the excess charged to Retained Earnings. +Common Stock, $1 Par Value200320022001Authorized200,000,000200,000,000200,000,000Issued and outstanding58,238,51958,373,60758,672,933Preferred Stock, $1 Par Value2,000,0002,000,0002,000,000Authorized---Issued and outstanding--- +Numerators:20032002Numerators for both basic and diluted EPS net income$ 98,105,000$ 91,360,000Denominators:Denominator for basic EPS weighted-58,178,73958,789,851Potentially dilutive shares from stock option plans366,614231,220231,220Denominator for diluted EPS$ 58,455,35359,021,07159,021,071Earnings per share - basic$ 1.69$ 1.551.55Earnings per share - diluted$ 1.68$ 1.55 +Certain exercisable and nonexercisable stock options were not included in the computation of diluted EPS for fiscal year 2003 and 2002, because the option prices were greater that the average market prices for the applicable periods. The number of stock options outstanding which met this criterion for 2003 was 20,000, with a range of per share exercise prices of $42.49-$42.98; and for 2002 was 30,000, with a range of per share exercise prices of $28.25-$23.22. +Components of other comprehensive income (loss) consist of the following: +(In thousands)200320022001Foreign currency translation adjustments - net of tax$ 45$ -$ 109Change in unrealized gains (losses) on marketable securities - net of tax(690)(322)42Other comprehensive income (loss)$ (645)$ (322)$ 151 +49 + \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/b13563b6fd80bed51928fc4b42497c8236af331fd67bd13b7f7e506d42b4a7e2.txt b/tests/data/doclaynet_v1_doctags_sample/b13563b6fd80bed51928fc4b42497c8236af331fd67bd13b7f7e506d42b4a7e2.txt new file mode 100644 index 00000000..568068aa --- /dev/null +++ b/tests/data/doclaynet_v1_doctags_sample/b13563b6fd80bed51928fc4b42497c8236af331fd67bd13b7f7e506d42b4a7e2.txt @@ -0,0 +1,17 @@ + REPORT OF INDEPENDENT CERTIFIED PUBLIC ACCOUNTANT S +To the Stockholders and the Board of Directors of Atrion Corporation: +We have audited the accompanying consolidated balance sheets of Atrion Corporation (a Delaware corporation) and Subsidiaries as of December 31, 2003 and 2002, and the related consolidated statements of income, changes in stockholders' equity and cash flows for the years then ended. These financial statements are the responsibility of the Company's management. Our responsibility is to express an opinion on these financial statements based on our audit. The financial statements of Atrion Corporation and Subsidiaries as of and for the year in the period ended December 31, 2001, were audited by other auditors who have ceased operations. Those auditors expressed an unqualified opinion on those financial statements in their report dated February 25, 2002. +We conducted our audits in accordance with auditing standards generally accepted in the United States of America. Those standards require that we plan and perform the audit to obtain reasonable assurance about whether the financial statements are free of material misstatement. An audit includes examining, on a test basis, evidence supporting the amounts and disclosures in the financial statements. An audit also includes assessing the accounting principles used and significant estimates made by management as well as evaluating the overall financial statement presentation. We believe that our audits provide a reasonable basis for our opinion. +In our opinion, the financial statements referred to above present fairly, in all material respects, the consolidated financial position of Atrion Corporation and Subsidiaries as of December 31, 2003 and 2002, and the consolidated results of their operations and their consolidated cash flows for the years then ended in conformity with accounting principles generally accepted in the United States of America. +As discussed above, the financial statements of Atrion Corporation and Subsidiaries as of December 31, 2001, and for the year then ended were audited by other auditors who have ceased operations. As described in Note 2, these financial statements have been revised to include the transitional disclosures required by Statement of Financial Accounting Standards No. 142, Goodwill and Other Intangible Assets, which was adopted by the Company as of January 1, 2002. Our audit procedures with respect to the disclosures in Note 2 with respect to 2001 included agreeing the previously reported net income to the previously issued financial statements and the adjustments to reported net income representing amortization expense (including any related tax effects) recognized in those periods related to goodwill to the Company's underlying records obtained from management. We also tested the mathematical accuracy of the reconciliation of adjusted net income to reported net income, and the related income-per-share amounts. In our opinion, the disclosures for 2001 in Note 2 are appropriate. However, we were not engaged to audit, review, or apply any procedures to the 2001 financial statements of the Company other than with respect to such disclosures and, accordingly, we do not express an opinion or any other form of assurance on the 2001 financial statements taken as a whole. + +Grant Thornton LLP Dallas, Texas February 13, 2004 +This is a copy of the audit report previously issued by Arthur Andersen LLP in connection with Atrion Corporation and Subsidiaries Annual Report for the year ended December 31, 2001. This audit report has not been issued by Arthur Andersen LLP in connection with this Annual Report. The consolidated balance sheets as of December 31, 2001 and 2000 and the consolidated statements of income and cash flows for the years ended December 31, 2000 and 1999 referred to in this report have not been included in the accompanying financial statements. +To the Stockholders and the Board of Directors of Atrion Corporation: +We have audited the accompanying consolidated balance sheets of Atrion Corporation (a Delaware corporation) and subsidiaries as of December 31, 2001 and 2000 and the related consolidated statements of income and cash flows for each of the three years in the period ended December 31, 2001. These financial statements are the responsibility of the Company's management. Our responsibility is to express an opinion on these financial statements based on our audits. +We conducted our audits in accordance with auditing standards generally accepted in the United States. Those standards require that we plan and perform the audit to obtain reasonable assurance about whether the financial statements are free of material misstatement. An audit includes examining, on a test basis, evidence supporting the amounts and disclosures in the financial statements. An audit also includes assessing the accounting principles used and significant estimates made by management as well as evaluating the overall financial statement presentation. We believe that our audits provide a reasonable basis for our opinion. +In our opinion, the financial statements referred to above present fairly, in all material respects, the financial position of Atrion Corporation and subsidiaries as of December 31, 2001 and 2000 and the results of their operations and their cash flows for each of the three years in the period ended December 31, 2001 in conformity with accounting principles generally accepted in the United States. + +Arthur Andersen LLP Atlanta, Georgia February 25, 2002 +23 + \ No newline at end of file diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 47e7e112..e16fe3e7 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -1,6 +1,7 @@ from pathlib import Path from typing import List, Optional +import pytest from docling.datamodel.base_models import InputFormat from docling.datamodel.pipeline_options import ( EasyOcrOptions, @@ -12,7 +13,7 @@ from docling.models.factories import get_ocr_factory from docling_eval.cli.main import evaluate -from docling_eval.datamodels.constants import ( +from docling_eval.datamodels.types import ( BenchMarkNames, EvaluationModality, PredictionFormats, @@ -69,7 +70,7 @@ def create_docling_prediction_provider( format_options={ InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options) }, - do_visualization=False, + do_visualization=True, ) @@ -79,11 +80,12 @@ def test_run_dpbench_e2e(): dataset_layout = DPBenchDatasetBuilder( target=target_path / "gt_dataset", + end_index=5, ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk( - chunk_size=5, max_num_chunks=1 + chunk_size=5 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. docling_provider.create_prediction_dataset( @@ -110,14 +112,13 @@ def test_run_doclaynet_with_doctags_fileprovider(): ) dataset_layout = DocLayNetV1DatasetBuilder( - # prediction_provider=docling_provider, - target=target_path - / "gt_dataset", + target=target_path / "gt_dataset", + end_index=5, ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk( - chunk_size=5, max_num_chunks=1 + chunk_size=80 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. file_provider.create_prediction_dataset( @@ -127,10 +128,10 @@ def test_run_doclaynet_with_doctags_fileprovider(): ) evaluate( - modality=EvaluationModality.MARKDOWN_TEXT, + modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DOCLAYNETV1, idir=target_path / "eval_dataset", - odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) @@ -140,11 +141,12 @@ def test_run_omnidocbench_e2e(): dataset_layout = OmniDocBenchDatasetBuilder( target=target_path / "gt_dataset", + end_index=5, ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk( - chunk_size=5, max_num_chunks=1 + chunk_size=5 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. docling_provider.create_prediction_dataset( @@ -167,11 +169,12 @@ def test_run_dpbench_tables(): dataset_tables = DPBenchDatasetBuilder( target=target_path / "gt_dataset", + end_index=5, ) dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF dataset_tables.save_to_disk( - chunk_size=5, max_num_chunks=1 + chunk_size=5 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( @@ -194,6 +197,7 @@ def test_run_omnidocbench_tables(): dataset_tables = OmniDocBenchDatasetBuilder( target=target_path / "gt_dataset", + end_index=5, ) dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF @@ -222,13 +226,13 @@ def test_run_doclaynet_v1_e2e(): dataset_layout = DocLayNetV1DatasetBuilder( # prediction_provider=docling_provider, - target=target_path - / "gt_dataset", + target=target_path / "gt_dataset", + end_index=5, ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk( - chunk_size=5, max_num_chunks=1 + chunk_size=5 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. docling_provider.create_prediction_dataset( @@ -245,18 +249,20 @@ def test_run_doclaynet_v1_e2e(): ) +@pytest.mark.skip("Test needs local data which is unavailable.") def test_run_doclaynet_v2_e2e(): target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV2.value}/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) dataset_layout = DocLayNetV2DatasetBuilder( - dataset_path=Path("/Users/cau/Documents/Data/doclaynet_v2_benchmark"), + dataset_path=Path("/path/to/doclaynet_v2_benchmark"), target=target_path / "gt_dataset", + end_index=5, ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk( - chunk_size=5, max_num_chunks=1 + chunk_size=5 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. docling_provider.create_prediction_dataset( @@ -279,11 +285,12 @@ def test_run_funsd(): dataset_layout = FUNSDDatasetBuilder( dataset_source=target_path / "input_dataset", target=target_path / "gt_dataset", + end_index=5, ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk( - chunk_size=5, max_num_chunks=1 + chunk_size=5 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. @@ -293,11 +300,12 @@ def test_run_xfund(): dataset_layout = XFUNDDatasetBuilder( dataset_source=target_path / "input_dataset", target=target_path / "gt_dataset", + end_index=5, ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk( - chunk_size=5, max_num_chunks=1 + chunk_size=5 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. @@ -307,11 +315,12 @@ def test_run_fintabnet_builder(): dataset = FintabNetDatasetBuilder( target=target_path / "gt_dataset", + end_index=5, ) dataset.retrieve_input_dataset() # fetches the source dataset from HF dataset.save_to_disk( - chunk_size=5, max_num_chunks=1 + chunk_size=5 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( @@ -322,7 +331,7 @@ def test_run_fintabnet_builder(): evaluate( modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.DPBENCH, + benchmark=BenchMarkNames.FINTABNET, idir=target_path / "eval_dataset", odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) @@ -334,11 +343,12 @@ def test_run_p1m_builder(): dataset = PubTables1MDatasetBuilder( target=target_path / "gt_dataset", + end_index=5, ) dataset.retrieve_input_dataset() # fetches the source dataset from HF dataset.save_to_disk( - chunk_size=5, max_num_chunks=1 + chunk_size=5 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( @@ -349,7 +359,7 @@ def test_run_p1m_builder(): evaluate( modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.DPBENCH, + benchmark=BenchMarkNames.PUB1M, idir=target_path / "eval_dataset", odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) @@ -361,22 +371,26 @@ def test_run_pubtabnet_builder(): dataset = PubTabNetDatasetBuilder( target=target_path / "gt_dataset", + end_index=25, ) dataset.retrieve_input_dataset() # fetches the source dataset from HF dataset.save_to_disk( - chunk_size=5, max_num_chunks=1 + chunk_size=80 ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( name=dataset.name, + split="val", gt_dataset_dir=target_path / "gt_dataset", target_dataset_dir=target_path / "eval_dataset", + end_index=25, ) evaluate( modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.DPBENCH, + benchmark=BenchMarkNames.PUBTABNET, idir=target_path / "eval_dataset", odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, + split="val", ) From fc7e44cd741920dfaade544185296305fba6377a Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Fri, 28 Mar 2025 11:31:20 +0100 Subject: [PATCH 49/81] Add visualization for tables Signed-off-by: Christoph Auer --- tests/test_dataset_builder.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index b3ff2e86..0b6e4ea8 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -311,7 +311,7 @@ def test_run_xfund(): def test_run_fintabnet_builder(): target_path = Path(f"./scratch/{BenchMarkNames.FINTABNET.value}/") - tableformer_provider = TableFormerPredictionProvider() + tableformer_provider = TableFormerPredictionProvider(do_visualization=True) dataset = FintabNetDatasetBuilder( target=target_path / "gt_dataset", @@ -339,7 +339,7 @@ def test_run_fintabnet_builder(): def test_run_p1m_builder(): target_path = Path(f"./scratch/{BenchMarkNames.PUB1M.value}/") - tableformer_provider = TableFormerPredictionProvider() + tableformer_provider = TableFormerPredictionProvider(do_visualization=True) dataset = PubTables1MDatasetBuilder( target=target_path / "gt_dataset", @@ -367,7 +367,7 @@ def test_run_p1m_builder(): def test_run_pubtabnet_builder(): target_path = Path(f"./scratch/{BenchMarkNames.PUBTABNET.value}/") - tableformer_provider = TableFormerPredictionProvider() + tableformer_provider = TableFormerPredictionProvider(do_visualization=True) dataset = PubTabNetDatasetBuilder( target=target_path / "gt_dataset", From f066d8d5039eb774933cfb4d9e79cf412fa35572 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Fri, 28 Mar 2025 12:32:40 +0100 Subject: [PATCH 50/81] Add visualization for all tests Signed-off-by: Christoph Auer --- tests/test_dataset_builder.py | 75 ++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 2 deletions(-) diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 0b6e4ea8..0e283696 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -12,7 +12,7 @@ from docling.document_converter import PdfFormatOption from docling.models.factories import get_ocr_factory -from docling_eval.cli.main import evaluate +from docling_eval.cli.main import evaluate, visualise from docling_eval.datamodels.types import ( BenchMarkNames, EvaluationModality, @@ -101,9 +101,16 @@ def test_run_dpbench_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) + visualise( + modality=EvaluationModality.LAYOUT, + benchmark=BenchMarkNames.DPBENCH, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, + ) + def test_run_doclaynet_with_doctags_fileprovider(): - target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV1.value}/") + target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV1.value}-SmolDocling/") file_provider = FilePredictionProvider( prediction_format=PredictionFormats.DOCTAGS, source_path=Path("./tests/data/doclaynet_v1_doctags_sample"), @@ -134,6 +141,13 @@ def test_run_doclaynet_with_doctags_fileprovider(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) + visualise( + modality=EvaluationModality.LAYOUT, + benchmark=BenchMarkNames.DOCLAYNETV1, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, + ) + def test_run_omnidocbench_e2e(): target_path = Path(f"./scratch/{BenchMarkNames.OMNIDOCBENCH.value}/") @@ -162,6 +176,13 @@ def test_run_omnidocbench_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) + visualise( + modality=EvaluationModality.LAYOUT, + benchmark=BenchMarkNames.OMNIDOCBENCH, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, + ) + def test_run_dpbench_tables(): target_path = Path(f"./scratch/{BenchMarkNames.DPBENCH.value}/") @@ -190,6 +211,13 @@ def test_run_dpbench_tables(): odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) + visualise( + modality=EvaluationModality.TABLE_STRUCTURE, + benchmark=BenchMarkNames.DPBENCH, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, + ) + def test_run_omnidocbench_tables(): target_path = Path(f"./scratch/{BenchMarkNames.OMNIDOCBENCH.value}/") @@ -219,6 +247,13 @@ def test_run_omnidocbench_tables(): odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) + visualise( + modality=EvaluationModality.TABLE_STRUCTURE, + benchmark=BenchMarkNames.OMNIDOCBENCH, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, + ) + def test_run_doclaynet_v1_e2e(): target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV1.value}/") @@ -248,6 +283,13 @@ def test_run_doclaynet_v1_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) + visualise( + modality=EvaluationModality.LAYOUT, + benchmark=BenchMarkNames.DOCLAYNETV1, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, + ) + @pytest.mark.skip("Test needs local data which is unavailable.") def test_run_doclaynet_v2_e2e(): @@ -278,6 +320,13 @@ def test_run_doclaynet_v2_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) + visualise( + modality=EvaluationModality.LAYOUT, + benchmark=BenchMarkNames.DOCLAYNETV2, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, + ) + def test_run_funsd(): target_path = Path(f"./scratch/{BenchMarkNames.FUNSD.value}/") @@ -336,6 +385,13 @@ def test_run_fintabnet_builder(): odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) + visualise( + modality=EvaluationModality.TABLE_STRUCTURE, + benchmark=BenchMarkNames.FINTABNET, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, + ) + def test_run_p1m_builder(): target_path = Path(f"./scratch/{BenchMarkNames.PUB1M.value}/") @@ -364,6 +420,13 @@ def test_run_p1m_builder(): odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) + visualise( + modality=EvaluationModality.TABLE_STRUCTURE, + benchmark=BenchMarkNames.PUB1M, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, + ) + def test_run_pubtabnet_builder(): target_path = Path(f"./scratch/{BenchMarkNames.PUBTABNET.value}/") @@ -394,3 +457,11 @@ def test_run_pubtabnet_builder(): odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, split="val", ) + + visualise( + modality=EvaluationModality.TABLE_STRUCTURE, + benchmark=BenchMarkNames.PUBTABNET, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, + split="val", + ) From d2bc3be05dd00a208a8dca977b44629017acf9b9 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Fri, 28 Mar 2025 13:21:58 +0100 Subject: [PATCH 51/81] Fixes for test files, FilePredictionProvider changes Signed-off-by: Christoph Auer --- .../dataset_builders/doclaynet_v1_builder.py | 2 +- .../prediction_providers/file_provider.py | 59 ++++----- ...49c038171a06ddfcac892c3c6d7e6b4091c642.txt | 9 -- ...a8b8b84b747c295dd10a639e2b5265ac258cf5.txt | 10 -- ...a87b7cb40eb65eee4483725c1a85c4dc72d141.txt | 18 --- ...4eec02c7efd931db5e2a34e66444ee8b8e5079.txt | 14 --- ...497c8236af331fd67bd13b7f7e506d42b4a7e2.txt | 17 --- tests/test_dataset_builder.py | 113 +++++++++++++++++- 8 files changed, 145 insertions(+), 97 deletions(-) delete mode 100644 tests/data/doclaynet_v1_doctags_sample/132a855ee8b23533d8ae69af0049c038171a06ddfcac892c3c6d7e6b4091c642.txt delete mode 100644 tests/data/doclaynet_v1_doctags_sample/2b49edc9d0a47e4efaaeabf907a8b8b84b747c295dd10a639e2b5265ac258cf5.txt delete mode 100644 tests/data/doclaynet_v1_doctags_sample/61d269cb1f2c976191469b891aa87b7cb40eb65eee4483725c1a85c4dc72d141.txt delete mode 100644 tests/data/doclaynet_v1_doctags_sample/a5acc4c1c47a19543362fccf014eec02c7efd931db5e2a34e66444ee8b8e5079.txt delete mode 100644 tests/data/doclaynet_v1_doctags_sample/b13563b6fd80bed51928fc4b42497c8236af331fd67bd13b7f7e506d42b4a7e2.txt diff --git a/docling_eval/dataset_builders/doclaynet_v1_builder.py b/docling_eval/dataset_builders/doclaynet_v1_builder.py index c29b6f2d..28923df1 100644 --- a/docling_eval/dataset_builders/doclaynet_v1_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v1_builder.py @@ -380,7 +380,7 @@ def iterate(self) -> Iterable[DatasetRecord]: ) exported_rows += 1 - print(page_hash) + yield record except Exception as ex: diff --git a/docling_eval/prediction_providers/file_provider.py b/docling_eval/prediction_providers/file_provider.py index 4a1bd583..1ada98ea 100644 --- a/docling_eval/prediction_providers/file_provider.py +++ b/docling_eval/prediction_providers/file_provider.py @@ -40,6 +40,7 @@ def __init__( ignore_missing_predictions: bool = True, true_labels: Optional[Set[DocItemLabel]] = None, pred_labels: Optional[Set[DocItemLabel]] = None, + use_ground_truth_page_images: bool = False, ): """ Initialize the file prediction provider. @@ -59,6 +60,7 @@ def __init__( true_labels=true_labels, pred_labels=pred_labels, ) + self._use_ground_truth_page_images = use_ground_truth_page_images self._supported_prediction_formats = [ PredictionFormats.DOCTAGS, @@ -102,19 +104,18 @@ def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: Returns: Dataset record with prediction """ - doc_id = record.doc_id raw = None pred_doc = None # Load document based on prediction format if self._prediction_format == PredictionFormats.DOCTAGS: - pred_doc = self._load_doctags_doc(doc_id) + pred_doc = self._load_doctags_doc(record) elif self._prediction_format == PredictionFormats.MARKDOWN: - raw = self._load_md_raw(doc_id) + raw = self._load_md_raw(record) elif self._prediction_format == PredictionFormats.JSON: - pred_doc = self._load_json_doc(doc_id) + pred_doc = self._load_json_doc(record) elif self._prediction_format == PredictionFormats.YAML: - pred_doc = self._load_yaml_doc(doc_id) + pred_doc = self._load_yaml_doc(record) # Set status based on whether document was loaded status = ( @@ -137,18 +138,18 @@ def prediction_format(self) -> PredictionFormats: """Get the prediction format.""" return self._prediction_format - def _load_doctags_doc(self, doc_id: str) -> Optional[DoclingDocument]: + def _load_doctags_doc(self, record: DatasetRecord) -> Optional[DoclingDocument]: """ Load doctags file into DoclingDocument. Args: - doc_id: Document ID + record: Groundtruth dataset record Returns: DoclingDocument or None if file not found """ # Read the doctags file - doctags_fn = self._prediction_source_path / f"{doc_id}.dt" + doctags_fn = self._prediction_source_path / f"{record.doc_id}.dt" if self._ignore_missing_files and not doctags_fn.is_file(): return None @@ -156,36 +157,40 @@ def _load_doctags_doc(self, doc_id: str) -> Optional[DoclingDocument]: with open(doctags_fn, "r") as fd: doctags = fd.read() - # Check if an optional page image is present - page_image_fn = self._prediction_source_path / f"{doc_id}.png" page_image = None - if page_image_fn.is_file(): - page_image = Image.open(page_image_fn) + + if self._use_ground_truth_page_images: + page_image = record.ground_truth_page_images[0] + else: + # Check if an optional page image is present + page_image_fn = self._prediction_source_path / f"{record.doc_id}.png" + if page_image_fn.is_file(): + page_image = Image.open(page_image_fn) # Build DoclingDocument doctags_page = DocTagsPage(tokens=doctags, image=page_image) doctags_doc = DocTagsDocument(pages=[doctags_page]) - doc = DoclingDocument(name=doc_id) + doc = DoclingDocument(name=record.doc_id) doc.load_from_doctags(doctags_doc) return doc except Exception as e: - _log.error(f"Error loading doctags document {doc_id}: {str(e)}") + _log.error(f"Error loading doctags document {record.doc_id}: {str(e)}") if not self._ignore_missing_files: raise return None - def _load_json_doc(self, doc_id: str) -> Optional[DoclingDocument]: + def _load_json_doc(self, record: DatasetRecord) -> Optional[DoclingDocument]: """ Load DoclingDocument from JSON. Args: - doc_id: Document ID + record: Groundtruth dataset record Returns: DoclingDocument or None if file not found """ - json_fn = self._prediction_source_path / f"{doc_id}.json" + json_fn = self._prediction_source_path / f"{record.doc_id}.json" if self._ignore_missing_files and not json_fn.is_file(): return None @@ -193,27 +198,27 @@ def _load_json_doc(self, doc_id: str) -> Optional[DoclingDocument]: doc: DoclingDocument = DoclingDocument.load_from_json(json_fn) return doc except Exception as e: - _log.error(f"Error loading JSON document {doc_id}: {str(e)}") + _log.error(f"Error loading JSON document {record.doc_id}: {str(e)}") if not self._ignore_missing_files: raise return None - def _load_yaml_doc(self, doc_id: str) -> Optional[DoclingDocument]: + def _load_yaml_doc(self, record: DatasetRecord) -> Optional[DoclingDocument]: """ Load DoclingDocument from YAML. Args: - doc_id: Document ID + record: Groundtruth dataset record Returns: DoclingDocument or None if file not found """ # Try with .yaml extension - yaml_fn = self._prediction_source_path / f"{doc_id}.yaml" + yaml_fn = self._prediction_source_path / f"{record.doc_id}.yaml" # If not found, try with .yml extension if not yaml_fn.is_file(): - yaml_fn = self._prediction_source_path / f"{doc_id}.yml" + yaml_fn = self._prediction_source_path / f"{record.doc_id}.yml" if self._ignore_missing_files and not yaml_fn.is_file(): return None @@ -222,22 +227,22 @@ def _load_yaml_doc(self, doc_id: str) -> Optional[DoclingDocument]: doc: DoclingDocument = DoclingDocument.load_from_yaml(yaml_fn) return doc except Exception as e: - _log.error(f"Error loading YAML document {doc_id}: {str(e)}") + _log.error(f"Error loading YAML document {record.doc_id}: {str(e)}") if not self._ignore_missing_files: raise return None - def _load_md_raw(self, doc_id: str) -> Optional[str]: + def _load_md_raw(self, record: DatasetRecord) -> Optional[str]: """ Load the markdown content. Args: - doc_id: Document ID + record: Groundtruth dataset record Returns: Markdown content or None if file not found """ - md_fn = self._prediction_source_path / f"{doc_id}.md" + md_fn = self._prediction_source_path / f"{record.doc_id}.md" if self._ignore_missing_files and not md_fn.is_file(): return None @@ -246,7 +251,7 @@ def _load_md_raw(self, doc_id: str) -> Optional[str]: md = fd.read() return md except Exception as e: - _log.error(f"Error loading markdown document {doc_id}: {str(e)}") + _log.error(f"Error loading markdown document {record.doc_id}: {str(e)}") if not self._ignore_missing_files: raise return None diff --git a/tests/data/doclaynet_v1_doctags_sample/132a855ee8b23533d8ae69af0049c038171a06ddfcac892c3c6d7e6b4091c642.txt b/tests/data/doclaynet_v1_doctags_sample/132a855ee8b23533d8ae69af0049c038171a06ddfcac892c3c6d7e6b4091c642.txt deleted file mode 100644 index 399df58b..00000000 --- a/tests/data/doclaynet_v1_doctags_sample/132a855ee8b23533d8ae69af0049c038171a06ddfcac892c3c6d7e6b4091c642.txt +++ /dev/null @@ -1,9 +0,0 @@ - 8 -Leigh Taliaferro, M.D. General Surgeon Abilene, Texas -Leigh Taliaferro, M.D., values consistency. -The Abilene native started his practice 17 years ago and has developed a flourishing business as a general surgeon. He estimates that 90 percent of his practice is for abdominal surgery. With such a busy practice, he finds comfort in having a reliable banking partner. "I have almost every type of business, trust and personal account with First National Bank of Abilene," says Dr. Taliaferro. -"First National is immersed in this city - everywhere you go, they are involved with helping people with their business. It's because of the people who work there - they are leaders ... generous people who make their mark on the bank and on the community. While they may be the biggest bank in town, they sure don't act like it. It's like banking with friends." -Dr. Taliaferro has invested in First Financial Bankshares for more than a decade. "My stock has done nothing but go up in value. They are solid, sound businesspeople. I sleep up well at night knowing that my investments are in good hands." - -"While they may be the biggest bank in town, they sure don't act like it. It's like banking with friends. - \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/2b49edc9d0a47e4efaaeabf907a8b8b84b747c295dd10a639e2b5265ac258cf5.txt b/tests/data/doclaynet_v1_doctags_sample/2b49edc9d0a47e4efaaeabf907a8b8b84b747c295dd10a639e2b5265ac258cf5.txt deleted file mode 100644 index 26fdebed..00000000 --- a/tests/data/doclaynet_v1_doctags_sample/2b49edc9d0a47e4efaaeabf907a8b8b84b747c295dd10a639e2b5265ac258cf5.txt +++ /dev/null @@ -1,10 +0,0 @@ - 82 -Nissan Annual Report 2004 -The Company and its domestic consolidated subsidiaries have defined benefit plans, i.e., welfare pension fund plans ('WPPF'), tax-qualified pension plans and lump-sum payment plans, covering substantially all employees who are entitled to lump-sum or annuity payments, the amounts of which are determined by reference to their basic rates of pay, length of service, and the conditions under which termination occurs. Certain foreign consolidated subsidiaries have defined benefit and contribution plans. -The following table sets forth the funded and accrued status of the plans, and the amounts recognized in the consolidated balance sheets as of March 31, 2005 and 2004 for the Company's and the consolidated subsidiaries' defined benefit plans: -Millions of yen2004 Mar. 31, 20052003 Mar. 31, 2004Retirement benefit obligation:As of20042003Plan assets at fair value(%,121,260)(%,141,048)(%)Unfunded retirement benefit obligation:(716,445)(664,314)(6,695,748)Unrecognized net retirement benefit obligation at transition120,718131,6661,128,206Unrecognized actuarial gain or loss154,689152,8671,445,691Unrecognized prior service cost:(66,720)(61,833)(62,355)Net retirement benefit obligation(507,758)(441,614)(4,745,402)Prepaid pension cost:4456524,159Accrued retirement benefits:(508,203)(442,266)(4,749,561) -The substitutional portion of the benefits under the WPPF has been included in the amounts shown in the above table. -The Company received the approval from the Minister of Health, Labor and Welfare ('MLHW') in the year ended March 31, 2003 with respect to its application for exemption from the obligation for benefits related to future employee services under the substitutional portion of the WPPF. Certain domestic consolidated subsidiaries received the same approval from MLHW during the year ended March 31, 2004. In accordance with the transitional provision stipulated in "Practical Guidelines for Accounting for Retirement Benefits", the Company and the domestic consolidated subsidiaries accounted for the separation of the substitutional portion of the benefit obligation from the corporate portion of the benefit obligation under their WPPFs as of the dates of approval for their exemption assuming that the transfer to the Japanese government of the substitutional portion of the benefit obligation and related pension plan assets has been completed as of those dates. As a result, the Company recognized a loss of $3,945,945 million for the year ended March 31, 2003 and the domestic consolidated subsidiaries recognized an aggregate gain of $3,669 million and an aggregate loss of $1,587 million for the year ended March 31, 2004. The pension assets to be transferred were calculated at $3,757,770 million for the domestic consolidated subsidiaries at March 31, 2004 and $241,203 million for the Company at March 31, 2003. -The components of retirement benefit expenses for the years ended March 31, 2005, 2004 and 2003 are outlined as follows: -Millions of yen2004 Mar. 31, 20052002 Mar. 31, 2004Thousands of U.S. dollarsService cost:For the years ended200420022004Interest costMar. 31, 200351,54351,54351,543Expected return on plan assets:33,28833,01245,269311,013Amortization of net retirement benefit obligation at transition:(17,999)(15,523)(26,708)(168,215)Amortization of actuarial gain or loss:12,00918,69624,280112,234Amortization of prior service cost:1,29,2891,86,198114,644114,934Other(5,431)(7,049)(7,762)(50,757)Retirement benefit expenses:1795751,673(Gain) loss on return of the substitutional portion of welfare pension fund plans82,14691,77398,091767,720Total:(1,107)(5,594)30,945(10,346)$^{#}$81,039$^{#}$86,179$^{#}$129,036$^{#}$757,374$^{#}$757,374 - \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/61d269cb1f2c976191469b891aa87b7cb40eb65eee4483725c1a85c4dc72d141.txt b/tests/data/doclaynet_v1_doctags_sample/61d269cb1f2c976191469b891aa87b7cb40eb65eee4483725c1a85c4dc72d141.txt deleted file mode 100644 index fe2beae5..00000000 --- a/tests/data/doclaynet_v1_doctags_sample/61d269cb1f2c976191469b891aa87b7cb40eb65eee4483725c1a85c4dc72d141.txt +++ /dev/null @@ -1,18 +0,0 @@ - Linking consumers with any time, any place mobile banking -In today's increasingly wireless world, consumers are turning in record numbers to mobile devices for greater convenience and access to banking and information services. - -with the freedom of mobile devices, bank customers can instantly obtain account balances, transfer money and even view a mini-bank statement-or set up instant alerts to monitor their daily account balances, deposit notifications and other personalized information 24 hours a day, 7 days a week. -The exciting potential of wireless is creating unprecedented opportunities for banks to connect with their customers. In Western Europe, the number of mobile banking accounts is expected to reach 31.8 million by 2004. 1 Expanding wireless capabilities are also helping to drive growth in North America, where the number of wireless financial services users is projected to skyrocket to 35 million by 2005. 2 The Asia-Pacific region is forecast at 12 million subscribers of wireless financial services alone in 2003. 3 -The quickly evolving market for mobile banking represents a tremendous opportunity for Euronet Worldwide. Last spring we introduced Euronet ® Mobile Banking as the first financial application that offered both secure account access and a personalized accounting alerting system. Among our new mobile banking clients in 2000 were the Bank of Cyprus, for its branches in London and Greece, and the National Bank of Kuwait, for its Lebanon branch, who were both first to market in their regions. -To further strengthen our capabilities, we announced strategic alliances to market and deliver Euronet's suite of mobile banking solutions with Aether Systems, Inc. for the US market and with Sia Communications for the European, Middle Eastern and Asian markets. In addition, we formed similar regional strategic alliances with companies like Stet Hellas Telecommunications S.A., a Greek mobile operator and subsidiary of Telecom Italia Mobile (TIM). -As next-generation mobile technology brings higher data speeds, personalization and other enhancements, we believe the future of mobile banking presents great opportunities for Euronet. -$^{1}$International Data Corporation (September 2000), $^{2}$TowerGroup (September 2000), $^{3}$Meridien Research (August 1999) - - -National Bank of Kuwait-Lebanon -First-to-Market Mobile Banking -To broaden its customer and account base, the National Bank of Kuwait-Lebanon -(NBK-L) wanted to be first in their market with a mobile banking solution. In a tight race with a competing bank, Euronet's mobile solution was integrated quickly into the NBK-LS IT infrastructure, enabling the bank to be the first to deliver services in its market. -Together with GSM operator Libancell, NBK-LS new mobile banking system offers customers any time, any place access to their account information from their GSM telephones. -11 - \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/a5acc4c1c47a19543362fccf014eec02c7efd931db5e2a34e66444ee8b8e5079.txt b/tests/data/doclaynet_v1_doctags_sample/a5acc4c1c47a19543362fccf014eec02c7efd931db5e2a34e66444ee8b8e5079.txt deleted file mode 100644 index 10fda7ef..00000000 --- a/tests/data/doclaynet_v1_doctags_sample/a5acc4c1c47a19543362fccf014eec02c7efd931db5e2a34e66444ee8b8e5079.txt +++ /dev/null @@ -1,14 +0,0 @@ - HON INDUSTRIES Inc. and SUBSIDIARIES -Income Taxes -Significant components of the provision for income taxes are as follows: -(In thousands)200320022001Current:$ 49,721$ 38,966$ 32,393Federal4,1593,4732,442State53,88042,43934,835Deferred(1,054)6,7557,019$ 52,826$ 49,194$ 41,854-A reconciliation of the statutory federal income tax rate to the Company's effective income tax rate is as follows: -200320022001Federal statutory tax rate35.0%35.0%State taxes, net of federal tax effect1.81.6Credit for increasing research activities(2.0)(1.6)Extraterritorial income exclusion(0.5)(1.0)Other - net0.71.0Effective tax rate35.0%35.0%Shareholders' Equity and Earnings Per Share -Deferred income taxes reflect the net tax effects of temporary differences between the carrying amounts of assets and liabilities for financial reporting purposes and the amounts used for income tax purposes. Significant components of the Company's deferred tax liabilities and assets are as follows: -(In thousands)200320022001Net long-term deferred tax liabilities:$ (28,103)$ (34,398)$ (38,759)Tax over book depreciation1823,5813,197OPEB obligations4,9123,8212,519Compensation Goodwill(18,044)(14,173)(5,550)Other - net3,3204,055(1,039)Total net long-term deferred tax liabilities(37,733)(37,114)(39,632)Net current deferred tax assets:(2981,5171,119liability accruals4,7544,6174,002Vacation accrual-(3,766)(3,766)Integration accruals4,3435,1011,969Inventory differences5288213,302Deferred income Warranty accruals(5,462)(3,820)-Other - net2,8862,3691,606Total net current deferred tax assets6,982(504)6,708Net deferred tax14,32910,10114,940(liabilities) assets$ (23,404)$ (27,013)$ (24,692)The Company purchased 762,300; 614,580; and 1,472,937 shares of its common stock during 2003, 2002, and 2001, respectively. The par value method of accounting is used for common stock repurchases. The excess of the cost of shares acquired over their par value is allocated to Additional Paid-In Capital, with the excess charged to Retained Earnings. -Common Stock, $1 Par Value200320022001Authorized200,000,000200,000,000200,000,000Issued and outstanding58,238,51958,373,60758,672,933Preferred Stock, $1 Par Value2,000,0002,000,0002,000,000Authorized---Issued and outstanding--- -Numerators:20032002Numerators for both basic and diluted EPS net income$ 98,105,000$ 91,360,000Denominators:Denominator for basic EPS weighted-58,178,73958,789,851Potentially dilutive shares from stock option plans366,614231,220231,220Denominator for diluted EPS$ 58,455,35359,021,07159,021,071Earnings per share - basic$ 1.69$ 1.551.55Earnings per share - diluted$ 1.68$ 1.55 -Certain exercisable and nonexercisable stock options were not included in the computation of diluted EPS for fiscal year 2003 and 2002, because the option prices were greater that the average market prices for the applicable periods. The number of stock options outstanding which met this criterion for 2003 was 20,000, with a range of per share exercise prices of $42.49-$42.98; and for 2002 was 30,000, with a range of per share exercise prices of $28.25-$23.22. -Components of other comprehensive income (loss) consist of the following: -(In thousands)200320022001Foreign currency translation adjustments - net of tax$ 45$ -$ 109Change in unrealized gains (losses) on marketable securities - net of tax(690)(322)42Other comprehensive income (loss)$ (645)$ (322)$ 151 -49 - \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/b13563b6fd80bed51928fc4b42497c8236af331fd67bd13b7f7e506d42b4a7e2.txt b/tests/data/doclaynet_v1_doctags_sample/b13563b6fd80bed51928fc4b42497c8236af331fd67bd13b7f7e506d42b4a7e2.txt deleted file mode 100644 index 568068aa..00000000 --- a/tests/data/doclaynet_v1_doctags_sample/b13563b6fd80bed51928fc4b42497c8236af331fd67bd13b7f7e506d42b4a7e2.txt +++ /dev/null @@ -1,17 +0,0 @@ - REPORT OF INDEPENDENT CERTIFIED PUBLIC ACCOUNTANT S -To the Stockholders and the Board of Directors of Atrion Corporation: -We have audited the accompanying consolidated balance sheets of Atrion Corporation (a Delaware corporation) and Subsidiaries as of December 31, 2003 and 2002, and the related consolidated statements of income, changes in stockholders' equity and cash flows for the years then ended. These financial statements are the responsibility of the Company's management. Our responsibility is to express an opinion on these financial statements based on our audit. The financial statements of Atrion Corporation and Subsidiaries as of and for the year in the period ended December 31, 2001, were audited by other auditors who have ceased operations. Those auditors expressed an unqualified opinion on those financial statements in their report dated February 25, 2002. -We conducted our audits in accordance with auditing standards generally accepted in the United States of America. Those standards require that we plan and perform the audit to obtain reasonable assurance about whether the financial statements are free of material misstatement. An audit includes examining, on a test basis, evidence supporting the amounts and disclosures in the financial statements. An audit also includes assessing the accounting principles used and significant estimates made by management as well as evaluating the overall financial statement presentation. We believe that our audits provide a reasonable basis for our opinion. -In our opinion, the financial statements referred to above present fairly, in all material respects, the consolidated financial position of Atrion Corporation and Subsidiaries as of December 31, 2003 and 2002, and the consolidated results of their operations and their consolidated cash flows for the years then ended in conformity with accounting principles generally accepted in the United States of America. -As discussed above, the financial statements of Atrion Corporation and Subsidiaries as of December 31, 2001, and for the year then ended were audited by other auditors who have ceased operations. As described in Note 2, these financial statements have been revised to include the transitional disclosures required by Statement of Financial Accounting Standards No. 142, Goodwill and Other Intangible Assets, which was adopted by the Company as of January 1, 2002. Our audit procedures with respect to the disclosures in Note 2 with respect to 2001 included agreeing the previously reported net income to the previously issued financial statements and the adjustments to reported net income representing amortization expense (including any related tax effects) recognized in those periods related to goodwill to the Company's underlying records obtained from management. We also tested the mathematical accuracy of the reconciliation of adjusted net income to reported net income, and the related income-per-share amounts. In our opinion, the disclosures for 2001 in Note 2 are appropriate. However, we were not engaged to audit, review, or apply any procedures to the 2001 financial statements of the Company other than with respect to such disclosures and, accordingly, we do not express an opinion or any other form of assurance on the 2001 financial statements taken as a whole. - -Grant Thornton LLP Dallas, Texas February 13, 2004 -This is a copy of the audit report previously issued by Arthur Andersen LLP in connection with Atrion Corporation and Subsidiaries Annual Report for the year ended December 31, 2001. This audit report has not been issued by Arthur Andersen LLP in connection with this Annual Report. The consolidated balance sheets as of December 31, 2001 and 2000 and the consolidated statements of income and cash flows for the years ended December 31, 2000 and 1999 referred to in this report have not been included in the accompanying financial statements. -To the Stockholders and the Board of Directors of Atrion Corporation: -We have audited the accompanying consolidated balance sheets of Atrion Corporation (a Delaware corporation) and subsidiaries as of December 31, 2001 and 2000 and the related consolidated statements of income and cash flows for each of the three years in the period ended December 31, 2001. These financial statements are the responsibility of the Company's management. Our responsibility is to express an opinion on these financial statements based on our audits. -We conducted our audits in accordance with auditing standards generally accepted in the United States. Those standards require that we plan and perform the audit to obtain reasonable assurance about whether the financial statements are free of material misstatement. An audit includes examining, on a test basis, evidence supporting the amounts and disclosures in the financial statements. An audit also includes assessing the accounting principles used and significant estimates made by management as well as evaluating the overall financial statement presentation. We believe that our audits provide a reasonable basis for our opinion. -In our opinion, the financial statements referred to above present fairly, in all material respects, the financial position of Atrion Corporation and subsidiaries as of December 31, 2001 and 2000 and the results of their operations and their cash flows for each of the three years in the period ended December 31, 2001 in conformity with accounting principles generally accepted in the United States. - -Arthur Andersen LLP Atlanta, Georgia February 25, 2002 -23 - \ No newline at end of file diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 0e283696..35570c5d 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -94,6 +94,7 @@ def test_run_dpbench_e2e(): target_dataset_dir=target_path / "eval_dataset", ) + ## Evaluate Layout evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DPBENCH, @@ -108,14 +109,45 @@ def test_run_dpbench_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) + ## Evaluate Reading order + evaluate( + modality=EvaluationModality.READING_ORDER, + benchmark=BenchMarkNames.DPBENCH, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.READING_ORDER.value, + ) + + visualise( + modality=EvaluationModality.READING_ORDER, + benchmark=BenchMarkNames.DPBENCH, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.READING_ORDER.value, + ) + + ## Evaluate Markdown text + evaluate( + modality=EvaluationModality.MARKDOWN_TEXT, + benchmark=BenchMarkNames.DPBENCH, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, + ) + + visualise( + modality=EvaluationModality.MARKDOWN_TEXT, + benchmark=BenchMarkNames.DPBENCH, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, + ) + def test_run_doclaynet_with_doctags_fileprovider(): target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV1.value}-SmolDocling/") file_provider = FilePredictionProvider( prediction_format=PredictionFormats.DOCTAGS, source_path=Path("./tests/data/doclaynet_v1_doctags_sample"), - do_visualization=False, + do_visualization=True, ignore_missing_files=True, + use_ground_truth_page_images=True, ) dataset_layout = DocLayNetV1DatasetBuilder( @@ -134,6 +166,7 @@ def test_run_doclaynet_with_doctags_fileprovider(): target_dataset_dir=target_path / "eval_dataset", ) + ## Evaluate Layout evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DOCLAYNETV1, @@ -148,6 +181,21 @@ def test_run_doclaynet_with_doctags_fileprovider(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) + ## Evaluate Markdown text + evaluate( + modality=EvaluationModality.MARKDOWN_TEXT, + benchmark=BenchMarkNames.DOCLAYNETV1, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, + ) + + visualise( + modality=EvaluationModality.MARKDOWN_TEXT, + benchmark=BenchMarkNames.DOCLAYNETV1, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, + ) + def test_run_omnidocbench_e2e(): target_path = Path(f"./scratch/{BenchMarkNames.OMNIDOCBENCH.value}/") @@ -169,6 +217,7 @@ def test_run_omnidocbench_e2e(): target_dataset_dir=target_path / "eval_dataset", ) + # Evaluate Layout evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.OMNIDOCBENCH, @@ -183,6 +232,36 @@ def test_run_omnidocbench_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) + # Evaluate Reading Order + evaluate( + modality=EvaluationModality.READING_ORDER, + benchmark=BenchMarkNames.OMNIDOCBENCH, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.READING_ORDER.value, + ) + + visualise( + modality=EvaluationModality.READING_ORDER, + benchmark=BenchMarkNames.OMNIDOCBENCH, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.READING_ORDER.value, + ) + + # Evaluate Markdown Text + evaluate( + modality=EvaluationModality.MARKDOWN_TEXT, + benchmark=BenchMarkNames.OMNIDOCBENCH, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, + ) + + visualise( + modality=EvaluationModality.MARKDOWN_TEXT, + benchmark=BenchMarkNames.OMNIDOCBENCH, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, + ) + def test_run_dpbench_tables(): target_path = Path(f"./scratch/{BenchMarkNames.DPBENCH.value}/") @@ -276,6 +355,7 @@ def test_run_doclaynet_v1_e2e(): target_dataset_dir=target_path / "eval_dataset", ) + # Evaluate Layout evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DOCLAYNETV1, @@ -290,6 +370,21 @@ def test_run_doclaynet_v1_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) + # Evaluate Markdown Text + evaluate( + modality=EvaluationModality.MARKDOWN_TEXT, + benchmark=BenchMarkNames.DOCLAYNETV1, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, + ) + + visualise( + modality=EvaluationModality.MARKDOWN_TEXT, + benchmark=BenchMarkNames.DOCLAYNETV1, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, + ) + @pytest.mark.skip("Test needs local data which is unavailable.") def test_run_doclaynet_v2_e2e(): @@ -313,6 +408,7 @@ def test_run_doclaynet_v2_e2e(): target_dataset_dir=target_path / "eval_dataset", ) + # Evaluate Layout evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DOCLAYNETV2, @@ -327,6 +423,21 @@ def test_run_doclaynet_v2_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) + # Evaluate Markdown Text + evaluate( + modality=EvaluationModality.MARKDOWN_TEXT, + benchmark=BenchMarkNames.DOCLAYNETV2, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, + ) + + visualise( + modality=EvaluationModality.MARKDOWN_TEXT, + benchmark=BenchMarkNames.DOCLAYNETV2, + idir=target_path / "eval_dataset", + odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, + ) + def test_run_funsd(): target_path = Path(f"./scratch/{BenchMarkNames.FUNSD.value}/") From 1826b88da36a504f7aed17068c0cf7851e378420 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Fri, 28 Mar 2025 16:30:43 +0100 Subject: [PATCH 52/81] Put new CLI Signed-off-by: Christoph Auer --- docling_eval/cli/main.py | 960 +++++++++++------- .../dataset_builders/doclaynet_v2_builder.py | 6 +- docling_eval/legacy/main.py | 607 +++++++++++ docs/examples/benchmark_doclaynet_v1.py | 2 +- docs/examples/benchmark_doclaynet_v2.py | 2 +- docs/examples/benchmark_dpbench.py | 2 +- docs/examples/benchmark_omnidocbench.py | 2 +- .../benchmark_tableformer_fintabnet.py | 2 +- docs/examples/benchmark_tableformer_p1m.py | 2 +- .../benchmark_tableformer_pubtabnet.py | 2 +- tests/test_dataset_builder.py | 4 +- 11 files changed, 1195 insertions(+), 396 deletions(-) create mode 100644 docling_eval/legacy/main.py diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py index d0174ccd..74945910 100644 --- a/docling_eval/cli/main.py +++ b/docling_eval/cli/main.py @@ -3,16 +3,34 @@ import os from enum import Enum from pathlib import Path -from typing import Annotated, Optional +from typing import Annotated, Dict, List, Optional, Tuple import typer +from docling.datamodel.base_models import InputFormat +from docling.datamodel.pipeline_options import EasyOcrOptions, TableFormerMode +from docling.document_converter import PdfFormatOption +from docling.models.factories import get_ocr_factory from tabulate import tabulate # type: ignore from docling_eval.datamodels.types import ( BenchMarkNames, ConverterTypes, EvaluationModality, + PredictionFormats, ) +from docling_eval.dataset_builders.doclaynet_v1_builder import DocLayNetV1DatasetBuilder +from docling_eval.dataset_builders.doclaynet_v2_builder import DocLayNetV2DatasetBuilder +from docling_eval.dataset_builders.dpbench_builder import DPBenchDatasetBuilder +from docling_eval.dataset_builders.funsd_builder import FUNSDDatasetBuilder +from docling_eval.dataset_builders.omnidocbench_builder import ( + OmniDocBenchDatasetBuilder, +) +from docling_eval.dataset_builders.otsl_table_dataset_builder import ( + FintabNetDatasetBuilder, + PubTables1MDatasetBuilder, + PubTabNetDatasetBuilder, +) +from docling_eval.dataset_builders.xfund_builder import XFUNDDatasetBuilder from docling_eval.evaluators.base_readingorder_evaluator import ( DatasetReadingOrderEvaluation, ReadingOrderVisualizer, @@ -32,19 +50,10 @@ DatasetTableEvaluation, TableEvaluator, ) -from docling_eval.legacy.doclaynet_v1.create import create_dlnv1_e2e_dataset -from docling_eval.legacy.dpbench.create import ( - create_dpbench_e2e_dataset, - create_dpbench_tableformer_dataset, -) -from docling_eval.legacy.omnidocbench.create import ( - create_omnidocbench_e2e_dataset, - create_omnidocbench_tableformer_dataset, -) -from docling_eval.legacy.tableformer_huggingface_otsl.create import ( - create_fintabnet_tableformer_dataset, - create_p1m_tableformer_dataset, - create_pubtabnet_tableformer_dataset, +from docling_eval.prediction_providers.docling_provider import DoclingPredictionProvider +from docling_eval.prediction_providers.file_provider import FilePredictionProvider +from docling_eval.prediction_providers.tableformer_provider import ( + TableFormerPredictionProvider, ) # Configure logging @@ -59,10 +68,12 @@ ) -class EvaluationTask(str, Enum): - CREATE = "create" - EVALUATE = "evaluate" - VISUALIZE = "visualize" +class PredictionProviderType(str, Enum): + """Types of prediction providers available.""" + + DOCLING = "docling" + TABLEFORMER = "tableformer" + FILE = "file" def log_and_save_stats( @@ -72,18 +83,20 @@ def log_and_save_stats( metric: str, stats: DatasetStatistics, log_filename: Optional[Path] = None, -) -> tuple[Path, Path]: - r""" - For the given DatasetStatistics related to the provided benchmark/modality/metric: - - Generate a textual table. Log it and save it in a file. - - Generate a plot and save it in a file. - - The filenames of the generated files are derived by the benchmark/modality/metric - - Returns - ------- - log_filename: Path of the saved log file - fig_filename: Path of the saved png file +) -> Tuple[Path, Path]: + """ + For the given DatasetStatistics, generate textual table and plot. + + Args: + odir: Output directory + benchmark: Benchmark name + modality: Evaluation modality + metric: Metric name + stats: Dataset statistics + log_filename: Optional log filename + + Returns: + Tuple of (log_filename, fig_filename) """ log_mode = "a" if log_filename is None: @@ -110,144 +123,155 @@ def log_and_save_stats( return log_filename, fig_filename -def create( - modality: EvaluationModality, +def get_dataset_builder( benchmark: BenchMarkNames, - odir: Path, - idir: Optional[Path] = None, - image_scale: float = 1.0, - converter_type: ConverterTypes = ConverterTypes.DOCLING, - artifacts_path: Optional[Path] = None, + target: Path, split: str = "test", begin_index: int = 0, - end_index: int = 1000, - debug: bool = False, + end_index: int = -1, + dataset_source: Optional[Path] = None, ): - r"""""" - if odir is None: - odir = Path("./benchmarks") / benchmark.value / modality.value + """Get the appropriate dataset builder for the given benchmark.""" + common_params = { + "target": target, + "split": split, + "begin_index": begin_index, + "end_index": end_index, + } if benchmark == BenchMarkNames.DPBENCH: - if idir is None: - _log.error("The input dir for %s must be provided", BenchMarkNames.DPBENCH) - assert idir is not None - - if ( - modality == EvaluationModality.END2END - or modality == EvaluationModality.LAYOUT - ): - # No support for max_items - create_dpbench_e2e_dataset( - dpbench_dir=idir, - output_dir=odir, - begin_index=begin_index, - end_index=end_index, - converter_type=converter_type, - image_scale=image_scale, - do_viz=True, - ) + return DPBenchDatasetBuilder(**common_params) # type: ignore - elif modality == EvaluationModality.TABLE_STRUCTURE: - # No support for max_items - create_dpbench_tableformer_dataset( - dpbench_dir=idir, - output_dir=odir, - begin_index=begin_index, - end_index=end_index, - image_scale=image_scale, - artifacts_path=artifacts_path, - ) + elif benchmark == BenchMarkNames.DOCLAYNETV1: + return DocLayNetV1DatasetBuilder(**common_params) # type: ignore - else: - _log.error(f"{modality} is not yet implemented for {benchmark}") + elif benchmark == BenchMarkNames.DOCLAYNETV2: + if dataset_source is None: + raise ValueError("dataset_path is required for DocLayNetV2") + return DocLayNetV2DatasetBuilder(dataset_source=dataset_source, **common_params) # type: ignore - elif benchmark == BenchMarkNames.OMNIDOCBENCH: - if idir is None: - _log.error("The input dir for %s must be provided", BenchMarkNames.DPBENCH) - assert idir is not None - - if ( - modality == EvaluationModality.END2END - or modality == EvaluationModality.LAYOUT - ): - # No support for max_items - create_omnidocbench_e2e_dataset( - omnidocbench_dir=idir, - output_dir=odir, - begin_index=begin_index, - end_index=end_index, - converter_type=converter_type, - image_scale=image_scale, - ) - elif modality == EvaluationModality.TABLE_STRUCTURE: - # No support for max_items - create_omnidocbench_tableformer_dataset( - omnidocbench_dir=idir, - output_dir=odir, - begin_index=begin_index, - end_index=end_index, - image_scale=image_scale, - artifacts_path=artifacts_path, - ) - else: - _log.error(f"{modality} is not yet implemented for {benchmark}") + elif benchmark == BenchMarkNames.FUNSD: + if dataset_source is None: + raise ValueError("dataset_source is required for FUNSD") + return FUNSDDatasetBuilder(dataset_source=dataset_source, **common_params) # type: ignore - elif benchmark == BenchMarkNames.PUBTABNET: - if modality == EvaluationModality.TABLE_STRUCTURE: - _log.info("Create the tableformer converted PubTabNet dataset") - create_pubtabnet_tableformer_dataset( - output_dir=odir, - begin_index=begin_index, - end_index=end_index, - do_viz=True, - artifacts_path=artifacts_path, - ) - else: - _log.error(f"{modality} is not yet implemented for {benchmark}") + elif benchmark == BenchMarkNames.XFUND: + if dataset_source is None: + raise ValueError("dataset_source is required for XFUND") + return XFUNDDatasetBuilder(dataset_source=dataset_source, **common_params) # type: ignore + + elif benchmark == BenchMarkNames.OMNIDOCBENCH: + return OmniDocBenchDatasetBuilder(**common_params) # type: ignore elif benchmark == BenchMarkNames.FINTABNET: - if modality == EvaluationModality.TABLE_STRUCTURE: - _log.info("Create the tableformer converted FinTabNet dataset") - create_fintabnet_tableformer_dataset( - output_dir=odir, - begin_index=begin_index, - end_index=end_index, - do_viz=True, - artifacts_path=artifacts_path, - ) - else: - _log.error(f"{modality} is not yet implemented for {benchmark}") + return FintabNetDatasetBuilder(**common_params) # type: ignore elif benchmark == BenchMarkNames.PUB1M: - if modality == EvaluationModality.TABLE_STRUCTURE: - _log.info("Create the tableformer converted Pub1M dataset") - create_p1m_tableformer_dataset( - output_dir=odir, - begin_index=begin_index, - end_index=end_index, - do_viz=True, - artifacts_path=artifacts_path, + return PubTables1MDatasetBuilder(**common_params) # type: ignore + + elif benchmark == BenchMarkNames.PUBTABNET: + return PubTabNetDatasetBuilder(**common_params) # type: ignore + + else: + raise ValueError(f"Unsupported benchmark: {benchmark}") + + +def get_prediction_provider( + provider_type: PredictionProviderType, + file_source_path: Optional[Path] = None, + file_prediction_format: Optional[PredictionFormats] = None, +): + """Get the appropriate prediction provider with default settings.""" + if provider_type == PredictionProviderType.DOCLING: + return DoclingPredictionProvider( + do_visualization=True, + ignore_missing_predictions=True, + ) + + elif provider_type == PredictionProviderType.TABLEFORMER: + return TableFormerPredictionProvider( + do_visualization=True, + ignore_missing_predictions=True, + ) + + elif provider_type == PredictionProviderType.FILE: + if file_prediction_format is None: + raise ValueError("file_prediction_format is required for File provider") + if file_source_path is None: + raise ValueError("file_source_path is required for File provider") + + return FilePredictionProvider( + prediction_format=file_prediction_format, + source_path=file_source_path, + do_visualization=True, + ignore_missing_predictions=True, + ignore_missing_files=True, + use_ground_truth_page_images=False, + ) + + else: + raise ValueError(f"Unsupported prediction provider: {provider_type}") + + +def create_datasets( + modality: EvaluationModality, + benchmark: BenchMarkNames, + output_dir: Path, + dataset_source: Optional[Path] = None, + split: str = "test", + begin_index: int = 0, + end_index: int = -1, + prediction_provider: Optional[PredictionProviderType] = None, + file_prediction_format: Optional[PredictionFormats] = None, + file_source_path: Optional[Path] = None, + debug: bool = False, +): + """Create datasets using dataset builders and prediction providers.""" + # Set up ground truth directory - matching test_dataset_builder.py layout + gt_dir = output_dir / "gt_dataset" + + # Create dataset builder + try: + dataset_builder = get_dataset_builder( + benchmark=benchmark, + target=gt_dir, + split=split, + begin_index=begin_index, + end_index=end_index, + dataset_source=dataset_source, + ) + except ValueError as e: + _log.error(f"Error creating dataset builder: {str(e)}") + return + + # Retrieve and save the dataset + dataset_builder.retrieve_input_dataset() + dataset_builder.save_to_disk(chunk_size=80) + + # If prediction provider is specified, create predictions + if prediction_provider: + # Set up eval dataset directory - matching test_dataset_builder.py layout + pred_dir = output_dir / "eval_dataset" + + try: + # Create the appropriate prediction provider + provider = get_prediction_provider( + provider_type=prediction_provider, + file_source_path=file_source_path, + file_prediction_format=file_prediction_format, ) - else: - _log.error(f"{modality} is not yet implemented for {benchmark}") - elif benchmark == BenchMarkNames.DOCLAYNETV1: - if modality == EvaluationModality.LAYOUT: - create_dlnv1_e2e_dataset( - name="ds4sd/DocLayNet-v1.2", + # Create predictions + provider.create_prediction_dataset( + name=dataset_builder.name, + gt_dataset_dir=gt_dir, + target_dataset_dir=pred_dir, split=split, - output_dir=odir, - converter_type=converter_type, - do_viz=True, begin_index=begin_index, end_index=end_index, - do_debug=debug, ) - else: - _log.error(f"{modality} is not yet implemented for {benchmark}") - - else: - _log.error(f"{benchmark} is not yet implemented") + except ValueError as e: + _log.error(f"Error creating prediction provider: {str(e)}") def evaluate( @@ -257,9 +281,21 @@ def evaluate( odir: Path, split: str = "test", ): - r"""""" + """ + Evaluate predictions against ground truth. + + Args: + modality: Evaluation modality + benchmark: Benchmark name + idir: Input directory with dataset + odir: Output directory for results + split: Dataset split + begin_index: Begin index + end_index: End index + """ if not os.path.exists(idir): _log.error(f"Benchmark directory not found: {idir}") + return os.makedirs(odir, exist_ok=True) @@ -267,26 +303,34 @@ def evaluate( save_fn = odir / f"evaluation_{benchmark.value}_{modality.value}.json" if modality == EvaluationModality.END2END: - _log.error("not supported") + _log.error("END2END evaluation not supported. ") elif modality == EvaluationModality.LAYOUT: layout_evaluator = LayoutEvaluator() - layout_evaluation = layout_evaluator(idir, split=split) + layout_evaluation = layout_evaluator( + idir, + split=split, + ) with open(save_fn, "w") as fd: json.dump(layout_evaluation.model_dump(), fd, indent=2, sort_keys=True) elif modality == EvaluationModality.TABLE_STRUCTURE: table_evaluator = TableEvaluator() - table_evaluation = table_evaluator(idir, split=split) + table_evaluation = table_evaluator( + idir, + split=split, + ) with open(save_fn, "w") as fd: json.dump(table_evaluation.model_dump(), fd, indent=2, sort_keys=True) elif modality == EvaluationModality.READING_ORDER: readingorder_evaluator = ReadingOrderEvaluator() - - readingorder_evaluation = readingorder_evaluator(idir, split=split) + readingorder_evaluation = readingorder_evaluator( + idir, + split=split, + ) with open(save_fn, "w") as fd: json.dump( @@ -299,7 +343,10 @@ def evaluate( elif modality == EvaluationModality.MARKDOWN_TEXT: md_evaluator = MarkdownTextEvaluator() - md_evaluation = md_evaluator(idir, split=split) + md_evaluation = md_evaluator( + idir, + split=split, + ) with open(save_fn, "w") as fd: json.dump( @@ -312,7 +359,10 @@ def evaluate( elif modality == EvaluationModality.BBOXES_TEXT: bbox_evaluator = BboxTextEvaluator() - bbox_evaluation = bbox_evaluator(idir, split=split) + bbox_evaluation = bbox_evaluator( + idir, + split=split, + ) with open(save_fn, "w") as fd: json.dump( @@ -323,283 +373,425 @@ def evaluate( ensure_ascii=False, ) - elif modality == EvaluationModality.CODE_TRANSCRIPTION: - pass + else: + _log.error(f"Unsupported modality for evaluation: {modality}") + return - _log.info("The evaluation has been saved in '%s'", save_fn) + _log.info(f"The evaluation has been saved in '{save_fn}'") -def visualise( +def visualize( modality: EvaluationModality, benchmark: BenchMarkNames, idir: Path, odir: Path, split: str = "test", ): + """ + Visualize evaluation results. + + Args: + modality: Visualization modality + benchmark: Benchmark name + idir: Input directory with dataset + odir: Output directory for visualizations + split: Dataset split + begin_index: Begin index + end_index: End index + """ + if not os.path.exists(idir): + _log.error(f"Input directory not found: {idir}") + return + os.makedirs(odir, exist_ok=True) metrics_filename = odir / f"evaluation_{benchmark.value}_{modality.value}.json" + if not os.path.exists(metrics_filename): + _log.error(f"Metrics file not found: {metrics_filename}") + _log.error("You need to run evaluation first before visualization") + return + if modality == EvaluationModality.END2END: - pass + _log.error("END2END visualization not supported") elif modality == EvaluationModality.LAYOUT: - with open(metrics_filename, "r") as fd: - layout_evaluation = DatasetLayoutEvaluation.parse_file(metrics_filename) - - # Save layout statistics for mAP - log_filename, _ = log_and_save_stats( - odir, benchmark, modality, "mAP_0.5_0.95", layout_evaluation.image_mAP_stats - ) + try: + with open(metrics_filename, "r") as fd: + layout_evaluation = DatasetLayoutEvaluation.model_validate_json( + fd.read() + ) + + # Save layout statistics for mAP + log_filename, _ = log_and_save_stats( + odir, + benchmark, + modality, + "mAP_0.5_0.95", + layout_evaluation.image_mAP_stats, + ) - # Append to layout statistics, the AP per classes - data, headers = layout_evaluation.to_table() - content = "\n\n\nAP[0.5:0.05:0.95] per class (reported as %):\n\n" - content += tabulate(data, headers=headers, tablefmt="github") + # Append to layout statistics, the AP per classes + data, headers = layout_evaluation.to_table() + content = "\n\n\nAP[0.5:0.05:0.95] per class (reported as %):\n\n" + content += tabulate(data, headers=headers, tablefmt="github") - # Append to layout statistics, the mAP - content += "\n\nTotal mAP[0.5:0.05:0.95] (reported as %): {:.2f}".format( - 100.0 * layout_evaluation.mAP - ) - _log.info(content) - with open(log_filename, "a") as fd: - fd.write(content) + # Append to layout statistics, the mAP + content += "\n\nTotal mAP[0.5:0.05:0.95] (reported as %): {:.2f}".format( + 100.0 * layout_evaluation.mAP + ) + _log.info(content) + with open(log_filename, "a") as fd: + fd.write(content) + except Exception as e: + _log.error(f"Error processing layout evaluation: {str(e)}") elif modality == EvaluationModality.TABLE_STRUCTURE: - with open(metrics_filename, "r") as fd: - table_evaluation = DatasetTableEvaluation.parse_file(metrics_filename) + try: + with open(metrics_filename, "r") as fd: + table_evaluation = DatasetTableEvaluation.model_validate_json(fd.read()) - figname = ( - odir / f"evaluation_{benchmark.value}_{modality.value}-delta_row_col.png" - ) - table_evaluation.save_histogram_delta_row_col(figname=figname) - - # TEDS struct-with-text - log_and_save_stats( - odir, benchmark, modality, "TEDS_struct-with-text", table_evaluation.TEDS - ) + figname = ( + odir + / f"evaluation_{benchmark.value}_{modality.value}-delta_row_col.png" + ) + table_evaluation.save_histogram_delta_row_col(figname=figname) + + # TEDS struct-with-text + log_and_save_stats( + odir, + benchmark, + modality, + "TEDS_struct-with-text", + table_evaluation.TEDS, + ) - # TEDS struct-only - log_and_save_stats( - odir, benchmark, modality, "TEDS_struct-only", table_evaluation.TEDS_struct - ) + # TEDS struct-only + log_and_save_stats( + odir, + benchmark, + modality, + "TEDS_struct-only", + table_evaluation.TEDS_struct, + ) + except Exception as e: + _log.error(f"Error processing table evaluation: {str(e)}") elif modality == EvaluationModality.READING_ORDER: - with open(metrics_filename, "r") as fd: - ro_evaluation = DatasetReadingOrderEvaluation.parse_file(metrics_filename) - # ARD - log_and_save_stats( - odir, benchmark, modality, "ARD_norm", ro_evaluation.ard_stats - ) + try: + with open(metrics_filename, "r") as fd: + ro_evaluation = DatasetReadingOrderEvaluation.model_validate_json( + fd.read() + ) + + # ARD + log_and_save_stats( + odir, benchmark, modality, "ARD_norm", ro_evaluation.ard_stats + ) - # Weighted ARD - log_and_save_stats( - odir, benchmark, modality, "weighted_ARD", ro_evaluation.w_ard_stats - ) + # Weighted ARD + log_and_save_stats( + odir, benchmark, modality, "weighted_ARD", ro_evaluation.w_ard_stats + ) - # Generate visualizations of the reading order across the GT and the prediction - ro_visualizer = ReadingOrderVisualizer() - ro_visualizer(idir, metrics_filename, odir, split=split) + # Generate visualizations of the reading order across the GT and the prediction + ro_visualizer = ReadingOrderVisualizer() + ro_visualizer( + idir, + metrics_filename, + odir, + split=split, + ) + except Exception as e: + _log.error(f"Error processing reading order evaluation: {str(e)}") elif modality == EvaluationModality.MARKDOWN_TEXT: - with open(metrics_filename, "r") as fd: - md_evaluation = DatasetMarkdownEvaluation.parse_file(metrics_filename) - # Log stats for all metrics in the same file - log_filename = odir / f"evaluation_{benchmark.value}_{modality.value}.txt" - with open(log_filename, "w") as fd: - fd.write(f"{benchmark.value} size: {len(md_evaluation.evaluations)}\n\n") - - log_and_save_stats( - odir, - benchmark, - modality, - "BLEU", - md_evaluation.bleu_stats, - log_filename=log_filename, - ) - log_and_save_stats( - odir, - benchmark, - modality, - "F1", - md_evaluation.f1_score_stats, - log_filename=log_filename, - ) - log_and_save_stats( - odir, - benchmark, - modality, - "precision", - md_evaluation.precision_stats, - log_filename=log_filename, - ) - log_and_save_stats( - odir, - benchmark, - modality, - "recall", - md_evaluation.recall_stats, - log_filename=log_filename, - ) - log_and_save_stats( - odir, - benchmark, - modality, - "edit_distance", - md_evaluation.edit_distance_stats, - log_filename=log_filename, - ) - log_and_save_stats( - odir, - benchmark, - modality, - "meteor", - md_evaluation.meteor_stats, - log_filename=log_filename, - ) + try: + with open(metrics_filename, "r") as fd: + md_evaluation = DatasetMarkdownEvaluation.model_validate_json(fd.read()) + + # Log stats for all metrics in the same file + log_filename = odir / f"evaluation_{benchmark.value}_{modality.value}.txt" + with open(log_filename, "w") as fd: + fd.write( + f"{benchmark.value} size: {len(md_evaluation.evaluations)}\n\n" + ) + + log_and_save_stats( + odir, + benchmark, + modality, + "BLEU", + md_evaluation.bleu_stats, + log_filename=log_filename, + ) + log_and_save_stats( + odir, + benchmark, + modality, + "F1", + md_evaluation.f1_score_stats, + log_filename=log_filename, + ) + log_and_save_stats( + odir, + benchmark, + modality, + "precision", + md_evaluation.precision_stats, + log_filename=log_filename, + ) + log_and_save_stats( + odir, + benchmark, + modality, + "recall", + md_evaluation.recall_stats, + log_filename=log_filename, + ) + log_and_save_stats( + odir, + benchmark, + modality, + "edit_distance", + md_evaluation.edit_distance_stats, + log_filename=log_filename, + ) + log_and_save_stats( + odir, + benchmark, + modality, + "meteor", + md_evaluation.meteor_stats, + log_filename=log_filename, + ) + except Exception as e: + _log.error(f"Error processing markdown text evaluation: {str(e)}") + + else: + _log.error(f"Unsupported modality for visualization: {modality}") - elif modality == EvaluationModality.CODE_TRANSCRIPTION: - pass - elif modality == EvaluationModality.MATH_TRANSCRIPTION: - pass +@app.command() +def create_gt( + benchmark: Annotated[BenchMarkNames, typer.Option(help="Benchmark name")], + output_dir: Annotated[Path, typer.Option(help="Output directory")], + dataset_source: Annotated[ + Optional[Path], typer.Option(help="Dataset source for FUNSD and XFUND") + ] = None, + split: Annotated[str, typer.Option(help="Dataset split")] = "test", + begin_index: Annotated[int, typer.Option(help="Begin index (inclusive)")] = 0, + end_index: Annotated[ + int, typer.Option(help="End index (exclusive), -1 for all") + ] = -1, +): + """Create ground truth dataset only.""" + gt_dir = output_dir / "gt_dataset" - elif modality == EvaluationModality.CAPTIONING: - pass + try: + dataset_builder = get_dataset_builder( + benchmark=benchmark, + target=gt_dir, + split=split, + begin_index=begin_index, + end_index=end_index, + dataset_source=dataset_source, + ) + # Retrieve and save the dataset + dataset_builder.retrieve_input_dataset() + dataset_builder.save_to_disk(chunk_size=80) -@app.command(no_args_is_help=True) -def main( - task: Annotated[ - EvaluationTask, - typer.Option( - ..., # EvaluationTask.CREATE, - "-t", # Short name - "--task", # Long name - help="Evaluation task", - ), - ], - modality: Annotated[ - EvaluationModality, - typer.Option( - ..., # EvaluationModality.TABLE_STRUCTURE, - "-m", # Short name - "--modality", # Long name - help="Evaluation modality", - ), - ], - benchmark: Annotated[ - BenchMarkNames, - typer.Option( - ..., # BenchMarkNames.DPBENCH, - "-b", # Short name - "--benchmark", # Long name - help="Benchmark name", - ), - ], - odir: Annotated[ - Path, - typer.Option( - ..., - "-o", # Short name - "--output-dir", # Long name - help="Output directory", - ), + _log.info(f"Ground truth dataset created at {gt_dir}") + except ValueError as e: + _log.error(f"Error creating dataset builder: {str(e)}") + + +@app.command() +def create_eval( + modality: Annotated[EvaluationModality, typer.Option(help="Evaluation modality")], + benchmark: Annotated[BenchMarkNames, typer.Option(help="Benchmark name")], + output_dir: Annotated[Path, typer.Option(help="Output directory")], + prediction_provider: Annotated[ + PredictionProviderType, typer.Option(help="Type of prediction provider to use") ], - idir: Annotated[ - Optional[Path], + split: Annotated[str, typer.Option(help="Dataset split")] = "test", + begin_index: Annotated[int, typer.Option(help="Begin index (inclusive)")] = 0, + end_index: Annotated[ + int, typer.Option(help="End index (exclusive), -1 for all") + ] = -1, + # File provider required options + file_prediction_format: Annotated[ + Optional[str], typer.Option( - ..., - "-i", # Short name - "--input-dir", # Long name - help="Input directory", + help="Prediction format for File provider (required if using FILE provider)" ), ] = None, - converter_type: Annotated[ - ConverterTypes, - typer.Option( - ..., - "-c", # Short name - "--converter_type", # Long name - help="Type of document converter", - ), - ] = ConverterTypes.DOCLING, - split: Annotated[ - str, - typer.Option( - ..., - "-s", # Short name - "--split", # Long name - help="Dataset split", - ), - ] = "test", - artifacts_path: Annotated[ + file_source_path: Annotated[ Optional[Path], typer.Option( - ..., - "-a", # Short name - "--artifacts-path", # Long name - help="Load artifacts from local path", + help="Source path for File provider (required if using FILE provider)" ), ] = None, - begin_index: Annotated[ - int, - typer.Option( - ..., - "-bi", # Short name - "--begin_index", # Long name - help="Begin converting from the given sample index (inclusive). Zero based.", - ), - ] = 0, - end_index: Annotated[ - int, - typer.Option( - ..., - "-ei", # Short name - "--end_index", # Long name - help="End converting to the given sample index (exclusive). Zero based. -1 indicates to take all", - ), - ] = 1000, - debug: Annotated[ - bool, - typer.Option( - ..., - help="Enable debugging", - ), - ] = False, ): - # Set the log level - log_format = "%(asctime)s - %(levelname)s - %(message)s" - # if debug: - # logging.basicConfig(level=logging.DEBUG, format=log_format) - # else: - # logging.basicConfig(level=logging.INFO, format=log_format) - logging.basicConfig(level=logging.INFO, format=log_format) - - # Dispatch the command - if task == EvaluationTask.CREATE: - create( - modality, - benchmark, - odir, - idir=idir, - converter_type=converter_type, - artifacts_path=artifacts_path, + """Create evaluation dataset from existing ground truth.""" + gt_dir = output_dir / "gt_dataset" + pred_dir = output_dir / "eval_dataset" + + # Check if ground truth exists + if not gt_dir.exists(): + _log.error(f"Ground truth directory not found: {gt_dir}") + _log.error( + "Cannot create eval dataset without ground truth. Run create_gt first." + ) + return + + try: + # Convert string option to enum value + file_format = ( + PredictionFormats(file_prediction_format) + if file_prediction_format + else None + ) + + # Create the appropriate prediction provider + provider = get_prediction_provider( + provider_type=prediction_provider, + file_source_path=file_source_path, + file_prediction_format=file_format, + ) + + # Get the dataset name from the benchmark + dataset_name = f"{benchmark.value}: {modality.value}" + + # Create predictions + provider.create_prediction_dataset( + name=dataset_name, + gt_dataset_dir=gt_dir, + target_dataset_dir=pred_dir, split=split, begin_index=begin_index, end_index=end_index, - debug=debug, ) - elif task == EvaluationTask.EVALUATE: - assert idir is not None - evaluate(modality, benchmark, idir, odir, split) + _log.info(f"Evaluation dataset created at {pred_dir}") + except ValueError as e: + _log.error(f"Error creating prediction provider: {str(e)}") - elif task == EvaluationTask.VISUALIZE: - assert idir is not None - visualise(modality, benchmark, idir, odir, split) +@app.command() +def create( + modality: Annotated[EvaluationModality, typer.Option(help="Evaluation modality")], + benchmark: Annotated[BenchMarkNames, typer.Option(help="Benchmark name")], + output_dir: Annotated[Path, typer.Option(help="Output directory")], + dataset_source: Annotated[ + Optional[Path], typer.Option(help="Dataset source for FUNSD and XFUND") + ] = None, + split: Annotated[str, typer.Option(help="Dataset split")] = "test", + begin_index: Annotated[int, typer.Option(help="Begin index (inclusive)")] = 0, + end_index: Annotated[ + int, typer.Option(help="End index (exclusive), -1 for all") + ] = -1, + prediction_provider: Annotated[ + Optional[PredictionProviderType], + typer.Option(help="Type of prediction provider to use"), + ] = None, + file_prediction_format: Annotated[ + Optional[str], typer.Option(help="Prediction format for File provider") + ] = None, + file_source_path: Annotated[ + Optional[Path], typer.Option(help="Source path for File provider") + ] = None, +): + """Create both ground truth and evaluation datasets in one step.""" + # First create ground truth + create_gt( + benchmark=benchmark, + output_dir=output_dir, + dataset_source=dataset_source, + split=split, + begin_index=begin_index, + end_index=end_index, + ) + + # Then create evaluation if provider specified + if prediction_provider: + create_eval( + modality=modality, + benchmark=benchmark, + output_dir=output_dir, + prediction_provider=prediction_provider, + split=split, + begin_index=begin_index, + end_index=end_index, + file_prediction_format=file_prediction_format, + file_source_path=file_source_path, + ) else: - _log.error("Unsupported command: '%s'", task.value) + _log.info( + "No prediction provider specified, skipping evaluation dataset creation" + ) + + +@app.command(name="evaluate") +def evaluate_cmd( + modality: Annotated[EvaluationModality, typer.Option(help="Evaluation modality")], + benchmark: Annotated[BenchMarkNames, typer.Option(help="Benchmark name")], + output_dir: Annotated[Path, typer.Option(help="Base output directory")], + split: Annotated[str, typer.Option(help="Dataset split")] = "test", +): + """Evaluate predictions against ground truth.""" + # Derive input and output paths based on the directory structure in test_dataset_builder.py + input_dir = output_dir / "eval_dataset" + eval_output_dir = output_dir / "evaluations" / modality.value + + # Create output directory + os.makedirs(eval_output_dir, exist_ok=True) + + # Call our self-contained evaluation function + evaluate( + modality=modality, + benchmark=benchmark, + idir=input_dir, + odir=eval_output_dir, + split=split, + ) + + +@app.command(name="visualize") +def visualize_cmd( + modality: Annotated[ + EvaluationModality, typer.Option(help="Visualization modality") + ], + benchmark: Annotated[BenchMarkNames, typer.Option(help="Benchmark name")], + output_dir: Annotated[Path, typer.Option(help="Base output directory")], + split: Annotated[str, typer.Option(help="Dataset split")] = "test", + begin_index: Annotated[int, typer.Option(help="Begin index (inclusive)")] = 0, + end_index: Annotated[ + int, typer.Option(help="End index (exclusive), -1 for all") + ] = -1, +): + """Visualize evaluation results.""" + # Derive input and output paths based on the directory structure in test_dataset_builder.py + input_dir = output_dir / "eval_dataset" + eval_output_dir = output_dir / "evaluations" / modality.value + + # Create output directory + os.makedirs(eval_output_dir, exist_ok=True) + + # Call our self-contained visualization function + visualize( + modality=modality, + benchmark=benchmark, + idir=input_dir, + odir=eval_output_dir, + split=split, + ) + + +@app.callback() +def main(): + """Docling Evaluation CLI for benchmarking document processing tasks.""" + pass if __name__ == "__main__": diff --git a/docling_eval/dataset_builders/doclaynet_v2_builder.py b/docling_eval/dataset_builders/doclaynet_v2_builder.py index 7ef71719..0e745e4e 100644 --- a/docling_eval/dataset_builders/doclaynet_v2_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v2_builder.py @@ -51,7 +51,7 @@ class DocLayNetV2DatasetBuilder(BaseEvaluationDatasetBuilder): def __init__( self, - dataset_path: Path, + dataset_source: Path, target: Path, split: str = "test", begin_index: int = 0, @@ -61,7 +61,7 @@ def __init__( Initialize the DocLayNet V2 dataset builder. Args: - dataset_path: Path to the pre-downloaded dataset + dataset_source: Path to the pre-downloaded dataset target: Path where processed dataset will be saved split: Dataset split to use begin_index: Start index for processing (inclusive) @@ -69,7 +69,7 @@ def __init__( """ super().__init__( name="DocLayNetV2: end-to-end", - dataset_source=dataset_path, # Local Path to dataset + dataset_source=dataset_source, # Local Path to dataset target=target, split=split, begin_index=begin_index, diff --git a/docling_eval/legacy/main.py b/docling_eval/legacy/main.py new file mode 100644 index 00000000..b3be2bb6 --- /dev/null +++ b/docling_eval/legacy/main.py @@ -0,0 +1,607 @@ +import json +import logging +import os +from enum import Enum +from pathlib import Path +from typing import Annotated, Optional + +import typer +from tabulate import tabulate # type: ignore + +from docling_eval.datamodels.types import ( + BenchMarkNames, + ConverterTypes, + EvaluationModality, +) +from docling_eval.dataset_builders.dpbench_builder import DPBenchDatasetBuilder +from docling_eval.evaluators.base_readingorder_evaluator import ( + DatasetReadingOrderEvaluation, + ReadingOrderVisualizer, +) +from docling_eval.evaluators.bbox_text_evaluator import BboxTextEvaluator +from docling_eval.evaluators.layout_evaluator import ( + DatasetLayoutEvaluation, + LayoutEvaluator, +) +from docling_eval.evaluators.markdown_text_evaluator import ( + DatasetMarkdownEvaluation, + MarkdownTextEvaluator, +) +from docling_eval.evaluators.readingorder_evaluator import ReadingOrderEvaluator +from docling_eval.evaluators.stats import DatasetStatistics +from docling_eval.evaluators.table_evaluator import ( + DatasetTableEvaluation, + TableEvaluator, +) +from docling_eval.legacy.doclaynet_v1.create import create_dlnv1_e2e_dataset +from docling_eval.legacy.dpbench.create import ( + create_dpbench_e2e_dataset, + create_dpbench_tableformer_dataset, +) +from docling_eval.legacy.omnidocbench.create import ( + create_omnidocbench_e2e_dataset, + create_omnidocbench_tableformer_dataset, +) +from docling_eval.legacy.tableformer_huggingface_otsl.create import ( + create_fintabnet_tableformer_dataset, + create_p1m_tableformer_dataset, + create_pubtabnet_tableformer_dataset, +) + +# Configure logging +logging.getLogger("docling").setLevel(logging.WARNING) +_log = logging.getLogger(__name__) + +app = typer.Typer( + name="docling-eval", + no_args_is_help=True, + add_completion=False, + pretty_exceptions_enable=False, +) + + +class EvaluationTask(str, Enum): + CREATE = "create" + EVALUATE = "evaluate" + VISUALIZE = "visualize" + + +def log_and_save_stats( + odir: Path, + benchmark: BenchMarkNames, + modality: EvaluationModality, + metric: str, + stats: DatasetStatistics, + log_filename: Optional[Path] = None, +) -> tuple[Path, Path]: + r""" + For the given DatasetStatistics related to the provided benchmark/modality/metric: + - Generate a textual table. Log it and save it in a file. + - Generate a plot and save it in a file. + + The filenames of the generated files are derived by the benchmark/modality/metric + + Returns + ------- + log_filename: Path of the saved log file + fig_filename: Path of the saved png file + """ + log_mode = "a" + if log_filename is None: + log_filename = ( + odir / f"evaluation_{benchmark.value}_{modality.value}_{metric}.txt" + ) + log_mode = "w" + fig_filename = odir / f"evaluation_{benchmark.value}_{modality.value}_{metric}.png" + stats.save_histogram(figname=fig_filename, name=metric) + + data, headers = stats.to_table(metric) + content = f"{benchmark.value} {modality.value} {metric}: " + content += "mean={:.2f} median={:.2f} std={:.2f}\n\n".format( + stats.mean, stats.median, stats.std + ) + content += tabulate(data, headers=headers, tablefmt="github") + content += "\n\n\n" + + _log.info(content) + with open(log_filename, log_mode) as fd: + fd.write(content) + _log.info("Saving statistics report to %s", log_filename) + + return log_filename, fig_filename + + +def create( + modality: EvaluationModality, + benchmark: BenchMarkNames, + odir: Path, + idir: Optional[Path] = None, + image_scale: float = 1.0, + converter_type: ConverterTypes = ConverterTypes.DOCLING, + artifacts_path: Optional[Path] = None, + split: str = "test", + begin_index: int = 0, + end_index: int = 1000, + debug: bool = False, +): + r"""""" + if odir is None: + odir = Path("./benchmarks") / benchmark.value # / modality.value + + if benchmark == BenchMarkNames.DPBENCH: + if idir is None: + _log.error("The input dir for %s must be provided", BenchMarkNames.DPBENCH) + assert idir is not None + + if ( + modality == EvaluationModality.END2END + or modality == EvaluationModality.LAYOUT + ): + # No support for max_items + create_dpbench_e2e_dataset( + dpbench_dir=idir, + output_dir=odir, + begin_index=begin_index, + end_index=end_index, + converter_type=converter_type, + image_scale=image_scale, + do_viz=True, + ) + + elif modality == EvaluationModality.TABLE_STRUCTURE: + # No support for max_items + create_dpbench_tableformer_dataset( + dpbench_dir=idir, + output_dir=odir, + begin_index=begin_index, + end_index=end_index, + image_scale=image_scale, + artifacts_path=artifacts_path, + ) + + else: + _log.error(f"{modality} is not yet implemented for {benchmark}") + + elif benchmark == BenchMarkNames.OMNIDOCBENCH: + if idir is None: + _log.error("The input dir for %s must be provided", BenchMarkNames.DPBENCH) + assert idir is not None + + if ( + modality == EvaluationModality.END2END + or modality == EvaluationModality.LAYOUT + ): + # No support for max_items + create_omnidocbench_e2e_dataset( + omnidocbench_dir=idir, + output_dir=odir, + begin_index=begin_index, + end_index=end_index, + converter_type=converter_type, + image_scale=image_scale, + ) + elif modality == EvaluationModality.TABLE_STRUCTURE: + # No support for max_items + create_omnidocbench_tableformer_dataset( + omnidocbench_dir=idir, + output_dir=odir, + begin_index=begin_index, + end_index=end_index, + image_scale=image_scale, + artifacts_path=artifacts_path, + ) + else: + _log.error(f"{modality} is not yet implemented for {benchmark}") + + elif benchmark == BenchMarkNames.PUBTABNET: + if modality == EvaluationModality.TABLE_STRUCTURE: + _log.info("Create the tableformer converted PubTabNet dataset") + create_pubtabnet_tableformer_dataset( + output_dir=odir, + begin_index=begin_index, + end_index=end_index, + do_viz=True, + artifacts_path=artifacts_path, + ) + else: + _log.error(f"{modality} is not yet implemented for {benchmark}") + + elif benchmark == BenchMarkNames.FINTABNET: + if modality == EvaluationModality.TABLE_STRUCTURE: + _log.info("Create the tableformer converted FinTabNet dataset") + create_fintabnet_tableformer_dataset( + output_dir=odir, + begin_index=begin_index, + end_index=end_index, + do_viz=True, + artifacts_path=artifacts_path, + ) + else: + _log.error(f"{modality} is not yet implemented for {benchmark}") + + elif benchmark == BenchMarkNames.PUB1M: + if modality == EvaluationModality.TABLE_STRUCTURE: + _log.info("Create the tableformer converted Pub1M dataset") + create_p1m_tableformer_dataset( + output_dir=odir, + begin_index=begin_index, + end_index=end_index, + do_viz=True, + artifacts_path=artifacts_path, + ) + else: + _log.error(f"{modality} is not yet implemented for {benchmark}") + + elif benchmark == BenchMarkNames.DOCLAYNETV1: + if modality == EvaluationModality.LAYOUT: + create_dlnv1_e2e_dataset( + name="ds4sd/DocLayNet-v1.2", + split=split, + output_dir=odir, + converter_type=converter_type, + do_viz=True, + begin_index=begin_index, + end_index=end_index, + do_debug=debug, + ) + else: + _log.error(f"{modality} is not yet implemented for {benchmark}") + + else: + _log.error(f"{benchmark} is not yet implemented") + + +def evaluate( + modality: EvaluationModality, + benchmark: BenchMarkNames, + idir: Path, + odir: Path, + split: str = "test", +): + r"""""" + if not os.path.exists(idir): + _log.error(f"Benchmark directory not found: {idir}") + + os.makedirs(odir, exist_ok=True) + + # Save the evaluation + save_fn = odir / f"evaluation_{benchmark.value}_{modality.value}.json" + + if modality == EvaluationModality.END2END: + _log.error("not supported") + + elif modality == EvaluationModality.LAYOUT: + layout_evaluator = LayoutEvaluator() + layout_evaluation = layout_evaluator(idir, split=split) + + with open(save_fn, "w") as fd: + json.dump(layout_evaluation.model_dump(), fd, indent=2, sort_keys=True) + + elif modality == EvaluationModality.TABLE_STRUCTURE: + table_evaluator = TableEvaluator() + table_evaluation = table_evaluator(idir, split=split) + + with open(save_fn, "w") as fd: + json.dump(table_evaluation.model_dump(), fd, indent=2, sort_keys=True) + + elif modality == EvaluationModality.READING_ORDER: + readingorder_evaluator = ReadingOrderEvaluator() + + readingorder_evaluation = readingorder_evaluator(idir, split=split) + + with open(save_fn, "w") as fd: + json.dump( + readingorder_evaluation.model_dump(), + fd, + indent=2, + sort_keys=True, + ensure_ascii=False, + ) + + elif modality == EvaluationModality.MARKDOWN_TEXT: + md_evaluator = MarkdownTextEvaluator() + md_evaluation = md_evaluator(idir, split=split) + + with open(save_fn, "w") as fd: + json.dump( + md_evaluation.model_dump(), + fd, + indent=2, + sort_keys=True, + ensure_ascii=False, + ) + + elif modality == EvaluationModality.BBOXES_TEXT: + bbox_evaluator = BboxTextEvaluator() + bbox_evaluation = bbox_evaluator(idir, split=split) + + with open(save_fn, "w") as fd: + json.dump( + bbox_evaluation.model_dump(), + fd, + indent=2, + sort_keys=True, + ensure_ascii=False, + ) + + elif modality == EvaluationModality.CODE_TRANSCRIPTION: + pass + + _log.info("The evaluation has been saved in '%s'", save_fn) + + +def visualise( + modality: EvaluationModality, + benchmark: BenchMarkNames, + idir: Path, + odir: Path, + split: str = "test", +): + + metrics_filename = odir / f"evaluation_{benchmark.value}_{modality.value}.json" + + if modality == EvaluationModality.END2END: + pass + + elif modality == EvaluationModality.LAYOUT: + with open(metrics_filename, "r") as fd: + layout_evaluation = DatasetLayoutEvaluation.parse_file(metrics_filename) + + # Save layout statistics for mAP + log_filename, _ = log_and_save_stats( + odir, benchmark, modality, "mAP_0.5_0.95", layout_evaluation.image_mAP_stats + ) + + # Append to layout statistics, the AP per classes + data, headers = layout_evaluation.to_table() + content = "\n\n\nAP[0.5:0.05:0.95] per class (reported as %):\n\n" + content += tabulate(data, headers=headers, tablefmt="github") + + # Append to layout statistics, the mAP + content += "\n\nTotal mAP[0.5:0.05:0.95] (reported as %): {:.2f}".format( + 100.0 * layout_evaluation.mAP + ) + _log.info(content) + with open(log_filename, "a") as fd: + fd.write(content) + + elif modality == EvaluationModality.TABLE_STRUCTURE: + with open(metrics_filename, "r") as fd: + table_evaluation = DatasetTableEvaluation.parse_file(metrics_filename) + + figname = ( + odir / f"evaluation_{benchmark.value}_{modality.value}-delta_row_col.png" + ) + table_evaluation.save_histogram_delta_row_col(figname=figname) + + # TEDS struct-with-text + log_and_save_stats( + odir, benchmark, modality, "TEDS_struct-with-text", table_evaluation.TEDS + ) + + # TEDS struct-only + log_and_save_stats( + odir, benchmark, modality, "TEDS_struct-only", table_evaluation.TEDS_struct + ) + + elif modality == EvaluationModality.READING_ORDER: + with open(metrics_filename, "r") as fd: + ro_evaluation = DatasetReadingOrderEvaluation.parse_file(metrics_filename) + # ARD + log_and_save_stats( + odir, benchmark, modality, "ARD_norm", ro_evaluation.ard_stats + ) + + # Weighted ARD + log_and_save_stats( + odir, benchmark, modality, "weighted_ARD", ro_evaluation.w_ard_stats + ) + + # Generate visualizations of the reading order across the GT and the prediction + ro_visualizer = ReadingOrderVisualizer() + ro_visualizer(idir, metrics_filename, odir, split=split) + + elif modality == EvaluationModality.MARKDOWN_TEXT: + with open(metrics_filename, "r") as fd: + md_evaluation = DatasetMarkdownEvaluation.parse_file(metrics_filename) + # Log stats for all metrics in the same file + log_filename = odir / f"evaluation_{benchmark.value}_{modality.value}.txt" + with open(log_filename, "w") as fd: + fd.write(f"{benchmark.value} size: {len(md_evaluation.evaluations)}\n\n") + + log_and_save_stats( + odir, + benchmark, + modality, + "BLEU", + md_evaluation.bleu_stats, + log_filename=log_filename, + ) + log_and_save_stats( + odir, + benchmark, + modality, + "F1", + md_evaluation.f1_score_stats, + log_filename=log_filename, + ) + log_and_save_stats( + odir, + benchmark, + modality, + "precision", + md_evaluation.precision_stats, + log_filename=log_filename, + ) + log_and_save_stats( + odir, + benchmark, + modality, + "recall", + md_evaluation.recall_stats, + log_filename=log_filename, + ) + log_and_save_stats( + odir, + benchmark, + modality, + "edit_distance", + md_evaluation.edit_distance_stats, + log_filename=log_filename, + ) + log_and_save_stats( + odir, + benchmark, + modality, + "meteor", + md_evaluation.meteor_stats, + log_filename=log_filename, + ) + + elif modality == EvaluationModality.CODE_TRANSCRIPTION: + pass + + elif modality == EvaluationModality.MATH_TRANSCRIPTION: + pass + + elif modality == EvaluationModality.CAPTIONING: + pass + + +@app.command(no_args_is_help=True) +def main( + task: Annotated[ + EvaluationTask, + typer.Option( + ..., # EvaluationTask.CREATE, + "-t", # Short name + "--task", # Long name + help="Evaluation task", + ), + ], + modality: Annotated[ + EvaluationModality, + typer.Option( + ..., # EvaluationModality.TABLE_STRUCTURE, + "-m", # Short name + "--modality", # Long name + help="Evaluation modality", + ), + ], + benchmark: Annotated[ + BenchMarkNames, + typer.Option( + ..., # BenchMarkNames.DPBENCH, + "-b", # Short name + "--benchmark", # Long name + help="Benchmark name", + ), + ], + odir: Annotated[ + Path, + typer.Option( + ..., + "-o", # Short name + "--output-dir", # Long name + help="Output directory", + ), + ], + idir: Annotated[ + Optional[Path], + typer.Option( + ..., + "-i", # Short name + "--input-dir", # Long name + help="Input directory", + ), + ] = None, + converter_type: Annotated[ + ConverterTypes, + typer.Option( + ..., + "-c", # Short name + "--converter_type", # Long name + help="Type of document converter", + ), + ] = ConverterTypes.DOCLING, + split: Annotated[ + str, + typer.Option( + ..., + "-s", # Short name + "--split", # Long name + help="Dataset split", + ), + ] = "test", + artifacts_path: Annotated[ + Optional[Path], + typer.Option( + ..., + "-a", # Short name + "--artifacts-path", # Long name + help="Load artifacts from local path", + ), + ] = None, + begin_index: Annotated[ + int, + typer.Option( + ..., + "-bi", # Short name + "--begin_index", # Long name + help="Begin converting from the given sample index (inclusive). Zero based.", + ), + ] = 0, + end_index: Annotated[ + int, + typer.Option( + ..., + "-ei", # Short name + "--end_index", # Long name + help="End converting to the given sample index (exclusive). Zero based. -1 indicates to take all", + ), + ] = 1000, + debug: Annotated[ + bool, + typer.Option( + ..., + help="Enable debugging", + ), + ] = False, +): + # Set the log level + log_format = "%(asctime)s - %(levelname)s - %(message)s" + # if debug: + # logging.basicConfig(level=logging.DEBUG, format=log_format) + # else: + # logging.basicConfig(level=logging.INFO, format=log_format) + logging.basicConfig(level=logging.INFO, format=log_format) + + # Dispatch the command + if task == EvaluationTask.CREATE: + create( + modality, + benchmark, + odir, + idir=idir, + converter_type=converter_type, + artifacts_path=artifacts_path, + split=split, + begin_index=begin_index, + end_index=end_index, + debug=debug, + ) + + elif task == EvaluationTask.EVALUATE: + assert idir is not None + evaluate(modality, benchmark, idir, odir, split) + + elif task == EvaluationTask.VISUALIZE: + assert idir is not None + visualise(modality, benchmark, idir, odir, split) + + else: + _log.error("Unsupported command: '%s'", task.value) + + +if __name__ == "__main__": + app() diff --git a/docs/examples/benchmark_doclaynet_v1.py b/docs/examples/benchmark_doclaynet_v1.py index 7eda76b7..13abcd20 100644 --- a/docs/examples/benchmark_doclaynet_v1.py +++ b/docs/examples/benchmark_doclaynet_v1.py @@ -2,9 +2,9 @@ import os from pathlib import Path -from docling_eval.cli.main import evaluate, visualise from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.doclaynet_v1.create import create_dlnv1_e2e_dataset +from docling_eval.legacy.main import evaluate, visualise # Configure logging logging.basicConfig( diff --git a/docs/examples/benchmark_doclaynet_v2.py b/docs/examples/benchmark_doclaynet_v2.py index a3d90c60..6ef5105a 100644 --- a/docs/examples/benchmark_doclaynet_v2.py +++ b/docs/examples/benchmark_doclaynet_v2.py @@ -4,9 +4,9 @@ from tabulate import tabulate # type: ignore -from docling_eval.cli.main import evaluate, visualise from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.doclaynet_v2.create import create_dlnv2_e2e_dataset +from docling_eval.legacy.main import evaluate, visualise # Configure logging logging.basicConfig( diff --git a/docs/examples/benchmark_dpbench.py b/docs/examples/benchmark_dpbench.py index c3155ca2..8b0e5259 100644 --- a/docs/examples/benchmark_dpbench.py +++ b/docs/examples/benchmark_dpbench.py @@ -4,12 +4,12 @@ from huggingface_hub import snapshot_download -from docling_eval.cli.main import evaluate, visualise from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality from docling_eval.legacy.dpbench.create import ( create_dpbench_e2e_dataset, create_dpbench_tableformer_dataset, ) +from docling_eval.legacy.main import evaluate, visualise # Configure logging logging.basicConfig( diff --git a/docs/examples/benchmark_omnidocbench.py b/docs/examples/benchmark_omnidocbench.py index 00e51c3f..5ebf911c 100644 --- a/docs/examples/benchmark_omnidocbench.py +++ b/docs/examples/benchmark_omnidocbench.py @@ -4,8 +4,8 @@ from huggingface_hub import snapshot_download -from docling_eval.cli.main import evaluate, visualise from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality +from docling_eval.legacy.main import evaluate, visualise from docling_eval.legacy.omnidocbench.create import ( create_omnidocbench_e2e_dataset, create_omnidocbench_tableformer_dataset, diff --git a/docs/examples/benchmark_tableformer_fintabnet.py b/docs/examples/benchmark_tableformer_fintabnet.py index d7c6fc4a..7dc825ea 100644 --- a/docs/examples/benchmark_tableformer_fintabnet.py +++ b/docs/examples/benchmark_tableformer_fintabnet.py @@ -2,8 +2,8 @@ import os from pathlib import Path -from docling_eval.cli.main import evaluate, visualise from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality +from docling_eval.legacy.main import evaluate, visualise from docling_eval.legacy.tableformer_huggingface_otsl.create import ( create_fintabnet_tableformer_dataset, ) diff --git a/docs/examples/benchmark_tableformer_p1m.py b/docs/examples/benchmark_tableformer_p1m.py index 8b5baa8b..065a7961 100644 --- a/docs/examples/benchmark_tableformer_p1m.py +++ b/docs/examples/benchmark_tableformer_p1m.py @@ -2,8 +2,8 @@ import os from pathlib import Path -from docling_eval.cli.main import evaluate, visualise from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality +from docling_eval.legacy.main import evaluate, visualise from docling_eval.legacy.tableformer_huggingface_otsl.create import ( create_p1m_tableformer_dataset, ) diff --git a/docs/examples/benchmark_tableformer_pubtabnet.py b/docs/examples/benchmark_tableformer_pubtabnet.py index 7bb28aa5..04ae3460 100644 --- a/docs/examples/benchmark_tableformer_pubtabnet.py +++ b/docs/examples/benchmark_tableformer_pubtabnet.py @@ -2,8 +2,8 @@ import os from pathlib import Path -from docling_eval.cli.main import evaluate, visualise from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality +from docling_eval.legacy.main import evaluate, visualise from docling_eval.legacy.tableformer_huggingface_otsl.create import ( create_pubtabnet_tableformer_dataset, ) diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 35570c5d..ab5f594b 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -12,7 +12,6 @@ from docling.document_converter import PdfFormatOption from docling.models.factories import get_ocr_factory -from docling_eval.cli.main import evaluate, visualise from docling_eval.datamodels.types import ( BenchMarkNames, EvaluationModality, @@ -31,6 +30,7 @@ PubTabNetDatasetBuilder, ) from docling_eval.dataset_builders.xfund_builder import XFUNDDatasetBuilder +from docling_eval.legacy.main import evaluate, visualise from docling_eval.prediction_providers.docling_provider import DoclingPredictionProvider from docling_eval.prediction_providers.file_provider import FilePredictionProvider from docling_eval.prediction_providers.tableformer_provider import ( @@ -392,7 +392,7 @@ def test_run_doclaynet_v2_e2e(): docling_provider = create_docling_prediction_provider(page_image_scale=2.0) dataset_layout = DocLayNetV2DatasetBuilder( - dataset_path=Path("/path/to/doclaynet_v2_benchmark"), + dataset_source=Path("/path/to/doclaynet_v2_benchmark"), target=target_path / "gt_dataset", end_index=5, ) From 025fb589d8e9b0a9299602d2b8612a820b317cef Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Fri, 28 Mar 2025 16:31:44 +0100 Subject: [PATCH 53/81] Cleanup Signed-off-by: Christoph Auer --- docling_eval/cli/main.py | 7 +------ docling_eval/evaluators/markdown_text_evaluator.py | 2 +- docling_eval/legacy/main.py | 1 - 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py index 74945910..9243466e 100644 --- a/docling_eval/cli/main.py +++ b/docling_eval/cli/main.py @@ -3,18 +3,13 @@ import os from enum import Enum from pathlib import Path -from typing import Annotated, Dict, List, Optional, Tuple +from typing import Annotated, Optional, Tuple import typer -from docling.datamodel.base_models import InputFormat -from docling.datamodel.pipeline_options import EasyOcrOptions, TableFormerMode -from docling.document_converter import PdfFormatOption -from docling.models.factories import get_ocr_factory from tabulate import tabulate # type: ignore from docling_eval.datamodels.types import ( BenchMarkNames, - ConverterTypes, EvaluationModality, PredictionFormats, ) diff --git a/docling_eval/evaluators/markdown_text_evaluator.py b/docling_eval/evaluators/markdown_text_evaluator.py index dabb110a..e0dc6e7c 100644 --- a/docling_eval/evaluators/markdown_text_evaluator.py +++ b/docling_eval/evaluators/markdown_text_evaluator.py @@ -1,6 +1,6 @@ import logging from pathlib import Path -from typing import Any, Dict, List, Optional, Set, Union +from typing import Any, Dict, List, Optional, Set import evaluate import nltk diff --git a/docling_eval/legacy/main.py b/docling_eval/legacy/main.py index b3be2bb6..dd9e01ee 100644 --- a/docling_eval/legacy/main.py +++ b/docling_eval/legacy/main.py @@ -13,7 +13,6 @@ ConverterTypes, EvaluationModality, ) -from docling_eval.dataset_builders.dpbench_builder import DPBenchDatasetBuilder from docling_eval.evaluators.base_readingorder_evaluator import ( DatasetReadingOrderEvaluation, ReadingOrderVisualizer, From 791ff648a68512990899a7a83838c79e3c8950fe Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Fri, 28 Mar 2025 16:38:44 +0100 Subject: [PATCH 54/81] Rename CLI Signed-off-by: Christoph Auer --- docling_eval/cli/main.py | 24 ++++++++++++++++++++++++ pyproject.toml | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py index 9243466e..38c540d0 100644 --- a/docling_eval/cli/main.py +++ b/docling_eval/cli/main.py @@ -6,6 +6,10 @@ from typing import Annotated, Optional, Tuple import typer +from docling.datamodel.base_models import InputFormat +from docling.datamodel.pipeline_options import PdfPipelineOptions +from docling.document_converter import PdfFormatOption +from docling.models.factories import get_ocr_factory from tabulate import tabulate # type: ignore from docling_eval.datamodels.types import ( @@ -178,7 +182,27 @@ def get_prediction_provider( ): """Get the appropriate prediction provider with default settings.""" if provider_type == PredictionProviderType.DOCLING: + ocr_factory = get_ocr_factory() + + ocr_options: OcrOptions = ocr_factory.create_options( # type: ignore + kind="easyocr", + ) + + pipeline_options = PdfPipelineOptions( + do_ocr=True, + ocr_options=ocr_options, + do_table_structure=True, + ) + + pipeline_options.images_scale = 2.0 + pipeline_options.generate_page_images = True + pipeline_options.generate_picture_images = True + return DoclingPredictionProvider( + format_options={ + InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options), + InputFormat.IMAGE: PdfFormatOption(pipeline_options=pipeline_options), + }, do_visualization=True, ignore_missing_predictions=True, ) diff --git a/pyproject.toml b/pyproject.toml index 750f1d1b..4cc1be6d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -64,7 +64,7 @@ types-openpyxl = "^3.1.5.20241114" xmltodict = "^0.14.2" [tool.poetry.scripts] -evaluate = "docling_eval.cli.main:app" +docling_eval = "docling_eval.cli.main:app" [build-system] requires = ["poetry-core"] From 622a541fbe0aa0b3e05129d08bd09f9583cc99a4 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Mon, 31 Mar 2025 13:21:34 +0200 Subject: [PATCH 55/81] Update all README with new commands. Signed-off-by: Christoph Auer --- README.md | 39 +++++------- docs/DP-Bench_benchmarks.md | 107 ++++++++++++++++---------------- docs/DocLayNetv1_benchmarks.md | 63 +++++++++++-------- docs/FinTabNet_benchmarks.md | 35 ++++++----- docs/OmniDocBench_benchmarks.md | 102 +++++++++++++++--------------- docs/P1M_benchmarks.md | 35 ++++++----- docs/PubTabNet_benchmarks.md | 37 ++++++----- tests/test_dataset_builder.py | 3 +- 8 files changed, 218 insertions(+), 203 deletions(-) diff --git a/README.md b/README.md index 3b1d09f6..7716b31e 100644 --- a/README.md +++ b/README.md @@ -19,28 +19,23 @@ Evaluate [Docling](https://github.com/DS4SD/docling) on various datasets. Evaluate docling on various datasets. You can use the cli -```sh -docling-eval % poetry run evaluate --help - - Usage: python -m docling_eval.cli.main [OPTIONS] - -╭─ Options ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ * --task -t [create|evaluate|visualize] Evaluation task [default: None] [required] │ -│ * --modality -m [end-to-end|layout|table_structure|code_transcription|math_transcription|reading_order|markdown_text|ca Evaluation modality [default: None] [required] │ -│ ptioning|bboxes_text] │ -│ * --benchmark -b [DPBench|OmniDocBench|WordScape|PubLayNet|DocLayNetV1|DocLayNetV2|FUNSD|Pub1M|PubTabNet|FinTabNet|WikiT Benchmark name [default: None] [required] │ -│ abNet] │ -│ * --output-dir -o PATH Output directory [default: None] [required] │ -│ --input-dir -i PATH Input directory [default: None] │ -│ --converter_type -c [Docling|SmolDocling] Type of document converter [default: Docling] │ -│ --split -s TEXT Dataset split [default: test] │ -│ --artifacts-path -a PATH Load artifacts from local path [default: None] │ -│ --begin_index -bi INTEGER Begin converting from the given sample index (inclusive). Zero based. [default: 0] │ -│ --end_index -ei INTEGER End converting to the given sample index (exclusive). Zero based. -1 indicates to take all │ -│ [default: 1000] │ -│ --debug --no-debug Enable debugging [default: no-debug] │ -│ --help Show this message and exit. │ -╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +```shell +terminal %> poetry run docling_eval --help + + Usage: docling_eval [OPTIONS] COMMAND [ARGS]... + + Docling Evaluation CLI for benchmarking document processing tasks. + +╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ --help Show this message and exit. │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ create Create both ground truth and evaluation datasets in one step. │ +│ create-eval Create evaluation dataset from existing ground truth. │ +│ create-gt Create ground truth dataset only. │ +│ evaluate Evaluate predictions against ground truth. │ +│ visualize Visualize evaluation results. │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` diff --git a/docs/DP-Bench_benchmarks.md b/docs/DP-Bench_benchmarks.md index 3eafeee5..79e84649 100644 --- a/docs/DP-Bench_benchmarks.md +++ b/docs/DP-Bench_benchmarks.md @@ -2,27 +2,36 @@ [DP-Bench on HuggingFace](https://huggingface.co/datasets/upstage/dp-bench) -Create and evaluate DP-Bench using a single command: +Create DPBench evaluation datasets: ```sh -poetry run python docs/examples/benchmark_dpbench.py +# Make the ground-truth +docling_eval create-gt --benchmark DPBench --output-dir ./benchmarks/DPBench/ + +# Make predictions for different modalities. +docling_eval create-eval \ + --modality end-to-end \ + --benchmark DPBench \ + --output-dir ./benchmarks/DPBench/ \ + --prediction-provider docling # use full-document predictions from docling + +docling_eval create-eval \ + --modality table_structure \ + --benchmark DPBench \ + --output-dir ./benchmarks/DPBench/ \ + --prediction-provider tableformer # use tableformer predictions only ``` -This command downloads the DP-Bench dataset, runs the evaluations and produces the following files - - - ## Layout Evaluation Create the evaluation report: ```sh -poetry run evaluate \ - -t evaluate \ - -m layout \ - -b DPBench \ - -i benchmarks/DPBench-dataset/layout \ - -o benchmarks/DPBench-dataset/layout +docling_eval evaluate \ + --modality layout \ + --benchmark DPBench \ + --output-dir ./scratch/DPBench/ + ``` [Layout evaluation json](evaluations/DPBench/evaluation_DPBench_layout.json) @@ -30,12 +39,10 @@ poetry run evaluate \ Visualize the report: ```sh -poetry run evaluate \ - -t visualize \ - -m layout \ - -b DPBench \ - -i benchmarks/DPBench-dataset/layout \ - -o benchmarks/DPBench-dataset/layout +docling_eval visualize \ + --modality layout \ + --benchmark DPBench \ + --output-dir ./scratch/DPBench/ ``` [mAP[0.5:0.95] report](evaluations/DPBench/evaluation_DPBench_layout_mAP_0.5_0.95.txt) @@ -48,25 +55,24 @@ poetry run evaluate \ Create the evaluation report: ```sh -poetry run evaluate \ - -t evaluate \ - -m tableformer \ - -b DPBench \ - -i benchmarks/DPBench-dataset/tableformer \ - -o benchmarks/DPBench-dataset/tableformer +docling_eval evaluate \ + --modality table_structure \ + --benchmark DPBench \ + --output-dir ./scratch/DPBench/ ``` + Visualize the report: [Tableformer evaluation json](evaluations/DPBench/evaluation_DPBench_tableformer.json) +Visualize the report: + ```sh -poetry run evaluate \ - -t visualize \ - -m tableformer \ - -b DPBench \ - -i benchmarks/DPBench-dataset/tableformer \ - -o benchmarks/DPBench-dataset/tableformer +docling_eval visualize \ + --modality table_structure \ + --benchmark DPBench \ + --output-dir ./scratch/DPBench/ ``` ![TEDS plot](evaluations/DPBench/evaluation_DPBench_tableformer-delta_row_col.png) @@ -85,12 +91,10 @@ poetry run evaluate \ Create the evaluation report: ```sh -poetry run evaluate \ - -t evaluate \ - -m reading_order \ - -b DPBench \ - -i benchmarks/DPBench-dataset/layout \ - -o benchmarks/DPBench-dataset/layout +docling_eval evaluate \ + --modality reading_order \ + --benchmark DPBench \ + --output-dir ./scratch/DPBench/ ``` [Reading order json](evaluations/DPBench/evaluation_DPBench_reading_order.json) @@ -98,12 +102,10 @@ poetry run evaluate \ Visualize the report: ```sh -poetry run evaluate \ - -t visulize \ - -m reading_order \ - -b DPBench \ - -i benchmarks/DPBench-dataset/layout \ - -o benchmarks/DPBench-dataset/layout +docling_eval visualize \ + --modality reading_order \ + --benchmark DPBench \ + --output-dir ./scratch/DPBench/ ``` ![ARD plot](evaluations/DPBench/evaluation_DPBench_reading_order_ARD_norm.png) @@ -120,12 +122,10 @@ poetry run evaluate \ Create the evaluation report: ```sh -poetry run evaluate \ - -t evaluate \ - -m markdown_text \ - -b DPBench \ - -i benchmarks/DPBench-dataset/layout \ - -o benchmarks/DPBench-dataset/layout +docling_eval evaluate \ + --modality markdown_text \ + --benchmark DPBench \ + --output-dir ./scratch/DPBench/ ``` [Markdown text json](evaluations/DPBench/evaluation_DPBench_markdown_text.json) @@ -134,14 +134,13 @@ poetry run evaluate \ Visualize the report: ```sh -poetry run evaluate \ - -t visualize \ - -m markdown_text \ - -b DPBench \ - -i benchmarks/DPBench-dataset/layout \ - -o benchmarks/DPBench-dataset/layout +docling_eval visualize \ + --modality markdown_text \ + --benchmark DPBench \ + --output-dir ./scratch/DPBench/ ``` + [Markdown text report](evaluations/DPBench/evaluation_DPBench_markdown_text.txt) diff --git a/docs/DocLayNetv1_benchmarks.md b/docs/DocLayNetv1_benchmarks.md index 2d7628a0..67dfb595 100644 --- a/docs/DocLayNetv1_benchmarks.md +++ b/docs/DocLayNetv1_benchmarks.md @@ -1,23 +1,38 @@ # DocLayNet V1.2 Benchmarks -Create and evaluate DocLayNetv1.2 dataset using a single command. This command downloads from Huggingface the [DocLayNetv1.2_OTSL](https://huggingface.co/datasets/ds4sd/DocLayNet-v1.2) and runs the evaluations using the PDF Docling converter for all supported modalities. +Create and evaluate DocLayNetv1.2 datasets using the following commands. This downloads the [DocLayNetv1.2_OTSL](https://huggingface.co/datasets/ds4sd/DocLayNet-v1.2) from HuggingFace and runs the evaluations using the PDF Docling converter for all supported modalities. +Create evaluation datasets ```sh -poetry run python docs/examples/benchmark_doclaynet_v1.py +# Make the ground-truth +docling_eval create-gt --benchmark DocLayNetV1 --output-dir ./benchmarks/DocLayNetV1/ + +# Make predictions for different modalities. +docling_eval create-eval \ + --modality end-to-end \ + --benchmark DocLayNetV1 \ + --output-dir ./benchmarks/DocLayNetV1/ \ + --prediction-provider docling # use full-document predictions from docling + +docling_eval create-eval \ + --modality table_structure \ + --benchmark DPBench \ + --output-dir ./benchmarks/DocLayNetV1/ \ + --prediction-provider tableformer # use tableformer predictions only ``` + ## Layout Evaluation -Create the report: +Create the evaluation report: ```sh -poetry run evaluate \ - -t evaluate \ - -m layout \ - -b DocLayNetV1 \ - -i benchmarks/DocLayNetV1-dataset/layout \ - -o benchmarks/DocLayNetV1-dataset/layout +docling_eval evaluate \ + --modality layout \ + --benchmark DocLayNetV1 \ + --output-dir ./scratch/DocLayNetV1/ + ``` [Layout evaluation json](evaluations/DocLayNetV1/evaluation_DocLayNetV1_layout.json) @@ -25,12 +40,10 @@ poetry run evaluate \ Visualize the report: ```sh -poetry run evaluate \ - -t visualize \ - -m layout \ - -b DocLayNetV1 \ - -i benchmarks/DocLayNetV1-dataset/layout \ - -o benchmarks/DocLayNetV1-dataset/layout +docling_eval visualize \ + --modality layout \ + --benchmark DocLayNetV1 \ + --output-dir ./scratch/DocLayNetV1/ ``` [mAP[0.5:0.95] report](evaluations/DocLayNetV1/evaluation_DocLayNetV1_layout_mAP_0.5_0.95.txt) @@ -43,12 +56,10 @@ poetry run evaluate \ Create the report: ```sh -poetry run evaluate \ - -t evaluate \ - -m markdown_text \ - -b DocLayNetV1 \ - -i benchmarks/DocLayNetV1-dataset/layout \ - -o benchmarks/DocLayNetV1-dataset/layout +docling_eval evaluate \ + --modality markdown_text \ + --benchmark DocLayNetV1 \ + --output-dir ./scratch/DocLayNetV1/ ``` [Markdown text json](evaluations/DocLayNetV1/evaluation_DocLayNetV1_markdown_text.json) @@ -57,12 +68,10 @@ poetry run evaluate \ Visualize the report: ```sh -poetry run evaluate \ - -t visualize \ - -m markdown_text \ - -b DocLayNetV1 \ - -i benchmarks/DocLayNetV1-dataset/layout \ - -o benchmarks/DocLayNetV1-dataset/layout +docling_eval visualize \ + --modality markdown_text \ + --benchmark DocLayNetV1 \ + --output-dir ./scratch/DocLayNetV1/ ``` [Markdown text report](evaluations/DocLayNetV1/evaluation_DocLayNetV1_markdown_text.txt) diff --git a/docs/FinTabNet_benchmarks.md b/docs/FinTabNet_benchmarks.md index 055ba17e..afe7cbef 100644 --- a/docs/FinTabNet_benchmarks.md +++ b/docs/FinTabNet_benchmarks.md @@ -1,22 +1,29 @@ # FinTabNet Benchmarks -Create and evaluate FinTabNet dataset using a single command. This command downloads from Huggingface the [FinTabNet_OTSL dataset](https://huggingface.co/datasets/ds4sd/FinTabNet_OTSL)) and runs the evaluations for tableformer using the first 1000 samples. +Create FinTabNet evaluation datasets. This downloads from Huggingface the [FinTabNet_OTSL dataset](https://huggingface.co/datasets/ds4sd/FinTabNet_OTSL)) and runs the evaluations for tableformer using the first 1000 samples. ```sh -poetry run python docs/examples/benchmark_tableformer_fintabnet.py +# Make the ground-truth +docling_eval create-gt --benchmark FinTabNet --output-dir ./benchmarks/FinTabNet/ + +# Make predictions for tables. +docling_eval create-eval \ + --modality table_structure \ + --benchmark DPBench \ + --output-dir ./benchmarks/FinTabNet/ \ + --end-index 1000 \ + --prediction-provider tableformer # use tableformer predictions only ``` -## Layout Evaluation +## Tableformer Evaluation Create the evaluation report: ```sh -poetry run evaluate \ - -t evaluate \ - -m tableformer \ - -b FinTabNet \ - -i benchmarks/FinTabNet-dataset/tableformer \ - -o benchmarks/FinTabNet-dataset/tableformer +docling_eval evaluate \ + --modality table_structure \ + --benchmark FinTabNet \ + --output-dir ./scratch/FinTabNet/ ``` [Tableformer evaluation json](evaluations/FinTabNet/evaluation_FinTabNet_tableformer.json) @@ -24,12 +31,10 @@ poetry run evaluate \ Visualize the report: ```sh -poetry run evaluate \ - -t visualize \ - -m tableformer \ - -b FinTabNet \ - -i benchmarks/FinTabNet-dataset/tableformer \ - -o benchmarks/FinTabNet-dataset/tableformer +docling_eval visualize \ + --modality table_structure \ + --benchmark FinTabNet \ + --output-dir ./scratch/FinTabNet/ ``` ![TEDS plot](evaluations/FinTabNet/evaluation_FinTabNet_tableformer-delta_row_col.png) diff --git a/docs/OmniDocBench_benchmarks.md b/docs/OmniDocBench_benchmarks.md index 6dee4c2e..0a9982ad 100644 --- a/docs/OmniDocBench_benchmarks.md +++ b/docs/OmniDocBench_benchmarks.md @@ -2,26 +2,36 @@ [OmniDocBench on HuggingFace](https://huggingface.co/datasets/opendatalab/OmniDocBench) -Create and evaluate OmniDocBench using a single command: +Create OmniDocBench evaluation datasets: ```sh -poetry run python docs/examples/benchmark_omnidocbench.py +# Make the ground-truth +docling_eval create-gt --benchmark OmniDocBench --output-dir ./benchmarks/OmniDocBench/ + +# Make predictions for different modalities. +docling_eval create-eval \ + --modality end-to-end \ + --benchmark OmniDocBench \ + --output-dir ./benchmarks/OmniDocBench/ \ + --prediction-provider docling # use full-document predictions from docling + +docling_eval create-eval \ + --modality table_structure \ + --benchmark DPBench \ + --output-dir ./benchmarks/OmniDocBench/ \ + --prediction-provider tableformer # use tableformer predictions only ``` -This command downloads runs the evaluations and produces the following files: - - ## Layout Evaluation Create the evaluation report: ```sh -poetry run evaluate \ - -t evaluate \ - -m layout \ - -b OmniDocBench \ - -i benchmarks/OmniDocBench-dataset/layout \ - -o benchmarks/OmniDocBench-dataset/layout +docling_eval evaluate \ + --modality layout \ + --benchmark OmniDocBench \ + --output-dir ./scratch/OmniDocBench/ + ``` [Layout evaluation json](evaluations/OmniDocBench/evaluation_OmniDocBench_layout.json) @@ -29,12 +39,10 @@ poetry run evaluate \ Visualize the report: ```sh -poetry run evaluate \ - -t visualize \ - -m layout \ - -b OmniDocBench \ - -i benchmarks/OmniDocBench-dataset/layout \ - -o benchmarks/OmniDocBench-dataset/layout +docling_eval visualize \ + --modality layout \ + --benchmark OmniDocBench \ + --output-dir ./scratch/OmniDocBench/ ``` [mAP[0.5:0.95] report](evaluations/OmniDocBench/evaluation_OmniDocBench_layout_mAP_0.5_0.95.txt) @@ -47,12 +55,10 @@ poetry run evaluate \ Create the evaluation report: ```sh -poetry run evaluate \ - -t evaluate \ - -m tableformer \ - -b OmniDocBench \ - -i benchmarks/OmniDocBench-dataset/tableformer \ - -o benchmarks/OmniDocBench-dataset/tableformer +docling_eval evaluate \ + --modality table_structure \ + --benchmark OmniDocBench \ + --output-dir ./scratch/OmniDocBench/ ``` [Tableformer evaluation json](evaluations/OmniDocBench/evaluation_OmniDocBench_tableformer.json) @@ -61,12 +67,10 @@ poetry run evaluate \ Visualize the report: ```sh -poetry run evaluate \ - -t visualize \ - -m tableformer \ - -b OmniDocBench \ - -i benchmarks/OmniDocBench-dataset/tableformer \ - -o benchmarks/OmniDocBench-dataset/tableformer +docling_eval visualize \ + --modality table_structure \ + --benchmark OmniDocBench \ + --output-dir ./scratch/OmniDocBench/ ``` ![TEDS plot](evaluations/OmniDocBench/evaluation_OmniDocBench_tableformer-delta_row_col.png) @@ -85,12 +89,10 @@ poetry run evaluate \ Create the evaluation report: ```sh -poetry run evaluate \ - -t evaluate \ - -m reading_order \ - -b OmniDocBench \ - -i benchmarks/OmniDocBench-dataset/layout \ - -o benchmarks/OmniDocBench-dataset/layout +docling_eval evaluate \ + --modality reading_order \ + --benchmark OmniDocBench \ + --output-dir ./scratch/OmniDocBench/ ``` [Reading order json](evaluations/OmniDocBench/evaluation_OmniDocBench_reading_order.json) @@ -99,12 +101,10 @@ poetry run evaluate \ Visualize the report: ```sh -poetry run evaluate \ - -t visualize \ - -m reading_order \ - -b OmniDocBench \ - -i benchmarks/OmniDocBench-dataset/layout \ - -o benchmarks/OmniDocBench-dataset/layout +docling_eval visualize \ + --modality reading_order \ + --benchmark OmniDocBench \ + --output-dir ./scratch/OmniDocBench/ ``` [ARD report](evaluations/OmniDocBench/evaluation_OmniDocBench_reading_order_ARD_norm.txt) @@ -121,12 +121,10 @@ poetry run evaluate \ Create the evaluation report: ```sh -poetry run evaluate \ - -t evaluate \ - -m markdown_text \ - -b OmniDocBench \ - -i benchmarks/OmniDocBench-dataset/layout \ - -o benchmarks/OmniDocBench-dataset/layout +docling_eval evaluate \ + --modality markdown_text \ + --benchmark OmniDocBench \ + --output-dir ./scratch/OmniDocBench/ ``` [Markdown text json](evaluations/OmniDocBench/evaluation_OmniDocBench_markdown_text.json) @@ -135,12 +133,10 @@ poetry run evaluate \ Visualize the report: ```sh -poetry run evaluate \ - -t visualize \ - -m markdown_text \ - -b OmniDocBench \ - -i benchmarks/OmniDocBench-dataset/layout \ - -o benchmarks/OmniDocBench-dataset/layout +docling_eval visualize \ + --modality markdown_text \ + --benchmark OmniDocBench \ + --output-dir ./scratch/OmniDocBench/ ``` [Markdown text report](evaluations/OmniDocBench/evaluation_OmniDocBench_markdown_text.txt) diff --git a/docs/P1M_benchmarks.md b/docs/P1M_benchmarks.md index 840927de..bf3022f4 100644 --- a/docs/P1M_benchmarks.md +++ b/docs/P1M_benchmarks.md @@ -1,22 +1,29 @@ # Pub1M Benchmarks -Create and evaluate Pub1M dataset using a single command. This command downloads from Huggingface the [Pub1M_OTSL](https://huggingface.co/datasets/ds4sd/Pub1M_OTSL) and runs the evaluations for TableFormer using the first 1000 samples. +Create Pub1M evaluation datasets. This downloads from Huggingface the [Pub1M_OTSL](https://huggingface.co/datasets/ds4sd/Pub1M_OTSL) and runs the evaluations for TableFormer using the first 1000 samples. ```sh -poetry run python docs/examples/benchmark_p1m.py +# Make the ground-truth +docling_eval create-gt --benchmark Pub1M --output-dir ./benchmarks/Pub1M/ + +# Make predictions for tables. +docling_eval create-eval \ + --modality table_structure \ + --benchmark DPBench \ + --output-dir ./benchmarks/Pub1M/ \ + --end-index 1000 \ + --prediction-provider tableformer # use tableformer predictions only ``` -## Layout Evaluation +## Tableformer Evaluation Create the evaluation report: ```sh -poetry run evaluate \ - -t evaluate \ - -m tableformer \ - -b Pub1M \ - -i benchmarks/Pub1M-dataset/tableformer \ - -o benchmarks/Pub1M-dataset/tableformer +docling_eval evaluate \ + --modality table_structure \ + --benchmark Pub1M \ + --output-dir ./scratch/Pub1M/ ``` [Tableformer evaluation json](evaluations/Pub1M/evaluation_Pub1M_tableformer.json) @@ -24,12 +31,10 @@ poetry run evaluate \ Visualize the report: ```sh -poetry run evaluate \ - -t visualize \ - -m tableformer \ - -b Pub1M \ - -i benchmarks/Pub1M-dataset/tableformer \ - -o benchmarks/Pub1M-dataset/tableformer +docling_eval visualize \ + --modality table_structure \ + --benchmark Pub1M \ + --output-dir ./scratch/Pub1M/ ``` ![TEDS plot](evaluations/Pub1M/evaluation_Pub1M_tableformer-delta_row_col.png) diff --git a/docs/PubTabNet_benchmarks.md b/docs/PubTabNet_benchmarks.md index 171a0328..d0ee17c8 100644 --- a/docs/PubTabNet_benchmarks.md +++ b/docs/PubTabNet_benchmarks.md @@ -1,22 +1,29 @@ -# Pub1M Benchmarks +# PubTabNet Benchmarks -Create and evaluate PubTabNet dataset using a single command. This command downloads from Huggingface the [PubTabNet_OTSL dataset](https://huggingface.co/datasets/ds4sd/Pubtabnet_OTSL) and runs the evaluations for TableFormer using the first 1000 samples. +Create PubTabNet evaluation datasets. This downloads from Huggingface the [PubTabNet_OTSL dataset](https://huggingface.co/datasets/ds4sd/Pubtabnet_OTSL) and runs the evaluations for TableFormer using the first 1000 samples. ```sh -poetry run python docs/examples/benchmark_pubtabnet.py +# Make the ground-truth +docling_eval create-gt --benchmark PubTabNet --output-dir ./benchmarks/PubTabNet/ + +# Make predictions for tables. +docling_eval create-eval \ + --modality table_structure \ + --benchmark DPBench \ + --output-dir ./benchmarks/PubTabNet/ \ + --end-index 1000 \ + --prediction-provider tableformer # use tableformer predictions only ``` -## Layout Evaluation +## Tableformer Evaluation Create the evaluation report: ```sh -poetry run evaluate \ - -t evaluate \ - -m tableformer \ - -b PubTabNet \ - -i legacy/PubTabNet-dataset/tableformer \ - -o legacy/PubTabNet-dataset/tableformer +docling_eval evaluate \ + --modality table_structure \ + --benchmark PubTabNet \ + --output-dir ./scratch/PubTabNet/ ``` [Tableformer evaluation json](evaluations/PubTabNet/evaluation_PubTabNet_tableformer.json) @@ -24,12 +31,10 @@ poetry run evaluate \ Visualize the report: ```sh -poetry run evaluate \ - -t visualize \ - -m tableformer \ - -b PubTabNet \ - -i legacy/PubTabNet-dataset/tableformer \ - -o legacy/PubTabNet-dataset/tableformer +docling_eval visualize \ + --modality table_structure \ + --benchmark PubTabNet \ + --output-dir ./scratch/PubTabNet/ ``` ![TEDS plot](evaluations/PubTabNet/evaluation_PubTabNet_tableformer-delta_row_col.png) diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index ab5f594b..d85e3fba 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -109,7 +109,8 @@ def test_run_dpbench_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) - ## Evaluate Reading order + ## Evaluate Reading order Date: Mon, 31 Mar 2025 13:31:15 +0200 Subject: [PATCH 56/81] Remove old examples Signed-off-by: Christoph Auer --- docs/CVAT_create_groundtruth.md | 3 +- docs/examples/benchmark_doclaynet_v1.py | 69 ---------- docs/examples/benchmark_doclaynet_v2.py | 72 ----------- docs/examples/benchmark_dpbench.py | 121 ------------------ docs/examples/benchmark_omnidocbench.py | 121 ------------------ .../benchmark_tableformer_fintabnet.py | 51 -------- docs/examples/benchmark_tableformer_p1m.py | 48 ------- .../benchmark_tableformer_pubtabnet.py | 51 -------- docs/examples/create_funsd.py | 28 ---- docs/examples/create_xfund.py | 28 ---- 10 files changed, 2 insertions(+), 590 deletions(-) delete mode 100644 docs/examples/benchmark_doclaynet_v1.py delete mode 100644 docs/examples/benchmark_doclaynet_v2.py delete mode 100644 docs/examples/benchmark_dpbench.py delete mode 100644 docs/examples/benchmark_omnidocbench.py delete mode 100644 docs/examples/benchmark_tableformer_fintabnet.py delete mode 100644 docs/examples/benchmark_tableformer_p1m.py delete mode 100644 docs/examples/benchmark_tableformer_pubtabnet.py delete mode 100644 docs/examples/create_funsd.py delete mode 100644 docs/examples/create_xfund.py diff --git a/docs/CVAT_create_groundtruth.md b/docs/CVAT_create_groundtruth.md index 8e63409e..f390aaf2 100644 --- a/docs/CVAT_create_groundtruth.md +++ b/docs/CVAT_create_groundtruth.md @@ -7,7 +7,8 @@ To start creating ground-truth, you first need to have a dataset in parquet form The first way is to use an existing dataset (eg dpbench), which has potentially pre-annotated tables, formulas, etc. Hence you can run the create script of that particular benchmark. ```sh -poetry run python docs/examples/benchmark_dpbench.py +# Make the ground-truth +docling_eval create-gt --benchmark DPBench --output-dir ./benchmarks/DPBench/ ``` Another way is to create it from PDF or PNG files. In this case, simply run the following scripts, diff --git a/docs/examples/benchmark_doclaynet_v1.py b/docs/examples/benchmark_doclaynet_v1.py deleted file mode 100644 index 13abcd20..00000000 --- a/docs/examples/benchmark_doclaynet_v1.py +++ /dev/null @@ -1,69 +0,0 @@ -import logging -import os -from pathlib import Path - -from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality -from docling_eval.legacy.doclaynet_v1.create import create_dlnv1_e2e_dataset -from docling_eval.legacy.main import evaluate, visualise - -# Configure logging -logging.basicConfig( - level=logging.INFO, # Set the logging level - format="%(asctime)s - %(levelname)s - %(message)s", -) - -log = logging.getLogger(__name__) - - -def main(): - odir = Path(f"./benchmarks/{BenchMarkNames.DOCLAYNETV1.value}-dataset") - odir_lay = Path(odir) / "layout" - split = "test" - - os.makedirs(odir, exist_ok=True) - os.makedirs(odir_lay, exist_ok=True) - - if True: - log.info("Create the end-to-end converted DocLayNetV1 dataset") - create_dlnv1_e2e_dataset( - name="ds4sd/DocLayNet-v1.2", - split=split, - output_dir=odir_lay, - do_viz=True, - ) - - # Layout - log.info("Evaluate the layout for the DocLayNet dataset") - evaluate( - modality=EvaluationModality.LAYOUT, - benchmark=BenchMarkNames.DOCLAYNETV1, - idir=odir_lay, - odir=odir_lay, - ) - log.info("Visualize the layout for the DocLayNet dataset") - visualise( - modality=EvaluationModality.LAYOUT, - benchmark=BenchMarkNames.DOCLAYNETV1, - idir=odir_lay, - odir=odir_lay, - ) - - # Markdown text - log.info("Evaluate the markdown text for the DocLayNet dataset") - evaluate( - modality=EvaluationModality.MARKDOWN_TEXT, - benchmark=BenchMarkNames.DOCLAYNETV1, - idir=odir_lay, - odir=odir_lay, - ) - log.info("Visualize the markdown text for the DocLayNet dataset") - visualise( - modality=EvaluationModality.MARKDOWN_TEXT, - benchmark=BenchMarkNames.DOCLAYNETV1, - idir=odir_lay, - odir=odir_lay, - ) - - -if __name__ == "__main__": - main() diff --git a/docs/examples/benchmark_doclaynet_v2.py b/docs/examples/benchmark_doclaynet_v2.py deleted file mode 100644 index 6ef5105a..00000000 --- a/docs/examples/benchmark_doclaynet_v2.py +++ /dev/null @@ -1,72 +0,0 @@ -import logging -import os -from pathlib import Path - -from tabulate import tabulate # type: ignore - -from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality -from docling_eval.legacy.doclaynet_v2.create import create_dlnv2_e2e_dataset -from docling_eval.legacy.main import evaluate, visualise - -# Configure logging -logging.basicConfig( - level=logging.INFO, # Set the logging level - format="%(asctime)s - %(levelname)s - %(message)s", -) - -log = logging.getLogger(__name__) - - -def main(): - idir = Path(f"./benchmarks/{BenchMarkNames.DOCLAYNETV2.value}-original") - odir = Path(f"./benchmarks/{BenchMarkNames.DOCLAYNETV2.value}-dataset") - odir_lay = Path(odir) / "layout" - split = "test" - - os.makedirs(odir, exist_ok=True) - - if True: - log.info("Create the end-to-end converted DocLayNetV2 dataset") - create_dlnv2_e2e_dataset( - input_dir=idir, - split=split, - do_viz=True, - output_dir=odir_lay, - max_items=1000, - ) - - # Layout - log.info("Evaluate the layout for the DocLayNet dataset") - evaluate( - modality=EvaluationModality.LAYOUT, - benchmark=BenchMarkNames.DOCLAYNETV2, - idir=odir_lay, - odir=odir_lay, - ) - log.info("Visualize the layout for the DocLayNet dataset") - visualise( - modality=EvaluationModality.LAYOUT, - benchmark=BenchMarkNames.DOCLAYNETV2, - idir=odir_lay, - odir=odir_lay, - ) - - # Markdown text - log.info("Evaluate the markdown text for the DocLayNet dataset") - evaluate( - modality=EvaluationModality.MARKDOWN_TEXT, - benchmark=BenchMarkNames.DOCLAYNETV2, - idir=odir_lay, - odir=odir_lay, - ) - log.info("Visualize the markdown text for the DocLayNet dataset") - visualise( - modality=EvaluationModality.MARKDOWN_TEXT, - benchmark=BenchMarkNames.DOCLAYNETV2, - idir=odir_lay, - odir=odir_lay, - ) - - -if __name__ == "__main__": - main() diff --git a/docs/examples/benchmark_dpbench.py b/docs/examples/benchmark_dpbench.py deleted file mode 100644 index 8b0e5259..00000000 --- a/docs/examples/benchmark_dpbench.py +++ /dev/null @@ -1,121 +0,0 @@ -import logging -import os -from pathlib import Path - -from huggingface_hub import snapshot_download - -from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality -from docling_eval.legacy.dpbench.create import ( - create_dpbench_e2e_dataset, - create_dpbench_tableformer_dataset, -) -from docling_eval.legacy.main import evaluate, visualise - -# Configure logging -logging.basicConfig( - level=logging.INFO, # Set the logging level - format="%(asctime)s - %(levelname)s - %(message)s", -) - -log = logging.getLogger(__name__) - - -def main(): - - idir = Path(f"./benchmarks/{BenchMarkNames.DPBENCH.value}-original") - - log.info("Download the DP-Bench dataset") - snapshot_download( - repo_id="upstage/dp-bench", - repo_type="dataset", - local_dir=idir, - ) - - odir = Path(f"./benchmarks/{BenchMarkNames.DPBENCH.value}-dataset") - - odir_lay = Path(odir) / "layout" - odir_tab = Path(odir) / "tableformer" - - for _ in [odir, odir_lay, odir_tab]: - os.makedirs(_, exist_ok=True) - - image_scale = 2.0 - - if True: - log.info("Create the end-to-end converted DP-Bench dataset") - create_dpbench_e2e_dataset( - dpbench_dir=idir, output_dir=odir_lay, image_scale=image_scale, do_viz=True - ) - - # Layout - log.info("Evaluate the layout for the DP-Bench dataset") - evaluate( - modality=EvaluationModality.LAYOUT, - benchmark=BenchMarkNames.DPBENCH, - idir=odir_lay, - odir=odir_lay, - ) - log.info("Visualize the layout for the DP-Bench dataset") - visualise( - modality=EvaluationModality.LAYOUT, - benchmark=BenchMarkNames.DPBENCH, - idir=odir_lay, - odir=odir_lay, - ) - - # Reading order - log.info("Evaluate the reading-order for the DP-Bench dataset") - evaluate( - modality=EvaluationModality.READING_ORDER, - benchmark=BenchMarkNames.DPBENCH, - idir=odir_lay, - odir=odir_lay, - ) - log.info("Visualize the reading-order for the DP-Bench dataset") - visualise( - modality=EvaluationModality.READING_ORDER, - benchmark=BenchMarkNames.DPBENCH, - idir=odir_lay, - odir=odir_lay, - ) - - # Markdown text - log.info("Evaluate the markdown text for the DP-Bench dataset") - evaluate( - modality=EvaluationModality.MARKDOWN_TEXT, - benchmark=BenchMarkNames.DPBENCH, - idir=odir_lay, - odir=odir_lay, - ) - log.info("Visualize the markdown text for the DP-Bench dataset") - visualise( - modality=EvaluationModality.MARKDOWN_TEXT, - benchmark=BenchMarkNames.DPBENCH, - idir=odir_lay, - odir=odir_lay, - ) - - if True: - log.info("Create the tableformer converted DP-Bench dataset") - create_dpbench_tableformer_dataset( - dpbench_dir=idir, output_dir=odir_tab, image_scale=image_scale - ) - - log.info("Evaluate the tableformer for the DP-Bench dataset") - evaluate( - modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.DPBENCH, - idir=odir_tab, - odir=odir_tab, - ) - log.info("Visualize the tableformer for the DP-Bench dataset") - visualise( - modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.DPBENCH, - idir=odir_tab, - odir=odir_tab, - ) - - -if __name__ == "__main__": - main() diff --git a/docs/examples/benchmark_omnidocbench.py b/docs/examples/benchmark_omnidocbench.py deleted file mode 100644 index 5ebf911c..00000000 --- a/docs/examples/benchmark_omnidocbench.py +++ /dev/null @@ -1,121 +0,0 @@ -import logging -import os -from pathlib import Path - -from huggingface_hub import snapshot_download - -from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality -from docling_eval.legacy.main import evaluate, visualise -from docling_eval.legacy.omnidocbench.create import ( - create_omnidocbench_e2e_dataset, - create_omnidocbench_tableformer_dataset, -) - -# Configure logging -logging.basicConfig( - level=logging.INFO, # Set the logging level - format="%(asctime)s - %(levelname)s - %(message)s", -) - -log = logging.getLogger(__name__) - - -def main(): - - idir = Path(f"./benchmarks/{BenchMarkNames.OMNIDOCBENCH.value}-original") - - snapshot_download( - repo_id="opendatalab/OmniDocBench", - repo_type="dataset", - local_dir=idir, - ) - - odir = Path(f"./benchmarks/{BenchMarkNames.OMNIDOCBENCH.value}-dataset") - - odir_lay = Path(odir) / "layout" - odir_tab = Path(odir) / "tableformer" - - for _ in [odir, odir_lay, odir_tab]: - os.makedirs(_, exist_ok=True) - - image_scale = 2.0 - - if True: - log.info("Create the end-to-end converted OmniDocBench dataset") - create_omnidocbench_e2e_dataset( - omnidocbench_dir=idir, - output_dir=odir_lay, - image_scale=image_scale, - do_viz=True, - ) - - # Layout - log.info("Evaluate the layout for the OmniDocBench dataset") - evaluate( - modality=EvaluationModality.LAYOUT, - benchmark=BenchMarkNames.OMNIDOCBENCH, - idir=odir_lay, - odir=odir_lay, - ) - visualise( - modality=EvaluationModality.LAYOUT, - benchmark=BenchMarkNames.OMNIDOCBENCH, - idir=odir_lay, - odir=odir_lay, - ) - - # Reading order - log.info("Evaluate the reading order for the OmniDocBench dataset") - evaluate( - modality=EvaluationModality.READING_ORDER, - benchmark=BenchMarkNames.OMNIDOCBENCH, - idir=odir_lay, - odir=odir_lay, - ) - visualise( - modality=EvaluationModality.READING_ORDER, - benchmark=BenchMarkNames.OMNIDOCBENCH, - idir=odir_lay, - odir=odir_lay, - ) - - # Markdown text - log.info("Evaluate the markdown text for the OmniDocBench dataset") - evaluate( - modality=EvaluationModality.MARKDOWN_TEXT, - benchmark=BenchMarkNames.OMNIDOCBENCH, - idir=odir_lay, - odir=odir_lay, - ) - log.info("Visualize the markdown text for the OmniDocBench dataset") - visualise( - modality=EvaluationModality.MARKDOWN_TEXT, - benchmark=BenchMarkNames.OMNIDOCBENCH, - idir=odir_lay, - odir=odir_lay, - ) - - if True: - log.info("Create the tableformer converted OmniDocBench dataset") - create_omnidocbench_tableformer_dataset( - omnidocbench_dir=idir, output_dir=odir_tab, image_scale=image_scale - ) - - log.info("Evaluate the tableformer for the OmniDocBench dataset") - evaluate( - modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.OMNIDOCBENCH, - idir=odir_tab, - odir=odir_tab, - ) - log.info("Visualize the tableformer for the OmniDocBench dataset") - visualise( - modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.OMNIDOCBENCH, - idir=odir_tab, - odir=odir_tab, - ) - - -if __name__ == "__main__": - main() diff --git a/docs/examples/benchmark_tableformer_fintabnet.py b/docs/examples/benchmark_tableformer_fintabnet.py deleted file mode 100644 index 7dc825ea..00000000 --- a/docs/examples/benchmark_tableformer_fintabnet.py +++ /dev/null @@ -1,51 +0,0 @@ -import logging -import os -from pathlib import Path - -from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality -from docling_eval.legacy.main import evaluate, visualise -from docling_eval.legacy.tableformer_huggingface_otsl.create import ( - create_fintabnet_tableformer_dataset, -) - -# Configure logging -logging.basicConfig( - level=logging.INFO, # Set the logging level - format="%(asctime)s - %(levelname)s - %(message)s", -) -log = logging.getLogger(__name__) - - -def main(): - odir = Path(f"./benchmarks/{BenchMarkNames.FINTABNET.value}-dataset") - - odir_tab = Path(odir) / "tableformer" - - for _ in [odir, odir_tab]: - os.makedirs(_, exist_ok=True) - - if True: - log.info("Create the tableformer converted FinTabNet dataset") - create_fintabnet_tableformer_dataset( - output_dir=odir_tab, end_index=1000, do_viz=True - ) - - log.info("Evaluate the tableformer for the FinTabNet dataset") - evaluate( - modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.FINTABNET, - idir=odir_tab, - odir=odir_tab, - ) - - log.info("Visualize the tableformer for the FinTabNet dataset") - visualise( - modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.FINTABNET, - idir=odir_tab, - odir=odir_tab, - ) - - -if __name__ == "__main__": - main() diff --git a/docs/examples/benchmark_tableformer_p1m.py b/docs/examples/benchmark_tableformer_p1m.py deleted file mode 100644 index 065a7961..00000000 --- a/docs/examples/benchmark_tableformer_p1m.py +++ /dev/null @@ -1,48 +0,0 @@ -import logging -import os -from pathlib import Path - -from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality -from docling_eval.legacy.main import evaluate, visualise -from docling_eval.legacy.tableformer_huggingface_otsl.create import ( - create_p1m_tableformer_dataset, -) - -# Configure logging -logging.basicConfig( - level=logging.INFO, # Set the logging level - format="%(asctime)s - %(levelname)s - %(message)s", -) -log = logging.getLogger(__name__) - - -def main(): - odir = Path(f"./benchmarks/{BenchMarkNames.PUB1M.value}-dataset") - odir_tab = Path(odir) / "tableformer" - - for _ in [odir, odir_tab]: - os.makedirs(_, exist_ok=True) - - if True: - log.info("Create the tableformer converted Pub1M dataset") - create_p1m_tableformer_dataset(output_dir=odir_tab, end_index=1000, do_viz=True) - - log.info("Evaluate the tableformer converted Pub1M dataset") - evaluate( - modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.PUB1M, - idir=odir_tab, - odir=odir_tab, - ) - - log.info("Visualize the tableformer converted Pub1M dataset") - visualise( - modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.PUB1M, - idir=odir_tab, - odir=odir_tab, - ) - - -if __name__ == "__main__": - main() diff --git a/docs/examples/benchmark_tableformer_pubtabnet.py b/docs/examples/benchmark_tableformer_pubtabnet.py deleted file mode 100644 index 04ae3460..00000000 --- a/docs/examples/benchmark_tableformer_pubtabnet.py +++ /dev/null @@ -1,51 +0,0 @@ -import logging -import os -from pathlib import Path - -from docling_eval.datamodels.types import BenchMarkNames, EvaluationModality -from docling_eval.legacy.main import evaluate, visualise -from docling_eval.legacy.tableformer_huggingface_otsl.create import ( - create_pubtabnet_tableformer_dataset, -) - -# Configure logging -logging.basicConfig( - level=logging.INFO, # Set the logging level - format="%(asctime)s - %(levelname)s - %(message)s", -) -log = logging.getLogger(__name__) - - -def main(): - odir = Path(f"./benchmarks/{BenchMarkNames.PUBTABNET.value}-dataset") - odir_tab = Path(odir) / "tableformer" - - for _ in [odir, odir_tab]: - os.makedirs(_, exist_ok=True) - - if True: - log.info("Create the tableformer converted PubTabNet dataset") - create_pubtabnet_tableformer_dataset( - output_dir=odir_tab, end_index=1000, do_viz=True - ) - - log.info("Evaluate the tableformer for the PubTabNet dataset") - evaluate( - modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.PUBTABNET, - idir=odir_tab, - odir=odir_tab, - split="val", - ) - log.info("Visualize the tableformer for the PubTabNet dataset") - visualise( - modality=EvaluationModality.TABLE_STRUCTURE, - benchmark=BenchMarkNames.PUBTABNET, - idir=odir_tab, - odir=odir_tab, - split="val", - ) - - -if __name__ == "__main__": - main() diff --git a/docs/examples/create_funsd.py b/docs/examples/create_funsd.py deleted file mode 100644 index e87cccf3..00000000 --- a/docs/examples/create_funsd.py +++ /dev/null @@ -1,28 +0,0 @@ -import logging -import os -from pathlib import Path - -from docling_eval.datamodels.types import BenchMarkNames -from docling_eval.legacy.funsd.create import create_funsd_dataset - -# Configure logging -logging.basicConfig( - level=logging.INFO, # Set the logging level - format="%(asctime)s - %(levelname)s - %(message)s", -) - -log = logging.getLogger(__name__) - - -def main(): - idir = Path(f"./benchmarks/{BenchMarkNames.FUNSD.value}-original") - odir = Path(f"./benchmarks/{BenchMarkNames.FUNSD.value}-dataset") - - os.makedirs(odir, exist_ok=True) - - log.info("Create the converted FUNSDF dataset") - create_funsd_dataset(input_dir=idir, output_dir=odir, splits=["train", "test"]) - - -if __name__ == "__main__": - main() diff --git a/docs/examples/create_xfund.py b/docs/examples/create_xfund.py deleted file mode 100644 index 99d934bf..00000000 --- a/docs/examples/create_xfund.py +++ /dev/null @@ -1,28 +0,0 @@ -import logging -import os -from pathlib import Path - -from docling_eval.datamodels.types import BenchMarkNames -from docling_eval.legacy.xfund.create import create_xfund_dataset - -# Configure logging -logging.basicConfig( - level=logging.INFO, # Set the logging level - format="%(asctime)s - %(levelname)s - %(message)s", -) - -log = logging.getLogger(__name__) - - -def main(): - idir = Path(f"./benchmarks/{BenchMarkNames.XFUND.value}-original") - odir = Path(f"./benchmarks/{BenchMarkNames.XFUND.value}-dataset") - - os.makedirs(odir, exist_ok=True) - - log.info("Create the converted XFUND dataset") - create_xfund_dataset(input_dir=idir, output_dir=odir, splits=["train", "val"]) - - -if __name__ == "__main__": - main() From 43f43609fe53179baaaf0842d92ff3510cff1a06 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Mon, 31 Mar 2025 15:41:15 +0200 Subject: [PATCH 57/81] Several Fixes Signed-off-by: Christoph Auer --- docling_eval/datamodels/dataset_record.py | 4 ++-- .../dataset_builders/doclaynet_v1_builder.py | 4 ++-- .../dataset_builders/dpbench_builder.py | 11 +++++++++++ .../dataset_builders/omnidocbench_builder.py | 11 +++++++++++ .../base_prediction_provider.py | 1 - .../tableformer_provider.py | 2 ++ docling_eval/utils/utils.py | 3 +++ docs/DP-Bench_benchmarks.md | 16 ++++++++-------- docs/DocLayNetv1_benchmarks.md | 8 ++++---- docs/FinTabNet_benchmarks.md | 4 ++-- docs/OmniDocBench_benchmarks.md | 16 ++++++++-------- docs/P1M_benchmarks.md | 4 ++-- docs/PubTabNet_benchmarks.md | 4 ++-- tests/test_dataset_builder.py | 17 +++++++++-------- 14 files changed, 66 insertions(+), 39 deletions(-) diff --git a/docling_eval/datamodels/dataset_record.py b/docling_eval/datamodels/dataset_record.py index 1e604f65..8d256fb7 100644 --- a/docling_eval/datamodels/dataset_record.py +++ b/docling_eval/datamodels/dataset_record.py @@ -175,10 +175,10 @@ class DatasetRecordWithPrediction(DatasetRecord): prediction_format: PredictionFormats # some enum type predicted_page_images: List[PIL.Image.Image] = Field( - alias="GroundTruthPageImages", default=[] + alias="PredictionPageImages", default=[] ) predicted_pictures: List[PIL.Image.Image] = Field( - alias="GroundTruthPageImages", default=[] + alias="PredictionPictures", default=[] ) model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True) diff --git a/docling_eval/dataset_builders/doclaynet_v1_builder.py b/docling_eval/dataset_builders/doclaynet_v1_builder.py index 28923df1..61b1d5b7 100644 --- a/docling_eval/dataset_builders/doclaynet_v1_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v1_builder.py @@ -357,8 +357,8 @@ def iterate(self) -> Iterable[DatasetRecord]: # Extract images from the ground truth document true_doc, true_pictures, true_page_images = extract_images( document=true_doc, - pictures_column=BenchMarkColumns.GROUNDTRUTH_PICTURES, - page_images_column=BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES, + pictures_column=BenchMarkColumns.GROUNDTRUTH_PICTURES.value, + page_images_column=BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES.value, ) pdf_stream.seek(0) diff --git a/docling_eval/dataset_builders/dpbench_builder.py b/docling_eval/dataset_builders/dpbench_builder.py index 49c3576e..832facd8 100644 --- a/docling_eval/dataset_builders/dpbench_builder.py +++ b/docling_eval/dataset_builders/dpbench_builder.py @@ -21,6 +21,7 @@ from tqdm import tqdm from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.datamodels.types import BenchMarkColumns from docling_eval.dataset_builders.dataset_builder import ( BaseEvaluationDatasetBuilder, HFSource, @@ -29,6 +30,7 @@ add_pages_to_true_doc, convert_html_table_into_docling_tabledata, crop_bounding_box, + extract_images, from_pil_to_base64uri, get_binary, get_binhash, @@ -332,6 +334,13 @@ def iterate(self) -> Iterable[DatasetRecord]: page_height=page_height, ) + # Extract images from the ground truth document + true_doc, true_pictures, true_page_images = extract_images( + document=true_doc, + pictures_column=BenchMarkColumns.GROUNDTRUTH_PICTURES.value, + page_images_column=BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES.value, + ) + # Get PDF as binary data pdf_bytes = get_binary(pdf_path) pdf_stream = DocumentStream(name=pdf_path.name, stream=BytesIO(pdf_bytes)) @@ -341,6 +350,8 @@ def iterate(self) -> Iterable[DatasetRecord]: doc_id=str(filename), doc_hash=get_binhash(pdf_bytes), ground_truth_doc=true_doc, + ground_truth_pictures=true_pictures, + ground_truth_page_images=true_page_images, original=pdf_stream, mime_type="application/pdf", ) diff --git a/docling_eval/dataset_builders/omnidocbench_builder.py b/docling_eval/dataset_builders/omnidocbench_builder.py index ac08a0d0..3b5d37e9 100644 --- a/docling_eval/dataset_builders/omnidocbench_builder.py +++ b/docling_eval/dataset_builders/omnidocbench_builder.py @@ -21,6 +21,7 @@ from tqdm import tqdm from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.datamodels.types import BenchMarkColumns from docling_eval.dataset_builders.dataset_builder import ( BaseEvaluationDatasetBuilder, HFSource, @@ -29,6 +30,7 @@ add_pages_to_true_doc, convert_html_table_into_docling_tabledata, crop_bounding_box, + extract_images, from_pil_to_base64uri, get_binary, get_binhash, @@ -392,6 +394,13 @@ def iterate(self) -> Iterable[DatasetRecord]: page_height=page_height, ) + # Extract images from the ground truth document + true_doc, true_pictures, true_page_images = extract_images( + document=true_doc, + pictures_column=BenchMarkColumns.GROUNDTRUTH_PICTURES.value, + page_images_column=BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES.value, + ) + # Get PDF as binary data pdf_bytes = get_binary(pdf_path) pdf_stream = DocumentStream(name=pdf_path.name, stream=BytesIO(pdf_bytes)) @@ -401,6 +410,8 @@ def iterate(self) -> Iterable[DatasetRecord]: doc_id=str(os.path.basename(jpg_path)), doc_hash=get_binhash(pdf_bytes), ground_truth_doc=true_doc, + ground_truth_pictures=true_pictures, + ground_truth_page_images=true_page_images, original=pdf_stream, mime_type="application/pdf", ) diff --git a/docling_eval/prediction_providers/base_prediction_provider.py b/docling_eval/prediction_providers/base_prediction_provider.py index 5438009a..c272fe62 100644 --- a/docling_eval/prediction_providers/base_prediction_provider.py +++ b/docling_eval/prediction_providers/base_prediction_provider.py @@ -153,7 +153,6 @@ def visualize_results( prediction_record.predicted_pictures, prediction_record.predicted_page_images, ) - save_comparison_html_with_clusters( filename=target_dataset_dir / "visualizations" diff --git a/docling_eval/prediction_providers/tableformer_provider.py b/docling_eval/prediction_providers/tableformer_provider.py index ffbd3469..4c2a52fb 100644 --- a/docling_eval/prediction_providers/tableformer_provider.py +++ b/docling_eval/prediction_providers/tableformer_provider.py @@ -141,6 +141,8 @@ def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: data = { **record.as_record_dict(), "predicted_doc": pred_doc, + "predicted_page_images": record.ground_truth_page_images, + "predicted_pictures": record.ground_truth_pictures, "original_prediction": None, "prediction_format": self.prediction_format, "predictor_info": self.info(), diff --git a/docling_eval/utils/utils.py b/docling_eval/utils/utils.py index 3aa4a3ef..9f515f6f 100644 --- a/docling_eval/utils/utils.py +++ b/docling_eval/utils/utils.py @@ -348,11 +348,14 @@ def insert_images_from_pil( if picture.image is not None: if pic_no < len(pictures): picture.image._pil = pictures[pic_no] + # picture.image.uri = from_pil_to_base64uri(pictures[pic_no]) + # Inject page images for page_no, page in document.pages.items(): if page.image is not None: if (page_no - 1) < len(page_images): page.image._pil = page_images[page_no - 1] + # page.image.uri = from_pil_to_base64uri(page_images[page_no - 1]) return document diff --git a/docs/DP-Bench_benchmarks.md b/docs/DP-Bench_benchmarks.md index 79e84649..254a507f 100644 --- a/docs/DP-Bench_benchmarks.md +++ b/docs/DP-Bench_benchmarks.md @@ -30,7 +30,7 @@ Create the evaluation report: docling_eval evaluate \ --modality layout \ --benchmark DPBench \ - --output-dir ./scratch/DPBench/ + --output-dir ./benchmarks/DPBench/ ``` @@ -42,7 +42,7 @@ Visualize the report: docling_eval visualize \ --modality layout \ --benchmark DPBench \ - --output-dir ./scratch/DPBench/ + --output-dir ./benchmarks/DPBench/ ``` [mAP[0.5:0.95] report](evaluations/DPBench/evaluation_DPBench_layout_mAP_0.5_0.95.txt) @@ -58,7 +58,7 @@ Create the evaluation report: docling_eval evaluate \ --modality table_structure \ --benchmark DPBench \ - --output-dir ./scratch/DPBench/ + --output-dir ./benchmarks/DPBench/ ``` @@ -72,7 +72,7 @@ Visualize the report: docling_eval visualize \ --modality table_structure \ --benchmark DPBench \ - --output-dir ./scratch/DPBench/ + --output-dir ./benchmarks/DPBench/ ``` ![TEDS plot](evaluations/DPBench/evaluation_DPBench_tableformer-delta_row_col.png) @@ -94,7 +94,7 @@ Create the evaluation report: docling_eval evaluate \ --modality reading_order \ --benchmark DPBench \ - --output-dir ./scratch/DPBench/ + --output-dir ./benchmarks/DPBench/ ``` [Reading order json](evaluations/DPBench/evaluation_DPBench_reading_order.json) @@ -105,7 +105,7 @@ Visualize the report: docling_eval visualize \ --modality reading_order \ --benchmark DPBench \ - --output-dir ./scratch/DPBench/ + --output-dir ./benchmarks/DPBench/ ``` ![ARD plot](evaluations/DPBench/evaluation_DPBench_reading_order_ARD_norm.png) @@ -125,7 +125,7 @@ Create the evaluation report: docling_eval evaluate \ --modality markdown_text \ --benchmark DPBench \ - --output-dir ./scratch/DPBench/ + --output-dir ./benchmarks/DPBench/ ``` [Markdown text json](evaluations/DPBench/evaluation_DPBench_markdown_text.json) @@ -137,7 +137,7 @@ Visualize the report: docling_eval visualize \ --modality markdown_text \ --benchmark DPBench \ - --output-dir ./scratch/DPBench/ + --output-dir ./benchmarks/DPBench/ ``` diff --git a/docs/DocLayNetv1_benchmarks.md b/docs/DocLayNetv1_benchmarks.md index 67dfb595..228b0c67 100644 --- a/docs/DocLayNetv1_benchmarks.md +++ b/docs/DocLayNetv1_benchmarks.md @@ -31,7 +31,7 @@ Create the evaluation report: docling_eval evaluate \ --modality layout \ --benchmark DocLayNetV1 \ - --output-dir ./scratch/DocLayNetV1/ + --output-dir ./benchmarks/DocLayNetV1/ ``` @@ -43,7 +43,7 @@ Visualize the report: docling_eval visualize \ --modality layout \ --benchmark DocLayNetV1 \ - --output-dir ./scratch/DocLayNetV1/ + --output-dir ./benchmarks/DocLayNetV1/ ``` [mAP[0.5:0.95] report](evaluations/DocLayNetV1/evaluation_DocLayNetV1_layout_mAP_0.5_0.95.txt) @@ -59,7 +59,7 @@ Create the report: docling_eval evaluate \ --modality markdown_text \ --benchmark DocLayNetV1 \ - --output-dir ./scratch/DocLayNetV1/ + --output-dir ./benchmarks/DocLayNetV1/ ``` [Markdown text json](evaluations/DocLayNetV1/evaluation_DocLayNetV1_markdown_text.json) @@ -71,7 +71,7 @@ Visualize the report: docling_eval visualize \ --modality markdown_text \ --benchmark DocLayNetV1 \ - --output-dir ./scratch/DocLayNetV1/ + --output-dir ./benchmarks/DocLayNetV1/ ``` [Markdown text report](evaluations/DocLayNetV1/evaluation_DocLayNetV1_markdown_text.txt) diff --git a/docs/FinTabNet_benchmarks.md b/docs/FinTabNet_benchmarks.md index afe7cbef..b220f969 100644 --- a/docs/FinTabNet_benchmarks.md +++ b/docs/FinTabNet_benchmarks.md @@ -23,7 +23,7 @@ Create the evaluation report: docling_eval evaluate \ --modality table_structure \ --benchmark FinTabNet \ - --output-dir ./scratch/FinTabNet/ + --output-dir ./benchmarks/FinTabNet/ ``` [Tableformer evaluation json](evaluations/FinTabNet/evaluation_FinTabNet_tableformer.json) @@ -34,7 +34,7 @@ Visualize the report: docling_eval visualize \ --modality table_structure \ --benchmark FinTabNet \ - --output-dir ./scratch/FinTabNet/ + --output-dir ./benchmarks/FinTabNet/ ``` ![TEDS plot](evaluations/FinTabNet/evaluation_FinTabNet_tableformer-delta_row_col.png) diff --git a/docs/OmniDocBench_benchmarks.md b/docs/OmniDocBench_benchmarks.md index 0a9982ad..9fb67949 100644 --- a/docs/OmniDocBench_benchmarks.md +++ b/docs/OmniDocBench_benchmarks.md @@ -30,7 +30,7 @@ Create the evaluation report: docling_eval evaluate \ --modality layout \ --benchmark OmniDocBench \ - --output-dir ./scratch/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench/ ``` @@ -42,7 +42,7 @@ Visualize the report: docling_eval visualize \ --modality layout \ --benchmark OmniDocBench \ - --output-dir ./scratch/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench/ ``` [mAP[0.5:0.95] report](evaluations/OmniDocBench/evaluation_OmniDocBench_layout_mAP_0.5_0.95.txt) @@ -58,7 +58,7 @@ Create the evaluation report: docling_eval evaluate \ --modality table_structure \ --benchmark OmniDocBench \ - --output-dir ./scratch/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench/ ``` [Tableformer evaluation json](evaluations/OmniDocBench/evaluation_OmniDocBench_tableformer.json) @@ -70,7 +70,7 @@ Visualize the report: docling_eval visualize \ --modality table_structure \ --benchmark OmniDocBench \ - --output-dir ./scratch/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench/ ``` ![TEDS plot](evaluations/OmniDocBench/evaluation_OmniDocBench_tableformer-delta_row_col.png) @@ -92,7 +92,7 @@ Create the evaluation report: docling_eval evaluate \ --modality reading_order \ --benchmark OmniDocBench \ - --output-dir ./scratch/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench/ ``` [Reading order json](evaluations/OmniDocBench/evaluation_OmniDocBench_reading_order.json) @@ -104,7 +104,7 @@ Visualize the report: docling_eval visualize \ --modality reading_order \ --benchmark OmniDocBench \ - --output-dir ./scratch/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench/ ``` [ARD report](evaluations/OmniDocBench/evaluation_OmniDocBench_reading_order_ARD_norm.txt) @@ -124,7 +124,7 @@ Create the evaluation report: docling_eval evaluate \ --modality markdown_text \ --benchmark OmniDocBench \ - --output-dir ./scratch/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench/ ``` [Markdown text json](evaluations/OmniDocBench/evaluation_OmniDocBench_markdown_text.json) @@ -136,7 +136,7 @@ Visualize the report: docling_eval visualize \ --modality markdown_text \ --benchmark OmniDocBench \ - --output-dir ./scratch/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench/ ``` [Markdown text report](evaluations/OmniDocBench/evaluation_OmniDocBench_markdown_text.txt) diff --git a/docs/P1M_benchmarks.md b/docs/P1M_benchmarks.md index bf3022f4..0c35b313 100644 --- a/docs/P1M_benchmarks.md +++ b/docs/P1M_benchmarks.md @@ -23,7 +23,7 @@ Create the evaluation report: docling_eval evaluate \ --modality table_structure \ --benchmark Pub1M \ - --output-dir ./scratch/Pub1M/ + --output-dir ./benchmarks/Pub1M/ ``` [Tableformer evaluation json](evaluations/Pub1M/evaluation_Pub1M_tableformer.json) @@ -34,7 +34,7 @@ Visualize the report: docling_eval visualize \ --modality table_structure \ --benchmark Pub1M \ - --output-dir ./scratch/Pub1M/ + --output-dir ./benchmarks/Pub1M/ ``` ![TEDS plot](evaluations/Pub1M/evaluation_Pub1M_tableformer-delta_row_col.png) diff --git a/docs/PubTabNet_benchmarks.md b/docs/PubTabNet_benchmarks.md index d0ee17c8..76d7f227 100644 --- a/docs/PubTabNet_benchmarks.md +++ b/docs/PubTabNet_benchmarks.md @@ -23,7 +23,7 @@ Create the evaluation report: docling_eval evaluate \ --modality table_structure \ --benchmark PubTabNet \ - --output-dir ./scratch/PubTabNet/ + --output-dir ./benchmarks/PubTabNet/ ``` [Tableformer evaluation json](evaluations/PubTabNet/evaluation_PubTabNet_tableformer.json) @@ -34,7 +34,7 @@ Visualize the report: docling_eval visualize \ --modality table_structure \ --benchmark PubTabNet \ - --output-dir ./scratch/PubTabNet/ + --output-dir ./benchmarks/PubTabNet/ ``` ![TEDS plot](evaluations/PubTabNet/evaluation_PubTabNet_tableformer-delta_row_col.png) diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index d85e3fba..26b94924 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -109,8 +109,7 @@ def test_run_dpbench_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) - ## Evaluate Reading order Date: Mon, 31 Mar 2025 15:43:27 +0200 Subject: [PATCH 58/81] README updates Signed-off-by: Christoph Auer --- docs/DP-Bench_benchmarks.md | 20 ++++++++++---------- docs/OmniDocBench_benchmarks.md | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/DP-Bench_benchmarks.md b/docs/DP-Bench_benchmarks.md index 254a507f..dca954a4 100644 --- a/docs/DP-Bench_benchmarks.md +++ b/docs/DP-Bench_benchmarks.md @@ -12,13 +12,13 @@ docling_eval create-gt --benchmark DPBench --output-dir ./benchmarks/DPBench/ docling_eval create-eval \ --modality end-to-end \ --benchmark DPBench \ - --output-dir ./benchmarks/DPBench/ \ + --output-dir ./benchmarks/DPBench-e2e/ \ --prediction-provider docling # use full-document predictions from docling docling_eval create-eval \ --modality table_structure \ --benchmark DPBench \ - --output-dir ./benchmarks/DPBench/ \ + --output-dir ./benchmarks/DPBench-tables/ \ --prediction-provider tableformer # use tableformer predictions only ``` @@ -30,7 +30,7 @@ Create the evaluation report: docling_eval evaluate \ --modality layout \ --benchmark DPBench \ - --output-dir ./benchmarks/DPBench/ + --output-dir ./benchmarks/DPBench-e2e/ ``` @@ -42,7 +42,7 @@ Visualize the report: docling_eval visualize \ --modality layout \ --benchmark DPBench \ - --output-dir ./benchmarks/DPBench/ + --output-dir ./benchmarks/DPBench-e2e/ ``` [mAP[0.5:0.95] report](evaluations/DPBench/evaluation_DPBench_layout_mAP_0.5_0.95.txt) @@ -58,7 +58,7 @@ Create the evaluation report: docling_eval evaluate \ --modality table_structure \ --benchmark DPBench \ - --output-dir ./benchmarks/DPBench/ + --output-dir ./benchmarks/DPBench-tables/ ``` @@ -72,7 +72,7 @@ Visualize the report: docling_eval visualize \ --modality table_structure \ --benchmark DPBench \ - --output-dir ./benchmarks/DPBench/ + --output-dir ./benchmarks/DPBench-tables/ ``` ![TEDS plot](evaluations/DPBench/evaluation_DPBench_tableformer-delta_row_col.png) @@ -94,7 +94,7 @@ Create the evaluation report: docling_eval evaluate \ --modality reading_order \ --benchmark DPBench \ - --output-dir ./benchmarks/DPBench/ + --output-dir ./benchmarks/DPBench-e2e/ ``` [Reading order json](evaluations/DPBench/evaluation_DPBench_reading_order.json) @@ -105,7 +105,7 @@ Visualize the report: docling_eval visualize \ --modality reading_order \ --benchmark DPBench \ - --output-dir ./benchmarks/DPBench/ + --output-dir ./benchmarks/DPBench-e2e/ ``` ![ARD plot](evaluations/DPBench/evaluation_DPBench_reading_order_ARD_norm.png) @@ -125,7 +125,7 @@ Create the evaluation report: docling_eval evaluate \ --modality markdown_text \ --benchmark DPBench \ - --output-dir ./benchmarks/DPBench/ + --output-dir ./benchmarks/DPBench-e2e/ ``` [Markdown text json](evaluations/DPBench/evaluation_DPBench_markdown_text.json) @@ -137,7 +137,7 @@ Visualize the report: docling_eval visualize \ --modality markdown_text \ --benchmark DPBench \ - --output-dir ./benchmarks/DPBench/ + --output-dir ./benchmarks/DPBench-e2e/ ``` diff --git a/docs/OmniDocBench_benchmarks.md b/docs/OmniDocBench_benchmarks.md index 9fb67949..66fc8cd4 100644 --- a/docs/OmniDocBench_benchmarks.md +++ b/docs/OmniDocBench_benchmarks.md @@ -12,13 +12,13 @@ docling_eval create-gt --benchmark OmniDocBench --output-dir ./benchmarks/OmniDo docling_eval create-eval \ --modality end-to-end \ --benchmark OmniDocBench \ - --output-dir ./benchmarks/OmniDocBench/ \ + --output-dir ./benchmarks/OmniDocBench-e2e/ \ --prediction-provider docling # use full-document predictions from docling docling_eval create-eval \ --modality table_structure \ --benchmark DPBench \ - --output-dir ./benchmarks/OmniDocBench/ \ + --output-dir ./benchmarks/OmniDocBench-tables/ \ --prediction-provider tableformer # use tableformer predictions only ``` @@ -30,7 +30,7 @@ Create the evaluation report: docling_eval evaluate \ --modality layout \ --benchmark OmniDocBench \ - --output-dir ./benchmarks/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench-e2e/ ``` @@ -42,7 +42,7 @@ Visualize the report: docling_eval visualize \ --modality layout \ --benchmark OmniDocBench \ - --output-dir ./benchmarks/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench-e2e/ ``` [mAP[0.5:0.95] report](evaluations/OmniDocBench/evaluation_OmniDocBench_layout_mAP_0.5_0.95.txt) @@ -58,7 +58,7 @@ Create the evaluation report: docling_eval evaluate \ --modality table_structure \ --benchmark OmniDocBench \ - --output-dir ./benchmarks/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench-tables/ ``` [Tableformer evaluation json](evaluations/OmniDocBench/evaluation_OmniDocBench_tableformer.json) @@ -70,7 +70,7 @@ Visualize the report: docling_eval visualize \ --modality table_structure \ --benchmark OmniDocBench \ - --output-dir ./benchmarks/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench-tables/ ``` ![TEDS plot](evaluations/OmniDocBench/evaluation_OmniDocBench_tableformer-delta_row_col.png) @@ -92,7 +92,7 @@ Create the evaluation report: docling_eval evaluate \ --modality reading_order \ --benchmark OmniDocBench \ - --output-dir ./benchmarks/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench-e2e/ ``` [Reading order json](evaluations/OmniDocBench/evaluation_OmniDocBench_reading_order.json) @@ -104,7 +104,7 @@ Visualize the report: docling_eval visualize \ --modality reading_order \ --benchmark OmniDocBench \ - --output-dir ./benchmarks/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench-e2e/ ``` [ARD report](evaluations/OmniDocBench/evaluation_OmniDocBench_reading_order_ARD_norm.txt) @@ -124,7 +124,7 @@ Create the evaluation report: docling_eval evaluate \ --modality markdown_text \ --benchmark OmniDocBench \ - --output-dir ./benchmarks/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench-e2e/ ``` [Markdown text json](evaluations/OmniDocBench/evaluation_OmniDocBench_markdown_text.json) @@ -136,7 +136,7 @@ Visualize the report: docling_eval visualize \ --modality markdown_text \ --benchmark OmniDocBench \ - --output-dir ./benchmarks/OmniDocBench/ + --output-dir ./benchmarks/OmniDocBench-e2e/ ``` [Markdown text report](evaluations/OmniDocBench/evaluation_OmniDocBench_markdown_text.txt) From e4bd417fb0102745437f82abd932bfbf29faf104 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Mon, 31 Mar 2025 16:06:51 +0200 Subject: [PATCH 59/81] Add gt_dir arg to create-eval, README fixes Signed-off-by: Christoph Auer --- docling_eval/cli/main.py | 7 +++++-- docs/DP-Bench_benchmarks.md | 4 +++- docs/OmniDocBench_benchmarks.md | 4 +++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py index 38c540d0..c36fb509 100644 --- a/docling_eval/cli/main.py +++ b/docling_eval/cli/main.py @@ -629,10 +629,13 @@ def create_gt( def create_eval( modality: Annotated[EvaluationModality, typer.Option(help="Evaluation modality")], benchmark: Annotated[BenchMarkNames, typer.Option(help="Benchmark name")], - output_dir: Annotated[Path, typer.Option(help="Output directory")], + output_dir: Annotated[Path, typer.Option(help="Output directory.")], prediction_provider: Annotated[ PredictionProviderType, typer.Option(help="Type of prediction provider to use") ], + gt_dir: Annotated[ + Optional[Path], typer.Option(help="Input directory for GT") + ] = None, split: Annotated[str, typer.Option(help="Dataset split")] = "test", begin_index: Annotated[int, typer.Option(help="Begin index (inclusive)")] = 0, end_index: Annotated[ @@ -653,7 +656,7 @@ def create_eval( ] = None, ): """Create evaluation dataset from existing ground truth.""" - gt_dir = output_dir / "gt_dataset" + gt_dir = gt_dir or output_dir / "gt_dataset" pred_dir = output_dir / "eval_dataset" # Check if ground truth exists diff --git a/docs/DP-Bench_benchmarks.md b/docs/DP-Bench_benchmarks.md index dca954a4..87aac9a8 100644 --- a/docs/DP-Bench_benchmarks.md +++ b/docs/DP-Bench_benchmarks.md @@ -6,18 +6,20 @@ Create DPBench evaluation datasets: ```sh # Make the ground-truth -docling_eval create-gt --benchmark DPBench --output-dir ./benchmarks/DPBench/ +docling_eval create-gt --benchmark DPBench --output-dir ./benchmarks/DPBench-gt/ # Make predictions for different modalities. docling_eval create-eval \ --modality end-to-end \ --benchmark DPBench \ + --gt-dir ./benchmarks/DPBench-gt/ \ --output-dir ./benchmarks/DPBench-e2e/ \ --prediction-provider docling # use full-document predictions from docling docling_eval create-eval \ --modality table_structure \ --benchmark DPBench \ + --gt-dir ./benchmarks/DPBench-gt/ \ --output-dir ./benchmarks/DPBench-tables/ \ --prediction-provider tableformer # use tableformer predictions only ``` diff --git a/docs/OmniDocBench_benchmarks.md b/docs/OmniDocBench_benchmarks.md index 66fc8cd4..a00c5bfc 100644 --- a/docs/OmniDocBench_benchmarks.md +++ b/docs/OmniDocBench_benchmarks.md @@ -6,18 +6,20 @@ Create OmniDocBench evaluation datasets: ```sh # Make the ground-truth -docling_eval create-gt --benchmark OmniDocBench --output-dir ./benchmarks/OmniDocBench/ +docling_eval create-gt --benchmark OmniDocBench --output-dir ./benchmarks/OmniDocBench-gt/ # Make predictions for different modalities. docling_eval create-eval \ --modality end-to-end \ --benchmark OmniDocBench \ + --gt-dir ./benchmarks/OmniDocBench-gt/ \ --output-dir ./benchmarks/OmniDocBench-e2e/ \ --prediction-provider docling # use full-document predictions from docling docling_eval create-eval \ --modality table_structure \ --benchmark DPBench \ + --gt-dir ./benchmarks/OmniDocBench-gt/ \ --output-dir ./benchmarks/OmniDocBench-tables/ \ --prediction-provider tableformer # use tableformer predictions only ``` From e898ab5888c5a440c7e153fdd08e8038001075c0 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Mon, 31 Mar 2025 16:58:04 +0200 Subject: [PATCH 60/81] Fixes, pass tests Signed-off-by: Christoph Auer --- docling_eval/datamodels/dataset_record.py | 10 +- .../base_prediction_provider.py | 15 ++- .../tableformer_provider.py | 26 +++--- tests/test_dataset_builder.py | 93 +++++++------------ 4 files changed, 67 insertions(+), 77 deletions(-) diff --git a/docling_eval/datamodels/dataset_record.py b/docling_eval/datamodels/dataset_record.py index 8d256fb7..7e0d35a4 100644 --- a/docling_eval/datamodels/dataset_record.py +++ b/docling_eval/datamodels/dataset_record.py @@ -217,9 +217,13 @@ def as_record_dict(self): self.get_field_alias("predicted_doc"): json.dumps( self.predicted_doc.export_to_dict() ), - # self.get_field_alias("original_prediction"): ( - # self.original_prediction - # ), + self.get_field_alias("predicted_pictures"): self.predicted_pictures, + self.get_field_alias( + "predicted_page_images" + ): self.predicted_page_images, + self.get_field_alias("original_prediction"): ( + self.original_prediction + ), } ) diff --git a/docling_eval/prediction_providers/base_prediction_provider.py b/docling_eval/prediction_providers/base_prediction_provider.py index c272fe62..fc7654ed 100644 --- a/docling_eval/prediction_providers/base_prediction_provider.py +++ b/docling_eval/prediction_providers/base_prediction_provider.py @@ -18,8 +18,9 @@ DatasetRecord, DatasetRecordWithPrediction, ) -from docling_eval.datamodels.types import PredictionFormats +from docling_eval.datamodels.types import BenchMarkColumns, PredictionFormats from docling_eval.utils.utils import ( + extract_images, insert_images_from_pil, save_shard_to_disk, write_datasets_info, @@ -193,9 +194,21 @@ def create_dataset_record_with_prediction( Returns: Dataset record with prediction """ + pred_page_images = [] + pred_pictures = [] + if predicted_doc is not None: + # Extract images from the ground truth document + predicted_doc, pred_pictures, pred_page_images = extract_images( + document=predicted_doc, + pictures_column=BenchMarkColumns.PREDICTION_PICTURES.value, + page_images_column=BenchMarkColumns.PREDICTION_PAGE_IMAGES.value, + ) + data = { **record.as_record_dict(), "predicted_doc": predicted_doc, + "predicted_page_images": pred_page_images, + "predicted_pictures": pred_pictures, "original_prediction": original_prediction, "prediction_format": self.prediction_format, "predictor_info": self.info(), diff --git a/docling_eval/prediction_providers/tableformer_provider.py b/docling_eval/prediction_providers/tableformer_provider.py index 4c2a52fb..c4f74775 100644 --- a/docling_eval/prediction_providers/tableformer_provider.py +++ b/docling_eval/prediction_providers/tableformer_provider.py @@ -33,7 +33,11 @@ from docling_eval.prediction_providers.base_prediction_provider import ( BasePredictionProvider, ) -from docling_eval.utils.utils import docling_models_version, get_input_document +from docling_eval.utils.utils import ( + docling_models_version, + get_input_document, + insert_images_from_pil, +) _log = logging.getLogger(__name__) @@ -119,6 +123,11 @@ def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: record.ground_truth_doc, record.ground_truth_page_images, ) + pred_doc = insert_images_from_pil( + pred_doc, + record.ground_truth_pictures, + record.ground_truth_page_images, + ) else: raise RuntimeError( @@ -137,18 +146,9 @@ def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: deep=True ) # Use copy of ground truth as fallback - # Create prediction record - data = { - **record.as_record_dict(), - "predicted_doc": pred_doc, - "predicted_page_images": record.ground_truth_page_images, - "predicted_pictures": record.ground_truth_pictures, - "original_prediction": None, - "prediction_format": self.prediction_format, - "predictor_info": self.info(), - "status": status, - } - return DatasetRecordWithPrediction.model_validate(data) + pred_record = self.create_dataset_record_with_prediction(record, pred_doc, None) + pred_record.status = status + return pred_record def info(self) -> Dict: """Get information about the prediction provider.""" diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 26b94924..e42b2af4 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -12,6 +12,7 @@ from docling.document_converter import PdfFormatOption from docling.models.factories import get_ocr_factory +from docling_eval.cli.main import evaluate, visualize from docling_eval.datamodels.types import ( BenchMarkNames, EvaluationModality, @@ -30,7 +31,6 @@ PubTabNetDatasetBuilder, ) from docling_eval.dataset_builders.xfund_builder import XFUNDDatasetBuilder -from docling_eval.legacy.main import evaluate, visualise from docling_eval.prediction_providers.docling_provider import DoclingPredictionProvider from docling_eval.prediction_providers.file_provider import FilePredictionProvider from docling_eval.prediction_providers.tableformer_provider import ( @@ -84,9 +84,7 @@ def test_run_dpbench_e2e(): ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF - dataset_layout.save_to_disk( - chunk_size=5 - ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. docling_provider.create_prediction_dataset( name=dataset_layout.name, @@ -102,7 +100,7 @@ def test_run_dpbench_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) - visualise( + visualize( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DPBENCH, idir=target_path / "eval_dataset", @@ -117,7 +115,7 @@ def test_run_dpbench_e2e(): odir=target_path / "evaluations" / EvaluationModality.READING_ORDER.value, ) - visualise( + visualize( modality=EvaluationModality.READING_ORDER, benchmark=BenchMarkNames.DPBENCH, idir=target_path / "eval_dataset", @@ -132,7 +130,7 @@ def test_run_dpbench_e2e(): odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, ) - visualise( + visualize( modality=EvaluationModality.MARKDOWN_TEXT, benchmark=BenchMarkNames.DPBENCH, idir=target_path / "eval_dataset", @@ -156,9 +154,7 @@ def test_run_doclaynet_with_doctags_fileprovider(): ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF - dataset_layout.save_to_disk( - chunk_size=80 - ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. file_provider.create_prediction_dataset( name=dataset_layout.name, @@ -174,7 +170,7 @@ def test_run_doclaynet_with_doctags_fileprovider(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) - visualise( + visualize( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DOCLAYNETV1, idir=target_path / "eval_dataset", @@ -189,7 +185,7 @@ def test_run_doclaynet_with_doctags_fileprovider(): odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, ) - visualise( + visualize( modality=EvaluationModality.MARKDOWN_TEXT, benchmark=BenchMarkNames.DOCLAYNETV1, idir=target_path / "eval_dataset", @@ -207,9 +203,7 @@ def test_run_omnidocbench_e2e(): ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF - dataset_layout.save_to_disk( - chunk_size=5 - ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. docling_provider.create_prediction_dataset( name=dataset_layout.name, @@ -225,7 +219,7 @@ def test_run_omnidocbench_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) - visualise( + visualize( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.OMNIDOCBENCH, idir=target_path / "eval_dataset", @@ -240,7 +234,7 @@ def test_run_omnidocbench_e2e(): odir=target_path / "evaluations" / EvaluationModality.READING_ORDER.value, ) - visualise( + visualize( modality=EvaluationModality.READING_ORDER, benchmark=BenchMarkNames.OMNIDOCBENCH, idir=target_path / "eval_dataset", @@ -255,7 +249,7 @@ def test_run_omnidocbench_e2e(): odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, ) - visualise( + visualize( modality=EvaluationModality.MARKDOWN_TEXT, benchmark=BenchMarkNames.OMNIDOCBENCH, idir=target_path / "eval_dataset", @@ -265,19 +259,15 @@ def test_run_omnidocbench_e2e(): def test_run_dpbench_tables(): target_path = Path(f"./scratch/{BenchMarkNames.DPBENCH.value}/") - tableformer_provider = TableFormerPredictionProvider( - do_visualization=True, ignore_missing_predictions=False - ) + tableformer_provider = TableFormerPredictionProvider() dataset_tables = DPBenchDatasetBuilder( target=target_path / "gt_dataset", - end_index=250, + end_index=25, ) - # dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF - # dataset_tables.save_to_disk( - # chunk_size=5 - # ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF + dataset_tables.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( name=dataset_tables.name, @@ -292,7 +282,7 @@ def test_run_dpbench_tables(): odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) - visualise( + visualize( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.DPBENCH, idir=target_path / "eval_dataset", @@ -310,10 +300,7 @@ def test_run_omnidocbench_tables(): ) dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF - dataset_tables.save_to_disk( - chunk_size=5, - max_num_chunks=1, - ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_tables.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( name=dataset_tables.name, @@ -328,7 +315,7 @@ def test_run_omnidocbench_tables(): odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) - visualise( + visualize( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.OMNIDOCBENCH, idir=target_path / "eval_dataset", @@ -347,9 +334,7 @@ def test_run_doclaynet_v1_e2e(): ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF - dataset_layout.save_to_disk( - chunk_size=5 - ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. docling_provider.create_prediction_dataset( name=dataset_layout.name, @@ -365,7 +350,7 @@ def test_run_doclaynet_v1_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) - visualise( + visualize( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DOCLAYNETV1, idir=target_path / "eval_dataset", @@ -380,7 +365,7 @@ def test_run_doclaynet_v1_e2e(): odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, ) - visualise( + visualize( modality=EvaluationModality.MARKDOWN_TEXT, benchmark=BenchMarkNames.DOCLAYNETV1, idir=target_path / "eval_dataset", @@ -400,9 +385,7 @@ def test_run_doclaynet_v2_e2e(): ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF - dataset_layout.save_to_disk( - chunk_size=5 - ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. docling_provider.create_prediction_dataset( name=dataset_layout.name, @@ -418,7 +401,7 @@ def test_run_doclaynet_v2_e2e(): odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) - visualise( + visualize( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DOCLAYNETV2, idir=target_path / "eval_dataset", @@ -433,7 +416,7 @@ def test_run_doclaynet_v2_e2e(): odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, ) - visualise( + visualize( modality=EvaluationModality.MARKDOWN_TEXT, benchmark=BenchMarkNames.DOCLAYNETV2, idir=target_path / "eval_dataset", @@ -451,9 +434,7 @@ def test_run_funsd(): ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF - dataset_layout.save_to_disk( - chunk_size=5 - ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. def test_run_xfund(): @@ -466,9 +447,7 @@ def test_run_xfund(): ) dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF - dataset_layout.save_to_disk( - chunk_size=5 - ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. def test_run_fintabnet_builder(): @@ -481,9 +460,7 @@ def test_run_fintabnet_builder(): ) dataset.retrieve_input_dataset() # fetches the source dataset from HF - dataset.save_to_disk( - chunk_size=5 - ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( name=dataset.name, @@ -498,7 +475,7 @@ def test_run_fintabnet_builder(): odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) - visualise( + visualize( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.FINTABNET, idir=target_path / "eval_dataset", @@ -516,9 +493,7 @@ def test_run_p1m_builder(): ) dataset.retrieve_input_dataset() # fetches the source dataset from HF - dataset.save_to_disk( - chunk_size=5 - ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( name=dataset.name, @@ -533,7 +508,7 @@ def test_run_p1m_builder(): odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) - visualise( + visualize( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.PUB1M, idir=target_path / "eval_dataset", @@ -551,9 +526,7 @@ def test_run_pubtabnet_builder(): ) dataset.retrieve_input_dataset() # fetches the source dataset from HF - dataset.save_to_disk( - chunk_size=80 - ) # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + dataset.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( name=dataset.name, @@ -571,7 +544,7 @@ def test_run_pubtabnet_builder(): split="val", ) - visualise( + visualize( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.PUBTABNET, idir=target_path / "eval_dataset", From 7be89ef915b00f9f89933fc46d0eed0bb65c814d Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Mon, 31 Mar 2025 16:56:34 +0200 Subject: [PATCH 61/81] feat: Refactor the TableEvaluator to use the new class design. Move common evaluator code to BaseEvaluator. Add more unit tests. Introduce pytest dependencies. Signed-off-by: Nikos Livathinos --- docling_eval/evaluators/base_evaluator.py | 58 ++++++++++- docling_eval/evaluators/layout_evaluator.py | 36 +++---- .../evaluators/markdown_text_evaluator.py | 7 +- docling_eval/evaluators/table_evaluator.py | 95 +++++++++---------- docling_eval/utils/utils.py | 23 ----- tests/test_dataset_builder.py | 2 + tests/test_layout_evaluator.py | 11 ++- tests/test_markdown_text_evaluator.py | 7 +- tests/test_table_evaluator.py | 46 +++++++-- 9 files changed, 173 insertions(+), 112 deletions(-) diff --git a/docling_eval/evaluators/base_evaluator.py b/docling_eval/evaluators/base_evaluator.py index adc7a41f..ee81a8b0 100644 --- a/docling_eval/evaluators/base_evaluator.py +++ b/docling_eval/evaluators/base_evaluator.py @@ -1,9 +1,16 @@ +import json import logging from pathlib import Path from typing import Any, Dict, List, Optional +from docling_core.types.doc.document import ( + DoclingDocument, + DocTagsDocument, + DocTagsPage, +) from pydantic import BaseModel +from docling_eval.datamodels.dataset_record import DatasetRecordWithPrediction from docling_eval.datamodels.types import PredictionFormats _log = logging.getLogger(__name__) @@ -13,6 +20,29 @@ class DatasetEvaluation(BaseModel): pass +def docling_document_from_doctags( + data_record: DatasetRecordWithPrediction, +) -> DoclingDocument: + r""" """ + doc_id = data_record.doc_id + doctags = data_record.original + if not isinstance(doctags, str): + raise RuntimeError("Invalid format of original prediction") + + page_image = ( + data_record.ground_truth_page_images[0] + if data_record.ground_truth_page_images + else None + ) + + doctags_page = DocTagsPage(tokens=doctags, image=page_image) + doctags_doc = DocTagsDocument(pages=[doctags_page]) + pred_doc = DoclingDocument(name=doc_id) + pred_doc.load_from_doctags(doctags_doc) + + return pred_doc + + class BaseEvaluator: r""" Base class for all evaluators @@ -47,10 +77,6 @@ def __call__( self, ds_path: Path, split: str = "test", - # Remove the ext_predictions when all evaluators have been migrated to the new design - ext_predictions: Optional[ - Dict[str, Any] - ] = None, # Optionally provided external predictions ) -> DatasetEvaluation: r""" Perform the evaluation @@ -62,3 +88,27 @@ def supported_prediction_formats(self) -> List[PredictionFormats]: Return the supported formats for predictions """ return self._supported_prediction_sources + + def save_intermediate_evalutions( + self, + evaluation_name: str, + enunumerate_id: int, + doc_id: str, + evaluations: List, + ) -> Optional[Path]: + r""" + Utility method to save intermediate evaluation results + Return immediatelly if the intermediate_evaluation_path is not set + It returns the file Path with the intermediate results or None + """ + if self._intermediate_evaluations_path: + return None + + evals = [ev.model_dump() for ev in evaluations] + evaluation_filename = f"{evaluation_name}_{enunumerate_id:05d}_{doc_id}.json" + evaluation_fn = self._intermediate_evaluations_path / evaluation_filename # type: ignore + _log.info("Saving intermediate evaluations: %s", evaluation_fn) + with open(evaluation_fn, "w") as fd: + json.dump(evals, fd) + + return evaluation_fn diff --git a/docling_eval/evaluators/layout_evaluator.py b/docling_eval/evaluators/layout_evaluator.py index 5cfe9b8c..b4c61a7a 100644 --- a/docling_eval/evaluators/layout_evaluator.py +++ b/docling_eval/evaluators/layout_evaluator.py @@ -17,9 +17,12 @@ from docling_eval.datamodels.dataset_record import DatasetRecordWithPrediction from docling_eval.datamodels.types import BenchMarkColumns, PredictionFormats -from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation +from docling_eval.evaluators.base_evaluator import ( + BaseEvaluator, + DatasetEvaluation, + docling_document_from_doctags, +) from docling_eval.evaluators.stats import DatasetStatistics, compute_stats -from docling_eval.utils.utils import docling_document_from_doctags _log = logging.getLogger(__name__) @@ -120,8 +123,6 @@ def __call__( self, ds_path: Path, split: str = "test", - # Remove the ext_predictions when all evaluators have been migrated to the new design - ext_predictions: Optional[Dict[str, DoclingDocument]] = None, ) -> DatasetLayoutEvaluation: logging.info("Loading the split '%s' from: '%s'", split, ds_path) @@ -257,19 +258,22 @@ def __call__( average_iou_95 = result["average_iou_95"] map_values.append(map_value) - evaluations_per_image.append( - ImageLayoutEvaluation( - name=doc_id, - value=average_iou_50, - map_val=map_value, - map_50=map_50, - map_75=map_75, - avg_weighted_label_matched_iou_50=average_iou_50, - avg_weighted_label_matched_iou_75=average_iou_75, - avg_weighted_label_matched_iou_90=average_iou_90, - avg_weighted_label_matched_iou_95=average_iou_95, - ) + image_evaluation = ImageLayoutEvaluation( + name=doc_id, + value=average_iou_50, + map_val=map_value, + map_50=map_50, + map_75=map_75, + avg_weighted_label_matched_iou_50=average_iou_50, + avg_weighted_label_matched_iou_75=average_iou_75, + avg_weighted_label_matched_iou_90=average_iou_90, + avg_weighted_label_matched_iou_95=average_iou_95, ) + evaluations_per_image.append(image_evaluation) + if self._intermediate_evaluations_path: + self.save_intermediate_evalutions( + "Layout_image", i, doc_id, evaluations_per_image + ) evaluations_per_class = sorted(evaluations_per_class, key=lambda x: -x.value) evaluations_per_image = sorted(evaluations_per_image, key=lambda x: -x.value) diff --git a/docling_eval/evaluators/markdown_text_evaluator.py b/docling_eval/evaluators/markdown_text_evaluator.py index e0dc6e7c..9ff05ffc 100644 --- a/docling_eval/evaluators/markdown_text_evaluator.py +++ b/docling_eval/evaluators/markdown_text_evaluator.py @@ -103,10 +103,6 @@ def __call__( self, ds_path: Path, split: str = "test", - # Remove the ext_predictions when all evaluators have been migrated to the new design - ext_predictions: Optional[ - Dict[str, Any] - ] = None, # Optionally provided external predictions ) -> DatasetMarkdownEvaluation: r""" Parameters @@ -171,6 +167,9 @@ def __call__( ) evaluations.append(md_evaluation) + if self._intermediate_evaluations_path: + self.save_intermediate_evalutions("MD", i, doc_id, evaluations) + ds_md_evalutions = DatasetMarkdownEvaluation( evaluations=evaluations, bleu_stats=compute_stats(ds_metrics["bleu"]), diff --git a/docling_eval/evaluators/table_evaluator.py b/docling_eval/evaluators/table_evaluator.py index 776dff52..788d287e 100644 --- a/docling_eval/evaluators/table_evaluator.py +++ b/docling_eval/evaluators/table_evaluator.py @@ -1,5 +1,4 @@ import glob -import json import logging import random from pathlib import Path @@ -13,8 +12,13 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore +from docling_eval.datamodels.dataset_record import DatasetRecordWithPrediction from docling_eval.datamodels.types import BenchMarkColumns, PredictionFormats -from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation +from docling_eval.evaluators.base_evaluator import ( + BaseEvaluator, + DatasetEvaluation, + docling_document_from_doctags, +) from docling_eval.evaluators.stats import DatasetStatistics, compute_stats from docling_eval.evaluators.teds import TEDScorer @@ -103,8 +107,19 @@ def __init__( self, intermediate_evaluations_path: Optional[Path] = None, structure_only: bool = False, + prediction_sources: List[PredictionFormats] = [], ): - super().__init__(intermediate_evaluations_path=intermediate_evaluations_path) + supported_prediction_formats: List[PredictionFormats] = [ + PredictionFormats.DOCLING_DOCUMENT, + PredictionFormats.DOCTAGS, + ] + if not prediction_sources: + prediction_sources = supported_prediction_formats + super().__init__( + intermediate_evaluations_path=intermediate_evaluations_path, + prediction_sources=prediction_sources, + supported_prediction_formats=supported_prediction_formats, + ) self._structure_only = structure_only self._teds_scorer = TEDScorer() @@ -114,7 +129,6 @@ def __call__( self, ds_path: Path, split: str = "test", - ext_predictions: Optional[Dict[str, DoclingDocument]] = None, ) -> DatasetTableEvaluation: r""" Load a dataset in HF format. Expected columns with DoclingDocuments @@ -142,26 +156,18 @@ def __call__( ncols=120, total=len(ds_selection), ): - doc_id = data[BenchMarkColumns.DOC_ID] - - gt_doc_dict = data[BenchMarkColumns.GROUNDTRUTH] - gt_doc = DoclingDocument.model_validate_json(gt_doc_dict) - - if ext_predictions is None: - pred_doc_dict = data[BenchMarkColumns.PREDICTION] - pred_doc = DoclingDocument.model_validate_json(pred_doc_dict) - else: - if doc_id.endswith(".png") or doc_id.endswith(".jpg"): - doc_id = doc_id[:-4] - if doc_id not in ext_predictions: - _log.error("Missing pred_doc from dict argument for %s", doc_id) - continue - pred_doc = ext_predictions[doc_id] + data_record = DatasetRecordWithPrediction.model_validate(data) + doc_id = data_record.doc_id + gt_doc = data_record.ground_truth_doc + pred_doc = self._get_pred_doc(data_record) + if not pred_doc: + _log.error("There is no prediction for doc_id=%s", doc_id) + continue try: if not self._structure_only: results = self._evaluate_tables_in_documents( - doc_id=data[BenchMarkColumns.DOC_ID], + doc_id=doc_id, true_doc=gt_doc, pred_doc=pred_doc, structure_only=False, @@ -169,12 +175,8 @@ def __call__( table_evaluations.extend(results) if self._intermediate_evaluations_path: - self._save_table_evalutions( - False, - i, - doc_id, - results, - self._intermediate_evaluations_path, + self.save_intermediate_evalutions( + "TEDs_struct_content", i, doc_id, results ) results = self._evaluate_tables_in_documents( @@ -185,9 +187,8 @@ def __call__( ) table_struct_evaluations.extend(results) if self._intermediate_evaluations_path: - self._save_table_evalutions( - True, i, doc_id, results, self._intermediate_evaluations_path - ) + self.save_intermediate_evalutions("TEDs_struct", i, doc_id, results) + except Exception as ex: evaluation_errors += 1 _log.error("Error during tables evaluation for %s", doc_id) @@ -293,27 +294,19 @@ def _evaluate_tables_in_documents( return table_evaluations - def _save_table_evalutions( - self, - structure_only: bool, - enunumerate_id: int, - doc_id: str, - table_evaluations: list[TableEvaluation], - save_dir: Path, - ): - r""" """ - evals = [ev.model_dump() for ev in table_evaluations] - - prefix = "struct" if structure_only else "struct_content" - evaluation_filename = f"TED_{prefix}_{enunumerate_id:05d}_{doc_id}.json" - evaluation_fn = save_dir / evaluation_filename - _log.info("Saving intermediate TEDs: %s", evaluation_fn) - - with open(evaluation_fn, "w") as fd: - json.dump(evals, fd) - - def supported_prediction_formats(self) -> List[PredictionFormats]: + def _get_pred_doc( + self, data_record: DatasetRecordWithPrediction + ) -> Optional[DoclingDocument]: r""" - Return the supported formats for predictions + Get the predicted DoclingDocument """ - return [PredictionFormats.DOCLING_DOCUMENT] + pred_doc = None + for prediction_format in self._prediction_sources: + if prediction_format == PredictionFormats.DOCLING_DOCUMENT: + pred_doc = data_record.predicted_doc + elif prediction_format == PredictionFormats.DOCTAGS: + pred_doc = docling_document_from_doctags(data_record) + if pred_doc is not None: + break + + return pred_doc diff --git a/docling_eval/utils/utils.py b/docling_eval/utils/utils.py index 9f515f6f..5debba87 100644 --- a/docling_eval/utils/utils.py +++ b/docling_eval/utils/utils.py @@ -21,8 +21,6 @@ from docling_core.types.doc.base import BoundingBox, Size from docling_core.types.doc.document import ( DoclingDocument, - DocTagsDocument, - DocTagsPage, GraphData, ImageRef, PageItem, @@ -33,7 +31,6 @@ from PIL import Image from pydantic import AnyUrl -from docling_eval.datamodels.dataset_record import DatasetRecordWithPrediction from docling_eval.datamodels.types import BenchMarkColumns @@ -541,23 +538,3 @@ def classify_cells(graph: GraphData) -> None: else: # fallback case. cell.label = GraphCellLabel.UNSPECIFIED - - -def docling_document_from_doctags( - data_record: DatasetRecordWithPrediction, -) -> DoclingDocument: - r""" """ - doc_id = data_record.doc_id - doctags = data_record.original - page_image = ( - data_record.ground_truth_page_images[0] - if data_record.ground_truth_page_images - else None - ) - - doctags_page = DocTagsPage(tokens=doctags, image=page_image) - doctags_doc = DocTagsDocument(pages=[doctags_page]) - pred_doc = DoclingDocument(name=doc_id) - pred_doc.load_from_doctags(doctags_doc) - - return pred_doc diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index e42b2af4..72f4ef2a 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -323,6 +323,7 @@ def test_run_omnidocbench_tables(): ) +@pytest.mark.dependency() def test_run_doclaynet_v1_e2e(): target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV1.value}/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) @@ -450,6 +451,7 @@ def test_run_xfund(): dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. +@pytest.mark.dependency() def test_run_fintabnet_builder(): target_path = Path(f"./scratch/{BenchMarkNames.FINTABNET.value}/") tableformer_provider = TableFormerPredictionProvider(do_visualization=True) diff --git a/tests/test_layout_evaluator.py b/tests/test_layout_evaluator.py index 537b9f88..4c2e54da 100644 --- a/tests/test_layout_evaluator.py +++ b/tests/test_layout_evaluator.py @@ -1,13 +1,18 @@ from pathlib import Path +import pytest + from docling_eval.datamodels.types import PredictionFormats from docling_eval.evaluators.layout_evaluator import LayoutEvaluator from docling_eval.evaluators.markdown_text_evaluator import MarkdownTextEvaluator +@pytest.mark.dependency( + depends=["tests/test_dataset_builder.py::test_run_doclaynet_v1_e2e"], + scope="session", +) def test_layout_evaluator(): r""" """ - # TODO: Ensure that the test dataset exists test_dataset_dir = Path("scratch/DocLayNetV1/eval_dataset") # Default evaluator @@ -30,5 +35,5 @@ def test_layout_evaluator(): assert is_exception -if __name__ == "__main__": - test_layout_evaluator() +# if __name__ == "__main__": +# test_layout_evaluator() diff --git a/tests/test_markdown_text_evaluator.py b/tests/test_markdown_text_evaluator.py index b5ec115e..d27f30e4 100644 --- a/tests/test_markdown_text_evaluator.py +++ b/tests/test_markdown_text_evaluator.py @@ -1,12 +1,17 @@ from pathlib import Path +import pytest + from docling_eval.datamodels.types import PredictionFormats from docling_eval.evaluators.markdown_text_evaluator import MarkdownTextEvaluator +@pytest.mark.dependency( + depends=["tests/test_dataset_builder.py::test_run_doclaynet_v1_e2e"], + scope="session", +) def test_markdown_text_evaluator(): r""" """ - # TODO: Ensure that the test dataset exists test_dataset_dir = Path("scratch/DocLayNetV1/eval_dataset") # Default evaluator diff --git a/tests/test_table_evaluator.py b/tests/test_table_evaluator.py index c1fbafc9..b4a6883c 100644 --- a/tests/test_table_evaluator.py +++ b/tests/test_table_evaluator.py @@ -1,16 +1,16 @@ -# -# Copyright IBM Corp. 2024 - 2024 -# SPDX-License-Identifier: MIT -# - +from pathlib import Path +import pytest from docling_core.types.doc.document import DoclingDocument, TableCell, TableData +from docling_eval.datamodels.types import BenchMarkColumns, PredictionFormats from docling_eval.evaluators.table_evaluator import TableEvaluation, TableEvaluator -def test_table_evaluator(): - r""" """ +def test_evaluate_tables(): + r""" + Testing the internal _evaluate_tables_in_documents + """ data_table_cells = [] num_cols = 6 num_rows = 5 @@ -290,8 +290,34 @@ def test_table_evaluator(): assert evaluation.TEDS == 1.0 assert evaluation.is_complex - # TODO: Add test data with sample from HF dataset and test the __call__() + +@pytest.mark.dependency( + depends=["tests/test_dataset_builder.py::test_run_fintabnet_builder"], + scope="session", +) +def test_table_evaluator(): + r""" """ + test_dataset_dir = Path("scratch/FinTabNet/eval_dataset") + + # Default evaluator + eval1 = TableEvaluator() + v1 = eval1(test_dataset_dir) + assert v1 is not None + + # # Specify order in prediction_sources + # eval2 = TableEvaluator(prediction_sources=[PredictionFormats.DOCTAGS]) + # v2 = eval2(test_dataset_dir) + # assert v2 is not None + + # Specify invalid order in prediction_sources + is_exception = False + try: + eval3 = TableEvaluator(prediction_sources=[PredictionFormats.MARKDOWN]) + eval3(test_dataset_dir) + except RuntimeError as ex: + is_exception = True + assert is_exception -if __name__ == "__main__": - test_table_evaluator() +# if __name__ == "__main__": +# test_table_evaluator() From a7f830bd42a2f485882022bf1f2bbb4ce52f33b6 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Mon, 31 Mar 2025 17:15:30 +0200 Subject: [PATCH 62/81] Update lockfile Signed-off-by: Christoph Auer --- poetry.lock | 369 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 315 insertions(+), 54 deletions(-) diff --git a/poetry.lock b/poetry.lock index bb6cd985..f403a4d6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "accelerate" @@ -6,6 +6,8 @@ version = "1.5.2" description = "Accelerate" optional = false python-versions = ">=3.9.0" +groups = ["main"] +markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "accelerate-1.5.2-py3-none-any.whl", hash = "sha256:68a3b272f6a6ffebb457bdc138581a2bf52efad6a5e0214dc46675f3edd98792"}, {file = "accelerate-1.5.2.tar.gz", hash = "sha256:a1cf39473edc0e42772a9d9a18c9eb1ce8ffd9e1719dc0ab80670f5c1fd4dc43"}, @@ -37,6 +39,7 @@ version = "2.6.1" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, @@ -48,6 +51,7 @@ version = "3.11.14" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e2bc827c01f75803de77b134afdbf74fa74b62970eafdf190f3244931d7a5c0d"}, {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e365034c5cf6cf74f57420b57682ea79e19eb29033399dd3f40de4d0171998fa"}, @@ -143,7 +147,7 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] +speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.2.0) ; sys_platform == \"linux\" or sys_platform == \"darwin\"", "brotlicffi ; platform_python_implementation != \"CPython\""] [[package]] name = "aiosignal" @@ -151,6 +155,7 @@ version = "1.3.2" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, @@ -165,6 +170,7 @@ 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"}, @@ -176,6 +182,8 @@ version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false python-versions = ">=3.6" +groups = ["dev"] +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"}, @@ -187,6 +195,7 @@ version = "1.0.3" description = "APTED algorithm for the Tree Edit Distance" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "apted-1.0.3-py3-none-any.whl", hash = "sha256:74193369d023649d335269e67c4df07f922959e5ac2597de1b79af4e694150e8"}, {file = "apted-1.0.3.tar.gz", hash = "sha256:befa5181e2d4457fa88e54995a82604ee048bb2fbc781ea97d8e1856b4715ce9"}, @@ -198,6 +207,7 @@ version = "2.15.8" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.7.2" +groups = ["dev"] files = [ {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, @@ -217,6 +227,7 @@ version = "3.0.0" description = "Annotate AST trees with source code positions" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, @@ -232,6 +243,8 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version == \"3.10\"" files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, @@ -243,18 +256,19 @@ version = "25.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, ] [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]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -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"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "autopep8" @@ -262,6 +276,7 @@ version = "2.2.0" description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "autopep8-2.2.0-py2.py3-none-any.whl", hash = "sha256:05418a981f038969d8bdcd5636bf15948db7555ae944b9f79b5a34b35f1370d4"}, {file = "autopep8-2.2.0.tar.gz", hash = "sha256:d306a0581163ac29908280ad557773a95a9bede072c0fafed6f141f5311f43c1"}, @@ -277,6 +292,8 @@ version = "1.2.0" description = "Backport of CPython tarfile module" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version == \"3.10\" or python_version == \"3.11\"" files = [ {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, @@ -292,6 +309,7 @@ version = "4.13.3" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" +groups = ["main"] files = [ {file = "beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16"}, {file = "beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b"}, @@ -314,6 +332,7 @@ version = "24.10.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, @@ -362,6 +381,7 @@ version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, @@ -373,6 +393,8 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "implementation_name == \"pypy\" or sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" 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"}, @@ -452,6 +474,7 @@ version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -463,6 +486,7 @@ 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", "dev"] 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"}, @@ -564,6 +588,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -578,6 +603,7 @@ version = "0.4.0" description = "Logging integration for Click" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, @@ -592,10 +618,12 @@ 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", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {main = "platform_system == \"Windows\""} [[package]] name = "comm" @@ -603,6 +631,7 @@ version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, @@ -620,6 +649,7 @@ version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, @@ -693,6 +723,8 @@ version = "44.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.7" +groups = ["dev"] +markers = "sys_platform == \"linux\"" files = [ {file = "cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7"}, {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1"}, @@ -735,10 +767,10 @@ files = [ cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""] docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] -pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""] +pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] test = ["certifi (>=2024)", "cryptography-vectors (==44.0.2)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] @@ -750,6 +782,7 @@ version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -765,6 +798,7 @@ version = "3.4.1" description = "HuggingFace community-driven open-source library of datasets" optional = false python-versions = ">=3.9.0" +groups = ["main"] files = [ {file = "datasets-3.4.1-py3-none-any.whl", hash = "sha256:b91cf257bd64132fa9d953dd4768ab6d63205597301f132a74271cfcce8b5dd3"}, {file = "datasets-3.4.1.tar.gz", hash = "sha256:e23968da79bc014ef9f7540eeb7771c6180eae82c86ebcfcc10535a03caf08b5"}, @@ -787,17 +821,17 @@ tqdm = ">=4.66.3" xxhash = "*" [package.extras] -audio = ["librosa", "soundfile (>=0.12.1)", "soxr (>=0.4.0)"] +audio = ["librosa", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\""] benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] -dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers", "transformers (>=4.42.0)", "zstandard"] +dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\"", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0) ; python_version < \"3.10\"", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers", "transformers (>=4.42.0)", "zstandard"] docs = ["s3fs", "tensorflow (>=2.6.0)", "torch", "transformers"] jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] quality = ["ruff (>=0.3.0)"] s3 = ["s3fs"] tensorflow = ["tensorflow (>=2.6.0)"] tensorflow-gpu = ["tensorflow (>=2.6.0)"] -tests = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tensorflow (>=2.16.0)", "tensorflow (>=2.6.0)", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] -tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0)", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] +tests = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\"", "tensorflow (>=2.6.0) ; python_version < \"3.10\"", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] +tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers (>=4.42.0)", "zstandard"] torch = ["torch"] vision = ["Pillow (>=9.4.0)"] @@ -807,6 +841,7 @@ version = "1.8.13" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "debugpy-1.8.13-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:06859f68e817966723ffe046b896b1bd75c665996a77313370336ee9e1de3e90"}, {file = "debugpy-1.8.13-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c2db69fb8df3168bc857d7b7d2494fed295dfdbde9a45f27b4b152f37520"}, @@ -842,6 +877,7 @@ version = "5.2.1" description = "Decorators for Humans" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, @@ -853,6 +889,7 @@ version = "0.3.8" description = "serialize all of Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, @@ -868,6 +905,7 @@ version = "0.1.3" description = "Utilities for comparing sequences" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "Distance-0.1.3.tar.gz", hash = "sha256:60807584f5b6003f5c521aa73f39f51f631de3be5cccc5a1d67166fcbf0d4551"}, ] @@ -878,6 +916,7 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -889,6 +928,7 @@ version = "2.28.1" description = "SDK and CLI for parsing PDF, DOCX, HTML, and more, to a unified document representation for powering downstream workflows such as gen AI applications." optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ {file = "docling-2.28.1-py3-none-any.whl", hash = "sha256:aae0dbfb8a8aacadfd3662782bc45c0688459dd1dafc5a69ad81318a8abfb6a5"}, {file = "docling-2.28.1.tar.gz", hash = "sha256:1a48d810cbbd0855b40c7a8df4a6ce9477aeb133580a329ab1906e5807f4369d"}, @@ -921,16 +961,16 @@ rtree = ">=1.3.0,<2.0.0" scipy = {version = ">=1.6.0,<2.0.0", markers = "python_version >= \"3.10\""} tqdm = ">=4.65.0,<5.0.0" transformers = [ - {version = ">=4.46.0,<5.0.0", optional = true, markers = "sys_platform != \"darwin\" and extra == \"vlm\" or platform_machine != \"x86_64\" and extra == \"vlm\""}, + {version = ">=4.46.0,<5.0.0", optional = true, markers = "(sys_platform != \"darwin\" or platform_machine != \"x86_64\") and extra == \"vlm\""}, {version = ">=4.42.0,<4.43.0", optional = true, markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\" and extra == \"vlm\""}, ] typer = ">=0.12.5,<0.13.0" [package.extras] -ocrmac = ["ocrmac (>=1.0.0,<2.0.0)"] -rapidocr = ["onnxruntime (>=1.7.0,<1.20.0)", "onnxruntime (>=1.7.0,<2.0.0)", "rapidocr-onnxruntime (>=1.4.0,<2.0.0)"] +ocrmac = ["ocrmac (>=1.0.0,<2.0.0) ; sys_platform == \"darwin\""] +rapidocr = ["onnxruntime (>=1.7.0,<1.20.0) ; python_version < \"3.10\"", "onnxruntime (>=1.7.0,<2.0.0) ; python_version >= \"3.10\"", "rapidocr-onnxruntime (>=1.4.0,<2.0.0) ; python_version < \"3.13\""] tesserocr = ["tesserocr (>=2.7.1,<3.0.0)"] -vlm = ["accelerate (>=1.2.1,<2.0.0)", "transformers (>=4.42.0,<4.43.0)", "transformers (>=4.46.0,<5.0.0)"] +vlm = ["accelerate (>=1.2.1,<2.0.0) ; sys_platform != \"darwin\" or platform_machine != \"x86_64\"", "transformers (>=4.42.0,<4.43.0) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "transformers (>=4.46.0,<5.0.0) ; sys_platform != \"darwin\" or platform_machine != \"x86_64\""] [[package]] name = "docling-core" @@ -938,6 +978,7 @@ version = "2.24.0" description = "A python library to define and validate data types in Docling." optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ {file = "docling_core-2.24.0-py3-none-any.whl", hash = "sha256:5c14f8dd8c6add6f5fa8104ff202df1baa7fd2471123bea56137f866e21b8d40"}, {file = "docling_core-2.24.0.tar.gz", hash = "sha256:7bb880a72963accb47c9d05edd712601ccbd1d8a9fccba14ae6ef41baef41c69"}, @@ -966,6 +1007,7 @@ version = "3.4.1" description = "This package contains the AI models used by the Docling PDF conversion package" optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ {file = "docling_ibm_models-3.4.1-py3-none-any.whl", hash = "sha256:c3582c99dddfa3f0eafcf80cf1267fd8efa39c4a74cc7a88f9dd49684fac2986"}, {file = "docling_ibm_models-3.4.1.tar.gz", hash = "sha256:093b4dff2ea284a4953c3aa009e29945208b8d389b94fb14940a03a93f673e96"}, @@ -997,6 +1039,7 @@ version = "4.0.0" description = "Simple package to extract text with coordinates from programmatic PDFs" optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ {file = "docling_parse-4.0.0-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:6de7fa8ec4919f604c9a02a3fa8ca0e13a3a8e3c0652adc41848616b737925d9"}, {file = "docling_parse-4.0.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:82704280ab086a84a30d9ec9def6cd96b733aefc6973546b2101d09eed7a958e"}, @@ -1041,6 +1084,7 @@ version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, @@ -1052,6 +1096,7 @@ version = "1.3.1" description = "Dictionary wrapper for quick access to deeply nested keys." optional = false python-versions = ">=3.5,<4.0" +groups = ["dev"] files = [ {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, @@ -1063,6 +1108,7 @@ version = "1.7.2" description = "End-to-End Multi-Lingual Optical Character Recognition (OCR) Solution" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "easyocr-1.7.2-py3-none-any.whl", hash = "sha256:5be12f9b0e595d443c9c3d10b0542074b50f0ec2d98b141a109cd961fd1c177c"}, ] @@ -1087,6 +1133,7 @@ version = "2.0.0" description = "An implementation of lxml.xmlfile for the standard library" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, @@ -1098,6 +1145,7 @@ version = "0.4.3" description = "HuggingFace community-driven open-source library of evaluation" optional = false python-versions = ">=3.8.0" +groups = ["main"] files = [ {file = "evaluate-0.4.3-py3-none-any.whl", hash = "sha256:47d8770bdea76e2c2ed0d40189273027d1a41ccea861bcc7ba12d30ec5d1e517"}, {file = "evaluate-0.4.3.tar.gz", hash = "sha256:3a5700cf83aabee9549264e1e5666f116367c61dbd4d38352015e859a5e2098d"}, @@ -1133,6 +1181,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version == \"3.10\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1147,6 +1197,7 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1161,13 +1212,14 @@ version = "2.2.0" description = "Get the currently executing AST node of a frame, and other information" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] [[package]] name = "filelock" @@ -1175,6 +1227,7 @@ version = "3.18.0" description = "A platform independent file lock." optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, @@ -1183,7 +1236,7 @@ files = [ [package.extras] docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] -typing = ["typing-extensions (>=4.12.2)"] +typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] [[package]] name = "filetype" @@ -1191,6 +1244,7 @@ version = "1.2.0" description = "Infer file type and MIME type of any file/buffer. No external dependencies." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"}, {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"}, @@ -1202,6 +1256,7 @@ version = "6.1.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" +groups = ["dev"] files = [ {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, @@ -1218,6 +1273,7 @@ version = "1.2.3" description = "Flake8 plug-in loading the configuration from pyproject.toml" optional = false python-versions = ">= 3.6" +groups = ["dev"] files = [ {file = "flake8_pyproject-1.2.3-py3-none-any.whl", hash = "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a"}, ] @@ -1235,6 +1291,7 @@ version = "4.56.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "fonttools-4.56.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:331954d002dbf5e704c7f3756028e21db07097c19722569983ba4d74df014000"}, {file = "fonttools-4.56.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d1613abd5af2f93c05867b3a3759a56e8bf97eb79b1da76b2bc10892f96ff16"}, @@ -1289,18 +1346,18 @@ files = [ ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "pycairo", "scipy"] +interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] -type1 = ["xattr"] +type1 = ["xattr ; sys_platform == \"darwin\""] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] name = "frozenlist" @@ -1308,6 +1365,7 @@ version = "1.5.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, @@ -1409,6 +1467,7 @@ version = "2024.12.0" description = "File-system specification" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2"}, {file = "fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f"}, @@ -1451,6 +1510,7 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1465,6 +1525,7 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1475,7 +1536,7 @@ gitdb = ">=4.0.1,<5" [package.extras] doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] -test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] [[package]] name = "huggingface-hub" @@ -1483,6 +1544,7 @@ version = "0.29.3" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" +groups = ["main"] files = [ {file = "huggingface_hub-0.29.3-py3-none-any.whl", hash = "sha256:0b25710932ac649c08cdbefa6c6ccb8e88eef82927cacdb048efb726429453aa"}, {file = "huggingface_hub-0.29.3.tar.gz", hash = "sha256:64519a25716e0ba382ba2d3fb3ca082e7c7eb4a2fc634d200e8380006e0760e5"}, @@ -1517,6 +1579,7 @@ version = "2.6.9" description = "File identification library for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "identify-2.6.9-py2.py3-none-any.whl", hash = "sha256:c98b4322da415a8e5a70ff6e51fbc2d2932c015532d77e9f8537b4ba7813b150"}, {file = "identify-2.6.9.tar.gz", hash = "sha256:d40dfe3142a1421d8518e3d3985ef5ac42890683e32306ad614a29490abeb6bf"}, @@ -1531,6 +1594,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1545,6 +1609,7 @@ version = "2.37.0" description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "imageio-2.37.0-py3-none-any.whl", hash = "sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed"}, {file = "imageio-2.37.0.tar.gz", hash = "sha256:71b57b3669666272c818497aebba2b4c5f20d5b37c81720e5e1a56d59c492996"}, @@ -1578,6 +1643,7 @@ version = "8.6.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, @@ -1587,12 +1653,12 @@ files = [ zipp = ">=3.20" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] [[package]] @@ -1601,6 +1667,7 @@ version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, @@ -1612,6 +1679,7 @@ version = "2.2.0" description = "Pythonic task execution" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "invoke-2.2.0-py3-none-any.whl", hash = "sha256:6ea924cc53d4f78e3d98bc436b08069a03077e6f85ad1ddaa8a116d7dad15820"}, {file = "invoke-2.2.0.tar.gz", hash = "sha256:ee6cbb101af1a859c7fe84f2a264c059020b0cb7fe3535f9424300ab568f6bd5"}, @@ -1623,6 +1691,7 @@ version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, @@ -1656,6 +1725,7 @@ version = "8.34.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" +groups = ["dev"] files = [ {file = "ipython-8.34.0-py3-none-any.whl", hash = "sha256:0419883fa46e0baa182c5d50ebb8d6b49df1889fdb70750ad6d8cfe678eda6e3"}, {file = "ipython-8.34.0.tar.gz", hash = "sha256:c31d658e754673ecc6514583e7dda8069e47136eb62458816b7d1e6625948b5a"}, @@ -1677,7 +1747,7 @@ typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli ; python_version < \"3.11\"", "typing_extensions"] kernel = ["ipykernel"] matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] @@ -1694,6 +1764,7 @@ version = "8.1.5" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245"}, {file = "ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17"}, @@ -1715,6 +1786,7 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -1729,6 +1801,7 @@ version = "3.4.0" description = "Utility functions for Python class constructs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, @@ -1747,6 +1820,7 @@ version = "6.0.1" description = "Useful decorators and context managers" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, @@ -1757,7 +1831,7 @@ files = [ [package.extras] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] [[package]] name = "jaraco-functools" @@ -1765,6 +1839,7 @@ version = "4.1.0" description = "Functools like those found in stdlib" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"}, {file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"}, @@ -1774,7 +1849,7 @@ files = [ more-itertools = "*" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] @@ -1787,6 +1862,7 @@ version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, @@ -1806,13 +1882,15 @@ version = "0.9.0" description = "Low-level, pure Python DBus protocol wrapper." optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "sys_platform == \"linux\"" files = [ {file = "jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"}, {file = "jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"}, ] [package.extras] -test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +test = ["async-timeout ; python_version < \"3.11\"", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] trio = ["trio"] [[package]] @@ -1821,6 +1899,7 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1838,6 +1917,7 @@ version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, @@ -1849,6 +1929,7 @@ version = "3.1.0" description = "Library with helpers for the jsonlines file format" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "jsonlines-3.1.0-py3-none-any.whl", hash = "sha256:632f5e38f93dfcb1ac8c4e09780b92af3a55f38f26e7c47ae85109d420b6ad39"}, {file = "jsonlines-3.1.0.tar.gz", hash = "sha256:2579cb488d96f815b0eb81629e3e6b0332da0962a18fa3532958f7ba14a5c37f"}, @@ -1863,6 +1944,7 @@ version = "1.1.0" description = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9"}, {file = "jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552"}, @@ -1874,6 +1956,7 @@ 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"}, @@ -1895,6 +1978,7 @@ 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"}, @@ -1909,6 +1993,7 @@ version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" +groups = ["dev"] 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"}, @@ -1923,7 +2008,7 @@ 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"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko ; sys_platform == \"win32\"", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" @@ -1931,6 +2016,7 @@ version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" +groups = ["dev"] 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"}, @@ -1951,6 +2037,7 @@ version = "3.0.13" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" +groups = ["dev"] 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"}, @@ -1962,6 +2049,7 @@ version = "25.6.0" description = "Store and access your passwords safely." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, @@ -1977,7 +2065,7 @@ pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] completion = ["shtab (>=1.1.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] @@ -1991,6 +2079,7 @@ version = "1.4.8" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, @@ -2080,6 +2169,7 @@ version = "3.77.0" description = "Pure Python library for LaTeX to MathML conversion" optional = false python-versions = ">=3.8.1,<4.0.0" +groups = ["main"] files = [ {file = "latex2mathml-3.77.0-py3-none-any.whl", hash = "sha256:5531e18a2a9eae7c24e257118b6a444cbba253cd27ff3e81f1bd6c41e88e786e"}, {file = "latex2mathml-3.77.0.tar.gz", hash = "sha256:e2f501d1878f2e489c3f6f12786bef74c62f712d2770f7f3c837eb20a55d0a1e"}, @@ -2091,6 +2181,7 @@ version = "0.4" description = "Makes it easy to load subpackages and functions on demand." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc"}, {file = "lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1"}, @@ -2110,6 +2201,7 @@ version = "1.10.0" description = "A fast and thorough lazy object proxy." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, @@ -2156,6 +2248,7 @@ version = "0.14.2" description = "Lightning toolbox for across the our ecosystem." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "lightning_utilities-0.14.2-py3-none-any.whl", hash = "sha256:da791fcaa731f651ec76a1a3b12994ed05af4d6841f2e78760233552709ef05d"}, {file = "lightning_utilities-0.14.2.tar.gz", hash = "sha256:0466a4f1bb9dff1c7190d4c7a32d1a8a1109f94fb816931efe8fb8b12bb0ab8d"}, @@ -2177,6 +2270,7 @@ version = "5.3.1" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a4058f16cee694577f7e4dd410263cd0ef75644b43802a689c2b3c2a7e69453b"}, {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:364de8f57d6eda0c16dcfb999af902da31396949efa0e583e12675d09709881b"}, @@ -2331,6 +2425,7 @@ 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"}, @@ -2355,6 +2450,7 @@ version = "2.1.2" description = "A markdown parser with high extensibility." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "marko-2.1.2-py3-none-any.whl", hash = "sha256:c14aa7a77468aaaf53cf056dcd3d32398b9df4c3fb81f5e120dd37cbb9f8c859"}, {file = "marko-2.1.2.tar.gz", hash = "sha256:a9170006b879376e6845c91b1ae3dce2992772954b99b70175ff888537186011"}, @@ -2371,6 +2467,7 @@ 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"}, @@ -2441,6 +2538,7 @@ version = "3.10.1" description = "Python plotting package" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "matplotlib-3.10.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16"}, {file = "matplotlib-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2"}, @@ -2498,6 +2596,7 @@ version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false python-versions = ">=3.8" +groups = ["dev"] 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"}, @@ -2512,6 +2611,7 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, @@ -2523,6 +2623,7 @@ 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"}, @@ -2534,6 +2635,7 @@ version = "10.6.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b"}, {file = "more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"}, @@ -2545,6 +2647,7 @@ version = "2.10.2" description = "A Python package for easy multiprocessing, but faster than multiprocessing" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "mpire-2.10.2-py3-none-any.whl", hash = "sha256:d627707f7a8d02aa4c7f7d59de399dec5290945ddf7fbd36cbb1d6ebb37a51fb"}, {file = "mpire-2.10.2.tar.gz", hash = "sha256:f66a321e93fadff34585a4bfa05e95bd946cf714b442f51c529038eb45773d97"}, @@ -2561,9 +2664,9 @@ tqdm = ">=4.27" [package.extras] dashboard = ["flask"] -dill = ["multiprocess", "multiprocess (>=0.70.15)"] +dill = ["multiprocess (>=0.70.15) ; python_version >= \"3.11\"", "multiprocess ; python_version < \"3.11\""] docs = ["docutils (==0.17.1)", "sphinx (==3.2.1)", "sphinx-autodoc-typehints (==1.11.0)", "sphinx-rtd-theme (==0.5.0)", "sphinx-versions (==1.0.1)", "sphinxcontrib-images (==0.9.2)"] -testing = ["ipywidgets", "multiprocess", "multiprocess (>=0.70.15)", "numpy", "pywin32 (>=301)", "rich"] +testing = ["ipywidgets", "multiprocess (>=0.70.15) ; python_version >= \"3.11\"", "multiprocess ; python_version < \"3.11\"", "numpy", "pywin32 (>=301) ; platform_system == \"Windows\"", "rich"] [[package]] name = "mpmath" @@ -2571,6 +2674,7 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2579,7 +2683,7 @@ files = [ [package.extras] develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] docs = ["sphinx"] -gmpy = ["gmpy2 (>=2.1.0a4)"] +gmpy = ["gmpy2 (>=2.1.0a4) ; platform_python_implementation != \"PyPy\""] tests = ["pytest (>=4.6)"] [[package]] @@ -2588,6 +2692,7 @@ version = "6.2.0" description = "multidict implementation" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "multidict-6.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b9f6392d98c0bd70676ae41474e2eecf4c7150cb419237a41f8f96043fcb81d1"}, {file = "multidict-6.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3501621d5e86f1a88521ea65d5cad0a0834c77b26f193747615b7c911e5422d2"}, @@ -2692,6 +2797,7 @@ version = "0.70.16" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "multiprocess-0.70.16-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee"}, {file = "multiprocess-0.70.16-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec"}, @@ -2716,6 +2822,7 @@ version = "1.15.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"}, {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"}, @@ -2769,6 +2876,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -2780,6 +2888,7 @@ version = "1.9.1" description = "Run any standard Python code quality tool on a Jupyter Notebook" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "nbqa-1.9.1-py3-none-any.whl", hash = "sha256:95552d2f6c2c038136252a805aa78d85018aef922586270c3a074332737282e5"}, {file = "nbqa-1.9.1.tar.gz", hash = "sha256:a1f4bcf587c597302fed295951001fc4e1be4ce0e77e1ab1b25ac2fbe3db0cdd"}, @@ -2800,6 +2909,7 @@ version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" +groups = ["dev"] 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"}, @@ -2811,6 +2921,7 @@ version = "3.4.2" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"}, {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"}, @@ -2830,6 +2941,7 @@ version = "0.2.21" description = "Python binding to Ammonia HTML sanitizer Rust crate" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "nh3-0.2.21-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:fcff321bd60c6c5c9cb4ddf2554e22772bb41ebd93ad88171bbbb6f271255286"}, {file = "nh3-0.2.21-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31eedcd7d08b0eae28ba47f43fd33a653b4cdb271d64f1aeda47001618348fde"}, @@ -2863,6 +2975,7 @@ version = "1.11.1.4" description = "Ninja is a small build system with a focus on speed" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "ninja-1.11.1.4-py3-none-macosx_10_9_universal2.whl", hash = "sha256:b33923c8da88e8da20b6053e38deb433f53656441614207e01d283ad02c5e8e7"}, {file = "ninja-1.11.1.4-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cede0af00b58e27b31f2482ba83292a8e9171cdb9acc2c867a3b6e40b3353e43"}, @@ -2889,6 +3002,7 @@ version = "3.9.1" description = "Natural Language Toolkit" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"}, {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"}, @@ -2914,6 +3028,7 @@ version = "1.9.1" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -2925,6 +3040,8 @@ version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] +markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -2970,6 +3087,8 @@ version = "2.2.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" +groups = ["main", "dev"] +markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "numpy-2.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9"}, {file = "numpy-2.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae"}, @@ -3034,6 +3153,8 @@ version = "12.4.5.8" description = "CUBLAS native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3"}, {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b"}, @@ -3046,6 +3167,8 @@ version = "12.4.127" description = "CUDA profiling tools runtime libs." optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a"}, {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb"}, @@ -3058,6 +3181,8 @@ version = "12.4.127" description = "NVRTC native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198"}, {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338"}, @@ -3070,6 +3195,8 @@ version = "12.4.127" description = "CUDA Runtime native Libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3"}, {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5"}, @@ -3082,6 +3209,8 @@ version = "9.1.0.70" description = "cuDNN runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, @@ -3096,6 +3225,8 @@ version = "11.2.1.3" description = "CUFFT native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399"}, {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9"}, @@ -3111,6 +3242,8 @@ version = "10.3.5.147" description = "CURAND native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9"}, {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b"}, @@ -3123,6 +3256,8 @@ version = "11.6.1.9" description = "CUDA solver native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e"}, {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260"}, @@ -3140,6 +3275,8 @@ version = "12.3.1.170" description = "CUSPARSE native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3"}, {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1"}, @@ -3155,6 +3292,8 @@ version = "0.6.2" description = "NVIDIA cuSPARSELt" optional = false python-versions = "*" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:067a7f6d03ea0d4841c85f0c6f1991c5dda98211f6302cb83a4ab234ee95bef8"}, {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:df2c24502fd76ebafe7457dbc4716b2fec071aabaed4fb7691a201cde03704d9"}, @@ -3167,6 +3306,8 @@ version = "2.21.5" description = "NVIDIA Collective Communication Library (NCCL) Runtime" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0"}, ] @@ -3177,6 +3318,8 @@ version = "12.4.127" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, @@ -3189,6 +3332,8 @@ version = "12.4.127" description = "NVIDIA Tools Extension" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3"}, {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a"}, @@ -3201,6 +3346,7 @@ version = "4.11.0.86" description = "Wrapper package for OpenCV python bindings." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798"}, {file = "opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca"}, @@ -3213,9 +3359,9 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, - {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, + {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] @@ -3225,6 +3371,7 @@ version = "3.1.5" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, @@ -3239,6 +3386,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -3250,6 +3398,7 @@ 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"}, @@ -3336,6 +3485,7 @@ version = "2.2.3.250308" description = "Type annotations for pandas" optional = false python-versions = ">=3.10" +groups = ["dev"] files = [ {file = "pandas_stubs-2.2.3.250308-py3-none-any.whl", hash = "sha256:a377edff3b61f8b268c82499fdbe7c00fdeed13235b8b71d6a1dc347aeddc74d"}, {file = "pandas_stubs-2.2.3.250308.tar.gz", hash = "sha256:3a6e9daf161f00b85c83772ed3d5cff9522028f07a94817472c07b91f46710fd"}, @@ -3351,6 +3501,7 @@ version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -3366,6 +3517,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -3377,6 +3529,8 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" +groups = ["dev"] +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"}, @@ -3391,6 +3545,7 @@ version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, @@ -3479,7 +3634,7 @@ docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -typing = ["typing-extensions"] +typing = ["typing-extensions ; python_version < \"3.10\""] xmp = ["defusedxml"] [[package]] @@ -3488,6 +3643,7 @@ version = "1.12.1.2" description = "Query metadata from sdists / bdists / installed packages." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pkginfo-1.12.1.2-py3-none-any.whl", hash = "sha256:c783ac885519cab2c34927ccfa6bf64b5a704d7c69afaea583dd9b7afe969343"}, {file = "pkginfo-1.12.1.2.tar.gz", hash = "sha256:5cd957824ac36f140260964eba3c6be6442a8359b8c48f4adf90210f33a04b7b"}, @@ -3502,6 +3658,7 @@ version = "4.3.7" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94"}, {file = "platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351"}, @@ -3518,6 +3675,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -3533,6 +3691,7 @@ version = "3.8.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, @@ -3551,6 +3710,7 @@ version = "3.0.50" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198"}, {file = "prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab"}, @@ -3565,6 +3725,7 @@ version = "0.3.0" description = "Accelerated property cache" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:efa44f64c37cc30c9f05932c740a8b40ce359f51882c70883cc95feac842da4d"}, {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2383a17385d9800b6eb5855c2f05ee550f803878f344f58b6e194de08b96352c"}, @@ -3672,6 +3833,7 @@ version = "7.0.0" description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, @@ -3684,6 +3846,7 @@ files = [ {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, ] +markers = {main = "sys_platform != \"darwin\" or platform_machine != \"x86_64\""} [package.extras] dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] @@ -3695,6 +3858,8 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = false python-versions = "*" +groups = ["dev"] +markers = "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"}, @@ -3706,6 +3871,7 @@ version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" +groups = ["dev"] 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"}, @@ -3720,6 +3886,7 @@ version = "19.0.1" description = "Python library for Apache Arrow" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fc28912a2dc924dddc2087679cc8b7263accc71b9ff025a1362b004711661a69"}, {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fca15aabbe9b8355800d923cc2e82c8ef514af321e18b437c3d782aa884eaeec"}, @@ -3774,6 +3941,7 @@ version = "1.3.0.post6" description = "Cython wrapper for the C++ translation of the Angus Johnson's Clipper library (ver. 6.4.2)" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pyclipper-1.3.0.post6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fa0f5e78cfa8262277bb3d0225537b3c2a90ef68fd90a229d5d24cf49955dcf4"}, {file = "pyclipper-1.3.0.post6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a01f182d8938c1dc515e8508ed2442f7eebd2c25c7d5cb29281f583c1a8008a4"}, @@ -3833,6 +4001,7 @@ version = "2.0.8" description = "Official APIs for the MS-COCO dataset" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pycocotools-2.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a66886f45b04cee1ff0492e9f5e25d430d8aa3eb63e63c4ebc620945caa11b9"}, {file = "pycocotools-2.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257130b65b7b0f122ce1ed62942867ca9789e56a68109682796cc85c9770c74a"}, @@ -3875,6 +4044,7 @@ version = "2.11.1" description = "Python style guide checker" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, @@ -3886,6 +4056,8 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "implementation_name == \"pypy\" or sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -3897,6 +4069,7 @@ version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, @@ -3909,7 +4082,7 @@ typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] [[package]] name = "pydantic-core" @@ -3917,6 +4090,7 @@ 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"}, @@ -4029,6 +4203,7 @@ version = "2.8.1" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c"}, {file = "pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585"}, @@ -4049,6 +4224,7 @@ version = "3.1.0" description = "passive checker of Python programs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, @@ -4060,6 +4236,7 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -4074,6 +4251,7 @@ version = "2.10" description = "Simple LaTeX parser providing latex-to-unicode and unicode-to-latex conversion" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pylatexenc-2.10.tar.gz", hash = "sha256:3dd8fd84eb46dc30bee1e23eaab8d8fb5a7f507347b23e5f38ad9675c84f40d3"}, ] @@ -4084,6 +4262,7 @@ version = "2.17.7" description = "python code static checker" optional = false python-versions = ">=3.7.2" +groups = ["dev"] files = [ {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, @@ -4112,6 +4291,7 @@ version = "3.2.3" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"}, {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"}, @@ -4126,6 +4306,7 @@ version = "4.30.1" description = "Python bindings to PDFium" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "pypdfium2-4.30.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:e07c47633732cc18d890bb7e965ad28a9c5a932e548acb928596f86be2e5ae37"}, {file = "pypdfium2-4.30.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5ea2d44e96d361123b67b00f527017aa9c847c871b5714e013c01c3eb36a79fe"}, @@ -4148,6 +4329,7 @@ version = "6.1.0" description = "pyproject-flake8 (`pflake8`), a monkey patching wrapper to connect flake8 with pyproject.toml configuration" optional = false python-versions = ">=3.8.1" +groups = ["dev"] files = [ {file = "pyproject_flake8-6.1.0-py3-none-any.whl", hash = "sha256:86ea5559263c098e1aa4f866776aa2cf45362fd91a576b9fd8fbbbb55db12c4e"}, {file = "pyproject_flake8-6.1.0.tar.gz", hash = "sha256:6da8e5a264395e0148bc11844c6fb50546f1fac83ac9210f7328664135f9e70f"}, @@ -4163,6 +4345,7 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -4185,6 +4368,7 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -4205,6 +4389,7 @@ version = "0.6.6" description = "Python Bidi layout wrapping the Rust crate unicode-bidi" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "python_bidi-0.6.6-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09d4da6b5851d0df01d7313a11d22f308fdfb0e12461f7262e0f55c521ccc0f1"}, {file = "python_bidi-0.6.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:493a844891e23264411b01df58ba77d5dbb0045da3787f4195f50a56bfb847d9"}, @@ -4326,6 +4511,7 @@ 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", "dev"] 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"}, @@ -4340,6 +4526,7 @@ version = "1.1.2" description = "Create, read, and update Microsoft Word .docx files." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe"}, {file = "python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd"}, @@ -4355,6 +4542,7 @@ version = "1.1.0" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"}, {file = "python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5"}, @@ -4369,6 +4557,7 @@ version = "3.15.0" description = "Interact with GitLab API" optional = false python-versions = ">=3.7.0" +groups = ["dev"] files = [ {file = "python-gitlab-3.15.0.tar.gz", hash = "sha256:c9e65eb7612a9fbb8abf0339972eca7fd7a73d4da66c9b446ffe528930aff534"}, {file = "python_gitlab-3.15.0-py3-none-any.whl", hash = "sha256:8f8d1c0d387f642eb1ac7bf5e8e0cd8b3dd49c6f34170cee3c7deb7d384611f3"}, @@ -4388,6 +4577,7 @@ version = "1.0.2" description = "Create, read, and update PowerPoint 2007+ (.pptx) files." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "python_pptx-1.0.2-py3-none-any.whl", hash = "sha256:160838e0b8565a8b1f67947675886e9fea18aa5e795db7ae531606d68e785cba"}, {file = "python_pptx-1.0.2.tar.gz", hash = "sha256:479a8af0eaf0f0d76b6f00b0887732874ad2e3188230315290cd1f9dd9cc7095"}, @@ -4405,6 +4595,7 @@ version = "7.34.6" description = "Automatic Semantic Versioning for Python projects" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "python-semantic-release-7.34.6.tar.gz", hash = "sha256:e9b8fb788024ae9510a924136d573588415a16eeca31cc5240f2754a80a2e831"}, {file = "python_semantic_release-7.34.6-py3-none-any.whl", hash = "sha256:7e3969ba4663d9b2087b02bf3ac140e202551377bf045c34e09bfe19753e19ab"}, @@ -4436,6 +4627,7 @@ version = "2025.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, @@ -4447,6 +4639,7 @@ version = "310" description = "Python for Window Extensions" optional = false python-versions = "*" +groups = ["main", "dev"] files = [ {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, @@ -4465,6 +4658,7 @@ files = [ {file = "pywin32-310-cp39-cp39-win32.whl", hash = "sha256:851c8d927af0d879221e616ae1f66145253537bbdd321a77e8ef701b443a9a1a"}, {file = "pywin32-310-cp39-cp39-win_amd64.whl", hash = "sha256:96867217335559ac619f00ad70e513c0fcf84b8a3af9fc2bba3b59b97da70475"}, ] +markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\"", dev = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} [[package]] name = "pywin32-ctypes" @@ -4472,6 +4666,8 @@ version = "0.2.3" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" optional = false python-versions = ">=3.6" +groups = ["dev"] +markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, @@ -4483,6 +4679,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] 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"}, @@ -4545,6 +4742,7 @@ version = "26.3.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pyzmq-26.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1586944f4736515af5c6d3a5b150c7e8ca2a2d6e46b23057320584d6f2438f4a"}, {file = "pyzmq-26.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa7efc695d1fc9f72d91bf9b6c6fe2d7e1b4193836ec530a98faf7d7a7577a58"}, @@ -4650,6 +4848,7 @@ version = "44.0" description = "readme_renderer is a library for rendering readme descriptions for Warehouse" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151"}, {file = "readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"}, @@ -4669,6 +4868,7 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -4685,6 +4885,7 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -4788,6 +4989,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -4809,6 +5011,7 @@ version = "1.0.0" description = "A utility belt for advanced users of python-requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["dev"] files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, @@ -4823,6 +5026,7 @@ version = "2.0.0" description = "Validating URI References per RFC 3986" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, @@ -4837,6 +5041,7 @@ 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"}, @@ -4856,6 +5061,7 @@ version = "0.23.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "rpds_py-0.23.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2a54027554ce9b129fc3d633c92fa33b30de9f08bc61b32c053dc9b537266fed"}, {file = "rpds_py-0.23.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5ef909a37e9738d146519657a1aab4584018746a18f71c692f2f22168ece40c"}, @@ -4968,6 +5174,7 @@ version = "1.4.0" description = "R-Tree spatial index for Python GIS" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "rtree-1.4.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:4d1bebc418101480aabf41767e772dd2155d3b27b1376cccbd93e4509485e091"}, {file = "rtree-1.4.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:997f8c38d5dffa3949ea8adb4c8b291ea5cd4ef5ee69455d642dd171baf9991d"}, @@ -4987,6 +5194,7 @@ version = "0.5.3" description = "" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073"}, {file = "safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21d01c14ff6c415c485616b8b0bf961c46b3b343ca59110d38d744e577f9cce7"}, @@ -5028,6 +5236,7 @@ version = "0.25.2" description = "Image processing in Python" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "scikit_image-0.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d3278f586793176599df6a4cf48cb6beadae35c31e58dc01a98023af3dc31c78"}, {file = "scikit_image-0.25.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5c311069899ce757d7dbf1d03e32acb38bb06153236ae77fcd820fd62044c063"}, @@ -5066,7 +5275,7 @@ tifffile = ">=2022.8.12" [package.extras] build = ["Cython (>=3.0.8)", "build (>=1.2.1)", "meson-python (>=0.16)", "ninja (>=1.11.1.1)", "numpy (>=2.0)", "pythran (>=0.16)", "spin (==0.13)"] data = ["pooch (>=1.6.0)"] -developer = ["ipython", "pre-commit", "tomli"] +developer = ["ipython", "pre-commit", "tomli ; python_version < \"3.11\""] docs = ["PyWavelets (>=1.6)", "dask[array] (>=2023.2.0)", "intersphinx-registry (>=0.2411.14)", "ipykernel", "ipywidgets", "kaleido (==0.2.1)", "matplotlib (>=3.7)", "myst-parser", "numpydoc (>=1.7)", "pandas (>=2.0)", "plotly (>=5.20)", "pooch (>=1.6)", "pydata-sphinx-theme (>=0.16)", "pytest-doctestplus", "scikit-learn (>=1.2)", "seaborn (>=0.11)", "sphinx (>=8.0)", "sphinx-copybutton", "sphinx-gallery[parallel] (>=0.18)", "sphinx_design (>=0.5)", "tifffile (>=2022.8.12)"] optional = ["PyWavelets (>=1.6)", "SimpleITK", "astropy (>=5.0)", "cloudpickle (>=1.1.1)", "dask[array] (>=2023.2.0)", "matplotlib (>=3.7)", "pooch (>=1.6.0)", "pyamg (>=5.2)", "scikit-learn (>=1.2)"] test = ["asv", "numpydoc (>=1.7)", "pooch (>=1.6.0)", "pytest (>=8)", "pytest-cov (>=2.11.0)", "pytest-doctestplus", "pytest-faulthandler", "pytest-localserver"] @@ -5077,6 +5286,7 @@ version = "1.15.2" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9"}, {file = "scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5"}, @@ -5132,7 +5342,7 @@ numpy = ">=1.23.5,<2.5" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "secretstorage" @@ -5140,6 +5350,8 @@ version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" optional = false python-versions = ">=3.6" +groups = ["dev"] +markers = "sys_platform == \"linux\"" files = [ {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, @@ -5155,6 +5367,7 @@ version = "2.2.2" description = "A fast and lightweight Python library for splitting text into semantically meaningful chunks." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "semchunk-2.2.2-py3-none-any.whl", hash = "sha256:94ca19020c013c073abdfd06d79a7c13637b91738335f3b8cdb5655ee7cc94d2"}, {file = "semchunk-2.2.2.tar.gz", hash = "sha256:940e89896e64eeb01de97ba60f51c8c7b96c6a3951dfcf574f25ce2146752f52"}, @@ -5170,6 +5383,7 @@ version = "2.13.0" description = "Python helper for Semantic Versioning (http://semver.org/)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["dev"] files = [ {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, @@ -5181,19 +5395,20 @@ version = "78.0.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "setuptools-78.0.2-py3-none-any.whl", hash = "sha256:4a612c80e1f1d71b80e4906ce730152e8dec23df439f82731d9d0b608d7b700d"}, {file = "setuptools-78.0.2.tar.gz", hash = "sha256:137525e6afb9022f019d6e884a319017f9bf879a0d8783985d32cbc8683cab93"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] -core = ["importlib_metadata (>=6)", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "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"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "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 ; sys_platform != \"cygwin\"", "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) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "shapely" @@ -5201,6 +5416,7 @@ version = "2.0.7" description = "Manipulation and analysis of geometric objects" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "shapely-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:33fb10e50b16113714ae40adccf7670379e9ccf5b7a41d0002046ba2b8f0f691"}, {file = "shapely-2.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f44eda8bd7a4bccb0f281264b34bf3518d8c4c9a8ffe69a1a05dabf6e8461147"}, @@ -5259,6 +5475,7 @@ version = "1.5.4" description = "Tool to Detect Surrounding Shell" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, @@ -5270,6 +5487,7 @@ 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", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -5281,6 +5499,7 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -5292,6 +5511,7 @@ 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"}, @@ -5303,6 +5523,7 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" +groups = ["dev"] 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"}, @@ -5322,6 +5543,7 @@ version = "1.13.1" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, @@ -5339,6 +5561,7 @@ version = "0.9.0" description = "Pretty-print tabular data" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, @@ -5353,6 +5576,7 @@ version = "2025.3.13" description = "Read and write TIFF files" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "tifffile-2025.3.13-py3-none-any.whl", hash = "sha256:10f205b923c04678f744a6d553f6f86c639c9ba6e714f6758d81af0678ba75dc"}, {file = "tifffile-2025.3.13.tar.gz", hash = "sha256:30fcc4584216937b5993d0568452b6fea8e12e61f9afb1a8e967c07c281faa06"}, @@ -5375,6 +5599,7 @@ version = "6.1.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "tokenize_rt-6.1.0-py2.py3-none-any.whl", hash = "sha256:d706141cdec4aa5f358945abe36b911b8cbdc844545da99e811250c0cee9b6fc"}, {file = "tokenize_rt-6.1.0.tar.gz", hash = "sha256:e8ee836616c0877ab7c7b54776d2fefcc3bde714449a206762425ae114b53c86"}, @@ -5386,6 +5611,8 @@ version = "0.19.1" description = "" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, @@ -5503,6 +5730,8 @@ version = "0.21.1" description = "" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "tokenizers-0.21.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e78e413e9e668ad790a29456e677d9d3aa50a9ad311a40905d6861ba7692cf41"}, {file = "tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:cd51cd0a91ecc801633829fcd1fda9cf8682ed3477c6243b9a095539de4aecf3"}, @@ -5535,6 +5764,7 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["dev"] 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"}, @@ -5576,6 +5806,7 @@ version = "0.13.2" description = "Style preserving TOML library" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, @@ -5587,6 +5818,7 @@ version = "2.6.0" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.9.0" +groups = ["main"] files = [ {file = "torch-2.6.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:6860df13d9911ac158f4c44031609700e1eba07916fff62e21e6ffa0a9e01961"}, {file = "torch-2.6.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c4f103a49830ce4c7561ef4434cc7926e5a5fe4e5eb100c19ab36ea1e2b634ab"}, @@ -5643,6 +5875,7 @@ version = "1.7.0" description = "PyTorch native Metrics" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "torchmetrics-1.7.0-py3-none-any.whl", hash = "sha256:39a72cf40c8452e041f5315b997ef811c2baaae01478131cf6ed9813f553a668"}, {file = "torchmetrics-1.7.0.tar.gz", hash = "sha256:7a26d5cb73a6ae51ab5cb514aa4dc0543af7287a507719986a06e15df12ea68b"}, @@ -5659,7 +5892,7 @@ all = ["SciencePlots (>=2.0.0)", "einops (>=0.7.0)", "gammatone (>=1.0.0)", "ipa audio = ["gammatone (>=1.0.0)", "librosa (>=0.10.0)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "pystoi (>=0.4.0)", "requests (>=2.19.0)", "torchaudio (>=2.0.1)"] clustering = ["torch_linear_assignment (>=0.0.2)"] detection = ["pycocotools (>2.0.0)", "torchvision (>=0.15.1)"] -dev = ["PyTDC (==0.4.1)", "SciencePlots (>=2.0.0)", "aeon (>=1.0.0)", "bert_score (==0.3.13)", "dists-pytorch (==0.1)", "dython (==0.7.9)", "einops (>=0.7.0)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.30)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.15.0)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.3.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "timm (>=0.9.0)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torch_linear_assignment (>=0.0.2)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +dev = ["PyTDC (==0.4.1) ; python_version < \"3.12\"", "SciencePlots (>=2.0.0)", "aeon (>=1.0.0) ; python_version > \"3.10\"", "bert_score (==0.3.13)", "dists-pytorch (==0.1)", "dython (==0.7.9)", "einops (>=0.7.0)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.30)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0) ; python_version < \"3.12\"", "mecab-ko-dic (>=1.0.0) ; python_version < \"3.12\"", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.15.0)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.3.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "timm (>=0.9.0)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torch_linear_assignment (>=0.0.2)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] image = ["scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.15.1)"] multimodal = ["einops (>=0.7.0)", "piq (<=0.8.0)", "timm (>=0.9.0)", "transformers (>=4.42.3)"] text = ["ipadic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>3.8.1)", "regex (>=2021.9.24)", "sentencepiece (>=0.2.0)", "tqdm (<4.68.0)", "transformers (>4.4.0)"] @@ -5672,6 +5905,7 @@ version = "0.21.0" description = "image and video datasets and models for torch deep learning" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "torchvision-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:044ea420b8c6c3162a234cada8e2025b9076fa82504758cd11ec5d0f8cd9fa37"}, {file = "torchvision-0.21.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:b0c0b264b89ab572888244f2e0bad5b7eaf5b696068fc0b93e96f7c3c198953f"}, @@ -5710,6 +5944,7 @@ 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 = ["dev"] 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"}, @@ -5730,6 +5965,7 @@ version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, @@ -5751,6 +5987,7 @@ version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -5766,6 +6003,8 @@ version = "4.42.4" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.8.0" +groups = ["main"] +markers = "sys_platform == \"darwin\" and platform_machine == \"x86_64\"" files = [ {file = "transformers-4.42.4-py3-none-any.whl", hash = "sha256:6d59061392d0f1da312af29c962df9017ff3c0108c681a56d1bc981004d16d24"}, {file = "transformers-4.42.4.tar.gz", hash = "sha256:f956e25e24df851f650cb2c158b6f4352dfae9d702f04c113ed24fc36ce7ae2d"}, @@ -5834,6 +6073,8 @@ version = "4.50.1" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.9.0" +groups = ["main"] +markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ {file = "transformers-4.50.1-py3-none-any.whl", hash = "sha256:e9b9bd274518150528c1d745c7ebba72d27e4e52f2deffaa1fddebad6912da5d"}, {file = "transformers-4.50.1.tar.gz", hash = "sha256:6ee542d2cce7e1b6a06ae350599c27ddf2e6e45ec9d0cb42915b37fca3d6399a"}, @@ -5905,6 +6146,8 @@ version = "3.2.0" description = "A language and compiler for custom Deep Learning operations" optional = false python-versions = "*" +groups = ["main"] +markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\"" files = [ {file = "triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3e54983cd51875855da7c68ec05c05cf8bb08df361b1d5b69e05e40b0c9bd62"}, {file = "triton-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8009a1fb093ee8546495e96731336a33fb8856a38e45bb4ab6affd6dbc3ba220"}, @@ -5924,6 +6167,7 @@ version = "3.8.0" description = "Collection of utilities for publishing packages on PyPI" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, @@ -5947,6 +6191,7 @@ version = "0.12.5" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"}, {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"}, @@ -5964,6 +6209,7 @@ version = "3.1.5.20250306" description = "Typing stubs for openpyxl" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "types_openpyxl-3.1.5.20250306-py3-none-any.whl", hash = "sha256:f7733dac1dcb07c89ff5ffde8452ee8d272be638defed855f4c48b2990ce5aa7"}, {file = "types_openpyxl-3.1.5.20250306.tar.gz", hash = "sha256:aa7ad2425e8020ff46a31633becfe1f3c64114498d964c536199f654b464e6bc"}, @@ -5975,6 +6221,7 @@ version = "2025.1.0.20250318" description = "Typing stubs for pytz" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "types_pytz-2025.1.0.20250318-py3-none-any.whl", hash = "sha256:04dba4907c5415777083f9548693c6d9f80ec53adcaff55a38526a3f8ddcae04"}, {file = "types_pytz-2025.1.0.20250318.tar.gz", hash = "sha256:97e0e35184c6fe14e3a5014512057f2c57bb0c6582d63c1cfcc4809f82180449"}, @@ -5986,6 +6233,7 @@ version = "2.32.0.20250306" description = "Typing stubs for requests" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "types_requests-2.32.0.20250306-py3-none-any.whl", hash = "sha256:25f2cbb5c8710b2022f8bbee7b2b66f319ef14aeea2f35d80f18c9dbf3b60a0b"}, {file = "types_requests-2.32.0.20250306.tar.gz", hash = "sha256:0962352694ec5b2f95fda877ee60a159abdf84a0fc6fdace599f20acb41a03d1"}, @@ -6000,6 +6248,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] 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"}, @@ -6011,6 +6260,7 @@ version = "2025.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" +groups = ["main"] files = [ {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, @@ -6022,13 +6272,14 @@ version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -6039,6 +6290,7 @@ version = "20.29.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "virtualenv-20.29.3-py3-none-any.whl", hash = "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170"}, {file = "virtualenv-20.29.3.tar.gz", hash = "sha256:95e39403fcf3940ac45bc717597dba16110b74506131845d9b687d5e73d947ac"}, @@ -6051,7 +6303,7 @@ platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] [[package]] name = "wcwidth" @@ -6059,6 +6311,7 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -6070,6 +6323,7 @@ version = "0.45.1" description = "A built-package format for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"}, {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"}, @@ -6084,6 +6338,7 @@ version = "4.0.13" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71"}, {file = "widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6"}, @@ -6095,6 +6350,7 @@ version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -6183,6 +6439,7 @@ version = "3.2.2" description = "A Python module for creating Excel XLSX files." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "XlsxWriter-3.2.2-py3-none-any.whl", hash = "sha256:272ce861e7fa5e82a4a6ebc24511f2cb952fde3461f6c6e1a1e81d3272db1471"}, {file = "xlsxwriter-3.2.2.tar.gz", hash = "sha256:befc7f92578a85fed261639fb6cde1fd51b79c5e854040847dde59d4317077dc"}, @@ -6194,6 +6451,7 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -6205,6 +6463,7 @@ version = "3.5.0" description = "Python binding for xxHash" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "xxhash-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ece616532c499ee9afbb83078b1b952beffef121d989841f7f4b3dc5ac0fd212"}, {file = "xxhash-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3171f693dbc2cef6477054a665dc255d996646b4023fe56cb4db80e26f4cc520"}, @@ -6337,6 +6596,7 @@ version = "1.18.3" description = "Yet another URL library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, @@ -6433,20 +6693,21 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.10" content-hash = "31ead2096e0bbaaecc07dfb6c470d9e3562f4b906661d5d1b6c546daee068335" From 8c815631d5e864603c69068f4d9ff4db2f325526 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Mon, 31 Mar 2025 17:19:06 +0200 Subject: [PATCH 63/81] Update lockfile Signed-off-by: Christoph Auer --- poetry.lock | 771 +++++++++++++++++++++++++++++----------------------- 1 file changed, 425 insertions(+), 346 deletions(-) diff --git a/poetry.lock b/poetry.lock index f403a4d6..96673135 100644 --- a/poetry.lock +++ b/poetry.lock @@ -794,14 +794,14 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "datasets" -version = "3.4.1" +version = "3.5.0" description = "HuggingFace community-driven open-source library of datasets" optional = false python-versions = ">=3.9.0" groups = ["main"] files = [ - {file = "datasets-3.4.1-py3-none-any.whl", hash = "sha256:b91cf257bd64132fa9d953dd4768ab6d63205597301f132a74271cfcce8b5dd3"}, - {file = "datasets-3.4.1.tar.gz", hash = "sha256:e23968da79bc014ef9f7540eeb7771c6180eae82c86ebcfcc10535a03caf08b5"}, + {file = "datasets-3.5.0-py3-none-any.whl", hash = "sha256:b3b7f163acc6ac4e01a1b00eef26d48bd4039288ceea3601d169272bd5581006"}, + {file = "datasets-3.5.0.tar.gz", hash = "sha256:9e39560e34f83a64e48ceca7adeb645ede3c3055c5cf48ed2b454f8ed2b89754"}, ] [package.dependencies] @@ -826,6 +826,7 @@ benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30. dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyav", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\"", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0) ; python_version < \"3.10\"", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "torchvision", "transformers", "transformers (>=4.42.0)", "zstandard"] docs = ["s3fs", "tensorflow (>=2.6.0)", "torch", "transformers"] jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] +pdfs = ["pdfplumber (>=0.11.4)"] quality = ["ruff (>=0.3.0)"] s3 = ["s3fs"] tensorflow = ["tensorflow (>=2.6.0)"] @@ -924,21 +925,21 @@ files = [ [[package]] name = "docling" -version = "2.28.1" +version = "2.28.4" description = "SDK and CLI for parsing PDF, DOCX, HTML, and more, to a unified document representation for powering downstream workflows such as gen AI applications." optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "docling-2.28.1-py3-none-any.whl", hash = "sha256:aae0dbfb8a8aacadfd3662782bc45c0688459dd1dafc5a69ad81318a8abfb6a5"}, - {file = "docling-2.28.1.tar.gz", hash = "sha256:1a48d810cbbd0855b40c7a8df4a6ce9477aeb133580a329ab1906e5807f4369d"}, + {file = "docling-2.28.4-py3-none-any.whl", hash = "sha256:1b88f8152d404113c1a7b5fa8ee24a6190807a425a3e5745f2ae3f57bdd5a0eb"}, + {file = "docling-2.28.4.tar.gz", hash = "sha256:d4e6c1ca787b176db930212340e0e8391c1b0b65dddcf2a3c4cdb92ce08acc15"}, ] [package.dependencies] accelerate = {version = ">=1.2.1,<2.0.0", optional = true, markers = "(sys_platform != \"darwin\" or platform_machine != \"x86_64\") and extra == \"vlm\""} beautifulsoup4 = ">=4.12.3,<5.0.0" certifi = ">=2024.7.4" -docling-core = {version = ">=2.23.1,<3.0.0", extras = ["chunking"]} +docling-core = {version = ">=2.24.1,<3.0.0", extras = ["chunking"]} docling-ibm-models = ">=3.4.0,<4.0.0" docling-parse = ">=4.0.0,<5.0.0" easyocr = ">=1.7,<2.0" @@ -974,14 +975,14 @@ vlm = ["accelerate (>=1.2.1,<2.0.0) ; sys_platform != \"darwin\" or platform_mac [[package]] name = "docling-core" -version = "2.24.0" +version = "2.25.0" description = "A python library to define and validate data types in Docling." optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "docling_core-2.24.0-py3-none-any.whl", hash = "sha256:5c14f8dd8c6add6f5fa8104ff202df1baa7fd2471123bea56137f866e21b8d40"}, - {file = "docling_core-2.24.0.tar.gz", hash = "sha256:7bb880a72963accb47c9d05edd712601ccbd1d8a9fccba14ae6ef41baef41c69"}, + {file = "docling_core-2.25.0-py3-none-any.whl", hash = "sha256:24fe431005518df8e554b69c33178bca903bcf91c230cdcd31a905369f53a461"}, + {file = "docling_core-2.25.0.tar.gz", hash = "sha256:a2019392592840b2829082ef0c1d1a9096fb3512ae44c3a93dc04a5eaef81b2f"}, ] [package.dependencies] @@ -1540,14 +1541,14 @@ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3. [[package]] name = "huggingface-hub" -version = "0.29.3" +version = "0.30.1" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" groups = ["main"] files = [ - {file = "huggingface_hub-0.29.3-py3-none-any.whl", hash = "sha256:0b25710932ac649c08cdbefa6c6ccb8e88eef82927cacdb048efb726429453aa"}, - {file = "huggingface_hub-0.29.3.tar.gz", hash = "sha256:64519a25716e0ba382ba2d3fb3ca082e7c7eb4a2fc634d200e8380006e0760e5"}, + {file = "huggingface_hub-0.30.1-py3-none-any.whl", hash = "sha256:0f6aa5ec5a4e68e5b9e45d556b4e5ea180c58f5a5ffa734e7f38c9d573028959"}, + {file = "huggingface_hub-0.30.1.tar.gz", hash = "sha256:f379e8b8d0791295602538856638460ae3cf679c7f304201eb80fb98c771950e"}, ] [package.dependencies] @@ -1565,6 +1566,7 @@ cli = ["InquirerPy (==0.3.4)"] dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] hf-transfer = ["hf-transfer (>=0.1.4)"] +hf-xet = ["hf-xet (>=0.1.4)"] inference = ["aiohttp"] quality = ["libcst (==1.4.0)", "mypy (==1.5.1)", "ruff (>=0.9.0)"] tensorflow = ["graphviz", "pydot", "tensorflow"] @@ -1726,6 +1728,7 @@ description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" groups = ["dev"] +markers = "python_version == \"3.10\"" files = [ {file = "ipython-8.34.0-py3-none-any.whl", hash = "sha256:0419883fa46e0baa182c5d50ebb8d6b49df1889fdb70750ad6d8cfe678eda6e3"}, {file = "ipython-8.34.0.tar.gz", hash = "sha256:c31d658e754673ecc6514583e7dda8069e47136eb62458816b7d1e6625948b5a"}, @@ -1758,6 +1761,56 @@ 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 = "ipython" +version = "9.0.2" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.11" +groups = ["dev"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "ipython-9.0.2-py3-none-any.whl", hash = "sha256:143ef3ea6fb1e1bffb4c74b114051de653ffb7737a3f7ab1670e657ca6ae8c44"}, + {file = "ipython-9.0.2.tar.gz", hash = "sha256:ec7b479e3e5656bf4f58c652c120494df1820f4f28f522fb7ca09e213c2aab52"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +ipython-pygments-lexers = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt_toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack_data = "*" +traitlets = ">=5.13.0" +typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[doc,matplotlib,test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinx_toml (==0.0.4)", "typing_extensions"] +matplotlib = ["matplotlib"] +test = ["packaging", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +description = "Defines a variety of Pygments lexers for highlighting IPython code." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c"}, + {file = "ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81"}, +] + +[package.dependencies] +pygments = "*" + [[package]] name = "ipywidgets" version = "8.1.5" @@ -3361,8 +3414,8 @@ files = [ numpy = [ {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.5", markers = "python_version == \"3.11\""}, ] [[package]] @@ -3447,8 +3500,8 @@ files = [ [package.dependencies] numpy = [ {version = ">=1.22.4", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -3721,110 +3774,110 @@ wcwidth = "*" [[package]] name = "propcache" -version = "0.3.0" +version = "0.3.1" description = "Accelerated property cache" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:efa44f64c37cc30c9f05932c740a8b40ce359f51882c70883cc95feac842da4d"}, - {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2383a17385d9800b6eb5855c2f05ee550f803878f344f58b6e194de08b96352c"}, - {file = "propcache-0.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3e7420211f5a65a54675fd860ea04173cde60a7cc20ccfbafcccd155225f8bc"}, - {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3302c5287e504d23bb0e64d2a921d1eb4a03fb93a0a0aa3b53de059f5a5d737d"}, - {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7e2e068a83552ddf7a39a99488bcba05ac13454fb205c847674da0352602082f"}, - {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d913d36bdaf368637b4f88d554fb9cb9d53d6920b9c5563846555938d5450bf"}, - {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ee1983728964d6070ab443399c476de93d5d741f71e8f6e7880a065f878e0b9"}, - {file = "propcache-0.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36ca5e9a21822cc1746023e88f5c0af6fce3af3b85d4520efb1ce4221bed75cc"}, - {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9ecde3671e62eeb99e977f5221abcf40c208f69b5eb986b061ccec317c82ebd0"}, - {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d383bf5e045d7f9d239b38e6acadd7b7fdf6c0087259a84ae3475d18e9a2ae8b"}, - {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8cb625bcb5add899cb8ba7bf716ec1d3e8f7cdea9b0713fa99eadf73b6d4986f"}, - {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5fa159dcee5dba00c1def3231c249cf261185189205073bde13797e57dd7540a"}, - {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a7080b0159ce05f179cfac592cda1a82898ca9cd097dacf8ea20ae33474fbb25"}, - {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ed7161bccab7696a473fe7ddb619c1d75963732b37da4618ba12e60899fefe4f"}, - {file = "propcache-0.3.0-cp310-cp310-win32.whl", hash = "sha256:bf0d9a171908f32d54f651648c7290397b8792f4303821c42a74e7805bfb813c"}, - {file = "propcache-0.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:42924dc0c9d73e49908e35bbdec87adedd651ea24c53c29cac103ede0ea1d340"}, - {file = "propcache-0.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9ddd49258610499aab83b4f5b61b32e11fce873586282a0e972e5ab3bcadee51"}, - {file = "propcache-0.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2578541776769b500bada3f8a4eeaf944530516b6e90c089aa368266ed70c49e"}, - {file = "propcache-0.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8074c5dd61c8a3e915fa8fc04754fa55cfa5978200d2daa1e2d4294c1f136aa"}, - {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b58229a844931bca61b3a20efd2be2a2acb4ad1622fc026504309a6883686fbf"}, - {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e45377d5d6fefe1677da2a2c07b024a6dac782088e37c0b1efea4cfe2b1be19b"}, - {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ec5060592d83454e8063e487696ac3783cc48c9a329498bafae0d972bc7816c9"}, - {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15010f29fbed80e711db272909a074dc79858c6d28e2915704cfc487a8ac89c6"}, - {file = "propcache-0.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a254537b9b696ede293bfdbc0a65200e8e4507bc9f37831e2a0318a9b333c85c"}, - {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2b975528998de037dfbc10144b8aed9b8dd5a99ec547f14d1cb7c5665a43f075"}, - {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:19d36bb351ad5554ff20f2ae75f88ce205b0748c38b146c75628577020351e3c"}, - {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6032231d4a5abd67c7f71168fd64a47b6b451fbcb91c8397c2f7610e67683810"}, - {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6985a593417cdbc94c7f9c3403747335e450c1599da1647a5af76539672464d3"}, - {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6a1948df1bb1d56b5e7b0553c0fa04fd0e320997ae99689488201f19fa90d2e7"}, - {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8319293e85feadbbfe2150a5659dbc2ebc4afdeaf7d98936fb9a2f2ba0d4c35c"}, - {file = "propcache-0.3.0-cp311-cp311-win32.whl", hash = "sha256:63f26258a163c34542c24808f03d734b338da66ba91f410a703e505c8485791d"}, - {file = "propcache-0.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:cacea77ef7a2195f04f9279297684955e3d1ae4241092ff0cfcef532bb7a1c32"}, - {file = "propcache-0.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e53d19c2bf7d0d1e6998a7e693c7e87300dd971808e6618964621ccd0e01fe4e"}, - {file = "propcache-0.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a61a68d630e812b67b5bf097ab84e2cd79b48c792857dc10ba8a223f5b06a2af"}, - {file = "propcache-0.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb91d20fa2d3b13deea98a690534697742029f4fb83673a3501ae6e3746508b5"}, - {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67054e47c01b7b349b94ed0840ccae075449503cf1fdd0a1fdd98ab5ddc2667b"}, - {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:997e7b8f173a391987df40f3b52c423e5850be6f6df0dcfb5376365440b56667"}, - {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d663fd71491dde7dfdfc899d13a067a94198e90695b4321084c6e450743b8c7"}, - {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8884ba1a0fe7210b775106b25850f5e5a9dc3c840d1ae9924ee6ea2eb3acbfe7"}, - {file = "propcache-0.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa806bbc13eac1ab6291ed21ecd2dd426063ca5417dd507e6be58de20e58dfcf"}, - {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6f4d7a7c0aff92e8354cceca6fe223973ddf08401047920df0fcb24be2bd5138"}, - {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9be90eebc9842a93ef8335291f57b3b7488ac24f70df96a6034a13cb58e6ff86"}, - {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bf15fc0b45914d9d1b706f7c9c4f66f2b7b053e9517e40123e137e8ca8958b3d"}, - {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5a16167118677d94bb48bfcd91e420088854eb0737b76ec374b91498fb77a70e"}, - {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:41de3da5458edd5678b0f6ff66691507f9885f5fe6a0fb99a5d10d10c0fd2d64"}, - {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:728af36011bb5d344c4fe4af79cfe186729efb649d2f8b395d1572fb088a996c"}, - {file = "propcache-0.3.0-cp312-cp312-win32.whl", hash = "sha256:6b5b7fd6ee7b54e01759f2044f936dcf7dea6e7585f35490f7ca0420fe723c0d"}, - {file = "propcache-0.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:2d15bc27163cd4df433e75f546b9ac31c1ba7b0b128bfb1b90df19082466ff57"}, - {file = "propcache-0.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a2b9bf8c79b660d0ca1ad95e587818c30ccdb11f787657458d6f26a1ea18c568"}, - {file = "propcache-0.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b0c1a133d42c6fc1f5fbcf5c91331657a1ff822e87989bf4a6e2e39b818d0ee9"}, - {file = "propcache-0.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bb2f144c6d98bb5cbc94adeb0447cfd4c0f991341baa68eee3f3b0c9c0e83767"}, - {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1323cd04d6e92150bcc79d0174ce347ed4b349d748b9358fd2e497b121e03c8"}, - {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b812b3cb6caacd072276ac0492d249f210006c57726b6484a1e1805b3cfeea0"}, - {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:742840d1d0438eb7ea4280f3347598f507a199a35a08294afdcc560c3739989d"}, - {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c6e7e4f9167fddc438cd653d826f2222222564daed4116a02a184b464d3ef05"}, - {file = "propcache-0.3.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a94ffc66738da99232ddffcf7910e0f69e2bbe3a0802e54426dbf0714e1c2ffe"}, - {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c6ec957025bf32b15cbc6b67afe233c65b30005e4c55fe5768e4bb518d712f1"}, - {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:549722908de62aa0b47a78b90531c022fa6e139f9166be634f667ff45632cc92"}, - {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5d62c4f6706bff5d8a52fd51fec6069bef69e7202ed481486c0bc3874912c787"}, - {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:24c04f8fbf60094c531667b8207acbae54146661657a1b1be6d3ca7773b7a545"}, - {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7c5f5290799a3f6539cc5e6f474c3e5c5fbeba74a5e1e5be75587746a940d51e"}, - {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4fa0e7c9c3cf7c276d4f6ab9af8adddc127d04e0fcabede315904d2ff76db626"}, - {file = "propcache-0.3.0-cp313-cp313-win32.whl", hash = "sha256:ee0bd3a7b2e184e88d25c9baa6a9dc609ba25b76daae942edfb14499ac7ec374"}, - {file = "propcache-0.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1c8f7d896a16da9455f882870a507567d4f58c53504dc2d4b1e1d386dfe4588a"}, - {file = "propcache-0.3.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e560fd75aaf3e5693b91bcaddd8b314f4d57e99aef8a6c6dc692f935cc1e6bbf"}, - {file = "propcache-0.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:65a37714b8ad9aba5780325228598a5b16c47ba0f8aeb3dc0514701e4413d7c0"}, - {file = "propcache-0.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:07700939b2cbd67bfb3b76a12e1412405d71019df00ca5697ce75e5ef789d829"}, - {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c0fdbdf6983526e269e5a8d53b7ae3622dd6998468821d660d0daf72779aefa"}, - {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:794c3dd744fad478b6232289c866c25406ecdfc47e294618bdf1697e69bd64a6"}, - {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4544699674faf66fb6b4473a1518ae4999c1b614f0b8297b1cef96bac25381db"}, - {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fddb8870bdb83456a489ab67c6b3040a8d5a55069aa6f72f9d872235fbc52f54"}, - {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f857034dc68d5ceb30fb60afb6ff2103087aea10a01b613985610e007053a121"}, - {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02df07041e0820cacc8f739510078f2aadcfd3fc57eaeeb16d5ded85c872c89e"}, - {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f47d52fd9b2ac418c4890aad2f6d21a6b96183c98021f0a48497a904199f006e"}, - {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9ff4e9ecb6e4b363430edf2c6e50173a63e0820e549918adef70515f87ced19a"}, - {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ecc2920630283e0783c22e2ac94427f8cca29a04cfdf331467d4f661f4072dac"}, - {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:c441c841e82c5ba7a85ad25986014be8d7849c3cfbdb6004541873505929a74e"}, - {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c929916cbdb540d3407c66f19f73387f43e7c12fa318a66f64ac99da601bcdf"}, - {file = "propcache-0.3.0-cp313-cp313t-win32.whl", hash = "sha256:0c3e893c4464ebd751b44ae76c12c5f5c1e4f6cbd6fbf67e3783cd93ad221863"}, - {file = "propcache-0.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:75e872573220d1ee2305b35c9813626e620768248425f58798413e9c39741f46"}, - {file = "propcache-0.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:03c091bb752349402f23ee43bb2bff6bd80ccab7c9df6b88ad4322258d6960fc"}, - {file = "propcache-0.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:46ed02532cb66612d42ae5c3929b5e98ae330ea0f3900bc66ec5f4862069519b"}, - {file = "propcache-0.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11ae6a8a01b8a4dc79093b5d3ca2c8a4436f5ee251a9840d7790dccbd96cb649"}, - {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df03cd88f95b1b99052b52b1bb92173229d7a674df0ab06d2b25765ee8404bce"}, - {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03acd9ff19021bd0567582ac88f821b66883e158274183b9e5586f678984f8fe"}, - {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd54895e4ae7d32f1e3dd91261df46ee7483a735017dc6f987904f194aa5fd14"}, - {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a67e5c04e3119594d8cfae517f4b9330c395df07ea65eab16f3d559b7068fe"}, - {file = "propcache-0.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee25f1ac091def37c4b59d192bbe3a206298feeb89132a470325bf76ad122a1e"}, - {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:58e6d2a5a7cb3e5f166fd58e71e9a4ff504be9dc61b88167e75f835da5764d07"}, - {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:be90c94570840939fecedf99fa72839aed70b0ced449b415c85e01ae67422c90"}, - {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:49ea05212a529c2caffe411e25a59308b07d6e10bf2505d77da72891f9a05641"}, - {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:119e244ab40f70a98c91906d4c1f4c5f2e68bd0b14e7ab0a06922038fae8a20f"}, - {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:507c5357a8d8b4593b97fb669c50598f4e6cccbbf77e22fa9598aba78292b4d7"}, - {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8526b0941ec5a40220fc4dfde76aed58808e2b309c03e9fa8e2260083ef7157f"}, - {file = "propcache-0.3.0-cp39-cp39-win32.whl", hash = "sha256:7cedd25e5f678f7738da38037435b340694ab34d424938041aa630d8bac42663"}, - {file = "propcache-0.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:bf4298f366ca7e1ad1d21bbb58300a6985015909964077afd37559084590c929"}, - {file = "propcache-0.3.0-py3-none-any.whl", hash = "sha256:67dda3c7325691c2081510e92c561f465ba61b975f481735aefdfc845d2cd043"}, - {file = "propcache-0.3.0.tar.gz", hash = "sha256:a8fd93de4e1d278046345f49e2238cdb298589325849b2645d4a94c53faeffc5"}, + {file = "propcache-0.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f27785888d2fdd918bc36de8b8739f2d6c791399552333721b58193f68ea3e98"}, + {file = "propcache-0.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4e89cde74154c7b5957f87a355bb9c8ec929c167b59c83d90654ea36aeb6180"}, + {file = "propcache-0.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:730178f476ef03d3d4d255f0c9fa186cb1d13fd33ffe89d39f2cda4da90ceb71"}, + {file = "propcache-0.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967a8eec513dbe08330f10137eacb427b2ca52118769e82ebcfcab0fba92a649"}, + {file = "propcache-0.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b9145c35cc87313b5fd480144f8078716007656093d23059e8993d3a8fa730f"}, + {file = "propcache-0.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e64e948ab41411958670f1093c0a57acfdc3bee5cf5b935671bbd5313bcf229"}, + {file = "propcache-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:319fa8765bfd6a265e5fa661547556da381e53274bc05094fc9ea50da51bfd46"}, + {file = "propcache-0.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66d8ccbc902ad548312b96ed8d5d266d0d2c6d006fd0f66323e9d8f2dd49be7"}, + {file = "propcache-0.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2d219b0dbabe75e15e581fc1ae796109b07c8ba7d25b9ae8d650da582bed01b0"}, + {file = "propcache-0.3.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cd6a55f65241c551eb53f8cf4d2f4af33512c39da5d9777694e9d9c60872f519"}, + {file = "propcache-0.3.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9979643ffc69b799d50d3a7b72b5164a2e97e117009d7af6dfdd2ab906cb72cd"}, + {file = "propcache-0.3.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4cf9e93a81979f1424f1a3d155213dc928f1069d697e4353edb8a5eba67c6259"}, + {file = "propcache-0.3.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2fce1df66915909ff6c824bbb5eb403d2d15f98f1518e583074671a30fe0c21e"}, + {file = "propcache-0.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4d0dfdd9a2ebc77b869a0b04423591ea8823f791293b527dc1bb896c1d6f1136"}, + {file = "propcache-0.3.1-cp310-cp310-win32.whl", hash = "sha256:1f6cc0ad7b4560e5637eb2c994e97b4fa41ba8226069c9277eb5ea7101845b42"}, + {file = "propcache-0.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:47ef24aa6511e388e9894ec16f0fbf3313a53ee68402bc428744a367ec55b833"}, + {file = "propcache-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5"}, + {file = "propcache-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371"}, + {file = "propcache-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da"}, + {file = "propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744"}, + {file = "propcache-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0"}, + {file = "propcache-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5"}, + {file = "propcache-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256"}, + {file = "propcache-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073"}, + {file = "propcache-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d"}, + {file = "propcache-0.3.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f"}, + {file = "propcache-0.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0"}, + {file = "propcache-0.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a"}, + {file = "propcache-0.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a"}, + {file = "propcache-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9"}, + {file = "propcache-0.3.1-cp311-cp311-win32.whl", hash = "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005"}, + {file = "propcache-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7"}, + {file = "propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723"}, + {file = "propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976"}, + {file = "propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b"}, + {file = "propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f"}, + {file = "propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70"}, + {file = "propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7"}, + {file = "propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25"}, + {file = "propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277"}, + {file = "propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8"}, + {file = "propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e"}, + {file = "propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee"}, + {file = "propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815"}, + {file = "propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5"}, + {file = "propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7"}, + {file = "propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b"}, + {file = "propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3"}, + {file = "propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8"}, + {file = "propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f"}, + {file = "propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111"}, + {file = "propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5"}, + {file = "propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb"}, + {file = "propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7"}, + {file = "propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120"}, + {file = "propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654"}, + {file = "propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e"}, + {file = "propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b"}, + {file = "propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53"}, + {file = "propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5"}, + {file = "propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7"}, + {file = "propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef"}, + {file = "propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24"}, + {file = "propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037"}, + {file = "propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f"}, + {file = "propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c"}, + {file = "propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc"}, + {file = "propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de"}, + {file = "propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6"}, + {file = "propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7"}, + {file = "propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458"}, + {file = "propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11"}, + {file = "propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c"}, + {file = "propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf"}, + {file = "propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27"}, + {file = "propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757"}, + {file = "propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18"}, + {file = "propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a"}, + {file = "propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d"}, + {file = "propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e"}, + {file = "propcache-0.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ed5f6d2edbf349bd8d630e81f474d33d6ae5d07760c44d33cd808e2f5c8f4ae6"}, + {file = "propcache-0.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:668ddddc9f3075af019f784456267eb504cb77c2c4bd46cc8402d723b4d200bf"}, + {file = "propcache-0.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0c86e7ceea56376216eba345aa1fc6a8a6b27ac236181f840d1d7e6a1ea9ba5c"}, + {file = "propcache-0.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83be47aa4e35b87c106fc0c84c0fc069d3f9b9b06d3c494cd404ec6747544894"}, + {file = "propcache-0.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:27c6ac6aa9fc7bc662f594ef380707494cb42c22786a558d95fcdedb9aa5d035"}, + {file = "propcache-0.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64a956dff37080b352c1c40b2966b09defb014347043e740d420ca1eb7c9b908"}, + {file = "propcache-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82de5da8c8893056603ac2d6a89eb8b4df49abf1a7c19d536984c8dd63f481d5"}, + {file = "propcache-0.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c3c3a203c375b08fd06a20da3cf7aac293b834b6f4f4db71190e8422750cca5"}, + {file = "propcache-0.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b303b194c2e6f171cfddf8b8ba30baefccf03d36a4d9cab7fd0bb68ba476a3d7"}, + {file = "propcache-0.3.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:916cd229b0150129d645ec51614d38129ee74c03293a9f3f17537be0029a9641"}, + {file = "propcache-0.3.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a461959ead5b38e2581998700b26346b78cd98540b5524796c175722f18b0294"}, + {file = "propcache-0.3.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:069e7212890b0bcf9b2be0a03afb0c2d5161d91e1bf51569a64f629acc7defbf"}, + {file = "propcache-0.3.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ef2e4e91fb3945769e14ce82ed53007195e616a63aa43b40fb7ebaaf907c8d4c"}, + {file = "propcache-0.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8638f99dca15b9dff328fb6273e09f03d1c50d9b6512f3b65a4154588a7595fe"}, + {file = "propcache-0.3.1-cp39-cp39-win32.whl", hash = "sha256:6f173bbfe976105aaa890b712d1759de339d8a7cef2fc0a1714cc1a1e1c47f64"}, + {file = "propcache-0.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:603f1fe4144420374f1a69b907494c3acbc867a581c2d49d4175b0de7cc64566"}, + {file = "propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40"}, + {file = "propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf"}, ] [[package]] @@ -4065,20 +4118,21 @@ files = [ [[package]] name = "pydantic" -version = "2.10.6" +version = "2.11.1" description = "Data validation using Python type hints" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, - {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, + {file = "pydantic-2.11.1-py3-none-any.whl", hash = "sha256:5b6c415eee9f8123a14d859be0c84363fec6b1feb6b688d6435801230b56e0b8"}, + {file = "pydantic-2.11.1.tar.gz", hash = "sha256:442557d2910e75c991c39f4b4ab18963d57b9b55122c8b2a9cd176d8c29ce968"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.27.2" +pydantic-core = "2.33.0" typing-extensions = ">=4.12.2" +typing-inspection = ">=0.4.0" [package.extras] email = ["email-validator (>=2.0.0)"] @@ -4086,112 +4140,111 @@ timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows [[package]] name = "pydantic-core" -version = "2.27.2" +version = "2.33.0" description = "Core functionality for Pydantic validation and serialization" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" 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"}, + {file = "pydantic_core-2.33.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71dffba8fe9ddff628c68f3abd845e91b028361d43c5f8e7b3f8b91d7d85413e"}, + {file = "pydantic_core-2.33.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:abaeec1be6ed535a5d7ffc2e6c390083c425832b20efd621562fbb5bff6dc518"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759871f00e26ad3709efc773ac37b4d571de065f9dfb1778012908bcc36b3a73"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dcfebee69cd5e1c0b76a17e17e347c84b00acebb8dd8edb22d4a03e88e82a207"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b1262b912435a501fa04cd213720609e2cefa723a07c92017d18693e69bf00b"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4726f1f3f42d6a25678c67da3f0b10f148f5655813c5aca54b0d1742ba821b8f"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e790954b5093dff1e3a9a2523fddc4e79722d6f07993b4cd5547825c3cbf97b5"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34e7fb3abe375b5c4e64fab75733d605dda0f59827752debc99c17cb2d5f3276"}, + {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ecb158fb9b9091b515213bed3061eb7deb1d3b4e02327c27a0ea714ff46b0760"}, + {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:4d9149e7528af8bbd76cc055967e6e04617dcb2a2afdaa3dea899406c5521faa"}, + {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e81a295adccf73477220e15ff79235ca9dcbcee4be459eb9d4ce9a2763b8386c"}, + {file = "pydantic_core-2.33.0-cp310-cp310-win32.whl", hash = "sha256:f22dab23cdbce2005f26a8f0c71698457861f97fc6318c75814a50c75e87d025"}, + {file = "pydantic_core-2.33.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cb2390355ba084c1ad49485d18449b4242da344dea3e0fe10babd1f0db7dcfc"}, + {file = "pydantic_core-2.33.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a608a75846804271cf9c83e40bbb4dab2ac614d33c6fd5b0c6187f53f5c593ef"}, + {file = "pydantic_core-2.33.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e1c69aa459f5609dec2fa0652d495353accf3eda5bdb18782bc5a2ae45c9273a"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9ec80eb5a5f45a2211793f1c4aeddff0c3761d1c70d684965c1807e923a588b"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e925819a98318d17251776bd3d6aa9f3ff77b965762155bdad15d1a9265c4cfd"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bf68bb859799e9cec3d9dd8323c40c00a254aabb56fe08f907e437005932f2b"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b2ea72dea0825949a045fa4071f6d5b3d7620d2a208335207793cf29c5a182d"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1583539533160186ac546b49f5cde9ffc928062c96920f58bd95de32ffd7bffd"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23c3e77bf8a7317612e5c26a3b084c7edeb9552d645742a54a5867635b4f2453"}, + {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7a7f2a3f628d2f7ef11cb6188bcf0b9e1558151d511b974dfea10a49afe192b"}, + {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:f1fb026c575e16f673c61c7b86144517705865173f3d0907040ac30c4f9f5915"}, + {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:635702b2fed997e0ac256b2cfbdb4dd0bf7c56b5d8fba8ef03489c03b3eb40e2"}, + {file = "pydantic_core-2.33.0-cp311-cp311-win32.whl", hash = "sha256:07b4ced28fccae3f00626eaa0c4001aa9ec140a29501770a88dbbb0966019a86"}, + {file = "pydantic_core-2.33.0-cp311-cp311-win_amd64.whl", hash = "sha256:4927564be53239a87770a5f86bdc272b8d1fbb87ab7783ad70255b4ab01aa25b"}, + {file = "pydantic_core-2.33.0-cp311-cp311-win_arm64.whl", hash = "sha256:69297418ad644d521ea3e1aa2e14a2a422726167e9ad22b89e8f1130d68e1e9a"}, + {file = "pydantic_core-2.33.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6c32a40712e3662bebe524abe8abb757f2fa2000028d64cc5a1006016c06af43"}, + {file = "pydantic_core-2.33.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ec86b5baa36f0a0bfb37db86c7d52652f8e8aa076ab745ef7725784183c3fdd"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4deac83a8cc1d09e40683be0bc6d1fa4cde8df0a9bf0cda5693f9b0569ac01b6"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:175ab598fb457a9aee63206a1993874badf3ed9a456e0654273e56f00747bbd6"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f36afd0d56a6c42cf4e8465b6441cf546ed69d3a4ec92724cc9c8c61bd6ecf4"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a98257451164666afafc7cbf5fb00d613e33f7e7ebb322fbcd99345695a9a61"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecc6d02d69b54a2eb83ebcc6f29df04957f734bcf309d346b4f83354d8376862"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a69b7596c6603afd049ce7f3835bcf57dd3892fc7279f0ddf987bebed8caa5a"}, + {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea30239c148b6ef41364c6f51d103c2988965b643d62e10b233b5efdca8c0099"}, + {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:abfa44cf2f7f7d7a199be6c6ec141c9024063205545aa09304349781b9a125e6"}, + {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20d4275f3c4659d92048c70797e5fdc396c6e4446caf517ba5cad2db60cd39d3"}, + {file = "pydantic_core-2.33.0-cp312-cp312-win32.whl", hash = "sha256:918f2013d7eadea1d88d1a35fd4a1e16aaf90343eb446f91cb091ce7f9b431a2"}, + {file = "pydantic_core-2.33.0-cp312-cp312-win_amd64.whl", hash = "sha256:aec79acc183865bad120b0190afac467c20b15289050648b876b07777e67ea48"}, + {file = "pydantic_core-2.33.0-cp312-cp312-win_arm64.whl", hash = "sha256:5461934e895968655225dfa8b3be79e7e927e95d4bd6c2d40edd2fa7052e71b6"}, + {file = "pydantic_core-2.33.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f00e8b59e1fc8f09d05594aa7d2b726f1b277ca6155fc84c0396db1b373c4555"}, + {file = "pydantic_core-2.33.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a73be93ecef45786d7d95b0c5e9b294faf35629d03d5b145b09b81258c7cd6d"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff48a55be9da6930254565ff5238d71d5e9cd8c5487a191cb85df3bdb8c77365"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a4ea04195638dcd8c53dadb545d70badba51735b1594810e9768c2c0b4a5da"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41d698dcbe12b60661f0632b543dbb119e6ba088103b364ff65e951610cb7ce0"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae62032ef513fe6281ef0009e30838a01057b832dc265da32c10469622613885"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f225f3a3995dbbc26affc191d0443c6c4aa71b83358fd4c2b7d63e2f6f0336f9"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5bdd36b362f419c78d09630cbaebc64913f66f62bda6d42d5fbb08da8cc4f181"}, + {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a0147c0bef783fd9abc9f016d66edb6cac466dc54a17ec5f5ada08ff65caf5d"}, + {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:c860773a0f205926172c6644c394e02c25421dc9a456deff16f64c0e299487d3"}, + {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:138d31e3f90087f42aa6286fb640f3c7a8eb7bdae829418265e7e7474bd2574b"}, + {file = "pydantic_core-2.33.0-cp313-cp313-win32.whl", hash = "sha256:d20cbb9d3e95114325780f3cfe990f3ecae24de7a2d75f978783878cce2ad585"}, + {file = "pydantic_core-2.33.0-cp313-cp313-win_amd64.whl", hash = "sha256:ca1103d70306489e3d006b0f79db8ca5dd3c977f6f13b2c59ff745249431a606"}, + {file = "pydantic_core-2.33.0-cp313-cp313-win_arm64.whl", hash = "sha256:6291797cad239285275558e0a27872da735b05c75d5237bbade8736f80e4c225"}, + {file = "pydantic_core-2.33.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7b79af799630af263eca9ec87db519426d8c9b3be35016eddad1832bac812d87"}, + {file = "pydantic_core-2.33.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eabf946a4739b5237f4f56d77fa6668263bc466d06a8036c055587c130a46f7b"}, + {file = "pydantic_core-2.33.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8a1d581e8cdbb857b0e0e81df98603376c1a5c34dc5e54039dcc00f043df81e7"}, + {file = "pydantic_core-2.33.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:7c9c84749f5787781c1c45bb99f433402e484e515b40675a5d121ea14711cf61"}, + {file = "pydantic_core-2.33.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:64672fa888595a959cfeff957a654e947e65bbe1d7d82f550417cbd6898a1d6b"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bc7367c0961dec292244ef2549afa396e72e28cc24706210bd44d947582c59"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce72d46eb201ca43994303025bd54d8a35a3fc2a3495fac653d6eb7205ce04f4"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14229c1504287533dbf6b1fc56f752ce2b4e9694022ae7509631ce346158de11"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:085d8985b1c1e48ef271e98a658f562f29d89bda98bf120502283efbc87313eb"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31860fbda80d8f6828e84b4a4d129fd9c4535996b8249cfb8c720dc2a1a00bb8"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f200b2f20856b5a6c3a35f0d4e344019f805e363416e609e9b47c552d35fd5ea"}, + {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f72914cfd1d0176e58ddc05c7a47674ef4222c8253bf70322923e73e14a4ac3"}, + {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:91301a0980a1d4530d4ba7e6a739ca1a6b31341252cb709948e0aca0860ce0ae"}, + {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7419241e17c7fbe5074ba79143d5523270e04f86f1b3a0dff8df490f84c8273a"}, + {file = "pydantic_core-2.33.0-cp39-cp39-win32.whl", hash = "sha256:7a25493320203005d2a4dac76d1b7d953cb49bce6d459d9ae38e30dd9f29bc9c"}, + {file = "pydantic_core-2.33.0-cp39-cp39-win_amd64.whl", hash = "sha256:82a4eba92b7ca8af1b7d5ef5f3d9647eee94d1f74d21ca7c21e3a2b92e008358"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e2762c568596332fdab56b07060c8ab8362c56cf2a339ee54e491cd503612c50"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bf637300ff35d4f59c006fff201c510b2b5e745b07125458a5389af3c0dff8c"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c151ce3d59ed56ebd7ce9ce5986a409a85db697d25fc232f8e81f195aa39a1"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee65f0cc652261744fd07f2c6e6901c914aa6c5ff4dcfaf1136bc394d0dd26b"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:024d136ae44d233e6322027bbf356712b3940bee816e6c948ce4b90f18471b3d"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e37f10f6d4bc67c58fbd727108ae1d8b92b397355e68519f1e4a7babb1473442"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:502ed542e0d958bd12e7c3e9a015bce57deaf50eaa8c2e1c439b512cb9db1e3a"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:715c62af74c236bf386825c0fdfa08d092ab0f191eb5b4580d11c3189af9d330"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bccc06fa0372151f37f6b69834181aa9eb57cf8665ed36405fb45fbf6cac3bae"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d8dc9f63a26f7259b57f46a7aab5af86b2ad6fbe48487500bb1f4b27e051e4c"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30369e54d6d0113d2aa5aee7a90d17f225c13d87902ace8fcd7bbf99b19124db"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3eb479354c62067afa62f53bb387827bee2f75c9c79ef25eef6ab84d4b1ae3b"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0310524c833d91403c960b8a3cf9f46c282eadd6afd276c8c5edc617bd705dc9"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eddb18a00bbb855325db27b4c2a89a4ba491cd6a0bd6d852b225172a1f54b36c"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ade5dbcf8d9ef8f4b28e682d0b29f3008df9842bb5ac48ac2c17bc55771cc976"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2c0afd34f928383e3fd25740f2050dbac9d077e7ba5adbaa2227f4d4f3c8da5c"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7da333f21cd9df51d5731513a6d39319892947604924ddf2e24a4612975fb936"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b6d77c75a57f041c5ee915ff0b0bb58eabb78728b69ed967bc5b780e8f701b8"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba95691cf25f63df53c1d342413b41bd7762d9acb425df8858d7efa616c0870e"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f1ab031feb8676f6bd7c85abec86e2935850bf19b84432c64e3e239bffeb1ec"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58c1151827eef98b83d49b6ca6065575876a02d2211f259fb1a6b7757bd24dd8"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a66d931ea2c1464b738ace44b7334ab32a2fd50be023d863935eb00f42be1778"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0bcf0bab28995d483f6c8d7db25e0d05c3efa5cebfd7f56474359e7137f39856"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:89670d7a0045acb52be0566df5bc8b114ac967c662c06cf5e0c606e4aadc964b"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:b716294e721d8060908dbebe32639b01bfe61b15f9f57bcc18ca9a0e00d9520b"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fc53e05c16697ff0c1c7c2b98e45e131d4bfb78068fffff92a82d169cbb4c7b7"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:68504959253303d3ae9406b634997a2123a0b0c1da86459abbd0ffc921695eac"}, + {file = "pydantic_core-2.33.0.tar.gz", hash = "sha256:40eb8af662ba409c3cbf4a8150ad32ae73514cd7cb1f1a2113af39763dd616b3"}, ] [package.dependencies] @@ -5037,14 +5090,14 @@ idna2008 = ["idna"] [[package]] name = "rich" -version = "13.9.4" +version = "14.0.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" 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"}, + {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"}, + {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"}, ] [package.dependencies] @@ -5057,115 +5110,126 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.23.1" +version = "0.24.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "rpds_py-0.23.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2a54027554ce9b129fc3d633c92fa33b30de9f08bc61b32c053dc9b537266fed"}, - {file = "rpds_py-0.23.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5ef909a37e9738d146519657a1aab4584018746a18f71c692f2f22168ece40c"}, - {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ee9d6f0b38efb22ad94c3b68ffebe4c47865cdf4b17f6806d6c674e1feb4246"}, - {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7356a6da0562190558c4fcc14f0281db191cdf4cb96e7604c06acfcee96df15"}, - {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9441af1d25aed96901f97ad83d5c3e35e6cd21a25ca5e4916c82d7dd0490a4fa"}, - {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d8abf7896a91fb97e7977d1aadfcc2c80415d6dc2f1d0fca5b8d0df247248f3"}, - {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b08027489ba8fedde72ddd233a5ea411b85a6ed78175f40285bd401bde7466d"}, - {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fee513135b5a58f3bb6d89e48326cd5aa308e4bcdf2f7d59f67c861ada482bf8"}, - {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:35d5631ce0af26318dba0ae0ac941c534453e42f569011585cb323b7774502a5"}, - {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a20cb698c4a59c534c6701b1c24a968ff2768b18ea2991f886bd8985ce17a89f"}, - {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e9c206a1abc27e0588cf8b7c8246e51f1a16a103734f7750830a1ccb63f557a"}, - {file = "rpds_py-0.23.1-cp310-cp310-win32.whl", hash = "sha256:d9f75a06ecc68f159d5d7603b734e1ff6daa9497a929150f794013aa9f6e3f12"}, - {file = "rpds_py-0.23.1-cp310-cp310-win_amd64.whl", hash = "sha256:f35eff113ad430b5272bbfc18ba111c66ff525828f24898b4e146eb479a2cdda"}, - {file = "rpds_py-0.23.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b79f5ced71efd70414a9a80bbbfaa7160da307723166f09b69773153bf17c590"}, - {file = "rpds_py-0.23.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c9e799dac1ffbe7b10c1fd42fe4cd51371a549c6e108249bde9cd1200e8f59b4"}, - {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721f9c4011b443b6e84505fc00cc7aadc9d1743f1c988e4c89353e19c4a968ee"}, - {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f88626e3f5e57432e6191cd0c5d6d6b319b635e70b40be2ffba713053e5147dd"}, - {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:285019078537949cecd0190f3690a0b0125ff743d6a53dfeb7a4e6787af154f5"}, - {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b92f5654157de1379c509b15acec9d12ecf6e3bc1996571b6cb82a4302060447"}, - {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e768267cbe051dd8d1c5305ba690bb153204a09bf2e3de3ae530de955f5b5580"}, - {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c5334a71f7dc1160382d45997e29f2637c02f8a26af41073189d79b95d3321f1"}, - {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6adb81564af0cd428910f83fa7da46ce9ad47c56c0b22b50872bc4515d91966"}, - {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cafa48f2133d4daa028473ede7d81cd1b9f9e6925e9e4003ebdf77010ee02f35"}, - {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fced9fd4a07a1ded1bac7e961ddd9753dd5d8b755ba8e05acba54a21f5f1522"}, - {file = "rpds_py-0.23.1-cp311-cp311-win32.whl", hash = "sha256:243241c95174b5fb7204c04595852fe3943cc41f47aa14c3828bc18cd9d3b2d6"}, - {file = "rpds_py-0.23.1-cp311-cp311-win_amd64.whl", hash = "sha256:11dd60b2ffddba85715d8a66bb39b95ddbe389ad2cfcf42c833f1bcde0878eaf"}, - {file = "rpds_py-0.23.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3902df19540e9af4cc0c3ae75974c65d2c156b9257e91f5101a51f99136d834c"}, - {file = "rpds_py-0.23.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66f8d2a17e5838dd6fb9be6baaba8e75ae2f5fa6b6b755d597184bfcd3cb0eba"}, - {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:112b8774b0b4ee22368fec42749b94366bd9b536f8f74c3d4175d4395f5cbd31"}, - {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e0df046f2266e8586cf09d00588302a32923eb6386ced0ca5c9deade6af9a149"}, - {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3288930b947cbebe767f84cf618d2cbe0b13be476e749da0e6a009f986248c"}, - {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce473a2351c018b06dd8d30d5da8ab5a0831056cc53b2006e2a8028172c37ce5"}, - {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d550d7e9e7d8676b183b37d65b5cd8de13676a738973d330b59dc8312df9c5dc"}, - {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e14f86b871ea74c3fddc9a40e947d6a5d09def5adc2076ee61fb910a9014fb35"}, - {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf5be5ba34e19be579ae873da515a2836a2166d8d7ee43be6ff909eda42b72b"}, - {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7031d493c4465dbc8d40bd6cafefef4bd472b17db0ab94c53e7909ee781b9ef"}, - {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:55ff4151cfd4bc635e51cfb1c59ac9f7196b256b12e3a57deb9e5742e65941ad"}, - {file = "rpds_py-0.23.1-cp312-cp312-win32.whl", hash = "sha256:a9d3b728f5a5873d84cba997b9d617c6090ca5721caaa691f3b1a78c60adc057"}, - {file = "rpds_py-0.23.1-cp312-cp312-win_amd64.whl", hash = "sha256:b03a8d50b137ee758e4c73638b10747b7c39988eb8e6cd11abb7084266455165"}, - {file = "rpds_py-0.23.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:4caafd1a22e5eaa3732acb7672a497123354bef79a9d7ceed43387d25025e935"}, - {file = "rpds_py-0.23.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:178f8a60fc24511c0eb756af741c476b87b610dba83270fce1e5a430204566a4"}, - {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c632419c3870507ca20a37c8f8f5352317aca097639e524ad129f58c125c61c6"}, - {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:698a79d295626ee292d1730bc2ef6e70a3ab135b1d79ada8fde3ed0047b65a10"}, - {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271fa2184cf28bdded86bb6217c8e08d3a169fe0bbe9be5e8d96e8476b707122"}, - {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b91cceb5add79ee563bd1f70b30896bd63bc5f78a11c1f00a1e931729ca4f1f4"}, - {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a6cb95074777f1ecda2ca4fa7717caa9ee6e534f42b7575a8f0d4cb0c24013"}, - {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:50fb62f8d8364978478b12d5f03bf028c6bc2af04082479299139dc26edf4c64"}, - {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8f7e90b948dc9dcfff8003f1ea3af08b29c062f681c05fd798e36daa3f7e3e8"}, - {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5b98b6c953e5c2bda51ab4d5b4f172617d462eebc7f4bfdc7c7e6b423f6da957"}, - {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2893d778d4671ee627bac4037a075168b2673c57186fb1a57e993465dbd79a93"}, - {file = "rpds_py-0.23.1-cp313-cp313-win32.whl", hash = "sha256:2cfa07c346a7ad07019c33fb9a63cf3acb1f5363c33bc73014e20d9fe8b01cdd"}, - {file = "rpds_py-0.23.1-cp313-cp313-win_amd64.whl", hash = "sha256:3aaf141d39f45322e44fc2c742e4b8b4098ead5317e5f884770c8df0c332da70"}, - {file = "rpds_py-0.23.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:759462b2d0aa5a04be5b3e37fb8183615f47014ae6b116e17036b131985cb731"}, - {file = "rpds_py-0.23.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3e9212f52074fc9d72cf242a84063787ab8e21e0950d4d6709886fb62bcb91d5"}, - {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e9f3a3ac919406bc0414bbbd76c6af99253c507150191ea79fab42fdb35982a"}, - {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c04ca91dda8a61584165825907f5c967ca09e9c65fe8966ee753a3f2b019fe1e"}, - {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab923167cfd945abb9b51a407407cf19f5bee35001221f2911dc85ffd35ff4f"}, - {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed6f011bedca8585787e5082cce081bac3d30f54520097b2411351b3574e1219"}, - {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959bb9928c5c999aba4a3f5a6799d571ddc2c59ff49917ecf55be2bbb4e3722"}, - {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ed7de3c86721b4e83ac440751329ec6a1102229aa18163f84c75b06b525ad7e"}, - {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5fb89edee2fa237584e532fbf78f0ddd1e49a47c7c8cfa153ab4849dc72a35e6"}, - {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7e5413d2e2d86025e73f05510ad23dad5950ab8417b7fc6beaad99be8077138b"}, - {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d31ed4987d72aabdf521eddfb6a72988703c091cfc0064330b9e5f8d6a042ff5"}, - {file = "rpds_py-0.23.1-cp313-cp313t-win32.whl", hash = "sha256:f3429fb8e15b20961efca8c8b21432623d85db2228cc73fe22756c6637aa39e7"}, - {file = "rpds_py-0.23.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d6f6512a90bd5cd9030a6237f5346f046c6f0e40af98657568fa45695d4de59d"}, - {file = "rpds_py-0.23.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:09cd7dbcb673eb60518231e02874df66ec1296c01a4fcd733875755c02014b19"}, - {file = "rpds_py-0.23.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c6760211eee3a76316cf328f5a8bd695b47b1626d21c8a27fb3b2473a884d597"}, - {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e680c1518733b73c994361e4b06441b92e973ef7d9449feec72e8ee4f713da"}, - {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae28144c1daa61366205d32abd8c90372790ff79fc60c1a8ad7fd3c8553a600e"}, - {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c698d123ce5d8f2d0cd17f73336615f6a2e3bdcedac07a1291bb4d8e7d82a05a"}, - {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98b257ae1e83f81fb947a363a274c4eb66640212516becaff7bef09a5dceacaa"}, - {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c9ff044eb07c8468594d12602291c635da292308c8c619244e30698e7fc455a"}, - {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7938c7b0599a05246d704b3f5e01be91a93b411d0d6cc62275f025293b8a11ce"}, - {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e9cb79ecedfc156c0692257ac7ed415243b6c35dd969baa461a6888fc79f2f07"}, - {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7b77e07233925bd33fc0022b8537774423e4c6680b6436316c5075e79b6384f4"}, - {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a970bfaf130c29a679b1d0a6e0f867483cea455ab1535fb427566a475078f27f"}, - {file = "rpds_py-0.23.1-cp39-cp39-win32.whl", hash = "sha256:4233df01a250b3984465faed12ad472f035b7cd5240ea3f7c76b7a7016084495"}, - {file = "rpds_py-0.23.1-cp39-cp39-win_amd64.whl", hash = "sha256:c617d7453a80e29d9973b926983b1e700a9377dbe021faa36041c78537d7b08c"}, - {file = "rpds_py-0.23.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c1f8afa346ccd59e4e5630d5abb67aba6a9812fddf764fd7eb11f382a345f8cc"}, - {file = "rpds_py-0.23.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fad784a31869747df4ac968a351e070c06ca377549e4ace94775aaa3ab33ee06"}, - {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5a96fcac2f18e5a0a23a75cd27ce2656c66c11c127b0318e508aab436b77428"}, - {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e77febf227a1dc3220159355dba68faa13f8dca9335d97504abf428469fb18b"}, - {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26bb3e8de93443d55e2e748e9fd87deb5f8075ca7bc0502cfc8be8687d69a2ec"}, - {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db7707dde9143a67b8812c7e66aeb2d843fe33cc8e374170f4d2c50bd8f2472d"}, - {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eedaaccc9bb66581d4ae7c50e15856e335e57ef2734dbc5fd8ba3e2a4ab3cb6"}, - {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28358c54fffadf0ae893f6c1050e8f8853e45df22483b7fff2f6ab6152f5d8bf"}, - {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:633462ef7e61d839171bf206551d5ab42b30b71cac8f10a64a662536e057fdef"}, - {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a98f510d86f689fcb486dc59e6e363af04151e5260ad1bdddb5625c10f1e95f8"}, - {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e0397dd0b3955c61ef9b22838144aa4bef6f0796ba5cc8edfc64d468b93798b4"}, - {file = "rpds_py-0.23.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:75307599f0d25bf6937248e5ac4e3bde5ea72ae6618623b86146ccc7845ed00b"}, - {file = "rpds_py-0.23.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3614d280bf7aab0d3721b5ce0e73434acb90a2c993121b6e81a1c15c665298ac"}, - {file = "rpds_py-0.23.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e5963ea87f88bddf7edd59644a35a0feecf75f8985430124c253612d4f7d27ae"}, - {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad76f44f70aac3a54ceb1813ca630c53415da3a24fd93c570b2dfb4856591017"}, - {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c6ae11e6e93728d86aafc51ced98b1658a0080a7dd9417d24bfb955bb09c3c2"}, - {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc869af5cba24d45fb0399b0cfdbcefcf6910bf4dee5d74036a57cf5264b3ff4"}, - {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c76b32eb2ab650a29e423525e84eb197c45504b1c1e6e17b6cc91fcfeb1a4b1d"}, - {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4263320ed887ed843f85beba67f8b2d1483b5947f2dc73a8b068924558bfeace"}, - {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f9682a8f71acdf59fd554b82b1c12f517118ee72c0f3944eda461606dfe7eb9"}, - {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:754fba3084b70162a6b91efceee8a3f06b19e43dac3f71841662053c0584209a"}, - {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:a1c66e71ecfd2a4acf0e4bd75e7a3605afa8f9b28a3b497e4ba962719df2be57"}, - {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8d67beb6002441faef8251c45e24994de32c4c8686f7356a1f601ad7c466f7c3"}, - {file = "rpds_py-0.23.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a1e17d8dc8e57d8e0fd21f8f0f0a5211b3fa258b2e444c2053471ef93fe25a00"}, - {file = "rpds_py-0.23.1.tar.gz", hash = "sha256:7f3240dcfa14d198dba24b8b9cb3b108c06b68d45b7babd9eefc1038fdf7e707"}, + {file = "rpds_py-0.24.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:006f4342fe729a368c6df36578d7a348c7c716be1da0a1a0f86e3021f8e98724"}, + {file = "rpds_py-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2d53747da70a4e4b17f559569d5f9506420966083a31c5fbd84e764461c4444b"}, + {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8acd55bd5b071156bae57b555f5d33697998752673b9de554dd82f5b5352727"}, + {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7e80d375134ddb04231a53800503752093dbb65dad8dabacce2c84cccc78e964"}, + {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60748789e028d2a46fc1c70750454f83c6bdd0d05db50f5ae83e2db500b34da5"}, + {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e1daf5bf6c2be39654beae83ee6b9a12347cb5aced9a29eecf12a2d25fff664"}, + {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b221c2457d92a1fb3c97bee9095c874144d196f47c038462ae6e4a14436f7bc"}, + {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:66420986c9afff67ef0c5d1e4cdc2d0e5262f53ad11e4f90e5e22448df485bf0"}, + {file = "rpds_py-0.24.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:43dba99f00f1d37b2a0265a259592d05fcc8e7c19d140fe51c6e6f16faabeb1f"}, + {file = "rpds_py-0.24.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a88c0d17d039333a41d9bf4616bd062f0bd7aa0edeb6cafe00a2fc2a804e944f"}, + {file = "rpds_py-0.24.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc31e13ce212e14a539d430428cd365e74f8b2d534f8bc22dd4c9c55b277b875"}, + {file = "rpds_py-0.24.0-cp310-cp310-win32.whl", hash = "sha256:fc2c1e1b00f88317d9de6b2c2b39b012ebbfe35fe5e7bef980fd2a91f6100a07"}, + {file = "rpds_py-0.24.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0145295ca415668420ad142ee42189f78d27af806fcf1f32a18e51d47dd2052"}, + {file = "rpds_py-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2d3ee4615df36ab8eb16c2507b11e764dcc11fd350bbf4da16d09cda11fcedef"}, + {file = "rpds_py-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e13ae74a8a3a0c2f22f450f773e35f893484fcfacb00bb4344a7e0f4f48e1f97"}, + {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf86f72d705fc2ef776bb7dd9e5fbba79d7e1f3e258bf9377f8204ad0fc1c51e"}, + {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c43583ea8517ed2e780a345dd9960896afc1327e8cf3ac8239c167530397440d"}, + {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cd031e63bc5f05bdcda120646a0d32f6d729486d0067f09d79c8db5368f4586"}, + {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34d90ad8c045df9a4259c47d2e16a3f21fdb396665c94520dbfe8766e62187a4"}, + {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e838bf2bb0b91ee67bf2b889a1a841e5ecac06dd7a2b1ef4e6151e2ce155c7ae"}, + {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04ecf5c1ff4d589987b4d9882872f80ba13da7d42427234fce8f22efb43133bc"}, + {file = "rpds_py-0.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:630d3d8ea77eabd6cbcd2ea712e1c5cecb5b558d39547ac988351195db433f6c"}, + {file = "rpds_py-0.24.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ebcb786b9ff30b994d5969213a8430cbb984cdd7ea9fd6df06663194bd3c450c"}, + {file = "rpds_py-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:174e46569968ddbbeb8a806d9922f17cd2b524aa753b468f35b97ff9c19cb718"}, + {file = "rpds_py-0.24.0-cp311-cp311-win32.whl", hash = "sha256:5ef877fa3bbfb40b388a5ae1cb00636a624690dcb9a29a65267054c9ea86d88a"}, + {file = "rpds_py-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:e274f62cbd274359eff63e5c7e7274c913e8e09620f6a57aae66744b3df046d6"}, + {file = "rpds_py-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d8551e733626afec514b5d15befabea0dd70a343a9f23322860c4f16a9430205"}, + {file = "rpds_py-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e374c0ce0ca82e5b67cd61fb964077d40ec177dd2c4eda67dba130de09085c7"}, + {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d69d003296df4840bd445a5d15fa5b6ff6ac40496f956a221c4d1f6f7b4bc4d9"}, + {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8212ff58ac6dfde49946bea57474a386cca3f7706fc72c25b772b9ca4af6b79e"}, + {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:528927e63a70b4d5f3f5ccc1fa988a35456eb5d15f804d276709c33fc2f19bda"}, + {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a824d2c7a703ba6daaca848f9c3d5cb93af0505be505de70e7e66829affd676e"}, + {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d51febb7a114293ffd56c6cf4736cb31cd68c0fddd6aa303ed09ea5a48e029"}, + {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3fab5f4a2c64a8fb64fc13b3d139848817a64d467dd6ed60dcdd6b479e7febc9"}, + {file = "rpds_py-0.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9be4f99bee42ac107870c61dfdb294d912bf81c3c6d45538aad7aecab468b6b7"}, + {file = "rpds_py-0.24.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:564c96b6076a98215af52f55efa90d8419cc2ef45d99e314fddefe816bc24f91"}, + {file = "rpds_py-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:75a810b7664c17f24bf2ffd7f92416c00ec84b49bb68e6a0d93e542406336b56"}, + {file = "rpds_py-0.24.0-cp312-cp312-win32.whl", hash = "sha256:f6016bd950be4dcd047b7475fdf55fb1e1f59fc7403f387be0e8123e4a576d30"}, + {file = "rpds_py-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034"}, + {file = "rpds_py-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2d8e4508e15fc05b31285c4b00ddf2e0eb94259c2dc896771966a163122a0c"}, + {file = "rpds_py-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f00c16e089282ad68a3820fd0c831c35d3194b7cdc31d6e469511d9bffc535c"}, + {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951cc481c0c395c4a08639a469d53b7d4afa252529a085418b82a6b43c45c240"}, + {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9ca89938dff18828a328af41ffdf3902405a19f4131c88e22e776a8e228c5a8"}, + {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0ef550042a8dbcd657dfb284a8ee00f0ba269d3f2286b0493b15a5694f9fe8"}, + {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2356688e5d958c4d5cb964af865bea84db29971d3e563fb78e46e20fe1848b"}, + {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78884d155fd15d9f64f5d6124b486f3d3f7fd7cd71a78e9670a0f6f6ca06fb2d"}, + {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a4a535013aeeef13c5532f802708cecae8d66c282babb5cd916379b72110cf7"}, + {file = "rpds_py-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:84e0566f15cf4d769dade9b366b7b87c959be472c92dffb70462dd0844d7cbad"}, + {file = "rpds_py-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:823e74ab6fbaa028ec89615ff6acb409e90ff45580c45920d4dfdddb069f2120"}, + {file = "rpds_py-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c61a2cb0085c8783906b2f8b1f16a7e65777823c7f4d0a6aaffe26dc0d358dd9"}, + {file = "rpds_py-0.24.0-cp313-cp313-win32.whl", hash = "sha256:60d9b630c8025b9458a9d114e3af579a2c54bd32df601c4581bd054e85258143"}, + {file = "rpds_py-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a"}, + {file = "rpds_py-0.24.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:d09dc82af2d3c17e7dd17120b202a79b578d79f2b5424bda209d9966efeed114"}, + {file = "rpds_py-0.24.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5fc13b44de6419d1e7a7e592a4885b323fbc2f46e1f22151e3a8ed3b8b920405"}, + {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c347a20d79cedc0a7bd51c4d4b7dbc613ca4e65a756b5c3e57ec84bd43505b47"}, + {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20f2712bd1cc26a3cc16c5a1bfee9ed1abc33d4cdf1aabd297fe0eb724df4272"}, + {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad911555286884be1e427ef0dc0ba3929e6821cbeca2194b13dc415a462c7fd"}, + {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0aeb3329c1721c43c58cae274d7d2ca85c1690d89485d9c63a006cb79a85771a"}, + {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0f156e9509cee987283abd2296ec816225145a13ed0391df8f71bf1d789e2d"}, + {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa6800adc8204ce898c8a424303969b7aa6a5e4ad2789c13f8648739830323b7"}, + {file = "rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a18fc371e900a21d7392517c6f60fe859e802547309e94313cd8181ad9db004d"}, + {file = "rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9168764133fd919f8dcca2ead66de0105f4ef5659cbb4fa044f7014bed9a1797"}, + {file = "rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f6e3cec44ba05ee5cbdebe92d052f69b63ae792e7d05f1020ac5e964394080c"}, + {file = "rpds_py-0.24.0-cp313-cp313t-win32.whl", hash = "sha256:8ebc7e65ca4b111d928b669713865f021b7773350eeac4a31d3e70144297baba"}, + {file = "rpds_py-0.24.0-cp313-cp313t-win_amd64.whl", hash = "sha256:675269d407a257b8c00a6b58205b72eec8231656506c56fd429d924ca00bb350"}, + {file = "rpds_py-0.24.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a36b452abbf29f68527cf52e181fced56685731c86b52e852053e38d8b60bc8d"}, + {file = "rpds_py-0.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b3b397eefecec8e8e39fa65c630ef70a24b09141a6f9fc17b3c3a50bed6b50e"}, + {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdabcd3beb2a6dca7027007473d8ef1c3b053347c76f685f5f060a00327b8b65"}, + {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5db385bacd0c43f24be92b60c857cf760b7f10d8234f4bd4be67b5b20a7c0b6b"}, + {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8097b3422d020ff1c44effc40ae58e67d93e60d540a65649d2cdaf9466030791"}, + {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493fe54318bed7d124ce272fc36adbf59d46729659b2c792e87c3b95649cdee9"}, + {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8aa362811ccdc1f8dadcc916c6d47e554169ab79559319ae9fae7d7752d0d60c"}, + {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d8f9a6e7fd5434817526815f09ea27f2746c4a51ee11bb3439065f5fc754db58"}, + {file = "rpds_py-0.24.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8205ee14463248d3349131bb8099efe15cd3ce83b8ef3ace63c7e976998e7124"}, + {file = "rpds_py-0.24.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:921ae54f9ecba3b6325df425cf72c074cd469dea843fb5743a26ca7fb2ccb149"}, + {file = "rpds_py-0.24.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32bab0a56eac685828e00cc2f5d1200c548f8bc11f2e44abf311d6b548ce2e45"}, + {file = "rpds_py-0.24.0-cp39-cp39-win32.whl", hash = "sha256:f5c0ed12926dec1dfe7d645333ea59cf93f4d07750986a586f511c0bc61fe103"}, + {file = "rpds_py-0.24.0-cp39-cp39-win_amd64.whl", hash = "sha256:afc6e35f344490faa8276b5f2f7cbf71f88bc2cda4328e00553bd451728c571f"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:619ca56a5468f933d940e1bf431c6f4e13bef8e688698b067ae68eb4f9b30e3a"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:4b28e5122829181de1898c2c97f81c0b3246d49f585f22743a1246420bb8d399"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e5ab32cf9eb3647450bc74eb201b27c185d3857276162c101c0f8c6374e098"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:208b3a70a98cf3710e97cabdc308a51cd4f28aa6e7bb11de3d56cd8b74bab98d"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbc4362e06f950c62cad3d4abf1191021b2ffaf0b31ac230fbf0526453eee75e"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebea2821cdb5f9fef44933617be76185b80150632736f3d76e54829ab4a3b4d1"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a4df06c35465ef4d81799999bba810c68d29972bf1c31db61bfdb81dd9d5bb"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d3aa13bdf38630da298f2e0d77aca967b200b8cc1473ea05248f6c5e9c9bdb44"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:041f00419e1da7a03c46042453598479f45be3d787eb837af382bfc169c0db33"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d8754d872a5dfc3c5bf9c0e059e8107451364a30d9fd50f1f1a85c4fb9481164"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:896c41007931217a343eff197c34513c154267636c8056fb409eafd494c3dcdc"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:92558d37d872e808944c3c96d0423b8604879a3d1c86fdad508d7ed91ea547d5"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f9e0057a509e096e47c87f753136c9b10d7a91842d8042c2ee6866899a717c0d"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6e109a454412ab82979c5b1b3aee0604eca4bbf9a02693bb9df027af2bfa91a"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc1c892b1ec1f8cbd5da8de287577b455e388d9c328ad592eabbdcb6fc93bee5"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c39438c55983d48f4bb3487734d040e22dad200dab22c41e331cee145e7a50d"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d7e8ce990ae17dda686f7e82fd41a055c668e13ddcf058e7fb5e9da20b57793"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ea7f4174d2e4194289cb0c4e172d83e79a6404297ff95f2875cf9ac9bced8ba"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb2954155bb8f63bb19d56d80e5e5320b61d71084617ed89efedb861a684baea"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04f2b712a2206e13800a8136b07aaedc23af3facab84918e7aa89e4be0260032"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:eda5c1e2a715a4cbbca2d6d304988460942551e4e5e3b7457b50943cd741626d"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:9abc80fe8c1f87218db116016de575a7998ab1629078c90840e8d11ab423ee25"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6a727fd083009bc83eb83d6950f0c32b3c94c8b80a9b667c87f4bd1274ca30ba"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e0f3ef95795efcd3b2ec3fe0a5bcfb5dadf5e3996ea2117427e524d4fbf309c6"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:2c13777ecdbbba2077670285dd1fe50828c8742f6a4119dbef6f83ea13ad10fb"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79e8d804c2ccd618417e96720ad5cd076a86fa3f8cb310ea386a3e6229bae7d1"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd822f019ccccd75c832deb7aa040bb02d70a92eb15a2f16c7987b7ad4ee8d83"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0047638c3aa0dbcd0ab99ed1e549bbf0e142c9ecc173b6492868432d8989a046"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5b66d1b201cc71bc3081bc2f1fc36b0c1f268b773e03bbc39066651b9e18391"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbcbb6db5582ea33ce46a5d20a5793134b5365110d84df4e30b9d37c6fd40ad3"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63981feca3f110ed132fd217bf7768ee8ed738a55549883628ee3da75bb9cb78"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3a55fc10fdcbf1a4bd3c018eea422c52cf08700cf99c28b5cb10fe97ab77a0d3"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:c30ff468163a48535ee7e9bf21bd14c7a81147c0e58a36c1078289a8ca7af0bd"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:369d9c6d4c714e36d4a03957b4783217a3ccd1e222cdd67d464a3a479fc17796"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:24795c099453e3721fda5d8ddd45f5dfcc8e5a547ce7b8e9da06fecc3832e26f"}, + {file = "rpds_py-0.24.0.tar.gz", hash = "sha256:772cc1b2cd963e7e17e6cc55fe0371fb9c704d63e44cacec7b9b7f523b78919e"}, ] [[package]] @@ -5391,14 +5455,14 @@ files = [ [[package]] name = "setuptools" -version = "78.0.2" +version = "78.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "setuptools-78.0.2-py3-none-any.whl", hash = "sha256:4a612c80e1f1d71b80e4906ce730152e8dec23df439f82731d9d0b608d7b700d"}, - {file = "setuptools-78.0.2.tar.gz", hash = "sha256:137525e6afb9022f019d6e884a319017f9bf879a0d8783985d32cbc8683cab93"}, + {file = "setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8"}, + {file = "setuptools-78.1.0.tar.gz", hash = "sha256:18fd474d4a82a5f83dac888df697af65afa82dec7323d09c3e37d1f14288da54"}, ] [package.extras] @@ -5572,14 +5636,14 @@ widechars = ["wcwidth"] [[package]] name = "tifffile" -version = "2025.3.13" +version = "2025.3.30" description = "Read and write TIFF files" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "tifffile-2025.3.13-py3-none-any.whl", hash = "sha256:10f205b923c04678f744a6d553f6f86c639c9ba6e714f6758d81af0678ba75dc"}, - {file = "tifffile-2025.3.13.tar.gz", hash = "sha256:30fcc4584216937b5993d0568452b6fea8e12e61f9afb1a8e967c07c281faa06"}, + {file = "tifffile-2025.3.30-py3-none-any.whl", hash = "sha256:0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c"}, + {file = "tifffile-2025.3.30.tar.gz", hash = "sha256:3cdee47fe06cd75367c16bc3ff34523713156dae6cd498e3a392e5b39a51b789"}, ] [package.dependencies] @@ -6069,15 +6133,15 @@ vision = ["Pillow (>=10.0.1,<=15.0)"] [[package]] name = "transformers" -version = "4.50.1" +version = "4.50.3" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.9.0" groups = ["main"] markers = "sys_platform != \"darwin\" or platform_machine != \"x86_64\"" files = [ - {file = "transformers-4.50.1-py3-none-any.whl", hash = "sha256:e9b9bd274518150528c1d745c7ebba72d27e4e52f2deffaa1fddebad6912da5d"}, - {file = "transformers-4.50.1.tar.gz", hash = "sha256:6ee542d2cce7e1b6a06ae350599c27ddf2e6e45ec9d0cb42915b37fca3d6399a"}, + {file = "transformers-4.50.3-py3-none-any.whl", hash = "sha256:6111610a43dec24ef32c3df0632c6b25b07d9711c01d9e1077bdd2ff6b14a38c"}, + {file = "transformers-4.50.3.tar.gz", hash = "sha256:1d795d24925e615a8e63687d077e4f7348c2702eb87032286eaa76d83cdc684f"}, ] [package.dependencies] @@ -6217,26 +6281,26 @@ files = [ [[package]] name = "types-pytz" -version = "2025.1.0.20250318" +version = "2025.2.0.20250326" description = "Typing stubs for pytz" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "types_pytz-2025.1.0.20250318-py3-none-any.whl", hash = "sha256:04dba4907c5415777083f9548693c6d9f80ec53adcaff55a38526a3f8ddcae04"}, - {file = "types_pytz-2025.1.0.20250318.tar.gz", hash = "sha256:97e0e35184c6fe14e3a5014512057f2c57bb0c6582d63c1cfcc4809f82180449"}, + {file = "types_pytz-2025.2.0.20250326-py3-none-any.whl", hash = "sha256:3c397fd1b845cd2b3adc9398607764ced9e578a98a5d1fbb4a9bc9253edfb162"}, + {file = "types_pytz-2025.2.0.20250326.tar.gz", hash = "sha256:deda02de24f527066fc8d6a19e284ab3f3ae716a42b4adb6b40e75e408c08d36"}, ] [[package]] name = "types-requests" -version = "2.32.0.20250306" +version = "2.32.0.20250328" description = "Typing stubs for requests" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "types_requests-2.32.0.20250306-py3-none-any.whl", hash = "sha256:25f2cbb5c8710b2022f8bbee7b2b66f319ef14aeea2f35d80f18c9dbf3b60a0b"}, - {file = "types_requests-2.32.0.20250306.tar.gz", hash = "sha256:0962352694ec5b2f95fda877ee60a159abdf84a0fc6fdace599f20acb41a03d1"}, + {file = "types_requests-2.32.0.20250328-py3-none-any.whl", hash = "sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2"}, + {file = "types_requests-2.32.0.20250328.tar.gz", hash = "sha256:c9e67228ea103bd811c96984fac36ed2ae8da87a36a633964a21f199d60baf32"}, ] [package.dependencies] @@ -6244,16 +6308,31 @@ urllib3 = ">=2" [[package]] name = "typing-extensions" -version = "4.12.2" +version = "4.13.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" groups = ["main", "dev"] 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"}, + {file = "typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5"}, + {file = "typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b"}, ] +[[package]] +name = "typing-inspection" +version = "0.4.0" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f"}, + {file = "typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + [[package]] name = "tzdata" version = "2025.2" From 3e607ee46d59ed359a7d8a348a58b1d7d7ed489c Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Mon, 31 Mar 2025 17:22:49 +0200 Subject: [PATCH 64/81] Make pytest CI output more verbose Signed-off-by: Christoph Auer --- .github/workflows/checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index bf4f38c1..91908cd4 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -23,7 +23,7 @@ jobs: run: poetry install --all-extras - name: Testing run: | - poetry run pytest -v tests + poetry run pytest -vv tests - name: Run examples run: | # for file in docs/examples/*.py; do From af87bad612f4b3824e3ce057460f046409a8958d Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Mon, 31 Mar 2025 18:44:47 +0200 Subject: [PATCH 65/81] feat: Refactor the ReadingOrderEvaluator to use the new class design. Remove the BaseReadingOrderEvaluator. Add unit test. Signed-off-by: Nikos Livathinos --- docling_eval/cli/main.py | 10 +- docling_eval/evaluators/base_evaluator.py | 5 + .../evaluators/base_readingorder_evaluator.py | 395 ----------------- .../evaluators/readingorder_evaluator.py | 397 +++++++++++++++++- docling_eval/legacy/main.py | 10 +- tests/test_readingorder_evaluator.py | 33 ++ tests/test_table_evaluator.py | 2 +- 7 files changed, 440 insertions(+), 412 deletions(-) delete mode 100644 docling_eval/evaluators/base_readingorder_evaluator.py create mode 100644 tests/test_readingorder_evaluator.py diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py index c36fb509..3e1eba93 100644 --- a/docling_eval/cli/main.py +++ b/docling_eval/cli/main.py @@ -30,10 +30,6 @@ PubTabNetDatasetBuilder, ) from docling_eval.dataset_builders.xfund_builder import XFUNDDatasetBuilder -from docling_eval.evaluators.base_readingorder_evaluator import ( - DatasetReadingOrderEvaluation, - ReadingOrderVisualizer, -) from docling_eval.evaluators.bbox_text_evaluator import BboxTextEvaluator from docling_eval.evaluators.layout_evaluator import ( DatasetLayoutEvaluation, @@ -43,7 +39,11 @@ DatasetMarkdownEvaluation, MarkdownTextEvaluator, ) -from docling_eval.evaluators.readingorder_evaluator import ReadingOrderEvaluator +from docling_eval.evaluators.readingorder_evaluator import ( + DatasetReadingOrderEvaluation, + ReadingOrderEvaluator, + ReadingOrderVisualizer, +) from docling_eval.evaluators.stats import DatasetStatistics from docling_eval.evaluators.table_evaluator import ( DatasetTableEvaluation, diff --git a/docling_eval/evaluators/base_evaluator.py b/docling_eval/evaluators/base_evaluator.py index ee81a8b0..d71aa263 100644 --- a/docling_eval/evaluators/base_evaluator.py +++ b/docling_eval/evaluators/base_evaluator.py @@ -16,6 +16,10 @@ _log = logging.getLogger(__name__) +class PageEvaluation(BaseModel): + pass + + class DatasetEvaluation(BaseModel): pass @@ -94,6 +98,7 @@ def save_intermediate_evalutions( evaluation_name: str, enunumerate_id: int, doc_id: str, + # evaluations: List[PageEvaluation], evaluations: List, ) -> Optional[Path]: r""" diff --git a/docling_eval/evaluators/base_readingorder_evaluator.py b/docling_eval/evaluators/base_readingorder_evaluator.py deleted file mode 100644 index b1e19996..00000000 --- a/docling_eval/evaluators/base_readingorder_evaluator.py +++ /dev/null @@ -1,395 +0,0 @@ -import copy -import json -import logging -import math -from abc import abstractmethod -from io import BytesIO -from pathlib import Path -from typing import Dict, List, Optional, Tuple - -from datasets import load_dataset -from docling.datamodel.base_models import BoundingBox, Cluster -from docling.utils.visualization import draw_clusters -from docling_core.types.doc.document import DocItem, DoclingDocument, TextItem -from PIL import Image, ImageDraw, ImageFont -from pydantic import BaseModel -from tqdm import tqdm # type: ignore - -from docling_eval.datamodels.types import BenchMarkColumns -from docling_eval.evaluators.stats import DatasetStatistics, compute_stats -from docling_eval.visualisation.visualisations import draw_arrow - -_log = logging.getLogger(__name__) - - -class PageReadingOrderEvaluation(BaseModel): - doc_id: str - - # BBoxes are in BOTTOMLEFT origin and in the true order - bboxes: List[Tuple[float, float, float, float]] - pred_order: List[int] - ard_norm: float # Normalized ARD: 0 is the worst and 1 is the best - w_ard_norm: ( - float # Weighted normalized ARD. The weight is the (bbox_area / page_area) - ) - - -class DatasetReadingOrderEvaluation(BaseModel): - evaluations: List[PageReadingOrderEvaluation] - ard_stats: DatasetStatistics - w_ard_stats: DatasetStatistics - - -class BaseReadingOrderEvaluator: - r""" - Evaluate the reading order using the Average Relative Distance metric - """ - - def __call__( - self, ds_path: Path, split: str = "test" - ) -> DatasetReadingOrderEvaluation: - parquet_files = str(ds_path / split / "*.parquet") - ds = load_dataset("parquet", data_files={split: parquet_files}) - _log.info(f"oveview of dataset: {ds}") - if ds is not None: - ds_selection = ds[split] - - evaluations: list[PageReadingOrderEvaluation] = [] - ards = [] - w_ards = [] - - broken_docs = 0 - for i, data in tqdm( - enumerate(ds_selection), - desc="Reading order evaluations", - ncols=120, - total=len(ds_selection), - ): - doc_id = data[BenchMarkColumns.DOC_ID] - true_doc_dict = data[BenchMarkColumns.GROUNDTRUTH] - true_doc: DoclingDocument = DoclingDocument.model_validate_json( - true_doc_dict - ) - # print(f"\n{i} - doc_id: {doc_id}") - # self._show_items(true_doc) - - reading_order = self._get_reading_order_preds(doc_id, true_doc) - if reading_order is None: - broken_docs += 1 - continue - - # Compute metrics - ard_norm, w_ard_norm = self._compute_ard(reading_order) - ards.append(ard_norm) - w_ards.append(w_ard_norm) - - page_evaluation = PageReadingOrderEvaluation( - doc_id=doc_id, - bboxes=[b.as_tuple() for b in reading_order["bboxes"]], - pred_order=reading_order["pred_order"], - ard_norm=ard_norm, - w_ard_norm=w_ard_norm, - ) - # print("pred_reading_order") - # print(page_evaluation) - # print(f"ard={ard}") - - evaluations.append(page_evaluation) - - if broken_docs > 0: - _log.warning(f"Broken documents: {broken_docs}") - - # Compute statistics for metrics - ard_stats = compute_stats(ards) - w_ard_stats = compute_stats(w_ards) - - ds_reading_order_evaluation = DatasetReadingOrderEvaluation( - evaluations=evaluations, ard_stats=ard_stats, w_ard_stats=w_ard_stats - ) - - return ds_reading_order_evaluation - - @abstractmethod - def _get_reading_order_preds( - self, doc_id: str, true_doc: DoclingDocument - ) -> Optional[dict]: - r""" - Return dict with the bboxes and the predicted reading order or None if something goes wrong. - None is also returned if the document contains items with multiple provenances - - Returns - ------- - reading_order: Keys are "bboxes" and "pred_order". Return None if the document is broken. - """ - pass - - def _compute_ard(self, reading_order: Dict) -> tuple[float, float]: - r""" - Compute the metrics: - 1. Normalized Average Relative Distance (ARD) - 2. Weighted normalized Average Relative Distance. - - ARD = (1/n) * sum(e_k) - e_k = abs(pred_order_index - gt_order_index) - 0 is the best and n-1 is the worst where n is the number of bboxes - - ARD_norm = 1 - (ARD / n) - 0 is the worst and 1 is the best - - weighted_ARD = (1/n) * sum(e_k * weight_k) - weight_k = area(bbox_k) / area(page) - weighted ARD_norm = 1 - (weighted_ARD / n) - - Returns - ------- - ard_norm: Normalized average relative distance - ward_norm: Normalized weighted average to the area of the bbox - """ - n = len(reading_order["bboxes"]) - if n == 0: - return 0.0, 0.0 - - # Compute bbox weights - bbox_areas = [b.area() for b in reading_order["bboxes"]] - total_bboxes = sum(bbox_areas) - weights = [(a / total_bboxes) for a in bbox_areas] - - # Compute ARD and weighted ARD - ard = 0.0 - w_ard = 0.0 - for true_ro, pred_ro in enumerate(reading_order["pred_order"]): - dist = math.fabs(true_ro - pred_ro) - ard += dist - w_ard += dist * weights[true_ro] - - n_sq = n * n - ard_norm = 1 - (ard / n_sq) - w_ard_norm = 1 - (w_ard / n_sq) - return ard_norm, w_ard_norm - - def _ensure_bboxes_in_legacy_tables(self, legacy_doc_dict: Dict): - r""" - Ensure bboxes for all table cells - """ - for table in legacy_doc_dict["tables"]: - for row in table["data"]: - for cell in row: - if "bbox" not in cell: - cell["bbox"] = [0, 0, 0, 0] - return legacy_doc_dict - - def _show_items(self, true_doc: DoclingDocument): - r""" """ - page_size = true_doc.pages[1].size - for i, (item, level) in enumerate(true_doc.iterate_items()): - bbox = ( - item.prov[0].bbox.to_bottom_left_origin(page_size.height) - if isinstance(item, DocItem) - else None - ) - text = item.text if isinstance(item, TextItem) else None - label = item.label # type: ignore - print(f"True {i}: {level} - {label}: {bbox} - {text}") - - -class ReadingOrderVisualizer: - r""" - Generate visualizations of the GT and predicted reading order - """ - - def __init__(self): - self._line_width = 2 - self._true_arrow_color = "green" - self._pred_arrow_color = "red" - self._item_color = "blue" - self._viz_sub_dir = "reading_order_viz" - - # Load a font (adjust the font size and path as needed) - self._font = ImageFont.load_default() - try: - self._font = ImageFont.truetype("arial.ttf", size=15) - except IOError: - self._font = ImageFont.load_default() - - def __call__( - self, - ds_path: Path, - reading_order_report_fn: Path, - save_dir: Path, - split: str = "test", - ): - r""" - Use a pre-generated reading order report and visualize the original and predicted reading - order. Generate one html visualization per document and save it in the output dir. - """ - save_dir /= self._viz_sub_dir - save_dir.mkdir(parents=True, exist_ok=True) - - # Read the evaluation report and make an index: doc_id -> predicted reading order - ro_preds_idx: dict[str, list[int]] = {} - with open(reading_order_report_fn, "r") as fd: - ro_evaluation_dict = json.load(fd) - for evaluation in ro_evaluation_dict["evaluations"]: - doc_id = evaluation["doc_id"] - ro_preds_idx[doc_id] = evaluation["pred_order"] - - # Open the converted dataset - parquet_files = str(ds_path / split / "*.parquet") - ds = load_dataset("parquet", data_files={split: parquet_files}) - if ds is not None: - ds_selection = ds[split] - - # Visualize the reading order - viz_fns: list[Path] = [] - for i, data in tqdm( - enumerate(ds_selection), - desc="Reading order visualizations", - ncols=120, - total=len(ds_selection), - ): - doc_id = data[BenchMarkColumns.DOC_ID] - page_images = data[BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES] - true_doc_dict = data[BenchMarkColumns.GROUNDTRUTH] - true_doc: DoclingDocument = DoclingDocument.model_validate_json( - true_doc_dict - ) - if doc_id not in ro_preds_idx: - continue - pred_order = ro_preds_idx[doc_id] - - # Draw and save the visualization - image_bytes = page_images[0]["bytes"] - image = Image.open(BytesIO(image_bytes)) - - clusters = [] - for idx, (elem, _) in enumerate(true_doc.iterate_items()): - if not isinstance(elem, DocItem): - continue - prov = elem.prov[0] - cluster = Cluster( - id=idx, - label=elem.label, - bbox=BoundingBox.model_validate( - prov.bbox.to_top_left_origin( - page_height=true_doc.pages[prov.page_no].size.height - ) - ), - cells=[], - ) - clusters.append(cluster) - scale_x = image.width / true_doc.pages[1].size.width - scale_y = image.height / true_doc.pages[1].size.height - draw_clusters(image, clusters, scale_x, scale_y) - - viz_image = self._draw_permuted_reading_order( - doc_id, image, true_doc, pred_order - ) - viz_fn = save_dir / f"{doc_id}_reading_order_viz.png" - viz_fns.append(viz_fn) - viz_image.save(viz_fn) - - return viz_fns - - def _draw_permuted_reading_order( - self, - doc_id: str, - page_image: Image.Image, - doc: DoclingDocument, - pred_order: list[int], - ) -> Image.Image: - # TODO: Add the reading order also as labels - bboxes = [] - - true_img = copy.deepcopy(page_image) - true_draw = ImageDraw.Draw(true_img) - - # Draw the bboxes and true order - x0, y0 = -1.0, -1.0 - for item_id, (item, level) in enumerate(doc.iterate_items()): - if not isinstance(item, DocItem): - continue - - pred_len = len(item.prov) - if pred_len > 1: - # _log.warning("Skipping element %s in document %s as it has %s provenances", - # item_id, doc_id, pred_len) - continue - - prov = item.prov[0] - - # Get the item's bbox in top-left origin for the image dimensions - bbox = prov.bbox.to_top_left_origin( - page_height=doc.pages[prov.page_no].size.height - ) - bbox = bbox.normalized(doc.pages[prov.page_no].size) - bbox.l = round(bbox.l * true_img.width) - bbox.r = round(bbox.r * true_img.width) - bbox.t = round(bbox.t * true_img.height) - bbox.b = round(bbox.b * true_img.height) - if bbox.b > bbox.t: - bbox.b, bbox.t = bbox.t, bbox.b - - bboxes.append(bbox) - - # Draw rectangle with only a border - true_draw.rectangle( - [bbox.l, bbox.b, bbox.r, bbox.t], - outline=self._item_color, - width=self._line_width, - ) - - # Get the arrow coordinates - if x0 == -1 and y0 == -1: - x0 = (bbox.l + bbox.r) / 2.0 - y0 = (bbox.b + bbox.t) / 2.0 - else: - x1 = (bbox.l + bbox.r) / 2.0 - y1 = (bbox.b + bbox.t) / 2.0 - - true_draw = draw_arrow( - true_draw, - (x0, y0, x1, y1), - color=self._true_arrow_color, - line_width=self._line_width, - ) - x0, y0 = x1, y1 - - # Draw the bboxes and the predicted order - pred_img = copy.deepcopy(page_image) - pred_draw = ImageDraw.Draw(pred_img) - x0, y0 = -1.0, -1.0 - for true_id in range(len(bboxes)): - pred_id = pred_order[true_id] - bbox = bboxes[pred_id] - - # Draw rectangle with only a border - pred_draw.rectangle( - [bbox.l, bbox.b, bbox.r, bbox.t], - outline=self._item_color, - width=self._line_width, - ) - - # Get the arrow coordinates - if x0 == -1 and y0 == -1: - x0 = (bbox.l + bbox.r) / 2.0 - y0 = (bbox.b + bbox.t) / 2.0 - else: - x1 = (bbox.l + bbox.r) / 2.0 - y1 = (bbox.b + bbox.t) / 2.0 - - pred_draw = draw_arrow( - pred_draw, - (x0, y0, x1, y1), - color=self._pred_arrow_color, - line_width=self._line_width, - ) - x0, y0 = x1, y1 - - # Make combined image - mode = page_image.mode - w, h = page_image.size - combined_img = Image.new(mode, (2 * w, h), "white") - combined_img.paste(true_img, (0, 0)) - combined_img.paste(pred_img, (w, 0)) - - return combined_img diff --git a/docling_eval/evaluators/readingorder_evaluator.py b/docling_eval/evaluators/readingorder_evaluator.py index d09a4cf5..bdbf69ec 100644 --- a/docling_eval/evaluators/readingorder_evaluator.py +++ b/docling_eval/evaluators/readingorder_evaluator.py @@ -1,29 +1,143 @@ import copy +import json import logging +import math import random -from typing import Dict, List, Optional +from abc import abstractmethod +from io import BytesIO +from pathlib import Path +from typing import Dict, List, Optional, Tuple -from docling_core.types.doc.document import DocItem, DoclingDocument, RefItem +from datasets import load_dataset +from docling.datamodel.base_models import BoundingBox, Cluster +from docling.utils.visualization import draw_clusters +from docling_core.types.doc.document import DocItem, DoclingDocument, RefItem, TextItem from docling_ibm_models.reading_order.reading_order_rb import ( PageElement as ReadingOrderPageElement, ) from docling_ibm_models.reading_order.reading_order_rb import ReadingOrderPredictor +from PIL import Image, ImageDraw, ImageFont +from pydantic import BaseModel +from tqdm import tqdm # type: ignore -from docling_eval.evaluators.base_readingorder_evaluator import ( - BaseReadingOrderEvaluator, +from docling_eval.datamodels.dataset_record import DatasetRecordWithPrediction +from docling_eval.datamodels.types import BenchMarkColumns, PredictionFormats +from docling_eval.evaluators.base_evaluator import ( + BaseEvaluator, + DatasetEvaluation, + PageEvaluation, ) +from docling_eval.evaluators.stats import DatasetStatistics, compute_stats +from docling_eval.visualisation.visualisations import draw_arrow _log = logging.getLogger(__name__) -class ReadingOrderEvaluator(BaseReadingOrderEvaluator): +class PageReadingOrderEvaluation(PageEvaluation): + doc_id: str + + # BBoxes are in BOTTOMLEFT origin and in the true order + bboxes: List[Tuple[float, float, float, float]] + pred_order: List[int] + ard_norm: float # Normalized ARD: 0 is the worst and 1 is the best + w_ard_norm: ( + float # Weighted normalized ARD. The weight is the (bbox_area / page_area) + ) + + +class DatasetReadingOrderEvaluation(DatasetEvaluation): + evaluations: List[PageReadingOrderEvaluation] + ard_stats: DatasetStatistics + w_ard_stats: DatasetStatistics + + +class ReadingOrderEvaluator(BaseEvaluator): r""" Evaluate the reading order using the Average Relative Distance metric """ - def __init__(self): + def __init__( + self, + intermediate_evaluations_path: Optional[Path] = None, + prediction_sources: List[PredictionFormats] = [], + ): + r""" """ + supported_prediction_formats: List[PredictionFormats] = [ + PredictionFormats.DOCLING_DOCUMENT, + ] + if not prediction_sources: + prediction_sources = supported_prediction_formats + super().__init__( + intermediate_evaluations_path=intermediate_evaluations_path, + prediction_sources=prediction_sources, + supported_prediction_formats=supported_prediction_formats, + ) self.ro_model = ReadingOrderPredictor() + def __call__( + self, + ds_path: Path, + split: str = "test", + ) -> DatasetReadingOrderEvaluation: + parquet_files = str(ds_path / split / "*.parquet") + ds = load_dataset("parquet", data_files={split: parquet_files}) + _log.info(f"oveview of dataset: {ds}") + if ds is not None: + ds_selection = ds[split] + + evaluations: list[PageReadingOrderEvaluation] = [] + ards = [] + w_ards = [] + + broken_docs = 0 + for i, data in tqdm( + enumerate(ds_selection), + desc="Reading order evaluations", + ncols=120, + total=len(ds_selection), + ): + data_record = DatasetRecordWithPrediction.model_validate(data) + doc_id = data_record.doc_id + true_doc = data_record.ground_truth_doc + + reading_order = self._get_reading_order_preds(doc_id, true_doc) + if reading_order is None: + broken_docs += 1 + continue + + # Compute metrics + ard_norm, w_ard_norm = self._compute_ard(reading_order) + ards.append(ard_norm) + w_ards.append(w_ard_norm) + + page_evaluation = PageReadingOrderEvaluation( + doc_id=doc_id, + bboxes=[b.as_tuple() for b in reading_order["bboxes"]], + pred_order=reading_order["pred_order"], + ard_norm=ard_norm, + w_ard_norm=w_ard_norm, + ) + + evaluations.append(page_evaluation) + + if self._intermediate_evaluations_path: + self.save_intermediate_evalutions( + "reading_order", i, doc_id, evaluations + ) + + if broken_docs > 0: + _log.warning(f"Broken documents: {broken_docs}") + + # Compute statistics for metrics + ard_stats = compute_stats(ards) + w_ard_stats = compute_stats(w_ards) + + ds_reading_order_evaluation = DatasetReadingOrderEvaluation( + evaluations=evaluations, ard_stats=ard_stats, w_ard_stats=w_ard_stats + ) + + return ds_reading_order_evaluation + def _get_reading_order_preds( self, doc_id: str, true_doc: DoclingDocument ) -> Optional[dict]: @@ -96,3 +210,274 @@ def _get_reading_order_preds( except RuntimeError as ex: _log.error(str(ex)) return None + + def _compute_ard(self, reading_order: Dict) -> tuple[float, float]: + r""" + Compute the metrics: + 1. Normalized Average Relative Distance (ARD) + 2. Weighted normalized Average Relative Distance. + + ARD = (1/n) * sum(e_k) + e_k = abs(pred_order_index - gt_order_index) + 0 is the best and n-1 is the worst where n is the number of bboxes + + ARD_norm = 1 - (ARD / n) + 0 is the worst and 1 is the best + + weighted_ARD = (1/n) * sum(e_k * weight_k) + weight_k = area(bbox_k) / area(page) + weighted ARD_norm = 1 - (weighted_ARD / n) + + Returns + ------- + ard_norm: Normalized average relative distance + ward_norm: Normalized weighted average to the area of the bbox + """ + n = len(reading_order["bboxes"]) + if n == 0: + return 0.0, 0.0 + + # Compute bbox weights + bbox_areas = [b.area() for b in reading_order["bboxes"]] + total_bboxes = sum(bbox_areas) + weights = [(a / total_bboxes) for a in bbox_areas] + + # Compute ARD and weighted ARD + ard = 0.0 + w_ard = 0.0 + for true_ro, pred_ro in enumerate(reading_order["pred_order"]): + dist = math.fabs(true_ro - pred_ro) + ard += dist + w_ard += dist * weights[true_ro] + + n_sq = n * n + ard_norm = 1 - (ard / n_sq) + w_ard_norm = 1 - (w_ard / n_sq) + return ard_norm, w_ard_norm + + def _ensure_bboxes_in_legacy_tables(self, legacy_doc_dict: Dict): + r""" + Ensure bboxes for all table cells + """ + for table in legacy_doc_dict["tables"]: + for row in table["data"]: + for cell in row: + if "bbox" not in cell: + cell["bbox"] = [0, 0, 0, 0] + return legacy_doc_dict + + def _show_items(self, true_doc: DoclingDocument): + r""" """ + page_size = true_doc.pages[1].size + for i, (item, level) in enumerate(true_doc.iterate_items()): + bbox = ( + item.prov[0].bbox.to_bottom_left_origin(page_size.height) + if isinstance(item, DocItem) + else None + ) + text = item.text if isinstance(item, TextItem) else None + label = item.label # type: ignore + print(f"True {i}: {level} - {label}: {bbox} - {text}") + + +class ReadingOrderVisualizer: + r""" + Generate visualizations of the GT and predicted reading order + """ + + def __init__(self): + self._line_width = 2 + self._true_arrow_color = "green" + self._pred_arrow_color = "red" + self._item_color = "blue" + self._viz_sub_dir = "reading_order_viz" + + # Load a font (adjust the font size and path as needed) + self._font = ImageFont.load_default() + try: + self._font = ImageFont.truetype("arial.ttf", size=15) + except IOError: + self._font = ImageFont.load_default() + + def __call__( + self, + ds_path: Path, + reading_order_report_fn: Path, + save_dir: Path, + split: str = "test", + ): + r""" + Use a pre-generated reading order report and visualize the original and predicted reading + order. Generate one html visualization per document and save it in the output dir. + """ + save_dir /= self._viz_sub_dir + save_dir.mkdir(parents=True, exist_ok=True) + + # Read the evaluation report and make an index: doc_id -> predicted reading order + ro_preds_idx: dict[str, list[int]] = {} + with open(reading_order_report_fn, "r") as fd: + ro_evaluation_dict = json.load(fd) + for evaluation in ro_evaluation_dict["evaluations"]: + doc_id = evaluation["doc_id"] + ro_preds_idx[doc_id] = evaluation["pred_order"] + + # Open the converted dataset + parquet_files = str(ds_path / split / "*.parquet") + ds = load_dataset("parquet", data_files={split: parquet_files}) + if ds is not None: + ds_selection = ds[split] + + # Visualize the reading order + viz_fns: list[Path] = [] + for i, data in tqdm( + enumerate(ds_selection), + desc="Reading order visualizations", + ncols=120, + total=len(ds_selection), + ): + doc_id = data[BenchMarkColumns.DOC_ID] + page_images = data[BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES] + true_doc_dict = data[BenchMarkColumns.GROUNDTRUTH] + true_doc: DoclingDocument = DoclingDocument.model_validate_json( + true_doc_dict + ) + if doc_id not in ro_preds_idx: + continue + pred_order = ro_preds_idx[doc_id] + + # Draw and save the visualization + image_bytes = page_images[0]["bytes"] + image = Image.open(BytesIO(image_bytes)) + + clusters = [] + for idx, (elem, _) in enumerate(true_doc.iterate_items()): + if not isinstance(elem, DocItem): + continue + prov = elem.prov[0] + cluster = Cluster( + id=idx, + label=elem.label, + bbox=BoundingBox.model_validate( + prov.bbox.to_top_left_origin( + page_height=true_doc.pages[prov.page_no].size.height + ) + ), + cells=[], + ) + clusters.append(cluster) + scale_x = image.width / true_doc.pages[1].size.width + scale_y = image.height / true_doc.pages[1].size.height + draw_clusters(image, clusters, scale_x, scale_y) + + viz_image = self._draw_permuted_reading_order( + doc_id, image, true_doc, pred_order + ) + viz_fn = save_dir / f"{doc_id}_reading_order_viz.png" + viz_fns.append(viz_fn) + viz_image.save(viz_fn) + + return viz_fns + + def _draw_permuted_reading_order( + self, + doc_id: str, + page_image: Image.Image, + doc: DoclingDocument, + pred_order: list[int], + ) -> Image.Image: + # TODO: Add the reading order also as labels + bboxes = [] + + true_img = copy.deepcopy(page_image) + true_draw = ImageDraw.Draw(true_img) + + # Draw the bboxes and true order + x0, y0 = -1.0, -1.0 + for item_id, (item, level) in enumerate(doc.iterate_items()): + if not isinstance(item, DocItem): + continue + + pred_len = len(item.prov) + if pred_len > 1: + # _log.warning("Skipping element %s in document %s as it has %s provenances", + # item_id, doc_id, pred_len) + continue + + prov = item.prov[0] + + # Get the item's bbox in top-left origin for the image dimensions + bbox = prov.bbox.to_top_left_origin( + page_height=doc.pages[prov.page_no].size.height + ) + bbox = bbox.normalized(doc.pages[prov.page_no].size) + bbox.l = round(bbox.l * true_img.width) + bbox.r = round(bbox.r * true_img.width) + bbox.t = round(bbox.t * true_img.height) + bbox.b = round(bbox.b * true_img.height) + if bbox.b > bbox.t: + bbox.b, bbox.t = bbox.t, bbox.b + + bboxes.append(bbox) + + # Draw rectangle with only a border + true_draw.rectangle( + [bbox.l, bbox.b, bbox.r, bbox.t], + outline=self._item_color, + width=self._line_width, + ) + + # Get the arrow coordinates + if x0 == -1 and y0 == -1: + x0 = (bbox.l + bbox.r) / 2.0 + y0 = (bbox.b + bbox.t) / 2.0 + else: + x1 = (bbox.l + bbox.r) / 2.0 + y1 = (bbox.b + bbox.t) / 2.0 + + true_draw = draw_arrow( + true_draw, + (x0, y0, x1, y1), + color=self._true_arrow_color, + line_width=self._line_width, + ) + x0, y0 = x1, y1 + + # Draw the bboxes and the predicted order + pred_img = copy.deepcopy(page_image) + pred_draw = ImageDraw.Draw(pred_img) + x0, y0 = -1.0, -1.0 + for true_id in range(len(bboxes)): + pred_id = pred_order[true_id] + bbox = bboxes[pred_id] + + # Draw rectangle with only a border + pred_draw.rectangle( + [bbox.l, bbox.b, bbox.r, bbox.t], + outline=self._item_color, + width=self._line_width, + ) + + # Get the arrow coordinates + if x0 == -1 and y0 == -1: + x0 = (bbox.l + bbox.r) / 2.0 + y0 = (bbox.b + bbox.t) / 2.0 + else: + x1 = (bbox.l + bbox.r) / 2.0 + y1 = (bbox.b + bbox.t) / 2.0 + + pred_draw = draw_arrow( + pred_draw, + (x0, y0, x1, y1), + color=self._pred_arrow_color, + line_width=self._line_width, + ) + x0, y0 = x1, y1 + + # Make combined image + mode = page_image.mode + w, h = page_image.size + combined_img = Image.new(mode, (2 * w, h), "white") + combined_img.paste(true_img, (0, 0)) + combined_img.paste(pred_img, (w, 0)) + + return combined_img diff --git a/docling_eval/legacy/main.py b/docling_eval/legacy/main.py index dd9e01ee..78a20cf0 100644 --- a/docling_eval/legacy/main.py +++ b/docling_eval/legacy/main.py @@ -13,10 +13,6 @@ ConverterTypes, EvaluationModality, ) -from docling_eval.evaluators.base_readingorder_evaluator import ( - DatasetReadingOrderEvaluation, - ReadingOrderVisualizer, -) from docling_eval.evaluators.bbox_text_evaluator import BboxTextEvaluator from docling_eval.evaluators.layout_evaluator import ( DatasetLayoutEvaluation, @@ -26,7 +22,11 @@ DatasetMarkdownEvaluation, MarkdownTextEvaluator, ) -from docling_eval.evaluators.readingorder_evaluator import ReadingOrderEvaluator +from docling_eval.evaluators.readingorder_evaluator import ( + DatasetReadingOrderEvaluation, + ReadingOrderEvaluator, + ReadingOrderVisualizer, +) from docling_eval.evaluators.stats import DatasetStatistics from docling_eval.evaluators.table_evaluator import ( DatasetTableEvaluation, diff --git a/tests/test_readingorder_evaluator.py b/tests/test_readingorder_evaluator.py new file mode 100644 index 00000000..88a28c2a --- /dev/null +++ b/tests/test_readingorder_evaluator.py @@ -0,0 +1,33 @@ +from pathlib import Path + +import pytest + +from docling_eval.datamodels.types import PredictionFormats +from docling_eval.evaluators.readingorder_evaluator import ReadingOrderEvaluator + + +@pytest.mark.dependency( + depends=["tests/test_dataset_builder.py::test_run_doclaynet_v1_e2e"], + scope="session", +) +def test_readingorder_evaluator(): + r""" """ + test_dataset_dir = Path("scratch/DocLayNetV1/eval_dataset") + + # Default evaluator + eval1 = ReadingOrderEvaluator() + v1 = eval1(test_dataset_dir) + assert v1 is not None + + # Specify invalid order in prediction_sources + is_exception = False + try: + eval3 = ReadingOrderEvaluator(prediction_sources=[PredictionFormats.JSON]) + eval3(test_dataset_dir) + except RuntimeError as ex: + is_exception = True + assert is_exception + + +if __name__ == "__main__": + test_readingorder_evaluator() diff --git a/tests/test_table_evaluator.py b/tests/test_table_evaluator.py index b4a6883c..05915946 100644 --- a/tests/test_table_evaluator.py +++ b/tests/test_table_evaluator.py @@ -282,7 +282,7 @@ def test_evaluate_tables(): table_evaluator = TableEvaluator() # Evaluate equal tables - evaluations: list[TableEvaluation] = table_evaluator._evaluate_tables_in_documents( + evaluations: List[TableEvaluation] = table_evaluator._evaluate_tables_in_documents( doc_id="test", true_doc=doc, pred_doc=doc ) assert len(evaluations) == 1 From 6af49cd9083f13a31a96e821a608747029cbee70 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 09:11:47 +0200 Subject: [PATCH 66/81] Optimize GT downloading behaviour Signed-off-by: Christoph Auer --- docling_eval/cli/main.py | 3 ++- docling_eval/dataset_builders/dataset_builder.py | 7 +++++-- docling_eval/dataset_builders/doclaynet_v1_builder.py | 11 ++++------- docling_eval/dataset_builders/doclaynet_v2_builder.py | 4 +++- docling_eval/dataset_builders/dpbench_builder.py | 4 +++- docling_eval/dataset_builders/funsd_builder.py | 4 ++++ docling_eval/dataset_builders/omnidocbench_builder.py | 4 +++- .../dataset_builders/otsl_table_dataset_builder.py | 9 +++++++-- docling_eval/dataset_builders/xfund_builder.py | 2 ++ tests/test_dataset_builder.py | 10 +++++----- 10 files changed, 38 insertions(+), 20 deletions(-) diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py index 3e1eba93..5a2e228b 100644 --- a/docling_eval/cli/main.py +++ b/docling_eval/cli/main.py @@ -617,7 +617,8 @@ def create_gt( ) # Retrieve and save the dataset - dataset_builder.retrieve_input_dataset() + if dataset_builder.must_retrieve: + dataset_builder.retrieve_input_dataset() dataset_builder.save_to_disk(chunk_size=80) _log.info(f"Ground truth dataset created at {gt_dir}") diff --git a/docling_eval/dataset_builders/dataset_builder.py b/docling_eval/dataset_builders/dataset_builder.py index f41d870c..10b65b7e 100644 --- a/docling_eval/dataset_builders/dataset_builder.py +++ b/docling_eval/dataset_builders/dataset_builder.py @@ -40,6 +40,7 @@ def __init__( name: str, dataset_source: Union[HFSource, S3Source, Path], target: Path, + dataset_local_path: Optional[Path] = None, split: str = "test", begin_index: int = 0, end_index: int = -1, @@ -58,12 +59,14 @@ def __init__( self.name = name self.target: Path = target self.dataset_source = dataset_source - self.dataset_local_path: Optional[Path] = None + self.dataset_local_path = dataset_local_path self.split = split self.begin_index = begin_index self.end_index = end_index self.retrieved = False + self.must_retrieve = False + def retrieve_input_dataset(self) -> Path: """ Download and retrieve the input dataset. @@ -161,7 +164,7 @@ def save_to_disk( chunk_size: Number of records per chunk max_num_chunks: Maximum number of chunks to save """ - if not self.retrieved: + if not self.retrieved and self.must_retrieve: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." ) diff --git a/docling_eval/dataset_builders/doclaynet_v1_builder.py b/docling_eval/dataset_builders/doclaynet_v1_builder.py index 61b1d5b7..cc8f0fd7 100644 --- a/docling_eval/dataset_builders/doclaynet_v1_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v1_builder.py @@ -283,15 +283,12 @@ def iterate(self) -> Iterable[DatasetRecord]: Yields: DatasetRecord objects """ - if not self.retrieved: - raise RuntimeError( - "You must first retrieve the source dataset. Call retrieve_input_dataset()." - ) - - assert self.dataset_local_path is not None + path = "ds4sd/DocLayNet-v1.2" + if self.dataset_local_path is not None: + path = str(self.dataset_local_path) # Load dataset from the retrieved path - ds = load_dataset("ds4sd/DocLayNet-v1.2", split=self.split) + ds = load_dataset(path, split=self.split) # Apply HuggingFace's select method for index ranges total_ds_len = len(ds) diff --git a/docling_eval/dataset_builders/doclaynet_v2_builder.py b/docling_eval/dataset_builders/doclaynet_v2_builder.py index 0e745e4e..162d72e2 100644 --- a/docling_eval/dataset_builders/doclaynet_v2_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v2_builder.py @@ -76,6 +76,8 @@ def __init__( end_index=end_index, ) + self.must_retrieve = True + def extract_tokens_and_text(self, s: str) -> Tuple[List[str], List[str]]: """ Extract tokens and text from a string. @@ -578,7 +580,7 @@ def iterate(self) -> Iterable[DatasetRecord]: Yields: DatasetRecord objects """ - if not self.retrieved: + if not self.retrieved and self.must_retrieve: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." ) diff --git a/docling_eval/dataset_builders/dpbench_builder.py b/docling_eval/dataset_builders/dpbench_builder.py index 832facd8..30e55bbc 100644 --- a/docling_eval/dataset_builders/dpbench_builder.py +++ b/docling_eval/dataset_builders/dpbench_builder.py @@ -115,6 +115,8 @@ def __init__( end_index=end_index, ) + self.must_retrieve = True + def _update_gt_doc( self, doc: DoclingDocument, @@ -276,7 +278,7 @@ def iterate(self) -> Iterable[DatasetRecord]: Yields: DatasetRecord objects """ - if not self.retrieved: + if not self.retrieved and self.must_retrieve: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." ) diff --git a/docling_eval/dataset_builders/funsd_builder.py b/docling_eval/dataset_builders/funsd_builder.py index 13dcb2e5..4d86ece8 100644 --- a/docling_eval/dataset_builders/funsd_builder.py +++ b/docling_eval/dataset_builders/funsd_builder.py @@ -62,6 +62,8 @@ def __init__( end_index=end_index, ) + self.must_retrieve = True + def retrieve_input_dataset(self) -> Path: """ Download and extract the FUNSD dataset if needed. @@ -114,6 +116,8 @@ def retrieve_input_dataset(self) -> Path: _log.info(f"FUNSD dataset downloaded to {dataset_path}") + shutil.rmtree(extracted_path) + self.retrieved = True return dataset_path diff --git a/docling_eval/dataset_builders/omnidocbench_builder.py b/docling_eval/dataset_builders/omnidocbench_builder.py index 3b5d37e9..390e11c0 100644 --- a/docling_eval/dataset_builders/omnidocbench_builder.py +++ b/docling_eval/dataset_builders/omnidocbench_builder.py @@ -115,6 +115,8 @@ def __init__( end_index=end_index, ) + self.must_retrieve = True + def update_gt_into_map(self, gt: List[Dict]) -> Dict[str, Dict]: """ Convert list of annotation items to a map keyed by image path. @@ -326,7 +328,7 @@ def iterate(self) -> Iterable[DatasetRecord]: Yields: DatasetRecord objects """ - if not self.retrieved: + if not self.retrieved and self.must_retrieve: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." ) diff --git a/docling_eval/dataset_builders/otsl_table_dataset_builder.py b/docling_eval/dataset_builders/otsl_table_dataset_builder.py index 281f163a..768fc2ac 100644 --- a/docling_eval/dataset_builders/otsl_table_dataset_builder.py +++ b/docling_eval/dataset_builders/otsl_table_dataset_builder.py @@ -128,14 +128,19 @@ def iterate(self) -> Iterable[DatasetRecord]: Yields: DatasetRecord objects """ - if not self.retrieved: + if not self.retrieved and self.must_retrieve: raise RuntimeError( "You must first retrieve the source dataset. Call retrieve_input_dataset()." ) assert isinstance(self.dataset_source, HFSource) # Load dataset from the retrieved path - ds = load_dataset(self.dataset_source.repo_id, split=self.split) + + path = self.dataset_source.repo_id + if self.dataset_local_path: + path = str(self.dataset_local_path) + + ds = load_dataset(path, split=self.split) # Apply index range total_items = len(ds) diff --git a/docling_eval/dataset_builders/xfund_builder.py b/docling_eval/dataset_builders/xfund_builder.py index e69a974f..3b62d4fa 100644 --- a/docling_eval/dataset_builders/xfund_builder.py +++ b/docling_eval/dataset_builders/xfund_builder.py @@ -72,6 +72,8 @@ def __init__( "pt", ] # Fixed supported languages + self.must_retrieve = True + def retrieve_input_dataset(self) -> Path: """ Download and extract the XFUND dataset if needed. diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 72f4ef2a..d27c26ba 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -153,7 +153,7 @@ def test_run_doclaynet_with_doctags_fileprovider(): end_index=5, ) - dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF + # dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. file_provider.create_prediction_dataset( @@ -334,7 +334,7 @@ def test_run_doclaynet_v1_e2e(): end_index=5, ) - dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF + # dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. docling_provider.create_prediction_dataset( @@ -461,7 +461,7 @@ def test_run_fintabnet_builder(): end_index=5, ) - dataset.retrieve_input_dataset() # fetches the source dataset from HF + # dataset.retrieve_input_dataset() # fetches the source dataset from HF dataset.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( @@ -494,7 +494,7 @@ def test_run_p1m_builder(): end_index=5, ) - dataset.retrieve_input_dataset() # fetches the source dataset from HF + # dataset.retrieve_input_dataset() # fetches the source dataset from HF dataset.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( @@ -527,7 +527,7 @@ def test_run_pubtabnet_builder(): end_index=25, ) - dataset.retrieve_input_dataset() # fetches the source dataset from HF + # dataset.retrieve_input_dataset() # fetches the source dataset from HF dataset.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. tableformer_provider.create_prediction_dataset( From c5b4a2405ae979daf787a72db99695277c65560f Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 09:32:16 +0200 Subject: [PATCH 67/81] Add file sources Signed-off-by: Christoph Auer --- poetry.lock | 381 +++++++++--------- pyproject.toml | 1 + ...049c038171a06ddfcac892c3c6d7e6b4091c642.dt | 9 + ...7a8b8b84b747c295dd10a639e2b5265ac258cf5.dt | 10 + ...aa87b7cb40eb65eee4483725c1a85c4dc72d141.dt | 18 + ...14eec02c7efd931db5e2a34e66444ee8b8e5079.dt | 14 + ...2497c8236af331fd67bd13b7f7e506d42b4a7e2.dt | 17 + 7 files changed, 267 insertions(+), 183 deletions(-) create mode 100644 tests/data/doclaynet_v1_doctags_sample/132a855ee8b23533d8ae69af0049c038171a06ddfcac892c3c6d7e6b4091c642.dt create mode 100644 tests/data/doclaynet_v1_doctags_sample/2b49edc9d0a47e4efaaeabf907a8b8b84b747c295dd10a639e2b5265ac258cf5.dt create mode 100644 tests/data/doclaynet_v1_doctags_sample/61d269cb1f2c976191469b891aa87b7cb40eb65eee4483725c1a85c4dc72d141.dt create mode 100644 tests/data/doclaynet_v1_doctags_sample/a5acc4c1c47a19543362fccf014eec02c7efd931db5e2a34e66444ee8b8e5079.dt create mode 100644 tests/data/doclaynet_v1_doctags_sample/b13563b6fd80bed51928fc4b42497c8236af331fd67bd13b7f7e506d42b4a7e2.dt diff --git a/poetry.lock b/poetry.lock index 96673135..70db6e62 100644 --- a/poetry.lock +++ b/poetry.lock @@ -47,93 +47,93 @@ files = [ [[package]] name = "aiohttp" -version = "3.11.14" +version = "3.11.15" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e2bc827c01f75803de77b134afdbf74fa74b62970eafdf190f3244931d7a5c0d"}, - {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e365034c5cf6cf74f57420b57682ea79e19eb29033399dd3f40de4d0171998fa"}, - {file = "aiohttp-3.11.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c32593ead1a8c6aabd58f9d7ee706e48beac796bb0cb71d6b60f2c1056f0a65f"}, - {file = "aiohttp-3.11.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4e7c7ec4146a94a307ca4f112802a8e26d969018fabed526efc340d21d3e7d0"}, - {file = "aiohttp-3.11.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8b2df9feac55043759aa89f722a967d977d80f8b5865a4153fc41c93b957efc"}, - {file = "aiohttp-3.11.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7571f99525c76a6280f5fe8e194eeb8cb4da55586c3c61c59c33a33f10cfce7"}, - {file = "aiohttp-3.11.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b59d096b5537ec7c85954cb97d821aae35cfccce3357a2cafe85660cc6295628"}, - {file = "aiohttp-3.11.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b42dbd097abb44b3f1156b4bf978ec5853840802d6eee2784857be11ee82c6a0"}, - {file = "aiohttp-3.11.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b05774864c87210c531b48dfeb2f7659407c2dda8643104fb4ae5e2c311d12d9"}, - {file = "aiohttp-3.11.14-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4e2e8ef37d4bc110917d038807ee3af82700a93ab2ba5687afae5271b8bc50ff"}, - {file = "aiohttp-3.11.14-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e9faafa74dbb906b2b6f3eb9942352e9e9db8d583ffed4be618a89bd71a4e914"}, - {file = "aiohttp-3.11.14-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7e7abe865504f41b10777ac162c727af14e9f4db9262e3ed8254179053f63e6d"}, - {file = "aiohttp-3.11.14-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:4848ae31ad44330b30f16c71e4f586cd5402a846b11264c412de99fa768f00f3"}, - {file = "aiohttp-3.11.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2d0b46abee5b5737cb479cc9139b29f010a37b1875ee56d142aefc10686a390b"}, - {file = "aiohttp-3.11.14-cp310-cp310-win32.whl", hash = "sha256:a0d2c04a623ab83963576548ce098baf711a18e2c32c542b62322a0b4584b990"}, - {file = "aiohttp-3.11.14-cp310-cp310-win_amd64.whl", hash = "sha256:5409a59d5057f2386bb8b8f8bbcfb6e15505cedd8b2445db510563b5d7ea1186"}, - {file = "aiohttp-3.11.14-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f296d637a50bb15fb6a229fbb0eb053080e703b53dbfe55b1e4bb1c5ed25d325"}, - {file = "aiohttp-3.11.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ec6cd1954ca2bbf0970f531a628da1b1338f594bf5da7e361e19ba163ecc4f3b"}, - {file = "aiohttp-3.11.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:572def4aad0a4775af66d5a2b5923c7de0820ecaeeb7987dcbccda2a735a993f"}, - {file = "aiohttp-3.11.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c68e41c4d576cd6aa6c6d2eddfb32b2acfb07ebfbb4f9da991da26633a3db1a"}, - {file = "aiohttp-3.11.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b8bbfc8111826aa8363442c0fc1f5751456b008737ff053570f06a151650b3"}, - {file = "aiohttp-3.11.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b0a200e85da5c966277a402736a96457b882360aa15416bf104ca81e6f5807b"}, - {file = "aiohttp-3.11.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d173c0ac508a2175f7c9a115a50db5fd3e35190d96fdd1a17f9cb10a6ab09aa1"}, - {file = "aiohttp-3.11.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:413fe39fd929329f697f41ad67936f379cba06fcd4c462b62e5b0f8061ee4a77"}, - {file = "aiohttp-3.11.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65c75b14ee74e8eeff2886321e76188cbe938d18c85cff349d948430179ad02c"}, - {file = "aiohttp-3.11.14-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:321238a42ed463848f06e291c4bbfb3d15ba5a79221a82c502da3e23d7525d06"}, - {file = "aiohttp-3.11.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:59a05cdc636431f7ce843c7c2f04772437dd816a5289f16440b19441be6511f1"}, - {file = "aiohttp-3.11.14-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:daf20d9c3b12ae0fdf15ed92235e190f8284945563c4b8ad95b2d7a31f331cd3"}, - {file = "aiohttp-3.11.14-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:05582cb2d156ac7506e68b5eac83179faedad74522ed88f88e5861b78740dc0e"}, - {file = "aiohttp-3.11.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:12c5869e7ddf6b4b1f2109702b3cd7515667b437da90a5a4a50ba1354fe41881"}, - {file = "aiohttp-3.11.14-cp311-cp311-win32.whl", hash = "sha256:92868f6512714efd4a6d6cb2bfc4903b997b36b97baea85f744229f18d12755e"}, - {file = "aiohttp-3.11.14-cp311-cp311-win_amd64.whl", hash = "sha256:bccd2cb7aa5a3bfada72681bdb91637094d81639e116eac368f8b3874620a654"}, - {file = "aiohttp-3.11.14-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:70ab0f61c1a73d3e0342cedd9a7321425c27a7067bebeeacd509f96695b875fc"}, - {file = "aiohttp-3.11.14-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:602d4db80daf4497de93cb1ce00b8fc79969c0a7cf5b67bec96fa939268d806a"}, - {file = "aiohttp-3.11.14-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a8a0d127c10b8d89e69bbd3430da0f73946d839e65fec00ae48ca7916a31948"}, - {file = "aiohttp-3.11.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9f835cdfedcb3f5947304e85b8ca3ace31eef6346d8027a97f4de5fb687534"}, - {file = "aiohttp-3.11.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aa5c68e1e68fff7cd3142288101deb4316b51f03d50c92de6ea5ce646e6c71f"}, - {file = "aiohttp-3.11.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b512f1de1c688f88dbe1b8bb1283f7fbeb7a2b2b26e743bb2193cbadfa6f307"}, - {file = "aiohttp-3.11.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc9253069158d57e27d47a8453d8a2c5a370dc461374111b5184cf2f147a3cc3"}, - {file = "aiohttp-3.11.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b2501f1b981e70932b4a552fc9b3c942991c7ae429ea117e8fba57718cdeed0"}, - {file = "aiohttp-3.11.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:28a3d083819741592685762d51d789e6155411277050d08066537c5edc4066e6"}, - {file = "aiohttp-3.11.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0df3788187559c262922846087e36228b75987f3ae31dd0a1e5ee1034090d42f"}, - {file = "aiohttp-3.11.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e73fa341d8b308bb799cf0ab6f55fc0461d27a9fa3e4582755a3d81a6af8c09"}, - {file = "aiohttp-3.11.14-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:51ba80d473eb780a329d73ac8afa44aa71dfb521693ccea1dea8b9b5c4df45ce"}, - {file = "aiohttp-3.11.14-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8d1dd75aa4d855c7debaf1ef830ff2dfcc33f893c7db0af2423ee761ebffd22b"}, - {file = "aiohttp-3.11.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41cf0cefd9e7b5c646c2ef529c8335e7eafd326f444cc1cdb0c47b6bc836f9be"}, - {file = "aiohttp-3.11.14-cp312-cp312-win32.whl", hash = "sha256:948abc8952aff63de7b2c83bfe3f211c727da3a33c3a5866a0e2cf1ee1aa950f"}, - {file = "aiohttp-3.11.14-cp312-cp312-win_amd64.whl", hash = "sha256:3b420d076a46f41ea48e5fcccb996f517af0d406267e31e6716f480a3d50d65c"}, - {file = "aiohttp-3.11.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d14e274828561db91e4178f0057a915f3af1757b94c2ca283cb34cbb6e00b50"}, - {file = "aiohttp-3.11.14-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f30fc72daf85486cdcdfc3f5e0aea9255493ef499e31582b34abadbfaafb0965"}, - {file = "aiohttp-3.11.14-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4edcbe34e6dba0136e4cabf7568f5a434d89cc9de5d5155371acda275353d228"}, - {file = "aiohttp-3.11.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a7169ded15505f55a87f8f0812c94c9412623c744227b9e51083a72a48b68a5"}, - {file = "aiohttp-3.11.14-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad1f2fb9fe9b585ea4b436d6e998e71b50d2b087b694ab277b30e060c434e5db"}, - {file = "aiohttp-3.11.14-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20412c7cc3720e47a47e63c0005f78c0c2370020f9f4770d7fc0075f397a9fb0"}, - {file = "aiohttp-3.11.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dd9766da617855f7e85f27d2bf9a565ace04ba7c387323cd3e651ac4329db91"}, - {file = "aiohttp-3.11.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:599b66582f7276ebefbaa38adf37585e636b6a7a73382eb412f7bc0fc55fb73d"}, - {file = "aiohttp-3.11.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b41693b7388324b80f9acfabd479bd1c84f0bc7e8f17bab4ecd9675e9ff9c734"}, - {file = "aiohttp-3.11.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:86135c32d06927339c8c5e64f96e4eee8825d928374b9b71a3c42379d7437058"}, - {file = "aiohttp-3.11.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:04eb541ce1e03edc1e3be1917a0f45ac703e913c21a940111df73a2c2db11d73"}, - {file = "aiohttp-3.11.14-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dc311634f6f28661a76cbc1c28ecf3b3a70a8edd67b69288ab7ca91058eb5a33"}, - {file = "aiohttp-3.11.14-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:69bb252bfdca385ccabfd55f4cd740d421dd8c8ad438ded9637d81c228d0da49"}, - {file = "aiohttp-3.11.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2b86efe23684b58a88e530c4ab5b20145f102916bbb2d82942cafec7bd36a647"}, - {file = "aiohttp-3.11.14-cp313-cp313-win32.whl", hash = "sha256:b9c60d1de973ca94af02053d9b5111c4fbf97158e139b14f1be68337be267be6"}, - {file = "aiohttp-3.11.14-cp313-cp313-win_amd64.whl", hash = "sha256:0a29be28e60e5610d2437b5b2fed61d6f3dcde898b57fb048aa5079271e7f6f3"}, - {file = "aiohttp-3.11.14-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14fc03508359334edc76d35b2821832f092c8f092e4b356e74e38419dfe7b6de"}, - {file = "aiohttp-3.11.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:92007c89a8cb7be35befa2732b0b32bf3a394c1b22ef2dff0ef12537d98a7bda"}, - {file = "aiohttp-3.11.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6d3986112e34eaa36e280dc8286b9dd4cc1a5bcf328a7f147453e188f6fe148f"}, - {file = "aiohttp-3.11.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:749f1eb10e51dbbcdba9df2ef457ec060554842eea4d23874a3e26495f9e87b1"}, - {file = "aiohttp-3.11.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:781c8bd423dcc4641298c8c5a2a125c8b1c31e11f828e8d35c1d3a722af4c15a"}, - {file = "aiohttp-3.11.14-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:997b57e38aa7dc6caab843c5e042ab557bc83a2f91b7bd302e3c3aebbb9042a1"}, - {file = "aiohttp-3.11.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a8b0321e40a833e381d127be993b7349d1564b756910b28b5f6588a159afef3"}, - {file = "aiohttp-3.11.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8778620396e554b758b59773ab29c03b55047841d8894c5e335f12bfc45ebd28"}, - {file = "aiohttp-3.11.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e906da0f2bcbf9b26cc2b144929e88cb3bf943dd1942b4e5af066056875c7618"}, - {file = "aiohttp-3.11.14-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:87f0e003fb4dd5810c7fbf47a1239eaa34cd929ef160e0a54c570883125c4831"}, - {file = "aiohttp-3.11.14-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7f2dadece8b85596ac3ab1ec04b00694bdd62abc31e5618f524648d18d9dd7fa"}, - {file = "aiohttp-3.11.14-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:fe846f0a98aa9913c2852b630cd39b4098f296e0907dd05f6c7b30d911afa4c3"}, - {file = "aiohttp-3.11.14-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ced66c5c6ad5bcaf9be54560398654779ec1c3695f1a9cf0ae5e3606694a000a"}, - {file = "aiohttp-3.11.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a40087b82f83bd671cbeb5f582c233d196e9653220404a798798bfc0ee189fff"}, - {file = "aiohttp-3.11.14-cp39-cp39-win32.whl", hash = "sha256:95d7787f2bcbf7cb46823036a8d64ccfbc2ffc7d52016b4044d901abceeba3db"}, - {file = "aiohttp-3.11.14-cp39-cp39-win_amd64.whl", hash = "sha256:22a8107896877212130c58f74e64b77f7007cb03cea8698be317272643602d45"}, - {file = "aiohttp-3.11.14.tar.gz", hash = "sha256:d6edc538c7480fa0a3b2bdd705f8010062d74700198da55d16498e1b49549b9c"}, + {file = "aiohttp-3.11.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:078b1ce274f967951b42a65d5b7ec115b7886343a5271f2eed330458ea87bb48"}, + {file = "aiohttp-3.11.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:48d790d05c76b6cb93a1259b44d3f0019b61d507f8ebf0d49da3ef5ac858b05d"}, + {file = "aiohttp-3.11.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e13767424425bb607931a0b9e703b95d2693650011ef8f0166b4cd80066b66b9"}, + {file = "aiohttp-3.11.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ac49c32901489343b4dab064ab520f6b879a03fb4f9667c84620b66f07bed69"}, + {file = "aiohttp-3.11.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:576b56a34d26ea8a8f0e1a30b8a069ba4ab121fb8eb796d1b89fedda7c74c553"}, + {file = "aiohttp-3.11.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71ed71d9431e770550aab27a77ef9d30d33ce6f558ab7818be7205ae6aca635d"}, + {file = "aiohttp-3.11.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c982b2cbd7b8f4b31e9faf2de09e22b060a6cd0a693f20892dda41a8fb0f46ef"}, + {file = "aiohttp-3.11.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f00e7540a60460fbeaffff4a7dcf72fe8b710f8280a542a4d798273787c64e72"}, + {file = "aiohttp-3.11.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9b97fae7f75a0b666ce4281627856d1b1a85477f26c2e8b266292e770c17df36"}, + {file = "aiohttp-3.11.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a449c48f5b02c0c14f5310881558ca861bff8e00b1f79be4cf6a53f638464c30"}, + {file = "aiohttp-3.11.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8c6e39f0bb2418f839841f92b3cd64077ff5166d724c984ab450ca08d5e51d92"}, + {file = "aiohttp-3.11.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e792131352418dde7b0c598e217e89ecf6a26889f46f35f910e5544ffdebf3ae"}, + {file = "aiohttp-3.11.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:c28cbae1ce76dc48d0fcccb045ac21d00dcc1b306bb745910cf35585ce89404e"}, + {file = "aiohttp-3.11.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9c8417a24063f35b526f8bf14f6f4bdea6f3f49850457337b6ea928901adbbc"}, + {file = "aiohttp-3.11.15-cp310-cp310-win32.whl", hash = "sha256:a50b86eb9cf74fa5b6f1386e08e1520dcbe83d7dfd4c8bf6f2ca72b03d42e79f"}, + {file = "aiohttp-3.11.15-cp310-cp310-win_amd64.whl", hash = "sha256:a0361cafb50b185356a5f346c169aea1d14783df99e6da714d626b104586e0b5"}, + {file = "aiohttp-3.11.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5bd37d615cd26d09321bd0168305f8508778712cf38aeffeed550274fb48a2ee"}, + {file = "aiohttp-3.11.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d706afcc808f6add4208dfa13f911fd93c2a3dab6be484fee4fd0602a0867e"}, + {file = "aiohttp-3.11.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:43625253e3dc018d34867b70909149f15f29eac0382802afe027f2fbf17bcb9c"}, + {file = "aiohttp-3.11.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:437eee9e057a7907b11e4af2b18df56b6c795b28e0a3ac250691936cf6bf40eb"}, + {file = "aiohttp-3.11.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec3dd04138bd30e6a3403dbd3ab5a5ccfb501597c5a95196cd816936ed55b777"}, + {file = "aiohttp-3.11.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85d73479b79172e7d667b466c170ca6097a334c09ecd83c95c210546031251b5"}, + {file = "aiohttp-3.11.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae3a5d9f2fbe736fec7d24be25c57aa78c2d78d96540439ea68a8abbed9906fc"}, + {file = "aiohttp-3.11.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:269d145c593a65f78fb9a64dece90341561ddb2e91a96d42681132b2f706c42a"}, + {file = "aiohttp-3.11.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0987dcf32e4c47f22634d32e4b0ffbc368bbcf2b33b408cd1a3d2dc0a6a5cd34"}, + {file = "aiohttp-3.11.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7cf4b2b5a0f7a738ecd759eaeaef800fc7c57683b7be9d8a43fcb86ca62701b4"}, + {file = "aiohttp-3.11.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f1e0369f0dc8c895e718ce37147f56d46142d37596be183ab7a34192c5e6e4c5"}, + {file = "aiohttp-3.11.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:82ddf7f642b9c0b08063f3cf4e2818b22901bce8ebad05c232d9e295e77436a0"}, + {file = "aiohttp-3.11.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c7eba0f90e27ec4af64db051f35387fa17128e6eeb58ee0f2318f2627168cc2"}, + {file = "aiohttp-3.11.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5a61df20fa77792e83307e266f76790f7cb67980dd476948948de212ee7ec64c"}, + {file = "aiohttp-3.11.15-cp311-cp311-win32.whl", hash = "sha256:be11989cbc0728f81c0d022cef140ef8adb20d3012ad8f0ac61853bef571eb52"}, + {file = "aiohttp-3.11.15-cp311-cp311-win_amd64.whl", hash = "sha256:357355c9d51c8b12bbc7de43b27ce4b51f14cce050e00b5a87d0d5527d779395"}, + {file = "aiohttp-3.11.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:433e7388b3063bba462b3362641988270b087a9ccae22390364f86b37a480c17"}, + {file = "aiohttp-3.11.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d99981304065f4ea407dd7495f74f8b8c10f0e26733f8a47dc174ece73744d14"}, + {file = "aiohttp-3.11.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3739daa52c0cff42f1c40f63b2fe818fcf41019d84c80a7add3224207a7060f"}, + {file = "aiohttp-3.11.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fd82d0b3f73c59c80dade0ca8e0342de1ee261e147140ade65a465be670e83c"}, + {file = "aiohttp-3.11.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c930064b79cc0eb63678e376b819d546b0e2360264cd7544c32119496f646f35"}, + {file = "aiohttp-3.11.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291f324f49ecede693dfb4820a412d1388cb10a2214ab60028252b505e105d6f"}, + {file = "aiohttp-3.11.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65eb40e74e3126cba185da7a78815cf3a30140932193831b3bfd73c79965c723"}, + {file = "aiohttp-3.11.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6d6d86443580f846ec9cf60f899b7cace34411f2ff5c95db5970047195e5bfa"}, + {file = "aiohttp-3.11.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8b4d8d78fbd5290204dcf43957a2184acd5cee358f203f24a3a97f7d7984eeb7"}, + {file = "aiohttp-3.11.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:94c552a4864ed292dadf1d341213374284a3af72e49bea02e70ce6f07cb37004"}, + {file = "aiohttp-3.11.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:23857adc919b64bba8a4db0eccb24e53fcaf85633e690ef1581c5562ed58cae7"}, + {file = "aiohttp-3.11.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:eba325409a0f990f9b43ed18916cbf5b9779bc4c979b8887c444e7be9c38ccca"}, + {file = "aiohttp-3.11.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f1b6c639750bf2a228957e25fcab7a7ff11987c543d70bf73223369f0d7bdb27"}, + {file = "aiohttp-3.11.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2241d862dc6a3c0c2662a6934e79078d3a1e51a76c0dca5d65b30f3debee6c9b"}, + {file = "aiohttp-3.11.15-cp312-cp312-win32.whl", hash = "sha256:18733fa6bbe44698ff96138c1f1d682bbdf0846250a42c25c108eed328fef0d4"}, + {file = "aiohttp-3.11.15-cp312-cp312-win_amd64.whl", hash = "sha256:0ec98c22030ea2a430cb11afddda7d4737b7e5c236c704f0d7d15504978598f7"}, + {file = "aiohttp-3.11.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c37aa3eb8eb92f3793f0c1e73f212a76cbc8d363e9990df54b5b7099f75ce740"}, + {file = "aiohttp-3.11.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5b5edd482ff0a8585b3f4e8b3681819447324166a43a5588800a5bca340dbf27"}, + {file = "aiohttp-3.11.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d8c22c91bdb7417bd4f5119242dbd2e2140c0e9de47342c765f127f897eb57"}, + {file = "aiohttp-3.11.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b03093d4140d926965d23497a059ec59c8c07e602d2489ce5fb990f3a897db4"}, + {file = "aiohttp-3.11.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05eea49d598c4ece6f285e00464de206f838b48ff21938d5aa9c394e115945b9"}, + {file = "aiohttp-3.11.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63f8d6106566f98fcfde7a643c9da52d90679b8592dea76c4adfc3cd5d06d22c"}, + {file = "aiohttp-3.11.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36a490f1ebe0b982366314c77f02258f87bd5d9bd362839dc6a24188447f37eb"}, + {file = "aiohttp-3.11.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73a7f6283634dd30f93b9a67c414c00517869478b50361c503535e075fa07eaf"}, + {file = "aiohttp-3.11.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0e97c1e55f6931f07ecaf53aef8352def8386adfd0cd3caa6429cc40e886d6a9"}, + {file = "aiohttp-3.11.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d8370d31e6d8ecccd97cd791c466d0acb56527df51b0c105d7ea54c7fcc0f75b"}, + {file = "aiohttp-3.11.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c2de66177e087999568638c02639cf0248011b5c7fca69b006947153c534fcab"}, + {file = "aiohttp-3.11.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:edcddb97574402ff7481bc6f70819ba863e77b0be58a840ed5f59d52d2f20a71"}, + {file = "aiohttp-3.11.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:29cce2a7e009494e675018c0b1819a133befbab8629c797276c5d793bbdf1138"}, + {file = "aiohttp-3.11.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:825ec92391e3e4ddda74de79ed0f8b443e9b412a0c9c82618ca2163abd875df5"}, + {file = "aiohttp-3.11.15-cp313-cp313-win32.whl", hash = "sha256:430f9707f0c1239a92bff7769b0db185ef400278dc63c89f88ed1bd5153aab7a"}, + {file = "aiohttp-3.11.15-cp313-cp313-win_amd64.whl", hash = "sha256:f30e6980ec5d6ad815a233e19e39fe27ea94b1081c31c8aa1df1b629da3737b8"}, + {file = "aiohttp-3.11.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:03ce9d2f01aef26cd6aaba2f330273c2364237db2f499b93c3e9f2e249f83cd2"}, + {file = "aiohttp-3.11.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1bee0f9e2d4088b57243d63afcb06256bd2d9ff683080f51e74fa790c8cfedfd"}, + {file = "aiohttp-3.11.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7e20bd6aa51a5209c9131395e20ce126e8e317c0cf78a8180f026b4d73f018f6"}, + {file = "aiohttp-3.11.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23397670f3739b6f3c4019da8226190f6cce5ab2008b664ed96a6d1f0fe7f069"}, + {file = "aiohttp-3.11.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc270fe480e7e425c45054543f58510fe649f70b77f514171909bbfe585105c0"}, + {file = "aiohttp-3.11.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84370ff70c1677ee0c4db40fe2baee6ffc72e9d32def3ff18739c1390c62329f"}, + {file = "aiohttp-3.11.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:379882ab6a40e6e0879ad8e84dca74ddbadff94af4f314b59b7da89c8463a669"}, + {file = "aiohttp-3.11.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74afb637cd06760afe0aa55a3ce82178ef4c950be65935add8f3809f701f36ca"}, + {file = "aiohttp-3.11.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:558de86eef9a886e43c6ae5b75cecdce81203da5832d19d11da8de417967d478"}, + {file = "aiohttp-3.11.15-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:41f82df6f0f895f0f843bc86762bea45b4d0fe876de49239ffc89d2365426399"}, + {file = "aiohttp-3.11.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:38368a32530dcdeccfa47544cf66724118d9cc8a889c057e116723ab62994380"}, + {file = "aiohttp-3.11.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:204f6695b47a7d130ddf6680158920825d0d32202a870e0bc56a2ec637935b1a"}, + {file = "aiohttp-3.11.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4b85486e8914d4e778343f5322834aada678eaf4c5315e50d41d9b74817ff97b"}, + {file = "aiohttp-3.11.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:79a08d675167c50f41d106d67bbcbc9e86e1b43d305c4b9f982d5c656a94a9ba"}, + {file = "aiohttp-3.11.15-cp39-cp39-win32.whl", hash = "sha256:20dda85988a4f506bf5a457b416b238e32ab944a2deb878ddf0af92df9254a9b"}, + {file = "aiohttp-3.11.15-cp39-cp39-win_amd64.whl", hash = "sha256:3cfd9f4aeaec4a75a0b4986a9977ac0a09b3d87ae83415e4b461e86715c80897"}, + {file = "aiohttp-3.11.15.tar.gz", hash = "sha256:b9b9a1e592ac8fcc4584baea240e41f77415e0de98932fdf19565aa3b6a02d0b"}, ] [package.dependencies] @@ -2741,104 +2741,104 @@ tests = ["pytest (>=4.6)"] [[package]] name = "multidict" -version = "6.2.0" +version = "6.3.0" description = "multidict implementation" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "multidict-6.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b9f6392d98c0bd70676ae41474e2eecf4c7150cb419237a41f8f96043fcb81d1"}, - {file = "multidict-6.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3501621d5e86f1a88521ea65d5cad0a0834c77b26f193747615b7c911e5422d2"}, - {file = "multidict-6.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32ed748ff9ac682eae7859790d3044b50e3076c7d80e17a44239683769ff485e"}, - {file = "multidict-6.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc826b9a8176e686b67aa60fd6c6a7047b0461cae5591ea1dc73d28f72332a8a"}, - {file = "multidict-6.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:214207dcc7a6221d9942f23797fe89144128a71c03632bf713d918db99bd36de"}, - {file = "multidict-6.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05fefbc3cddc4e36da209a5e49f1094bbece9a581faa7f3589201fd95df40e5d"}, - {file = "multidict-6.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e851e6363d0dbe515d8de81fd544a2c956fdec6f8a049739562286727d4a00c3"}, - {file = "multidict-6.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32c9b4878f48be3e75808ea7e499d6223b1eea6d54c487a66bc10a1871e3dc6a"}, - {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7243c5a6523c5cfeca76e063efa5f6a656d1d74c8b1fc64b2cd1e84e507f7e2a"}, - {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0e5a644e50ef9fb87878d4d57907f03a12410d2aa3b93b3acdf90a741df52c49"}, - {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0dc25a3293c50744796e87048de5e68996104d86d940bb24bc3ec31df281b191"}, - {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a49994481b99cd7dedde07f2e7e93b1d86c01c0fca1c32aded18f10695ae17eb"}, - {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:641cf2e3447c9ecff2f7aa6e9eee9eaa286ea65d57b014543a4911ff2799d08a"}, - {file = "multidict-6.2.0-cp310-cp310-win32.whl", hash = "sha256:0c383d28857f66f5aebe3e91d6cf498da73af75fbd51cedbe1adfb85e90c0460"}, - {file = "multidict-6.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:a33273a541f1e1a8219b2a4ed2de355848ecc0254264915b9290c8d2de1c74e1"}, - {file = "multidict-6.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84e87a7d75fa36839a3a432286d719975362d230c70ebfa0948549cc38bd5b46"}, - {file = "multidict-6.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8de4d42dffd5ced9117af2ce66ba8722402541a3aa98ffdf78dde92badb68932"}, - {file = "multidict-6.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7d91a230c7f8af86c904a5a992b8c064b66330544693fd6759c3d6162382ecf"}, - {file = "multidict-6.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f6cad071960ba1914fa231677d21b1b4a3acdcce463cee41ea30bc82e6040cf"}, - {file = "multidict-6.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f74f2fc51555f4b037ef278efc29a870d327053aba5cb7d86ae572426c7cccc"}, - {file = "multidict-6.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14ed9ed1bfedd72a877807c71113deac292bf485159a29025dfdc524c326f3e1"}, - {file = "multidict-6.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac3fcf9a2d369bd075b2c2965544036a27ccd277fc3c04f708338cc57533081"}, - {file = "multidict-6.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fc6af8e39f7496047c7876314f4317736eac82bf85b54c7c76cf1a6f8e35d98"}, - {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f8cb1329f42fadfb40d6211e5ff568d71ab49be36e759345f91c69d1033d633"}, - {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5389445f0173c197f4a3613713b5fb3f3879df1ded2a1a2e4bc4b5b9c5441b7e"}, - {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:94a7bb972178a8bfc4055db80c51efd24baefaced5e51c59b0d598a004e8305d"}, - {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da51d8928ad8b4244926fe862ba1795f0b6e68ed8c42cd2f822d435db9c2a8f4"}, - {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:063be88bd684782a0715641de853e1e58a2f25b76388538bd62d974777ce9bc2"}, - {file = "multidict-6.2.0-cp311-cp311-win32.whl", hash = "sha256:52b05e21ff05729fbea9bc20b3a791c3c11da61649ff64cce8257c82a020466d"}, - {file = "multidict-6.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1e2a2193d3aa5cbf5758f6d5680a52aa848e0cf611da324f71e5e48a9695cc86"}, - {file = "multidict-6.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:437c33561edb6eb504b5a30203daf81d4a9b727e167e78b0854d9a4e18e8950b"}, - {file = "multidict-6.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9f49585f4abadd2283034fc605961f40c638635bc60f5162276fec075f2e37a4"}, - {file = "multidict-6.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5dd7106d064d05896ce28c97da3f46caa442fe5a43bc26dfb258e90853b39b44"}, - {file = "multidict-6.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e25b11a0417475f093d0f0809a149aff3943c2c56da50fdf2c3c88d57fe3dfbd"}, - {file = "multidict-6.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac380cacdd3b183338ba63a144a34e9044520a6fb30c58aa14077157a033c13e"}, - {file = "multidict-6.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61d5541f27533f803a941d3a3f8a3d10ed48c12cf918f557efcbf3cd04ef265c"}, - {file = "multidict-6.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:facaf11f21f3a4c51b62931feb13310e6fe3475f85e20d9c9fdce0d2ea561b87"}, - {file = "multidict-6.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:095a2eabe8c43041d3e6c2cb8287a257b5f1801c2d6ebd1dd877424f1e89cf29"}, - {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0cc398350ef31167e03f3ca7c19313d4e40a662adcb98a88755e4e861170bdd"}, - {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7c611345bbe7cb44aabb877cb94b63e86f2d0db03e382667dbd037866d44b4f8"}, - {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8cd1a0644ccaf27e9d2f6d9c9474faabee21f0578fe85225cc5af9a61e1653df"}, - {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:89b3857652183b8206a891168af47bac10b970d275bba1f6ee46565a758c078d"}, - {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:125dd82b40f8c06d08d87b3510beaccb88afac94e9ed4a6f6c71362dc7dbb04b"}, - {file = "multidict-6.2.0-cp312-cp312-win32.whl", hash = "sha256:76b34c12b013d813e6cb325e6bd4f9c984db27758b16085926bbe7ceeaace626"}, - {file = "multidict-6.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:0b183a959fb88ad1be201de2c4bdf52fa8e46e6c185d76201286a97b6f5ee65c"}, - {file = "multidict-6.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5c5e7d2e300d5cb3b2693b6d60d3e8c8e7dd4ebe27cd17c9cb57020cac0acb80"}, - {file = "multidict-6.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:256d431fe4583c5f1e0f2e9c4d9c22f3a04ae96009b8cfa096da3a8723db0a16"}, - {file = "multidict-6.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a3c0ff89fe40a152e77b191b83282c9664357dce3004032d42e68c514ceff27e"}, - {file = "multidict-6.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7d48207926edbf8b16b336f779c557dd8f5a33035a85db9c4b0febb0706817"}, - {file = "multidict-6.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3c099d3899b14e1ce52262eb82a5f5cb92157bb5106bf627b618c090a0eadc"}, - {file = "multidict-6.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e16e7297f29a544f49340012d6fc08cf14de0ab361c9eb7529f6a57a30cbfda1"}, - {file = "multidict-6.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:042028348dc5a1f2be6c666437042a98a5d24cee50380f4c0902215e5ec41844"}, - {file = "multidict-6.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08549895e6a799bd551cf276f6e59820aa084f0f90665c0f03dd3a50db5d3c48"}, - {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ccfd74957ef53fa7380aaa1c961f523d582cd5e85a620880ffabd407f8202c0"}, - {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83b78c680d4b15d33042d330c2fa31813ca3974197bddb3836a5c635a5fd013f"}, - {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b4c153863dd6569f6511845922c53e39c8d61f6e81f228ad5443e690fca403de"}, - {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:98aa8325c7f47183b45588af9c434533196e241be0a4e4ae2190b06d17675c02"}, - {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9e658d1373c424457ddf6d55ec1db93c280b8579276bebd1f72f113072df8a5d"}, - {file = "multidict-6.2.0-cp313-cp313-win32.whl", hash = "sha256:3157126b028c074951839233647bd0e30df77ef1fedd801b48bdcad242a60f4e"}, - {file = "multidict-6.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:2e87f1926e91855ae61769ba3e3f7315120788c099677e0842e697b0bfb659f2"}, - {file = "multidict-6.2.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2529ddbdaa424b2c6c2eb668ea684dd6b75b839d0ad4b21aad60c168269478d7"}, - {file = "multidict-6.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:13551d0e2d7201f0959725a6a769b6f7b9019a168ed96006479c9ac33fe4096b"}, - {file = "multidict-6.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d1996ee1330e245cd3aeda0887b4409e3930524c27642b046e4fae88ffa66c5e"}, - {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c537da54ce4ff7c15e78ab1292e5799d0d43a2108e006578a57f531866f64025"}, - {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f249badb360b0b4d694307ad40f811f83df4da8cef7b68e429e4eea939e49dd"}, - {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48d39b1824b8d6ea7de878ef6226efbe0773f9c64333e1125e0efcfdd18a24c7"}, - {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b99aac6bb2c37db336fa03a39b40ed4ef2818bf2dfb9441458165ebe88b793af"}, - {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07bfa8bc649783e703263f783f73e27fef8cd37baaad4389816cf6a133141331"}, - {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b2c00ad31fbc2cbac85d7d0fcf90853b2ca2e69d825a2d3f3edb842ef1544a2c"}, - {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0d57a01a2a9fa00234aace434d8c131f0ac6e0ac6ef131eda5962d7e79edfb5b"}, - {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:abf5b17bc0cf626a8a497d89ac691308dbd825d2ac372aa990b1ca114e470151"}, - {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:f7716f7e7138252d88607228ce40be22660d6608d20fd365d596e7ca0738e019"}, - {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d5a36953389f35f0a4e88dc796048829a2f467c9197265504593f0e420571547"}, - {file = "multidict-6.2.0-cp313-cp313t-win32.whl", hash = "sha256:e653d36b1bf48fa78c7fcebb5fa679342e025121ace8c87ab05c1cefd33b34fc"}, - {file = "multidict-6.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ca23db5fb195b5ef4fd1f77ce26cadefdf13dba71dab14dadd29b34d457d7c44"}, - {file = "multidict-6.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b4f3d66dd0354b79761481fc15bdafaba0b9d9076f1f42cc9ce10d7fcbda205a"}, - {file = "multidict-6.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e2a2d6749e1ff2c9c76a72c6530d5baa601205b14e441e6d98011000f47a7ac"}, - {file = "multidict-6.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cca83a629f77402cfadd58352e394d79a61c8015f1694b83ab72237ec3941f88"}, - {file = "multidict-6.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:781b5dd1db18c9e9eacc419027b0acb5073bdec9de1675c0be25ceb10e2ad133"}, - {file = "multidict-6.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf8d370b2fea27fb300825ec3984334f7dd54a581bde6456799ba3776915a656"}, - {file = "multidict-6.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25bb96338512e2f46f615a2bb7c6012fe92a4a5ebd353e5020836a7e33120349"}, - {file = "multidict-6.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e2819b0b468174de25c0ceed766606a07cedeab132383f1e83b9a4e96ccb4f"}, - {file = "multidict-6.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6aed763b6a1b28c46c055692836879328f0b334a6d61572ee4113a5d0c859872"}, - {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a1133414b771619aa3c3000701c11b2e4624a7f492f12f256aedde97c28331a2"}, - {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:639556758c36093b35e2e368ca485dada6afc2bd6a1b1207d85ea6dfc3deab27"}, - {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:163f4604e76639f728d127293d24c3e208b445b463168af3d031b92b0998bb90"}, - {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2325105e16d434749e1be8022f942876a936f9bece4ec41ae244e3d7fae42aaf"}, - {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e4371591e621579cb6da8401e4ea405b33ff25a755874a3567c4075ca63d56e2"}, - {file = "multidict-6.2.0-cp39-cp39-win32.whl", hash = "sha256:d1175b0e0d6037fab207f05774a176d71210ebd40b1c51f480a04b65ec5c786d"}, - {file = "multidict-6.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad81012b24b88aad4c70b2cbc2dad84018783221b7f923e926f4690ff8569da3"}, - {file = "multidict-6.2.0-py3-none-any.whl", hash = "sha256:5d26547423e5e71dcc562c4acdc134b900640a39abd9066d7326a7cc2324c530"}, - {file = "multidict-6.2.0.tar.gz", hash = "sha256:0085b0afb2446e57050140240a8595846ed64d1cbd26cef936bfab3192c673b8"}, + {file = "multidict-6.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3bcb8cdfeb08cef0138d696e52ec08fffaf009ef4b1c7c5a40340af672bd9b60"}, + {file = "multidict-6.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67caf9435b1f0115042cbc37e9d60475891b2d9b2a711ade0876580da2a5e0df"}, + {file = "multidict-6.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:77e0406dc247851a1e250fdcfd46d13cdecc2ac5b8d1d038dea216da2e7fa9b7"}, + {file = "multidict-6.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6193564d51d02a4aa6fc60bb40f04b65840e70e124282a7337cd94a9ed1b0b81"}, + {file = "multidict-6.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72a1159144e4ad7d152b2c3f75bed8c9b60ad06e9da322e1965981f8371c0dee"}, + {file = "multidict-6.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb3269a3641b868ab7856c3cd939782ee1c802fa120b470b597286d2f9e93aee"}, + {file = "multidict-6.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79658460926a1c48b2ac10196a673cc7d81857dc268ca593a66fd661ed1b77ea"}, + {file = "multidict-6.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd289ef26241bc2c0b7b047417a33786790bf2a01f6c92d9688eb2693c9116df"}, + {file = "multidict-6.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a48fd39ba69f399f39b911885469bdfedd1de4a095146211e39e8b5db0e3a937"}, + {file = "multidict-6.3.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:478d29a270785fc58632c9d1e0f59f595d3fb06c5e63ac117136dba2d0e5f4f9"}, + {file = "multidict-6.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:31c68e103b253643cf9b4704f5d655997c116626b20ef3bb953992b7f447485d"}, + {file = "multidict-6.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:69983ee3e649e41dc41ddea68f6c2ab64d7f19fcab4e21a72a1accf6482c5605"}, + {file = "multidict-6.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5bd70d75b4bbfc0a26fdbfc72e260b70090637020b0d7d27eb26c7ae5edf16da"}, + {file = "multidict-6.3.0-cp310-cp310-win32.whl", hash = "sha256:82bd76a12588bd2bb27965aaf9fcff2258ffb03c9a290368288ed4571ed539ab"}, + {file = "multidict-6.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:430cb9ee0cf2d5a2fa91e78f306544352009dbda9ebb4bd04c5785e67fc04953"}, + {file = "multidict-6.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:904895323a59dd50387cddd1337c3eac48ec0fe6cb4d2e4106dc1a3b80091727"}, + {file = "multidict-6.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1aa6e1a605c602c119a22368f7d3b9dfb102a7cd69edae5a89e55da34fd64c2b"}, + {file = "multidict-6.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72574693fad34d075a54fa771984a1a8809a9eff880b731152078e81c7d8c80f"}, + {file = "multidict-6.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72d15a61b76fa4b814390c21defd772893d1152157e3297e6afb328ef32d1711"}, + {file = "multidict-6.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bf0d43f2c56b600c6895c25a420e4b46c6a5acf91d6c9a6300713496f70e63b"}, + {file = "multidict-6.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6be1182387fb9a95fd8a8cbfab2f2b61d61ea0ab4699780d4300ea207c8f8d71"}, + {file = "multidict-6.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ba7d12ff77cadb59519aba674cac3a0b16d0fc5abaa3ef79b5ff3806e52e991"}, + {file = "multidict-6.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eeca775446b00826ec8ca34eed8c902c6a1ae7dc42d78094b1f73ecd38d1dcf8"}, + {file = "multidict-6.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a1a5f50ccc57a317db68582411ce6aca076ee3bc386290b416a5783e807afa1"}, + {file = "multidict-6.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6989ea9326f9a9171edc920a459003b1deffc6cb48605b8f2610846c7fbd201a"}, + {file = "multidict-6.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9efe23b3d0671eeb8b1e70791612538dcdc1b39275563ca78f338aa0ce9619d2"}, + {file = "multidict-6.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:560af476d03256a65bd4ff05c83e7869ec3c2b40579d4ed1ac74075ef19e02bf"}, + {file = "multidict-6.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:091f3dfe63e9f48ae6c7da8d638e8d8e050ff11e348f69bafc20e65d11f7aa48"}, + {file = "multidict-6.3.0-cp311-cp311-win32.whl", hash = "sha256:38e60e400e07ba678a755cc89b09955a49acb0188d47aee2829ed4efc1ccb053"}, + {file = "multidict-6.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:65e763769cec2fa9c79b70555e3f2a7903747d127ab14ec9eaa5f00763bb4152"}, + {file = "multidict-6.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2a83896925e3a2ddec736c48255572e6f15a95339024c02b800dab28e63461a3"}, + {file = "multidict-6.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74e45386528db2d9346618276e8746507ec6ccb91512c5f02d2049ccafb0576e"}, + {file = "multidict-6.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc15e81587b652bbeba9d4d7d3707bcaaa1d7b4aab2024c14be477662003a211"}, + {file = "multidict-6.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a716344c6e92551bdf842b999c7d7b34a13e32facf3e6c5942690c9883d45e3a"}, + {file = "multidict-6.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:299070f503a9a99e4af38d07da784ced28377cc62b678084b9e2e48fa51c57d3"}, + {file = "multidict-6.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e87a8635a7db577617b50bd2f2080744ed20e556750b97e4f9988e6d20d3941"}, + {file = "multidict-6.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ab4ea5f49166b990411c522c1f5f901014932ead15a463616ec93e10fff2c05"}, + {file = "multidict-6.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2cef02d3878804909283549bc10d4789a14c610fcd286f17cd94a195b21fe469"}, + {file = "multidict-6.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a466c14574152b7caed5d76f1e46ae2963d33f5b0eb2dd915fa33870183b0f26"}, + {file = "multidict-6.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:883c07b404229e98d30b1ef64f07d4e3422d431ecd727c2ebba8549f70b2ba16"}, + {file = "multidict-6.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:767ed12b1662fac32d84eb43707e4f778b12554fc12ce3c8f7793a02111a9e32"}, + {file = "multidict-6.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ef116022119d3053ecce8ba62109c8b54a650a537b183e79de1db4078894a8"}, + {file = "multidict-6.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ad737617d38c55c0b72cd3ea01bf5cbab0d75123de5e52c39643ddc6465cb5f"}, + {file = "multidict-6.3.0-cp312-cp312-win32.whl", hash = "sha256:3d783be54d076843f58bf061fdaf1071789fb924fb35a0eb84dbc2c8b68499a2"}, + {file = "multidict-6.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:6fbe184451480c17f1f8dac160c9f3f6d243010fdb8416de4d3d7ee69ea65aa4"}, + {file = "multidict-6.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90c3c60985e7da13e44aeaaf2e1c10fe1b7825788a18c82b0f9eaeb6c4e9d9c6"}, + {file = "multidict-6.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:80935f26af0eec490c4e52381a28f39b08c2bc4ef4562448890027e4a4cfa3a4"}, + {file = "multidict-6.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e18db3b38ac30d8cc1ddbdfc7f6d3d814c1abb8936c57bd1c09c5da02873c8c4"}, + {file = "multidict-6.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8836280abc310ea6260dac93126645d21284885008c317c2ac4281a90f1398"}, + {file = "multidict-6.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5737f40ffb1926b8bf38d32fdac48a27c441b757f1bf44cbaa100dafef049a01"}, + {file = "multidict-6.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6df1b707adab4858dfaa74877f60f07d9d6be01a57015cf4e62aa8f00f3576b"}, + {file = "multidict-6.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:162af9c2e0743465a47e2b32d9b0a7c260b7843629b5e6f0a8a92819b5a40d27"}, + {file = "multidict-6.3.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc4e82c5db4e65703c842b0947699dd958a7262a8b854d1c19bbfe2d27be9333"}, + {file = "multidict-6.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5a922601cb94f427dd96eec3a7c776537ce7490f2beb69e88a81859e537343e4"}, + {file = "multidict-6.3.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3da30fb560b37cede31306b890c982213a23fa7335d368cdc16cf7034170860b"}, + {file = "multidict-6.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5a1996d963016e6486b6a672f64f868e6b4e7e9e2caf710994df11b04790903e"}, + {file = "multidict-6.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9584441b7a603a12aa382adf8c093ddc5a22328a108dabc6a4a112fa5b4facae"}, + {file = "multidict-6.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71a8ce430f6c341725aefc0031626c484e0858fd95d1bf3625e0d27919d8edca"}, + {file = "multidict-6.3.0-cp313-cp313-win32.whl", hash = "sha256:b7d3053742a9a559dda8598a52e0c1bcbd18258cc199cba52137ce8c8e92c537"}, + {file = "multidict-6.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:6b7e30e4246c2cd5e6c2c907486d235e4f3e8a39979744e9e0b8090629c62da4"}, + {file = "multidict-6.3.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be034aa2841c57ea43a55bc123d8f3f41cc2d3d102a22390c863791ba6bf23f1"}, + {file = "multidict-6.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:168a02178b7e980899f3475ff008436eaab035d50e39cb8f7de641bbe9bbc3a6"}, + {file = "multidict-6.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c4a6ec469c30f4162745d6485b778432c497032b8a2cb3a0332eea9d3b6aef6"}, + {file = "multidict-6.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b293804f4b53be6297bc2afdeaf15aff76c1b6be69f3a3da785143eebdfb656"}, + {file = "multidict-6.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5eb2a8415a891564054447a327a7ef7ec90e69e0e63d85d1ffb03f82e102c740"}, + {file = "multidict-6.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db61c6ae9ee7268dc69a078ea22deaaf861350ad2e4c194c70798b8ec9789131"}, + {file = "multidict-6.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88548dec2f6f69e547252fe3113bf1b3b08c0879f5b44633927be07ed18c5cc0"}, + {file = "multidict-6.3.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:864684b36e0488715aac531785abe7514e872bfe83ecc768828e9ddaadeed320"}, + {file = "multidict-6.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:71d92e846541669ae1d11e00906c408c1dc9890196e13f11d4d62bd235ac9ddb"}, + {file = "multidict-6.3.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c5223ab45639ce93c7233d518f6c3199422b49dbd0ebfb1d7917b5da2636712e"}, + {file = "multidict-6.3.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:56225de73d69f5ee6b783648eb1936e1bbe874a529cb1e15d64038904c54efb2"}, + {file = "multidict-6.3.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:66c108d8e02da2febb0aa7d7002e14c4a0571460993c9edf8249393cdae7eeef"}, + {file = "multidict-6.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b95d96a0640decaa24cd9cf386fd4d8a96c973aafa42dd9c65609f9f0d66cc34"}, + {file = "multidict-6.3.0-cp313-cp313t-win32.whl", hash = "sha256:6b25953a1d6a97746becbd663b49e3b436a5001c995a62662d65835a2ba996a7"}, + {file = "multidict-6.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d9c2b1ca98e5454b78cd434f29fc33eb8f8a2f343efc5f975225d92070b9f7f6"}, + {file = "multidict-6.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7594756e9607e5ffbc16c7f3b1715c0f7224a82ac389f0087fa5faaa65fb96e2"}, + {file = "multidict-6.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ae6ea8e610143348199c1db9fea5392f6b11a0e37ac8e8e7cae9c408625c5d0"}, + {file = "multidict-6.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:257bd1540b7c32982b17e86f024985b9c591da8542a3fb350ed7dad42d725998"}, + {file = "multidict-6.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43ad68da1385738a1e96a188029f092e88381352e697a0687784191c1d45845b"}, + {file = "multidict-6.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e31697466812ff1cdabd7a9db7fb7f37d319e58e4c8a2ce1065012c1a5cfebde"}, + {file = "multidict-6.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e0db6ea39ac96ae2ccc582291633ee55ae93c9cc6dca1f7ab4dd9f0b7e08f8a"}, + {file = "multidict-6.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ac6ea86ac161198653dba8f0af047d7b718318ba6d6bf4c719bc288ac21017b"}, + {file = "multidict-6.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:150cc33d5d972c1bd7b0e5c446cccfa4dc6b8e185ef54dab3327db101149f797"}, + {file = "multidict-6.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2264957a0e0fb92d8d538a27738178c48628c65ef0ec6b068d64d2e5d11cc00d"}, + {file = "multidict-6.3.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6befa3c621caf26f5affc6121bf863b8f049f862a7a10aabb0d19cce34c6e363"}, + {file = "multidict-6.3.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:7074f10bf324e4d38208e1bcc2b6abd87901675b1a567507035ff1e7403378c0"}, + {file = "multidict-6.3.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fa476e5f763f59270bda050695e22078b2461dc14bc62a0d27756c5906bca86c"}, + {file = "multidict-6.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4c3da8aa4b28f83382f0dee288d030eb0fa212df9632dc2fe4e4fc2a8e2577a4"}, + {file = "multidict-6.3.0-cp39-cp39-win32.whl", hash = "sha256:02a239ad4e35d3c033e701bc8b7beb05013fc6617b13948497cf50e9e9c12f7f"}, + {file = "multidict-6.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:8895999e0de5ddddddd146bb1bfc0316af808580637fea158873b84785f7a9e9"}, + {file = "multidict-6.3.0-py3-none-any.whl", hash = "sha256:9ca652d9c6f68535537d75502b549ed0ca07fa6d3908f84f29f92148ec7310f2"}, + {file = "multidict-6.3.0.tar.gz", hash = "sha256:2cf3e0781febf9f093eff3eca2d6dd7954ef2969ff46f6cd95173a4db8397fd8"}, ] [package.dependencies] @@ -3414,8 +3414,8 @@ files = [ numpy = [ {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, - {version = ">=1.23.5", markers = "python_version == \"3.11\""}, ] [[package]] @@ -3500,8 +3500,8 @@ files = [ [package.dependencies] numpy = [ {version = ">=1.22.4", markers = "python_version < \"3.11\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -4415,6 +4415,21 @@ tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "pytest-dependency" +version = "0.6.0" +description = "Manage dependencies of tests" +optional = false +python-versions = ">=3.4" +groups = ["dev"] +files = [ + {file = "pytest-dependency-0.6.0.tar.gz", hash = "sha256:934b0e6a39d95995062c193f7eaeed8a8ffa06ff1bcef4b62b0dc74a708bacc1"}, +] + +[package.dependencies] +pytest = ">=3.7.0" +setuptools = "*" + [[package]] name = "pytest-xdist" version = "3.6.1" @@ -5459,7 +5474,7 @@ version = "78.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8"}, {file = "setuptools-78.1.0.tar.gz", hash = "sha256:18fd474d4a82a5f83dac888df697af65afa82dec7323d09c3e37d1f14288da54"}, @@ -6365,14 +6380,14 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.29.3" +version = "20.30.0" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "virtualenv-20.29.3-py3-none-any.whl", hash = "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170"}, - {file = "virtualenv-20.29.3.tar.gz", hash = "sha256:95e39403fcf3940ac45bc717597dba16110b74506131845d9b687d5e73d947ac"}, + {file = "virtualenv-20.30.0-py3-none-any.whl", hash = "sha256:e34302959180fca3af42d1800df014b35019490b119eba981af27f2fa486e5d6"}, + {file = "virtualenv-20.30.0.tar.gz", hash = "sha256:800863162bcaa5450a6e4d721049730e7f2dae07720e0902b0e4040bd6f9ada8"}, ] [package.dependencies] @@ -6382,7 +6397,7 @@ platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] [[package]] name = "wcwidth" @@ -6789,4 +6804,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = "^3.10" -content-hash = "31ead2096e0bbaaecc07dfb6c470d9e3562f4b906661d5d1b6c546daee068335" +content-hash = "fe9dd6c614b235a282ccc44849163ffb15ef4644218848654805c2d96d9b8df5" diff --git a/pyproject.toml b/pyproject.toml index 4cc1be6d..f9eea262 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,6 +46,7 @@ beautifulsoup4 = "^4.12.3" [tool.poetry.group.dev.dependencies] black = {extras = ["jupyter"], version = "^24.4.2"} pytest = "^7.2.2" +pytest-dependency = ">=0.6.0,<1" pre-commit = "^3.7.1" mypy = "^1.10.1" isort = "^5.10.1" diff --git a/tests/data/doclaynet_v1_doctags_sample/132a855ee8b23533d8ae69af0049c038171a06ddfcac892c3c6d7e6b4091c642.dt b/tests/data/doclaynet_v1_doctags_sample/132a855ee8b23533d8ae69af0049c038171a06ddfcac892c3c6d7e6b4091c642.dt new file mode 100644 index 00000000..399df58b --- /dev/null +++ b/tests/data/doclaynet_v1_doctags_sample/132a855ee8b23533d8ae69af0049c038171a06ddfcac892c3c6d7e6b4091c642.dt @@ -0,0 +1,9 @@ + 8 +Leigh Taliaferro, M.D. General Surgeon Abilene, Texas +Leigh Taliaferro, M.D., values consistency. +The Abilene native started his practice 17 years ago and has developed a flourishing business as a general surgeon. He estimates that 90 percent of his practice is for abdominal surgery. With such a busy practice, he finds comfort in having a reliable banking partner. "I have almost every type of business, trust and personal account with First National Bank of Abilene," says Dr. Taliaferro. +"First National is immersed in this city - everywhere you go, they are involved with helping people with their business. It's because of the people who work there - they are leaders ... generous people who make their mark on the bank and on the community. While they may be the biggest bank in town, they sure don't act like it. It's like banking with friends." +Dr. Taliaferro has invested in First Financial Bankshares for more than a decade. "My stock has done nothing but go up in value. They are solid, sound businesspeople. I sleep up well at night knowing that my investments are in good hands." + +"While they may be the biggest bank in town, they sure don't act like it. It's like banking with friends. + \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/2b49edc9d0a47e4efaaeabf907a8b8b84b747c295dd10a639e2b5265ac258cf5.dt b/tests/data/doclaynet_v1_doctags_sample/2b49edc9d0a47e4efaaeabf907a8b8b84b747c295dd10a639e2b5265ac258cf5.dt new file mode 100644 index 00000000..26fdebed --- /dev/null +++ b/tests/data/doclaynet_v1_doctags_sample/2b49edc9d0a47e4efaaeabf907a8b8b84b747c295dd10a639e2b5265ac258cf5.dt @@ -0,0 +1,10 @@ + 82 +Nissan Annual Report 2004 +The Company and its domestic consolidated subsidiaries have defined benefit plans, i.e., welfare pension fund plans ('WPPF'), tax-qualified pension plans and lump-sum payment plans, covering substantially all employees who are entitled to lump-sum or annuity payments, the amounts of which are determined by reference to their basic rates of pay, length of service, and the conditions under which termination occurs. Certain foreign consolidated subsidiaries have defined benefit and contribution plans. +The following table sets forth the funded and accrued status of the plans, and the amounts recognized in the consolidated balance sheets as of March 31, 2005 and 2004 for the Company's and the consolidated subsidiaries' defined benefit plans: +Millions of yen2004 Mar. 31, 20052003 Mar. 31, 2004Retirement benefit obligation:As of20042003Plan assets at fair value(%,121,260)(%,141,048)(%)Unfunded retirement benefit obligation:(716,445)(664,314)(6,695,748)Unrecognized net retirement benefit obligation at transition120,718131,6661,128,206Unrecognized actuarial gain or loss154,689152,8671,445,691Unrecognized prior service cost:(66,720)(61,833)(62,355)Net retirement benefit obligation(507,758)(441,614)(4,745,402)Prepaid pension cost:4456524,159Accrued retirement benefits:(508,203)(442,266)(4,749,561) +The substitutional portion of the benefits under the WPPF has been included in the amounts shown in the above table. +The Company received the approval from the Minister of Health, Labor and Welfare ('MLHW') in the year ended March 31, 2003 with respect to its application for exemption from the obligation for benefits related to future employee services under the substitutional portion of the WPPF. Certain domestic consolidated subsidiaries received the same approval from MLHW during the year ended March 31, 2004. In accordance with the transitional provision stipulated in "Practical Guidelines for Accounting for Retirement Benefits", the Company and the domestic consolidated subsidiaries accounted for the separation of the substitutional portion of the benefit obligation from the corporate portion of the benefit obligation under their WPPFs as of the dates of approval for their exemption assuming that the transfer to the Japanese government of the substitutional portion of the benefit obligation and related pension plan assets has been completed as of those dates. As a result, the Company recognized a loss of $3,945,945 million for the year ended March 31, 2003 and the domestic consolidated subsidiaries recognized an aggregate gain of $3,669 million and an aggregate loss of $1,587 million for the year ended March 31, 2004. The pension assets to be transferred were calculated at $3,757,770 million for the domestic consolidated subsidiaries at March 31, 2004 and $241,203 million for the Company at March 31, 2003. +The components of retirement benefit expenses for the years ended March 31, 2005, 2004 and 2003 are outlined as follows: +Millions of yen2004 Mar. 31, 20052002 Mar. 31, 2004Thousands of U.S. dollarsService cost:For the years ended200420022004Interest costMar. 31, 200351,54351,54351,543Expected return on plan assets:33,28833,01245,269311,013Amortization of net retirement benefit obligation at transition:(17,999)(15,523)(26,708)(168,215)Amortization of actuarial gain or loss:12,00918,69624,280112,234Amortization of prior service cost:1,29,2891,86,198114,644114,934Other(5,431)(7,049)(7,762)(50,757)Retirement benefit expenses:1795751,673(Gain) loss on return of the substitutional portion of welfare pension fund plans82,14691,77398,091767,720Total:(1,107)(5,594)30,945(10,346)$^{#}$81,039$^{#}$86,179$^{#}$129,036$^{#}$757,374$^{#}$757,374 + \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/61d269cb1f2c976191469b891aa87b7cb40eb65eee4483725c1a85c4dc72d141.dt b/tests/data/doclaynet_v1_doctags_sample/61d269cb1f2c976191469b891aa87b7cb40eb65eee4483725c1a85c4dc72d141.dt new file mode 100644 index 00000000..fe2beae5 --- /dev/null +++ b/tests/data/doclaynet_v1_doctags_sample/61d269cb1f2c976191469b891aa87b7cb40eb65eee4483725c1a85c4dc72d141.dt @@ -0,0 +1,18 @@ + Linking consumers with any time, any place mobile banking +In today's increasingly wireless world, consumers are turning in record numbers to mobile devices for greater convenience and access to banking and information services. + +with the freedom of mobile devices, bank customers can instantly obtain account balances, transfer money and even view a mini-bank statement-or set up instant alerts to monitor their daily account balances, deposit notifications and other personalized information 24 hours a day, 7 days a week. +The exciting potential of wireless is creating unprecedented opportunities for banks to connect with their customers. In Western Europe, the number of mobile banking accounts is expected to reach 31.8 million by 2004. 1 Expanding wireless capabilities are also helping to drive growth in North America, where the number of wireless financial services users is projected to skyrocket to 35 million by 2005. 2 The Asia-Pacific region is forecast at 12 million subscribers of wireless financial services alone in 2003. 3 +The quickly evolving market for mobile banking represents a tremendous opportunity for Euronet Worldwide. Last spring we introduced Euronet ® Mobile Banking as the first financial application that offered both secure account access and a personalized accounting alerting system. Among our new mobile banking clients in 2000 were the Bank of Cyprus, for its branches in London and Greece, and the National Bank of Kuwait, for its Lebanon branch, who were both first to market in their regions. +To further strengthen our capabilities, we announced strategic alliances to market and deliver Euronet's suite of mobile banking solutions with Aether Systems, Inc. for the US market and with Sia Communications for the European, Middle Eastern and Asian markets. In addition, we formed similar regional strategic alliances with companies like Stet Hellas Telecommunications S.A., a Greek mobile operator and subsidiary of Telecom Italia Mobile (TIM). +As next-generation mobile technology brings higher data speeds, personalization and other enhancements, we believe the future of mobile banking presents great opportunities for Euronet. +$^{1}$International Data Corporation (September 2000), $^{2}$TowerGroup (September 2000), $^{3}$Meridien Research (August 1999) + + +National Bank of Kuwait-Lebanon +First-to-Market Mobile Banking +To broaden its customer and account base, the National Bank of Kuwait-Lebanon +(NBK-L) wanted to be first in their market with a mobile banking solution. In a tight race with a competing bank, Euronet's mobile solution was integrated quickly into the NBK-LS IT infrastructure, enabling the bank to be the first to deliver services in its market. +Together with GSM operator Libancell, NBK-LS new mobile banking system offers customers any time, any place access to their account information from their GSM telephones. +11 + \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/a5acc4c1c47a19543362fccf014eec02c7efd931db5e2a34e66444ee8b8e5079.dt b/tests/data/doclaynet_v1_doctags_sample/a5acc4c1c47a19543362fccf014eec02c7efd931db5e2a34e66444ee8b8e5079.dt new file mode 100644 index 00000000..10fda7ef --- /dev/null +++ b/tests/data/doclaynet_v1_doctags_sample/a5acc4c1c47a19543362fccf014eec02c7efd931db5e2a34e66444ee8b8e5079.dt @@ -0,0 +1,14 @@ + HON INDUSTRIES Inc. and SUBSIDIARIES +Income Taxes +Significant components of the provision for income taxes are as follows: +(In thousands)200320022001Current:$ 49,721$ 38,966$ 32,393Federal4,1593,4732,442State53,88042,43934,835Deferred(1,054)6,7557,019$ 52,826$ 49,194$ 41,854-A reconciliation of the statutory federal income tax rate to the Company's effective income tax rate is as follows: +200320022001Federal statutory tax rate35.0%35.0%State taxes, net of federal tax effect1.81.6Credit for increasing research activities(2.0)(1.6)Extraterritorial income exclusion(0.5)(1.0)Other - net0.71.0Effective tax rate35.0%35.0%Shareholders' Equity and Earnings Per Share +Deferred income taxes reflect the net tax effects of temporary differences between the carrying amounts of assets and liabilities for financial reporting purposes and the amounts used for income tax purposes. Significant components of the Company's deferred tax liabilities and assets are as follows: +(In thousands)200320022001Net long-term deferred tax liabilities:$ (28,103)$ (34,398)$ (38,759)Tax over book depreciation1823,5813,197OPEB obligations4,9123,8212,519Compensation Goodwill(18,044)(14,173)(5,550)Other - net3,3204,055(1,039)Total net long-term deferred tax liabilities(37,733)(37,114)(39,632)Net current deferred tax assets:(2981,5171,119liability accruals4,7544,6174,002Vacation accrual-(3,766)(3,766)Integration accruals4,3435,1011,969Inventory differences5288213,302Deferred income Warranty accruals(5,462)(3,820)-Other - net2,8862,3691,606Total net current deferred tax assets6,982(504)6,708Net deferred tax14,32910,10114,940(liabilities) assets$ (23,404)$ (27,013)$ (24,692)The Company purchased 762,300; 614,580; and 1,472,937 shares of its common stock during 2003, 2002, and 2001, respectively. The par value method of accounting is used for common stock repurchases. The excess of the cost of shares acquired over their par value is allocated to Additional Paid-In Capital, with the excess charged to Retained Earnings. +Common Stock, $1 Par Value200320022001Authorized200,000,000200,000,000200,000,000Issued and outstanding58,238,51958,373,60758,672,933Preferred Stock, $1 Par Value2,000,0002,000,0002,000,000Authorized---Issued and outstanding--- +Numerators:20032002Numerators for both basic and diluted EPS net income$ 98,105,000$ 91,360,000Denominators:Denominator for basic EPS weighted-58,178,73958,789,851Potentially dilutive shares from stock option plans366,614231,220231,220Denominator for diluted EPS$ 58,455,35359,021,07159,021,071Earnings per share - basic$ 1.69$ 1.551.55Earnings per share - diluted$ 1.68$ 1.55 +Certain exercisable and nonexercisable stock options were not included in the computation of diluted EPS for fiscal year 2003 and 2002, because the option prices were greater that the average market prices for the applicable periods. The number of stock options outstanding which met this criterion for 2003 was 20,000, with a range of per share exercise prices of $42.49-$42.98; and for 2002 was 30,000, with a range of per share exercise prices of $28.25-$23.22. +Components of other comprehensive income (loss) consist of the following: +(In thousands)200320022001Foreign currency translation adjustments - net of tax$ 45$ -$ 109Change in unrealized gains (losses) on marketable securities - net of tax(690)(322)42Other comprehensive income (loss)$ (645)$ (322)$ 151 +49 + \ No newline at end of file diff --git a/tests/data/doclaynet_v1_doctags_sample/b13563b6fd80bed51928fc4b42497c8236af331fd67bd13b7f7e506d42b4a7e2.dt b/tests/data/doclaynet_v1_doctags_sample/b13563b6fd80bed51928fc4b42497c8236af331fd67bd13b7f7e506d42b4a7e2.dt new file mode 100644 index 00000000..568068aa --- /dev/null +++ b/tests/data/doclaynet_v1_doctags_sample/b13563b6fd80bed51928fc4b42497c8236af331fd67bd13b7f7e506d42b4a7e2.dt @@ -0,0 +1,17 @@ + REPORT OF INDEPENDENT CERTIFIED PUBLIC ACCOUNTANT S +To the Stockholders and the Board of Directors of Atrion Corporation: +We have audited the accompanying consolidated balance sheets of Atrion Corporation (a Delaware corporation) and Subsidiaries as of December 31, 2003 and 2002, and the related consolidated statements of income, changes in stockholders' equity and cash flows for the years then ended. These financial statements are the responsibility of the Company's management. Our responsibility is to express an opinion on these financial statements based on our audit. The financial statements of Atrion Corporation and Subsidiaries as of and for the year in the period ended December 31, 2001, were audited by other auditors who have ceased operations. Those auditors expressed an unqualified opinion on those financial statements in their report dated February 25, 2002. +We conducted our audits in accordance with auditing standards generally accepted in the United States of America. Those standards require that we plan and perform the audit to obtain reasonable assurance about whether the financial statements are free of material misstatement. An audit includes examining, on a test basis, evidence supporting the amounts and disclosures in the financial statements. An audit also includes assessing the accounting principles used and significant estimates made by management as well as evaluating the overall financial statement presentation. We believe that our audits provide a reasonable basis for our opinion. +In our opinion, the financial statements referred to above present fairly, in all material respects, the consolidated financial position of Atrion Corporation and Subsidiaries as of December 31, 2003 and 2002, and the consolidated results of their operations and their consolidated cash flows for the years then ended in conformity with accounting principles generally accepted in the United States of America. +As discussed above, the financial statements of Atrion Corporation and Subsidiaries as of December 31, 2001, and for the year then ended were audited by other auditors who have ceased operations. As described in Note 2, these financial statements have been revised to include the transitional disclosures required by Statement of Financial Accounting Standards No. 142, Goodwill and Other Intangible Assets, which was adopted by the Company as of January 1, 2002. Our audit procedures with respect to the disclosures in Note 2 with respect to 2001 included agreeing the previously reported net income to the previously issued financial statements and the adjustments to reported net income representing amortization expense (including any related tax effects) recognized in those periods related to goodwill to the Company's underlying records obtained from management. We also tested the mathematical accuracy of the reconciliation of adjusted net income to reported net income, and the related income-per-share amounts. In our opinion, the disclosures for 2001 in Note 2 are appropriate. However, we were not engaged to audit, review, or apply any procedures to the 2001 financial statements of the Company other than with respect to such disclosures and, accordingly, we do not express an opinion or any other form of assurance on the 2001 financial statements taken as a whole. + +Grant Thornton LLP Dallas, Texas February 13, 2004 +This is a copy of the audit report previously issued by Arthur Andersen LLP in connection with Atrion Corporation and Subsidiaries Annual Report for the year ended December 31, 2001. This audit report has not been issued by Arthur Andersen LLP in connection with this Annual Report. The consolidated balance sheets as of December 31, 2001 and 2000 and the consolidated statements of income and cash flows for the years ended December 31, 2000 and 1999 referred to in this report have not been included in the accompanying financial statements. +To the Stockholders and the Board of Directors of Atrion Corporation: +We have audited the accompanying consolidated balance sheets of Atrion Corporation (a Delaware corporation) and subsidiaries as of December 31, 2001 and 2000 and the related consolidated statements of income and cash flows for each of the three years in the period ended December 31, 2001. These financial statements are the responsibility of the Company's management. Our responsibility is to express an opinion on these financial statements based on our audits. +We conducted our audits in accordance with auditing standards generally accepted in the United States. Those standards require that we plan and perform the audit to obtain reasonable assurance about whether the financial statements are free of material misstatement. An audit includes examining, on a test basis, evidence supporting the amounts and disclosures in the financial statements. An audit also includes assessing the accounting principles used and significant estimates made by management as well as evaluating the overall financial statement presentation. We believe that our audits provide a reasonable basis for our opinion. +In our opinion, the financial statements referred to above present fairly, in all material respects, the financial position of Atrion Corporation and subsidiaries as of December 31, 2001 and 2000 and the results of their operations and their cash flows for each of the three years in the period ended December 31, 2001 in conformity with accounting principles generally accepted in the United States. + +Arthur Andersen LLP Atlanta, Georgia February 25, 2002 +23 + \ No newline at end of file From f165e79baed057c54558b7347506f9e23faa4233 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 09:40:02 +0200 Subject: [PATCH 68/81] Allow pytest output on CI Signed-off-by: Christoph Auer --- .github/workflows/checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 91908cd4..26f883ff 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -23,7 +23,7 @@ jobs: run: poetry install --all-extras - name: Testing run: | - poetry run pytest -vv tests + poetry run pytest -s -vv tests - name: Run examples run: | # for file in docs/examples/*.py; do From 79cb068b1de86a405ecbff5b1202703192df20c9 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 10:10:24 +0200 Subject: [PATCH 69/81] Disable tests in CI Signed-off-by: Christoph Auer --- .github/workflows/checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 26f883ff..fc09c966 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -23,7 +23,7 @@ jobs: run: poetry install --all-extras - name: Testing run: | - poetry run pytest -s -vv tests + # poetry run pytest -s -vv tests - name: Run examples run: | # for file in docs/examples/*.py; do From 153e5b9ad8bbb1e13fe0757f331b098c676772fe Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 10:47:40 +0200 Subject: [PATCH 70/81] Reenable tests in CI Signed-off-by: Christoph Auer --- .github/workflows/checks.yml | 5 +- .../dataset_builders/doclaynet_v1_builder.py | 2 +- tests/test_dataset_builder.py | 50 +++++++++++++++---- tests/test_layout_evaluator.py | 4 +- tests/test_markdown_text_evaluator.py | 4 +- tests/test_readingorder_evaluator.py | 4 +- tests/test_table_evaluator.py | 4 +- 7 files changed, 53 insertions(+), 20 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index fc09c966..bbfe366c 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -1,6 +1,9 @@ on: workflow_call: +env: + RUN_IN_CI: "1" + jobs: run-checks: runs-on: ubuntu-latest @@ -23,7 +26,7 @@ jobs: run: poetry install --all-extras - name: Testing run: | - # poetry run pytest -s -vv tests + poetry run pytest -s -vv tests - name: Run examples run: | # for file in docs/examples/*.py; do diff --git a/docling_eval/dataset_builders/doclaynet_v1_builder.py b/docling_eval/dataset_builders/doclaynet_v1_builder.py index cc8f0fd7..4fe616f0 100644 --- a/docling_eval/dataset_builders/doclaynet_v1_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v1_builder.py @@ -288,7 +288,7 @@ def iterate(self) -> Iterable[DatasetRecord]: if self.dataset_local_path is not None: path = str(self.dataset_local_path) # Load dataset from the retrieved path - ds = load_dataset(path, split=self.split) + ds = load_dataset(path, split=self.split, streaming=True) # Apply HuggingFace's select method for index ranges total_ds_len = len(ds) diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index d27c26ba..cd37ceb6 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -1,3 +1,4 @@ +import os from pathlib import Path from typing import List, Optional @@ -39,6 +40,8 @@ ocr_factory = get_ocr_factory() +IS_CI = os.getenv("RUN_IN_CI") == "1" + def create_docling_prediction_provider( page_image_scale: float = 2.0, @@ -89,21 +92,21 @@ def test_run_dpbench_e2e(): docling_provider.create_prediction_dataset( name=dataset_layout.name, gt_dataset_dir=target_path / "gt_dataset", - target_dataset_dir=target_path / "eval_dataset", + target_dataset_dir=target_path / "eval_dataset_e2e", ) ## Evaluate Layout evaluate( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "eval_dataset", + idir=target_path / "eval_dataset_e2e", odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) visualize( modality=EvaluationModality.LAYOUT, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "eval_dataset", + idir=target_path / "eval_dataset_e2e", odir=target_path / "evaluations" / EvaluationModality.LAYOUT.value, ) @@ -111,14 +114,14 @@ def test_run_dpbench_e2e(): evaluate( modality=EvaluationModality.READING_ORDER, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "eval_dataset", + idir=target_path / "eval_dataset_e2e", odir=target_path / "evaluations" / EvaluationModality.READING_ORDER.value, ) visualize( modality=EvaluationModality.READING_ORDER, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "eval_dataset", + idir=target_path / "eval_dataset_e2e", odir=target_path / "evaluations" / EvaluationModality.READING_ORDER.value, ) @@ -126,18 +129,21 @@ def test_run_dpbench_e2e(): evaluate( modality=EvaluationModality.MARKDOWN_TEXT, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "eval_dataset", + idir=target_path / "eval_dataset_e2e", odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, ) visualize( modality=EvaluationModality.MARKDOWN_TEXT, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "eval_dataset", + idir=target_path / "eval_dataset_e2e", odir=target_path / "evaluations" / EvaluationModality.MARKDOWN_TEXT.value, ) +@pytest.mark.skipif( + IS_CI, reason="Skipping test in CI because the dataset is too heavy." +) def test_run_doclaynet_with_doctags_fileprovider(): target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV1.value}-SmolDocling/") file_provider = FilePredictionProvider( @@ -193,6 +199,9 @@ def test_run_doclaynet_with_doctags_fileprovider(): ) +@pytest.mark.skipif( + IS_CI, reason="Skipping test in CI because the dataset is too heavy." +) def test_run_omnidocbench_e2e(): target_path = Path(f"./scratch/{BenchMarkNames.OMNIDOCBENCH.value}/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) @@ -272,24 +281,27 @@ def test_run_dpbench_tables(): tableformer_provider.create_prediction_dataset( name=dataset_tables.name, gt_dataset_dir=target_path / "gt_dataset", - target_dataset_dir=target_path / "eval_dataset", + target_dataset_dir=target_path / "eval_dataset_tables", ) evaluate( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "eval_dataset", + idir=target_path / "eval_dataset_tables", odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) visualize( modality=EvaluationModality.TABLE_STRUCTURE, benchmark=BenchMarkNames.DPBENCH, - idir=target_path / "eval_dataset", + idir=target_path / "eval_dataset_tables", odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, ) +@pytest.mark.skipif( + IS_CI, reason="Skipping test in CI because the dataset is too heavy." +) def test_run_omnidocbench_tables(): target_path = Path(f"./scratch/{BenchMarkNames.OMNIDOCBENCH.value}/") tableformer_provider = TableFormerPredictionProvider() @@ -323,6 +335,9 @@ def test_run_omnidocbench_tables(): ) +@pytest.mark.skipif( + IS_CI, reason="Skipping test in CI because the dataset is too heavy." +) @pytest.mark.dependency() def test_run_doclaynet_v1_e2e(): target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV1.value}/") @@ -425,6 +440,9 @@ def test_run_doclaynet_v2_e2e(): ) +@pytest.mark.skipif( + IS_CI, reason="Skipping test in CI because the dataset is too heavy." +) def test_run_funsd(): target_path = Path(f"./scratch/{BenchMarkNames.FUNSD.value}/") @@ -438,6 +456,9 @@ def test_run_funsd(): dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. +@pytest.mark.skipif( + IS_CI, reason="Skipping test in CI because the dataset is too heavy." +) def test_run_xfund(): target_path = Path(f"./scratch/{BenchMarkNames.XFUND.value}/") @@ -451,6 +472,9 @@ def test_run_xfund(): dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. +@pytest.mark.skipif( + IS_CI, reason="Skipping test in CI because the dataset is too heavy." +) @pytest.mark.dependency() def test_run_fintabnet_builder(): target_path = Path(f"./scratch/{BenchMarkNames.FINTABNET.value}/") @@ -485,6 +509,9 @@ def test_run_fintabnet_builder(): ) +@pytest.mark.skipif( + IS_CI, reason="Skipping test in CI because the dataset is too heavy." +) def test_run_p1m_builder(): target_path = Path(f"./scratch/{BenchMarkNames.PUB1M.value}/") tableformer_provider = TableFormerPredictionProvider(do_visualization=True) @@ -518,6 +545,9 @@ def test_run_p1m_builder(): ) +@pytest.mark.skipif( + IS_CI, reason="Skipping test in CI because the dataset is too heavy." +) def test_run_pubtabnet_builder(): target_path = Path(f"./scratch/{BenchMarkNames.PUBTABNET.value}/") tableformer_provider = TableFormerPredictionProvider(do_visualization=True) diff --git a/tests/test_layout_evaluator.py b/tests/test_layout_evaluator.py index 4c2e54da..11a12922 100644 --- a/tests/test_layout_evaluator.py +++ b/tests/test_layout_evaluator.py @@ -8,12 +8,12 @@ @pytest.mark.dependency( - depends=["tests/test_dataset_builder.py::test_run_doclaynet_v1_e2e"], + depends=["tests/test_dataset_builder.py::test_run_dpbench_e2e"], scope="session", ) def test_layout_evaluator(): r""" """ - test_dataset_dir = Path("scratch/DocLayNetV1/eval_dataset") + test_dataset_dir = Path("scratch/DPBench/eval_dataset_e2e") # Default evaluator eval1 = LayoutEvaluator() diff --git a/tests/test_markdown_text_evaluator.py b/tests/test_markdown_text_evaluator.py index d27f30e4..6eba1acb 100644 --- a/tests/test_markdown_text_evaluator.py +++ b/tests/test_markdown_text_evaluator.py @@ -7,12 +7,12 @@ @pytest.mark.dependency( - depends=["tests/test_dataset_builder.py::test_run_doclaynet_v1_e2e"], + depends=["tests/test_dataset_builder.py::test_run_dpbench_e2e"], scope="session", ) def test_markdown_text_evaluator(): r""" """ - test_dataset_dir = Path("scratch/DocLayNetV1/eval_dataset") + test_dataset_dir = Path("scratch/DPBench/eval_dataset_e2e") # Default evaluator eval1 = MarkdownTextEvaluator() diff --git a/tests/test_readingorder_evaluator.py b/tests/test_readingorder_evaluator.py index 88a28c2a..eb7ff746 100644 --- a/tests/test_readingorder_evaluator.py +++ b/tests/test_readingorder_evaluator.py @@ -7,12 +7,12 @@ @pytest.mark.dependency( - depends=["tests/test_dataset_builder.py::test_run_doclaynet_v1_e2e"], + depends=["tests/test_dataset_builder.py::test_run_dpbench_e2e"], scope="session", ) def test_readingorder_evaluator(): r""" """ - test_dataset_dir = Path("scratch/DocLayNetV1/eval_dataset") + test_dataset_dir = Path("scratch/DPBench/eval_dataset_e2e") # Default evaluator eval1 = ReadingOrderEvaluator() diff --git a/tests/test_table_evaluator.py b/tests/test_table_evaluator.py index 05915946..708cf1c9 100644 --- a/tests/test_table_evaluator.py +++ b/tests/test_table_evaluator.py @@ -292,12 +292,12 @@ def test_evaluate_tables(): @pytest.mark.dependency( - depends=["tests/test_dataset_builder.py::test_run_fintabnet_builder"], + depends=["tests/test_dataset_builder.py::test_run_dpbench_tables"], scope="session", ) def test_table_evaluator(): r""" """ - test_dataset_dir = Path("scratch/FinTabNet/eval_dataset") + test_dataset_dir = Path("scratch/DPBench/eval_dataset_tables") # Default evaluator eval1 = TableEvaluator() From 7e83d615f5fa1789e8d4a16cc0e9c379e1dff908 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 10:49:47 +0200 Subject: [PATCH 71/81] Add correct @pytest.mark.dependency() Signed-off-by: Christoph Auer --- tests/test_dataset_builder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index cd37ceb6..15c1e641 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -77,6 +77,7 @@ def create_docling_prediction_provider( ) +@pytest.mark.dependency() def test_run_dpbench_e2e(): target_path = Path(f"./scratch/{BenchMarkNames.DPBENCH.value}/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) @@ -266,6 +267,7 @@ def test_run_omnidocbench_e2e(): ) +@pytest.mark.dependency() def test_run_dpbench_tables(): target_path = Path(f"./scratch/{BenchMarkNames.DPBENCH.value}/") tableformer_provider = TableFormerPredictionProvider() @@ -338,7 +340,6 @@ def test_run_omnidocbench_tables(): @pytest.mark.skipif( IS_CI, reason="Skipping test in CI because the dataset is too heavy." ) -@pytest.mark.dependency() def test_run_doclaynet_v1_e2e(): target_path = Path(f"./scratch/{BenchMarkNames.DOCLAYNETV1.value}/") docling_provider = create_docling_prediction_provider(page_image_scale=2.0) @@ -475,7 +476,6 @@ def test_run_xfund(): @pytest.mark.skipif( IS_CI, reason="Skipping test in CI because the dataset is too heavy." ) -@pytest.mark.dependency() def test_run_fintabnet_builder(): target_path = Path(f"./scratch/{BenchMarkNames.FINTABNET.value}/") tableformer_provider = TableFormerPredictionProvider(do_visualization=True) From 40c6d97aa159af43b3d504faff2cf6701b2bf12b Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Tue, 1 Apr 2025 10:59:21 +0200 Subject: [PATCH 72/81] feat: Introduce TypeVars for the UnitEvaluation and DatasetEvaluation used by the BaseEvaluator. Signed-off-by: Nikos Livathinos --- docling_eval/evaluators/base_evaluator.py | 15 +++++++++------ docling_eval/evaluators/layout_evaluator.py | 3 ++- .../evaluators/markdown_text_evaluator.py | 8 ++++++-- docling_eval/evaluators/readingorder_evaluator.py | 4 ++-- docling_eval/evaluators/table_evaluator.py | 7 ++++--- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/docling_eval/evaluators/base_evaluator.py b/docling_eval/evaluators/base_evaluator.py index d71aa263..04019f17 100644 --- a/docling_eval/evaluators/base_evaluator.py +++ b/docling_eval/evaluators/base_evaluator.py @@ -1,7 +1,7 @@ import json import logging from pathlib import Path -from typing import Any, Dict, List, Optional +from typing import Any, Generic, List, Optional, TypeVar from docling_core.types.doc.document import ( DoclingDocument, @@ -16,7 +16,7 @@ _log = logging.getLogger(__name__) -class PageEvaluation(BaseModel): +class UnitEvaluation(BaseModel): pass @@ -24,6 +24,10 @@ class DatasetEvaluation(BaseModel): pass +UnitEvaluationType = TypeVar("UnitEvaluationType", bound=UnitEvaluation) +DatasetEvaluationType = TypeVar("DatasetEvaluationType", bound=DatasetEvaluation) + + def docling_document_from_doctags( data_record: DatasetRecordWithPrediction, ) -> DoclingDocument: @@ -47,7 +51,7 @@ def docling_document_from_doctags( return pred_doc -class BaseEvaluator: +class BaseEvaluator(Generic[UnitEvaluationType, DatasetEvaluationType]): r""" Base class for all evaluators """ @@ -81,7 +85,7 @@ def __call__( self, ds_path: Path, split: str = "test", - ) -> DatasetEvaluation: + ) -> DatasetEvaluationType: r""" Perform the evaluation """ @@ -98,8 +102,7 @@ def save_intermediate_evalutions( evaluation_name: str, enunumerate_id: int, doc_id: str, - # evaluations: List[PageEvaluation], - evaluations: List, + evaluations: List[UnitEvaluationType], ) -> Optional[Path]: r""" Utility method to save intermediate evaluation results diff --git a/docling_eval/evaluators/layout_evaluator.py b/docling_eval/evaluators/layout_evaluator.py index b4c61a7a..fc9804e8 100644 --- a/docling_eval/evaluators/layout_evaluator.py +++ b/docling_eval/evaluators/layout_evaluator.py @@ -20,6 +20,7 @@ from docling_eval.evaluators.base_evaluator import ( BaseEvaluator, DatasetEvaluation, + UnitEvaluation, docling_document_from_doctags, ) from docling_eval.evaluators.stats import DatasetStatistics, compute_stats @@ -37,7 +38,7 @@ class ClassLayoutEvaluation(BaseModel): value: float # mAP[0.5:0.05:0.95] -class ImageLayoutEvaluation(BaseModel): +class ImageLayoutEvaluation(UnitEvaluation): r""" Image based layout evaluation """ diff --git a/docling_eval/evaluators/markdown_text_evaluator.py b/docling_eval/evaluators/markdown_text_evaluator.py index 9ff05ffc..48403ed9 100644 --- a/docling_eval/evaluators/markdown_text_evaluator.py +++ b/docling_eval/evaluators/markdown_text_evaluator.py @@ -19,13 +19,17 @@ BenchMarkColumns, PredictionFormats, ) -from docling_eval.evaluators.base_evaluator import BaseEvaluator, DatasetEvaluation +from docling_eval.evaluators.base_evaluator import ( + BaseEvaluator, + DatasetEvaluation, + UnitEvaluation, +) from docling_eval.evaluators.stats import DatasetStatistics, compute_stats _log = logging.getLogger(__name__) -class PageMarkdownEvaluation(BaseModel): +class PageMarkdownEvaluation(UnitEvaluation): doc_id: str true_md: str diff --git a/docling_eval/evaluators/readingorder_evaluator.py b/docling_eval/evaluators/readingorder_evaluator.py index bdbf69ec..a096fd55 100644 --- a/docling_eval/evaluators/readingorder_evaluator.py +++ b/docling_eval/evaluators/readingorder_evaluator.py @@ -25,7 +25,7 @@ from docling_eval.evaluators.base_evaluator import ( BaseEvaluator, DatasetEvaluation, - PageEvaluation, + UnitEvaluation, ) from docling_eval.evaluators.stats import DatasetStatistics, compute_stats from docling_eval.visualisation.visualisations import draw_arrow @@ -33,7 +33,7 @@ _log = logging.getLogger(__name__) -class PageReadingOrderEvaluation(PageEvaluation): +class PageReadingOrderEvaluation(UnitEvaluation): doc_id: str # BBoxes are in BOTTOMLEFT origin and in the true order diff --git a/docling_eval/evaluators/table_evaluator.py b/docling_eval/evaluators/table_evaluator.py index 788d287e..8385be0e 100644 --- a/docling_eval/evaluators/table_evaluator.py +++ b/docling_eval/evaluators/table_evaluator.py @@ -17,6 +17,7 @@ from docling_eval.evaluators.base_evaluator import ( BaseEvaluator, DatasetEvaluation, + UnitEvaluation, docling_document_from_doctags, ) from docling_eval.evaluators.stats import DatasetStatistics, compute_stats @@ -25,7 +26,7 @@ _log = logging.getLogger(__name__) -class TableEvaluation(BaseModel): +class TableEvaluation(UnitEvaluation): filename: str = "" table_id: int = -1 TEDS: float @@ -39,7 +40,7 @@ class TableEvaluation(BaseModel): class DatasetTableEvaluation(DatasetEvaluation): - evaluations: list[TableEvaluation] + evaluations: List[TableEvaluation] TEDS: DatasetStatistics TEDS_struct: DatasetStatistics @@ -230,7 +231,7 @@ def _evaluate_tables_in_documents( true_doc: DoclingDocument, pred_doc: DoclingDocument, structure_only: bool = False, - ) -> list[TableEvaluation]: + ) -> List[TableEvaluation]: r""" """ table_evaluations = [] true_tables = true_doc.tables From 880ecf267c0e50164c563052adcb63d323dcb6bb Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 11:38:07 +0200 Subject: [PATCH 73/81] Minimize tests in CI Signed-off-by: Christoph Auer --- .github/workflows/checks.yml | 2 +- .../dataset_builders/dpbench_builder.py | 2 +- .../dataset_builders/omnidocbench_builder.py | 2 +- .../base_prediction_provider.py | 4 ++-- .../tableformer_provider.py | 14 ++++++------ tests/test_dataset_builder.py | 22 ++++++++----------- tests/test_table_evaluator.py | 1 + 7 files changed, 22 insertions(+), 25 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index bbfe366c..e5e24f7d 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -26,7 +26,7 @@ jobs: run: poetry install --all-extras - name: Testing run: | - poetry run pytest -s -vv tests + poetry run pytest -v tests - name: Run examples run: | # for file in docs/examples/*.py; do diff --git a/docling_eval/dataset_builders/dpbench_builder.py b/docling_eval/dataset_builders/dpbench_builder.py index 30e55bbc..1fca4f44 100644 --- a/docling_eval/dataset_builders/dpbench_builder.py +++ b/docling_eval/dataset_builders/dpbench_builder.py @@ -304,7 +304,7 @@ def iterate(self) -> Iterable[DatasetRecord]: for filename in tqdm( selected_filenames, - desc="Processing files for DP-Bench with end-to-end", + desc="Processing files for DP-Bench", ncols=128, ): # Get annotations for this file diff --git a/docling_eval/dataset_builders/omnidocbench_builder.py b/docling_eval/dataset_builders/omnidocbench_builder.py index 390e11c0..29f4fb0d 100644 --- a/docling_eval/dataset_builders/omnidocbench_builder.py +++ b/docling_eval/dataset_builders/omnidocbench_builder.py @@ -361,7 +361,7 @@ def iterate(self) -> Iterable[DatasetRecord]: page_tuples, total=selected_items, ncols=128, - desc="Processing files for OmniDocBench with end-to-end", + desc="Processing files for OmniDocBench", ): jpg_path = page_tuple[0] pdf_path = Path(page_tuple[1]) diff --git a/docling_eval/prediction_providers/base_prediction_provider.py b/docling_eval/prediction_providers/base_prediction_provider.py index fc7654ed..c984551b 100644 --- a/docling_eval/prediction_providers/base_prediction_provider.py +++ b/docling_eval/prediction_providers/base_prediction_provider.py @@ -145,12 +145,12 @@ def visualize_results( and prediction_record.ground_truth_page_images ): gt_doc = insert_images_from_pil( - prediction_record.ground_truth_doc, + prediction_record.ground_truth_doc.model_copy(), prediction_record.ground_truth_pictures, prediction_record.ground_truth_page_images, ) pred_doc = insert_images_from_pil( - prediction_record.predicted_doc, + prediction_record.predicted_doc.model_copy(), prediction_record.predicted_pictures, prediction_record.predicted_page_images, ) diff --git a/docling_eval/prediction_providers/tableformer_provider.py b/docling_eval/prediction_providers/tableformer_provider.py index c4f74775..3e350adb 100644 --- a/docling_eval/prediction_providers/tableformer_provider.py +++ b/docling_eval/prediction_providers/tableformer_provider.py @@ -123,17 +123,16 @@ def predict(self, record: DatasetRecord) -> DatasetRecordWithPrediction: record.ground_truth_doc, record.ground_truth_page_images, ) - pred_doc = insert_images_from_pil( - pred_doc, - record.ground_truth_pictures, - record.ground_truth_page_images, - ) - else: raise RuntimeError( f"Unsupported mime type: {record.mime_type}. TableFormerPredictionProvider supports 'application/pdf' and 'image/png'" ) + pred_doc = insert_images_from_pil( + pred_doc, + record.ground_truth_pictures, + record.ground_truth_page_images, + ) # Set status based on update success status = ConversionStatus.SUCCESS if updated else ConversionStatus.FAILURE @@ -318,7 +317,8 @@ def replace_tabledata( # Update item data item.data = table_data updated = True - + except Exception as e: + raise finally: # Ensure page backend is unloaded to free resources if hasattr(page, "_backend") and page._backend is not None: diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 15c1e641..82a3a65e 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -84,8 +84,9 @@ def test_run_dpbench_e2e(): dataset_layout = DPBenchDatasetBuilder( target=target_path / "gt_dataset", - end_index=5, - ) + begin_index=10, + end_index=25, + ) # 10-25 is a small range which has samples with tables included. dataset_layout.retrieve_input_dataset() # fetches the source dataset from HF dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. @@ -267,21 +268,16 @@ def test_run_omnidocbench_e2e(): ) -@pytest.mark.dependency() +# @pytest.mark.dependency( +# depends=["tests/test_dataset_builder.py::test_run_dpbench_e2e"], +# scope="session", +# ) def test_run_dpbench_tables(): target_path = Path(f"./scratch/{BenchMarkNames.DPBENCH.value}/") - tableformer_provider = TableFormerPredictionProvider() - - dataset_tables = DPBenchDatasetBuilder( - target=target_path / "gt_dataset", - end_index=25, - ) - - dataset_tables.retrieve_input_dataset() # fetches the source dataset from HF - dataset_tables.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + tableformer_provider = TableFormerPredictionProvider(do_visualization=True) tableformer_provider.create_prediction_dataset( - name=dataset_tables.name, + name="DPBench tables eval", gt_dataset_dir=target_path / "gt_dataset", target_dataset_dir=target_path / "eval_dataset_tables", ) diff --git a/tests/test_table_evaluator.py b/tests/test_table_evaluator.py index 708cf1c9..a2adce76 100644 --- a/tests/test_table_evaluator.py +++ b/tests/test_table_evaluator.py @@ -1,4 +1,5 @@ from pathlib import Path +from typing import List import pytest from docling_core.types.doc.document import DoclingDocument, TableCell, TableData From a23f7ea20ceaf671fa024bf4e3a0082e796c1d75 Mon Sep 17 00:00:00 2001 From: Nikos Livathinos Date: Tue, 1 Apr 2025 11:39:24 +0200 Subject: [PATCH 74/81] feat: Refactor BboxTestEvaluator to use the new design. Introduce unit test. Signed-off-by: Nikos Livathinos --- .../evaluators/bbox_text_evaluator.py | 51 ++++++++++++++----- tests/test_bboxtext_evaluator.py | 33 ++++++++++++ 2 files changed, 70 insertions(+), 14 deletions(-) create mode 100644 tests/test_bboxtext_evaluator.py diff --git a/docling_eval/evaluators/bbox_text_evaluator.py b/docling_eval/evaluators/bbox_text_evaluator.py index 7511310d..7d078055 100644 --- a/docling_eval/evaluators/bbox_text_evaluator.py +++ b/docling_eval/evaluators/bbox_text_evaluator.py @@ -13,13 +13,22 @@ from pydantic import BaseModel from tqdm import tqdm # type: ignore -from docling_eval.datamodels.types import BenchMarkColumns # type: ignore +from docling_eval.datamodels.dataset_record import DatasetRecordWithPrediction +from docling_eval.datamodels.types import ( # type: ignore + BenchMarkColumns, + PredictionFormats, +) +from docling_eval.evaluators.base_evaluator import ( + BaseEvaluator, + DatasetEvaluation, + UnitEvaluation, +) from docling_eval.evaluators.stats import DatasetStatistics, compute_stats _log = logging.getLogger(__name__) -class BoxesTextEvaluation(BaseModel): +class BoxesTextEvaluation(UnitEvaluation): r"""Evaluation for matched bboxes of the same page""" doc_id: str @@ -38,7 +47,7 @@ class BoxesTextEvaluation(BaseModel): meteor: float -class DatasetBoxesTextEvaluation(BaseModel): +class DatasetBoxesTextEvaluation(DatasetEvaluation): evaluations: List[BoxesTextEvaluation] bleu_stats: DatasetStatistics f1_score_stats: DatasetStatistics @@ -48,7 +57,7 @@ class DatasetBoxesTextEvaluation(BaseModel): meteor_stats: DatasetStatistics -class BboxTextEvaluator: +class BboxTextEvaluator(BaseEvaluator): r""" 1. Starting from a true DoclingDocument and a pred DoclingDocument. 2. Take as a pivot the document with less bboxes. @@ -63,7 +72,23 @@ class BboxTextEvaluator: 7. Compute text metrics (BLEU, f1, recall, precision, meteor, edit_dist) for the pivot/other tokens. """ - def __init_(self): + def __init_( + self, + intermediate_evaluations_path: Optional[Path] = None, + prediction_sources: List[PredictionFormats] = [], + ): + r""" """ + supported_prediction_formats: List[PredictionFormats] = [ + PredictionFormats.DOCLING_DOCUMENT, + ] + if not prediction_sources: + prediction_sources = supported_prediction_formats + super().__init__( + intermediate_evaluations_path=intermediate_evaluations_path, + prediction_sources=prediction_sources, + supported_prediction_formats=supported_prediction_formats, + ) + # Download the NLTK data nltk.download("popular", quiet=True) @@ -93,15 +118,13 @@ def __call__( ncols=120, total=len(ds_selection), ): - doc_id: str = data[BenchMarkColumns.DOC_ID] - true_doc_dict = data[BenchMarkColumns.GROUNDTRUTH] - true_doc: DoclingDocument = DoclingDocument.model_validate_json( - true_doc_dict - ) - pred_doc_dict = data[BenchMarkColumns.PREDICTION] - pred_doc: DoclingDocument = DoclingDocument.model_validate_json( - pred_doc_dict - ) + data_record = DatasetRecordWithPrediction.model_validate(data) + doc_id = data_record.doc_id + true_doc = data_record.ground_truth_doc + pred_doc = data_record.predicted_doc + if pred_doc is None: + _log.error("There is no prediction for doc_id=%s", doc_id) + continue # Match the bboxes/text from the true/pred documents matches = self._match_bboxes(true_doc, pred_doc) diff --git a/tests/test_bboxtext_evaluator.py b/tests/test_bboxtext_evaluator.py new file mode 100644 index 00000000..7917c23c --- /dev/null +++ b/tests/test_bboxtext_evaluator.py @@ -0,0 +1,33 @@ +from pathlib import Path + +import pytest + +from docling_eval.datamodels.types import PredictionFormats +from docling_eval.evaluators.bbox_text_evaluator import BboxTextEvaluator + + +@pytest.mark.dependency( + depends=["tests/test_dataset_builder.py::test_run_dpbench_e2e"], + scope="session", +) +def test_bboxtext_evaluator(): + r""" """ + test_dataset_dir = Path("scratch/DPBench/eval_dataset_e2e") + + # Default evaluator + eval1 = BboxTextEvaluator() + v1 = eval1(test_dataset_dir) + assert v1 is not None + + # Specify invalid order in prediction_sources + is_exception = False + try: + eval3 = BboxTextEvaluator(prediction_sources=[PredictionFormats.JSON]) + eval3(test_dataset_dir) + except RuntimeError as ex: + is_exception = True + assert is_exception + + +# if __name__ == "__main__": +# test_bboxtext_evaluator() From 77b3bed839c812dbbca91124470174ab96f582b7 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 11:48:04 +0200 Subject: [PATCH 75/81] Remove streaming in DocLaynet v1 Signed-off-by: Christoph Auer --- docling_eval/dataset_builders/doclaynet_v1_builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docling_eval/dataset_builders/doclaynet_v1_builder.py b/docling_eval/dataset_builders/doclaynet_v1_builder.py index 4fe616f0..cc8f0fd7 100644 --- a/docling_eval/dataset_builders/doclaynet_v1_builder.py +++ b/docling_eval/dataset_builders/doclaynet_v1_builder.py @@ -288,7 +288,7 @@ def iterate(self) -> Iterable[DatasetRecord]: if self.dataset_local_path is not None: path = str(self.dataset_local_path) # Load dataset from the retrieved path - ds = load_dataset(path, split=self.split, streaming=True) + ds = load_dataset(path, split=self.split) # Apply HuggingFace's select method for index ranges total_ds_len = len(ds) From 71511d7dc512ad236bd13fdde67d20c91bd90c76 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 12:03:39 +0200 Subject: [PATCH 76/81] Add back test dependency Signed-off-by: Christoph Auer --- tests/test_dataset_builder.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 82a3a65e..0e92e398 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -268,10 +268,10 @@ def test_run_omnidocbench_e2e(): ) -# @pytest.mark.dependency( -# depends=["tests/test_dataset_builder.py::test_run_dpbench_e2e"], -# scope="session", -# ) +@pytest.mark.dependency( + depends=["tests/test_dataset_builder.py::test_run_dpbench_e2e"], + scope="session", +) def test_run_dpbench_tables(): target_path = Path(f"./scratch/{BenchMarkNames.DPBENCH.value}/") tableformer_provider = TableFormerPredictionProvider(do_visualization=True) From fddc215b4e542f637a590f8ddb90009fc6df5494 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 13:04:35 +0200 Subject: [PATCH 77/81] Add DocVQA dataset builder Signed-off-by: Christoph Auer --- docling_eval/datamodels/types.py | 3 + .../dataset_builders/docvqa_builder.py | 194 ++++++++++++++++++ tests/test_dataset_builder.py | 23 +++ 3 files changed, 220 insertions(+) create mode 100644 docling_eval/dataset_builders/docvqa_builder.py diff --git a/docling_eval/datamodels/types.py b/docling_eval/datamodels/types.py index 31b015e2..e812588c 100644 --- a/docling_eval/datamodels/types.py +++ b/docling_eval/datamodels/types.py @@ -45,6 +45,7 @@ class EvaluationModality(str, Enum): CAPTIONING = "captioning" # to compute the accuracy of captions to table/figure BBOXES_TEXT = "bboxes_text" KEY_VALUE = "key_value" + QUESTION_ANSWERING = "question_answering" class BenchMarkNames(str, Enum): @@ -67,6 +68,8 @@ class BenchMarkNames(str, Enum): FINTABNET = "FinTabNet" WIKITABNET = "WikiTabNet" + DOCVQA = "DocVQA" + # Formula # ??? diff --git a/docling_eval/dataset_builders/docvqa_builder.py b/docling_eval/dataset_builders/docvqa_builder.py new file mode 100644 index 00000000..74030fc3 --- /dev/null +++ b/docling_eval/dataset_builders/docvqa_builder.py @@ -0,0 +1,194 @@ +import io +import logging +from pathlib import Path +from typing import Iterable, List, Optional, Set + +import PIL.Image +from datasets import load_dataset +from docling_core.types import DoclingDocument +from docling_core.types.doc import ( + BoundingBox, + CoordOrigin, + DocItemLabel, + GroupItem, + GroupLabel, + ImageRef, + PageItem, + ProvenanceItem, + Size, + TableCell, + TableData, +) +from docling_core.types.io import DocumentStream +from tqdm import tqdm + +from docling_eval.datamodels.dataset_record import DatasetRecord +from docling_eval.datamodels.types import BenchMarkColumns, EvaluationModality +from docling_eval.dataset_builders.dataset_builder import ( + BaseEvaluationDatasetBuilder, + HFSource, +) +from docling_eval.utils.utils import ( + add_pages_to_true_doc, + crop_bounding_box, + extract_images, + from_pil_to_base64uri, + get_binhash, +) + +# Get logger +_log = logging.getLogger(__name__) + + +class DocVQADatasetBuilder(BaseEvaluationDatasetBuilder): + """ + DocLayNet V1 dataset builder implementing the base dataset builder interface. + + This builder processes the DocLayNet V1.2 dataset, which contains document + layout annotations for a variety of document types. + """ + + def __init__( + self, + target: Path, + split: str = "test", + begin_index: int = 0, + end_index: int = -1, + ): + """ + Initialize the DocVQA dataset builder. + + Args: + target: Path where processed dataset will be saved + split: Dataset split to use + begin_index: Start index for processing (inclusive) + end_index: End index for processing (exclusive), -1 means process all + """ + super().__init__( + name="DocVQA", + dataset_source=HFSource(repo_id="lmms-lab/DocVQA"), + target=target, + split=split, + begin_index=begin_index, + end_index=end_index, + ) + + def _process_document(self, doc_id, qa_items) -> DatasetRecord: + """Process all QA items for a single document.""" + print(f"Processing document: {doc_id}") + + doc = DoclingDocument(name=f"{doc_id}") + image: PIL.Image.Image = qa_items[0]["image"] + image_ref = ImageRef( + mimetype="image/png", + dpi=72, + size=Size(width=image.width, height=image.height), + uri=from_pil_to_base64uri(image), + ) + page_item = PageItem( + page_no=1, + size=Size(width=float(image.width), height=float(image.height)), + image=image_ref, + ) + + doc.pages[1] = page_item + for qa_item in qa_items: + print(f" Processing QA item data...") + + # Extract images from the ground truth document + doc, true_pictures, true_page_images = extract_images( + document=doc, + pictures_column=BenchMarkColumns.GROUNDTRUTH_PICTURES.value, + page_images_column=BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES.value, + ) + + # Convert image to bytes for storage + with io.BytesIO() as img_byte_stream: + image.save(img_byte_stream, format="PNG") + img_byte_stream.seek(0) + img_bytes = img_byte_stream.getvalue() + + # Create dataset record + record = DatasetRecord( + doc_id=str(doc_id), + doc_hash=get_binhash(img_bytes), + ground_truth_doc=doc, + original=DocumentStream(name=str(doc_id), stream=io.BytesIO(img_bytes)), + mime_type="image/png", + modalities=[ + EvaluationModality.LAYOUT, + EvaluationModality.QUESTION_ANSWERING, + ], + ground_truth_pictures=true_pictures, + ground_truth_page_images=true_page_images, + ) + + return record + + def iterate(self) -> Iterable[DatasetRecord]: + """ + Iterate through the dataset and yield DatasetRecord objects. + + Yields: + DatasetRecord objects + """ + assert isinstance(self.dataset_source, HFSource) + + path = self.dataset_source.repo_id + if self.dataset_local_path is not None: + path = str(self.dataset_local_path) + # Load dataset from the retrieved path + ds = load_dataset(path, split=f"{self.split}[1:50]", name="DocVQA") + + # Apply HuggingFace's select method for index ranges + total_ds_len = len(ds) + begin, end = self.get_effective_indices(total_ds_len) + + # Select the range (HuggingFace datasets have a convenient select method) + ds = ds.select(range(begin, end)) + selected_ds_len = len(ds) + + # Log stats + self.log_dataset_stats(total_ds_len, selected_ds_len) + + skipped_rows = 0 + exported_rows = 0 + + sorted_dataset = ds.sort("docId") + + # Initialize variables + current_doc_id = None + current_doc_qa_items = [] # type: ignore + + # Iterate through the sorted dataset + for sample in tqdm( + sorted_dataset, + total=selected_ds_len, + ncols=128, + desc="Processing DocVQA records...", + ): + # Check if we've moved to a new docId + if sample["docId"] != current_doc_id: + # Process the previous doc's QA items (skip first iteration) + if current_doc_qa_items: + rec = self._process_document(current_doc_id, current_doc_qa_items) + yield rec + exported_rows += 1 + + # Start a new document group + current_doc_id = sample["docId"] + current_doc_qa_items = [sample] + else: + current_doc_qa_items.append(sample) + + # Process the final document group + if current_doc_qa_items: + rec = self._process_document(current_doc_id, current_doc_qa_items) + yield rec + exported_rows += 1 + + _log.info( + "Exported rows: %s. Skipped rows: %s.", + exported_rows, + skipped_rows, + ) diff --git a/tests/test_dataset_builder.py b/tests/test_dataset_builder.py index 0e92e398..09a8b64b 100644 --- a/tests/test_dataset_builder.py +++ b/tests/test_dataset_builder.py @@ -21,6 +21,7 @@ ) from docling_eval.dataset_builders.doclaynet_v1_builder import DocLayNetV1DatasetBuilder from docling_eval.dataset_builders.doclaynet_v2_builder import DocLayNetV2DatasetBuilder +from docling_eval.dataset_builders.docvqa_builder import DocVQADatasetBuilder from docling_eval.dataset_builders.dpbench_builder import DPBenchDatasetBuilder from docling_eval.dataset_builders.funsd_builder import FUNSDDatasetBuilder from docling_eval.dataset_builders.omnidocbench_builder import ( @@ -74,6 +75,7 @@ def create_docling_prediction_provider( InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options) }, do_visualization=True, + ignore_missing_predictions=False, ) @@ -579,3 +581,24 @@ def test_run_pubtabnet_builder(): odir=target_path / "evaluations" / EvaluationModality.TABLE_STRUCTURE.value, split="val", ) + + +@pytest.mark.skipif( + IS_CI, reason="Skipping test in CI because the dataset is too heavy." +) +def test_run_docvqa_builder(): + target_path = Path(f"./scratch/{BenchMarkNames.DOCVQA.value}/") + + dataset_layout = DocVQADatasetBuilder( + target=target_path / "gt_dataset", + end_index=25, + ) + + dataset_layout.save_to_disk() # does all the job of iterating the dataset, making GT+prediction records, and saving them in shards as parquet. + docling_provider = create_docling_prediction_provider(page_image_scale=2.0) + + docling_provider.create_prediction_dataset( + name=dataset_layout.name, + gt_dataset_dir=target_path / "gt_dataset", + target_dataset_dir=target_path / "eval_dataset_e2e", + ) From 97ef6ab95615619a9cc6d4a060c6248bb374e4b1 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 13:13:15 +0200 Subject: [PATCH 78/81] Bugfixes Signed-off-by: Christoph Auer --- docling_eval/dataset_builders/docvqa_builder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docling_eval/dataset_builders/docvqa_builder.py b/docling_eval/dataset_builders/docvqa_builder.py index 74030fc3..f34a708f 100644 --- a/docling_eval/dataset_builders/docvqa_builder.py +++ b/docling_eval/dataset_builders/docvqa_builder.py @@ -79,6 +79,7 @@ def _process_document(self, doc_id, qa_items) -> DatasetRecord: doc = DoclingDocument(name=f"{doc_id}") image: PIL.Image.Image = qa_items[0]["image"] + image = image.convert("RGB") image_ref = ImageRef( mimetype="image/png", dpi=72, From 9c437e8aeff8f5b98659307bdeacddbd97809f9f Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 13:13:46 +0200 Subject: [PATCH 79/81] Remove prints Signed-off-by: Christoph Auer --- docling_eval/dataset_builders/docvqa_builder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docling_eval/dataset_builders/docvqa_builder.py b/docling_eval/dataset_builders/docvqa_builder.py index f34a708f..226eee69 100644 --- a/docling_eval/dataset_builders/docvqa_builder.py +++ b/docling_eval/dataset_builders/docvqa_builder.py @@ -75,7 +75,7 @@ def __init__( def _process_document(self, doc_id, qa_items) -> DatasetRecord: """Process all QA items for a single document.""" - print(f"Processing document: {doc_id}") + _log.debug(f"Processing document: {doc_id}") doc = DoclingDocument(name=f"{doc_id}") image: PIL.Image.Image = qa_items[0]["image"] @@ -94,7 +94,7 @@ def _process_document(self, doc_id, qa_items) -> DatasetRecord: doc.pages[1] = page_item for qa_item in qa_items: - print(f" Processing QA item data...") + _log.debug(f" Processing QA item data...") # Extract images from the ground truth document doc, true_pictures, true_page_images = extract_images( From e6655b137bdba970298877df135d1d34f9208ca6 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 13:18:05 +0200 Subject: [PATCH 80/81] Cleanup Signed-off-by: Christoph Auer --- docling_eval/dataset_builders/docvqa_builder.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docling_eval/dataset_builders/docvqa_builder.py b/docling_eval/dataset_builders/docvqa_builder.py index 226eee69..8e27890e 100644 --- a/docling_eval/dataset_builders/docvqa_builder.py +++ b/docling_eval/dataset_builders/docvqa_builder.py @@ -42,9 +42,9 @@ class DocVQADatasetBuilder(BaseEvaluationDatasetBuilder): """ - DocLayNet V1 dataset builder implementing the base dataset builder interface. + DocVQA dataset builder implementing the base dataset builder interface. - This builder processes the DocLayNet V1.2 dataset, which contains document + This builder processes the DocVQA dataset, which contains document layout annotations for a variety of document types. """ @@ -139,7 +139,7 @@ def iterate(self) -> Iterable[DatasetRecord]: if self.dataset_local_path is not None: path = str(self.dataset_local_path) # Load dataset from the retrieved path - ds = load_dataset(path, split=f"{self.split}[1:50]", name="DocVQA") + ds = load_dataset(path, split=self.split, name="DocVQA") # Apply HuggingFace's select method for index ranges total_ds_len = len(ds) From 604e4a739dc7e8dd31784a8de6b08078e631a494 Mon Sep 17 00:00:00 2001 From: Christoph Auer Date: Tue, 1 Apr 2025 13:21:12 +0200 Subject: [PATCH 81/81] Add DocVQA to CLI Signed-off-by: Christoph Auer --- docling_eval/cli/main.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py index 5a2e228b..c0016931 100644 --- a/docling_eval/cli/main.py +++ b/docling_eval/cli/main.py @@ -19,6 +19,7 @@ ) from docling_eval.dataset_builders.doclaynet_v1_builder import DocLayNetV1DatasetBuilder from docling_eval.dataset_builders.doclaynet_v2_builder import DocLayNetV2DatasetBuilder +from docling_eval.dataset_builders.docvqa_builder import DocVQADatasetBuilder from docling_eval.dataset_builders.dpbench_builder import DPBenchDatasetBuilder from docling_eval.dataset_builders.funsd_builder import FUNSDDatasetBuilder from docling_eval.dataset_builders.omnidocbench_builder import ( @@ -171,6 +172,9 @@ def get_dataset_builder( elif benchmark == BenchMarkNames.PUBTABNET: return PubTabNetDatasetBuilder(**common_params) # type: ignore + elif benchmark == BenchMarkNames.DOCVQA: + return DocVQADatasetBuilder(**common_params) # type: ignore + else: raise ValueError(f"Unsupported benchmark: {benchmark}")

    {!XwsWz9^ZL5YH3eT4F6|O8V+bGs=MHZKO%CAsm*Zp=?TU8 z%*4q_tSMyZfZIq~`oP@T%$a1GpIdRY(Ak-2n(*6~Glc;LN|NrE-kV(JKp*%cw@Ysw zr|zEB;0G9s32dbnv;KnowKbVF!;IR|EW<|e2e*+tC@+1ZZQ7HwOW(fy8_!p%jDF~C z0vOe=L^b@5K#-8jDbRsr)g10U;C`K-dwfU!#d<($ex3o$__es65gmQj*=lBLMsXh-{bptQ-P9_#aV2Bzn~(j2cEd_C)o8pz1i8EN zHXvhL0R$}qN%k#ES>xsP+ALlI{S)oaM44@cn&X#_*K5z4;WE*AaAe7DppwJH`P=>D zGWF@?Rq!o`N*@?;%rJg&>9i$y?l zj6SI8c`KH0O`XQn`K1#=p_)vh^QZ}bx`)O zPGqAOw<@qW12Xd54nMr;?L}@>^*XK6&q&rO(r?>{Pwi`uP-e=?ADS%SZf~Qn$0{=m zdFy0s6uR%zR+*J9Oj6YZ1{G1#>N* z`tn@}m!2hAlsW{AQP%AAhLIHFCqF6B_$PDo+d5qFeF!dSqXBvGWulzNM`5A}DBo>r z4iM*KnI^0U2dK2Fd?5K>(jkMi)Z z)>`1}P8h*3=nCaz%M|`Kv|yg?wvd1)B@$*@IFIynjzr!4H?o%#bipUc*9^j!)(A`L zsQ%BNx>66}xgleIP;CD9htnR$kH=uKeGVE-qHRxOYvDYrdX#-Qs-qmMAc_4Pq;;;v zQWPmykGi*i=B%%>1B#^jY}7#8cyUA%RnkM>WSHjW=HR?YR3_&aC#?&8TK0G{`MX7U z4n4$vh}w&e<4EAaeNny3Dm5@xQ~{ufoGAUi-)@h>nQ;4rHR^{U--RVG)|df`gx;UtUNkfIThPns&bd- z_nSNsQA~3UOSR9$nuKo@V>}e1Y40jN2`~sA6o*AjmuMNdVLg;yYu9dx^J^S zEqe5bN0ZD3)QUQp8R+;H)nbtZ_%et8)E)Be9gT@94i=|FP-m1$%Z$i|6&Y$!GW_g8 zusakGb?L{L#isW~s!1Oc(Mx8)gb@6EJ3(Jh)|UYetY(~&Y?G?Hx|EgaN^204T4t|U zY^&q7w|^a`UMaJ<%DJQ*au$$qQuW|eD8*VbK;Aj6n!ZW=MCoN+wmtzfM>^zYS_RS) zwF{3ncgHSEl=_g)miv9h!AUusk%&Vs+jHC}6P-)(#%c66?e<)ykdhe7m}Zf`Y|au4 zLnJ9D0+nzdHtluu@7j?-cfx$D?S_v~1pYo8o_oAtQBYc^?YqLbUL?eT*soE{+W-oj zIJo?G+5TtsZlXp17&<94SEZ}lGOy0DZd~_>WVC6Q`29h6HZ@3!IrUHcsbu`z#KlJ_BnVwe-1gS1m35?+15|8LGQFaf^sH!DY*v{Rxzoi#wG1d5>2hr>6iV zIV*sh+Mxlsqtc#ruW-$vap%q%V3~ABd{JNWcKt`PQ$O#x#)8qq=M8bi)v0qVjYaL6 zoOqfl(~9(BnTcFKRYjEZgppA+BU)08+~LX_XMQNtmZzDWE9OVHmp0ouAR`nyDU_*I5fgN2P;$n^a_pY)hzljx^@~`r}K4CafCi#Im&XS*)C=6Wj41#;pGcM^M#@S6)4H$h4U=XskXiIh(fQ) zQ--Y4=jGW!eElSXj`i?h;FYW^Fn@%NR~013ab*N_4&Mk0W)X@vqW%>Mdl=MM=xlCI^%Q zRf}Xt#0VSE;#a&%`crdD!F+hqiL0Zx={eRE7{~dQtoEXOY7u^{D z`}N;X8K5CC@T8Shf|nDqCT{&5a(EOncA5Df%82=Dw=!etTDO}vU2cVH*SxG3gTfmS3#;}!)8{KcpL^mPk=!dv<1)rr3@iZQq1%8}+2F7Nm~QL&{kw3bM}m>_ z`+5hP?a99^08y{piOGWcH{DN*f{OhIQd^9MbO6EN@XkLN^PZ1Z+Fz&a%qa`6)EqlM zoGRZOKaQ|p#s-2lOMVsB|MrT<7xl1K=6&=|&Y3hT=TfSTG3ac}UGcA!$Vw-l+*@MD z{JaG93pIQEAm|-<*tPQS+Ic*Me?21@!{4^OvYHUwb0O1`;x2h>WX3W59mX)B`L{5_ zLaLOw+S|P~M^ytK>;GF2yRfCmzF7iMUCFt~u7%Cf7l@{;Nr)|iCGwERtKs_wPnz(_ zoey^gSV!HPBIr9wDgk?Y{WUav-!Ab+_YJ+s6xwhna{aD;-|jt`8ko)WD+uo7n&#!c z*_+Dhgj}(g%HWR5a@NYfM-6gc#|drAdmCa{jU&`S5f0&AZKnzUZYs6}P7*FG65OOL zV4TF@^-=Y;*s<*HDGz`k4eP6NnFs&i1nQA zf5|)GHI?RfZZrLe%Vb|9y>W>GBunU*3GGKbjm-4<5SjUgYndl@za^EryH(CY zh7fH=4Z@^_iMF$sfxk0*W{6qLZfK8iAYVdjBo30))SG<3DK4p*t$~(9MAZVYreVQ6 zdkrU@a=VP&lL$HZHA`Zo*}Pm`H0Wm96U%79IbK6F3p*~k3Wv0|W%nCvYToMj(>Sgz zgWQBw>GMZ)dB{(EBe8w2^(!SHx zcGsZYDQngC-23~N)F3UdOm;($Gd_lzjvhrcX;(wS6mkgHy4=BKKFX7v+qY?ji`80Y z&yw1v>Pm&*d&gMM723QQLnrAzXmsU*xr>EtW#rawVLOYB+^2W}!PBe(Z_(~1e^Bj2 zz>e|4OzCOMulxwYZw^wiHuA*N8R$GK&YMHOP_vu{{HFw0+r(_B$|+ixq!Wdk`8>`S zo)x2J9v5aXE*Ti=E*z_7E*-6AIS5uQW$4}tPkK+-*^g>7>RS62 zGZ(X}^9ib(josRTFPY$DHjoA0*VU`Lqxlt6dyD0%;CL^bIH{q&cA9fEg-o_lJ_N=F zKJo+!_Y^5{_3FEn@iEz^`19IVY1>0#<6ciY=sr7Y38-fLy zXJhG9RZeX+H8pE3C8bz*H@C$g7$nFggXtjQ#qk@ z0!!xZ<7qtEg@!Hczw*EPS-}zNiBCpx}HXG2JsR8 z9`N5aG&0I;Gv5Q`U%6lJ4*#&zjHepAPBy5sjvHEwL;rrc*+ zr+m)hB%5;Wvwa4DH{oR0-xsY>R5k&&>9mWFmm=N1KZ37;zh&(@ZLrl-9okMNo;X+k zcq5B5RNl^Y=-uS5lz&=|{4I%m@#ofJxuH_YPi&YLj(Ptr6{=!iFFGs4Yso=2qg13TCUg+Us-C^U#iAyFZf`la1URV(_`6s8hPxo_Q9myrSD`ev)Pp?8n=3s8c$X zMg37C9KK&G6~4|SJ+Egu^oT6q&t@vO%5+lItAyHW!kbo+aMtp6ZHkNgvtT5}^{En4tvX^ep`cHVo&(*X zdjb5OT+pW6_UwW#D+2B!!3Kh=rL1KMv&XN5{}36zFFllLfF#% z>jG(`(Yssgo$b!N#sgFBd#}%}c_?%+&UoWgv-R17UO`Sboz+CWQ3gosqgteNWMOgH z;^Ej;`iWJ<45M`RGupq;vM$`PuImC{vgsvpw}OURo$^k-olvy8a%3C$-K$M_d3WeE z>C9t_u9b_wkGL)k@lP%nU{&7yfK%hjdbRLv1Z#N z67Zh=i%73pBF$skWej{jAUU(j?NZ7sl_&Z7ODMp<3Y#3i=L4(;Y+&{~lFJrcjyPMC zH2woBsH|Mzx&jFiTMp*I8&}b92N`5?3G?DWsURTWTaO5T?y(calMG_jKYZp__2!pM z;Kn#Z$WBcZVH(NiAK%ewBDzVQ9d4Z-zR_AM7!w2hqdTk%9b@mJgl5RYW?42Co1n^ka066;O~$y29NX0@fylSnIF#V|=qSnw5zM5ZEU zdrnEBL?A4y;jz42)!Gjlke1BY)`oOW!}!!K7%jqy&|l!Di7@f8OfZ;ZENm*>L|=l3 z@^~2!#|!OxNI92hCd#fxbEbA-I|Y&By^Vgj2^PCL zhV;WhimxlK!C-7sKd#M2%RxE0QPJz4k>_s|&KU05+#%kRtJ-^gI_8-hn|mYO@@B>jsbIfyO`~pe%4e8dB6n@;bgIf;xu6qTeTFnsQn! zN_1ap8fzOv)C(L!K+bhpAczl?9|?w!HmB$_zg-;QOZ5iu(I$LymetW0`y`g=|Cb?= z(LakFVayK%lmhy$4m-de4Ttm9=IjdP$zNQ{aDgaC2oTTUO&`i>hUKmV>@nW}eP}i! zJu#MAh&wI=CW>+`U%{-4u+kd`uIp!4lS!J$xf&C*wDq=;?^XX~Vcwu6jtJS=P7l08 zujVPNS_~2{6LO?jVz21rU!CqXD~>hXk=N8mU0@4-FZB6LBQ*c+@XX>Op1qxe142XR z{j!~j{nw1gKgL$+KyLmy`~Z-1U7Q5{z~_Hv9-`E6M75)GNRBN4FnnYOM@Gln?#&Rk zm=PG#(w>Wnr+^AdR#k<0p4~>l%sg7Oz_KK*n-D-^Su0TjD3PTh%k$xtLfi>)n~#G$ zC~4x0D)F!tJ7|`*MKy&MV<~u=Dn+k}zfUb0E8F0+&rePdnLcNj23)H4yaD0a>6XbJ zV_3(86|ra+$wtI2@)B*WoT#}xve6y^4p|Dr+veNtJ@B%o)gbT*o(^HQ&ZaJ%5Z$bj z0Mm8YKOz{BKxBCL4*<@rh$<&~nQ9>){Ao`D6aoQ5e7*Tv)yS#`# zvEr}R?}O@mg0{tkGQVFS;|Cb7_A^}yYe@`ushB34e>NAM&NR+aFvb3*naRO9yAre~ z$DR>huCUV~wGnW*phTp8FCi*>rr_Hr6Um5Ah`k^D+;+~hT1ZW!X;*#hVJCDSqp|x^ zF1TQ`;kjkFl*suQnqB72uT_3iH`ab;vNGp4>HpN4Y0I|c?Q?X`!P%-7X{#q#js37e zC}|ejaWUCOt-sm=`m^zW`;9)RYb-iq2hN-~#EWul5C=7aWG1HlU?HYUU2JpOKTwfF zy{-L!rBVwT0w^{l1-VO;aR>qud0~)|Va2n=$pzAcgoLC;^>IHSBtqDT^Fv@d4aS^Z zZ=NAvp*KtGfp8&lDp#*RLHrDX!=wZ~fC2i5Bm+ZM$~Ym6c@%dd(rU2oqO4+7LNBMa z+1zcNfNTm3M4JdLwmg;)$~Pf6A4fZY&@2) zwA>p8Tvf=YQ1Q^+e1Sz#G8AZiCN1PWQ4%vQaXO1Y1Q+t%UP*Y@C_(wHw}bBOf^qhBm84-(8@0|?o%QNY{Xri#+WWX1Tn8ibfV0IdOQB90dX zHVqb}8%t#g0V%4S0vC7|K%27>D6Jl6sAlo+ISf@$RwFXcD9tfj=x}k0J~l`e)mdHS zm}fsdLPi7+2r0`z^FlDy{V*6c=vDUb@Db&5r9;vOdM@OXgVugpnnS(X9t9HG1;bDf zMsc3H)VrtnO5f`-N-$V?D1!JHzdZlZ5-UoeE9R?;lNB?(5AVZKH_7U@qsp!EtuXg( zQPimiPNb%cH!j^+Esj$Rp3VdhI)qgjHrofXufv_~5KqsKTb^qANsVR9S+Cp^)j|#K z{-!#;UZ!-<#9@~N)JY{w7#I1cae05{<)(HKM4z^ml8ooDEss+5VLR*vQ;h$qmEdr- zA9HwEx-IcOIpq1)x$>4#AMK&jK$fFtMv?16U`OaM6(lkJO=+n*!_4FH5#x>`nyBy^ zy&t7Y?yHRIlu8>}G!{aFlT4XCq6*;HpEHpPD_-pm=mSDG`1x|jc~4Lw3rp8R>X(YF1E23l!W zl)KEmRqwsnz4Q0(-}jbhfqStl(@zq5%d^(*RKw$+cjwRm6&KYQ2Cjc%P*>W1H{TaN z`1RA>E?qnhUz}Zvuwb*{EDnwEl`U%L0?3F$iQ$uGJHASPVV&F|{yV1lTRZ8aK0!aV z{Z?UowLEh&(oC(p!PU7@dMnV@PC;{FI*;%V6?xdMumj&`J1bfzqQC#`6mKp|e%i(i zBFKs9a_5&+CF;TCL5DP_4cP}1_&u8-HH4Z`>9H5ffdh=UyorEE^ZpqQk`OF=$Vob!`cPmn^R6y47K!md1iUp z7My*949(LdvN+I@^~Uf;`F*}z59*!)wyLU|{1f;=1>W_u5`<XstGb$wkOG_#w1aNC{)eH7+FxVddJdkR9dai~s?=gfRaY zcT?9>W}w~IZZo1+yq#M^o{S zX!Qttron0jJaosh3~)nMUf-+W0vfoQTk0N!J?Lz*Y<6H4tj4AK&B=A*;s(AOvjaHu zhZ#py&N8iL3dib>qS?wSS~UBpLvDfT=SK}#2HvuJyWkY86NGpI8;4m0EE01wbq`%= zMoMq8eJI-BzMW}~9GWnr;+N!+IadsgmqDCCX)LYt^Mcd1PjNvGSY91AgCxT)b<4JK z$HWG~4Gx14c16Vv%$3c(wsdR_AL@+`zK#iNUN4Lu6F*_*^P_pdU~eWLsx|fDAhNrx zRzH(Zh{?#C)f_!k2RU{!#lm?rVWN`ICDNw!M-d64Gtg8Rm&V`^1f}EjwLczN7E8&dxhODk385g$`VmyNvw4EF zxo_|>-78^u>y~DsNP&hN1(e&3q8STRUj1UPnx$xZmSc4~Gq!v6Yvl^Et@#|xzD2Uw zl;$nt%$S$43-AI`-;o+~;C;>YY6zsBx>dZg4^D>*Nk9rv_oN>a7fVGrWbAqN&uQL1 z&%+!I-o}fZ-xe8^-eH&I$BrRJRMzMu&HOMa%;|S|U~=p#zmFdBvC=!-zGtiOc|7Mi zRo1PKBd%P3i)CzT?6+Nd5Jdt!4J$_dkWai4*3tSoj=j8LaFStE=H5_X@;iqojOl z3LBylf~GQT@%$|&y&a8I4DbBM4>*L^^hH_FoJyQ^m&Tkz_b6^N{1V(3aUMcyM)Z>5 zVG+99?2buc7ykmy=3#=wJmfwk2ei5EovIHLj`^p`xJv+D7pQ&Og_U^?h%e6c5D)t0 zTSxkYI$oWL>mfE?Vf670#J}|n=E0*ih@QKk#rlkRfioMRiqSF{KGoINhr+<*sa{%s zVZ7h0me(VTit`C9gVAeC*8|t#_SHgWZOSet;LD0*CnM^knX zyI>LZ>nE$_uvJ8J{)6g|CM7=>^jMVLtzn3&C}$$CKnjxmMIfiZ`g%1H{|LSigU6-< zDK1hMEOId+7`>IMRoNk>L478|OBMfYEWg3>4e-$oU+F%8v5?n~GZIS}y8SCQ#rO6P zHJbLr-5p%e+Yh%1okQbSQ>Y!9&M z{3xM*!-9qY8MBqi_gkRDQggqcK$Vnd34>R0ZS|M+>A-Sags8%seyBgi8DG(9SD7!4 z8U>dfQUw=_)2@|pAX>HG?jD4m$~ES#&DP`E6dW@wePT1}Q1m=tf*O>Q8kX2BmxW%B zAC7DB=Y`^{*G=>D=?_MF4J}fh{~up(9oN>@t>NNY+@0VqrMSC$aV=8Z3naJ|Dek3M zvEs#DTY_70cXxNYY4_gWclNpW+`q#5Wi67-HP@6e-toK^qqkD`-S%BA?HW=qLGz&N z*#vH$2Cu-@=2F=BSMb@&GoNOM=Pu`>>w)(YrQ!@CTlEEEHJ|P%A(MXZ;aq8=ij!Zi9r7|D=vcMgY};R2 zYtSI#$p|XR6RvpmBX?GDr#*t6=gl`|jqpPqEFw^1;T6BW*MV7!l~yThi%tB~X7-Ep zh6HL|wfG?d}q82vLfGloEIlI1g5(93?O2BAgB2H=L+hY0yX{O(4)gc9*J)<^+!_?w!)3&q5g z*4J8`R*bQBmja_`SvPqs0AL0+z|5126$YF6$6 zB<@_J8{i9fkN7}oZBFqkY%x|h0LLY6JV{W}!rc481*?H8C<;~gmrBg6+=?XO$zqeD z%@;}0adbJ4dvtcY%8$3*@ArGq_j8uwx|XQ0QrX(}%HE>uRzX1khZY`(cJ{eXEGn&# zZFG+Bq;wPJ&>}VaQ3RO(h^BHCipR7U23AA(=!jlI)Qn!>YPS1HZk7wZGP~XH`ECdH zeNyC6+~eYgo7mFq51_0JQbL9_635q-xL$GptZr0%?mmd|tJ*~;EJnyjH2benw?7^4 z(Tl0@?SZy|@C=pjGh9c^Q0gbAr)Ntmp6A=olPf}8h#yh~MD4z|BEwSfgR%?3=h{|w zhcOGsl`W1Py~K7>RG%Wqh=`F%?AGO;`mY^4DxU&?BM|zQpU$IuHyamqz9&=$N*TAjoNG z4i&xB)ZXh`0XzN(zd$e%W zR~7t&gpBv3ah#&@@4EG^i?MeV3(qf4uZQyViXk z3Y)RXi`n)EozGD;x?Z$E0h>W}S6IwkE4-USYzz-W`Wum-xw5*)rt-9R&l!t-=LJ|- zRU*B>L>)V>F@h}6;`UI*4~BcsBr zCGH9BCHEHJ#yuQ^266rEG{bYym=|LHV~F?>ItS8V5i3FJ!Eo{NkXFdFcEM|pNskfi&Rv}E1p!=XzQ9yYW>zd5zEX4i1`=C z@HbJGVlD?M{Wu5OD<6C`pXh_gSNq7yHzfZAivN=F=uiZ@v2;yU4BGvj8~<#EB$h#y zjUA!WH{CeK07oN5D#bF+1{{%*5WrqCOhkW;m4+hs0ZD0{(Qc}wMS>_FpgKe`h;UqG zL2)C8c!v}i!wV`4^M;GT>|k#_{Rz5Zi1fxxiW@iV6(|->ABKmyJTQ6jqMR~+nBC<< z=u;J{Hqh6XSb)rr!4TtTVcCI~`I&b7a4WeF`>W&*J(?sMMAfOTlq%*6va%O}xIJCZ z04yaSpCo=TzZ4e@YltAB1jhvXC6=Wm*o-8f6ME?E@*7*YU!V7g9!+NrX?hU>74hg( zbF-HqrK;_@j*eosuBAE~4V!GAWB9v~L?7fT=_kx__O{Dhq?`82H73jIA}sk2hk;OG zj~{_5eGgLYVXdm7Pal9(fgj-Z(X$E#dfi&3bv5aIRbHf9bwfI9(mk*d(}vgKZOl3} zjCs=gN&D}3U?PssUUKO&8|KjO^o1G|(;&u)J$3CeDytzcaBnd2pirWN` z@%;*8wS~=w=6ElTU~f%-HVZ>Hi2;i370jkzC!&bE#yp#CabBZ(IQHxy!GCA$wO0^_ zKqBI_ni#wcQrKi;8{Ey@$@him&gRIyt;?5co%LKz*j7KTi7(vji5y^ydzYwUGvame zWK8v>C8+Q96CBNScn>p?m)9B?I8GtNOx0VAXrw%asRp!;F}s#1 z?jhsUQ)1>;D;_fFPfAKY)tm3|c&iu>OD4$Qt)(B7w>kBZHyx;?(_ue}dB;9I-cW?X zhqXBBnGGkL&EBp77D}bRC(lp1&Q;HOiFe27TUInIT+0lI3F^&1xhxIPJ6u z5k;0cjIaNUYrS`o>eUpiT$L}by5!Q?pqM;A#ZY`3f{#>ND8mMcX5J$6*uJ1y*Zw%{7fUC`K0 z8nOJ5bv$~kAHFHgUEP_SyQ#OvaoLo*>vvf$T$dxTB@T*Bkw*PKYw;AO`jB! z(fOAm&jDg5dtW!l?wI^%vCRtygZUvYa0`08N+|AIM(w6Ch`3Kor~(jx9Df1e3_Ks`#h3}v zl__JF+K+w?*vw)P3r#hbo!50NLnWd5mJw`O?R@DhH%M2V6znMgGWT=dmJYb2r(l-= z34D*}t;wkWr3!556%*W5gwgG7#XQ8kgp&h5`fb(rH%Clj%)r z)0Bw`5?uPjty%gWysa&M2{bQkHMK5;N=tcQcp|zAC62*FAdfYq&L~jjEiW&ghHlwb^H6HE>Mys-6VN~T_~F!2QW>Rvf-1DgkQzYOe!H-p z)q3RP){w8TnN@b6l+*9mc-A;_1tL~YyPqjQqs6daq#ymj+8lvBtj$*0^>AO-cvD+Y z2W>O9FIB@NoIE%o{O0~~fc?%^jzr_wQP8@SpuBq9@Vp7^O`c0?bWS%1oERz?A3wnk zov&?bSI|E%EVt25MB74iaJHaaO^N!V`2D&yByN}GP12;SJ^~8OrL_xKWT|B|tH~+N zw4}D8qOBKyDC7MBk7NCNVfXV(9E^xxDcZNk)YEy=E#>o3?sDXd(#g=2yBpc4891W+ z@`ml?V&0$j^Yndn%9}T|A6i}>D1KUbJIe{&aK)*X)H@i|FBp|NHe8z*9!eR6vFbJV zxf0_9`<{oVraqE%fDF9$?d&hMji@#c$~a0i3Sb4*kq8GS-^O7`up9f9jVjS;F*2r> zEwN`l!cW+h<%pOc^|m;yg5RYtQGsZQL~;u$H261Ll0;ZRS!UU_6I;=27|*c?)z|&G zEe=ypqk30z*_O?*`ts?E=(c6COeO-EH7L<_Ulm_K0};(6A?RulPs+MxV4>L z)M_V8F7zW(8okdl{P2t;{HeFC>SjZDo_LTX{k;(Bz=e^*{n@~+l8Y5^A`0n%XqfBp zqilx-7YPoU4G+#o3wC*@X3wJDk}q!cw##JKJtxa?hP^@#o3j+HdvmqwUWD2!YIaLc zM%qhitUOwuBWk}_lr^+CwJpfxFSH$Zxd*cNwhMK`n?+|kz-Ya_c&REeR24|u$8>RD%o`p z^G{e8v)I1C+$$)fsr+)ls#W|EVN;y4hW3>)7Pz{Ov*0xd@(#Swu*N8Zkz7OZ21t{{cHUQdk zzZ6eT8C9W5`9r}2&)JTrnUy+3+r&^vZ=2TO za!pBV5Zi3U=f1oI7m;HW{eqFJn|`I1CRE`K#h-0~&(=Si~QKZ@#XGHAImxuS&h1Gz6L zINvyzq`2b>g-(E$$*BZ`0Q4X-joX@#vw?e-yNc9WoHb$s#`UN3YbkrWec5qWr`A?Z zRS;;)rRwnfLFe93QX(IabvtjS5yEf$JRHpx1XlbcO~Ewz^t|S`aK86`p>_i{K8!J4 zd!lScNxoFb@ucG+Ysuw7VS$w>nfqqZ3WOC4Z0Z_BIC+oNvRl3~@0ISbT%{M%%=3Z8 z^IiK_^?So2$B0g-EL^V8a&7XFo6+xeg<1Av?{k-~_vsC2TGSnqs~x@^SLnZ4B5$vm z!smXgA8n!ii~0nQwz;5u#(1H1=K50r1@5~~M#;8T+WPyj`h1^fd+%WKMj|_X7~dN_ z#0ixks^}_T2|*S;hTs;WCpXaKiGc4f5Ax-_4daBqIx==Rnx?VzP`XEB|{P$jE>fVsmnlp0O_HN>ZLVn+(< zz-%VV$YWv=&ufWFK|8-9d<1v7d9RGdxr8;cu)W9nV=LH-cUZmIlIJAtt~t9(KYmLu zenpw<3sqt9HGO&{`YVjtumzD?KlupCF_$baxh9u2Lwtl2vpwz7?;jN4tg2?v>oV&P zjV=!NTK3DR1iOqM8kh8Uc;-{d+gDO1?cCmOO}PSO)|D3? z);V}Pe9i3%WvV&}(p=5l^Cn=6Ij*Um9C)#4R~$o6eQ$6XHNRS!85 zM~Uso9&I9!O*(~u^FS8xk<)-F^PW0v;i%%}-hb?UowUKYK=1Qa$DNz}(xsy4(@B1^ zaV1l91*A9{bOe7|z3D8F)SyW#4#to>w$#9XD%1OcAEk`o5fqVS%%Jr~f4J<9$0^OC z^WMvT_0+F)V5o9EYh&7Dvxv3%1)X`?)(Pd^#oD$c&umo}dAq8^-fgF&D))lP%AJGv zLtlXK497wV!do&_D*dEBTlH@e>58YUvGx~~04V%^AuB;^`MU5#&E z0U)>l#j`h$e*0vY8U{ooA~ZP@x#=UAz#Qdf-~SYN5RcVQyDLX_=i^F#w5IE4Y)o#M zG}DEUkxz@>VlFbSE^<>$ZCoR7QO4WTeQxHx@uaIQgdMxYNioxE_6$_H*VUFQ<6XD5 zqEXLN-lTQjB)5#?3Du>e5!l&`bg3fec@w>S3hsU_FS{z&@`LJHuZ(%xEsuiwc&j%8 zpN>Od20?v?Z+5<> z)US0*W}9dM(3;4Hg|6%I`P6bcc3)S{f@riW9wy|JeJ`8DotC3IPd`Yt@PnYdRXAzr zAnq8SAz|%EPU3Zscg2FNpvaq2rU+*#1X?1`jfTh};uR`jRjpb{P2l(|!PgpAErJNO zE*8`6_3PRX6dgVtPZ*=i4xZCmx_LrFZnlyN*;qnz7?-$5PX3QoPfzTkmHKrT%*@0` zf*7ndO#SZpo8^vqz?N8(hXSyfNb@X^Gy8l0Le@I6pq9(LzN3L@uzO+o;5um74~uk+TQmlyZX13cGEKHnA=imZ(Xs%#jNu>1yb`r#L#B?RQX0 z)qV9uCy&!?AhJHq$!Af~ei2_X{S1{mS*n>J$cSFd_|q`msyZC2?*o8H_fC-mYn@Dq za!j$WSng9nOT)^t@y&PPuhBjS%yvfv6_1Nw3c35Zp8OsXMekys4wHEuPL6pVbo}qh z(pyY(GRX<6XI6m9>AIu!>H0ehr5#?H4>)hE%~e??3=dOdi3$4rSxsM2D$_w3QQ6QBL%i=C;sO1;K=!4~=ws{l|Rgx9Y1P9(bGaf!qJO>NE ztnRK64&ttTc_z$JuUl>W$4jI$QRGoA!#?J{8W_wo2BKSDHONKsaue&MLQT>5{ynsQ z)<@!?7lnWmKd1Yrq0tm*N(X+|^V36x-okh3*2Qlm1kg8f z9WD>k2HSsBcNC=1;car25;PLcG7_8sYiX_Mu^5&0t(>_D9G=0b=0;=$0!4EnQkC|u|$va>#6xs65_8i?&v zC58cgqH;GQb)Xj3Rp&h;9W7Ap^BZ?&XQZ~VQ|cY-ijIW>gN$<-M17wqj-Ca{D-n-@ zv($*geb@ist!`G)@ummeTE0(G*(b4K_c}7U^!6K zg5DScU+8{xtb3w@-Y!Ar={g1Twzva)6Jrj>@IE^}yBjv!dUMZZn~wQ>ij}%~N<4|D z3v@eZ1dx)!nzrV662;VxstHWBLH2`Mpop7QOxJxo!>3hg6~tkn(4(lT7=drn2_h?% znzZ~1V%t6XafMy=HV6_tQ$^V<*`F#zY4*?c>}+R;@m?82H+WbLrn;bo&r{a)EE0{a z&z_c$)n4A*C#n1BQ4GsAEY$9mP=W6IWBtQ$?-WS{p+t+Cn-A5aXlZr6Wz)At=;E!1dT-P-RT7{C#4Hm(|DKak3=m6U@LTE^~__- zrB>yshe(FPzw_~4vtIpw*1Jj|I7;2K>)WLhKLVt69D0@6#U?k{oGPEYa}F0;Wv7Zw zd~`CDMC00INVfYBLc6LHl-4dcY&vIAN9~U)M7a5lg9~5>v(RwJ_F3<5;GJkb+f}r^ zhvd*}yCVq@gPzA^DeCy$XmTiB1^bl35Dn6jAd9l$9CRd$W2c4s;m<;T zkZ{Eh^zbxV#gtiyuI?u|;mxd=ARvK&&5#gMPmypq+wS+|1=9Rp6&f1qob9ujvsh<0 zGY?@M*g%x59h~ocAsC@Ded3Y)oakVx7|P8w3kne*x!XmoK8NFYIs`da37XoC_z!T$ zy|4LuE@ua*dZ0mFEc&$!EblR8pFf8_Wc!>)2s6Nx3$Z(dSroFmpTEz9D8!2*ftBYR z?wG$cl6;aL?B&d@Hm2P@)UXLvg)cLPZNIRqXwlU1927F4?_dnHVla68e~;-Kbrh}SK}REQgH%`KAvsO6`2 z<)=N_3KDVBI`@#d-M)ZNE+4g)X|cc$J7Xc>uP{MIL?^3#**J;S4c5leu4k*>AFy3$ zx9cDi6{d9f0P5MP=JD4bc|S9$tK&3)e#{JimlmIt^*$a>SzHy*+LsFWEsO{J{Q1|c zg?QkCkCvr{l)C;cXf25DVbsL8%j*RsM$$b1+b&?Ya<@?d@9M9{M`{BBkG?F&)>U%a zx^vsKxNV`7PUR|zAM&IniFX~>=AAH45#GlH>KRm-{wr4dt6`d=Bg=~g{}Nu zxLA2=5D41!Y`@6lC_FwsuKz9PxP}D4=ZzscMRr`O!`opeKl4$Mhr=DJ@eZ{-QFF_c z+aBJL?awGj!V9{hE^s}+D@R6$gK_lpaMS?%F;Abr=jLlIjyvFjM+Onro+9#EV>u`5h?e6K^*d95A)4dIX(71*`TH${ZlSBk#_I%5JdEB|4)Kr}_ z1{q3x^50@MLC)v5e8-zWZ)CKT^9spg{#Cq6rzFWZd9Kf33M=3R!Ye-dmhOmx<9{x> z`WtEqK$8+&-Y{rzL?f(%f>N37YV)Rb5#u+l@@aZgbXJQyJ$t?uMxpQP>su7tYX~?j zR8Ge~4FHQmMBkmz5@hLeHKsp;;wW-S?fuUpO+r4bJUO0s!9D1LOlHSBu7j7=KF4Z3|nHd$fu;h`kMN%=u z^NP>s(@o`{kNqbxt^1wGM~vk5Aga=JSO?py@&jP2+0ruojGkYihxutQKrTb|MTmrp4KJknUt`U5p3-}HTcm0LO{F1byRrfVkFXto8{pP4%h z75m{i|6nFdBbz2o%9eCy~m*#!krNCYjhc@+_Io|f&)T+8yt#l4wO1dd{D5pM; zzaFzpUnTlm7j{{w@1Gt+E^G@?B|3km4(^X4g2d1WjFH^N!?BDHNO&FJY?lqiy3{sp zpbI1Os(e+-&^<-jX|1c{=Bwq1rB6!5%d~L@0-g&+pKRoUxn5cN+_bEq%?wSYy>Pws zq#^B)kZPH&l8=ZCWuHYAF89N1In38G4%OMPAN`@q;BT)Ft+^2XMA*K33^mOfIYENy zXn;t#2r4&j@X^KjdN^k2lNJU^{klKlSq<*+BDs05_tf9SzTCzhA&TAxmK(R}cPOWX zRRg=S^lIM2lZ?pRM^HOwLhO_8-IoI$+yBHQXI{f7y@r5}IlZ5*X1X@cSAJsK%uRwuzvdM*H~6CLttEX&;6~lVX(O%j=kym zJ)~?R>=JV=ZZZk=Zp4D1I@`k(@oWp{{XiG~p44PpZ#b5u0hP+6blRl&iW-GOh)-C?j)=o=964S?Kac&aH7n~;V3gHZP=x4B zl_iAQl@o0WUte3%+&o}wXD69?iRhuuYqKjWcL~gA`<|(5g=@S5pf#+!Q)tF7kA?v+}g!e-{2eTZs&7-m01rR zz1E6!8y_W<&MaO0$w%s0x?q3ig1?ne)rx4o`aTi2vI;ZB3*H02>02$Nw0oGTbiDpZ zH~VRI%JZ;@hxF-X`lK#eaN(%mJ7un#Ur)VzGU@$^ti#t5imdrl*QNT6>wEf#Lko2* zB4JwWc7Kjg0r0+wO6Plrj~u`vRq$On(8?CiI7bP|cR+N4qmFiUs0~FplPWEt5>O&C zibr*Iu{U^CtKD?Z@=ZF)YD;=q*TAWPUC%xkcKD~!b_CQ&Df*xtqxg22u6yL=&mXm> zZY0&`8mUrAeQx);MKj^;7-brS#Y6cul`rYq4_P#<%M`D zwL?|hr8;xo_iSwFg$|kRJI_+-pFFbmtNiZ^DG*0*PzwAZbtF<*I`hwxvQi}n-YL~r znVLBwsLolXn_QWkQLaI`rTBuhH`L`9CGg4GQ_Vx~)1HmD1k2xTE#*8(%dZJJ4?dm8 z&Gb|e%cW(|fG;y-crI-ubbY=J2v_|TZ12>A`)u->-BM+U6j$PN6VrvKG2C`3q|3Zu z#|&)%NsO+GgrQhR3s5M=q;wMeA#nV%iZg)VT?@!}W$ z$3ZFMb29_4z&OXw^W3N({`YJkWXDTsm84?~>ZZ(0qo$6QAbYIu%n7y2`o&5=pXWe& zrz{5Q>s2F1X92EGkZ->XofPB5`XD)MZ(?4}K9xK9G7mlRL!RBcAF!^Zt(DLTndg8< z3jfEmRUfIl$M>Bsp(_NF-A>e}EKck|&YRw1dh9(usH%V;I6dT~fh5S#^y5zX%a`?k zLM6^M||<~p)6r~B|_EA z{Ye@&5<1^LL1%Qv$Qiy(7n;(u$J_JN4$=Xu@kn}s<;}P|C2c^^*l;wQkWC+K&PYhc z>niw%&yBD3-b=)U`P$i)3coyF09akw^8pl_qBBb0(}1r51+2597TD~r^KeZuZ2@vw@|tv-yKj~96<%qJ@Ud{hczsZ2Ae2MQTFfL{>XGh z8>bq2J+RRQ3n{50UqRvg%d{z8Jmb~LTVo4WftLg~;<1~~en;jk3m=K~YKlOiD!@>3 zGmWR)hhN-kA6T*9kVLl>!HXBT>r8yoW7uI(=h5#ua~Tk^lN7a#}BFAegA?Uf%_v%7=Eh-!KO9mu7ml7 zB?5Pj1WDLPCT%}6)?BR}OSb}ZqN*ws;B5%Km&~0EjaK5mpzX9<+Eti6laX%{_BK%Q zWXZD+ot!V<5i zM9w3jO8V*dnK@cQd6Pt*oJqyWQA~}Fy1MM@m&d0UGxm<#GU4-1CSk2fyNUGD{Jihc z>U9hkOHLiuPhE_q#ZHxN<8&``?8eD&l#*oPCCM5*N->)_!K5 zkL#(oX)UZ{Ft=e9vu@2{&Ypf>K!g?>)qX*_{4pP2m<=r=g5?zWx5gR{8p%=4{KGg% zTxBD3I1kj>FH_AUZ<#(loV&kEc5yS!sbSep%sc4ASJFQGDvf~X!%%Zhn#fwbmA|X z5ql#8dPL|v$htneWIg(EEN7gEfpK|Df-?T(z4Bmu8!dTf8oKm24LE%WCJ6leW#Q*P zEC7C?4rm67pQNNkvGn?bT~bHg2&d}}@R$D21*tHqqJ4*(GYak&&bqSm`X_T=m2GXDfoPr*Q}UJ zqe2%-jafY9j7n<7vG-{#uZ!D$mqJ1-=_LgsBHJM4zcY(MQ-T82q|KU9c1r^UmazQc+r?$YmT4)FhQ8m@Q!@Nzxd`A^4S5^)P?^>BdGd zh6vJCAaf*!(qwN-`W9d^{w>3B+0WI~BoxMc=WQxL+%d9B}!v zY~yNo+|>o9=sG&y<&~w0o0qV>aMS7bJJ|{QpK3!@k#EX_GlT^$GATw0yK)&Y}x`U zzFx-;*!hbI9Od2LGzBp+$+LZ9h>H>yDGN7l2mu4Wl?fArfiF{&X~5( zL*pt_9T%j=JgC_jXnW>+Xf9zzPD3v?)R5i9sc20!AiCFLoO{Gmnkcb)E9LufpE$X} z&%nFk$;AH#vOS)TI_0$#i}YQ}EVOWA^4YO^ojg6YWWLmvS)EacY#ZF}1;dnV0uJaO zM)lM@2Up-biD&?@O?L3^mnQ_`da%vYISW1P9&^z~cW1OGh`Hroa23XL*co!pAzX+* zd6!!sBo0{_RI)IF?QeYjt1dC-L#geT1*Z=I#JACyu-=cD>yM&68*!4WB9>UUOX92K zZf4tC@ly0z{QMOWFxRVw=hFsGnaVIkql+*Vo+D>)v4M9&%ZGfMQ3RFHR-}IZU@f!F5zilJ4#{2HXgDE&}R z(*stZ|4dJTo2e(!lT=QTe^1HWAEDp`HhB{b=~^+n;~L_s<1IdNSh)^JManZ1?*PT^ zXDi31zxzTILZ80^_+hXHX%Ze=|7uK^chdgg$hQtH(JA@yLmW76 zVRDcL8^ePxR>`ZM;$T&dUkN=8D3K)@BzeCPIO01HAh&%cJs)6*V$AGf7O6ZNj21U# zxKV%&OUU73g*`0%2Bqp_KO2q_-N59Je9~%iMtr(%U=A2fuL`#Hhxx-b*$Ao zF9dwOy<#)pjY#IfA%gSr>ATcIu9Qnv%n0je`Mts9hjOS@F*>64>I9J5DN&Z9SSSzR z%jqO^qU~XU$T_gl56je0Tn)jiI!Z3|)z)j;3L7EkCX-3s00mYAY`((u`_^#xAu-Iz z@7HO+&{Bqs#zh~$ zjWeWw{IrP+_>N^?+&W%R+ZzzR0*LS0V`9xmv%y(HnWF+RZtBP=+$*h?v+^h7vIvxU zSabFU^rU%yABB`zad~!GQSoDVT8I*#3krIamfJ$iXT-5ZDyjvmj6`oEbeCQ^Ctc>z_&suOT4F;#iiU)qKl8a8q(QGBt!!$CaM? zN*$hj=X{3!*NDBYTqgvUjNJbPYiZ4jpi!(=5Mq$oOuq3aj=lxx%*Z0RP|T{fKp!zA z{rRQyB!*C~OGq%S3q0!v7U)3C#X)s@zrCMt6*DUI;3@%n;zL<`D*+0ra$BpK*}976 z^^Dmw2jx@P(fc?22m(F*<{pPq0j7RLb)Jy?1a5_qq~6N3VeZ6TV4gpI7e|0p>pJHF zAX~NQ>AYp~KeOm}0Nm$ENd1oxSA zNPq@qU0SEi3DSpAoibg#^Rc&dag&-RCImu-X|3WylBWq_{nW7*ujTU}8#eKN!Vw*b z+DDMjB*9`uSqU|72u&0ATMk%BgfG6b;LD;=k^v+DBC2p))6nFKNva9Wvb%$$gGLLLpTz;bkZ{w02-(mheR&S0T?P9^rc=6J&S5AF{HUD7#9=Bp=Nh8P5P%Wy+4T#Sp5aon6@Owtl}aF?#xLSUJt`Je@k z8kswmBO_Z(xSEiKy&jUyhhZ$0ddh^lBF;YTuXzd6zqE7Djq$7Wh~M&`XH373Lk?pR zluD5dS;x$%9H!#hvdNN)iy8olzc!av-*}tVt5;-{iMts}3Ii`z!i*OE%QH+Qr&^xI z)GZ#Tm;giZ`L{5NDdo{4KO|xBr`~G79j=~ z3wv1+L7BD3^_Qka^!jUKzj0kp;c0uE(%LBsKV9S6E2$;qU@;?3BXONr#+Bly5#Y0~ zf_}U#i#bL%&lI0@i|iEkDOWb$2MI9AHajai$qOKPAqO*ORa2%~I>?W+Q^o6L4WblA z&9i;H5|fGD^;4;bmDF{{B+C9dWiZoPjkzxnT1aGpNq!Pl1LseMXYG_AF6tr|$+{2z zm5F&aK%HgqS+Wk*J5WcX8@}yws(>x%l@3fZvqf&}`PUP+^*U#O)_r9JQzQxtb7h}+ z0gD`sBK##MXCLxdF%(T#d>|1$_@vv#5tQ`zuulm0*$$Go?s%n|w=RYad$B-td9WoOD3}s~rg&NZ|Q=N>7{RP$7G}!pI zS0Axq-ML;0{KD;zxjN|8C}y_6-b1}uB&YT4*`gP4EL$8eF@cS<0kdPuz zoG3(BErik^&o>aeweH?WgMkrAC>K0Km8f{m#R(~3bD#|FUl>oYUnioE+cY1)8RAkc zJp>PC^qV_4C|5?-n=btJ^g*&Xe@9_sW|~XxJ_bnJkRlV5AEY7lmH6JTYHa@_n0j8E z6vua+KlWM^(J~HQFg|L{k0sshcud7U>K5$U^sNlCM2@4MABumoNUfaIx|VSp&PgMP zih1_MXBF#!mOMAJ*M>0?XlyFBB6f;H;j)$$c0dp~>x=nC&*4xvhtmN2E~58M)(;@H z$!wRod5>{+Y*^?@NZ`Hf<`j8rk$Zf%B3^V(CR`3=|i7mhRN;l>3(SiLN8wX%nT$hw_X3+hikMne1#g4w-UE| zf+V|;RGq8U>6_R5&j|dnG89kM3Rzmq(hBniV~>(_b-0v33kHwNU@o z??%s-F4O%rwP3;3I|$Ofeq4dG8|V+0``Xherz=L|tnz3fixOpHrfIHcn3_s47;(mF z1oC0Y6H>l=(lrJ(_YV-IH!Mz{op+y`H_N^4t=+onxzLpr>bX7NnDyS8+1lY$joKjW z(j|c?dHo^Uhc{;eDI^R0^@nEz=Z)<6feVfs@^OktW|%H&bdxhYv%DRbvet%hsxCra zXCulql2lWl^V?3J7Iim_*ZaNM@Xpy2Keo#0wno~yDc`GL0?IC$qP4EqgPB>ghxcUb zTeIpq-P~a>Yw@Sv@>bj%&Tmg@N5~P#lr;164rduY>&96TrO*TQhaAM0XX938vvy;$ zFKE(-rq6yUVNND82TFyhsmjeIgg+=em3}X(oqwB*FIcNyb#EBHa zmal&s4V^}XeGQ{5d}X}#Zukp#V5MvpRsuO90X{zEG~jFoVnu0e8d#&5EHod zL%er9;Z6qTM9NI&qWp3d#;C*3*=n=&-kwAcdysjBJdPv_y|HY1l>KDS% zyID0q_G!uIa1&5QqKx@ii^}(ILHx0?UoR^!=d5H>oBI?r0?o_f3kG11IIwnNl6?@z z8QE*KWs4k!iuGEd^qYmkek*PAze<5R+yqOWC^7&Y72~ zmk(McrxIj=#Zh8S+sAKvek>gSS#x(|2AoQ(SXQg4d{s?}@y6UVmp?xjN=$}76Ea?o zkULQ&9)Ll)s~I(-_Kg1>=Cx!2=l@4GQmI~uSLQK zNB@GnGEtqbytH(@Hs%{cVAmJ288qS3Q*^Xg=a_4YaLa7T`%?E~SC3$0by7KPyt#)& zNmV@jD3$zfD&x3%>l@FnNtwKeX=P0N_`(bRK%6OrOju|E0l*^=Qp# zGaI$1?jRX5BN+~x;Lj+KETR8%$v>2Xfcm;ui!5Ms1h&^})QS3-h%ZzUxwlD^xZ&$u zG(~Qk9evR(@C;@9oK;uIIMg zllp`IS`!9PI}cNKh8Fwx6{f|Ft!+WN&DfuAbMnq9`=3*OtL1eF14HgVDq!I5>K)@t z@aN2&os?rrdxg$I^s4>G(dlbJeF^)JafOFh*iP!yLq#YnB9y(o8G2qwW2Z#^D_r^q zVxZrgZbC1}%&OI`r-&=nO8!(HEgIBI7lhQ)k&Xvz8>P!2QXowCvkheqGw^H1COy=X ztjaON$K}zup$xw)j+o-8@F06R#~hs4w#g_0f9#(y+)P$pVnvnYLE6u=GWTG++%5;>y?{wS<40& z&cC%zS&rJvJj2g#YVpI&{2m-kN`*H(`2WY<`+xsG9pu2JLbv*7;1qm;WRa(*_Plo6 zZ`>9yZ;WAF4>f6EaX4h(pjkE3HvI3F{`Zk4exNJ1uU^euX3fy{6umR)5%+@6PkYtE zOxpQOrR-|SZW80)8xTv=+rI#n|GxacN6ysL0U3&yQvS|?bNfv@4fqn7Geg8!d$QQC zeT|2U23s>Q5>1rF;e2Yw7-#pEE&eqa{7pXj`z5eA0_w{yoX}Wr!tPeMbL^Xt&-6{_ z5LTuw)hhX(X3a|5)PFzsf49sc=6^Wvg9MtqQr_P^sGrx_YKW#HG6uW%CC=d^QiI!w zTFMo=Yg^G)(n|6czs8ckCMz z%wRh9lNArv)9Ngk;oo-*LN`71bov_={QvnVb>d2WWizNn+Bo9|Lw+^{(fXC5pU98lVCL+!v+`)JX~FA0tlXc$DQ$p>85f0WBDwQF zlL!Pf$qJ_+T^c`fRC`Z6j5t)CCYKXw$Zo^clteYc)}_j7-CFmjXDHFaQTFXjMa_Rd zE+ac0)W4CVG8{`{p8whG6X)ildRhF2s{?Y5qnwEIB=OI4=R#4ldBQ z(X=Uxmm|-Pcex{5cHdU|)<-oLJJ=SsW&TrG6Vtgx)hYD#D@Y7-k>xiFTDn(O@^1LE z8waj-r#^r8&lwyT%&nUtQuK<0e#eF>tXs+7x+@A8_lk)>i@DO60Hn(|Z<@$gQfBmI zvUapwReJ@6<(m7}SV}2Ia~IgnkVU`uBKVoAV)qQbHa?HU4R%`mxJH%MGwAvbuyY%9 zcKosN45b-*|C>W1&jwTdL#}(Gsr^$TvG+UIPoEhK^NUbXTjWBkzNx%rKOuxoTwYMHE8g`wzf9iAr_ zdrN8jZu@TUQw2|aE;5UTrIe%86^$Co-(x$7N-xClgAoXM9U{g0Ov!_=EF17U%u86A zmWv{4jl`k0@fb>KaIUI9eId-7)_0DbSDFMXI50DLL3m@ZPM4J4dZ$KTUD<&q<=7nP zlu*z}Vo)%c0iF0TNPC7Tm;q35Ul^c0nT-HRgBOO32BJjR^IVO3j=2+~m4BbCj@(G; zWT{V2`zU0zf)ms*Tc1?KQYKp-D)raDf`X%r^MJz~pKu%?;(+|E0>`w3`Jn~kVg1ZM(Q-?#nzARf1wFhPWF9`^g~KVMD@Q%tS` z2EFk2VgBnt1u8F)8Ub$xt3dOGKo^B@veoBy$=^Q#3eNWbsq3o)qTHJQ1yNW~fki;1 z8$`eW>24{Nu0;_P2|>D+MoI}07NnF~LYD4QTDns}I+l=b_?~@V;okfH?$5tgeV+52 znK@_9%;!wVihm!kbcgL9N@jZ(_kX?r(ffQ9cF7C$A~GyNuO-2=>7rg6gM}I$HJK|H zE7>?X_DTmU>^&v^I|^MG8BPm1B`0krdH43yv9(yefH=98S8wj#kv}6aQ|1DFm2PSC z6)-`%NIZ)w$PQnVp4!pX0|mXp)u=lOo`>G=vLVdZ|3f(z z9$kvylZzH>ZQQSHsIpo3wZYj~ZaKyJEzg|Crzxep)&HqU3oU%WhAljw7QsJWc=Gn!q2bG6<<9vL zz1IA%w^edTJ2F)f&8YOy=c@OZ*^2Z0}$D5srViTBJx9Rgsf_a(l zefD~R1FWicG4)&W6{f9a&2}NZu@@v=Tsp;)|5}!Rn*zI(_@us>SwDM)X*UC zWi=mXc`Rihm&4^~0$orjlB^{;gOW&jc#scQ&Za2~@mTP3cSl52HD-4?u2Km68$0CL zflid&y{J^UjET->lzo>=?fA2s#(nP@CR)z2@f}66S^q6cUbBy!2IYNPI=37$_2Tqj6m$(n;y76qFc!{(Ujx zkwpKNDxg66szFB)yM@ACNTnDfFlHhqXvqOotr?AX9ACT@R?6iH{$g3{3jvYGrHg5? z76)64#cumHhl{EnOCNG7Rs{i2C-ZjgY3$arK1Vc=GB<{Q%^v-uznl=ZawUd%Rnu)-g@ zgcNOwNK7>B4wZIfkg?-r8{sDEtYU8ifwq0fJU>rX&#+a6TyRnRk5&F( z-~!?ruh197@K7C;_Jj0H$%Ol8i13DdYfC1TtgQEeC)UMf5W-+hiZZAefXq#fFbjKt z+F1kDaMxJ=H%UVFQ-Q3S%l?~Yr=UJ&;d@HH@)@h@{l?X*T^Pr$TQ&^)prFvJ2v$`T z(K}G)Ri6U!*e# zJ~TLGI#QHRCz>Kehn>9Wn=kS$+$~aEQ0cN>36Q0BO6x`m^QZOCI%grCFw3v zAP8Iv>{CeCVhD?e)tMCjZ6E#Zr?S_#&mwJ&gbyg4Yjl2SvYKr&ls7u9Klhs7!(L&2 zVF=%jY-L-2@X3B{yviuA%XA*D8%)M&0V=z%K1vwbNK&b1N>C)~Y;Lw*9}X2M=h~+ad{xp%PAsa2*QfU3fV7RkI{eGgiCD~M$)Y@sUoy8gR`1bb29Sq;X@^(e9_6STP?dFFGORj z!m!5up-nLeuh-7f%szV7mtFsgJBh=m-Wf8MrIq8bZT1x=J?LzBicEB0^0iD|l@Q@|M!sB7U3S3Nu_O+f87Mpy3Jxt~dN5dE$!qd)470<@=on9WuWWdK9>H&0N zwET>T4mHDxP0`dvj%Cp&J5LG%rCRQ54w8&%anl=2<>BZB7KQHs@x@AyYio|yxZ=Nu zKJd`j*I#8H%huyV1LZFhMWVw0-A`kEd|0%mGb}b1?U?-9*2d;m>fr_yt$`HViODZ$ zO|8$3=3aBQT0a2PRVM(&$K%|*yE--sHkJT6-wDv@*3VuSvRMdI3LsNkll){zNvMfM zXzq42fwPw;_{t(?0WXDn9(B)#qqwOKI>L#WERHw66i6J9DU6xS;+|^|^ zleD9OU=?f;8yKdmLm`cbOEeCe*L*-5l$zDQDk^#eb6p`Vl3in_$)a6vBrfWqd;Dge z)Zc(+3juS<2&T{BUk=1uoD?MPuHzZX;Q}IEf-;H$g1iJ7>9p*eQ)AheVoCZq>Njof zR&{(zVmLqcyYRs3ro<9dmZWRPlUJ&7PZ%CUelo%3(+sUttBPLewpNb5^Syz2P%`#q z+?%%wJnr-Hj!Jp;v!w8)42kDn?6C6X)rz%Zpz23pPLr2PN|C$T2rc`PZ$570mCjsi zCx>fm8-rW^m7PTkbEt~dB_rROlLNFvD`&}2Tg?42hVZZoPg~Z#y^1=KA{6O!7<%TPuEC+CROwz% zDQDb(k89hbz#3yzttgGi$jPfeYTh^*a!o@Ixgrm3E$GAW0AHlp!f}C-Cr(Y$MSjcA zo_&O>G67*|Y?8_>K_H<`zBnJWJ!OGLztMvZof~pq9~r_*zR;x}D82*2MNf*tK&3O$ zXOTOQ7L3BCxc{QG^RtAHzApdmAD|8ON+YF}U9fM9V#O^21i}0!A#+jsJjmR#!dM`X zUrQ0vzp*ZYJ`~X5BBF);`NXx5PJwwUwXcqbqWZ`Q#BO=xH0?Di+qS!DxR85(W!*z8 zstFdLg^k^-mYj8UlmBd)aH^S=96z}RSYD3_6wO_+oS#`vyh+92qQnyyAVtTh%|ySk zrW(ia-c~oy_t=}T8h3wx-yOjTcEB9Y7GF|&dNV$L@a_90%Ab0l?wub7bOLy8H7=1N zcWmFfk{agBaHxC2&^ZtL6habu3GjG0u{Rc!w{~A22t_`B5xQpZk?6`;#QtxVb^K;M zK?{&orcg`Z6cRnwLUy|qpIp_c#tH#-weD;5-Q-AKy$>Qyo>i$R=3ht`%9z9Kn> zslVyv#SLF?%<2z+^db*d;gH??gF)t{NdzpdEa067O{P)on3D-UKEBd=ch>#4PWFwI zO%LL)KxasEMActfbT83g#pb2|Y>Iv3e7pbCRQizcEmDer1KUUwS+F6iHN5l*2Xlcg zk`{nE_{bU+fZBvsWHE|oDQTqnGX&|-C`)Szh@_{Zx~OuLzz)t7`Oi1ycrIt_m7sQp zlKQ1?;+RQ#c5(53k)=4_c7O8%x_t30ZvDvB@QZP1?(ib2kl}10WO$4kiZ&6NiPGKt zI)i80RiG9q0?hA<#eIEOj^9e5gB*|rIJT-?;KD5c-UFA39W3onACjs5jVM!W98Fy8 zgZ!)QKjkX}P#0G`^unm!+R6*ZEvT_2L@1QJo$RFwnWSnKF9KnY0DYk5da@w$Z$qWu z1s3NxJ)Xh%-MzwLC<`1;L~|Vb)VaL>J5t|NmF8|$df*d_QC1sS`Di zew^JQ?O;yW7p_*SJc`4(4qbh~?c*z=FcCgq-e9D&Qbhv6Z*gXnfwCjIr$wKAlKhYXTsJYKRK9N_8 z0l7LA#YH)x8yVE6fw$}K{*yYda;99V*Zc6!C2@JfGJ1!0L8S0K!?dG-M9j>4{KXv( zu0)1oB*Dh|OU9Pk?~=s|I<75v0$RlU7OkePZah3Zyc)Oh@ZF%CcUeyre~#eR`aGNx zHTA2h&~U=Sae{ZOXk~<8Jni;XX(xhWikMlWlLGE)qcMkxI`U@(e~^(sCjI9Q2oIrT zh25*F;V4Vf7m9;1mOm{9@@5Ab; zx7hdxbhK=qcD(mB zqs*fsBA)9E1Jh8mm=rW~R8g_*75k<0eH}>mt4VNF@w2+O_}upJeO;hQi(dDR%yNwD zTa`dq8Ebn<)Z_9J!xz86Z1;c+Ix@ ziEx+QT(ni?@X6u+>1```LXp*kDAA9>OHTJ3;2e0q*O=WhQZ#pU6Vfg&;vCe&P?4D z_n7n}zy0!XL#!3Ld-s3T_*EHkN#}V@=GERumIEo&&Pj^Wz>{4e;ac5Xf_1L3KH(P= zo2Wim;uy6bG{`n-rJHLfi>T`dGF=9Zc8ZHFM-OH$4~rge^$sM<5src+@uXr*o1h_3 zYS|K*;9}Od`6Fs5Y%`D6`8g#J--L$_xjY#DWx@edcugj5V%!huoV zFtb5z1C_aftTZn3R4&Y16;z(u{!(_Yn_(|z4{%M0hShAlr|UhxYU1dwypt@we*Lp!l6 zIH%%4m}@q};jiyLE9GdEt%?TpdC>%LZZ4DeSXFInR{ZiNFv4F1Ne%D72@H1tHG0ck zN3{&${eDG@pvO#u_J>zU`Z?R~BpHXXn^~{n8F94q0Im$hz?JTRpCQM=Qg{BSZ&Q3xY?a#b;(4D?JGF%=th#e_MZ+M+RBy8ZKNR@D5a0f?P`AN5C z{DG4>af%hWQ$fw|!J1JqT9-7*;z6-T&}EYtiS!#+{+A0kqdZqvuHTd~Iso3?;>`)r zscU7o=Cle9P(gaR+XcWjo=5}G6~6r&fKv%^+xx|b|HwK963#^!x)1wBgv(XzdR8yz zw|;fqU3CC&RaD-8*-_|mvYEJps5xpFBe})Xbb35-I=nnw5I-H+di~%_^jhXL;07YY z3K|5Wo@gtmPWPI`mUBFgvyK7mmH#+dc35bwa=Hgoe*&~l`BdRgE#_Vcu$~S`Yb%1= zao-&bKUy>hGpBXm`;xVJfX)HoOyyGCfcXnNcHdg)CLJH$(2RN>-7?`kAOF3| zw)!f?y?UlOGq1tM;#2S#iU5CfYW~GHPpk(oJE%DD#~%^K*3SI|FitV3^1%0&165kP zh|@x1E^1Hf0bnP=Je}RQk~G}tlxd!Sc;wzJKYZj z?ZDg}0NfLcB9ECLt?}^KeKhk?P2~+kSq~=d@DL~?rFnH(*z~>jCV(4gu6MEi+y#K( zaC;<*!fJBUrPR9bv0NGM)d~2nK?83l-<{QRG#5$oZ{9S)+S%r6Ra(dF{e7qP26F0M?wX?>hY7f&bFYZ zd(zDT@wI_Wb)bd$qZYE^kc9((4Z{>0Z$Ih5SyKK`JIIP4(&MSR$|1CaIjL1$)4OUa zg^y6O(pSbV-ir96kmc45%DYQj8&vXh)U8-bc1I8NiEMf$9BF$Wec f7wj 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 N1sN4-l;l(I{{v!X3uFKQ literal 0 HcmV?d00001 diff --git a/docs/CVAT_screenshots/11.png b/docs/CVAT_screenshots/11.png new file mode 100644 index 0000000000000000000000000000000000000000..6fc896874f2caffde3730e34018be7abf8ea14ed GIT binary patch literal 497569 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�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