From bd17384945f8e0d52bda16b420021bf774fc5602 Mon Sep 17 00:00:00 2001 From: Nico Ritschel Date: Fri, 9 Jan 2026 13:45:08 -0800 Subject: [PATCH 1/4] Add widget assets and malloy extra --- .gitignore | 9 + README.md | 20 + examples/widget_demo.ipynb | 401 ++++++++++ js/bun.lock | 117 +++ js/package.json | 15 + js/widget.js | 808 +++++++++++++++++++++ pyproject.toml | 13 + sidemantic/loaders.py | 11 +- sidemantic/sql/generator.py | 5 +- sidemantic/widget/__init__.py | 5 + sidemantic/widget/_auto_model.py | 147 ++++ sidemantic/widget/_data_registry.py | 85 +++ sidemantic/widget/_widget.py | 516 +++++++++++++ sidemantic/widget/static/widget.css | 462 ++++++++++++ sidemantic/widget/static/widget.js | 84 +++ uv.lock | 1045 ++++++++++++++++++++++++++- 16 files changed, 3738 insertions(+), 5 deletions(-) create mode 100644 examples/widget_demo.ipynb create mode 100644 js/bun.lock create mode 100644 js/package.json create mode 100644 js/widget.js create mode 100644 sidemantic/widget/__init__.py create mode 100644 sidemantic/widget/_auto_model.py create mode 100644 sidemantic/widget/_data_registry.py create mode 100644 sidemantic/widget/_widget.py create mode 100644 sidemantic/widget/static/widget.css create mode 100644 sidemantic/widget/static/widget.js diff --git a/.gitignore b/.gitignore index cca3797c..7ff678dd 100644 --- a/.gitignore +++ b/.gitignore @@ -21,9 +21,16 @@ htmlcov/ .DS_Store .idea/ .vscode/ +.wrangler/ # Local example DBs examples/*.db +examples/.ipynb_checkpoints/ +examples/juv.tmp*.py + +# Local parquet files (large demo data) +/le_places.parquet +/categories.parquet # Package installers *.pkg @@ -38,3 +45,5 @@ sidemantic_definitions.sql node_modules/ bun.lockb package.json +!js/package.json +!js/bun.lock diff --git a/README.md b/README.md index a9fc7661..ddde476d 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,26 @@ Install: uv add sidemantic ``` +Malloy support (uv): +```bash +uv add "sidemantic[malloy]" +``` + +Notebook widget (uv): +```bash +uv add "sidemantic[widget]" jupyterlab +uv run jupyter lab +``` + +```python +import duckdb +from sidemantic.widget import MetricsExplorer + +conn = duckdb.connect(":memory:") +conn.execute("create table t as select 1 as value, 'a' as category, date '2024-01-01' as d") +MetricsExplorer(conn.table("t"), time_dimension="d") +``` + Define models in SQL, YAML, or Python:
diff --git a/examples/widget_demo.ipynb b/examples/widget_demo.ipynb new file mode 100644 index 00000000..bc758fe7 --- /dev/null +++ b/examples/widget_demo.ipynb @@ -0,0 +1,401 @@ +{ + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "import duckdb\n", + "\n", + "# Load real auction data (~1.4M rows)\n", + "conn = duckdb.connect(\":memory:\")\n", + "conn.execute(\"\"\"\n", + "create table auctions as\n", + "select *\n", + "from 'https://sampledata.sidequery.dev/sidemantic-demo/auction_data.parquet'\n", + "--cross join range(2)\n", + "\"\"\")\n", + "\n", + "# Preview\n", + "conn.execute(\"SELECT * FROM auctions LIMIT 5\")" + ] +} +{ + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "from sidemantic.widget import MetricsExplorer\n", + "\n", + "# Simple mode: just pass data (DuckDB relation)\n", + "widget = MetricsExplorer(conn.table(\"auctions\"))\n", + "widget" + ] +} +{ + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "# With cardinality threshold - skip dimensions with more than 50 unique values\n", + "widget2 = MetricsExplorer(conn.table(\"auctions\"), max_dimension_cardinality=50)\n", + "widget2" + ] +} +{ + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "from sidemantic import Dimension, Metric, Model, SemanticLayer\n", + "from sidemantic.db.duckdb import DuckDBAdapter\n", + "\n", + "# Define semantic model for auction analytics\n", + "auction_model = Model(\n", + " name=\"auctions\",\n", + " table=\"auctions_with_id\",\n", + " primary_key=\"id\",\n", + " default_time_dimension=\"__time\", # Widget uses this for sparklines automatically!\n", + " dimensions=[\n", + " Dimension(name=\"__time\", type=\"time\", granularity=\"day\"),\n", + " Dimension(name=\"device_type\", type=\"categorical\"),\n", + " Dimension(name=\"device_os\", type=\"categorical\"),\n", + " Dimension(name=\"app_or_site\", type=\"categorical\"),\n", + " Dimension(name=\"ad_position\", type=\"categorical\"),\n", + " Dimension(name=\"placement_type\", type=\"categorical\"),\n", + " Dimension(name=\"auction_type\", type=\"categorical\"),\n", + " Dimension(name=\"bid_floor_bucket\", type=\"categorical\"),\n", + " Dimension(name=\"platform_browser\", type=\"categorical\"),\n", + " Dimension(name=\"video_max_duration_bucket\", type=\"categorical\"),\n", + " Dimension(name=\"video_min_duration_bucket\", type=\"categorical\"),\n", + " Dimension(name=\"ad_size\", type=\"categorical\"),\n", + " Dimension(name=\"device_region\", type=\"categorical\"),\n", + " Dimension(name=\"device_osv\", type=\"categorical\"),\n", + " Dimension(name=\"app_site_cat\", type=\"categorical\"),\n", + " ],\n", + " metrics=[\n", + " Metric(name=\"bid_requests\", sql=\"sum(bid_request_cnt)\"),\n", + " Metric(name=\"bid_floor_requests\", sql=\"sum(has_bid_floor_cnt)\"),\n", + " Metric(name=\"avg_bid_floor\", sql=\"avg(bid_floor)\"),\n", + " ],\n", + ")\n", + "\n", + "# Create semantic layer\n", + "adapter = DuckDBAdapter(\":memory:\")\n", + "\n", + "# Copy data to new connection with id column\n", + "adapter.conn.execute(\"\"\"\n", + " CREATE TABLE auctions_with_id AS\n", + " SELECT row_number() OVER () as id, *\n", + " FROM 'https://sampledata.sidequery.dev/sidemantic-demo/auction_data.parquet'\n", + "\"\"\")\n", + "\n", + "layer = SemanticLayer(connection=adapter)\n", + "layer.add_model(auction_model)\n", + "\n", + "# Simple! Just pass the layer - time dimension and metrics auto-detected\n", + "widget3 = MetricsExplorer(layer)\n", + "widget3" + ] +} +{ + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "from sidemantic import PreAggregation\n", + "\n", + "# Define model with pre-aggregations for faster widget queries\n", + "# Same dimensions as Mode 3 - preaggregations cover the most common queries\n", + "auction_model_preagg = Model(\n", + " name=\"auctions\",\n", + " table=\"auctions_with_id\",\n", + " primary_key=\"id\",\n", + " default_time_dimension=\"__time\",\n", + " dimensions=[\n", + " Dimension(name=\"__time\", type=\"time\", granularity=\"day\"),\n", + " Dimension(name=\"device_type\", type=\"categorical\"),\n", + " Dimension(name=\"device_os\", type=\"categorical\"),\n", + " Dimension(name=\"app_or_site\", type=\"categorical\"),\n", + " Dimension(name=\"ad_position\", type=\"categorical\"),\n", + " Dimension(name=\"placement_type\", type=\"categorical\"),\n", + " Dimension(name=\"auction_type\", type=\"categorical\"),\n", + " Dimension(name=\"bid_floor_bucket\", type=\"categorical\"),\n", + " Dimension(name=\"platform_browser\", type=\"categorical\"),\n", + " Dimension(name=\"video_max_duration_bucket\", type=\"categorical\"),\n", + " Dimension(name=\"video_min_duration_bucket\", type=\"categorical\"),\n", + " Dimension(name=\"ad_size\", type=\"categorical\"),\n", + " Dimension(name=\"device_region\", type=\"categorical\"),\n", + " Dimension(name=\"device_osv\", type=\"categorical\"),\n", + " Dimension(name=\"app_site_cat\", type=\"categorical\"),\n", + " ],\n", + " metrics=[\n", + " Metric(name=\"bid_requests\", sql=\"sum(bid_request_cnt)\"),\n", + " Metric(name=\"bid_floor_requests\", sql=\"sum(has_bid_floor_cnt)\"),\n", + " Metric(name=\"avg_bid_floor\", sql=\"avg(bid_floor)\"),\n", + " ],\n", + " pre_aggregations=[\n", + " # Daily rollup for time-series (sparklines)\n", + " PreAggregation(\n", + " name=\"daily_metrics\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " time_dimension=\"__time\",\n", + " granularity=\"day\",\n", + " ),\n", + " # Per-dimension rollups for leaderboards\n", + " PreAggregation(\n", + " name=\"by_device_type\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"device_type\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_device_os\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"device_os\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_app_or_site\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"app_or_site\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_ad_position\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"ad_position\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_placement_type\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"placement_type\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_auction_type\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"auction_type\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_bid_floor_bucket\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"bid_floor_bucket\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_platform_browser\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"platform_browser\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_video_max_duration_bucket\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"video_max_duration_bucket\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_video_min_duration_bucket\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"video_min_duration_bucket\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_ad_size\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"ad_size\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_device_region\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"device_region\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_device_osv\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"device_osv\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_app_site_cat\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"app_site_cat\"],\n", + " ),\n", + " ],\n", + ")\n", + "\n", + "# Create layer with preaggregations enabled\n", + "adapter_preagg = DuckDBAdapter(\":memory:\")\n", + "adapter_preagg.conn.execute(\"\"\"\n", + " CREATE TABLE auctions_with_id AS\n", + " SELECT row_number() OVER () as id, *\n", + " FROM 'https://sampledata.sidequery.dev/sidemantic-demo/auction_data.parquet'\n", + "\"\"\")\n", + "\n", + "layer_preagg = SemanticLayer(connection=adapter_preagg, use_preaggregations=True)\n", + "layer_preagg.add_model(auction_model_preagg)\n", + "\n", + "# Materialize the pre-aggregations (creates actual tables)\n", + "for preagg in auction_model_preagg.pre_aggregations:\n", + " table_name = preagg.get_table_name(\"auctions\")\n", + " source_sql = preagg.generate_materialization_sql(auction_model_preagg)\n", + " adapter_preagg.conn.execute(f\"CREATE OR REPLACE TABLE {table_name} AS {source_sql}\")\n", + " print(f\"Created pre-aggregation: {table_name}\")\n", + "\n", + "# Widget now uses pre-aggregated tables for compatible queries\n", + "widget4 = MetricsExplorer(layer_preagg)\n", + "widget4" + ] +} +{ + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "# Load Foursquare Places dataset (106M rows)\n", + "# Join with categories to get human-readable category names\n", + "fsq_conn = duckdb.connect(\":memory:\")\n", + "fsq_conn.execute(\"\"\"\n", + " CREATE TABLE places AS\n", + " SELECT \n", + " p.country,\n", + " p.region,\n", + " p.locality,\n", + " p.admin_region,\n", + " c.level1_category_name as category_l1,\n", + " c.level2_category_name as category_l2,\n", + " c.level3_category_name as category_l3,\n", + " CAST(p.date_created AS DATE) AS date_created,\n", + " p.latitude,\n", + " p.longitude\n", + " FROM 'https://sampledata.sidequery.dev/sidemantic-demo/places.parquet' p\n", + " LEFT JOIN 'https://sampledata.sidequery.dev/sidemantic-demo/categories.parquet' c \n", + " ON c.category_id = p.fsq_category_ids[1]\n", + "\"\"\")\n", + "\n", + "# Use cardinality threshold to skip high-cardinality dimensions like locality\n", + "widget5 = MetricsExplorer(\n", + " fsq_conn.table(\"places\"),\n", + " max_dimension_cardinality=2500, # Skip dimensions with >300 unique values\n", + " time_dimension=\"date_created\",\n", + ")\n", + "widget5" + ] +} +{ + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "from sidemantic import Dimension, Metric, Model, PreAggregation, SemanticLayer\n", + "from sidemantic.db.duckdb import DuckDBAdapter\n", + "\n", + "places_model_preagg = Model(\n", + " name=\"places\",\n", + " table=\"places\",\n", + " primary_key=\"rowid\",\n", + " default_time_dimension=\"date_created\",\n", + " dimensions=[\n", + " Dimension(name=\"date_created\", type=\"time\", granularity=\"day\"),\n", + " Dimension(name=\"country\", type=\"categorical\"),\n", + " Dimension(name=\"region\", type=\"categorical\"),\n", + " Dimension(name=\"admin_region\", type=\"categorical\"),\n", + " Dimension(name=\"category_l1\", type=\"categorical\"),\n", + " Dimension(name=\"category_l2\", type=\"categorical\"),\n", + " Dimension(name=\"category_l3\", type=\"categorical\"),\n", + " ],\n", + " metrics=[\n", + " Metric(name=\"row_count\", agg=\"count\"),\n", + " Metric(name=\"sum_latitude\", sql=\"sum(latitude)\"),\n", + " Metric(name=\"sum_longitude\", sql=\"sum(longitude)\"),\n", + " ],\n", + " pre_aggregations=[\n", + " PreAggregation(\n", + " name=\"daily_metrics\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " time_dimension=\"date_created\",\n", + " granularity=\"day\",\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_country\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " dimensions=[\"country\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_region\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " dimensions=[\"region\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_admin_region\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " dimensions=[\"admin_region\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_category_l1\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " dimensions=[\"category_l1\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_category_l2\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " dimensions=[\"category_l2\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_category_l3\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " dimensions=[\"category_l3\"],\n", + " ),\n", + " ],\n", + ")\n", + "\n", + "adapter_fsq_preagg = DuckDBAdapter(\":memory:\")\n", + "adapter_fsq_preagg.conn = fsq_conn\n", + "\n", + "layer_fsq_preagg = SemanticLayer(connection=adapter_fsq_preagg, use_preaggregations=True)\n", + "layer_fsq_preagg.add_model(places_model_preagg)\n", + "\n", + "for preagg in places_model_preagg.pre_aggregations:\n", + " table_name = preagg.get_table_name(\"places\")\n", + " source_sql = preagg.generate_materialization_sql(places_model_preagg)\n", + " adapter_fsq_preagg.conn.execute(f\"CREATE OR REPLACE TABLE {table_name} AS {source_sql}\")\n", + " print(f\"Created pre-aggregation: {table_name}\")\n", + "\n", + "widget6 = MetricsExplorer(layer_fsq_preagg)\n", + "widget6" + ] +} +{ + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "# After interacting with the widget, check the filters\n", + "print(\"Current filters:\", widget.filters)\n", + "print(\"Selected metric:\", widget.selected_metric)\n", + "print(\"Date range:\", widget.date_range)" + ] +} +{ + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [] +} diff --git a/js/bun.lock b/js/bun.lock new file mode 100644 index 00000000..7c5d7e84 --- /dev/null +++ b/js/bun.lock @@ -0,0 +1,117 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "sidemantic-widget-js", + "dependencies": { + "apache-arrow": "^17.0.0", + }, + "devDependencies": { + "esbuild": "^0.20.0", + }, + }, + }, + "packages": { + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.20.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.20.2", "", { "os": "android", "cpu": "arm" }, "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.20.2", "", { "os": "android", "cpu": "arm64" }, "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.20.2", "", { "os": "android", "cpu": "x64" }, "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.20.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.20.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.20.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.20.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.20.2", "", { "os": "linux", "cpu": "arm" }, "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.20.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.20.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.20.2", "", { "os": "linux", "cpu": "none" }, "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.20.2", "", { "os": "linux", "cpu": "none" }, "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.20.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.20.2", "", { "os": "linux", "cpu": "none" }, "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.20.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.20.2", "", { "os": "linux", "cpu": "x64" }, "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.20.2", "", { "os": "none", "cpu": "x64" }, "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.20.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.20.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.20.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.20.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.20.2", "", { "os": "win32", "cpu": "x64" }, "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ=="], + + "@swc/helpers": ["@swc/helpers@0.5.18", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ=="], + + "@types/command-line-args": ["@types/command-line-args@5.2.3", "", {}, "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw=="], + + "@types/command-line-usage": ["@types/command-line-usage@5.0.4", "", {}, "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg=="], + + "@types/node": ["@types/node@20.19.27", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "apache-arrow": ["apache-arrow@17.0.0", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/command-line-args": "^5.2.3", "@types/command-line-usage": "^5.0.4", "@types/node": "^20.13.0", "command-line-args": "^5.2.1", "command-line-usage": "^7.0.1", "flatbuffers": "^24.3.25", "json-bignum": "^0.0.3", "tslib": "^2.6.2" }, "bin": { "arrow2csv": "bin/arrow2csv.cjs" } }, "sha512-X0p7auzdnGuhYMVKYINdQssS4EcKec9TCXyez/qtJt32DrIMGbzqiaMiQ0X6fQlQpw8Fl0Qygcv4dfRAr5Gu9Q=="], + + "array-back": ["array-back@3.1.0", "", {}, "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chalk-template": ["chalk-template@0.4.0", "", { "dependencies": { "chalk": "^4.1.2" } }, "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "command-line-args": ["command-line-args@5.2.1", "", { "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", "lodash.camelcase": "^4.3.0", "typical": "^4.0.0" } }, "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg=="], + + "command-line-usage": ["command-line-usage@7.0.3", "", { "dependencies": { "array-back": "^6.2.2", "chalk-template": "^0.4.0", "table-layout": "^4.1.0", "typical": "^7.1.1" } }, "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q=="], + + "esbuild": ["esbuild@0.20.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.20.2", "@esbuild/android-arm": "0.20.2", "@esbuild/android-arm64": "0.20.2", "@esbuild/android-x64": "0.20.2", "@esbuild/darwin-arm64": "0.20.2", "@esbuild/darwin-x64": "0.20.2", "@esbuild/freebsd-arm64": "0.20.2", "@esbuild/freebsd-x64": "0.20.2", "@esbuild/linux-arm": "0.20.2", "@esbuild/linux-arm64": "0.20.2", "@esbuild/linux-ia32": "0.20.2", "@esbuild/linux-loong64": "0.20.2", "@esbuild/linux-mips64el": "0.20.2", "@esbuild/linux-ppc64": "0.20.2", "@esbuild/linux-riscv64": "0.20.2", "@esbuild/linux-s390x": "0.20.2", "@esbuild/linux-x64": "0.20.2", "@esbuild/netbsd-x64": "0.20.2", "@esbuild/openbsd-x64": "0.20.2", "@esbuild/sunos-x64": "0.20.2", "@esbuild/win32-arm64": "0.20.2", "@esbuild/win32-ia32": "0.20.2", "@esbuild/win32-x64": "0.20.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g=="], + + "find-replace": ["find-replace@3.0.0", "", { "dependencies": { "array-back": "^3.0.1" } }, "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ=="], + + "flatbuffers": ["flatbuffers@24.12.23", "", {}, "sha512-dLVCAISd5mhls514keQzmEG6QHmUUsNuWsb4tFafIUwvvgDjXhtfAYSKOzt5SWOy+qByV5pbsDZ+Vb7HUOBEdA=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "json-bignum": ["json-bignum@0.0.3", "", {}, "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "table-layout": ["table-layout@4.1.1", "", { "dependencies": { "array-back": "^6.2.2", "wordwrapjs": "^5.1.0" } }, "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "typical": ["typical@4.0.0", "", {}, "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw=="], + + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "wordwrapjs": ["wordwrapjs@5.1.1", "", {}, "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg=="], + + "command-line-usage/array-back": ["array-back@6.2.2", "", {}, "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw=="], + + "command-line-usage/typical": ["typical@7.3.0", "", {}, "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw=="], + + "table-layout/array-back": ["array-back@6.2.2", "", {}, "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw=="], + } +} diff --git a/js/package.json b/js/package.json new file mode 100644 index 00000000..24cf728f --- /dev/null +++ b/js/package.json @@ -0,0 +1,15 @@ +{ + "name": "sidemantic-widget-js", + "private": true, + "type": "module", + "scripts": { + "build": "esbuild widget.js --bundle --format=esm --outfile=../sidemantic/widget/static/widget.js --minify", + "watch": "esbuild widget.js --bundle --format=esm --outfile=../sidemantic/widget/static/widget.js --watch" + }, + "devDependencies": { + "esbuild": "^0.20.0" + }, + "dependencies": { + "apache-arrow": "^17.0.0" + } +} diff --git a/js/widget.js b/js/widget.js new file mode 100644 index 00000000..2751bac7 --- /dev/null +++ b/js/widget.js @@ -0,0 +1,808 @@ +/** + * Sidemantic MetricsExplorer anywidget + * + * Ported from the sidemantic-demo Pyodide implementation. + * Renders metric cards with sparklines and dimension leaderboards. + */ + +import { tableFromIPC } from "apache-arrow"; + +// ============================================================================ +// Utility Functions +// ============================================================================ + +function formatNumber(value, format = "number") { + if (value == null || !Number.isFinite(value)) return "—"; + if (format === "currency") { + return `$${Number(value).toFixed(2)}`; + } + return Number(value).toLocaleString(); +} + +function formatDate(date) { + if (!date) return ""; + if (typeof date === "string") return date.slice(0, 10); + // Handle Arrow date values (milliseconds since epoch or Date objects) + if (date instanceof Date) { + return date.toISOString().slice(0, 10); + } + // Arrow returns dates as numbers (days, seconds, or milliseconds) + if (typeof date === "number" || typeof date === "bigint") { + const ms = typeof date === "bigint" ? Number(date) : date; + if (ms > 1e12) { + return new Date(ms).toISOString().slice(0, 10); + } + if (ms > 1e9) { + return new Date(ms * 1000).toISOString().slice(0, 10); + } + return new Date(ms * 86400000).toISOString().slice(0, 10); + } + // Fallback: try to convert to string + return String(date).slice(0, 10); +} + +function formatShortDate(dateStr) { + const date = new Date(dateStr + "T00:00:00Z"); + return date.toLocaleDateString("en-US", { month: "short", day: "numeric" }); +} + +function formatRangeShort(start, end) { + const startDate = new Date(start + "T00:00:00Z"); + const endDate = new Date(end + "T00:00:00Z"); + const sameYear = startDate.getFullYear() === endDate.getFullYear(); + const startLabel = startDate.toLocaleDateString("en-US", { + month: "short", + day: "numeric", + year: sameYear ? undefined : "numeric", + }); + const endLabel = endDate.toLocaleDateString("en-US", { + month: "short", + day: "numeric", + year: "numeric", + }); + return `${startLabel} – ${endLabel}`; +} + +function formatComparison(value) { + if (!Number.isFinite(value)) { + return { text: "WoW —", className: "metric-delta" }; + } + const sign = value > 0 ? "+" : ""; + const className = + value > 0 + ? "metric-delta positive" + : value < 0 + ? "metric-delta negative" + : "metric-delta"; + return { text: `WoW ${sign}${value.toFixed(1)}%`, className }; +} + +function daysBetween(start, end) { + const msPerDay = 24 * 60 * 60 * 1000; + const startDate = new Date(start + "T00:00:00Z"); + const endDate = new Date(end + "T00:00:00Z"); + return Math.max(1, Math.round((endDate - startDate) / msPerDay) + 1); +} + +// ============================================================================ +// Arrow IPC Parsing Helper +// ============================================================================ + +function parseArrowIPC(dataRaw) { + if (!dataRaw || (dataRaw.byteLength !== undefined && dataRaw.byteLength === 0)) { + return null; + } + + let data; + if (dataRaw instanceof DataView) { + data = new Uint8Array( + dataRaw.buffer.slice( + dataRaw.byteOffset, + dataRaw.byteOffset + dataRaw.byteLength + ) + ); + } else if (dataRaw instanceof Uint8Array) { + data = dataRaw; + } else if (dataRaw instanceof ArrayBuffer) { + data = new Uint8Array(dataRaw); + } else { + console.error("Unknown data type:", dataRaw); + return null; + } + + const table = tableFromIPC(data); + const rows = []; + for (let i = 0; i < table.numRows; i++) { + const row = {}; + for (const field of table.schema.fields) { + row[field.name] = table.getChild(field.name)?.get(i); + } + rows.push(row); + } + return rows; +} + +// ============================================================================ +// SVG Sparkline +// ============================================================================ + +function sparklineSvg(values) { + if (!values || !values.length) return ""; + + // Use higher resolution viewBox for smoother rendering + const height = 60; + const width = values.length > 1 ? values.length - 1 : 1; + const min = Math.min(...values); + const max = Math.max(...values); + const range = max - min || 1; + + // One point per data value for pixel-perfect alignment + const points = values.map((value, idx) => { + const x = idx; + const y = height - ((value - min) / range) * height; + return [x.toFixed(2), y.toFixed(2)]; + }); + + const line = points.map(([x, y]) => `${x},${y}`).join(" "); + const area = `0,${height} ${line} ${width},${height}`; + + return ` + + + + + `; +} + +// ============================================================================ +// Skeleton Components +// ============================================================================ + +function renderMetricSkeleton() { + const skeleton = document.createElement("div"); + skeleton.className = "metric-skeleton"; + skeleton.innerHTML = ` +
+
+
+
+
+
+
+
+
+
+
+ `; + return skeleton; +} + +function renderDimensionSkeleton(label) { + const skeleton = document.createElement("div"); + skeleton.className = "skeleton-card"; + skeleton.innerHTML = ` +
+ ${Array(6) + .fill(0) + .map( + () => ` +
+
+
+ ` + ) + .join("")} + `; + return skeleton; +} + +// ============================================================================ +// Metric Card Component +// ============================================================================ + +function renderMetricCard( + metricConfig, + series, + total, + dateRange, + selectedMetric, + dates, + onHover, + onBrush +) { + const rangeLabel = + dateRange && dateRange.length === 2 + ? formatRangeShort(dateRange[0], dateRange[1]) + : ""; + + const isActive = metricConfig.key === selectedMetric; + const formattedValue = formatNumber(total, metricConfig.format); + + const card = document.createElement("div"); + card.className = `metric-card${isActive ? " active" : ""}`; + card.dataset.metric = metricConfig.key; + + card.innerHTML = ` +
+
+

${metricConfig.label}

+ ${rangeLabel} +
+
+
${formattedValue}
+
+
+
+ ${sparklineSvg(series)} +
+
+
+ `; + + // Sparkline hover and brush interactions + const sparklineWrap = card.querySelector(".sparkline-wrap"); + const hoverLine = card.querySelector(".hover-line"); + const brushSelection = card.querySelector(".brush-selection"); + const metricRangeEl = card.querySelector(".metric-range"); + const metricValueEl = card.querySelector(".metric-value"); + + let brushState = null; + let originalRange = rangeLabel; + let originalValue = formattedValue; + + // Hover: show vertical line and update value + sparklineWrap.addEventListener("pointermove", (e) => { + if (brushState) return; // Don't show hover during brush + + const rect = sparklineWrap.getBoundingClientRect(); + const x = e.clientX - rect.left; + const pct = x / rect.width; + const idx = Math.max(0, Math.min(series.length - 1, Math.round(pct * (series.length - 1)))); + + hoverLine.style.left = `${pct * 100}%`; + hoverLine.style.opacity = "1"; + + // Update displayed value and date + if (dates && dates[idx]) { + metricRangeEl.textContent = formatShortDate(dates[idx]); + } + metricValueEl.textContent = formatNumber(series[idx], metricConfig.format); + }); + + sparklineWrap.addEventListener("pointerleave", () => { + if (brushState) return; + hoverLine.style.opacity = "0"; + metricRangeEl.textContent = originalRange; + metricValueEl.textContent = originalValue; + }); + + // Brush: click-drag to select date range + sparklineWrap.addEventListener("pointerdown", (e) => { + sparklineWrap.setPointerCapture(e.pointerId); + const rect = sparklineWrap.getBoundingClientRect(); + const startX = e.clientX - rect.left; + brushState = { startX, rect }; + + brushSelection.style.left = `${(startX / rect.width) * 100}%`; + brushSelection.style.width = "0"; + brushSelection.style.display = "block"; + hoverLine.style.opacity = "0"; + }); + + sparklineWrap.addEventListener("pointermove", (e) => { + if (!brushState) return; + + const { startX, rect } = brushState; + const currentX = e.clientX - rect.left; + const left = Math.min(startX, currentX); + const width = Math.abs(currentX - startX); + + brushSelection.style.left = `${(left / rect.width) * 100}%`; + brushSelection.style.width = `${(width / rect.width) * 100}%`; + }); + + sparklineWrap.addEventListener("pointerup", (e) => { + if (!brushState) return; + + const { startX, rect } = brushState; + const endX = e.clientX - rect.left; + const width = rect.width; + + sparklineWrap.releasePointerCapture(e.pointerId); + + // Only trigger brush if dragged more than 6px + if (Math.abs(endX - startX) > 6 && dates && dates.length > 0) { + const startPct = Math.max(0, Math.min(1, startX / width)); + const endPct = Math.max(0, Math.min(1, endX / width)); + + const startIdx = Math.round(startPct * (dates.length - 1)); + const endIdx = Math.round(endPct * (dates.length - 1)); + + const minIdx = Math.min(startIdx, endIdx); + const maxIdx = Math.max(startIdx, endIdx); + + if (onBrush) { + onBrush(dates[minIdx], dates[maxIdx]); + } + } + + brushState = null; + brushSelection.style.display = "none"; + }); + + // Double-click to clear brush + sparklineWrap.addEventListener("dblclick", () => { + if (onBrush) { + onBrush(null, null); + } + }); + + return card; +} + +// ============================================================================ +// Dimension Leaderboard Component +// ============================================================================ + +function renderDimensionCard( + dimConfig, + rows, + selectedMetric, + activeFilters, + onFilterClick +) { + const maxValue = Math.max( + ...rows.map((row) => Number(row[selectedMetric]) || 0), + 1 + ); + + const card = document.createElement("div"); + card.className = "dim-card"; + card.dataset.dim = dimConfig.key; + + card.innerHTML = `

${dimConfig.label}

`; + + rows.forEach((row) => { + const value = row[dimConfig.key]; + const metricValue = Number(row[selectedMetric]) || 0; + const width = Math.round((metricValue / maxValue) * 100); + + const rowEl = document.createElement("div"); + const isSelected = + activeFilters[dimConfig.key] && + activeFilters[dimConfig.key].includes(String(value)); + rowEl.className = `dim-row${isSelected ? " active" : ""}`; + rowEl.dataset.value = String(value); + + rowEl.innerHTML = ` +
+ ${value} + ${formatNumber(metricValue)} + `; + + rowEl.addEventListener("click", () => { + onFilterClick(dimConfig.key, String(value)); + }); + + card.appendChild(rowEl); + }); + + return card; +} + +// ============================================================================ +// Filter Pills Component +// ============================================================================ + +function renderFilterPills( + container, + filters, + dateRange, + brushSelection, + onRemoveFilter, + onClearBrush +) { + container.innerHTML = ""; + + let hasFilter = false; + + // Brush selection pill + if (brushSelection && brushSelection.length === 2 && brushSelection[0] && brushSelection[1]) { + hasFilter = true; + const pill = document.createElement("span"); + pill.className = "pill"; + pill.textContent = `Date: ${formatDate(brushSelection[0])} → ${formatDate(brushSelection[1])} ×`; + pill.addEventListener("click", onClearBrush); + container.appendChild(pill); + } + + // Dimension filter pills + Object.entries(filters).forEach(([dimKey, values]) => { + if (values && values.length > 0) { + values.forEach((value) => { + hasFilter = true; + const pill = document.createElement("span"); + pill.className = "pill"; + pill.textContent = `${dimKey}: ${value} ×`; + pill.addEventListener("click", () => onRemoveFilter(dimKey, value)); + container.appendChild(pill); + }); + } + }); + + if (!hasFilter) { + const pill = document.createElement("span"); + pill.className = "pill muted"; + pill.textContent = "No filters"; + container.appendChild(pill); + } +} + +// ============================================================================ +// Main Widget Render +// ============================================================================ + +function render({ model, el }) { + // Create widget structure + el.innerHTML = ` +
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+ `; + + const filterPillsEl = el.querySelector(".filter-pills"); + const metricsColEl = el.querySelector(".metrics-col"); + const dimensionsGridEl = el.querySelector(".dimensions-grid"); + const metricSelectEl = el.querySelector(".metric-select"); + const grainSelectEl = el.querySelector(".grain-select"); + const statusEl = el.querySelector(".widget-status"); + let activeDimTimeout = null; + + // ------------------------------------------------------------------------- + // State Management + // ------------------------------------------------------------------------- + + function getFilters() { + return model.get("filters") || {}; + } + + function setFilters(filters) { + model.set("filters", filters); + model.save_changes(); + } + + function scheduleActiveDimensionClear() { + if (activeDimTimeout) { + clearTimeout(activeDimTimeout); + } + activeDimTimeout = setTimeout(() => { + model.set("active_dimension", ""); + model.save_changes(); + }, 400); + } + + function clearActiveDimension() { + if (activeDimTimeout) { + clearTimeout(activeDimTimeout); + activeDimTimeout = null; + } + model.set("active_dimension", ""); + } + + function toggleFilter(dimKey, value) { + const filters = { ...getFilters() }; + const current = filters[dimKey] || []; + model.set("active_dimension", dimKey); + + if (current.includes(value)) { + filters[dimKey] = current.filter((v) => v !== value); + if (filters[dimKey].length === 0) { + delete filters[dimKey]; + } + } else { + filters[dimKey] = [...current, value]; + } + + setFilters(filters); + scheduleActiveDimensionClear(); + } + + function removeFilter(dimKey, value) { + const filters = { ...getFilters() }; + const current = filters[dimKey] || []; + clearActiveDimension(); + filters[dimKey] = current.filter((v) => v !== value); + if (filters[dimKey].length === 0) { + delete filters[dimKey]; + } + setFilters(filters); + } + + function setBrush(start, end) { + if (start && end) { + clearActiveDimension(); + model.set("brush_selection", [start, end]); + } else { + model.set("brush_selection", []); + } + model.save_changes(); + } + + function clearBrush() { + clearActiveDimension(); + model.set("brush_selection", []); + model.save_changes(); + } + + // ------------------------------------------------------------------------- + // Rendering + // ------------------------------------------------------------------------- + + function renderMetrics() { + const metricsConfig = model.get("metrics_config") || []; + const selectedMetric = model.get("selected_metric") || ""; + const dateRange = model.get("date_range") || []; + const metricTotals = model.get("metric_totals") || {}; + const metricSeriesDataRaw = model.get("metric_series_data"); + + // Show skeletons while loading + if ( + !metricSeriesDataRaw || + (metricSeriesDataRaw.byteLength !== undefined && + metricSeriesDataRaw.byteLength === 0) + ) { + metricsColEl.innerHTML = ""; + metricsConfig.forEach(() => { + metricsColEl.appendChild(renderMetricSkeleton()); + }); + return; + } + + try { + const rows = parseArrowIPC(metricSeriesDataRaw); + if (!rows) { + metricsColEl.innerHTML = '
Failed to parse data
'; + return; + } + + // Extract dates from rows (assuming first column or __time column) + const timeCol = Object.keys(rows[0] || {}).find( + (k) => k.includes("time") || k.includes("date") || k === "__time" + ); + const dates = timeCol ? rows.map((r) => formatDate(r[timeCol])) : []; + + metricsColEl.innerHTML = ""; + + metricsConfig.forEach((metricConfig) => { + const series = rows.map((row) => Number(row[metricConfig.key]) || 0); + const total = + metricTotals[metricConfig.key] ?? + series.reduce((sum, v) => sum + v, 0); + + const card = renderMetricCard( + metricConfig, + series, + total, + dateRange, + selectedMetric, + dates, + null, // onHover + setBrush // onBrush + ); + + // Click to select metric + card.addEventListener("click", (e) => { + // Don't select on sparkline interactions + if (e.target.closest(".sparkline-wrap")) return; + model.set("selected_metric", metricConfig.key); + model.save_changes(); + }); + + metricsColEl.appendChild(card); + }); + } catch (e) { + metricsColEl.innerHTML = `
Error: ${e.message}
`; + } + } + + function renderDimensions() { + const dimensionsConfig = model.get("dimensions_config") || []; + const dimensionData = model.get("dimension_data") || {}; + const selectedMetric = model.get("selected_metric") || ""; + const filters = getFilters(); + + dimensionsGridEl.innerHTML = ""; + + dimensionsConfig.forEach((dimConfig) => { + const ipcDataView = dimensionData[dimConfig.key]; + + // Show skeleton while loading + if (!ipcDataView || ipcDataView.byteLength === 0) { + dimensionsGridEl.appendChild(renderDimensionSkeleton(dimConfig.label)); + return; + } + + try { + const rows = parseArrowIPC(ipcDataView); + if (!rows) { + const errorCard = document.createElement("div"); + errorCard.className = "dim-card error"; + errorCard.innerHTML = `

${dimConfig.label}

Failed to parse data
`; + dimensionsGridEl.appendChild(errorCard); + return; + } + + const card = renderDimensionCard( + dimConfig, + rows, + selectedMetric, + filters, + toggleFilter + ); + + dimensionsGridEl.appendChild(card); + } catch (e) { + const errorCard = document.createElement("div"); + errorCard.className = "dim-card error"; + errorCard.innerHTML = `

${dimConfig.label}

Error: ${e.message}
`; + dimensionsGridEl.appendChild(errorCard); + } + }); + } + + function renderFilters() { + const filters = getFilters(); + const dateRange = model.get("date_range") || []; + const brushSelection = model.get("brush_selection") || []; + + renderFilterPills( + filterPillsEl, + filters, + dateRange, + brushSelection, + removeFilter, + clearBrush + ); + } + + function renderMetricSelect() { + const metricsConfig = model.get("metrics_config") || []; + const selectedMetric = model.get("selected_metric") || ""; + + metricSelectEl.innerHTML = metricsConfig + .map( + (m) => + `` + ) + .join(""); + } + + function renderGrainSelect() { + const grainOptions = model.get("time_grain_options") || []; + const selectedGrain = model.get("time_grain") || ""; + + if (!grainOptions.length) { + grainSelectEl.innerHTML = ""; + grainSelectEl.disabled = true; + return; + } + + grainSelectEl.disabled = false; + grainSelectEl.innerHTML = grainOptions + .map((grain) => { + const label = grain.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()); + return ``; + }) + .join(""); + } + + function renderStatus() { + const status = model.get("status") || "loading"; + const error = model.get("error") || ""; + + if (status === "error" && error) { + statusEl.textContent = `Error: ${error}`; + statusEl.className = "widget-status error"; + } else if (status === "loading") { + statusEl.textContent = "Loading..."; + statusEl.className = "widget-status loading"; + } else { + statusEl.textContent = ""; + statusEl.className = "widget-status"; + } + } + + function renderAll() { + renderStatus(); + renderFilters(); + renderMetricSelect(); + renderGrainSelect(); + renderMetrics(); + renderDimensions(); + } + + // ------------------------------------------------------------------------- + // Event Handlers + // ------------------------------------------------------------------------- + + metricSelectEl.addEventListener("change", (e) => { + clearActiveDimension(); + model.set("selected_metric", e.target.value); + model.save_changes(); + }); + grainSelectEl.addEventListener("change", (e) => { + model.set("time_grain", e.target.value); + model.save_changes(); + }); + + // ------------------------------------------------------------------------- + // Model Change Observers + // ------------------------------------------------------------------------- + + model.on("change:metric_series_data", renderMetrics); + model.on("change:metric_totals", renderMetrics); + model.on("change:dimension_data", renderDimensions); + model.on("change:filters", () => { + renderFilters(); + renderDimensions(); // Update active states + }); + model.on("change:brush_selection", renderFilters); + model.on("change:selected_metric", () => { + renderMetricSelect(); + renderMetrics(); + }); + model.on("change:time_grain", renderGrainSelect); + model.on("change:status", renderStatus); + model.on("change:error", renderStatus); + model.on("change:metrics_config", renderAll); + model.on("change:dimensions_config", renderAll); + model.on("change:time_grain_options", renderGrainSelect); + + // Initial render + renderAll(); + + // Cleanup + return () => { + model.off("change:metric_series_data", renderMetrics); + model.off("change:metric_totals", renderMetrics); + model.off("change:dimension_data", renderDimensions); + model.off("change:filters"); + model.off("change:brush_selection", renderFilters); + model.off("change:selected_metric"); + model.off("change:time_grain", renderGrainSelect); + model.off("change:status", renderStatus); + model.off("change:error", renderStatus); + model.off("change:metrics_config", renderAll); + model.off("change:dimensions_config", renderAll); + model.off("change:time_grain_options", renderGrainSelect); + }; +} + +export default { render }; diff --git a/pyproject.toml b/pyproject.toml index e7d6cf66..0772a34f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -73,6 +73,13 @@ lsp = [ "lsprotocol>=2025.0.0", "pygls>=2.0.0", ] +malloy = [ + "antlr4-python3-runtime>=4.13.2", +] +widget = [ + "anywidget>=0.9.0", + "pyarrow>=14.0.0", +] [build-system] requires = ["hatchling"] @@ -108,6 +115,8 @@ packages = ["sidemantic"] "examples/multi_format_demo/hex" = "sidemantic/examples/multi_format_demo/hex" "examples/multi_format_demo/lookml" = "sidemantic/examples/multi_format_demo/lookml" "examples/multi_format_demo/demo_data.py" = "sidemantic/examples/multi_format_demo/demo_data.py" +"sidemantic/widget/static/widget.js" = "sidemantic/widget/static/widget.js" +"sidemantic/widget/static/widget.css" = "sidemantic/widget/static/widget.css" [tool.ruff] line-length = 120 @@ -134,8 +143,12 @@ prerelease = "if-necessary" [dependency-groups] dev = [ "antlr4-python3-runtime>=4.13.2", + "jupyterlab>=4.5.1", "lsprotocol>=2025.0.0", "marimo==0.16.5", + "numpy>=1.26,<3", + "pandas>=2.2,<3", + "polars>=1.36.1", "pygls>=2.0.0", "pytest>=8.4.2", "ruff>=0.14.0", diff --git a/sidemantic/loaders.py b/sidemantic/loaders.py index da4a09a5..04ce534b 100644 --- a/sidemantic/loaders.py +++ b/sidemantic/loaders.py @@ -26,7 +26,6 @@ def load_from_directory(layer: "SemanticLayer", directory: str | Path) -> None: from sidemantic.adapters.cube import CubeAdapter from sidemantic.adapters.hex import HexAdapter from sidemantic.adapters.lookml import LookMLAdapter - from sidemantic.adapters.malloy import MalloyAdapter from sidemantic.adapters.metricflow import MetricFlowAdapter from sidemantic.adapters.omni import OmniAdapter from sidemantic.adapters.rill import RillAdapter @@ -53,6 +52,16 @@ def load_from_directory(layer: "SemanticLayer", directory: str | Path) -> None: if suffix == ".lkml": adapter = LookMLAdapter() elif suffix == ".malloy": + try: + from sidemantic.adapters.malloy import MalloyAdapter + except ModuleNotFoundError as exc: + if exc.name == "antlr4": + print( + "Warning: Malloy support requires antlr4-python3-runtime. " + "Install with `uv add \"sidemantic[malloy]\"`." + ) + continue + raise adapter = MalloyAdapter() elif suffix == ".sql": # Sidemantic SQL files (pure SQL or with YAML frontmatter) diff --git a/sidemantic/sql/generator.py b/sidemantic/sql/generator.py index 9e0157be..77b96376 100644 --- a/sidemantic/sql/generator.py +++ b/sidemantic/sql/generator.py @@ -162,6 +162,7 @@ def generate( ungrouped: bool = False, use_preaggregations: bool = False, aliases: dict[str, str] | None = None, + skip_default_time_dimensions: bool = False, ) -> str: """Generate SQL query from semantic layer query. @@ -177,6 +178,7 @@ def generate( ungrouped: If True, return raw rows without aggregation (no GROUP BY) use_preaggregations: Enable automatic pre-aggregation routing (default: False) aliases: Custom aliases for fields (dict mapping field reference to alias) + skip_default_time_dimensions: If True, don't auto-include default_time_dimension Returns: SQL query string @@ -189,7 +191,8 @@ def generate( aliases = aliases or {} # Auto-include default_time_dimension from metrics if not already present - dimensions = self._apply_default_time_dimensions(metrics, dimensions) + if not skip_default_time_dimensions: + dimensions = self._apply_default_time_dimensions(metrics, dimensions) # Resolve segments to SQL filters segment_filters = self._resolve_segments(segments) diff --git a/sidemantic/widget/__init__.py b/sidemantic/widget/__init__.py new file mode 100644 index 00000000..ca5fc44c --- /dev/null +++ b/sidemantic/widget/__init__.py @@ -0,0 +1,5 @@ +"""Sidemantic anywidget for interactive metrics exploration.""" + +from sidemantic.widget._widget import MetricsExplorer + +__all__ = ["MetricsExplorer"] diff --git a/sidemantic/widget/_auto_model.py b/sidemantic/widget/_auto_model.py new file mode 100644 index 00000000..709d4bc7 --- /dev/null +++ b/sidemantic/widget/_auto_model.py @@ -0,0 +1,147 @@ +"""Auto-generate sidemantic model from Arrow schema.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pyarrow as pa + +if TYPE_CHECKING: + from sidemantic.core.semantic_graph import SemanticGraph + + +def is_numeric(arrow_type: pa.DataType) -> bool: + """Check if Arrow type is numeric.""" + return pa.types.is_integer(arrow_type) or pa.types.is_floating(arrow_type) or pa.types.is_decimal(arrow_type) + + +def is_temporal(arrow_type: pa.DataType) -> bool: + """Check if Arrow type is temporal (date/time).""" + return pa.types.is_date(arrow_type) or pa.types.is_timestamp(arrow_type) or pa.types.is_time(arrow_type) + + +def build_auto_model( + schema: pa.Schema, + table_name: str = "data", + max_dimension_cardinality: int | None = None, + cardinality_map: dict[str, int] | None = None, +) -> tuple[SemanticGraph, str | None]: + """Build a sidemantic SemanticGraph from an Arrow schema. + + Creates an auto-generated model with: + - All columns as dimensions + - row_count metric (always) + - sum_{col} and avg_{col} for numeric columns + + Args: + schema: PyArrow schema + table_name: Name for the model/table + max_dimension_cardinality: If set, skip dimensions with cardinality above this threshold + cardinality_map: Optional dict mapping column names to their cardinality counts + + Returns: + Tuple of (SemanticGraph with auto-generated model, detected time dimension name or None) + """ + from sidemantic import Dimension, Metric, Model + from sidemantic.core.registry import set_current_layer + from sidemantic.core.semantic_graph import SemanticGraph + + # Clear auto-registration context to prevent Model from registering with existing layer + set_current_layer(None) + + dimensions = [] + metrics = [Metric(name="row_count", sql="count(*)")] + time_dimension_name = None + + for field in schema: + col_name = field.name + + # Determine dimension type first (must be: categorical, time, boolean, numeric) + if is_temporal(field.type): + dim_type = "time" + if time_dimension_name is None: + time_dimension_name = col_name + elif is_numeric(field.type): + dim_type = "numeric" + elif pa.types.is_boolean(field.type): + dim_type = "boolean" + else: + dim_type = "categorical" + + # Skip if cardinality threshold is set and exceeded (but never skip time dimensions) + if dim_type != "time" and max_dimension_cardinality is not None and cardinality_map: + cardinality = cardinality_map.get(col_name, 0) + if cardinality > max_dimension_cardinality: + continue + + # Add dimension (time dimensions need granularity) + if dim_type == "time": + dimensions.append( + Dimension( + name=col_name, + sql=col_name, + type=dim_type, + granularity="day", + ) + ) + else: + dimensions.append( + Dimension( + name=col_name, + sql=col_name, + type=dim_type, + ) + ) + + # Add implied metrics for numeric columns + if is_numeric(field.type): + metrics.append( + Metric( + name=f"sum_{col_name}", + sql=f"sum({col_name})", + ) + ) + metrics.append( + Metric( + name=f"avg_{col_name}", + sql=f"avg({col_name})", + ) + ) + + # Create model using rowid as synthetic primary key for DuckDB + # Don't set default_time_dimension - the widget handles time dims explicitly + model = Model( + name=table_name, + table=table_name, + primary_key="rowid", + dimensions=dimensions, + metrics=metrics, + ) + + # Build graph + graph = SemanticGraph() + graph.add_model(model) + + return graph, time_dimension_name + + +def compute_cardinality(conn, table_name: str, columns: list[str]) -> dict[str, int]: + """Compute cardinality (distinct count) for columns. + + Args: + conn: DuckDB connection + table_name: Table name + columns: List of column names + + Returns: + Dict mapping column name to cardinality + """ + result = {} + for col in columns: + query = f'SELECT COUNT(DISTINCT "{col}") as cnt FROM "{table_name}"' + try: + row = conn.execute(query).fetchone() + result[col] = row[0] if row else 0 + except Exception: + result[col] = 0 + return result diff --git a/sidemantic/widget/_data_registry.py b/sidemantic/widget/_data_registry.py new file mode 100644 index 00000000..4847d55f --- /dev/null +++ b/sidemantic/widget/_data_registry.py @@ -0,0 +1,85 @@ +"""Data registration utilities for accepting any dataframe-like object.""" + +from __future__ import annotations + +from typing import Any + + +def to_arrow_table(data: Any): + """Convert any dataframe-like object to PyArrow Table. + + Accepts: + - PyArrow Table + - Polars DataFrame (via __arrow_c_stream__) + - Pandas DataFrame (via __dataframe__ interchange protocol) + - DuckDB Relation + - Arrow IPC bytes + - Any object with __arrow_c_stream__ protocol + + Args: + data: Input data in any supported format + + Returns: + PyArrow Table + """ + import pyarrow as pa + + # Already a PyArrow Table + if isinstance(data, pa.Table): + return data + + # Arrow IPC bytes + if isinstance(data, (bytes, memoryview)): + reader = pa.ipc.open_file(pa.BufferReader(data)) + return reader.read_all() + + # DuckDB Relation - call .arrow() method + if hasattr(data, "arrow") and callable(data.arrow): + return data.arrow() + + # Arrow PyCapsule interface (Polars, newer Arrow implementations) + if hasattr(data, "__arrow_c_stream__"): + reader = pa.RecordBatchReader.from_stream(data) + return reader.read_all() + + # DataFrame interchange protocol (Pandas) + if hasattr(data, "__dataframe__"): + return pa.interchange.from_dataframe(data) + + # Try to convert via pa.table() as fallback + return pa.table(data) + + +def register_data(data: Any, conn, table_name: str = "widget_data") -> str: + """Register data into a DuckDB connection. + + Creates a permanent table (not just a view) to avoid Arrow type compatibility issues. + + Args: + data: Input data in any supported format + conn: DuckDB connection + table_name: Name for the registered table + + Returns: + The table name + """ + arrow_table = to_arrow_table(data) + # Register as temp view, then create table from it to materialize data + # This avoids string_view and other Arrow type compatibility issues + conn.register("_temp_arrow_data", arrow_table) + conn.execute(f'CREATE OR REPLACE TABLE "{table_name}" AS SELECT * FROM _temp_arrow_data') + conn.unregister("_temp_arrow_data") + return table_name + + +def get_schema(data: Any): + """Get the Arrow schema from any dataframe-like object. + + Args: + data: Input data in any supported format + + Returns: + PyArrow Schema + """ + arrow_table = to_arrow_table(data) + return arrow_table.schema diff --git a/sidemantic/widget/_widget.py b/sidemantic/widget/_widget.py new file mode 100644 index 00000000..fc152935 --- /dev/null +++ b/sidemantic/widget/_widget.py @@ -0,0 +1,516 @@ +"""Sidemantic anywidget for interactive metrics exploration.""" + +from __future__ import annotations + +import io +import pathlib +from typing import TYPE_CHECKING, Any + +import anywidget +import traitlets + +if TYPE_CHECKING: + from sidemantic import SemanticLayer + from sidemantic.core.semantic_graph import SemanticGraph + from sidemantic.sql.generator import SQLGenerator + + +def _table_to_ipc(table) -> bytes: + """Serialize Arrow table to IPC format.""" + import pyarrow as pa + + sink = io.BytesIO() + with pa.ipc.new_file(sink, table.schema) as writer: + writer.write_table(table) + return sink.getvalue() + + +class MetricsExplorer(anywidget.AnyWidget): + """Interactive metrics explorer widget. + + Works in two modes: + 1. Raw DataFrame mode - pass any dataframe, auto-infers dimensions and metrics + 2. Semantic Model mode - use a sidemantic SemanticLayer with defined metrics/dimensions + + Examples: + # Mode 1: Raw DataFrame + import polars as pl + from sidemantic.widget import MetricsExplorer + + df = pl.read_parquet("sales.parquet") + widget = MetricsExplorer(df) + + # Mode 2: Semantic Model + from sidemantic import SemanticLayer + + layer = SemanticLayer.from_yaml("models.yaml") + widget = MetricsExplorer( + layer=layer, + metrics=["orders.revenue", "orders.order_count"], + dimensions=["orders.region", "orders.category"], + ) + """ + + _esm = pathlib.Path(__file__).parent / "static" / "widget.js" + _css = pathlib.Path(__file__).parent / "static" / "widget.css" + + # Configuration (Python → JS) + config = traitlets.Dict({}).tag(sync=True) + metrics_config = traitlets.List([]).tag(sync=True) + dimensions_config = traitlets.List([]).tag(sync=True) + + # UI State (bidirectional) + filters = traitlets.Dict({}).tag(sync=True) # {dimension_key: [values]} + date_range = traitlets.List([]).tag(sync=True) # [start_iso, end_iso] + selected_metric = traitlets.Unicode("").tag(sync=True) + comparison_mode = traitlets.Unicode("wow").tag(sync=True) + brush_selection = traitlets.List([]).tag(sync=True) # [start_iso, end_iso] or [] + time_grain = traitlets.Unicode("").tag(sync=True) + time_grain_options = traitlets.List([]).tag(sync=True) + active_dimension = traitlets.Unicode("").tag(sync=True) + + # Data (Python → JS, as Arrow IPC bytes) + metric_series_data = traitlets.Bytes(b"").tag(sync=True) + dimension_data = traitlets.Dict({}).tag(sync=True) # {dim_key: arrow_ipc_bytes} + metric_totals = traitlets.Dict({}).tag(sync=True) + + # Status + status = traitlets.Unicode("loading").tag(sync=True) + error = traitlets.Unicode("").tag(sync=True) + + def __init__( + self, + data: Any = None, + *, + layer: SemanticLayer | None = None, + metrics: list[str] | None = None, + dimensions: list[str] | None = None, + time_dimension: str | None = None, + max_dimension_cardinality: int | None = None, + **kwargs, + ): + """Initialize MetricsExplorer widget. + + Args: + data: DataFrame-like object OR SemanticLayer instance + layer: Existing SemanticLayer instance (deprecated, use data) + metrics: List of metric references (e.g., ["orders.revenue"]) + dimensions: List of dimension references (e.g., ["orders.region"]) + time_dimension: Override the time dimension for sparklines + max_dimension_cardinality: Skip dimensions with cardinality above this + """ + super().__init__(**kwargs) + + # Detect if data is a SemanticLayer + from sidemantic import SemanticLayer as SemanticLayerClass + + if isinstance(data, SemanticLayerClass): + layer = data + data = None + + self._layer: SemanticLayer | None = None + self._graph: SemanticGraph | None = None + self._conn = None + self._generator: SQLGenerator | None = None + self._use_preaggregations: bool = False + self._table_name: str = "widget_data" + self._model_name: str = "widget_data" + self._time_dimension: str | None = time_dimension + self._metrics: list[str] = metrics or [] + self._dimensions: list[str] = dimensions or [] + self._pending_refresh: str | None = None # Track pending refresh type + self._last_active_dimension: str | None = None + + if layer is not None: + # Mode 2: Use existing SemanticLayer + self._layer = layer + self._graph = layer.graph + self._conn = layer.adapter.raw_connection + self._use_preaggregations = getattr(layer, "use_preaggregations", False) + self._setup_from_layer() + elif data is not None: + # Mode 1: Raw DataFrame - auto-generate model + self._setup_from_dataframe(data, max_dimension_cardinality) + else: + raise ValueError("Either 'data' or 'layer' must be provided") + + # Create SQLGenerator once (reused for all queries) + from sidemantic.sql.generator import SQLGenerator + + self._generator = SQLGenerator(self._graph, dialect="duckdb") + + # Set up observers with specific handlers + self.observe(self._on_filters_change, names=["filters"]) + self.observe(self._on_date_range_change, names=["date_range"]) + self.observe(self._on_brush_change, names=["brush_selection"]) + self.observe(self._on_metric_change, names=["selected_metric"]) + self.observe(self._on_comparison_change, names=["comparison_mode"]) + self.observe(self._on_time_grain_change, names=["time_grain"]) + self.observe(self._on_active_dimension_change, names=["active_dimension"]) + + # Initial data load + self._refresh_all() + + def _setup_from_layer(self): + """Configure widget from existing SemanticLayer.""" + # Find first model to use as default + model_names = list(self._graph.models.keys()) + if not model_names: + raise ValueError("SemanticLayer has no models") + + self._model_name = model_names[0] + model = self._graph.get_model(self._model_name) + + # Set table name from model for date range queries + self._table_name = model.table + + # Auto-detect time dimension from model if not provided + if self._time_dimension is None: + # First try model's default_time_dimension + if model.default_time_dimension: + self._time_dimension = model.default_time_dimension + else: + # Fall back to first time-type dimension + time_dims = [d for d in (model.dimensions or []) if d.type == "time"] + if time_dims: + self._time_dimension = time_dims[0].name + + # If no metrics/dimensions specified, use all from model + if not self._metrics: + self._metrics = [f"{self._model_name}.{m.name}" for m in (model.metrics or [])] + + if not self._dimensions: + # For leaderboards, only include categorical and boolean dimensions (not time or numeric) + self._dimensions = [ + f"{self._model_name}.{d.name}" for d in (model.dimensions or []) if d.type in ("categorical", "boolean") + ] + + self._build_config() + + def _setup_from_dataframe(self, data: Any, max_cardinality: int | None): + """Configure widget from raw DataFrame.""" + import duckdb + + from sidemantic.widget._auto_model import build_auto_model, compute_cardinality + from sidemantic.widget._data_registry import get_schema, register_data + + # Create in-memory DuckDB connection + self._conn = duckdb.connect(":memory:") + + # Register data + register_data(data, self._conn, self._table_name) + + # Get schema + schema = get_schema(data) + + # Compute cardinality if threshold is set + cardinality_map = None + if max_cardinality is not None: + columns = [field.name for field in schema] + cardinality_map = compute_cardinality(self._conn, self._table_name, columns) + + # Build auto model + self._graph, detected_time_dim = build_auto_model( + schema, + table_name=self._table_name, + max_dimension_cardinality=max_cardinality, + cardinality_map=cardinality_map, + ) + + self._model_name = self._table_name + model = self._graph.get_model(self._model_name) + + # Set time dimension from auto-detection (if not already set) + if self._time_dimension is None: + self._time_dimension = detected_time_dim + + # Auto-select metrics and dimensions + if not self._metrics: + self._metrics = [f"{self._model_name}.{m.name}" for m in (model.metrics or [])] + + if not self._dimensions: + # For leaderboards, only include categorical and boolean dimensions (not time or numeric) + self._dimensions = [ + f"{self._model_name}.{d.name}" for d in (model.dimensions or []) if d.type in ("categorical", "boolean") + ] + + self._build_config() + + def _build_config(self): + """Build configuration for JS side.""" + model = self._graph.get_model(self._model_name) + + # Build metrics config + metrics_config = [] + for metric_ref in self._metrics: + metric_name = metric_ref.split(".")[-1] + metric = model.get_metric(metric_name) if model else None + metrics_config.append( + { + "key": metric_name, + "ref": metric_ref, + "label": metric_name.replace("_", " ").title() if metric else metric_name, + "format": "number", # Could infer from metric definition + } + ) + + # Build dimensions config + dimensions_config = [] + for dim_ref in self._dimensions: + dim_name = dim_ref.split(".")[-1] + dim = model.get_dimension(dim_name) if model else None + dimensions_config.append( + { + "key": dim_name, + "ref": dim_ref, + "label": dim_name.replace("_", " ").title() if dim else dim_name, + } + ) + + self.metrics_config = metrics_config + self.dimensions_config = dimensions_config + + # Set default selected metric + if metrics_config and not self.selected_metric: + self.selected_metric = metrics_config[0]["key"] + + # Set config + self.config = { + "model_name": self._model_name, + "time_dimension": self._time_dimension, + "time_dimension_ref": f"{self._model_name}.{self._time_dimension}" if self._time_dimension else None, + } + + # Configure time grain options + if self._time_dimension: + time_dim = model.get_dimension(self._time_dimension) if model else None + supported = time_dim.supported_granularities if time_dim else None + time_grains = supported or ["day", "week", "month", "quarter", "year"] + default_grain = model.default_grain or (time_dim.granularity if time_dim else None) or "day" + if default_grain not in time_grains: + time_grains = [default_grain] + [g for g in time_grains if g != default_grain] + self.time_grain_options = time_grains + if not self.time_grain: + self.time_grain = default_grain + + # Compute date range + self._compute_date_range() + + def _compute_date_range(self): + """Compute available date range from data.""" + if not self._time_dimension: + return + + try: + query = f'SELECT MIN("{self._time_dimension}") as min_date, MAX("{self._time_dimension}") as max_date FROM "{self._table_name}"' + result = self._conn.execute(query).fetchone() + if result and result[0] and result[1]: + min_date = result[0] + max_date = result[1] + + # Convert to ISO strings + if hasattr(min_date, "isoformat"): + min_date = min_date.isoformat()[:10] + max_date = max_date.isoformat()[:10] + else: + min_date = str(min_date)[:10] + max_date = str(max_date)[:10] + + self.date_range = [min_date, max_date] + except Exception as e: + self.error = f"Failed to compute date range: {e}" + + def _on_filters_change(self, change): + """Handle dimension filter changes - refresh all.""" + if self.active_dimension: + self._refresh_dimensions() + return + self._refresh_all() + + def _on_date_range_change(self, change): + """Handle date range changes - refresh all.""" + self._refresh_all() + + def _on_brush_change(self, change): + """Handle brush selection changes - only refresh dimensions (sparklines stay the same).""" + self._refresh_dimensions() + + def _on_metric_change(self, change): + """Handle selected metric change - refresh dimension leaderboards.""" + self._refresh_dimensions() + + def _on_comparison_change(self, change): + """Handle comparison mode change.""" + self._refresh_metrics() + + def _on_time_grain_change(self, change): + """Handle time grain change - refresh metric series.""" + self._refresh_metrics() + + def _on_active_dimension_change(self, change): + """Handle active dimension changes.""" + if change["new"]: + self._last_active_dimension = change["new"] + return + if change["old"]: + self._last_active_dimension = change["old"] + self._refresh_all() + + def _build_filters(self, exclude_dimension: str | None = None) -> list[str]: + """Build filter expressions for sidemantic query.""" + filter_exprs = [] + + # Date range filter + if self.brush_selection and len(self.brush_selection) == 2: + start, end = self.brush_selection + filter_exprs.append( + f"{self._model_name}.{self._time_dimension} >= '{start}' AND " + f"{self._model_name}.{self._time_dimension} <= '{end}'" + ) + elif self.date_range and len(self.date_range) == 2: + start, end = self.date_range + filter_exprs.append( + f"{self._model_name}.{self._time_dimension} >= '{start}' AND " + f"{self._model_name}.{self._time_dimension} <= '{end}'" + ) + + # Dimension filters + for dim_key, values in self.filters.items(): + if exclude_dimension and dim_key == exclude_dimension: + continue + if values: + if len(values) == 1: + filter_exprs.append(f"{self._model_name}.{dim_key} = '{values[0]}'") + else: + clauses = " OR ".join(f"{self._model_name}.{dim_key} = '{v}'" for v in values) + filter_exprs.append(f"({clauses})") + + return filter_exprs + + def _refresh_all(self): + """Refresh all data (metrics and dimensions).""" + self.status = "loading" + try: + self._refresh_metrics() + self._refresh_dimensions() + self.status = "ready" + except Exception as e: + self.error = str(e) + self.status = "error" + + def _refresh_metrics(self): + """Refresh metric series data.""" + if not self._time_dimension: + return + + # Clear existing data to show skeletons while loading + self.metric_series_data = b"" + self.metric_totals = {} + + filters = self._build_filters() + + # Query all metrics as time series + metric_refs = [m["ref"] for m in self.metrics_config] + grain = self.time_grain or "day" + time_dim_ref = f"{self._model_name}.{self._time_dimension}__{grain}" + + try: + sql = self._generator.generate( + metrics=metric_refs, + dimensions=[time_dim_ref], + filters=filters, + order_by=[time_dim_ref], + limit=500, + use_preaggregations=self._use_preaggregations, + ) + result = self._conn.execute(sql).arrow() + self.metric_series_data = _table_to_ipc(result) + + totals_sql = self._generator.generate( + metrics=metric_refs, + dimensions=[], + filters=filters, + skip_default_time_dimensions=True, + use_preaggregations=self._use_preaggregations, + ) + totals_row = self._conn.execute(totals_sql).fetchone() + totals = {} + if totals_row: + for i, metric_ref in enumerate(metric_refs): + totals[metric_ref.split(".")[-1]] = totals_row[i] + self.metric_totals = totals + except Exception as e: + self.error = f"Metric query failed: {e}" + + def _refresh_dimensions(self): + """Refresh dimension leaderboard data.""" + selected_metric_ref = f"{self._model_name}.{self.selected_metric}" + + # Preserve existing data so panels stay interactive while refreshing + existing = self.dimension_data or {} + dimension_data = dict(existing) + for dim in self.dimensions_config: + dim_key = dim["key"] + if dim_key not in dimension_data: + dimension_data[dim_key] = b"" + + if self.active_dimension: + dim_config = next((d for d in self.dimensions_config if d["key"] == self.active_dimension), None) + if not dim_config: + return + + dim_key = dim_config["key"] + dim_ref = dim_config["ref"] + + # Exclude this dimension from its own filters (crossfilter pattern) + filters = self._build_filters(exclude_dimension=dim_key) + + try: + sql = self._generator.generate( + metrics=[selected_metric_ref], + dimensions=[dim_ref], + filters=filters, + order_by=[f"{selected_metric_ref} DESC"], + limit=6, + skip_default_time_dimensions=True, + use_preaggregations=self._use_preaggregations, + ) + result = self._conn.execute(sql).arrow() + dimension_data[dim_key] = _table_to_ipc(result) + self.dimension_data = dict(dimension_data) + except Exception as e: + self.error = f"Dimension query failed for {dim_key}: {e}" + return + + # Full refresh: show skeletons until each panel completes + preserve_dim = self._last_active_dimension + dimension_data = {d["key"]: b"" for d in self.dimensions_config} + if preserve_dim and preserve_dim in existing: + dimension_data[preserve_dim] = existing[preserve_dim] + self.dimension_data = dimension_data + + for dim_config in self.dimensions_config: + dim_key = dim_config["key"] + dim_ref = dim_config["ref"] + + # Exclude this dimension from its own filters (crossfilter pattern) + filters = self._build_filters(exclude_dimension=dim_key) + + try: + sql = self._generator.generate( + metrics=[selected_metric_ref], + dimensions=[dim_ref], + filters=filters, + order_by=[f"{selected_metric_ref} DESC"], + limit=6, + skip_default_time_dimensions=True, + use_preaggregations=self._use_preaggregations, + ) + result = self._conn.execute(sql).arrow() + dimension_data[dim_key] = _table_to_ipc(result) + self.dimension_data = dict(dimension_data) + except Exception as e: + self.error = f"Dimension query failed for {dim_key}: {e}" + + self.dimension_data = dimension_data + self._last_active_dimension = None diff --git a/sidemantic/widget/static/widget.css b/sidemantic/widget/static/widget.css new file mode 100644 index 00000000..37ab442a --- /dev/null +++ b/sidemantic/widget/static/widget.css @@ -0,0 +1,462 @@ +/* Sidemantic MetricsExplorer Widget Styles */ +/* Ported from the sidemantic-demo */ + +.sidemantic-widget { + --bg: #ffffff; + --card: #ffffff; + --border: #e5e7eb; + --text: #111827; + --muted: #6b7280; + --accent: #6b7cff; + --accent-strong: #5262f6; + --accent-soft: rgba(107, 124, 255, 0.14); + --chart: #6b7cff; + --chart-fill: rgba(107, 124, 255, 0.18); + --secondary-bg: #f3f4f6; + --secondary-hover: #e5e7eb; + --sparkline-bg: #f4f6ff; + --row-hover: #eef2ff; + --row-active: rgba(15, 23, 42, 0.08); + --skeleton-bg: #eef2f7; + --shimmer-color: rgba(255, 255, 255, 0.7); + + font-family: "Source Sans 3", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 14px; + color: var(--text); + background: var(--bg); + box-sizing: border-box; +} + +.sidemantic-widget * { + box-sizing: border-box; +} + +/* Header / Filter Row */ +.widget-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + padding: 8px 16px; + border-bottom: 1px solid var(--border); + background: var(--bg); + position: sticky; + top: 0; + z-index: 30; +} + +.filter-scroll { + position: relative; + flex: 1 1 auto; + min-width: 0; + overflow: hidden; +} + +.filter-pills { + display: flex; + gap: 6px; + flex-wrap: nowrap; + overflow-x: auto; + overflow-y: hidden; + white-space: nowrap; + padding: 2px 0; + scrollbar-width: none; +} + +.filter-pills::-webkit-scrollbar { + display: none; +} + +.pill { + background: var(--secondary-bg); + color: var(--text); + border: 1px solid var(--border); + border-radius: 999px; + font-size: 11px; + padding: 4px 10px; + cursor: pointer; + flex: 0 0 auto; +} + +.pill:hover { + background: var(--secondary-hover); +} + +.pill.muted { + color: var(--muted); + cursor: default; +} + +.controls { + display: flex; + align-items: center; + gap: 8px; + flex: 0 0 auto; +} + +.metric-select, +.grain-select { + border: 0; + background: transparent; + padding: 0 16px 0 0; + font-size: 12px; + color: var(--text); + appearance: none; + cursor: pointer; + font-family: inherit; +} + +.select-wrap { + position: relative; + display: inline-flex; + align-items: center; +} + +.select-wrap::after { + content: "▾"; + position: absolute; + right: 2px; + top: 50%; + transform: translateY(-50%); + font-size: 11px; + color: var(--muted); + pointer-events: none; +} + +/* Layout */ +.widget-layout { + display: grid; + grid-template-columns: 320px 1fr; + gap: 0; + background: var(--bg); + position: relative; +} + +.metrics-col { + display: flex; + flex-direction: column; + gap: 0; + border-right: 1px solid var(--border); +} + +.dimensions-col { + display: flex; + flex-direction: column; + gap: 0; + padding: 0; +} + +.dimensions-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 0; +} + +/* Metric Card */ +.metric-card { + background: transparent; + border-bottom: 1px solid var(--border); + border-radius: 0; + padding: 12px 16px 14px; + display: grid; + gap: 8px; + cursor: pointer; + box-shadow: none; +} + +.metric-card:hover { + background: rgba(107, 124, 255, 0.04); +} + +.metric-card.active { + background: var(--accent-soft); +} + +.metric-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 10px; +} + +.metric-title { + display: flex; + flex-direction: column; + gap: 4px; +} + +.metric-title span { + font-size: 10px; + color: var(--muted); +} + +.metric-title h3 { + margin: 0; + font-size: 12px; + font-weight: 600; +} + +.metric-value { + font-size: 16px; + font-weight: 600; +} + +.metric-value-group { + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 2px; +} + +.metric-delta { + font-size: 10px; + color: var(--muted); +} + +.metric-delta.positive { + color: #15803d; +} + +.metric-delta.negative { + color: #b91c1c; +} + +/* Sparkline */ +.sparkline-wrap { + position: relative; + border-radius: 4px; + overflow: hidden; + border: 1px solid rgba(107, 124, 255, 0.15); + background: var(--sparkline-bg); +} + +.sparkline { + width: 100%; + height: 60px; + display: block; +} + +.hover-line { + position: absolute; + top: 0; + bottom: 0; + width: 0; + border-left: 1px dotted rgba(15, 23, 42, 0.45); + pointer-events: none; + opacity: 0; + transition: opacity 0.1s; +} + +.brush-selection { + position: absolute; + inset: 0; + background: rgba(107, 124, 255, 0.18); + border: 0; + display: none; + pointer-events: none; +} + +/* Dimension Card */ +.dim-card { + background: var(--card); + border-right: 1px solid var(--border); + border-bottom: 1px solid var(--border); + border-radius: 0; + padding: 10px 12px; + min-height: 240px; +} + +.dim-card h4 { + margin: 0 0 8px; + font-size: 11px; + font-weight: 600; +} + +.dim-row { + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + font-size: 11px; + padding: 4px 6px; + border-radius: 0; + cursor: pointer; +} + +.dim-row:hover { + background: var(--row-hover); +} + +.dim-row.active { + background: var(--row-active); +} + +.dim-row .bar { + position: absolute; + inset: 0; + background: rgba(107, 124, 255, 0.12); + transform-origin: left; + z-index: 0; + border-radius: 0; +} + +.dim-row span { + position: relative; + z-index: 1; +} + +.dim-value { + color: var(--muted); +} + +/* Skeleton Styles */ +.metric-skeleton { + border: 0; + border-bottom: 1px solid var(--border); + border-radius: 0; + padding: 14px 16px 15px; + background: var(--bg); + box-shadow: none; + display: grid; + gap: 8px; +} + +.metric-skeleton .skeleton-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 10px; +} + +.metric-skeleton .skeleton-title-group { + display: flex; + flex-direction: column; + gap: 4px; +} + +.metric-skeleton .skeleton-title { + width: 80px; + height: 16px; +} + +.metric-skeleton .skeleton-subtitle { + width: 100px; + height: 13px; +} + +.metric-skeleton .skeleton-value-group { + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 2px; +} + +.metric-skeleton .skeleton-value { + width: 60px; + height: 21px; +} + +.metric-skeleton .skeleton-delta { + width: 50px; + height: 13px; +} + +.metric-skeleton .skeleton-chart { + height: 62px; + border-radius: 4px; + border: 1px solid rgba(107, 124, 255, 0.15); +} + +.skeleton-card { + border-right: 1px solid var(--border); + border-bottom: 1px solid var(--border); + border-radius: 0; + padding: 10px 12px; + min-height: 240px; +} + +.skeleton-card .skeleton-title { + width: 60%; + height: 14px; + margin-bottom: 8px; +} + +.skeleton-card .skeleton-row-wrap { + padding: 5px 6px; +} + +.skeleton-card .skeleton-row { + width: 100%; + height: 14px; +} + +.skeleton-line { + position: relative; + height: 10px; + border-radius: 4px; + background: var(--skeleton-bg); + overflow: hidden; +} + +.skeleton-line::after { + content: ""; + position: absolute; + inset: 0; + transform: translateX(-100%); + background: linear-gradient(90deg, transparent, var(--shimmer-color), transparent); + animation: shimmer 1.2s infinite; +} + +@keyframes shimmer { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(100%); + } +} + +/* Status */ +.widget-status { + padding: 8px 16px; + font-size: 11px; + color: var(--muted); +} + +.widget-status.error { + color: #b91c1c; + background: #fef2f2; +} + +.widget-status.loading { + color: var(--accent); +} + +.widget-status:empty { + display: none; +} + +/* Loading / Skeleton */ +.loading { + color: var(--muted); + font-size: 11px; + padding: 12px; +} + +.error { + color: #b91c1c; + font-size: 11px; +} + +/* Responsive */ +@media (max-width: 768px) { + .widget-layout { + grid-template-columns: 1fr; + } + + .metrics-col { + border-right: none; + border-bottom: 1px solid var(--border); + } +} diff --git a/sidemantic/widget/static/widget.js b/sidemantic/widget/static/widget.js new file mode 100644 index 00000000..4c232976 --- /dev/null +++ b/sidemantic/widget/static/widget.js @@ -0,0 +1,84 @@ +var Vc=Object.defineProperty;var cr=(r,t)=>{for(var e in t)Vc(r,e,{get:t[e],enumerable:!0})};function zo(r,t){var e={};for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&t.indexOf(i)<0&&(e[i]=r[i]);if(r!=null&&typeof Object.getOwnPropertySymbols=="function")for(var n=0,i=Object.getOwnPropertySymbols(r);n=r.length&&(r=void 0),{value:r&&r[i++],done:!r}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function M(r){return this instanceof M?(this.v=r,this):new M(r)}function At(r,t,e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i=e.apply(r,t||[]),n,s=[];return n=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),a("next"),a("throw"),a("return",o),n[Symbol.asyncIterator]=function(){return this},n;function o(L){return function(H){return Promise.resolve(H).then(L,h)}}function a(L,H){i[L]&&(n[L]=function(Wt){return new Promise(function(Ye,K){s.push([L,Wt,Ye,K])>1||c(L,Wt)})},H&&(n[L]=H(n[L])))}function c(L,H){try{l(i[L](H))}catch(Wt){F(s[0][3],Wt)}}function l(L){L.value instanceof M?Promise.resolve(L.value.v).then(d,h):F(s[0][2],L)}function d(L){c("next",L)}function h(L){c("throw",L)}function F(L,H){L(H),s.shift(),s.length&&c(s[0][0],s[0][1])}}function Fr(r){var t,e;return t={},i("next"),i("throw",function(n){throw n}),i("return"),t[Symbol.iterator]=function(){return this},t;function i(n,s){t[n]=r[n]?function(o){return(e=!e)?{value:M(r[n](o)),done:!1}:s?s(o):o}:s}}function Ht(r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=r[Symbol.asyncIterator],e;return t?t.call(r):(r=typeof jo=="function"?jo(r):r[Symbol.iterator](),e={},i("next"),i("throw"),i("return"),e[Symbol.asyncIterator]=function(){return this},e);function i(s){e[s]=r[s]&&function(o){return new Promise(function(a,c){o=r[s](o),n(a,c,o.done,o.value)})}}function n(s,o,a,c){Promise.resolve(c).then(function(l){s({value:l,done:a})},o)}}var Ps={};cr(Ps,{compareArrayLike:()=>ks,joinUint8Arrays:()=>Ft,memcpy:()=>ni,rebaseValueOffsets:()=>dn,toArrayBufferView:()=>N,toArrayBufferViewAsyncIterator:()=>Gt,toArrayBufferViewIterator:()=>le,toBigInt64Array:()=>un,toBigUint64Array:()=>Hc,toFloat32Array:()=>Yc,toFloat32ArrayAsyncIterator:()=>cl,toFloat32ArrayIterator:()=>tl,toFloat64Array:()=>Gc,toFloat64ArrayAsyncIterator:()=>ll,toFloat64ArrayIterator:()=>el,toInt16Array:()=>zc,toInt16ArrayAsyncIterator:()=>nl,toInt16ArrayIterator:()=>Xc,toInt32Array:()=>lr,toInt32ArrayAsyncIterator:()=>sl,toInt32ArrayIterator:()=>Kc,toInt8Array:()=>jc,toInt8ArrayAsyncIterator:()=>il,toInt8ArrayIterator:()=>Zc,toUint16Array:()=>$c,toUint16ArrayAsyncIterator:()=>ol,toUint16ArrayIterator:()=>qc,toUint32Array:()=>Wc,toUint32ArrayAsyncIterator:()=>al,toUint32ArrayIterator:()=>Qc,toUint8Array:()=>S,toUint8ArrayAsyncIterator:()=>Cs,toUint8ArrayIterator:()=>Rs,toUint8ClampedArray:()=>Jc,toUint8ClampedArrayAsyncIterator:()=>ul,toUint8ClampedArrayIterator:()=>rl});var Rc=new TextDecoder("utf-8"),ri=r=>Rc.decode(r),Cc=new TextEncoder,ce=r=>Cc.encode(r);var kc=r=>typeof r=="number",$o=r=>typeof r=="boolean",st=r=>typeof r=="function",mt=r=>r!=null&&Object(r)===r,Ot=r=>mt(r)&&st(r.then);var Yt=r=>mt(r)&&st(r[Symbol.iterator]),Ct=r=>mt(r)&&st(r[Symbol.asyncIterator]),nn=r=>mt(r)&&mt(r.schema);var sn=r=>mt(r)&&"done"in r&&"value"in r;var on=r=>mt(r)&&st(r.stat)&&kc(r.fd);var an=r=>mt(r)&&ii(r.body),cn=r=>"_getDOMStream"in r&&"_getNodeStream"in r,Wo=r=>mt(r)&&st(r.abort)&&st(r.getWriter)&&!cn(r),ii=r=>mt(r)&&st(r.cancel)&&st(r.getReader)&&!cn(r),Ho=r=>mt(r)&&st(r.end)&&st(r.write)&&$o(r.writable)&&!cn(r),ln=r=>mt(r)&&st(r.read)&&st(r.pipe)&&$o(r.readable)&&!cn(r),Yo=r=>mt(r)&&st(r.clear)&&st(r.bytes)&&st(r.position)&&st(r.setPosition)&&st(r.capacity)&&st(r.getBufferIdentifier)&&st(r.createLong);var Vs=typeof SharedArrayBuffer<"u"?SharedArrayBuffer:ArrayBuffer;function Pc(r){let t=r[0]?[r[0]]:[],e,i,n,s;for(let o,a,c=0,l=0,d=r.length;++cd+h.byteLength,0),n,s,o,a=0,c=-1,l=Math.min(t||Number.POSITIVE_INFINITY,i);for(let d=e.length;++cN(Int8Array,r),zc=r=>N(Int16Array,r),lr=r=>N(Int32Array,r),un=r=>N(BigInt64Array,r),S=r=>N(Uint8Array,r),$c=r=>N(Uint16Array,r),Wc=r=>N(Uint32Array,r),Hc=r=>N(BigUint64Array,r),Yc=r=>N(Float32Array,r),Gc=r=>N(Float64Array,r),Jc=r=>N(Uint8ClampedArray,r),Es=r=>(r.next(),r);function*le(r,t){let e=function*(n){yield n},i=typeof t=="string"||ArrayBuffer.isView(t)||t instanceof ArrayBuffer||t instanceof Vs?e(t):Yt(t)?t:e(t);return yield*Es(function*(n){let s=null;do s=n.next(yield N(r,s));while(!s.done)}(i[Symbol.iterator]())),new r}var Zc=r=>le(Int8Array,r),Xc=r=>le(Int16Array,r),Kc=r=>le(Int32Array,r),Rs=r=>le(Uint8Array,r),qc=r=>le(Uint16Array,r),Qc=r=>le(Uint32Array,r),tl=r=>le(Float32Array,r),el=r=>le(Float64Array,r),rl=r=>le(Uint8ClampedArray,r);function Gt(r,t){return At(this,arguments,function*(){if(Ot(t))return yield M(yield M(yield*Fr(Ht(Gt(r,yield M(t))))));let i=function(o){return At(this,arguments,function*(){yield yield M(yield M(o))})},n=function(o){return At(this,arguments,function*(){yield M(yield*Fr(Ht(Es(function*(a){let c=null;do c=a.next(yield c?.value);while(!c.done)}(o[Symbol.iterator]())))))})},s=typeof t=="string"||ArrayBuffer.isView(t)||t instanceof ArrayBuffer||t instanceof Vs?i(t):Yt(t)?n(t):Ct(t)?t:i(t);return yield M(yield*Fr(Ht(Es(function(o){return At(this,arguments,function*(){let a=null;do a=yield M(o.next(yield yield M(N(r,a))));while(!a.done)})}(s[Symbol.asyncIterator]()))))),yield M(new r)})}var il=r=>Gt(Int8Array,r),nl=r=>Gt(Int16Array,r),sl=r=>Gt(Int32Array,r),Cs=r=>Gt(Uint8Array,r),ol=r=>Gt(Uint16Array,r),al=r=>Gt(Uint32Array,r),cl=r=>Gt(Float32Array,r),ll=r=>Gt(Float64Array,r),ul=r=>Gt(Uint8ClampedArray,r);function dn(r,t,e){if(r!==0){e=e.slice(0,t);for(let i=-1,n=e.length;++i0)do if(r[e]!==t[e])return!1;while(++e(r.next(),r);function*dl(r){let t,e=!1,i=[],n,s,o,a=0;function c(){return s==="peek"?Ft(i,o)[0]:([n,i,a]=Ft(i,o),n)}({cmd:s,size:o}=(yield null)||{cmd:"read",size:0});let l=Rs(r)[Symbol.iterator]();try{do if({done:t,value:n}=Number.isNaN(o-a)?l.next():l.next(o-a),!t&&n.byteLength>0&&(i.push(n),a+=n.byteLength),t||o<=a)do({cmd:s,size:o}=yield c());while(o0&&(n.push(s),c+=s.byteLength),e||a<=c)do({cmd:o,size:a}=yield yield M(l()));while(a0&&(n.push(S(s)),c+=s.byteLength),e||a<=c)do({cmd:o,size:a}=yield yield M(l()));while(a{})}get closed(){return this.reader?this.reader.closed.catch(()=>{}):Promise.resolve()}releaseLock(){this.reader&&this.reader.releaseLock(),this.reader=null}cancel(t){return f(this,void 0,void 0,function*(){let{reader:e,source:i}=this;e&&(yield e.cancel(t).catch(()=>{})),i&&i.locked&&this.releaseLock()})}read(t){return f(this,void 0,void 0,function*(){if(t===0)return{done:this.reader==null,value:new Uint8Array(0)};let e=yield this.reader.read();return!e.done&&(e.value=S(e)),e})}},js=(r,t)=>{let e=n=>i([t,n]),i;return[t,e,new Promise(n=>(i=n)&&r.once(t,e))]};function pl(r){return At(this,arguments,function*(){let e=[],i="error",n=!1,s=null,o,a,c=0,l=[],d;function h(){return o==="peek"?Ft(l,a)[0]:([d,l,c]=Ft(l,a),d)}if({cmd:o,size:a}=(yield yield M(null))||{cmd:"read",size:0},r.isTTY)return yield yield M(new Uint8Array(0)),yield M(null);try{e[0]=js(r,"end"),e[1]=js(r,"error");do{if(e[2]=js(r,"readable"),[i,s]=yield M(Promise.race(e.map(L=>L[2]))),i==="error")break;if((n=i==="end")||(Number.isFinite(a-c)?(d=S(r.read(a-c)),d.byteLength0&&(l.push(d),c+=d.byteLength)),n||a<=c)do({cmd:o,size:a}=yield yield M(h()));while(a{for(let[K,Ge]of L)r.off(K,Ge);try{let K=r.destroy;K&&K.call(r,H),H=void 0}catch(K){H=K||H}finally{H!=null?Ye(H):Wt()}})}})}var j;(function(r){r[r.V1=0]="V1",r[r.V2=1]="V2",r[r.V3=2]="V3",r[r.V4=3]="V4",r[r.V5=4]="V5"})(j||(j={}));var Y;(function(r){r[r.Sparse=0]="Sparse",r[r.Dense=1]="Dense"})(Y||(Y={}));var $;(function(r){r[r.HALF=0]="HALF",r[r.SINGLE=1]="SINGLE",r[r.DOUBLE=2]="DOUBLE"})($||($={}));var et;(function(r){r[r.DAY=0]="DAY",r[r.MILLISECOND=1]="MILLISECOND"})(et||(et={}));var m;(function(r){r[r.SECOND=0]="SECOND",r[r.MILLISECOND=1]="MILLISECOND",r[r.MICROSECOND=2]="MICROSECOND",r[r.NANOSECOND=3]="NANOSECOND"})(m||(m={}));var lt;(function(r){r[r.YEAR_MONTH=0]="YEAR_MONTH",r[r.DAY_TIME=1]="DAY_TIME",r[r.MONTH_DAY_NANO=2]="MONTH_DAY_NANO"})(lt||(lt={}));var ue=new Int32Array(2),fn=new Float32Array(ue.buffer),pn=new Float64Array(ue.buffer),Tr=new Uint16Array(new Uint8Array([1,0]).buffer)[0]===1;var si;(function(r){r[r.UTF8_BYTES=1]="UTF8_BYTES",r[r.UTF16_STRING=2]="UTF16_STRING"})(si||(si={}));var Tt=class r{constructor(t){this.bytes_=t,this.position_=0,this.text_decoder_=new TextDecoder}static allocate(t){return new r(new Uint8Array(t))}clear(){this.position_=0}bytes(){return this.bytes_}position(){return this.position_}setPosition(t){this.position_=t}capacity(){return this.bytes_.length}readInt8(t){return this.readUint8(t)<<24>>24}readUint8(t){return this.bytes_[t]}readInt16(t){return this.readUint16(t)<<16>>16}readUint16(t){return this.bytes_[t]|this.bytes_[t+1]<<8}readInt32(t){return this.bytes_[t]|this.bytes_[t+1]<<8|this.bytes_[t+2]<<16|this.bytes_[t+3]<<24}readUint32(t){return this.readInt32(t)>>>0}readInt64(t){return BigInt.asIntN(64,BigInt(this.readUint32(t))+(BigInt(this.readUint32(t+4))<>8}writeUint16(t,e){this.bytes_[t]=e,this.bytes_[t+1]=e>>8}writeInt32(t,e){this.bytes_[t]=e,this.bytes_[t+1]=e>>8,this.bytes_[t+2]=e>>16,this.bytes_[t+3]=e>>24}writeUint32(t,e){this.bytes_[t]=e,this.bytes_[t+1]=e>>8,this.bytes_[t+2]=e>>16,this.bytes_[t+3]=e>>24}writeInt64(t,e){this.writeInt32(t,Number(BigInt.asIntN(32,e))),this.writeInt32(t+4,Number(BigInt.asIntN(32,e>>BigInt(32))))}writeUint64(t,e){this.writeUint32(t,Number(BigInt.asUintN(32,e))),this.writeUint32(t+4,Number(BigInt.asUintN(32,e>>BigInt(32))))}writeFloat32(t,e){fn[0]=e,this.writeInt32(t,ue[0])}writeFloat64(t,e){pn[0]=e,this.writeInt32(t,ue[Tr?0:1]),this.writeInt32(t+4,ue[Tr?1:0])}getBufferIdentifier(){if(this.bytes_.lengththis.minalign&&(this.minalign=t);let i=~(this.bb.capacity()-this.space+e)+1&t-1;for(;this.space=0&&this.vtable[e]==0;e--);let i=e+1;for(;e>=0;e--)this.addInt16(this.vtable[e]!=0?t-this.vtable[e]:0);let n=2;this.addInt16(t-this.object_start);let s=(i+n)*2;this.addInt16(s);let o=0,a=this.space;t:for(e=0;e=0;o--)this.writeInt8(s.charCodeAt(o))}this.prep(this.minalign,4+n),this.addOffset(t),n&&this.addInt32(this.bb.capacity()-this.space),this.bb.setPosition(this.space)}finishSizePrefixed(t,e){this.finish(t,e,!0)}requiredField(t,e){let i=this.bb.capacity()-t,n=i-this.bb.readInt32(i);if(!(e=0;i--)t.addInt32(e[i]);return t.endVector()}static startTypeIdsVector(t,e){t.startVector(4,e,4)}static endUnion(t){return t.endObject()}static createUnion(t,e,i){return r.startUnion(t),r.addMode(t,e),r.addTypeIds(t,i),r.endUnion(t)}};var yi=class r{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsUtf8(t,e){return(e||new r).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsUtf8(t,e){return t.setPosition(t.position()+4),(e||new r).__init(t.readInt32(t.position())+t.position(),t)}static startUtf8(t){t.startObject(0)}static endUtf8(t){return t.endObject()}static createUtf8(t){return r.startUtf8(t),r.endUtf8(t)}};var W;(function(r){r[r.NONE=0]="NONE",r[r.Null=1]="Null",r[r.Int=2]="Int",r[r.FloatingPoint=3]="FloatingPoint",r[r.Binary=4]="Binary",r[r.Utf8=5]="Utf8",r[r.Bool=6]="Bool",r[r.Decimal=7]="Decimal",r[r.Date=8]="Date",r[r.Time=9]="Time",r[r.Timestamp=10]="Timestamp",r[r.Interval=11]="Interval",r[r.List=12]="List",r[r.Struct_=13]="Struct_",r[r.Union=14]="Union",r[r.FixedSizeBinary=15]="FixedSizeBinary",r[r.FixedSizeList=16]="FixedSizeList",r[r.Map=17]="Map",r[r.Duration=18]="Duration",r[r.LargeBinary=19]="LargeBinary",r[r.LargeUtf8=20]="LargeUtf8",r[r.LargeList=21]="LargeList",r[r.RunEndEncoded=22]="RunEndEncoded"})(W||(W={}));var pt=class r{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsField(t,e){return(e||new r).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsField(t,e){return t.setPosition(t.position()+4),(e||new r).__init(t.readInt32(t.position())+t.position(),t)}name(t){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.__string(this.bb_pos+e,t):null}nullable(){let t=this.bb.__offset(this.bb_pos,6);return t?!!this.bb.readInt8(this.bb_pos+t):!1}typeType(){let t=this.bb.__offset(this.bb_pos,8);return t?this.bb.readUint8(this.bb_pos+t):W.NONE}type(t){let e=this.bb.__offset(this.bb_pos,10);return e?this.bb.__union(t,this.bb_pos+e):null}dictionary(t){let e=this.bb.__offset(this.bb_pos,12);return e?(t||new de).__init(this.bb.__indirect(this.bb_pos+e),this.bb):null}children(t,e){let i=this.bb.__offset(this.bb_pos,14);return i?(e||new r).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+i)+t*4),this.bb):null}childrenLength(){let t=this.bb.__offset(this.bb_pos,14);return t?this.bb.__vector_len(this.bb_pos+t):0}customMetadata(t,e){let i=this.bb.__offset(this.bb_pos,16);return i?(e||new ot).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+i)+t*4),this.bb):null}customMetadataLength(){let t=this.bb.__offset(this.bb_pos,16);return t?this.bb.__vector_len(this.bb_pos+t):0}static startField(t){t.startObject(7)}static addName(t,e){t.addFieldOffset(0,e,0)}static addNullable(t,e){t.addFieldInt8(1,+e,0)}static addTypeType(t,e){t.addFieldInt8(2,e,W.NONE)}static addType(t,e){t.addFieldOffset(3,e,0)}static addDictionary(t,e){t.addFieldOffset(4,e,0)}static addChildren(t,e){t.addFieldOffset(5,e,0)}static createChildrenVector(t,e){t.startVector(4,e.length,4);for(let i=e.length-1;i>=0;i--)t.addOffset(e[i]);return t.endVector()}static startChildrenVector(t,e){t.startVector(4,e,4)}static addCustomMetadata(t,e){t.addFieldOffset(6,e,0)}static createCustomMetadataVector(t,e){t.startVector(4,e.length,4);for(let i=e.length-1;i>=0;i--)t.addOffset(e[i]);return t.endVector()}static startCustomMetadataVector(t,e){t.startVector(4,e,4)}static endField(t){return t.endObject()}};var wt=class r{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsSchema(t,e){return(e||new r).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsSchema(t,e){return t.setPosition(t.position()+4),(e||new r).__init(t.readInt32(t.position())+t.position(),t)}endianness(){let t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):Je.Little}fields(t,e){let i=this.bb.__offset(this.bb_pos,6);return i?(e||new pt).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+i)+t*4),this.bb):null}fieldsLength(){let t=this.bb.__offset(this.bb_pos,6);return t?this.bb.__vector_len(this.bb_pos+t):0}customMetadata(t,e){let i=this.bb.__offset(this.bb_pos,8);return i?(e||new ot).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+i)+t*4),this.bb):null}customMetadataLength(){let t=this.bb.__offset(this.bb_pos,8);return t?this.bb.__vector_len(this.bb_pos+t):0}features(t){let e=this.bb.__offset(this.bb_pos,10);return e?this.bb.readInt64(this.bb.__vector(this.bb_pos+e)+t*8):BigInt(0)}featuresLength(){let t=this.bb.__offset(this.bb_pos,10);return t?this.bb.__vector_len(this.bb_pos+t):0}static startSchema(t){t.startObject(4)}static addEndianness(t,e){t.addFieldInt16(0,e,Je.Little)}static addFields(t,e){t.addFieldOffset(1,e,0)}static createFieldsVector(t,e){t.startVector(4,e.length,4);for(let i=e.length-1;i>=0;i--)t.addOffset(e[i]);return t.endVector()}static startFieldsVector(t,e){t.startVector(4,e,4)}static addCustomMetadata(t,e){t.addFieldOffset(2,e,0)}static createCustomMetadataVector(t,e){t.startVector(4,e.length,4);for(let i=e.length-1;i>=0;i--)t.addOffset(e[i]);return t.endVector()}static startCustomMetadataVector(t,e){t.startVector(4,e,4)}static addFeatures(t,e){t.addFieldOffset(3,e,0)}static createFeaturesVector(t,e){t.startVector(8,e.length,8);for(let i=e.length-1;i>=0;i--)t.addInt64(e[i]);return t.endVector()}static startFeaturesVector(t,e){t.startVector(8,e,8)}static endSchema(t){return t.endObject()}static finishSchemaBuffer(t,e){t.finish(e)}static finishSizePrefixedSchemaBuffer(t,e){t.finish(e,void 0,!0)}static createSchema(t,e,i,n,s){return r.startSchema(t),r.addEndianness(t,e),r.addFields(t,i),r.addCustomMetadata(t,n),r.addFeatures(t,s),r.endSchema(t)}};var E;(function(r){r[r.NONE=0]="NONE",r[r.Schema=1]="Schema",r[r.DictionaryBatch=2]="DictionaryBatch",r[r.RecordBatch=3]="RecordBatch",r[r.Tensor=4]="Tensor",r[r.SparseTensor=5]="SparseTensor"})(E||(E={}));var u;(function(r){r[r.NONE=0]="NONE",r[r.Null=1]="Null",r[r.Int=2]="Int",r[r.Float=3]="Float",r[r.Binary=4]="Binary",r[r.Utf8=5]="Utf8",r[r.Bool=6]="Bool",r[r.Decimal=7]="Decimal",r[r.Date=8]="Date",r[r.Time=9]="Time",r[r.Timestamp=10]="Timestamp",r[r.Interval=11]="Interval",r[r.List=12]="List",r[r.Struct=13]="Struct",r[r.Union=14]="Union",r[r.FixedSizeBinary=15]="FixedSizeBinary",r[r.FixedSizeList=16]="FixedSizeList",r[r.Map=17]="Map",r[r.Duration=18]="Duration",r[r.LargeBinary=19]="LargeBinary",r[r.LargeUtf8=20]="LargeUtf8",r[r.Dictionary=-1]="Dictionary",r[r.Int8=-2]="Int8",r[r.Int16=-3]="Int16",r[r.Int32=-4]="Int32",r[r.Int64=-5]="Int64",r[r.Uint8=-6]="Uint8",r[r.Uint16=-7]="Uint16",r[r.Uint32=-8]="Uint32",r[r.Uint64=-9]="Uint64",r[r.Float16=-10]="Float16",r[r.Float32=-11]="Float32",r[r.Float64=-12]="Float64",r[r.DateDay=-13]="DateDay",r[r.DateMillisecond=-14]="DateMillisecond",r[r.TimestampSecond=-15]="TimestampSecond",r[r.TimestampMillisecond=-16]="TimestampMillisecond",r[r.TimestampMicrosecond=-17]="TimestampMicrosecond",r[r.TimestampNanosecond=-18]="TimestampNanosecond",r[r.TimeSecond=-19]="TimeSecond",r[r.TimeMillisecond=-20]="TimeMillisecond",r[r.TimeMicrosecond=-21]="TimeMicrosecond",r[r.TimeNanosecond=-22]="TimeNanosecond",r[r.DenseUnion=-23]="DenseUnion",r[r.SparseUnion=-24]="SparseUnion",r[r.IntervalDayTime=-25]="IntervalDayTime",r[r.IntervalYearMonth=-26]="IntervalYearMonth",r[r.DurationSecond=-27]="DurationSecond",r[r.DurationMillisecond=-28]="DurationMillisecond",r[r.DurationMicrosecond=-29]="DurationMicrosecond",r[r.DurationNanosecond=-30]="DurationNanosecond"})(u||(u={}));var Kt;(function(r){r[r.OFFSET=0]="OFFSET",r[r.DATA=1]="DATA",r[r.VALIDITY=2]="VALIDITY",r[r.TYPE=3]="TYPE"})(Kt||(Kt={}));var co={};cr(co,{clampRange:()=>vi,createElementComparator:()=>sr,wrapIndex:()=>dr});var $s={};cr($s,{valueToString:()=>qt});function qt(r){if(r===null)return"null";if(r===void 0)return"undefined";switch(typeof r){case"number":return`${r}`;case"bigint":return`${r}`;case"string":return`"${r}"`}return typeof r[Symbol.toPrimitive]=="function"?r[Symbol.toPrimitive]("string"):ArrayBuffer.isView(r)?r instanceof BigInt64Array||r instanceof BigUint64Array?`[${[...r].map(t=>qt(t))}]`:`[${r}]`:ArrayBuffer.isView(r)?`[${r}]`:JSON.stringify(r,(t,e)=>typeof e=="bigint"?`${e}`:e)}var Gs={};cr(Gs,{BN:()=>bi,bigNumToBigInt:()=>Jo,bigNumToNumber:()=>Ys,bigNumToString:()=>Er,isArrowBigNumSymbol:()=>Go});function R(r){if(typeof r=="bigint"&&(rNumber.MAX_SAFE_INTEGER))throw new TypeError(`${r} is not safe to convert to a number.`);return Number(r)}function Ws(r,t){return R(r/t)+R(r%t)/R(t)}var Go=Symbol.for("isArrowBigNum");function Qt(r,...t){return t.length===0?Object.setPrototypeOf(N(this.TypedArray,r),this.constructor.prototype):Object.setPrototypeOf(new this.TypedArray(r,...t),this.constructor.prototype)}Qt.prototype[Go]=!0;Qt.prototype.toJSON=function(){return`"${Er(this)}"`};Qt.prototype.valueOf=function(r){return Ys(this,r)};Qt.prototype.toString=function(){return Er(this)};Qt.prototype[Symbol.toPrimitive]=function(r="default"){switch(r){case"number":return Ys(this);case"string":return Er(this);case"default":return Jo(this)}return Er(this)};function Nr(...r){return Qt.apply(this,r)}function Ur(...r){return Qt.apply(this,r)}function gi(...r){return Qt.apply(this,r)}Object.setPrototypeOf(Nr.prototype,Object.create(Int32Array.prototype));Object.setPrototypeOf(Ur.prototype,Object.create(Uint32Array.prototype));Object.setPrototypeOf(gi.prototype,Object.create(Uint32Array.prototype));Object.assign(Nr.prototype,Qt.prototype,{constructor:Nr,signed:!0,TypedArray:Int32Array,BigIntArray:BigInt64Array});Object.assign(Ur.prototype,Qt.prototype,{constructor:Ur,signed:!1,TypedArray:Uint32Array,BigIntArray:BigUint64Array});Object.assign(gi.prototype,Qt.prototype,{constructor:gi,signed:!0,TypedArray:Uint32Array,BigIntArray:BigUint64Array});var ml=BigInt(4294967296)*BigInt(4294967296),yl=ml-BigInt(1);function Ys(r,t){let{buffer:e,byteOffset:i,byteLength:n,signed:s}=r,o=new BigUint64Array(e,i,n/8),a=s&&o.at(-1)&BigInt(1)<=0)return Hs(r);t=t.slice();let i=1;for(let s=0;s(r.children=null,r.ArrayType=Array,r.OffsetArrayType=Int32Array,r[Symbol.toStringTag]="DataType"))(p.prototype);var yt=class extends p{constructor(){super(u.Null)}toString(){return"Null"}};Xo=Symbol.toStringTag;yt[Xo]=(r=>r[Symbol.toStringTag]="Null")(yt.prototype);var at=class extends p{constructor(t,e){super(u.Int),this.isSigned=t,this.bitWidth=e}get ArrayType(){switch(this.bitWidth){case 8:return this.isSigned?Int8Array:Uint8Array;case 16:return this.isSigned?Int16Array:Uint16Array;case 32:return this.isSigned?Int32Array:Uint32Array;case 64:return this.isSigned?BigInt64Array:BigUint64Array}throw new Error(`Unrecognized ${this[Symbol.toStringTag]} type`)}toString(){return`${this.isSigned?"I":"Ui"}nt${this.bitWidth}`}};Ko=Symbol.toStringTag;at[Ko]=(r=>(r.isSigned=null,r.bitWidth=null,r[Symbol.toStringTag]="Int"))(at.prototype);var gn=class extends at{constructor(){super(!0,8)}get ArrayType(){return Int8Array}},bn=class extends at{constructor(){super(!0,16)}get ArrayType(){return Int16Array}},fe=class extends at{constructor(){super(!0,32)}get ArrayType(){return Int32Array}},_n=class extends at{constructor(){super(!0,64)}get ArrayType(){return BigInt64Array}},vn=class extends at{constructor(){super(!1,8)}get ArrayType(){return Uint8Array}},wn=class extends at{constructor(){super(!1,16)}get ArrayType(){return Uint16Array}},In=class extends at{constructor(){super(!1,32)}get ArrayType(){return Uint32Array}},Sn=class extends at{constructor(){super(!1,64)}get ArrayType(){return BigUint64Array}};Object.defineProperty(gn.prototype,"ArrayType",{value:Int8Array});Object.defineProperty(bn.prototype,"ArrayType",{value:Int16Array});Object.defineProperty(fe.prototype,"ArrayType",{value:Int32Array});Object.defineProperty(_n.prototype,"ArrayType",{value:BigInt64Array});Object.defineProperty(vn.prototype,"ArrayType",{value:Uint8Array});Object.defineProperty(wn.prototype,"ArrayType",{value:Uint16Array});Object.defineProperty(In.prototype,"ArrayType",{value:Uint32Array});Object.defineProperty(Sn.prototype,"ArrayType",{value:BigUint64Array});var Pt=class extends p{constructor(t){super(u.Float),this.precision=t}get ArrayType(){switch(this.precision){case $.HALF:return Uint16Array;case $.SINGLE:return Float32Array;case $.DOUBLE:return Float64Array}throw new Error(`Unrecognized ${this[Symbol.toStringTag]} type`)}toString(){return`Float${this.precision<<5||16}`}};qo=Symbol.toStringTag;Pt[qo]=(r=>(r.precision=null,r[Symbol.toStringTag]="Float"))(Pt.prototype);var Bn=class extends Pt{constructor(){super($.HALF)}},xn=class extends Pt{constructor(){super($.SINGLE)}},Dn=class extends Pt{constructor(){super($.DOUBLE)}};Object.defineProperty(Bn.prototype,"ArrayType",{value:Uint16Array});Object.defineProperty(xn.prototype,"ArrayType",{value:Float32Array});Object.defineProperty(Dn.prototype,"ArrayType",{value:Float64Array});var Ie=class extends p{constructor(){super(u.Binary)}toString(){return"Binary"}};Qo=Symbol.toStringTag;Ie[Qo]=(r=>(r.ArrayType=Uint8Array,r[Symbol.toStringTag]="Binary"))(Ie.prototype);var Se=class extends p{constructor(){super(u.LargeBinary)}toString(){return"LargeBinary"}};ta=Symbol.toStringTag;Se[ta]=(r=>(r.ArrayType=Uint8Array,r.OffsetArrayType=BigInt64Array,r[Symbol.toStringTag]="LargeBinary"))(Se.prototype);var Be=class extends p{constructor(){super(u.Utf8)}toString(){return"Utf8"}};ea=Symbol.toStringTag;Be[ea]=(r=>(r.ArrayType=Uint8Array,r[Symbol.toStringTag]="Utf8"))(Be.prototype);var xe=class extends p{constructor(){super(u.LargeUtf8)}toString(){return"LargeUtf8"}};ra=Symbol.toStringTag;xe[ra]=(r=>(r.ArrayType=Uint8Array,r.OffsetArrayType=BigInt64Array,r[Symbol.toStringTag]="LargeUtf8"))(xe.prototype);var De=class extends p{constructor(){super(u.Bool)}toString(){return"Bool"}};ia=Symbol.toStringTag;De[ia]=(r=>(r.ArrayType=Uint8Array,r[Symbol.toStringTag]="Bool"))(De.prototype);var Ae=class extends p{constructor(t,e,i=128){super(u.Decimal),this.scale=t,this.precision=e,this.bitWidth=i}toString(){return`Decimal[${this.precision}e${this.scale>0?"+":""}${this.scale}]`}};na=Symbol.toStringTag;Ae[na]=(r=>(r.scale=null,r.precision=null,r.ArrayType=Uint32Array,r[Symbol.toStringTag]="Decimal"))(Ae.prototype);var Oe=class extends p{constructor(t){super(u.Date),this.unit=t}toString(){return`Date${(this.unit+1)*32}<${et[this.unit]}>`}get ArrayType(){return this.unit===et.DAY?Int32Array:BigInt64Array}};sa=Symbol.toStringTag;Oe[sa]=(r=>(r.unit=null,r[Symbol.toStringTag]="Date"))(Oe.prototype);var Fe=class extends p{constructor(t,e){super(u.Time),this.unit=t,this.bitWidth=e}toString(){return`Time${this.bitWidth}<${m[this.unit]}>`}get ArrayType(){switch(this.bitWidth){case 32:return Int32Array;case 64:return BigInt64Array}throw new Error(`Unrecognized ${this[Symbol.toStringTag]} type`)}};oa=Symbol.toStringTag;Fe[oa]=(r=>(r.unit=null,r.bitWidth=null,r[Symbol.toStringTag]="Time"))(Fe.prototype);var Te=class extends p{constructor(t,e){super(u.Timestamp),this.unit=t,this.timezone=e}toString(){return`Timestamp<${m[this.unit]}${this.timezone?`, ${this.timezone}`:""}>`}};aa=Symbol.toStringTag;Te[aa]=(r=>(r.unit=null,r.timezone=null,r.ArrayType=BigInt64Array,r[Symbol.toStringTag]="Timestamp"))(Te.prototype);var Me=class extends p{constructor(t){super(u.Interval),this.unit=t}toString(){return`Interval<${lt[this.unit]}>`}};ca=Symbol.toStringTag;Me[ca]=(r=>(r.unit=null,r.ArrayType=Int32Array,r[Symbol.toStringTag]="Interval"))(Me.prototype);var Le=class extends p{constructor(t){super(u.Duration),this.unit=t}toString(){return`Duration<${m[this.unit]}>`}};la=Symbol.toStringTag;Le[la]=(r=>(r.unit=null,r.ArrayType=BigInt64Array,r[Symbol.toStringTag]="Duration"))(Le.prototype);var te=class extends p{constructor(t){super(u.List),this.children=[t]}toString(){return`List<${this.valueType}>`}get valueType(){return this.children[0].type}get valueField(){return this.children[0]}get ArrayType(){return this.valueType.ArrayType}};ua=Symbol.toStringTag;te[ua]=(r=>(r.children=null,r[Symbol.toStringTag]="List"))(te.prototype);var G=class extends p{constructor(t){super(u.Struct),this.children=t}toString(){return`Struct<{${this.children.map(t=>`${t.name}:${t.type}`).join(", ")}}>`}};da=Symbol.toStringTag;G[da]=(r=>(r.children=null,r[Symbol.toStringTag]="Struct"))(G.prototype);var ee=class extends p{constructor(t,e,i){super(u.Union),this.mode=t,this.children=i,this.typeIds=e=Int32Array.from(e),this.typeIdToChildIndex=e.reduce((n,s,o)=>(n[s]=o)&&n||n,Object.create(null))}toString(){return`${this[Symbol.toStringTag]}<${this.children.map(t=>`${t.type}`).join(" | ")}>`}};ha=Symbol.toStringTag;ee[ha]=(r=>(r.mode=null,r.typeIds=null,r.children=null,r.typeIdToChildIndex=null,r.ArrayType=Int8Array,r[Symbol.toStringTag]="Union"))(ee.prototype);var Ne=class extends p{constructor(t){super(u.FixedSizeBinary),this.byteWidth=t}toString(){return`FixedSizeBinary[${this.byteWidth}]`}};fa=Symbol.toStringTag;Ne[fa]=(r=>(r.byteWidth=null,r.ArrayType=Uint8Array,r[Symbol.toStringTag]="FixedSizeBinary"))(Ne.prototype);var re=class extends p{constructor(t,e){super(u.FixedSizeList),this.listSize=t,this.children=[e]}get valueType(){return this.children[0].type}get valueField(){return this.children[0]}get ArrayType(){return this.valueType.ArrayType}toString(){return`FixedSizeList[${this.listSize}]<${this.valueType}>`}};pa=Symbol.toStringTag;re[pa]=(r=>(r.children=null,r.listSize=null,r[Symbol.toStringTag]="FixedSizeList"))(re.prototype);var ie=class extends p{constructor(t,e=!1){var i,n,s;if(super(u.Map),this.children=[t],this.keysSorted=e,t&&(t.name="entries",!((i=t?.type)===null||i===void 0)&&i.children)){let o=(n=t?.type)===null||n===void 0?void 0:n.children[0];o&&(o.name="key");let a=(s=t?.type)===null||s===void 0?void 0:s.children[1];a&&(a.name="value")}}get keyType(){return this.children[0].type.children[0].type}get valueType(){return this.children[0].type.children[1].type}get childType(){return this.children[0].type}toString(){return`Map<{${this.children[0].type.children.map(t=>`${t.name}:${t.type}`).join(", ")}}>`}};ma=Symbol.toStringTag;ie[ma]=(r=>(r.children=null,r.keysSorted=null,r[Symbol.toStringTag]="Map_"))(ie.prototype);var gl=(r=>()=>++r)(-1),Lt=class extends p{constructor(t,e,i,n){super(u.Dictionary),this.indices=e,this.dictionary=t,this.isOrdered=n||!1,this.id=i==null?gl():R(i)}get children(){return this.dictionary.children}get valueType(){return this.dictionary}get ArrayType(){return this.dictionary.ArrayType}toString(){return`Dictionary<${this.indices}, ${this.dictionary}>`}};ya=Symbol.toStringTag;Lt[ya]=(r=>(r.id=null,r.indices=null,r.isOrdered=null,r.dictionary=null,r[Symbol.toStringTag]="Dictionary"))(Lt.prototype);function Nt(r){let t=r;switch(r.typeId){case u.Decimal:return r.bitWidth/32;case u.Interval:return 1+t.unit;case u.FixedSizeList:return t.listSize;case u.FixedSizeBinary:return t.byteWidth;default:return 1}}var g=class{visitMany(t,...e){return t.map((i,n)=>this.visit(i,...e.map(s=>s[n])))}visit(...t){return this.getVisitFn(t[0],!1).apply(this,t)}getVisitFn(t,e=!0){return bl(this,t,e)}getVisitFnByTypeId(t,e=!0){return Vr(this,t,e)}visitNull(t,...e){return null}visitBool(t,...e){return null}visitInt(t,...e){return null}visitFloat(t,...e){return null}visitUtf8(t,...e){return null}visitLargeUtf8(t,...e){return null}visitBinary(t,...e){return null}visitLargeBinary(t,...e){return null}visitFixedSizeBinary(t,...e){return null}visitDate(t,...e){return null}visitTimestamp(t,...e){return null}visitTime(t,...e){return null}visitDecimal(t,...e){return null}visitList(t,...e){return null}visitStruct(t,...e){return null}visitUnion(t,...e){return null}visitDictionary(t,...e){return null}visitInterval(t,...e){return null}visitDuration(t,...e){return null}visitFixedSizeList(t,...e){return null}visitMap(t,...e){return null}};function bl(r,t,e=!0){return typeof t=="number"?Vr(r,t,e):typeof t=="string"&&t in u?Vr(r,u[t],e):t&&t instanceof p?Vr(r,ga(t),e):t?.type&&t.type instanceof p?Vr(r,ga(t.type),e):Vr(r,u.NONE,e)}function Vr(r,t,e=!0){let i=null;switch(t){case u.Null:i=r.visitNull;break;case u.Bool:i=r.visitBool;break;case u.Int:i=r.visitInt;break;case u.Int8:i=r.visitInt8||r.visitInt;break;case u.Int16:i=r.visitInt16||r.visitInt;break;case u.Int32:i=r.visitInt32||r.visitInt;break;case u.Int64:i=r.visitInt64||r.visitInt;break;case u.Uint8:i=r.visitUint8||r.visitInt;break;case u.Uint16:i=r.visitUint16||r.visitInt;break;case u.Uint32:i=r.visitUint32||r.visitInt;break;case u.Uint64:i=r.visitUint64||r.visitInt;break;case u.Float:i=r.visitFloat;break;case u.Float16:i=r.visitFloat16||r.visitFloat;break;case u.Float32:i=r.visitFloat32||r.visitFloat;break;case u.Float64:i=r.visitFloat64||r.visitFloat;break;case u.Utf8:i=r.visitUtf8;break;case u.LargeUtf8:i=r.visitLargeUtf8;break;case u.Binary:i=r.visitBinary;break;case u.LargeBinary:i=r.visitLargeBinary;break;case u.FixedSizeBinary:i=r.visitFixedSizeBinary;break;case u.Date:i=r.visitDate;break;case u.DateDay:i=r.visitDateDay||r.visitDate;break;case u.DateMillisecond:i=r.visitDateMillisecond||r.visitDate;break;case u.Timestamp:i=r.visitTimestamp;break;case u.TimestampSecond:i=r.visitTimestampSecond||r.visitTimestamp;break;case u.TimestampMillisecond:i=r.visitTimestampMillisecond||r.visitTimestamp;break;case u.TimestampMicrosecond:i=r.visitTimestampMicrosecond||r.visitTimestamp;break;case u.TimestampNanosecond:i=r.visitTimestampNanosecond||r.visitTimestamp;break;case u.Time:i=r.visitTime;break;case u.TimeSecond:i=r.visitTimeSecond||r.visitTime;break;case u.TimeMillisecond:i=r.visitTimeMillisecond||r.visitTime;break;case u.TimeMicrosecond:i=r.visitTimeMicrosecond||r.visitTime;break;case u.TimeNanosecond:i=r.visitTimeNanosecond||r.visitTime;break;case u.Decimal:i=r.visitDecimal;break;case u.List:i=r.visitList;break;case u.Struct:i=r.visitStruct;break;case u.Union:i=r.visitUnion;break;case u.DenseUnion:i=r.visitDenseUnion||r.visitUnion;break;case u.SparseUnion:i=r.visitSparseUnion||r.visitUnion;break;case u.Dictionary:i=r.visitDictionary;break;case u.Interval:i=r.visitInterval;break;case u.IntervalDayTime:i=r.visitIntervalDayTime||r.visitInterval;break;case u.IntervalYearMonth:i=r.visitIntervalYearMonth||r.visitInterval;break;case u.Duration:i=r.visitDuration;break;case u.DurationSecond:i=r.visitDurationSecond||r.visitDuration;break;case u.DurationMillisecond:i=r.visitDurationMillisecond||r.visitDuration;break;case u.DurationMicrosecond:i=r.visitDurationMicrosecond||r.visitDuration;break;case u.DurationNanosecond:i=r.visitDurationNanosecond||r.visitDuration;break;case u.FixedSizeList:i=r.visitFixedSizeList;break;case u.Map:i=r.visitMap;break}if(typeof i=="function")return i;if(!e)return()=>null;throw new Error(`Unrecognized type '${u[t]}'`)}function ga(r){switch(r.typeId){case u.Null:return u.Null;case u.Int:{let{bitWidth:t,isSigned:e}=r;switch(t){case 8:return e?u.Int8:u.Uint8;case 16:return e?u.Int16:u.Uint16;case 32:return e?u.Int32:u.Uint32;case 64:return e?u.Int64:u.Uint64}return u.Int}case u.Float:switch(r.precision){case $.HALF:return u.Float16;case $.SINGLE:return u.Float32;case $.DOUBLE:return u.Float64}return u.Float;case u.Binary:return u.Binary;case u.LargeBinary:return u.LargeBinary;case u.Utf8:return u.Utf8;case u.LargeUtf8:return u.LargeUtf8;case u.Bool:return u.Bool;case u.Decimal:return u.Decimal;case u.Time:switch(r.unit){case m.SECOND:return u.TimeSecond;case m.MILLISECOND:return u.TimeMillisecond;case m.MICROSECOND:return u.TimeMicrosecond;case m.NANOSECOND:return u.TimeNanosecond}return u.Time;case u.Timestamp:switch(r.unit){case m.SECOND:return u.TimestampSecond;case m.MILLISECOND:return u.TimestampMillisecond;case m.MICROSECOND:return u.TimestampMicrosecond;case m.NANOSECOND:return u.TimestampNanosecond}return u.Timestamp;case u.Date:switch(r.unit){case et.DAY:return u.DateDay;case et.MILLISECOND:return u.DateMillisecond}return u.Date;case u.Interval:switch(r.unit){case lt.DAY_TIME:return u.IntervalDayTime;case lt.YEAR_MONTH:return u.IntervalYearMonth}return u.Interval;case u.Duration:switch(r.unit){case m.SECOND:return u.DurationSecond;case m.MILLISECOND:return u.DurationMillisecond;case m.MICROSECOND:return u.DurationMicrosecond;case m.NANOSECOND:return u.DurationNanosecond}return u.Duration;case u.Map:return u.Map;case u.List:return u.List;case u.Struct:return u.Struct;case u.Union:switch(r.mode){case Y.Dense:return u.DenseUnion;case Y.Sparse:return u.SparseUnion}return u.Union;case u.FixedSizeBinary:return u.FixedSizeBinary;case u.FixedSizeList:return u.FixedSizeList;case u.Dictionary:return u.Dictionary}throw new Error(`Unrecognized type '${u[r.typeId]}'`)}g.prototype.visitInt8=null;g.prototype.visitInt16=null;g.prototype.visitInt32=null;g.prototype.visitInt64=null;g.prototype.visitUint8=null;g.prototype.visitUint16=null;g.prototype.visitUint32=null;g.prototype.visitUint64=null;g.prototype.visitFloat16=null;g.prototype.visitFloat32=null;g.prototype.visitFloat64=null;g.prototype.visitDateDay=null;g.prototype.visitDateMillisecond=null;g.prototype.visitTimestampSecond=null;g.prototype.visitTimestampMillisecond=null;g.prototype.visitTimestampMicrosecond=null;g.prototype.visitTimestampNanosecond=null;g.prototype.visitTimeSecond=null;g.prototype.visitTimeMillisecond=null;g.prototype.visitTimeMicrosecond=null;g.prototype.visitTimeNanosecond=null;g.prototype.visitDenseUnion=null;g.prototype.visitSparseUnion=null;g.prototype.visitIntervalDayTime=null;g.prototype.visitIntervalYearMonth=null;g.prototype.visitDuration=null;g.prototype.visitDurationSecond=null;g.prototype.visitDurationMillisecond=null;g.prototype.visitDurationMicrosecond=null;g.prototype.visitDurationNanosecond=null;var Js={};cr(Js,{float64ToUint16:()=>_i,uint16ToFloat64:()=>An});var ba=new Float64Array(1),Rr=new Uint32Array(ba.buffer);function An(r){let t=(r&31744)>>10,e=(r&1023)/1024,i=Math.pow(-1,(r&32768)>>15);switch(t){case 31:return i*(e?Number.NaN:1/0);case 0:return i*(e?6103515625e-14*e:0)}return i*Math.pow(2,t-15)*(1+e)}function _i(r){if(r!==r)return 32256;ba[0]=r;let t=(Rr[1]&2147483648)>>16&65535,e=Rr[1]&2146435072,i=0;return e>=1089470464?Rr[0]>0?e=31744:(e=(e&2080374784)>>16,i=(Rr[1]&1048575)>>10):e<=1056964608?(i=1048576+(Rr[1]&1048575),i=1048576+(i<<(e>>20)-998)>>21,e=0):(e=e-1056964608>>10,i=(Rr[1]&1048575)+512>>10),t|e|i&65535}var I=class extends g{};function D(r){return(t,e,i)=>{if(t.setValid(e,i!=null))return r(t,e,i)}}var _l=(r,t,e)=>{r[t]=Math.floor(e/864e5)},_a=(r,t,e,i)=>{if(e+1{let n=r+e;i?t[n>>3]|=1<>3]&=~(1<{r[t]=e},Zs=({values:r},t,e)=>{r[t]=e},va=({values:r},t,e)=>{r[t]=_i(e)},wl=(r,t,e)=>{switch(r.type.precision){case $.HALF:return va(r,t,e);case $.SINGLE:case $.DOUBLE:return Zs(r,t,e)}},On=({values:r},t,e)=>{_l(r,t,e.valueOf())},Fn=({values:r},t,e)=>{r[t]=BigInt(e)},Xs=({stride:r,values:t},e,i)=>{t.set(i.subarray(0,r),r*e)},wa=({values:r,valueOffsets:t},e,i)=>_a(r,t,e,i),Ia=({values:r,valueOffsets:t},e,i)=>_a(r,t,e,ce(i)),Ks=(r,t,e)=>{r.type.unit===et.DAY?On(r,t,e):Fn(r,t,e)},Tn=({values:r},t,e)=>{r[t]=BigInt(e/1e3)},Mn=({values:r},t,e)=>{r[t]=BigInt(e)},Ln=({values:r},t,e)=>{r[t]=BigInt(e*1e3)},Nn=({values:r},t,e)=>{r[t]=BigInt(e*1e6)},qs=(r,t,e)=>{switch(r.type.unit){case m.SECOND:return Tn(r,t,e);case m.MILLISECOND:return Mn(r,t,e);case m.MICROSECOND:return Ln(r,t,e);case m.NANOSECOND:return Nn(r,t,e)}},Un=({values:r},t,e)=>{r[t]=e},En=({values:r},t,e)=>{r[t]=e},Vn=({values:r},t,e)=>{r[t]=e},Rn=({values:r},t,e)=>{r[t]=e},Qs=(r,t,e)=>{switch(r.type.unit){case m.SECOND:return Un(r,t,e);case m.MILLISECOND:return En(r,t,e);case m.MICROSECOND:return Vn(r,t,e);case m.NANOSECOND:return Rn(r,t,e)}},to=({values:r,stride:t},e,i)=>{r.set(i.subarray(0,t),t*e)},Il=(r,t,e)=>{let i=r.children[0],n=r.valueOffsets,s=dt.getVisitFn(i);if(Array.isArray(e))for(let o=-1,a=n[t],c=n[t+1];a{let i=r.children[0],{valueOffsets:n}=r,s=dt.getVisitFn(i),{[t]:o,[t+1]:a}=n,c=e instanceof Map?e.entries():Object.entries(e);for(let l of c)if(s(i,o,l),++o>=a)break},Bl=(r,t)=>(e,i,n,s)=>i&&e(i,r,t[s]),xl=(r,t)=>(e,i,n,s)=>i&&e(i,r,t.get(s)),Dl=(r,t)=>(e,i,n,s)=>i&&e(i,r,t.get(n.name)),Al=(r,t)=>(e,i,n,s)=>i&&e(i,r,t[n.name]),Ol=(r,t,e)=>{let i=r.type.children.map(s=>dt.getVisitFn(s.type)),n=e instanceof Map?Dl(t,e):e instanceof V?xl(t,e):Array.isArray(e)?Bl(t,e):Al(t,e);r.type.children.forEach((s,o)=>n(i[o],r.children[o],s,o))},Fl=(r,t,e)=>{r.type.mode===Y.Dense?Sa(r,t,e):Ba(r,t,e)},Sa=(r,t,e)=>{let i=r.type.typeIdToChildIndex[r.typeIds[t]],n=r.children[i];dt.visit(n,r.valueOffsets[t],e)},Ba=(r,t,e)=>{let i=r.type.typeIdToChildIndex[r.typeIds[t]],n=r.children[i];dt.visit(n,t,e)},Tl=(r,t,e)=>{var i;(i=r.dictionary)===null||i===void 0||i.set(r.values[t],e)},eo=(r,t,e)=>{r.type.unit===lt.DAY_TIME?Cn(r,t,e):kn(r,t,e)},Cn=({values:r},t,e)=>{r.set(e.subarray(0,2),2*t)},kn=({values:r},t,e)=>{r[t]=e[0]*12+e[1]%12},Pn=({values:r},t,e)=>{r[t]=e},jn=({values:r},t,e)=>{r[t]=e},zn=({values:r},t,e)=>{r[t]=e},$n=({values:r},t,e)=>{r[t]=e},ro=(r,t,e)=>{switch(r.type.unit){case m.SECOND:return Pn(r,t,e);case m.MILLISECOND:return jn(r,t,e);case m.MICROSECOND:return zn(r,t,e);case m.NANOSECOND:return $n(r,t,e)}},Ml=(r,t,e)=>{let{stride:i}=r,n=r.children[0],s=dt.getVisitFn(n);if(Array.isArray(e))for(let o=-1,a=t*i;++o`${qt(t)}: ${qt(e)}`).join(", ")}}`}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}[Symbol.iterator](){return new io(this[ne],this[Cr])}},io=class{constructor(t,e){this.childIndex=0,this.children=t.children,this.rowIndex=e,this.childFields=t.type.children,this.numChildren=this.childFields.length}[Symbol.iterator](){return this}next(){let t=this.childIndex;return te.name)}has(t,e){return t[ne].type.children.findIndex(i=>i.name===e)!==-1}getOwnPropertyDescriptor(t,e){if(t[ne].type.children.findIndex(i=>i.name===e)!==-1)return{writable:!0,enumerable:!0,configurable:!0}}get(t,e){if(Reflect.has(t,e))return t[e];let i=t[ne].type.children.findIndex(n=>n.name===e);if(i!==-1){let n=rt.visit(t[ne].children[i],t[Cr]);return Reflect.set(t,e,n),n}}set(t,e,i){let n=t[ne].type.children.findIndex(s=>s.name===e);return n!==-1?(dt.visit(t[ne].children[n],t[Cr],i),Reflect.set(t,e,i)):Reflect.has(t,e)||typeof e=="symbol"?Reflect.set(t,e,i):!1}};var b=class extends g{};function B(r){return(t,e)=>t.getValid(e)?r(t,e):null}var Ll=(r,t)=>864e5*r[t],Nl=(r,t)=>null,xa=(r,t,e)=>{if(e+1>=t.length)return null;let i=R(t[e]),n=R(t[e+1]);return r.subarray(i,n)},Ul=({offset:r,values:t},e)=>{let i=r+e;return(t[i>>3]&1<Ll(r,t),Aa=({values:r},t)=>R(r[t]),ir=({stride:r,values:t},e)=>t[r*e],El=({stride:r,values:t},e)=>An(t[r*e]),Oa=({values:r},t)=>r[t],Vl=({stride:r,values:t},e)=>t.subarray(r*e,r*(e+1)),Fa=({values:r,valueOffsets:t},e)=>xa(r,t,e),Ta=({values:r,valueOffsets:t},e)=>{let i=xa(r,t,e);return i!==null?ri(i):null},Rl=({values:r},t)=>r[t],Cl=({type:r,values:t},e)=>r.precision!==$.HALF?t[e]:An(t[e]),kl=(r,t)=>r.type.unit===et.DAY?Da(r,t):Aa(r,t),Ma=({values:r},t)=>1e3*R(r[t]),La=({values:r},t)=>R(r[t]),Na=({values:r},t)=>Ws(r[t],BigInt(1e3)),Ua=({values:r},t)=>Ws(r[t],BigInt(1e6)),Pl=(r,t)=>{switch(r.type.unit){case m.SECOND:return Ma(r,t);case m.MILLISECOND:return La(r,t);case m.MICROSECOND:return Na(r,t);case m.NANOSECOND:return Ua(r,t)}},Ea=({values:r},t)=>r[t],Va=({values:r},t)=>r[t],Ra=({values:r},t)=>r[t],Ca=({values:r},t)=>r[t],jl=(r,t)=>{switch(r.type.unit){case m.SECOND:return Ea(r,t);case m.MILLISECOND:return Va(r,t);case m.MICROSECOND:return Ra(r,t);case m.NANOSECOND:return Ca(r,t)}},zl=({values:r,stride:t},e)=>bi.decimal(r.subarray(t*e,t*(e+1))),$l=(r,t)=>{let{valueOffsets:e,stride:i,children:n}=r,{[t*i]:s,[t*i+1]:o}=e,c=n[0].slice(s,o-s);return new V([c])},Wl=(r,t)=>{let{valueOffsets:e,children:i}=r,{[t]:n,[t+1]:s}=e,o=i[0];return new pe(o.slice(n,s-n))},Hl=(r,t)=>new rr(r,t),Yl=(r,t)=>r.type.mode===Y.Dense?ka(r,t):Pa(r,t),ka=(r,t)=>{let e=r.type.typeIdToChildIndex[r.typeIds[t]],i=r.children[e];return rt.visit(i,r.valueOffsets[t])},Pa=(r,t)=>{let e=r.type.typeIdToChildIndex[r.typeIds[t]],i=r.children[e];return rt.visit(i,t)},Gl=(r,t)=>{var e;return(e=r.dictionary)===null||e===void 0?void 0:e.get(r.values[t])},Jl=(r,t)=>r.type.unit===lt.DAY_TIME?ja(r,t):za(r,t),ja=({values:r},t)=>r.subarray(2*t,2*(t+1)),za=({values:r},t)=>{let e=r[t],i=new Int32Array(2);return i[0]=Math.trunc(e/12),i[1]=Math.trunc(e%12),i},$a=({values:r},t)=>r[t],Wa=({values:r},t)=>r[t],Ha=({values:r},t)=>r[t],Ya=({values:r},t)=>r[t],Zl=(r,t)=>{switch(r.type.unit){case m.SECOND:return $a(r,t);case m.MILLISECOND:return Wa(r,t);case m.MICROSECOND:return Ha(r,t);case m.NANOSECOND:return Ya(r,t)}},Xl=(r,t)=>{let{stride:e,children:i}=r,s=i[0].slice(t*e,e);return new V([s])};b.prototype.visitNull=B(Nl);b.prototype.visitBool=B(Ul);b.prototype.visitInt=B(Rl);b.prototype.visitInt8=B(ir);b.prototype.visitInt16=B(ir);b.prototype.visitInt32=B(ir);b.prototype.visitInt64=B(Oa);b.prototype.visitUint8=B(ir);b.prototype.visitUint16=B(ir);b.prototype.visitUint32=B(ir);b.prototype.visitUint64=B(Oa);b.prototype.visitFloat=B(Cl);b.prototype.visitFloat16=B(El);b.prototype.visitFloat32=B(ir);b.prototype.visitFloat64=B(ir);b.prototype.visitUtf8=B(Ta);b.prototype.visitLargeUtf8=B(Ta);b.prototype.visitBinary=B(Fa);b.prototype.visitLargeBinary=B(Fa);b.prototype.visitFixedSizeBinary=B(Vl);b.prototype.visitDate=B(kl);b.prototype.visitDateDay=B(Da);b.prototype.visitDateMillisecond=B(Aa);b.prototype.visitTimestamp=B(Pl);b.prototype.visitTimestampSecond=B(Ma);b.prototype.visitTimestampMillisecond=B(La);b.prototype.visitTimestampMicrosecond=B(Na);b.prototype.visitTimestampNanosecond=B(Ua);b.prototype.visitTime=B(jl);b.prototype.visitTimeSecond=B(Ea);b.prototype.visitTimeMillisecond=B(Va);b.prototype.visitTimeMicrosecond=B(Ra);b.prototype.visitTimeNanosecond=B(Ca);b.prototype.visitDecimal=B(zl);b.prototype.visitList=B($l);b.prototype.visitStruct=B(Hl);b.prototype.visitUnion=B(Yl);b.prototype.visitDenseUnion=B(ka);b.prototype.visitSparseUnion=B(Pa);b.prototype.visitDictionary=B(Gl);b.prototype.visitInterval=B(Jl);b.prototype.visitIntervalDayTime=B(ja);b.prototype.visitIntervalYearMonth=B(za);b.prototype.visitDuration=B(Zl);b.prototype.visitDurationSecond=B($a);b.prototype.visitDurationMillisecond=B(Wa);b.prototype.visitDurationMicrosecond=B(Ha);b.prototype.visitDurationNanosecond=B(Ya);b.prototype.visitFixedSizeList=B(Xl);b.prototype.visitMap=B(Wl);var rt=new b;var nr=Symbol.for("keys"),Pr=Symbol.for("vals"),kr=Symbol.for("kKeysAsStrings"),so=Symbol.for("_kKeysAsStrings"),pe=class{constructor(t){return this[nr]=new V([t.children[0]]).memoize(),this[Pr]=t.children[1],new Proxy(this,new ao)}get[kr](){return this[so]||(this[so]=Array.from(this[nr].toArray(),String))}[Symbol.iterator](){return new oo(this[nr],this[Pr])}get size(){return this[nr].length}toArray(){return Object.values(this.toJSON())}toJSON(){let t=this[nr],e=this[Pr],i={};for(let n=-1,s=t.length;++n`${qt(t)}: ${qt(e)}`).join(", ")}}`}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}},oo=class{constructor(t,e){this.keys=t,this.vals=e,this.keyIndex=0,this.numKeys=t.length}[Symbol.iterator](){return this}next(){let t=this.keyIndex;return t===this.numKeys?{done:!0,value:null}:(this.keyIndex++,{done:!1,value:[this.keys.get(t),rt.visit(this.vals,t)]})}},ao=class{isExtensible(){return!1}deleteProperty(){return!1}preventExtensions(){return!0}ownKeys(t){return t[kr]}has(t,e){return t[kr].includes(e)}getOwnPropertyDescriptor(t,e){if(t[kr].indexOf(e)!==-1)return{writable:!0,enumerable:!0,configurable:!0}}get(t,e){if(Reflect.has(t,e))return t[e];let i=t[kr].indexOf(e);if(i!==-1){let n=rt.visit(Reflect.get(t,Pr),i);return Reflect.set(t,e,n),n}}set(t,e,i){let n=t[kr].indexOf(e);return n!==-1?(dt.visit(Reflect.get(t,Pr),n,i),Reflect.set(t,e,i)):Reflect.has(t,e)?Reflect.set(t,e,i):!1}};Object.defineProperties(pe.prototype,{[Symbol.toStringTag]:{enumerable:!1,configurable:!1,value:"Row"},[nr]:{writable:!0,enumerable:!1,configurable:!1,value:null},[Pr]:{writable:!0,enumerable:!1,configurable:!1,value:null},[so]:{writable:!0,enumerable:!1,configurable:!1,value:null}});var Ga;function vi(r,t,e,i){let{length:n=0}=r,s=typeof t!="number"?0:t,o=typeof e!="number"?n:e;return s<0&&(s=(s%n+n)%n),o<0&&(o=(o%n+n)%n),on&&(o=n),i?i(r,s,o):[s,o]}var dr=(r,t)=>r<0?t+r:r,Ja=r=>r!==r;function sr(r){if(typeof r!=="object"||r===null)return Ja(r)?Ja:e=>e===r;if(r instanceof Date){let e=r.valueOf();return i=>i instanceof Date?i.valueOf()===e:!1}return ArrayBuffer.isView(r)?e=>e?ks(r,e):!1:r instanceof Map?ql(r):Array.isArray(r)?Kl(r):r instanceof V?Ql(r):tu(r,!0)}function Kl(r){let t=[];for(let e=-1,i=r.length;++e!1;let i=[];for(let n=-1,s=e.length;++n{if(!e||typeof e!="object")return!1;switch(e.constructor){case Array:return eu(r,e);case Map:return Za(r,e,e.keys());case pe:case rr:case Object:case void 0:return Za(r,e,t||Object.keys(e))}return e instanceof V?ru(r,e):!1}}function eu(r,t){let e=r.length;if(t.length!==e)return!1;for(let i=-1;++ihr,getBit:()=>Xa,getBool:()=>Yn,packBools:()=>pr,popcnt_array:()=>Ka,popcnt_bit_range:()=>wi,popcnt_uint32:()=>Hn,setBool:()=>iu,truncateBitmap:()=>fr});function Yn(r,t,e,i){return(e&1<>i}function iu(r,t,e){return e?!!(r[t>>3]|=1<>3]&=~(1<0||e.byteLength>3):pr(new hr(e,r,t,null,Yn)).subarray(0,i)),n}return e}function pr(r){let t=[],e=0,i=0,n=0;for(let o of r)o&&(n|=1<0)&&(t[e++]=n);let s=new Uint8Array(t.length+7&-8);return s.set(t),s}var hr=class{constructor(t,e,i,n,s){this.bytes=t,this.length=i,this.context=n,this.get=s,this.bit=e%8,this.byteIndex=e>>3,this.byte=t[this.byteIndex++],this.index=0}next(){return this.index>3<<3,n=t+(t%8===0?0:8-t%8);return wi(r,t,n)+wi(r,i,e)+Ka(r,n>>3,i-n>>3)}function Ka(r,t,e){let i=0,n=Math.trunc(t),s=new DataView(r.buffer,r.byteOffset,r.byteLength),o=e===void 0?r.byteLength:n+e;for(;o-n>=4;)i+=Hn(s.getUint32(n)),n+=4;for(;o-n>=2;)i+=Hn(s.getUint16(n)),n+=2;for(;o-n>=1;)i+=Hn(s.getUint8(n)),n+=1;return i}function Hn(r){let t=Math.trunc(r);return t=t-(t>>>1&1431655765),t=(t&858993459)+(t>>>2&858993459),(t+(t>>>4)&252645135)*16843009>>>24}var nu=-1,C=class r{get typeId(){return this.type.typeId}get ArrayType(){return this.type.ArrayType}get buffers(){return[this.valueOffsets,this.values,this.nullBitmap,this.typeIds]}get nullable(){if(this._nullCount!==0){let{type:t}=this;return p.isSparseUnion(t)?this.children.some(e=>e.nullable):p.isDenseUnion(t)?this.children.some(e=>e.nullable):this.nullBitmap&&this.nullBitmap.byteLength>0}return!0}get byteLength(){let t=0,{valueOffsets:e,values:i,nullBitmap:n,typeIds:s}=this;return e&&(t+=e.byteLength),i&&(t+=i.byteLength),n&&(t+=n.byteLength),s&&(t+=s.byteLength),this.children.reduce((o,a)=>o+a.byteLength,t)}get nullCount(){if(p.isUnion(this.type))return this.children.reduce((i,n)=>i+n.nullCount,0);let t=this._nullCount,e;return t<=nu&&(e=this.nullBitmap)&&(this._nullCount=t=e.length===0?0:this.length-wi(e,this.offset,this.offset+this.length)),t}constructor(t,e,i,n,s,o=[],a){this.type=t,this.children=o,this.dictionary=a,this.offset=Math.floor(Math.max(e||0,0)),this.length=Math.floor(Math.max(i||0,0)),this._nullCount=Math.floor(Math.max(n||0,-1));let c;s instanceof r?(this.stride=s.stride,this.values=s.values,this.typeIds=s.typeIds,this.nullBitmap=s.nullBitmap,this.valueOffsets=s.valueOffsets):(this.stride=Nt(t),s&&((c=s[0])&&(this.valueOffsets=c),(c=s[1])&&(this.values=c),(c=s[2])&&(this.nullBitmap=c),(c=s[3])&&(this.typeIds=c)))}getValid(t){let{type:e}=this;if(p.isUnion(e)){let i=e,n=this.children[i.typeIdToChildIndex[this.typeIds[t]]],s=i.mode===Y.Dense?this.valueOffsets[t]:t;return n.getValid(s)}if(this.nullable&&this.nullCount>0){let i=this.offset+t;return(this.nullBitmap[i>>3]&1<>3;(!s||s.byteLength<=d)&&(s=new Uint8Array((o+a+63&-64)>>3).fill(255),this.nullCount>0?(s.set(fr(o,a,this.nullBitmap),0),Object.assign(this,{nullBitmap:s})):Object.assign(this,{nullBitmap:s,_nullCount:0}));let h=s[d];i=(h&l)!==0,s[d]=e?h|l:h&~l}return i!==!!e&&(this._nullCount=this.nullCount+(e?-1:1)),e}clone(t=this.type,e=this.offset,i=this.length,n=this._nullCount,s=this,o=this.children){return new r(t,e,i,n,s,o,this.dictionary)}slice(t,e){let{stride:i,typeId:n,children:s}=this,o=+(this._nullCount===0)-1,a=n===16?i:1,c=this._sliceBuffers(t,e,i,n);return this.clone(this.type,this.offset+t,e,o,c,s.length===0||this.valueOffsets?s:this._sliceChildren(s,a*t,a*e))}_changeLengthAndBackfillNullBitmap(t){if(this.typeId===u.Null)return this.clone(this.type,0,t,0);let{length:e,nullCount:i}=this,n=new Uint8Array((t+63&-64)>>3).fill(255,0,e>>3);n[e>>3]=(1<0&&n.set(fr(this.offset,e,this.nullBitmap),0);let s=this.buffers;return s[Kt.VALIDITY]=n,this.clone(this.type,0,t,i+(t-e),s)}_sliceBuffers(t,e,i,n){let s,{buffers:o}=this;return(s=o[Kt.TYPE])&&(o[Kt.TYPE]=s.subarray(t,t+e)),(s=o[Kt.OFFSET])&&(o[Kt.OFFSET]=s.subarray(t,t+e+1))||(s=o[Kt.DATA])&&(o[Kt.DATA]=n===6?s:s.subarray(i*t,i*(t+e))),o}_sliceChildren(t,e,i){return t.map(n=>n.slice(e,i))}};C.prototype.children=Object.freeze([]);var uo=class r extends g{visit(t){return this.getVisitFn(t.type).call(this,t)}visitNull(t){let{["type"]:e,["offset"]:i=0,["length"]:n=0}=t;return new C(e,i,n,n)}visitBool(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.nullBitmap),s=N(e.ArrayType,t.data),{["length"]:o=s.length>>3,["nullCount"]:a=t.nullBitmap?-1:0}=t;return new C(e,i,o,a,[void 0,s,n])}visitInt(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.nullBitmap),s=N(e.ArrayType,t.data),{["length"]:o=s.length,["nullCount"]:a=t.nullBitmap?-1:0}=t;return new C(e,i,o,a,[void 0,s,n])}visitFloat(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.nullBitmap),s=N(e.ArrayType,t.data),{["length"]:o=s.length,["nullCount"]:a=t.nullBitmap?-1:0}=t;return new C(e,i,o,a,[void 0,s,n])}visitUtf8(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.data),s=S(t.nullBitmap),o=lr(t.valueOffsets),{["length"]:a=o.length-1,["nullCount"]:c=t.nullBitmap?-1:0}=t;return new C(e,i,a,c,[o,n,s])}visitLargeUtf8(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.data),s=S(t.nullBitmap),o=un(t.valueOffsets),{["length"]:a=o.length-1,["nullCount"]:c=t.nullBitmap?-1:0}=t;return new C(e,i,a,c,[o,n,s])}visitBinary(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.data),s=S(t.nullBitmap),o=lr(t.valueOffsets),{["length"]:a=o.length-1,["nullCount"]:c=t.nullBitmap?-1:0}=t;return new C(e,i,a,c,[o,n,s])}visitLargeBinary(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.data),s=S(t.nullBitmap),o=un(t.valueOffsets),{["length"]:a=o.length-1,["nullCount"]:c=t.nullBitmap?-1:0}=t;return new C(e,i,a,c,[o,n,s])}visitFixedSizeBinary(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.nullBitmap),s=N(e.ArrayType,t.data),{["length"]:o=s.length/Nt(e),["nullCount"]:a=t.nullBitmap?-1:0}=t;return new C(e,i,o,a,[void 0,s,n])}visitDate(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.nullBitmap),s=N(e.ArrayType,t.data),{["length"]:o=s.length/Nt(e),["nullCount"]:a=t.nullBitmap?-1:0}=t;return new C(e,i,o,a,[void 0,s,n])}visitTimestamp(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.nullBitmap),s=N(e.ArrayType,t.data),{["length"]:o=s.length/Nt(e),["nullCount"]:a=t.nullBitmap?-1:0}=t;return new C(e,i,o,a,[void 0,s,n])}visitTime(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.nullBitmap),s=N(e.ArrayType,t.data),{["length"]:o=s.length/Nt(e),["nullCount"]:a=t.nullBitmap?-1:0}=t;return new C(e,i,o,a,[void 0,s,n])}visitDecimal(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.nullBitmap),s=N(e.ArrayType,t.data),{["length"]:o=s.length/Nt(e),["nullCount"]:a=t.nullBitmap?-1:0}=t;return new C(e,i,o,a,[void 0,s,n])}visitList(t){let{["type"]:e,["offset"]:i=0,["child"]:n}=t,s=S(t.nullBitmap),o=lr(t.valueOffsets),{["length"]:a=o.length-1,["nullCount"]:c=t.nullBitmap?-1:0}=t;return new C(e,i,a,c,[o,void 0,s],[n])}visitStruct(t){let{["type"]:e,["offset"]:i=0,["children"]:n=[]}=t,s=S(t.nullBitmap),{length:o=n.reduce((c,{length:l})=>Math.max(c,l),0),nullCount:a=t.nullBitmap?-1:0}=t;return new C(e,i,o,a,[void 0,void 0,s],n)}visitUnion(t){let{["type"]:e,["offset"]:i=0,["children"]:n=[]}=t,s=N(e.ArrayType,t.typeIds),{["length"]:o=s.length,["nullCount"]:a=-1}=t;if(p.isSparseUnion(e))return new C(e,i,o,a,[void 0,void 0,void 0,s],n);let c=lr(t.valueOffsets);return new C(e,i,o,a,[c,void 0,void 0,s],n)}visitDictionary(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.nullBitmap),s=N(e.indices.ArrayType,t.data),{["dictionary"]:o=new V([new r().visit({type:e.dictionary})])}=t,{["length"]:a=s.length,["nullCount"]:c=t.nullBitmap?-1:0}=t;return new C(e,i,a,c,[void 0,s,n],[],o)}visitInterval(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.nullBitmap),s=N(e.ArrayType,t.data),{["length"]:o=s.length/Nt(e),["nullCount"]:a=t.nullBitmap?-1:0}=t;return new C(e,i,o,a,[void 0,s,n])}visitDuration(t){let{["type"]:e,["offset"]:i=0}=t,n=S(t.nullBitmap),s=N(e.ArrayType,t.data),{["length"]:o=s.length,["nullCount"]:a=t.nullBitmap?-1:0}=t;return new C(e,i,o,a,[void 0,s,n])}visitFixedSizeList(t){let{["type"]:e,["offset"]:i=0,["child"]:n=new r().visit({type:e.valueType})}=t,s=S(t.nullBitmap),{["length"]:o=n.length/Nt(e),["nullCount"]:a=t.nullBitmap?-1:0}=t;return new C(e,i,o,a,[void 0,void 0,s],[n])}visitMap(t){let{["type"]:e,["offset"]:i=0,["child"]:n=new r().visit({type:e.childType})}=t,s=S(t.nullBitmap),o=lr(t.valueOffsets),{["length"]:a=o.length-1,["nullCount"]:c=t.nullBitmap?-1:0}=t;return new C(e,i,a,c,[o,void 0,s],[n])}},su=new uo;function A(r){return su.visit(r)}var Ii=class{constructor(t=0,e){this.numChunks=t,this.getChunkIterator=e,this.chunkIndex=0,this.chunkIterator=this.getChunkIterator(0)}next(){for(;this.chunkIndext.nullable)}function Gn(r){return r.reduce((t,e)=>t+e.nullCount,0)}function Jn(r){return r.reduce((t,e,i)=>(t[i+1]=t[i]+e.length,t),new Uint32Array(r.length+1))}function Zn(r,t,e,i){let n=[];for(let s=-1,o=r.length;++s=i)break;if(e>=c+l)continue;if(c>=e&&c+l<=i){n.push(a);continue}let d=Math.max(0,e-c),h=Math.min(i-c,l);n.push(a.slice(d,h-d))}return n.length===0&&n.push(r[0].slice(0,0)),n}function ho(r,t,e,i){let n=0,s=0,o=t.length-1;do{if(n>=o-1)return e0?0:-1}function au(r,t){let{nullBitmap:e}=r;if(!e||r.nullCount<=0)return-1;let i=0;for(let n of new hr(e,r.offset+(t||0),r.length,e,Yn)){if(!n)return i;++i}return-1}function O(r,t,e){if(t===void 0)return-1;if(t===null)switch(r.typeId){case u.Union:break;case u.Dictionary:break;default:return au(r,e)}let i=rt.getVisitFn(r),n=sr(t);for(let s=(e||0)-1,o=r.length;++s{let n=r.data[i];return n.values.subarray(0,n.length)[Symbol.iterator]()});let e=0;return new Ii(r.data.length,i=>{let s=r.data[i].length,o=r.slice(e,e+s);return e+=s,new fo(o)})}var fo=class{constructor(t){this.vector=t,this.index=0}next(){return this.indexa.data):t;if(s.length===0||s.some(a=>!(a instanceof C)))throw new TypeError("Vector constructor expects an Array of Data instances.");let o=(e=s[0])===null||e===void 0?void 0:e.type;switch(s.length){case 0:this._offsets=[0];break;case 1:{let{get:a,set:c,indexOf:l}=ec[o.typeId],d=s[0];this.isValid=h=>Si(d,h),this.get=h=>a(d,h),this.set=(h,F)=>c(d,h,F),this.indexOf=h=>l(d,h),this._offsets=[0,d.length];break}default:Object.setPrototypeOf(this,rc[o.typeId]),this._offsets=Jn(s);break}this.data=s,this.type=o,this.stride=Nt(o),this.numChildren=(n=(i=o.children)===null||i===void 0?void 0:i.length)!==null&&n!==void 0?n:0,this.length=this._offsets.at(-1)}get byteLength(){return this.data.reduce((t,e)=>t+e.byteLength,0)}get nullable(){return qa(this.data)}get nullCount(){return Gn(this.data)}get ArrayType(){return this.type.ArrayType}get[Symbol.toStringTag](){return`${this.VectorName}<${this.type[Symbol.toStringTag]}>`}get VectorName(){return`${u[this.type.typeId]}Vector`}isValid(t){return!1}get(t){return null}at(t){return this.get(dr(t,this.length))}set(t,e){}indexOf(t,e){return-1}includes(t,e){return this.indexOf(t,e)>-1}[Symbol.iterator](){return zr.visit(this)}concat(...t){return new r(this.data.concat(t.flatMap(e=>e.data).flat(Number.POSITIVE_INFINITY)))}slice(t,e){return new r(vi(this,t,e,({data:i,_offsets:n},s,o)=>Zn(i,n,s,o)))}toJSON(){return[...this]}toArray(){let{type:t,data:e,length:i,stride:n,ArrayType:s}=this;switch(t.typeId){case u.Int:case u.Float:case u.Decimal:case u.Time:case u.Timestamp:switch(e.length){case 0:return new s;case 1:return e[0].values.subarray(0,i*n);default:return e.reduce((o,{values:a,length:c})=>(o.array.set(a.subarray(0,c*n),o.offset),o.offset+=c*n,o),{array:new s(i*n),offset:0}).array}}return[...this]}toString(){return`[${[...this].join(",")}]`}getChild(t){var e;return this.getChildAt((e=this.type.children)===null||e===void 0?void 0:e.findIndex(i=>i.name===t))}getChildAt(t){return t>-1&&te[t])):null}get isMemoized(){return p.isDictionary(this.type)?this.data[0].dictionary.isMemoized:!1}memoize(){if(p.isDictionary(this.type)){let t=new qn(this.data[0].dictionary),e=this.data.map(i=>{let n=i.clone();return n.dictionary=t,n});return new r(e)}return new qn(this)}unmemoize(){if(p.isDictionary(this.type)&&this.isMemoized){let t=this.data[0].dictionary.unmemoize(),e=this.data.map(i=>{let n=i.clone();return n.dictionary=t,n});return new r(e)}return this}};tc=Symbol.toStringTag;V[tc]=(r=>{r.type=p.prototype,r.data=[],r.length=0,r.stride=1,r.numChildren=0,r._offsets=new Uint32Array([0]),r[Symbol.isConcatSpreadable]=!0;let t=Object.keys(u).map(e=>u[e]).filter(e=>typeof e=="number"&&e!==u.NONE);for(let e of t){let i=rt.getVisitFnByTypeId(e),n=dt.getVisitFnByTypeId(e),s=mr.getVisitFnByTypeId(e);ec[e]={get:i,set:n,indexOf:s},rc[e]=Object.create(r,{isValid:{value:jr(Si)},get:{value:jr(rt.getVisitFnByTypeId(e))},set:{value:Xn(dt.getVisitFnByTypeId(e))},indexOf:{value:Kn(mr.getVisitFnByTypeId(e))}})}return"Vector"})(V.prototype);var qn=class r extends V{constructor(t){super(t.data);let e=this.get,i=this.set,n=this.slice,s=new Array(this.length);Object.defineProperty(this,"get",{value(o){let a=s[o];if(a!==void 0)return a;let c=e.call(this,o);return s[o]=c,c}}),Object.defineProperty(this,"set",{value(o,a){i.call(this,o,a),s[o]=a}}),Object.defineProperty(this,"slice",{value:(o,a)=>new r(n.call(this,o,a))}),Object.defineProperty(this,"isMemoized",{value:!0}),Object.defineProperty(this,"unmemoize",{value:()=>new V(this.data)}),Object.defineProperty(this,"memoize",{value:()=>this})}};function ic(r){if(!r||r.length<=0)return function(n){return!0};let t="",e=r.filter(i=>i===i);return e.length>0&&(t=` + switch (x) {${e.map(i=>` + case ${cu(i)}:`).join("")} + return false; + }`),r.length!==e.length&&(t=`if (x !== x) return false; +${t}`),new Function("x",`${t} +return true;`)}function cu(r){return typeof r!="bigint"?qt(r):`${qt(r)}n`}function po(r,t){let e=Math.ceil(r)*t-1;return(e-e%64+64||64)/t}function nc(r,t=0){return r.length>=t?r.subarray(0,t):ni(new r.constructor(t),r,0)}var se=class{constructor(t,e=0,i=1){this.length=Math.ceil(e/i),this.buffer=new t(this.length),this.stride=i,this.BYTES_PER_ELEMENT=t.BYTES_PER_ELEMENT,this.ArrayType=t}get byteLength(){return Math.ceil(this.length*this.stride)*this.BYTES_PER_ELEMENT}get reservedLength(){return this.buffer.length/this.stride}get reservedByteLength(){return this.buffer.byteLength}set(t,e){return this}append(t){return this.set(this.length,t)}reserve(t){if(t>0){this.length+=t;let e=this.stride,i=this.length*e,n=this.buffer.length;i>=n&&this._resize(n===0?po(i*1,this.BYTES_PER_ELEMENT):po(i*2,this.BYTES_PER_ELEMENT))}return this}flush(t=this.length){t=po(t*this.stride,this.BYTES_PER_ELEMENT);let e=nc(this.buffer,t);return this.clear(),e}clear(){return this.length=0,this.buffer=new this.ArrayType,this}_resize(t){return this.buffer=nc(this.buffer,t)}},Ee=class extends se{last(){return this.get(this.length-1)}get(t){return this.buffer[t]}set(t,e){return this.reserve(t-this.length+1),this.buffer[t*this.stride]=e,this}},$r=class extends Ee{constructor(){super(Uint8Array,0,1/8),this.numValid=0}get numInvalid(){return this.length-this.numValid}get(t){return this.buffer[t>>3]>>t%8&1}set(t,e){let{buffer:i}=this.reserve(t-this.length+1),n=t>>3,s=t%8,o=i[n]>>s&1;return e?o===0&&(i[n]|=1<=0&&n.fill(n[i],i,t),n[t]=n[t-1]+e,this}flush(t=this.length-1){return t>this.length&&this.set(t-1,this.BYTES_PER_ELEMENT>4?BigInt(0):0),super.flush(t+1)}};var X=class{static throughNode(t){throw new Error('"throughNode" not available in this environment')}static throughDOM(t){throw new Error('"throughDOM" not available in this environment')}constructor({type:t,nullValues:e}){this.length=0,this.finished=!1,this.type=t,this.children=[],this.nullValues=e,this.stride=Nt(t),this._nulls=new $r,e&&e.length>0&&(this._isValid=ic(e))}toVector(){return new V([this.flush()])}get ArrayType(){return this.type.ArrayType}get nullCount(){return this._nulls.numInvalid}get numChildren(){return this.children.length}get byteLength(){let t=0,{_offsets:e,_values:i,_nulls:n,_typeIds:s,children:o}=this;return e&&(t+=e.byteLength),i&&(t+=i.byteLength),n&&(t+=n.byteLength),s&&(t+=s.byteLength),o.reduce((a,c)=>a+c.byteLength,t)}get reservedLength(){return this._nulls.reservedLength}get reservedByteLength(){let t=0;return this._offsets&&(t+=this._offsets.reservedByteLength),this._values&&(t+=this._values.reservedByteLength),this._nulls&&(t+=this._nulls.reservedByteLength),this._typeIds&&(t+=this._typeIds.reservedByteLength),this.children.reduce((e,i)=>e+i.reservedByteLength,t)}get valueOffsets(){return this._offsets?this._offsets.buffer:null}get values(){return this._values?this._values.buffer:null}get nullBitmap(){return this._nulls?this._nulls.buffer:null}get typeIds(){return this._typeIds?this._typeIds.buffer:null}append(t){return this.set(this.length,t)}isValid(t){return this._isValid(t)}set(t,e){return this.setValid(t,this.isValid(e))&&this.setValue(t,e),this}setValue(t,e){this._setValue(this,t,e)}setValid(t,e){return this.length=this._nulls.set(t,+e).length,e}addChild(t,e=`${this.numChildren}`){throw new Error(`Cannot append children to non-nested type "${this.type}"`)}getChildAt(t){return this.children[t]||null}flush(){let t,e,i,n,{type:s,length:o,nullCount:a,_typeIds:c,_offsets:l,_values:d,_nulls:h}=this;(e=c?.flush(o))?n=l?.flush(o):(n=l?.flush(o))?t=d?.flush(l.last()):t=d?.flush(o),a>0&&(i=h?.flush(o));let F=this.children.map(L=>L.flush());return this.clear(),A({type:s,length:o,nullCount:a,children:F,child:F[0],data:t,typeIds:e,nullBitmap:i,valueOffsets:n})}finish(){this.finished=!0;for(let t of this.children)t.finish();return this}clear(){var t,e,i,n;this.length=0,(t=this._nulls)===null||t===void 0||t.clear(),(e=this._values)===null||e===void 0||e.clear(),(i=this._offsets)===null||i===void 0||i.clear(),(n=this._typeIds)===null||n===void 0||n.clear();for(let s of this.children)s.clear();return this}};X.prototype.length=1;X.prototype.stride=1;X.prototype.children=null;X.prototype.finished=!1;X.prototype.nullValues=null;X.prototype._isValid=()=>!0;var it=class extends X{constructor(t){super(t),this._values=new Ee(this.ArrayType,0,this.stride)}setValue(t,e){let i=this._values;return i.reserve(t-i.length+1),super.setValue(t,e)}},It=class extends X{constructor(t){super(t),this._pendingLength=0,this._offsets=new Wr(t.type)}setValue(t,e){let i=this._pending||(this._pending=new Map),n=i.get(t);n&&(this._pendingLength-=n.length),this._pendingLength+=e instanceof pe?e[nr].length:e.length,i.set(t,e)}setValid(t,e){return super.setValid(t,e)?!0:((this._pending||(this._pending=new Map)).set(t,void 0),!1)}clear(){return this._pendingLength=0,this._pending=void 0,super.clear()}flush(){return this._flush(),super.flush()}finish(){return this._flush(),super.finish()}_flush(){let t=this._pending,e=this._pendingLength;return this._pendingLength=0,this._pending=void 0,t&&t.size>0&&this._flushPending(t,e),this}};var yr=class{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}offset(){return this.bb.readInt64(this.bb_pos)}metaDataLength(){return this.bb.readInt32(this.bb_pos+8)}bodyLength(){return this.bb.readInt64(this.bb_pos+16)}static sizeOf(){return 24}static createBlock(t,e,i,n){return t.prep(8,24),t.writeInt64(BigInt(n??0)),t.pad(4),t.writeInt32(i),t.writeInt64(BigInt(e??0)),t.offset()}};var Ut=class r{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsFooter(t,e){return(e||new r).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsFooter(t,e){return t.setPosition(t.position()+4),(e||new r).__init(t.readInt32(t.position())+t.position(),t)}version(){let t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):j.V1}schema(t){let e=this.bb.__offset(this.bb_pos,6);return e?(t||new wt).__init(this.bb.__indirect(this.bb_pos+e),this.bb):null}dictionaries(t,e){let i=this.bb.__offset(this.bb_pos,8);return i?(e||new yr).__init(this.bb.__vector(this.bb_pos+i)+t*24,this.bb):null}dictionariesLength(){let t=this.bb.__offset(this.bb_pos,8);return t?this.bb.__vector_len(this.bb_pos+t):0}recordBatches(t,e){let i=this.bb.__offset(this.bb_pos,10);return i?(e||new yr).__init(this.bb.__vector(this.bb_pos+i)+t*24,this.bb):null}recordBatchesLength(){let t=this.bb.__offset(this.bb_pos,10);return t?this.bb.__vector_len(this.bb_pos+t):0}customMetadata(t,e){let i=this.bb.__offset(this.bb_pos,12);return i?(e||new ot).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+i)+t*4),this.bb):null}customMetadataLength(){let t=this.bb.__offset(this.bb_pos,12);return t?this.bb.__vector_len(this.bb_pos+t):0}static startFooter(t){t.startObject(5)}static addVersion(t,e){t.addFieldInt16(0,e,j.V1)}static addSchema(t,e){t.addFieldOffset(1,e,0)}static addDictionaries(t,e){t.addFieldOffset(2,e,0)}static startDictionariesVector(t,e){t.startVector(24,e,8)}static addRecordBatches(t,e){t.addFieldOffset(3,e,0)}static startRecordBatchesVector(t,e){t.startVector(24,e,8)}static addCustomMetadata(t,e){t.addFieldOffset(4,e,0)}static createCustomMetadataVector(t,e){t.startVector(4,e.length,4);for(let i=e.length-1;i>=0;i--)t.addOffset(e[i]);return t.endVector()}static startCustomMetadataVector(t,e){t.startVector(4,e,4)}static endFooter(t){return t.endObject()}static finishFooterBuffer(t,e){t.finish(e)}static finishSizePrefixedFooterBuffer(t,e){t.finish(e,void 0,!0)}};var P=class r{constructor(t=[],e,i,n=j.V5){this.fields=t||[],this.metadata=e||new Map,i||(i=mo(this.fields)),this.dictionaries=i,this.metadataVersion=n}get[Symbol.toStringTag](){return"Schema"}get names(){return this.fields.map(t=>t.name)}toString(){return`Schema<{ ${this.fields.map((t,e)=>`${e}: ${t}`).join(", ")} }>`}select(t){let e=new Set(t),i=this.fields.filter(n=>e.has(n.name));return new r(i,this.metadata)}selectAt(t){let e=t.map(i=>this.fields[i]).filter(Boolean);return new r(e,this.metadata)}assign(...t){let e=t[0]instanceof r?t[0]:Array.isArray(t[0])?new r(t[0]):new r(t),i=[...this.fields],n=Qn(Qn(new Map,this.metadata),e.metadata),s=e.fields.filter(a=>{let c=i.findIndex(l=>l.name===a.name);return~c?(i[c]=a.clone({metadata:Qn(Qn(new Map,i[c].metadata),a.metadata)}))&&!1:!0}),o=mo(s,new Map);return new r([...i,...s],n,new Map([...this.dictionaries,...o]))}};P.prototype.fields=null;P.prototype.metadata=null;P.prototype.dictionaries=null;var U=class r{static new(...t){let[e,i,n,s]=t;return t[0]&&typeof t[0]=="object"&&({name:e}=t[0],i===void 0&&(i=t[0].type),n===void 0&&(n=t[0].nullable),s===void 0&&(s=t[0].metadata)),new r(`${e}`,i,n,s)}constructor(t,e,i=!1,n){this.name=t,this.type=e,this.nullable=i,this.metadata=n||new Map}get typeId(){return this.type.typeId}get[Symbol.toStringTag](){return"Field"}toString(){return`${this.name}: ${this.type}`}clone(...t){let[e,i,n,s]=t;return!t[0]||typeof t[0]!="object"?[e=this.name,i=this.type,n=this.nullable,s=this.metadata]=t:{name:e=this.name,type:i=this.type,nullable:n=this.nullable,metadata:s=this.metadata}=t[0],r.new(e,i,n,s)}};U.prototype.type=null;U.prototype.name=null;U.prototype.nullable=null;U.prototype.metadata=null;function Qn(r,t){return new Map([...r||new Map,...t||new Map])}function mo(r,t=new Map){for(let e=-1,i=r.length;++e0&&mo(s.children,t)}return t}var lu=ur,uu=Tt,Ve=class{static decode(t){t=new uu(S(t));let e=Ut.getRootAsFooter(t),i=P.decode(e.schema(),new Map,e.version());return new yo(i,e)}static encode(t){let e=new lu,i=P.encode(e,t.schema);Ut.startRecordBatchesVector(e,t.numRecordBatches);for(let o of[...t.recordBatches()].slice().reverse())Re.encode(e,o);let n=e.endVector();Ut.startDictionariesVector(e,t.numDictionaries);for(let o of[...t.dictionaryBatches()].slice().reverse())Re.encode(e,o);let s=e.endVector();return Ut.startFooter(e),Ut.addSchema(e,i),Ut.addVersion(e,j.V5),Ut.addRecordBatches(e,n),Ut.addDictionaries(e,s),Ut.finishFooterBuffer(e,Ut.endFooter(e)),e.asUint8Array()}get numRecordBatches(){return this._recordBatches.length}get numDictionaries(){return this._dictionaryBatches.length}constructor(t,e=j.V5,i,n){this.schema=t,this.version=e,i&&(this._recordBatches=i),n&&(this._dictionaryBatches=n)}*recordBatches(){for(let t,e=-1,i=this.numRecordBatches;++e=0&&t=0&&t=0&&t=0&&tthis._closedPromiseResolve=t)}get closed(){return this._closedPromise}cancel(t){return f(this,void 0,void 0,function*(){yield this.return(t)})}write(t){this._ensureOpen()&&(this.resolvers.length<=0?this._values.push(t):this.resolvers.shift().resolve({done:!1,value:t}))}abort(t){this._closedPromiseResolve&&(this.resolvers.length<=0?this._error={error:t}:this.resolvers.shift().reject({done:!0,value:t}))}close(){if(this._closedPromiseResolve){let{resolvers:t}=this;for(;t.length>0;)t.shift().resolve(J);this._closedPromiseResolve(),this._closedPromiseResolve=void 0}}[Symbol.asyncIterator](){return this}toDOMStream(t){return ut.toDOMStream(this._closedPromiseResolve||this._error?this:this._values,t)}toNodeStream(t){return ut.toNodeStream(this._closedPromiseResolve||this._error?this:this._values,t)}throw(t){return f(this,void 0,void 0,function*(){return yield this.abort(t),J})}return(t){return f(this,void 0,void 0,function*(){return yield this.close(),J})}read(t){return f(this,void 0,void 0,function*(){return(yield this.next(t,"read")).value})}peek(t){return f(this,void 0,void 0,function*(){return(yield this.next(t,"peek")).value})}next(...t){return this._values.length>0?Promise.resolve({done:!1,value:this._values.shift()}):this._error?Promise.reject({done:!0,value:this._error.error}):this._closedPromiseResolve?new Promise((e,i)=>{this.resolvers.push({resolve:e,reject:i})}):Promise.resolve(J)}_ensureOpen(){if(this._closedPromiseResolve)return!0;throw new Error("AsyncQueue is closed")}};var me=class extends ts{write(t){if((t=S(t)).byteLength>0)return super.write(t)}toString(t=!1){return t?ri(this.toUint8Array(!0)):this.toUint8Array(!1).then(ri)}toUint8Array(t=!1){return t?Ft(this._values)[0]:f(this,void 0,void 0,function*(){var e,i,n,s;let o=[],a=0;try{for(var c=!0,l=Ht(this),d;d=yield l.next(),e=d.done,!e;c=!0){s=d.value,c=!1;let h=s;o.push(h),a+=h.byteLength}}catch(h){i={error:h}}finally{try{!c&&!e&&(n=l.return)&&(yield n.call(l))}finally{if(i)throw i.error}}return Ft(o,a)[0]})}},ye=class{constructor(t){t&&(this.source=new go(ut.fromIterable(t)))}[Symbol.iterator](){return this}next(t){return this.source.next(t)}throw(t){return this.source.throw(t)}return(t){return this.source.return(t)}peek(t){return this.source.peek(t)}read(t){return this.source.read(t)}},jt=class r{constructor(t){t instanceof r?this.source=t.source:t instanceof me?this.source=new Ce(ut.fromAsyncIterable(t)):ln(t)?this.source=new Ce(ut.fromNodeStream(t)):ii(t)?this.source=new Ce(ut.fromDOMStream(t)):an(t)?this.source=new Ce(ut.fromDOMStream(t.body)):Yt(t)?this.source=new Ce(ut.fromIterable(t)):Ot(t)?this.source=new Ce(ut.fromAsyncIterable(t)):Ct(t)&&(this.source=new Ce(ut.fromAsyncIterable(t)))}[Symbol.asyncIterator](){return this}next(t){return this.source.next(t)}throw(t){return this.source.throw(t)}return(t){return this.source.return(t)}get closed(){return this.source.closed}cancel(t){return this.source.cancel(t)}peek(t){return this.source.peek(t)}read(t){return this.source.read(t)}},go=class{constructor(t){this.source=t}cancel(t){this.return(t)}peek(t){return this.next(t,"peek").value}read(t){return this.next(t,"read").value}next(t,e="read"){return this.source.next({cmd:e,size:t})}throw(t){return Object.create(this.source.throw&&this.source.throw(t)||J)}return(t){return Object.create(this.source.return&&this.source.return(t)||J)}},Ce=class{constructor(t){this.source=t,this._closedPromise=new Promise(e=>this._closedPromiseResolve=e)}cancel(t){return f(this,void 0,void 0,function*(){yield this.return(t)})}get closed(){return this._closedPromise}read(t){return f(this,void 0,void 0,function*(){return(yield this.next(t,"read")).value})}peek(t){return f(this,void 0,void 0,function*(){return(yield this.next(t,"peek")).value})}next(t){return f(this,arguments,void 0,function*(e,i="read"){return yield this.source.next({cmd:i,size:e})})}throw(t){return f(this,void 0,void 0,function*(){let e=this.source.throw&&(yield this.source.throw(t))||J;return this._closedPromiseResolve&&this._closedPromiseResolve(),this._closedPromiseResolve=void 0,Object.create(e)})}return(t){return f(this,void 0,void 0,function*(){let e=this.source.return&&(yield this.source.return(t))||J;return this._closedPromiseResolve&&this._closedPromiseResolve(),this._closedPromiseResolve=void 0,Object.create(e)})}};var xi=class extends ye{constructor(t,e){super(),this.position=0,this.buffer=S(t),this.size=e===void 0?this.buffer.byteLength:e}readInt32(t){let{buffer:e,byteOffset:i}=this.readAt(t,4);return new DataView(e,i).getInt32(0,!0)}seek(t){return this.position=Math.min(t,this.size),tDi,Int128:()=>Ai,Int64:()=>ke,Uint64:()=>Q});function Hr(r){return r<0&&(r=4294967295+r+1),`0x${r.toString(16)}`}var Yr=8,bo=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8],Di=class{constructor(t){this.buffer=t}high(){return this.buffer[1]}low(){return this.buffer[0]}_times(t){let e=new Uint32Array([this.buffer[1]>>>16,this.buffer[1]&65535,this.buffer[0]>>>16,this.buffer[0]&65535]),i=new Uint32Array([t.buffer[1]>>>16,t.buffer[1]&65535,t.buffer[0]>>>16,t.buffer[0]&65535]),n=e[3]*i[3];this.buffer[0]=n&65535;let s=n>>>16;return n=e[2]*i[3],s+=n,n=e[3]*i[2]>>>0,s+=n,this.buffer[0]+=s<<16,this.buffer[1]=s>>>0>>16,this.buffer[1]+=e[1]*i[3]+e[2]*i[2]+e[3]*i[1],this.buffer[1]+=e[0]*i[3]+e[1]*i[2]+e[2]*i[1]+e[3]*i[0]<<16,this}_plus(t){let e=this.buffer[0]+t.buffer[0]>>>0;this.buffer[1]+=t.buffer[1],e>>0&&++this.buffer[1],this.buffer[0]=e}lessThan(t){return this.buffer[1]>>0,e[2]=this.buffer[2]+t.buffer[2]>>>0,e[1]=this.buffer[1]+t.buffer[1]>>>0,e[0]=this.buffer[0]+t.buffer[0]>>>0,e[0]>>0&&++e[1],e[1]>>0&&++e[2],e[2]>>0&&++e[3],this.buffer[3]=e[3],this.buffer[2]=e[2],this.buffer[1]=e[1],this.buffer[0]=e[0],this}hex(){return`${Hr(this.buffer[3])} ${Hr(this.buffer[2])} ${Hr(this.buffer[1])} ${Hr(this.buffer[0])}`}static multiply(t,e){return new r(new Uint32Array(t.buffer)).times(e)}static add(t,e){return new r(new Uint32Array(t.buffer)).plus(e)}static from(t,e=new Uint32Array(4)){return r.fromString(typeof t=="string"?t:t.toString(),e)}static fromNumber(t,e=new Uint32Array(4)){return r.fromString(t.toString(),e)}static fromString(t,e=new Uint32Array(4)){let i=t.startsWith("-"),n=t.length,s=new r(e);for(let o=i?1:0;o0&&this.readData(t,i)||new Uint8Array(0)}readOffsets(t,e){return this.readData(t,e)}readTypeIds(t,e){return this.readData(t,e)}readData(t,{length:e,offset:i}=this.nextBufferRange()){return this.bytes.subarray(i,i+e)}readDictionary(t){return this.dictionaries.get(t.id)}},es=class extends Oi{constructor(t,e,i,n,s){super(new Uint8Array(0),e,i,n,s),this.sources=t}readNullBitmap(t,e,{offset:i}=this.nextBufferRange()){return e<=0?new Uint8Array(0):pr(this.sources[i])}readOffsets(t,{offset:e}=this.nextBufferRange()){return N(Uint8Array,N(t.OffsetArrayType,this.sources[e]))}readTypeIds(t,{offset:e}=this.nextBufferRange()){return N(Uint8Array,N(t.ArrayType,this.sources[e]))}readData(t,{offset:e}=this.nextBufferRange()){let{sources:i}=this;return p.isTimestamp(t)?N(Uint8Array,ke.convertArray(i[e])):(p.isInt(t)||p.isTime(t))&&t.bitWidth===64||p.isDuration(t)?N(Uint8Array,ke.convertArray(i[e])):p.isDate(t)&&t.unit===et.MILLISECOND?N(Uint8Array,ke.convertArray(i[e])):p.isDecimal(t)?N(Uint8Array,Ai.convertArray(i[e])):p.isBinary(t)||p.isLargeBinary(t)||p.isFixedSizeBinary(t)?du(i[e]):p.isBool(t)?pr(i[e]):p.isUtf8(t)||p.isLargeUtf8(t)?ce(i[e].join("")):N(Uint8Array,N(t.ArrayType,i[e].map(n=>+n)))}};function du(r){let t=r.join(""),e=new Uint8Array(t.length/2);for(let i=0;i>1]=Number.parseInt(t.slice(i,i+2),16);return e}var Gr=class extends It{constructor(t){super(t),this._values=new se(Uint8Array)}get byteLength(){let t=this._pendingLength+this.length*4;return this._offsets&&(t+=this._offsets.byteLength),this._values&&(t+=this._values.byteLength),this._nulls&&(t+=this._nulls.byteLength),t}setValue(t,e){return super.setValue(t,S(e))}_flushPending(t,e){let i=this._offsets,n=this._values.reserve(e).buffer,s=0;for(let[o,a]of t)if(a===void 0)i.set(o,0);else{let c=a.length;n.set(a,s),i.set(o,c),s+=c}}};var Jr=class extends It{constructor(t){super(t),this._values=new se(Uint8Array)}get byteLength(){let t=this._pendingLength+this.length*4;return this._offsets&&(t+=this._offsets.byteLength),this._values&&(t+=this._values.byteLength),this._nulls&&(t+=this._nulls.byteLength),t}setValue(t,e){return super.setValue(t,S(e))}_flushPending(t,e){let i=this._offsets,n=this._values.reserve(e).buffer,s=0;for(let[o,a]of t)if(a===void 0)i.set(o,BigInt(0));else{let c=a.length;n.set(a,s),i.set(o,BigInt(c)),s+=c}}};var rs=class extends X{constructor(t){super(t),this._values=new $r}setValue(t,e){this._values.set(t,+e)}};var br=class extends it{};br.prototype._setValue=Ks;var Fi=class extends br{};Fi.prototype._setValue=On;var Ti=class extends br{};Ti.prototype._setValue=Fn;var Mi=class extends it{};Mi.prototype._setValue=to;var is=class extends X{constructor({type:t,nullValues:e,dictionaryHashFunction:i}){super({type:new Lt(t.dictionary,t.indices,t.id,t.isOrdered)}),this._nulls=null,this._dictionaryOffset=0,this._keysToIndices=Object.create(null),this.indices=_r({type:this.type.indices,nullValues:e}),this.dictionary=_r({type:this.type.dictionary,nullValues:null}),typeof i=="function"&&(this.valueToKey=i)}get values(){return this.indices.values}get nullCount(){return this.indices.nullCount}get nullBitmap(){return this.indices.nullBitmap}get byteLength(){return this.indices.byteLength+this.dictionary.byteLength}get reservedLength(){return this.indices.reservedLength+this.dictionary.reservedLength}get reservedByteLength(){return this.indices.reservedByteLength+this.dictionary.reservedByteLength}isValid(t){return this.indices.isValid(t)}setValid(t,e){let i=this.indices;return e=i.setValid(t,e),this.length=i.length,e}setValue(t,e){let i=this._keysToIndices,n=this.valueToKey(e),s=i[n];return s===void 0&&(i[n]=s=this._dictionaryOffset+this.dictionary.append(e).length-1),this.indices.setValue(t,s)}flush(){let t=this.type,e=this._dictionary,i=this.dictionary.toVector(),n=this.indices.flush().clone(t);return n.dictionary=e?e.concat(i):i,this.finished||(this._dictionaryOffset+=i.length),this._dictionary=n.dictionary,this.clear(),n}finish(){return this.indices.finish(),this.dictionary.finish(),this._dictionaryOffset=0,this._keysToIndices=Object.create(null),super.finish()}clear(){return this.indices.clear(),this.dictionary.clear(),super.clear()}valueToKey(t){return typeof t=="string"?t:`${t}`}};var Li=class extends it{};Li.prototype._setValue=Xs;var ns=class extends X{setValue(t,e){let[i]=this.children,n=t*this.stride;for(let s=-1,o=e.length;++s0)throw new Error("FixedSizeListBuilder can only have one child.");let i=this.children.push(t);return this.type=new re(this.type.listSize,new U(e,t.type,!0)),i}};var vr=class extends it{setValue(t,e){this._values.set(t,e)}},ss=class extends vr{setValue(t,e){super.setValue(t,_i(e))}},os=class extends vr{},as=class extends vr{};var wr=class extends it{};wr.prototype._setValue=eo;var Ni=class extends wr{};Ni.prototype._setValue=Cn;var Ui=class extends wr{};Ui.prototype._setValue=kn;var Pe=class extends it{};Pe.prototype._setValue=ro;var Ei=class extends Pe{};Ei.prototype._setValue=Pn;var Vi=class extends Pe{};Vi.prototype._setValue=jn;var Ri=class extends Pe{};Ri.prototype._setValue=zn;var Ci=class extends Pe{};Ci.prototype._setValue=$n;var zt=class extends it{setValue(t,e){this._values.set(t,e)}},cs=class extends zt{},ls=class extends zt{},us=class extends zt{},ds=class extends zt{},hs=class extends zt{},fs=class extends zt{},ps=class extends zt{},ms=class extends zt{};var ys=class extends It{constructor(t){super(t),this._offsets=new Wr(t.type)}addChild(t,e="0"){if(this.numChildren>0)throw new Error("ListBuilder can only have one child.");return this.children[this.numChildren]=t,this.type=new te(new U(e,t.type,!0)),this.numChildren-1}_flushPending(t){let e=this._offsets,[i]=this.children;for(let[n,s]of t)if(typeof s>"u")e.set(n,0);else{let o=s,a=o.length,c=e.set(n,a).buffer[n];for(let l=-1;++l0)throw new Error("ListBuilder can only have one child.");return this.children[this.numChildren]=t,this.type=new ie(new U(e,t.type,!0),this.type.keysSorted),this.numChildren-1}_flushPending(t){let e=this._offsets,[i]=this.children;for(let[n,s]of t)if(s===void 0)e.set(n,0);else{let{[n]:o,[n+1]:a}=e.set(n,s.size).buffer;for(let c of s.entries())if(i.set(o,c),++o>=a)break}}};var bs=class extends X{setValue(t,e){}setValid(t,e){return this.length=Math.max(t+1,this.length),e}};var _s=class extends X{setValue(t,e){let{children:i,type:n}=this;switch(Array.isArray(e)||e.constructor){case!0:return n.children.forEach((s,o)=>i[o].set(t,e[o]));case Map:return n.children.forEach((s,o)=>i[o].set(t,e.get(s.name)));default:return n.children.forEach((s,o)=>i[o].set(t,e[s.name]))}}setValid(t,e){return super.setValid(t,e)||this.children.forEach(i=>i.setValid(t,e)),e}addChild(t,e=`${this.numChildren}`){let i=this.children.push(t);return this.type=new G([...this.type.children,new U(e,t.type,!0)]),i}};var je=class extends it{};je.prototype._setValue=qs;var ki=class extends je{};ki.prototype._setValue=Tn;var Pi=class extends je{};Pi.prototype._setValue=Mn;var ji=class extends je{};ji.prototype._setValue=Ln;var zi=class extends je{};zi.prototype._setValue=Nn;var ze=class extends it{};ze.prototype._setValue=Qs;var $i=class extends ze{};$i.prototype._setValue=Un;var Wi=class extends ze{};Wi.prototype._setValue=En;var Hi=class extends ze{};Hi.prototype._setValue=Vn;var Yi=class extends ze{};Yi.prototype._setValue=Rn;var Zr=class extends X{constructor(t){super(t),this._typeIds=new Ee(Int8Array,0,1),typeof t.valueToChildTypeId=="function"&&(this._valueToChildTypeId=t.valueToChildTypeId)}get typeIdToChildIndex(){return this.type.typeIdToChildIndex}append(t,e){return this.set(this.length,t,e)}set(t,e,i){return i===void 0&&(i=this._valueToChildTypeId(this,e,t)),this.setValue(t,e,i),this}setValue(t,e,i){this._typeIds.set(t,i);let n=this.type.typeIdToChildIndex[i],s=this.children[n];s?.set(t,e)}addChild(t,e=`${this.children.length}`){let i=this.children.push(t),{type:{children:n,mode:s,typeIds:o}}=this,a=[...n,new U(e,t.type)];return this.type=new ee(s,[...o,i],a),i}_valueToChildTypeId(t,e,i){throw new Error("Cannot map UnionBuilder value to child typeId. Pass the `childTypeId` as the second argument to unionBuilder.append(), or supply a `valueToChildTypeId` function as part of the UnionBuilder constructor options.")}},vs=class extends Zr{},ws=class extends Zr{constructor(t){super(t),this._offsets=new Ee(Int32Array)}setValue(t,e,i){let n=this._typeIds.set(t,i).buffer[t],s=this.getChildAt(this.type.typeIdToChildIndex[n]),o=this._offsets.set(t,s.length).buffer[t];s?.set(o,e)}};var Gi=class extends It{constructor(t){super(t),this._values=new se(Uint8Array)}get byteLength(){let t=this._pendingLength+this.length*4;return this._offsets&&(t+=this._offsets.byteLength),this._values&&(t+=this._values.byteLength),this._nulls&&(t+=this._nulls.byteLength),t}setValue(t,e){return super.setValue(t,ce(e))}_flushPending(t,e){}};Gi.prototype._flushPending=Gr.prototype._flushPending;var Ji=class extends It{constructor(t){super(t),this._values=new se(Uint8Array)}get byteLength(){let t=this._pendingLength+this.length*4;return this._offsets&&(t+=this._offsets.byteLength),this._values&&(t+=this._values.byteLength),this._nulls&&(t+=this._nulls.byteLength),t}setValue(t,e){return super.setValue(t,ce(e))}_flushPending(t,e){}};Ji.prototype._flushPending=Jr.prototype._flushPending;var vo=class extends g{visitNull(){return bs}visitBool(){return rs}visitInt(){return zt}visitInt8(){return cs}visitInt16(){return ls}visitInt32(){return us}visitInt64(){return ds}visitUint8(){return hs}visitUint16(){return fs}visitUint32(){return ps}visitUint64(){return ms}visitFloat(){return vr}visitFloat16(){return ss}visitFloat32(){return os}visitFloat64(){return as}visitUtf8(){return Gi}visitLargeUtf8(){return Ji}visitBinary(){return Gr}visitLargeBinary(){return Jr}visitFixedSizeBinary(){return Li}visitDate(){return br}visitDateDay(){return Fi}visitDateMillisecond(){return Ti}visitTimestamp(){return je}visitTimestampSecond(){return ki}visitTimestampMillisecond(){return Pi}visitTimestampMicrosecond(){return ji}visitTimestampNanosecond(){return zi}visitTime(){return ze}visitTimeSecond(){return $i}visitTimeMillisecond(){return Wi}visitTimeMicrosecond(){return Hi}visitTimeNanosecond(){return Yi}visitDecimal(){return Mi}visitList(){return ys}visitStruct(){return _s}visitUnion(){return Zr}visitDenseUnion(){return ws}visitSparseUnion(){return vs}visitDictionary(){return is}visitInterval(){return wr}visitIntervalDayTime(){return Ni}visitIntervalYearMonth(){return Ui}visitDuration(){return Pe}visitDurationSecond(){return Ei}visitDurationMillisecond(){return Vi}visitDurationMicrosecond(){return Ri}visitDurationNanosecond(){return Ci}visitFixedSizeList(){return ns}visitMap(){return gs}},sc=new vo;var w=class extends g{compareSchemas(t,e){return t===e||e instanceof t.constructor&&this.compareManyFields(t.fields,e.fields)}compareManyFields(t,e){return t===e||Array.isArray(t)&&Array.isArray(e)&&t.length===e.length&&t.every((i,n)=>this.compareFields(i,e[n]))}compareFields(t,e){return t===e||e instanceof t.constructor&&t.name===e.name&&t.nullable===e.nullable&&this.visit(t.type,e.type)}};function gt(r,t){return t instanceof r.constructor}function Ir(r,t){return r===t||gt(r,t)}function $e(r,t){return r===t||gt(r,t)&&r.bitWidth===t.bitWidth&&r.isSigned===t.isSigned}function Is(r,t){return r===t||gt(r,t)&&r.precision===t.precision}function hu(r,t){return r===t||gt(r,t)&&r.byteWidth===t.byteWidth}function wo(r,t){return r===t||gt(r,t)&&r.unit===t.unit}function Zi(r,t){return r===t||gt(r,t)&&r.unit===t.unit&&r.timezone===t.timezone}function Xi(r,t){return r===t||gt(r,t)&&r.unit===t.unit&&r.bitWidth===t.bitWidth}function fu(r,t){return r===t||gt(r,t)&&r.children.length===t.children.length&&ge.compareManyFields(r.children,t.children)}function pu(r,t){return r===t||gt(r,t)&&r.children.length===t.children.length&&ge.compareManyFields(r.children,t.children)}function Io(r,t){return r===t||gt(r,t)&&r.mode===t.mode&&r.typeIds.every((e,i)=>e===t.typeIds[i])&&ge.compareManyFields(r.children,t.children)}function mu(r,t){return r===t||gt(r,t)&&r.id===t.id&&r.isOrdered===t.isOrdered&&ge.visit(r.indices,t.indices)&&ge.visit(r.dictionary,t.dictionary)}function So(r,t){return r===t||gt(r,t)&&r.unit===t.unit}function Ki(r,t){return r===t||gt(r,t)&&r.unit===t.unit}function yu(r,t){return r===t||gt(r,t)&&r.listSize===t.listSize&&r.children.length===t.children.length&&ge.compareManyFields(r.children,t.children)}function gu(r,t){return r===t||gt(r,t)&&r.keysSorted===t.keysSorted&&r.children.length===t.children.length&&ge.compareManyFields(r.children,t.children)}w.prototype.visitNull=Ir;w.prototype.visitBool=Ir;w.prototype.visitInt=$e;w.prototype.visitInt8=$e;w.prototype.visitInt16=$e;w.prototype.visitInt32=$e;w.prototype.visitInt64=$e;w.prototype.visitUint8=$e;w.prototype.visitUint16=$e;w.prototype.visitUint32=$e;w.prototype.visitUint64=$e;w.prototype.visitFloat=Is;w.prototype.visitFloat16=Is;w.prototype.visitFloat32=Is;w.prototype.visitFloat64=Is;w.prototype.visitUtf8=Ir;w.prototype.visitLargeUtf8=Ir;w.prototype.visitBinary=Ir;w.prototype.visitLargeBinary=Ir;w.prototype.visitFixedSizeBinary=hu;w.prototype.visitDate=wo;w.prototype.visitDateDay=wo;w.prototype.visitDateMillisecond=wo;w.prototype.visitTimestamp=Zi;w.prototype.visitTimestampSecond=Zi;w.prototype.visitTimestampMillisecond=Zi;w.prototype.visitTimestampMicrosecond=Zi;w.prototype.visitTimestampNanosecond=Zi;w.prototype.visitTime=Xi;w.prototype.visitTimeSecond=Xi;w.prototype.visitTimeMillisecond=Xi;w.prototype.visitTimeMicrosecond=Xi;w.prototype.visitTimeNanosecond=Xi;w.prototype.visitDecimal=Ir;w.prototype.visitList=fu;w.prototype.visitStruct=pu;w.prototype.visitUnion=Io;w.prototype.visitDenseUnion=Io;w.prototype.visitSparseUnion=Io;w.prototype.visitDictionary=mu;w.prototype.visitInterval=So;w.prototype.visitIntervalDayTime=So;w.prototype.visitIntervalYearMonth=So;w.prototype.visitDuration=Ki;w.prototype.visitDurationSecond=Ki;w.prototype.visitDurationMillisecond=Ki;w.prototype.visitDurationMicrosecond=Ki;w.prototype.visitDurationNanosecond=Ki;w.prototype.visitFixedSizeList=yu;w.prototype.visitMap=gu;var ge=new w;function Sr(r,t){return ge.compareSchemas(r,t)}function oc(r,t){return ge.compareFields(r,t)}function ac(r,t){return ge.visit(r,t)}function _r(r){let t=r.type,e=new(sc.getVisitFn(t)())(r);if(t.children&&t.children.length>0){let i=r.children||[],n={nullValues:r.nullValues},s=Array.isArray(i)?(o,a)=>i[a]||n:({name:o})=>i[o]||n;for(let[o,a]of t.children.entries()){let{type:c}=a,l=s(a,o);e.children.push(_r(Object.assign(Object.assign({},l),{type:c})))}}return e}function Ss(r,t){return bu(r,t.map(e=>e.data.concat()))}function bu(r,t){let e=[...r.fields],i=[],n={numBatches:t.reduce((h,F)=>Math.max(h,F.length),0)},s=0,o=0,a=-1,c=t.length,l,d=[];for(;n.numBatches-- >0;){for(o=Number.POSITIVE_INFINITY,a=-1;++a0&&(i[s++]=A({type:new G(e),length:o,nullCount:0,children:d.slice()})))}return[r=r.assign(e),i.map(h=>new tt(r,h))]}function _u(r,t,e,i,n){var s;let o=(t+63&-64)>>3;for(let a=-1,c=i.length;++a=t)d===t?e[a]=l:(e[a]=l.slice(0,t),n.numBatches=Math.max(n.numBatches,i[a].unshift(l.slice(t,d-t))));else{let h=r[a];r[a]=h.clone({nullable:!0}),e[a]=(s=l?._changeLengthAndBackfillNullBitmap(t))!==null&&s!==void 0?s:A({type:h.type,length:t,nullCount:t,nullBitmap:new Uint8Array(o)})}}return e}var cc,St=class r{constructor(...t){var e,i;if(t.length===0)return this.batches=[],this.schema=new P([]),this._offsets=[0],this;let n,s;t[0]instanceof P&&(n=t.shift()),t.at(-1)instanceof Uint32Array&&(s=t.pop());let o=c=>{if(c){if(c instanceof tt)return[c];if(c instanceof r)return c.batches;if(c instanceof C){if(c.type instanceof G)return[new tt(new P(c.type.children),c)]}else{if(Array.isArray(c))return c.flatMap(l=>o(l));if(typeof c[Symbol.iterator]=="function")return[...c].flatMap(l=>o(l));if(typeof c=="object"){let l=Object.keys(c),d=l.map(L=>new V([c[L]])),h=n??new P(l.map((L,H)=>new U(String(L),d[H].type,d[H].nullable))),[,F]=Ss(h,d);return F.length===0?[new tt(c)]:F}}}return[]},a=t.flatMap(c=>o(c));if(n=(i=n??((e=a[0])===null||e===void 0?void 0:e.schema))!==null&&i!==void 0?i:new P([]),!(n instanceof P))throw new TypeError("Table constructor expects a [Schema, RecordBatch[]] pair.");for(let c of a){if(!(c instanceof tt))throw new TypeError("Table constructor expects a [Schema, RecordBatch[]] pair.");if(!Sr(n,c.schema))throw new TypeError("Table and inner RecordBatch schemas must be equivalent.")}this.schema=n,this.batches=a,this._offsets=s??Jn(this.data)}get data(){return this.batches.map(({data:t})=>t)}get numCols(){return this.schema.fields.length}get numRows(){return this.data.reduce((t,e)=>t+e.length,0)}get nullCount(){return this._nullCount===-1&&(this._nullCount=Gn(this.data)),this._nullCount}isValid(t){return!1}get(t){return null}at(t){return this.get(dr(t,this.numRows))}set(t,e){}indexOf(t,e){return-1}[Symbol.iterator](){return this.batches.length>0?zr.visit(new V(this.data)):new Array(0)[Symbol.iterator]()}toArray(){return[...this]}toString(){return`[ + ${this.toArray().join(`, + `)} +]`}concat(...t){let e=this.schema,i=this.data.concat(t.flatMap(({data:n})=>n));return new r(e,i.map(n=>new tt(e,n)))}slice(t,e){let i=this.schema;[t,e]=vi({length:this.numRows},t,e);let n=Zn(this.data,this._offsets,t,e);return new r(i,n.map(s=>new tt(i,s)))}getChild(t){return this.getChildAt(this.schema.fields.findIndex(e=>e.name===t))}getChildAt(t){if(t>-1&&ti.children[t]);if(e.length===0){let{type:i}=this.schema.fields[t],n=A({type:i,length:0,nullCount:0});e.push(n._changeLengthAndBackfillNullBitmap(this.numRows))}return new V(e)}return null}setChild(t,e){var i;return this.setChildAt((i=this.schema.fields)===null||i===void 0?void 0:i.findIndex(n=>n.name===t),e)}setChildAt(t,e){let i=this.schema,n=[...this.batches];if(t>-1&&tthis.getChildAt(l));[s[t],a[t]]=[o,e],[i,n]=Ss(i,a)}return new r(i,n)}select(t){let e=this.schema.fields.reduce((i,n,s)=>i.set(n.name,s),new Map);return this.selectAt(t.map(i=>e.get(i)).filter(i=>i>-1))}selectAt(t){let e=this.schema.selectAt(t),i=this.batches.map(n=>n.selectAt(t));return new r(e,i)}assign(t){let e=this.schema.fields,[i,n]=t.schema.fields.reduce((a,c,l)=>{let[d,h]=a,F=e.findIndex(L=>L.name===c.name);return~F?h[F]=l:d.push(l),a},[[],[]]),s=this.schema.assign(t.schema),o=[...e.map((a,c)=>[c,n[c]]).map(([a,c])=>c===void 0?this.getChildAt(a):t.getChildAt(c)),...i.map(a=>t.getChildAt(a))].filter(Boolean);return new r(...Ss(s,o))}};cc=Symbol.toStringTag;St[cc]=(r=>(r.schema=null,r.batches=[],r._offsets=new Uint32Array([0]),r._nullCount=-1,r[Symbol.isConcatSpreadable]=!0,r.isValid=jr(Si),r.get=jr(rt.getVisitFn(u.Struct)),r.set=Xn(dt.getVisitFn(u.Struct)),r.indexOf=Kn(mr.getVisitFn(u.Struct)),"Table"))(St.prototype);var uc,tt=class r{constructor(...t){switch(t.length){case 2:{if([this.schema]=t,!(this.schema instanceof P))throw new TypeError("RecordBatch constructor expects a [Schema, Data] pair.");if([,this.data=A({nullCount:0,type:new G(this.schema.fields),children:this.schema.fields.map(e=>A({type:e.type,nullCount:0}))})]=t,!(this.data instanceof C))throw new TypeError("RecordBatch constructor expects a [Schema, Data] pair.");[this.schema,this.data]=lc(this.schema,this.data.children);break}case 1:{let[e]=t,{fields:i,children:n,length:s}=Object.keys(e).reduce((c,l,d)=>(c.children[d]=e[l],c.length=Math.max(c.length,e[l].length),c.fields[d]=U.new({name:l,type:e[l].type,nullable:!0}),c),{length:0,fields:new Array,children:new Array}),o=new P(i),a=A({type:new G(i),length:s,children:n,nullCount:0});[this.schema,this.data]=lc(o,a.children,s);break}default:throw new TypeError("RecordBatch constructor expects an Object mapping names to child Data, or a [Schema, Data] pair.")}}get dictionaries(){return this._dictionaries||(this._dictionaries=dc(this.schema.fields,this.data.children))}get numCols(){return this.schema.fields.length}get numRows(){return this.data.length}get nullCount(){return this.data.nullCount}isValid(t){return this.data.getValid(t)}get(t){return rt.visit(this.data,t)}at(t){return this.get(dr(t,this.numRows))}set(t,e){return dt.visit(this.data,t,e)}indexOf(t,e){return mr.visit(this.data,t,e)}[Symbol.iterator](){return zr.visit(new V([this.data]))}toArray(){return[...this]}concat(...t){return new St(this.schema,[this,...t])}slice(t,e){let[i]=new V([this.data]).slice(t,e).data;return new r(this.schema,i)}getChild(t){var e;return this.getChildAt((e=this.schema.fields)===null||e===void 0?void 0:e.findIndex(i=>i.name===t))}getChildAt(t){return t>-1&&tn.name===t),e)}setChildAt(t,e){let i=this.schema,n=this.data;if(t>-1&&ta.name===s);~o&&(n[o]=this.data.children[o])}return new r(e,A({type:i,length:this.numRows,children:n}))}selectAt(t){let e=this.schema.selectAt(t),i=t.map(s=>this.data.children[s]).filter(Boolean),n=A({type:new G(e.fields),length:this.numRows,children:i});return new r(e,n)}};uc=Symbol.toStringTag;tt[uc]=(r=>(r._nullCount=-1,r[Symbol.isConcatSpreadable]=!0,"RecordBatch"))(tt.prototype);function lc(r,t,e=t.reduce((i,n)=>Math.max(i,n.length),0)){var i;let n=[...r.fields],s=[...t],o=(e+63&-64)>>3;for(let[a,c]of r.fields.entries()){let l=t[a];(!l||l.length!==e)&&(n[a]=c.clone({nullable:!0}),s[a]=(i=l?._changeLengthAndBackfillNullBitmap(e))!==null&&i!==void 0?i:A({type:c.type,length:e,nullCount:e,nullBitmap:new Uint8Array(o)}))}return[r.assign(n),A({type:new G(n),length:e,children:s})]}function dc(r,t,e=new Map){var i,n;if(((i=r?.length)!==null&&i!==void 0?i:0)>0&&r?.length===t?.length)for(let s=-1,o=r.length;++sA({type:n.type})),i=A({type:new G(t.fields),nullCount:0,children:e});super(t,i)}};var oe=class r{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsMessage(t,e){return(e||new r).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsMessage(t,e){return t.setPosition(t.position()+4),(e||new r).__init(t.readInt32(t.position())+t.position(),t)}version(){let t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):j.V1}headerType(){let t=this.bb.__offset(this.bb_pos,6);return t?this.bb.readUint8(this.bb_pos+t):E.NONE}header(t){let e=this.bb.__offset(this.bb_pos,8);return e?this.bb.__union(t,this.bb_pos+e):null}bodyLength(){let t=this.bb.__offset(this.bb_pos,10);return t?this.bb.readInt64(this.bb_pos+t):BigInt("0")}customMetadata(t,e){let i=this.bb.__offset(this.bb_pos,12);return i?(e||new ot).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+i)+t*4),this.bb):null}customMetadataLength(){let t=this.bb.__offset(this.bb_pos,12);return t?this.bb.__vector_len(this.bb_pos+t):0}static startMessage(t){t.startObject(5)}static addVersion(t,e){t.addFieldInt16(0,e,j.V1)}static addHeaderType(t,e){t.addFieldInt8(1,e,E.NONE)}static addHeader(t,e){t.addFieldOffset(2,e,0)}static addBodyLength(t,e){t.addFieldInt64(3,e,BigInt("0"))}static addCustomMetadata(t,e){t.addFieldOffset(4,e,0)}static createCustomMetadataVector(t,e){t.startVector(4,e.length,4);for(let i=e.length-1;i>=0;i--)t.addOffset(e[i]);return t.endVector()}static startCustomMetadataVector(t,e){t.startVector(4,e,4)}static endMessage(t){return t.endObject()}static finishMessageBuffer(t,e){t.finish(e)}static finishSizePrefixedMessageBuffer(t,e){t.finish(e,void 0,!0)}static createMessage(t,e,i,n,s,o){return r.startMessage(t),r.addVersion(t,e),r.addHeaderType(t,i),r.addHeader(t,n),r.addBodyLength(t,s),r.addCustomMetadata(t,o),r.endMessage(t)}};var Bo=class extends g{visit(t,e){return t==null||e==null?void 0:super.visit(t,e)}visitNull(t,e){return pi.startNull(e),pi.endNull(e)}visitInt(t,e){return Zt.startInt(e),Zt.addBitWidth(e,t.bitWidth),Zt.addIsSigned(e,t.isSigned),Zt.endInt(e)}visitFloat(t,e){return Qe.startFloatingPoint(e),Qe.addPrecision(e,t.precision),Qe.endFloatingPoint(e)}visitBinary(t,e){return li.startBinary(e),li.endBinary(e)}visitLargeBinary(t,e){return di.startLargeBinary(e),di.endLargeBinary(e)}visitBool(t,e){return ui.startBool(e),ui.endBool(e)}visitUtf8(t,e){return yi.startUtf8(e),yi.endUtf8(e)}visitLargeUtf8(t,e){return hi.startLargeUtf8(e),hi.endLargeUtf8(e)}visitDecimal(t,e){return he.startDecimal(e),he.addScale(e,t.scale),he.addPrecision(e,t.precision),he.addBitWidth(e,t.bitWidth),he.endDecimal(e)}visitDate(t,e){return Ze.startDate(e),Ze.addUnit(e,t.unit),Ze.endDate(e)}visitTime(t,e){return ve.startTime(e),ve.addUnit(e,t.unit),ve.addBitWidth(e,t.bitWidth),ve.endTime(e)}visitTimestamp(t,e){let i=t.timezone&&e.createString(t.timezone)||void 0;return we.startTimestamp(e),we.addUnit(e,t.unit),i!==void 0&&we.addTimezone(e,i),we.endTimestamp(e)}visitInterval(t,e){return tr.startInterval(e),tr.addUnit(e,t.unit),tr.endInterval(e)}visitDuration(t,e){return Xe.startDuration(e),Xe.addUnit(e,t.unit),Xe.endDuration(e)}visitList(t,e){return fi.startList(e),fi.endList(e)}visitStruct(t,e){return mi.startStruct_(e),mi.endStruct_(e)}visitUnion(t,e){Xt.startTypeIdsVector(e,t.typeIds.length);let i=Xt.createTypeIdsVector(e,t.typeIds);return Xt.startUnion(e),Xt.addMode(e,t.mode),Xt.addTypeIds(e,i),Xt.endUnion(e)}visitDictionary(t,e){let i=this.visit(t.indices,e);return de.startDictionaryEncoding(e),de.addId(e,BigInt(t.id)),de.addIsOrdered(e,t.isOrdered),i!==void 0&&de.addIndexType(e,i),de.endDictionaryEncoding(e)}visitFixedSizeBinary(t,e){return Ke.startFixedSizeBinary(e),Ke.addByteWidth(e,t.byteWidth),Ke.endFixedSizeBinary(e)}visitFixedSizeList(t,e){return qe.startFixedSizeList(e),qe.addListSize(e,t.listSize),qe.endFixedSizeList(e)}visitMap(t,e){return er.startMap(e),er.addKeysSorted(e,t.keysSorted),er.endMap(e)}},Bs=new Bo;function mc(r,t=new Map){return new P(wu(r,t),xs(r.metadata),t)}function xo(r){return new ht(r.count,gc(r.columns),bc(r.columns))}function yc(r){return new xt(xo(r.data),r.id,r.isDelta)}function wu(r,t){return(r.fields||[]).filter(Boolean).map(e=>U.fromJSON(e,t))}function hc(r,t){return(r.children||[]).filter(Boolean).map(e=>U.fromJSON(e,t))}function gc(r){return(r||[]).reduce((t,e)=>[...t,new $t(e.count,Iu(e.VALIDITY)),...gc(e.children)],[])}function bc(r,t=[]){for(let e=-1,i=(r||[]).length;++et+ +(e===0),0)}function _c(r,t){let e,i,n,s,o,a;return!t||!(s=r.dictionary)?(o=pc(r,hc(r,t)),n=new U(r.name,o,r.nullable,xs(r.metadata))):t.has(e=s.id)?(i=(i=s.indexType)?fc(i):new fe,a=new Lt(t.get(e),i,e,s.isOrdered),n=new U(r.name,a,r.nullable,xs(r.metadata))):(i=(i=s.indexType)?fc(i):new fe,t.set(e,o=pc(r,hc(r,t))),a=new Lt(o,i,e,s.isOrdered),n=new U(r.name,a,r.nullable,xs(r.metadata))),n||null}function xs(r=[]){return new Map(r.map(({key:t,value:e})=>[t,e]))}function fc(r){return new at(r.isSigned,r.bitWidth)}function pc(r,t){let e=r.type.name;switch(e){case"NONE":return new yt;case"null":return new yt;case"binary":return new Ie;case"largebinary":return new Se;case"utf8":return new Be;case"largeutf8":return new xe;case"bool":return new De;case"list":return new te((t||[])[0]);case"struct":return new G(t||[]);case"struct_":return new G(t||[])}switch(e){case"int":{let i=r.type;return new at(i.isSigned,i.bitWidth)}case"floatingpoint":{let i=r.type;return new Pt($[i.precision])}case"decimal":{let i=r.type;return new Ae(i.scale,i.precision,i.bitWidth)}case"date":{let i=r.type;return new Oe(et[i.unit])}case"time":{let i=r.type;return new Fe(m[i.unit],i.bitWidth)}case"timestamp":{let i=r.type;return new Te(m[i.unit],i.timezone)}case"interval":{let i=r.type;return new Me(lt[i.unit])}case"duration":{let i=r.type;return new Le(m[i.unit])}case"union":{let i=r.type,[n,...s]=(i.mode+"").toLowerCase(),o=n.toUpperCase()+s.join("");return new ee(Y[o],i.typeIds||[],t||[])}case"fixedsizebinary":{let i=r.type;return new Ne(i.byteWidth)}case"fixedsizelist":{let i=r.type;return new re(i.listSize,(t||[])[0])}case"map":{let i=r.type;return new ie((t||[])[0],i.keysSorted)}}throw new Error(`Unrecognized type: "${e}"`)}var Su=ur,Bu=Tt,Dt=class r{static fromJSON(t,e){let i=new r(0,j.V5,e);return i._createHeader=xu(t,e),i}static decode(t){t=new Bu(S(t));let e=oe.getRootAsMessage(t),i=e.bodyLength(),n=e.version(),s=e.headerType(),o=new r(i,n,s);return o._createHeader=Du(e,s),o}static encode(t){let e=new Su,i=-1;return t.isSchema()?i=P.encode(e,t.header()):t.isRecordBatch()?i=ht.encode(e,t.header()):t.isDictionaryBatch()&&(i=xt.encode(e,t.header())),oe.startMessage(e),oe.addVersion(e,j.V5),oe.addHeader(e,i),oe.addHeaderType(e,t.headerType),oe.addBodyLength(e,BigInt(t.bodyLength)),oe.finishMessageBuffer(e,oe.endMessage(e)),e.asUint8Array()}static from(t,e=0){if(t instanceof P)return new r(0,j.V5,E.Schema,t);if(t instanceof ht)return new r(e,j.V5,E.RecordBatch,t);if(t instanceof xt)return new r(e,j.V5,E.DictionaryBatch,t);throw new Error(`Unrecognized Message header: ${t}`)}get type(){return this.headerType}get version(){return this._version}get headerType(){return this._headerType}get bodyLength(){return this._bodyLength}header(){return this._createHeader()}isSchema(){return this.headerType===E.Schema}isRecordBatch(){return this.headerType===E.RecordBatch}isDictionaryBatch(){return this.headerType===E.DictionaryBatch}constructor(t,e,i,n){this._version=e,this._headerType=i,this.body=new Uint8Array(0),n&&(this._createHeader=()=>n),this._bodyLength=R(t)}},ht=class{get nodes(){return this._nodes}get length(){return this._length}get buffers(){return this._buffers}constructor(t,e,i){this._nodes=e,this._buffers=i,this._length=R(t)}},xt=class{get id(){return this._id}get data(){return this._data}get isDelta(){return this._isDelta}get length(){return this.data.length}get nodes(){return this.data.nodes}get buffers(){return this.data.buffers}constructor(t,e,i=!1){this._data=t,this._isDelta=i,this._id=R(e)}},Bt=class{constructor(t,e){this.offset=R(t),this.length=R(e)}},$t=class{constructor(t,e){this.length=R(t),this.nullCount=R(e)}};function xu(r,t){return()=>{switch(t){case E.Schema:return P.fromJSON(r);case E.RecordBatch:return ht.fromJSON(r);case E.DictionaryBatch:return xt.fromJSON(r)}throw new Error(`Unrecognized Message type: { name: ${E[t]}, type: ${t} }`)}}function Du(r,t){return()=>{switch(t){case E.Schema:return P.decode(r.header(new wt),new Map,r.version());case E.RecordBatch:return ht.decode(r.header(new Mt),r.version());case E.DictionaryBatch:return xt.decode(r.header(new _e),r.version())}throw new Error(`Unrecognized Message type: { name: ${E[t]}, type: ${t} }`)}}U.encode=Ru;U.decode=Eu;U.fromJSON=_c;P.encode=Vu;P.decode=Au;P.fromJSON=mc;ht.encode=Cu;ht.decode=Ou;ht.fromJSON=xo;xt.encode=ku;xt.decode=Fu;xt.fromJSON=yc;$t.encode=Pu;$t.decode=Mu;Bt.encode=ju;Bt.decode=Tu;function Au(r,t=new Map,e=j.V5){let i=Uu(r,t);return new P(i,Ds(r),t,e)}function Ou(r,t=j.V5){if(r.compression()!==null)throw new Error("Record batch compression not implemented");return new ht(r.length(),Lu(r),Nu(r,t))}function Fu(r,t=j.V5){return new xt(ht.decode(r.data(),t),r.id(),r.isDelta())}function Tu(r){return new Bt(r.offset(),r.length())}function Mu(r){return new $t(r.length(),r.nullCount())}function Lu(r){let t=[];for(let e,i=-1,n=-1,s=r.nodesLength();++iU.encode(r,s));wt.startFieldsVector(r,e.length);let i=wt.createFieldsVector(r,e),n=t.metadata&&t.metadata.size>0?wt.createCustomMetadataVector(r,[...t.metadata].map(([s,o])=>{let a=r.createString(`${s}`),c=r.createString(`${o}`);return ot.startKeyValue(r),ot.addKey(r,a),ot.addValue(r,c),ot.endKeyValue(r)})):-1;return wt.startSchema(r),wt.addFields(r,i),wt.addEndianness(r,zu?Je.Little:Je.Big),n!==-1&&wt.addCustomMetadata(r,n),wt.endSchema(r)}function Ru(r,t){let e=-1,i=-1,n=-1,s=t.type,o=t.typeId;p.isDictionary(s)?(o=s.dictionary.typeId,n=Bs.visit(s,r),i=Bs.visit(s.dictionary,r)):i=Bs.visit(s,r);let a=(s.children||[]).map(d=>U.encode(r,d)),c=pt.createChildrenVector(r,a),l=t.metadata&&t.metadata.size>0?pt.createCustomMetadataVector(r,[...t.metadata].map(([d,h])=>{let F=r.createString(`${d}`),L=r.createString(`${h}`);return ot.startKeyValue(r),ot.addKey(r,F),ot.addValue(r,L),ot.endKeyValue(r)})):-1;return t.name&&(e=r.createString(t.name)),pt.startField(r),pt.addType(r,i),pt.addTypeType(r,o),pt.addChildren(r,c),pt.addNullable(r,!!t.nullable),e!==-1&&pt.addName(r,e),n!==-1&&pt.addDictionary(r,n),l!==-1&&pt.addCustomMetadata(r,l),pt.endField(r)}function Cu(r,t){let e=t.nodes||[],i=t.buffers||[];Mt.startNodesVector(r,e.length);for(let o of e.slice().reverse())$t.encode(r,o);let n=r.endVector();Mt.startBuffersVector(r,i.length);for(let o of i.slice().reverse())Bt.encode(r,o);let s=r.endVector();return Mt.startRecordBatch(r),Mt.addLength(r,BigInt(t.length)),Mt.addNodes(r,n),Mt.addBuffers(r,s),Mt.endRecordBatch(r)}function ku(r,t){let e=ht.encode(r,t.data);return _e.startDictionaryBatch(r),_e.addId(r,BigInt(t.id)),_e.addIsDelta(r,t.isDelta),_e.addData(r,e),_e.endDictionaryBatch(r)}function Pu(r,t){return Lr.createFieldNode(r,BigInt(t.length),BigInt(t.nullCount))}function ju(r,t){return Mr.createBuffer(r,BigInt(t.offset),BigInt(t.length))}var zu=(()=>{let r=new ArrayBuffer(2);return new DataView(r).setInt16(0,256,!0),new Int16Array(r)[0]===256})();var Ao=r=>`Expected ${E[r]} Message in stream, but was null or length 0.`,Oo=r=>`Header pointer of flatbuffer-encoded ${E[r]} Message is null or length 0.`,Sc=(r,t)=>`Expected to read ${r} metadata bytes, but only read ${t}.`,Bc=(r,t)=>`Expected to read ${r} bytes for message body, but only read ${t}.`,Xr=class{constructor(t){this.source=t instanceof ye?t:new ye(t)}[Symbol.iterator](){return this}next(){let t;return(t=this.readMetadataLength()).done?J:t.value===-1&&(t=this.readMetadataLength()).done?J:(t=this.readMetadata(t.value)).done?J:t}throw(t){return this.source.throw(t)}return(t){return this.source.return(t)}readMessage(t){let e;if((e=this.next()).done)return null;if(t!=null&&e.value.headerType!==t)throw new Error(Ao(t));return e.value}readMessageBody(t){if(t<=0)return new Uint8Array(0);let e=S(this.source.read(t));if(e.byteLength[...n,...s.VALIDITY&&[s.VALIDITY]||[],...s.TYPE_ID&&[s.TYPE_ID]||[],...s.OFFSET&&[s.OFFSET]||[],...s.DATA&&[s.DATA]||[],...e(s.children)],[])}}readMessage(t){let e;if((e=this.next()).done)return null;if(t!=null&&e.value.headerType!==t)throw new Error(Ao(t));return e.value}readSchema(){let t=E.Schema,e=this.readMessage(t),i=e?.header();if(!e||!i)throw new Error(Oo(t));return i}},As=4,Do="ARROW1",Kr=new Uint8Array(Do.length);for(let r=0;rthis):this}readRecordBatch(t){return this._impl.isFile()?this._impl.readRecordBatch(t):null}[Symbol.iterator](){return this._impl[Symbol.iterator]()}[Symbol.asyncIterator](){return this._impl[Symbol.asyncIterator]()}toDOMStream(){return ut.toDOMStream(this.isSync()?{[Symbol.iterator]:()=>this}:{[Symbol.asyncIterator]:()=>this})}toNodeStream(){return ut.toNodeStream(this.isSync()?{[Symbol.iterator]:()=>this}:{[Symbol.asyncIterator]:()=>this},{objectMode:!0})}static throughNode(t){throw new Error('"throughNode" not available in this environment')}static throughDOM(t,e){throw new Error('"throughDOM" not available in this environment')}static from(t){return t instanceof r?t:nn(t)?Wu(t):on(t)?Gu(t):Ot(t)?f(this,void 0,void 0,function*(){return yield r.from(yield t)}):an(t)||ii(t)||ln(t)||Ct(t)?Yu(new jt(t)):Hu(new ye(t))}static readAll(t){return t instanceof r?t.isSync()?Dc(t):Ac(t):nn(t)||ArrayBuffer.isView(t)||Yt(t)||sn(t)?Dc(t):Ac(t)}},We=class extends Et{constructor(t){super(t),this._impl=t}readAll(){return[...this]}[Symbol.iterator](){return this._impl[Symbol.iterator]()}[Symbol.asyncIterator](){return At(this,arguments,function*(){yield M(yield*Fr(Ht(this[Symbol.iterator]())))})}},xr=class extends Et{constructor(t){super(t),this._impl=t}readAll(){return f(this,void 0,void 0,function*(){var t,e,i,n;let s=new Array;try{for(var o=!0,a=Ht(this),c;c=yield a.next(),t=c.done,!t;o=!0){n=c.value,o=!1;let l=n;s.push(l)}}catch(l){e={error:l}}finally{try{!o&&!t&&(i=a.return)&&(yield i.call(a))}finally{if(e)throw e.error}}return s})}[Symbol.iterator](){throw new Error("AsyncRecordBatchStreamReader is not Iterable")}[Symbol.asyncIterator](){return this._impl[Symbol.asyncIterator]()}},Dr=class extends We{constructor(t){super(t),this._impl=t}},Fs=class extends xr{constructor(t){super(t),this._impl=t}},Ts=class{get numDictionaries(){return this._dictionaryIndex}get numRecordBatches(){return this._recordBatchIndex}constructor(t=new Map){this.closed=!1,this.autoDestroy=!0,this._dictionaryIndex=0,this._recordBatchIndex=0,this.dictionaries=t}isSync(){return!1}isAsync(){return!1}isFile(){return!1}isStream(){return!1}reset(t){return this._dictionaryIndex=0,this._recordBatchIndex=0,this.schema=t,this.dictionaries=new Map,this}_loadRecordBatch(t,e){let i=this._loadVectors(t,e,this.schema.fields),n=A({type:new G(this.schema.fields),length:t.length,children:i});return new tt(this.schema,n)}_loadDictionaryBatch(t,e){let{id:i,isDelta:n}=t,{dictionaries:s,schema:o}=this,a=s.get(i),c=o.dictionaries.get(i),l=this._loadVectors(t.data,e,[c]);return(a&&n?a.concat(new V(l)):new V(l)).memoize()}_loadVectors(t,e,i){return new Oi(e,t.nodes,t.buffers,this.dictionaries,this.schema.metadataVersion).visitMany(i)}},Qr=class extends Ts{constructor(t,e){super(e),this._reader=nn(t)?new Qi(this._handle=t):new Xr(this._handle=t)}isSync(){return!0}isStream(){return!0}[Symbol.iterator](){return this}cancel(){!this.closed&&(this.closed=!0)&&(this.reset()._reader.return(),this._reader=null,this.dictionaries=null)}open(t){return this.closed||(this.autoDestroy=Oc(this,t),this.schema||(this.schema=this._reader.readSchema())||this.cancel()),this}throw(t){return!this.closed&&this.autoDestroy&&(this.closed=!0)?this.reset()._reader.throw(t):J}return(t){return!this.closed&&this.autoDestroy&&(this.closed=!0)?this.reset()._reader.return(t):J}next(){if(this.closed)return J;let t,{_reader:e}=this;for(;t=this._readNextMessageAndValidate();)if(t.isSchema())this.reset(t.header());else if(t.isRecordBatch()){this._recordBatchIndex++;let i=t.header(),n=e.readMessageBody(t.bodyLength);return{done:!1,value:this._loadRecordBatch(i,n)}}else if(t.isDictionaryBatch()){this._dictionaryIndex++;let i=t.header(),n=e.readMessageBody(t.bodyLength),s=this._loadDictionaryBatch(i,n);this.dictionaries.set(i.id,s)}return this.schema&&this._recordBatchIndex===0?(this._recordBatchIndex++,{done:!1,value:new Br(this.schema)}):this.return()}_readNextMessageAndValidate(t){return this._reader.readMessage(t)}},ti=class extends Ts{constructor(t,e){super(e),this._reader=new qi(this._handle=t)}isAsync(){return!0}isStream(){return!0}[Symbol.asyncIterator](){return this}cancel(){return f(this,void 0,void 0,function*(){!this.closed&&(this.closed=!0)&&(yield this.reset()._reader.return(),this._reader=null,this.dictionaries=null)})}open(t){return f(this,void 0,void 0,function*(){return this.closed||(this.autoDestroy=Oc(this,t),this.schema||(this.schema=yield this._reader.readSchema())||(yield this.cancel())),this})}throw(t){return f(this,void 0,void 0,function*(){return!this.closed&&this.autoDestroy&&(this.closed=!0)?yield this.reset()._reader.throw(t):J})}return(t){return f(this,void 0,void 0,function*(){return!this.closed&&this.autoDestroy&&(this.closed=!0)?yield this.reset()._reader.return(t):J})}next(){return f(this,void 0,void 0,function*(){if(this.closed)return J;let t,{_reader:e}=this;for(;t=yield this._readNextMessageAndValidate();)if(t.isSchema())yield this.reset(t.header());else if(t.isRecordBatch()){this._recordBatchIndex++;let i=t.header(),n=yield e.readMessageBody(t.bodyLength);return{done:!1,value:this._loadRecordBatch(i,n)}}else if(t.isDictionaryBatch()){this._dictionaryIndex++;let i=t.header(),n=yield e.readMessageBody(t.bodyLength),s=this._loadDictionaryBatch(i,n);this.dictionaries.set(i.id,s)}return this.schema&&this._recordBatchIndex===0?(this._recordBatchIndex++,{done:!1,value:new Br(this.schema)}):yield this.return()})}_readNextMessageAndValidate(t){return f(this,void 0,void 0,function*(){return yield this._reader.readMessage(t)})}},Ms=class extends Qr{get footer(){return this._footer}get numDictionaries(){return this._footer?this._footer.numDictionaries:0}get numRecordBatches(){return this._footer?this._footer.numRecordBatches:0}constructor(t,e){super(t instanceof xi?t:new xi(t),e)}isSync(){return!0}isFile(){return!0}open(t){if(!this.closed&&!this._footer){this.schema=(this._footer=this._readFooter()).schema;for(let e of this._footer.dictionaryBatches())e&&this._readDictionaryBatch(this._dictionaryIndex++)}return super.open(t)}readRecordBatch(t){var e;if(this.closed)return null;this._footer||this.open();let i=(e=this._footer)===null||e===void 0?void 0:e.getRecordBatch(t);if(i&&this._handle.seek(i.offset)){let n=this._reader.readMessage(E.RecordBatch);if(n?.isRecordBatch()){let s=n.header(),o=this._reader.readMessageBody(n.bodyLength);return this._loadRecordBatch(s,o)}}return null}_readDictionaryBatch(t){var e;let i=(e=this._footer)===null||e===void 0?void 0:e.getDictionaryBatch(t);if(i&&this._handle.seek(i.offset)){let n=this._reader.readMessage(E.DictionaryBatch);if(n?.isDictionaryBatch()){let s=n.header(),o=this._reader.readMessageBody(n.bodyLength),a=this._loadDictionaryBatch(s,o);this.dictionaries.set(s.id,a)}}}_readFooter(){let{_handle:t}=this,e=t.size-Fo,i=t.readInt32(e),n=t.readAt(e-i,i);return Ve.decode(n)}_readNextMessageAndValidate(t){var e;if(this._footer||this.open(),this._footer&&this._recordBatchIndexsuper.open}});return f(this,void 0,void 0,function*(){if(!this.closed&&!this._footer){this.schema=(this._footer=yield this._readFooter()).schema;for(let i of this._footer.dictionaryBatches())i&&(yield this._readDictionaryBatch(this._dictionaryIndex++))}return yield e.open.call(this,t)})}readRecordBatch(t){return f(this,void 0,void 0,function*(){var e;if(this.closed)return null;this._footer||(yield this.open());let i=(e=this._footer)===null||e===void 0?void 0:e.getRecordBatch(t);if(i&&(yield this._handle.seek(i.offset))){let n=yield this._reader.readMessage(E.RecordBatch);if(n?.isRecordBatch()){let s=n.header(),o=yield this._reader.readMessageBody(n.bodyLength);return this._loadRecordBatch(s,o)}}return null})}_readDictionaryBatch(t){return f(this,void 0,void 0,function*(){var e;let i=(e=this._footer)===null||e===void 0?void 0:e.getDictionaryBatch(t);if(i&&(yield this._handle.seek(i.offset))){let n=yield this._reader.readMessage(E.DictionaryBatch);if(n?.isDictionaryBatch()){let s=n.header(),o=yield this._reader.readMessageBody(n.bodyLength),a=this._loadDictionaryBatch(s,o);this.dictionaries.set(s.id,a)}}})}_readFooter(){return f(this,void 0,void 0,function*(){let{_handle:t}=this;t._pending&&(yield t._pending);let e=t.size-Fo,i=yield t.readInt32(e),n=yield t.readAt(e-i,i);return Ve.decode(n)})}_readNextMessageAndValidate(t){return f(this,void 0,void 0,function*(){if(this._footer||(yield this.open()),this._footer&&this._recordBatchIndex=4?Os(t)?new Dr(new Ms(r.read())):new We(new Qr(r)):new We(new Qr(function*(){}()))}function Yu(r){return f(this,void 0,void 0,function*(){let t=yield r.peek(qr+7&-8);return t&&t.byteLength>=4?Os(t)?new Dr(new Ms(yield r.read())):new xr(new ti(r)):new xr(new ti(function(){return At(this,arguments,function*(){})}()))})}function Gu(r){return f(this,void 0,void 0,function*(){let{size:t}=yield r.stat(),e=new or(r,t);return t>=xc&&Os(yield e.readAt(0,qr+7&-8))?new Fs(new To(e)):new xr(new ti(e))})}var q=class r extends g{static assemble(...t){let e=n=>n.flatMap(s=>Array.isArray(s)?e(s):s instanceof tt?s.data.children:s.data),i=new r;return i.visitMany(e(t)),i}constructor(){super(),this._byteLength=0,this._nodes=[],this._buffers=[],this._bufferRegions=[]}visit(t){if(t instanceof V)return this.visitMany(t.data),this;let{type:e}=t;if(!p.isDictionary(e)){let{length:i}=t;if(i>2147483647)throw new RangeError("Cannot write arrays larger than 2^31 - 1 in length");if(p.isUnion(e))this.nodes.push(new $t(i,0));else{let{nullCount:n}=t;p.isNull(e)||ae.call(this,n<=0?new Uint8Array(0):fr(t.offset,i,t.nullBitmap)),this.nodes.push(new $t(i,n))}}return super.visit(t)}visitNull(t){return this}visitDictionary(t){return this.visit(t.clone(t.type.indices))}get nodes(){return this._nodes}get buffers(){return this._buffers}get byteLength(){return this._byteLength}get bufferRegions(){return this._bufferRegions}};function ae(r){let t=r.byteLength+7&-8;return this.buffers.push(r),this.bufferRegions.push(new Bt(this._byteLength,t)),this._byteLength+=t,this}function Ju(r){var t;let{type:e,length:i,typeIds:n,valueOffsets:s}=r;if(ae.call(this,n),e.mode===Y.Sparse)return Lo.call(this,r);if(e.mode===Y.Dense){if(r.offset<=0)return ae.call(this,s),Lo.call(this,r);{let o=new Int32Array(i),a=Object.create(null),c=Object.create(null);for(let l,d,h=-1;++h{let h=e.typeIds[d],F=a[h],L=c[h];return l.slice(F,Math.min(i,L))}))}}return this}function Zu(r){let t;return r.nullCount>=r.length?ae.call(this,new Uint8Array(0)):(t=r.values)instanceof Uint8Array?ae.call(this,fr(r.offset,r.length,t)):ae.call(this,pr(r.values))}function He(r){return ae.call(this,r.values.subarray(0,r.length*r.stride))}function Ls(r){let{length:t,values:e,valueOffsets:i}=r,n=R(i[0]),s=R(i[t]),o=Math.min(s-n,e.byteLength-n);return ae.call(this,dn(-n,t+1,i)),ae.call(this,e.subarray(n,n+o)),this}function No(r){let{length:t,valueOffsets:e}=r;if(e){let{[0]:i,[t]:n}=e;return ae.call(this,dn(-i,t+1,e)),this.visit(r.children[0].slice(i,n-i))}return this.visit(r.children[0])}function Lo(r){return this.visitMany(r.type.children.map((t,e)=>r.children[e]).filter(Boolean))[0]}q.prototype.visitBool=Zu;q.prototype.visitInt=He;q.prototype.visitFloat=He;q.prototype.visitUtf8=Ls;q.prototype.visitLargeUtf8=Ls;q.prototype.visitBinary=Ls;q.prototype.visitLargeBinary=Ls;q.prototype.visitFixedSizeBinary=He;q.prototype.visitDate=He;q.prototype.visitTimestamp=He;q.prototype.visitTime=He;q.prototype.visitDecimal=He;q.prototype.visitList=No;q.prototype.visitStruct=Lo;q.prototype.visitUnion=Ju;q.prototype.visitInterval=He;q.prototype.visitDuration=He;q.prototype.visitFixedSizeList=No;q.prototype.visitMap=No;var Ar=class extends gr{static throughNode(t){throw new Error('"throughNode" not available in this environment')}static throughDOM(t,e){throw new Error('"throughDOM" not available in this environment')}constructor(t){super(),this._position=0,this._started=!1,this._sink=new me,this._schema=null,this._dictionaryBlocks=[],this._recordBatchBlocks=[],this._seenDictionaries=new Map,this._dictionaryDeltaOffsets=new Map,mt(t)||(t={autoDestroy:!0,writeLegacyIpcFormat:!1}),this._autoDestroy=typeof t.autoDestroy=="boolean"?t.autoDestroy:!0,this._writeLegacyIpcFormat=typeof t.writeLegacyIpcFormat=="boolean"?t.writeLegacyIpcFormat:!1}toString(t=!1){return this._sink.toString(t)}toUint8Array(t=!1){return this._sink.toUint8Array(t)}writeAll(t){return Ot(t)?t.then(e=>this.writeAll(e)):Ct(t)?Eo(this,t):Uo(this,t)}get closed(){return this._sink.closed}[Symbol.asyncIterator](){return this._sink[Symbol.asyncIterator]()}toDOMStream(t){return this._sink.toDOMStream(t)}toNodeStream(t){return this._sink.toNodeStream(t)}close(){return this.reset()._sink.close()}abort(t){return this.reset()._sink.abort(t)}finish(){return this._autoDestroy?this.close():this.reset(this._sink,this._schema),this}reset(t=this._sink,e=null){return t===this._sink||t instanceof me?this._sink=t:(this._sink=new me,t&&Wo(t)?this.toDOMStream({type:"bytes"}).pipeTo(t):t&&Ho(t)&&this.toNodeStream({objectMode:!1}).pipe(t)),this._started&&this._schema&&this._writeFooter(this._schema),this._started=!1,this._dictionaryBlocks=[],this._recordBatchBlocks=[],this._seenDictionaries=new Map,this._dictionaryDeltaOffsets=new Map,(!e||!Sr(e,this._schema))&&(e==null?(this._position=0,this._schema=null):(this._started=!0,this._schema=e,this._writeSchema(e))),this}write(t){let e=null;if(this._sink){if(t==null)return this.finish()&&void 0;if(t instanceof St&&!(e=t.schema))return this.finish()&&void 0;if(t instanceof tt&&!(e=t.schema))return this.finish()&&void 0}else throw new Error("RecordBatchWriter is closed");if(e&&!Sr(e,this._schema)){if(this._started&&this._autoDestroy)return this.close();this.reset(this._sink,e)}t instanceof tt?t instanceof Br||this._writeRecordBatch(t):t instanceof St?this.writeAll(t.batches):Yt(t)&&this.writeAll(t)}_writeMessage(t,e=8){let i=e-1,n=Dt.encode(t),s=n.byteLength,o=this._writeLegacyIpcFormat?4:8,a=s+o+i&~i,c=a-s-o;return t.headerType===E.RecordBatch?this._recordBatchBlocks.push(new Re(a,t.bodyLength,this._position)):t.headerType===E.DictionaryBatch&&this._dictionaryBlocks.push(new Re(a,t.bodyLength,this._position)),this._writeLegacyIpcFormat||this._write(Int32Array.of(-1)),this._write(Int32Array.of(a-o)),s>0&&this._write(n),this._writePadding(c)}_write(t){if(this._started){let e=S(t);e&&e.byteLength>0&&(this._sink.write(e),this._position+=e.byteLength)}return this}_writeSchema(t){return this._writeMessage(Dt.from(t))}_writeFooter(t){return this._writeLegacyIpcFormat?this._write(Int32Array.of(0)):this._write(Int32Array.of(-1,0))}_writeMagic(){return this._write(Kr)}_writePadding(t){return t>0?this._write(new Uint8Array(t)):this}_writeRecordBatch(t){let{byteLength:e,nodes:i,bufferRegions:n,buffers:s}=q.assemble(t),o=new ht(t.numRows,i,n),a=Dt.from(o,e);return this._writeDictionaries(t)._writeMessage(a)._writeBodyBuffers(s)}_writeDictionaryBatch(t,e,i=!1){let{byteLength:n,nodes:s,bufferRegions:o,buffers:a}=q.assemble(new V([t])),c=new ht(t.length,s,o),l=new xt(c,e,i),d=Dt.from(l,n);return this._writeMessage(d)._writeBodyBuffers(a)}_writeBodyBuffers(t){let e,i,n;for(let s=-1,o=t.length;++s0&&(this._write(e),(n=(i+7&-8)-i)>0&&this._writePadding(n));return this}_writeDictionaries(t){var e,i;for(let[n,s]of t.dictionaries){let o=(e=s?.data)!==null&&e!==void 0?e:[],a=this._seenDictionaries.get(n),c=(i=this._dictionaryDeltaOffsets.get(n))!==null&&i!==void 0?i:0;if(!a||a.data[0]!==o[0])for(let[l,d]of o.entries())this._writeDictionaryBatch(d,n,l>0);else if(ci.writeAll(n)):Ct(t)?Eo(i,t):Uo(i,t)}},en=class r extends Ar{static writeAll(t){let e=new r;return Ot(t)?t.then(i=>e.writeAll(i)):Ct(t)?Eo(e,t):Uo(e,t)}constructor(){super(),this._autoDestroy=!0}_writeSchema(t){return this._writeMagic()._writePadding(2)}_writeDictionaryBatch(t,e,i=!1){if(!i&&this._seenDictionaries.has(e))throw new Error("The Arrow File format does not support replacement dictionaries. ");return super._writeDictionaryBatch(t,e,i)}_writeFooter(t){let e=Ve.encode(new Ve(t,j.V5,this._recordBatchBlocks,this._dictionaryBlocks));return super._writeFooter(t)._write(e)._write(Int32Array.of(e.byteLength))._writeMagic()}};function Uo(r,t){let e=t;t instanceof St&&(e=t.batches,r.reset(void 0,t.schema));for(let i of e)r.write(i);return r.finish()}function Eo(r,t){return f(this,void 0,void 0,function*(){var e,i,n,s,o,a,c;try{for(e=!0,i=Ht(t);n=yield i.next(),s=n.done,!s;e=!0){c=n.value,e=!1;let l=c;r.write(l)}}catch(l){o={error:l}}finally{try{!e&&!s&&(a=i.return)&&(yield a.call(i))}finally{if(o)throw o.error}}return r.finish()})}function Fc(r,t){if(Ct(r))return Ku(r,t);if(Yt(r))return Xu(r,t);throw new Error("toDOMStream() must be called with an Iterable or AsyncIterable")}function Xu(r,t){let e=null,i=t?.type==="bytes"||!1,n=t?.highWaterMark||Math.pow(2,24);return new ReadableStream(Object.assign(Object.assign({},t),{start(o){s(o,e||(e=r[Symbol.iterator]()))},pull(o){e?s(o,e):o.close()},cancel(){(e?.return&&e.return()||!0)&&(e=null)}}),Object.assign({highWaterMark:i?n:void 0},t));function s(o,a){let c,l=null,d=o.desiredSize||null;for(;!(l=a.next(i?d:null)).done;)if(ArrayBuffer.isView(l.value)&&(c=S(l.value))&&(d!=null&&i&&(d=d-c.byteLength+1),l.value=c),o.enqueue(l.value),d!=null&&--d<=0)return;o.close()}}function Ku(r,t){let e=null,i=t?.type==="bytes"||!1,n=t?.highWaterMark||Math.pow(2,24);return new ReadableStream(Object.assign(Object.assign({},t),{start(o){return f(this,void 0,void 0,function*(){yield s(o,e||(e=r[Symbol.asyncIterator]()))})},pull(o){return f(this,void 0,void 0,function*(){e?yield s(o,e):o.close()})},cancel(){return f(this,void 0,void 0,function*(){(e?.return&&(yield e.return())||!0)&&(e=null)})}}),Object.assign({highWaterMark:i?n:void 0},t));function s(o,a){return f(this,void 0,void 0,function*(){let c,l=null,d=o.desiredSize||null;for(;!(l=yield a.next(i?d:null)).done;)if(ArrayBuffer.isView(l.value)&&(c=S(l.value))&&(d!=null&&i&&(d=d-c.byteLength+1),l.value=c),o.enqueue(l.value),d!=null&&--d<=0)return;o.close()})}}function Lc(r){return new Vo(r)}var Vo=class{constructor(t){this._numChunks=0,this._finished=!1,this._bufferedSize=0;let{["readableStrategy"]:e,["writableStrategy"]:i,["queueingStrategy"]:n="count"}=t,s=zo(t,["readableStrategy","writableStrategy","queueingStrategy"]);this._controller=null,this._builder=_r(s),this._getSize=n!=="bytes"?Tc:Mc;let{["highWaterMark"]:o=n==="bytes"?Math.pow(2,14):1e3}=Object.assign({},e),{["highWaterMark"]:a=n==="bytes"?Math.pow(2,14):1e3}=Object.assign({},i);this.readable=new ReadableStream({cancel:()=>{this._builder.clear()},pull:c=>{this._maybeFlush(this._builder,this._controller=c)},start:c=>{this._maybeFlush(this._builder,this._controller=c)}},{highWaterMark:o,size:n!=="bytes"?Tc:Mc}),this.writable=new WritableStream({abort:()=>{this._builder.clear()},write:()=>{this._maybeFlush(this._builder,this._controller)},close:()=>{this._maybeFlush(this._builder.finish(),this._controller)}},{highWaterMark:a,size:c=>this._writeValueAndReturnChunkSize(c)})}_writeValueAndReturnChunkSize(t){let e=this._bufferedSize;return this._bufferedSize=this._getSize(this._builder.append(t)),this._bufferedSize-e}_maybeFlush(t,e){e!=null&&(this._bufferedSize>=e.desiredSize&&++this._numChunks&&this._enqueue(e,t.toVector()),t.finished&&((t.length>0||this._numChunks===0)&&++this._numChunks&&this._enqueue(e,t.toVector()),!this._finished&&(this._finished=!0)&&this._enqueue(e,null)))}_enqueue(t,e){this._bufferedSize=0,this._controller=null,e==null?t.close():t.enqueue(e)}},Tc=r=>{var t;return(t=r?.length)!==null&&t!==void 0?t:0},Mc=r=>{var t;return(t=r?.byteLength)!==null&&t!==void 0?t:0};function Ns(r,t){let e=new me,i=null,n=new ReadableStream({cancel(){return f(this,void 0,void 0,function*(){yield e.close()})},start(a){return f(this,void 0,void 0,function*(){yield o(a,i||(i=yield s()))})},pull(a){return f(this,void 0,void 0,function*(){i?yield o(a,i):a.close()})}});return{writable:new WritableStream(e,Object.assign({highWaterMark:Math.pow(2,14)},r)),readable:n};function s(){return f(this,void 0,void 0,function*(){return yield(yield Et.from(e)).open(t)})}function o(a,c){return f(this,void 0,void 0,function*(){let l=a.desiredSize,d=null;for(;!(d=yield c.next()).done;)if(a.enqueue(d.value),l!=null&&--l<=0)return;a.close()})}}function Us(r,t){let e=new this(r),i=new jt(e),n=new ReadableStream({cancel(){return f(this,void 0,void 0,function*(){yield i.cancel()})},pull(o){return f(this,void 0,void 0,function*(){yield s(o)})},start(o){return f(this,void 0,void 0,function*(){yield s(o)})}},Object.assign({highWaterMark:Math.pow(2,14)},t));return{writable:new WritableStream(e,r),readable:n};function s(o){return f(this,void 0,void 0,function*(){let a=null,c=o.desiredSize;for(;a=yield i.read(c||null);)if(o.enqueue(a),c!=null&&(c-=a.byteLength)<=0)return;o.close()})}}function rn(r){let t=Et.from(r);return Ot(t)?t.then(e=>rn(e)):t.isAsync()?t.readAll().then(e=>new St(e)):new St(t.readAll())}var Qu=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},Gs),_o),lo),Js),Ps),co),$s),{compareSchemas:Sr,compareFields:oc,compareTypes:ac});ut.toDOMStream=Fc;X.throughDOM=Lc;Et.throughDOM=Ns;Dr.throughDOM=Ns;We.throughDOM=Ns;Ar.throughDOM=Us;en.throughDOM=Us;tn.throughDOM=Us;function Ro(r,t="number"){return r==null||!Number.isFinite(r)?"\u2014":t==="currency"?`$${Number(r).toFixed(2)}`:Number(r).toLocaleString()}function Co(r){if(!r)return"";if(typeof r=="string")return r.slice(0,10);if(r instanceof Date)return r.toISOString().slice(0,10);if(typeof r=="number"||typeof r=="bigint"){let t=typeof r=="bigint"?Number(r):r;return t>1e12?new Date(t).toISOString().slice(0,10):t>1e9?new Date(t*1e3).toISOString().slice(0,10):new Date(t*864e5).toISOString().slice(0,10)}return String(r).slice(0,10)}function td(r){return new Date(r+"T00:00:00Z").toLocaleDateString("en-US",{month:"short",day:"numeric"})}function ed(r,t){let e=new Date(r+"T00:00:00Z"),i=new Date(t+"T00:00:00Z"),n=e.getFullYear()===i.getFullYear(),s=e.toLocaleDateString("en-US",{month:"short",day:"numeric",year:n?void 0:"numeric"}),o=i.toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"});return`${s} \u2013 ${o}`}function Nc(r){if(!r||r.byteLength!==void 0&&r.byteLength===0)return null;let t;if(r instanceof DataView)t=new Uint8Array(r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength));else if(r instanceof Uint8Array)t=r;else if(r instanceof ArrayBuffer)t=new Uint8Array(r);else return console.error("Unknown data type:",r),null;let e=rn(t),i=[];for(let n=0;n1?r.length-1:1,i=Math.min(...r),s=Math.max(...r)-i||1,a=r.map((l,d)=>{let h=d,F=t-(l-i)/s*t;return[h.toFixed(2),F.toFixed(2)]}).map(([l,d])=>`${l},${d}`).join(" "),c=`0,${t} ${a} ${e},${t}`;return` + + + + + `}function id(){let r=document.createElement("div");return r.className="metric-skeleton",r.innerHTML=` +
+
+
+
+
+
+
+
+
+
+
+ `,r}function nd(r){let t=document.createElement("div");return t.className="skeleton-card",t.innerHTML=` +
+ ${Array(6).fill(0).map(()=>` +
+
+
+ `).join("")} + `,t}function sd(r,t,e,i,n,s,o,a){let c=i&&i.length===2?ed(i[0],i[1]):"",l=r.key===n,d=Ro(e,r.format),h=document.createElement("div");h.className=`metric-card${l?" active":""}`,h.dataset.metric=r.key,h.innerHTML=` +
+
+

${r.label}

+ ${c} +
+
+
${d}
+
+
+
+ ${rd(t)} +
+
+
+ `;let F=h.querySelector(".sparkline-wrap"),L=h.querySelector(".hover-line"),H=h.querySelector(".brush-selection"),Wt=h.querySelector(".metric-range"),Ye=h.querySelector(".metric-value"),K=null,Ge=c,Or=d;return F.addEventListener("pointermove",Vt=>{if(K)return;let ct=F.getBoundingClientRect(),bt=(Vt.clientX-ct.left)/ct.width,T=Math.max(0,Math.min(t.length-1,Math.round(bt*(t.length-1))));L.style.left=`${bt*100}%`,L.style.opacity="1",s&&s[T]&&(Wt.textContent=td(s[T])),Ye.textContent=Ro(t[T],r.format)}),F.addEventListener("pointerleave",()=>{K||(L.style.opacity="0",Wt.textContent=Ge,Ye.textContent=Or)}),F.addEventListener("pointerdown",Vt=>{F.setPointerCapture(Vt.pointerId);let ct=F.getBoundingClientRect(),ft=Vt.clientX-ct.left;K={startX:ft,rect:ct},H.style.left=`${ft/ct.width*100}%`,H.style.width="0",H.style.display="block",L.style.opacity="0"}),F.addEventListener("pointermove",Vt=>{if(!K)return;let{startX:ct,rect:ft}=K,bt=Vt.clientX-ft.left,T=Math.min(ct,bt),Z=Math.abs(bt-ct);H.style.left=`${T/ft.width*100}%`,H.style.width=`${Z/ft.width*100}%`}),F.addEventListener("pointerup",Vt=>{if(!K)return;let{startX:ct,rect:ft}=K,bt=Vt.clientX-ft.left,T=ft.width;if(F.releasePointerCapture(Vt.pointerId),Math.abs(bt-ct)>6&&s&&s.length>0){let Z=Math.max(0,Math.min(1,ct/T)),z=Math.max(0,Math.min(1,bt/T)),_t=Math.round(Z*(s.length-1)),nt=Math.round(z*(s.length-1)),Rt=Math.min(_t,nt),be=Math.max(_t,nt);a&&a(s[Rt],s[be])}K=null,H.style.display="none"}),F.addEventListener("dblclick",()=>{a&&a(null,null)}),h}function od(r,t,e,i,n){let s=Math.max(...t.map(a=>Number(a[e])||0),1),o=document.createElement("div");return o.className="dim-card",o.dataset.dim=r.key,o.innerHTML=`

${r.label}

`,t.forEach(a=>{let c=a[r.key],l=Number(a[e])||0,d=Math.round(l/s*100),h=document.createElement("div"),F=i[r.key]&&i[r.key].includes(String(c));h.className=`dim-row${F?" active":""}`,h.dataset.value=String(c),h.innerHTML=` +
+ ${c} + ${Ro(l)} + `,h.addEventListener("click",()=>{n(r.key,String(c))}),o.appendChild(h)}),o}function ad(r,t,e,i,n,s){r.innerHTML="";let o=!1;if(i&&i.length===2&&i[0]&&i[1]){o=!0;let a=document.createElement("span");a.className="pill",a.textContent=`Date: ${Co(i[0])} \u2192 ${Co(i[1])} \xD7`,a.addEventListener("click",s),r.appendChild(a)}if(Object.entries(t).forEach(([a,c])=>{c&&c.length>0&&c.forEach(l=>{o=!0;let d=document.createElement("span");d.className="pill",d.textContent=`${a}: ${l} \xD7`,d.addEventListener("click",()=>n(a,l)),r.appendChild(d)})}),!o){let a=document.createElement("span");a.className="pill muted",a.textContent="No filters",r.appendChild(a)}}function cd({model:r,el:t}){t.innerHTML=` +
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+ `;let e=t.querySelector(".filter-pills"),i=t.querySelector(".metrics-col"),n=t.querySelector(".dimensions-grid"),s=t.querySelector(".metric-select"),o=t.querySelector(".grain-select"),a=t.querySelector(".widget-status"),c=null;function l(){return r.get("filters")||{}}function d(T){r.set("filters",T),r.save_changes()}function h(){c&&clearTimeout(c),c=setTimeout(()=>{r.set("active_dimension",""),r.save_changes()},400)}function F(){c&&(clearTimeout(c),c=null),r.set("active_dimension","")}function L(T,Z){let z={...l()},_t=z[T]||[];r.set("active_dimension",T),_t.includes(Z)?(z[T]=_t.filter(nt=>nt!==Z),z[T].length===0&&delete z[T]):z[T]=[..._t,Z],d(z),h()}function H(T,Z){let z={...l()},_t=z[T]||[];F(),z[T]=_t.filter(nt=>nt!==Z),z[T].length===0&&delete z[T],d(z)}function Wt(T,Z){T&&Z?(F(),r.set("brush_selection",[T,Z])):r.set("brush_selection",[]),r.save_changes()}function Ye(){F(),r.set("brush_selection",[]),r.save_changes()}function K(){let T=r.get("metrics_config")||[],Z=r.get("selected_metric")||"",z=r.get("date_range")||[],_t=r.get("metric_totals")||{},nt=r.get("metric_series_data");if(!nt||nt.byteLength!==void 0&&nt.byteLength===0){i.innerHTML="",T.forEach(()=>{i.appendChild(id())});return}try{let Rt=Nc(nt);if(!Rt){i.innerHTML='
Failed to parse data
';return}let be=Object.keys(Rt[0]||{}).find(vt=>vt.includes("time")||vt.includes("date")||vt==="__time"),ar=be?Rt.map(vt=>Co(vt[be])):[];i.innerHTML="",T.forEach(vt=>{let ko=Rt.map(ei=>Number(ei[vt.key])||0),Uc=_t[vt.key]??ko.reduce((ei,Ec)=>ei+Ec,0),Po=sd(vt,ko,Uc,z,Z,ar,null,Wt);Po.addEventListener("click",ei=>{ei.target.closest(".sparkline-wrap")||(r.set("selected_metric",vt.key),r.save_changes())}),i.appendChild(Po)})}catch(Rt){i.innerHTML=`
Error: ${Rt.message}
`}}function Ge(){let T=r.get("dimensions_config")||[],Z=r.get("dimension_data")||{},z=r.get("selected_metric")||"",_t=l();n.innerHTML="",T.forEach(nt=>{let Rt=Z[nt.key];if(!Rt||Rt.byteLength===0){n.appendChild(nd(nt.label));return}try{let be=Nc(Rt);if(!be){let vt=document.createElement("div");vt.className="dim-card error",vt.innerHTML=`

${nt.label}

Failed to parse data
`,n.appendChild(vt);return}let ar=od(nt,be,z,_t,L);n.appendChild(ar)}catch(be){let ar=document.createElement("div");ar.className="dim-card error",ar.innerHTML=`

${nt.label}

Error: ${be.message}
`,n.appendChild(ar)}})}function Or(){let T=l(),Z=r.get("date_range")||[],z=r.get("brush_selection")||[];ad(e,T,Z,z,H,Ye)}function Vt(){let T=r.get("metrics_config")||[],Z=r.get("selected_metric")||"";s.innerHTML=T.map(z=>``).join("")}function ct(){let T=r.get("time_grain_options")||[],Z=r.get("time_grain")||"";if(!T.length){o.innerHTML="",o.disabled=!0;return}o.disabled=!1,o.innerHTML=T.map(z=>{let _t=z.replace(/_/g," ").replace(/\b\w/g,nt=>nt.toUpperCase());return``}).join("")}function ft(){let T=r.get("status")||"loading",Z=r.get("error")||"";T==="error"&&Z?(a.textContent=`Error: ${Z}`,a.className="widget-status error"):T==="loading"?(a.textContent="Loading...",a.className="widget-status loading"):(a.textContent="",a.className="widget-status")}function bt(){ft(),Or(),Vt(),ct(),K(),Ge()}return s.addEventListener("change",T=>{F(),r.set("selected_metric",T.target.value),r.save_changes()}),o.addEventListener("change",T=>{r.set("time_grain",T.target.value),r.save_changes()}),r.on("change:metric_series_data",K),r.on("change:metric_totals",K),r.on("change:dimension_data",Ge),r.on("change:filters",()=>{Or(),Ge()}),r.on("change:brush_selection",Or),r.on("change:selected_metric",()=>{Vt(),K()}),r.on("change:time_grain",ct),r.on("change:status",ft),r.on("change:error",ft),r.on("change:metrics_config",bt),r.on("change:dimensions_config",bt),r.on("change:time_grain_options",ct),bt(),()=>{r.off("change:metric_series_data",K),r.off("change:metric_totals",K),r.off("change:dimension_data",Ge),r.off("change:filters"),r.off("change:brush_selection",Or),r.off("change:selected_metric"),r.off("change:time_grain",ct),r.off("change:status",ft),r.off("change:error",ft),r.off("change:metrics_config",bt),r.off("change:dimensions_config",bt),r.off("change:time_grain_options",ct)}}var jv={render:cd};export{jv as default}; diff --git a/uv.lock b/uv.lock index c344f9bc..58a5c079 100644 --- a/uv.lock +++ b/uv.lock @@ -5,7 +5,8 @@ resolution-markers = [ "python_full_version < '3.12'", "python_full_version == '3.12.*'", "python_full_version == '3.13.*' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", + "python_full_version >= '3.14' and platform_python_implementation == 'PyPy'", + "python_full_version == '3.13.*' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'", ] @@ -113,6 +114,117 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc", size = 109097, upload-time = "2025-09-23T09:19:10.601Z" }, ] +[[package]] +name = "anywidget" +version = "0.9.21" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipywidgets" }, + { name = "psygnal" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/5e/cbea445bf062b81e4d366ca29dae4f0aedc7a64f384afc24670e07bec560/anywidget-0.9.21.tar.gz", hash = "sha256:b8d0172029ac426573053c416c6a587838661612208bb390fa0607862e594b27", size = 390517, upload-time = "2025-11-12T17:06:03.035Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/03/c17464bbf682ea87e7e3de2ddc63395e359a78ae9c01f55fc78759ecbd79/anywidget-0.9.21-py3-none-any.whl", hash = "sha256:78c268e0fbdb1dfd15da37fb578f9cf0a0df58a430e68d9156942b7a9391a761", size = 231797, upload-time = "2025-11-12T17:06:01.564Z" }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, +] + +[[package]] +name = "argon2-cffi" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi-bindings", version = "21.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" }, + { name = "argon2-cffi-bindings", version = "25.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", size = 45706, upload-time = "2025-06-03T06:55:32.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741", size = 14657, upload-time = "2025-06-03T06:55:30.804Z" }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and platform_python_implementation == 'PyPy'", + "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'", +] +dependencies = [ + { name = "cffi", marker = "python_full_version >= '3.14'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/e9/184b8ccce6683b0aa2fbb7ba5683ea4b9c5763f1356347f1312c32e3c66e/argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", size = 1779911, upload-time = "2021-12-01T08:52:55.68Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/13/838ce2620025e9666aa8f686431f67a29052241692a3dd1ae9d3692a89d3/argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", size = 29658, upload-time = "2021-12-01T09:09:17.016Z" }, + { url = "https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", size = 80583, upload-time = "2021-12-01T09:09:19.546Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", size = 86168, upload-time = "2021-12-01T09:09:21.445Z" }, + { url = "https://files.pythonhosted.org/packages/74/f6/4a34a37a98311ed73bb80efe422fed95f2ac25a4cacc5ae1d7ae6a144505/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", size = 82709, upload-time = "2021-12-01T09:09:18.182Z" }, + { url = "https://files.pythonhosted.org/packages/74/2b/73d767bfdaab25484f7e7901379d5f8793cccbb86c6e0cbc4c1b96f63896/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", size = 83613, upload-time = "2021-12-01T09:09:22.741Z" }, + { url = "https://files.pythonhosted.org/packages/4f/fd/37f86deef67ff57c76f137a67181949c2d408077e2e3dd70c6c42912c9bf/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", size = 84583, upload-time = "2021-12-01T09:09:24.177Z" }, + { url = "https://files.pythonhosted.org/packages/6f/52/5a60085a3dae8fded8327a4f564223029f5f54b0cb0455a31131b5363a01/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", size = 88475, upload-time = "2021-12-01T09:09:26.673Z" }, + { url = "https://files.pythonhosted.org/packages/8b/95/143cd64feb24a15fa4b189a3e1e7efbaeeb00f39a51e99b26fc62fbacabd/argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", size = 27698, upload-time = "2021-12-01T09:09:27.87Z" }, + { url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", size = 30817, upload-time = "2021-12-01T09:09:30.267Z" }, + { url = "https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", size = 53104, upload-time = "2021-12-01T09:09:31.335Z" }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12'", + "python_full_version == '3.12.*'", + "python_full_version == '3.13.*' and platform_python_implementation != 'PyPy'", + "python_full_version == '3.13.*' and platform_python_implementation == 'PyPy'", +] +dependencies = [ + { name = "cffi", marker = "python_full_version < '3.14'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f", size = 54393, upload-time = "2025-07-30T10:01:40.97Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b", size = 29328, upload-time = "2025-07-30T10:01:41.916Z" }, + { url = "https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a", size = 31269, upload-time = "2025-07-30T10:01:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44", size = 86558, upload-time = "2025-07-30T10:01:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb", size = 92364, upload-time = "2025-07-30T10:01:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92", size = 85637, upload-time = "2025-07-30T10:01:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85", size = 91934, upload-time = "2025-07-30T10:01:47.203Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f", size = 28158, upload-time = "2025-07-30T10:01:48.341Z" }, + { url = "https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6", size = 32597, upload-time = "2025-07-30T10:01:49.112Z" }, + { url = "https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623", size = 28231, upload-time = "2025-07-30T10:01:49.92Z" }, + { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" }, + { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" }, + { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" }, + { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" }, + { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" }, + { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" }, +] + +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "asn1crypto" version = "1.5.1" @@ -122,6 +234,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c9/7f/09065fd9e27da0eda08b4d6897f1c13535066174cc023af248fc2a8d5e5a/asn1crypto-1.5.1-py2.py3-none-any.whl", hash = "sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67", size = 105045, upload-time = "2022-03-15T14:46:51.055Z" }, ] +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "async-lru" +version = "2.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/4d/71ec4d3939dc755264f680f6c2b4906423a304c3d18e96853f0a595dfe97/async_lru-2.0.5.tar.gz", hash = "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb", size = 10380, upload-time = "2025-03-16T17:25:36.919Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl", hash = "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943", size = 6069, upload-time = "2025-03-16T17:25:35.422Z" }, +] + [[package]] name = "attrs" version = "25.4.0" @@ -131,6 +261,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, ] +[[package]] +name = "babel" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, +] + +[[package]] +name = "bleach" +version = "6.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2" }, +] + [[package]] name = "boto3" version = "1.40.47" @@ -354,6 +523,15 @@ 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 = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + [[package]] name = "coverage" version = "7.10.7" @@ -498,7 +676,8 @@ resolution-markers = [ "python_full_version < '3.12'", "python_full_version == '3.12.*'", "python_full_version == '3.13.*' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", + "python_full_version >= '3.14' and platform_python_implementation == 'PyPy'", + "python_full_version == '3.13.*' and platform_python_implementation == 'PyPy'", ] dependencies = [ { name = "cffi", marker = "python_full_version < '3.14' and platform_python_implementation != 'PyPy'" }, @@ -580,6 +759,49 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/05/69/74fcf07b6ad65640a5f40c6cee6f14654bec7d19de80b30ed95dd0ef48be/databricks_sql_connector-2.9.6-py3-none-any.whl", hash = "sha256:d830abf86e71d2eb83c6a7b7264d6c03926a8a83cec58541ddd6b83d693bde8f", size = 298568, upload-time = "2024-04-18T17:39:32.461Z" }, ] +[[package]] +name = "debugpy" +version = "1.8.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/75/9e12d4d42349b817cd545b89247696c67917aab907012ae5b64bbfea3199/debugpy-1.8.19.tar.gz", hash = "sha256:eea7e5987445ab0b5ed258093722d5ecb8bb72217c5c9b1e21f64efe23ddebdb", size = 1644590, upload-time = "2025-12-15T21:53:28.044Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/e2/48531a609b5a2aa94c6b6853afdfec8da05630ab9aaa96f1349e772119e9/debugpy-1.8.19-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:c5dcfa21de1f735a4f7ced4556339a109aa0f618d366ede9da0a3600f2516d8b", size = 2207620, upload-time = "2025-12-15T21:53:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/1b/d4/97775c01d56071969f57d93928899e5616a4cfbbf4c8cc75390d3a51c4a4/debugpy-1.8.19-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:806d6800246244004625d5222d7765874ab2d22f3ba5f615416cf1342d61c488", size = 3170796, upload-time = "2025-12-15T21:53:38.513Z" }, + { url = "https://files.pythonhosted.org/packages/8d/7e/8c7681bdb05be9ec972bbb1245eb7c4c7b0679bb6a9e6408d808bc876d3d/debugpy-1.8.19-cp311-cp311-win32.whl", hash = "sha256:783a519e6dfb1f3cd773a9bda592f4887a65040cb0c7bd38dde410f4e53c40d4", size = 5164287, upload-time = "2025-12-15T21:53:40.857Z" }, + { url = "https://files.pythonhosted.org/packages/f2/a8/aaac7ff12ddf5d68a39e13a423a8490426f5f661384f5ad8d9062761bd8e/debugpy-1.8.19-cp311-cp311-win_amd64.whl", hash = "sha256:14035cbdbb1fe4b642babcdcb5935c2da3b1067ac211c5c5a8fdc0bb31adbcaa", size = 5188269, upload-time = "2025-12-15T21:53:42.359Z" }, + { url = "https://files.pythonhosted.org/packages/4a/15/d762e5263d9e25b763b78be72dc084c7a32113a0bac119e2f7acae7700ed/debugpy-1.8.19-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:bccb1540a49cde77edc7ce7d9d075c1dbeb2414751bc0048c7a11e1b597a4c2e", size = 2549995, upload-time = "2025-12-15T21:53:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/a7/88/f7d25c68b18873b7c53d7c156ca7a7ffd8e77073aa0eac170a9b679cf786/debugpy-1.8.19-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:e9c68d9a382ec754dc05ed1d1b4ed5bd824b9f7c1a8cd1083adb84b3c93501de", size = 4309891, upload-time = "2025-12-15T21:53:45.26Z" }, + { url = "https://files.pythonhosted.org/packages/c5/4f/a65e973aba3865794da65f71971dca01ae66666132c7b2647182d5be0c5f/debugpy-1.8.19-cp312-cp312-win32.whl", hash = "sha256:6599cab8a783d1496ae9984c52cb13b7c4a3bd06a8e6c33446832a5d97ce0bee", size = 5286355, upload-time = "2025-12-15T21:53:46.763Z" }, + { url = "https://files.pythonhosted.org/packages/d8/3a/d3d8b48fec96e3d824e404bf428276fb8419dfa766f78f10b08da1cb2986/debugpy-1.8.19-cp312-cp312-win_amd64.whl", hash = "sha256:66e3d2fd8f2035a8f111eb127fa508469dfa40928a89b460b41fd988684dc83d", size = 5328239, upload-time = "2025-12-15T21:53:48.868Z" }, + { url = "https://files.pythonhosted.org/packages/71/3d/388035a31a59c26f1ecc8d86af607d0c42e20ef80074147cd07b180c4349/debugpy-1.8.19-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:91e35db2672a0abaf325f4868fcac9c1674a0d9ad9bb8a8c849c03a5ebba3e6d", size = 2538859, upload-time = "2025-12-15T21:53:50.478Z" }, + { url = "https://files.pythonhosted.org/packages/4a/19/c93a0772d0962294f083dbdb113af1a7427bb632d36e5314297068f55db7/debugpy-1.8.19-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:85016a73ab84dea1c1f1dcd88ec692993bcbe4532d1b49ecb5f3c688ae50c606", size = 4292575, upload-time = "2025-12-15T21:53:51.821Z" }, + { url = "https://files.pythonhosted.org/packages/5c/56/09e48ab796b0a77e3d7dc250f95251832b8bf6838c9632f6100c98bdf426/debugpy-1.8.19-cp313-cp313-win32.whl", hash = "sha256:b605f17e89ba0ecee994391194285fada89cee111cfcd29d6f2ee11cbdc40976", size = 5286209, upload-time = "2025-12-15T21:53:53.602Z" }, + { url = "https://files.pythonhosted.org/packages/fb/4e/931480b9552c7d0feebe40c73725dd7703dcc578ba9efc14fe0e6d31cfd1/debugpy-1.8.19-cp313-cp313-win_amd64.whl", hash = "sha256:c30639998a9f9cd9699b4b621942c0179a6527f083c72351f95c6ab1728d5b73", size = 5328206, upload-time = "2025-12-15T21:53:55.433Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b9/cbec520c3a00508327476c7fce26fbafef98f412707e511eb9d19a2ef467/debugpy-1.8.19-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:1e8c4d1bd230067bf1bbcdbd6032e5a57068638eb28b9153d008ecde288152af", size = 2537372, upload-time = "2025-12-15T21:53:57.318Z" }, + { url = "https://files.pythonhosted.org/packages/88/5e/cf4e4dc712a141e10d58405c58c8268554aec3c35c09cdcda7535ff13f76/debugpy-1.8.19-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d40c016c1f538dbf1762936e3aeb43a89b965069d9f60f9e39d35d9d25e6b809", size = 4268729, upload-time = "2025-12-15T21:53:58.712Z" }, + { url = "https://files.pythonhosted.org/packages/82/a3/c91a087ab21f1047db328c1d3eb5d1ff0e52de9e74f9f6f6fa14cdd93d58/debugpy-1.8.19-cp314-cp314-win32.whl", hash = "sha256:0601708223fe1cd0e27c6cce67a899d92c7d68e73690211e6788a4b0e1903f5b", size = 5286388, upload-time = "2025-12-15T21:54:00.687Z" }, + { url = "https://files.pythonhosted.org/packages/17/b8/bfdc30b6e94f1eff09f2dc9cc1f9cd1c6cde3d996bcbd36ce2d9a4956e99/debugpy-1.8.19-cp314-cp314-win_amd64.whl", hash = "sha256:8e19a725f5d486f20e53a1dde2ab8bb2c9607c40c00a42ab646def962b41125f", size = 5327741, upload-time = "2025-12-15T21:54:02.148Z" }, + { url = "https://files.pythonhosted.org/packages/25/3e/e27078370414ef35fafad2c06d182110073daaeb5d3bf734b0b1eeefe452/debugpy-1.8.19-py2.py3-none-any.whl", hash = "sha256:360ffd231a780abbc414ba0f005dad409e71c78637efe8f2bd75837132a41d38", size = 5292321, upload-time = "2025-12-15T21:54:16.024Z" }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, +] + [[package]] name = "docutils" version = "0.22.2" @@ -627,6 +849,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload-time = "2024-10-25T17:25:39.051Z" }, ] +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + [[package]] name = "fakesnow" version = "0.10.2" @@ -641,6 +872,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/43/d891a735aec97cfb34c8f7644e6b8ec34c03144e3cf725a8d5c6f379a255/fakesnow-0.10.2-py3-none-any.whl", hash = "sha256:fae0399dc0da5178391dee2adb809baa3a1a7c566b4bfe3afff7537e1948c607", size = 74106, upload-time = "2025-09-28T00:40:27.989Z" }, ] +[[package]] +name = "fastjsonschema" +version = "2.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, +] + [[package]] name = "filelock" version = "3.19.1" @@ -650,6 +890,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload-time = "2025-08-14T16:56:01.633Z" }, ] +[[package]] +name = "fqdn" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015, upload-time = "2021-03-11T07:16:29.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload-time = "2021-03-11T07:16:28.351Z" }, +] + [[package]] name = "future" version = "1.0.0" @@ -786,6 +1035,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/de/f28ced0a67749cac23fecb02b694f6473f47686dff6afaa211d186e2ef9c/greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2", size = 272305, upload-time = "2025-08-07T13:15:41.288Z" }, { url = "https://files.pythonhosted.org/packages/09/16/2c3792cba130000bf2a31c5272999113f4764fd9d874fb257ff588ac779a/greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246", size = 632472, upload-time = "2025-08-07T13:42:55.044Z" }, { url = "https://files.pythonhosted.org/packages/ae/8f/95d48d7e3d433e6dae5b1682e4292242a53f22df82e6d3dda81b1701a960/greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3", size = 644646, upload-time = "2025-08-07T13:45:26.523Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5e/405965351aef8c76b8ef7ad370e5da58d57ef6068df197548b015464001a/greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633", size = 640519, upload-time = "2025-08-07T13:53:13.928Z" }, { url = "https://files.pythonhosted.org/packages/25/5d/382753b52006ce0218297ec1b628e048c4e64b155379331f25a7316eb749/greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079", size = 639707, upload-time = "2025-08-07T13:18:27.146Z" }, { url = "https://files.pythonhosted.org/packages/1f/8e/abdd3f14d735b2929290a018ecf133c901be4874b858dd1c604b9319f064/greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", size = 587684, upload-time = "2025-08-07T13:18:25.164Z" }, { url = "https://files.pythonhosted.org/packages/5d/65/deb2a69c3e5996439b0176f6651e0052542bb6c8f8ec2e3fba97c9768805/greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", size = 1116647, upload-time = "2025-08-07T13:42:38.655Z" }, @@ -796,6 +1046,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/44/69/9b804adb5fd0671f367781560eb5eb586c4d495277c93bde4307b9e28068/greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", size = 274079, upload-time = "2025-08-07T13:15:45.033Z" }, { url = "https://files.pythonhosted.org/packages/46/e9/d2a80c99f19a153eff70bc451ab78615583b8dac0754cfb942223d2c1a0d/greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", size = 640997, upload-time = "2025-08-07T13:42:56.234Z" }, { url = "https://files.pythonhosted.org/packages/3b/16/035dcfcc48715ccd345f3a93183267167cdd162ad123cd93067d86f27ce4/greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968", size = 655185, upload-time = "2025-08-07T13:45:27.624Z" }, + { url = "https://files.pythonhosted.org/packages/31/da/0386695eef69ffae1ad726881571dfe28b41970173947e7c558d9998de0f/greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9", size = 649926, upload-time = "2025-08-07T13:53:15.251Z" }, { url = "https://files.pythonhosted.org/packages/68/88/69bf19fd4dc19981928ceacbc5fd4bb6bc2215d53199e367832e98d1d8fe/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6", size = 651839, upload-time = "2025-08-07T13:18:30.281Z" }, { url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload-time = "2025-08-07T13:18:28.544Z" }, { url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload-time = "2025-08-07T13:42:39.858Z" }, @@ -806,6 +1057,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload-time = "2025-08-07T13:53:16.314Z" }, { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" }, { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, @@ -816,6 +1068,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" }, { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" }, { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload-time = "2025-08-07T13:45:30.969Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" }, { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" }, { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" }, { url = "https://files.pythonhosted.org/packages/23/6e/74407aed965a4ab6ddd93a7ded3180b730d281c77b765788419484cdfeef/greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269", size = 1612508, upload-time = "2025-11-04T12:42:23.427Z" }, @@ -965,6 +1218,92 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, ] +[[package]] +name = "ipykernel" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/a4/4948be6eb88628505b83a1f2f40d90254cab66abf2043b3c40fa07dfce0f/ipykernel-7.1.0.tar.gz", hash = "sha256:58a3fc88533d5930c3546dc7eac66c6d288acde4f801e2001e65edc5dc9cf0db", size = 174579, upload-time = "2025-10-27T09:46:39.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl", hash = "sha256:763b5ec6c5b7776f6a8d7ce09b267693b4e5ce75cb50ae696aaefb3c85e1ea4c", size = 117968, upload-time = "2025-10-27T09:46:37.805Z" }, +] + +[[package]] +name = "ipython" +version = "9.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/dd/fb08d22ec0c27e73c8bc8f71810709870d51cadaf27b7ddd3f011236c100/ipython-9.9.0.tar.gz", hash = "sha256:48fbed1b2de5e2c7177eefa144aba7fcb82dac514f09b57e2ac9da34ddb54220", size = 4425043, upload-time = "2026-01-05T12:36:46.233Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/92/162cfaee4ccf370465c5af1ce36a9eacec1becb552f2033bb3584e6f640a/ipython-9.9.0-py3-none-any.whl", hash = "sha256:b457fe9165df2b84e8ec909a97abcf2ed88f565970efba16b1f7229c283d252b", size = 621431, upload-time = "2026-01-05T12:36:44.669Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython" }, + { name = "jupyterlab-widgets" }, + { name = "traitlets" }, + { name = "widgetsnbextension" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" }, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649, upload-time = "2020-11-01T11:00:00.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload-time = "2020-11-01T10:59:58.02Z" }, +] + [[package]] name = "itsdangerous" version = "2.2.0" @@ -1007,6 +1346,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256, upload-time = "2022-06-17T18:00:10.251Z" }, ] +[[package]] +name = "json5" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/77/e8/a3f261a66e4663f22700bc8a17c08cb83e91fbf086726e7a228398968981/json5-0.13.0.tar.gz", hash = "sha256:b1edf8d487721c0bf64d83c28e91280781f6e21f4a797d3261c7c828d4c165bf", size = 52441, upload-time = "2026-01-01T19:42:14.99Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl", hash = "sha256:9a08e1dd65f6a4d4c6fa82d216cf2477349ec2346a38fd70cc11d2557499fbcc", size = 36163, upload-time = "2026-01-01T19:42:13.962Z" }, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114, upload-time = "2024-06-10T19:24:42.462Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -1022,6 +1379,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" }, ] +[package.optional-dependencies] +format-nongpl = [ + { name = "fqdn" }, + { name = "idna" }, + { name = "isoduration" }, + { name = "jsonpointer" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "rfc3987-syntax" }, + { name = "uri-template" }, + { name = "webcolors" }, +] + [[package]] name = "jsonschema-specifications" version = "2025.9.1" @@ -1034,6 +1404,178 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, ] +[[package]] +name = "jupyter-client" +version = "8.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + +[[package]] +name = "jupyter-events" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema", extra = ["format-nongpl"] }, + { name = "packaging" }, + { name = "python-json-logger" }, + { name = "pyyaml" }, + { name = "referencing" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b", size = 62196, upload-time = "2025-02-03T17:23:41.485Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", size = 19430, upload-time = "2025-02-03T17:23:38.643Z" }, +] + +[[package]] +name = "jupyter-lsp" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/5a/9066c9f8e94ee517133cd98dba393459a16cd48bba71a82f16a65415206c/jupyter_lsp-2.3.0.tar.gz", hash = "sha256:458aa59339dc868fb784d73364f17dbce8836e906cd75fd471a325cba02e0245", size = 54823, upload-time = "2025-08-27T17:47:34.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl", hash = "sha256:e914a3cb2addf48b1c7710914771aaf1819d46b2e5a79b0f917b5478ec93f34f", size = 76687, upload-time = "2025-08-27T17:47:33.15Z" }, +] + +[[package]] +name = "jupyter-server" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "argon2-cffi" }, + { name = "jinja2" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "jupyter-events" }, + { name = "jupyter-server-terminals" }, + { name = "nbconvert" }, + { name = "nbformat" }, + { name = "overrides", marker = "python_full_version < '3.12'" }, + { name = "packaging" }, + { name = "prometheus-client" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "pyzmq" }, + { name = "send2trash" }, + { name = "terminado" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/ac/e040ec363d7b6b1f11304cc9f209dac4517ece5d5e01821366b924a64a50/jupyter_server-2.17.0.tar.gz", hash = "sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5", size = 731949, upload-time = "2025-08-21T14:42:54.042Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl", hash = "sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f", size = 388221, upload-time = "2025-08-21T14:42:52.034Z" }, +] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "terminado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269", size = 31430, upload-time = "2024-03-12T14:37:03.049Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", size = 13656, upload-time = "2024-03-12T14:37:00.708Z" }, +] + +[[package]] +name = "jupyterlab" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-lru" }, + { name = "httpx" }, + { name = "ipykernel" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyter-lsp" }, + { name = "jupyter-server" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "packaging" }, + { name = "setuptools" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/21/413d142686a4e8f4268d985becbdb4daf060524726248e73be4773786987/jupyterlab-4.5.1.tar.gz", hash = "sha256:09da1ddfbd9eec18b5101dbb8515612aa1e47443321fb99503725a88e93d20d9", size = 23992251, upload-time = "2025-12-15T16:58:59.361Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/c3/acced767eecc11a70c65c45295db5396c4f0c1937874937d5a76d7b177b6/jupyterlab-4.5.1-py3-none-any.whl", hash = "sha256:31b059de96de0754ff1f2ce6279774b6aab8c34d7082e9752db58207c99bd514", size = 12384821, upload-time = "2025-12-15T16:58:55.563Z" }, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" }, +] + +[[package]] +name = "jupyterlab-server" +version = "2.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "jinja2" }, + { name = "json5" }, + { name = "jsonschema" }, + { name = "jupyter-server" }, + { name = "packaging" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/2c/90153f189e421e93c4bb4f9e3f59802a1f01abd2ac5cf40b152d7f735232/jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c", size = 76996, upload-time = "2025-10-22T13:59:18.37Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968", size = 59830, upload-time = "2025-10-22T13:59:16.767Z" }, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, +] + +[[package]] +name = "lark" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905", size = 382732, upload-time = "2025-10-27T18:25:56.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12", size = 113151, upload-time = "2025-10-27T18:25:54.882Z" }, +] + [[package]] name = "linkify-it-py" version = "2.0.3" @@ -1317,6 +1859,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] +[[package]] +name = "matplotlib-inline" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, +] + [[package]] name = "mcp" version = "1.16.0" @@ -1366,6 +1920,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "mistune" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/55/d01f0c4b45ade6536c51170b9043db8b2ec6ddf4a35c7ea3f5f559ac935b/mistune-3.2.0.tar.gz", hash = "sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a", size = 95467, upload-time = "2025-12-23T11:36:34.994Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl", hash = "sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1", size = 53598, upload-time = "2025-12-23T11:36:33.211Z" }, +] + [[package]] name = "msgspec" version = "0.19.0" @@ -1404,6 +1967,82 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/74/0d/bc630dfd34ad2150d40f9392e94d3803980e71a47e10a709ce9bfcd40ffe/narwhals-2.7.0-py3-none-any.whl", hash = "sha256:010791aa0cee86d90bf2b658264aaec3eeea34fb4ddf2e83746ea4940bcffae3", size = 412767, upload-time = "2025-10-06T09:39:35.564Z" }, ] +[[package]] +name = "nbclient" +version = "0.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9", size = 62554, upload-time = "2025-12-23T07:45:46.369Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440", size = 25465, upload-time = "2025-12-23T07:45:44.51Z" }, +] + +[[package]] +name = "nbconvert" +version = "7.16.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", extra = ["css"] }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715, upload-time = "2025-01-28T09:29:14.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525, upload-time = "2025-01-28T09:29:12.551Z" }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167, upload-time = "2024-02-14T23:35:18.353Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" }, +] + [[package]] name = "numpy" version = "2.3.3" @@ -1506,6 +2145,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload-time = "2024-06-28T14:03:41.161Z" }, ] +[[package]] +name = "overrides" +version = "7.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812, upload-time = "2024-01-27T21:01:33.423Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832, upload-time = "2024-01-27T21:01:31.393Z" }, +] + [[package]] name = "packaging" version = "25.0" @@ -1569,6 +2217,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, ] +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" }, +] + [[package]] name = "parso" version = "0.8.5" @@ -1578,6 +2235,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload-time = "2025-08-23T15:15:25.663Z" }, ] +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + [[package]] name = "platformdirs" version = "4.4.0" @@ -1605,6 +2274,53 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "polars" +version = "1.36.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "polars-runtime-32" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/dc/56f2a90c79a2cb13f9e956eab6385effe54216ae7a2068b3a6406bae4345/polars-1.36.1.tar.gz", hash = "sha256:12c7616a2305559144711ab73eaa18814f7aa898c522e7645014b68f1432d54c", size = 711993, upload-time = "2025-12-10T01:14:53.033Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/c6/36a1b874036b49893ecae0ac44a2f63d1a76e6212631a5b2f50a86e0e8af/polars-1.36.1-py3-none-any.whl", hash = "sha256:853c1bbb237add6a5f6d133c15094a9b727d66dd6a4eb91dbb07cdb056b2b8ef", size = 802429, upload-time = "2025-12-10T01:13:53.838Z" }, +] + +[[package]] +name = "polars-runtime-32" +version = "1.36.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/df/597c0ef5eb8d761a16d72327846599b57c5d40d7f9e74306fc154aba8c37/polars_runtime_32-1.36.1.tar.gz", hash = "sha256:201c2cfd80ceb5d5cd7b63085b5fd08d6ae6554f922bcb941035e39638528a09", size = 2788751, upload-time = "2025-12-10T01:14:54.172Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/ea/871129a2d296966c0925b078a9a93c6c5e7facb1c5eebfcd3d5811aeddc1/polars_runtime_32-1.36.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:327b621ca82594f277751f7e23d4b939ebd1be18d54b4cdf7a2f8406cecc18b2", size = 43494311, upload-time = "2025-12-10T01:13:56.096Z" }, + { url = "https://files.pythonhosted.org/packages/d8/76/0038210ad1e526ce5bb2933b13760d6b986b3045eccc1338e661bd656f77/polars_runtime_32-1.36.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ab0d1f23084afee2b97de8c37aa3e02ec3569749ae39571bd89e7a8b11ae9e83", size = 39300602, upload-time = "2025-12-10T01:13:59.366Z" }, + { url = "https://files.pythonhosted.org/packages/54/1e/2707bee75a780a953a77a2c59829ee90ef55708f02fc4add761c579bf76e/polars_runtime_32-1.36.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:899b9ad2e47ceb31eb157f27a09dbc2047efbf4969a923a6b1ba7f0412c3e64c", size = 44511780, upload-time = "2025-12-10T01:14:02.285Z" }, + { url = "https://files.pythonhosted.org/packages/11/b2/3fede95feee441be64b4bcb32444679a8fbb7a453a10251583053f6efe52/polars_runtime_32-1.36.1-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:d9d077bb9df711bc635a86540df48242bb91975b353e53ef261c6fae6cb0948f", size = 40688448, upload-time = "2025-12-10T01:14:05.131Z" }, + { url = "https://files.pythonhosted.org/packages/05/0f/e629713a72999939b7b4bfdbf030a32794db588b04fdf3dc977dd8ea6c53/polars_runtime_32-1.36.1-cp39-abi3-win_amd64.whl", hash = "sha256:cc17101f28c9a169ff8b5b8d4977a3683cd403621841623825525f440b564cf0", size = 44464898, upload-time = "2025-12-10T01:14:08.296Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d8/a12e6aa14f63784cead437083319ec7cece0d5bb9a5bfe7678cc6578b52a/polars_runtime_32-1.36.1-cp39-abi3-win_arm64.whl", hash = "sha256:809e73857be71250141225ddd5d2b30c97e6340aeaa0d445f930e01bef6888dc", size = 39798896, upload-time = "2025-12-10T01:14:11.568Z" }, +] + +[[package]] +name = "prometheus-client" +version = "0.23.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/53/3edb5d68ecf6b38fcbcc1ad28391117d2a322d9a1a3eff04bfdb184d8c3b/prometheus_client-0.23.1.tar.gz", hash = "sha256:6ae8f9081eaaaf153a2e959d2e6c4f4fb57b12ef76c8c7980202f1e57b48b2ce", size = 80481, upload-time = "2025-09-18T20:47:25.043Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl", hash = "sha256:dd1913e6e76b59cfe44e7a4b83e01afc9873c1bdfd2ed8739f1e76aeca115f99", size = 61145, upload-time = "2025-09-18T20:47:23.875Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + [[package]] name = "proto-plus" version = "1.26.1" @@ -1708,6 +2424,53 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5a/dd/464bd739bacb3b745a1c93bc15f20f0b1e27f0a64ec693367794b398673b/psycopg_binary-3.2.10-cp314-cp314-win_amd64.whl", hash = "sha256:d5c6a66a76022af41970bf19f51bc6bf87bd10165783dd1d40484bfd87d6b382", size = 2973554, upload-time = "2025-09-08T09:12:05.884Z" }, ] +[[package]] +name = "psygnal" +version = "0.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/79/20c3e23e75272e9ddf018097cf872ab088bccba978888472656629efa4a3/psygnal-0.15.1.tar.gz", hash = "sha256:f64f62dee2306fc1c22050a59b6c6cdad126e04b0cf50e393ff858a1da719096", size = 123147, upload-time = "2026-01-04T16:38:41.959Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/a7/69495410025cc4298765545ce3b8c635cd4c8d3a362b7fbbc15b80e9fc8f/psygnal-0.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1adc41515f648696990964433f1e25d8dfd306813a3645366c85e01986ba57a0", size = 581002, upload-time = "2026-01-04T16:38:12.753Z" }, + { url = "https://files.pythonhosted.org/packages/75/1f/19a8126ccf3cd3974ba5d08a435a049b666961d90f5848ba83599d7a29de/psygnal-0.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:38ff18455b2ac73d4e8eea82ef298ce904b52e4dfdc603a24380c9c440e37519", size = 567775, upload-time = "2026-01-04T16:38:14.04Z" }, + { url = "https://files.pythonhosted.org/packages/54/c5/b1348880d603edb82128a721397a1ddcf3dfcf5384fe5689db6e471118ae/psygnal-0.15.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c923c322eeefb1140886927cfe7bda7c32341087e290e812b9c69a624ab72d54", size = 855961, upload-time = "2026-01-04T16:38:15.612Z" }, + { url = "https://files.pythonhosted.org/packages/e6/42/3da2d6f3583bd1a849f7faa2fd3492b14bfda05012519ceaea5992658af0/psygnal-0.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2714ddaa41ea3134c0ee91cebd5fb11a88f254ea1d5948806ab0ad5f8be603d5", size = 862721, upload-time = "2026-01-04T16:38:17.059Z" }, + { url = "https://files.pythonhosted.org/packages/4d/14/6fc7e97fdecf7e8c5c105684bab784920312a3259800d8b53e3cf8783f42/psygnal-0.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:877516056a5a383427a647fff2fad5179eaa3e12de2c083c273e748435414aef", size = 415696, upload-time = "2026-01-04T16:38:18.355Z" }, + { url = "https://files.pythonhosted.org/packages/76/65/b7bbca96bc477aa9ac2264e5907b2f4ccfcd1319f776dd1f35eec06cc2f4/psygnal-0.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d56f0f35eaf4a21f660de76885222faf9e8c7112454528d3394d464f3d4d1a3", size = 598340, upload-time = "2026-01-04T16:38:19.752Z" }, + { url = "https://files.pythonhosted.org/packages/40/f2/56577465a1b42a5e6780bb5fab53fb68f8bfd72f0131ed397576529af724/psygnal-0.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0febcf757a1323d9b8bd75735ee3569213d8110012a7bf0f478e85c5ab459fc6", size = 575311, upload-time = "2026-01-04T16:38:21.137Z" }, + { url = "https://files.pythonhosted.org/packages/79/81/f642ac08104049383076f83480ed412c9626e068769a1c34873c595bec0e/psygnal-0.15.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b5e4837dfbfa4974dabe0795e32be9aadcd87603adf734738ce1114f72238a05", size = 889770, upload-time = "2026-01-04T16:38:22.629Z" }, + { url = "https://files.pythonhosted.org/packages/de/43/e571fa40b72780abed080ef829e5ad98017b6fe48d28c15a2404e006b676/psygnal-0.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:07b4c4e03bbf4e8cad7e25f4fbc1ba9575fb9c3d14991bc7edfeb8b09c8d6d54", size = 881105, upload-time = "2026-01-04T16:38:23.896Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/ef3ab825eb08eaecbbceeeb56383694fe64ce399dbfd1d0767bb85688785/psygnal-0.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:4f0ce91b9c18e92281bf2c3fc4bb4e808d90f0b023d0a37b302d354188520338", size = 418969, upload-time = "2026-01-04T16:38:25.731Z" }, + { url = "https://files.pythonhosted.org/packages/46/21/5a142165d27063abf5921807d3c3d973f5d44ab414a13b210839a43ead4d/psygnal-0.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2087aadc9404f007f79c2899e329932869e362c50de58b90631c5f49b4768cc5", size = 596768, upload-time = "2026-01-04T16:38:27.053Z" }, + { url = "https://files.pythonhosted.org/packages/e1/25/c1712931d61c118691e73daf29ef708c679ea9ba187c797dd5deee360411/psygnal-0.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f3bf68ca42569dfdce20c6cf915d34b78b9e3ddddacb9f78728224fda6946b4", size = 574808, upload-time = "2026-01-04T16:38:28.779Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4f/3593e5adb88a188c798604aed95fbc1479f30230e7f51e8f2c770e6a3832/psygnal-0.15.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e9fca977f5335deea39aed22e31d9795983e4f243e59a7d3c4105793adb7693d", size = 885616, upload-time = "2026-01-04T16:38:30.081Z" }, + { url = "https://files.pythonhosted.org/packages/58/4c/14779ed4c3a1d71fa1a9a87ecfb184ad3335dd64681067f77c1c47b14ae9/psygnal-0.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c85b7d05b92ccbec47c75ab8a5545eda462e81a492c82424aba5ab81a3ad89d", size = 876516, upload-time = "2026-01-04T16:38:31.422Z" }, + { url = "https://files.pythonhosted.org/packages/3e/bc/4f771e3cdcde4db4023dbf36d6f0aab44e02b9de719353c22954b655e2ff/psygnal-0.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:ac0e693b29e0a429e97315a52313321855bef6140e9975b7ae78b4d93c8fbb42", size = 419172, upload-time = "2026-01-04T16:38:32.82Z" }, + { url = "https://files.pythonhosted.org/packages/f4/2e/975bd61727578d88df62797f78390965ca7905780cf01eb59cb095a13638/psygnal-0.15.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:803fc33c4280c822c6f4b22e6c3ea7c4483e190f3cc69e69350098b3799476f3", size = 595706, upload-time = "2026-01-04T16:38:34.139Z" }, + { url = "https://files.pythonhosted.org/packages/b8/55/e487f1d91497eb75e86c3fdfef69a21b1cab24d023383dd7648b08797d6a/psygnal-0.15.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4f53b4b83355b0a785b745987fd04e59bbf169a9028ed81a68ca7e05fb76d458", size = 575133, upload-time = "2026-01-04T16:38:35.448Z" }, + { url = "https://files.pythonhosted.org/packages/bf/2f/f286355accd0e68d3eef52e63c8b9ab6ba33ec3107177719a036b3319657/psygnal-0.15.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bcbca12190f5aa65c1f8fb04a81fa6f4463c5f5dde25cd74c3a56ceff6f37b02", size = 889565, upload-time = "2026-01-04T16:38:37.003Z" }, + { url = "https://files.pythonhosted.org/packages/fc/dc/40c6026c88d7f9220ecc913afe0501045a512c9b82f9b7e036bb089dc287/psygnal-0.15.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1ac399566852fe4354ce26a1acbe12319232e8c2b615fe5ad1e114c547095cf6", size = 880863, upload-time = "2026-01-04T16:38:38.381Z" }, + { url = "https://files.pythonhosted.org/packages/b7/85/b4f45ec3057c473b5622fc002b3a636a698c34d3a0917a064ff5247f1984/psygnal-0.15.1-cp314-cp314-win_amd64.whl", hash = "sha256:d3a03055f331ce91d44581c71edb79938ccc133a94af2ce7ad3a18fa57ac7be5", size = 423654, upload-time = "2026-01-04T16:38:39.7Z" }, + { url = "https://files.pythonhosted.org/packages/46/49/7742544684bee728ec123515d2694cee859aa2a705951a461230b00f18cc/psygnal-0.15.1-py3-none-any.whl", hash = "sha256:4221140e633e45b076953c64bcb9b41a744833527f9a037c1ca98bc270798cbf", size = 90638, upload-time = "2026-01-04T16:38:40.841Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + [[package]] name = "pure-sasl" version = "0.6.2" @@ -2018,6 +2781,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, ] +[[package]] +name = "python-json-logger" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/29/bf/eca6a3d43db1dae7070f70e160ab20b807627ba953663ba07928cdd3dc58/python_json_logger-4.0.0.tar.gz", hash = "sha256:f58e68eb46e1faed27e0f574a55a0455eecd7b8a5b88b85a784519ba3cff047f", size = 17683, upload-time = "2025-10-06T04:15:18.984Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2", size = 15548, upload-time = "2025-10-06T04:15:17.553Z" }, +] + [[package]] name = "python-multipart" version = "0.0.20" @@ -2055,6 +2827,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, ] +[[package]] +name = "pywinpty" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/bb/a7cc2967c5c4eceb6cc49cfe39447d4bfc56e6c865e7c2249b6eb978935f/pywinpty-3.0.2.tar.gz", hash = "sha256:1505cc4cb248af42cb6285a65c9c2086ee9e7e574078ee60933d5d7fa86fb004", size = 30669, upload-time = "2025-10-03T21:16:29.205Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/a1/409c1651c9f874d598c10f51ff586c416625601df4bca315d08baec4c3e3/pywinpty-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:327790d70e4c841ebd9d0f295a780177149aeb405bca44c7115a3de5c2054b23", size = 2050304, upload-time = "2025-10-03T21:19:29.466Z" }, + { url = "https://files.pythonhosted.org/packages/02/4e/1098484e042c9485f56f16eb2b69b43b874bd526044ee401512234cf9e04/pywinpty-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:99fdd9b455f0ad6419aba6731a7a0d2f88ced83c3c94a80ff9533d95fa8d8a9e", size = 2050391, upload-time = "2025-10-03T21:19:01.642Z" }, + { url = "https://files.pythonhosted.org/packages/fc/19/b757fe28008236a4a713e813283721b8a40aa60cd7d3f83549f2e25a3155/pywinpty-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:18f78b81e4cfee6aabe7ea8688441d30247b73e52cd9657138015c5f4ee13a51", size = 2050057, upload-time = "2025-10-03T21:19:26.732Z" }, + { url = "https://files.pythonhosted.org/packages/cb/44/cbae12ecf6f4fa4129c36871fd09c6bef4f98d5f625ecefb5e2449765508/pywinpty-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:663383ecfab7fc382cc97ea5c4f7f0bb32c2f889259855df6ea34e5df42d305b", size = 2049874, upload-time = "2025-10-03T21:18:53.923Z" }, + { url = "https://files.pythonhosted.org/packages/ca/15/f12c6055e2d7a617d4d5820e8ac4ceaff849da4cb124640ef5116a230771/pywinpty-3.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:28297cecc37bee9f24d8889e47231972d6e9e84f7b668909de54f36ca785029a", size = 2050386, upload-time = "2025-10-03T21:18:50.477Z" }, + { url = "https://files.pythonhosted.org/packages/de/24/c6907c5bb06043df98ad6a0a0ff5db2e0affcecbc3b15c42404393a3f72a/pywinpty-3.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:34b55ae9a1b671fe3eae071d86618110538e8eaad18fcb1531c0830b91a82767", size = 2049834, upload-time = "2025-10-03T21:19:25.688Z" }, +] + [[package]] name = "pyyaml" version = "6.0.3" @@ -2110,6 +2896,64 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86", size = 1333328, upload-time = "2025-09-08T23:07:45.946Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a0/fc7e78a23748ad5443ac3275943457e8452da67fda347e05260261108cbc/pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581", size = 908803, upload-time = "2025-09-08T23:07:47.551Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/37d15eb05f3bdfa4abea6f6d96eb3bb58585fbd3e4e0ded4e743bc650c97/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f", size = 668836, upload-time = "2025-09-08T23:07:49.436Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e", size = 857038, upload-time = "2025-09-08T23:07:51.234Z" }, + { url = "https://files.pythonhosted.org/packages/cb/eb/bfdcb41d0db9cd233d6fb22dc131583774135505ada800ebf14dfb0a7c40/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e", size = 1657531, upload-time = "2025-09-08T23:07:52.795Z" }, + { url = "https://files.pythonhosted.org/packages/ab/21/e3180ca269ed4a0de5c34417dfe71a8ae80421198be83ee619a8a485b0c7/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2", size = 2034786, upload-time = "2025-09-08T23:07:55.047Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b1/5e21d0b517434b7f33588ff76c177c5a167858cc38ef740608898cd329f2/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394", size = 1894220, upload-time = "2025-09-08T23:07:57.172Z" }, + { url = "https://files.pythonhosted.org/packages/03/f2/44913a6ff6941905efc24a1acf3d3cb6146b636c546c7406c38c49c403d4/pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f", size = 567155, upload-time = "2025-09-08T23:07:59.05Z" }, + { url = "https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97", size = 633428, upload-time = "2025-09-08T23:08:00.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/14/01afebc96c5abbbd713ecfc7469cfb1bc801c819a74ed5c9fad9a48801cb/pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07", size = 559497, upload-time = "2025-09-08T23:08:02.15Z" }, + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, + { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c6/c4dcdecdbaa70969ee1fdced6d7b8f60cfabe64d25361f27ac4665a70620/pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066", size = 836265, upload-time = "2025-09-08T23:09:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/3e/79/f38c92eeaeb03a2ccc2ba9866f0439593bb08c5e3b714ac1d553e5c96e25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604", size = 800208, upload-time = "2025-09-08T23:09:51.073Z" }, + { url = "https://files.pythonhosted.org/packages/49/0e/3f0d0d335c6b3abb9b7b723776d0b21fa7f3a6c819a0db6097059aada160/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c", size = 567747, upload-time = "2025-09-08T23:09:52.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cf/f2b3784d536250ffd4be70e049f3b60981235d70c6e8ce7e3ef21e1adb25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271", size = 747371, upload-time = "2025-09-08T23:09:54.563Z" }, + { url = "https://files.pythonhosted.org/packages/01/1b/5dbe84eefc86f48473947e2f41711aded97eecef1231f4558f1f02713c12/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355", size = 544862, upload-time = "2025-09-08T23:09:56.509Z" }, +] + [[package]] name = "referencing" version = "0.36.2" @@ -2139,6 +2983,39 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" }, +] + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760, upload-time = "2019-10-28T16:00:19.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" }, +] + +[[package]] +name = "rfc3987-syntax" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lark" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d", size = 14239, upload-time = "2025-07-18T01:05:05.015Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, +] + [[package]] name = "rich" version = "14.1.0" @@ -2320,6 +3197,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/48/f0/ae7ca09223a81a1d890b2557186ea015f6e0502e9b8cb8e1813f1d8cfa4e/s3transfer-0.14.0-py3-none-any.whl", hash = "sha256:ea3b790c7077558ed1f02a3072fb3cb992bbbd253392f4b6e9e8976941c7d456", size = 85712, upload-time = "2025-09-09T19:23:30.041Z" }, ] +[[package]] +name = "send2trash" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/62/6e/421803dec0c0dfbf5a27e66491ebe6643a461e4f90422f00ea4c68ae24aa/send2trash-2.0.0.tar.gz", hash = "sha256:1761421da3f9930bfe51ed7c45343948573383ad4c27e3acebc91be324e7770d", size = 17206, upload-time = "2025-12-31T04:12:48.664Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/5a/f2f2e5eda25579f754acd83399c522ee03d6acbe001dfe53c8a1ec928b44/send2trash-2.0.0-py3-none-any.whl", hash = "sha256:e70d5ce41dbb890882cc78bc25d137478330b39a391e756fadf82e34da4d85b8", size = 17642, upload-time = "2025-12-31T04:12:45.336Z" }, +] + +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "shellingham" version = "1.5.4" @@ -2398,12 +3293,18 @@ spark = [ { name = "thrift" }, { name = "thrift-sasl" }, ] +widget = [ + { name = "anywidget" }, + { name = "pyarrow" }, +] [package.dev-dependencies] dev = [ { name = "antlr4-python3-runtime" }, + { name = "jupyterlab" }, { name = "lsprotocol" }, { name = "marimo" }, + { name = "polars" }, { name = "pygls" }, { name = "pytest" }, { name = "ruff" }, @@ -2413,6 +3314,8 @@ dev = [ requires-dist = [ { name = "adbc-driver-manager", marker = "extra == 'adbc'", specifier = ">=1.0.0" }, { name = "altair", specifier = ">=5.0.0" }, + { name = "antlr4-python3-runtime", marker = "extra == 'malloy'", specifier = ">=4.13.2" }, + { name = "anywidget", marker = "extra == 'widget'", specifier = ">=0.9.0" }, { name = "clickhouse-connect", marker = "extra == 'clickhouse'", specifier = ">=0.6.0" }, { name = "databricks-sql-connector", marker = "extra == 'databricks'", specifier = ">=2.0.0" }, { name = "duckdb", specifier = ">=1.0.0" }, @@ -2436,6 +3339,7 @@ requires-dist = [ { name = "pyarrow", marker = "extra == 'serve'", specifier = ">=14.0.0" }, { name = "pyarrow", marker = "extra == 'snowflake'", specifier = ">=14.0.0" }, { name = "pyarrow", marker = "extra == 'spark'", specifier = ">=14.0.0" }, + { name = "pyarrow", marker = "extra == 'widget'", specifier = ">=14.0.0" }, { name = "pydantic", specifier = ">=2.0.0" }, { name = "pygls", marker = "extra == 'lsp'", specifier = ">=2.0.0" }, { name = "pyhive", marker = "extra == 'spark'", specifier = ">=0.7.0" }, @@ -2453,13 +3357,17 @@ requires-dist = [ { name = "typer", specifier = ">=0.9.0" }, { name = "vl-convert-python", specifier = ">=1.0.0" }, ] -provides-extras = ["dev", "serve", "postgres", "bigquery", "snowflake", "clickhouse", "databricks", "spark", "adbc", "lsp"] +provides-extras = ["dev", "serve", "postgres", "bigquery", "snowflake", "clickhouse", "databricks", "spark", "adbc", "lsp", "malloy", "widget"] [package.metadata.requires-dev] dev = [ { name = "antlr4-python3-runtime", specifier = ">=4.13.2" }, + { name = "jupyterlab", specifier = ">=4.5.1" }, { name = "lsprotocol", specifier = ">=2025.0.0" }, { name = "marimo", specifier = "==0.16.5" }, + { name = "numpy", specifier = ">=1.26,<3" }, + { name = "pandas", specifier = ">=2.2,<3" }, + { name = "polars", specifier = ">=1.36.1" }, { name = "pygls", specifier = ">=2.0.0" }, { name = "pytest", specifier = ">=8.4.2" }, { name = "ruff", specifier = ">=0.14.0" }, @@ -2536,6 +3444,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, ] +[[package]] +name = "soupsieve" +version = "2.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/89/23/adf3796d740536d63a6fbda113d07e60c734b6ed5d3058d1e47fc0495e47/soupsieve-2.8.1.tar.gz", hash = "sha256:4cf733bc50fa805f5df4b8ef4740fc0e0fa6218cf3006269afd3f9d6d80fd350", size = 117856, upload-time = "2025-12-18T13:50:34.655Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/f3/b67d6ea49ca9154453b6d70b34ea22f3996b9fa55da105a79d8732227adc/soupsieve-2.8.1-py3-none-any.whl", hash = "sha256:a11fe2a6f3d76ab3cf2de04eb339c1be5b506a8a47f2ceb6d139803177f85434", size = 36710, upload-time = "2025-12-18T13:50:33.267Z" }, +] + [[package]] name = "sqlalchemy" version = "1.4.54" @@ -2578,6 +3495,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/10/c78f463b4ef22eef8491f218f692be838282cd65480f6e423d7730dfd1fb/sse_starlette-3.0.2-py3-none-any.whl", hash = "sha256:16b7cbfddbcd4eaca11f7b586f3b8a080f1afe952c15813455b162edea619e5a", size = 11297, upload-time = "2025-07-27T09:07:43.268Z" }, ] +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + [[package]] name = "starlette" version = "0.48.0" @@ -2591,6 +3522,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminado" +version = "0.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "os_name != 'nt'" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload-time = "2024-03-12T14:34:36.569Z" }, +] + [[package]] name = "textual" version = "6.2.1" @@ -2663,6 +3608,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c3/9e/636c24ce1c0d46ce3020c5836c5a375d8e862fa81a240e0e352cc991dcf8/thrift_sasl-0.4.3-py2.py3-none-any.whl", hash = "sha256:d24b49140115e6e2a96d08335cff225a27a28ea71866fb1b2bdb30ca5afca64e", size = 8304, upload-time = "2021-05-26T12:40:19.425Z" }, ] +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, +] + [[package]] name = "tomli" version = "2.2.1" @@ -2711,6 +3668,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" }, ] +[[package]] +name = "tornado" +version = "6.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/37/1d/0a336abf618272d53f62ebe274f712e213f5a03c0b2339575430b8362ef2/tornado-6.5.4.tar.gz", hash = "sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7", size = 513632, upload-time = "2025-12-15T19:21:03.836Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9", size = 443909, upload-time = "2025-12-15T19:20:48.382Z" }, + { url = "https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843", size = 442163, upload-time = "2025-12-15T19:20:49.791Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b5/206f82d51e1bfa940ba366a8d2f83904b15942c45a78dd978b599870ab44/tornado-6.5.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17", size = 445746, upload-time = "2025-12-15T19:20:51.491Z" }, + { url = "https://files.pythonhosted.org/packages/8e/9d/1a3338e0bd30ada6ad4356c13a0a6c35fbc859063fa7eddb309183364ac1/tornado-6.5.4-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335", size = 445083, upload-time = "2025-12-15T19:20:52.778Z" }, + { url = "https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f", size = 445315, upload-time = "2025-12-15T19:20:53.996Z" }, + { url = "https://files.pythonhosted.org/packages/27/07/2273972f69ca63dbc139694a3fc4684edec3ea3f9efabf77ed32483b875c/tornado-6.5.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84", size = 446003, upload-time = "2025-12-15T19:20:56.101Z" }, + { url = "https://files.pythonhosted.org/packages/d1/83/41c52e47502bf7260044413b6770d1a48dda2f0246f95ee1384a3cd9c44a/tornado-6.5.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f", size = 445412, upload-time = "2025-12-15T19:20:57.398Z" }, + { url = "https://files.pythonhosted.org/packages/10/c7/bc96917f06cbee182d44735d4ecde9c432e25b84f4c2086143013e7b9e52/tornado-6.5.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8", size = 445392, upload-time = "2025-12-15T19:20:58.692Z" }, + { url = "https://files.pythonhosted.org/packages/0c/1a/d7592328d037d36f2d2462f4bc1fbb383eec9278bc786c1b111cbbd44cfa/tornado-6.5.4-cp39-abi3-win32.whl", hash = "sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1", size = 446481, upload-time = "2025-12-15T19:21:00.008Z" }, + { url = "https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl", hash = "sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc", size = 446886, upload-time = "2025-12-15T19:21:01.287Z" }, + { url = "https://files.pythonhosted.org/packages/50/49/8dc3fd90902f70084bd2cd059d576ddb4f8bb44c2c7c0e33a11422acb17e/tornado-6.5.4-cp39-abi3-win_arm64.whl", hash = "sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1", size = 445910, upload-time = "2025-12-15T19:21:02.571Z" }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, +] + [[package]] name = "tree-sitter" version = "0.25.2" @@ -3033,6 +4018,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/37/87/1f677586e8ac487e29672e4b17455758fce261de06a0d086167bb760361a/uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5", size = 6229, upload-time = "2024-02-09T16:52:00.371Z" }, ] +[[package]] +name = "uri-template" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678, upload-time = "2023-06-21T01:49:05.374Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140, upload-time = "2023-06-21T01:49:03.467Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -3068,6 +4062,42 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/6f/29dce05f9167e3a01ab74d79eeadd531bc24cf59e3a7fc3736af476ca431/vl_convert_python-1.8.0-cp37-abi3-win_amd64.whl", hash = "sha256:9f1146b791ed27916f54c45e1d66af53a40eb26e5aaea1892f33eb9a935039ab", size = 31318167, upload-time = "2025-05-28T00:06:44.881Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + +[[package]] +name = "webcolors" +version = "25.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d", size = 14905, upload-time = "2025-10-31T07:51:01.778Z" }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] + [[package]] name = "websockets" version = "15.0.1" @@ -3110,6 +4140,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, ] +[[package]] +name = "widgetsnbextension" +version = "4.0.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" }, +] + [[package]] name = "zstandard" version = "0.25.0" From e3ee1be043758feef29d4aaedb0c899695d27430 Mon Sep 17 00:00:00 2001 From: Nico Ritschel Date: Fri, 9 Jan 2026 14:18:07 -0800 Subject: [PATCH 2/4] Fix widget notebook format and add marimo note --- README.md | 6 + examples/widget_demo.ipynb | 805 +++++++++++++++++++------------------ 2 files changed, 412 insertions(+), 399 deletions(-) diff --git a/README.md b/README.md index ddde476d..917d334c 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,12 @@ uv add "sidemantic[widget]" jupyterlab uv run jupyter lab ``` +Marimo (uv): +```bash +uv add "sidemantic[widget]" marimo +uv run marimo edit +``` + ```python import duckdb from sidemantic.widget import MetricsExplorer diff --git a/examples/widget_demo.ipynb b/examples/widget_demo.ipynb index bc758fe7..e8aea327 100644 --- a/examples/widget_demo.ipynb +++ b/examples/widget_demo.ipynb @@ -1,401 +1,408 @@ { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "import duckdb\n", - "\n", - "# Load real auction data (~1.4M rows)\n", - "conn = duckdb.connect(\":memory:\")\n", - "conn.execute(\"\"\"\n", - "create table auctions as\n", - "select *\n", - "from 'https://sampledata.sidequery.dev/sidemantic-demo/auction_data.parquet'\n", - "--cross join range(2)\n", - "\"\"\")\n", - "\n", - "# Preview\n", - "conn.execute(\"SELECT * FROM auctions LIMIT 5\")" - ] -} -{ - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "from sidemantic.widget import MetricsExplorer\n", - "\n", - "# Simple mode: just pass data (DuckDB relation)\n", - "widget = MetricsExplorer(conn.table(\"auctions\"))\n", - "widget" - ] -} -{ - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "# With cardinality threshold - skip dimensions with more than 50 unique values\n", - "widget2 = MetricsExplorer(conn.table(\"auctions\"), max_dimension_cardinality=50)\n", - "widget2" - ] -} -{ - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "from sidemantic import Dimension, Metric, Model, SemanticLayer\n", - "from sidemantic.db.duckdb import DuckDBAdapter\n", - "\n", - "# Define semantic model for auction analytics\n", - "auction_model = Model(\n", - " name=\"auctions\",\n", - " table=\"auctions_with_id\",\n", - " primary_key=\"id\",\n", - " default_time_dimension=\"__time\", # Widget uses this for sparklines automatically!\n", - " dimensions=[\n", - " Dimension(name=\"__time\", type=\"time\", granularity=\"day\"),\n", - " Dimension(name=\"device_type\", type=\"categorical\"),\n", - " Dimension(name=\"device_os\", type=\"categorical\"),\n", - " Dimension(name=\"app_or_site\", type=\"categorical\"),\n", - " Dimension(name=\"ad_position\", type=\"categorical\"),\n", - " Dimension(name=\"placement_type\", type=\"categorical\"),\n", - " Dimension(name=\"auction_type\", type=\"categorical\"),\n", - " Dimension(name=\"bid_floor_bucket\", type=\"categorical\"),\n", - " Dimension(name=\"platform_browser\", type=\"categorical\"),\n", - " Dimension(name=\"video_max_duration_bucket\", type=\"categorical\"),\n", - " Dimension(name=\"video_min_duration_bucket\", type=\"categorical\"),\n", - " Dimension(name=\"ad_size\", type=\"categorical\"),\n", - " Dimension(name=\"device_region\", type=\"categorical\"),\n", - " Dimension(name=\"device_osv\", type=\"categorical\"),\n", - " Dimension(name=\"app_site_cat\", type=\"categorical\"),\n", - " ],\n", - " metrics=[\n", - " Metric(name=\"bid_requests\", sql=\"sum(bid_request_cnt)\"),\n", - " Metric(name=\"bid_floor_requests\", sql=\"sum(has_bid_floor_cnt)\"),\n", - " Metric(name=\"avg_bid_floor\", sql=\"avg(bid_floor)\"),\n", - " ],\n", - ")\n", - "\n", - "# Create semantic layer\n", - "adapter = DuckDBAdapter(\":memory:\")\n", - "\n", - "# Copy data to new connection with id column\n", - "adapter.conn.execute(\"\"\"\n", - " CREATE TABLE auctions_with_id AS\n", - " SELECT row_number() OVER () as id, *\n", - " FROM 'https://sampledata.sidequery.dev/sidemantic-demo/auction_data.parquet'\n", - "\"\"\")\n", - "\n", - "layer = SemanticLayer(connection=adapter)\n", - "layer.add_model(auction_model)\n", - "\n", - "# Simple! Just pass the layer - time dimension and metrics auto-detected\n", - "widget3 = MetricsExplorer(layer)\n", - "widget3" - ] -} -{ - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "from sidemantic import PreAggregation\n", - "\n", - "# Define model with pre-aggregations for faster widget queries\n", - "# Same dimensions as Mode 3 - preaggregations cover the most common queries\n", - "auction_model_preagg = Model(\n", - " name=\"auctions\",\n", - " table=\"auctions_with_id\",\n", - " primary_key=\"id\",\n", - " default_time_dimension=\"__time\",\n", - " dimensions=[\n", - " Dimension(name=\"__time\", type=\"time\", granularity=\"day\"),\n", - " Dimension(name=\"device_type\", type=\"categorical\"),\n", - " Dimension(name=\"device_os\", type=\"categorical\"),\n", - " Dimension(name=\"app_or_site\", type=\"categorical\"),\n", - " Dimension(name=\"ad_position\", type=\"categorical\"),\n", - " Dimension(name=\"placement_type\", type=\"categorical\"),\n", - " Dimension(name=\"auction_type\", type=\"categorical\"),\n", - " Dimension(name=\"bid_floor_bucket\", type=\"categorical\"),\n", - " Dimension(name=\"platform_browser\", type=\"categorical\"),\n", - " Dimension(name=\"video_max_duration_bucket\", type=\"categorical\"),\n", - " Dimension(name=\"video_min_duration_bucket\", type=\"categorical\"),\n", - " Dimension(name=\"ad_size\", type=\"categorical\"),\n", - " Dimension(name=\"device_region\", type=\"categorical\"),\n", - " Dimension(name=\"device_osv\", type=\"categorical\"),\n", - " Dimension(name=\"app_site_cat\", type=\"categorical\"),\n", - " ],\n", - " metrics=[\n", - " Metric(name=\"bid_requests\", sql=\"sum(bid_request_cnt)\"),\n", - " Metric(name=\"bid_floor_requests\", sql=\"sum(has_bid_floor_cnt)\"),\n", - " Metric(name=\"avg_bid_floor\", sql=\"avg(bid_floor)\"),\n", - " ],\n", - " pre_aggregations=[\n", - " # Daily rollup for time-series (sparklines)\n", - " PreAggregation(\n", - " name=\"daily_metrics\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " time_dimension=\"__time\",\n", - " granularity=\"day\",\n", - " ),\n", - " # Per-dimension rollups for leaderboards\n", - " PreAggregation(\n", - " name=\"by_device_type\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"device_type\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_device_os\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"device_os\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_app_or_site\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"app_or_site\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_ad_position\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"ad_position\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_placement_type\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"placement_type\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_auction_type\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"auction_type\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_bid_floor_bucket\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"bid_floor_bucket\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_platform_browser\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"platform_browser\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_video_max_duration_bucket\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"video_max_duration_bucket\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_video_min_duration_bucket\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"video_min_duration_bucket\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_ad_size\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"ad_size\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_device_region\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"device_region\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_device_osv\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"device_osv\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_app_site_cat\",\n", - " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", - " dimensions=[\"app_site_cat\"],\n", - " ),\n", - " ],\n", - ")\n", - "\n", - "# Create layer with preaggregations enabled\n", - "adapter_preagg = DuckDBAdapter(\":memory:\")\n", - "adapter_preagg.conn.execute(\"\"\"\n", - " CREATE TABLE auctions_with_id AS\n", - " SELECT row_number() OVER () as id, *\n", - " FROM 'https://sampledata.sidequery.dev/sidemantic-demo/auction_data.parquet'\n", - "\"\"\")\n", - "\n", - "layer_preagg = SemanticLayer(connection=adapter_preagg, use_preaggregations=True)\n", - "layer_preagg.add_model(auction_model_preagg)\n", - "\n", - "# Materialize the pre-aggregations (creates actual tables)\n", - "for preagg in auction_model_preagg.pre_aggregations:\n", - " table_name = preagg.get_table_name(\"auctions\")\n", - " source_sql = preagg.generate_materialization_sql(auction_model_preagg)\n", - " adapter_preagg.conn.execute(f\"CREATE OR REPLACE TABLE {table_name} AS {source_sql}\")\n", - " print(f\"Created pre-aggregation: {table_name}\")\n", - "\n", - "# Widget now uses pre-aggregated tables for compatible queries\n", - "widget4 = MetricsExplorer(layer_preagg)\n", - "widget4" - ] -} -{ - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "# Load Foursquare Places dataset (106M rows)\n", - "# Join with categories to get human-readable category names\n", - "fsq_conn = duckdb.connect(\":memory:\")\n", - "fsq_conn.execute(\"\"\"\n", - " CREATE TABLE places AS\n", - " SELECT \n", - " p.country,\n", - " p.region,\n", - " p.locality,\n", - " p.admin_region,\n", - " c.level1_category_name as category_l1,\n", - " c.level2_category_name as category_l2,\n", - " c.level3_category_name as category_l3,\n", - " CAST(p.date_created AS DATE) AS date_created,\n", - " p.latitude,\n", - " p.longitude\n", - " FROM 'https://sampledata.sidequery.dev/sidemantic-demo/places.parquet' p\n", - " LEFT JOIN 'https://sampledata.sidequery.dev/sidemantic-demo/categories.parquet' c \n", - " ON c.category_id = p.fsq_category_ids[1]\n", - "\"\"\")\n", - "\n", - "# Use cardinality threshold to skip high-cardinality dimensions like locality\n", - "widget5 = MetricsExplorer(\n", - " fsq_conn.table(\"places\"),\n", - " max_dimension_cardinality=2500, # Skip dimensions with >300 unique values\n", - " time_dimension=\"date_created\",\n", - ")\n", - "widget5" - ] -} -{ - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "from sidemantic import Dimension, Metric, Model, PreAggregation, SemanticLayer\n", - "from sidemantic.db.duckdb import DuckDBAdapter\n", - "\n", - "places_model_preagg = Model(\n", - " name=\"places\",\n", - " table=\"places\",\n", - " primary_key=\"rowid\",\n", - " default_time_dimension=\"date_created\",\n", - " dimensions=[\n", - " Dimension(name=\"date_created\", type=\"time\", granularity=\"day\"),\n", - " Dimension(name=\"country\", type=\"categorical\"),\n", - " Dimension(name=\"region\", type=\"categorical\"),\n", - " Dimension(name=\"admin_region\", type=\"categorical\"),\n", - " Dimension(name=\"category_l1\", type=\"categorical\"),\n", - " Dimension(name=\"category_l2\", type=\"categorical\"),\n", - " Dimension(name=\"category_l3\", type=\"categorical\"),\n", - " ],\n", - " metrics=[\n", - " Metric(name=\"row_count\", agg=\"count\"),\n", - " Metric(name=\"sum_latitude\", sql=\"sum(latitude)\"),\n", - " Metric(name=\"sum_longitude\", sql=\"sum(longitude)\"),\n", - " ],\n", - " pre_aggregations=[\n", - " PreAggregation(\n", - " name=\"daily_metrics\",\n", - " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", - " time_dimension=\"date_created\",\n", - " granularity=\"day\",\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_country\",\n", - " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", - " dimensions=[\"country\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_region\",\n", - " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", - " dimensions=[\"region\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_admin_region\",\n", - " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", - " dimensions=[\"admin_region\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_category_l1\",\n", - " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", - " dimensions=[\"category_l1\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_category_l2\",\n", - " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", - " dimensions=[\"category_l2\"],\n", - " ),\n", - " PreAggregation(\n", - " name=\"by_category_l3\",\n", - " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", - " dimensions=[\"category_l3\"],\n", - " ),\n", - " ],\n", - ")\n", - "\n", - "adapter_fsq_preagg = DuckDBAdapter(\":memory:\")\n", - "adapter_fsq_preagg.conn = fsq_conn\n", - "\n", - "layer_fsq_preagg = SemanticLayer(connection=adapter_fsq_preagg, use_preaggregations=True)\n", - "layer_fsq_preagg.add_model(places_model_preagg)\n", - "\n", - "for preagg in places_model_preagg.pre_aggregations:\n", - " table_name = preagg.get_table_name(\"places\")\n", - " source_sql = preagg.generate_materialization_sql(places_model_preagg)\n", - " adapter_fsq_preagg.conn.execute(f\"CREATE OR REPLACE TABLE {table_name} AS {source_sql}\")\n", - " print(f\"Created pre-aggregation: {table_name}\")\n", - "\n", - "widget6 = MetricsExplorer(layer_fsq_preagg)\n", - "widget6" - ] -} -{ - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "# After interacting with the widget, check the filters\n", - "print(\"Current filters:\", widget.filters)\n", - "print(\"Selected metric:\", widget.selected_metric)\n", - "print(\"Date range:\", widget.date_range)" - ] -} -{ - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [] + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "import duckdb\n", + "\n", + "# Load real auction data (~1.4M rows)\n", + "conn = duckdb.connect(\":memory:\")\n", + "conn.execute(\"\"\"\n", + "create table auctions as\n", + "select *\n", + "from 'https://sampledata.sidequery.dev/sidemantic-demo/auction_data.parquet'\n", + "--cross join range(2)\n", + "\"\"\")\n", + "\n", + "# Preview\n", + "conn.execute(\"SELECT * FROM auctions LIMIT 5\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "from sidemantic.widget import MetricsExplorer\n", + "\n", + "# Simple mode: just pass data (DuckDB relation)\n", + "widget = MetricsExplorer(conn.table(\"auctions\"))\n", + "widget" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "# With cardinality threshold - skip dimensions with more than 50 unique values\n", + "widget2 = MetricsExplorer(conn.table(\"auctions\"), max_dimension_cardinality=50)\n", + "widget2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "from sidemantic import Dimension, Metric, Model, SemanticLayer\n", + "from sidemantic.db.duckdb import DuckDBAdapter\n", + "\n", + "# Define semantic model for auction analytics\n", + "auction_model = Model(\n", + " name=\"auctions\",\n", + " table=\"auctions_with_id\",\n", + " primary_key=\"id\",\n", + " default_time_dimension=\"__time\", # Widget uses this for sparklines automatically!\n", + " dimensions=[\n", + " Dimension(name=\"__time\", type=\"time\", granularity=\"day\"),\n", + " Dimension(name=\"device_type\", type=\"categorical\"),\n", + " Dimension(name=\"device_os\", type=\"categorical\"),\n", + " Dimension(name=\"app_or_site\", type=\"categorical\"),\n", + " Dimension(name=\"ad_position\", type=\"categorical\"),\n", + " Dimension(name=\"placement_type\", type=\"categorical\"),\n", + " Dimension(name=\"auction_type\", type=\"categorical\"),\n", + " Dimension(name=\"bid_floor_bucket\", type=\"categorical\"),\n", + " Dimension(name=\"platform_browser\", type=\"categorical\"),\n", + " Dimension(name=\"video_max_duration_bucket\", type=\"categorical\"),\n", + " Dimension(name=\"video_min_duration_bucket\", type=\"categorical\"),\n", + " Dimension(name=\"ad_size\", type=\"categorical\"),\n", + " Dimension(name=\"device_region\", type=\"categorical\"),\n", + " Dimension(name=\"device_osv\", type=\"categorical\"),\n", + " Dimension(name=\"app_site_cat\", type=\"categorical\"),\n", + " ],\n", + " metrics=[\n", + " Metric(name=\"bid_requests\", sql=\"sum(bid_request_cnt)\"),\n", + " Metric(name=\"bid_floor_requests\", sql=\"sum(has_bid_floor_cnt)\"),\n", + " Metric(name=\"avg_bid_floor\", sql=\"avg(bid_floor)\"),\n", + " ],\n", + ")\n", + "\n", + "# Create semantic layer\n", + "adapter = DuckDBAdapter(\":memory:\")\n", + "\n", + "# Copy data to new connection with id column\n", + "adapter.conn.execute(\"\"\"\n", + " CREATE TABLE auctions_with_id AS\n", + " SELECT row_number() OVER () as id, *\n", + " FROM 'https://sampledata.sidequery.dev/sidemantic-demo/auction_data.parquet'\n", + "\"\"\")\n", + "\n", + "layer = SemanticLayer(connection=adapter)\n", + "layer.add_model(auction_model)\n", + "\n", + "# Simple! Just pass the layer - time dimension and metrics auto-detected\n", + "widget3 = MetricsExplorer(layer)\n", + "widget3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "from sidemantic import PreAggregation\n", + "\n", + "# Define model with pre-aggregations for faster widget queries\n", + "# Same dimensions as Mode 3 - preaggregations cover the most common queries\n", + "auction_model_preagg = Model(\n", + " name=\"auctions\",\n", + " table=\"auctions_with_id\",\n", + " primary_key=\"id\",\n", + " default_time_dimension=\"__time\",\n", + " dimensions=[\n", + " Dimension(name=\"__time\", type=\"time\", granularity=\"day\"),\n", + " Dimension(name=\"device_type\", type=\"categorical\"),\n", + " Dimension(name=\"device_os\", type=\"categorical\"),\n", + " Dimension(name=\"app_or_site\", type=\"categorical\"),\n", + " Dimension(name=\"ad_position\", type=\"categorical\"),\n", + " Dimension(name=\"placement_type\", type=\"categorical\"),\n", + " Dimension(name=\"auction_type\", type=\"categorical\"),\n", + " Dimension(name=\"bid_floor_bucket\", type=\"categorical\"),\n", + " Dimension(name=\"platform_browser\", type=\"categorical\"),\n", + " Dimension(name=\"video_max_duration_bucket\", type=\"categorical\"),\n", + " Dimension(name=\"video_min_duration_bucket\", type=\"categorical\"),\n", + " Dimension(name=\"ad_size\", type=\"categorical\"),\n", + " Dimension(name=\"device_region\", type=\"categorical\"),\n", + " Dimension(name=\"device_osv\", type=\"categorical\"),\n", + " Dimension(name=\"app_site_cat\", type=\"categorical\"),\n", + " ],\n", + " metrics=[\n", + " Metric(name=\"bid_requests\", sql=\"sum(bid_request_cnt)\"),\n", + " Metric(name=\"bid_floor_requests\", sql=\"sum(has_bid_floor_cnt)\"),\n", + " Metric(name=\"avg_bid_floor\", sql=\"avg(bid_floor)\"),\n", + " ],\n", + " pre_aggregations=[\n", + " # Daily rollup for time-series (sparklines)\n", + " PreAggregation(\n", + " name=\"daily_metrics\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " time_dimension=\"__time\",\n", + " granularity=\"day\",\n", + " ),\n", + " # Per-dimension rollups for leaderboards\n", + " PreAggregation(\n", + " name=\"by_device_type\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"device_type\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_device_os\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"device_os\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_app_or_site\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"app_or_site\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_ad_position\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"ad_position\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_placement_type\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"placement_type\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_auction_type\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"auction_type\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_bid_floor_bucket\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"bid_floor_bucket\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_platform_browser\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"platform_browser\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_video_max_duration_bucket\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"video_max_duration_bucket\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_video_min_duration_bucket\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"video_min_duration_bucket\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_ad_size\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"ad_size\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_device_region\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"device_region\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_device_osv\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"device_osv\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_app_site_cat\",\n", + " measures=[\"bid_requests\", \"bid_floor_requests\", \"avg_bid_floor\"],\n", + " dimensions=[\"app_site_cat\"],\n", + " ),\n", + " ],\n", + ")\n", + "\n", + "# Create layer with preaggregations enabled\n", + "adapter_preagg = DuckDBAdapter(\":memory:\")\n", + "adapter_preagg.conn.execute(\"\"\"\n", + " CREATE TABLE auctions_with_id AS\n", + " SELECT row_number() OVER () as id, *\n", + " FROM 'https://sampledata.sidequery.dev/sidemantic-demo/auction_data.parquet'\n", + "\"\"\")\n", + "\n", + "layer_preagg = SemanticLayer(connection=adapter_preagg, use_preaggregations=True)\n", + "layer_preagg.add_model(auction_model_preagg)\n", + "\n", + "# Materialize the pre-aggregations (creates actual tables)\n", + "for preagg in auction_model_preagg.pre_aggregations:\n", + " table_name = preagg.get_table_name(\"auctions\")\n", + " source_sql = preagg.generate_materialization_sql(auction_model_preagg)\n", + " adapter_preagg.conn.execute(f\"CREATE OR REPLACE TABLE {table_name} AS {source_sql}\")\n", + " print(f\"Created pre-aggregation: {table_name}\")\n", + "\n", + "# Widget now uses pre-aggregated tables for compatible queries\n", + "widget4 = MetricsExplorer(layer_preagg)\n", + "widget4" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "# Load Foursquare Places dataset (106M rows)\n", + "# Join with categories to get human-readable category names\n", + "fsq_conn = duckdb.connect(\":memory:\")\n", + "fsq_conn.execute(\"\"\"\n", + " CREATE TABLE places AS\n", + " SELECT\n", + " p.country,\n", + " p.region,\n", + " p.locality,\n", + " p.admin_region,\n", + " c.level1_category_name as category_l1,\n", + " c.level2_category_name as category_l2,\n", + " c.level3_category_name as category_l3,\n", + " CAST(p.date_created AS DATE) AS date_created,\n", + " p.latitude,\n", + " p.longitude\n", + " FROM 'https://sampledata.sidequery.dev/sidemantic-demo/places.parquet' p\n", + " LEFT JOIN 'https://sampledata.sidequery.dev/sidemantic-demo/categories.parquet' c\n", + " ON c.category_id = p.fsq_category_ids[1]\n", + "\"\"\")\n", + "\n", + "# Use cardinality threshold to skip high-cardinality dimensions like locality\n", + "widget5 = MetricsExplorer(\n", + " fsq_conn.table(\"places\"),\n", + " max_dimension_cardinality=2500, # Skip dimensions with >300 unique values\n", + " time_dimension=\"date_created\",\n", + ")\n", + "widget5" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "from sidemantic import Dimension, Metric, Model, PreAggregation, SemanticLayer\n", + "from sidemantic.db.duckdb import DuckDBAdapter\n", + "\n", + "places_model_preagg = Model(\n", + " name=\"places\",\n", + " table=\"places\",\n", + " primary_key=\"rowid\",\n", + " default_time_dimension=\"date_created\",\n", + " dimensions=[\n", + " Dimension(name=\"date_created\", type=\"time\", granularity=\"day\"),\n", + " Dimension(name=\"country\", type=\"categorical\"),\n", + " Dimension(name=\"region\", type=\"categorical\"),\n", + " Dimension(name=\"admin_region\", type=\"categorical\"),\n", + " Dimension(name=\"category_l1\", type=\"categorical\"),\n", + " Dimension(name=\"category_l2\", type=\"categorical\"),\n", + " Dimension(name=\"category_l3\", type=\"categorical\"),\n", + " ],\n", + " metrics=[\n", + " Metric(name=\"row_count\", agg=\"count\"),\n", + " Metric(name=\"sum_latitude\", sql=\"sum(latitude)\"),\n", + " Metric(name=\"sum_longitude\", sql=\"sum(longitude)\"),\n", + " ],\n", + " pre_aggregations=[\n", + " PreAggregation(\n", + " name=\"daily_metrics\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " time_dimension=\"date_created\",\n", + " granularity=\"day\",\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_country\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " dimensions=[\"country\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_region\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " dimensions=[\"region\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_admin_region\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " dimensions=[\"admin_region\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_category_l1\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " dimensions=[\"category_l1\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_category_l2\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " dimensions=[\"category_l2\"],\n", + " ),\n", + " PreAggregation(\n", + " name=\"by_category_l3\",\n", + " measures=[\"row_count\", \"sum_latitude\", \"sum_longitude\"],\n", + " dimensions=[\"category_l3\"],\n", + " ),\n", + " ],\n", + ")\n", + "\n", + "adapter_fsq_preagg = DuckDBAdapter(\":memory:\")\n", + "adapter_fsq_preagg.conn = fsq_conn\n", + "\n", + "layer_fsq_preagg = SemanticLayer(connection=adapter_fsq_preagg, use_preaggregations=True)\n", + "layer_fsq_preagg.add_model(places_model_preagg)\n", + "\n", + "for preagg in places_model_preagg.pre_aggregations:\n", + " table_name = preagg.get_table_name(\"places\")\n", + " source_sql = preagg.generate_materialization_sql(places_model_preagg)\n", + " adapter_fsq_preagg.conn.execute(f\"CREATE OR REPLACE TABLE {table_name} AS {source_sql}\")\n", + " print(f\"Created pre-aggregation: {table_name}\")\n", + "\n", + "widget6 = MetricsExplorer(layer_fsq_preagg)\n", + "widget6" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "# After interacting with the widget, check the filters\n", + "print(\"Current filters:\", widget.filters)\n", + "print(\"Selected metric:\", widget.selected_metric)\n", + "print(\"Date range:\", widget.date_range)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 } From 6bc7f9bd2c9f3deef843ecafa672e846ad2f821f Mon Sep 17 00:00:00 2001 From: Nico Ritschel Date: Fri, 9 Jan 2026 14:22:36 -0800 Subject: [PATCH 3/4] Fix widget filter precision and escaping --- sidemantic/widget/_widget.py | 60 ++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/sidemantic/widget/_widget.py b/sidemantic/widget/_widget.py index fc152935..1169626d 100644 --- a/sidemantic/widget/_widget.py +++ b/sidemantic/widget/_widget.py @@ -4,6 +4,7 @@ import io import pathlib +from datetime import date, datetime, timedelta from typing import TYPE_CHECKING, Any import anywidget @@ -308,13 +309,8 @@ def _compute_date_range(self): min_date = result[0] max_date = result[1] - # Convert to ISO strings - if hasattr(min_date, "isoformat"): - min_date = min_date.isoformat()[:10] - max_date = max_date.isoformat()[:10] - else: - min_date = str(min_date)[:10] - max_date = str(max_date)[:10] + min_date = self._stringify_time_value(min_date) + max_date = self._stringify_time_value(max_date) self.date_range = [min_date, max_date] except Exception as e: @@ -363,16 +359,10 @@ def _build_filters(self, exclude_dimension: str | None = None) -> list[str]: # Date range filter if self.brush_selection and len(self.brush_selection) == 2: start, end = self.brush_selection - filter_exprs.append( - f"{self._model_name}.{self._time_dimension} >= '{start}' AND " - f"{self._model_name}.{self._time_dimension} <= '{end}'" - ) + filter_exprs.append(self._format_time_range_filter(start, end)) elif self.date_range and len(self.date_range) == 2: start, end = self.date_range - filter_exprs.append( - f"{self._model_name}.{self._time_dimension} >= '{start}' AND " - f"{self._model_name}.{self._time_dimension} <= '{end}'" - ) + filter_exprs.append(self._format_time_range_filter(start, end)) # Dimension filters for dim_key, values in self.filters.items(): @@ -380,13 +370,49 @@ def _build_filters(self, exclude_dimension: str | None = None) -> list[str]: continue if values: if len(values) == 1: - filter_exprs.append(f"{self._model_name}.{dim_key} = '{values[0]}'") + value = self._escape_sql_literal(str(values[0])) + filter_exprs.append(f"{self._model_name}.{dim_key} = '{value}'") else: - clauses = " OR ".join(f"{self._model_name}.{dim_key} = '{v}'" for v in values) + clauses = " OR ".join( + f"{self._model_name}.{dim_key} = '{self._escape_sql_literal(str(v))}'" for v in values + ) filter_exprs.append(f"({clauses})") return filter_exprs + def _stringify_time_value(self, value) -> str: + if isinstance(value, datetime): + return value.isoformat(sep=" ") + if isinstance(value, date): + return value.isoformat() + return str(value) + + def _is_date_only(self, value: str) -> bool: + return len(value) == 10 and value[4] == "-" and value[7] == "-" + + def _format_time_range_filter(self, start, end) -> str: + start_str = self._stringify_time_value(start) + end_str = self._stringify_time_value(end) + + start_literal = self._escape_sql_literal(start_str) + end_literal = self._escape_sql_literal(end_str) + + if self._is_date_only(end_str): + end_exclusive = (date.fromisoformat(end_str) + timedelta(days=1)).isoformat() + end_literal = self._escape_sql_literal(end_exclusive) + return ( + f"{self._model_name}.{self._time_dimension} >= '{start_literal}' AND " + f"{self._model_name}.{self._time_dimension} < '{end_literal}'" + ) + + return ( + f"{self._model_name}.{self._time_dimension} >= '{start_literal}' AND " + f"{self._model_name}.{self._time_dimension} <= '{end_literal}'" + ) + + def _escape_sql_literal(self, value: str) -> str: + return value.replace("'", "''") + def _refresh_all(self): """Refresh all data (metrics and dimensions).""" self.status = "loading" From e6206ae64379d9dddb556be5826e9d0abf32110b Mon Sep 17 00:00:00 2001 From: Nico Ritschel Date: Fri, 9 Jan 2026 14:31:24 -0800 Subject: [PATCH 4/4] Format widget loader --- sidemantic/loaders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sidemantic/loaders.py b/sidemantic/loaders.py index 04ce534b..484ddc11 100644 --- a/sidemantic/loaders.py +++ b/sidemantic/loaders.py @@ -58,7 +58,7 @@ def load_from_directory(layer: "SemanticLayer", directory: str | Path) -> None: if exc.name == "antlr4": print( "Warning: Malloy support requires antlr4-python3-runtime. " - "Install with `uv add \"sidemantic[malloy]\"`." + 'Install with `uv add "sidemantic[malloy]"`.' ) continue raise