From 2afa71408f109847656e56d9accf179fbb8fb269 Mon Sep 17 00:00:00 2001 From: Donghoon Park Date: Sun, 7 Dec 2025 13:38:42 +0900 Subject: [PATCH] add performance comparison graph and more tests --- README.md | 15 + benchmark_plot.png | Bin 0 -> 80710 bytes pyproject.toml | 1 + scripts/benchmark_interpolation.py | 80 ++++++ scripts/plot_benchmark.py | 113 ++++++++ tests/test_data_table.py | 107 ++++++++ tests/test_field_view.py | 61 +++++ uv.lock | 423 +++++++++++++++++++++++++++++ 8 files changed, 800 insertions(+) create mode 100644 benchmark_plot.png create mode 100644 scripts/benchmark_interpolation.py create mode 100644 scripts/plot_benchmark.py create mode 100644 tests/test_data_table.py create mode 100644 tests/test_field_view.py diff --git a/README.md b/README.md index 64cceb6..de1420f 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,21 @@ FieldView leverages `QtPy` to support **PySide6**, **PyQt6**, and **PyQt5**, pro * **SvgLayer**: Renders SVG backgrounds for context (e.g., floor plans, maps). * **Minimal Dependencies**: Core functionality relies only on `numpy`, `scipy`, and `qtpy`. +## Performance + +FieldView's `FastRBFInterpolator` is designed for real-time rendering. By precomputing the interpolation matrix, it achieves significant speedups during the rendering phase. + +![Benchmark Plot](benchmark_plot.png) + +**Benchmark Results (100 points, 200x200 grid, k=30, NumPy 2.1.0, Apple M1)** + +| Method | Time per Frame | Speedup | +| :--- | :--- | :--- | +| **Scipy RBFInterpolator** | ~1616 ms | 1x | +| **FastRBFInterpolator (Predict)** | **~1.2 ms** | **~1322x** | + +*Note: FastRBF requires a one-time setup cost (~1.8s in this test), but subsequent frames are rendered in real-time.* + ## Installation Install FieldView with your preferred Qt binding: diff --git a/benchmark_plot.png b/benchmark_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..251279c8ca1c4ad5cf0e7b5c991bbafd5a28a299 GIT binary patch literal 80710 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%0A50eA$|yQjG$n#fCCfFlRRp755|+t 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 R!|3~+9FF|6(k|eqe*@n-9#sGU literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index c280def..a3e042a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,6 +45,7 @@ dev = [ "ruff", "mypy", "pandas-stubs", + "matplotlib" ] [tool.mypy] diff --git a/scripts/benchmark_interpolation.py b/scripts/benchmark_interpolation.py new file mode 100644 index 0000000..695ba42 --- /dev/null +++ b/scripts/benchmark_interpolation.py @@ -0,0 +1,80 @@ +import time +import numpy as np +from scipy.interpolate import RBFInterpolator +from fieldview.utils.interpolation import FastRBFInterpolator +import platform +import json + + +def benchmark(): + print("Benchmarking Interpolation Performance") + print(f"Python: {platform.python_version()}") + print(f"NumPy: {np.__version__}") + + # Setup data + n_points = 100 + n_grid = 200 # 100x100 = 40,000 query points + + rng = np.random.default_rng(42) + points = rng.random((n_points, 2)) * 100 + values = np.sin(points[:, 0] * 0.1) + np.cos(points[:, 1] * 0.1) + + # Create grid + x = np.linspace(0, 100, n_grid) + y = np.linspace(0, 100, n_grid) + xx, yy = np.meshgrid(x, y) + query_points = np.column_stack((xx.ravel(), yy.ravel())) + + print( + f"Data: {n_points} points, {n_grid}x{n_grid} grid ({len(query_points)} query points)" + ) + print("-" * 60) + + results = { + "numpy_version": np.__version__, + "n_points": n_points, + "n_grid": n_grid, + } + + # FastRBFInterpolator (Local k=30) + print("Running FastRBFInterpolator (Local k=30)...") + neighbors = 30 + + # Scipy Baseline (Local) + start_time = time.perf_counter() + rbf = RBFInterpolator( + points, values, neighbors=neighbors, kernel="linear", epsilon=1.0 + ) + _ = rbf(query_points) + scipy_local_time = time.perf_counter() - start_time + results["scipy_local_time"] = scipy_local_time + print(f"Scipy RBFInterpolator (k={neighbors}): {scipy_local_time:.4f} sec") + + # FastRBF + start_setup = time.perf_counter() + fast_rbf = FastRBFInterpolator(neighbors=neighbors, kernel="linear") + fast_rbf.fit(points, query_points) + setup_time = time.perf_counter() - start_setup + + start_predict = time.perf_counter() + _ = fast_rbf.predict(values) + predict_time = time.perf_counter() - start_predict + + fast_total = setup_time + predict_time + results["fast_rbf_setup_time"] = setup_time + results["fast_rbf_predict_time"] = predict_time + results["fast_rbf_total_time"] = fast_total + + print( + f"FastRBFInterpolator (Total): {fast_total:.4f} sec (Setup: {setup_time:.4f}, Predict: {predict_time:.4f})" + ) + + # Save results + filename = f"benchmark_results_{np.__version__}.json" + with open(filename, "w") as f: + json.dump(results, f, indent=4) + print(f"Results saved to {filename}") + + +if __name__ == "__main__": + benchmark() diff --git a/scripts/plot_benchmark.py b/scripts/plot_benchmark.py new file mode 100644 index 0000000..c502630 --- /dev/null +++ b/scripts/plot_benchmark.py @@ -0,0 +1,113 @@ +import json +import matplotlib.pyplot as plt +import numpy as np +import glob + + +def plot_results(): + files = glob.glob("benchmark_results_*.json") + if not files: + print("No benchmark result files found.") + return + + data = [] + for f in files: + with open(f, "r") as fp: + data.append(json.load(fp)) + + # Sort by numpy version + data.sort(key=lambda x: x["numpy_version"]) + + versions = [f"numpy=={d['numpy_version']}" for d in data] + scipy_times = [d["scipy_local_time"] * 1000 for d in data] + fast_setup_times = [d["fast_rbf_setup_time"] * 1000 for d in data] + fast_predict_times = [d["fast_rbf_predict_time"] * 1000 for d in data] + + x = np.arange(len(versions)) + width = 0.15 + + with plt.xkcd(): + fig, ax = plt.subplots(figsize=(12, 7)) + + # Plot 3 bars + rects1 = ax.bar( + x - width, scipy_times, width, label="Scipy RBF (Total)", color="tab:blue" + ) + rects2 = ax.bar( + x, + fast_setup_times, + width, + label="FastRBF (Setup, one time)", + color="tab:gray", + ) + rects3 = ax.bar( + x + width, + fast_predict_times, + width, + label="FastRBF (Predict)", + color="tab:orange", + ) + + ax.set_ylabel("Time (ms)") + ax.set_title( + "Interpolation Performance Comparison\n(Grid: 200x200, Neighbors: 30, Machine: Apple M1)", + fontsize=14, + ) + ax.set_xticks(x) + ax.set_xticklabels(versions) + ax.legend() + ax.set_yscale("log") + + def autolabel(rects): + for rect in rects: + height = rect.get_height() + ax.annotate( + f"{height:.1f}ms", + xy=(rect.get_x() + rect.get_width() / 2, height), + xytext=(0, 3), + textcoords="offset points", + ha="center", + va="bottom", + fontsize=12, + ) + + autolabel(rects1) + autolabel(rects2) + autolabel(rects3) + + # Add speedup annotation between Scipy and FastRBF Predict + for i, (s, f) in enumerate(zip(scipy_times, fast_predict_times)): + speedup = s / f + # Position the text above the Predict bar, but high enough + ax.text( + i + width, + f * 1.5, + f"{speedup:.1f}x\nSpeedup", + ha="center", + va="bottom", + fontweight="bold", + color="tab:red", + ) + + plt.tight_layout() + plt.savefig("benchmark_plot.png") + print("Plot saved to benchmark_plot.png") + + # Also print a summary table + print("\nSummary Table (ms):") + print( + f"{'Version':<15} | {'Scipy (ms)':<12} | {'Setup (ms)':<12} | {'Predict (ms)':<15} | {'Speedup':<10}" + ) + print("-" * 75) + for d in data: + s = d["scipy_local_time"] * 1000 + setup = d["fast_rbf_setup_time"] * 1000 + pred = d["fast_rbf_predict_time"] * 1000 + speedup = s / pred + print( + f"numpy=={d['numpy_version']:<8} | {s:<12.2f} | {setup:<12.2f} | {pred:<15.4f} | {speedup:.1f}x" + ) + + +if __name__ == "__main__": + plot_results() diff --git a/tests/test_data_table.py b/tests/test_data_table.py new file mode 100644 index 0000000..17a6a0e --- /dev/null +++ b/tests/test_data_table.py @@ -0,0 +1,107 @@ +import pytest +import numpy as np +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from PySide6.QtCore import Qt +else: + from qtpy.QtCore import Qt + +from fieldview.core.data_container import DataContainer +from fieldview.ui.data_table import PointTableModel, DataTable + + +@pytest.fixture +def data_container(): + dc = DataContainer() + points = np.array([[10, 20], [30, 40], [50, 60]]) + values = np.array([1.0, 2.0, 3.0]) + labels = ["A", "B", "C"] + dc.set_data(points, values, labels) + return dc + + +def test_model_row_column_count(data_container): + model = PointTableModel(data_container) + assert model.rowCount() == 3 + assert model.columnCount() == 6 + + +def test_model_data_display_role(data_container): + model = PointTableModel(data_container) + # Col 2 is X, Col 3 is Y, Col 4 is Value, Col 5 is Label + index_x = model.index(0, 2) + assert model.data(index_x, Qt.ItemDataRole.DisplayRole) == "10.00" + + index_val = model.index(1, 4) + assert model.data(index_val, Qt.ItemDataRole.DisplayRole) == "2.00" + + index_label = model.index(2, 5) + assert model.data(index_label, Qt.ItemDataRole.DisplayRole) == "C" + + +def test_model_data_check_state_role(data_container): + model = PointTableModel(data_container) + # Col 0 is Highlight, Col 1 is Exclude + index_highlight = model.index(0, 0) + assert ( + model.data(index_highlight, Qt.ItemDataRole.CheckStateRole) + == Qt.CheckState.Unchecked + ) + + # Manually add to highlighted set to verify + model._highlighted_indices.add(0) + assert ( + model.data(index_highlight, Qt.ItemDataRole.CheckStateRole) + == Qt.CheckState.Checked + ) + + +def test_model_set_data_edit(data_container): + model = PointTableModel(data_container) + index_val = model.index(0, 4) + + # Update value + assert model.setData(index_val, "99.9", Qt.ItemDataRole.EditRole) + assert data_container.values[0] == 99.9 + + # Verify dataChanged signal (optional, but good practice) + # Here we just check the underlying data updated + + +def test_model_set_data_check_state(data_container): + model = PointTableModel(data_container) + index_exclude = model.index(0, 1) + + # Check + assert model.setData( + index_exclude, Qt.CheckState.Checked.value, Qt.ItemDataRole.CheckStateRole + ) + assert 0 in model._excluded_indices + + # Uncheck + assert model.setData( + index_exclude, Qt.CheckState.Unchecked.value, Qt.ItemDataRole.CheckStateRole + ) + assert 0 not in model._excluded_indices + + +def test_model_flags(data_container): + model = PointTableModel(data_container) + + # Checkable column + index_check = model.index(0, 0) + flags = model.flags(index_check) + assert flags & Qt.ItemFlag.ItemIsUserCheckable + + # Editable column + index_edit = model.index(0, 2) + flags = model.flags(index_edit) + assert flags & Qt.ItemFlag.ItemIsEditable + + +def test_data_table_init(qtbot, data_container): + table = DataTable(data_container) + qtbot.addWidget(table) + assert table.model() is not None + assert isinstance(table.table_model, PointTableModel) diff --git a/tests/test_field_view.py b/tests/test_field_view.py new file mode 100644 index 0000000..0cff7fb --- /dev/null +++ b/tests/test_field_view.py @@ -0,0 +1,61 @@ +import numpy as np +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + pass +else: + pass + +from fieldview.ui.field_view import FieldView +from fieldview.layers.heatmap_layer import HeatmapLayer +from fieldview.layers.pin_layer import PinLayer + + +def test_field_view_init(qtbot): + view = FieldView() + qtbot.addWidget(view) + assert view.scene() is not None + + +def test_field_view_set_data(qtbot): + view = FieldView() + qtbot.addWidget(view) + + points = np.array([[0, 0], [10, 10]]) + values = np.array([1, 2]) + view.set_data(points, values) + + assert len(view.data_container.points) == 2 + assert len(view.data_container.values) == 2 + + +def test_field_view_add_layers(qtbot): + view = FieldView() + qtbot.addWidget(view) + + # Heatmap + heatmap = view.add_heatmap_layer() + assert isinstance(heatmap, HeatmapLayer) + assert heatmap in view.scene().items() + assert view.layers["heatmap"] == heatmap + + # Pin + pin = view.add_pin_layer() + assert isinstance(pin, PinLayer) + assert pin in view.scene().items() + assert view.layers["pin"] == pin + + +def test_field_view_fit_to_scene(qtbot): + view = FieldView() + qtbot.addWidget(view) + view.resize(400, 300) + + # Add some content + points = np.array([[0, 0], [100, 100]]) + values = np.array([0, 1]) + view.set_data(points, values) + view.add_pin_layer() + + # Should not raise + view.fit_to_scene() diff --git a/uv.lock b/uv.lock index 98cbcc0..37f9ca6 100644 --- a/uv.lock +++ b/uv.lock @@ -352,6 +352,73 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551, upload-time = "2025-04-15T17:34:46.581Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399, upload-time = "2025-04-15T17:34:51.427Z" }, + { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061, upload-time = "2025-04-15T17:34:55.961Z" }, + { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956, upload-time = "2025-04-15T17:35:00.992Z" }, + { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872, upload-time = "2025-04-15T17:35:06.177Z" }, + { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027, upload-time = "2025-04-15T17:35:11.244Z" }, + { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641, upload-time = "2025-04-15T17:35:26.701Z" }, + { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075, upload-time = "2025-04-15T17:35:43.204Z" }, + { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534, upload-time = "2025-04-15T17:35:46.554Z" }, + { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188, upload-time = "2025-04-15T17:35:50.064Z" }, + { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636, upload-time = "2025-04-15T17:35:54.473Z" }, + { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636, upload-time = "2025-04-15T17:35:58.283Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053, upload-time = "2025-04-15T17:36:03.235Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985, upload-time = "2025-04-15T17:36:08.275Z" }, + { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750, upload-time = "2025-04-15T17:36:13.29Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246, upload-time = "2025-04-15T17:36:18.329Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728, upload-time = "2025-04-15T17:36:33.878Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762, upload-time = "2025-04-15T17:36:51.295Z" }, + { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196, upload-time = "2025-04-15T17:36:55.002Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017, upload-time = "2025-04-15T17:36:58.576Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630, upload-time = "2025-04-15T17:38:19.142Z" }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670, upload-time = "2025-04-15T17:38:23.688Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694, upload-time = "2025-04-15T17:38:28.238Z" }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986, upload-time = "2025-04-15T17:38:33.502Z" }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060, upload-time = "2025-04-15T17:38:38.672Z" }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747, upload-time = "2025-04-15T17:38:43.712Z" }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895, upload-time = "2025-04-15T17:39:00.224Z" }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098, upload-time = "2025-04-15T17:43:29.649Z" }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535, upload-time = "2025-04-15T17:44:44.532Z" }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096, upload-time = "2025-04-15T17:44:48.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090, upload-time = "2025-04-15T17:43:34.084Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643, upload-time = "2025-04-15T17:43:38.626Z" }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443, upload-time = "2025-04-15T17:43:44.522Z" }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865, upload-time = "2025-04-15T17:43:49.545Z" }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162, upload-time = "2025-04-15T17:43:54.203Z" }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355, upload-time = "2025-04-15T17:44:01.025Z" }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935, upload-time = "2025-04-15T17:44:17.322Z" }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168, upload-time = "2025-04-15T17:44:33.43Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550, upload-time = "2025-04-15T17:44:37.092Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214, upload-time = "2025-04-15T17:44:40.827Z" }, + { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681, upload-time = "2025-04-15T17:44:59.314Z" }, + { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101, upload-time = "2025-04-15T17:45:04.165Z" }, + { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599, upload-time = "2025-04-15T17:45:08.456Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807, upload-time = "2025-04-15T17:45:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729, upload-time = "2025-04-15T17:45:20.166Z" }, + { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791, upload-time = "2025-04-15T17:45:24.794Z" }, +] + [[package]] name = "cryptography" version = "46.0.3" @@ -401,6 +468,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ba/af/72cd6ef29f9c5f731251acadaeb821559fe25f10852f44a63374c9ca08c1/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9", size = 4409447, upload-time = "2025-10-15T23:18:24.209Z" }, ] +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + [[package]] name = "docutils" version = "0.22.3" @@ -447,6 +523,7 @@ pyside6 = [ dev = [ { name = "aiohttp" }, { name = "build" }, + { name = "matplotlib" }, { name = "mypy" }, { name = "pandas", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, @@ -475,6 +552,7 @@ provides-extras = ["pyside6", "pyqt6", "pyqt5"] dev = [ { name = "aiohttp" }, { name = "build" }, + { name = "matplotlib" }, { name = "mypy" }, { name = "pandas", specifier = ">=2.0.0" }, { name = "pandas-stubs" }, @@ -487,6 +565,63 @@ dev = [ { name = "twine" }, ] +[[package]] +name = "fonttools" +version = "4.61.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/33/f9/0e84d593c0e12244150280a630999835a64f2852276161b62a0f98318de0/fonttools-4.61.0.tar.gz", hash = "sha256:ec520a1f0c7758d7a858a00f090c1745f6cde6a7c5e76fb70ea4044a15f712e7", size = 3561884, upload-time = "2025-11-28T17:05:49.491Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/f3/91bba2721fb173fc68e09d15b6ccf3ad4f83d127fbff579be7e5984888a6/fonttools-4.61.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dc25a4a9c1225653e4431a9413d0381b1c62317b0f543bdcec24e1991f612f33", size = 2850151, upload-time = "2025-11-28T17:04:14.214Z" }, + { url = "https://files.pythonhosted.org/packages/f5/8c/a1691dec01038ac7e7bb3ab83300dcc5087b11d8f48640928c02a873eb92/fonttools-4.61.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b493c32d2555e9944ec1b911ea649ff8f01a649ad9cba6c118d6798e932b3f0", size = 2389769, upload-time = "2025-11-28T17:04:16.443Z" }, + { url = "https://files.pythonhosted.org/packages/2d/dd/5bb369a44319d92ba25612511eb8ed2a6fa75239979e0388907525626902/fonttools-4.61.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad751319dc532a79bdf628b8439af167181b4210a0cd28a8935ca615d9fdd727", size = 4893189, upload-time = "2025-11-28T17:04:18.398Z" }, + { url = "https://files.pythonhosted.org/packages/5e/02/51373fa8846bd22bb54e5efb30a824b417b058083f775a194a432f21a45f/fonttools-4.61.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2de14557d113faa5fb519f7f29c3abe4d69c17fe6a5a2595cc8cda7338029219", size = 4854415, upload-time = "2025-11-28T17:04:20.421Z" }, + { url = "https://files.pythonhosted.org/packages/8b/64/9cdbbb804577a7e6191448851c57e6a36eb02aa4bf6a9668b528c968e44e/fonttools-4.61.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:59587bbe455dbdf75354a9dbca1697a35a8903e01fab4248d6b98a17032cee52", size = 4870927, upload-time = "2025-11-28T17:04:22.625Z" }, + { url = "https://files.pythonhosted.org/packages/92/68/e40b22919dc96dc30a70b58fec609ab85112de950bdecfadf8dd478c5a88/fonttools-4.61.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:46cb3d9279f758ac0cf671dc3482da877104b65682679f01b246515db03dbb72", size = 4988674, upload-time = "2025-11-28T17:04:24.675Z" }, + { url = "https://files.pythonhosted.org/packages/9b/5c/e857349ce8aedb2451b9448282e86544b2b7f1c8b10ea0fe49b7cb369b72/fonttools-4.61.0-cp310-cp310-win32.whl", hash = "sha256:58b4f1b78dfbfe855bb8a6801b31b8cdcca0e2847ec769ad8e0b0b692832dd3b", size = 1497663, upload-time = "2025-11-28T17:04:26.598Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0c/62961d5fe6f764d6cbc387ef2c001f5f610808c7aded837409836c0b3e7c/fonttools-4.61.0-cp310-cp310-win_amd64.whl", hash = "sha256:68704a8bbe0b61976262b255e90cde593dc0fe3676542d9b4d846bad2a890a76", size = 1546143, upload-time = "2025-11-28T17:04:28.432Z" }, + { url = "https://files.pythonhosted.org/packages/fd/be/5aa89cdddf2863d8afbdc19eb8ec5d8d35d40eeeb8e6cf52c5ff1c2dbd33/fonttools-4.61.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a32a16951cbf113d38f1dd8551b277b6e06e0f6f776fece0f99f746d739e1be3", size = 2847553, upload-time = "2025-11-28T17:04:30.539Z" }, + { url = "https://files.pythonhosted.org/packages/0d/3e/6ff643b07cead1236a534f51291ae2981721cf419135af5b740c002a66dd/fonttools-4.61.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:328a9c227984bebaf69f3ac9062265f8f6acc7ddf2e4e344c63358579af0aa3d", size = 2388298, upload-time = "2025-11-28T17:04:32.161Z" }, + { url = "https://files.pythonhosted.org/packages/c3/15/fca8dfbe7b482e6f240b1aad0ed7c6e2e75e7a28efa3d3a03b570617b5e5/fonttools-4.61.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f0bafc8a3b3749c69cc610e5aa3da832d39c2a37a68f03d18ec9a02ecaac04a", size = 5054133, upload-time = "2025-11-28T17:04:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a2/821c61c691b21fd09e07528a9a499cc2b075ac83ddb644aa16c9875a64bc/fonttools-4.61.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b5ca59b7417d149cf24e4c1933c9f44b2957424fc03536f132346d5242e0ebe5", size = 5031410, upload-time = "2025-11-28T17:04:36.141Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f6/8b16339e93d03c732c8a23edefe3061b17a5f9107ddc47a3215ecd054cac/fonttools-4.61.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:df8cbce85cf482eb01f4551edca978c719f099c623277bda8332e5dbe7dba09d", size = 5030005, upload-time = "2025-11-28T17:04:38.314Z" }, + { url = "https://files.pythonhosted.org/packages/ac/eb/d4e150427bdaa147755239c931bbce829a88149ade5bfd8a327afe565567/fonttools-4.61.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7fb5b84f48a6a733ca3d7f41aa9551908ccabe8669ffe79586560abcc00a9cfd", size = 5154026, upload-time = "2025-11-28T17:04:40.34Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5f/3dd00ce0dba6759943c707b1830af8c0bcf6f8f1a9fe46cb82e7ac2aaa74/fonttools-4.61.0-cp311-cp311-win32.whl", hash = "sha256:787ef9dfd1ea9fe49573c272412ae5f479d78e671981819538143bec65863865", size = 2276035, upload-time = "2025-11-28T17:04:42.59Z" }, + { url = "https://files.pythonhosted.org/packages/4e/44/798c472f096ddf12955eddb98f4f7c906e7497695d04ce073ddf7161d134/fonttools-4.61.0-cp311-cp311-win_amd64.whl", hash = "sha256:14fafda386377b6131d9e448af42d0926bad47e038de0e5ba1d58c25d621f028", size = 2327290, upload-time = "2025-11-28T17:04:44.57Z" }, + { url = "https://files.pythonhosted.org/packages/00/5d/19e5939f773c7cb05480fe2e881d63870b63ee2b4bdb9a77d55b1d36c7b9/fonttools-4.61.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e24a1565c4e57111ec7f4915f8981ecbb61adf66a55f378fdc00e206059fcfef", size = 2846930, upload-time = "2025-11-28T17:04:46.639Z" }, + { url = "https://files.pythonhosted.org/packages/25/b2/0658faf66f705293bd7e739a4f038302d188d424926be9c59bdad945664b/fonttools-4.61.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2bfacb5351303cae9f072ccf3fc6ecb437a6f359c0606bae4b1ab6715201d87", size = 2383016, upload-time = "2025-11-28T17:04:48.525Z" }, + { url = "https://files.pythonhosted.org/packages/29/a3/1fa90b95b690f0d7541f48850adc40e9019374d896c1b8148d15012b2458/fonttools-4.61.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0bdcf2e29d65c26299cc3d502f4612365e8b90a939f46cd92d037b6cb7bb544a", size = 4949425, upload-time = "2025-11-28T17:04:50.482Z" }, + { url = "https://files.pythonhosted.org/packages/af/00/acf18c00f6c501bd6e05ee930f926186f8a8e268265407065688820f1c94/fonttools-4.61.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6cd0d9051b8ddaf7385f99dd82ec2a058e2b46cf1f1961e68e1ff20fcbb61af", size = 4999632, upload-time = "2025-11-28T17:04:52.508Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e0/19a2b86e54109b1d2ee8743c96a1d297238ae03243897bc5345c0365f34d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e074bc07c31406f45c418e17c1722e83560f181d122c412fa9e815df0ff74810", size = 4939438, upload-time = "2025-11-28T17:04:54.437Z" }, + { url = "https://files.pythonhosted.org/packages/04/35/7b57a5f57d46286360355eff8d6b88c64ab6331107f37a273a71c803798d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a9b78da5d5faa17e63b2404b77feeae105c1b7e75f26020ab7a27b76e02039f", size = 5088960, upload-time = "2025-11-28T17:04:56.348Z" }, + { url = "https://files.pythonhosted.org/packages/3e/0e/6c5023eb2e0fe5d1ababc7e221e44acd3ff668781489cc1937a6f83d620a/fonttools-4.61.0-cp312-cp312-win32.whl", hash = "sha256:9821ed77bb676736b88fa87a737c97b6af06e8109667e625a4f00158540ce044", size = 2264404, upload-time = "2025-11-28T17:04:58.149Z" }, + { url = "https://files.pythonhosted.org/packages/36/0b/63273128c7c5df19b1e4cd92e0a1e6ea5bb74a400c4905054c96ad60a675/fonttools-4.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:0011d640afa61053bc6590f9a3394bd222de7cfde19346588beabac374e9d8ac", size = 2314427, upload-time = "2025-11-28T17:04:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/17/45/334f0d7f181e5473cfb757e1b60f4e60e7fc64f28d406e5d364a952718c0/fonttools-4.61.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba774b8cbd8754f54b8eb58124e8bd45f736b2743325ab1a5229698942b9b433", size = 2841801, upload-time = "2025-11-28T17:05:01.621Z" }, + { url = "https://files.pythonhosted.org/packages/cc/63/97b9c78e1f79bc741d4efe6e51f13872d8edb2b36e1b9fb2bab0d4491bb7/fonttools-4.61.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c84b430616ed73ce46e9cafd0bf0800e366a3e02fb7e1ad7c1e214dbe3862b1f", size = 2379024, upload-time = "2025-11-28T17:05:03.668Z" }, + { url = "https://files.pythonhosted.org/packages/4e/80/c87bc524a90dbeb2a390eea23eae448286983da59b7e02c67fa0ca96a8c5/fonttools-4.61.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b2b734d8391afe3c682320840c8191de9bd24e7eb85768dd4dc06ed1b63dbb1b", size = 4923706, upload-time = "2025-11-28T17:05:05.494Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f6/a3b0374811a1de8c3f9207ec88f61ad1bb96f938ed89babae26c065c2e46/fonttools-4.61.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5c5fff72bf31b0e558ed085e4fd7ed96eb85881404ecc39ed2a779e7cf724eb", size = 4979751, upload-time = "2025-11-28T17:05:07.665Z" }, + { url = "https://files.pythonhosted.org/packages/a5/3b/30f63b4308b449091573285f9d27619563a84f399946bca3eadc9554afbe/fonttools-4.61.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:14a290c5c93fcab76b7f451e6a4b7721b712d90b3b5ed6908f1abcf794e90d6d", size = 4921113, upload-time = "2025-11-28T17:05:09.551Z" }, + { url = "https://files.pythonhosted.org/packages/41/6c/58e6e9b7d9d8bf2d7010bd7bb493060b39b02a12d1cda64a8bfb116ce760/fonttools-4.61.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:13e3e20a5463bfeb77b3557d04b30bd6a96a6bb5c15c7b2e7908903e69d437a0", size = 5063183, upload-time = "2025-11-28T17:05:11.677Z" }, + { url = "https://files.pythonhosted.org/packages/3f/e3/52c790ab2b07492df059947a1fd7778e105aac5848c0473029a4d20481a2/fonttools-4.61.0-cp313-cp313-win32.whl", hash = "sha256:6781e7a4bb010be1cd69a29927b0305c86b843395f2613bdabe115f7d6ea7f34", size = 2263159, upload-time = "2025-11-28T17:05:13.292Z" }, + { url = "https://files.pythonhosted.org/packages/e9/1f/116013b200fbeba871046554d5d2a45fefa69a05c40e9cdfd0d4fff53edc/fonttools-4.61.0-cp313-cp313-win_amd64.whl", hash = "sha256:c53b47834ae41e8e4829171cc44fec0fdf125545a15f6da41776b926b9645a9a", size = 2313530, upload-time = "2025-11-28T17:05:14.848Z" }, + { url = "https://files.pythonhosted.org/packages/d3/99/59b1e25987787cb714aa9457cee4c9301b7c2153f0b673e2b8679d37669d/fonttools-4.61.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:96dfc9bc1f2302224e48e6ee37e656eddbab810b724b52e9d9c13a57a6abad01", size = 2841429, upload-time = "2025-11-28T17:05:16.671Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/4c1911d4332c8a144bb3b44416e274ccca0e297157c971ea1b3fbb855590/fonttools-4.61.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3b2065d94e5d63aafc2591c8b6ccbdb511001d9619f1bca8ad39b745ebeb5efa", size = 2378987, upload-time = "2025-11-28T17:05:18.69Z" }, + { url = "https://files.pythonhosted.org/packages/24/b0/f442e90fde5d2af2ae0cb54008ab6411edc557ee33b824e13e1d04925ac9/fonttools-4.61.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0d87e81e4d869549585ba0beb3f033718501c1095004f5e6aef598d13ebc216", size = 4873270, upload-time = "2025-11-28T17:05:20.625Z" }, + { url = "https://files.pythonhosted.org/packages/bb/04/f5d5990e33053c8a59b90b1d7e10ad9b97a73f42c745304da0e709635fab/fonttools-4.61.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cfa2eb9bae650e58f0e8ad53c49d19a844d6034d6b259f30f197238abc1ccee", size = 4968270, upload-time = "2025-11-28T17:05:22.515Z" }, + { url = "https://files.pythonhosted.org/packages/94/9f/2091402e0d27c9c8c4bab5de0e5cd146d9609a2d7d1c666bbb75c0011c1a/fonttools-4.61.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4238120002e68296d55e091411c09eab94e111c8ce64716d17df53fd0eb3bb3d", size = 4919799, upload-time = "2025-11-28T17:05:24.437Z" }, + { url = "https://files.pythonhosted.org/packages/a8/72/86adab22fde710b829f8ffbc8f264df01928e5b7a8f6177fa29979ebf256/fonttools-4.61.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6ceac262cc62bec01b3bb59abccf41b24ef6580869e306a4e88b7e56bb4bdda", size = 5030966, upload-time = "2025-11-28T17:05:26.115Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a7/7c8e31b003349e845b853f5e0a67b95ff6b052fa4f5224f8b72624f5ac69/fonttools-4.61.0-cp314-cp314-win32.whl", hash = "sha256:adbb4ecee1a779469a77377bbe490565effe8fce6fb2e6f95f064de58f8bac85", size = 2267243, upload-time = "2025-11-28T17:05:27.807Z" }, + { url = "https://files.pythonhosted.org/packages/20/ee/f434fe7749360497c52b7dcbcfdbccdaab0a71c59f19d572576066717122/fonttools-4.61.0-cp314-cp314-win_amd64.whl", hash = "sha256:02bdf8e04d1a70476564b8640380f04bb4ac74edc1fc71f1bacb840b3e398ee9", size = 2318822, upload-time = "2025-11-28T17:05:29.882Z" }, + { url = "https://files.pythonhosted.org/packages/33/b3/c16255320255e5c1863ca2b2599bb61a46e2f566db0bbb9948615a8fe692/fonttools-4.61.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:627216062d90ab0d98215176d8b9562c4dd5b61271d35f130bcd30f6a8aaa33a", size = 2924917, upload-time = "2025-11-28T17:05:31.46Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b8/08067ae21de705a817777c02ef36ab0b953cbe91d8adf134f9c2da75ed6d/fonttools-4.61.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7b446623c9cd5f14a59493818eaa80255eec2468c27d2c01b56e05357c263195", size = 2413576, upload-time = "2025-11-28T17:05:33.343Z" }, + { url = "https://files.pythonhosted.org/packages/42/f1/96ff43f92addce2356780fdc203f2966206f3d22ea20e242c27826fd7442/fonttools-4.61.0-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:70e2a0c0182ee75e493ef33061bfebf140ea57e035481d2f95aa03b66c7a0e05", size = 4877447, upload-time = "2025-11-28T17:05:35.278Z" }, + { url = "https://files.pythonhosted.org/packages/d0/1e/a3d8e51ed9ccfd7385e239ae374b78d258a0fb82d82cab99160a014a45d1/fonttools-4.61.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9064b0f55b947e929ac669af5311ab1f26f750214db6dd9a0c97e091e918f486", size = 5095681, upload-time = "2025-11-28T17:05:37.142Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f6/d256bd6c1065c146a0bdddf1c62f542e08ae5b3405dbf3fcc52be272f674/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2cb5e45a824ce14b90510024d0d39dae51bd4fbb54c42a9334ea8c8cf4d95cbe", size = 4974140, upload-time = "2025-11-28T17:05:39.5Z" }, + { url = "https://files.pythonhosted.org/packages/5d/0c/96633eb4b26f138cc48561c6e0c44b4ea48acea56b20b507d6b14f8e80ce/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6e5ca8c62efdec7972dfdfd454415c4db49b89aeaefaaacada432f3b7eea9866", size = 5001741, upload-time = "2025-11-28T17:05:41.424Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/3b536bad3be4f26186f296e749ff17bad3e6d57232c104d752d24b2e265b/fonttools-4.61.0-cp314-cp314t-win32.whl", hash = "sha256:63c7125d31abe3e61d7bb917329b5543c5b3448db95f24081a13aaf064360fc8", size = 2330707, upload-time = "2025-11-28T17:05:43.548Z" }, + { url = "https://files.pythonhosted.org/packages/18/ea/e6b9ac610451ee9f04477c311ad126de971f6112cb579fa391d2a8edb00b/fonttools-4.61.0-cp314-cp314t-win_amd64.whl", hash = "sha256:67d841aa272be5500de7f447c40d1d8452783af33b4c3599899319f6ef9ad3c1", size = 2395950, upload-time = "2025-11-28T17:05:45.638Z" }, + { url = "https://files.pythonhosted.org/packages/0c/14/634f7daea5ffe6a5f7a0322ba8e1a0e23c9257b80aa91458107896d1dfc7/fonttools-4.61.0-py3-none-any.whl", hash = "sha256:276f14c560e6f98d24ef7f5f44438e55ff5a67f78fa85236b218462c9f5d0635", size = 1144485, upload-time = "2025-11-28T17:05:47.573Z" }, +] + [[package]] name = "frozenlist" version = "1.8.0" @@ -713,6 +848,114 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, ] +[[package]] +name = "kiwisolver" +version = "1.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/5d/8ce64e36d4e3aac5ca96996457dcf33e34e6051492399a3f1fec5657f30b/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b", size = 124159, upload-time = "2025-08-10T21:25:35.472Z" }, + { url = "https://files.pythonhosted.org/packages/96/1e/22f63ec454874378175a5f435d6ea1363dd33fb2af832c6643e4ccea0dc8/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f", size = 66578, upload-time = "2025-08-10T21:25:36.73Z" }, + { url = "https://files.pythonhosted.org/packages/41/4c/1925dcfff47a02d465121967b95151c82d11027d5ec5242771e580e731bd/kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf", size = 65312, upload-time = "2025-08-10T21:25:37.658Z" }, + { url = "https://files.pythonhosted.org/packages/d4/42/0f333164e6307a0687d1eb9ad256215aae2f4bd5d28f4653d6cd319a3ba3/kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9", size = 1628458, upload-time = "2025-08-10T21:25:39.067Z" }, + { url = "https://files.pythonhosted.org/packages/86/b6/2dccb977d651943995a90bfe3495c2ab2ba5cd77093d9f2318a20c9a6f59/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415", size = 1225640, upload-time = "2025-08-10T21:25:40.489Z" }, + { url = "https://files.pythonhosted.org/packages/50/2b/362ebd3eec46c850ccf2bfe3e30f2fc4c008750011f38a850f088c56a1c6/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b", size = 1244074, upload-time = "2025-08-10T21:25:42.221Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bb/f09a1e66dab8984773d13184a10a29fe67125337649d26bdef547024ed6b/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154", size = 1293036, upload-time = "2025-08-10T21:25:43.801Z" }, + { url = "https://files.pythonhosted.org/packages/ea/01/11ecf892f201cafda0f68fa59212edaea93e96c37884b747c181303fccd1/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48", size = 2175310, upload-time = "2025-08-10T21:25:45.045Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5f/bfe11d5b934f500cc004314819ea92427e6e5462706a498c1d4fc052e08f/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220", size = 2270943, upload-time = "2025-08-10T21:25:46.393Z" }, + { url = "https://files.pythonhosted.org/packages/3d/de/259f786bf71f1e03e73d87e2db1a9a3bcab64d7b4fd780167123161630ad/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586", size = 2440488, upload-time = "2025-08-10T21:25:48.074Z" }, + { url = "https://files.pythonhosted.org/packages/1b/76/c989c278faf037c4d3421ec07a5c452cd3e09545d6dae7f87c15f54e4edf/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634", size = 2246787, upload-time = "2025-08-10T21:25:49.442Z" }, + { url = "https://files.pythonhosted.org/packages/a2/55/c2898d84ca440852e560ca9f2a0d28e6e931ac0849b896d77231929900e7/kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611", size = 73730, upload-time = "2025-08-10T21:25:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/e8/09/486d6ac523dd33b80b368247f238125d027964cfacb45c654841e88fb2ae/kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536", size = 65036, upload-time = "2025-08-10T21:25:52.063Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", size = 124167, upload-time = "2025-08-10T21:25:53.403Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", size = 66579, upload-time = "2025-08-10T21:25:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", size = 65309, upload-time = "2025-08-10T21:25:55.76Z" }, + { url = "https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", size = 1435596, upload-time = "2025-08-10T21:25:56.861Z" }, + { url = "https://files.pythonhosted.org/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", size = 1246548, upload-time = "2025-08-10T21:25:58.246Z" }, + { url = "https://files.pythonhosted.org/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", size = 1263618, upload-time = "2025-08-10T21:25:59.857Z" }, + { url = "https://files.pythonhosted.org/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", size = 1317437, upload-time = "2025-08-10T21:26:01.105Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", size = 2195742, upload-time = "2025-08-10T21:26:02.675Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", size = 2290810, upload-time = "2025-08-10T21:26:04.009Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", size = 2461579, upload-time = "2025-08-10T21:26:05.317Z" }, + { url = "https://files.pythonhosted.org/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", size = 2268071, upload-time = "2025-08-10T21:26:06.686Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", size = 73840, upload-time = "2025-08-10T21:26:07.94Z" }, + { url = "https://files.pythonhosted.org/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", size = 65159, upload-time = "2025-08-10T21:26:09.048Z" }, + { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, + { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, + { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, + { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, + { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, + { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, + { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, + { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, + { url = "https://files.pythonhosted.org/packages/31/c1/c2686cda909742ab66c7388e9a1a8521a59eb89f8bcfbee28fc980d07e24/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", size = 123681, upload-time = "2025-08-10T21:26:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", size = 66464, upload-time = "2025-08-10T21:26:27.733Z" }, + { url = "https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", size = 64961, upload-time = "2025-08-10T21:26:28.729Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", size = 1474607, upload-time = "2025-08-10T21:26:29.798Z" }, + { url = "https://files.pythonhosted.org/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", size = 1276546, upload-time = "2025-08-10T21:26:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ad/8bfc1c93d4cc565e5069162f610ba2f48ff39b7de4b5b8d93f69f30c4bed/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", size = 1294482, upload-time = "2025-08-10T21:26:32.721Z" }, + { url = "https://files.pythonhosted.org/packages/da/f1/6aca55ff798901d8ce403206d00e033191f63d82dd708a186e0ed2067e9c/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", size = 1343720, upload-time = "2025-08-10T21:26:34.032Z" }, + { url = "https://files.pythonhosted.org/packages/d1/91/eed031876c595c81d90d0f6fc681ece250e14bf6998c3d7c419466b523b7/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", size = 2224907, upload-time = "2025-08-10T21:26:35.824Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ec/4d1925f2e49617b9cca9c34bfa11adefad49d00db038e692a559454dfb2e/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", size = 2321334, upload-time = "2025-08-10T21:26:37.534Z" }, + { url = "https://files.pythonhosted.org/packages/43/cb/450cd4499356f68802750c6ddc18647b8ea01ffa28f50d20598e0befe6e9/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", size = 2488313, upload-time = "2025-08-10T21:26:39.191Z" }, + { url = "https://files.pythonhosted.org/packages/71/67/fc76242bd99f885651128a5d4fa6083e5524694b7c88b489b1b55fdc491d/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", size = 2291970, upload-time = "2025-08-10T21:26:40.828Z" }, + { url = "https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", size = 73894, upload-time = "2025-08-10T21:26:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/dce480814d25b99a391abbddadc78f7c117c6da34be68ca8b02d5848b424/kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", size = 64995, upload-time = "2025-08-10T21:26:43.889Z" }, + { url = "https://files.pythonhosted.org/packages/e2/37/7d218ce5d92dadc5ebdd9070d903e0c7cf7edfe03f179433ac4d13ce659c/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", size = 126510, upload-time = "2025-08-10T21:26:44.915Z" }, + { url = "https://files.pythonhosted.org/packages/23/b0/e85a2b48233daef4b648fb657ebbb6f8367696a2d9548a00b4ee0eb67803/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", size = 67903, upload-time = "2025-08-10T21:26:45.934Z" }, + { url = "https://files.pythonhosted.org/packages/44/98/f2425bc0113ad7de24da6bb4dae1343476e95e1d738be7c04d31a5d037fd/kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", size = 66402, upload-time = "2025-08-10T21:26:47.101Z" }, + { url = "https://files.pythonhosted.org/packages/98/d8/594657886df9f34c4177cc353cc28ca7e6e5eb562d37ccc233bff43bbe2a/kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", size = 1582135, upload-time = "2025-08-10T21:26:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c6/38a115b7170f8b306fc929e166340c24958347308ea3012c2b44e7e295db/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", size = 1389409, upload-time = "2025-08-10T21:26:50.335Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3b/e04883dace81f24a568bcee6eb3001da4ba05114afa622ec9b6fafdc1f5e/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", size = 1401763, upload-time = "2025-08-10T21:26:51.867Z" }, + { url = "https://files.pythonhosted.org/packages/9f/80/20ace48e33408947af49d7d15c341eaee69e4e0304aab4b7660e234d6288/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", size = 1453643, upload-time = "2025-08-10T21:26:53.592Z" }, + { url = "https://files.pythonhosted.org/packages/64/31/6ce4380a4cd1f515bdda976a1e90e547ccd47b67a1546d63884463c92ca9/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", size = 2330818, upload-time = "2025-08-10T21:26:55.051Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e9/3f3fcba3bcc7432c795b82646306e822f3fd74df0ee81f0fa067a1f95668/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", size = 2419963, upload-time = "2025-08-10T21:26:56.421Z" }, + { url = "https://files.pythonhosted.org/packages/99/43/7320c50e4133575c66e9f7dadead35ab22d7c012a3b09bb35647792b2a6d/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", size = 2594639, upload-time = "2025-08-10T21:26:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/65/d6/17ae4a270d4a987ef8a385b906d2bdfc9fce502d6dc0d3aea865b47f548c/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", size = 2391741, upload-time = "2025-08-10T21:26:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8f/8f6f491d595a9e5912971f3f863d81baddccc8a4d0c3749d6a0dd9ffc9df/kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", size = 68646, upload-time = "2025-08-10T21:27:00.52Z" }, + { url = "https://files.pythonhosted.org/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", size = 123806, upload-time = "2025-08-10T21:27:01.537Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", size = 66605, upload-time = "2025-08-10T21:27:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", size = 64925, upload-time = "2025-08-10T21:27:04.339Z" }, + { url = "https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", size = 1472414, upload-time = "2025-08-10T21:27:05.437Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", size = 1281272, upload-time = "2025-08-10T21:27:07.063Z" }, + { url = "https://files.pythonhosted.org/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", size = 1298578, upload-time = "2025-08-10T21:27:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", size = 1345607, upload-time = "2025-08-10T21:27:10.125Z" }, + { url = "https://files.pythonhosted.org/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", size = 2230150, upload-time = "2025-08-10T21:27:11.484Z" }, + { url = "https://files.pythonhosted.org/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", size = 2325979, upload-time = "2025-08-10T21:27:12.917Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", size = 2491456, upload-time = "2025-08-10T21:27:14.353Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", size = 2294621, upload-time = "2025-08-10T21:27:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", size = 75417, upload-time = "2025-08-10T21:27:17.436Z" }, + { url = "https://files.pythonhosted.org/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", size = 66582, upload-time = "2025-08-10T21:27:18.436Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", size = 126514, upload-time = "2025-08-10T21:27:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", size = 67905, upload-time = "2025-08-10T21:27:20.51Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", size = 66399, upload-time = "2025-08-10T21:27:21.496Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", size = 1582197, upload-time = "2025-08-10T21:27:22.604Z" }, + { url = "https://files.pythonhosted.org/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", size = 1390125, upload-time = "2025-08-10T21:27:24.036Z" }, + { url = "https://files.pythonhosted.org/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", size = 1402612, upload-time = "2025-08-10T21:27:25.773Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", size = 1453990, upload-time = "2025-08-10T21:27:27.089Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", size = 2331601, upload-time = "2025-08-10T21:27:29.343Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", size = 2422041, upload-time = "2025-08-10T21:27:30.754Z" }, + { url = "https://files.pythonhosted.org/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", size = 2594897, upload-time = "2025-08-10T21:27:32.803Z" }, + { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, + { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, + { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, + { url = "https://files.pythonhosted.org/packages/a2/63/fde392691690f55b38d5dd7b3710f5353bf7a8e52de93a22968801ab8978/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527", size = 60183, upload-time = "2025-08-10T21:27:37.669Z" }, + { url = "https://files.pythonhosted.org/packages/27/b1/6aad34edfdb7cced27f371866f211332bba215bfd918ad3322a58f480d8b/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771", size = 58675, upload-time = "2025-08-10T21:27:39.031Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1a/23d855a702bb35a76faed5ae2ba3de57d323f48b1f6b17ee2176c4849463/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e", size = 80277, upload-time = "2025-08-10T21:27:40.129Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5b/5239e3c2b8fb5afa1e8508f721bb77325f740ab6994d963e61b2b7abcc1e/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9", size = 77994, upload-time = "2025-08-10T21:27:41.181Z" }, + { url = "https://files.pythonhosted.org/packages/f9/1c/5d4d468fb16f8410e596ed0eac02d2c68752aa7dc92997fe9d60a7147665/kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb", size = 73744, upload-time = "2025-08-10T21:27:42.254Z" }, + { url = "https://files.pythonhosted.org/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", size = 60104, upload-time = "2025-08-10T21:27:43.287Z" }, + { url = "https://files.pythonhosted.org/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", size = 58592, upload-time = "2025-08-10T21:27:44.314Z" }, + { url = "https://files.pythonhosted.org/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", size = 80281, upload-time = "2025-08-10T21:27:45.369Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", size = 78009, upload-time = "2025-08-10T21:27:46.376Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" }, +] + [[package]] name = "librt" version = "0.7.0" @@ -798,6 +1041,79 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] +[[package]] +name = "matplotlib" +version = "3.10.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/e2/d2d5295be2f44c678ebaf3544ba32d20c1f9ef08c49fe47f496180e1db15/matplotlib-3.10.7.tar.gz", hash = "sha256:a06ba7e2a2ef9131c79c49e63dad355d2d878413a0376c1727c8b9335ff731c7", size = 34804865, upload-time = "2025-10-09T00:28:00.669Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/87/3932d5778ab4c025db22710b61f49ccaed3956c5cf46ffb2ffa7492b06d9/matplotlib-3.10.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ac81eee3b7c266dd92cee1cd658407b16c57eed08c7421fa354ed68234de380", size = 8247141, upload-time = "2025-10-09T00:26:06.023Z" }, + { url = "https://files.pythonhosted.org/packages/45/a8/bfed45339160102bce21a44e38a358a1134a5f84c26166de03fb4a53208f/matplotlib-3.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:667ecd5d8d37813a845053d8f5bf110b534c3c9f30e69ebd25d4701385935a6d", size = 8107995, upload-time = "2025-10-09T00:26:08.669Z" }, + { url = "https://files.pythonhosted.org/packages/e2/3c/5692a2d9a5ba848fda3f48d2b607037df96460b941a59ef236404b39776b/matplotlib-3.10.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc1c51b846aca49a5a8b44fbba6a92d583a35c64590ad9e1e950dc88940a4297", size = 8680503, upload-time = "2025-10-09T00:26:10.607Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a0/86ace53c48b05d0e6e9c127b2ace097434901f3e7b93f050791c8243201a/matplotlib-3.10.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a11c2e9e72e7de09b7b72e62f3df23317c888299c875e2b778abf1eda8c0a42", size = 9514982, upload-time = "2025-10-09T00:26:12.594Z" }, + { url = "https://files.pythonhosted.org/packages/a6/81/ead71e2824da8f72640a64166d10e62300df4ae4db01a0bac56c5b39fa51/matplotlib-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f19410b486fdd139885ace124e57f938c1e6a3210ea13dd29cab58f5d4bc12c7", size = 9566429, upload-time = "2025-10-09T00:26:14.758Z" }, + { url = "https://files.pythonhosted.org/packages/65/7d/954b3067120456f472cce8fdcacaf4a5fcd522478db0c37bb243c7cb59dd/matplotlib-3.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:b498e9e4022f93de2d5a37615200ca01297ceebbb56fe4c833f46862a490f9e3", size = 8108174, upload-time = "2025-10-09T00:26:17.015Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bc/0fb489005669127ec13f51be0c6adc074d7cf191075dab1da9fe3b7a3cfc/matplotlib-3.10.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:53b492410a6cd66c7a471de6c924f6ede976e963c0f3097a3b7abfadddc67d0a", size = 8257507, upload-time = "2025-10-09T00:26:19.073Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6a/d42588ad895279ff6708924645b5d2ed54a7fb2dc045c8a804e955aeace1/matplotlib-3.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d9749313deb729f08207718d29c86246beb2ea3fdba753595b55901dee5d2fd6", size = 8119565, upload-time = "2025-10-09T00:26:21.023Z" }, + { url = "https://files.pythonhosted.org/packages/10/b7/4aa196155b4d846bd749cf82aa5a4c300cf55a8b5e0dfa5b722a63c0f8a0/matplotlib-3.10.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2222c7ba2cbde7fe63032769f6eb7e83ab3227f47d997a8453377709b7fe3a5a", size = 8692668, upload-time = "2025-10-09T00:26:22.967Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e7/664d2b97016f46683a02d854d730cfcf54ff92c1dafa424beebef50f831d/matplotlib-3.10.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e91f61a064c92c307c5a9dc8c05dc9f8a68f0a3be199d9a002a0622e13f874a1", size = 9521051, upload-time = "2025-10-09T00:26:25.041Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a3/37aef1404efa615f49b5758a5e0261c16dd88f389bc1861e722620e4a754/matplotlib-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f1851eab59ca082c95df5a500106bad73672645625e04538b3ad0f69471ffcc", size = 9576878, upload-time = "2025-10-09T00:26:27.478Z" }, + { url = "https://files.pythonhosted.org/packages/33/cd/b145f9797126f3f809d177ca378de57c45413c5099c5990de2658760594a/matplotlib-3.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:6516ce375109c60ceec579e699524e9d504cd7578506f01150f7a6bc174a775e", size = 8115142, upload-time = "2025-10-09T00:26:29.774Z" }, + { url = "https://files.pythonhosted.org/packages/2e/39/63bca9d2b78455ed497fcf51a9c71df200a11048f48249038f06447fa947/matplotlib-3.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:b172db79759f5f9bc13ef1c3ef8b9ee7b37b0247f987fbbbdaa15e4f87fd46a9", size = 7992439, upload-time = "2025-10-09T00:26:40.32Z" }, + { url = "https://files.pythonhosted.org/packages/be/b3/09eb0f7796932826ec20c25b517d568627754f6c6462fca19e12c02f2e12/matplotlib-3.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a0edb7209e21840e8361e91ea84ea676658aa93edd5f8762793dec77a4a6748", size = 8272389, upload-time = "2025-10-09T00:26:42.474Z" }, + { url = "https://files.pythonhosted.org/packages/11/0b/1ae80ddafb8652fd8046cb5c8460ecc8d4afccb89e2c6d6bec61e04e1eaf/matplotlib-3.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c380371d3c23e0eadf8ebff114445b9f970aff2010198d498d4ab4c3b41eea4f", size = 8128247, upload-time = "2025-10-09T00:26:44.77Z" }, + { url = "https://files.pythonhosted.org/packages/7d/18/95ae2e242d4a5c98bd6e90e36e128d71cf1c7e39b0874feaed3ef782e789/matplotlib-3.10.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d5f256d49fea31f40f166a5e3131235a5d2f4b7f44520b1cf0baf1ce568ccff0", size = 8696996, upload-time = "2025-10-09T00:26:46.792Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3d/5b559efc800bd05cb2033aa85f7e13af51958136a48327f7c261801ff90a/matplotlib-3.10.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11ae579ac83cdf3fb72573bb89f70e0534de05266728740d478f0f818983c695", size = 9530153, upload-time = "2025-10-09T00:26:49.07Z" }, + { url = "https://files.pythonhosted.org/packages/88/57/eab4a719fd110312d3c220595d63a3c85ec2a39723f0f4e7fa7e6e3f74ba/matplotlib-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4c14b6acd16cddc3569a2d515cfdd81c7a68ac5639b76548cfc1a9e48b20eb65", size = 9593093, upload-time = "2025-10-09T00:26:51.067Z" }, + { url = "https://files.pythonhosted.org/packages/31/3c/80816f027b3a4a28cd2a0a6ef7f89a2db22310e945cd886ec25bfb399221/matplotlib-3.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:0d8c32b7ea6fb80b1aeff5a2ceb3fb9778e2759e899d9beff75584714afcc5ee", size = 8122771, upload-time = "2025-10-09T00:26:53.296Z" }, + { url = "https://files.pythonhosted.org/packages/de/77/ef1fc78bfe99999b2675435cc52120887191c566b25017d78beaabef7f2d/matplotlib-3.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:5f3f6d315dcc176ba7ca6e74c7768fb7e4cf566c49cb143f6bc257b62e634ed8", size = 7992812, upload-time = "2025-10-09T00:26:54.882Z" }, + { url = "https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1d9d3713a237970569156cfb4de7533b7c4eacdd61789726f444f96a0d28f57f", size = 8273212, upload-time = "2025-10-09T00:26:56.752Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37a1fea41153dd6ee061d21ab69c9cf2cf543160b1b85d89cd3d2e2a7902ca4c", size = 8128713, upload-time = "2025-10-09T00:26:59.001Z" }, + { url = "https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3c4ea4948d93c9c29dc01c0c23eef66f2101bf75158c291b88de6525c55c3d1", size = 8698527, upload-time = "2025-10-09T00:27:00.69Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7f/ccdca06f4c2e6c7989270ed7829b8679466682f4cfc0f8c9986241c023b6/matplotlib-3.10.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22df30ffaa89f6643206cf13877191c63a50e8f800b038bc39bee9d2d4957632", size = 9529690, upload-time = "2025-10-09T00:27:02.664Z" }, + { url = "https://files.pythonhosted.org/packages/b8/95/b80fc2c1f269f21ff3d193ca697358e24408c33ce2b106a7438a45407b63/matplotlib-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b69676845a0a66f9da30e87f48be36734d6748024b525ec4710be40194282c84", size = 9593732, upload-time = "2025-10-09T00:27:04.653Z" }, + { url = "https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:744991e0cc863dd669c8dc9136ca4e6e0082be2070b9d793cbd64bec872a6815", size = 8122727, upload-time = "2025-10-09T00:27:06.814Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a6/2faaf48133b82cf3607759027f82b5c702aa99cdfcefb7f93d6ccf26a424/matplotlib-3.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:fba2974df0bf8ce3c995fa84b79cde38326e0f7b5409e7a3a481c1141340bcf7", size = 7992958, upload-time = "2025-10-09T00:27:08.567Z" }, + { url = "https://files.pythonhosted.org/packages/4a/f0/b018fed0b599bd48d84c08794cb242227fe3341952da102ee9d9682db574/matplotlib-3.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:932c55d1fa7af4423422cb6a492a31cbcbdbe68fd1a9a3f545aa5e7a143b5355", size = 8316849, upload-time = "2025-10-09T00:27:10.254Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b7/bb4f23856197659f275e11a2a164e36e65e9b48ea3e93c4ec25b4f163198/matplotlib-3.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e38c2d581d62ee729a6e144c47a71b3f42fb4187508dbbf4fe71d5612c3433b", size = 8178225, upload-time = "2025-10-09T00:27:12.241Z" }, + { url = "https://files.pythonhosted.org/packages/62/56/0600609893ff277e6f3ab3c0cef4eafa6e61006c058e84286c467223d4d5/matplotlib-3.10.7-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:786656bb13c237bbcebcd402f65f44dd61ead60ee3deb045af429d889c8dbc67", size = 8711708, upload-time = "2025-10-09T00:27:13.879Z" }, + { url = "https://files.pythonhosted.org/packages/d8/1a/6bfecb0cafe94d6658f2f1af22c43b76cf7a1c2f0dc34ef84cbb6809617e/matplotlib-3.10.7-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09d7945a70ea43bf9248f4b6582734c2fe726723204a76eca233f24cffc7ef67", size = 9541409, upload-time = "2025-10-09T00:27:15.684Z" }, + { url = "https://files.pythonhosted.org/packages/08/50/95122a407d7f2e446fd865e2388a232a23f2b81934960ea802f3171518e4/matplotlib-3.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d0b181e9fa8daf1d9f2d4c547527b167cb8838fc587deabca7b5c01f97199e84", size = 9594054, upload-time = "2025-10-09T00:27:17.547Z" }, + { url = "https://files.pythonhosted.org/packages/13/76/75b194a43b81583478a81e78a07da8d9ca6ddf50dd0a2ccabf258059481d/matplotlib-3.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:31963603041634ce1a96053047b40961f7a29eb8f9a62e80cc2c0427aa1d22a2", size = 8200100, upload-time = "2025-10-09T00:27:20.039Z" }, + { url = "https://files.pythonhosted.org/packages/f5/9e/6aefebdc9f8235c12bdeeda44cc0383d89c1e41da2c400caf3ee2073a3ce/matplotlib-3.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:aebed7b50aa6ac698c90f60f854b47e48cd2252b30510e7a1feddaf5a3f72cbf", size = 8042131, upload-time = "2025-10-09T00:27:21.608Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4b/e5bc2c321b6a7e3a75638d937d19ea267c34bd5a90e12bee76c4d7c7a0d9/matplotlib-3.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d883460c43e8c6b173fef244a2341f7f7c0e9725c7fe68306e8e44ed9c8fb100", size = 8273787, upload-time = "2025-10-09T00:27:23.27Z" }, + { url = "https://files.pythonhosted.org/packages/86/ad/6efae459c56c2fbc404da154e13e3a6039129f3c942b0152624f1c621f05/matplotlib-3.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07124afcf7a6504eafcb8ce94091c5898bbdd351519a1beb5c45f7a38c67e77f", size = 8131348, upload-time = "2025-10-09T00:27:24.926Z" }, + { url = "https://files.pythonhosted.org/packages/a6/5a/a4284d2958dee4116359cc05d7e19c057e64ece1b4ac986ab0f2f4d52d5a/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c17398b709a6cce3d9fdb1595c33e356d91c098cd9486cb2cc21ea2ea418e715", size = 9533949, upload-time = "2025-10-09T00:27:26.704Z" }, + { url = "https://files.pythonhosted.org/packages/de/ff/f3781b5057fa3786623ad8976fc9f7b0d02b2f28534751fd5a44240de4cf/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7146d64f561498764561e9cd0ed64fcf582e570fc519e6f521e2d0cfd43365e1", size = 9804247, upload-time = "2025-10-09T00:27:28.514Z" }, + { url = "https://files.pythonhosted.org/packages/47/5a/993a59facb8444efb0e197bf55f545ee449902dcee86a4dfc580c3b61314/matplotlib-3.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90ad854c0a435da3104c01e2c6f0028d7e719b690998a2333d7218db80950722", size = 9595497, upload-time = "2025-10-09T00:27:30.418Z" }, + { url = "https://files.pythonhosted.org/packages/0d/a5/77c95aaa9bb32c345cbb49626ad8eb15550cba2e6d4c88081a6c2ac7b08d/matplotlib-3.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:4645fc5d9d20ffa3a39361fcdbcec731382763b623b72627806bf251b6388866", size = 8252732, upload-time = "2025-10-09T00:27:32.332Z" }, + { url = "https://files.pythonhosted.org/packages/74/04/45d269b4268d222390d7817dae77b159651909669a34ee9fdee336db5883/matplotlib-3.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:9257be2f2a03415f9105c486d304a321168e61ad450f6153d77c69504ad764bb", size = 8124240, upload-time = "2025-10-09T00:27:33.94Z" }, + { url = "https://files.pythonhosted.org/packages/4b/c7/ca01c607bb827158b439208c153d6f14ddb9fb640768f06f7ca3488ae67b/matplotlib-3.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1e4bbad66c177a8fdfa53972e5ef8be72a5f27e6a607cec0d8579abd0f3102b1", size = 8316938, upload-time = "2025-10-09T00:27:35.534Z" }, + { url = "https://files.pythonhosted.org/packages/84/d2/5539e66e9f56d2fdec94bb8436f5e449683b4e199bcc897c44fbe3c99e28/matplotlib-3.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d8eb7194b084b12feb19142262165832fc6ee879b945491d1c3d4660748020c4", size = 8178245, upload-time = "2025-10-09T00:27:37.334Z" }, + { url = "https://files.pythonhosted.org/packages/77/b5/e6ca22901fd3e4fe433a82e583436dd872f6c966fca7e63cf806b40356f8/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d41379b05528091f00e1728004f9a8d7191260f3862178b88e8fd770206318", size = 9541411, upload-time = "2025-10-09T00:27:39.387Z" }, + { url = "https://files.pythonhosted.org/packages/9e/99/a4524db57cad8fee54b7237239a8f8360bfcfa3170d37c9e71c090c0f409/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a74f79fafb2e177f240579bc83f0b60f82cc47d2f1d260f422a0627207008ca", size = 9803664, upload-time = "2025-10-09T00:27:41.492Z" }, + { url = "https://files.pythonhosted.org/packages/e6/a5/85e2edf76ea0ad4288d174926d9454ea85f3ce5390cc4e6fab196cbf250b/matplotlib-3.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:702590829c30aada1e8cef0568ddbffa77ca747b4d6e36c6d173f66e301f89cc", size = 9594066, upload-time = "2025-10-09T00:27:43.694Z" }, + { url = "https://files.pythonhosted.org/packages/39/69/9684368a314f6d83fe5c5ad2a4121a3a8e03723d2e5c8ea17b66c1bad0e7/matplotlib-3.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:f79d5de970fc90cd5591f60053aecfce1fcd736e0303d9f0bf86be649fa68fb8", size = 8342832, upload-time = "2025-10-09T00:27:45.543Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/e22e08da14bc1a0894184640d47819d2338b792732e20d292bf86e5ab785/matplotlib-3.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:cb783436e47fcf82064baca52ce748af71725d0352e1d31564cbe9c95df92b9c", size = 8172585, upload-time = "2025-10-09T00:27:47.185Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6c/a9bcf03e9afb2a873e0a5855f79bce476d1023f26f8212969f2b7504756c/matplotlib-3.10.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5c09cf8f2793f81368f49f118b6f9f937456362bee282eac575cca7f84cda537", size = 8241204, upload-time = "2025-10-09T00:27:48.806Z" }, + { url = "https://files.pythonhosted.org/packages/5b/fd/0e6f5aa762ed689d9fa8750b08f1932628ffa7ed30e76423c399d19407d2/matplotlib-3.10.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:de66744b2bb88d5cd27e80dfc2ec9f0517d0a46d204ff98fe9e5f2864eb67657", size = 8104607, upload-time = "2025-10-09T00:27:50.876Z" }, + { url = "https://files.pythonhosted.org/packages/b9/a9/21c9439d698fac5f0de8fc68b2405b738ed1f00e1279c76f2d9aa5521ead/matplotlib-3.10.7-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53cc80662dd197ece414dd5b66e07370201515a3eaf52e7c518c68c16814773b", size = 8682257, upload-time = "2025-10-09T00:27:52.597Z" }, + { url = "https://files.pythonhosted.org/packages/58/8f/76d5dc21ac64a49e5498d7f0472c0781dae442dd266a67458baec38288ec/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15112bcbaef211bd663fa935ec33313b948e214454d949b723998a43357b17b0", size = 8252283, upload-time = "2025-10-09T00:27:54.739Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/9c5d4c2317feb31d819e38c9f947c942f42ebd4eb935fc6fd3518a11eaa7/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d2a959c640cdeecdd2ec3136e8ea0441da59bcaf58d67e9c590740addba2cb68", size = 8116733, upload-time = "2025-10-09T00:27:56.406Z" }, + { url = "https://files.pythonhosted.org/packages/9a/cc/3fe688ff1355010937713164caacf9ed443675ac48a997bab6ed23b3f7c0/matplotlib-3.10.7-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3886e47f64611046bc1db523a09dd0a0a6bed6081e6f90e13806dd1d1d1b5e91", size = 8693919, upload-time = "2025-10-09T00:27:58.41Z" }, +] + [[package]] name = "mdurl" version = "0.1.2" @@ -1187,6 +1503,104 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, ] +[[package]] +name = "pillow" +version = "12.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/08/26e68b6b5da219c2a2cb7b563af008b53bb8e6b6fcb3fa40715fcdb2523a/pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b", size = 5289809, upload-time = "2025-10-15T18:21:27.791Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/4e58fb097fb74c7b4758a680aacd558810a417d1edaa7000142976ef9d2f/pillow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ac11e8ea4f611c3c0147424eae514028b5e9077dd99ab91e1bd7bc33ff145e1", size = 4650606, upload-time = "2025-10-15T18:21:29.823Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e0/1fa492aa9f77b3bc6d471c468e62bfea1823056bf7e5e4f1914d7ab2565e/pillow-12.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d49e2314c373f4c2b39446fb1a45ed333c850e09d0c59ac79b72eb3b95397363", size = 6221023, upload-time = "2025-10-15T18:21:31.415Z" }, + { url = "https://files.pythonhosted.org/packages/c1/09/4de7cd03e33734ccd0c876f0251401f1314e819cbfd89a0fcb6e77927cc6/pillow-12.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7b2a63fd6d5246349f3d3f37b14430d73ee7e8173154461785e43036ffa96ca", size = 8024937, upload-time = "2025-10-15T18:21:33.453Z" }, + { url = "https://files.pythonhosted.org/packages/2e/69/0688e7c1390666592876d9d474f5e135abb4acb39dcb583c4dc5490f1aff/pillow-12.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d64317d2587c70324b79861babb9c09f71fbb780bad212018874b2c013d8600e", size = 6334139, upload-time = "2025-10-15T18:21:35.395Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1c/880921e98f525b9b44ce747ad1ea8f73fd7e992bafe3ca5e5644bf433dea/pillow-12.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d77153e14b709fd8b8af6f66a3afbb9ed6e9fc5ccf0b6b7e1ced7b036a228782", size = 7026074, upload-time = "2025-10-15T18:21:37.219Z" }, + { url = "https://files.pythonhosted.org/packages/28/03/96f718331b19b355610ef4ebdbbde3557c726513030665071fd025745671/pillow-12.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32ed80ea8a90ee3e6fa08c21e2e091bba6eda8eccc83dbc34c95169507a91f10", size = 6448852, upload-time = "2025-10-15T18:21:39.168Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a0/6a193b3f0cc9437b122978d2c5cbce59510ccf9a5b48825096ed7472da2f/pillow-12.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c828a1ae702fc712978bda0320ba1b9893d99be0badf2647f693cc01cf0f04fa", size = 7117058, upload-time = "2025-10-15T18:21:40.997Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c4/043192375eaa4463254e8e61f0e2ec9a846b983929a8d0a7122e0a6d6fff/pillow-12.0.0-cp310-cp310-win32.whl", hash = "sha256:bd87e140e45399c818fac4247880b9ce719e4783d767e030a883a970be632275", size = 6295431, upload-time = "2025-10-15T18:21:42.518Z" }, + { url = "https://files.pythonhosted.org/packages/92/c6/c2f2fc7e56301c21827e689bb8b0b465f1b52878b57471a070678c0c33cd/pillow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:455247ac8a4cfb7b9bc45b7e432d10421aea9fc2e74d285ba4072688a74c2e9d", size = 7000412, upload-time = "2025-10-15T18:21:44.404Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d2/5f675067ba82da7a1c238a73b32e3fd78d67f9d9f80fbadd33a40b9c0481/pillow-12.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6ace95230bfb7cd79ef66caa064bbe2f2a1e63d93471c3a2e1f1348d9f22d6b7", size = 2435903, upload-time = "2025-10-15T18:21:46.29Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/a2f6773b64edb921a756eb0729068acad9fc5208a53f4a349396e9436721/pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc", size = 5289798, upload-time = "2025-10-15T18:21:47.763Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/069b1f8a2e4b5a37493da6c5868531c3f77b85e716ad7a590ef87d58730d/pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257", size = 4650589, upload-time = "2025-10-15T18:21:49.515Z" }, + { url = "https://files.pythonhosted.org/packages/61/e3/2c820d6e9a36432503ead175ae294f96861b07600a7156154a086ba7111a/pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642", size = 6230472, upload-time = "2025-10-15T18:21:51.052Z" }, + { url = "https://files.pythonhosted.org/packages/4f/89/63427f51c64209c5e23d4d52071c8d0f21024d3a8a487737caaf614a5795/pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3", size = 8033887, upload-time = "2025-10-15T18:21:52.604Z" }, + { url = "https://files.pythonhosted.org/packages/f6/1b/c9711318d4901093c15840f268ad649459cd81984c9ec9887756cca049a5/pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c", size = 6343964, upload-time = "2025-10-15T18:21:54.619Z" }, + { url = "https://files.pythonhosted.org/packages/41/1e/db9470f2d030b4995083044cd8738cdd1bf773106819f6d8ba12597d5352/pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227", size = 7034756, upload-time = "2025-10-15T18:21:56.151Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b0/6177a8bdd5ee4ed87cba2de5a3cc1db55ffbbec6176784ce5bb75aa96798/pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b", size = 6458075, upload-time = "2025-10-15T18:21:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/bc/5e/61537aa6fa977922c6a03253a0e727e6e4a72381a80d63ad8eec350684f2/pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e", size = 7125955, upload-time = "2025-10-15T18:21:59.372Z" }, + { url = "https://files.pythonhosted.org/packages/1f/3d/d5033539344ee3cbd9a4d69e12e63ca3a44a739eb2d4c8da350a3d38edd7/pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739", size = 6298440, upload-time = "2025-10-15T18:22:00.982Z" }, + { url = "https://files.pythonhosted.org/packages/4d/42/aaca386de5cc8bd8a0254516957c1f265e3521c91515b16e286c662854c4/pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e", size = 6999256, upload-time = "2025-10-15T18:22:02.617Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f1/9197c9c2d5708b785f631a6dfbfa8eb3fb9672837cb92ae9af812c13b4ed/pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d", size = 2436025, upload-time = "2025-10-15T18:22:04.598Z" }, + { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" }, + { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399, upload-time = "2025-10-15T18:22:10.872Z" }, + { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740, upload-time = "2025-10-15T18:22:12.769Z" }, + { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201, upload-time = "2025-10-15T18:22:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334, upload-time = "2025-10-15T18:22:16.375Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162, upload-time = "2025-10-15T18:22:17.996Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769, upload-time = "2025-10-15T18:22:19.923Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107, upload-time = "2025-10-15T18:22:21.644Z" }, + { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, + { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, + { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, + { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, + { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, + { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, + { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, + { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, + { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, + { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, + { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, + { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, + { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, + { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, + { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, + { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, + { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, + { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, + { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, + { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, + { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, + { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, + { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, + { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, + { url = "https://files.pythonhosted.org/packages/1d/b3/582327e6c9f86d037b63beebe981425d6811104cb443e8193824ef1a2f27/pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8", size = 5215068, upload-time = "2025-10-15T18:23:59.594Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/67748211d119f3b6540baf90f92fae73ae51d5217b171b0e8b5f7e5d558f/pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a", size = 4614994, upload-time = "2025-10-15T18:24:01.669Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e1/f8281e5d844c41872b273b9f2c34a4bf64ca08905668c8ae730eedc7c9fa/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197", size = 5246639, upload-time = "2025-10-15T18:24:03.403Z" }, + { url = "https://files.pythonhosted.org/packages/94/5a/0d8ab8ffe8a102ff5df60d0de5af309015163bf710c7bb3e8311dd3b3ad0/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c", size = 6986839, upload-time = "2025-10-15T18:24:05.344Z" }, + { url = "https://files.pythonhosted.org/packages/20/2e/3434380e8110b76cd9eb00a363c484b050f949b4bbe84ba770bb8508a02c/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e", size = 5313505, upload-time = "2025-10-15T18:24:07.137Z" }, + { url = "https://files.pythonhosted.org/packages/57/ca/5a9d38900d9d74785141d6580950fe705de68af735ff6e727cb911b64740/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76", size = 5963654, upload-time = "2025-10-15T18:24:09.579Z" }, + { url = "https://files.pythonhosted.org/packages/95/7e/f896623c3c635a90537ac093c6a618ebe1a90d87206e42309cb5d98a1b9e/pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5", size = 6997850, upload-time = "2025-10-15T18:24:11.495Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" @@ -1328,6 +1742,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pyparsing" +version = "3.2.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, +] + [[package]] name = "pyproject-hooks" version = "1.2.0"