From 0eaea7055b9d2d9f9a75211695095d12cf1c9d92 Mon Sep 17 00:00:00 2001 From: Xavier Puspus <36430014+xmpuspus@users.noreply.github.com> Date: Tue, 16 Jun 2026 14:18:42 +0800 Subject: [PATCH] v1.6.0: self-correcting design, OSCAL compliance, credible cost, exporter hardening Closes the defensibility + relevance gaps from the June 2026 product audit. Moat: - generate -> critique -> repair loop in Architect.design() (wires the existing scorer/linter/validator back into generation); offline `cloudwright review` - OSCAL 1.1.2 component-definition export (`compliance --oscal`) + control traceability (`--traceability`) - compliance-gated component patterns (suggest_compliant_patterns) Relevance: - agentic drift -> remediation (drift --remediate): diff -> cost delta -> quality delta -> plan preview, read-only - cost credibility: region-aware pricing, egress, carbon (--carbon), FOCUS CSV (--focus), per-line pricing confidence - OpenTofu export alias + tofu-aware planner Credibility fixes: - Terraform exporter injection hardening (numeric coercion + validator) - `cloudwright plan` no longer carries the LLM key into the IaC subprocess; redacts secret-shaped values from output - compliance now overrides workload profile (sandbox + framework forces encryption/HA); WAF export is deployable; cost region is applied; LLM parse failures keep the full response Surfaces/docs: frontend structured-error contract + usage telemetry; docs/ getting-started, cli-reference, troubleshooting, mcp-reference; What's new + review demo GIF. Versions bumped to 1.6.0 (4 packages + extras + server.json). Co-Authored-By: Xavier Puspus --- CHANGELOG.md | 31 + README.md | 33 +- docs/cli-reference.md | 664 ++++++++++++++++++ docs/getting-started.md | 231 ++++++ docs/mcp-reference.md | 216 ++++++ docs/troubleshooting.md | 362 ++++++++++ examples/cloudwright-review-demo.gif | Bin 0 -> 512975 bytes examples/patient-portal.yaml | 41 ++ packages/cli/cloudwright_cli/__init__.py | 2 +- .../commands/compliance_cmd.py | 51 +- packages/cli/cloudwright_cli/commands/cost.py | 87 ++- .../cli/cloudwright_cli/commands/drift_cmd.py | 75 +- .../cloudwright_cli/commands/review_cmd.py | 78 ++ packages/cli/cloudwright_cli/main.py | 2 + packages/core/cloudwright/__init__.py | 2 +- packages/core/cloudwright/architect.py | 6 + packages/core/cloudwright/carbon.py | 267 +++++++ packages/core/cloudwright/catalog/formula.py | 6 +- packages/core/cloudwright/compliance.py | 38 + packages/core/cloudwright/cost.py | 157 ++++- packages/core/cloudwright/critique.py | 125 ++++ packages/core/cloudwright/designer.py | 87 ++- .../core/cloudwright/exporter/__init__.py | 12 +- .../cloudwright/exporter/terraform/aws.py | 18 +- .../cloudwright/exporter/terraform/azure.py | 6 +- .../cloudwright/exporter/terraform/common.py | 21 + .../exporter/terraform/databricks.py | 8 +- .../cloudwright/exporter/terraform/gcp.py | 8 +- packages/core/cloudwright/focus.py | 213 ++++++ packages/core/cloudwright/oscal.py | 199 ++++++ packages/core/cloudwright/parsing.py | 23 +- packages/core/cloudwright/patterns.py | 166 +++++ packages/core/cloudwright/planner.py | 91 ++- packages/core/cloudwright/remediation.py | 118 ++++ packages/core/cloudwright/spec.py | 5 + packages/core/pyproject.toml | 8 +- packages/core/tests/test_cost_v160.py | 457 ++++++++++++ packages/core/tests/test_critique.py | 118 ++++ packages/core/tests/test_oscal.py | 136 ++++ packages/core/tests/test_patterns.py | 93 +++ packages/core/tests/test_remediation.py | 129 ++++ .../core/tests/test_two_stage_prompting.py | 6 +- packages/core/tests/test_v160_hardening.py | 130 ++++ packages/core/tests/test_v160_traceability.py | 35 + packages/mcp/cloudwright_mcp/__init__.py | 2 +- packages/web/cloudwright_web/__init__.py | 2 +- .../static/assets/index-C9JIGemf.js | 71 -- .../static/assets/index-DU-cIjQd.js | 71 ++ .../web/cloudwright_web/static/index.html | 2 +- packages/web/frontend/src/App.tsx | 25 +- .../src/components/CompliancePanel.tsx | 6 +- .../frontend/src/components/ExportPanel.tsx | 3 +- .../web/frontend/src/components/PlanPanel.tsx | 6 +- .../frontend/src/components/SummaryBar.tsx | 21 +- .../src/components/ValidationPanel.tsx | 3 +- packages/web/frontend/src/lib/apiError.ts | 43 ++ scripts/review_demo.tape | 38 + server.json | 4 +- 58 files changed, 4697 insertions(+), 161 deletions(-) create mode 100644 docs/cli-reference.md create mode 100644 docs/getting-started.md create mode 100644 docs/mcp-reference.md create mode 100644 docs/troubleshooting.md create mode 100644 examples/cloudwright-review-demo.gif create mode 100644 examples/patient-portal.yaml create mode 100644 packages/cli/cloudwright_cli/commands/review_cmd.py create mode 100644 packages/core/cloudwright/carbon.py create mode 100644 packages/core/cloudwright/critique.py create mode 100644 packages/core/cloudwright/focus.py create mode 100644 packages/core/cloudwright/oscal.py create mode 100644 packages/core/cloudwright/patterns.py create mode 100644 packages/core/cloudwright/remediation.py create mode 100644 packages/core/tests/test_cost_v160.py create mode 100644 packages/core/tests/test_critique.py create mode 100644 packages/core/tests/test_oscal.py create mode 100644 packages/core/tests/test_patterns.py create mode 100644 packages/core/tests/test_remediation.py create mode 100644 packages/core/tests/test_v160_hardening.py create mode 100644 packages/core/tests/test_v160_traceability.py delete mode 100644 packages/web/cloudwright_web/static/assets/index-C9JIGemf.js create mode 100644 packages/web/cloudwright_web/static/assets/index-DU-cIjQd.js create mode 100644 packages/web/frontend/src/lib/apiError.ts create mode 100644 scripts/review_demo.tape diff --git a/CHANGELOG.md b/CHANGELOG.md index d96aac0..7c16b28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,37 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.6.0] - 2026-06-16 + +This release closes the defensibility + relevance gaps from the June 2026 product audit: +the design engine now self-corrects, compliance binds at design time with OSCAL output, cost +estimates stop fabricating numbers, and the credibility holes a security review would flag +first are fixed. + +### Added + +- **Generate -> critique -> repair loop + `cloudwright review`.** `Architect.design()` now runs the deterministic critics that already lived in the tree (scorer, linter, validator) against every generated spec and, when blocking (high/critical) findings remain, asks the model once to fix them — bounded, fails safe to the original spec, and records a `critique` block in `spec.metadata` (score, grade, findings/blocking before and after, repair iterations). The same engine is exposed standalone as `cloudwright review spec.yaml [--compliance hipaa,soc2] [--well-architected]` — a free, offline, severity-ranked architecture review with no API key. Disable repair with `Architect(repair=False)`. +- **OSCAL 1.1.2 export.** `cloudwright compliance spec.yaml --frameworks fedramp --oscal [-o report.md]` also emits an OSCAL `component-definition` document (deterministic UUIDs, NIST-style lowercased control IDs, per-component `control-implementations` with satisfied / not-satisfied status). Targets the FedRAMP 20x / OSCAL direction — control mapping a CSPM or evidence tool cannot produce at design time. +- **Control traceability.** `cloudwright compliance spec.yaml --traceability` shows the full chain design intent -> component -> Terraform resource type -> framework control ID -> status, as an audit artifact (`build_traceability()` in `compliance.py`). +- **Compliance-gated component patterns.** New `cloudwright/patterns.py` tags the bundled templates and modules with the frameworks they satisfy; `suggest_compliant_patterns("hipaa")` returns pre-blessed architectures so the tool proposes compliant designs instead of only flagging violations after the fact. +- **Agentic drift -> remediation.** New `cloudwright/remediation.py` `remediate(current, desired)` closes the loop read-only: drift diff -> monthly cost delta -> critique quality delta -> terraform/tofu plan preview, with an honest summary. Exposed via `cloudwright drift ... --remediate`. Never applies; `skip_plan=True` skips the IaC toolchain entirely. +- **Credible cost estimates.** Region-aware pricing (every region was previously priced as us-east-1), per-connection data-transfer/egress estimation, a per-line-item pricing `confidence` (`high` = catalog row, `low` = formula/fallback) with a top-level `pricing_confidence`, design-time carbon estimation (`cloudwright cost --carbon`), and FOCUS-spec CSV export (`cloudwright cost --focus`) for downstream FinOps tools. +- **OpenTofu support.** `cloudwright export spec.yaml --format opentofu` (alias for the Terraform HCL) and a tofu-aware planner that prefers `tofu` when present (override with `CLOUDWRIGHT_TF_BINARY`), falling back to `terraform`. +- **Self-serve docs.** New `docs/getting-started.md`, `docs/cli-reference.md`, `docs/troubleshooting.md`, `docs/mcp-reference.md`. +- **Surfaced telemetry.** The web canvas now renders the model / tokens / cost / latency the backend already computed, and a shared `parseApiError()` makes the canvas show the backend's structured `{code, message, suggestion}` errors and `Retry-After` instead of a generic "Request failed". + +### Fixed + +- **Compliance now overrides the workload profile.** A `sandbox`/`dev` spec carrying a compliance framework (e.g. HIPAA) no longer skips forced encryption / HA — the framework check moved ahead of the non-production early-return in `parsing.py`, with a real regression test (the prior test passed only because it set `production`). +- **WAF Terraform export is deployable.** `aws_wafv2_web_acl` now emits a multi-line `default_action { allow {} }`; the previous single-line nested block was rejected by `terraform validate`. +- **Cost region + fabricated prices.** The `region` parameter is now applied to catalog, formula, and fallback prices; the silent `$10` fallback for unknown services is marked low-confidence/estimated and logged at WARNING. +- **LLM parse failures keep the full response.** `_extract_json` logs the complete model output at debug before raising, instead of discarding everything past 300 characters — the one artifact needed to reproduce the most common LLM bug. + +### Security + +- **Terraform exporter injection hardening.** The 13 numeric resource fields (e.g. `allocated_storage`) are now coerced to real numbers via `_hcl_num`, and the export validator rejects newlines and braces in string values — closing a path where a string-typed numeric field could inject a `provisioner "local-exec"` into the generated HCL. Pulumi and CloudFormation paths were already safe. Regression test included. +- **`cloudwright plan` secret scoping.** The subprocess environment no longer carries the LLM/app API keys (terraform never needs them), only credential-shaped keys are merged from a project `.env`, and any secret-shaped value is redacted from returned `output_tail`. + ## [1.5.0] - 2026-05-19 ### Added diff --git a/README.md b/README.md index 5154598..555896e 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,9 @@ Cloudwright takes a one-line description of a cloud system and produces a struct ## What you get - Architecture spec (typed YAML, version-controlled, the single source of truth) -- Cost breakdown across AWS, GCP, Azure, Databricks (multi-region, per-component, four pricing tiers) -- Compliance report covering HIPAA, SOC 2, PCI-DSS, FedRAMP Moderate, GDPR, and Well-Architected -- Terraform and CloudFormation export with safe defaults (encryption, IMDSv2, locked-down S3, sensible RDS settings) +- Cost breakdown across AWS, GCP, Azure, Databricks (region-aware, per-component, four pricing tiers, optional carbon + FOCUS CSV export). Each line carries a confidence flag — `high` from the bundled price catalog (deepest on AWS), `low` from formula/fallback — so an estimate never silently passes off a guess as a quote. +- Compliance report covering HIPAA, SOC 2, PCI-DSS, FedRAMP Moderate, GDPR, NIST 800-53, and Well-Architected, with OSCAL 1.1.2 export and control traceability +- Terraform, OpenTofu, Pulumi (TypeScript or Python), and CloudFormation export with safe defaults (encryption, IMDSv2, locked-down S3, sensible RDS settings) - Diagrams in ASCII, Mermaid, D2, and a fully editable web canvas - MCP server for AI agents (Claude Desktop, Cursor, Cline, and any MCP-compatible client) @@ -112,7 +112,32 @@ hcl = export_spec(spec, "terraform", output_dir="./infra") -## What's new +## What's new in v1.6.0 + +

+ cloudwright review gives an offline, severity-ranked architecture critique; cloudwright compliance --oscal emits an OSCAL component-definition +

+ +

`cloudwright review` — offline scorer + linter + validator in one report — then the same findings exported as OSCAL.

+ +The design engine now reviews and repairs its own output, compliance binds at design time with OSCAL output, and the cost estimate stops guessing silently. + +- **The architect self-corrects.** Every `cloudwright design` runs the built-in critics (scorer, linter, validator) against the generated spec and, when blocking findings remain, repairs it in one bounded pass before you ever see it — recorded in `spec.metadata.critique`. The same engine is a free, offline command: `cloudwright review spec.yaml` gives a severity-ranked architecture review with no API key. +- **OSCAL + control traceability.** `cloudwright compliance spec.yaml --frameworks fedramp --oscal` emits an OSCAL 1.1.2 component-definition — control mapping a CSPM or evidence tool cannot produce before deploy. `--traceability` prints the chain design intent -> component -> Terraform resource -> control ID -> status. +- **Cost you can defend.** Region-aware pricing (every region used to be priced as us-east-1), data-transfer/egress estimation, a per-line pricing confidence (`high` = catalog, `low` = fallback), design-time carbon (`cloudwright cost --carbon`), and FOCUS-spec CSV export (`--focus`). +- **Drift -> remediation and OpenTofu.** `cloudwright drift ... --remediate` turns drift into a cost + compliance + plan preview (read-only). `cloudwright export --format opentofu` and a tofu-aware `plan`. +- **Hardening.** Terraform exporter injection hardening, `cloudwright plan` no longer carries the LLM key into the IaC subprocess, the WAF export is deployable, and the "compliance overrides workload profile" guarantee is now actually enforced for sandbox specs. + +```bash +cloudwright review spec.yaml # offline, no API key +cloudwright compliance spec.yaml --frameworks fedramp --oscal # OSCAL component-definition +cloudwright cost spec.yaml --carbon --focus # region-aware + carbon + FOCUS CSV +cloudwright export spec.yaml --format opentofu -o ./infra +``` + +See [docs/](docs/) for getting-started, CLI, MCP, and troubleshooting guides. + +## What's new in v1.5.0 Terminal — `cloudwright compliance` maps every finding to its framework control ID, then `cloudwright plan` proves the Terraform validates: diff --git a/docs/cli-reference.md b/docs/cli-reference.md new file mode 100644 index 0000000..4f42d26 --- /dev/null +++ b/docs/cli-reference.md @@ -0,0 +1,664 @@ +# CLI Reference + +Full reference for the `cloudwright` command. See [Getting Started](getting-started.md) for the quick path. + +Related: [Troubleshooting](troubleshooting.md) | [MCP Reference](mcp-reference.md) | [README](../README.md) + +--- + +## Global flags + +These go **before** the subcommand: + +```bash +cloudwright [--json] [--stream] [--verbose] [--dry-run] ... +``` + +| Flag | Description | +|---|---| +| `--json` | Output as JSON instead of rich terminal output | +| `--stream` | NDJSON streaming — one JSON object per line (combine with `--json`) | +| `--dry-run` | Preview LLM calls without making them (shows model, tokens, prompt preview) | +| `--verbose` / `-v` | Verbose logging | +| `--version` / `-V` | Print version and exit | + +--- + +## Design and modify + +### `design` + +Generate a cloud architecture from a natural-language description. + +**Requires:** `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` + +```bash +cloudwright design [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--provider` | `aws` | Cloud provider: `aws`, `gcp`, `azure`, `databricks` | +| `--region` | `us-east-1` | Primary region | +| `--budget` | none | Monthly budget cap in USD | +| `--compliance` | none | Compliance framework(s): `hipaa`, `pci-dss`, `soc2`, `fedramp`, `gdpr`. Repeatable. | +| `--output` / `-o` | auto-save | Write YAML to this file | +| `--yaml` | off | Show YAML panel instead of ASCII diagram | + +Examples: + +```bash +cloudwright design "HIPAA-compliant healthcare API on AWS with Postgres and Redis" +cloudwright design "serverless event pipeline" --provider gcp --region us-central1 +cloudwright design "e-commerce platform" --compliance pci-dss --budget 3000 -o shop.yaml +``` + +v1.6 note: `design` now runs a generate->critique->repair loop. Blocking findings (missing encryption, SPOFs, missing load balancer) are fed back to the model so it self-corrects before the spec is returned. + +--- + +### `modify` + +Apply a natural-language modification to an existing spec. Shows a structured diff and cost delta before writing. + +**Requires:** `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` + +```bash +cloudwright modify [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--output` / `-o` | overwrite input | Write modified spec here | +| `--dry-run` | off | Show changes without writing | + +Examples: + +```bash +cloudwright modify spec.yaml "add a Redis cache between the API and the database" +cloudwright modify spec.yaml "move compute from ECS to Lambda" -o serverless.yaml +cloudwright modify spec.yaml "upgrade the database to Aurora Serverless v2" --dry-run +``` + +--- + +### `compare` + +Translate a spec to one or more other cloud providers and show a side-by-side service and cost comparison. + +**Requires:** `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` + +```bash +cloudwright compare --providers +``` + +Example: + +```bash +cloudwright compare spec.yaml --providers gcp,azure +``` + +--- + +### `chat` + +Multi-turn interactive architecture design. In terminal mode, type a description to get started; use `/help` to see in-session commands (`/yaml`, `/diagram`, `/cost`, `/validate`, `/terraform`, `/export `, `/save`, `/new`). + +**Requires:** `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` + +```bash +cloudwright chat [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--web` | off | Launch web canvas at `http://localhost:8765` instead of terminal | +| `--port` | `8765` | Port for `--web` | +| `--resume` | none | Resume a saved session by ID | +| `--debug` | off | Log LLM requests and token counts to stderr | + +```bash +cloudwright chat # terminal session +cloudwright chat --web # browser canvas +cloudwright chat --resume abc123 # resume prior session +``` + +--- + +## Cost + +### `cost` + +Show monthly cost breakdown for an existing spec. Runs offline. + +```bash +cloudwright cost [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--compare` | none | Comma-separated providers for multi-cloud cost comparison | +| `--pricing-tier` | `on_demand` | `on_demand`, `reserved_1yr`, `reserved_3yr`, `spot` | +| `--workload-profile` / `-w` | none | `small`, `medium`, `large`, `enterprise` — sets realistic traffic/storage defaults | + +Examples: + +```bash +cloudwright cost spec.yaml +cloudwright cost spec.yaml --workload-profile medium +cloudwright cost spec.yaml --compare gcp,azure +cloudwright cost spec.yaml --pricing-tier reserved_1yr +``` + +--- + +## Validate and compliance + +### `validate` + +Run compliance or Well-Architected checks against a spec. Exit code 1 on any failure. + +Runs offline. + +```bash +cloudwright validate --compliance [options] +cloudwright validate --well-architected [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--compliance` | none | Comma-separated frameworks: `hipaa`, `pci-dss`, `soc2`, `fedramp`, `gdpr` | +| `--well-architected` | off | Run Well-Architected pillar checks | +| `--report` | none | Write a markdown compliance report to this path | +| `--pdf` | none | Write a PDF compliance report (requires `cloudwright-ai[pdf]`) | + +Examples: + +```bash +cloudwright validate spec.yaml --compliance hipaa,soc2 +cloudwright validate spec.yaml --well-architected +cloudwright validate spec.yaml --compliance pci-dss --report report.md +``` + +--- + +### `compliance` + +Deeper scan that maps every finding to its exact framework control ID. Optionally folds in a Checkov deep scan against the exported Terraform. + +Runs offline. Checkov integration requires `pip install 'cloudwright-ai[compliance]'` and `checkov` on PATH. + +```bash +cloudwright compliance [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--frameworks` / `-f` | all | Comma-separated: `hipaa`, `soc2`, `pci-dss`, `fedramp`, `gdpr`, `iso27001`, `nist` | +| `--checkov` / `--no-checkov` | auto-detect | Force or skip the Checkov deep scan | +| `--fail-on` | `high` | Fail on: `critical`, `high`, `medium`, `none` | +| `--output` / `-o` | none | Write a markdown control report to this path | + +Examples: + +```bash +cloudwright compliance spec.yaml +cloudwright compliance spec.yaml --frameworks hipaa,soc2 -o controls.md +cloudwright compliance spec.yaml --checkov --fail-on critical +``` + +--- + +### `security` + +Scan for security anti-patterns: unencrypted stores, public-facing databases, missing WAF, weak auth, overly permissive protocols. + +Runs offline. + +```bash +cloudwright security [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--fail-on` | `high` | Fail on: `critical`, `high`, `medium`, `none` | +| `--output` / `-o` | none | Write findings to a file | + +Example: + +```bash +cloudwright security spec.yaml --fail-on medium +``` + +--- + +### `review` (v1.6) + +Unified offline review: runs scorer, linter, and validator together and returns a single severity-ranked finding list. Free, no API key required. + +```bash +cloudwright review [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--compliance` | none | Comma-separated frameworks to include in the validator pass | +| `--well-architected` | off | Include Well-Architected checks | + +Examples: + +```bash +cloudwright review spec.yaml +cloudwright review spec.yaml --compliance hipaa --well-architected +cloudwright --json review spec.yaml +``` + +--- + +## Export and plan + +### `export` + +Export an ArchSpec to IaC, diagram, or audit formats. + +Runs offline (SVG/PNG require the D2 binary: `curl -fsSL https://d2lang.com/install.sh | sh`). + +```bash +cloudwright export --format [options] +``` + +| Option | Description | +|---|---| +| `--format` / `-f` | `terraform`, `pulumi-ts`, `pulumi-python`, `cloudformation`, `mermaid`, `d2`, `svg`, `png`, `sbom`, `aibom` | +| `--output` / `-o` | Output file or directory. For `terraform`, `pulumi-ts`, `pulumi-python`: pass a directory path for a full project layout. | + +Examples: + +```bash +cloudwright export spec.yaml --format terraform -o ./infra +cloudwright export spec.yaml --format pulumi-ts -o ./infra +cloudwright export spec.yaml --format cloudformation -o template.yaml +cloudwright export spec.yaml --format mermaid +cloudwright export spec.yaml --format sbom -o sbom.json +``` + +--- + +### `plan` + +Prove the exported infrastructure is deployable. Runs `terraform validate` and optionally `terraform plan` (or `pulumi preview`). Nothing is applied. + +Requires Terraform or Pulumi on PATH. `--no-plan` skips the credential-requiring plan step. + +```bash +cloudwright plan [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--target` / `-t` | `terraform` | `terraform`, `pulumi-python`, `pulumi-ts` | +| `--no-plan` | off | Validate only (no credentials needed) | +| `--timeout` | `180` | Seconds before the plan step is aborted | + +Examples: + +```bash +cloudwright plan spec.yaml +cloudwright plan spec.yaml --no-plan +cloudwright plan spec.yaml --target pulumi-ts +cloudwright --json plan spec.yaml +``` + +--- + +## Import and drift + +### `import` + +Import an existing Terraform state file or CloudFormation template into an ArchSpec YAML. + +Runs offline. + +```bash +cloudwright import [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--format` / `-f` | auto-detect | `terraform` or `cloudformation` | +| `--output` / `-o` | stdout | Write ArchSpec YAML to this file | +| `--name` | from source | Override the architecture name | + +Examples: + +```bash +cloudwright import terraform.tfstate -o spec.yaml +cloudwright import stack.yaml --format cloudformation -o spec.yaml +``` + +--- + +### `import-live` + +Walk live cloud APIs to produce an ArchSpec from running infrastructure. Requires `pip install 'cloudwright-ai[live-import]'` and cloud credentials. + +```bash +cloudwright import-live [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--provider` | `aws` | `aws`, `gcp`, `azure` | +| `--region` | `us-east-1` | Cloud region | +| `--profile` | none | AWS named profile (`~/.aws/credentials`) | +| `--project` | none | GCP project ID (or `GOOGLE_CLOUD_PROJECT` env) | +| `--subscription` | none | Azure subscription ID (or `AZURE_SUBSCRIPTION_ID` env) | +| `--services` | all | Comma-separated subset, e.g. `ec2,rds,s3` | +| `--output` / `-o` | stdout | Write ArchSpec YAML to this file | +| `--name` | auto | Override the architecture name | + +Examples: + +```bash +cloudwright import-live --provider aws --region us-east-1 -o spec.yaml +cloudwright import-live --provider aws --profile staging --services ec2,rds +cloudwright import-live --provider gcp --project my-project-123 -o gcp-spec.yaml +cloudwright import-live --provider azure --subscription xxxxxxxx-xxxx-... -o azure.yaml +``` + +--- + +### `drift` + +Compare a design spec against deployed infrastructure to detect configuration drift. + +Runs offline. + +```bash +cloudwright drift [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--format` / `-f` | `auto` | Infrastructure format: `auto`, `terraform`, `cloudformation` | + +Example: + +```bash +cloudwright drift spec.yaml terraform.tfstate +cloudwright --json drift spec.yaml stack.yaml --format cloudformation +``` + +--- + +### `diff` + +Show the structural diff between two ArchSpec files: added, removed, and changed components, and total cost delta. + +Runs offline. + +```bash +cloudwright diff +``` + +Example: + +```bash +cloudwright diff v1.yaml v2.yaml +cloudwright --json diff v1.yaml v2.yaml +``` + +--- + +## Analysis + +### `lint` + +Detect architecture anti-patterns: unencrypted data stores, single-AZ databases, missing load balancer on public compute, missing auth, oversized instances. + +Runs offline. + +```bash +cloudwright lint [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--strict` | off | Fail on warnings in addition to errors | + +Example: + +```bash +cloudwright lint spec.yaml +cloudwright lint spec.yaml --strict +cloudwright --json --stream lint spec.yaml +``` + +--- + +### `score` + +Score an architecture across 5 dimensions: reliability (30%), security (25%), cost efficiency (20%), compliance (15%), complexity (10%). Returns 0-100 with a letter grade. + +Runs offline. + +```bash +cloudwright score [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--with-cost` | off | Run cost estimation before scoring (improves cost-dimension accuracy) | + +Example: + +```bash +cloudwright score spec.yaml +cloudwright score spec.yaml --with-cost +``` + +--- + +### `analyze` + +Analyze blast radius, single points of failure, and dependency structure. + +Runs offline. + +```bash +cloudwright analyze [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--component` / `-c` | all | Focus analysis on a specific component ID | + +Examples: + +```bash +cloudwright analyze spec.yaml +cloudwright analyze spec.yaml --component rds_primary +``` + +--- + +### `policy` + +Evaluate a spec against custom policy rules defined in a YAML file. Built-in checks cover budget limits, provider constraints, required components, and compliance flags. + +Runs offline. + +```bash +cloudwright policy --rules +``` + +Exit code 1 when any `deny` rule fires. + +--- + +### `adr` + +Generate an Architecture Decision Record (MADR format) from a spec. + +**Requires:** `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` (falls back to a deterministic template if the LLM is unavailable). + +```bash +cloudwright adr [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--output` / `-o` | stdout | Write the ADR markdown to this file | +| `--title` | auto | ADR title | +| `--decision` | auto | Specific decision to document | + +Example: + +```bash +cloudwright adr spec.yaml -o docs/adr-001.md +cloudwright adr spec.yaml --decision "use Aurora Serverless over standard RDS" +``` + +--- + +## Misc + +### `init` + +Create an ArchSpec from a pre-built template. Use `--list` to see available templates. + +Runs offline. + +```bash +cloudwright init --template [options] +cloudwright init --list +``` + +| Option | Default | Description | +|---|---|---| +| `--template` / `-t` | none | Template name (see `--list`) | +| `--output` / `-o` | `spec.yaml` | Output file | +| `--list` / `-l` | off | List available templates | +| `--provider` | from template | Override provider | +| `--region` | from template | Override region | +| `--name` | from template | Override architecture name | +| `--compliance` | none | Comma-separated compliance frameworks | +| `--budget` | none | Monthly budget in USD | +| `--project` / `-p` | off | Create a `.cloudwright/` project directory with a config file | + +Examples: + +```bash +cloudwright init --list +cloudwright init --template aws-three-tier -o infra.yaml +cloudwright init --template aws-three-tier --compliance hipaa --budget 5000 +``` + +--- + +### `schema` + +Look up service config fields, pricing formula, and cross-cloud equivalents, or list the checks for a compliance framework. + +Runs offline. + +```bash +cloudwright schema +``` + +`query` is either a `provider.service` key (e.g. `aws.ec2`, `gcp.cloud_sql`) or a compliance framework name (`hipaa`, `soc2`). + +Examples: + +```bash +cloudwright schema aws.ec2 +cloudwright schema gcp.cloud_run +cloudwright schema hipaa +cloudwright --json schema aws.rds +``` + +--- + +### `catalog` + +Search and compare cloud instances from the bundled pricing catalog. + +Runs offline. + +```bash +cloudwright catalog search [options] +cloudwright catalog compare ... +``` + +| `search` option | Description | +|---|---| +| `--provider` | Filter by provider: `aws`, `gcp`, `azure` | +| `--vcpus` | Minimum vCPUs | +| `--memory` | Minimum memory in GB | + +Examples: + +```bash +cloudwright catalog search "memory-optimized aws" +cloudwright catalog search "4 vcpu 32gb" --provider aws +cloudwright catalog compare m5.xlarge m6i.xlarge +``` + +--- + +### `refresh` + +Fetch live pricing from cloud provider APIs and write into the local catalog database. + +Requires network access. Does not require an LLM key. + +```bash +cloudwright refresh [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--provider` / `-p` | all | `aws`, `gcp`, or `azure` | +| `--category` / `-c` | all | Filter to a category or service name | +| `--region` / `-r` | default | Override region for pricing lookups | +| `--dry-run` | off | Fetch but don't write to catalog | + +--- + +### `databricks-validate` + +Validate Databricks components in a spec against a live workspace. Requires `pip install 'cloudwright-ai[databricks]'` and `DATABRICKS_HOST` / `DATABRICKS_TOKEN`. + +```bash +cloudwright databricks-validate [--host URL] [--token TOKEN] +``` + +--- + +### `mcp` + +Start an MCP server exposing Cloudwright tools to AI agents (Claude Desktop, Cursor, Cline). + +```bash +cloudwright mcp [options] +``` + +| Option | Default | Description | +|---|---|---| +| `--tools` / `-t` | all | Comma-separated tool groups: `design`, `cost`, `validate`, `analyze`, `export`, `session` | +| `--transport` | `stdio` | `stdio` or `sse` | + +See [MCP Reference](mcp-reference.md) for setup instructions. + +## New flags in v1.6.0 + +| Command | Flag | Purpose | +|---|---|---| +| `compliance` | `--oscal` / `-O` | Also emit an OSCAL 1.1.2 component-definition JSON (to `.oscal.json` when `--output` is set, else stdout). | +| `compliance` | `--traceability` | Print the chain component -> Terraform resource -> framework control ID -> status. | +| `cost` | `--carbon` | Include a design-time carbon (kg CO2e/month) estimate. | +| `cost` | `--focus` | Emit a FinOps FOCUS-spec CSV of the cost line items (`-o file.csv` or stdout). | +| `export` | `--format opentofu` | Alias for the Terraform HCL target (OpenTofu-compatible). `tofu`/`terraform` for `plan` is auto-detected; override with `CLOUDWRIGHT_TF_BINARY`. | +| `drift` | `--remediate` | Turn detected drift into a read-only remediation preview: diff -> cost delta -> quality delta -> terraform/tofu plan. | + +`cloudwright design` now runs a generate -> critique -> repair loop by default and records a `critique` block (score, grade, findings, repair iterations) in `spec.metadata`. The same critics are exposed offline as `cloudwright review `. diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 0000000..f408ad7 --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,231 @@ +# Getting Started + +This guide gets you from zero to a deployable architecture spec in about five minutes. + +Related: [CLI Reference](cli-reference.md) | [Troubleshooting](troubleshooting.md) | [MCP Reference](mcp-reference.md) | [README](../README.md) + +--- + +## Install + +Cloudwright is published as four packages. The `[cli]` extra is the starting point for most users. + +```bash +pip install 'cloudwright-ai[cli]' +``` + +Other extras: + +| Extra | What it adds | +|---|---| +| `[cli]` | The `cloudwright` command | +| `[web]` | FastAPI backend + React canvas (`cloudwright chat --web`) | +| `[mcp]` | MCP server for Claude Desktop / Cursor / Cline | +| `[all]` | All of the above | +| `[pdf]` | PDF compliance report export | +| `[live-import]` | `import-live` for AWS, GCP, and Azure | +| `[live-import-aws]` | AWS-only live import (boto3) | +| `[live-import-gcp]` | GCP-only live import | +| `[live-import-azure]` | Azure-only live import | +| `[compliance]` | Checkov deep scan in `cloudwright compliance` | +| `[databricks]` | `databricks-validate` adapter | + +All extras together: + +```bash +pip install 'cloudwright-ai[all]' +``` + +Requires Python 3.12 or later. + +--- + +## Set your API key + +`cloudwright design`, `cloudwright modify`, `cloudwright compare`, `cloudwright chat`, and `cloudwright adr` call an LLM. All other commands run offline. + +```bash +export ANTHROPIC_API_KEY=sk-ant-... +``` + +OpenAI also works: + +```bash +export OPENAI_API_KEY=sk-... +``` + +Cloudwright picks up whichever key is present. Anthropic (Claude Sonnet for design, Haiku for projection) is preferred when both are set. + +--- + +## Design your first architecture + +```bash +cloudwright design "3-tier web app on AWS with PostgreSQL and Redis" +``` + +This runs the LLM, prints an ASCII diagram and cost table, and auto-saves a `spec.yaml` in the current directory. v1.6 adds a generate->critique->repair loop: blocking findings (missing encryption, single points of failure) are fed back to the model before the spec is returned. + +Common options: + +```bash +# Target a different provider or region +cloudwright design "serverless API" --provider gcp --region us-central1 + +# Add compliance constraints +cloudwright design "healthcare API with Postgres" --compliance hipaa --compliance soc2 + +# Set a monthly budget cap +cloudwright design "data pipeline" --budget 2000 + +# Save spec to a specific file +cloudwright design "..." -o my-arch.yaml + +# Print YAML panel instead of ASCII diagram +cloudwright design "..." --yaml +``` + +The global `--dry-run` flag shows what the LLM call would look like without making it: + +```bash +cloudwright --dry-run design "3-tier web app on AWS" +``` + +--- + +## Estimate cost + +`cost` runs offline against a bundled SQLite pricing catalog. No API key needed. + +```bash +cloudwright cost spec.yaml +cloudwright cost spec.yaml --workload-profile medium +``` + +Workload profiles (`small`, `medium`, `large`, `enterprise`) set realistic defaults for request volumes, storage, node counts, and data transfer. + +--- + +## Validate against a compliance framework + +```bash +cloudwright validate spec.yaml --compliance hipaa +cloudwright validate spec.yaml --compliance hipaa,soc2 +cloudwright validate spec.yaml --well-architected +cloudwright validate spec.yaml --compliance pci-dss --report report.md +``` + +Available frameworks: `hipaa`, `pci-dss`, `soc2`, `fedramp`, `gdpr`, plus `well-architected`. Exit code is non-zero when any check fails. + +For a deeper scan that maps each finding to its specific control ID (HIPAA `164.312`, SOC 2 `CC6.1`, FedRAMP `SC-28`, PCI-DSS, GDPR, ISO 27001, NIST 800-53) and optionally folds in Checkov against the generated Terraform: + +```bash +cloudwright compliance spec.yaml --frameworks hipaa,soc2 +``` + +--- + +## Export to Terraform (or Pulumi / CloudFormation) + +```bash +# Print HCL to stdout +cloudwright export spec.yaml --format terraform + +# Write a Terraform project directory +cloudwright export spec.yaml --format terraform -o ./infra + +# Pulumi TypeScript or Python project +cloudwright export spec.yaml --format pulumi-ts -o ./infra +cloudwright export spec.yaml --format pulumi-python -o ./infra + +# CloudFormation YAML +cloudwright export spec.yaml --format cloudformation -o template.yaml +``` + +All IaC exporters apply safe defaults: S3 public-access blocks, RDS encryption and deletion protection, EC2 IMDSv2, CloudFront TLSv1.2_2021. + +--- + +## Prove the export deploys (requires Terraform or Pulumi on PATH) + +```bash +# Offline proof: runs terraform validate, no cloud credentials needed +cloudwright plan spec.yaml --no-plan + +# Full proof: runs terraform plan with a real resource diff +cloudwright plan spec.yaml +``` + +Nothing is applied. The verdict is `DEPLOYABLE` or `NOT DEPLOYABLE`. + +--- + +## Commands that work fully offline + +No LLM call, no cloud API call, no environment variables needed: + +| Command | What it does | +|---|---| +| `cost` | Estimate monthly bill from bundled catalog | +| `validate` | Compliance and Well-Architected checks | +| `review` | Unified scorer + linter + validator (v1.6) | +| `export` | Generate Terraform / Pulumi / CloudFormation / diagrams | +| `diff` | Compare two ArchSpec files | +| `drift` | Compare spec against .tfstate or CloudFormation template | +| `lint` | Architecture anti-pattern detection | +| `score` | 5-dimension quality score (0-100) | +| `analyze` | Blast radius and SPOF analysis | +| `security` | Security anti-pattern scan | +| `compliance` | Control-mapped compliance scan (Checkov is optional) | +| `import` | Import .tfstate or CloudFormation into an ArchSpec | +| `schema` | Browse service configs and compliance checks | +| `catalog search` | Search cloud instance catalog | +| `catalog compare` | Compare instance types side by side | +| `init` | Create a spec from a pre-built template | + +Commands that call an LLM (require `ANTHROPIC_API_KEY` or `OPENAI_API_KEY`): + +- `design` — generate a new architecture +- `modify` — update an existing spec with a natural-language instruction +- `compare` — translate a spec to other providers +- `chat` — multi-turn terminal or web session +- `adr` — generate an Architecture Decision Record + +--- + +## Web canvas + +```bash +pip install 'cloudwright-ai[web]' +cloudwright chat --web +``` + +Opens `http://localhost:8765`. The canvas lets you chat to design, drag and drop components, edit fields, add resources from the catalog drawer, and run Compliance and Plan checks in the UI. + +Use a different port: + +```bash +cloudwright chat --web --port 9000 +``` + +--- + +## Machine-readable output + +Every command accepts `--json` before the subcommand: + +```bash +cloudwright --json cost spec.yaml +cloudwright --json validate spec.yaml --compliance hipaa + +# NDJSON streaming: one JSON line per finding +cloudwright --json --stream security spec.yaml +``` + +--- + +## Next steps + +- [CLI Reference](cli-reference.md) — every command with all options +- [Troubleshooting](troubleshooting.md) — common errors and fixes +- [MCP Reference](mcp-reference.md) — use Cloudwright from Claude Desktop or Cursor diff --git a/docs/mcp-reference.md b/docs/mcp-reference.md new file mode 100644 index 0000000..a0a7105 --- /dev/null +++ b/docs/mcp-reference.md @@ -0,0 +1,216 @@ +# MCP Reference + +Cloudwright exposes 18 tools across 6 groups as a Model Context Protocol (MCP) server. Any MCP-compatible client (Claude Desktop, Cursor, Cline, and others) can call these tools directly. + +Related: [Getting Started](getting-started.md) | [CLI Reference](cli-reference.md) | [Troubleshooting](troubleshooting.md) | [README](../README.md) + +--- + +## Install + +The MCP server is a separate package: + +```bash +pip install cloudwright-ai-mcp +``` + +Or install it alongside the CLI and web extras: + +```bash +pip install 'cloudwright-ai[all]' +``` + +--- + +## Configure Claude Desktop + +Add this to `claude_desktop_config.json` (same shape works for Cursor and Cline): + +```json +{ + "mcpServers": { + "cloudwright": { + "command": "cloudwright", + "args": ["mcp"] + } + } +} +``` + +On macOS, the config file is at: +`~/Library/Application Support/Claude/claude_desktop_config.json` + +Restart Claude Desktop after editing the file. + +--- + +## Start the server manually + +```bash +# All 18 tools, stdio transport (default) +cloudwright mcp + +# Subset of tool groups +cloudwright mcp --tools design,cost + +# SSE transport for HTTP clients +cloudwright mcp --transport sse +``` + +Valid tool group names for `--tools`: `design`, `cost`, `validate`, `analyze`, `export`, `session`. + +--- + +## Tool groups and tools + +### design (3 tools) + +LLM-powered tools for creating and evolving architectures. These call an LLM and require `ANTHROPIC_API_KEY` or `OPENAI_API_KEY`. + +| Tool | Description | +|---|---| +| `design_architecture` | Generate a cloud architecture from a natural-language description. Returns a complete ArchSpec with components, connections, and cost estimate. | +| `modify_architecture` | Apply a natural-language modification instruction to an existing ArchSpec. Returns an updated spec. | +| `compare_providers` | Translate an ArchSpec to one or more target providers, returning one alternative ArchSpec per provider. | + +--- + +### cost (2 tools) + +Pricing computation. Both tools are pure offline calculation — no LLM, no network, no API cost. + +| Tool | Description | +|---|---| +| `estimate_cost` | Estimate the monthly bill for an ArchSpec. Returns a per-component breakdown and total. Supports pricing tiers: `on_demand`, `reserved_1yr`, `reserved_3yr`, `spot`. | +| `compare_provider_costs` | Compare the monthly cost totals of an ArchSpec across cloud providers. Returns one numeric cost summary per provider. | + +--- + +### validate (4 tools) + +Static analysis and compliance checks. All tools are offline — no LLM, no network, read-only. + +| Tool | Description | +|---|---| +| `validate_compliance` | Validate an ArchSpec against compliance frameworks (`hipaa`, `pci-dss`, `soc2`, `fedramp`, `gdpr`). Returns pass/fail per check with remediation hints. | +| `security_scan` | Scan an ArchSpec for security anti-patterns (unencrypted stores, public databases, missing WAF, weak auth). Returns severity-graded findings per component. | +| `scan_terraform` | Scan Terraform HCL source directly for security misconfigurations. No Terraform binary invoked. | +| `lint_architecture` | Lint an ArchSpec for architectural anti-patterns. Returns warnings with rule name, severity, component IDs, and recommendation. | + +--- + +### analyze (3 tools) + +Structural analysis and quality scoring. All tools are offline, read-only. + +| Tool | Description | +|---|---| +| `analyze_blast_radius` | Analyze blast radius, SPOFs, and dependency structure. Returns direct and transitive dependents per component. Optionally scoped to one component ID. | +| `score_architecture` | Score an ArchSpec across 5 dimensions (reliability, security, cost efficiency, compliance, complexity). Returns per-dimension scores, weighted total (0-100), and letter grade. | +| `diff_architectures` | Diff two ArchSpec files. Returns added/removed/changed components, connections, cost delta, compliance impact, and a human-readable summary. | + +--- + +### export (3 tools) + +IaC generation and catalog lookup. All tools are offline. + +| Tool | Description | +|---|---| +| `export_architecture` | Export an ArchSpec to Terraform HCL, CloudFormation YAML, Mermaid, D2, SBOM, AIBOM, or compliance markdown. Returns `{format, content}`. | +| `list_services` | List all cloud services in the registry for a given provider (aws, gcp, azure, databricks). Returns slug, name, category, and supported tiers per service. | +| `catalog_search` | Search the cloud instance catalog by provider, text query, vCPU count, memory size, or maximum hourly price. Returns matching instances with specs and pricing. | + +--- + +### session (4 tools) + +Stateful multi-turn conversation sessions. `chat_send` calls an LLM (requires an API key); the others are offline. + +| Tool | Description | +|---|---| +| `chat_create_session` | Create a stateful design session. Returns a `session_id` handle. Accepts optional provider, monthly budget, and compliance constraints frozen for the session. | +| `chat_send` | Send a message to an existing session. Returns the LLM response text, updated ArchSpec (if produced), and token usage for this turn and cumulative. | +| `chat_list_sessions` | List all saved sessions with metadata: session_id, timestamps, token usage, and whether a spec is present. | +| `chat_delete_session` | Delete a session and its history. Destructive — no undo. Returns `{deleted: true}` on success. | + +--- + +## Example: design and export from Claude + +Once configured, you can ask Claude: + +> "Design a HIPAA-compliant 3-tier API on AWS with PostgreSQL, then export it as Terraform." + +Claude will call `design_architecture` with `compliance=["hipaa"]`, receive the ArchSpec, then call `export_architecture` with `format="terraform"` and return the HCL. + +--- + +## Example: multi-turn session + +``` +User: Create a conversation session for an AWS architecture with a $5000/month budget. + [calls chat_create_session -> {session_id: "abc123def456"}] + +User: Design a web app with a CDN and a managed database. + [calls chat_send(session_id="abc123def456", message="Design...")] + +User: Add a Redis cache. + [calls chat_send(session_id="abc123def456", message="Add a Redis cache")] +``` + +Sessions persist across Claude Desktop restarts (stored on disk in `~/.cloudwright/sessions/`). + +--- + +## Which tools need an API key + +Tools that call an LLM (`ANTHROPIC_API_KEY` or `OPENAI_API_KEY` required): + +- `design_architecture` +- `modify_architecture` +- `compare_providers` +- `chat_send` + +All other tools are pure computation: no LLM, no network, no cost beyond the MCP call itself. + +--- + +## Partial tool registration + +To limit which tools the AI agent can call (useful for cost control or read-only contexts): + +```bash +# Only offline analysis tools +cloudwright mcp --tools validate,analyze,export + +# Only design tools (LLM-backed) +cloudwright mcp --tools design,session + +# Cost tools only +cloudwright mcp --tools cost +``` + +--- + +## SSE transport + +For clients that prefer HTTP/SSE over stdio: + +```bash +cloudwright mcp --transport sse +``` + +The server listens on a local port. Configure the client with the SSE endpoint URL instead of a command/args pair. + +--- + +## Troubleshooting MCP + +**Tools not appearing in Claude Desktop:** Restart Claude Desktop after editing `claude_desktop_config.json`. Confirm `cloudwright` is on PATH by running `cloudwright --version` in a terminal. + +**`cloudwright-ai-mcp` not installed:** Run `pip install cloudwright-ai-mcp` and confirm the `cloudwright` binary is the one from that environment. + +**LLM tools return errors:** Set `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` in the shell environment where Claude Desktop runs (on macOS, this may require setting it in `~/.zshenv` rather than `~/.zshrc`). + +See [Troubleshooting](troubleshooting.md) for more. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md new file mode 100644 index 0000000..728a70a --- /dev/null +++ b/docs/troubleshooting.md @@ -0,0 +1,362 @@ +# Troubleshooting + +Common errors and how to fix them. + +Related: [Getting Started](getting-started.md) | [CLI Reference](cli-reference.md) | [README](../README.md) + +--- + +## Missing API key + +**Symptom:** + +``` +Error: No LLM provider configured. Set ANTHROPIC_API_KEY or OPENAI_API_KEY. +``` + +or + +``` +RuntimeError: No LLM provider configured. +``` + +**Fix:** + +```bash +export ANTHROPIC_API_KEY=sk-ant-... +# or +export OPENAI_API_KEY=sk-... +``` + +This is only required for commands that call an LLM: `design`, `modify`, `compare`, `chat`, and `adr`. Everything else runs offline. + +To verify which commands are offline, see the [command list in Getting Started](getting-started.md#commands-that-work-fully-offline). + +--- + +## Wrong extras version (lockstep requirement) + +**Symptom:** + +``` +ImportError: cannot import name 'X' from 'cloudwright' +``` + +or features from a recent release are missing after upgrading. + +**Cause:** + +The four Cloudwright packages (`cloudwright-ai`, `cloudwright-ai-cli`, `cloudwright-ai-web`, `cloudwright-ai-mcp`) must be on the same version. The extras pins in `cloudwright-ai[cli]` etc. enforce this, but a partial install or a manual pip upgrade of just one package can break the lockstep. + +**Fix:** + +```bash +pip install 'cloudwright-ai[all]=={version}' --force-reinstall +``` + +Replace `{version}` with the target version (e.g. `1.6.0`). Check the current installed version with: + +```bash +cloudwright --version +``` + +--- + +## `cloudwright plan` fails because terraform is not on PATH + +**Symptom:** + +``` +[SKIP] terraform not found on PATH +``` + +or + +``` +FileNotFoundError: terraform +``` + +**Fix:** + +Install Terraform: https://developer.hashicorp.com/terraform/install + +Then verify: + +```bash +terraform version +``` + +If you only want offline proof without cloud credentials, pass `--no-plan`: + +```bash +cloudwright plan spec.yaml --no-plan +``` + +This runs `terraform validate` only and does not need credentials. + +For Pulumi targets, install Pulumi: https://www.pulumi.com/docs/install/ + +--- + +## `cloudwright plan` times out + +**Symptom:** + +``` +[SKIP] plan timed out after 180s +``` + +or the command hangs for several minutes before failing. + +**Fix:** + +Extend the timeout (in seconds): + +```bash +cloudwright plan spec.yaml --timeout 600 +``` + +Common causes: slow network when Terraform downloads provider plugins on first init, or an unusually large plan against a cloud account with many existing resources. + +--- + +## Provider credential errors during `plan` or `import-live` + +**Symptom:** + +``` +Error: No valid credential sources found for AWS Provider. +``` + +or permission-denied messages from GCP / Azure. + +**Fix for plan:** Use `--no-plan` to skip the credential-requiring step: + +```bash +cloudwright plan spec.yaml --no-plan +``` + +**Fix for import-live:** Configure credentials before running: + +- AWS: `aws configure` or set `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY`, or use `--profile ` for a named profile. +- GCP: `gcloud auth application-default login`, then pass `--project `. +- Azure: `az login`, then pass `--subscription `. + +Per-service permission errors during `import-live` are non-fatal. Components Cloudwright cannot read are skipped and reported on stderr. + +--- + +## Rate limiting + +**Symptom:** + +``` +Rate limited, try again in a moment. +``` + +or HTTP 429 responses from the LLM provider. + +**Fix:** + +Wait 10-30 seconds and retry. If this happens frequently, you are hitting the API tier's rate limit. Options: + +- Reduce concurrency if you are running multiple `design` calls in parallel. +- Use `--dry-run` to check prompt size without making the call. +- Upgrade your API tier on the provider's dashboard. + +--- + +## Provider download / network timeout during `plan` + +**Symptom:** + +Terraform stalls downloading a provider plugin, or the plan times out waiting for network. + +**Fix:** + +If you are behind a proxy, set `HTTPS_PROXY` in your environment before running `cloudwright plan`. Alternatively, pre-download the provider: + +```bash +cd /tmp && terraform init -from-module github.com/hashicorp/example +``` + +Or run with `--no-plan` to skip the network-dependent provider download: + +```bash +cloudwright plan spec.yaml --no-plan +``` + +--- + +## SVG or PNG export fails ("D2 binary not found") + +**Symptom:** + +``` +Warning: D2 binary not found — returning D2 source text. +``` + +or for PNG: + +``` +Error: D2 binary not found +``` + +**Fix:** + +```bash +curl -fsSL https://d2lang.com/install.sh | sh +``` + +Then verify: + +```bash +d2 --version +``` + +The `mermaid`, `terraform`, `cloudformation`, `sbom`, and `aibom` formats do not need D2. + +--- + +## PDF compliance report fails + +**Symptom:** + +``` +ImportError: No module named 'weasyprint' +``` + +**Fix:** + +```bash +pip install 'cloudwright-ai[pdf]' +``` + +--- + +## `import-live` fails with ImportError + +**Symptom:** + +``` +Live import core is unavailable. Install with: pip install 'cloudwright-ai[live-import]' +``` + +**Fix:** + +```bash +pip install 'cloudwright-ai[live-import]' +``` + +For provider-specific installs: + +```bash +pip install 'cloudwright-ai[live-import-aws]' # AWS only +pip install 'cloudwright-ai[live-import-gcp]' # GCP only +pip install 'cloudwright-ai[live-import-azure]' # Azure only +``` + +--- + +## `databricks-validate` fails with ImportError + +**Symptom:** + +``` +Error: databricks-sdk not installed. Run: pip install cloudwright-ai[databricks] +``` + +**Fix:** + +```bash +pip install 'cloudwright-ai[databricks]' +``` + +Then set `DATABRICKS_HOST` and `DATABRICKS_TOKEN` (or pass them as options). + +--- + +## Behavioral tests fail with API key set + +**Symptom (for contributors running the test suite):** + +Tests in `test_e2e.py`, `test_architect.py`, and the web `test_api.py` make live LLM calls when `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` is set, causing them to be slow or incur costs. + +**Fix:** + +Unset the keys before running tests to match CI behavior: + +```bash +env -u ANTHROPIC_API_KEY -u OPENAI_API_KEY python -m pytest packages/core/tests -q --timeout=60 +``` + +Live-LLM tests (`test_e2e.py::TestLLM::*`) are expected to fail with keys unset. This is not a regression. + +--- + +## Web canvas shows a blank page or errors on startup + +**Symptom:** + +Browser shows nothing or a JavaScript error after `cloudwright chat --web`. + +**Cause:** + +The static bundle in `packages/web/cloudwright_web/static/` may be stale (built from a previous version) or missing. + +**Fix:** + +Rebuild the frontend: + +```bash +cd packages/web/frontend && npm run build +rm -rf ../cloudwright_web/static +cp -r dist ../cloudwright_web/static +``` + +Then restart: + +```bash +cloudwright chat --web +``` + +--- + +## Port already in use + +**Symptom:** + +``` +Error: port 8765 is already in use. +``` + +**Fix:** + +```bash +cloudwright chat --web --port 9000 +``` + +--- + +## `cloudwright compliance` Checkov scan doesn't run + +**Symptom:** + +The compliance output shows `scanner: builtin` even though you expected Checkov to run. + +**Fix:** + +Checkov must be on PATH: + +```bash +pip install checkov +checkov --version +``` + +Also install the compliance extra: + +```bash +pip install 'cloudwright-ai[compliance]' +``` + +Checkov is auto-detected. You can force it with `--checkov` or skip it with `--no-checkov`. diff --git a/examples/cloudwright-review-demo.gif b/examples/cloudwright-review-demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..53b9fb35154b8ba630cbff999fda7141545b8c0c GIT binary patch literal 512975 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�unUIYa?x2^>mt@a}5-#bcw&{ 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%0D>8!B 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 SSYXeDr?svzVk}>mOV3)*POjnyl>S&|$;P_F zfMbCyn0a&@r9Md~wjH4xOYq&)M?p0@4WKgF^5_mgW1>dKYr2U@M_U7mX?%S@kX)^$ zD8HpMDb?}=lWs;8y3;uKYN%--X(H-4=Osxrr;s{=qRAE0q$pX0H15(@q>SWYt zl9~95m)Azbqzt-tMhz+c8fKD5Ceu-#JhXR>=F(3IN(_BF&L>A-(?m@->|mzRESZU<+41A-m=6 z?Ghkrn$8J2&*|EdyDsAS%Of#A%a>Pv`W)k%D+o(oz^-Zz)S$3G;g3$AMmw~{N2p11 zj(0}adDVBq7?2i!y!#ZV^jy*8<&?L7u87g(j<}m)5ejPe-0=aI1!`aD`rzr1u?pQi z?q~Yfpu@R^9!4XZDN5QwVy9OLn$ynaOHRZ$Bkn*$R1{>=?9l~tC-19B|jTq=1XTyl3Hp_8-vZ!yb#?KebB6yk0|yY ztnk-)g)hjaWT&m#PafNy_aKC=`{JUarPTJtFkaD}iC@tpsV%S$^phja;B4K9&z!OL zQhK_Ju^GFe{Y9aXCYLQ+V_cCmYGlWKy$u;yV69{`PQ81Bs3@*cwym?et7O6HDQA(| z28QzuyTcGD^p>8_;XI^wrvU95h{)F>aVce(kjXoBJk)ko55|r8o_wR#UPIG}+(}uK z)q%bVCh|a!79Zm|{OVEmQq7FDx7D~RQtO0v0(WF}9RVj8)s4DH)QKf?d5Mp{w)aIq^R(l!9Y)=WO;Ux8A0xdjxrUD*iZ4rd%)nK30_W5x zM*PE2_c0Qvw&5y9H!0c%_}Gl046fJtZ7T*%zeCoNjwOgaxU#3NR&w!~<#^hQqBWLf zc*9S$Y>LY~>>HBj^Uob6oB0XZ%g}jMM8LYU?Fbc%CRZWe@xZApN(L=-n254R>F6dnBPomAF@CHB3x=;Fe-+cCddVgO?W#%^AuM$9pn>n(0F<}LMq zeyOu@ajwbyZ`ND0MH>3!=$WOQ{1X+OYqpOOqAS`72#DRgCg)kHAvIk_KUnhFT*!Ial;ug&>j;W+t#kTz2pA836loC-eQOJGuvrXrK<`_J8a{kiImu z@&XU`i~`^x3SmABA&BkE)T|@`d8+yaOqoRZN)(*^o(H<~0K|ZwwJA>mWUw<87&LQ| zK!Pfu38~ru(nwINc&gY9@uV4vp+VRn)xq(=wV;BW{+L1=q;%f~j;4dEsx$yK7O9s4 z^Gyg4pVR^&on|6(o74wQwM#6`*%Hl-w87=$B_OK_VQd1FVJK|uW-ACmqG4Aa82PGXK?4ncURO1>x-qmD!qmZ*-I-XD#!?8}WXbjq3@9E@c9G(A zCfAZ-h;Y^93?ZEUqs$uJ)7WPn(wFY?i|YNb*~NKvzL(~TAY zX>BXhaDjjhOCp%63m~9}0SK{p3I8Gi(0p(GfMU(7LNaOt=@6h5Sc9EOX;2|qfzssx zxf@{pK|P{BcsvGOyjp6j%e$jof3M5Yy6CI%bOC1W{NmbGQNun> za(^)@rUYZj#>6;8DJvD@ZQou7RG`G($yUpm?ax6%G!02r-M+&9tGY+>ccbd9VEVBi zMCEuI>h-2@cfedIyI@IQ1CR-aVk}3L!Py!T4C9&+p>8-59O&*kkln1+-7)?-{p@I*dfit zVfPi@9hs^LAEXLPZEZN)_Dyfi@WX`{nhx;y@@Wqmnphu-aJ9627YC`jeAbg>W+gCw z@bbDhrre{9iZH%@7jvA3Cd=jdsm0HME#0GNj#Xi#-}GO3@NOl92-+4zX(kfC9DVGv z&2kL^`DxdeBPSp7^@bxTUz!Fmz3-yeT(~)0@RnD1Z7<(o;{!ykm*?_S?i*zV?TI?$ zi#S~Cj(n#|o1zO{+bopdY|f`u)HZy59`-vvu!;i~7v~r$6-QrJ+hV2#AWppR$R#aY zm>f&|_QG=hp29p#+8OT@e0m)9D>+g6u;EL0$NIQkYwQ17cLT!zR8>xE($R^5+AqD; z|FCOc#bZXb{nF+4Pp1!OidDL3IoCRB6rH@-ah)(sxJjFngOa4gcbTb6#O6 z)5GPBb4z|X{#l2<72E|#IJInzK=Gxn6|3IvS6P%Rh7Y%cD9tv*XeGZ0)d(&hownwH z{A2&JyXRg1`7X`Db?JWKpWgrEipq!GN3J|0e7ld+DiTsTg!zxB><|6D=1}izoe##J zsXxQlMtoX(>d)elzm|Mjx54x*jR}_c`(Y(J5a9s&eLoy{I~hwks5QUY3(F^Q_?jaA zEq%VOU;38gAZm)GMaeLjP%+{NV5Rjw@j?9si|K#D<;VG7V%_(>PSqV2*o$D9tq^X0 zT0JXVgUe(NCzyC;{-WW`DVZM{h2A}fLl8n1F3X>hwaF`MGbbxpl;z-+X;LBZs>lk* zEoDbAvZK7RV>sDyBKU49%b1h7y&`)zE+>hRv&SoEFDGYT2!CgYU|Y|@wAq})I1!&A z5_*ZUa9J5sD!Zm~vWG>5v!Wxo+!99aF_GwiL+)`=Ze>$$)o|{~rmT!6(J4mW8Lzy0 zPF|xZZ?Au@S&!)KY~FcXeg`A}0w+sE$?Fp3UvA33GMs;vviIC<_Fs&Gey@T-PQg`9 z{@SU$>%#>%XA5rO3Wd0WQA*)GPT>Pl;X_8|4NAeI*}}hZMbnI;F%oN0`9^IW%LfvuHB=@LkDBnPGbora3 z7H5yHG(Bbm3+RK7uF5^;c=nj{We2$Pfc^u8MgdEJg&LrTG=NV<0o)R>q%br8k(F~8 zwN$1$+)mHQGznO=S!qR=i|HZzGar+R-_*+=-qyZMq`nB$)*{bdNYN*Qiz1ow@?wwt1iTrI} z+w!oLApG#lX|o0MLR_U&R_~Ezj}Ij-@uw7J!W{J^&4!aR|Fk_;cAruOrvcP>r}<^i zRR_vwYWDkyE1tc5kjc)b_C6cjdb$7EKqYBEz?Y&1r8`Zdp2{PJc1-RUdCkvj+its( z@TECKS%529J)G+zUw)Z8KVqDCp>jO?OTjbby&_lN8KtVRp&w3VY}ctD!I$XjIdKvI zCDhWhYm(??eE!lg_(Q;18IgV9)*c1)lk~E5D=Bh0ZC3L@+Yi(UPG?LEE7Z8DogcS) z9a(4VkHCiFAg%bGZRjZeRH>T+&STQmqD?f3*Q%sMx@mKgZWtB$Cg&Ep=ouCll%#jD z&p=RRrq((1s%Qq{;lqpN^1wg=mMXCz56$t_$94R<(aPa=05dQn% z|NN5}!s)L1ztepku=Ly9pC!*DEji!}8Qcg30u{%~9Olxb`5Fe>pY*JJ;h9f`Z7tSy z*4;S9*wh?$qqBbWxK-3hrb1`5TdDHS?6DgcVsG*O4G}zy{14{fe}$+I4$%t$Ie#N(A!?&)xlY?^gylZRsq1^YdXjRo&CLvp zp-|Zj3aj44S=gQV`j*%+|HEQ>3iNM%{*PwGf16IF zd3S|;&q8hAj6mAm2A`VGPb$7f-a8xOW_EMr;>^9XTd#B<$eTYmbs}0Nd-IiVEsrm8 zUyPg_y$7PQnYur9Hu3v6ojv>jLkOE+@w9fwnG+sQg5Eyw57KbMRHn`Qj|Py|bUUVX zu9amO89aTL&W;mguZpwu>HQkr&=xg%YW?T9XW4GQ8)B=;UlJQ@r~i0v)9Ma>(Uohk z(e+W!?!QSndt7gZ{S);jVe9b*!hy?g0_Mh3P4fhw1^}8-U=?)H8 zH-0#o_%-R0e%1;>gCSqd&apb;(`JQxJHRdb%JRcy-TLLRD;I8OE`7rNUHY7Pyy3ua zt>OC8Yd1rm9P^8hZY;m*9~X0c`r*{;qkFSCjEIyEp~k072qT7KiW4@r#{cMz*&`LP z8OO{oO&gaaCTw3=CW_q7Fw5MhuRV9-+=rgIb4uAuKN~XZHgI0Wh011M#x!i-V%~Cz zWoim5G4VTEJuaV!?dYq`ZB8verQO&$YW=J6Lg0P zomt)$r-XJHIse?JArpRbruITghGEl~YqeF2;w!U{MbA7Jn@1Uq1swr@2R+#`^n`q% zWgrfrwC9@RCC9%9R=l8|J-_nT*7vt;9yglYQnJ5kd_6FD`5oZh%d*FlK2>9#xA~r1 zKX$rnzHhtbzi+?YM8w;XuE)DKZmAhb*zdLb$-0q6%Ym3nOIzcgt_{bZY|8ob-o91X z|9izFrq8al_Mo+vKh|_#G`YQhXB;_fdNY5u)y=aA%7rPkiSzPj-rCfj@w$y?@88;S z{8{Rp#j|}qZ~IoC-1m3xoxggXbK>*QzstDt^jvG1Yg_l|?mX1R_P!&933bPUcdv5j zo8*2N&dF)rB5!iumilETXJgan0rTH|d(W-;zW2_BeW81PDW2Yb;Ks}FcZLsmkCon6 zY}#M?@oTX7w$b@LfKTZ3;QIE@bQx&GX<< z|9x|h=pQ=&p)c3>7u80HN%_Iq7$ ztKaD$0U3C-Fb`F5_xY@ckC}4z6^&=hzkAr;3$?Bo+>&ct6MSvMoq!Vgucz&=?AJOx zzf;ho5oLBQ-8QOiW%Xg)_R_EKCs77 z)Hc=f#lN{w+-3Ar{!o9}D?-GKTZGb$hZojr2Xb&vl?ZDu-cLYGoCU>FEeghJ}ep~U%qp3b;=o)e++Tw?@gRM+Ib4f%HQZTsA77@%hUST8RYdF zHFZVDN>*-;6V#3vggg@+bnt$@)}!&*=|sjk+t2X@LuQ)_116jOTIYgpHJ`84TjjU- z@J8TZ@coilk!|r475B=F&5(W>%Od~WcChN6SUc6)c;UMGH|f-n_5EeP(%jIV+^LZ* z-U=A6QzXR>znCwhzEwx zez&F3Z4j{6Hrl}JBW}EE`#kGXX}*qXNVm?@vO6WM2k+6=$*R_Ejtx37WpwKpLP=ir zXzfb;@zxlU+$GLBXHxFN37ts^s!2Wo(E#!OmW98AoP}By6 zf`Aq|`AUzu61hpF@-Ddbk&20hYf{mgM~n+Y4)qRtD>rOTc-|v+=qJnW7KM+^7@vt5 z)>l5eQQ67$Wy<@4E`v{V&+IpK(tS=wmqvWmzrSk5`OWT%o6nv`g*?a~-?bzP+&f)* z_=Mj~$A$jYe()ZM4RaRoS<#qbo%L-himJP`lM6g@4OprUMWwW zR{Y1HO1HJPZ%6X&59Y5VhxV>N@_AwZ>#uu6j*ETFFX@%{55$)4X^L@w{PX^?4Jk~U ztApy1>UYhBCqHE@UtY1LtN!eG*qOm~Ypi|L14d#~w|;ck>707^aI!DG?b6L%dxk6@ z4{V5Q=dbr2c%O0S>V3Iw+&}M*W&b+HRH|q6kG)N~cH-_A)I7h{z9?+2+Lxy7 z7MJi>{?9qVb(fdeHmin`M{ja&E!eQNKn{-^55B^B_v zzj?+*-P`eD;i=iNEgJH2Zy}LeR8Vrgni-?bjl>5ic*!!MKjX-+_+k}J|F@(1~gv>K5NcT3~`0lyt zXt;fn5H^iqk~7Em>|dqtTZNAF$u@Uw5^zhSr;Vcb{1cTPo27gvGfFM%ixDG>933ta zB)`n^s>trKi&jWI6nE6*#mel2l4XLIzIx@EiIiY=Pw-OhVZY({*q&`$nzA#~I0;kP zu|46rxTtiIaPJb%WMdZJF-epX5~Vg99+8#(C0ejKEj()>_nf`xc}(W@X@f|+9KG%} z1=gE`VufkLoBv)Ja)Fp%1d7%V#y5%RSuYPC{G53>OQ>j=Cw3?p2r1AG(hFVK^M2E^ zsF(T2U#)twH@Y)q-3PQNzf^Z}R-UC{(T<6pi#jsDuqNVb zk^0nz$0%!#< z$5TR&r{<=37?wv}J{EI!kJ*FcLyhHwIlO(L71`+(o(dJB%M}Ho$A4z;Gyjs9=UBEf z)W>>BWbqEpF_4_@?~Bj>`Ga%HyU7A7!mG3x)nX6cc)v7tWTP9zL3(c^sQ_Vm;?{ z?Lhf=lf8ADb%*cEdzvCa4#@WjEqMEF`xi^C{{+4b0j`Zie;yxtS8O9ga z4cC8!*GD*;VlSTGjuO+&0hbVa%>DjFXj28P`fkMW)8`^EpMai8WqP6d@b_*pYI zTyX9B5rbxyf#&J9Y+rAqcAwdUGOUk0jz4|5ZSheDbM8EoHq{!dEU; zUgVC}Z`JX6y{_U!dBscO@yoH@;n9Kzj@3Iy#eX?g=xJWcHm{+LR&H}n*Bm+5zpvUj zch|*l=RJS5JjC|!-xeF?l=!~AnDgs0sPk;&Z*8_+$*+sJ^yIE3@BPS~U3(jkeT_fyaHmK7&a3a7YtpZ`-`R7}qBLcL z&zbLAO3vgMrS+c7GVfdM_}Bh(W$&FOVn*-L$32_ou6{mIsP&t-ls5t1P^UB;2Wc*QQbYaGs?` zx9g5KH!K`gf4RHEUc7ic+#E#MjJjh=*riRi(Rv8j{jUaFX~*+Lmo zC|@jLx?kMK{uaiA`l-{V!bT>it;fdTYKm)5af!@*eU4;swEJj}#g%*K4oV7Z>iyv)qp%+CDG&>YQ~SF+Mv&DMO)*qqJUES>4Q&EEXY z;2h54JkBDiz~p?+=$y{#yw2>*y6ybV@Ep(bJkQ&#BfWgj_?*v}@@D$n&;I<+^#zpl zJkSJP&<1_bjrpz!z0eHZ&<_33{|nF(J<$|h(H4Et7@g4?z0n-q(H{NLARW>oO&dSP zit{BLswxx2%BdsW(k{KUci1Q~J&Bk9?5YWZ(q5QQFTK+|4V0FsHzcdlqfE!0R*(ml z!#$nUFU@fb<|vZ?npfmHv5SJnK8uf@M~g7))d!e` ze2mp>jnPa!XO4TtG5DlkjkD__*3`#ylqQCAgrqmt#cdtfZVj{+*}O=Kmmij{8T{6a z&4g{6v%M$Sl1-osn`{cuEUu z`WTtqDagou-5iX+QQMkYHr6};N7xYaNu;~kLyg_$ZN1vfmoKb&;>Wz@M`zz_ZybBx z^xeMf*xAzNfYmLrRhF=J2+Uet-vYkM(%sxWciJy|*s+&UO8egk3bo}u;1bTWGWgo0 zhr-QW*K4+rYW?0HJhqq!gy3y|gZ9}Ie&UA9i{V!y1R^7Fx~K}}hiz=C6j_b7Lr3ss z;wZl3`Mk*S#jM6UT|v&{L@v>MtH$OU)n{1KMc(APJ>=)14eBS4N z{^t(5=YT%wgkI=|-kyU0e&~w6=#1XzR%yh(9O0P~cTY{``#j&4ZXQ@B<*+L0`@F=N zjvhxI>T&p^Os?skUR{_@>WAUutllG=e(I$T<=`^vul`)Ce(MWn>eemlsgB9NuIo## z%ETcLXGT`p6fL&>tvqo zg{tj^OvI+z?bAx`L5<{917*?i$h@{gH4j)jw>cm%A3q%-f7Xxxjm1F=*j9DG)|$e(-tHJR^SDdc?8)vZ-trj!>@WYXdrId@*V(_V z@Sbg+F~PV#kDaeh^iFy763_1tPnS$5e*liudyMj_Lz$#*_4$qUmk8;~OqTzx@MQn( znH|F(TJ^w-xoAIQ$KLbhjM#VTyKIi_Vqbf2pXp}*+5?~P+bzk5spZTEw?q7f3PaEQV{hW~h zov{ksiZ|v~516bU_A&4G2v^+#U+|mzww@aKN`K&?ZuSq@`&mEN6D;=_SHE=){9JAP zT!``1r?-{=pZeWu^UnW+TF<*)T9oBet}*X7*(Hv914AO7>2^bV_b z3a;6(OEj$B~6}0 znQ~!BmMvYrgc(!jOqw-q-o%+x=gyEOJFX{rL9v?MrWcU;qB^x8+y=&pi70Be1~K@-r|&1z~$H ztnvapZ@>j7q;Rk3D#S3u$Ql%?Lk~X$F+>qZB(X#jPed_A6<1`jMHgR$F-93@q_IXD zZ^SW29e3ohM<0JQ>qjAnB(g{&k3=#_C6{EfNhhC#GD<0@lrcyuuf#G-Ew|*dOE13! zGfXkZBr_!|%S1CxHP>XbO*h|!Gfp|XjA~9h@5D1tJ@@3ZPe1>xvQ9t;CA3gO4@ETp zQAHPJ@k~Y^g)~x0C#AGfOOO04un3oHPeKhp1(hz&LM64-yg=i0I|#}1)Kphrjp;&I zXQh>>+`Q`#zWP$FwO3!o)Ad(jhXvNbw1UNs*G_RIw%J#ibvD{wZ$(xoV?)bn)rt&M zR$6a0g!Wr;Nu~B$qs$#H+io4@Hr#RFCD2`X=UuQ|O_TDtM=_u-6x(ipCeaoa8ATpb>5q=erxIlO^e zP8Md>R%SV0nbAWTslP_9+1!AkI_tEZMH@OI1dF{HI$1e|FzK4QHFH~>c$UroUZ)R> znl-AabJtUC9kV*;!7PrLW{QE{8fmg+B23m(E2bH3xk0)xx}rP8`6%9)UU%({k4_Dm1wEw<3tHm`7dUAg+rzvx{@3I$XtGLoCF}eer`yt0c z=KM@Yuk~-JvE0`9W~kZX%x2gno}K8C@7^6N$1_TObkcqQnRnqA7pi0jYa_li!Wpb~ zc;i3cTu_67M;>*cOh114uIrZF`%Ec+o@(*0*WEDgMJEXQzTNj+bGqP$xor<~|NeCT zCo0|1B-gL&{qI<@YhU2%!aV{qD{2h%Uieg2zmA=beDq_BN&qv#?s4${cg0KJ%0M)= z{vl9<2ZUV8swXs~3Gj6Q1Rn@nh`R;aO@>pUphY~mLHPYoW)h5F4s}>Q>}fBE9dsZA zQP?`AgswR$@}Zd;6`BSf5qG)Mo)Jsr!wpt3WEv#m3_;k%6F%-kT_mH3qR7HCJ`rz# zq2m5L7AO}M2U=`wqZ#Gs6B}`HjeHam4p*|e0g4etT)bi-_m{O7Ql&wCaU$!W$QVGb zD2`%FW8#n)!AVw9LbnUiA3ZrpHR`dGr(9$y)waj^g|c&jWZVkFm`6n(5=dKeqZR)H z!xXL@Niyjn}Sx2b}(}EuVWTlEEdB|y=2#q7M z<{JY)-H2Y9cTB)gd1AuQC+rQb{`2GV*Y-!0apkC;>ZA#IiJ&`IDwirOHwz zP85Q0J*!T$_tX&zv9YUcYs;Pq&8^neXTc(AJ2z?BZSr-f$z*I{3wqkUYBol><<%5F zyV~6*{m$<1k zsY3aB-iFpww7nIkc4w*AsjhRjqV#1t6)Ri0?)0L|1=3|P*&^^xR=n+fYgB#2KgbGp zzYcD&fw?P3n|{}~3Dy)w^;t;&ZWqA{X09S#l2^mZv!wjx=@N4(-=hZeuA$^mQi1qe z^VYDcFxGHtP260M68Oc+Wi5guOrvfNnLbjjF_0bqY1Ufmc%vnraBIo?+8z^B#!RZM z=rXxP%c8ic=u_`+eVk+xgIK1zo$-zz%-$!1F~>T-GJTPAV=rU)!qd&`3)jfyKqcA8 z7)A1r#R+B5Hrc{==CfGeMrEFkvcY`Dj#k$A9SjF9`z^7 zj79Nb_tu<7V>M+RO^2>SR#%a3A@)@M@y2{MU zCqY3r?g^he#p*7$87E!oRdbtiC;RvL1kUgOV#nLd^FCHX1ZBBKD=%*2t<%EQh25v6 zu+|6%OEDRZK2CZ!;#?j$gE>6d0?`#O*_8|s6EwYFS-dj(gZRPfd+&Occcbghp6fua zb2yG1zWg!y$=~dhvZ7nSMt@e!Edz6;%e;}aill&CKIf^=Cg=cjxYILKbzqS@;|1TI z(ql&Rh_Q|9%i8#S&Mus*Yu)X}xvH!2DQ*x)`;~2H_>x&}Z?vqvaAe1N+BYS3suTY0 zhmQ@Nv$^-2-ktG*Z!zHWF8Ol$ovVfqx6h@Hc{^Gj@t@C(;*HyBc!vA&lP~nyIPY<_ zuO950e~{;OgLlx^{y@$hJ;x~w_VUsH`+Z~t`D01H?`O~Wr}rh$kpt%bFU~=e4%8++VzKV}voFCk60AR$ z!M?=%K^7Fklykus1U~^JJuq>+=X#w{88qPwzAIrc@uMjRtUeQDyC59GEySE6d_vzz z!l)8Cg)1<3N;r3e!k&Y)7(%K4oLj>rnZjWzv9c*a2*folbPW~c!aXFy0TZe4$v4xo zKQbdf9?7^t(%JLO*Pjrjan%BETE;v2hx+ zH3LCHq!R5SAuB`}Oq@MD)Wlev#A&myTw6ST(xgHpk}*ug-803BLPaUbt&3PiN^CtW zyhB%%#bqo;|6(j&?8WkX!<{R@So^?0yTpfzVIO%D+ zsJlWt>?ndn$eJX$>1#sh=(?O-LbJIVqZ6E;d?oiFn2j+z$>|}aG`F(rLV>iwrxc_L zB*)uRMw_(CcH<6ZJRJ5Dx~gOkgIqf56URY>N{yq*s+r1Utir1_4X%V9L z%a;>NH{>}=YeCF{54V&Ho^iRf{FvbjxOd98mh(%&NS?FAn%YTB3t79moU&GQO4gG& z!&J<;Bc{U)OWYGEhod{q#IO|mnsEB=gPxPqR#3BNDai!2h`5WbT%tX zJ*xxHU)w>Z(>t!DLr%QKQ@cnZLqBX(&+ZhW{G2%f9FS1^pvcprc{(XfBhVPU&8DQq zM9aq$%fRMAE-G|C4~5Q*qDWH2(62%^uQ|BJdqg?x$I;x&u>>loQk;9U(HoUC`Rh&7 zqs5QPBYt$mZuGS9bH~~wEDo(uSSwQbV^MDs#1VxI3-nNFgtLTbKR3g(I{PLY(^4RH zP{l&FXf)IRA|+AuA~Z8S)4#k+Mx-s!Sxk&XPXC;>#B{4Fd8urS(jWap(^RtLN>4id zL?o@n_X@rERMHU4(*?6fLZvQ7Mbji@u_+ak@8r)Mtii6d9l85PQ6suCmB&JLDJC;d z;iA;s>(B8>R5U}TG_*_d+)*`M)AUkQDYYjhr6wfxEglU<&eBF})6pHVHXnt)p(52% zjZY-wOQ^KRTSIE z^o!H~EW*^DOG7v@OL)zZWCb&eHPQ>L&wS-qQWL9Y_17X|KDqiYfgM+#0aGo#2q2TKcIsNKX~8IxhC)lo~^779CCzSFqOj5+Ky zl3pcNnv0p(z|}Xnn^&w{MJHxXDE7A&jN)3gVkCaDa{J#CL|rdlpSI#ik1e_X?0rRK zEMl~@QNc|?v3toMeo+7YyqhIrI!4>=)IgSft-aLa&TC_QW6QoJMir~M57kM0hnC!_N^x__EmqD%=p^HTmq7XGE7#S# zl8i<<-^4-J5<63-ncJ9A2Sjn0-#^orcjJm7hO_X{3&0FD&X9vuUZ8mYn9XjgI6p zb!zK+uBgW9OJwP`joY~$YhTgop;l(f=u;7_-`n2xz=kSv}Ys~di1}mxMlK-(R7%?3>ZPpY zNwnA27Vc!W?cz>HA#h}) z#>K;y$^gycWQ^LTaNDvO8{Y(9*IG+nCK=T9$?isNEe1I7=5KNyW9#W!(>-0F{i!2% zYu0ovbHwLoF2?tz&Ft1PTFx8lj%>i5Peuc0Vh%b}+m-5G;`FxG1EXY6{pYy?%8{eaec~MRPY6$| z&(*1w4O%-paUF*9M-A%L{aAe*Xdy-53)^4SzFo8q-Nq}vgN36#J>H$2-&()VwS7}$ zfAH;l@@7|48*becb|qT>TCF{{1~uHbUiFq`cbqlkUngC~7WOP3({e@5K9umpKH>AN z$8>l1D34L4MRcly-`G<3#r58!9?wum+%6^ISruRZ@Cw~Zmo$Q9?U~+ed+#$)HT0W8 z@nP3^CahY9uR-cH;jp5#dd+xg+Qo*%_U}{Q0B1OiM{7vD;bm)Ileg%t%`T07S9p(C z0Uq{K|6Rg9&=BR{noaP|X5M8#HKtF|cn7H+XV{`HbzIFyk~XoB=TZvQdE=FCyM2=! z1$t!qczTaQ&OWqb7v6SPnS@mv%O3c9WNnqFX)k}PZq%x4mwR@N`K!nJH?yTf*7t`$ zS+o9UMN{2ER7YV=S6m|WLNEJ{J^Kq!dw*Pee23wZ$JR?LU#pj-WN+!-jX{95daAE_ z>CQ+tT>GCB^mmdwXtZDNm&X5#2f@B%byEtJags79wlyPsvYuKze-O^{;HFD-_Y#sUN3I9y7-e_ePxnq)8x>#nLU2gbVdaWrsnXR_ndiyQ7-Ci4RNAd!EPtD^slUyBnjNvCJB4Sn|v{>+EmBJ74MZ$olHKr=MbuiK~|^ zM+Tt zY`bXu&7BeEUV&~O@+Sg+aGSgH?)LQAYyVl+fUh2S^`dPqH|^4wpX=RrMnC%Y^M)_} z%`{=(KKguPh_tj1{Qmd2#BZ#~Ei7kJg zOOj07mOkF(i%byY(D~Yir^ptD91n9%}z%)4B-rsNUMsKrhsG7A{f)A zMEn&GV@@<+*LsJ=0Ky0}R(#?b6Bx!`=?;E=6U-d*h%yR>EsJ}sBMwz~yD!F(kU*k} zhpzZT^XZXTpOc~yI~Kb}QnF!uY+@NL`AE%0ZEqsv+e)mK7%9SsMJnRtDTgz{6;iB? zeamDe*@QFyNDi=;a=PLCVyR2_jj@8Tq~4-h2B+i6rh6W`zP5m(uTiRSFJQwKA9WJe8=uDX$ zS$9uN8K<1G%x9yT3D9`*tex&;A3+l;&UxD)4z6V&c|?cr8xEJ#Cm$WV+l`b|FmjNXVp@3Moy{03u;sAWK4RZlBp>Qt41UG zK$24bl$cX(qX5Aw)nZNvnnHuB@}j!c;Hi+Oj(TUT+zQybLM^FZ>R?Iv=~a#`7GH_Y zs?E^qQIHDMgYrA8KbHzN28H#pnw`)YH-uO30IG#CEiGX|iz?3wFqM0isbDk9SJ1BR zu%l%cXAdRWHObblW@K%m7%Q_&;u17udul(2YF1^6_O`fNv6kTgs z@~PH;v=yZ~q2*oP!7YBRoZB(UOT}6)*SRC3?Pbdv-y*6Kq0*gi+{)Wj^CoSs@|}M7JH%2=SHT4ap?V*R)Ye9kH^-$LeYN|_?Pgc6f8}6rXc@{wj##|^ zi$q|1k$Xq>aYe+?Wp8$#S6~G8&LR=6EO5fRsu#~L$LC}*V1BG%0wWm3M20ab-#XA?&zZcgqwZX_OyLUSaiqf& z@|dr@oV0$}hH^G^E|Jz|%T4*e{Q5MgJ+0_Wxp}a#J@feZtVT8eS<{);7mjEN-$E`r zj)Gn_U1_~cDg&C*WM=S8f5>Y)8}`f546~RE>0wyA(LHHKbf~$z?BuG|*2A9vVyd6a z-)-|S+);jQIDd`mD%%P!vW8BnzqsEVJ_p;q26h$atS%oHJCKHK5M?KQ>wKR|r*085 zv`^ey#df;d|GBoXvz=FRKf790)_0}t-Rg>4d3~yNcX z8E@^|G>&g(GuqFhe)PY=*))@nyx@X6_^}h6b4`Ud=5+0c0F-=?pxC#myNM%=htyfo0E z9dsjts_5Q!ZCsP?cfPY(;eejFfYE!Q@*O?u#jLu}K`i$z6Fx#lbvYjYyY6**vpm2u z=eEUH8TmECyn&8ib>rPB$ zUGKO~9^{{s^>5aA;Q^0*y$SETS?xzHoovrEpa*z{q=FK^WB~8 zyiKq6#l>B_zooqW@dn?S^L{y_A{lQUni}~_&nEQ^lu2P+X&BzV1sSB}5~>kkib>z~ zi68Gt-t8rtx*ed437!KY(}We5-C3H-l-s${oKs<4bIF)-x!Ne9Ab8c^%JEpBT?v^r zM1Fl9-?1CG-I+}p-nO{l0+ye&IU2szjoYQ%z#U%(cHQ@R5^2o;;Fg`k~tp4uT++bvR6WF))a+@ZX+)w!v0^9A$R+|ypP*Zau*iD_ z)JjE`T#eSxRn=y7k_PJEEdJv3R3R%q%WkcrglQEnUdAc9S5aJ3HytBC?c(X2&hL3k znGIhmZj>v!3?0@YByQlXKvDmMq6dy+$S5NXO-mz{V;@ETqc^&v>S+%=k`py*qZIZ< zVR6o+K%+h8P9?fj=kz1^V574za)&TZV?+i`GQ!esu~dCcBto_yKE7i? z`l7a3;#hgiMLtSraa=E&7%(l?JrS2?jbtWfBuzrt&ZVA7s^CZVBBvy`~ zQ!b=Kz9d6ZrEYaw5w2xcPSaLi9OirzQGzA9Xc%hoWS%KyvM{Azr6oH>rNS&CfF&T4 zwOlvOrDJ*_Aog1WD&b_Vqab3L&^gHYL0X3>VgzFUTE|i5l}+6vN}LWlje`MU@PQ;@ zhLl`NBnG(~yPYA4t>a_f<~i;mBVuN7rQl_*;8kWJwq1`2BFYj**aZ3}kQL|hO<^OV zPY8~lhqWdRm8HGJX6qrPG1?_<;-+_^;~YBBT484Vt&%ztTzKA~b5@@L;$R`x8x11T z1vciiBwJy=CJJF^(|H?*Bw=NKCxBAt>!?)RZQ+CcVBNvzdKzDP#-*#-Ub!VG|IDXp z{$)ij5q=ib!1UN`!e2=SD2M{mgxZ#58WQL|m}w5^>Q$O}n%38`--1$IaQY=RkxYg{ z<&B1=ablo$mS~ISD2O7F?;&8`IjD&i>41&@VSJ(|P{mG*DqG^g-`n+Qwb7VqO(S*A z%s%GlhVp2VHt75X>1___#&L-ao}77})@m|fgf1x%?cKZ4r?z3CoC@KmS*acF;DwTr zVX~zW?k9&yX|IXtT#_jj?%v3W82vGu_2}k^{b-wYS?AXQJ)%&{FSMZK8VAS zs$-fe2wsu*{TG|6r-XhctRm`ivLu4Ks;z43Gd>fBQmdaPE1d17^vo!y3M>7HC}tTT zs($KawqU|xoRkulj5cct?%%A=Se=sptDqW~K&qsDx+b>rs_)@sbS@fb0w%cX(k96l zxjL)4mLY%99J*5Jz;)OEFe@AiC8K~T9xCR!e$u^q;-31_uEHiRe(S)FY`Os?pKxL| zPFpm#)5^M|L7`JYeoZ|E#;XbDt7YjQeJq!XEXnpPrYexY`YavMXpIV}J@RbX{mzz# z>%PKfLRn|H1g+2#v{(Lx?-*1eeC#%N)t(n2CnKDt=3Rm`7F&ps(z0==u$L5MsXkA;*%S zkkJ&=jVB=*nh@@XHW{4E9_atZse#6C1Hx4RiyreL>eCUf_1z=>mK;~Ep}5w_Kpyaa zN~&8nu(NJr#X0WD=%T1qtTU!q2}dw?fo@FYR;)rWWLm4Vy3U0qtpP7=fD!F;?Wp0b zsT_*x5MnH6=Iw`Q1{fayYrr-v`!W~u2IP7j@!)zOX};)KLhyqU>5O%!n)Q!Zs%mQf z+K1xU!3t;pZLB~!u3{E(1;=nsit4Z0E~chVz~+X3hUTkU1e z5+6sxh93%}F{3hPg$5=MuB!>7plteR=NerXqtS3CGKCsj9lNg>JF3I}vBOf;`bJL; zGw*pS@~zfnqd79f!7wSuMx_3$^4Y5PZt4>nGlxCv!5m5Nnl6W-q^z zZNjU&DleVRA1Yh_pfO+Sy}9KZd#fUj@+-Ha4U@&Ik|!MV)$GF2+QG8Lax25eDrz9{ z0Ba|hy77iJ@T|pX`d;S*qmimQb6M$cEfe#Xk}z=|^O-tfz5X%saxM6NGK5~L{ch$y zLo?i_(LcARmthzYE$sh|=b@#tBpzz`VVA<1YsxTk*~C2>-9@{+m#x z+!#+OQWkJ5ld_R*-RhYgpc?N6y0nU>pBy8pbkeC+lds7#EBFmFM`sWS@*pW! zgA&ABCvLIXwMH*8GeXxvzhH+lwVk344+lv&Gw@q8AD@j5L*sK?G9l#wV#TH^InNzf zhqceqUb#;H^Gg3NWX&)w8+9uKwIA=YEXNvNe~_1YHd<pkE&2Ws-gwrHO8G5udi zU$I()>Lw!@0fKQR2lrv;s%W2GW~<-X!DuzRwtS8@MB}nScXo5nb2}edt#)>d*o=@vCvXaNKe6Es7wY|@3A&%L6bVJVncf#fj4z+E^3P(`5R&s5pOF96L43i zbWlQe5^LeOSviWPcAzo_m^0z?9+z#;FRFIu7w<-)Xd2y$$ShlvT`A!iYcXVbCZ0fU zk!wyaYWWsRwr^rocuk`E?rujUA`)KW@>V*g)865-qd7_=Zrw&Y8p%&m38_~Ny@_UNuWJ#Ci% zRz)w)ocECmFBQ&GB(md^O)9(GZhNr55ML|KwI5~_0~~k?w6@1I@PxYw$GMmFbBK5U zJGXPAly}K#F>~zFX7QXm48wVnb5*tO?AzAo@RF@X>-$pH<>0*gcOCZt0~NbIyRa@U zpG#_Qn)$5iC?HQe?;5mguVDg!QmLF_U6HF{}4&ppRy~%g%Rf`_K9MhYNj2>*1V^ zljF4QSkDJudZf`W{XlY!sl&|I*KF9$>|j!Qb?SV<+cc)-F%=`?3u_-RXSE|Pt7cj~ z9m;aN!!I$WU4E_kR}LAMs}G|?-K18Xfq!srr&5)(^WmlOccqWDDyqqkJG^KA`unmy z&ky6(QKA>0wga;Dc-wU_+cLzHsyPoe%>y)xrsn6@({En5f+i;)pErY-^tm-(KtHb9 zYpLcNi{u31v=%qOQZ`R}d9**~>TB|qZ+PObwcW$FTtB#R`*Uw2b3C{AfC@L}PkOoQ zYqmG90sXgt$M;k>z9B#A$;VRj2Tun;KhR{QKmeoP-RP(FH>5C2@~Q> zga1zA%$d+;OP)FhjubkSXi=j_H+q!WQzcNPP7(5Cif|>%l2WgtgnG08;?${2dty}@ z_G`_ZUbUJP&-O}XRcJ0osGySf`Sh%X;!;G)) zl{}d;WxNa_uN>T#aN&iU2S@JQcX8&Jd_7y0*z|AHu8mDcjhHnyX~Iw+JFblPa%JBj zMgJBKH+VBxtCg+Y^zG@SYk#+$Ty^!_iB~U2pZYdy zk3L_w?#_L?`u6Ex4(Dw?d;i(|{R=Ro;u@mvu<{H<5HaY&S`RYmMoUn@2`N0PHw7O| zE4SD%jL^ID;-juA`V@;$tI$rPPrRs_`%lE1T-tE6-2j}cLIDZ?yz#~ySIiK_7kkW) zLAD(9QL`6E)KSSL`6@Cx4UwcMr?k#WvcM>3ymCIWm`l;c@#JGFL@WWD@3;NNV^Y5h z)y$5^AQk%&NDPG>lf?yxj8VGhFe?eqHUVXlO&QC?uR%f)JFUSg-$ax{=S+l;Oa9>d zvc4|Gw3AFTeM57*KxwQIR5u58lr1?$gtJl=H#{)UN*VogMN>Z=)mHxo^(o9nAC!^S zz>dsy(=?5%F3wZO^0HVkF+G&TVT0B4Oi@d{)u=|TwX9lK4|MIgDS0LKF%Z!U@t+&up>4h;S-MDktLsc>V)iTTf3|2QrQ4P*7TyKGW zcQQ}o-3!}_^Sbz4(C%cm;fPVa)Kc&yF7{*PlDbo>bH7WtRkH|Y7~`4knm5UHX#-fw zZ*i9E&z%ommeLwYp7pMi=|r02k!zjJX`xrvDQX8Hj1_3uqEo^Wix7@?G=kEOpcLi4SIeRNR55yr z;XtUS1v1T0>B*M}QO7=>J*9oj8l48=7Qvi3i*q5XoAEdX!X$pqYD06|5|PF-NEr`8 z8|zq#Vn`keI%bJJB-#)isKFAl3tYo%ALYE5H8X0ji&ymG85Lx%+SSU0Tr4B;ve-tY z?XZXH>s|Q5rmG{}P=zb}pC03wG%8xfDJg{iA8axuG<^{aiF`cW8fkYTO!~2lMJ(PN zFWAQpVdaL2MB}B*(=Rx7#*^c6CFPtnK7VcUlXhyE)LyB@A{lLf!qXQjFIJp7ZW3f{ zI$$eV21zIW5{L!l9s^-T#0`q^J<*z_HEY;HlJHBJ*km1)?x?7Rp-qt*qM>_Ccph+u zk%?q#WM(o5Er@YyckxUWdB_plg|nQ@`uRblh~eE z&1+6nFbb_1H+Mx*C%G$8_mbqk8fBkzViBQl8rHAsG*WpUls!#)m3=ZA(oNYDrJ+n^ zH{Dk^*A%oxA8ja0SK3S$GBk8SrBM3+D1{qwmNcbX%bg~n+RmU7NmDOlU`cS!qtD)irKW#c8CV86`)ZHLr)gCoEqYo(`6;h;QL6N0%DTR${QS3Qg-< zp@~(3I_{Y&z3enO$-}=owyisLr0kxfM0lzeu~kc_7X514Ofi+KQ%%lnZ5vn1Iy8?` zohf5G=h=zsQmw^Q zcCq*h7<9$=6=s6fxYLCzewSPSQKaJbt0h8dWYHPi{Ekyk1|%+hv6|UPsx_YAeN@Hp zTHW$uXTZjq)O-ueVPpOZvi4%4tnzLTeCaWFl*w~`>S@KCT0Tc7$#xd=YhlZgM|X(5g0-c6 zh0JERnzGfB#we7RoXh+FD7u{8N${-Se5?;IsM3v;aE2D`X}|{f%TxX+xAGKWn$p!o zqh7PElyO>e2~*f7c@rJRi|MeTrcwsUcqx(9YubCQowj`k!}0ScX48df#}C2&BA z+3}b%(&6%!p{bu%O#G%Q14FnuE%<>S=9UAi=y_|u$@?Vw-^pdXLrCaKGkGXyu518 zcrO3(@shXv#xbw;JU7|!bho<@zkPYADeQhY6F1~T&pXz3Ui78cp-azxQN&XZ_NP>v z;6bzUrs&;9rvZ+_9SeuMxw?C8g;{&(;F`OP=^^?%O(xq<(0+^?4@zYqO< z?_Ky$_7KXv^p9->aQG7NZQ$zx`O9ytFP7+!Z&GaQf)C{YuK@RNe`pV|BJJ5&X_vq) zngEXK0xszPP*CJ3j^R>Jk<{tltj^d3ilZ(sqVg>TrKS8x>IB=$L)Hnq*a}225MPc= z2WtyXs>%gfaN7ii+PKBzs>qc>ZUC__`4$j{j49s|E6j53x74h`5Gx2D=!IIv(13~v z?wF1qAxtH>pv@Q~f&Yhdv&;s3X*Fte{Nb3j%DHSI$ z^IGojI52Z0@n2Yx?|5qzMKQt(Ef*uvKm=?~B+myuahQrxuYU2-oNcZkCC+#e6*(=u zOy>&!Igt?=#}Qo-*a#1Aj?uav?w5Q~)4uT*8B7=%&%L^l*V54(gG~;-u*8n7rA}=P zku3c3FZH%B3;VAYyNrIW4anvZ6G?5^tc%tBY_yt#5-H6V0a6ytY#r4RBHa<{W~w0( zP8ai#4$HAbEb{E`G5hqf{kYLrfa}4gF3YwNq(IS{Le1a$5W?Ch8VOM*9nH(;&boD57O3vwd8u@7HK8dLJu zRFEbq&L*D+9s7$FF;XIVEFQ&5rHB&KsPf62aT-5z5gYIt#j*|wG9pnjDUVVR!Av0k zYYiChG7mfQCZDpaGA$X+QrFsYr4Vc_aZN9?D=p72E~{}a69-$kaxd}n9d%5`5HmAT zEg*-@E`@P0!?F{X%QHW79TihFCDXgmvLh4H6X`DzEpHYbur94FkT|n5*>Kw0tkZz9 z2YJvdCoV6U@{#;9C`+*jPii5F#2EPyFjdjetj($liX@A%HeIGN@i94-(A;Xg#sp>q7vp)UG68EG%)oTi~b2tC9HEoayT?I6U zq}m{JUwkV}G>%_w&0d4abO7j#n>vrx_aC7zlI4R){ zPUDUakld~4)aCt@C-!J`K!(mj$0}tsGj@T5Z;@0_NP`GMhfzXv(;9gX zMPG6Kp0r8f67`rA0j2ax-;f#?ZcEW^s4O#oloU&yDN3QVO2xE0T`ldx^i0_l`Op+` z;I#JE$4v8)PTREZ?34lTbmqR(9uX){_cT!JM+0l=C*yQZzZ98>6zkrOn~pS5ITYI< zRT2Lba*VG}qpU;^mE;Y1?8j&%JB)ladLN1x6^-EQ!xsPb|!RILz6ZSH+Y5K%Ez z`o3;dQ}sg0lLbE&5q<7U0W~rG6s(@;z&#iqteCnG7!PA7bgqEy z@_+w~H*mmc~9fw$Ljjk*~PJTIfIoV_1dbjXG*oVn5 zqx#oc0~2&nSZ3{)Kp+yIY?xvG5nWAq2(|N{K(;Smv1D)-g6F7*!Iyz)w|1|~=!7yU zQ5A_-_H);G7fbRgO>oulxNnuPik~=zb@GJ0REz)eJr=aA{%Os^SV|f>(SC0{bFeUD zSRpZ)+{~(bdH8!Lc`DEC{aUvxf0wcDID-S3cr*EsYw|u-crkTJliAmR2N;nNRgrNy zZ8t4`jknQW*_GLilB9MC082o$zn^Oa**27Mxq%n;jo~;=|5uEcTX~69Xm>x+fB#sC z4a}1_w`?C6C!b`QkBT?n5;V=3dLL6!M{1hqt9ag$okQ$;w-uf-HC&DA?$n1Mzqyp( z7eo0Gg0Xq00$K>8c!p;=czd%8PYQX9Dm1^4aDfDiq1R}Qv!6%TnQQo*gOQ*M)0ATw zcHLNtMcGQ@RiHb~n*b1$P@{s&Y#fhwpP7@44tRclle+Zz4t3XUT^e&^PH8<_oTr$V z5tykEB^EK50_zG0=NS0Hv03>!8r8LkQWuH$;`TDGrc z&}%c#VyDch@wSv0Qj|7oR@zgZy?1Xrg7nTBVn~$p^3^gea7P1gX7e@cp1I0QRbAZ` z0^0?9Li$%{6h<@fU8nA}b2L|RbnILkd|(^wUiudRAA$NN#6`@BtdZl4<@@%z2o>$}5GU5Wc?s@lJ;(7=UaDd{`D8IZxXu)YyI z!X;cz!+Kx`wsKLKXYtv=VOJ%Y+kq!s!S@?%|2bSF0er$yJjI*&h)1@>mkrI}wZTt3 zh*_`uRNS(`nlK@JcKZ9qeLPUdXq&(ey}IO4%~u&&yRc34+sNvrfONCn*=HJBP(?gT zXPn1({KvJtx^Yrv4_gJRsM4-@G#7mSjJZmNl$JmApg0z5k(RpaOiPnA%m0+lxBSl8 zG|1=Af}d7{Ke}ME%g-Nsm!GSE(;H0X{2Y5+yzCs$9bHQGT$w96v)7z4@%1P*7GR5OPt;9)*R7mt zB%Nw^cxnSHp;vi*V_l>Xv^mGN){h%J|4ZB{ah=ztUGIYY$U(T4^VpBYPtEchx`~t0 zNBY-g`W6i}+N}lD8&TKKUEQa>-A$ZotbM5WmnYpPZDUlIY21q?`f^e1C)quV=iAxu zyV2df;JI6uQ{&IgC667tiA3+}u6B<`uA`o!8f+*qdpJvEdhhRX*e^-sQ&`<~NY& z0Y&C*e(7f(;d@!wEnATH)ZZveyLr6P(B) zT>X~cxXJ#wJ007dzrq3HpTL0x3mQE5uY|&d3kxzVaquBTgaj2*yoizFLyQsyGR(+v zW5tdjH8wOzGU3OPEL*yK{|Pgu%$YQ6W)x{Nr$d}NQJyTh(q~YWLlH`}*mLL5qCk%x z9Vl|+(~v)jHcaU>YgL(9q4IQ@GAUT5CRctHi&p7GwHLJ_b?VV=*t9Xv>V&Iy?MSk0 z>Fz~Zw(HEfcwySbYS*vg#f%&KP3)NJR)WZQ0oQiz+jj8StcUa7N?hgVmbB#-A6pbJ=F^Bfdk!90 z^X*4k(mMTnY*AdN@VUJWiNVRQyk zXx4?Vd8go0n`yV-f2Q$w+<;P@^jd6!1%_ODfThOcj2!-yWQEqn*yM&j=I5W2Ofm>% zP*HZ68<+2uwu4LB(G_!y@1-ufnkuMH`;2SLEa%*Hu~~}=v&&42{q)*yTkWjY?W#PoWZKRRw%663 z`LE5h;ifmV+Kn0Pn8F=P_QYO?E%4V-XJ;A4Za>a#%?X~>>z@~T3*nxDJML)W&ebVZ zgPj8rM?Y&+DVfgxaiGZYrpn>XZ})Il z2^IK=`yM~)*t4A%qczV?;VR7dS~ofG!B26|gI-_E7rdKAt$GK<)6kx!DU@~2e&-XQ zya;GP1X2rt=yTt@Oo&2GNiKrNOB20j<+;xZuY_;opRX8*Fd6ntV`}OZ`!dEk2-2*9 z7K@$`fk-)|(GF)doFVsCs6rafEmHRiA+2%-!xSoTfm%c%6oq%W7v7D7PK=xT^jD}M z|K>1u-69tkFW5ydoso!;d!Q6?I6JhrOdC?(B$2JYq|UR@Bnk=vKiE0_>2Y zOI##Jhc!*2Z&_%Rq!};SN1UZDl6<=5`%c-aUXoFSDJz@|L&mU=HB)E>G|mm12s%!> zkd{OgR3QDgA!Ckmm3rKn{IbPMCO*iM7ktSlJw-U4F_VS)if1|vmPI(SB#i8w=QhV< zJ!EA~oe_kWe?S(tT2-!cL*nB%59+{q-BWVH6xp??8N6S@34h#kto7{Z*F=Op% zJ5$r1_#`DQcYX(2dZgG;uWD657DzK%wTVuZ1JtR)(U5U5VxLI5ld>)bsTm4jNL8a& z7=B48$b6|+J$KWVLKKx_v}IbmnOD7TEUZ9(CnsW6W6&leor2hHhO=9AO6YxSuk;sA`K0XEFWQ7s9=pY5}0-#=b-bv*&6rRzZ9(J|0^Gj=|@+!l8b92 zY<2m=UV>VXnHF@UX*}uvR(h<{E48cHylL5aFV2eAE}~lvSx3KG%BP-js`=Zq~KYND6IT zH*VVBPOi22%x?H$C}l_EV#od z9d0CY2ceYA@f~;Q=%8Wy;j%qAnG-(VdDA<6UFNvS-Mw5H!3~rV|Dzj44ZOq*ID{v^ zu*WmJ@%XYb<^m>_BWn)y>fUt3Gde`LAKXbT{~mPu-W3n9Q`KJw)CxxQczcX{il8AR(jrd|5yukfceI9W4C!uk`oE|fczIT zex-Vml1w}!TCMkURP-VO1#q8fW2oqes)?Vr(O!jfLkLY z1%4m~dUWPIILKicSR)%Ke_RA}JSc%u)pBChVF8#yO=n=whh8e>VIU}MN(d_*b2Xvl=~M^IyUPv<32>~lJn(ngEYgHiHb z7I-E*BSCC8YL3Twat3H87F{FeNa53A|L22Q24rOehFj=G^CyUA_+%ufi40eCCBld! zWQ5VSh)1Y{Gbn}Twph3{b8*Onw?H7Fv zM~kayfKvulVd#sDW{AJ|Wy#n@igZ7(xQ5F#YU~F@XXuH2qdTb-O#60msKbiRm~3=c zh!>}ft{03|*ol``iVszW7*vG5=x_ZqO!Fv?5@(Lp=#3h-Q}_r!%UC#Pvx)RrYtth; zsZ>(;*fS4!WF91sV&PLN$2n@$j{W$K@ED5fGjj(ya?O^8_Nb5pNj3BXk~s(=Y{-$M z1dsqHg|(ECsEAE3>4k0>lDqhMLs*axiH_puRO{G$SQK{E1X8ucTrzoyREUfkLXoor zjWr1|ces*i_KJ>Zj25|+zZ8`o(@NrG|2Qc*m8~>Z!>ENl=#Yo#mCjd=+<1sP2}pzI zlm5g_h9#61)R8IVd;VCKzes;0<&;>$g-ywfXPJD|=!Tu9mLGV1j}%XW8HggObk5{B_n)zm6*@YyTl~jp{Rw+j2 z^O~X=mWnxr+C7u76j~E1xx%oN^Nr?+tn+h3^O_+YenU}>Gfqxe)*eI2X@lKfJl+c-) zv$;!v37l;Rlddz89toP?V)lE( z^qfeFXG6NIwR$Mbns~*^XP>sKsb?(Y7^`9Bc9N+g+t-nF0jyFR0uqH2 zo2|sUvXD2kFUPX5WrHM(swkU%<0`YV*=4k)v$1)hGPZ+0yPgC)v~Ord<#n%kSF=Kg zvFxO=zz2g@#A#$cL}iwM&SBc1VYX=Ye#aH;p#7rHpIO)Q;)#@^xMqc0 zoy8|XOi7&;>bjK}zH^kFaCVBFdpOFgWXx->s{6dr3!wfFb{7%azi5wY+w} z7Ajdd+Hd9C|GTN1J%!o5=NqC9Q<&KIxd<1!DCfNK+lY0uqthFW=u~CYi?{-Ll=Q2; zYR0`IbGy`vJy4lYc=(?HJboT5hbbv>M5n&V`@n5WunP#k*{H)6ye}85TEts4gruZF ztD++csPv|L|2w`9n!C;xrBFwMg`10zu}IR$IA4f?S{lPW_LgKzvG^Ln;wml-v44x%C!gbiU`j>wjTE5?l#-6FUT8u*pwmenIzW8>- zG@HZ2=EL>Ux+NNy3Vftd34nnN#06`+EL<+R<3~xybm3dT-wU__Dx~;3PFu{zq}Wws zRQ6~5&JpU0<10d3>YrHbfGBxb zZfwdf%ZVieOGezq>g>XF=!)RVwykW>Qp?LzGNp*g#lq%6&*ZoY*0dTa$|tk8M#YH_ z-M4d`(0`euHl2|-`;i$mxRk4bkK2-W+9VG=rbf8A!CcL$thdU1!yI^es~UdOjKjM+ z|I)cvl}2mT-3p|4*Th;~!?uARhaAp{N@9!(sk95J{mOMDsH(iGt(hvIa1>`+km{(@TbVwa2ASsNF%>-1&{I)IHm?=eq=_|Hr8J z%$jZ9=e^nVTvXF7XU-KP0NY~lz27-I-_%jx%VyDUMZmX>+_)WuzS~xl+Gce<;d=&A z#P)X~PR#*s;Scn|SQp?$iYoOL*mzpjBM#Rlj^K+Lvv7FL7Tm?6`r3N3mmhp~Hdf&$ zJcs0$(O#Rul?Cc25I%oQH9nL&nc2wfM z-=V$Z4s6%H+?^)NuTB2Cb?fE|%i;!&z5y+#f2`5{{LfGnx#g_Xw=CyUjNcGe(gSyq z&Uw9StS|q@(1tX(Z|=0jZJ|V4=cBCUq^q@iKFIn>qvHF8#{|G71TLdD9B)>YJR->o(=RjOonxv;fT7JUN=T9zcml%8IIGUb@L%k+~jF&b*>K{pwceOg^ok<}S&V9-V*u z%A(%PAl#Y>G|n}1ntkl;-yY|{F79gFD3iYB;2rEJ`q7;%yAmymfv!8u9@CP1pg@A> z_runr+vp7^zZd@&8NZ2rn1>wvd+zaH*Y%VGx~oM{~DvTmE??m7^^!tU-&6mQJi zj$7~E(fzUU5{&Po4wp1-orP zxdwdYbDs62YRhVQ_Cp`f>mJMRe#MDfzh*D@d=2$=ujjR#?mTSZbIJEH`R7j_)Ff=| zJ8$bCUuPhh_~^d)hos5h-RBwH^pg+g$7;Xptb&*iMt-jM^WFJz^!RBO)P99r@qWp= ze){&9`l=4(tPj)V+m!Z8MzTNJ#7*pF|A;O7bUn$0-A&sy{OCdcZ1B{vZWpXVBhyA~ z+pN*>rph(tc1}P|r$G<@+&`H94o}TSJ``5yY%<062@oYp|NJ9Z(BQ#>0u>JYw-8~& zg$fBql=$!m@#F})QIw7O`ADWGSu1g zB1@D&Ggh34GoewBLN_W^niT0$qDKY(jGB{aRhw9y@|4PT=v1gh!HR9VbF5FaX+M^2 zsTJzkp*vT)eLEL!SGf?+x=hQKs#m-rrvg@6*zjS*iGynOtC!|u$dNJjZLHXG;-{B2 zZ*FV(E@#l8Z)O%xzTEk9=%t$~cg!{S^_YiwM-RQ7`*-l+#gDg5|K9w0^y$A(r%Q4m!@=>#zL&4p zvHkX^sjJuN-DmC9fD4d60t1ukH2~GyZ!yghq)fm9Bb1Ok_8gpWD+@0?$v>-_qYc8g z7X0wT3^gQ9x9U{$kUtUKrgLP7uTTNl3I3L^H3sI-8Rv6pLbTPZIMak4!`V!qYY!SB&&HO5uC+(6~lKG{!vt z6pS=9C$-Z>rvg=yPT+u&vqLV$T(itq!_4rd|3P_*Qa6||REgG(va8P4Tz^$mSWAt% zb=QhCDs-mbbe*rJV1xbjR9Xqel{IN2L~>c2c;%JYE4wW;QEQR)cGYu@#TMFR&5erL zGC7pC+Gm0FZ(e!1ooruxRh100GlyMM%~&CI)}d(m%1$OW5zdxeX0baMJBk&43|1!F z#ppV4Ij(qB@hbaR*<2ZZi)3FR9(i1q8LpVvmFe3yW_VjpIb)hF*7;xU0xq~$MxVU5 zWTH3D4QQhucJyM2kZx@@+5Rk~}m zuf6TdRy{S5;GdP8SmL(59{D%DBfC3q|Eo_%n_8FwcQs@nb1wX5sTUVeZN&vQyzFWJ zhFWrm*XDcjm*FNXXcj>aa_FPC4*TWE`F5Ofn>iO->cBT&J#VZN_xN<&XU%=PuTyW` z^}W$GeQ(VBPMh|p0ghW>FX^ruW7ugDcJbLwPm$uTtLNI$%_DA`Z9j+i+e6?lp789e zr}h4D@$Uqcc*(n;S9{1Rm*2o}>t*-ohQSB$a&e9CRAyS<^O$778CeK#yORjL7KSq8 z)sJvZ>mU8V@;&f1Ok-CgpVlnsJm{eBZR&#@`xw|BNxd$9^jq4;><2T|ZOLByOWz7> z2Dadp%Y3yW;O7q4Jki;RbjWL8|FIq@J#c-{WNh-E;-c2Qv5Boxl%t@wZ0A85iqLPE zqZalwC_m1{5Q<_vSQ4v9F2@zGfmtkK>AtobpCOQYa{Sa4i73A6t*(hQ(^VJCcNOmd zP+e5y*!k>;!8hVif{jxm>y`$_FitUmCN$p}6?wxJW^RKHlwuW_ za6yc4WUOaA;d0CDRc)R#v<}t8qEV2Z$DJg7=+sU+s7BgHdof&}F6#%#bh4DCY!l@e z$>`0V`jnSo+o&4x=hJcS^IZ$YP(nk=)K@k1O%DB`a%5Der4F^6r8-%8dNdlM9z~Iy z8YrN|`pCllG>Q?eodQ#cCqiWkrtoso4yoEGa3XPqbMmTOzba85Ca{iht!h>e*(SH# z^{+=YOof;yv>?t+gw~{EG=1Ys$~w(iqOquDfA?5fr8GGpOA}O83d*NORznTVtN}@j zAkVhesTnhkUMm{g|NmfiIk*L)YAJ-;%KFxjViK-wLnyb_m^QT~Latd{Q`|(Iwz+Ku zZ99Q0N998HhsNbDa;9rd=z^0~CXv&3lh|GKGUvJo%x-D7n_l?F_qXOHFH=dY)!Af4 zVe;iKY#a;T@DixK{UvaLITPUM>UTf*g;8h+Y+wjCwXe&iuXZaOVGL(Dx6JM665XcM zbK;g~?9`w~sajG5Yq+;Qys&~&oSp}(SjID!FkpX~t`mwAu+JoCiN|Qr_tLnv|D|S( zSNmciCmF&kT_C>z+T&$j&c^<$UGkmj5;p#rm$bBYsdacUG%GJ=bk<;@f;mO-V zvv<9&-LiQG9cfHwmdV(2GMODsSHmv4&J4~prP&PV_+GlytH$nOiPz~@N{Q35Yz(4F z&1!~DTF{kV6t8jpYwB8#o|ud>sGqp!&H+2Pr(U+3sT*izN4w3!9=2|qR>SBaTH2Ck zcB|oBH&t(2+}3q#wWD=jWVf`@>BjcBbKPxjJA1hDc6Ys9%wbsD+P43+v%7Y<<9-{_ z*Y@_WuE9O>+~Z)DI8twZbnhDcll~rh zV-KC!pu?7*P1kG>kt@1&9xjPFSfHo*$^deM=dVU;@_f@Z%F*!5Xh@L(y; z3G{j}=?=&I+!d)So5`lEXl=m$%_0(z$7YFOtwe6v$y=f$&5@nq&{zqotcD0m1MLm@k)Ta zB*7faB4kIyq$grbOtcIewlXEp{7knL!GBphYSY3Z`n!8_%y^uo+^k7$l*Gu>O|lFQ z%)?Axgv=i+KtUYN1=*UhI!-%NO=*%qfOEvxR8FuYJ+Y$=j2lnb|8%{#Gb@DR$cKYF z@q7@fK+hWUMVZ<;{Rka;ql-`}EXspAcnqo9audYDPPJ4zrL-QSOtndzHuOr+k4rN7 z6j1ll&WviJhA2J{OvmFhGzNuG4s9^N+t3cJ%EI&v=U_eHgQkXo- z?3B`w6qWKcyUYMlN_0}T+B?!4y7#ft2+h$6#W^5-(b?NLE@e_2tWq=Ox#iQ(qJt$b zO}yd~9_lc?t7=m&yVJ5PI5K(A!edQSBh!RKy)Ugrl)YY6`KMTc}0koTt`cy1)6&)Nv0jyM@YCz+&A5Epx^Xt@g`3g|oC{cZ>%?nj~8O1Wf zKe+5a3|v$}lu-$7vpBV)|3fO`bWZ=oGw8HJjQUM3x*yGiqM^*YsDVxxxxZ>AGe?L_&A>cCe(N`Ea>118N`y30#)`LM6}oOkNzjBHNQxeB z?ae0~%?V7_y^Kn5l}w>j*xVyGb4^%(j7@#)$bv1`&E!mJm7Yq{*m>N}AS^a$bu{4I z9c%QQ5k1s=6|gZ>O40PC+u_ZN>LTi4ROvKC&Ya7X|Mkw#gh+->N{Ovlf;~;X)JQj4 zOOq5?pN-DL?7NfQH9&RPhaEv{6Mh70&vr*Lwrsh^0=yv|0KyGaEu%?$tza zy)8C;Ux`YisZ}>lEF=uIS71c7{1sg;1laMVUwxCci=AMQ!rLAU+~7piT#wz|1OD5WB~;e*)BmJfeQjRXoYpyY;Z}?$;jLlXI^U}W$q!Co zY|>#VZe1$QVbbJX9&RZgrq}4zTN7;7P#m=T^;#L0y`9Zin^YMkG%9K}8xKuQyGq+d z6fZDR*L3=&JVstO=D$1U*!>K|u&u^4|B}n~bV{M>-lKZppxnS^N~@*Buis7N6JuL! zOoi*s+^WLr$usp{Q9UTiau0Fl}U+F}e`ZC{^WQ9D-$OE##Y= z)NAqO>v`c`q~3@HPF+S`UXD~-{pCU4QB;x0_T4{SBxbb&u~T+Nrd3{)W!}eX75D_2 z&ixe7a}(LRFf+_J*u2$)n?*q}N`&OaPpZ)JrBA;)tMaVedMwy_=4Vd%(RiM@VHIHw zRbs>AH6xC_g-SX%u(P(ZB=>+CzZq6!Y|E#?lC95bc61Ce9i_;%vq>mdsJ(_mYrhVs8_C1B> z)P9!foR%yrg{l^L*QT@Rr#?}b9vGLF4VFGHiVoAOUNWa%)E}+5Av))z4(pIS>bXtp z=TMWYfKv92xJ#*GweBw;ZRb_S>4ygEL6)R2Wlwy*YoqpNQ7-B!4eW9vT`TOR27_cw zCT#iYy7Rjs0gg=Cb=JmqXPksr$(sv2tv2b~7SvMi%Mz~b1*PEvhFF7C-xX#;T>NU^COfvq--BjiN9NAtPC4Md#^;sZ z>DA1(jP9lm?I=ZT8=Y=)|3pgdR&7#kO6|2+>~^IVp5yV}?&aR-(avCd?paIL-2^P| z_7>&LMqSOm*fplm^bT(C&TqalY@{CWM1^Or?d)$FU;=OJ{YIkmR^`1VU{{1Dp$&ZtF`ZayIdhR@f~+f7Jp%7wPM+A@(3jI7?1BKKkgm8aVEEN z9S`s(4%xB=#}hA3F!x;UUfvM~UK?NB6T@B{Ln)O`bF7ZY!4=NgLB0((z&{2mmBeK` zS92`4Fd2vAYE~@B|68i+oa>SjLaQG1j_y8CTC~_^+Qu!SL(Rs zPrt_JvPkt`uT5cJXEkpz<|=Du_v76_8grI9K1b4l4q;jCp+fiR$|iO#@9SPIa7jh? zk7kS>r4w4dh{1-Ba0hn%+-q;QKsmf3x~q13mnLiHcK5#2C(UK^{cH2Q(Q55)Jhr_m zr}lEkR9Ob~WoF$>zt@=_o+mY9UspED4n0NZzMxUzspI!>+Q?r1BE+u4k{-oY4ZkZN zbxf9RgIe@D{|{91?$(GWN%>%{ z<>G7kSLMFt4xF8_zi7`=x#myr8|Rb;k?`H-_*+F`CagF2^m7m4fmHWC*XGjBa6;>N zQ`OeB&s`6tdLHa3acz6F^81{}DZkKr5s&R*4h;BvPE#g(j-uxHaQlIW{7-}1VwPwg zg;dCAio9p{N+ZBzKKo5?zkM3LB}ZRfWpG+L^TLPSns>wUc6?_|cOQ#o!Ux)qhwQDq z&QFJU=z&}iGhJC0zs8UA2Fw<|2YqCbeB~W{oK;eL^jj#F*el&~Mh0XqH!Rv4?gv!E zlt^Em|7U%s7q``B^4!}Pa5USEh2e$0Zb@ugq>cW78nZp8KN2D{$G^*URDLR#Ns|XS zfcRHpAi;tL3;q*$aG^nk3`-=8C~+diiWV(4yy);DM~DX_GThj4BteM?O)eBkG9yKf zDp$h%s1fB#kS8C$j5%{B&z?Si0u3s3DAA2OUB+Zt(dEpLIg=`F2^C__ryZ?MEs1d| zR;p4%g3YQCDOaZgRd!8EQ)|_%19_gD7)02iCYNDWx<`>_Z7!sOgU!QTQW`QgbcAuVH4jABTrAFFZnTt+%Xpd=%`X`^a z;@V-Lmny2GslLhwsHYMZX)COQGU;fm(P4Vmg<)+NZK!JE*XgjCZnMFQG);cS#P$d+1yXm~KCOa;ri5hDya`jSmr;_YunxCp4MpiAr z`g*(Bw5*0}u52@&s;!Ti$;xoXPCk6FlB7PhFrMiS2(QT}3uQ5Xoob4%$YwE&=#eQl z{PJ=6w$<0Q8>^RGgbL>yvz!iFoH4I;np(4%p(5y_&}>--R-c6O+$MwI|B?K0cLrmP zve#c<>0#DNkIk>k$yzlw*8-Q;^3gsA{cpXM5?r;UkQFSgy}|(v>C;0KE$^J$%1Tp9 z4k3PCt{oRAanj~NtGAtwPxFJuC8F5s?BiioBj3S&cgf{=(Hel0gJ{w&rlMem#B6T*p z^`nIb`(6rNFDmPT&o}1w7l&WE`qh&URFe~DSS*E`zCRfF)7@{s`@QcEB8}$#JD%Cb%@`SukG7%OD3k_%jcJ|1g9i+}H@$*EPN^ zk8^3F7pNpy!u0^~g?PcB3~Ok^8?FV1I^5xn1js`^El_!3n_27P#zN`D@Q3@WU=Dfr zD+#tQc;B1Z4!4Fo`XS7U8&o0}8+bV!X%Tnwvk4Km_?7;}&WZmMV^Nqmrp39DcP5Kt z3Y+*I$(a!(XSt&byEwq#1yObABhzg%hrmJp@HDV<+@;dx$4Az2ZV{AMAmO8~w(X6E zXH;7m73fANCh=XG93LAen4>-h=2a&PB_xg0GNvVGlo&)_b!x>$a)F03y9h`h zzEVeRbday?c*sTB?Ui%{qsl;u%2l$`mM=WzGE+%QXjZeA|AbWG7o|y{Lgwa}qnxIC z)V3_kX;X>6JmHGcI7wg%a%$e>QCE~%${C*Pp5tWSGlL{UYO?VvH`8S$t$ELIf(fBk zn_M)9SwT3tE_m1xm?IHcxKfePo?fw?L_3#HUP6vC=~O2ZheXhd7S4$0j0-OJ8My^M z%QuybQ%fo5QHE9ydI2)0qf(bQDMc!JNTlRLbv7;-x^SVoeB12`I=`YqjAl*4W3!g( z#hkIIq)N4^-C+8u-Mn;UBjw>bktM#1sT4b`^OCZ6Q>97SWYzO{Qx)|EyT=1*I0jCb2-WX;mvbRvVV} zY;m3CU9flA%z5dA0;Oye2OF%kx;CWceCmg^6hE%~ClU5^QIZm_|` z)LV{O#{^hjn3eQWvKu8mLYmYhvwo zSgPo{u^}aFQg#L~u*WSgZFPIRD)Ewn9QLkX|8v^p9QSyg1 zad82C*M5PxpIzo>m5~cpAI8|mjePAl(VSfCQu)tGPBBm6JlpoxwzZyaD042Y={S3~ zhs{)Tq06;qw#GBdS`u@ojeE02vpArR*7KXGno=x}`OMHUb!6>a>0Xa|mx}J5y=eldc9y$4!z_Wf$mATa6`t}ifxjec9_tmu(iWGG zg-!17A{4337WK1r%j^oPHLH@fwr|lb|M2D^d#ihtBwm5~)+6?M(B>wmu3cQ~?&`RB zS5sQ6FIjE%5*w~DZmAx!ahMK(n_BScJ z*A$EdhS6mI;1s2vzx1IzqsB~N>I%rc#=O&slXYwI0J;^U=i1*+)!y3YYtTQ2ox0WrU5Qn#|`t>1kORnPn1{{x?oz6WgVN%@^YqB^?5w|$p!4@ve0Kl&gXzVxea z{dY1y@5P^FePFKnB1`{#)Ia=+Gx>e{+OKnprcn)i(OO4QSvLio(+!v(s)opEVhtW53B8v>^_fI{4iPe8 zgpFMaqG2K8%@~fK5PDlov02AmqQpRAyG7jUMAu2t-XiwiCv_W-$&T!STZMETX$|70 z&0ujUouT2&rvXct9OJZM8i3In0gm9~UbBtOa{ z=KNT%ykjsnA=9lR|FESSJzATC8RJCy)UDN`S8*fXStG&y8$qsO9bV3YDdfCONG2Lh z6kZ%1cHgGmT1A4^I8r22aU@CxWIa;ayUm&{dW%t#q=ePoNR}c0T~$8DmO;X#jd2~| zEFr)}8pPBRC1zwG!XhkTq+X1hPI}=~_Lg=rk5&3pn5^7GLL~6W+gX5Hiv40ux}qm4 zpJ~x0WHsg72^CRBB}+1xr9_NfULex#3*=6=5|0nIH_+euO;^XH*7gHiuLZ+o_mZKv^WJ=0mNy4UPLewU1W{rTQi*cea zVx4HwWW=TBx&UVhIa_iP=SNcJR(7UmqGYUiCv(Q9J~E^^+N3sCXF&=k+BlYW0wvfj z!RYD!8qDu7s^ z?%@yQS>B>nQ#SdX2C=FfzU7kUR`_-4|E;D)k}B%`>aecpq4F0TJ`#jACW2n*qxx#C zYU;5XYqfGvv0AGcT2b?vYI8B`rETGpVkWdkpK-#`7fx#owoqPVs|a;AY#I*82ac9##<_OmMH2d!!lagt)(HUU8tg>n|bM0zNx&vqsB7a z?S$rlCDz8;EXmqtsKtw$1uGiyOMD!poc1g@s;mjc5hj&v1Tx>uNt$8Ftjl5_vL2?V zDpLfJD$b%!3I5d5(wyMoVYLxXsD`ZleWS~^#+K^hLeU+pysEQU}-34yq@FiRpXp5p$Zs6vb9xj&3AGE-2)+O$Ff-QU^oQb{(59aABt}QAq8LV{` z_9W?OHL6E4Nj>fCxbiJF4QPcfT^9PMNcs+LZtlsR)|~cXv3Z{}I%wr8r=ybV|3Uue ztLSOUVcVKr*65l`TNbWc0;(tSOgs15oqbY5=o zQjKhmrGO@_d?@de&5fhI$Z0*R^s;WqNu%}l=qi3_fpKq?`sV#s9VaIdZ@C1$$N4q z$d*=BdIXIgXXzrOKRVJx4(9|PrUKVx!eOV@txUJk*Jx_s0%s#T7OF{3X6OE%2wP`= zsuW>@oC;Gbmd;2u!tio2?*PA^1#5B9;xNrMt6To)sWlmhi7lgW(i*xb|1qwMOtxdd zrXIXb=*T&7TJ<3Kav{HBC72QFa&aNf(J*TDktzNJ1_v(jSDld54UiL z9w>rEEhLkrF7qcZa}!&FX*2t*Cc|=qdS%eoax9Z5Br~Wp*Ka#fa$S<~{wnEfVYB51 zhxSTw7mDx*^D6ea+=nS(nm*o3{-BUX?O#e9$4;&;)+-rG4%SB1|K!4R4#O$6%9~?St-dp^kJ@O(RbkY`up= z(rx=b3wq>pYM17}xbF{$kARz%uB8G0 z_~T6SUir6ksQB%ukS9`nRqw2=#Wf_~nq55QpxNkNtm=7|*&`ACu2gTcJo@m-MJVX| z5u@A0Z8ed4z0X(g9O`I1+@o`BQ*U`&N9Qox!ASRr_2;9rKaQ#1l~Od2?i^PKVv@J%{#svTXrU{_Geu4nX?anp6xhu?%B_C_kQBW zex9E_bK&#P3*XLM-28cwD<)p`xIS+TRdSt*jiITo({y4Ij16^6W9atl^aC-8hu0H* zW0H7uV^75-pIuK*h)KD$o{}4rdTl+mEGDgXJ*_$B(!=#j9Wm+8*3-vgGX7f6n2pK& zyq@_jCTnv&iz}AFyTK5O&6eEA#>VETZg8$pW3OD>xKb9od$o4sYIE$hha1;AVvC+_6ph7R|7+v=Z0wEC8#lhi z7H@78bHy=ve=&vPN+f@kVB<YX|%G*W$Xzs}2@RL2kMH*Yo9 zL02F6@78f?PqF(ROu5}yIlbBxyAu8LQ|5zTWZBKCDkF=(a&ZACj6WBn&MXn^OFp2o z5!;e{BI>BPhnEkkojedA{qVqjA<;pV@?7et;+J>lvvpL%jHAte$-DU$zQkWetdV{; zuxCEh-fu*WDIIzDeZ6rs`^JsO#$mf*Cn&`CE7zlEn=gg3R02`TIo$dWJ4RGgs@S~u zW*!wEd*Xgfapz&%x5`U!4eG;3p(noWJtW)_a_&viOsuoXJt5Kg*oUH`K@VoPVpoiX zeYb|5$;W@%a?^j?%XO+xcD&2?T))u1&z94to%J|REP2R360X93nE2{ddrPRYNA-i( zX_+riFV?F7wZ=4bw6$v7YKN>sa^AY*_qv=Emz5VibDrvSZt9l;PtUfp-dnsF-Zalg(fnZH)&&u%ODKHHMm!5+P^TH^g-);7*N zRp#za%+%mY{mR0@w8672jQ*(^p`)JR%e$JjGm-(-XvrGc3sZB}_X?d)d01Dy5LUda zxld8^;m@Ri?ScS`eJp@K85r6mx!NQ^xtPYHs{>-gp|m&s~5G7@UcjMNo%ykAhF#^ z5{hB2h7sO9Y2xOm6@r}SZ1Yv^T^_A7N^KZw;&$U=tHgR}uNaKhm@VUZQO8iEO_)aMObxFrmHm`gGmEUB5e( z6_T&^c;yE_16fME)O2j7aa|m=k6L)!q_xX~4SV!s>3L6_piXA>&kFLja6whmAknD6 zk+OY1Z>3*3d2HxfgjKiK<=Y?n9h9pEH{N`HJ8t)WNd2*n?!m@~8AIHYXHWF?DO}b$ zDNwXNLaSOCvKnftc|RT8jLpy}{B*oT<7AHDG0vBKKZ*C{oZgk$3HaXncIxQ9;=s6f zjZgP$hQ8K+zc99Vuf9d-Bw=}r7hef}X1r|HqHu|9`Vv~Utn;qn*Co}jH-s|v1r6*% z+Xba{k!lb*Kwep&Ste%Zl+#pf^6ictH%IfSS=D(Vb2 z4-!5fIMs#v9Mx#HR-K#s;$UiXr1QT08G3y@Sw*_`HMoiw=KT)W^Ix&iOVJ}=Fp#^? zZT4;JcGy{751a68Cgr{M^8TSWfpcrg8`&437gv)3n3#y?IK}>3u&` z?i#)d5VeYFi?o#CcRby*ncs89aY~Q9>ngL$>yywo*F$Tt@DS@ zzSLW|(Uz#;@0Y7lIA0=NfN)aSIHi4;7_AmJ7NU3BuG7Eyw4q*p#od@-jtv&}sjuaQ zKuGn&qj7Vs#|1n;ubH&R+`73+I{CF=@Y8seJO2?kgV87TE8#B@;Qklp{Ac2nR;m*( zcULbR66;gi^8byP2cYCvwkPKR9>pGZS-t{g&_-p)YiC}tyQP0+OK05($$Qs)uDreG_M;!-Wp8h64z$T0 z+hUh#9-EsVc{i}O@>Vl1dgav6o1atB$=e@)G(X=hUf=k9+4=mwM%g!Z)=$4Y7Npjd z9s%)InB_=^M+*31zCSS_4%-aV#K$p^m7hk7CzhjR(Kj}%3Lk9$5Deq>ligJ!nS4e# zMN)t_U~cZ_h^b{;;YTI#cdv+2Q$xvS=ov(63JY`aYl@}o3^*1_s{JUKV4pXGuJN!` zJ&L^KIX)wDzq(5)j1g&@?jzdgVWo2enGxhVD>0GM`r!^TGa_$R>Z6CX@f0#E)|D;! zgnJs z)12R6F|U1P!Xd!)Th=|=yl#!BW604{Y3-f!`u8UsPhM#DdISDo*yrhV>W0qo1=kNo z6BADU++cv*1{eYc>;lv@04RVYKokIgZUXF~QZ@{(WUj$q%3jssvbVUTcJdiE;Y^~) zyqNZP(NCs>*`tQw{ zDy3!@r@kA6_p4b4z6;wvM)+?%3_10X_`4pvf7gS|rgCH?PCf8N^otNk8bWKCZJNX< zO_J)J264$9@x#9k$IEpm3BqJzI@1puoOr_rY>is+Gs^(&)g|jXPBnXUf3XCS`{!(n z6b%((jz7;qh-=S>E5{Gd59ZklEjPV_5PA4jDdbzR=-N@wubkLU1EB*7b2}lgj%*t? zi0%%JM$rHop6RD7d!Y%RukQ;VcsZa87pr9nh?kzz${Uzc7S`S9i}oTVr10|VGl7*S z(y`s*gZ>NC0BQozI=n_`ZsFvo3?s|ycIYI5n~~ksMR(K2JE@*Ohxb18KUpOIw6pOl z3&HKY$F*E-aDpiOqy4_BjMyYe7Zds?H<0cz1XA zeL_5Jcj4YK@R_Yqd(EfxQi^6xo=Y1P^2LB01M#b#PQsHtm{ep9W+nxj7dVqFYen}- z-7V~$F#`hsTXQ0(=6n8C^Ie!4v4P3C>mj7%g{Uv?NEX<(&B2hS+b)5HRq}=rGactI z3sg6xtT4OjQu|E5pRpw+U!1(VeV9DTwxue&t#K)@9&5UogF?>{@)B%ILD}=JeWMkG zy}P(P1d&K}gCH#s;|)wI4dN#3;qeLSN6m)W2Qo%_MRoi;jA9W;^CA4<{urWmrCL^E zCWi-zW#6>`YxKPl*Wq@WtO4m`YE*kNv~{Bgy#N}Ls9P*yX?l84Bo{^iyKH_K3|Vo`SddCL3xyG{iOkYB%&tpPHpyBFwk<>`N|ug0}9rs75%e>w-i zrBMXzW)zA5unNb@M6%g(%(%K1?DZ3^%HxTElmTCRQLiHHte82snCUnPi3M^rOfQE7 zKFD4b&>c!Sz;B#cPDwRMctjA?QJ#y;6401Z67$~e9pQq=7sXpDFjH1}q|!XvfFcqOOee{`TN#WIg&65^PWHt0U z4%`8RpfQA7ts-P<)tcNbsPu~LM0y~5)g67sbD`*)bFhB4dt&{#!|qC`~k z(d|7J<_PllDXp_snx3fkN;#jmLG)oI*K(DL`-ErO9S>2~e3Wqpi!LaEkU%p|h^)XF zzZ;f<^tHbj;9F_39P+ziBXrx%eohMqNO`{!+Yde%PoCI^+T&p~w}89SY}`On>|$S0;2183f43Q*45DQ*h3!y8nx z!j3;nO@q`0^*k|2dVhNi9%-$#y@%_|^dp*_Rd{-V(z7x@Ul)ryw-xi7T8^$U%_obW zj#k@iijRoQTMJ3t-LiX8>wfcC%Y_M<(ULp!NC`Mp_9!NP8Huf?Wu|&1enSjpW8IzJ zMyGz-E#D(sQX2OMYJ_s?q4)=CG*D76LU$wBWI(~w3kWO;?a%5oO8{9$4P$6*vkZ9= znRrF#8B=c_HHk@l2`|ni=pbJa`MuCp^e%ksjk|U!9ww=QTEvuj8bmMP`_K!_5d#N; zQTie*;#dop6kWh;q(Zt`niz;EBKLS=CB&mv7e5MCz=XIg)f$$0u2%zLIKJ|D04PmJ z>Y(nq*JHu7I*=B0?+ZQ&!w^=IGR@hCrg-#G(spe2H_;cVFxP@!1UOH-hmj1-ft8>d zLROilafr{~`tlCBuQxQ+OyaNyLjCyU{e%pwgQPF)i082r(P_gcIB%46umqqIu^r=O zT)a81w|sVA93pk{+Kd{+NR31pGkAk*?mEH@zHEH|d`;%7so}Ynj=3v5FvDx1GV#9U6jal~XFu)}Y#b=oXNVm# znIVh~O4i%-O2tZ*hg)JPEgnbF85XN4@(dFn7+Rq~LBO43Vk!LAV^p=72<_ zy`1x#$TN}eW*VeQbw5ek^Ni8mcz&*JXMgnsox z!<2t50O!ZLmqS7G=P)sb}gqY;v88cp0H3fIT zvC@v`V0h|jJXNS-Ad9ATdO5R+4cfQ4`uWv6O~~2QANdrjNc-PtAjO$UrPb`W7Pv%r z79D+X9TSgBWzyhsp$pSVqNCQs1ce=)_Eemy7~;PhMB0Dm(Jo;3?^?H^@PE&vch}%5 zU>P+WXE~ztiT_H#64|T-d7oan{5eajB!R=>3}{YLO<1%`k=MdWM{t&q&M*Pulr?Z= z+hs-pC*Mv3E64l-zd1SUNENdqFoAaBI$pO~eH(iZRI@nys2UAHN?n z_S%Pzvi-?tkJR}(T0e+$op`Fr^I-C9B7i2?5`5*Zuvj-$F18901!(8>@?jp`Eg|B0 zv_VK>`bRgu4>dZvT*H&sggLJQgqLYO4Vu>C18KaiS8n&QJ+gS^((bLG<@S+>QT?x} zAw2<_{Sz{myjqt@&Q%A}c5vFLgztk8UJZoTA`=720JHU?F7uDjVF^;&UTn6ETu_SI z9+C9M+fR3Q&zStkz5s3;{=Kl#FzQb+Hi_KkNRM_X#5K?x2yzW3LeWt9ls$3iKMG#JDYybaj6)kZ1?Qk{1EuXE6d6gz2OWEwjF7z%(nd{S(d3O% z@P+v4cH13!t0IpTSso!SV=v$j#V#wFw4+8K4(0Pm1gqwcNs)6gu+=?UkfPiy_w?$v z()`xFW;%>7_9ik;&b6egR4!ZP#opyM8Vu)Bq}JHp4uT`lYAFmkpkukgxz~7{mEK+NH1abIKBDh^HiQSwKE^1J~@7ozm+oF z^|}GqY%PECkWcKXscUoMn`sE@GraHqroSfZUju2@?=j~C89?H?S-^dOPSU>5-fQ~d zZ4l-644RdgE+YKhp$VdoVa z1qKe(hb{1+wuv%KN~qkVx$IA+(^-N}ad0FL6 zl}arRf&34RyvaEa68}06f73|wB*o2j&KB12&Qwp>5K-jO&SoTu$y$|rgoDxP{M$8D zOm-PTKpH{wS|29$(G>Tlh|Qd=Fi*kp{Jn+Ip!_ahnrpJnvw0P9P`Qfq303>%8(uBS zIdf$o(VTQUo*_=(O$_jfKWI`+zNn30IS26BXPbPj%Pz4+e=t+!TAuXHXSN~3UyY{U zl3bA$<;hy08Zp~?@h485SgY;#783<0eYx&)jy`ecz8~?bo(bmp6L&5s)cNO?Fwcix zQ0D#0L6nS31SEMV<&;DrL=%zG%z33%=l%hA7nzo_1c+$3jGjx>R%-t%4Qv#yvE3#g z!1bn@c2De(ayWM7(nKk}6s4HS>aq?r=Or9-2o4s@+}ifv9X@u@30%G7kKt zhtFnUdlzQYm9}%sGA(uj%d-`wYRc39#GvLsG3a-jVt53227WKc)24?YhFd}&4Krqx zUY7FdkCZQ^^BC6U?bTVcwW1bC?6oRt<I=%yX`(3vXj(2KFUeeJe;ps9lHo1evZFG|~m zHh_4>@0{+BLqmHC)%^tcxcL~<788#&)UHOH<~K}~a|%jlQ1u0$`CmJK<@n~A=|ttY z7v~~QCEImJX-VNG_-S8}f(8-@ z0wuH3)I<<%@T@M6Qn*Sw1)HH4Eb42A=?W~%Fn0QLU_SW+p?)_AnGJOMx2}NPh1;n` z;N?0J=jFF98Ah;ExGL6;crAqcT4(WScuIXl%-B+~3K*%0<>{wTd8Z4H6mtBZW$Z>e zrF#ay?@A}^CN3D3vK)$0Iq>}T>;wA?^mmUB!$xr(#gbJbb)WLf9sPIlP%q>(0m!R* z`slu!EAJj&RB|nhS>}0Bt07`4QZaE`fh-&+#E86idl;0qzmc?MUDg2=NPG77lv-=3 zV~V9odaGLe3*$gP3D@hJFDjF$LUHR4-1`#W*VD5jIs0j*PQXF2JdFM8hCY-;wSu;9 zS;sP{WX-nNbldCYTM4vop~Upi?W2z`B;w$LHx49@^cdH#yE7l31uh9P_y0mQo)<3r zwx_}@eD~?rI;3^#e*}VFPVxS|UjGB{!~~EK{9gjW&m$^K68mp~AU#|_-s0kA0oTqH zXI~QRhl%N=fo*#VRYCLW)=y?h{{@VoM|v!o(*>}-Q;U0?6&!9r^wh{q3N`5>E_q%m zwZ$Td&nrgxKoYNg5|8xBrl?rm$`rJJUEi$#l5~rL^U3+izUGchKQ?>`0jil)5!81R zspvnDfQV(2sh~S>uX{q&eNO83k(Q#JlMkZDxHYa_>P7TCsZ%LUGdX@_xcUpqAGDBs zN}2p5u<(Ws2n6Lr;4vh-Mmg0?Lh!2sBbSu=-i^6HbC3MofMX7Aimy$>yXzmj;^E>Y#3Wy2`lW zEL3mELY`zaRLIEERQ&T8PyRVjeoHkJq5vdr<8x1gT!%lzst&RKoM}maytX$gCA|wO zfL532Yz@bnpF$D^(6)?n+a&3|)pfm1V54 z;U|$HIw*KmU#6_NHcMgXAcKp!m>S7kK5ka0b38Dmt@e7U)B8|27fp##p(E3Zpt=y2KPtM1+TOaf%8yD*EiJ}b-;ZJ27iefZ&p!+S&e>mGjwv*d@b zNLAAbY^ao>z3u`&!QaZ!Azxwl3g+;ThZty&%AJlmkwCKo>3JiUGj=@O+%b#P$Y=YN z`k;yn^>A7nK&tETR9d<*wZ2h<%f`c{$3Ss1dDlcC5G){FqmtITw|4YZFO&t8Xy zvM4mJMAI>0{hdn>EE0^mB-F(MY3|yCD((_m+biUA0%y zOQ+DNictirBlxW=D@CE8x*fV(9+*SGw!Cgjm8-^J)0AIU&k*!?#%40r=l`S_tDHYU z;s1}~6Fh!zykCS4vgmD>xP(;vJXA}qIn3VYQFV4lT9S;M6W`t(KT<9vc*A}JQQlhs zw!aZ&bIQjO$z@6QAVdL&sS+X{DGdaU=-KE$+Ol!dJXJszA?{llnxD?E;u^}P@gkLu z4yD(mS~eH&7b*d##CZ2!Gorlehnzy32FZjy?~gd;e{%TN-R;nWxd|A!ZrHgrig(h` za2o2u?ZMnAMR(cx!1NDtU$?i-vZhtBy;t{aekjWd=kO78Y7a&ZZk z_cx|_(_#%=XUfhLh0!ELxvj*oLpYDQ2uEWtkGWUpH@1C`+UXyOq(YU)O9oB)yuJx2 z3+Cb5!3n)W_7_x4#6}LAdWFA$MO)D9_M|Mb+o0IcWx9OGF#bk@_74#hH&K0xyWi=Mr|M%Ci&hFJk8ledQ0t!w=7YKhDcx^1n$A zXirhD1)g*{=z{GOe7`XJLoo==V8LP2Ke*sa6uPiY8ysmY#(Qu7pXj31jqCby^Y%c9cBJOwwnLD=OIs7p!5MJfAm8-(o* z1uiK=o8{M|@1I_T>(<2s*dvdv0cZlFp((&Dc_6Pui()IT8$EnZOQ?bt@cit&B zR*~MZej`srXH!Lo@}YBi%hP3JkDRnC!Kv&QOJ@8cMtQwtOwMB)E?qD3gouI%RY!fK z){jN+e3E%lAU!mz>3Fx3>@x>)pNtES(E5e%wVstAn~(A0hrX2)#%|w&97>r9zVRTe zoJ6_1exRHMb3+i*@~mTgXOQX~y_DHD^x_J(fU_3u@x9P`%Gxv!A6UHc?Zf63T>TMB zqSn*6AHRfyO>enAHcH3WpHEB#0l0B&=w{=q8*r#nHHZop`M|-2oeuT|{+&P31Hmb& z(*H;zzlDDITsYv$-!fU08zB)!<gc(We4(J)Q^X1T&={O4HH6p{c!p4vP|sT{e0c7xVoN|}ieI9hEX zo&kCd%Bn<3dydHt3B!W?dKsi4d_cd4cpDj{qHuI5=9Y@J@WhL2dmZtcKS3S5gsC?{ zvoD7(XP}e?JkRp*Nf|^J;A|eIjhC{}A`M;%^HxbYPVcQ8*I5H^ixdtNJ+9SlTYgao zb2K6NK9^7?GmqBz>bE5rp3qj3V*k+i9#|H}%Tg~HqnE@^wMOqsnrTcx_RQpztp5b$ z8BIM2k$>6u7R+t57Vb^#Fyj+N8mEj6#0fH2Z$K>X0Z@+i?G295ifTtoYcF})(T-WjMZyCUE8qSR8medQU3i5NfCm5pedfpZr9`8(4D&!Dcaosye9&s;BB}@u|c*oo; z-hW`fWP}14IKPPfR9yx?5D!&}NMlq9dT|zz$Bzsp`fDFABZ+p&HxJROcIz-iAP8`n z)zD$p0IIK9>#QYU)0wnp6^qYmO*ejxe{6#5)h?Nh|EWPM{ii>d{&6l7Xtw{NocB4x ze+tHC1Vc*X7d1^^*X*)LQ&ju)tT!B+d{Ni*V0w6vtZfEjZ+OlK(61LPdhF^}6_)b> zFiYVhf)%0 zne4gWY<3xDwY7O>!h&w_G;SMSaW(ojS=b`?$)i$^h6suLJj8Flw%EICRV`NUlLViB zVy#+bb7*5>Ziox?U(${LPX+$*DjDY7xNVe*YwLbT$lrUxFtGngBCn)ro<~CmDxG)x z#0Y>xy3<59sEbvNbG8Eb{Rh3SG`uGu5$FXkgj|QiRe4+Z0Fw)e_a8{2uHxI|9j__k zyu{arUgN`O4#GTUzSeZ)NYmm|o6N05LtZtg-EY;dw&xdW2>nFwzp8I;zE%T(`H(zNU;*2W0L!g46 z{CrMZ*)AhNRnjrjbgWw7bmFr2`g1zcuDTsA^5+pV;uQEFbNpWg=Hh`(|2BiekJW&s zc96eS4Jw^a^w(LjY@aq^)WC7C1w^Su7D(Mk$}_UlHjf*b>DoF{4y8$mEO-IDJAv6c zhj;#JASS{E!#$Kw`SazbU((rxMO(6}8Nu)Kre`W0p}b6NNMv~5dlH|+dom13vb2X+ z6J;N4{d`VJH(Sbkzv2v_La#&!4V>_6vk>(8{$Rr=ah_|kLFz*=Zn_OFMSeA|oV%iT zbNFJ0k{<<6iRarhFcqDRA8eky_y)5##yjPJ1lF%^uok6#^EL9z4lyR8Uq`D z;ooD!INs84Yfl9-P*F@k=5eU<<1G|C;c4rt6+~tDM~=0s6q%JI73t9iJ#}PZ#7rf9 zn3#%XLVZ%AK3cy@!_xx234s3|Z1X>H;w796UUu z>C<`M-pKV)pq6htoPVDco#c$^OHkT9u~^+yY$m6EOlFRiYfj=lDD`sDV5E~npQ8$X z`@jbvHtL}zHK_8mbX(hC1`sBu6Yxa;1QQX(*=pfus$;}U>~*5M(^G|b>;OF_28Vaf zmgrbyYdMB713LyM^770tDGe~u=1CgY2)AaqZwa7p%G~lFukp543|Sfu;^N^aqf7Kg z?uM-0?sx`?e=UA(41&}NOQ@t|7XB=5qN`eY>1Ja_P3?goU0}e8;h^TUciYc`M>;{4 z-~1y!(t?i$y*1ZU&E{Ll0TocbGWSUas2?d+-dyLm+`J9t5z@3QVxwTLRc7Hh?Jn1t z={yFvow_g(tXUq<;^I{!AN1L)XgJI*?iXGRb6L8J;)Z*sFlpI z+~j{2BobErX}LD|lH3Ea1KhvuSB3?5teb;fR~`fIp#QNv2b&MBAYolSk30OiAbI@J z9sd^HkwbrrOHXW(R#1+?L3*6Tzr8mH6Tx|_Q4sAD1#O(QP7txy81IdkAqq&rO;f6x z-gTsCSXy{ch#X5^!p;VIb@BdO) zWjKvXZjiN7>eF?_NJm)1MO~R8$kj55*xO3DSyaYvp_Q{8un?wmf@D|M0Io+RvG{A@ zYUyilz+Kt>Zg9DK3*DJ{*F1fhg%OG@Jw+k?qCuelU{=oskp&wnBXmXv*KLuNn>Hlo z=6;{TMJ|1&+NwJ<1JE`vL+-eF$Z=>Z4Ix5KA)E^9%mq6Z+9BXYa!=dXFw=(nw;yk= zT|N{C&XRNeok7`tu=`oGZ~-*!gd=NGITVOBYJeu;FoyemHEwMlx zUElv_6ZrjSx=;Kqv2%=V&_BkuoHp!lV|$r$`#is-yf2b-x0@;@u+?9^Lg>lj=JA@d zZhF_9i?f%Kniy5IPSrYov-35|6Ih4~c-bPZm6%c}b-GDm!^H<)4hdY_QeNpA$+Fda z8T#vams=X?-qhl+JEfyF(vP__jPhy^)fsnLb^1l$a;dp^Io7bWE1IeR(UClP5btN;q&%Sa}D zJ?BP@uaMSNGxifBM(Ne=XJQ?oy757>l{|ts*%Et#0HS9fafdDpPeYQgXWCwsGGdSI zv*EVrWhp#YD>yT}4&}IaTsA%1i!3oD||#0+f+3+KF{< zN|LUdQ{2^T!#scN#^WTG3LcUPbLVe(`8KX`T{*7LGL-E1)s@CC@tOsZDlNwfhzl=| z=Z2fhVfy#wNDWi@ihH^GFG@rKfM8<}c>y&YK+h3B5VE0f-*pFkybvpD3<}cdB>=c| zRa`PPu{cB2d5~6ovfe8T8aM7M7@NT5y4YkZ9cWU@*&fpYQVF1Fgt@|^n9_dzXdD12 zvgXjkXZ&r^hkn{K19ydhUX1VAQyxmPf{XhBI%RX>o9y zS#VVaaT8Yaw@1}pd%I?;4*BN;X^`J)i;LuYZ_D-Bji|MKp`V=u!z zytK!ux0j_3Rkae}Z)*jiGGed8o$HR2?7H~jI$^RfTsep(gu_;#poioavLnJDtU2~!wheQ;@DkVSAh1W z?gBHR7tI9GU~q*tg{R+3r!`Cb)}JZxrW3pqRn^F>R8WxzAq`eXnMx79Nxll#9rbu~ z$qquH5rLXrmgWLE8#2oO> zppy1We5%#!uTJD;2`I`JPQ3pzLd_9&))+9znKe@tF;qwaf03?NK{$N!S_jDY$cq`G z7s>^s?peTboV?-5ZYzGRgL#FB#LL>0uloGVK<7PXa4Gv3H7XNnNM^9w-b7%gN9!ed z1s0+mBvmaQ^jVy5vpvY?f&zVJ0&|xTTCiLW%$B;d1_y|7GL9RrQ_OaKf7>oY2bJx63!< z)95@pBCa?_0`L?{@yqAqNZ(XGgjDFT2W_?;C}2)14~(F*P!gr%!3D`QtIIOP{zZc( z7W5jIy6be;Ei%1WYA@>?ZtNXS#9C4@8nt-!Ks7u;;JSx%7u4Ri7(8~cnrL;IR}dq4 z_8_Vce^v9)4?d3j{^lu9T!QCj96}=*L^FSB8HZ_nRdun$N&3_NJi365 z0f8MCYvIe3?HSco9d-bXIyn}$ zScLNLs>M^Gyf_Yi^M;~d_}@KlK!zz55)eG-gDGU!n!e8G!AgzgOnZn!^YavioOOGk zeAL2pxQ1nT-#?C?c7KXB7=Ei-)=SlfOaOwm)_obsI`(K^pPf_peCu)@xq9s2=5D--|ENp1Qw5RhvZ)CF@ zEs{a;>8X-0$~tJ5aKd4J%7}K+!!!MljTJ3A+UR@TR@Fw>&PM*NtP&NUX{GKW<9#Ij zfgWpx8j^<8;Kcr#9zG7=BD)H>IoJ9%3!vqEfPdA9bt@g2aAAXN*j`Hulob`b`&`zq zPaIbG+V|KVqQb3KhW9bGX&MZZKGf(Uphm>4OE52dtrQazTY z2G3SGN#5wG+$g;vRFf@llZ6o{_6j!7bHfn0!c5Bd(4;D}rpYhUfbcg`d$*jg+2Dya z=NHDle!Hi6gO1$o&J`7#9{jy!z5SYh)4dvwWf>F`R9(sO0Ej|01;_&ydlwJd)}g^w z2ACYW=deIICzaD9mki|QFg>Y1apKOOz3?B#u`|mel3ITUxF+2{0g^erfO2hZm^M#E zZs*&DJ2R~klpGww*%U7GWDM5D1TXKMk_*wI;N4D0%81JNI;pu)EFE+AIJT1W_`U8& zCc1DktlDkPx_lx%bFQ8Qtf^FR^!LY$$G#rtk5u|V(F z{>W4TQ#QRZr-1Tt>~amsDUjWshTxo!@TYJH0SB7;?E@JpH@*NFEvMfz~IY zvkCIaTpUfZ9h-$Kh0@bp0Ti>-+X*a?$ktsNH%y^{b&_9+$x4NX_O>Tp-OhC(@&$Dw z%w_!8Vm9)gQR9Bli0{v#zwK6r#V;K{9LT4$ENj=5-2YF{JTB+B;3r*~G?KmceG-t8 zr0fsDhW1q)a)>N%he}to=dV>%#QGB>BV7*#h0NS1akP{FlF0u5(>RoJ-7a~I0YqzX86qW z4RT#qx^^|NMJWj?z!NjrEE+&ftMzrv<8Nx~1p5A5d!LFps8N1V-=UC6_%MQ1l<;5m zONpR*QdMOXJmS5(pdzFb@@&i%=G;pxyxc04&@cchTl+Zm*tiIcJnn9V_+ION`&dcl zPdm4?h~;d&Ji5^72sHvuT$13{O_Kee{Z&ebuE8&R3G!-3XT6!p?}$` zyode<6nXf*FgcvlWZdhAt4)m$`|N4_qc0VT%m!g&ViU_Fi85ymzIGmtPu92Xfw6 z5zaTh?^NeOS~R9;HfgwpMDWy{sS_w4x4TDA5>A`rf7nO}ds7L~3l&osdQ%9I$Q!cs zDox-vdDn7hgj`A!xt@%TDZ=zf=xRgx@F|#$<)=tRc}DD-z-4)hjCFw4qo(&Pu4`+9 zoG;o-KMXi?m$~#df(g;cK@;OFjv$4nB$2n73~VfC>rgl_CN z)a+rg=G#xUH_1j8>BVCG9OHTmWf$MFmD7*-b-m{pObpFtCm@t?4BAQ!$GsCvikC|g zI&C9I6w1WRKxKA>{=nI{oHGA!y!{`XB{MJot$JG=q;&opXFI6JHWlnFx_!XO7ZHYq z!-d%#oPE5uBDA-0#*!-UArtj+MRYJl!Exu?+H(NUbxF}kkA9$kZ*jXop_&5Oin|=V z>q%z00qG#j#WmhI7fK#Icw2rVCu%0>;#>+ zAq+pWC|xXXTUS2K&JF8o+8vg^4oJP$EH8j38xkpB_NS@febuMguJ@gEEuaI-E6Rf% zT#ZH;w@g=tfV8(MT}Aj?VwsVq;f((Y9vTdaK!+bctnlTcc1HCH4?j6GzP`4RiuZr&FebHMWI*ucgdzD-Z zb}0$p-P#UosE?P>zgUuGo$MekeQ^~nnrm64$Cus2fkB<1wLOD*W!QZ*& z25z3e6;;A-r&Y|`grlg^m~=7GV0y1JCK(FdNOU!HndwdyR;%~h7^Xp~((*VmCw|J4 zg>lc^`rrcw%Uv(h(pd|n(JVJz;pf-0(m=B1;}M)Y1zw5(?SM=#p-uue>Tdfw8LS~L zOxM}Wh-#z}s?TPlbrCeXA~`*xdFG=aLf&I5n9;eE??a=7mwb+)0C#SWPnq?|6zshMvpeak}!72sDkW zRKZqd6R(p`$S3#^?Oq|n>W3Ne30eHS`kh|%$-_QLyh;vRu3vr~>q9BYPfpx>F1x+? zJtTeo!;^9tfACh0ohD~Q^Qu2Z8`9va-`z*yB501H3ISuLp_?l|kHU7sIWP~ts$Z?0n2BGxJ(BG7=H+5cz%wrVNrJgk ze)7k#yLi(0<6o>0DX$u}-TQy}wc5{gJpw#i-1DmQo|S^p30_|dEnk*1#9Bb9WATng zh1S_?jj^FrnX=bcv?8-!rTVSPBriJ5(k|gs>Amr;J?1y8TDq*hG?2ji`Q=d-xDgDI zed)k{xV^5JzJl3RY$vZ2=cA;XKfi1*UCU!u#tGNNaTJx^%eZYj*ZH-Yp<0vIII1iM35ehz26Wyn!4y4YlZ(-B7^^fSt>p zXaF8)uzpk|j{R0bs4v(Kj|~5rrCc91$y7e@VaXPdtsZf;dhK}!_fd9H#78-}^i2uN z!(m$=LW&L_U9c*lVCYx$ad#SKyjE^6{S_5t>PKd)O6PWZWbbUQ8A#s{k^-;0BzrXW zb%#ZiV1EFqNdHO1Ujs2{rBD2=ok5op5??%YQW>5)*E_AR88OAwde}1nf7T-Cxcu?g zYlfn0{)5(rv^(#nAiNHbVooHt0~t_$3xwVg7M&m{o;328R!IUh;b4GH-H{?6Zs)#X z#25jBX?{+H%Htf)W{CS)h-vcS7~splvtJ@fKHe(1YQrAZih&3!6m^S}2nV5=GieYT zmWMA6HeLuu*eoONn*SxiD9)epZ^HE-jY}wvIdZ$iJb7oxf)LnH z%Hj+a)5+G81DzK|)O{>)px*A}9aak)pk3aUy=wv9`!T#&0xrfM$zEQ4=ai!pv}V7N zUCI(bir~luZ%Q%*sit;>Nvs^cAbmI;zw(uyg5)b@xXcfTmBPf;3?uH`WN071`@jQg zHzs?zbXPtQH)D5Q?>M_tS%pwye<$)Ki|X5>3VfTZuTDXeSSaIzUU4?0p4v33#;e~X zAxY9eg)b4+6=(^#c{W81gV(-vtps@FE)kmmusLC>U+@3cXi@eupmyQCcLUI>>P!we zYDC{534$qSiQ66dsnJeZY=!Q6M4v=}_$M|O;>?R+*bfRoVG4JkSGer;H#k2$YGhD@Tg|5Ue0xTTu)BK{ z6UblFJC>on6w1{DL>9IUX@Thgu*#|-swj9$j!xoH)kSp4mNIBC30w-3ib!Qo$3wN4 zCD7pZ_sPQ+pj#9oNMo4M29k!BbFKl^A;!3P$&{R6$~ivZcngd*jqD@SIuccy z^R&2LDs};iBpgenO1`|Kp_Ci&xjln#jKe(OloL>$kDYwDn3@9$emwHwcTF*>H^*+V zc=rtFALh8|D&ZgF>fXkTe|^gDHk>;9@|NVihPNorM{Xa*lu!-_=n85zWwR ztHWUQ;sZx9LVSEY(0wB-ku2`N9d0=_R2eMd~JuT-2GCb!@VR^Cwy}= z)_eVu`3YALe8}=u0gJeeVw#ps^YE$ z!%c;1ChaK{kFTNolxp}@ljtZGv2Lbc6cwqL?Osh&ya z-uHUOO!j~75NLDi|33jA_R|EOyAhF7vfp$!xP*N_-lLv~tQIS-jOu$fo5SPE&!K{3f^TAqF z4B9X(`B{x|9;;r*|9$I*cDEh3b@TS!DE9JxDA1YRBEC8jbVFHOA`oi(edwSd*46^x z|54~|?(_EtVamhZhcr~gjKn;!U-RQ(qWWL_U@lzA5zeOfLR#cWqW*35WLz6z=%ELU zHoxm!hAJ4^` z{UO_8XglEsZk06>AN{(k=ZFNGPzDwEQfq+tn{LmVgK8FadfWp2#`r`;@|Z+KaqqVw zz19W%HS55L|`5s{{1PiWEwMa51Ruq?13D$0Ivt@nFf-`)rN^uMnEI0w0| z`=0lF<{Wd3F$u>$3%E2JWw5;_e^8LKW3vmP6@}Flh*0Yc>S-Pj|9To2NnnY#Z!|Z> zoTlsmpk#V1N0hrY`0CRwd!=(R40Zi0_b+h1f2vf*j-9Eb9sTuCB>T78&Ey$C!h;TR zkxA2MX0{N6n8Hdyk}{Z4xUX;sK`tvK*AO*pLXj1naEsR3<_~{DW!8Vb&3|~*vaNrQ zy0-s^N1Y(0^8IEstD`+t!MvGSFr?ltPbBg1hqHq0o-2@(Z#*Qh>g&$U5gXxu*c5V=yw<6#ZsI&idRAm}PYIk8U4nOA}z4ffxS$*O<>4+=$yX~Zw2iEKUo#U{QM;D1Jl>t_8 z`K3>78HRTQj+IzFQXFOdS%WzLd3gT_q2P?)oKedIP%2_$7}F|Q8u`^c8nH@W)H1M| zh1&62)1@{zL!WZ)UvV{cE_qk^k!UR*+g!}UI85{v!U38RK`djSKqAh@*B%X0^X=m_ zG+uSpb`U^Kh4zciXH401b_<_lV`jHNR|ufQko| zzH;B{oo{KuT^W7Hsz~pFK{MN>&f7n%6{@Nf#9Rb}MCDQL-H%OG)EP<8o>xkAwAk>i zZih{>lY=bx4Q_suxU=g|&xbwTQHnqNrdFlpXl+31bl778kCMgQ@x7Gq1iR74mGi}b zco|3(mgYm^YzqDquVfH3D)hIuInjWLH#sbLa_7g=Lh=UA$m&tgFZ`aJJ8*B8McGRb zKd*m%5VKlTgY8Hngw*1j3v{U(py4DW@%@vO_Z=SOuc-jAtbfr(y@B)o&nWE=wsbT4 z??krMfwIb$hRLPQ2dlwKBq9;y76|*(_iupf(I;s zXmO)l?`t)rtMI2y{;fsBZdg2?>g%*%eXdDua~Q?y*)|R93TH>Ypq|F%Av6%FUSj@C zb0$=lStT^p?Z&VSo!G^8O2)y0AlA$vF|RRnv=*c?-PLMdw^Q#t87#6XkDjaJ?n$lz zhIFO5biK;MxMGa$9`dECPr@~9;f=1AMigEXO5wRRd_IVhyJWJ*=DckUpX0Dtz@3Al z3T}9cZ@duZCY=+HR-K9RTg&W9bODO}6_wXpi!MR~c2R2#THCjvGO}zGyfi`D<6eU^ zGJ#Xoh%b+V2~0$FV*5E~uvcS-mY5_>C6Fa;Tupk7)!WKTzuF3Ef4<2`AV!q_%Vwnl8tGlXQDyWFE(VXt zM-S1hkkSzJx*$>-3@)uJzMK7^JME+-OU>SbP&_Z;GE3y{F!=M*3LWdseO~Whpk|3riSP)^Cy9UXO0~AwKLD3 za_4H`ag;P9EWX`dNg_=&g(9)5Mmc8&9gS>zwbmUoU+jCnF?z7M_}iDS2a-tX8k@F5 zXS1}_hZYxz&s_!LFcdn-Gm{{^JRtdV$|C^OFnaHkxbA-JK~^Fw1<;#3v%P!bXGrjh zNC)Tt;POtfU$PE{E9Tqj@Kvt^gV3?AM7WfW63`;pT`iI*@%DpNW}k{`2Ga(i^Up$gZN+f&{_cwLA0=nJ(db? zU9?Y|x$Fs+21}&UK$SUYjJP3SaWTKm(ac^|FlNw7EM2rB#FBIK zSVm8e-JSn(AFN&rL@|;ipcP8!XS&;9s?LZ(Z5@J?9AHLeI&f{4Ig@b|Rp1YDu}{R% zRdpu^H>a6BtD+?AjIN@mXlshJZUYLIin|FwnV+Li;g#k5+A+IDPm?LEscj^SP^Hunzd2RX#xxD#&;oJI^_V54V*qjC;=0EV$Zy75vmQMNGJmMCh8&<}T z0Qz=l&Z22V!Czb?R~EjL^bvtcmz34keKAwt!Ow)M2>lnys03(=N#naG3lsNvGWGN8 zrY0CYdHNGqmcH)iCau=|huL7@u_Iy{-*tc9g~CXQkAbIqWiuskS^M02a+QiMOD&By zK0cM#U%Mgp$nyG*P8!DKh-RZ%Z^*M-5i9;^dOZYeJb>~MR>u%MF+|il&ZmgSScEOc z@TU%VdV1i3k;in)6ME8J1%x1S(Sgr}kgbgqKV6RJ%e&QYY!ug*QB+RwFn;&+(pfxC z;k=O7`TpFEJx>j$UY#ijmz3Iou-?lnLp&fl?uwe8swo)fK@r%lZA{kD2SeIU*jqgp zAi*a#G{7HP$x<6v;gOO1JDs+=F=77n-^sJN{FwU}(Qt_G=VT05L$Hn_1j(e7F8BoY4Xc zeNs}@qhMV;4svwGe*T14b35o?h=_OV#pl98UV~@32qOZPEX#dhI3$JzGLza`pEFl|zM8r}E6Yl2Qk8z(Z zuh*h0hQ84EbAg`n$xWdB-1#F~-C861V_M9f&{^7(OkXmhHU|t&-1t_Ej~!ZiC3elQgM~lZ;dF%{3-nT!>?u!PX=Ove7C5 zrhp}hJp%}48G>IaB<{Fey;)1H?vDwcn0>mAyC5)z6J8JCNs+Gi`fa%vr80VIjX@or zfnF72M^7h%ypwjoe#MVo#g|FRSmZr78T-(CYF(%~Td&R`MIu$0LM}4CSQ6KWquBU^ z8-sdmFmKC+OKlTfIZ|&Ybt#b4z;UOe&gWb&387jMCZ&hQjWmyx(N6bmFoIpMQFGw8 zJRnJeA6+%Y`qm2o2>`nG#^mW3Ek`*#JIQ8o(*~Ke(nn!-wp4>+r(s1i5JElp1jP*gZbeB29A#1zZ?0`pnN5+A-04 z;+OV7nJ%*(W&Md&JfFoIyMIDfS5~!3ou1}ADh*=}a@6lus+%v%(Q_FEo;|hP1Hdks zqVwBIQ>9!KddVR#gmj46TgTo?y6(qFV5Jiuw@Fw#u3&GMh4VRfC$~4n2413}_Lxa=DLR?D{j1heUF}%3JNScN3vjoJ`RS_!$An@`qd4*ydmFEML;4^TqrVG-&@c zLMhEGZT#6>j{h@7qGY z5{fb(aWu5g+dO!U^DDgf=QVOFipMCBLtXrw!1v1ToE|3mQJkVx5UE7EFc~R_;GWI1 z)OToHajP03l$~3Lz;DDYOgq8Ga`k+6PcMJi5kJTl>RycWR-eWYsl7L~+dvTJDErKv zrx_n?U#J|JXN019i$Xtju{8HBO$g=v8~a_w`_;%Y`nxBN9Sidl@TJ&#7~xp23_cE44lEg4(3YjK|QAn8mx>2DC_ z@DebRAO0ef1il1_pTV^=0U+!5pYNwh3;p}nxw9DTU`4?i+s~Tu^`tWaWwIVxaJ9j72$m|#{YeEP{Sf6?kmfe<`q3FJQ`3V;Q zxv?7h%z6Q>DpMnLaYVrAfa*12ceGA9JuPsd84W}n)JPaI9jxU}Oh>#bcO!fLa{c;O z2Lit5{L{8*t<-$w>XH!6Z}%0_o4j5Z)7c;f*TpD4d%086E(y7(R<|^&xE+Bcv<-Y- z%t%5uKMB#g&SF3vu1kcbUepIKT=BG4&fw^t`EXZW%c*pqZ>vsN!-~bdy7+yb*k`ii zSChQTCX+PylY?EOEwrFBnx=r=7y+0F5;w~jhDXI*KE5olbeJ4ypw$3WmP#2elaD_dSWp8Tjv z#7jDBpS$Zk5*?i0dXjOx>vck=fWzr2(7VW&^h|tnUjUN`a$I=Le^_M=|3m!x?tdlM zOaPWem}8f&{6;elsNxz*1RY$2oGgD@X52FFx);z#WwycKBv*@h0%d}p*s6Ran)FTx zctwV}%^kcHdOzI2`-WQ=JLK+h)BX7~go%e6_T8_t@0V|Gca%0$XJ5-Ri>9~XF`fGU z&zg~rDDlU`x52Pf?6rd)M^b(j?D;TTZxH=C6I9wRy?3T1X8CQ!-Xf~rU94gLXkNA7 zb{UHZfT7V2-}`bV0nm)~C6pLvRpcI>$^_Htl3}F-QeZRkV5cyGQd@ib zlybVkPgk13kICxF^8k^wb;|(-w@M_&>2G<6LrIFZh6u$GPjxxB+EbSopxCpeO7`A5 z3}Qk}YgK8|{F_R}hTbLuSZR;n84GKr&#$)-B$?M$+^$Pq zD>$L@`tvcaSoP63Fv9Ld{_Mknm2AnXGHJykgUd@tj-z6}Y$0Qg)izf4E8jTO|KgRj z-ohFwj6}^w4Xqk<$wmX&eYC6bYqw2ZUV(VQ+6rOTE0TYa=eAt*dOxNSS=zf{Z;(~)=%7&fT2x3#vP=5x~glLA{8ZUXj~lVf)={0Ic3$g^r{vt!3>*NwEaum zV`}`?_CsAT|I8$~W>Ca_oRZz;o^(s~L6FIz4Pr5ET9e^3Df{BxQzTA3-xYe^Z|B1F zI|w**_B?c@D%>^5y2EpP-O*-;msd8*`5u%Fm3*)!>{Az>kfBmJ5a&)9^fHh`EZp1B zSHxt%2l$_y&86>HI!G^DLsj93@+TwuP#VFKGGnz)B=su#ldW1TAu8R>a&lb8rxZjI zgd^GWAmzVk#CVNedpW|4&c3D&gZtl-(F)?ihWkeFf=rP_-yj5Kyl5gD&p_RZy07(c z<9hj|mCs^aOx~zJ7l|+9*bw6g54xl+(t~Y?fhKZ=u{eW45lR^k*p`4((13Lisa{MR zc}a{879)HL@Za^T6hoIdlj+64A9ho>I;>$5PRFZH=9>S=-Ca}NiX|`tF7SGW5VF1- zR+XH6%00E!PT4dDpnxJXR(tSzu;iXv=t}Ifx0g$5fWCxC)q9WVQ`XdNy30`6+pNbt z%lz}Jr3S>)e_HU>cmibBw!e#ldEb-2jZw0MLqJjRX%l5(e>*~25lA&FY|RwW+YlEZFVgpd4~-=D#X85^zcX!7%@kdP&oNcj*@t zC04uiAyG2mK=HM@n!x5I0}OF~G{qm7Qv9HpHOn$sC7@l|;Wup#;7VYQZh-h};WZHy zR#SXnvG$xr7>6_CHj_~=fYZ{OZ}Ngoi`Q){Y}$RDLt`?j&|GpFFtfqh*o`5iL+nPk$U1}-$N$+u8vl`0 z|Hn>EF3OI%`?sB1(uR6oJS`pv*LLd~+||w>^J3SBX-q)jiqx!5ibnt^>Xm7r%zXLXWXfT0?S0){`wQd(?5ivKSNp9NxEJ+9HJ|P@WIj?15!lWJK z!cMDQl>PZNjZTNRy>eHgiV&p0zFc5OL$R>8#(3>!OJ@Da^`YyIYz~{ebk;C*_SP7P zNnYER>Ed^Nt!NBv5OXYm`bYpfiBTd^sx9-z|C$o6oR2uHoT##%&;<9UX1#IM@ttDJ zUl0053^}<8zK@nDy&YAlrR_zZ>VHYyH+9(hy49DM4!F1DyOpKs_cnBB^)xrT4JNmK z*YlI{zK(3`%BXW5{K4I3A4LZ^D8%iQp>3uw)twBhKd+sOH^vSBrtMG>l`$ zcjyd4aB7v4&Zz-k$O^&gIu@HfBRT#V6L$YAF=naif^ibDSiNx@Hl^p?QXXag*dIJ#8nM zALdHfcywF0Y}f4Oue8it+tzTz)p=tyr5;%ac)Q`IgWyn^k(75od>S+#YQQ?Q%*-Fx&)jk4GRgp>y2m)sB?+6o4Ey75csr(Ah? z#|XrM8k7T9uH=};r}5XVNt!>t`JCniSj$}KR7%ZifW})rv-$@3`sj2Ye;~PJvP8#P zSW{A+y&mez0yW;(sWj^7YaSX5=wj=|=sMBK{Cok2wd&?dHBo)OO(WUc%OHA*)r~XW zd2vu(V~!?k$hsqW{C2nE8L0HiJo7MS7BGkzZP5*p>^^N8>tM(nxZd=}%tA6D?2|$# zLLoAB7at9>vMb*w$me0t%GJ2-jSc8^G%Nnr^g?L^fdciVTHcXe+1q9e+Pc9Y#J0v7=CZ&r zC>C5KiCBWW?7?r$DMAnOAxMSP+%^HifW@`ed2tI2$El|=UbwpWciKXYM!Bap_T)lN zZAx!vgA_&7iT;fMn?@Aa$S%u~$oX%VNN7Ok}%>skD!LEoND(=PtRm z0=lU5&vnxRa93SaE(@#IB8?X^7>X5Kpdi?)6gNiY?4(B zv1zQ%Jarh+@O(sz5ri&{!gl`%;y~cp+M$cjschg+lHMH$3j|#2G=@6Eq(Oi&4x6b1 zx!Ry??29dly9K-Dz0EKAx~Fk1A{+@h;6c0Sc9!RD6*&oY4IsBHBLjP(2g=D z=O3Mp(REI%4*|ZC^T}nNyC~4SUAI@wE-pMabTLh%ppQc@aaR2%Iiozp37t$UXbnJg zz-|s3kIXVownSV+VCb7;vBy9$gl%#XNWlEQqxWk+#*Xr<7u_OVe|2fTE$YQvddqxIJ zs~WW$C>(7;7kF`DFYBcif*iCWmR?aH+5wYv#XhT%VzB3nEBDf%@lsVnQ4hg$(ha4Y zhSP)3IjHTMtJlPC^bkl(>dr;?9!*yxNidZLepa@%51D5%V;Id7vu|Flu=CLi1fGnd z1jWncw0=}6T~6B|h_*#dbITxptM}{GiM2fv+IiZrW>pTdY};#C7v{n}@ligS29h)z zVZrofo;@^b6W8T)1()Z`bMokyjvq28OlT4M|6DIbgu zPf*5difugUx)oz0bIo-CUh%SpMiVBeoPBkjr%avl{&4PQ@y7*ULV{twta~J5w^~i_ zCZtUPO?i3DS${L1!h{?P%Nd~bRkb;(g3;^c9W_jbx|B^wq(PYVBo|38B|S)#V8Uj0 zZpG=Nxyg`l0Zn{!8A}YNWF=PMw7hJRiPYw|)5R5o#5Cc$73Ggnv@334`;~%vv28!x z!ppb(7`1$eSfT2obG4bPT|B@^CIzoLw-TG5mY-(+Y68Px!{L?Z;A!ll)7v_~Z97Yh zX5$5N*S}5Mod|)>M8?mZnJLYjyAD1L|1)V}#AL-XAbNj0`62<~y+9O?kR$tc)fcxV zqlpehb`2#RCvnERUvxE;-pe3ZrsC}z%er$&uBrN>#`50NT5df>_DvQ2XQ>C~0CU93 z`xj{O4-)K~%LhyCa>#x?&D9SpnWYZ>JDO*PFM2iYe%W&cKss6bJ+zds);?_tdsySw zdv$F`1LbAUImc^tFK-_HUMA5|x=&X$UXWwF z=T+bJrqBz@261XzZ#2(7tdiP3bCY`I?UVYz-u&kiyqTvh2j0HwSD7h=TstbU#`#vu zLaMe^^X7qD*FU|vv6l2z;`WU%Z%2r)U2bi>`Sq{Sw#t>`4eCo)k}GNjOu}Ho(%1Qk z-Zi?d3E%kIAJ2{o)mN5RR&A~rr;W^pfcBZqfl8RQ2v86k(pbVPdHxwIWoBdwF^4)n zrg=IV*NVXAhmEJ)-a*B{QBI8+TYlUk5!2SD2|=mU>8ikRSl!6@$)8Z&pe+k-tcg>0 z+SO%&z3HQxDN+qH z5cB+xciokRIr+Qis*T-yI@ON)*33$tA7A-K+>*YSGIyzE`dJnN$6~iBUA$UY4N+?+ z50;cz)Vyu%Gy8!)ch2O`<(wp7Af3->)+P5o-?b$7cSnK7p z|IE|r=kuNTvsJTD0);Ryc|dss`s&i=XA3?0@R<)#=n{eDQH$V_Ya8 z<%y{0#+jTw)_D8q$M}8so!0xk%#l$_o6mI6d-wT~SNuJI(A|kBeNybf-1Ru<^l{ZV z%ZLUT)+blA_?)l2ckxB^*Xba*&GaS)%*H}>$Jf`KPn{Ri@f**8hq*d+EfLOjoTc$h zTLZ5@5sR}>9|%Yc1iTnvgU+8%>Hq%l|Nlrd#Wcjw0PrJ*po^^_hvyAjlVD&+gl|E8 zf~A}`;95RYUt)a{Yq&eN<$tA}8sBap?PRamge+4V)NPXfEZF}Ky8&&WyTAcFyx%VB zK<;IBa3Qj2axRkw6D5PK+c_rPSsnJL$vaUGKmavNDe2v(^^HN@>*cA3mn);X@0_6g zxSeo)TR$RC4Y1FaZPMvClDDZH)_oA_6t~-A6kv0`pbqA#N&a1QQw!IstN*~ zG}@PeW{=j7fp?X%UCj`I=}HAivRjqYJ6C-;+>;X-Uq&$L>MhSXHHd}|Z}5`bTttiH zMc?lu69u|&-pdzn?I(*qgcs^2TRfYqxG8?`P+tdFCvHSNxfd?oo6%{P*b>mOr+^ih z(SQBGuJ7lU3y+#CY%A;jK}sB0?-D41T?t;+8Aa<}0`$Vfgh4tS;W0>O(q}^n$MFRI zC`!Q~SYV6T{HNKV0T5v-zatE=s0R)=laK&~8DV|9=GOqcyR8K*uM*(Hrlo7Wv%3Y15j6& z08_&0@Ai4A+vYZVBl#Y_m*sq;4~?6BFZj0q zL4{1&z|j{8)^DGocIA^?HY`LdK02=FsxxVs3Ld(zrieIuJ=u9waAthi|K{i0CxSo8 zh$}>jB^ZvE1uKZT`$$x3bjHEWo+U{6KM%?vKT9u7%OFo5|`4 zvgOx-9;Ezdv@WE_TzU0ui*0;SITcVq?WZ zq#W64L2>=XEkt801irYT?W7K?g@x28v4SgmWCx)^rTjcaJBb5d3SAQ5mXBX`=fHO- zCnCacT-Ok+5-36h{11l;K5Xg4P6oZTamZ~vdRAXQGhSMri?;WOeCQf?Id2+pjM*tzJ#w{*PsKQ#&yGx#bL2_Y=WwtfPxhsS`riUmrk z!FSpg(sbC0y&JQ-gdB~RxIi0F*v2+VCCTVwX%p2C+7|*=BE~HtvCMdBQU>mTjHbA+ zAVKf1C2)_i1t}7q3zxVh-RLx z?qMNJX+yy%7l6*{Efu|v&5Mw#3HhVx#wqo!DDA$W)=FZy*pq!enxAD{6y*Vq^%`k9 z%EL!RwM-;uZ}iA*yHB)G;gWnueTM=w!o{YcW1kTZbvLPF2q7QM6d?vZ(2QnAzXR45 z97*9_d!5uP`WMI935Y8E|0ICrP=9Wctc02*UVXmxt`tNi2xqr&0V${D;EOGA0s2Gi z7LUmSAgbggWbLSI)>IFW5|}3T#-&O2r=py1Bs?6_S}Py&Sf9&fBtsW~sJf9cdxr^g zlf-+25sJ!~)-TU{uDpKWC~HGmwtbY@U?JapaBA+a2i%6BWM042o zX>x!|$6&QDQR2{(tD6Y!gmjFS6>h8*ATqb{7xq2UD{k|m$~jpzSZ`CcU?mx8et2e9 zL)#mV>*7BeIIZO~HLSX`-`(&v_ZSY5b-Et{fj%DA?Wv88oQM;pcYT@?#>0ox-S!Mf zJpLq<3L1HTwJ;OozWbGr&zAc{-&gfWqLtXge*ESAEwO3{`$O;BlI0%fmh#1CVy7M- zk?Qj}WyBu=pR(YGRVszPLMCt#G)nv_>I^C86!DAh!IVAVOB@#@2?v5B*9bBh9?xHX z&G0h4#000y3hvzxkQ}07Pkm`e;eU7I(#x#$+`be2|?7z`UsYk=i>>@!O6 z+NNC1Km@ppO(WzpyMwKnQKL^#C$5|UXAwJe-=wiof97(}-w9&1T3F5H*s8G$DO`+& zq%Yut3x$cRnCZI&s9UGVnzJd9XkteOfgT_kIm&_NkhUhVaE((PNvb^GD66LFvNNW* zLiW>abvOXbe3NsCp1Gq%q)JZCMybP5^q*hOI$U{uN8KJ?!6H8hPZYSf1-RFIcrAhP z-6cKAq^A$pyCsKVXJ$GQkYV&!@0l8HiFW}=E=)|J?vc7`?ym#6tvxxoSjR9555^Z) zbg5dZYE3+eHvJ*FE$`w82D)dkAbK=xTttpMB8|(MdY60k(C5RqVQ7o>vqiXDiPpQq4G0v;-7V}Ul=1z7Ar8#8@1rDMDq-nSOwy*2E(u8?cwj@8ptXNP z6|R^La~MI`LM=Mizuv#H+$AJF9ytJ0>Um*|023vt5~kad!aylfo0qnsa9#_2RBr_O zhG#Y2>Zd5}3O=-J^ zUU_3I^LGpAaCxt15luv=Tm>8D@Mgw#Vi_y^5{{d?=Ne>(^4foWb|QeNQvRO=fe-T+ z-Iax`_%Sn?grp>-qn#Bs69VT0t5S-(Tz~~=veF5Xx*utY^56|Ml1ANGrS_-2@7%H~ zZxx-w8_>E~4XvBwwtR)jTj+w}dAi3~4MWB|?^ZH@fX?NP&a`7Rm?o&liESwS!jg63 zjf^?ODX(A-Be`|2DRH}EWBm2r@a zCB=6gFm+LTxeENA#>n06Q@;*OLBQ!YWks>Q58d897wTb2XcsCE&K&oOlTvwF+mWIX zl-cuAE_$X0?+(>5b^aPSn4NPG{i-MwcK5bi(Ydhk1U5Tva~Tf-`nK11GSSm53yZ{2 z-7?hrNn6a0q)3}-UYARjK1c0m4l3pympwNM1{|K3p6+_HqdeQH^!Wg~9>^j~@VAaE`JE!>uq{Y65qf_T7E==cRNOj%mZWQZA%B8$~UO$zBH!jlBc zd@szH5QNlm)#lfa3+%GwU-=eJRsoOw^ar=4rR_mn-yh4cm+PZ1n1fWUKTF2aM(&(o zmM%Wmc}Ht2C)i?_wA^d%h9ND0wPA$(yLHTJHMGk1`1osb+AJzsV()Ox+UMe;R$#uR zXRRr;IGJCQASG#-nn|xY7w9``;m!$G-2Es`(exPOUhPBj{!g@Owsp(f&GiwRsGLPW zWhT}%9i!~`^mVYD;wGp1BT%6*1+))0dE|_?}Fy)~8^$Yb-sk|d$ ztaQIDNyPRm_vJQ?)ICdGV@73Z%k;y=TY?_e>A#!bVz=V!#2@Z|uDkQqEn}7NY3ruP zG`Cs`o%FKop_E}(HLb|+>JIlIly=0Z2u`AKdN!tFX?|RP^-3?93vOHv{{Bdgjad6a zyhoy^->^vjd0J`u`j7m^cz$_|`x>|@;66gCjg}Rc!ef~dE)2Rob{(ur=!#TnA++Vs z<_TJ5eIh^|3c+bg(`cesY&l@6DsV#*mmkt$#KCZ#bHw&pSq~yRQ^)rB_orF5M|Wyw zoj;=XXF@*#+_BDopB@SDRF_>*&~KsD7t`c$_+Npf1y;&QnXPV`VT?daX}so6ynXg$ zCq$N6;}lCsXv?M;IrxrMRrD9;7|>@2=L5tM$^ktQxWEfrO6{^xse?@rw7wIs6H6D3 z(r`e<_vpr7(hs>>P8$ny-l2IIqC+a1+tHK6HM-jK1^(tOO-@2{C?`m4uf5c^>_-7? z_YaSc@AsBWU~}Wab|2KF*rTJ2q?0OWYWTefVFFU4UU|UbNnL)NuG+PW&G8b7WJ4={ zCRa#!{+Q9dl#WLWGPIF5LONzS7ot8-l+X@2v#H48GXUBd< z*fM2am&d1~5iC&JI)9oF1a;5NkpvUYWS;Z=0{eRZc;=3AA;e>JJPnYZ0mk4n$CmCR zR?=D?9YijF8rXtnJdoBDXAX{^l=r5qtks9pz4&xa?X}ZE8 zGp{GKEp>x*ltD{99jRBu28uo3c0k810J4YqINa<;EN{u|L@h zMn-5_RyH-xFgq9En4n5>Fa- zrD^xfl`m5*=Q?=E%J$64t5Bw5jY;m+Mg}g_B)FWfHhx@5xNogUxZaKU6oRUIyea4C5#!tNFsC ziyjkKa3Is&Db?-`J2$;)-s1)sv44|0>aORRrHb!5M^S&j`Km|vo&GScjl2OTo%!;f z%;lX;%0X`9+LvG6@-!J9fB)v{MLt6CVh1re{IR~i|5LTAR1vB^HVR6mjPl}x+I()V z3oF~YLlLgBF@khNaeweh1Ub)AOEUo_AC|75p!!@R-s(jzHgndEqp+nkHqUpzoQL>!H|_bW_qVUnc$5JpGAHwpiq$~!)XQ(sz%r|t<4HSz zx&l>8TIR$l;%8h=;x=HVuqXaAwbgb@NWx?m=FfYn0q#ZXkF;6ee|I-jjts4+_h*Ez zY&I`C92|heQ0B3{2lslG6Eqxh3rNK@^d@gIK9fBPlr9kKgY#(XQ$;$`CVc$U!B&E8 zj_lSbtKp$?BYEhDTVVj=BcXm8Fv8?oau57ie&5>@^V$%E|7E|{C8icIH1NPvo?O24 z{OS(}EySLyABN+?WfG45IJo8#7;iITdeUR9&z-$L6D=s?uM?#-jC~76S*_44yajc{ z_smBq@*%qI=kpdj6h>n^cC6LH!A_c1?={9NM<^I<(!|@m`)mJ*mkS|CxbEcnjj=uT zPHd3f`D?LrJF9QnlC8pqPJkp#atJ+ou`Lw)mCO0#R;AJRJ-DvP4n8;3`>nqAs!?sw z(8KS>8jVK9>msub3;5Iw!eF|o+^q-F$3E(M2vI~qr`VdW0)|kWglm;1t4N0N;V&o< zF!>{euNuCRMgc=&UmWNGX%rEXH#Rv@2n4n0KuJVpF786u?eI#ClRs`nam3f9WlJZo zpKc+NKS)NZ27LZG(TbEDUT~(^IB^n;UfXF1s0mc_fZQ$HXMF=4WW$IRSv>y(qRbhab8~*T#lKj2 zw}3!X{Ugu@6@O2KnoH`{TmRYbWtk$Y_e=FRcm|bSr*;eBLWf{9*Dl`#K+9fxeM6}l zT4q`QSs3H}r)vjx-9P?KvH*9uDJ%t2ba2t9r+F6@X`23QBeQ4M!-{RC4r`6T)sHSZ zUZ}x2G`GVLK!ePth@g*-v)UM{i0Rj<($>wmhSg>Y<93(Ve}pLxc9~_&;?Xzj-NU_e5D@Ix0I!qNoV>u7s(_S(i=U%GX zmNX2g&U`S_jpaM@NtE5^)$Fq2j#W;Bhi|%UFwqzL;*6eeajul;&{UtlT0QKAi#7_8 zTHO5ffu7!vLvt6tMb3HXjt9%+BshwUtP5$?%f>KJ1;4b3JOL4)$VT2m@Vn#3X6EhPH(d6%V3 zSO}ld0n<#+e7J4%Li2rd*(%C*z{DdH3^z-hzYp|14c1CKk6dp@4CiTq9jt#oT+JYZ z(`SRUn;%)@Gk3f}=%xXy^Q1RLXPyt1{j>7w{P)cQD*@>+*jAix7trhQw6V(ibYR{m zt14|bc$hQMiIFq(ekV4WU7C|)u+<{A+a{TZ-O6GMg(7IGLe;xZ*Y<~QJOATqw3vB) z0w3$z8VzzSi$_X%F9NM}OwAUeAu@lE7B6=#v`1qt$>0Cv-5U3=bY!tSQOfr6vD-c| ztc%Xg?oR+Z8n=Xx5PLjgnKxR!Ry%%{vUmZI&Dl~H ztY2)qOgnm(!k?EctVi~gT{ckjssz0qRF?MHSyD2p4!h>prY%*zUSuO~5vO*HX8mF4 zu%V(!0?qtFY*nF*ZA9VK_p(x>Rq0I~qw$EBhl6E`z8czyr=pwZ$%?fP1)6!KpMIVG z@OrJDf}17}5gpy;Y;g@rf9BR9)l3gnJjVv3NLB39!7qOjA6VaCTQHWS5YF~L!ocaE z`SK}C4^ub6%0W(~Q_MC6=Ac(nx=Aa|&4=&{D2@x#0oaNmd!3k}kuDUW9L#1lEv;Rk zqz-)R6|Qjznzdu_*c7*+knM19Mq7uGT#Xv_-R1SF!N&@n4zbt;!#SfJcqzk}#mO zlpzf{^8W3;D|_x9pGIwbkC@0bG-hs+T|3x&!SiyL7u)WpQBqZO{C4)Oo`Y-dUh_RG zk89vfBq050E@OZRcCw@#-YSWcb;(EgvsLz0%Q#X|$0n?-f4O|3=^hdDN z!`Q7HyY-_?IZ5NWQH_M7wWe*Yd+;gfHeSC=f|&8=%rT)DU~qR*rrp0n39j3h2LKTx zp$L>t0Y$^YGlC-||5eNP=c+`p5Kvt!^%PAZr>TdS-69m~P4xvJ$S>ST1TIHuN!buE zCgg7z7XYx>cuSi#+)L6m#G=uw>78UYPTx&`^rO7sm+hIZ9&aKjLI<&8Zz z+7ZO1;aP@W8j}vYBQBv|cfF#f#`?hRPEbRicUiu*_}DW&|BinFX460n{TKVh+s(fQ zOG378TzUiPpabTo((PhK{?=S=16lncfpde6gaaR|H2%AXKJVsIZzZnmo0fpv!LZD9 zJf-bdI7!lR#u3F&y`$0FQnT=cTTkC)%x-#WOIe^vDzOkrzJ-!3rB)98LX;YwPow}s8KQ)`(QL9Y%~s_xkDFaIPmy7=G|pV0D|yts89j{?%SnNAJ6vSOGnC%uA! z8)Oo8h-do{%)yR~DKkYJUm!ad28Qyf#7;h9ilv4wl3zRhjn!MnST}FAA$S( z0|U_s5ZzTXK!=gk2chCHw75gj(q(8HS3#w4RLC8-TE#$^S^p1R?;V%)`u>kApbQmJ z!HI?&M~15$m4LXniIOW^rD=s`r7Z>b#%;sg<*GEbtgIBZ%q(}=uy9mnG!tt zKA%&+$K&_tU;l~gb>H`OJ=aC%3FZ^U@wEa_Fam4iO;1LL4k8oyFRo9@YvJa;U2z4WpcpKW}d`>;R2Cri>seNFCje}V^Gu|?J$!CLWcGsIt zCm}La)&S}&>7uxxy9b>})9aLk)oC$v(+>XE4^A%*q~6)^;pSDvefpT;ihh&m%NyD9 zJMFBVU4o-DyCH1r>O);HlhF9`)QQm*7+p4C`teC&D^^;!5xXiy)JZ4*Mq_!9u?gY~ zsYQ4f*z2NUooF(-Z})uMVE9Y}B;{_`*LPQD{vI8}Z^jFo>9&0~p6W(o_4wWo-{Z5P zqBb#5v|g(1NG379bR#YR(gns*E!IazvuO`RUvPh9ufL6E2~z^Db(8?b`;~Wg9YpOl z;kauxVmz5X@2j37bo_g}P=IO8Ib`G?l6!Cxr|#kEPoD*5b#il3o@+t#thA4)KGg<9 zh*IG|P&KpndYD#jj%Xx#rT|~~X1JK(X0$Uv^7lJ@8PxATXmQz#+RZ^grO-4kxq>H& zaWHZ0V|UXy5{6W;locGibz3-@O@ZasSvdY0boH{ju=oREbL^$~reiCt`Da&LGX`Wqbu*T zch({O6uuHZ^zFffu8HQ*V~32VrfH$OK3wCLEG`HpWkAzLFZ`65*C*_G8Do5@C-V`8 zaieBM$tKha_-Y0;vQ6G`-J!bo=^?prOeB{FckUZb62%9fdvVa{JQrkjH^wuLyPwAu zAT^>HWFvx#6&)fSK&J{`U1-hE1l}@;wR2L_8XgR8%&mW$fE%-9b_{_d*aZvOY1mcg zQnEVP1vF2)S(KG?!LXGJ`uCOyDySl$^?wiU+GWWR5&{oyEt#L3gmNm0w*{-q(UQtV z6MfC9HmPv6L_ENOQE4lsl_5ly_JJC=2Cox0!<0EpVYHv=&UikPlOSf+t$qJmA>qjd z720AaFUbKXquANMN1GCmazP2rcu&UjknqSr=Z-C24NG%Ujh)ZXZMkn4CS`A%}j%>b2d{vp}h;! zI9ierEsW4Zd>@+7uY8WIntmwZh8u%QNo{)KB!i7iH=j;TaNd|qHj$H`!p*X2?tal6 zQNO;a9;D9VozsazekGnr$ayX&Ch~4?&fbon`)6!cgTLe;RQz%4D3-5UM_rbdqisY~ zS>uINoe06CqL7HIFQrM*t~G@;EhBIM6TvNttKQyqGAJ)L{{+5K;5FhPZ@U}C|NYfn zzw315L0Nx)16gdc1WXEjbb$&7JfSLsPi<-jyCDFTLZrQn^XwEJoru}d(cNK~EH-c(t`W?cF?VC^LG zk+zXV-$*8@>B*vkQ`@5Gxzd>kskBatj--`>iJnk($Oo|7s|%??ET=v~%9~kkxS;Y4 zURX`uC8ef9I_o^CB`1T%Yc$Bd??kIR#-#SVFU>>ZMTaJDn4T9xvrD5JW;Fh`ONQOM zds*W!wLDs8sDC(;zPFGoSaRt5%C7krwHVD#2wI0o5EwAeqLs@B-mm#84o^vK$r9C$ zUVs^YLNq(?^f~Z#5RPZDI3k)cgj~3)B-h{bEiR-0DXbg%==hEsq4Dm|6g#(PSt~Y; zx{!au96V&)lDZ^)$Zo<|yQ1bb8h}ufVSQkTU4Zj7g*X|#tdXW4jU>D*aZi7vU==Fa z$|?RMI7tK4@4r5HO~3&|2*IhYWK2R@B1R;t50kq#vM5RFb^(b{wgi1m3{Y*CCog>5 z7kQ~1p}^HJJ!$$TZ@|Hlwj6YKTc9uzyn%|^(Jx9+_?Sxt6M~_)&i(wh1y?UzH&O#N zHA?FL`sQZ6-NoZ-wYYS^1N>zFEDo54!S^W#^ZTYa3D>2bo5l07d&b&~3_4;sNg^`3 zTWP7bZm@eeJ$icl)lY$GJ1&N2(H5s2&X~u(cSeRab&r`xe!ehuDdoWsrtUacz{iTT zgi<^Fw?k?M&JcyDu5HkrZ%fnZdBt+An^57z~&>>oMMY4PtQZ{XEV2bw^uC0DZ;#rw%og6}_M!QlFjh^x(PUEEu<#`MV zWKUOJ$C+z8FF@>2@0y^$Ke=Y$bNQ`hvH`SFoV-0A=zV@^M~D%C?(fNvRksJ^ew9r& z(EAM7j_}HV)BD&3&UQ|9n#L`$rU$NG^b$l%huBwZDf@yacj=|*SHoJ@lkiLpt7{iM zI1b4kgmIJYM38f}y%<~PN068KW4 zf-pGRd?X1-iEY&&M+!x-eg-gulQmK{_65dA7|(e0-MF_FJ4*`L`+Ei0D*HM-92K^- zFSLyD5yuwdr=PSb@0;rHJ(=mfd!Nf@Rw(nnPu63egNTuyrEvuoZ?JgW+5BDVbY1WH zdX=du;|ua#nhvWresX4!MJi$8Hr9~nulrY>x(6Kbq{!*&gu5b@$XBHzdJzPu;q#+R zn4G~;F2$`%4CHL729u$NGZ9S`lw=m+u}7OKUhE7ALRq5ohgifDG-T$O;Z+VJc1exSnqEo%4RD5Fvx} zHT_5NyGAe?A1u0!E()<+RTHIJJ~N*e)Pqg6@|8( z|9bMW=PY&4c;V-34@Ix{B}$fs)ZO+odutKCn#d$OcOE1W{>|wfhmWs34Cq&fUt;@O(Cy)w5!8|09 zRuT_#yWk8vb#l*Xj${c*G8rRO%uEuAiBV2Igv5=x{PL)+t3=HF(*i&@HKsrbgQ~ ztAG=xZ|18!1s2i4sh$jd@StXh89PSxTzXmUP+S{Ij5Vn0M*RHtWAtjy>zhCHF6X)Fx?Odj8SitNpVUqOAK^^XqrpY8cl8CwiZ5xU?OImo&Pz>)u_s zYWY}&fq)vW-C0S4KwcQsk9N#`*;d6HQ9W-dzbC- zn@L0eE|~0qCMuc<)q0udNhe!`coY!04+^@igueUXrYwAk0;e_)#Yfrd4*Fh-7r$T> zba!2KeD{5k=aiyKa<-ZPTe_tkU=nXg&^u70#Jp^i2zOPu==#&dYJW&gXIJUEXG2MN z>!VGaEUoe(D@D!IeD<-PmtLbNtrF%aN=*#=@X+D$U{2LWeWPcL<=I0;UK09PPnWH^ zhwln%ADyRLf{6%dc-q&?zXc=FaF>61@)K8pJd&svZwbF`pwZ|(?2C8)u7B4g{>FRQ zTD7t1(I5L2g25N`-&h0=IbTQ!Dk1%kCKF;v_Wh;F)KO96vf@?mWJ@Ca@!L7PQx4f6 zJRs5CHHodZK8h$1US@G>iS_qAPbRFVL|%nVTnOK>c1ORryv=(Jay}Bd$QiI(quTbT z^4qJ^Z~CBxuX+y;-y=S(axBd*=nFq1CvfY5iqq2PK&Z_#e>tRUQJHTr{B(K~F%Y76 z#1D&4)w!~6GA=>Kx+MR;7Y+gK-*{ZNg?&Eus6jB{$wcJfHFZ4}TlhW-hCcEA$Ci6n zRiKPdm|l#2{>K+*F>sq>58p>2Cr+-O0Tf*i)MH+4c#d`Y%TB%?tt4j3vGi?vU&!j= zZ&xc56P%~51uOg~H@$zUE=#KNvPu}3cqF6{c_7Vt_FGmMy%S|o%1jW^0?QcaGvn&K zINS;HHfNKU(fOuAsRUO?iG%-Q!79lJD}-uiPk`5&>M{e@IYCL+j#>mSXf;3I1wS;w z^}_wMRLwTg`~5)g`Qy&T)&_Ku6QDSv?BXB?nT&BLzz_q0>=-Y5GDg;|@=lIA6?9ku z!FG9Y4-yQ-M;H7L9MTxTLAM{D9pc{y0+Q%V-00McP$QzW})qM z7Bl5>JKWG;nCe%#U$eGda1C$lTXgA4M`QHX)+kYh&o2#~^;_D2N=B1gUEO#|_X=uu ze%(qx6-hzD(t5NMH1?g**M(iyzK}aT7i9B%OziEK`AI#Ylf%>bBR_Un!Lm9j`OwZj zoye@Q)8k8D%V@Cd{>M>}07zwQ$=K|q+}<@z52yNnLHMtiV<3 zh0|sJM~yT8UhzeHE5V%ov+mtc*t737|H;SQt@D$*=(>tFKkG%xXGgPlYAv?~x1Kon zDE_VB_iS~kXm+o#5{)|%`$l5%#O5M3fb6QU;*0%XO@5bE`w{`PqN(HG3lbDB>|#ro zbxN>pH2!XNakW4j(-7iz!Bmt%JJ$n=FZhM{NrcF`Ti5Xr_*gYwo@5q~%%JL)50nf=nVopMsM*_b5@e?#gpBem@^+}b<(2n+F~i>&J?bJp-XTPdtB z-GTS5%;!Snt(D4fYEPdSTEoOP!ej;px&2BmfKRYwhps@r0}vyAEK}z&bBcO0JuOqE z$;0jJ-Up%U;CsWQBly!6!iu30fv+D-numsMEa@zF@->a@d#Rqc;Q9IHjy9pa?cCY1 zCbuI0G)v8Hny_P8W8JFico?=A(q;gE_3p=ub{mv?IV+x;jA8PzHT=$aa?>HI><}3q zX9}OR`VyZf05>NGP343@M^k>pC61LWcly3@H8Zd$WFs%BiYy+@ zOi-CASIypdA+!4~s`f6%q2iN~3T1tWztJvhrM`F}>2*i>oFdg&ps64pt;aDV*$gi` z9g@A2jp9a+EB?F69@9t3_%r=3Oadz8?RmKJ_?Ww+^0s)?D)EbsrLry<$Xv-j!mU1{ z5{8KBa-0dJEeDRX^+vUoo2wjKghw1Kdud+o8w!Etx7XV zAH~@ew&=PQLkTzLnn25bY;gfx8#+e62D7_)iWc=_Bp?c~1K-z4t!+tGh3YhNJ1erQ z`q;`hK}A$__x&7|K-aWOR2qjuS+XnD#&NoGFpZ6nm#PVgl%++tQhAr8`&H_Mk`u`~ zC>YovnN{OWN$eC;GAGS_w3QIMc=X%-QuzR84o=++b~Wnd-E6E1zh4o*q33ZNiAH33 ztS{~GveG+Ry196r5V+sT{J^lH_U#_eIf~CVD523{AI3s$fPn1IJyv&WCNDysWQY!# zgfDF*edMiLXLjzsed7E?UYOVA?Sa?s2=9!yIV~aP8S!Rx)w!g-Pq`OnaIZ8Xm2~>k zd$uybwxMa*O(CV54U!3*;hoRO`ZT5xU_*dTdb%$kTV&5o?E3@=5F*ScBq-Xe|-sBp}fn9na7258K9;BNZ)l)$9RqR&Czorn5<%YO5-H zNsxKPEwRr&MGR3cpSwlEdhebHn4fIg*4WDK4y*3IBdx*>w|0A z$<~l9uXycnJLNB;J0?r7(Yw6bSTvEl``mkM<+dRzZbRmg@&+s>y*x_O8GkJzVZi2L zK$=(q1dcdEu#^GpdlzcvKD~IS*%}b(PPbOt=5rOS9gqzp28gJJ78bja-d9aK>eR<< zbGAO;^h@DvmE|*wNC4{y=SC2?Oo3`H4yzTMv-MgJ8}KPj!TC~FrkFgb--p+7P$7-q zAjqb2N`fqGE6_Zacc;LejDk(p^l-rLAKhNb112GIIxNh!>TZ_s`p~PhwKezbiY4iU zm`~LdG*S=n?fcHT#C>A0_=Kicc4AmFL{D8y+2}dv!8TdSmom33sdUzx3hZmOIM<3Z z`AwDcAZJ_>NLnXIUF-y;j1v#pnx!jFD-uL=p6ZTM|u7oB!&#hCT?LeIf7qsoOrlDTeEog%Fl#!;nx+a zJv-A`P?VQCDKtlU&kZa5?w|CR4`bhy6F5TY@rI~WmApAm$k_^OWw_?@3@^N+mBA6# ze=tEoB2oi$RM1D6oa4liuP(-w%uW@Qr8H6n!u6dI(ilnmre(Eo!iKF$1^5`BrKLqyc($_b(JgunFfe z)YaT69sSVKGO`Imw{+`muv8}pzyCwgd>MR3^5EaUI(Z786Q?e`b1{Wk4iSQ?syLeH ztH9CH`qsZ7Gf8dm@{=yj_HiH<$FTu3|J=-nW8dUup{3|ivn;{>Uy5d-`m<1YsiJB0 z!sCl|qi2^c%UWIA|7NsdY0SgKo~||8-~@oJPQe6Zwf|3c(lvEhik1#-?#s1(du}!Q ztUewhJ*xL>4qmMRq4Eh+-7>mIg%rlm3rT3k%j&BnewtPE8N1MX#3O<0@u7#U@LtTf zWz&I2kXIzCrG)cnvU>g=-N!n{b#hliwy1zyzs>|`O5pboMJOH5(=S6SWA~rQxR`!m zNgVp5=A>MBuWgm(i#eAn6-SpYddQPo*XxSPMT%ZbzMmg#Q1bCVmxkGz1QFBrxS#a5 zwy_t$n=qkFIT(+`vGxGX7Vwo|0))`+bA0mriG@LqY9pVJBLDk2z4hxR{l6cWxOS6@ zNQ*8%;_u*yh^V505upMpC1M&n+r$mDNe8?f&|L}K%~#iHTqGJ)3sHa3skLVZ^l=)O zVRdfQ&2dZL1cl^{0Hg#t^l6p=(55wBPUnCT;N`ZIS|`otXv3?$nhnOUwY?aFs&;ZZ z1Ohk-R}`%CCZFKWk4x&*GC?kZh_r&-$)ZB<{tp)Ea-pKzzH3ijKbW%>U!u?!J{~7; z7A(LMEj4j3zi|J$O3cFcYDiKHw@VbS4P>*iGsX!9V|7BFnHbHzCnX;8g<}`usi)fH zFPC{+o4qSr54MOLI1}xT^7y zlDo-QJMYk@Oq0W=kwvr-F>}8H&!QuL?GboJ>Zk#jlkVK1lXL~v?fY*g_KI30}fN|!vmiD$2OliR1sU>orSUn6i>H?rJ#AX4Tk zA;DU?PM}xXW$X6a`97k#Mb7G}1ggVov@5$WRKGt71baeWRV|I zTr*Yld`n2|chEY&TxsOT4G}3S=TwsPzsc`#&AZjPO+jI1s zW$2P-VrSDq20pdvqx~d7xcx@d{dEXL;X(FjP+H< z(-r;41T>#it7e;5Au75M(lliU;{(_)ftmPZAgGjyI*Ub={@1tbkSnSPxmy10@qpR5$AV}j$&^iDoo zl3mUrr$1>O0**us=OnJY{uKfl&^v^P<%w#)ZN!b+57#&Tp`PG_4@B;_*O*(L28SsG z6Tt_9l!BSE2>)0|)$l`oALH*}bXEfJbpb#lMbz}WMgyUTxw5KX0AciM>!~F@#hBP( zNKyuN`m2I{>yG<&k};mq0YdkLGjN}9>*qJPxo0RIhN*7snubN(P;ox0mP4{HgxyI}suWkzd zA}fSCeZ{#v!-H%7eF2dqhwYm?C`L&TR^>b}-tCo0L(3gJdVM3MGHtlUDQI$dkI$px z#9cc)pRn6MN^a1CYnmTbxFW9UT#`ySuy^u0Bjnva>YaD_HL^R-?Px1eu{VgG9!f$| z%-(&e znS{Iqz$Uo}t-(dnZ!!^7TKkk%s6XG}#CX z!Btmu+@=XuY>@XkQ0_KOOD9kOjkl(N&~UMDlD(v!w5b?>x4=~EEJ$eZNuG5Do{wWI z@hhUcFT^9I)*UF~zv*AYCIDvSNfvUi!N#sUkulabkXAJc^fN0j9=+gFmt5MX+?{wu zion`Dl%ezFIFAt=?9h!YzQqU)Hfj30*P=~F!@u_PK&g4`JKeh&=EH?YZQy8sO6r%a z+x1-lNz8m$=8aY<8euI^ZYMj>yH?a5{eFpo*1FaK_VJy(=4CMNt=Dw9C()YU;Usd_ zak5ddb@<7dzW68C_0YmJ$fkQX^(~=Eij|CTPM0Cec_Sg_>t1QGskSuDjZ;j|tJ{-3 zBlqjg6i;5B;DVhD(_Ou>31W-K zTo$+Zh)co2p^JxP617v43XwvcpYmNToqEAQ5kHZK{AW4@O-Qb#o<1*c>t*1&#(4;+ z7r5!&ttJPp@1-z&&SHuRm71fug~5LqJ3jwo!}K5vOA1$Xw_I z=1sgj;>rJnM~ryFP$fdvWgu}%k_LmL4wZaUaJangro5^eWPJs2-tHMHP^We(^G+QL z`CLg4cY|VVn+xuD2gh3qQC2<`ogZ$l9~TzDKA!Pt=lS&p%QfJX^DH^GpNVl+nX$T= zw^u`bn`)=YYDZ3?p7#3u-TDNq+kkJ`!@hjMqIfm4L+`*}UA;Ms_&G%_m>MD4Yx(Dnn0FFG0y-&gx1GGc z>~ZD3g@=h32cckO;B59Tv-0-7xw=9sN;MV$z_R@|K8e{~!EWxahf_|bl-~FBw)mPG znv0aseL0rlGG5NH4$lqcAS?k#o*gn*tBO_4#N?$z4giTSMI|kmOGVpN+UQjG3g)ZQ zknSm}Y!CJPKZcGKP^i%h*&jMQ#qhF(&GqpeqNuozPhK+!nPf5*OY5@H*N?@k?Z4HgVu zTDF?pbfBzN5bvnw^kj@C7_jtrn&Q)aJHT#Hy}ibdx!vhdUSHni_i%xcHua}B@4s~U zFwqkBv1k!7MFldSGk@b8u5{XV;X|1x3_h0$s|I=Z_`MTvdeVk(tX9xaO@IqudgoTx z)*dn08DmP0(fBJZ4e4^mPb8}0;*M)jB@yWWyVF{72y$JEhqBk(_RAgC8H+lZtE^%e}i_tT^{#fXtDDIr<4XPK9bwlq0GU zT;WZZ1*)>~N=L`#S%yFgYAxlVpJO&ga(!+sMuIwI zk5MX!7L*_iCpKKjGpU)%?qfIOon zv;5@|m@bZgq-K)M+~3?h$536a(jL*=*61|T#$Zpq5Jt-Zl(_R7Bn6gmf%Cq2AMchL z6MZf9A0FPow&V-0aRS$}l0@kYDc*eOuO}4-?t~A|&Uy>^>vzJ7bsb7GAFI;i7ebm< zpZu(nnC=x8H`t7Yz$4O?t};KH&MjVKBgN@tK(ULR*4O2rg0|>_r~;D*BXotGqNgwE zA7v%nU#9f1>ED%1OJxP_oHQWab-5x->3x6ba4ZO+FmjPAep-Cs6k=I=n;A1bIxx%Z zcKNwy+XnX3uqB$x6P(RDM7sxMIibbl7BY@>p0EO9I7ve3G>ZdE#Lr=O`{cIrY}LHy z3iirG8keL6WEHB=k!mU)t~C7+uT0wmzwluoZ?e|V!f|c0KnBLzLn?$LKkh<6Ba?=0 zbTT_%+7N#JzIt2%RO~;S9q>)R;IPHf=r!N8Fk1#|)HlQeumY$U$*p`?kMuXvSQM`#PgYax?+|n8Q$=CJq=}A^j zBZyITN1QA~yyUITW!>#@b&Y}d4@X*+>>fP*xKf#uz-Za|Jt+{Zj<>q3?isqhtsdV_ zP&C2FW_)iXA{CcW9WjC+u|!JGe2(R2$$>m;7qshW*MEGh74=1t7-%J-%V=ll14>;i z6R($O-B=PC6qn;A62XUJw?uw!zkjLt!Z0j*HG2Py-xH&GC~sA3fzm(OwEeFO6|35J z2H0ttBXvu+Mex^ycX$PJuSwtT+w7@ynr@hLeAAn+vBP=fg8_YTF&TPC0t#{8cc#E~qmJYGeLh|&xpQT^b8i=aT! z_!-vi*2U?R?t#=Z`t!0=UC43co@R1H^kP_}78D;f)c`PDZ>rej`0{59jpWAJ4a(*u)a4@VPE;t^57r^Lmb-=vhYlhpEi1 zX8fOT#|>`Bc2XD)w zz`>4KZ7id*hngg&Y9CR%Caab)3>4L8P17Vc>Y2&|(xpaOWhJ(tZ;DrRY=zmMdDX=U zj@D7VeDv|fbA!N6;bEKGqMU+uUH-W&*V>(0sh<7G_sQrBX)%+G%Z~QA+M!0%nh$TE z3~GDU+Ej4g%Y2FGM$1q4-(XIu-?~82;bS8!QzTTW0;`h&R~qOy)QzyFFP-u2cb@mF zA8FaR!MV5Wq`JdK-4o5h&CfH9j~a(3i=f>b4tB=tJijRA)K|2=sBv6`>9zN~ul$~r zI*-p67T%wnpL(VgzTt+>>2~)KW$qpHNB6T|k5O!Fi$g1ES?gUpi?t-gkEb3iv|7!Y z!>IJ6O5mQ~iL>BTc%m2E_Q%|cTebXxR;Il;@`q-}3jBKiXEXZwl&}VSim!Za2L~xJ z0rVU3AkmhB#uHKh;8l`92qG6X%SP#-kNbuxuQ~8FOb@@A%PT?&dmZi}DxbLpGJ1rC z5%7c`943e|hxIC-F9dt9+( zt)kDv2#ePJkE4cmUnzS8krUcI=SodX?oQnh&E*&Ac%yeGo#qDgq+;$BW_g4zV?PMi zulA&cTi3Xm?c=*wId6L9yQ2e=@-sgq*wrxTPNurT&c+k+4|dgLo0v_#NE8D>5w;h6 ze+crOws`#{HeW-EYslV`&i+zQdw+0M*vtP^>-%r5llS%utbQAL{l)D5)1(`28;)F< zK9{37yuUWCyrwS+8>^FrSu=Iz60jk}_Fhc)OQVMt%F)aKq3!?^-$Y4&V@R;a9%7}n zViZh*PL%(h>~#gd^?!0Ytn5@-4sum`vn=TLfaMxXCQh-K$aJVvNiD-o6^_QQ`T=@S z?GAdaGp}=}!ZXx^K;pV`pSq37{^<@_Rlpgw*+0?YIU{g zE3x?4!EWKZM=H9|LC?4X1eUTDQbI=0am_XWF+Ly_*K2;sQbH%WTyB4YdU}?qN+7M` zQa4IQ&kmiTR0&(*Wcb%CK`72X`qUjeO{TJ z@k`=12Vgp`OwzBWiusUp!{kowJX}OB@a+H9<8^I6m(8uOF4vYH0d0c#!tnOi3mA7h zWm6BGhTkdVVDOFnr=i0$csvM7L-=GTiN%B@izyTl15_%g8Dgfa)Wv;(*^^SoW9&Y~ z-^J)4IIzb60VyW^gMc8|Iu!T0D}%uHXYt+7jMWn4oFhN|71;jD2JMjPN?#cjb@aG2 zHQQ2e6^?s@!*|O1!<3+8BwE8UzNrE%rDYZej%$-pDcG$SSdSglt-3BUd#!Pdcd#t` zH_xu-?{ab$M#W#;dE-Zaq3F80boQk${in>vP(n zig+Ozz{yfke~W3JaZ@_q#IvFI_6~A<-B=IYml?h5l5Oa?vGjae)3}GqFBwgrEl^^K z4pZES7rwas)6JQqO?lZ8kq1ugp&Hy(wJ|vcduieFdq6Ae_xI+1mUd~;Kuig+w2S=z zSla&wi!cI6)%PT^&p{GSJ_yI)Xs2=)qf}DB9?bWjH+c}j4h{qFcfd=2@gGaOOG%=b z{E@$-Q3vWhf`vR{#=JS*@%}3v$HmMyLK8u$`m&Dj>z>r|7%aT4C6K`Sru)8e?;*Fg z9_q?oC}C%AVtso4c>3~Rg_$0ypj`%lxSMqL|~8ptq&%(d4}w zb{VJ#SxX-W{0qPDyx?c6e&Egx7e7UCM@JUxiC)*3&3pf*zBwruPOR?iLTbhU+46zA znuUjhPlObEue^)u40O1m7O?kPbG-6)b*yWKn;J^U6RsM(=ni)P19e77`>)^vc0 zPs26QIWq_}OkqLko5OmCQ5lg&vspN+XgAtMmDoSH@x!1#{}OpJ%LXSD zPr&!jd)yTGbmFGW4%hFE?i8oQhv`(`rzdWdBQ$`2>sZLF4ppy z=iHq$*dW8knFaPNChW!D99n^`Pu1S%9Pj+iRdMx4JZ#+D!KPdyh!8A=mu$FwBkQ?}eay5P7eCF$~@LX_C-1H4q@NVZ`Y4C+Yg+02Vq zo;%G;Hye6JKpT1m?DF*ZFe@QI{Dw8?^hcA+y=3N1szmjk#k-@mRfl#x-1mVm(W&`8 z`cqdPv7H5hF+%f$l>6gn?yu7xf=}&xKSU9b?(j{uQ*Cj~w}sdZe0o4qimuGwC>30% z613WvU;~qgmdFGihHht40F4P%`!JRlkNMU3tD+Nb$M6_5< z?0lu_l8FQf`@&&gjYclSDI)2%%faZA+Y_~`8u)dF28!~fzB$Y!ub#A6d}bv~Nmx9*t8X?7N`^uW23acMsk3R|+#Qm(C&d~ny zNTA5RxQO30y=&~^j_=!hYY&8b1uS)P-WL+ySc_`dN3+O>sL7JL+&ZyvTzGn%hhubk z)soem2@zZ7UD`B&2Mu9AnU>(lsmi-F{=ZinP+P969OT%Q5VO!_hOnQs@>F{N2{i( zKN(1{+I2+eQ4x7GxQ(I>v^Hq-ygt5n&=_)-3Z}vZio9Q6{JO;5Tda#5bQ)cAQM%>5 zE{Qy(hbKt7iJpnRm8g+R4f*L&;A$hSE*flBWW1JnB%zKCp=rIuXvefx{e!NkuGu#I zlI`3)H~%z*zyq?Is3r1FYUi@|_y4}us^r(j{x7q*{3xKy0tOW-!qf^tx?JQJ->VCdh@pl^!(PP>t%Q~bfgAXS-#{Fbet=iaXEC%@d*)DF}&CY{r7 z{ndpLvWQywLl@F^4c3!coxR1^ED)PZ=IpO7SnTyWxL^Oau4rPKq{gGm%Q^i|UUoJy z;`Q2NGUDb|)Q=8#KAj-x4LYcCSH{2H(s_Dsi8@%?N}qw*xbpKdWo1yl&ASTs@Cr#B zq)s~@q|1!G_Oo$6e?{D4bi9p@^mzOTd)((e%)^x&+bfW0UH7j@QkyzeiP9(v!BSig z0OZ7#j-lFX+ZjXPsxYltgigelKXwCG{&tgt{LuDzPN$H(@LDi-07$5X6%nVJDtqIk z40n&sv8)ndYjbaGIS-Yju+2F-lsyQr(7@ZLqr)793Z#t5edQxlVCCrYdlCES9rX|p zynty|K}yT395&d@+`Hpe17qpENN->dB26*a7iFEyNy`#5RU;J}H{5cCdmQbprPyk- zvXpG;wMBcLHY|lIE@&_Cgp{kVX&oj7@)AYx8av~GT4UyB+{K%Un@M+*6wh{QrIRWV zGTNJ01?zY)UAy%in{0m)W5}vVwvXrGx(|M>; zkI!P}^9(9fP%$uskgB5M>8$D3@i|jMvC&8n8rleg=iH2npQr3ko3ji}J-T3Le%p~R z2-hknbKq!!Dl|SEhbZ=y?7gD^u_HpAwWT_^>4v9f1yP$`Vk?4oI@(vW#p_~5ZDI18 zyRtVPsCG>=Nv&)VQ{FH{-0AC76t9lbbOe8`S3=T~iE=%x&W^cYBWtZ)^JNf45)Fpb z?)kXCidGZl&@)tT4AIzK-F#te$i-4j9qVS3b+VyRB;bF6hL?Pd%wehaVsE)9Wm_+b zkbgkN``V`4yCr~vfCPch?py8lvQs5-_pXFi#yW$ zWFL9nekzxcRuZnDDyCba7t+mcPEX2WYz&(4@2Y&5e!cEPt_BL*8*BLb>KSO+$+-m= zk%IMu_co{a2lOJ?jEjdR{J}K+0cRE?ky2OGjd;8D{;4>`=+xKb-zO5@pTE)~lbs9{ zEhl5jnFL`esH(M5KqZZugweOBg#r_pq%ztTW0zN*p1RH=eJJwoa5b>^TUSuy0rRUq&QR4cI zb!$CN`q9+RcjM+qo{1_?1b!!Z_TuHnuAY4$ujBhyUe=kzCL882N45K@!phUycKMbU z+&psFYToR5%$5M=Y~e;z*U)v(D~;P;(4~zK+iS9%qwk$FUd`K5UTXejYS*3(-xOrJ z5ANB2^OSQ0{!06|zh-uxW=KX9D^u+u)9mtP>{9455~*FKY*NpKgtByS_p?NZ;voyQz!{+3}9<3ScKjr z5bDB}%>{!aRvkz}f$#{WqsxK)3*?+cZp%oPkfKEO2`DEZr6i|+Jl#|?F`B<@64-;Z>=_D;&>!DDek@-*;_Jj$T5WWqJBy2X5J8WtK~>8R zcY$(CUCWG8xnkva{pYuk_q(h1rC~jqfD9_=UBLAfJ-f~yIc%haK~$P$v0jcZGUWY- za60pi1zd&JZcDS5GqX(EaO!>|omrfyPIR18Lx1<3^c=3oncU&nNS3F+wmxmL;q_)& z$6D7&YC$wQx$bl2%`?Z29C{x(`2)s0 zcfYH*hl?e$nm8q=|KJB6g0lUG3H@tR*LDmAQHux>nW7Sg3V7qzIs=v)0pzN#-@Qis z-Obmq5ry5&o93Y@ARrCI3{;&m3cy6%Z3*Q4f`T+#Yljq7Hh)`g$IPuoEm9{p(R$pA zoDx3eYt!$f;=C+Z@H06L9t6cs=YQl(awd)gtgiP@Mey43vAd<~y&BYM*e>_A?qjP- z2_`piA%G_rU-bUzpbkSy+_|}>=6&gnZB!y72IAmve&|z#sa;cX)XR(Nq!!6XALyFQ z?}UI<<|}DE$1={1ZgqBJ_&s$KBWBWrVy?i>(_0Kj`9dj3gRR`D+q#+3H;(~F&#oHu zsMwW@BU52qWt2w9gL3wMPn&zQ3r%-!&CFEL*z_;6`ed0qwNNL6ZWc64$t!+WQHVpl#%O$zIR!V5{s@DwJ56Rs7Q`CoMns#Hd)n$W4h>lx z{yH&^NZATPSQ(C;+dS3(t{tJtk15+r%0<+>3I$+7#(=)~;~UzBArmggcm4V`@aR{v zsb+pk zecaatWg{f0i+85Vvf{)H)Rw&}6OmF<5>cVGxmBHO!$<)u9(1s9YGXOkJs567QUnt( z@>R`xX$H{7RlN8mKAhZS*OgkTZ2rZkKU!$Y65bu0UQAszQ3CS8y;)T^y4>wkLkV#pQ@Hm>)qnOf{1d^wG(n2viIsdDQFU=Lrv-@)c}s zoM|7<9k&Q8a8;FT>rAnwfY3OQMKPVeX1qd}y$6uduRsx;2S|=HKW;Q`jn8ydP32-(TWvDzp0B1Lm7yIFcDf>nzT?9cQGfy294G6#+yd{ zYH6!|V+ovewpvh8`NAt84_ynwjt2C8i2?9o5h6f^Z1O)?9t10_b19~H;**QJZylrm zd>N=uWx7@fRsLwPzYHcx#fpCX-y-3U8+eQu4~2ZFVDr9)SK3XG*+-I=bvMWRacU_S zBPMU+Za*STUk`fm!Ti)W*feC%=WkEVAk{Bxxu18hCr$HTx6yFLS?1rP{RZmKJMUc{ zG`0h)VxqnsHT}%LQEGWU=Jb)~#0RU6zS6!24?ejS@%htJ-;xjSuP>b~R?J%7mo{dd zo2R`=+v6Z3GLlv@iZRUJ z;{*htzo{jV*hS_)JeY4SpF@SC2u6!CYtm21h9Y8f(+sezVmYv@Zv5N%M7P7s=ceOf z#iW3PvihW&`*})UCTlc!b*aS$$}scOS+`vL?zJebux)3TJ^*(0%PT6^^6#+8`ocG- zP&zAgCoSnPu?wN!*Vlu!^o&zGhodIH7tZ?>LMdkopMDMRyB;Gn|FVI;-lsV}66I{) zzHYKE)hc?3eDxAobgALF1Hu+hODN+r+zUCKh&x&=1yp z)_9;`!g?3H<;Se^vwf_aZFOPGix-oL=T53CY}~TF#m$;vcX96kgS0-&a$VN*b|69h zJg4Z`$K1N*Z~4|APpprAs{C2-Z3Ftkdb8%~oJr;_(=b(D%hsBQN1ulMmsTgO`#B&5z-2X4a4zjK2^1LjpSZ1 z;UTs;eXYu(pZ_9mz32QwkdMPi@NB+oc6oK)A591rROq+w{E9$#XPmh7=9q=QcoYsq zQOPJ^dd-(&$||vKo?Z(M_WuVBAxe2LKK_5ukmdby?m_IGE8pIW$a~Z_LGUr0u^55J zTaSadPoPyHyVt0jG!h9;^^cA(9aio=c|hmVMfaay?O9)e6>^Il<#LO#YPoQ|C&^|7t*yKRFr{DEQN#P;&M}#UD z;v4X~;t=P$hB4lPR}a4DXE#sYPe~GuWkYLtmml53Xa78MNzltoRY?OsZ(Y9_c0+e{ z53|(yw(y&=^D}9^rOo@lwTpwdB=1uh`fYJpj6@hxg2mXtq~VTzzSzhPCW0p*=A zh=?``@J~o7;s3|pd&M=mb?@5g4G5tcs-cH!Xc7=5gkHqZK|n(hK@kIjVkHTo7lRa0 zK|>W0F$gLuY6zfU!B7-L)X)^H;8Iah*blDtzJJ%Z_wOs`-*L{KkvZom_qc8kSEG5r z+aUw52ROb6|6XzMBve8>^Hq##{|Le&ZncweI`^Q*e{T<;y?q3`V|0iZeys0^YtcmR za0EwCsl1B(<3#I@^^yhzY6Y>Q|5k(li5y%C0NarP_Vc@GRYc%<=(AKSqef(|@@`{v z$T~VgE;0&V70oet2pN@6wt(37g}w${_a@x%cx47^X9LUOac|jrTH$R(^cz2(juJHV zX;G^NNHwOf6+gY|n?YCVi={7k(EZb@Fu4OfgR_~BrufEpmL}^C3eN9K#z&>tzX{Xa zP&IxhvRNqp5V(LaZRIi3SCQAJ73f_y=7;>{`VZzx-J|LfCZWv)76+=gNu5j!hf}#Ey)CVznH3q3-qUuAI$;*e zG<=IKE*@YvFLFP4_>0d9cvJ;<($$Lq9CpP*B?x=d#Mj=m4%pLJAhSe8+$M(`tC9y`{~G$6kOc zK3}!0bHR!M5iT2L&G0HO@03z=2W+;D)kvNd%=}T@_xDrxcB+n%fEjkeB-N{&P=h@Q zMMz4@dy7sr#tOxfH$l_ba`Nt%-Tto+P6++2{Z_9{Ar*E|k{fTs*V=TP3%(T9Ij48u z9|m8;NM``XzhU3MJW2M_U{kgnuxuMf5ZfSF0~48VM_Ezb3(~66o__tA8Qol0Yf%s2 zkU?w{Z}CT#CZ6<#(G`6WYbd^brui0Co(Age$UtJEe_cnov#M5K;RjdE(XGsDWls<) zssTd8y~4r_Nma_7nhc*(z#6(F9Q87|-tB4W(SYvhA-gbxB!RV?PO@Kll`HL4xI{9* zN}?5m;b*qR0g{l|3)!!!T1nghcus-Xw{p#e^g?EO07lw(z+(X=4X zb+7@*#?Lg6y>nhFMn06_S_sfKbmW&Nx%Pz2qpAkLj_IYYoKz&%mDcN{(|t@w|L2XV z7@%NS;Ys?1cL`P&je01@I$1Peyb;!5@q#6zv0Tz4hDu7wXjy9$Yg^9@UtAKpF%9^z zH0KAmXgw#zXKr6)Ec!>zHyc5Gzdo?&Ilvpb)wZ>Bef~XgNBzDSNq`-y(FwlFyqQt0 zVwpa^FENiX9-;00@^&G-C^@Q=VeQv9^IT%D4roeL3?Cp#dQ~+0-}~T(5nCnRX21ht zzQ}Zvu7^8=C>!bk1`kC(t)l{F3;=+K?bNG;46J>>J&bDhoY_!Y!$!Z_F4|}i@ z8>VNf0HsvR-%CP88%<29h0fQBv`s+;qQPRnfgmj;jdem;Oy3(^cpQ4d&HK+3#^qnp zlaB#IrB*Gg8;J-chcrp30tN5t4Mb0IV=++!pn>M78!kO_y)<Ht{l!7){ndH@DEv!UAQYSOoFMNu?kM__Stboc7wTCG#1VqWvLKIhkrdk@HIfnoifUNgAPkM?!mR8C4Km;|fXOygDiWXNBec zubWq%7-65yk}v{nP#BeLU|(NVl_&$0>#F3?pL#1qB*njVy1hkc&BmZ_&9!$k{%}Sh z%Fhf;qfo2NjEuwpEM?{9H9szZJvy!K)Gm_M=@$99EXF>+p2WnQrLEr~kbO5;fYn;c zCo+@IKRYrYNuI_BRAtyaPf_aU?(Jf2S$Yv~X+@v5lUconvO;}EU{{G_TDDD5kx2Ow zgkt-e4`T{h9$7P7PVTIs1)=CfTn#JVAjqIb);2{DY9Z%YJjZ|^w@rROpyV#I{}N7` zd&}~f?2ZRLhvi$^7FKYs=Ai8O14!5=T)7b~LL~ zLX&G@o+E{CbbbmdW&S0pP>FX{NwQz^&4laJP~hgXEB~*20k1=Objqg-jx1+O>s{lY zE6LKv7PEoJeh!RbB(a2O*%MoEbw~(Hzay^o7d~o}exu08!B*WB@05JA3s=Iv_T8^p zK`o@%$6e~aTv)OtKuz=b$M^946^}00xaKE!f;v#I>z;L7AIO&|aWYNBU2NB)we{ar zx%}*36UOL&T^XuG2DpPIC6DrBjPo1-89y2D;2?Bo>X_{q3!-)cAVX;m%$iMbDNsK4 z4@AvqO^IqsVkF0Eg(iN@_w_9e^X11wDdsC6!=s}(4F<8_YU!AJ*yvDfHY)t9+r}N$ zY1wF8dnwNJ_x7o$A6_o`yw61li!+1kL><53X68t#e!S~;lWawPHeVyZdH<)Wr-_N6 zhL^XuwEPO8uq2xIUL?)?7-_tX6!}hR?N)+8^ zU$6VttIYhLr}BGWXhAjUjt3UpJVL~b~~lBO2|1j{p&ldia4^#(P` z9!lheSKs$te8D?mEz-e9J6(Nu0YksD=-2kO#>WwIz!t#0yc7GR!|SN~t(V*EQ?-w43a3XfR2!4tF4={SXx zDS&Q=id8joRt>5G++20E0Rc~96bolaX2bM_0LpO9nvMOu#M-;q6+}<(p4T;S%Uyfl zxwOXgA5PQG!x2B%^`BijX7X#ebu#^|^8&ho$BqT01r{k5;b5VEqhqzfw(C_{imM|p z2U+I^7!Iep5Zhz4*T|<8tP^bOWUk#ckor+^ZN272B^ZE~soY~($>_Tfwk$)XM~zsT z;p2$VyXlPZ%TQ}2O1SIu2GoWj`y2G@Cef^F93`u&;Ay7&G-a2Fu5?+j5oIQSqWdA& zJl@$1wfm3X$sBnf}SZd4GIlQms_X?wXH$7Ut*gG`7KZTiYXTwC80Wn)X|)lh@Xr zO-ds9r&E8!wzct*a8up32{!%$3F5qNv~9wfVqn28_*X%C7>LGyJ7VZAK7ow_GUX)? zv3M&w9gsH?=W&`V(O4ll|7V0q5Mo%WzNI|IYal@`(7l$l(r+m?(Eq33Vs{wgw3h<+ zDpAFLeg_Z;?NYA=tuqNi0y7G{HJ6Wk)r?FXUOD_apq+fiJ zEMe6ed1aryRo%0N-O<9cEd~Kni*u2~b;0-7s_aYNe(CCUGlb#V`uW2Hn0jtwV&^eH zLmQ{BrS^l1b2-1aUR1f5g;BV5RIco#n!fYJE!KIi_Ae&9b0-!46g6c4-|4@LC}>rp z2$Y_xi&`1A0-_nTntR;ueLF>!6^RV+t|6&;_^jrr?hMl3klTAD$9XZhm`iok-xirG z+wZ6M88E&D4o*ER|Mo*aY;^Z)l}g9lQtcl5E?iyE!g@7>bc@d{Q5?=?Gv(92?w}FpX(EaJlITM$0esW`S}l1oBAV^A12EdVSv!>9-3eV>!6N5YI=aI}tq*%ZR=Z zs_~)5Cy%OYPYy1`w(psY!p@5==gbeB!pP|>P6;Xnt%sLrAAGNE z3Ib!HPO{qjK__k>A@BM6Z20Xq&l9Qvd`cbg0BnV5E)`j~)I6*r|N6qY*2>G4lp}Zo zqcoy-{kpSDMup%kKup%u&Nv{~;CIF!eQ%_u>G`^(oKX31n3C7`WtJ^saLv?X>$X?8 zhTT{dO&mG0`y9qLff`~1tj!&Q+{GYXRvodibpe?pLYRfAFoD3)I3ZC#WW9wh1vuS+niMf$y|U=lFgCoqBdbt*uv)oL(YVD zh=iL}JBPY<`GdkY8}AnXRCWE7Qwyl?!MqTpbN!%E1vzQb8QoE#FcU2e+nADK_BuOL zPQ9!)=z#nMy4Y7Is&qJ7v!jL=kY`CAK3O6J)9`>>ZcMlcP=!#vex$^DrputsqsNGIE4az89ULX!A#gFoKO*Y;CTiOeO4`@I zUauJfE9fUHPn{5y(<&F;pL;g60@=CU8OWErvom%ms6;`VnD>qYtl>ocwpl@`9I$yj zy5`MLs)Y^i9hZ$cetXlFI9L10ds|I5`;-N70Y4qI7Q>lXr~y}t{%ffBpyDgGgv-QO zbJ6Sfn{w)s-j*6L2SsdI+~*qT-FpN2TMG#7c>g@VTK~~^-ln2&`olMt17b$(cc|-w zaCow-CYuD6HKRN*xEd=Ay|7nna2bzhd6>oLC^P2h)HO)u{S4Ez=nG@@QZMuOsZ~Zi zvBSvl67o$$X*?lIH;YNtd(Rm3B#DY0Fh>?e3hG|y;(ezzB~4!k z@&x6DO}yN<&j&5*=)#OIx+qJ_4`VH6j*@wKWv_4FN&w$~(EgqO49b{X`-<-F+$&rD zyb8AQ>!+FF!toxjjRBwSl+`?oT`BiooI$U~&TY&4vhWs_#Y;Yzey%6tzHDAyRpm7f zO1iqMc3089*Rt;$s(cy584Y;O0;;JfOwD^DZ2I-N(Wc#J93U_3=OZ73w?B0O%o7gX z8DKARik>?luu)Xx^53NnYdoFiM}lxr^gO*n!K+ndlG_QJS;aRCTDdpd0C_n^)8%?P^N46?qrTqb*k`{S+ z;yIZb*JHmT?!CLZyZ2rx)H)Pz-J(~FHA=|vo4k1T!C?pIMnN#(<#^gTl8TmTofaMT zj>UR=f0-0j1)tqpl45D-)8u*alZ1!m1y{cFqXNsI()VNR8fjNm@%(Cqd8rNnEa| zKJI)Xa2>Y1?vt65t+nar#17Ir46dA1G>?5!wfoKVNt^kAk*v(CEx{x3=|U$;cjF8l+V^EMPl3w<>k8eMU^oxZMY|)>dw2mKJ(_6+q-{7v(a#=7y=7kxhhO$>1Jj{sO5XT ziqv6v&=4IK%yl$=Jk(F$tw<#U?D94S8wvS^Jd>pz?#Bwzh{(b@8$b}9>1Gi_>Z*&M zQF5M(Obc8ta(1Kx_qSld2<=p)#oIioZftb1zN5Zw z+0Fo^{|g)KD-cAL{{#{JccLqc)ef!aQ?e8w%WCC8!ou#{Rckgj6BtwkRvuk2cl9Ws zT3FQ8!NsIIXK-~qKc52FXd5=jI!7(8LO?uaEYp4rYT5J7ohGe=UAVTQ%7dAON`gzuF8$%w{G1b&$8xv&{HS?wipIy{014mpI)@ow8w6c2k-fsr_$!C^6l%+pSvB=QdC<1jVDHB zmW)$AK<0fN1~*yAJ4|OpD8@gJtDq+TI;C!cT+LywYr4K?w}gLd0yMoR$okEpV2@Bi#(059jVIy4>VL1<7?FrNG-jo>MeSByK z@kFr?gl3IDh6dKsG~~C%0DBVvtiLi{J{a6r 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 None: """Scan an ArchSpec and map every finding to framework control IDs. Maps design-stage findings to HIPAA / SOC 2 / PCI-DSS / FedRAMP / GDPR / ISO 27001 / NIST 800-53 controls before any infrastructure exists. Folds in a Checkov deep scan against the exported Terraform when Checkov is on PATH. + + Use --oscal / -O to also emit an OSCAL 1.1.2 component-definition document. + When --output is set the OSCAL JSON is written to .oscal.json; + otherwise it is printed to stdout after the standard report. """ try: from cloudwright import ArchSpec @@ -46,12 +58,34 @@ def compliance_scan( if output: Path(output).write_text(render_markdown(spec, report)) + if oscal: + import json as _json + + from cloudwright.oscal import to_oscal + + scanner = ComplianceScanner() + resolved_fws = scanner.resolve_frameworks(spec, fw_list or None) + oscal_doc = to_oscal(spec, report, resolved_fws) + oscal_text = _json.dumps(oscal_doc, indent=2) + if output: + oscal_path = str(output) + ".oscal.json" + Path(oscal_path).write_text(oscal_text) + if not is_json_mode(ctx): + console.print(f"OSCAL document written to {oscal_path}", style="dim") + else: + print(oscal_text) + if is_json_mode(ctx): if should_stream(ctx): for f in report.findings: emit_stream(f.as_dict()) else: - emit_success(ctx, report.as_dict()) + payload = report.as_dict() + if traceability: + from cloudwright.compliance import build_traceability + + payload["traceability"] = build_traceability(spec, report) + emit_success(ctx, payload) _maybe_exit(report, fail_on) return @@ -79,6 +113,21 @@ def compliance_scan( console.print(f" Remediation: {f.remediation}", style="dim") console.print() + if traceability and report.findings: + from cloudwright.compliance import build_traceability + + chain_table = Table("Component", "Resource", "Controls", "Status", title="Control Traceability") + for row in build_traceability(spec, report): + ctrls = ", ".join(f"{c['framework']} {c['control_id']}" for c in row["controls"]) or "-" + chain_table.add_row( + f"{row['label'] or row['component_id'] or '-'} ({row['service'] or '-'})", + row["resource_type"] or "-", + ctrls, + f"[red]{row['status']}[/red]", + ) + console.print(chain_table) + console.print() + crit = report.critical_count high = report.high_count console.print(f"{len(report.findings)} finding(s) ({crit} critical, {high} high)") diff --git a/packages/cli/cloudwright_cli/commands/cost.py b/packages/cli/cloudwright_cli/commands/cost.py index 6bb7999..e4432ef 100644 --- a/packages/cli/cloudwright_cli/commands/cost.py +++ b/packages/cli/cloudwright_cli/commands/cost.py @@ -1,5 +1,6 @@ from __future__ import annotations +import sys from pathlib import Path from typing import Annotated @@ -30,6 +31,18 @@ def cost( "Sets realistic defaults for request volumes, storage, node counts, and data transfer.", ), ] = None, + carbon: Annotated[ + bool, + typer.Option("--carbon", help="Include a CO2e carbon footprint estimate."), + ] = False, + focus: Annotated[ + bool, + typer.Option("--focus", help="Output cost data as FinOps FOCUS 1.0 CSV."), + ] = False, + output: Annotated[ + Path | None, + typer.Option("-o", "--output", help="Write FOCUS CSV to this file instead of stdout."), + ] = None, ) -> None: """Show cost breakdown for an architecture spec.""" if workload_profile: @@ -43,14 +56,32 @@ def cost( raise typer.Exit(1) spec = ArchSpec.from_file(spec_file) + tier = pricing_tier or "on_demand" # Compute cost estimate if not present if not spec.cost_estimate: engine = CostEngine() - spec.cost_estimate = engine.estimate(spec, workload_profile=workload_profile) + spec.cost_estimate = engine.estimate(spec, pricing_tier=tier, workload_profile=workload_profile) + + # --focus: emit FOCUS CSV and exit + if focus: + from cloudwright.focus import to_focus_csv + + csv_text = to_focus_csv(spec.cost_estimate, pricing_tier=tier) + if output: + output.write_text(csv_text, encoding="utf-8") + console.print(f"FOCUS CSV written to {output}") + else: + sys.stdout.write(csv_text) + return if is_json_mode(ctx): - emit_success(ctx, {"estimate": spec.cost_estimate.model_dump(exclude_none=True)}) + payload: dict = {"estimate": spec.cost_estimate.model_dump(exclude_none=True)} + if carbon: + from cloudwright.carbon import estimate_carbon + + payload["carbon"] = estimate_carbon(spec) + emit_success(ctx, payload) return if compare: @@ -59,31 +90,51 @@ def cost( else: _print_single_cost_table(spec) + if carbon: + from cloudwright.carbon import estimate_carbon + + _print_carbon_table(spec, estimate_carbon(spec)) + def _print_single_cost_table(spec: ArchSpec) -> None: if not spec.cost_estimate: console.print("[yellow]No cost estimate in spec. Run 'cloudwright design' to generate one.[/yellow]") return - table = Table(title=f"Cost Breakdown — {spec.name}", show_footer=True) + est = spec.cost_estimate + region_note = "" + if est.region_multiplier != 1.0: + region_note = f" (region multiplier: {est.region_multiplier:.2f}x vs us-east-1)" + + title = f"Cost Breakdown — {spec.name}{region_note}" + table = Table(title=title, show_footer=True) table.add_column("Component", style="cyan") table.add_column("Service") - table.add_column("Monthly", justify="right", footer=f"${spec.cost_estimate.monthly_total:,.2f}") + table.add_column("Monthly", justify="right", footer=f"${est.monthly_total:,.2f}") + table.add_column("Confidence", justify="center") table.add_column("Notes", style="dim") comp_map = {c.id: c for c in spec.components} - for item in spec.cost_estimate.breakdown: + for item in est.breakdown: comp = comp_map.get(item.component_id) svc_label = comp.service if comp else item.service + conf_style = "green" if item.confidence == "high" else "yellow" table.add_row( item.component_id, svc_label, f"${item.monthly:,.2f}", + f"[{conf_style}]{item.confidence}[/{conf_style}]", item.notes, ) console.print(table) + if est.pricing_confidence != "high": + console.print( + "[yellow]Pricing confidence: low[/yellow] — one or more services used formula/fallback " + "pricing, not real catalog data. Treat totals as rough estimates." + ) + def _print_multi_cloud_table(spec: ArchSpec, providers: list[str]) -> None: all_providers = [spec.provider] + [p for p in providers if p != spec.provider] @@ -129,3 +180,29 @@ def _print_multi_cloud_table(spec: ArchSpec, providers: list[str]) -> None: table.add_row("[bold]TOTAL[/bold]", *totals) console.print(table) + + +def _print_carbon_table(spec: ArchSpec, carbon: dict) -> None: + table = Table(title=f"Carbon Estimate — {spec.name} ({carbon['region']})") + table.add_column("Component", style="cyan") + table.add_column("Service") + table.add_column("Watts", justify="right") + table.add_column("kWh/mo", justify="right") + table.add_column("kgCO2e/mo", justify="right") + + for item in carbon["breakdown"]: + table.add_row( + item["component_id"], + item["service"], + f"{item['watts']:.1f}", + f"{item['kwh_per_month']:.2f}", + f"{item['kg_co2e_per_month']:.3f}", + ) + + console.print(table) + console.print( + f"[bold]Total:[/bold] {carbon['total_kg_co2e_per_month']:.3f} kgCO2e/month " + f"[dim](grid: {carbon['grid_intensity_g_per_kwh']} gCO2e/kWh, " + f"PUE: {carbon['assumptions']['pue']})[/dim]" + ) + console.print(f"[dim]{carbon['assumptions']['disclaimer']}[/dim]") diff --git a/packages/cli/cloudwright_cli/commands/drift_cmd.py b/packages/cli/cloudwright_cli/commands/drift_cmd.py index 21a26df..45ef6e1 100644 --- a/packages/cli/cloudwright_cli/commands/drift_cmd.py +++ b/packages/cli/cloudwright_cli/commands/drift_cmd.py @@ -3,7 +3,7 @@ from __future__ import annotations from pathlib import Path -from typing import Annotated +from typing import Annotated, Any import typer from rich.console import Console @@ -24,6 +24,17 @@ def drift( fmt: Annotated[ str, typer.Option("--format", "-f", help="Infrastructure format: auto, terraform, cloudformation") ] = "auto", + remediate: Annotated[ + bool, + typer.Option( + "--remediate", + help="Show cost/quality delta and terraform plan preview to close drift (read-only).", + ), + ] = False, + run_plan: Annotated[ + bool, + typer.Option("--run-plan", help="With --remediate: attempt a real terraform plan (needs credentials)."), + ] = False, ) -> None: """Compare design spec against deployed infrastructure to detect drift.""" try: @@ -39,6 +50,10 @@ def drift( with console.status("Detecting drift..."): report = detect_drift(spec_file, infra_file, infra_format=fmt) + if remediate: + _run_remediate(ctx, report, run_plan=run_plan) + return + if is_json_mode(ctx): result = { "drift_score": report.drift_score, @@ -94,3 +109,61 @@ def drift( raise except Exception as e: handle_error(ctx, e) + + +def _run_remediate(ctx: typer.Context, report: Any, *, run_plan: bool) -> None: + from cloudwright.remediation import remediate as compute_remediation + + with console.status("Computing remediation plan..."): + result = compute_remediation(report.deployed_spec, report.design_spec, run_plan=run_plan) + + if is_json_mode(ctx): + emit_success(ctx, {"remediation": result}) + return + + console.print(Rule("[bold]Cloudwright Remediation Preview[/bold]")) + console.print(Panel(result["summary"], title="Summary")) + + drift_items = result["drift"] + if drift_items: + table = Table(title=f"Changes to close drift ({len(drift_items)})") + table.add_column("Action", style="cyan") + table.add_column("Component") + table.add_column("Detail") + for item in drift_items: + action = item["change"] + cid = item.get("id", "") + detail = "" + if action == "modify": + detail = f"{item.get('field')}: {item.get('from')} -> {item.get('to')}" + elif action == "add": + detail = item.get("service", "") + elif action == "remove": + detail = item.get("service", "") + color = {"add": "green", "remove": "red", "modify": "yellow"}.get(action, "white") + table.add_row(f"[{color}]{action}[/{color}]", cid, detail) + console.print() + console.print(table) + else: + console.print("[green]No drift changes required.[/green]") + + cd = result["cost_delta"] + sign = "+" if cd["delta"] >= 0 else "" + console.print( + f"\n[bold]Cost delta:[/bold] {sign}${cd['delta']:,.2f}/mo (${cd['current']:,.2f} -> ${cd['desired']:,.2f})" + ) + + qd = result["quality_delta"] + q_sign = "+" if qd["delta"] >= 0 else "" + q_color = "green" if qd["delta"] >= 0 else "red" + console.print( + f"[bold]Quality delta:[/bold] [{q_color}]{q_sign}{qd['delta']:.1f} pts[/{q_color}] " + f"(grade {qd['current_grade']} -> {qd['desired_grade']})" + ) + + plan = result["plan"] + plan_color = "green" if plan.get("ok") else "red" + plan_label = "valid" if plan.get("validated") else "not validated" + console.print(f"[bold]Plan ([/bold]{plan['tool']}[bold]):[/bold] [{plan_color}]{plan_label}[/{plan_color}]") + for msg in plan.get("messages", []): + console.print(f" [dim]{msg}[/dim]") diff --git a/packages/cli/cloudwright_cli/commands/review_cmd.py b/packages/cli/cloudwright_cli/commands/review_cmd.py new file mode 100644 index 0000000..83060b4 --- /dev/null +++ b/packages/cli/cloudwright_cli/commands/review_cmd.py @@ -0,0 +1,78 @@ +"""Review an architecture with the deterministic critics (offline).""" + +from __future__ import annotations + +from typing import Annotated + +import typer +from rich.console import Console +from rich.panel import Panel +from rich.table import Table + +from cloudwright_cli.output import emit_success, is_json_mode +from cloudwright_cli.utils import handle_error + +console = Console() + +_SEV_COLOR = {"critical": "red", "high": "red", "medium": "yellow", "low": "cyan"} + + +def review( + ctx: typer.Context, + spec_file: Annotated[str, typer.Argument(help="Path to ArchSpec YAML/JSON file")], + compliance: Annotated[str, typer.Option("--compliance", help="Comma-separated frameworks, e.g. hipaa,soc2")] = "", + well_architected: Annotated[ + bool, typer.Option("--well-architected", help="Include Well-Architected checks") + ] = False, +) -> None: + """Review an architecture: unified scorer + linter + validator findings (no LLM, free).""" + try: + from cloudwright import ArchSpec + from cloudwright.critique import critique + + spec = ArchSpec.from_file(spec_file) + frameworks = [f.strip() for f in compliance.split(",") if f.strip()] or None + report = critique(spec, compliance=frameworks, well_architected=well_architected) + + if is_json_mode(ctx): + emit_success(ctx, {"review": report.as_dict()}) + return + + border = "green" if not report.blocking else "red" + console.print( + Panel( + f"[bold]{report.summary_line()}[/bold]", + title=f"Architecture Review: {spec.name}", + border_style=border, + ) + ) + + if not report.findings: + console.print("[green]No findings. This architecture passes every critic.[/green]") + return + + table = Table(title="Findings (severity-ranked)") + table.add_column("Severity") + table.add_column("Source", style="dim") + table.add_column("Finding") + table.add_column("Fix") + for f in report.findings: + color = _SEV_COLOR.get(f.severity, "white") + table.add_row( + f"[{color}]{f.severity}[/{color}]", + f.source, + f.message, + (f.recommendation or "")[:80], + ) + console.print(table) + + if report.blocking: + console.print( + f"\n[red]{len(report.blocking)} blocking finding(s).[/red] " + "Run `cloudwright design` (repair is on by default) or fix these before deploy." + ) + + except typer.Exit: + raise + except Exception as e: + handle_error(ctx, e) diff --git a/packages/cli/cloudwright_cli/main.py b/packages/cli/cloudwright_cli/main.py index af5dc8a..4f5984f 100644 --- a/packages/cli/cloudwright_cli/main.py +++ b/packages/cli/cloudwright_cli/main.py @@ -22,6 +22,7 @@ from cloudwright_cli.commands.plan_cmd import plan from cloudwright_cli.commands.policy import policy from cloudwright_cli.commands.refresh_cmd import refresh +from cloudwright_cli.commands.review_cmd import review from cloudwright_cli.commands.schema_cmd import schema from cloudwright_cli.commands.score_cmd import score from cloudwright_cli.commands.security_cmd import security_scan @@ -77,6 +78,7 @@ def main( app.command()(plan) app.command()(policy) app.command()(score) +app.command()(review) app.command()(analyze) app.command()(refresh) app.command()(lint) diff --git a/packages/core/cloudwright/__init__.py b/packages/core/cloudwright/__init__.py index b7bb70e..6d25d0d 100644 --- a/packages/core/cloudwright/__init__.py +++ b/packages/core/cloudwright/__init__.py @@ -17,7 +17,7 @@ ValidationResult, ) -__version__ = "1.5.0" +__version__ = "1.6.0" __all__ = [ "Alternative", diff --git a/packages/core/cloudwright/architect.py b/packages/core/cloudwright/architect.py index 0f7cfcb..1c162d8 100644 --- a/packages/core/cloudwright/architect.py +++ b/packages/core/cloudwright/architect.py @@ -2,6 +2,12 @@ from __future__ import annotations +from cloudwright.critique import ( # noqa: F401 + CritiqueFinding, + CritiqueReport, + critique, +) + # Re-export everything for backward compatibility from cloudwright.designer import ( # noqa: F401 Architect, diff --git a/packages/core/cloudwright/carbon.py b/packages/core/cloudwright/carbon.py new file mode 100644 index 0000000..02400f3 --- /dev/null +++ b/packages/core/cloudwright/carbon.py @@ -0,0 +1,267 @@ +"""Carbon footprint estimator for ArchSpec components. + +All numbers are estimates based on publicly available data. Sources: +- Grid carbon intensity: IEA Electricity Map averages (2023), gCO2eq/kWh +- Power draw per component tier: AWS/GCP sustainability reports + ACEEE estimates +- PUE (power usage effectiveness): 1.12 (hyperscale cloud avg, Google/AWS 2023 reports) + +Usage: + from cloudwright.carbon import estimate_carbon + result = estimate_carbon(spec) + # result["total_kg_co2e_per_month"] — total across all components + # result["breakdown"] — per-component list + # result["assumptions"] — named constants used +""" + +from __future__ import annotations + +from cloudwright.spec import ArchSpec + +# --------------------------------------------------------------------------- +# Grid carbon intensity by region (gCO2eq/kWh). +# Source: IEA Electricity Map regional averages, 2023. +# Matched by prefix; unknown regions fall back to a global average. +# --------------------------------------------------------------------------- +_GRID_INTENSITY: dict[str, float] = { + # AWS regions + "us-east-1": 380.0, # Virginia — Mid-Atlantic grid + "us-east-2": 480.0, # Ohio — higher coal mix + "us-west-1": 210.0, # N. California — hydro/wind heavy + "us-west-2": 130.0, # Oregon — ~70% renewable (hydro) + "ca-central-1": 30.0, # Canada — largely hydro + "eu-west-1": 290.0, # Ireland — wind + gas + "eu-west-2": 230.0, # London — offshore wind + "eu-west-3": 55.0, # Paris — nuclear dominant + "eu-central-1": 350.0, # Frankfurt — coal/gas mix + "eu-north-1": 8.0, # Stockholm — almost entirely hydro/nuclear + "ap-southeast-1": 430.0, # Singapore — gas + "ap-southeast-2": 680.0, # Sydney — coal heavy + "ap-northeast-1": 465.0, # Tokyo — post-Fukushima gas/coal + "ap-northeast-2": 415.0, # Seoul + "ap-south-1": 720.0, # Mumbai — coal dominant + "sa-east-1": 75.0, # Sao Paulo — hydro + "me-south-1": 600.0, # Bahrain — gas + "af-south-1": 840.0, # Cape Town — coal dominant + # GCP regions + "us-central1": 490.0, # Iowa + "us-east1": 380.0, + "us-west1": 130.0, + "europe-west1": 130.0, # Belgium — nuclear + "europe-west2": 230.0, + "europe-west3": 350.0, + "europe-west4": 330.0, # Netherlands + "asia-southeast1": 430.0, + "asia-northeast1": 465.0, + "asia-south1": 720.0, + "southamerica-east1": 75.0, + # Azure regions + "eastus": 380.0, + "eastus2": 380.0, + "westus": 210.0, + "westus2": 130.0, + "centralus": 490.0, + "northcentralus": 490.0, + "southcentralus": 420.0, + "canadacentral": 30.0, + "westeurope": 330.0, # Netherlands + "northeurope": 290.0, # Ireland + "uksouth": 230.0, + "ukwest": 230.0, + "germanywestcentral": 350.0, + "francecentral": 55.0, + "southeastasia": 430.0, + "eastasia": 590.0, # Hong Kong + "japaneast": 465.0, + "koreacentral": 415.0, + "centralindia": 720.0, + "brazilsouth": 75.0, + "southafricanorth": 840.0, + "uaenorth": 600.0, +} + +# Prefix fallbacks for regions not in the exact table +_GRID_INTENSITY_PREFIXES: list[tuple[str, float]] = [ + ("us-east", 380.0), + ("us-west", 170.0), + ("us-", 400.0), + ("eu-", 200.0), + ("europe-", 200.0), + ("ap-", 500.0), + ("asia-", 500.0), + ("sa-", 150.0), + ("southamerica-", 150.0), + ("me-", 600.0), + ("af-", 800.0), + ("ca-", 50.0), + ("eastus", 380.0), + ("westus", 170.0), + ("westeurope", 330.0), + ("northeurope", 290.0), + ("southeastasia", 430.0), + ("japaneast", 465.0), + ("brazilsouth", 75.0), + ("southafricanorth", 840.0), +] + +# Global average fallback (IEA 2023 global electricity mix) +_GLOBAL_AVG_INTENSITY = 436.0 # gCO2eq/kWh + +# Cloud PUE — hyperscale average across AWS, GCP, Azure (2023 sustainability reports) +_CLOUD_PUE = 1.12 + +# --------------------------------------------------------------------------- +# Power draw (Watts) per component tier. +# Rough mid-point from ACEEE cloud lifecycle assessments and AWS sustainability +# whitepapers. "tier" here maps to the spec's component tier field. +# --------------------------------------------------------------------------- +_TIER_WATTS: dict[int, float] = { + 0: 5.0, # edge / CDN node — low always-on overhead + 1: 15.0, # load balancer / API gateway — modest + 2: 80.0, # compute (single vCPU-scale instance) + 3: 120.0, # database / cache (memory-intensive, SSD I/O) + 4: 40.0, # storage / data — storage servers, lower compute + 5: 200.0, # analytics / ML (GPU/high-mem workloads) +} +_DEFAULT_TIER_WATTS = 60.0 # fallback for unknown tiers + +# Service-level power overrides that supersede tier-based defaults +_SERVICE_WATTS: dict[str, float] = { + # Serverless — billed per invocation, very low idle + "lambda": 5.0, + "cloud_functions": 5.0, + "azure_functions": 5.0, + # Containers / orchestration + "eks": 300.0, + "gke": 300.0, + "aks": 300.0, + "ecs": 150.0, + "fargate": 80.0, + "cloud_run": 20.0, + "container_apps": 20.0, + # Managed databases + "rds": 100.0, + "aurora": 120.0, + "cloud_sql": 100.0, + "azure_sql": 100.0, + "dynamodb": 40.0, + "cosmos_db": 40.0, + "firestore": 20.0, + # Analytics / ML + "redshift": 400.0, + "bigquery": 200.0, + "synapse": 400.0, + "sagemaker": 250.0, + "vertex_ai": 250.0, + "azure_ml": 250.0, + # Databricks + "databricks_cluster": 500.0, + "databricks_sql_warehouse": 300.0, + "databricks_job": 200.0, + "databricks_pipeline": 200.0, + "databricks_model_serving": 100.0, + # Virtual / meta (no real hardware attributed) + "users": 0.0, + "internet": 0.0, + "external": 0.0, + "client": 0.0, + "browser": 0.0, + "mobile": 0.0, + "vpc": 0.0, + "vnet": 0.0, + "iam": 0.0, +} + +# Hours per month +_HOURS_PER_MONTH = 730.0 + + +def _grid_intensity(region: str) -> float: + """Return gCO2eq/kWh for a region. Falls back to global average.""" + r = (region or "").lower().strip() + if r in _GRID_INTENSITY: + return _GRID_INTENSITY[r] + for prefix, intensity in _GRID_INTENSITY_PREFIXES: + if r.startswith(prefix): + return intensity + return _GLOBAL_AVG_INTENSITY + + +def _component_watts(service: str, tier: int, config: dict) -> float: + """Estimate power draw in Watts for a single component.""" + base = _SERVICE_WATTS.get(service, _TIER_WATTS.get(tier, _DEFAULT_TIER_WATTS)) + # Scale with node/instance count when explicit + count = config.get("count", config.get("node_count", config.get("num_nodes", 1))) + try: + count = int(count) + except (TypeError, ValueError): + count = 1 + return base * max(count, 1) + + +def estimate_carbon(spec: ArchSpec) -> dict: + """Return per-component and total CO2e estimates for an ArchSpec. + + All figures are estimates. Assumptions: + - Power draw per component: see _SERVICE_WATTS / _TIER_WATTS tables + - Grid carbon intensity: IEA regional averages 2023 (gCO2eq/kWh) + - Cloud PUE: 1.12 (hyperscale average, AWS/GCP/Azure 2023 sustainability reports) + - 730 hours/month assumed for always-on components + + Returns a dict with: + total_kg_co2e_per_month: float + region: str + grid_intensity_g_per_kwh: float + breakdown: list[dict] — one entry per component + assumptions: dict — named constants used in this calculation + """ + region = spec.region or "us-east-1" + intensity = _grid_intensity(region) + breakdown = [] + total_kg = 0.0 + + for comp in spec.components: + config = comp.config or {} + watts = _component_watts(comp.service, comp.tier, config) + if watts <= 0: + breakdown.append( + { + "component_id": comp.id, + "service": comp.service, + "watts": 0.0, + "kwh_per_month": 0.0, + "kg_co2e_per_month": 0.0, + "note": "virtual/meta component — no hardware attributed", + } + ) + continue + + kwh = (watts * _HOURS_PER_MONTH * _CLOUD_PUE) / 1000.0 + kg_co2e = (kwh * intensity) / 1000.0 # gCO2e -> kgCO2e + total_kg += kg_co2e + + breakdown.append( + { + "component_id": comp.id, + "service": comp.service, + "watts": round(watts, 1), + "kwh_per_month": round(kwh, 2), + "kg_co2e_per_month": round(kg_co2e, 3), + } + ) + + return { + "total_kg_co2e_per_month": round(total_kg, 3), + "region": region, + "grid_intensity_g_per_kwh": intensity, + "breakdown": breakdown, + "assumptions": { + "pue": _CLOUD_PUE, + "hours_per_month": _HOURS_PER_MONTH, + "grid_intensity_source": "IEA Electricity Map regional averages 2023", + "power_draw_source": "ACEEE cloud lifecycle assessments + AWS/GCP sustainability reports", + "disclaimer": ( + "These are rough estimates. Actual emissions depend on server utilisation, " + "renewable energy certificates, and provider-specific PPA mix." + ), + }, + } diff --git a/packages/core/cloudwright/catalog/formula.py b/packages/core/cloudwright/catalog/formula.py index 32cbcf1..8511bcd 100644 --- a/packages/core/cloudwright/catalog/formula.py +++ b/packages/core/cloudwright/catalog/formula.py @@ -272,7 +272,11 @@ def default_managed_price(service: str, config: dict) -> float: """Fallback pricing when catalog doesn't have specific data.""" base = _FALLBACK_PRICES.get(service, 10.0) if service not in _FALLBACK_PRICES: - log.debug("No fallback price for service '%s', using default $10.00", service) + # $10 placeholder is fabricated — warn so callers can mark confidence=low + log.warning( + "No pricing data for service '%s' — using $10.00 placeholder. This number is not from a real price list.", + service, + ) else: log.debug("Using fallback price for '%s': $%.2f", service, base) # Multiplier from various count-like config keys diff --git a/packages/core/cloudwright/compliance.py b/packages/core/cloudwright/compliance.py index 20cdf43..fac9755 100644 --- a/packages/core/cloudwright/compliance.py +++ b/packages/core/cloudwright/compliance.py @@ -135,6 +135,44 @@ def as_dict(self) -> dict[str, Any]: } +def _resource_type_map() -> dict[str, str]: + """service -> Terraform resource type, merged across provider renderers.""" + res: dict[str, str] = {} + from cloudwright.exporter.terraform import aws, azure, databricks, gcp + + for mod in (aws, gcp, azure, databricks): + res.update(getattr(mod, "RESOURCES", {}) or {}) + return res + + +def build_traceability(spec: "ArchSpec", report: "ComplianceReport") -> list[dict[str, Any]]: + """Control traceability chain: design intent -> component -> IaC resource -> control -> status. + + Auditors (and OSCAL/EU AI Act technical documentation) need to follow a control + from the requirement down to the exact resource that does or does not satisfy it. + Each entry links a finding's component to the Terraform resource it renders to and + the framework control IDs it touches. + """ + comps = {c.id: c for c in spec.components} + res_map = _resource_type_map() + chains: list[dict[str, Any]] = [] + for f in report.findings: + comp = comps.get(f.component_id) if f.component_id else None + chains.append( + { + "component_id": f.component_id, + "service": comp.service if comp else None, + "label": comp.label if comp else None, + "resource_type": res_map.get(comp.service) if comp else None, + "rule": f.rule, + "severity": f.severity, + "controls": [c.as_dict() for c in f.controls], + "status": "violated", + } + ) + return chains + + class ControlCatalog: """Loads and resolves the rule/Checkov -> framework-control mapping.""" diff --git a/packages/core/cloudwright/cost.py b/packages/core/cloudwright/cost.py index 8060d62..1b9bb6d 100644 --- a/packages/core/cloudwright/cost.py +++ b/packages/core/cloudwright/cost.py @@ -41,6 +41,106 @@ } _DEFAULT_EGRESS_RATE = 0.09 +# --------------------------------------------------------------------------- +# Regional price multipliers relative to us-east-1 = 1.00 baseline. +# Source: public AWS/GCP/Azure pricing pages as of 2025. +# Matched by prefix so "eu-west-2" hits "eu-west" if not listed explicitly. +# --------------------------------------------------------------------------- +_REGION_MULTIPLIERS: dict[str, float] = { + # AWS + "us-east-1": 1.00, + "us-east-2": 1.00, + "us-west-1": 1.10, + "us-west-2": 1.02, + "ca-central-1": 1.05, + "eu-west-1": 1.08, + "eu-west-2": 1.10, + "eu-west-3": 1.12, + "eu-central-1": 1.10, + "eu-north-1": 1.05, + "ap-southeast-1": 1.15, + "ap-southeast-2": 1.16, + "ap-northeast-1": 1.18, + "ap-northeast-2": 1.13, + "ap-south-1": 1.10, + "sa-east-1": 1.25, + "me-south-1": 1.20, + "af-south-1": 1.20, + # GCP (region codes) + "us-central1": 1.00, + "us-east1": 1.00, + "us-west1": 1.02, + "europe-west1": 1.08, + "europe-west2": 1.10, + "europe-west3": 1.12, + "europe-west4": 1.08, + "asia-southeast1": 1.15, + "asia-northeast1": 1.18, + "asia-south1": 1.10, + "southamerica-east1": 1.25, + # Azure (region codes) + "eastus": 1.00, + "eastus2": 1.00, + "westus": 1.02, + "westus2": 1.02, + "westus3": 1.05, + "centralus": 1.00, + "northcentralus": 1.00, + "southcentralus": 1.00, + "canadacentral": 1.05, + "westeurope": 1.08, + "northeurope": 1.08, + "uksouth": 1.10, + "ukwest": 1.10, + "germanywestcentral": 1.12, + "francecentral": 1.12, + "southeastasia": 1.15, + "eastasia": 1.15, + "japaneast": 1.18, + "koreacentral": 1.13, + "centralindia": 1.10, + "brazilsouth": 1.25, + "southafricanorth": 1.20, + "uaenorth": 1.20, +} + +# Prefix-based fallbacks when an exact region code isn't in the table above +_REGION_PREFIX_MULTIPLIERS: list[tuple[str, float]] = [ + ("us-east", 1.00), + ("us-west", 1.05), + ("us-", 1.02), + ("eu-", 1.10), + ("europe-", 1.10), + ("ap-", 1.15), + ("asia-", 1.15), + ("sa-", 1.25), + ("southamerica-", 1.25), + ("me-", 1.20), + ("af-", 1.20), + ("ca-", 1.05), + ("eastus", 1.00), + ("westus", 1.02), + ("westeurope", 1.08), + ("northeurope", 1.08), + ("southeastasia", 1.15), + ("japaneast", 1.18), + ("brazilsouth", 1.25), +] + + +def _region_multiplier(region: str) -> float: + """Return a price multiplier for the given region, relative to us-east-1 = 1.00.""" + if not region: + return 1.00 + r = region.lower().strip() + if r in _REGION_MULTIPLIERS: + return _REGION_MULTIPLIERS[r] + for prefix, mult in _REGION_PREFIX_MULTIPLIERS: + if r.startswith(prefix): + return mult + return 1.00 # unknown region — assume baseline + + # --------------------------------------------------------------------------- # Workload profiles — realistic sizing defaults per environment tier # --------------------------------------------------------------------------- @@ -231,10 +331,14 @@ def estimate( node counts, and data transfer that match production workloads. """ breakdown: list[ComponentCost] = [] + region = spec.region or "us-east-1" + rmult = _region_multiplier(region) for comp in spec.components: effective = _apply_profile(comp, workload_profile) if workload_profile else comp - monthly = self._price_component(effective, spec.provider, spec.region, pricing_tier) + monthly, confidence, is_estimated = self._price_component_with_meta( + effective, spec.provider, region, pricing_tier, rmult + ) hourly = round(monthly / 730, 4) if monthly > 0 else None notes = self._cost_notes(effective) breakdown.append( @@ -244,6 +348,8 @@ def estimate( monthly=monthly, hourly=hourly, notes=notes, + confidence=confidence, + estimated=is_estimated, ) ) @@ -251,12 +357,19 @@ def estimate( data_transfer = self._estimate_data_transfer(spec, workload_profile=workload_profile) total = round(component_total + data_transfer, 2) + # Aggregate confidence: "high" only when every billed line item used catalog data + billed = [c for c in breakdown if c.monthly > 0] + pricing_confidence = "high" if billed and all(c.confidence == "high" for c in billed) else "low" + return CostEstimate( monthly_total=total, breakdown=breakdown, data_transfer_monthly=data_transfer, currency="USD", as_of=date.today().isoformat(), + pricing_confidence=pricing_confidence, + region=region, + region_multiplier=rmult, ) def price( @@ -366,16 +479,42 @@ def _map_instance_config(self, config: dict, from_provider: str, to_provider: st def _price_component( self, comp: Component, default_provider: str, region: str, pricing_tier: str = "on_demand" ) -> float: - """Get monthly cost for a single component using 3-tier resolution + multipliers.""" + """Get monthly cost for a single component. Kept for backward compatibility.""" + monthly, _conf, _est = self._price_component_with_meta( + comp, default_provider, region, pricing_tier, _region_multiplier(region) + ) + return monthly + + def _price_component_with_meta( + self, + comp: Component, + default_provider: str, + region: str, + pricing_tier: str = "on_demand", + region_mult: float = 1.0, + ) -> tuple[float, str, bool]: + """Return (monthly_cost, confidence, is_estimated) for a single component. + + confidence: "high" when the price came from a real catalog row, "low" otherwise. + is_estimated: True when the price is a formula/fallback, not catalog data. + region_mult: pre-computed regional multiplier to apply to formula/fallback tiers. + """ provider = comp.provider or default_provider config = comp.config or {} base: float | None = None from_catalog = False + confidence = "low" + is_estimated = False # Tier 1: catalog DB (has instance-level pricing and pricing_tier support) base = self.catalog.get_service_pricing(comp.service, provider, config, pricing_tier=pricing_tier) if base is not None: from_catalog = True + confidence = "high" + # The catalog stores us-east-1 baseline prices and does not vary by + # region, so the regional multiplier is applied here too (not only on + # the formula/fallback tiers below). + base *= region_mult if base is None: # Tier 2: registry formula dispatch @@ -387,14 +526,16 @@ def _price_component( merged_config.update(config) result = formula_fn(merged_config) if result is not None and result > 0: - multiplier = _PRICING_MULTIPLIERS.get(pricing_tier, 1.0) - base = result * multiplier + tier_mult = _PRICING_MULTIPLIERS.get(pricing_tier, 1.0) + base = result * tier_mult * region_mult + is_estimated = True if base is None: - # Tier 3: static fallback table + # Tier 3: static fallback — mark as low-confidence estimated base = default_managed_price(comp.service, config) - multiplier = _PRICING_MULTIPLIERS.get(pricing_tier, 1.0) - base = base * multiplier + tier_mult = _PRICING_MULTIPLIERS.get(pricing_tier, 1.0) + base = base * tier_mult * region_mult + is_estimated = True # Post-resolution multipliers (only for non-catalog tiers — catalog handles these internally) if not from_catalog and config.get("multi_az"): @@ -407,7 +548,7 @@ def _price_component( if not has_explicit_count: base *= 3 - return round(base, 2) + return round(base, 2), confidence, is_estimated def _estimate_data_transfer(self, spec: ArchSpec, workload_profile: str | None = None) -> float: """Estimate monthly data transfer (egress) costs from connections.""" diff --git a/packages/core/cloudwright/critique.py b/packages/core/cloudwright/critique.py new file mode 100644 index 0000000..f20106b --- /dev/null +++ b/packages/core/cloudwright/critique.py @@ -0,0 +1,125 @@ +"""Unified architecture critique — the deterministic critic layer. + +Aggregates the three critics that already exist in the tree (scorer, linter, +validator) into a single severity-ranked report. This runs entirely offline (no +LLM) and is the engine behind two things: + +- ``cloudwright review`` — a standalone, free, deterministic architecture review. +- The generate -> critique -> repair loop in :meth:`Architect.design`, where the + blocking findings are fed back to the model so it self-corrects before the spec + is ever returned. The critics were always here; v1.6 wires them into generation. +""" + +from __future__ import annotations + +from dataclasses import asdict, dataclass, field +from typing import TYPE_CHECKING, Any + +from cloudwright.linter import lint +from cloudwright.scorer import Scorer +from cloudwright.validator import Validator + +if TYPE_CHECKING: + from cloudwright.spec import ArchSpec + +_SEVERITY_ORDER = {"critical": 0, "high": 1, "medium": 2, "low": 3, "info": 4} +_LINT_SEVERITY = {"error": "high", "warning": "medium", "info": "low"} +_BLOCKING = ("critical", "high") + + +def _norm_severity(value: str) -> str: + v = (value or "").strip().lower() + return v if v in _SEVERITY_ORDER else "medium" + + +@dataclass +class CritiqueFinding: + severity: str # critical | high | medium | low + source: str # scorer | linter | validator + code: str + message: str + recommendation: str = "" + component: str | None = None + + def as_dict(self) -> dict[str, Any]: + return asdict(self) + + +@dataclass +class CritiqueReport: + score: float + grade: str + findings: list[CritiqueFinding] = field(default_factory=list) + + @property + def blocking(self) -> list[CritiqueFinding]: + return [f for f in self.findings if f.severity in _BLOCKING] + + def summary_line(self) -> str: + b = len(self.blocking) + return f"score {self.score:.0f}/100 (grade {self.grade}), {len(self.findings)} findings, {b} blocking" + + def as_dict(self) -> dict[str, Any]: + return { + "score": round(self.score, 1), + "grade": self.grade, + "findings": [f.as_dict() for f in self.findings], + "blocking_count": len(self.blocking), + "summary": self.summary_line(), + } + + +def critique( + spec: "ArchSpec", + *, + compliance: list[str] | None = None, + well_architected: bool = False, +) -> CritiqueReport: + """Run scorer + linter + validator and merge into one severity-ranked report.""" + result = Scorer().score(spec) + findings: list[CritiqueFinding] = [] + + for w in lint(spec): + findings.append( + CritiqueFinding( + severity=_LINT_SEVERITY.get(w.severity, "medium"), + source="linter", + code=w.rule, + message=w.message, + recommendation=w.recommendation, + component=w.component, + ) + ) + + frameworks = compliance + if frameworks is None and spec.constraints: + frameworks = spec.constraints.compliance + for vr in Validator().validate(spec, compliance=frameworks or [], well_architected=well_architected): + for ch in vr.checks: + if not ch.passed: + findings.append( + CritiqueFinding( + severity=_norm_severity(ch.severity), + source="validator", + code=f"{vr.framework}:{ch.name}", + message=ch.detail or ch.name, + recommendation=ch.recommendation, + ) + ) + + for d in result.dimensions: + if d.score < 60: + sev = "medium" if d.score < 40 else "low" + for rec in d.recommendations[:2]: + findings.append( + CritiqueFinding( + severity=sev, + source="scorer", + code=f"score:{d.name.lower().replace(' ', '_')}", + message=f"{d.name} score {d.score:.0f}/100", + recommendation=rec, + ) + ) + + findings.sort(key=lambda f: _SEVERITY_ORDER.get(f.severity, 5)) + return CritiqueReport(score=result.overall, grade=result.grade, findings=findings) diff --git a/packages/core/cloudwright/designer.py b/packages/core/cloudwright/designer.py index 42fe89b..ec732aa 100644 --- a/packages/core/cloudwright/designer.py +++ b/packages/core/cloudwright/designer.py @@ -28,9 +28,25 @@ _STOPWORDS = {"a", "an", "the", "on", "in", "for", "with", "and", "or", "to", "my", "our", "that", "this", "using"} +_REPAIR_SYSTEM = ( + "You are revising an existing cloud architecture spec to fix specific issues. " + "You receive the current ArchSpec JSON and a list of blocking findings from an " + "automated review. Return ONLY a corrected ArchSpec JSON object that resolves " + "those findings while preserving the user's intent and existing component ids " + "where possible. Add missing safety components (monitoring, WAF, backups, auth, " + "load balancing) when a finding calls for one. Output only the JSON object, " + "starting with {." +) + class Architect: - def __init__(self, llm: BaseLLM | None = None, two_stage: bool = True): + def __init__( + self, + llm: BaseLLM | None = None, + two_stage: bool = True, + repair: bool = True, + max_repair_iters: int = 1, + ): self.llm = llm or get_llm() # Side-channel for the most recent usage dict produced by design()/modify(). # The web routers read this to surface model/tokens/cost in API responses @@ -42,6 +58,12 @@ def __init__(self, llm: BaseLLM | None = None, two_stage: bool = True): # single-shot JSON-schema constraints. Flip to False to use the legacy # single-shot path (kept around for benchmarking and emergency fallback). self.two_stage = two_stage + # v1.6 generate -> critique -> repair: after a spec is produced, the + # deterministic critics (scorer/linter/validator) review it and, when + # blocking (high/critical) findings remain, the model is asked once to + # fix them. Bounded by max_repair_iters; fails safe to the original spec. + self.repair = repair + self.max_repair_iters = max_repair_iters def design(self, description: str, constraints: Constraints | None = None) -> ArchSpec: self.last_usage = {} @@ -73,8 +95,71 @@ def design(self, description: str, constraints: Constraints | None = None) -> Ar if template_result is not None: _, confidence = template_result spec = spec.model_copy(update={"metadata": {**spec.metadata, "template_confidence": confidence}}) + if self.repair: + spec = self._critique_repair(spec, description, constraints) return spec + def _critique_repair(self, spec: ArchSpec, description: str, constraints: Constraints | None) -> ArchSpec: + """Run the deterministic critics and, on blocking findings, repair once.""" + from cloudwright.critique import critique + + try: + report = critique(spec) + except Exception as exc: # critics must never break design() + log.debug("critique skipped: %s", exc) + return spec + + meta = { + "score": round(report.score, 1), + "grade": report.grade, + "findings_before": len(report.findings), + "blocking_before": len(report.blocking), + "repair_iterations": 0, + } + iters = 0 + while report.blocking and iters < self.max_repair_iters: + repaired = self._repair_once(spec, description, constraints, report) + iters += 1 + if repaired is None: + break + try: + new_report = critique(repaired) + except Exception: + break + if len(new_report.blocking) <= len(report.blocking): + spec, report = repaired, new_report + else: + break # repair regressed the spec — keep the prior one + meta["repair_iterations"] = iters + meta["findings_after"] = len(report.findings) + meta["blocking_after"] = len(report.blocking) + return spec.model_copy(update={"metadata": {**spec.metadata, "critique": meta}}) + + def _repair_once( + self, spec: ArchSpec, description: str, constraints: Constraints | None, report + ) -> ArchSpec | None: + """One LLM repair pass: feed the blocking findings back and re-parse.""" + findings_text = "\n".join( + f"- [{f.severity}] {f.message}" + (f" — fix: {f.recommendation}" if f.recommendation else "") + for f in report.blocking[:12] + ) + user = ( + f"Original request:\n{description}\n\n" + f"Current ArchSpec JSON:\n{spec.to_json()}\n\n" + f"Blocking findings to resolve:\n{findings_text}\n\n" + "Return the corrected ArchSpec JSON now." + ) + try: + start = time.perf_counter() + text, usage = self.llm.generate_fast([{"role": "user", "content": user}], _REPAIR_SYSTEM, max_tokens=10000) + data = _extract_json(text) + repaired = _parse_arch_spec(data, constraints) + except Exception as exc: # a failed repair is non-fatal + log.warning("repair pass failed: %s", exc) + return None + self.last_usage = {**self.last_usage, "repair_usage": self._enrich_usage(usage, start)} + return repaired + def _design_two_stage(self, description: str, constraints: Constraints | None) -> ArchSpec: """Two-stage: free-text reasoning -> strict JSON projection.""" # Stage 1: free-text architectural reasoning (Sonnet, no JSON schema). diff --git a/packages/core/cloudwright/exporter/__init__.py b/packages/core/cloudwright/exporter/__init__.py index e6c9ce2..8485e73 100644 --- a/packages/core/cloudwright/exporter/__init__.py +++ b/packages/core/cloudwright/exporter/__init__.py @@ -12,6 +12,7 @@ FORMATS = ( "terraform", + "opentofu", "pulumi-ts", "pulumi-python", "cloudformation", @@ -52,7 +53,13 @@ def _get_all_formats() -> dict[str, object]: return formats -_DANGEROUS_PATTERNS = re.compile(r"[;|&`]|\$\(|\$\{|%\{") +# Reject shell metacharacters AND HCL-structural characters. Numeric exporter +# fields are interpolated without quotes, and string fields without _hcl_quote +# would be too — so a value containing a newline or a brace could close the +# current block and inject a new resource / provisioner. Config values for IaC +# are simple scalars (instance types, engines, counts), so none of these +# characters appear legitimately. +_DANGEROUS_PATTERNS = re.compile(r"[;|&`{}\n\r]|\$\(|\$\{|%\{") def validate_export_config(config: dict, path: str = "") -> None: @@ -94,7 +101,8 @@ def export_spec(spec: ArchSpec, fmt: str, output: str | None = None, output_dir: for comp in spec.components: validate_export_config(comp.config, path=f"component[{comp.id}].config") - if fmt == "terraform": + if fmt in ("terraform", "opentofu", "tofu"): + # OpenTofu consumes the same generated HCL; the alias just signals intent. from cloudwright.exporter.terraform import render content = render(spec) diff --git a/packages/core/cloudwright/exporter/terraform/aws.py b/packages/core/cloudwright/exporter/terraform/aws.py index 7d08b8a..b86546b 100644 --- a/packages/core/cloudwright/exporter/terraform/aws.py +++ b/packages/core/cloudwright/exporter/terraform/aws.py @@ -19,7 +19,7 @@ from typing import TYPE_CHECKING -from cloudwright.exporter.terraform.common import _hcl_quote +from cloudwright.exporter.terraform.common import _hcl_num, _hcl_quote if TYPE_CHECKING: from cloudwright.spec import ArchSpec, Component @@ -88,7 +88,7 @@ def render_resource(c: "Component", spec: "ArchSpec") -> str: f" identifier = {_hcl_quote(c.id)}", f" engine = {_hcl_quote(engine)}", f" instance_class = {_hcl_quote(instance_class)}", - f" allocated_storage = {cfg.get('allocated_storage', 20)}", + f" allocated_storage = {_hcl_num(cfg.get('allocated_storage', 20), 20)}", " username = var.db_username", " password = var.db_password", # Safe-by-default hardening for FedRAMP / HIPAA / PCI baselines. @@ -217,7 +217,7 @@ def render_resource(c: "Component", spec: "ArchSpec") -> str: f" cluster_id = {_hcl_quote(_bucket_name(c))}", f" engine = {_hcl_quote(engine)}", f" node_type = {_hcl_quote(node_type)}", - f" num_cache_nodes = {cfg.get('num_cache_nodes', 1)}", + f" num_cache_nodes = {_hcl_num(cfg.get('num_cache_nodes', 1), 1)}", f" parameter_group_name = {_hcl_quote(f'default.{engine}7')}", " tags = {", f" Name = {_hcl_quote(c.label)}", @@ -276,7 +276,11 @@ def render_resource(c: "Component", spec: "ArchSpec") -> str: f'resource "aws_wafv2_web_acl" "{c.id}" {{', f" name = {_hcl_quote(c.id)}", ' scope = "REGIONAL"', - " default_action { allow {} }", + # Terraform rejects a single-line block that contains a nested block, + # so default_action must be emitted multi-line. + " default_action {", + " allow {}", + " }", " visibility_config {", " cloudwatch_metrics_enabled = true", f" metric_name = {_hcl_quote(c.id)}", @@ -321,7 +325,7 @@ def render_resource(c: "Component", spec: "ArchSpec") -> str: f'resource "aws_ecs_service" "{c.id}_service" {{', f" name = {_hcl_quote(c.id + '-service')}", f" cluster = aws_ecs_cluster.{c.id}.id", - f" desired_count = {cfg.get('desired_count', 1)}", + f" desired_count = {_hcl_num(cfg.get('desired_count', 1), 1)}", f" launch_type = {_hcl_quote(launch_type)}", " task_definition = var.task_definition_arn", ] @@ -393,7 +397,7 @@ def render_resource(c: "Component", spec: "ArchSpec") -> str: lines += [ f'resource "aws_kinesis_stream" "{c.id}" {{', f" name = {_hcl_quote(_bucket_name(c))}", - f" shard_count = {cfg.get('shard_count', 2)}", + f" shard_count = {_hcl_num(cfg.get('shard_count', 2), 2)}", # Enforce server-side encryption with the AWS-managed KMS key. ' encryption_type = "KMS"', ' kms_key_id = "alias/aws/kinesis"', @@ -435,7 +439,7 @@ def render_resource(c: "Component", spec: "ArchSpec") -> str: lines += [ f'resource "aws_ebs_volume" "{c.id}" {{', " availability_zone = data.aws_availability_zones.available.names[0]", - f" size = {cfg.get('size', 100)}", + f" size = {_hcl_num(cfg.get('size', 100), 100)}", ' type = "gp3"', # Encryption at rest enforced by default. " encrypted = true", diff --git a/packages/core/cloudwright/exporter/terraform/azure.py b/packages/core/cloudwright/exporter/terraform/azure.py index ad4c426..798a09e 100644 --- a/packages/core/cloudwright/exporter/terraform/azure.py +++ b/packages/core/cloudwright/exporter/terraform/azure.py @@ -9,7 +9,7 @@ from typing import TYPE_CHECKING -from cloudwright.exporter.terraform.common import _hcl_quote +from cloudwright.exporter.terraform.common import _hcl_num, _hcl_quote if TYPE_CHECKING: from cloudwright.spec import ArchSpec, Component @@ -118,7 +118,7 @@ def render_resource(c: "Component", spec: "ArchSpec") -> str: f" dns_prefix = {_hcl_quote(safe_id)}", " default_node_pool {", ' name = "default"', - f" node_count = {cfg.get('node_count', 1)}", + f" node_count = {_hcl_num(cfg.get('node_count', 1), 1)}", f" vm_size = {_hcl_quote(cfg.get('vm_size', 'Standard_D2_v2'))}", " }", " identity {", @@ -191,7 +191,7 @@ def render_resource(c: "Component", spec: "ArchSpec") -> str: f" name = {_hcl_quote(safe_id)}", f" location = {_LOCATION}", f" resource_group_name = {_RG}", - f" capacity = {cfg.get('capacity', 1)}", + f" capacity = {_hcl_num(cfg.get('capacity', 1), 1)}", ' family = "C"', f" sku_name = {_hcl_quote(cfg.get('sku_name', 'Basic'))}", " tags = {", diff --git a/packages/core/cloudwright/exporter/terraform/common.py b/packages/core/cloudwright/exporter/terraform/common.py index eb30381..d74a7a6 100644 --- a/packages/core/cloudwright/exporter/terraform/common.py +++ b/packages/core/cloudwright/exporter/terraform/common.py @@ -48,6 +48,27 @@ def hcl_string(value: str) -> str: return _hcl_quote(value) +def _hcl_num(value: object, default: float, *, allow_float: bool = False) -> str: + """Return a safe numeric HCL literal for ``value``. + + Numeric config fields are interpolated into HCL without surrounding quotes, + so a string value (e.g. from LLM drift or a hand-edited spec) would be + emitted verbatim and could break out into arbitrary HCL — including a + ``provisioner "local-exec"`` that runs on ``terraform apply``. Coercing to + a real number here makes the numeric paths injection-proof regardless of the + input type; uncoercible values fall back to ``default``. + """ + try: + num = float(value) # type: ignore[arg-type] + if not allow_float: + num = int(num) + else: + num = int(num) if num.is_integer() else num + except (TypeError, ValueError): + num = int(default) if (not allow_float and float(default).is_integer()) else default + return str(num) + + def provider_block(provider: str, spec: "ArchSpec") -> str: if provider == "aws": return f'provider "aws" {{\n region = {_hcl_quote(spec.region)}\n}}' diff --git a/packages/core/cloudwright/exporter/terraform/databricks.py b/packages/core/cloudwright/exporter/terraform/databricks.py index 9b882e4..a6529e7 100644 --- a/packages/core/cloudwright/exporter/terraform/databricks.py +++ b/packages/core/cloudwright/exporter/terraform/databricks.py @@ -9,7 +9,7 @@ from typing import TYPE_CHECKING -from cloudwright.exporter.terraform.common import _hcl_quote +from cloudwright.exporter.terraform.common import _hcl_num, _hcl_quote if TYPE_CHECKING: from cloudwright.spec import ArchSpec, Component @@ -40,7 +40,7 @@ def render_resource(c: "Component", spec: "ArchSpec") -> str: f'resource "databricks_sql_endpoint" "{c.id}" {{', f" name = {_hcl_quote(c.label)}", f" cluster_size = {_hcl_quote(cfg.get('cluster_size', 'Small'))}", - f" auto_stop_mins = {cfg.get('auto_stop_mins', 30)}", + f" auto_stop_mins = {_hcl_num(cfg.get('auto_stop_mins', 30), 30)}", "}", ] @@ -50,8 +50,8 @@ def render_resource(c: "Component", spec: "ArchSpec") -> str: f" cluster_name = {_hcl_quote(c.label)}", f" spark_version = {_hcl_quote(cfg.get('spark_version', '13.3.x-scala2.12'))}", f" node_type_id = {_hcl_quote(cfg.get('node_type_id', 'i3.xlarge'))}", - f" autotermination_minutes = {cfg.get('autotermination_minutes', 60)}", - f" num_workers = {cfg.get('num_workers', 2)}", + f" autotermination_minutes = {_hcl_num(cfg.get('autotermination_minutes', 60), 60)}", + f" num_workers = {_hcl_num(cfg.get('num_workers', 2), 2)}", "}", ] diff --git a/packages/core/cloudwright/exporter/terraform/gcp.py b/packages/core/cloudwright/exporter/terraform/gcp.py index e5baf23..a848184 100644 --- a/packages/core/cloudwright/exporter/terraform/gcp.py +++ b/packages/core/cloudwright/exporter/terraform/gcp.py @@ -9,7 +9,7 @@ from typing import TYPE_CHECKING -from cloudwright.exporter.terraform.common import _hcl_quote +from cloudwright.exporter.terraform.common import _hcl_num, _hcl_quote if TYPE_CHECKING: from cloudwright.spec import ArchSpec, Component @@ -90,7 +90,7 @@ def render_resource(c: "Component", spec: "ArchSpec") -> str: f'resource "google_container_cluster" "{c.id}" {{', f" name = {_hcl_quote(safe_id)}", f" location = {_hcl_quote(cfg.get('location', 'us-central1'))}", - f" initial_node_count = {cfg.get('initial_node_count', 1)}", + f" initial_node_count = {_hcl_num(cfg.get('initial_node_count', 1), 1)}", " node_config {", f" machine_type = {_hcl_quote(cfg.get('machine_type', 'e2-medium'))}", " }", @@ -113,7 +113,7 @@ def render_resource(c: "Component", spec: "ArchSpec") -> str: " }", " }", " service_config {", - f" max_instance_count = {cfg.get('max_instances', 10)}", + f" max_instance_count = {_hcl_num(cfg.get('max_instances', 10), 10)}", " }", "}", ] @@ -146,7 +146,7 @@ def render_resource(c: "Component", spec: "ArchSpec") -> str: f'resource "google_redis_instance" "{c.id}" {{', f" name = {_hcl_quote(safe_id)}", ' tier = "BASIC"', - f" memory_size_gb = {cfg.get('memory_size_gb', 1)}", + f" memory_size_gb = {_hcl_num(cfg.get('memory_size_gb', 1), 1)}", f" region = {_hcl_quote(cfg.get('region', 'us-central1'))}", "}", ] diff --git a/packages/core/cloudwright/focus.py b/packages/core/cloudwright/focus.py new file mode 100644 index 0000000..cb43823 --- /dev/null +++ b/packages/core/cloudwright/focus.py @@ -0,0 +1,213 @@ +"""FinOps FOCUS 1.0 CSV exporter for CostEstimate line items. + +FOCUS (FinOps Open Cost and Usage Specification) defines a standard schema for +cloud billing data. Spec: https://focus.finops.org/ + +Column mapping: + BilledCost — actual monthly charge for this line item + EffectiveCost — same as BilledCost (no amortisation applied here) + ServiceName — cloud service name (e.g. "ec2", "rds") + ServiceCategory — FOCUS category inferred from service name + ResourceId — component_id from the ArchSpec + RegionId — region from the estimate + ChargePeriodStart — first day of current month (ISO 8601) + ChargePeriodEnd — last day of current month (ISO 8601) + BillingCurrency — always "USD" + PricingUnit — "Month" + PricingQuantity — 1.0 + ChargeType — "Usage" + PricingCategory — "Standard" (on_demand) or "Committed" (reserved) + PricingConfidence — per-line confidence from the cost engine ("high"/"low") +""" + +from __future__ import annotations + +import csv +import io +from calendar import monthrange +from datetime import date + +from cloudwright.spec import CostEstimate + +# FOCUS 1.0 required + recommended columns we emit +_FOCUS_COLUMNS = [ + "BilledCost", + "EffectiveCost", + "ServiceName", + "ServiceCategory", + "ResourceId", + "RegionId", + "ChargePeriodStart", + "ChargePeriodEnd", + "BillingCurrency", + "PricingUnit", + "PricingQuantity", + "ChargeType", + "PricingCategory", + "PricingConfidence", +] + +# Rough FOCUS ServiceCategory mapping by service keyword +_SERVICE_CATEGORY: dict[str, str] = { + "ec2": "Compute", + "compute_engine": "Compute", + "virtual_machines": "Compute", + "ecs": "Compute", + "eks": "Compute", + "gke": "Compute", + "aks": "Compute", + "fargate": "Compute", + "cloud_run": "Compute", + "container_apps": "Compute", + "app_engine": "Compute", + "app_service": "Compute", + "lambda": "Compute", + "cloud_functions": "Compute", + "azure_functions": "Compute", + "rds": "Databases", + "aurora": "Databases", + "cloud_sql": "Databases", + "azure_sql": "Databases", + "dynamodb": "Databases", + "cosmos_db": "Databases", + "firestore": "Databases", + "spanner": "Databases", + "elasticache": "Databases", + "memorystore": "Databases", + "azure_cache": "Databases", + "s3": "Storage", + "cloud_storage": "Storage", + "blob_storage": "Storage", + "ebs": "Storage", + "cloudfront": "Networking", + "cloud_cdn": "Networking", + "azure_cdn": "Networking", + "alb": "Networking", + "nlb": "Networking", + "app_gateway": "Networking", + "azure_lb": "Networking", + "cloud_load_balancing": "Networking", + "api_gateway": "Networking", + "api_management": "Networking", + "nat_gateway": "Networking", + "cloud_nat": "Networking", + "route53": "Networking", + "cloud_dns": "Networking", + "azure_dns": "Networking", + "sqs": "Integration", + "pub_sub": "Integration", + "service_bus": "Integration", + "sns": "Integration", + "event_hubs": "Integration", + "kinesis": "Integration", + "eventbridge": "Integration", + "event_grid": "Integration", + "redshift": "Analytics", + "bigquery": "Analytics", + "synapse": "Analytics", + "dataflow": "Analytics", + "sagemaker": "AI and Machine Learning", + "vertex_ai": "AI and Machine Learning", + "azure_ml": "AI and Machine Learning", + "databricks_cluster": "Analytics", + "databricks_sql_warehouse": "Analytics", + "databricks_job": "Analytics", + "databricks_pipeline": "Analytics", + "databricks_model_serving": "AI and Machine Learning", + "kms": "Security", + "cloud_kms": "Security", + "key_vault": "Security", + "secrets_manager": "Security", + "secret_manager": "Security", + "waf": "Security", + "cloud_armor": "Security", + "azure_waf": "Security", + "guardduty": "Security", + "security_hub": "Security", + "cloudwatch": "Management and Governance", + "cloud_logging": "Management and Governance", + "cloud_monitoring": "Management and Governance", + "azure_monitor": "Management and Governance", + "cloudtrail": "Management and Governance", + "config": "Management and Governance", +} + + +def _service_category(service: str) -> str: + return _SERVICE_CATEGORY.get(service, "Other") + + +def _charge_period() -> tuple[str, str]: + """Return (ChargePeriodStart, ChargePeriodEnd) for the current month.""" + today = date.today() + start = today.replace(day=1) + last_day = monthrange(today.year, today.month)[1] + end = today.replace(day=last_day) + return start.isoformat(), end.isoformat() + + +def to_focus_csv(estimate: CostEstimate, pricing_tier: str = "on_demand") -> str: + """Serialise a CostEstimate to a FOCUS 1.0 compliant CSV string. + + Each line item in estimate.breakdown becomes one row. The data-transfer + sub-total is added as a synthetic "DataTransfer" service row when non-zero. + + Args: + estimate: A CostEstimate produced by CostEngine.estimate(). + pricing_tier: The pricing tier used to produce the estimate. Controls + PricingCategory ("Standard" for on_demand, "Committed" for reserved). + + Returns: + A UTF-8 CSV string with FOCUS 1.0 column headers. + """ + period_start, period_end = _charge_period() + region = estimate.region or "us-east-1" + currency = estimate.currency or "USD" + pricing_category = "Standard" if pricing_tier == "on_demand" else "Committed" + + buf = io.StringIO() + writer = csv.DictWriter(buf, fieldnames=_FOCUS_COLUMNS, lineterminator="\n") + writer.writeheader() + + for item in estimate.breakdown: + writer.writerow( + { + "BilledCost": round(item.monthly, 4), + "EffectiveCost": round(item.monthly, 4), + "ServiceName": item.service, + "ServiceCategory": _service_category(item.service), + "ResourceId": item.component_id, + "RegionId": region, + "ChargePeriodStart": period_start, + "ChargePeriodEnd": period_end, + "BillingCurrency": currency, + "PricingUnit": "Month", + "PricingQuantity": 1.0, + "ChargeType": "Usage", + "PricingCategory": pricing_category, + "PricingConfidence": item.confidence, + } + ) + + # Add data-transfer line if non-zero + if estimate.data_transfer_monthly > 0: + writer.writerow( + { + "BilledCost": round(estimate.data_transfer_monthly, 4), + "EffectiveCost": round(estimate.data_transfer_monthly, 4), + "ServiceName": "DataTransfer", + "ServiceCategory": "Networking", + "ResourceId": "data-transfer", + "RegionId": region, + "ChargePeriodStart": period_start, + "ChargePeriodEnd": period_end, + "BillingCurrency": currency, + "PricingUnit": "Month", + "PricingQuantity": 1.0, + "ChargeType": "Usage", + "PricingCategory": pricing_category, + "PricingConfidence": "low", # always estimated from connection metadata + } + ) + + return buf.getvalue() diff --git a/packages/core/cloudwright/oscal.py b/packages/core/cloudwright/oscal.py new file mode 100644 index 0000000..ef7fbf5 --- /dev/null +++ b/packages/core/cloudwright/oscal.py @@ -0,0 +1,199 @@ +"""OSCAL 1.1.2 component-definition export for Cloudwright compliance results. + +Converts a ComplianceReport + ArchSpec into a machine-readable OSCAL +component-definition document. FedRAMP's 20x/OSCAL direction makes this +the interoperability surface competitors don't have. + +Control IDs from compliance_controls.yaml are already NIST-shaped for +FedRAMP/NIST-800-53 (e.g. "SC-28", "AC-3"). For HIPAA/SOC2/PCI-DSS/GDPR/ISO27001 +the control IDs are kept verbatim and annotated with a source-framework prop +so validators know they're not NIST identifiers. +""" + +from __future__ import annotations + +import uuid +from datetime import datetime, timezone +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from cloudwright.compliance import ComplianceReport + from cloudwright.spec import ArchSpec + +_OSCAL_VERSION = "1.1.2" +_CW_VERSION = "1.6.0" + +# Frameworks whose control IDs are already NIST SP 800-53 style. +_NIST_SHAPED = {"FedRAMP", "NIST-800-53"} + + +def _det_uuid(spec_name: str, frameworks: list[str]) -> str: + """Deterministic uuid5 from spec name + sorted framework list. + + Stable across calls with the same inputs — required for reproducible tests + and idempotent CI artifact generation. + """ + seed = f"{spec_name}|{','.join(sorted(frameworks))}" + return str(uuid.uuid5(uuid.NAMESPACE_DNS, seed)) + + +def _component_uuid(spec_name: str, component_id: str) -> str: + seed = f"{spec_name}::{component_id}" + return str(uuid.uuid5(uuid.NAMESPACE_DNS, seed)) + + +def _req_uuid(spec_name: str, component_id: str, control_id: str, framework: str) -> str: + seed = f"{spec_name}::{component_id}::{framework}::{control_id}" + return str(uuid.uuid5(uuid.NAMESPACE_DNS, seed)) + + +def _normalize_control_id(control_id: str, framework: str) -> str: + """Return a lowercase NIST-style control ID when the framework uses NIST IDs. + + Non-NIST IDs (HIPAA CFR citations, SOC2 criteria, etc.) are kept verbatim + because forcibly lowercasing them would make them unrecognizable. + """ + if framework in _NIST_SHAPED: + return control_id.lower() + return control_id + + +def to_oscal(spec: ArchSpec, scan_result: ComplianceReport, frameworks: list[str]) -> dict[str, Any]: + """Return a valid OSCAL 1.1.2 component-definition document as a dict. + + Args: + spec: The architecture specification being assessed. + scan_result: The ComplianceReport produced by ComplianceScanner.scan(). + frameworks: The list of canonical framework names used during the scan + (e.g. ["HIPAA", "FedRAMP"]). + + Returns: + A dict that serialises to valid OSCAL 1.1.2 component-definition JSON. + """ + doc_uuid = _det_uuid(spec.name, frameworks) + now = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + + # Build a fast lookup: (component_id, framework, control_id) -> worst severity + # A control is "not-satisfied" when any finding references it. + failing: dict[tuple[str | None, str, str], str] = {} + for finding in scan_result.findings: + for ctrl in finding.controls: + key = (finding.component_id, ctrl.framework, ctrl.control_id) + prev = failing.get(key) + if prev is None: + failing[key] = finding.severity + else: + _rank = {"critical": 0, "high": 1, "medium": 2, "low": 3} + if _rank.get(finding.severity, 4) < _rank.get(prev, 4): + failing[key] = finding.severity + + components = [] + for comp in spec.components: + ctrl_impls = _control_implementations_for(spec.name, comp, frameworks, scan_result, failing) + components.append( + { + "uuid": _component_uuid(spec.name, comp.id), + "type": "service", + "title": comp.label or comp.id, + "description": comp.description or f"{comp.service} ({comp.provider})", + "props": [ + {"name": "provider", "value": comp.provider}, + {"name": "service", "value": comp.service}, + ], + "control-implementations": ctrl_impls, + } + ) + + return { + "component-definition": { + "uuid": doc_uuid, + "metadata": { + "title": f"Cloudwright Compliance — {spec.name}", + "last-modified": now, + "version": _CW_VERSION, + "oscal-version": _OSCAL_VERSION, + "props": [ + {"name": "generator", "value": "cloudwright-ai"}, + {"name": "frameworks", "value": ", ".join(frameworks)}, + ], + }, + "components": components, + } + } + + +def _control_implementations_for( + spec_name: str, + comp: Any, + frameworks: list[str], + scan_result: ComplianceReport, + failing: dict[tuple[str | None, str, str], str], +) -> list[dict]: + """Build the control-implementations array for one architecture component.""" + # Gather all (framework, control_id) pairs relevant to this component: + # - controls from findings scoped to this component + # - controls from findings with no component scope (architecture-wide) + seen: dict[tuple[str, str], str] = {} # (framework, ctrl) -> worst severity + + for finding in scan_result.findings: + if finding.component_id not in (comp.id, None): + continue + for ctrl in finding.controls: + if ctrl.framework not in frameworks: + continue + key = (ctrl.framework, ctrl.control_id) + sev_key = (finding.component_id, ctrl.framework, ctrl.control_id) + sev = failing.get(sev_key, finding.severity) + prev = seen.get(key) + if prev is None: + seen[key] = sev + else: + _rank = {"critical": 0, "high": 1, "medium": 2, "low": 3} + if _rank.get(sev, 4) < _rank.get(prev, 4): + seen[key] = sev + + if not seen: + return [] + + # Group by framework + by_fw: dict[str, list[tuple[str, str]]] = {} + for (fw, ctrl), sev in seen.items(): + by_fw.setdefault(fw, []).append((ctrl, sev)) + + impls = [] + for fw in frameworks: + reqs = by_fw.get(fw) + if not reqs: + continue + + implemented_reqs = [] + for ctrl_id, sev in reqs: + normalized = _normalize_control_id(ctrl_id, fw) + props = [ + {"name": "framework", "value": fw}, + {"name": "severity", "value": sev}, + ] + if fw not in _NIST_SHAPED: + # Non-NIST control IDs need source annotation for validators + props.append({"name": "control-id-source", "value": fw}) + + implemented_reqs.append( + { + "uuid": _req_uuid(spec_name, comp.id, ctrl_id, fw), + "control-id": normalized, + "description": f"Cloudwright finding for control {ctrl_id} ({fw})", + "props": props, + "implementation-status": {"state": "not-satisfied"}, + } + ) + + impls.append( + { + "uuid": _req_uuid(spec_name, comp.id, fw, "impl"), + "source": f"https://cloudwright.ai/frameworks/{fw.lower()}", + "description": f"{fw} control implementation for {comp.id}", + "implemented-requirements": implemented_reqs, + } + ) + + return impls diff --git a/packages/core/cloudwright/parsing.py b/packages/core/cloudwright/parsing.py index c8e6902..3611265 100644 --- a/packages/core/cloudwright/parsing.py +++ b/packages/core/cloudwright/parsing.py @@ -42,12 +42,17 @@ def _extract_json(text: str) -> dict: arr_start = text.find("[") candidates = [i for i in (obj_start, arr_start) if i != -1] if not candidates: + # The full response is the single most useful artifact for reproducing a + # parse failure, so log it in full (recoverable via --debug) before + # raising a short message. + log.debug("LLM response with no JSON object (full):\n%s", text) raise ValueError(f"No JSON object found in LLM response: {text[:300]}") start = min(candidates) try: parsed, _end = _JSON_DECODER.raw_decode(text[start:]) except json.JSONDecodeError as exc: + log.debug("LLM response with invalid JSON (full):\n%s", text) raise ValueError(f"Unterminated or invalid JSON in LLM response: {text[:300]}") from exc return parsed @@ -132,6 +137,12 @@ def _profile_requires_ha(spec: ArchSpec, constraints: Constraints | None) -> boo profile = "" if spec.metadata and isinstance(spec.metadata, dict): profile = str(spec.metadata.get("workload_profile", "")).lower() + # Compliance frameworks override the workload profile — a HIPAA/PCI/FedRAMP + # workload gets HA even when someone labelled it a sandbox. This check MUST + # come before the _NON_HA_PROFILES early-return or the invariant is silently + # defeated for sandbox/dev/test profiles. + if constraints and any(f.lower() in _HA_REQUIRING_FRAMEWORKS for f in constraints.compliance): + return True if profile in _NON_HA_PROFILES: return False if profile in _HA_PROFILES: @@ -139,9 +150,6 @@ def _profile_requires_ha(spec: ArchSpec, constraints: Constraints | None) -> boo if constraints is None: # No signal either way — default to production posture (back-compat). return True - # Compliance frameworks always pull in HA. - if any(f.lower() in _HA_REQUIRING_FRAMEWORKS for f in constraints.compliance): - return True if constraints.availability and constraints.availability >= 0.995: return True if constraints.throughput_rps and constraints.throughput_rps >= 1000: @@ -156,13 +164,14 @@ def _profile_requires_encryption(spec: ArchSpec, constraints: Constraints | None profile = "" if spec.metadata and isinstance(spec.metadata, dict): profile = str(spec.metadata.get("workload_profile", "")).lower() + # Compliance frameworks override the workload profile — encryption-at-rest is + # non-negotiable under HIPAA/PCI/SOC2/FedRAMP/GDPR/ISO even if the spec is + # labelled a sandbox. This MUST precede the _NON_HA_PROFILES early-return. + if constraints and any(f.lower() in _ENCRYPTION_REQUIRING_FRAMEWORKS for f in constraints.compliance): + return True if profile in _NON_HA_PROFILES: # Sandboxes get whatever the LLM picked — no forced encryption override. return False - if constraints is None: - return True # back-compat default - if any(f.lower() in _ENCRYPTION_REQUIRING_FRAMEWORKS for f in constraints.compliance): - return True return True # default true — better safe than encrypted-after-the-breach diff --git a/packages/core/cloudwright/patterns.py b/packages/core/cloudwright/patterns.py new file mode 100644 index 0000000..dc43f0c --- /dev/null +++ b/packages/core/cloudwright/patterns.py @@ -0,0 +1,166 @@ +"""Compliance-gated component patterns. + +Maps templates and approved modules to the compliance frameworks their +component sets actually cover. Tags are conservative: a framework is only +listed when the pattern's components address that framework's core technical +controls (encryption, HA, audit logging, access control, etc.). + +Supported frameworks: hipaa, soc2, pci-dss, fedramp, iso27001, gdpr. +""" + +from __future__ import annotations + +from typing import Any + +# --------------------------------------------------------------------------- +# Pattern registry +# +# Each entry captures the pattern source (template key or module id), a +# display name, the frameworks it satisfies, and a per-framework justification. +# +# Rationale for framework inclusion: +# +# HIPAA — needs encryption-at-rest + in-transit, access controls, audit logs, +# and HA (uptime standard). Patterns with multi-AZ/HA + encryption on +# all data tiers qualify. +# SOC 2 — availability, confidentiality, and security. Multi-AZ, HTTPS, +# encryption, and access controls broadly satisfy trust service criteria. +# PCI-DSS — narrow: requires WAF, network segmentation (alb/gateway), encryption, +# and TLS on every hop. Only patterns with an explicit WAF or gateway +# with WAF config qualify. +# FedRAMP — requires FIPS-level encryption, HA across AZs, audit trails. +# Patterns with multi-AZ encrypted managed services qualify at a +# Moderate baseline; Databricks patterns do not (no FedRAMP ATOs). +# ISO 27001 — broad information security management. HTTPS, encryption, backup, +# access controls, and HA are the technical pillars. +# GDPR — data protection by design: encryption-at-rest, encryption-in-transit, +# backup, and access controls. Does not require WAF. Most encrypted +# multi-AZ patterns qualify. +# --------------------------------------------------------------------------- + +_PATTERNS: list[dict[str, Any]] = [ + { + "name": "3-Tier Web Application (AWS)", + "source": "template:3-tier-web-aws", + "frameworks": { + "soc2": "Multi-AZ RDS + HTTPS CDN/ALB + encryption satisfies availability and confidentiality criteria.", + "hipaa": "Multi-AZ RDS with encryption + backup covers PHI durability and access control requirements.", + "fedramp": "Multi-AZ managed RDS with encryption meets FedRAMP Moderate availability and data-protection controls.", + "iso27001": "Encrypted RDS + HTTPS + backup + security groups address A.12 (operations security) and A.14 (secure development) controls.", + "gdpr": "Encryption-at-rest and in-transit + backup aligns with GDPR Article 32 technical safeguards.", + }, + }, + { + "name": "Web Application (Azure)", + "source": "template:web-app-azure", + "frameworks": { + "soc2": "App Gateway WAF + HTTPS CDN + Multi-AZ SQL + encryption covers availability and security trust criteria.", + "hipaa": "Encrypted multi-AZ Azure SQL + WAF-backed gateway provides PHI protection and audit controls.", + "pci-dss": "App Gateway with WAF enabled (waf: True) + HTTPS on every hop + encrypted SQL meets PCI-DSS requirements for cardholder-data environments.", + "fedramp": "Multi-AZ Azure SQL with encryption meets FedRAMP Moderate data protection; WAF adds perimeter control.", + "iso27001": "WAF + encryption + backup + HTTPS satisfies A.13 (communications security) and A.12 controls.", + "gdpr": "Encrypted SQL + WAF + backup meets GDPR Article 32 technical safeguards.", + }, + }, + { + "name": "Microservices Platform (AWS)", + "source": "template:microservices-aws", + "frameworks": { + "soc2": "ECS Fargate + encrypted RDS multi-AZ + encrypted ElastiCache + SQS encryption covers availability and confidentiality.", + "hipaa": "Encryption on all data tiers (RDS, ElastiCache, SQS) + multi-AZ RDS meets HIPAA technical safeguard requirements.", + "fedramp": "Multi-AZ RDS with encryption + encrypted messaging + managed container platform meets FedRAMP Moderate baseline.", + "iso27001": "Full encryption stack + multi-AZ + backup satisfies A.10 (cryptography) and A.17 (business continuity) controls.", + "gdpr": "Encryption-at-rest and in-transit on all data tiers + backup meets GDPR Article 32 obligations.", + }, + }, + { + "name": "Kubernetes Platform (AWS EKS)", + "source": "template:kubernetes-aws", + "frameworks": { + "soc2": "EKS + encrypted RDS multi-AZ + encrypted ECR + HTTPS ingress covers availability and confidentiality criteria.", + "hipaa": "Multi-AZ encrypted RDS + encrypted container images (ECR scan-on-push) + HTTPS meets HIPAA safeguards.", + "fedramp": "Multi-AZ encrypted managed database + private container registry meets FedRAMP Moderate baseline.", + "iso27001": "Encrypted RDS + ECR image scanning + multi-AZ + HTTPS aligns with ISO 27001 A.12 and A.14 controls.", + "gdpr": "Encrypted storage + HTTPS + backup meets GDPR Article 32 technical safeguards.", + }, + }, + { + "name": "Data Warehouse (AWS)", + "source": "template:data-warehouse-aws", + "frameworks": { + "soc2": "Encrypted Kinesis + encrypted S3 + encrypted Redshift multi-AZ + Athena covers availability and confidentiality.", + "hipaa": "Full encryption stack (Kinesis, S3, Redshift) + multi-AZ + backup meets HIPAA data-at-rest and transit requirements.", + "fedramp": "Encrypted managed streaming + S3 + multi-AZ Redshift meets FedRAMP Moderate data-protection controls.", + "iso27001": "Encryption across all tiers + backup satisfies A.10 and A.17 controls.", + "gdpr": "Encrypted storage and streaming + backup meets GDPR Article 32 for large-scale data processing.", + }, + }, + { + "name": "AWS Three-Tier Web (Module)", + "source": "module:aws-three-tier-web", + "frameworks": { + "soc2": "Multi-AZ RDS + HTTPS CDN/ALB covers availability and confidentiality trust criteria.", + "iso27001": "HTTPS + multi-AZ managed database aligns with A.12 and A.14 controls.", + "gdpr": "HTTPS in-transit + multi-AZ persistence meets GDPR Article 32 baseline.", + }, + }, + { + "name": "AWS Serverless API (Module)", + "source": "module:aws-serverless-api", + "frameworks": { + "soc2": "DynamoDB encryption + backup + HTTPS API Gateway meets confidentiality and availability criteria.", + "gdpr": "DynamoDB encryption + backup provides GDPR Article 32 data protection for serverless APIs.", + }, + }, + { + "name": "Azure Three-Tier Web (Module)", + "source": "module:azure-three-tier-web", + "frameworks": { + "soc2": "App Gateway WAF (WAF_v2 SKU) + HTTPS CDN + Azure SQL covers security and availability trust criteria.", + "hipaa": "WAF-backed ingress + managed SQL with backup provides HIPAA technical safeguard controls.", + "pci-dss": "App Gateway WAF_v2 SKU provides WAF on every inbound connection; HTTPS on all hops meets PCI-DSS network-security requirements.", + "iso27001": "WAF + HTTPS + managed SQL satisfies A.13 and A.12 controls.", + "gdpr": "HTTPS + WAF + managed SQL with backup meets GDPR Article 32 technical safeguards.", + }, + }, +] + +# Build a flat lookup: framework -> sorted list of matching patterns +_BY_FRAMEWORK: dict[str, list[dict[str, Any]]] = {} +for _p in _PATTERNS: + for _fw in _p["frameworks"]: + _BY_FRAMEWORK.setdefault(_fw, []).append(_p) + + +def suggest_compliant_patterns(framework: str) -> list[dict[str, Any]]: + """Return patterns pre-blessed for the given compliance framework. + + Patterns are returned in descending order of how many frameworks they + satisfy (broader coverage first). Only patterns that honestly cover the + framework's core technical controls are included. + + Args: + framework: Lowercase framework name — hipaa, soc2, pci-dss, + fedramp, iso27001, or gdpr. + + Returns: + List of dicts with keys: name, source, frameworks (list), why (str). + Empty list when the framework is unknown or no patterns qualify. + """ + fw = framework.lower().strip() + matches = _BY_FRAMEWORK.get(fw, []) + + results: list[dict[str, Any]] = [] + for pattern in matches: + results.append( + { + "name": pattern["name"], + "source": pattern["source"], + "frameworks": sorted(pattern["frameworks"].keys()), + "why": pattern["frameworks"][fw], + } + ) + + # Rank by breadth of compliance coverage (most frameworks first) + results.sort(key=lambda r: len(r["frameworks"]), reverse=True) + return results diff --git a/packages/core/cloudwright/planner.py b/packages/core/cloudwright/planner.py index e452e55..003363f 100644 --- a/packages/core/cloudwright/planner.py +++ b/packages/core/cloudwright/planner.py @@ -26,6 +26,43 @@ _PLAN_RE = re.compile(r"Plan:\s+(\d+) to add,\s+(\d+) to change,\s+(\d+) to destroy") _NO_CHANGES_RE = re.compile(r"No changes\.|0 to add, 0 to change, 0 to destroy") +# LLM/app secrets that terraform and pulumi never need. Kept out of the +# subprocess environment so they cannot surface in provider error output. +_APP_SECRET_KEYS = frozenset({"ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN", "OPENAI_API_KEY", "CLOUDWRIGHT_API_KEY"}) +# Only credential-shaped keys are merged from a project .env into the subprocess. +_CLOUD_CRED_PREFIXES = ( + "AWS_", + "GOOGLE_", + "GCLOUD_", + "CLOUDSDK_", + "AZURE_", + "ARM_", + "DATABRICKS_", + "TF_VAR_", + "TF_", + "PULUMI_", +) +_SECRET_KEY_RE = re.compile(r"KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL", re.I) + + +def _secret_values() -> set[str]: + """Values of every secret-shaped env var, for redacting subprocess output.""" + vals: set[str] = set() + for env in (dict(os.environ), _subprocess_env()): + for key, val in env.items(): + if val and len(val) >= 8 and _SECRET_KEY_RE.search(key): + vals.add(val) + return vals + + +def _scrub(text: str) -> str: + """Redact any secret-shaped env value that leaked into subprocess output.""" + if not text: + return text + for val in _secret_values(): + text = text.replace(val, "***REDACTED***") + return text + @dataclass class PlanResult: @@ -53,7 +90,7 @@ def as_dict(self) -> dict[str, Any]: def _tail(text: str, n: int = 40) -> str: lines = (text or "").strip().splitlines() - return "\n".join(lines[-n:]) + return _scrub("\n".join(lines[-n:])) def _run(cmd: list[str], cwd: str, timeout: int, env: dict | None = None) -> subprocess.CompletedProcess: @@ -69,8 +106,13 @@ def _run(cmd: list[str], cwd: str, timeout: int, env: dict | None = None) -> sub def _subprocess_env() -> dict[str, str]: - """Process env plus any cloud credentials defined in a project .env.""" - env = dict(os.environ) + """Process env (minus LLM/app secrets) plus cloud creds from a project .env. + + terraform/pulumi never need the LLM API key, so app secrets are stripped from + the subprocess environment to keep them out of any provider error output, and + only credential-shaped keys are merged from a project ``.env``. + """ + env = {k: v for k, v in os.environ.items() if k not in _APP_SECRET_KEYS} for base in (Path.cwd(), Path(__file__).resolve().parents[3]): dotenv = base / ".env" if dotenv.is_file(): @@ -80,30 +122,51 @@ def _subprocess_env() -> dict[str, str]: continue key, _, val = line.partition("=") key = key.strip() - if key and key not in env: + if not key or key in env or key in _APP_SECRET_KEYS: + continue + if key.startswith(_CLOUD_CRED_PREFIXES): env[key] = val.strip().strip('"').strip("'") break return env +def _terraform_binary() -> tuple[str | None, str]: + """Resolve the IaC binary, preferring OpenTofu. + + OpenTofu (`tofu`) is a drop-in for the same generated HCL, so honour it when + present (or when CLOUDWRIGHT_TF_BINARY points at one). Falls back to + `terraform`. Returns (path_or_None, tool_label). + """ + override = os.environ.get("CLOUDWRIGHT_TF_BINARY", "").strip() + if override: + path = shutil.which(override) or (override if Path(override).is_file() else None) + return path, ("opentofu" if "tofu" in override else "terraform") + tofu = shutil.which("tofu") + if tofu: + return tofu, "opentofu" + return shutil.which("terraform"), "terraform" + + def plan_terraform( spec: ArchSpec, *, run_plan: bool = True, timeout: int = 180, ) -> PlanResult: - """`terraform init -backend=false` + `validate` (+ optional `plan`).""" + """`terraform`/`tofu` init -backend=false + validate (+ optional plan).""" from cloudwright.exporter import export_spec - tf = shutil.which("terraform") + tf, tool = _terraform_binary() if not tf: return PlanResult( - tool="terraform", + tool=tool, available=False, validated=False, plan_ran=False, ok=False, - messages=["terraform binary not found on PATH. Install Terraform to enable plan/preview."], + messages=[ + "Neither tofu nor terraform found on PATH. Install OpenTofu or Terraform to enable plan/preview." + ], ) env = _subprocess_env() @@ -112,7 +175,7 @@ def plan_terraform( export_spec(spec, "terraform", output_dir=tmp) except Exception as exc: return PlanResult( - tool="terraform", + tool=tool, available=True, validated=False, plan_ran=False, @@ -135,7 +198,7 @@ def plan_terraform( else: init_msg = "terraform init failed (provider download / network?)." return PlanResult( - tool="terraform", + tool=tool, available=True, validated=False, plan_ran=False, @@ -151,7 +214,7 @@ def plan_terraform( else: messages.append("terraform validate: configuration is INVALID.") return PlanResult( - tool="terraform", + tool=tool, available=True, validated=False, plan_ran=False, @@ -162,7 +225,7 @@ def plan_terraform( if not run_plan: return PlanResult( - tool="terraform", + tool=tool, available=True, validated=True, plan_ran=False, @@ -193,7 +256,7 @@ def plan_terraform( summary = None messages.append("terraform plan: completed.") return PlanResult( - tool="terraform", + tool=tool, available=True, validated=True, plan_ran=True, @@ -221,7 +284,7 @@ def plan_terraform( reason = "terraform plan did not complete (see output)." messages.append(reason) return PlanResult( - tool="terraform", + tool=tool, available=True, validated=True, plan_ran=False, diff --git a/packages/core/cloudwright/remediation.py b/packages/core/cloudwright/remediation.py new file mode 100644 index 0000000..4cf486d --- /dev/null +++ b/packages/core/cloudwright/remediation.py @@ -0,0 +1,118 @@ +"""Agentic drift -> remediation — closes the gap between current and desired spec. + +Read-only: computes what *would* happen if the desired spec replaced the current +one. Never applies changes. Degrades gracefully when terraform/tofu is absent. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from cloudwright.spec import ArchSpec + + +def remediate( + current_spec: "ArchSpec", + desired_spec: "ArchSpec", + *, + run_plan: bool = False, + skip_plan: bool = False, +) -> dict[str, Any]: + """Compute the full remediation picture between current and desired spec. + + Args: + current_spec: The spec reflecting what is currently deployed. + desired_spec: The target spec to converge toward. + run_plan: When True, attempt a real terraform plan (needs credentials). + When False (default), only run init + validate — no credentials needed. + + Returns: + A dict with keys: + - drift: list of change dicts from the diff + - cost_delta: {"current": float, "desired": float, "delta": float, "currency": str} + - quality_delta: {"current": float, "desired": float, "delta": float, + "current_grade": str, "desired_grade": str} + - plan: PlanResult.as_dict() + - summary: human-readable summary string + """ + from cloudwright.cost import CostEngine + from cloudwright.critique import critique + from cloudwright.differ import Differ + from cloudwright.planner import plan_terraform + + # 1. Compute drift/diff between current and desired + differ = Differ() + diff = differ.diff(current_spec, desired_spec) + + drift_items: list[dict[str, Any]] = [] + for comp in diff.added: + drift_items.append({"change": "add", "id": comp.id, "service": comp.service}) + for comp in diff.removed: + drift_items.append({"change": "remove", "id": comp.id, "service": comp.service}) + for ch in diff.changed: + drift_items.append( + { + "change": "modify", + "id": ch.component_id, + "field": ch.field, + "from": ch.old_value, + "to": ch.new_value, + } + ) + + # 2. Cost delta + engine = CostEngine() + current_estimate = engine.estimate(current_spec) + desired_estimate = engine.estimate(desired_spec) + delta = round(desired_estimate.monthly_total - current_estimate.monthly_total, 2) + cost_delta: dict[str, Any] = { + "current": current_estimate.monthly_total, + "desired": desired_estimate.monthly_total, + "delta": delta, + "currency": "USD", + } + + # 3. Quality delta via critique (deterministic, no LLM) + current_report = critique(current_spec) + desired_report = critique(desired_spec) + quality_delta: dict[str, Any] = { + "current": round(current_report.score, 1), + "desired": round(desired_report.score, 1), + "delta": round(desired_report.score - current_report.score, 1), + "current_grade": current_report.grade, + "desired_grade": desired_report.grade, + } + + # 4. Terraform/tofu plan preview of the desired spec (read-only). Skippable + # so callers (and tests) can get drift+cost+quality without invoking the + # IaC toolchain. + if skip_plan: + plan_dict: dict[str, Any] = {"skipped": True, "validated": False} + plan_validated = False + else: + plan_result = plan_terraform(desired_spec, run_plan=run_plan) + plan_dict = plan_result.as_dict() + plan_validated = plan_result.validated + + # 5. Build summary + n_drift = len(drift_items) + cost_sign = "+" if delta >= 0 else "" + quality_sign = "+" if quality_delta["delta"] >= 0 else "" + plan_ok = "skipped" if skip_plan else ("valid" if plan_validated else "not validated") + summary = ( + f"{n_drift} change(s) to close drift. " + f"Cost: {cost_sign}${delta:,.2f}/mo " + f"(${current_estimate.monthly_total:,.2f} -> ${desired_estimate.monthly_total:,.2f}). " + f"Quality: {quality_sign}{quality_delta['delta']:.1f} pts " + f"({current_report.grade} -> {desired_report.grade}). " + f"Plan: {plan_ok}." + ) + + return { + "drift": drift_items, + "cost_delta": cost_delta, + "quality_delta": quality_delta, + "plan": plan_dict, + "summary": summary, + } diff --git a/packages/core/cloudwright/spec.py b/packages/core/cloudwright/spec.py index 44c65ff..21a05a5 100644 --- a/packages/core/cloudwright/spec.py +++ b/packages/core/cloudwright/spec.py @@ -93,6 +93,8 @@ class ComponentCost(BaseModel): monthly: float hourly: float | None = None notes: str = "" + confidence: str = "high" # "high" = real catalog row; "low" = formula/fallback + estimated: bool = False # True when price comes from a fallback, not catalog data class CostEstimate(BaseModel): @@ -101,6 +103,9 @@ class CostEstimate(BaseModel): data_transfer_monthly: float = 0.0 currency: str = "USD" as_of: str = Field(default_factory=lambda: date.today().isoformat()) + pricing_confidence: str = "high" # "high" only when every line item is high + region: str = "us-east-1" + region_multiplier: float = 1.0 # multiplier applied relative to us-east-1 baseline class Alternative(BaseModel): diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml index b0e3550..58af9a1 100644 --- a/packages/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -29,10 +29,10 @@ dependencies = [ ] [project.optional-dependencies] -cli = ["cloudwright-ai-cli==1.5.0"] -web = ["cloudwright-ai-cli==1.5.0", "cloudwright-ai-web==1.5.0"] -mcp = ["cloudwright-ai-mcp==1.5.0"] -all = ["cloudwright-ai-cli==1.5.0", "cloudwright-ai-web==1.5.0", "cloudwright-ai-mcp==1.5.0", "databricks-sdk>=0.38.0"] +cli = ["cloudwright-ai-cli==1.6.0"] +web = ["cloudwright-ai-cli==1.6.0", "cloudwright-ai-web==1.6.0"] +mcp = ["cloudwright-ai-mcp==1.6.0"] +all = ["cloudwright-ai-cli==1.6.0", "cloudwright-ai-web==1.6.0", "cloudwright-ai-mcp==1.6.0", "databricks-sdk>=0.38.0"] pdf = ["weasyprint", "markdown2"] databricks = ["databricks-sdk>=0.38.0"] live-import = [ diff --git a/packages/core/tests/test_cost_v160.py b/packages/core/tests/test_cost_v160.py new file mode 100644 index 0000000..58b5066 --- /dev/null +++ b/packages/core/tests/test_cost_v160.py @@ -0,0 +1,457 @@ +"""Tests for v1.6.0 cost engine improvements: +- Regional price multipliers +- Pricing confidence per line item +- Carbon footprint estimator +- FOCUS CSV export +""" + +from __future__ import annotations + +import csv +import io + +import pytest +from cloudwright.spec import ArchSpec, Component, Connection + + +def _simple_spec(region: str = "us-east-1", provider: str = "aws") -> ArchSpec: + return ArchSpec( + name="Test", + provider=provider, + region=region, + components=[ + Component( + id="web", + service="ec2", + provider=provider, + label="Web", + tier=2, + config={"instance_type": "t3.medium"}, + ), + Component( + id="db", + service="rds", + provider=provider, + label="DB", + tier=3, + config={"instance_class": "db.t3.medium", "storage_gb": 50}, + ), + ], + connections=[], + ) + + +def _fallback_spec() -> ArchSpec: + """Spec with a service that has no catalog row — forces fallback pricing.""" + return ArchSpec( + name="Fallback", + provider="aws", + region="us-east-1", + components=[ + Component( + id="custom", + service="definitely_unknown_service_xyz", + provider="aws", + label="Unknown", + tier=2, + config={}, + ), + ], + connections=[], + ) + + +class TestRegionMultiplier: + def test_eu_west_costs_more_than_us_east(self): + from cloudwright.cost import CostEngine + + engine = CostEngine() + us = engine.estimate(_simple_spec(region="us-east-1")) + eu = engine.estimate(_simple_spec(region="eu-west-1")) + # eu-west-1 multiplier is 1.08 — formula/fallback tiers get it applied + # catalog tiers (ec2/rds with instance class) may not differ if catalog has exact pricing + # but at least the region multiplier should be recorded + assert eu.region_multiplier > us.region_multiplier + + def test_sa_east_costs_more_than_us_east(self): + """sa-east-1 has a 1.25 multiplier for fallback-priced services.""" + from cloudwright.cost import CostEngine + + # Use a spec with only fallback-priced services so multiplier is clearly applied + spec_us = ArchSpec( + name="SA Test US", + provider="aws", + region="us-east-1", + components=[ + Component(id="q", service="sqs", provider="aws", label="Q", tier=2, config={}), + ], + connections=[], + ) + spec_sa = spec_us.model_copy(update={"region": "sa-east-1", "name": "SA Test SA"}) + + engine = CostEngine() + us_est = engine.estimate(spec_us) + sa_est = engine.estimate(spec_sa) + assert sa_est.monthly_total > us_est.monthly_total + + def test_region_multiplier_recorded_on_estimate(self): + from cloudwright.cost import CostEngine + + engine = CostEngine() + est = engine.estimate(_simple_spec(region="eu-west-1")) + assert est.region == "eu-west-1" + assert est.region_multiplier == pytest.approx(1.08, rel=1e-3) + + def test_us_east_multiplier_is_baseline(self): + from cloudwright.cost import CostEngine + + engine = CostEngine() + est = engine.estimate(_simple_spec(region="us-east-1")) + assert est.region_multiplier == pytest.approx(1.00, rel=1e-3) + + def test_unknown_region_falls_back_to_1x(self): + from cloudwright.cost import _region_multiplier + + assert _region_multiplier("totally-unknown-region-99") == 1.00 + + def test_region_multiplier_helper(self): + from cloudwright.cost import _region_multiplier + + assert _region_multiplier("us-east-1") == pytest.approx(1.00) + assert _region_multiplier("eu-west-1") == pytest.approx(1.08) + assert _region_multiplier("sa-east-1") == pytest.approx(1.25) + assert _region_multiplier("ap-southeast-1") == pytest.approx(1.15) + + def test_prefix_fallback_eu(self): + """A region like eu-west-9 (fictional) should hit the eu- prefix.""" + from cloudwright.cost import _region_multiplier + + m = _region_multiplier("eu-west-9") + assert m > 1.00 # eu prefix is 1.10 + + +class TestPricingConfidence: + def test_unknown_service_marked_low_confidence(self): + from cloudwright.cost import CostEngine + + engine = CostEngine() + est = engine.estimate(_fallback_spec()) + item = est.breakdown[0] + assert item.confidence == "low" + assert item.estimated is True + + def test_unknown_service_marks_overall_low(self): + from cloudwright.cost import CostEngine + + engine = CostEngine() + est = engine.estimate(_fallback_spec()) + assert est.pricing_confidence == "low" + + def test_estimate_has_confidence_fields(self): + from cloudwright.cost import CostEngine + + engine = CostEngine() + est = engine.estimate(_simple_spec()) + assert hasattr(est, "pricing_confidence") + for item in est.breakdown: + assert item.confidence in ("high", "low") + assert isinstance(item.estimated, bool) + + def test_catalog_backed_service_confidence(self): + """ec2 with a known instance type should come from catalog (high confidence).""" + from cloudwright.cost import CostEngine + + spec = ArchSpec( + name="EC2 Test", + provider="aws", + region="us-east-1", + components=[ + Component( + id="web", + service="ec2", + provider="aws", + label="Web", + tier=2, + config={"instance_type": "t3.medium"}, + ), + ], + connections=[], + ) + engine = CostEngine() + est = engine.estimate(spec) + item = next(i for i in est.breakdown if i.component_id == "web") + # t3.medium is in the catalog — should be high confidence + assert item.confidence == "high" + assert item.estimated is False + + def test_warning_logged_for_unknown_service(self, caplog): + import logging + + from cloudwright.cost import CostEngine + + with caplog.at_level(logging.WARNING, logger="cloudwright.catalog.formula"): + engine = CostEngine() + engine.estimate(_fallback_spec()) + + assert any("definitely_unknown_service_xyz" in r.message for r in caplog.records) + + def test_mixed_spec_aggregate_confidence(self): + """A spec with one unknown and one catalog service should be low overall.""" + from cloudwright.cost import CostEngine + + spec = ArchSpec( + name="Mixed", + provider="aws", + region="us-east-1", + components=[ + Component( + id="web", + service="ec2", + provider="aws", + label="Web", + tier=2, + config={"instance_type": "t3.medium"}, + ), + Component( + id="mystery", + service="definitely_unknown_service_xyz", + provider="aws", + label="?", + tier=2, + config={}, + ), + ], + connections=[], + ) + engine = CostEngine() + est = engine.estimate(spec) + assert est.pricing_confidence == "low" + + +class TestCarbonEstimate: + def _simple_carbon_spec(self) -> ArchSpec: + return ArchSpec( + name="Carbon Test", + provider="aws", + region="us-east-1", + components=[ + Component(id="web", service="ec2", provider="aws", label="Web", tier=2, config={}), + Component(id="db", service="rds", provider="aws", label="DB", tier=3, config={}), + ], + connections=[], + ) + + def test_total_is_positive(self): + from cloudwright.carbon import estimate_carbon + + result = estimate_carbon(self._simple_carbon_spec()) + assert result["total_kg_co2e_per_month"] > 0 + + def test_scales_with_component_count(self): + from cloudwright.carbon import estimate_carbon + + one = ArchSpec( + name="One", + provider="aws", + region="us-east-1", + components=[ + Component(id="w", service="ec2", provider="aws", label="W", tier=2, config={}), + ], + connections=[], + ) + two = ArchSpec( + name="Two", + provider="aws", + region="us-east-1", + components=[ + Component(id="w", service="ec2", provider="aws", label="W", tier=2, config={}), + Component(id="d", service="rds", provider="aws", label="D", tier=3, config={}), + ], + connections=[], + ) + r1 = estimate_carbon(one) + r2 = estimate_carbon(two) + assert r2["total_kg_co2e_per_month"] > r1["total_kg_co2e_per_month"] + + def test_breakdown_length_matches_components(self): + from cloudwright.carbon import estimate_carbon + + result = estimate_carbon(self._simple_carbon_spec()) + assert len(result["breakdown"]) == 2 + + def test_breakdown_has_required_fields(self): + from cloudwright.carbon import estimate_carbon + + result = estimate_carbon(self._simple_carbon_spec()) + for item in result["breakdown"]: + assert "component_id" in item + assert "service" in item + assert "kg_co2e_per_month" in item + + def test_virtual_component_is_zero(self): + from cloudwright.carbon import estimate_carbon + + spec = ArchSpec( + name="Virtual", + provider="aws", + region="us-east-1", + components=[ + Component(id="users", service="users", provider="aws", label="Users", tier=0, config={}), + ], + connections=[], + ) + result = estimate_carbon(spec) + assert result["total_kg_co2e_per_month"] == 0.0 + + def test_high_carbon_region_costs_more(self): + """ap-south-1 (Mumbai) has higher grid intensity than us-west-2 (Oregon).""" + from cloudwright.carbon import estimate_carbon + + spec_clean = ArchSpec( + name="Clean", + provider="aws", + region="us-west-2", + components=[ + Component(id="w", service="ec2", provider="aws", label="W", tier=2, config={}), + ], + connections=[], + ) + spec_dirty = spec_clean.model_copy(update={"region": "ap-south-1", "name": "Dirty"}) + + clean = estimate_carbon(spec_clean) + dirty = estimate_carbon(spec_dirty) + assert dirty["total_kg_co2e_per_month"] > clean["total_kg_co2e_per_month"] + + def test_assumptions_dict_present(self): + from cloudwright.carbon import estimate_carbon + + result = estimate_carbon(self._simple_carbon_spec()) + assert "assumptions" in result + assert "pue" in result["assumptions"] + assert "disclaimer" in result["assumptions"] + + def test_empty_spec_returns_zero(self): + from cloudwright.carbon import estimate_carbon + + spec = ArchSpec(name="Empty", provider="aws", region="us-east-1", components=[], connections=[]) + result = estimate_carbon(spec) + assert result["total_kg_co2e_per_month"] == 0.0 + + +class TestFocusCsv: + def _sample_estimate(self): + from cloudwright.cost import CostEngine + + spec = ArchSpec( + name="FOCUS Test", + provider="aws", + region="us-east-1", + components=[ + Component( + id="web", + service="ec2", + provider="aws", + label="Web", + tier=2, + config={"instance_type": "t3.medium"}, + ), + Component( + id="store", + service="s3", + provider="aws", + label="Storage", + tier=4, + config={"storage_gb": 100}, + ), + ], + connections=[ + Connection(source="web", target="store", estimated_monthly_gb=50.0), + ], + ) + return CostEngine().estimate(spec) + + def test_csv_has_focus_headers(self): + from cloudwright.focus import _FOCUS_COLUMNS, to_focus_csv + + csv_text = to_focus_csv(self._sample_estimate()) + reader = csv.DictReader(io.StringIO(csv_text)) + for col in _FOCUS_COLUMNS: + assert col in (reader.fieldnames or []), f"Missing FOCUS column: {col}" + + def test_one_row_per_component(self): + from cloudwright.focus import to_focus_csv + + est = self._sample_estimate() + csv_text = to_focus_csv(est) + rows = list(csv.DictReader(io.StringIO(csv_text))) + # 2 components + 1 data transfer row + assert len(rows) == 3 + + def test_data_transfer_row_present(self): + from cloudwright.focus import to_focus_csv + + csv_text = to_focus_csv(self._sample_estimate()) + rows = list(csv.DictReader(io.StringIO(csv_text))) + services = [r["ServiceName"] for r in rows] + assert "DataTransfer" in services + + def test_billed_cost_matches_estimate(self): + from cloudwright.focus import to_focus_csv + + est = self._sample_estimate() + csv_text = to_focus_csv(est) + rows = list(csv.DictReader(io.StringIO(csv_text))) + total_billed = sum(float(r["BilledCost"]) for r in rows) + assert total_billed == pytest.approx(est.monthly_total, rel=1e-3) + + def test_billing_currency_is_usd(self): + from cloudwright.focus import to_focus_csv + + csv_text = to_focus_csv(self._sample_estimate()) + rows = list(csv.DictReader(io.StringIO(csv_text))) + assert all(r["BillingCurrency"] == "USD" for r in rows) + + def test_charge_period_start_before_end(self): + from cloudwright.focus import to_focus_csv + + csv_text = to_focus_csv(self._sample_estimate()) + rows = list(csv.DictReader(io.StringIO(csv_text))) + for row in rows: + assert row["ChargePeriodStart"] <= row["ChargePeriodEnd"] + + def test_resource_id_matches_component_id(self): + from cloudwright.focus import to_focus_csv + + est = self._sample_estimate() + csv_text = to_focus_csv(est) + rows = list(csv.DictReader(io.StringIO(csv_text))) + component_ids = {r["ResourceId"] for r in rows if r["ServiceName"] != "DataTransfer"} + expected = {item.component_id for item in est.breakdown} + assert component_ids == expected + + def test_no_data_transfer_row_when_zero(self): + """If there's no egress, no DataTransfer row should appear.""" + from cloudwright.cost import CostEngine + from cloudwright.focus import to_focus_csv + + spec = ArchSpec( + name="No Egress", + provider="aws", + region="us-east-1", + components=[ + Component(id="w", service="ec2", provider="aws", label="W", tier=2, config={}), + ], + connections=[], + ) + est = CostEngine().estimate(spec) + csv_text = to_focus_csv(est) + rows = list(csv.DictReader(io.StringIO(csv_text))) + assert all(r["ServiceName"] != "DataTransfer" for r in rows) + + def test_pricing_confidence_column_present(self): + from cloudwright.focus import to_focus_csv + + csv_text = to_focus_csv(self._sample_estimate()) + rows = list(csv.DictReader(io.StringIO(csv_text))) + for row in rows: + assert row["PricingConfidence"] in ("high", "low") diff --git a/packages/core/tests/test_critique.py b/packages/core/tests/test_critique.py new file mode 100644 index 0000000..5b3be96 --- /dev/null +++ b/packages/core/tests/test_critique.py @@ -0,0 +1,118 @@ +"""v1.6.0 generate -> critique -> repair loop.""" + +from cloudwright.critique import CritiqueFinding, CritiqueReport, critique +from cloudwright.designer import Architect +from cloudwright.spec import ArchSpec, Component + + +def _flawed_spec() -> ArchSpec: + # A bare public-ish DB + compute with none of the safety scaffolding: this + # trips multiple linter rules (no monitoring, no LB, no backup, ...). + return ArchSpec( + name="flawed", + components=[ + Component(id="web", service="ec2", provider="aws", label="Web", tier=2), + Component(id="db", service="rds", provider="aws", label="DB", tier=3), + ], + ) + + +class TestCritiqueDeterministic: + def test_returns_score_grade_findings(self): + report = critique(_flawed_spec()) + assert 0 <= report.score <= 100 + assert report.grade in {"A", "B", "C", "D", "F"} + assert report.findings, "a bare 2-component spec should surface lint findings" + # findings are severity-ranked (criticals/highs first) + order = {"critical": 0, "high": 1, "medium": 2, "low": 3} + sevs = [order.get(f.severity, 4) for f in report.findings] + assert sevs == sorted(sevs) + + def test_blocking_is_high_and_critical_only(self): + report = critique(_flawed_spec()) + assert all(f.severity in ("critical", "high") for f in report.blocking) + + def test_compliance_findings_included(self): + report = critique(_flawed_spec(), compliance=["hipaa"]) + assert any(f.source == "validator" for f in report.findings) + + def test_as_dict_shape(self): + d = critique(_flawed_spec()).as_dict() + assert {"score", "grade", "findings", "blocking_count", "summary"} <= set(d) + + +class _FakeLLM: + model_name = "fake" + pricing = {"input": 0.0, "output": 0.0} + + def __init__(self): + self.calls = 0 + + def generate_fast(self, messages, system, max_tokens=0): + self.calls += 1 + repaired = ( + '{"name":"repaired","components":[' + '{"id":"web","service":"ec2","provider":"aws","label":"Web","tier":2},' + '{"id":"mon","service":"cloudwatch","provider":"aws","label":"Monitoring","tier":1}' + "]}" + ) + return repaired, {"input_tokens": 10, "output_tokens": 20, "model": "fake"} + + +class TestRepairLoop: + def test_repair_runs_when_blocking_and_keeps_better_spec(self, monkeypatch): + import cloudwright.critique as crit + + before = CritiqueReport( + score=40.0, + grade="F", + findings=[ + CritiqueFinding("high", "linter", "no_monitoring", "No monitoring"), + CritiqueFinding("high", "linter", "no_backup", "No backup"), + ], + ) + after = CritiqueReport(score=80.0, grade="B", findings=[]) + reports = iter([before, after]) + monkeypatch.setattr(crit, "critique", lambda *a, **k: next(reports)) + + arch = Architect(llm=_FakeLLM(), repair=True, max_repair_iters=1) + out = arch._critique_repair(_flawed_spec(), "web app", None) + + meta = out.metadata["critique"] + assert meta["blocking_before"] == 2 + assert meta["repair_iterations"] == 1 + assert meta["blocking_after"] == 0 + assert out.name == "repaired" # the better spec was kept + + def test_no_repair_when_no_blocking(self, monkeypatch): + import cloudwright.critique as crit + + clean = CritiqueReport(score=90.0, grade="A", findings=[]) + monkeypatch.setattr(crit, "critique", lambda *a, **k: clean) + + llm = _FakeLLM() + arch = Architect(llm=llm, repair=True) + out = arch._critique_repair(_flawed_spec(), "web app", None) + + assert llm.calls == 0 # no LLM repair call when nothing is blocking + assert out.metadata["critique"]["repair_iterations"] == 0 + + def test_repair_kept_only_if_not_worse(self, monkeypatch): + import cloudwright.critique as crit + + before = CritiqueReport(score=40.0, grade="F", findings=[CritiqueFinding("high", "linter", "x", "X")]) + worse = CritiqueReport( + score=20.0, + grade="F", + findings=[ + CritiqueFinding("high", "linter", "x", "X"), + CritiqueFinding("critical", "linter", "y", "Y"), + ], + ) + reports = iter([before, worse]) + monkeypatch.setattr(crit, "critique", lambda *a, **k: next(reports)) + + arch = Architect(llm=_FakeLLM(), repair=True, max_repair_iters=1) + original = _flawed_spec() + out = arch._critique_repair(original, "web app", None) + assert out.name == "flawed" # regressed repair discarded diff --git a/packages/core/tests/test_oscal.py b/packages/core/tests/test_oscal.py new file mode 100644 index 0000000..e2e7921 --- /dev/null +++ b/packages/core/tests/test_oscal.py @@ -0,0 +1,136 @@ +from __future__ import annotations + +from cloudwright.compliance import ComplianceScanner +from cloudwright.oscal import to_oscal +from cloudwright.spec import ArchSpec, Component, Constraints + + +def _component(id: str, service: str, config: dict | None = None, tier: int = 2) -> Component: + return Component(id=id, service=service, provider="aws", label=id, tier=tier, config=config or {}) + + +def _spec(components, compliance: list[str] | None = None) -> ArchSpec: + return ArchSpec( + name="Test", + provider="aws", + region="us-east-1", + constraints=Constraints(compliance=compliance or []), + components=components, + ) + + +class TestToOscalStructure: + def test_returns_component_definition(self): + spec = _spec([_component("db", "rds")], ["HIPAA"]) + report = ComplianceScanner().scan(spec, frameworks=["HIPAA"], run_checkov=False) + doc = to_oscal(spec, report, ["HIPAA"]) + assert "component-definition" in doc + + def test_metadata_oscal_version(self): + spec = _spec([_component("db", "rds")], ["HIPAA"]) + report = ComplianceScanner().scan(spec, frameworks=["HIPAA"], run_checkov=False) + doc = to_oscal(spec, report, ["HIPAA"]) + assert doc["component-definition"]["metadata"]["oscal-version"] == "1.1.2" + + def test_metadata_version(self): + spec = _spec([_component("db", "rds")], ["HIPAA"]) + report = ComplianceScanner().scan(spec, frameworks=["HIPAA"], run_checkov=False) + doc = to_oscal(spec, report, ["HIPAA"]) + assert doc["component-definition"]["metadata"]["version"] == "1.6.0" + + def test_uuid_present(self): + spec = _spec([_component("db", "rds")], ["HIPAA"]) + report = ComplianceScanner().scan(spec, frameworks=["HIPAA"], run_checkov=False) + doc = to_oscal(spec, report, ["HIPAA"]) + assert doc["component-definition"]["uuid"] + + def test_components_length_matches_spec(self): + components = [ + _component("web", "ec2"), + _component("db", "rds", {"backup": True, "multi_az": True}, tier=3), + _component("cache", "elasticache"), + ] + spec = _spec(components, ["HIPAA"]) + report = ComplianceScanner().scan(spec, frameworks=["HIPAA"], run_checkov=False) + doc = to_oscal(spec, report, ["HIPAA"]) + assert len(doc["component-definition"]["components"]) == len(spec.components) + + +class TestDeterministicUuid: + def test_uuid_stable_across_calls(self): + spec = _spec([_component("db", "rds")], ["HIPAA"]) + report = ComplianceScanner().scan(spec, frameworks=["HIPAA"], run_checkov=False) + doc1 = to_oscal(spec, report, ["HIPAA"]) + doc2 = to_oscal(spec, report, ["HIPAA"]) + assert doc1["component-definition"]["uuid"] == doc2["component-definition"]["uuid"] + + def test_uuid_differs_for_different_spec_names(self): + spec_a = ArchSpec(name="Alpha", provider="aws", components=[_component("db", "rds")]) + spec_b = ArchSpec(name="Beta", provider="aws", components=[_component("db", "rds")]) + report_a = ComplianceScanner().scan(spec_a, frameworks=["HIPAA"], run_checkov=False) + report_b = ComplianceScanner().scan(spec_b, frameworks=["HIPAA"], run_checkov=False) + doc_a = to_oscal(spec_a, report_a, ["HIPAA"]) + doc_b = to_oscal(spec_b, report_b, ["HIPAA"]) + assert doc_a["component-definition"]["uuid"] != doc_b["component-definition"]["uuid"] + + def test_uuid_differs_for_different_frameworks(self): + spec = _spec([_component("db", "rds")], ["HIPAA"]) + report = ComplianceScanner().scan(spec, frameworks=["HIPAA"], run_checkov=False) + doc_hipaa = to_oscal(spec, report, ["HIPAA"]) + doc_fedramp = to_oscal(spec, report, ["FedRAMP"]) + assert doc_hipaa["component-definition"]["uuid"] != doc_fedramp["component-definition"]["uuid"] + + +class TestNotSatisfiedFindings: + def test_hipaa_unencrypted_store_yields_not_satisfied(self): + # RDS without encryption flag triggers missing_encryption -> HIPAA 164.312(a)(2)(iv) + spec = _spec([_component("db", "rds", {"backup": True, "multi_az": True}, tier=3)], ["HIPAA"]) + report = ComplianceScanner().scan(spec, frameworks=["HIPAA"], run_checkov=False) + + doc = to_oscal(spec, report, ["HIPAA"]) + components = doc["component-definition"]["components"] + + # Collect all implemented-requirements across all components + all_reqs = [] + for comp in components: + for impl in comp.get("control-implementations", []): + all_reqs.extend(impl.get("implemented-requirements", [])) + + not_satisfied = [r for r in all_reqs if r["implementation-status"]["state"] == "not-satisfied"] + assert not_satisfied, "expected at least one not-satisfied requirement" + + # The encryption control for HIPAA should appear + control_ids = {r["control-id"] for r in not_satisfied} + # HIPAA control kept verbatim (not NIST-shaped) + assert "164.312(a)(2)(iv)" in control_ids + + def test_fedramp_control_ids_lowercased(self): + spec = _spec([_component("db", "rds", {"backup": True, "multi_az": True}, tier=3)], ["FedRAMP"]) + report = ComplianceScanner().scan(spec, frameworks=["FedRAMP"], run_checkov=False) + doc = to_oscal(spec, report, ["FedRAMP"]) + + all_reqs = [] + for comp in doc["component-definition"]["components"]: + for impl in comp.get("control-implementations", []): + all_reqs.extend(impl.get("implemented-requirements", [])) + + # FedRAMP is NIST-shaped so SC-28 should become sc-28 + control_ids = {r["control-id"] for r in all_reqs} + assert "sc-28" in control_ids + assert "SC-28" not in control_ids + + def test_clean_spec_has_no_not_satisfied(self): + spec = _spec( + [_component("db", "rds", {"encryption": True, "backup": True, "multi_az": True}, tier=3)], + ["HIPAA"], + ) + report = ComplianceScanner().scan(spec, frameworks=["HIPAA"], run_checkov=False) + doc = to_oscal(spec, report, ["HIPAA"]) + + all_reqs = [] + for comp in doc["component-definition"]["components"]: + for impl in comp.get("control-implementations", []): + all_reqs.extend(impl.get("implemented-requirements", [])) + + not_satisfied = [r for r in all_reqs if r["implementation-status"]["state"] == "not-satisfied"] + assert not_satisfied == [] diff --git a/packages/core/tests/test_patterns.py b/packages/core/tests/test_patterns.py new file mode 100644 index 0000000..734edc3 --- /dev/null +++ b/packages/core/tests/test_patterns.py @@ -0,0 +1,93 @@ +"""Tests for cloudwright.patterns — no LLM or cloud calls.""" + +from __future__ import annotations + +from cloudwright.patterns import suggest_compliant_patterns + + +def test_hipaa_returns_at_least_one_pattern(): + results = suggest_compliant_patterns("hipaa") + assert len(results) >= 1 + + +def test_hipaa_patterns_all_include_hipaa(): + results = suggest_compliant_patterns("hipaa") + for pattern in results: + assert "hipaa" in pattern["frameworks"], f"{pattern['name']} missing hipaa in frameworks" + + +def test_soc2_returns_at_least_one_pattern(): + results = suggest_compliant_patterns("soc2") + assert len(results) >= 1 + + +def test_soc2_patterns_all_include_soc2(): + results = suggest_compliant_patterns("soc2") + for pattern in results: + assert "soc2" in pattern["frameworks"] + + +def test_pci_dss_returns_at_least_one_pattern(): + results = suggest_compliant_patterns("pci-dss") + assert len(results) >= 1 + + +def test_pci_dss_patterns_all_include_pci_dss(): + results = suggest_compliant_patterns("pci-dss") + for pattern in results: + assert "pci-dss" in pattern["frameworks"] + + +def test_fedramp_returns_at_least_one_pattern(): + results = suggest_compliant_patterns("fedramp") + assert len(results) >= 1 + + +def test_iso27001_returns_at_least_one_pattern(): + results = suggest_compliant_patterns("iso27001") + assert len(results) >= 1 + + +def test_gdpr_returns_at_least_one_pattern(): + results = suggest_compliant_patterns("gdpr") + assert len(results) >= 1 + + +def test_unknown_framework_returns_empty(): + assert suggest_compliant_patterns("unknown-framework") == [] + assert suggest_compliant_patterns("") == [] + assert suggest_compliant_patterns("sox") == [] + + +def test_result_dict_has_required_keys(): + results = suggest_compliant_patterns("soc2") + for pattern in results: + assert "name" in pattern + assert "source" in pattern + assert "frameworks" in pattern + assert "why" in pattern + assert isinstance(pattern["frameworks"], list) + assert isinstance(pattern["why"], str) + assert len(pattern["why"]) > 0 + + +def test_results_ranked_by_coverage_breadth(): + # Patterns with more frameworks should appear first + results = suggest_compliant_patterns("soc2") + if len(results) >= 2: + first_count = len(results[0]["frameworks"]) + last_count = len(results[-1]["frameworks"]) + assert first_count >= last_count + + +def test_case_insensitive_lookup(): + lower = suggest_compliant_patterns("hipaa") + upper = suggest_compliant_patterns("HIPAA") + mixed = suggest_compliant_patterns("HiPaA") + assert lower == upper == mixed + + +def test_source_field_has_expected_prefix(): + for fw in ("hipaa", "soc2", "pci-dss", "fedramp", "iso27001", "gdpr"): + for pattern in suggest_compliant_patterns(fw): + assert pattern["source"].startswith(("template:", "module:")) diff --git a/packages/core/tests/test_remediation.py b/packages/core/tests/test_remediation.py new file mode 100644 index 0000000..941a95d --- /dev/null +++ b/packages/core/tests/test_remediation.py @@ -0,0 +1,129 @@ +"""Tests for cloudwright.remediation — no real LLM, cloud, or terraform calls. + +The plan step shells out to terraform/tofu (slow + network), so these tests use +skip_plan=True or monkeypatch the planner; one fast path exercises the +binary-absent branch directly. +""" + +from __future__ import annotations + +from cloudwright.remediation import remediate +from cloudwright.spec import ArchSpec, Component, Connection + + +def _small_spec() -> ArchSpec: + return ArchSpec( + name="Small", + provider="aws", + region="us-east-1", + components=[ + Component( + id="web", service="ec2", provider="aws", label="Web", tier=2, config={"instance_type": "t3.micro"} + ), + ], + ) + + +def _large_spec() -> ArchSpec: + return ArchSpec( + name="Large", + provider="aws", + region="us-east-1", + components=[ + Component( + id="web", + service="ec2", + provider="aws", + label="Web", + tier=2, + config={"instance_type": "m5.large", "count": 3}, + ), + Component( + id="db", + service="rds", + provider="aws", + label="DB", + tier=3, + config={ + "engine": "postgres", + "instance_class": "db.r5.large", + "multi_az": True, + "allocated_storage": 500, + }, + ), + Component( + id="cache", + service="elasticache", + provider="aws", + label="Cache", + tier=3, + config={"node_type": "cache.r5.large", "engine": "redis"}, + ), + ], + connections=[ + Connection(source="web", target="db", label="SQL", protocol="TCP", port=5432), + Connection(source="web", target="cache", label="Redis", protocol="TCP", port=6379), + ], + ) + + +def test_remediate_returns_required_keys(): + result = remediate(_small_spec(), _large_spec(), skip_plan=True) + assert {"drift", "cost_delta", "quality_delta", "plan", "summary"} <= set(result) + + +def test_remediate_drift_reflects_differences(): + result = remediate(_small_spec(), _large_spec(), skip_plan=True) + assert "add" in {item["change"] for item in result["drift"]} + + +def test_remediate_cost_delta_positive_for_larger_desired(): + cd = remediate(_small_spec(), _large_spec(), skip_plan=True)["cost_delta"] + assert cd["desired"] > cd["current"] + assert cd["delta"] > 0 + assert cd["currency"] == "USD" + + +def test_remediate_quality_delta_keys(): + qd = remediate(_small_spec(), _large_spec(), skip_plan=True)["quality_delta"] + assert {"current", "desired", "delta", "current_grade", "desired_grade"} <= set(qd) + + +def test_remediate_plan_keys_with_mocked_planner(monkeypatch): + from cloudwright import planner + from cloudwright.planner import PlanResult + + stub = PlanResult(tool="terraform", available=True, validated=True, plan_ran=False, ok=True, messages=["stub"]) + monkeypatch.setattr(planner, "plan_terraform", lambda spec, **k: stub) + plan = remediate(_small_spec(), _large_spec())["plan"] + assert {"tool", "available", "validated", "ok", "messages"} <= set(plan) + assert plan["validated"] is True + + +def test_remediate_no_raise_when_terraform_absent(monkeypatch): + # binary-absent branch is fast (no subprocess); plan reflects unavailability. + import shutil + + original = shutil.which + + def patched_which(name, *a, **k): + if name in ("terraform", "tofu"): + return None + return original(name, *a, **k) + + monkeypatch.setattr(shutil, "which", patched_which) + result = remediate(_small_spec(), _large_spec()) + assert result["plan"]["available"] is False + assert result["summary"] + + +def test_remediate_identical_specs_no_drift(): + spec = _small_spec() + result = remediate(spec, spec, skip_plan=True) + assert result["drift"] == [] + assert result["cost_delta"]["delta"] == 0.0 + + +def test_remediate_summary_is_string(): + result = remediate(_small_spec(), _large_spec(), skip_plan=True) + assert isinstance(result["summary"], str) and result["summary"] diff --git a/packages/core/tests/test_two_stage_prompting.py b/packages/core/tests/test_two_stage_prompting.py index 8a68ec4..3bb3d2f 100644 --- a/packages/core/tests/test_two_stage_prompting.py +++ b/packages/core/tests/test_two_stage_prompting.py @@ -95,7 +95,9 @@ def test_stage2_returns_valid_json(self): def test_design_calls_both_stages(self): llm = _two_stage_mock_llm() - architect = Architect(llm=llm, two_stage=True) + # repair=False isolates the two-stage call pattern; the v1.6 critique/repair + # loop (which can add a generate_fast call) is covered by test_critique.py. + architect = Architect(llm=llm, two_stage=True, repair=False) spec = architect.design("Build a serverless orders API on AWS") @@ -138,7 +140,7 @@ def test_design_falls_back_to_single_shot_when_disabled(self): {"input_tokens": 800, "output_tokens": 600, "model": "claude-sonnet-4-6"}, ) - architect = Architect(llm=llm, two_stage=False) + architect = Architect(llm=llm, two_stage=False, repair=False) spec = architect.design("Build a serverless orders API on AWS") assert llm.generate.call_count == 1 diff --git a/packages/core/tests/test_v160_hardening.py b/packages/core/tests/test_v160_hardening.py new file mode 100644 index 0000000..06321eb --- /dev/null +++ b/packages/core/tests/test_v160_hardening.py @@ -0,0 +1,130 @@ +"""v1.6.0 Tier-0 credibility hardening regressions. + +Covers: Terraform exporter injection hardening (numeric coercion + validator), +the WAF multi-line fix, the compliance-overrides-workload-profile invariant, and +the `cloudwright plan` subprocess secret scoping. +""" + +import pytest +from cloudwright.exporter import export_spec, validate_export_config +from cloudwright.exporter.terraform.common import _hcl_num +from cloudwright.parsing import _profile_requires_encryption, _profile_requires_ha +from cloudwright.spec import ArchSpec, Component, Constraints + + +def _spec(component: Component, **meta) -> ArchSpec: + return ArchSpec(name="t", components=[component], metadata=meta) + + +class TestNumericCoercion: + def test_int_string_coerced(self): + assert _hcl_num("20", 20) == "20" + + def test_real_int_passthrough(self): + assert _hcl_num(50, 20) == "50" + + def test_uncoercible_falls_back_to_default(self): + assert _hcl_num("100abc", 20) == "20" + assert _hcl_num(None, 7) == "7" + assert _hcl_num({"x": 1}, 3) == "3" + + def test_float_truncated_when_int_required(self): + assert _hcl_num("20.9", 20) == "20" + + +class TestExportValidator: + def test_rejects_newline_brace_injection(self): + payload = '20\n provisioner "local-exec" {\n command = "id"\n }' + with pytest.raises(ValueError): + validate_export_config({"allocated_storage": payload}) + + def test_rejects_bare_braces(self): + with pytest.raises(ValueError): + validate_export_config({"x": "a{b}"}) + + def test_allows_clean_scalar(self): + validate_export_config({"engine": "postgres", "instance_class": "db.t3.medium"}) + + +class TestExporterInjectionProof: + def test_string_numeric_field_is_coerced_not_injected(self): + # A string value that survives the validator (no metachars) must still be + # emitted as a number, never as raw HCL. + spec = _spec( + Component( + id="db", + service="rds", + provider="aws", + label="DB", + tier=3, + config={"engine": "postgres", "allocated_storage": "9999"}, + ) + ) + tf = export_spec(spec, "terraform") + assert "allocated_storage = 9999" in tf + assert "provisioner" not in tf + assert "local-exec" not in tf + + def test_waf_default_action_is_multiline(self): + spec = _spec(Component(id="acl", service="waf", provider="aws", label="ACL", tier=1)) + tf = export_spec(spec, "terraform") + # single-line nested block is what Terraform rejects + assert "default_action { allow {} }" not in tf + assert "default_action {\n allow {}" in tf + + +class TestComplianceOverridesProfile: + def test_sandbox_plus_hipaa_forces_encryption_and_ha(self): + spec = _spec( + Component(id="db", service="rds", provider="aws", label="DB", tier=3), + workload_profile="sandbox", + ) + c = Constraints(compliance=["hipaa"]) + assert _profile_requires_encryption(spec, c) is True + assert _profile_requires_ha(spec, c) is True + + def test_plain_sandbox_does_not_force(self): + spec = _spec( + Component(id="db", service="rds", provider="aws", label="DB", tier=3), + workload_profile="sandbox", + ) + c = Constraints(compliance=[]) + assert _profile_requires_encryption(spec, c) is False + assert _profile_requires_ha(spec, c) is False + + +class TestOpenTofuParity: + def test_opentofu_format_matches_terraform(self): + spec = _spec(Component(id="web", service="ec2", provider="aws", label="Web", tier=2)) + assert export_spec(spec, "opentofu") == export_spec(spec, "terraform") + assert export_spec(spec, "tofu") == export_spec(spec, "terraform") + + def test_binary_resolution_prefers_override(self, monkeypatch, tmp_path): + from cloudwright import planner + + fake = tmp_path / "tofu" + fake.write_text("#!/bin/sh\n") + fake.chmod(0o755) + monkeypatch.setenv("CLOUDWRIGHT_TF_BINARY", str(fake)) + path, label = planner._terraform_binary() + assert label == "opentofu" + assert path == str(fake) + + +class TestPlanSecretScoping: + def test_subprocess_env_strips_llm_key(self, monkeypatch): + from cloudwright import planner + + monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-ant-secret-value-1234") + monkeypatch.setenv("AWS_ACCESS_KEY_ID", "AKIAEXAMPLE") + env = planner._subprocess_env() + assert "ANTHROPIC_API_KEY" not in env + assert env.get("AWS_ACCESS_KEY_ID") == "AKIAEXAMPLE" + + def test_scrub_redacts_secret_values(self, monkeypatch): + from cloudwright import planner + + monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "verylongsecretvalue0987654321") + out = planner._scrub("error using verylongsecretvalue0987654321 to auth") + assert "verylongsecretvalue0987654321" not in out + assert "REDACTED" in out diff --git a/packages/core/tests/test_v160_traceability.py b/packages/core/tests/test_v160_traceability.py new file mode 100644 index 0000000..d78a3ba --- /dev/null +++ b/packages/core/tests/test_v160_traceability.py @@ -0,0 +1,35 @@ +"""v1.6.0 control traceability chain.""" + +from cloudwright.compliance import ComplianceScanner, build_traceability +from cloudwright.spec import ArchSpec, Component + + +def _hipaa_spec() -> ArchSpec: + return ArchSpec( + name="trace", + components=[ + Component(id="db", service="rds", provider="aws", label="Patient DB", tier=3, config={}), + ], + metadata={"compliance": ["hipaa"]}, + ) + + +def test_traceability_links_component_resource_control(): + spec = _hipaa_spec() + report = ComplianceScanner().scan(spec, frameworks=["hipaa"], run_checkov=False) + chain = build_traceability(spec, report) + assert chain, "an unencrypted HIPAA DB should produce at least one finding chain" + db_rows = [r for r in chain if r["component_id"] == "db"] + assert db_rows + row = db_rows[0] + assert row["service"] == "rds" + assert row["resource_type"] == "aws_db_instance" # mapped via the exporter resource map + assert row["status"] == "violated" + + +def test_traceability_entries_carry_controls(): + spec = _hipaa_spec() + report = ComplianceScanner().scan(spec, frameworks=["hipaa"], run_checkov=False) + chain = build_traceability(spec, report) + # at least one chain entry references a framework control id + assert any(r["controls"] for r in chain) diff --git a/packages/mcp/cloudwright_mcp/__init__.py b/packages/mcp/cloudwright_mcp/__init__.py index 5b60188..e4adfb8 100644 --- a/packages/mcp/cloudwright_mcp/__init__.py +++ b/packages/mcp/cloudwright_mcp/__init__.py @@ -1 +1 @@ -__version__ = "1.5.0" +__version__ = "1.6.0" diff --git a/packages/web/cloudwright_web/__init__.py b/packages/web/cloudwright_web/__init__.py index 3b54a17..91db08f 100644 --- a/packages/web/cloudwright_web/__init__.py +++ b/packages/web/cloudwright_web/__init__.py @@ -1,6 +1,6 @@ """Cloudwright Web — FastAPI backend for architecture intelligence.""" -__version__ = "1.5.0" +__version__ = "1.6.0" def __getattr__(name: str): diff --git a/packages/web/cloudwright_web/static/assets/index-C9JIGemf.js b/packages/web/cloudwright_web/static/assets/index-C9JIGemf.js deleted file mode 100644 index b1d9e0b..0000000 --- a/packages/web/cloudwright_web/static/assets/index-C9JIGemf.js +++ /dev/null @@ -1,71 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}})();function ep(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var tp={exports:{}},Ns={},np={exports:{}},te={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Do=Symbol.for("react.element"),cy=Symbol.for("react.portal"),dy=Symbol.for("react.fragment"),fy=Symbol.for("react.strict_mode"),py=Symbol.for("react.profiler"),hy=Symbol.for("react.provider"),gy=Symbol.for("react.context"),my=Symbol.for("react.forward_ref"),yy=Symbol.for("react.suspense"),xy=Symbol.for("react.memo"),vy=Symbol.for("react.lazy"),jc=Symbol.iterator;function wy(e){return e===null||typeof e!="object"?null:(e=jc&&e[jc]||e["@@iterator"],typeof e=="function"?e:null)}var rp={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},op=Object.assign,ip={};function br(e,t,n){this.props=e,this.context=t,this.refs=ip,this.updater=n||rp}br.prototype.isReactComponent={};br.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};br.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function sp(){}sp.prototype=br.prototype;function su(e,t,n){this.props=e,this.context=t,this.refs=ip,this.updater=n||rp}var lu=su.prototype=new sp;lu.constructor=su;op(lu,br.prototype);lu.isPureReactComponent=!0;var Mc=Array.isArray,lp=Object.prototype.hasOwnProperty,au={current:null},ap={key:!0,ref:!0,__self:!0,__source:!0};function up(e,t,n){var r,o={},i=null,s=null;if(t!=null)for(r in t.ref!==void 0&&(s=t.ref),t.key!==void 0&&(i=""+t.key),t)lp.call(t,r)&&!ap.hasOwnProperty(r)&&(o[r]=t[r]);var l=arguments.length-2;if(l===1)o.children=n;else if(1>>1,B=b[O];if(0>>1;Oo(Y,$))Xo(Q,Y)?(b[O]=Q,b[X]=$,O=X):(b[O]=Y,b[V]=$,O=V);else if(Xo(Q,$))b[O]=Q,b[X]=$,O=X;else break e}}return N}function o(b,N){var $=b.sortIndex-N.sortIndex;return $!==0?$:b.id-N.id}if(typeof performance=="object"&&typeof performance.now=="function"){var i=performance;e.unstable_now=function(){return i.now()}}else{var s=Date,l=s.now();e.unstable_now=function(){return s.now()-l}}var a=[],u=[],p=1,c=null,d=3,x=!1,y=!1,w=!1,_=typeof setTimeout=="function"?setTimeout:null,m=typeof clearTimeout=="function"?clearTimeout:null,g=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function h(b){for(var N=n(u);N!==null;){if(N.callback===null)r(u);else if(N.startTime<=b)r(u),N.sortIndex=N.expirationTime,t(a,N);else break;N=n(u)}}function v(b){if(w=!1,h(b),!y)if(n(a)!==null)y=!0,P(S);else{var N=n(u);N!==null&&L(v,N.startTime-b)}}function S(b,N){y=!1,w&&(w=!1,m(j),j=-1),x=!0;var $=d;try{for(h(N),c=n(a);c!==null&&(!(c.expirationTime>N)||b&&!z());){var O=c.callback;if(typeof O=="function"){c.callback=null,d=c.priorityLevel;var B=O(c.expirationTime<=N);N=e.unstable_now(),typeof B=="function"?c.callback=B:c===n(a)&&r(a),h(N)}else r(a);c=n(a)}if(c!==null)var W=!0;else{var V=n(u);V!==null&&L(v,V.startTime-N),W=!1}return W}finally{c=null,d=$,x=!1}}var k=!1,C=null,j=-1,I=5,A=-1;function z(){return!(e.unstable_now()-Ab||125O?(b.sortIndex=$,t(u,b),n(a)===null&&b===n(u)&&(w?(m(j),j=-1):w=!0,L(v,$-O))):(b.sortIndex=B,t(a,b),y||x||(y=!0,P(S))),b},e.unstable_shouldYield=z,e.unstable_wrapCallback=function(b){var N=d;return function(){var $=d;d=N;try{return b.apply(this,arguments)}finally{d=$}}}})(gp);hp.exports=gp;var Py=hp.exports;/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Ty=M,Xe=Py;function F(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ql=Object.prototype.hasOwnProperty,Iy=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,Pc={},Tc={};function Ry(e){return ql.call(Tc,e)?!0:ql.call(Pc,e)?!1:Iy.test(e)?Tc[e]=!0:(Pc[e]=!0,!1)}function Ly(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function Ay(e,t,n,r){if(t===null||typeof t>"u"||Ly(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function Ae(e,t,n,r,o,i,s){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=s}var Ne={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Ne[e]=new Ae(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Ne[t]=new Ae(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Ne[e]=new Ae(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Ne[e]=new Ae(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Ne[e]=new Ae(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Ne[e]=new Ae(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Ne[e]=new Ae(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Ne[e]=new Ae(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Ne[e]=new Ae(e,5,!1,e.toLowerCase(),null,!1,!1)});var cu=/[\-:]([a-z])/g;function du(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(cu,du);Ne[t]=new Ae(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(cu,du);Ne[t]=new Ae(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(cu,du);Ne[t]=new Ae(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Ne[e]=new Ae(e,1,!1,e.toLowerCase(),null,!1,!1)});Ne.xlinkHref=new Ae("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Ne[e]=new Ae(e,1,!1,e.toLowerCase(),null,!0,!0)});function fu(e,t,n,r){var o=Ne.hasOwnProperty(t)?Ne[t]:null;(o!==null?o.type!==0:r||!(2l||o[s]!==i[l]){var a=` -`+o[s].replace(" at new "," at ");return e.displayName&&a.includes("")&&(a=a.replace("",e.displayName)),a}while(1<=s&&0<=l);break}}}finally{ll=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Xr(e):""}function $y(e){switch(e.tag){case 5:return Xr(e.type);case 16:return Xr("Lazy");case 13:return Xr("Suspense");case 19:return Xr("SuspenseList");case 0:case 2:case 15:return e=al(e.type,!1),e;case 11:return e=al(e.type.render,!1),e;case 1:return e=al(e.type,!0),e;default:return""}}function ta(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Wn:return"Fragment";case Vn:return"Portal";case Zl:return"Profiler";case pu:return"StrictMode";case Jl:return"Suspense";case ea:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case xp:return(e.displayName||"Context")+".Consumer";case yp:return(e._context.displayName||"Context")+".Provider";case hu:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case gu:return t=e.displayName||null,t!==null?t:ta(e.type)||"Memo";case Xt:t=e._payload,e=e._init;try{return ta(e(t))}catch{}}return null}function Dy(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ta(t);case 8:return t===pu?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function cn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function wp(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Oy(e){var t=wp(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var o=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(s){r=""+s,i.call(this,s)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(s){r=""+s},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Jo(e){e._valueTracker||(e._valueTracker=Oy(e))}function Sp(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=wp(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Yi(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function na(e,t){var n=t.checked;return me({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Rc(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=cn(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function kp(e,t){t=t.checked,t!=null&&fu(e,"checked",t,!1)}function ra(e,t){kp(e,t);var n=cn(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?oa(e,t.type,n):t.hasOwnProperty("defaultValue")&&oa(e,t.type,cn(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Lc(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function oa(e,t,n){(t!=="number"||Yi(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Qr=Array.isArray;function rr(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o"+t.valueOf().toString()+"",t=ei.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function fo(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Jr={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},By=["Webkit","ms","Moz","O"];Object.keys(Jr).forEach(function(e){By.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Jr[t]=Jr[e]})});function bp(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Jr.hasOwnProperty(e)&&Jr[e]?(""+t).trim():t+"px"}function Np(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,o=bp(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}var Fy=me({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function la(e,t){if(t){if(Fy[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(F(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(F(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(F(61))}if(t.style!=null&&typeof t.style!="object")throw Error(F(62))}}function aa(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var ua=null;function mu(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var ca=null,or=null,ir=null;function Dc(e){if(e=Fo(e)){if(typeof ca!="function")throw Error(F(280));var t=e.stateNode;t&&(t=Ts(t),ca(e.stateNode,e.type,t))}}function jp(e){or?ir?ir.push(e):ir=[e]:or=e}function Mp(){if(or){var e=or,t=ir;if(ir=or=null,Dc(e),t)for(e=0;e>>=0,e===0?32:31-(Zy(e)/Jy|0)|0}var ti=64,ni=4194304;function Gr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Ki(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,o=e.suspendedLanes,i=e.pingedLanes,s=n&268435455;if(s!==0){var l=s&~o;l!==0?r=Gr(l):(i&=s,i!==0&&(r=Gr(i)))}else s=n&~o,s!==0?r=Gr(s):i!==0&&(r=Gr(i));if(r===0)return 0;if(t!==0&&t!==r&&!(t&o)&&(o=r&-r,i=t&-t,o>=i||o===16&&(i&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Oo(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-ft(t),e[t]=n}function rx(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=to),Xc=" ",Qc=!1;function Gp(e,t){switch(e){case"keyup":return Px.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Kp(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Un=!1;function Ix(e,t){switch(e){case"compositionend":return Kp(t);case"keypress":return t.which!==32?null:(Qc=!0,Xc);case"textInput":return e=t.data,e===Xc&&Qc?null:e;default:return null}}function Rx(e,t){if(Un)return e==="compositionend"||!Eu&&Gp(e,t)?(e=Xp(),Ti=Su=Zt=null,Un=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Zc(n)}}function eh(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?eh(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function th(){for(var e=window,t=Yi();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Yi(e.document)}return t}function Cu(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Vx(e){var t=th(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&eh(n.ownerDocument.documentElement,n)){if(r!==null&&Cu(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var o=n.textContent.length,i=Math.min(r.start,o);r=r.end===void 0?i:Math.min(r.end,o),!e.extend&&i>r&&(o=r,r=i,i=o),o=Jc(n,i);var s=Jc(n,r);o&&s&&(e.rangeCount!==1||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==s.node||e.focusOffset!==s.offset)&&(t=t.createRange(),t.setStart(o.node,o.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(s.node,s.offset)):(t.setEnd(s.node,s.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Yn=null,ma=null,ro=null,ya=!1;function ed(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ya||Yn==null||Yn!==Yi(r)||(r=Yn,"selectionStart"in r&&Cu(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),ro&&xo(ro,r)||(ro=r,r=Ji(ma,"onSelect"),0Gn||(e.current=_a[Gn],_a[Gn]=null,Gn--)}function ae(e,t){Gn++,_a[Gn]=e.current,e.current=t}var dn={},Te=pn(dn),Be=pn(!1),Nn=dn;function fr(e,t){var n=e.type.contextTypes;if(!n)return dn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o={},i;for(i in n)o[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function Fe(e){return e=e.childContextTypes,e!=null}function ts(){ce(Be),ce(Te)}function ld(e,t,n){if(Te.current!==dn)throw Error(F(168));ae(Te,t),ae(Be,n)}function ch(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var o in r)if(!(o in t))throw Error(F(108,Dy(e)||"Unknown",o));return me({},n,r)}function ns(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||dn,Nn=Te.current,ae(Te,e),ae(Be,Be.current),!0}function ad(e,t,n){var r=e.stateNode;if(!r)throw Error(F(169));n?(e=ch(e,t,Nn),r.__reactInternalMemoizedMergedChildContext=e,ce(Be),ce(Te),ae(Te,e)):ce(Be),ae(Be,n)}var Pt=null,Is=!1,kl=!1;function dh(e){Pt===null?Pt=[e]:Pt.push(e)}function t1(e){Is=!0,dh(e)}function hn(){if(!kl&&Pt!==null){kl=!0;var e=0,t=se;try{var n=Pt;for(se=1;e>=s,o-=s,Tt=1<<32-ft(t)+o|n<j?(I=C,C=null):I=C.sibling;var A=d(m,C,h[j],v);if(A===null){C===null&&(C=I);break}e&&C&&A.alternate===null&&t(m,C),g=i(A,g,j),k===null?S=A:k.sibling=A,k=A,C=I}if(j===h.length)return n(m,C),de&&mn(m,j),S;if(C===null){for(;jj?(I=C,C=null):I=C.sibling;var z=d(m,C,A.value,v);if(z===null){C===null&&(C=I);break}e&&C&&z.alternate===null&&t(m,C),g=i(z,g,j),k===null?S=z:k.sibling=z,k=z,C=I}if(A.done)return n(m,C),de&&mn(m,j),S;if(C===null){for(;!A.done;j++,A=h.next())A=c(m,A.value,v),A!==null&&(g=i(A,g,j),k===null?S=A:k.sibling=A,k=A);return de&&mn(m,j),S}for(C=r(m,C);!A.done;j++,A=h.next())A=x(C,m,j,A.value,v),A!==null&&(e&&A.alternate!==null&&C.delete(A.key===null?j:A.key),g=i(A,g,j),k===null?S=A:k.sibling=A,k=A);return e&&C.forEach(function(D){return t(m,D)}),de&&mn(m,j),S}function _(m,g,h,v){if(typeof h=="object"&&h!==null&&h.type===Wn&&h.key===null&&(h=h.props.children),typeof h=="object"&&h!==null){switch(h.$$typeof){case Zo:e:{for(var S=h.key,k=g;k!==null;){if(k.key===S){if(S=h.type,S===Wn){if(k.tag===7){n(m,k.sibling),g=o(k,h.props.children),g.return=m,m=g;break e}}else if(k.elementType===S||typeof S=="object"&&S!==null&&S.$$typeof===Xt&&dd(S)===k.type){n(m,k.sibling),g=o(k,h.props),g.ref=Dr(m,k,h),g.return=m,m=g;break e}n(m,k);break}else t(m,k);k=k.sibling}h.type===Wn?(g=En(h.props.children,m.mode,v,h.key),g.return=m,m=g):(v=Bi(h.type,h.key,h.props,null,m.mode,v),v.ref=Dr(m,g,h),v.return=m,m=v)}return s(m);case Vn:e:{for(k=h.key;g!==null;){if(g.key===k)if(g.tag===4&&g.stateNode.containerInfo===h.containerInfo&&g.stateNode.implementation===h.implementation){n(m,g.sibling),g=o(g,h.children||[]),g.return=m,m=g;break e}else{n(m,g);break}else t(m,g);g=g.sibling}g=zl(h,m.mode,v),g.return=m,m=g}return s(m);case Xt:return k=h._init,_(m,g,k(h._payload),v)}if(Qr(h))return y(m,g,h,v);if(Ir(h))return w(m,g,h,v);ui(m,h)}return typeof h=="string"&&h!==""||typeof h=="number"?(h=""+h,g!==null&&g.tag===6?(n(m,g.sibling),g=o(g,h),g.return=m,m=g):(n(m,g),g=Ml(h,m.mode,v),g.return=m,m=g),s(m)):n(m,g)}return _}var hr=gh(!0),mh=gh(!1),is=pn(null),ss=null,Zn=null,Mu=null;function zu(){Mu=Zn=ss=null}function Pu(e){var t=is.current;ce(is),e._currentValue=t}function ba(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function lr(e,t){ss=e,Mu=Zn=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(De=!0),e.firstContext=null)}function nt(e){var t=e._currentValue;if(Mu!==e)if(e={context:e,memoizedValue:t,next:null},Zn===null){if(ss===null)throw Error(F(308));Zn=e,ss.dependencies={lanes:0,firstContext:e}}else Zn=Zn.next=e;return t}var wn=null;function Tu(e){wn===null?wn=[e]:wn.push(e)}function yh(e,t,n,r){var o=t.interleaved;return o===null?(n.next=n,Tu(t)):(n.next=o.next,o.next=n),t.interleaved=n,Dt(e,r)}function Dt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var Qt=!1;function Iu(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function xh(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Lt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function on(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,oe&2){var o=r.pending;return o===null?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Dt(e,n)}return o=r.interleaved,o===null?(t.next=t,Tu(r)):(t.next=o.next,o.next=t),r.interleaved=t,Dt(e,n)}function Ri(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,xu(e,n)}}function fd(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var o=null,i=null;if(n=n.firstBaseUpdate,n!==null){do{var s={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};i===null?o=i=s:i=i.next=s,n=n.next}while(n!==null);i===null?o=i=t:i=i.next=t}else o=i=t;n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:i,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function ls(e,t,n,r){var o=e.updateQueue;Qt=!1;var i=o.firstBaseUpdate,s=o.lastBaseUpdate,l=o.shared.pending;if(l!==null){o.shared.pending=null;var a=l,u=a.next;a.next=null,s===null?i=u:s.next=u,s=a;var p=e.alternate;p!==null&&(p=p.updateQueue,l=p.lastBaseUpdate,l!==s&&(l===null?p.firstBaseUpdate=u:l.next=u,p.lastBaseUpdate=a))}if(i!==null){var c=o.baseState;s=0,p=u=a=null,l=i;do{var d=l.lane,x=l.eventTime;if((r&d)===d){p!==null&&(p=p.next={eventTime:x,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var y=e,w=l;switch(d=t,x=n,w.tag){case 1:if(y=w.payload,typeof y=="function"){c=y.call(x,c,d);break e}c=y;break e;case 3:y.flags=y.flags&-65537|128;case 0:if(y=w.payload,d=typeof y=="function"?y.call(x,c,d):y,d==null)break e;c=me({},c,d);break e;case 2:Qt=!0}}l.callback!==null&&l.lane!==0&&(e.flags|=64,d=o.effects,d===null?o.effects=[l]:d.push(l))}else x={eventTime:x,lane:d,tag:l.tag,payload:l.payload,callback:l.callback,next:null},p===null?(u=p=x,a=c):p=p.next=x,s|=d;if(l=l.next,l===null){if(l=o.shared.pending,l===null)break;d=l,l=d.next,d.next=null,o.lastBaseUpdate=d,o.shared.pending=null}}while(!0);if(p===null&&(a=c),o.baseState=a,o.firstBaseUpdate=u,o.lastBaseUpdate=p,t=o.shared.interleaved,t!==null){o=t;do s|=o.lane,o=o.next;while(o!==t)}else i===null&&(o.shared.lanes=0);zn|=s,e.lanes=s,e.memoizedState=c}}function pd(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=El.transition;El.transition={};try{e(!1),t()}finally{se=n,El.transition=r}}function Lh(){return rt().memoizedState}function i1(e,t,n){var r=ln(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Ah(e))$h(t,n);else if(n=yh(e,t,n,r),n!==null){var o=Re();pt(n,e,r,o),Dh(n,t,r)}}function s1(e,t,n){var r=ln(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ah(e))$h(t,o);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var s=t.lastRenderedState,l=i(s,n);if(o.hasEagerState=!0,o.eagerState=l,ht(l,s)){var a=t.interleaved;a===null?(o.next=o,Tu(t)):(o.next=a.next,a.next=o),t.interleaved=o;return}}catch{}finally{}n=yh(e,t,o,r),n!==null&&(o=Re(),pt(n,e,r,o),Dh(n,t,r))}}function Ah(e){var t=e.alternate;return e===ge||t!==null&&t===ge}function $h(e,t){oo=us=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Dh(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,xu(e,n)}}var cs={readContext:nt,useCallback:Me,useContext:Me,useEffect:Me,useImperativeHandle:Me,useInsertionEffect:Me,useLayoutEffect:Me,useMemo:Me,useReducer:Me,useRef:Me,useState:Me,useDebugValue:Me,useDeferredValue:Me,useTransition:Me,useMutableSource:Me,useSyncExternalStore:Me,useId:Me,unstable_isNewReconciler:!1},l1={readContext:nt,useCallback:function(e,t){return wt().memoizedState=[e,t===void 0?null:t],e},useContext:nt,useEffect:gd,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Ai(4194308,4,zh.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ai(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ai(4,2,e,t)},useMemo:function(e,t){var n=wt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=wt();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=i1.bind(null,ge,e),[r.memoizedState,e]},useRef:function(e){var t=wt();return e={current:e},t.memoizedState=e},useState:hd,useDebugValue:Fu,useDeferredValue:function(e){return wt().memoizedState=e},useTransition:function(){var e=hd(!1),t=e[0];return e=o1.bind(null,e[1]),wt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=ge,o=wt();if(de){if(n===void 0)throw Error(F(407));n=n()}else{if(n=t(),Ee===null)throw Error(F(349));Mn&30||kh(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,gd(Eh.bind(null,r,i,e),[e]),r.flags|=2048,bo(9,_h.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=wt(),t=Ee.identifierPrefix;if(de){var n=It,r=Tt;n=(r&~(1<<32-ft(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=Eo++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=s.createElement(n,{is:r.is}):(e=s.createElement(n),n==="select"&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,n),e[kt]=t,e[So]=r,Qh(e,t,!1,!1),t.stateNode=e;e:{switch(s=aa(n,r),n){case"dialog":ue("cancel",e),ue("close",e),o=r;break;case"iframe":case"object":case"embed":ue("load",e),o=r;break;case"video":case"audio":for(o=0;oyr&&(t.flags|=128,r=!0,Or(i,!1),t.lanes=4194304)}else{if(!r)if(e=as(s),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Or(i,!0),i.tail===null&&i.tailMode==="hidden"&&!s.alternate&&!de)return ze(t),null}else 2*xe()-i.renderingStartTime>yr&&n!==1073741824&&(t.flags|=128,r=!0,Or(i,!1),t.lanes=4194304);i.isBackwards?(s.sibling=t.child,t.child=s):(n=i.last,n!==null?n.sibling=s:t.child=s,i.last=s)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=xe(),t.sibling=null,n=he.current,ae(he,r?n&1|2:n&1),t):(ze(t),null);case 22:case 23:return Xu(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Ve&1073741824&&(ze(t),t.subtreeFlags&6&&(t.flags|=8192)):ze(t),null;case 24:return null;case 25:return null}throw Error(F(156,t.tag))}function g1(e,t){switch(Nu(t),t.tag){case 1:return Fe(t.type)&&ts(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return gr(),ce(Be),ce(Te),Au(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Lu(t),null;case 13:if(ce(he),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(F(340));pr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return ce(he),null;case 4:return gr(),null;case 10:return Pu(t.type._context),null;case 22:case 23:return Xu(),null;case 24:return null;default:return null}}var di=!1,Pe=!1,m1=typeof WeakSet=="function"?WeakSet:Set,U=null;function Jn(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){ye(e,t,r)}else n.current=null}function La(e,t,n){try{n()}catch(r){ye(e,t,r)}}var bd=!1;function y1(e,t){if(xa=qi,e=th(),Cu(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch{n=null;break e}var s=0,l=-1,a=-1,u=0,p=0,c=e,d=null;t:for(;;){for(var x;c!==n||o!==0&&c.nodeType!==3||(l=s+o),c!==i||r!==0&&c.nodeType!==3||(a=s+r),c.nodeType===3&&(s+=c.nodeValue.length),(x=c.firstChild)!==null;)d=c,c=x;for(;;){if(c===e)break t;if(d===n&&++u===o&&(l=s),d===i&&++p===r&&(a=s),(x=c.nextSibling)!==null)break;c=d,d=c.parentNode}c=x}n=l===-1||a===-1?null:{start:l,end:a}}else n=null}n=n||{start:0,end:0}}else n=null;for(va={focusedElem:e,selectionRange:n},qi=!1,U=t;U!==null;)if(t=U,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,U=e;else for(;U!==null;){t=U;try{var y=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(y!==null){var w=y.memoizedProps,_=y.memoizedState,m=t.stateNode,g=m.getSnapshotBeforeUpdate(t.elementType===t.type?w:it(t.type,w),_);m.__reactInternalSnapshotBeforeUpdate=g}break;case 3:var h=t.stateNode.containerInfo;h.nodeType===1?h.textContent="":h.nodeType===9&&h.documentElement&&h.removeChild(h.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(F(163))}}catch(v){ye(t,t.return,v)}if(e=t.sibling,e!==null){e.return=t.return,U=e;break}U=t.return}return y=bd,bd=!1,y}function io(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var o=r=r.next;do{if((o.tag&e)===e){var i=o.destroy;o.destroy=void 0,i!==void 0&&La(t,n,i)}o=o.next}while(o!==r)}}function As(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Aa(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function qh(e){var t=e.alternate;t!==null&&(e.alternate=null,qh(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[kt],delete t[So],delete t[ka],delete t[Jx],delete t[e1])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Zh(e){return e.tag===5||e.tag===3||e.tag===4}function Nd(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Zh(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function $a(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=es));else if(r!==4&&(e=e.child,e!==null))for($a(e,t,n),e=e.sibling;e!==null;)$a(e,t,n),e=e.sibling}function Da(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Da(e,t,n),e=e.sibling;e!==null;)Da(e,t,n),e=e.sibling}var Ce=null,st=!1;function Wt(e,t,n){for(n=n.child;n!==null;)Jh(e,t,n),n=n.sibling}function Jh(e,t,n){if(_t&&typeof _t.onCommitFiberUnmount=="function")try{_t.onCommitFiberUnmount(js,n)}catch{}switch(n.tag){case 5:Pe||Jn(n,t);case 6:var r=Ce,o=st;Ce=null,Wt(e,t,n),Ce=r,st=o,Ce!==null&&(st?(e=Ce,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Ce.removeChild(n.stateNode));break;case 18:Ce!==null&&(st?(e=Ce,n=n.stateNode,e.nodeType===8?Sl(e.parentNode,n):e.nodeType===1&&Sl(e,n),mo(e)):Sl(Ce,n.stateNode));break;case 4:r=Ce,o=st,Ce=n.stateNode.containerInfo,st=!0,Wt(e,t,n),Ce=r,st=o;break;case 0:case 11:case 14:case 15:if(!Pe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){o=r=r.next;do{var i=o,s=i.destroy;i=i.tag,s!==void 0&&(i&2||i&4)&&La(n,t,s),o=o.next}while(o!==r)}Wt(e,t,n);break;case 1:if(!Pe&&(Jn(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(l){ye(n,t,l)}Wt(e,t,n);break;case 21:Wt(e,t,n);break;case 22:n.mode&1?(Pe=(r=Pe)||n.memoizedState!==null,Wt(e,t,n),Pe=r):Wt(e,t,n);break;default:Wt(e,t,n)}}function jd(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new m1),t.forEach(function(r){var o=b1.bind(null,e,r);n.has(r)||(n.add(r),r.then(o,o))})}}function ot(e,t){var n=t.deletions;if(n!==null)for(var r=0;ro&&(o=s),r&=~i}if(r=o,r=xe()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*v1(r/1960))-r,10e?16:e,Jt===null)var r=!1;else{if(e=Jt,Jt=null,ps=0,oe&6)throw Error(F(331));var o=oe;for(oe|=4,U=e.current;U!==null;){var i=U,s=i.child;if(U.flags&16){var l=i.deletions;if(l!==null){for(var a=0;axe()-Uu?_n(e,0):Wu|=n),He(e,t)}function lg(e,t){t===0&&(e.mode&1?(t=ni,ni<<=1,!(ni&130023424)&&(ni=4194304)):t=1);var n=Re();e=Dt(e,t),e!==null&&(Oo(e,t,n),He(e,n))}function C1(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),lg(e,n)}function b1(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;o!==null&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(F(314))}r!==null&&r.delete(t),lg(e,n)}var ag;ag=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||Be.current)De=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return De=!1,p1(e,t,n);De=!!(e.flags&131072)}else De=!1,de&&t.flags&1048576&&fh(t,os,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;$i(e,t),e=t.pendingProps;var o=fr(t,Te.current);lr(t,n),o=Du(null,t,r,e,o,n);var i=Ou();return t.flags|=1,typeof o=="object"&&o!==null&&typeof o.render=="function"&&o.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Fe(r)?(i=!0,ns(t)):i=!1,t.memoizedState=o.state!==null&&o.state!==void 0?o.state:null,Iu(t),o.updater=Ls,t.stateNode=o,o._reactInternals=t,ja(t,r,e,n),t=Pa(null,t,r,!0,i,n)):(t.tag=0,de&&i&&bu(t),Ie(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch($i(e,t),e=t.pendingProps,o=r._init,r=o(r._payload),t.type=r,o=t.tag=j1(r),e=it(r,e),o){case 0:t=za(null,t,r,e,n);break e;case 1:t=_d(null,t,r,e,n);break e;case 11:t=Sd(null,t,r,e,n);break e;case 14:t=kd(null,t,r,it(r.type,e),n);break e}throw Error(F(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:it(r,o),za(e,t,r,o,n);case 1:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:it(r,o),_d(e,t,r,o,n);case 3:e:{if(Uh(t),e===null)throw Error(F(387));r=t.pendingProps,i=t.memoizedState,o=i.element,xh(e,t),ls(t,r,null,n);var s=t.memoizedState;if(r=s.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){o=mr(Error(F(423)),t),t=Ed(e,t,r,n,o);break e}else if(r!==o){o=mr(Error(F(424)),t),t=Ed(e,t,r,n,o);break e}else for(Ue=rn(t.stateNode.containerInfo.firstChild),Ye=t,de=!0,at=null,n=mh(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(pr(),r===o){t=Ot(e,t,n);break e}Ie(e,t,r,n)}t=t.child}return t;case 5:return vh(t),e===null&&Ca(t),r=t.type,o=t.pendingProps,i=e!==null?e.memoizedProps:null,s=o.children,wa(r,o)?s=null:i!==null&&wa(r,i)&&(t.flags|=32),Wh(e,t),Ie(e,t,s,n),t.child;case 6:return e===null&&Ca(t),null;case 13:return Yh(e,t,n);case 4:return Ru(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=hr(t,null,r,n):Ie(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:it(r,o),Sd(e,t,r,o,n);case 7:return Ie(e,t,t.pendingProps,n),t.child;case 8:return Ie(e,t,t.pendingProps.children,n),t.child;case 12:return Ie(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,s=o.value,ae(is,r._currentValue),r._currentValue=s,i!==null)if(ht(i.value,s)){if(i.children===o.children&&!Be.current){t=Ot(e,t,n);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var l=i.dependencies;if(l!==null){s=i.child;for(var a=l.firstContext;a!==null;){if(a.context===r){if(i.tag===1){a=Lt(-1,n&-n),a.tag=2;var u=i.updateQueue;if(u!==null){u=u.shared;var p=u.pending;p===null?a.next=a:(a.next=p.next,p.next=a),u.pending=a}}i.lanes|=n,a=i.alternate,a!==null&&(a.lanes|=n),ba(i.return,n,t),l.lanes|=n;break}a=a.next}}else if(i.tag===10)s=i.type===t.type?null:i.child;else if(i.tag===18){if(s=i.return,s===null)throw Error(F(341));s.lanes|=n,l=s.alternate,l!==null&&(l.lanes|=n),ba(s,n,t),s=i.sibling}else s=i.child;if(s!==null)s.return=i;else for(s=i;s!==null;){if(s===t){s=null;break}if(i=s.sibling,i!==null){i.return=s.return,s=i;break}s=s.return}i=s}Ie(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,lr(t,n),o=nt(o),r=r(o),t.flags|=1,Ie(e,t,r,n),t.child;case 14:return r=t.type,o=it(r,t.pendingProps),o=it(r.type,o),kd(e,t,r,o,n);case 15:return Hh(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:it(r,o),$i(e,t),t.tag=1,Fe(r)?(e=!0,ns(t)):e=!1,lr(t,n),Oh(t,r,o),ja(t,r,o,n),Pa(null,t,r,!0,e,n);case 19:return Xh(e,t,n);case 22:return Vh(e,t,n)}throw Error(F(156,t.tag))};function ug(e,t){return Ap(e,t)}function N1(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function et(e,t,n,r){return new N1(e,t,n,r)}function Gu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function j1(e){if(typeof e=="function")return Gu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===hu)return 11;if(e===gu)return 14}return 2}function an(e,t){var n=e.alternate;return n===null?(n=et(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Bi(e,t,n,r,o,i){var s=2;if(r=e,typeof e=="function")Gu(e)&&(s=1);else if(typeof e=="string")s=5;else e:switch(e){case Wn:return En(n.children,o,i,t);case pu:s=8,o|=8;break;case Zl:return e=et(12,n,t,o|2),e.elementType=Zl,e.lanes=i,e;case Jl:return e=et(13,n,t,o),e.elementType=Jl,e.lanes=i,e;case ea:return e=et(19,n,t,o),e.elementType=ea,e.lanes=i,e;case vp:return Ds(n,o,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case yp:s=10;break e;case xp:s=9;break e;case hu:s=11;break e;case gu:s=14;break e;case Xt:s=16,r=null;break e}throw Error(F(130,e==null?e:typeof e,""))}return t=et(s,n,t,o),t.elementType=e,t.type=r,t.lanes=i,t}function En(e,t,n,r){return e=et(7,e,r,t),e.lanes=n,e}function Ds(e,t,n,r){return e=et(22,e,r,t),e.elementType=vp,e.lanes=n,e.stateNode={isHidden:!1},e}function Ml(e,t,n){return e=et(6,e,null,t),e.lanes=n,e}function zl(e,t,n){return t=et(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function M1(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=cl(0),this.expirationTimes=cl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=cl(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function Ku(e,t,n,r,o,i,s,l,a){return e=new M1(e,t,n,l,a),t===1?(t=1,i===!0&&(t|=8)):t=0,i=et(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Iu(i),e}function z1(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(pg)}catch(e){console.error(e)}}pg(),pp.exports=Ge;var L1=pp.exports,Ad=L1;Kl.createRoot=Ad.createRoot,Kl.hydrateRoot=Ad.hydrateRoot;function we(e){if(typeof e=="string"||typeof e=="number")return""+e;let t="";if(Array.isArray(e))for(let n=0,r;n{}};function Vs(){for(var e=0,t=arguments.length,n={},r;e=0&&(r=n.slice(o+1),n=n.slice(0,o)),n&&!t.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:r}})}Fi.prototype=Vs.prototype={constructor:Fi,on:function(e,t){var n=this._,r=$1(e+"",n),o,i=-1,s=r.length;if(arguments.length<2){for(;++i0)for(var n=new Array(o),r=0,o,i;r=0&&(t=e.slice(0,n))!=="xmlns"&&(e=e.slice(n+1)),Dd.hasOwnProperty(t)?{space:Dd[t],local:e}:e}function O1(e){return function(){var t=this.ownerDocument,n=this.namespaceURI;return n===Va&&t.documentElement.namespaceURI===Va?t.createElement(e):t.createElementNS(n,e)}}function B1(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function hg(e){var t=Ws(e);return(t.local?B1:O1)(t)}function F1(){}function ec(e){return e==null?F1:function(){return this.querySelector(e)}}function H1(e){typeof e!="function"&&(e=ec(e));for(var t=this._groups,n=t.length,r=new Array(n),o=0;o=h&&(h=g+1);!(S=_[h])&&++h=0;)(s=r[o])&&(i&&s.compareDocumentPosition(i)^4&&i.parentNode.insertBefore(s,i),i=s);return this}function pv(e){e||(e=hv);function t(c,d){return c&&d?e(c.__data__,d.__data__):!c-!d}for(var n=this._groups,r=n.length,o=new Array(r),i=0;it?1:e>=t?0:NaN}function gv(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function mv(){return Array.from(this)}function yv(){for(var e=this._groups,t=0,n=e.length;t1?this.each((t==null?jv:typeof t=="function"?zv:Mv)(e,t,n??"")):xr(this.node(),e)}function xr(e,t){return e.style.getPropertyValue(t)||vg(e).getComputedStyle(e,null).getPropertyValue(t)}function Tv(e){return function(){delete this[e]}}function Iv(e,t){return function(){this[e]=t}}function Rv(e,t){return function(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}}function Lv(e,t){return arguments.length>1?this.each((t==null?Tv:typeof t=="function"?Rv:Iv)(e,t)):this.node()[e]}function wg(e){return e.trim().split(/^|\s+/)}function tc(e){return e.classList||new Sg(e)}function Sg(e){this._node=e,this._names=wg(e.getAttribute("class")||"")}Sg.prototype={add:function(e){var t=this._names.indexOf(e);t<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var t=this._names.indexOf(e);t>=0&&(this._names.splice(t,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function kg(e,t){for(var n=tc(e),r=-1,o=t.length;++r=0&&(n=t.slice(r+1),t=t.slice(0,r)),{type:t,name:n}})}function uw(e){return function(){var t=this.__on;if(t){for(var n=0,r=-1,o=t.length,i;n()=>e;function Wa(e,{sourceEvent:t,subject:n,target:r,identifier:o,active:i,x:s,y:l,dx:a,dy:u,dispatch:p}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},identifier:{value:o,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:l,enumerable:!0,configurable:!0},dx:{value:a,enumerable:!0,configurable:!0},dy:{value:u,enumerable:!0,configurable:!0},_:{value:p}})}Wa.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};function vw(e){return!e.ctrlKey&&!e.button}function ww(){return this.parentNode}function Sw(e,t){return t??{x:e.x,y:e.y}}function kw(){return navigator.maxTouchPoints||"ontouchstart"in this}function jg(){var e=vw,t=ww,n=Sw,r=kw,o={},i=Vs("start","drag","end"),s=0,l,a,u,p,c=0;function d(v){v.on("mousedown.drag",x).filter(r).on("touchstart.drag",_).on("touchmove.drag",m,xw).on("touchend.drag touchcancel.drag",g).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function x(v,S){if(!(p||!e.call(this,v,S))){var k=h(this,t.call(this,v,S),v,S,"mouse");k&&(We(v.view).on("mousemove.drag",y,jo).on("mouseup.drag",w,jo),bg(v.view),Pl(v),u=!1,l=v.clientX,a=v.clientY,k("start",v))}}function y(v){if(ur(v),!u){var S=v.clientX-l,k=v.clientY-a;u=S*S+k*k>c}o.mouse("drag",v)}function w(v){We(v.view).on("mousemove.drag mouseup.drag",null),Ng(v.view,u),ur(v),o.mouse("end",v)}function _(v,S){if(e.call(this,v,S)){var k=v.changedTouches,C=t.call(this,v,S),j=k.length,I,A;for(I=0;I>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):n===8?gi(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):n===4?gi(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=Ew.exec(e))?new Oe(t[1],t[2],t[3],1):(t=Cw.exec(e))?new Oe(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=bw.exec(e))?gi(t[1],t[2],t[3],t[4]):(t=Nw.exec(e))?gi(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=jw.exec(e))?Ud(t[1],t[2]/100,t[3]/100,1):(t=Mw.exec(e))?Ud(t[1],t[2]/100,t[3]/100,t[4]):Od.hasOwnProperty(e)?Hd(Od[e]):e==="transparent"?new Oe(NaN,NaN,NaN,0):null}function Hd(e){return new Oe(e>>16&255,e>>8&255,e&255,1)}function gi(e,t,n,r){return r<=0&&(e=t=n=NaN),new Oe(e,t,n,r)}function Tw(e){return e instanceof Wo||(e=Tn(e)),e?(e=e.rgb(),new Oe(e.r,e.g,e.b,e.opacity)):new Oe}function Ua(e,t,n,r){return arguments.length===1?Tw(e):new Oe(e,t,n,r??1)}function Oe(e,t,n,r){this.r=+e,this.g=+t,this.b=+n,this.opacity=+r}nc(Oe,Ua,Mg(Wo,{brighter(e){return e=e==null?ys:Math.pow(ys,e),new Oe(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?Mo:Math.pow(Mo,e),new Oe(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Oe(Cn(this.r),Cn(this.g),Cn(this.b),xs(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Vd,formatHex:Vd,formatHex8:Iw,formatRgb:Wd,toString:Wd}));function Vd(){return`#${kn(this.r)}${kn(this.g)}${kn(this.b)}`}function Iw(){return`#${kn(this.r)}${kn(this.g)}${kn(this.b)}${kn((isNaN(this.opacity)?1:this.opacity)*255)}`}function Wd(){const e=xs(this.opacity);return`${e===1?"rgb(":"rgba("}${Cn(this.r)}, ${Cn(this.g)}, ${Cn(this.b)}${e===1?")":`, ${e})`}`}function xs(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function Cn(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function kn(e){return e=Cn(e),(e<16?"0":"")+e.toString(16)}function Ud(e,t,n,r){return r<=0?e=t=n=NaN:n<=0||n>=1?e=t=NaN:t<=0&&(e=NaN),new ut(e,t,n,r)}function zg(e){if(e instanceof ut)return new ut(e.h,e.s,e.l,e.opacity);if(e instanceof Wo||(e=Tn(e)),!e)return new ut;if(e instanceof ut)return e;e=e.rgb();var t=e.r/255,n=e.g/255,r=e.b/255,o=Math.min(t,n,r),i=Math.max(t,n,r),s=NaN,l=i-o,a=(i+o)/2;return l?(t===i?s=(n-r)/l+(n0&&a<1?0:s,new ut(s,l,a,e.opacity)}function Rw(e,t,n,r){return arguments.length===1?zg(e):new ut(e,t,n,r??1)}function ut(e,t,n,r){this.h=+e,this.s=+t,this.l=+n,this.opacity=+r}nc(ut,Rw,Mg(Wo,{brighter(e){return e=e==null?ys:Math.pow(ys,e),new ut(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?Mo:Math.pow(Mo,e),new ut(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*t,o=2*n-r;return new Oe(Tl(e>=240?e-240:e+120,o,r),Tl(e,o,r),Tl(e<120?e+240:e-120,o,r),this.opacity)},clamp(){return new ut(Yd(this.h),mi(this.s),mi(this.l),xs(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=xs(this.opacity);return`${e===1?"hsl(":"hsla("}${Yd(this.h)}, ${mi(this.s)*100}%, ${mi(this.l)*100}%${e===1?")":`, ${e})`}`}}));function Yd(e){return e=(e||0)%360,e<0?e+360:e}function mi(e){return Math.max(0,Math.min(1,e||0))}function Tl(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}const rc=e=>()=>e;function Lw(e,t){return function(n){return e+n*t}}function Aw(e,t,n){return e=Math.pow(e,n),t=Math.pow(t,n)-e,n=1/n,function(r){return Math.pow(e+r*t,n)}}function $w(e){return(e=+e)==1?Pg:function(t,n){return n-t?Aw(t,n,e):rc(isNaN(t)?n:t)}}function Pg(e,t){var n=t-e;return n?Lw(e,n):rc(isNaN(e)?t:e)}const vs=function e(t){var n=$w(t);function r(o,i){var s=n((o=Ua(o)).r,(i=Ua(i)).r),l=n(o.g,i.g),a=n(o.b,i.b),u=Pg(o.opacity,i.opacity);return function(p){return o.r=s(p),o.g=l(p),o.b=a(p),o.opacity=u(p),o+""}}return r.gamma=e,r}(1);function Dw(e,t){t||(t=[]);var n=e?Math.min(t.length,e.length):0,r=t.slice(),o;return function(i){for(o=0;on&&(i=t.slice(n,i),l[s]?l[s]+=i:l[++s]=i),(r=r[0])===(o=o[0])?l[s]?l[s]+=o:l[++s]=o:(l[++s]=null,a.push({i:s,x:St(r,o)})),n=Il.lastIndex;return n180?p+=360:p-u>180&&(u+=360),d.push({i:c.push(o(c)+"rotate(",null,r)-2,x:St(u,p)})):p&&c.push(o(c)+"rotate("+p+r)}function l(u,p,c,d){u!==p?d.push({i:c.push(o(c)+"skewX(",null,r)-2,x:St(u,p)}):p&&c.push(o(c)+"skewX("+p+r)}function a(u,p,c,d,x,y){if(u!==c||p!==d){var w=x.push(o(x)+"scale(",null,",",null,")");y.push({i:w-4,x:St(u,c)},{i:w-2,x:St(p,d)})}else(c!==1||d!==1)&&x.push(o(x)+"scale("+c+","+d+")")}return function(u,p){var c=[],d=[];return u=e(u),p=e(p),i(u.translateX,u.translateY,p.translateX,p.translateY,c,d),s(u.rotate,p.rotate,c,d),l(u.skewX,p.skewX,c,d),a(u.scaleX,u.scaleY,p.scaleX,p.scaleY,c,d),u=p=null,function(x){for(var y=-1,w=d.length,_;++y=0&&e._call.call(void 0,t),e=e._next;--vr}function Gd(){In=(Ss=Po.now())+Us,vr=qr=0;try{Jw()}finally{vr=0,t2(),In=0}}function e2(){var e=Po.now(),t=e-Ss;t>Lg&&(Us-=t,Ss=e)}function t2(){for(var e,t=ws,n,r=1/0;t;)t._call?(r>t._time&&(r=t._time),e=t,t=t._next):(n=t._next,t._next=null,t=e?e._next=n:ws=n);Zr=e,Qa(r)}function Qa(e){if(!vr){qr&&(qr=clearTimeout(qr));var t=e-In;t>24?(e<1/0&&(qr=setTimeout(Gd,e-Po.now()-Us)),Fr&&(Fr=clearInterval(Fr))):(Fr||(Ss=Po.now(),Fr=setInterval(e2,Lg)),vr=1,Ag(Gd))}}function Kd(e,t,n){var r=new ks;return t=t==null?0:+t,r.restart(o=>{r.stop(),e(o+t)},t,n),r}var n2=Vs("start","end","cancel","interrupt"),r2=[],Dg=0,qd=1,Ga=2,Vi=3,Zd=4,Ka=5,Wi=6;function Ys(e,t,n,r,o,i){var s=e.__transition;if(!s)e.__transition={};else if(n in s)return;o2(e,n,{name:t,index:r,group:o,on:n2,tween:r2,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:Dg})}function ic(e,t){var n=gt(e,t);if(n.state>Dg)throw new Error("too late; already scheduled");return n}function Nt(e,t){var n=gt(e,t);if(n.state>Vi)throw new Error("too late; already running");return n}function gt(e,t){var n=e.__transition;if(!n||!(n=n[t]))throw new Error("transition not found");return n}function o2(e,t,n){var r=e.__transition,o;r[t]=n,n.timer=$g(i,0,n.time);function i(u){n.state=qd,n.timer.restart(s,n.delay,n.time),n.delay<=u&&s(u-n.delay)}function s(u){var p,c,d,x;if(n.state!==qd)return a();for(p in r)if(x=r[p],x.name===n.name){if(x.state===Vi)return Kd(s);x.state===Zd?(x.state=Wi,x.timer.stop(),x.on.call("interrupt",e,e.__data__,x.index,x.group),delete r[p]):+pGa&&r.state=0&&(t=t.slice(0,n)),!t||t==="start"})}function R2(e,t,n){var r,o,i=I2(t)?ic:Nt;return function(){var s=i(this,e),l=s.on;l!==r&&(o=(r=l).copy()).on(t,n),s.on=o}}function L2(e,t){var n=this._id;return arguments.length<2?gt(this.node(),n).on.on(e):this.each(R2(n,e,t))}function A2(e){return function(){var t=this.parentNode;for(var n in this.__transition)if(+n!==e)return;t&&t.removeChild(this)}}function $2(){return this.on("end.remove",A2(this._id))}function D2(e){var t=this._name,n=this._id;typeof e!="function"&&(e=ec(e));for(var r=this._groups,o=r.length,i=new Array(o),s=0;s()=>e;function uS(e,{sourceEvent:t,target:n,transform:r,dispatch:o}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:r,enumerable:!0,configurable:!0},_:{value:o}})}function Rt(e,t,n){this.k=e,this.x=t,this.y=n}Rt.prototype={constructor:Rt,scale:function(e){return e===1?this:new Rt(this.k*e,this.x,this.y)},translate:function(e,t){return e===0&t===0?this:new Rt(this.k,this.x+this.k*e,this.y+this.k*t)},apply:function(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function(e){return e*this.k+this.x},applyY:function(e){return e*this.k+this.y},invert:function(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function(e){return(e-this.x)/this.k},invertY:function(e){return(e-this.y)/this.k},rescaleX:function(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var Xs=new Rt(1,0,0);Hg.prototype=Rt.prototype;function Hg(e){for(;!e.__zoom;)if(!(e=e.parentNode))return Xs;return e.__zoom}function Rl(e){e.stopImmediatePropagation()}function Hr(e){e.preventDefault(),e.stopImmediatePropagation()}function cS(e){return(!e.ctrlKey||e.type==="wheel")&&!e.button}function dS(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGElement||e,e.hasAttribute("viewBox")?(e=e.viewBox.baseVal,[[e.x,e.y],[e.x+e.width,e.y+e.height]]):[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]):[[0,0],[e.clientWidth,e.clientHeight]]}function Jd(){return this.__zoom||Xs}function fS(e){return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*(e.ctrlKey?10:1)}function pS(){return navigator.maxTouchPoints||"ontouchstart"in this}function hS(e,t,n){var r=e.invertX(t[0][0])-n[0][0],o=e.invertX(t[1][0])-n[1][0],i=e.invertY(t[0][1])-n[0][1],s=e.invertY(t[1][1])-n[1][1];return e.translate(o>r?(r+o)/2:Math.min(0,r)||Math.max(0,o),s>i?(i+s)/2:Math.min(0,i)||Math.max(0,s))}function Vg(){var e=cS,t=dS,n=hS,r=fS,o=pS,i=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],l=250,a=Hi,u=Vs("start","zoom","end"),p,c,d,x=500,y=150,w=0,_=10;function m(E){E.property("__zoom",Jd).on("wheel.zoom",j,{passive:!1}).on("mousedown.zoom",I).on("dblclick.zoom",A).filter(o).on("touchstart.zoom",z).on("touchmove.zoom",D).on("touchend.zoom touchcancel.zoom",R).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}m.transform=function(E,T,P,L){var b=E.selection?E.selection():E;b.property("__zoom",Jd),E!==b?S(E,T,P,L):b.interrupt().each(function(){k(this,arguments).event(L).start().zoom(null,typeof T=="function"?T.apply(this,arguments):T).end()})},m.scaleBy=function(E,T,P,L){m.scaleTo(E,function(){var b=this.__zoom.k,N=typeof T=="function"?T.apply(this,arguments):T;return b*N},P,L)},m.scaleTo=function(E,T,P,L){m.transform(E,function(){var b=t.apply(this,arguments),N=this.__zoom,$=P==null?v(b):typeof P=="function"?P.apply(this,arguments):P,O=N.invert($),B=typeof T=="function"?T.apply(this,arguments):T;return n(h(g(N,B),$,O),b,s)},P,L)},m.translateBy=function(E,T,P,L){m.transform(E,function(){return n(this.__zoom.translate(typeof T=="function"?T.apply(this,arguments):T,typeof P=="function"?P.apply(this,arguments):P),t.apply(this,arguments),s)},null,L)},m.translateTo=function(E,T,P,L,b){m.transform(E,function(){var N=t.apply(this,arguments),$=this.__zoom,O=L==null?v(N):typeof L=="function"?L.apply(this,arguments):L;return n(Xs.translate(O[0],O[1]).scale($.k).translate(typeof T=="function"?-T.apply(this,arguments):-T,typeof P=="function"?-P.apply(this,arguments):-P),N,s)},L,b)};function g(E,T){return T=Math.max(i[0],Math.min(i[1],T)),T===E.k?E:new Rt(T,E.x,E.y)}function h(E,T,P){var L=T[0]-P[0]*E.k,b=T[1]-P[1]*E.k;return L===E.x&&b===E.y?E:new Rt(E.k,L,b)}function v(E){return[(+E[0][0]+ +E[1][0])/2,(+E[0][1]+ +E[1][1])/2]}function S(E,T,P,L){E.on("start.zoom",function(){k(this,arguments).event(L).start()}).on("interrupt.zoom end.zoom",function(){k(this,arguments).event(L).end()}).tween("zoom",function(){var b=this,N=arguments,$=k(b,N).event(L),O=t.apply(b,N),B=P==null?v(O):typeof P=="function"?P.apply(b,N):P,W=Math.max(O[1][0]-O[0][0],O[1][1]-O[0][1]),V=b.__zoom,Y=typeof T=="function"?T.apply(b,N):T,X=a(V.invert(B).concat(W/V.k),Y.invert(B).concat(W/Y.k));return function(Q){if(Q===1)Q=Y;else{var H=X(Q),K=W/H[2];Q=new Rt(K,B[0]-H[0]*K,B[1]-H[1]*K)}$.zoom(null,Q)}})}function k(E,T,P){return!P&&E.__zooming||new C(E,T)}function C(E,T){this.that=E,this.args=T,this.active=0,this.sourceEvent=null,this.extent=t.apply(E,T),this.taps=0}C.prototype={event:function(E){return E&&(this.sourceEvent=E),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(E,T){return this.mouse&&E!=="mouse"&&(this.mouse[1]=T.invert(this.mouse[0])),this.touch0&&E!=="touch"&&(this.touch0[1]=T.invert(this.touch0[0])),this.touch1&&E!=="touch"&&(this.touch1[1]=T.invert(this.touch1[0])),this.that.__zoom=T,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(E){var T=We(this.that).datum();u.call(E,this.that,new uS(E,{sourceEvent:this.sourceEvent,target:m,transform:this.that.__zoom,dispatch:u}),T)}};function j(E,...T){if(!e.apply(this,arguments))return;var P=k(this,T).event(E),L=this.__zoom,b=Math.max(i[0],Math.min(i[1],L.k*Math.pow(2,r.apply(this,arguments)))),N=lt(E);if(P.wheel)(P.mouse[0][0]!==N[0]||P.mouse[0][1]!==N[1])&&(P.mouse[1]=L.invert(P.mouse[0]=N)),clearTimeout(P.wheel);else{if(L.k===b)return;P.mouse=[N,L.invert(N)],Ui(this),P.start()}Hr(E),P.wheel=setTimeout($,y),P.zoom("mouse",n(h(g(L,b),P.mouse[0],P.mouse[1]),P.extent,s));function $(){P.wheel=null,P.end()}}function I(E,...T){if(d||!e.apply(this,arguments))return;var P=E.currentTarget,L=k(this,T,!0).event(E),b=We(E.view).on("mousemove.zoom",B,!0).on("mouseup.zoom",W,!0),N=lt(E,P),$=E.clientX,O=E.clientY;bg(E.view),Rl(E),L.mouse=[N,this.__zoom.invert(N)],Ui(this),L.start();function B(V){if(Hr(V),!L.moved){var Y=V.clientX-$,X=V.clientY-O;L.moved=Y*Y+X*X>w}L.event(V).zoom("mouse",n(h(L.that.__zoom,L.mouse[0]=lt(V,P),L.mouse[1]),L.extent,s))}function W(V){b.on("mousemove.zoom mouseup.zoom",null),Ng(V.view,L.moved),Hr(V),L.event(V).end()}}function A(E,...T){if(e.apply(this,arguments)){var P=this.__zoom,L=lt(E.changedTouches?E.changedTouches[0]:E,this),b=P.invert(L),N=P.k*(E.shiftKey?.5:2),$=n(h(g(P,N),L,b),t.apply(this,T),s);Hr(E),l>0?We(this).transition().duration(l).call(S,$,L,E):We(this).call(m.transform,$,L,E)}}function z(E,...T){if(e.apply(this,arguments)){var P=E.touches,L=P.length,b=k(this,T,E.changedTouches.length===L).event(E),N,$,O,B;for(Rl(E),$=0;$"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:e=>`Node type "${e}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:e=>`The old edge with id=${e} does not exist.`,error009:e=>`Marker type "${e}" doesn't exist.`,error008:(e,{id:t,sourceHandle:n,targetHandle:r})=>`Couldn't create edge for ${e} handle id: "${e==="source"?n:r}", edge id: ${t}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:e=>`Edge type "${e}" not found. Using fallback type "default".`,error012:e=>`Node with id "${e}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(e="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${e}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs."},To=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],Wg=["Enter"," ","Escape"],Ug={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:e,x:t,y:n})=>`Moved selected node ${e}. New position, x: ${t}, y: ${n}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var wr;(function(e){e.Strict="strict",e.Loose="loose"})(wr||(wr={}));var bn;(function(e){e.Free="free",e.Vertical="vertical",e.Horizontal="horizontal"})(bn||(bn={}));var Io;(function(e){e.Partial="partial",e.Full="full"})(Io||(Io={}));const Yg={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var qt;(function(e){e.Bezier="default",e.Straight="straight",e.Step="step",e.SmoothStep="smoothstep",e.SimpleBezier="simplebezier"})(qt||(qt={}));var _s;(function(e){e.Arrow="arrow",e.ArrowClosed="arrowclosed"})(_s||(_s={}));var Z;(function(e){e.Left="left",e.Top="top",e.Right="right",e.Bottom="bottom"})(Z||(Z={}));const ef={[Z.Left]:Z.Right,[Z.Right]:Z.Left,[Z.Top]:Z.Bottom,[Z.Bottom]:Z.Top};function Xg(e){return e===null?null:e?"valid":"invalid"}const Qg=e=>"id"in e&&"source"in e&&"target"in e,gS=e=>"id"in e&&"position"in e&&!("source"in e)&&!("target"in e),lc=e=>"id"in e&&"internals"in e&&!("source"in e)&&!("target"in e),Uo=(e,t=[0,0])=>{const{width:n,height:r}=Ht(e),o=e.origin??t,i=n*o[0],s=r*o[1];return{x:e.position.x-i,y:e.position.y-s}},mS=(e,t={nodeOrigin:[0,0]})=>{if(e.length===0)return{x:0,y:0,width:0,height:0};const n=e.reduce((r,o)=>{const i=typeof o=="string";let s=!t.nodeLookup&&!i?o:void 0;t.nodeLookup&&(s=i?t.nodeLookup.get(o):lc(o)?o:t.nodeLookup.get(o.id));const l=s?Es(s,t.nodeOrigin):{x:0,y:0,x2:0,y2:0};return Qs(r,l)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return Gs(n)},Yo=(e,t={})=>{let n={x:1/0,y:1/0,x2:-1/0,y2:-1/0},r=!1;return e.forEach(o=>{(t.filter===void 0||t.filter(o))&&(n=Qs(n,Es(o)),r=!0)}),r?Gs(n):{x:0,y:0,width:0,height:0}},ac=(e,t,[n,r,o]=[0,0,1],i=!1,s=!1)=>{const l={...Qo(t,[n,r,o]),width:t.width/o,height:t.height/o},a=[];for(const u of e.values()){const{measured:p,selectable:c=!0,hidden:d=!1}=u;if(s&&!c||d)continue;const x=p.width??u.width??u.initialWidth??null,y=p.height??u.height??u.initialHeight??null,w=Ro(l,kr(u)),_=(x??0)*(y??0),m=i&&w>0;(!u.internals.handleBounds||m||w>=_||u.dragging)&&a.push(u)}return a},yS=(e,t)=>{const n=new Set;return e.forEach(r=>{n.add(r.id)}),t.filter(r=>n.has(r.source)||n.has(r.target))};function xS(e,t){const n=new Map,r=t!=null&&t.nodes?new Set(t.nodes.map(o=>o.id)):null;return e.forEach(o=>{o.measured.width&&o.measured.height&&((t==null?void 0:t.includeHiddenNodes)||!o.hidden)&&(!r||r.has(o.id))&&n.set(o.id,o)}),n}async function vS({nodes:e,width:t,height:n,panZoom:r,minZoom:o,maxZoom:i},s){if(e.size===0)return Promise.resolve(!0);const l=xS(e,s),a=Yo(l),u=uc(a,t,n,(s==null?void 0:s.minZoom)??o,(s==null?void 0:s.maxZoom)??i,(s==null?void 0:s.padding)??.1);return await r.setViewport(u,{duration:s==null?void 0:s.duration,ease:s==null?void 0:s.ease,interpolate:s==null?void 0:s.interpolate}),Promise.resolve(!0)}function Gg({nodeId:e,nextPosition:t,nodeLookup:n,nodeOrigin:r=[0,0],nodeExtent:o,onError:i}){const s=n.get(e),l=s.parentId?n.get(s.parentId):void 0,{x:a,y:u}=l?l.internals.positionAbsolute:{x:0,y:0},p=s.origin??r;let c=s.extent||o;if(s.extent==="parent"&&!s.expandParent)if(!l)i==null||i("005",bt.error005());else{const x=l.measured.width,y=l.measured.height;x&&y&&(c=[[a,u],[a+x,u+y]])}else l&&_r(s.extent)&&(c=[[s.extent[0][0]+a,s.extent[0][1]+u],[s.extent[1][0]+a,s.extent[1][1]+u]]);const d=_r(c)?Rn(t,c,s.measured):t;return(s.measured.width===void 0||s.measured.height===void 0)&&(i==null||i("015",bt.error015())),{position:{x:d.x-a+(s.measured.width??0)*p[0],y:d.y-u+(s.measured.height??0)*p[1]},positionAbsolute:d}}async function wS({nodesToRemove:e=[],edgesToRemove:t=[],nodes:n,edges:r,onBeforeDelete:o}){const i=new Set(e.map(d=>d.id)),s=[];for(const d of n){if(d.deletable===!1)continue;const x=i.has(d.id),y=!x&&d.parentId&&s.find(w=>w.id===d.parentId);(x||y)&&s.push(d)}const l=new Set(t.map(d=>d.id)),a=r.filter(d=>d.deletable!==!1),p=yS(s,a);for(const d of a)l.has(d.id)&&!p.find(y=>y.id===d.id)&&p.push(d);if(!o)return{edges:p,nodes:s};const c=await o({nodes:s,edges:p});return typeof c=="boolean"?c?{edges:p,nodes:s}:{edges:[],nodes:[]}:c}const Sr=(e,t=0,n=1)=>Math.min(Math.max(e,t),n),Rn=(e={x:0,y:0},t,n)=>({x:Sr(e.x,t[0][0],t[1][0]-((n==null?void 0:n.width)??0)),y:Sr(e.y,t[0][1],t[1][1]-((n==null?void 0:n.height)??0))});function Kg(e,t,n){const{width:r,height:o}=Ht(n),{x:i,y:s}=n.internals.positionAbsolute;return Rn(e,[[i,s],[i+r,s+o]],t)}const tf=(e,t,n)=>en?-Sr(Math.abs(e-n),1,t)/t:0,qg=(e,t,n=15,r=40)=>{const o=tf(e.x,r,t.width-r)*n,i=tf(e.y,r,t.height-r)*n;return[o,i]},Qs=(e,t)=>({x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),x2:Math.max(e.x2,t.x2),y2:Math.max(e.y2,t.y2)}),qa=({x:e,y:t,width:n,height:r})=>({x:e,y:t,x2:e+n,y2:t+r}),Gs=({x:e,y:t,x2:n,y2:r})=>({x:e,y:t,width:n-e,height:r-t}),kr=(e,t=[0,0])=>{var o,i;const{x:n,y:r}=lc(e)?e.internals.positionAbsolute:Uo(e,t);return{x:n,y:r,width:((o=e.measured)==null?void 0:o.width)??e.width??e.initialWidth??0,height:((i=e.measured)==null?void 0:i.height)??e.height??e.initialHeight??0}},Es=(e,t=[0,0])=>{var o,i;const{x:n,y:r}=lc(e)?e.internals.positionAbsolute:Uo(e,t);return{x:n,y:r,x2:n+(((o=e.measured)==null?void 0:o.width)??e.width??e.initialWidth??0),y2:r+(((i=e.measured)==null?void 0:i.height)??e.height??e.initialHeight??0)}},Zg=(e,t)=>Gs(Qs(qa(e),qa(t))),Ro=(e,t)=>{const n=Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x)),r=Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y));return Math.ceil(n*r)},nf=e=>ct(e.width)&&ct(e.height)&&ct(e.x)&&ct(e.y),ct=e=>!isNaN(e)&&isFinite(e),SS=(e,t)=>{},Xo=(e,t=[1,1])=>({x:t[0]*Math.round(e.x/t[0]),y:t[1]*Math.round(e.y/t[1])}),Qo=({x:e,y:t},[n,r,o],i=!1,s=[1,1])=>{const l={x:(e-n)/o,y:(t-r)/o};return i?Xo(l,s):l},Cs=({x:e,y:t},[n,r,o])=>({x:e*o+n,y:t*o+r});function Fn(e,t){if(typeof e=="number")return Math.floor((t-t/(1+e))*.5);if(typeof e=="string"&&e.endsWith("px")){const n=parseFloat(e);if(!Number.isNaN(n))return Math.floor(n)}if(typeof e=="string"&&e.endsWith("%")){const n=parseFloat(e);if(!Number.isNaN(n))return Math.floor(t*n*.01)}return console.error(`[React Flow] The padding value "${e}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function kS(e,t,n){if(typeof e=="string"||typeof e=="number"){const r=Fn(e,n),o=Fn(e,t);return{top:r,right:o,bottom:r,left:o,x:o*2,y:r*2}}if(typeof e=="object"){const r=Fn(e.top??e.y??0,n),o=Fn(e.bottom??e.y??0,n),i=Fn(e.left??e.x??0,t),s=Fn(e.right??e.x??0,t);return{top:r,right:s,bottom:o,left:i,x:i+s,y:r+o}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function _S(e,t,n,r,o,i){const{x:s,y:l}=Cs(e,[t,n,r]),{x:a,y:u}=Cs({x:e.x+e.width,y:e.y+e.height},[t,n,r]),p=o-a,c=i-u;return{left:Math.floor(s),top:Math.floor(l),right:Math.floor(p),bottom:Math.floor(c)}}const uc=(e,t,n,r,o,i)=>{const s=kS(i,t,n),l=(t-s.x)/e.width,a=(n-s.y)/e.height,u=Math.min(l,a),p=Sr(u,r,o),c=e.x+e.width/2,d=e.y+e.height/2,x=t/2-c*p,y=n/2-d*p,w=_S(e,x,y,p,t,n),_={left:Math.min(w.left-s.left,0),top:Math.min(w.top-s.top,0),right:Math.min(w.right-s.right,0),bottom:Math.min(w.bottom-s.bottom,0)};return{x:x-_.left+_.right,y:y-_.top+_.bottom,zoom:p}},Lo=()=>{var e;return typeof navigator<"u"&&((e=navigator==null?void 0:navigator.userAgent)==null?void 0:e.indexOf("Mac"))>=0};function _r(e){return e!=null&&e!=="parent"}function Ht(e){var t,n;return{width:((t=e.measured)==null?void 0:t.width)??e.width??e.initialWidth??0,height:((n=e.measured)==null?void 0:n.height)??e.height??e.initialHeight??0}}function Jg(e){var t,n;return(((t=e.measured)==null?void 0:t.width)??e.width??e.initialWidth)!==void 0&&(((n=e.measured)==null?void 0:n.height)??e.height??e.initialHeight)!==void 0}function e0(e,t={width:0,height:0},n,r,o){const i={...e},s=r.get(n);if(s){const l=s.origin||o;i.x+=s.internals.positionAbsolute.x-(t.width??0)*l[0],i.y+=s.internals.positionAbsolute.y-(t.height??0)*l[1]}return i}function rf(e,t){if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0}function ES(){let e,t;return{promise:new Promise((r,o)=>{e=r,t=o}),resolve:e,reject:t}}function CS(e){return{...Ug,...e||{}}}function uo(e,{snapGrid:t=[0,0],snapToGrid:n=!1,transform:r,containerBounds:o}){const{x:i,y:s}=dt(e),l=Qo({x:i-((o==null?void 0:o.left)??0),y:s-((o==null?void 0:o.top)??0)},r),{x:a,y:u}=n?Xo(l,t):l;return{xSnapped:a,ySnapped:u,...l}}const cc=e=>({width:e.offsetWidth,height:e.offsetHeight}),t0=e=>{var t;return((t=e==null?void 0:e.getRootNode)==null?void 0:t.call(e))||(window==null?void 0:window.document)},bS=["INPUT","SELECT","TEXTAREA"];function n0(e){var r,o;const t=((o=(r=e.composedPath)==null?void 0:r.call(e))==null?void 0:o[0])||e.target;return(t==null?void 0:t.nodeType)!==1?!1:bS.includes(t.nodeName)||t.hasAttribute("contenteditable")||!!t.closest(".nokey")}const r0=e=>"clientX"in e,dt=(e,t)=>{var i,s;const n=r0(e),r=n?e.clientX:(i=e.touches)==null?void 0:i[0].clientX,o=n?e.clientY:(s=e.touches)==null?void 0:s[0].clientY;return{x:r-((t==null?void 0:t.left)??0),y:o-((t==null?void 0:t.top)??0)}},of=(e,t,n,r,o)=>{const i=t.querySelectorAll(`.${e}`);return!i||!i.length?null:Array.from(i).map(s=>{const l=s.getBoundingClientRect();return{id:s.getAttribute("data-handleid"),type:e,nodeId:o,position:s.getAttribute("data-handlepos"),x:(l.left-n.left)/r,y:(l.top-n.top)/r,...cc(s)}})};function o0({sourceX:e,sourceY:t,targetX:n,targetY:r,sourceControlX:o,sourceControlY:i,targetControlX:s,targetControlY:l}){const a=e*.125+o*.375+s*.375+n*.125,u=t*.125+i*.375+l*.375+r*.125,p=Math.abs(a-e),c=Math.abs(u-t);return[a,u,p,c]}function vi(e,t){return e>=0?.5*e:t*25*Math.sqrt(-e)}function sf({pos:e,x1:t,y1:n,x2:r,y2:o,c:i}){switch(e){case Z.Left:return[t-vi(t-r,i),n];case Z.Right:return[t+vi(r-t,i),n];case Z.Top:return[t,n-vi(n-o,i)];case Z.Bottom:return[t,n+vi(o-n,i)]}}function i0({sourceX:e,sourceY:t,sourcePosition:n=Z.Bottom,targetX:r,targetY:o,targetPosition:i=Z.Top,curvature:s=.25}){const[l,a]=sf({pos:n,x1:e,y1:t,x2:r,y2:o,c:s}),[u,p]=sf({pos:i,x1:r,y1:o,x2:e,y2:t,c:s}),[c,d,x,y]=o0({sourceX:e,sourceY:t,targetX:r,targetY:o,sourceControlX:l,sourceControlY:a,targetControlX:u,targetControlY:p});return[`M${e},${t} C${l},${a} ${u},${p} ${r},${o}`,c,d,x,y]}function s0({sourceX:e,sourceY:t,targetX:n,targetY:r}){const o=Math.abs(n-e)/2,i=n0}const MS=({source:e,sourceHandle:t,target:n,targetHandle:r})=>`xy-edge__${e}${t||""}-${n}${r||""}`,zS=(e,t)=>t.some(n=>n.source===e.source&&n.target===e.target&&(n.sourceHandle===e.sourceHandle||!n.sourceHandle&&!e.sourceHandle)&&(n.targetHandle===e.targetHandle||!n.targetHandle&&!e.targetHandle)),PS=(e,t,n={})=>{if(!e.source||!e.target)return t;const r=n.getEdgeId||MS;let o;return Qg(e)?o={...e}:o={...e,id:r(e)},zS(o,t)?t:(o.sourceHandle===null&&delete o.sourceHandle,o.targetHandle===null&&delete o.targetHandle,t.concat(o))};function l0({sourceX:e,sourceY:t,targetX:n,targetY:r}){const[o,i,s,l]=s0({sourceX:e,sourceY:t,targetX:n,targetY:r});return[`M ${e},${t}L ${n},${r}`,o,i,s,l]}const lf={[Z.Left]:{x:-1,y:0},[Z.Right]:{x:1,y:0},[Z.Top]:{x:0,y:-1},[Z.Bottom]:{x:0,y:1}},TS=({source:e,sourcePosition:t=Z.Bottom,target:n})=>t===Z.Left||t===Z.Right?e.xMath.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2));function IS({source:e,sourcePosition:t=Z.Bottom,target:n,targetPosition:r=Z.Top,center:o,offset:i,stepPosition:s}){const l=lf[t],a=lf[r],u={x:e.x+l.x*i,y:e.y+l.y*i},p={x:n.x+a.x*i,y:n.y+a.y*i},c=TS({source:u,sourcePosition:t,target:p}),d=c.x!==0?"x":"y",x=c[d];let y=[],w,_;const m={x:0,y:0},g={x:0,y:0},[,,h,v]=s0({sourceX:e.x,sourceY:e.y,targetX:n.x,targetY:n.y});if(l[d]*a[d]===-1){d==="x"?(w=o.x??u.x+(p.x-u.x)*s,_=o.y??(u.y+p.y)/2):(w=o.x??(u.x+p.x)/2,_=o.y??u.y+(p.y-u.y)*s);const k=[{x:w,y:u.y},{x:w,y:p.y}],C=[{x:u.x,y:_},{x:p.x,y:_}];l[d]===x?y=d==="x"?k:C:y=d==="x"?C:k}else{const k=[{x:u.x,y:p.y}],C=[{x:p.x,y:u.y}];if(d==="x"?y=l.x===x?C:k:y=l.y===x?k:C,t===r){const D=Math.abs(e[d]-n[d]);if(D<=i){const R=Math.min(i-1,i-D);l[d]===x?m[d]=(u[d]>e[d]?-1:1)*R:g[d]=(p[d]>n[d]?-1:1)*R}}if(t!==r){const D=d==="x"?"y":"x",R=l[d]===a[D],E=u[D]>p[D],T=u[D]=z?(w=(j.x+I.x)/2,_=y[0].y):(w=y[0].x,_=(j.y+I.y)/2)}return[[e,{x:u.x+m.x,y:u.y+m.y},...y,{x:p.x+g.x,y:p.y+g.y},n],w,_,h,v]}function RS(e,t,n,r){const o=Math.min(af(e,t)/2,af(t,n)/2,r),{x:i,y:s}=t;if(e.x===i&&i===n.x||e.y===s&&s===n.y)return`L${i} ${s}`;if(e.y===s){const u=e.x{let v="";return h>0&&hn.id===t):e[0])||null}function Ja(e,t){return e?typeof e=="string"?e:`${t?`${t}__`:""}${Object.keys(e).sort().map(r=>`${r}=${e[r]}`).join("&")}`:""}function AS(e,{id:t,defaultColor:n,defaultMarkerStart:r,defaultMarkerEnd:o}){const i=new Set;return e.reduce((s,l)=>([l.markerStart||r,l.markerEnd||o].forEach(a=>{if(a&&typeof a=="object"){const u=Ja(a,t);i.has(u)||(s.push({id:u,color:a.color||n,...a}),i.add(u))}}),s),[]).sort((s,l)=>s.id.localeCompare(l.id))}const a0=1e3,$S=10,dc={nodeOrigin:[0,0],nodeExtent:To,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},DS={...dc,checkEquality:!0};function fc(e,t){const n={...e};for(const r in t)t[r]!==void 0&&(n[r]=t[r]);return n}function OS(e,t,n){const r=fc(dc,n);for(const o of e.values())if(o.parentId)hc(o,e,t,r);else{const i=Uo(o,r.nodeOrigin),s=_r(o.extent)?o.extent:r.nodeExtent,l=Rn(i,s,Ht(o));o.internals.positionAbsolute=l}}function BS(e,t){if(!e.handles)return e.measured?t==null?void 0:t.internals.handleBounds:void 0;const n=[],r=[];for(const o of e.handles){const i={id:o.id,width:o.width??1,height:o.height??1,nodeId:e.id,x:o.x,y:o.y,position:o.position,type:o.type};o.type==="source"?n.push(i):o.type==="target"&&r.push(i)}return{source:n,target:r}}function pc(e){return e==="manual"}function eu(e,t,n,r={}){var u,p;const o=fc(DS,r),i={i:0},s=new Map(t),l=o!=null&&o.elevateNodesOnSelect&&!pc(o.zIndexMode)?a0:0;let a=e.length>0;t.clear(),n.clear();for(const c of e){let d=s.get(c.id);if(o.checkEquality&&c===(d==null?void 0:d.internals.userNode))t.set(c.id,d);else{const x=Uo(c,o.nodeOrigin),y=_r(c.extent)?c.extent:o.nodeExtent,w=Rn(x,y,Ht(c));d={...o.defaults,...c,measured:{width:(u=c.measured)==null?void 0:u.width,height:(p=c.measured)==null?void 0:p.height},internals:{positionAbsolute:w,handleBounds:BS(c,d),z:u0(c,l,o.zIndexMode),userNode:c}},t.set(c.id,d)}(d.measured===void 0||d.measured.width===void 0||d.measured.height===void 0)&&!d.hidden&&(a=!1),c.parentId&&hc(d,t,n,r,i)}return a}function FS(e,t){if(!e.parentId)return;const n=t.get(e.parentId);n?n.set(e.id,e):t.set(e.parentId,new Map([[e.id,e]]))}function hc(e,t,n,r,o){const{elevateNodesOnSelect:i,nodeOrigin:s,nodeExtent:l,zIndexMode:a}=fc(dc,r),u=e.parentId,p=t.get(u);if(!p){console.warn(`Parent node ${u} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}FS(e,n),o&&!p.parentId&&p.internals.rootParentIndex===void 0&&a==="auto"&&(p.internals.rootParentIndex=++o.i,p.internals.z=p.internals.z+o.i*$S),o&&p.internals.rootParentIndex!==void 0&&(o.i=p.internals.rootParentIndex);const c=i&&!pc(a)?a0:0,{x:d,y:x,z:y}=HS(e,p,s,l,c,a),{positionAbsolute:w}=e.internals,_=d!==w.x||x!==w.y;(_||y!==e.internals.z)&&t.set(e.id,{...e,internals:{...e.internals,positionAbsolute:_?{x:d,y:x}:w,z:y}})}function u0(e,t,n){const r=ct(e.zIndex)?e.zIndex:0;return pc(n)?r:r+(e.selected?t:0)}function HS(e,t,n,r,o,i){const{x:s,y:l}=t.internals.positionAbsolute,a=Ht(e),u=Uo(e,n),p=_r(e.extent)?Rn(u,e.extent,a):u;let c=Rn({x:s+p.x,y:l+p.y},r,a);e.extent==="parent"&&(c=Kg(c,a,t));const d=u0(e,o,i),x=t.internals.z??0;return{x:c.x,y:c.y,z:x>=d?x+1:d}}function gc(e,t,n,r=[0,0]){var s;const o=[],i=new Map;for(const l of e){const a=t.get(l.parentId);if(!a)continue;const u=((s=i.get(l.parentId))==null?void 0:s.expandedRect)??kr(a),p=Zg(u,l.rect);i.set(l.parentId,{expandedRect:p,parent:a})}return i.size>0&&i.forEach(({expandedRect:l,parent:a},u)=>{var h;const p=a.internals.positionAbsolute,c=Ht(a),d=a.origin??r,x=l.x0||y>0||m||g)&&(o.push({id:u,type:"position",position:{x:a.position.x-x+m,y:a.position.y-y+g}}),(h=n.get(u))==null||h.forEach(v=>{e.some(S=>S.id===v.id)||o.push({id:v.id,type:"position",position:{x:v.position.x+x,y:v.position.y+y}})})),(c.width0){const x=gc(d,t,n,o);u.push(...x)}return{changes:u,updatedInternals:a}}async function WS({delta:e,panZoom:t,transform:n,translateExtent:r,width:o,height:i}){if(!t||!e.x&&!e.y)return Promise.resolve(!1);const s=await t.setViewportConstrained({x:n[0]+e.x,y:n[1]+e.y,zoom:n[2]},[[0,0],[o,i]],r),l=!!s&&(s.x!==n[0]||s.y!==n[1]||s.k!==n[2]);return Promise.resolve(l)}function ff(e,t,n,r,o,i){let s=o;const l=r.get(s)||new Map;r.set(s,l.set(n,t)),s=`${o}-${e}`;const a=r.get(s)||new Map;if(r.set(s,a.set(n,t)),i){s=`${o}-${e}-${i}`;const u=r.get(s)||new Map;r.set(s,u.set(n,t))}}function c0(e,t,n){e.clear(),t.clear();for(const r of n){const{source:o,target:i,sourceHandle:s=null,targetHandle:l=null}=r,a={edgeId:r.id,source:o,target:i,sourceHandle:s,targetHandle:l},u=`${o}-${s}--${i}-${l}`,p=`${i}-${l}--${o}-${s}`;ff("source",a,p,e,o,s),ff("target",a,u,e,i,l),t.set(r.id,r)}}function d0(e,t){if(!e.parentId)return!1;const n=t.get(e.parentId);return n?n.selected?!0:d0(n,t):!1}function pf(e,t,n){var o;let r=e;do{if((o=r==null?void 0:r.matches)!=null&&o.call(r,t))return!0;if(r===n)return!1;r=r==null?void 0:r.parentElement}while(r);return!1}function US(e,t,n,r){const o=new Map;for(const[i,s]of e)if((s.selected||s.id===r)&&(!s.parentId||!d0(s,e))&&(s.draggable||t&&typeof s.draggable>"u")){const l=e.get(i);l&&o.set(i,{id:i,position:l.position||{x:0,y:0},distance:{x:n.x-l.internals.positionAbsolute.x,y:n.y-l.internals.positionAbsolute.y},extent:l.extent,parentId:l.parentId,origin:l.origin,expandParent:l.expandParent,internals:{positionAbsolute:l.internals.positionAbsolute||{x:0,y:0}},measured:{width:l.measured.width??0,height:l.measured.height??0}})}return o}function Ll({nodeId:e,dragItems:t,nodeLookup:n,dragging:r=!0}){var s,l,a;const o=[];for(const[u,p]of t){const c=(s=n.get(u))==null?void 0:s.internals.userNode;c&&o.push({...c,position:p.position,dragging:r})}if(!e)return[o[0],o];const i=(l=n.get(e))==null?void 0:l.internals.userNode;return[i?{...i,position:((a=t.get(e))==null?void 0:a.position)||i.position,dragging:r}:o[0],o]}function YS({dragItems:e,snapGrid:t,x:n,y:r}){const o=e.values().next().value;if(!o)return null;const i={x:n-o.distance.x,y:r-o.distance.y},s=Xo(i,t);return{x:s.x-i.x,y:s.y-i.y}}function XS({onNodeMouseDown:e,getStoreItems:t,onDragStart:n,onDrag:r,onDragStop:o}){let i={x:null,y:null},s=0,l=new Map,a=!1,u={x:0,y:0},p=null,c=!1,d=null,x=!1,y=!1,w=null;function _({noDragClassName:g,handleSelector:h,domNode:v,isSelectable:S,nodeId:k,nodeClickDistance:C=0}){d=We(v);function j({x:D,y:R}){const{nodeLookup:E,nodeExtent:T,snapGrid:P,snapToGrid:L,nodeOrigin:b,onNodeDrag:N,onSelectionDrag:$,onError:O,updateNodePositions:B}=t();i={x:D,y:R};let W=!1;const V=l.size>1,Y=V&&T?qa(Yo(l)):null,X=V&&L?YS({dragItems:l,snapGrid:P,x:D,y:R}):null;for(const[Q,H]of l){if(!E.has(Q))continue;let K={x:D-H.distance.x,y:R-H.distance.y};L&&(K=X?{x:Math.round(K.x+X.x),y:Math.round(K.y+X.y)}:Xo(K,P));let ee=null;if(V&&T&&!H.extent&&Y){const{positionAbsolute:q}=H.internals,re=q.x-Y.x+T[0][0],le=q.x+H.measured.width-Y.x2+T[1][0],ie=q.y-Y.y+T[0][1],je=q.y+H.measured.height-Y.y2+T[1][1];ee=[[re,ie],[le,je]]}const{position:G,positionAbsolute:J}=Gg({nodeId:Q,nextPosition:K,nodeLookup:E,nodeExtent:ee||T,nodeOrigin:b,onError:O});W=W||H.position.x!==G.x||H.position.y!==G.y,H.position=G,H.internals.positionAbsolute=J}if(y=y||W,!!W&&(B(l,!0),w&&(r||N||!k&&$))){const[Q,H]=Ll({nodeId:k,dragItems:l,nodeLookup:E});r==null||r(w,l,Q,H),N==null||N(w,Q,H),k||$==null||$(w,H)}}async function I(){if(!p)return;const{transform:D,panBy:R,autoPanSpeed:E,autoPanOnNodeDrag:T}=t();if(!T){a=!1,cancelAnimationFrame(s);return}const[P,L]=qg(u,p,E);(P!==0||L!==0)&&(i.x=(i.x??0)-P/D[2],i.y=(i.y??0)-L/D[2],await R({x:P,y:L})&&j(i)),s=requestAnimationFrame(I)}function A(D){var V;const{nodeLookup:R,multiSelectionActive:E,nodesDraggable:T,transform:P,snapGrid:L,snapToGrid:b,selectNodesOnDrag:N,onNodeDragStart:$,onSelectionDragStart:O,unselectNodesAndEdges:B}=t();c=!0,(!N||!S)&&!E&&k&&((V=R.get(k))!=null&&V.selected||B()),S&&N&&k&&(e==null||e(k));const W=uo(D.sourceEvent,{transform:P,snapGrid:L,snapToGrid:b,containerBounds:p});if(i=W,l=US(R,T,W,k),l.size>0&&(n||$||!k&&O)){const[Y,X]=Ll({nodeId:k,dragItems:l,nodeLookup:R});n==null||n(D.sourceEvent,l,Y,X),$==null||$(D.sourceEvent,Y,X),k||O==null||O(D.sourceEvent,X)}}const z=jg().clickDistance(C).on("start",D=>{const{domNode:R,nodeDragThreshold:E,transform:T,snapGrid:P,snapToGrid:L}=t();p=(R==null?void 0:R.getBoundingClientRect())||null,x=!1,y=!1,w=D.sourceEvent,E===0&&A(D),i=uo(D.sourceEvent,{transform:T,snapGrid:P,snapToGrid:L,containerBounds:p}),u=dt(D.sourceEvent,p)}).on("drag",D=>{const{autoPanOnNodeDrag:R,transform:E,snapGrid:T,snapToGrid:P,nodeDragThreshold:L,nodeLookup:b}=t(),N=uo(D.sourceEvent,{transform:E,snapGrid:T,snapToGrid:P,containerBounds:p});if(w=D.sourceEvent,(D.sourceEvent.type==="touchmove"&&D.sourceEvent.touches.length>1||k&&!b.has(k))&&(x=!0),!x){if(!a&&R&&c&&(a=!0,I()),!c){const $=dt(D.sourceEvent,p),O=$.x-u.x,B=$.y-u.y;Math.sqrt(O*O+B*B)>L&&A(D)}(i.x!==N.xSnapped||i.y!==N.ySnapped)&&l&&c&&(u=dt(D.sourceEvent,p),j(N))}}).on("end",D=>{if(!(!c||x)&&(a=!1,c=!1,cancelAnimationFrame(s),l.size>0)){const{nodeLookup:R,updateNodePositions:E,onNodeDragStop:T,onSelectionDragStop:P}=t();if(y&&(E(l,!1),y=!1),o||T||!k&&P){const[L,b]=Ll({nodeId:k,dragItems:l,nodeLookup:R,dragging:!1});o==null||o(D.sourceEvent,l,L,b),T==null||T(D.sourceEvent,L,b),k||P==null||P(D.sourceEvent,b)}}}).filter(D=>{const R=D.target;return!D.button&&(!g||!pf(R,`.${g}`,v))&&(!h||pf(R,h,v))});d.call(z)}function m(){d==null||d.on(".drag",null)}return{update:_,destroy:m}}function QS(e,t,n){const r=[],o={x:e.x-n,y:e.y-n,width:n*2,height:n*2};for(const i of t.values())Ro(o,kr(i))>0&&r.push(i);return r}const GS=250;function KS(e,t,n,r){var l,a;let o=[],i=1/0;const s=QS(e,n,t+GS);for(const u of s){const p=[...((l=u.internals.handleBounds)==null?void 0:l.source)??[],...((a=u.internals.handleBounds)==null?void 0:a.target)??[]];for(const c of p){if(r.nodeId===c.nodeId&&r.type===c.type&&r.id===c.id)continue;const{x:d,y:x}=Ln(u,c,c.position,!0),y=Math.sqrt(Math.pow(d-e.x,2)+Math.pow(x-e.y,2));y>t||(y1){const u=r.type==="source"?"target":"source";return o.find(p=>p.type===u)??o[0]}return o[0]}function f0(e,t,n,r,o,i=!1){var u,p,c;const s=r.get(e);if(!s)return null;const l=o==="strict"?(u=s.internals.handleBounds)==null?void 0:u[t]:[...((p=s.internals.handleBounds)==null?void 0:p.source)??[],...((c=s.internals.handleBounds)==null?void 0:c.target)??[]],a=(n?l==null?void 0:l.find(d=>d.id===n):l==null?void 0:l[0])??null;return a&&i?{...a,...Ln(s,a,a.position,!0)}:a}function p0(e,t){return e||(t!=null&&t.classList.contains("target")?"target":t!=null&&t.classList.contains("source")?"source":null)}function qS(e,t){let n=null;return t?n=!0:e&&!t&&(n=!1),n}const h0=()=>!0;function ZS(e,{connectionMode:t,connectionRadius:n,handleId:r,nodeId:o,edgeUpdaterType:i,isTarget:s,domNode:l,nodeLookup:a,lib:u,autoPanOnConnect:p,flowId:c,panBy:d,cancelConnection:x,onConnectStart:y,onConnect:w,onConnectEnd:_,isValidConnection:m=h0,onReconnectEnd:g,updateConnection:h,getTransform:v,getFromHandle:S,autoPanSpeed:k,dragThreshold:C=1,handleDomNode:j}){const I=t0(e.target);let A=0,z;const{x:D,y:R}=dt(e),E=p0(i,j),T=l==null?void 0:l.getBoundingClientRect();let P=!1;if(!T||!E)return;const L=f0(o,E,r,a,t);if(!L)return;let b=dt(e,T),N=!1,$=null,O=!1,B=null;function W(){if(!p||!T)return;const[G,J]=qg(b,T,k);d({x:G,y:J}),A=requestAnimationFrame(W)}const V={...L,nodeId:o,type:E,position:L.position},Y=a.get(o);let Q={inProgress:!0,isValid:null,from:Ln(Y,V,Z.Left,!0),fromHandle:V,fromPosition:V.position,fromNode:Y,to:b,toHandle:null,toPosition:ef[V.position],toNode:null,pointer:b};function H(){P=!0,h(Q),y==null||y(e,{nodeId:o,handleId:r,handleType:E})}C===0&&H();function K(G){if(!P){const{x:je,y:Vt}=dt(G),jt=je-D,gn=Vt-R;if(!(jt*jt+gn*gn>C*C))return;H()}if(!S()||!V){ee(G);return}const J=v();b=dt(G,T),z=KS(Qo(b,J,!1,[1,1]),n,a,V),N||(W(),N=!0);const q=g0(G,{handle:z,connectionMode:t,fromNodeId:o,fromHandleId:r,fromType:s?"target":"source",isValidConnection:m,doc:I,lib:u,flowId:c,nodeLookup:a});B=q.handleDomNode,$=q.connection,O=qS(!!z,q.isValid);const re=a.get(o),le=re?Ln(re,V,Z.Left,!0):Q.from,ie={...Q,from:le,isValid:O,to:q.toHandle&&O?Cs({x:q.toHandle.x,y:q.toHandle.y},J):b,toHandle:q.toHandle,toPosition:O&&q.toHandle?q.toHandle.position:ef[V.position],toNode:q.toHandle?a.get(q.toHandle.nodeId):null,pointer:b};h(ie),Q=ie}function ee(G){if(!("touches"in G&&G.touches.length>0)){if(P){(z||B)&&$&&O&&(w==null||w($));const{inProgress:J,...q}=Q,re={...q,toPosition:Q.toHandle?Q.toPosition:null};_==null||_(G,re),i&&(g==null||g(G,re))}x(),cancelAnimationFrame(A),N=!1,O=!1,$=null,B=null,I.removeEventListener("mousemove",K),I.removeEventListener("mouseup",ee),I.removeEventListener("touchmove",K),I.removeEventListener("touchend",ee)}}I.addEventListener("mousemove",K),I.addEventListener("mouseup",ee),I.addEventListener("touchmove",K),I.addEventListener("touchend",ee)}function g0(e,{handle:t,connectionMode:n,fromNodeId:r,fromHandleId:o,fromType:i,doc:s,lib:l,flowId:a,isValidConnection:u=h0,nodeLookup:p}){const c=i==="target",d=t?s.querySelector(`.${l}-flow__handle[data-id="${a}-${t==null?void 0:t.nodeId}-${t==null?void 0:t.id}-${t==null?void 0:t.type}"]`):null,{x,y}=dt(e),w=s.elementFromPoint(x,y),_=w!=null&&w.classList.contains(`${l}-flow__handle`)?w:d,m={handleDomNode:_,isValid:!1,connection:null,toHandle:null};if(_){const g=p0(void 0,_),h=_.getAttribute("data-nodeid"),v=_.getAttribute("data-handleid"),S=_.classList.contains("connectable"),k=_.classList.contains("connectableend");if(!h||!g)return m;const C={source:c?h:r,sourceHandle:c?v:o,target:c?r:h,targetHandle:c?o:v};m.connection=C;const I=S&&k&&(n===wr.Strict?c&&g==="source"||!c&&g==="target":h!==r||v!==o);m.isValid=I&&u(C),m.toHandle=f0(h,g,v,p,n,!0)}return m}const tu={onPointerDown:ZS,isValid:g0};function JS({domNode:e,panZoom:t,getTransform:n,getViewScale:r}){const o=We(e);function i({translateExtent:l,width:a,height:u,zoomStep:p=1,pannable:c=!0,zoomable:d=!0,inversePan:x=!1}){const y=h=>{if(h.sourceEvent.type!=="wheel"||!t)return;const v=n(),S=h.sourceEvent.ctrlKey&&Lo()?10:1,k=-h.sourceEvent.deltaY*(h.sourceEvent.deltaMode===1?.05:h.sourceEvent.deltaMode?1:.002)*p,C=v[2]*Math.pow(2,k*S);t.scaleTo(C)};let w=[0,0];const _=h=>{(h.sourceEvent.type==="mousedown"||h.sourceEvent.type==="touchstart")&&(w=[h.sourceEvent.clientX??h.sourceEvent.touches[0].clientX,h.sourceEvent.clientY??h.sourceEvent.touches[0].clientY])},m=h=>{const v=n();if(h.sourceEvent.type!=="mousemove"&&h.sourceEvent.type!=="touchmove"||!t)return;const S=[h.sourceEvent.clientX??h.sourceEvent.touches[0].clientX,h.sourceEvent.clientY??h.sourceEvent.touches[0].clientY],k=[S[0]-w[0],S[1]-w[1]];w=S;const C=r()*Math.max(v[2],Math.log(v[2]))*(x?-1:1),j={x:v[0]-k[0]*C,y:v[1]-k[1]*C},I=[[0,0],[a,u]];t.setViewportConstrained({x:j.x,y:j.y,zoom:v[2]},I,l)},g=Vg().on("start",_).on("zoom",c?m:null).on("zoom.wheel",d?y:null);o.call(g,{})}function s(){o.on("zoom",null)}return{update:i,destroy:s,pointer:lt}}const Ks=e=>({x:e.x,y:e.y,zoom:e.k}),Al=({x:e,y:t,zoom:n})=>Xs.translate(e,t).scale(n),tr=(e,t)=>e.target.closest(`.${t}`),m0=(e,t)=>t===2&&Array.isArray(e)&&e.includes(2),ek=e=>((e*=2)<=1?e*e*e:(e-=2)*e*e+2)/2,$l=(e,t=0,n=ek,r=()=>{})=>{const o=typeof t=="number"&&t>0;return o||r(),o?e.transition().duration(t).ease(n).on("end",r):e},y0=e=>{const t=e.ctrlKey&&Lo()?10:1;return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*t};function tk({zoomPanValues:e,noWheelClassName:t,d3Selection:n,d3Zoom:r,panOnScrollMode:o,panOnScrollSpeed:i,zoomOnPinch:s,onPanZoomStart:l,onPanZoom:a,onPanZoomEnd:u}){return p=>{if(tr(p,t))return p.ctrlKey&&p.preventDefault(),!1;p.preventDefault(),p.stopImmediatePropagation();const c=n.property("__zoom").k||1;if(p.ctrlKey&&s){const _=lt(p),m=y0(p),g=c*Math.pow(2,m);r.scaleTo(n,g,_,p);return}const d=p.deltaMode===1?20:1;let x=o===bn.Vertical?0:p.deltaX*d,y=o===bn.Horizontal?0:p.deltaY*d;!Lo()&&p.shiftKey&&o!==bn.Vertical&&(x=p.deltaY*d,y=0),r.translateBy(n,-(x/c)*i,-(y/c)*i,{internal:!0});const w=Ks(n.property("__zoom"));clearTimeout(e.panScrollTimeout),e.isPanScrolling?(a==null||a(p,w),e.panScrollTimeout=setTimeout(()=>{u==null||u(p,w),e.isPanScrolling=!1},150)):(e.isPanScrolling=!0,l==null||l(p,w))}}function nk({noWheelClassName:e,preventScrolling:t,d3ZoomHandler:n}){return function(r,o){const i=r.type==="wheel",s=!t&&i&&!r.ctrlKey,l=tr(r,e);if(r.ctrlKey&&i&&l&&r.preventDefault(),s||l)return null;r.preventDefault(),n.call(this,r,o)}}function rk({zoomPanValues:e,onDraggingChange:t,onPanZoomStart:n}){return r=>{var i,s,l;if((i=r.sourceEvent)!=null&&i.internal)return;const o=Ks(r.transform);e.mouseButton=((s=r.sourceEvent)==null?void 0:s.button)||0,e.isZoomingOrPanning=!0,e.prevViewport=o,((l=r.sourceEvent)==null?void 0:l.type)==="mousedown"&&t(!0),n&&(n==null||n(r.sourceEvent,o))}}function ok({zoomPanValues:e,panOnDrag:t,onPaneContextMenu:n,onTransformChange:r,onPanZoom:o}){return i=>{var s,l;e.usedRightMouseButton=!!(n&&m0(t,e.mouseButton??0)),(s=i.sourceEvent)!=null&&s.sync||r([i.transform.x,i.transform.y,i.transform.k]),o&&!((l=i.sourceEvent)!=null&&l.internal)&&(o==null||o(i.sourceEvent,Ks(i.transform)))}}function ik({zoomPanValues:e,panOnDrag:t,panOnScroll:n,onDraggingChange:r,onPanZoomEnd:o,onPaneContextMenu:i}){return s=>{var l;if(!((l=s.sourceEvent)!=null&&l.internal)&&(e.isZoomingOrPanning=!1,i&&m0(t,e.mouseButton??0)&&!e.usedRightMouseButton&&s.sourceEvent&&i(s.sourceEvent),e.usedRightMouseButton=!1,r(!1),o)){const a=Ks(s.transform);e.prevViewport=a,clearTimeout(e.timerId),e.timerId=setTimeout(()=>{o==null||o(s.sourceEvent,a)},n?150:0)}}}function sk({zoomActivationKeyPressed:e,zoomOnScroll:t,zoomOnPinch:n,panOnDrag:r,panOnScroll:o,zoomOnDoubleClick:i,userSelectionActive:s,noWheelClassName:l,noPanClassName:a,lib:u,connectionInProgress:p}){return c=>{var _;const d=e||t,x=n&&c.ctrlKey,y=c.type==="wheel";if(c.button===1&&c.type==="mousedown"&&(tr(c,`${u}-flow__node`)||tr(c,`${u}-flow__edge`)))return!0;if(!r&&!d&&!o&&!i&&!n||s||p&&!y||tr(c,l)&&y||tr(c,a)&&(!y||o&&y&&!e)||!n&&c.ctrlKey&&y)return!1;if(!n&&c.type==="touchstart"&&((_=c.touches)==null?void 0:_.length)>1)return c.preventDefault(),!1;if(!d&&!o&&!x&&y||!r&&(c.type==="mousedown"||c.type==="touchstart")||Array.isArray(r)&&!r.includes(c.button)&&c.type==="mousedown")return!1;const w=Array.isArray(r)&&r.includes(c.button)||!c.button||c.button<=1;return(!c.ctrlKey||y)&&w}}function lk({domNode:e,minZoom:t,maxZoom:n,translateExtent:r,viewport:o,onPanZoom:i,onPanZoomStart:s,onPanZoomEnd:l,onDraggingChange:a}){const u={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},p=e.getBoundingClientRect(),c=Vg().scaleExtent([t,n]).translateExtent(r),d=We(e).call(c);g({x:o.x,y:o.y,zoom:Sr(o.zoom,t,n)},[[0,0],[p.width,p.height]],r);const x=d.on("wheel.zoom"),y=d.on("dblclick.zoom");c.wheelDelta(y0);function w(z,D){return d?new Promise(R=>{c==null||c.interpolate((D==null?void 0:D.interpolate)==="linear"?ao:Hi).transform($l(d,D==null?void 0:D.duration,D==null?void 0:D.ease,()=>R(!0)),z)}):Promise.resolve(!1)}function _({noWheelClassName:z,noPanClassName:D,onPaneContextMenu:R,userSelectionActive:E,panOnScroll:T,panOnDrag:P,panOnScrollMode:L,panOnScrollSpeed:b,preventScrolling:N,zoomOnPinch:$,zoomOnScroll:O,zoomOnDoubleClick:B,zoomActivationKeyPressed:W,lib:V,onTransformChange:Y,connectionInProgress:X,paneClickDistance:Q,selectionOnDrag:H}){E&&!u.isZoomingOrPanning&&m();const K=T&&!W&&!E;c.clickDistance(H?1/0:!ct(Q)||Q<0?0:Q);const ee=K?tk({zoomPanValues:u,noWheelClassName:z,d3Selection:d,d3Zoom:c,panOnScrollMode:L,panOnScrollSpeed:b,zoomOnPinch:$,onPanZoomStart:s,onPanZoom:i,onPanZoomEnd:l}):nk({noWheelClassName:z,preventScrolling:N,d3ZoomHandler:x});if(d.on("wheel.zoom",ee,{passive:!1}),!E){const J=rk({zoomPanValues:u,onDraggingChange:a,onPanZoomStart:s});c.on("start",J);const q=ok({zoomPanValues:u,panOnDrag:P,onPaneContextMenu:!!R,onPanZoom:i,onTransformChange:Y});c.on("zoom",q);const re=ik({zoomPanValues:u,panOnDrag:P,panOnScroll:T,onPaneContextMenu:R,onPanZoomEnd:l,onDraggingChange:a});c.on("end",re)}const G=sk({zoomActivationKeyPressed:W,panOnDrag:P,zoomOnScroll:O,panOnScroll:T,zoomOnDoubleClick:B,zoomOnPinch:$,userSelectionActive:E,noPanClassName:D,noWheelClassName:z,lib:V,connectionInProgress:X});c.filter(G),B?d.on("dblclick.zoom",y):d.on("dblclick.zoom",null)}function m(){c.on("zoom",null)}async function g(z,D,R){const E=Al(z),T=c==null?void 0:c.constrain()(E,D,R);return T&&await w(T),new Promise(P=>P(T))}async function h(z,D){const R=Al(z);return await w(R,D),new Promise(E=>E(R))}function v(z){if(d){const D=Al(z),R=d.property("__zoom");(R.k!==z.zoom||R.x!==z.x||R.y!==z.y)&&(c==null||c.transform(d,D,null,{sync:!0}))}}function S(){const z=d?Hg(d.node()):{x:0,y:0,k:1};return{x:z.x,y:z.y,zoom:z.k}}function k(z,D){return d?new Promise(R=>{c==null||c.interpolate((D==null?void 0:D.interpolate)==="linear"?ao:Hi).scaleTo($l(d,D==null?void 0:D.duration,D==null?void 0:D.ease,()=>R(!0)),z)}):Promise.resolve(!1)}function C(z,D){return d?new Promise(R=>{c==null||c.interpolate((D==null?void 0:D.interpolate)==="linear"?ao:Hi).scaleBy($l(d,D==null?void 0:D.duration,D==null?void 0:D.ease,()=>R(!0)),z)}):Promise.resolve(!1)}function j(z){c==null||c.scaleExtent(z)}function I(z){c==null||c.translateExtent(z)}function A(z){const D=!ct(z)||z<0?0:z;c==null||c.clickDistance(D)}return{update:_,destroy:m,setViewport:h,setViewportConstrained:g,getViewport:S,scaleTo:k,scaleBy:C,setScaleExtent:j,setTranslateExtent:I,syncViewport:v,setClickDistance:A}}var An;(function(e){e.Line="line",e.Handle="handle"})(An||(An={}));const ak=["top-left","top-right","bottom-left","bottom-right"],uk=["top","right","bottom","left"];function ck({width:e,prevWidth:t,height:n,prevHeight:r,affectsX:o,affectsY:i}){const s=e-t,l=n-r,a=[s>0?1:s<0?-1:0,l>0?1:l<0?-1:0];return s&&o&&(a[0]=a[0]*-1),l&&i&&(a[1]=a[1]*-1),a}function hf(e){const t=e.includes("right")||e.includes("left"),n=e.includes("bottom")||e.includes("top"),r=e.includes("left"),o=e.includes("top");return{isHorizontal:t,isVertical:n,affectsX:r,affectsY:o}}function Ut(e,t){return Math.max(0,t-e)}function Yt(e,t){return Math.max(0,e-t)}function wi(e,t,n){return Math.max(0,t-e,e-n)}function gf(e,t){return e?!t:t}function dk(e,t,n,r,o,i,s,l){let{affectsX:a,affectsY:u}=t;const{isHorizontal:p,isVertical:c}=t,d=p&&c,{xSnapped:x,ySnapped:y}=n,{minWidth:w,maxWidth:_,minHeight:m,maxHeight:g}=r,{x:h,y:v,width:S,height:k,aspectRatio:C}=e;let j=Math.floor(p?x-e.pointerX:0),I=Math.floor(c?y-e.pointerY:0);const A=S+(a?-j:j),z=k+(u?-I:I),D=-i[0]*S,R=-i[1]*k;let E=wi(A,w,_),T=wi(z,m,g);if(s){let b=0,N=0;a&&j<0?b=Ut(h+j+D,s[0][0]):!a&&j>0&&(b=Yt(h+A+D,s[1][0])),u&&I<0?N=Ut(v+I+R,s[0][1]):!u&&I>0&&(N=Yt(v+z+R,s[1][1])),E=Math.max(E,b),T=Math.max(T,N)}if(l){let b=0,N=0;a&&j>0?b=Yt(h+j,l[0][0]):!a&&j<0&&(b=Ut(h+A,l[1][0])),u&&I>0?N=Yt(v+I,l[0][1]):!u&&I<0&&(N=Ut(v+z,l[1][1])),E=Math.max(E,b),T=Math.max(T,N)}if(o){if(p){const b=wi(A/C,m,g)*C;if(E=Math.max(E,b),s){let N=0;!a&&!u||a&&!u&&d?N=Yt(v+R+A/C,s[1][1])*C:N=Ut(v+R+(a?j:-j)/C,s[0][1])*C,E=Math.max(E,N)}if(l){let N=0;!a&&!u||a&&!u&&d?N=Ut(v+A/C,l[1][1])*C:N=Yt(v+(a?j:-j)/C,l[0][1])*C,E=Math.max(E,N)}}if(c){const b=wi(z*C,w,_)/C;if(T=Math.max(T,b),s){let N=0;!a&&!u||u&&!a&&d?N=Yt(h+z*C+D,s[1][0])/C:N=Ut(h+(u?I:-I)*C+D,s[0][0])/C,T=Math.max(T,N)}if(l){let N=0;!a&&!u||u&&!a&&d?N=Ut(h+z*C,l[1][0])/C:N=Yt(h+(u?I:-I)*C,l[0][0])/C,T=Math.max(T,N)}}}I=I+(I<0?T:-T),j=j+(j<0?E:-E),o&&(d?A>z*C?I=(gf(a,u)?-j:j)/C:j=(gf(a,u)?-I:I)*C:p?(I=j/C,u=a):(j=I*C,a=u));const P=a?h+j:h,L=u?v+I:v;return{width:S+(a?-j:j),height:k+(u?-I:I),x:i[0]*j*(a?-1:1)+P,y:i[1]*I*(u?-1:1)+L}}const x0={width:0,height:0,x:0,y:0},fk={...x0,pointerX:0,pointerY:0,aspectRatio:1};function pk(e){return[[0,0],[e.measured.width,e.measured.height]]}function hk(e,t,n){const r=t.position.x+e.position.x,o=t.position.y+e.position.y,i=e.measured.width??0,s=e.measured.height??0,l=n[0]*i,a=n[1]*s;return[[r-l,o-a],[r+i-l,o+s-a]]}function gk({domNode:e,nodeId:t,getStoreItems:n,onChange:r,onEnd:o}){const i=We(e);let s={controlDirection:hf("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function l({controlPosition:u,boundaries:p,keepAspectRatio:c,resizeDirection:d,onResizeStart:x,onResize:y,onResizeEnd:w,shouldResize:_}){let m={...x0},g={...fk};s={boundaries:p,resizeDirection:d,keepAspectRatio:c,controlDirection:hf(u)};let h,v=null,S=[],k,C,j,I=!1;const A=jg().on("start",z=>{const{nodeLookup:D,transform:R,snapGrid:E,snapToGrid:T,nodeOrigin:P,paneDomNode:L}=n();if(h=D.get(t),!h)return;v=(L==null?void 0:L.getBoundingClientRect())??null;const{xSnapped:b,ySnapped:N}=uo(z.sourceEvent,{transform:R,snapGrid:E,snapToGrid:T,containerBounds:v});m={width:h.measured.width??0,height:h.measured.height??0,x:h.position.x??0,y:h.position.y??0},g={...m,pointerX:b,pointerY:N,aspectRatio:m.width/m.height},k=void 0,h.parentId&&(h.extent==="parent"||h.expandParent)&&(k=D.get(h.parentId),C=k&&h.extent==="parent"?pk(k):void 0),S=[],j=void 0;for(const[$,O]of D)if(O.parentId===t&&(S.push({id:$,position:{...O.position},extent:O.extent}),O.extent==="parent"||O.expandParent)){const B=hk(O,h,O.origin??P);j?j=[[Math.min(B[0][0],j[0][0]),Math.min(B[0][1],j[0][1])],[Math.max(B[1][0],j[1][0]),Math.max(B[1][1],j[1][1])]]:j=B}x==null||x(z,{...m})}).on("drag",z=>{const{transform:D,snapGrid:R,snapToGrid:E,nodeOrigin:T}=n(),P=uo(z.sourceEvent,{transform:D,snapGrid:R,snapToGrid:E,containerBounds:v}),L=[];if(!h)return;const{x:b,y:N,width:$,height:O}=m,B={},W=h.origin??T,{width:V,height:Y,x:X,y:Q}=dk(g,s.controlDirection,P,s.boundaries,s.keepAspectRatio,W,C,j),H=V!==$,K=Y!==O,ee=X!==b&&H,G=Q!==N&&K;if(!ee&&!G&&!H&&!K)return;if((ee||G||W[0]===1||W[1]===1)&&(B.x=ee?X:m.x,B.y=G?Q:m.y,m.x=B.x,m.y=B.y,S.length>0)){const le=X-b,ie=Q-N;for(const je of S)je.position={x:je.position.x-le+W[0]*(V-$),y:je.position.y-ie+W[1]*(Y-O)},L.push(je)}if((H||K)&&(B.width=H&&(!s.resizeDirection||s.resizeDirection==="horizontal")?V:m.width,B.height=K&&(!s.resizeDirection||s.resizeDirection==="vertical")?Y:m.height,m.width=B.width,m.height=B.height),k&&h.expandParent){const le=W[0]*(B.width??0);B.x&&B.x{I&&(w==null||w(z,{...m}),o==null||o({...m}),I=!1)});i.call(A)}function a(){i.on(".drag",null)}return{update:l,destroy:a}}var v0={exports:{}},w0={},S0={exports:{}},k0={};/** - * @license React - * use-sync-external-store-shim.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Er=M;function mk(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var yk=typeof Object.is=="function"?Object.is:mk,xk=Er.useState,vk=Er.useEffect,wk=Er.useLayoutEffect,Sk=Er.useDebugValue;function kk(e,t){var n=t(),r=xk({inst:{value:n,getSnapshot:t}}),o=r[0].inst,i=r[1];return wk(function(){o.value=n,o.getSnapshot=t,Dl(o)&&i({inst:o})},[e,n,t]),vk(function(){return Dl(o)&&i({inst:o}),e(function(){Dl(o)&&i({inst:o})})},[e]),Sk(n),n}function Dl(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!yk(e,n)}catch{return!0}}function _k(e,t){return t()}var Ek=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?_k:kk;k0.useSyncExternalStore=Er.useSyncExternalStore!==void 0?Er.useSyncExternalStore:Ek;S0.exports=k0;var Ck=S0.exports;/** - * @license React - * use-sync-external-store-shim/with-selector.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var qs=M,bk=Ck;function Nk(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var jk=typeof Object.is=="function"?Object.is:Nk,Mk=bk.useSyncExternalStore,zk=qs.useRef,Pk=qs.useEffect,Tk=qs.useMemo,Ik=qs.useDebugValue;w0.useSyncExternalStoreWithSelector=function(e,t,n,r,o){var i=zk(null);if(i.current===null){var s={hasValue:!1,value:null};i.current=s}else s=i.current;i=Tk(function(){function a(x){if(!u){if(u=!0,p=x,x=r(x),o!==void 0&&s.hasValue){var y=s.value;if(o(y,x))return c=y}return c=x}if(y=c,jk(p,x))return y;var w=r(x);return o!==void 0&&o(y,w)?(p=x,y):(p=x,c=w)}var u=!1,p,c,d=n===void 0?null:n;return[function(){return a(t())},d===null?void 0:function(){return a(d())}]},[t,n,r,o]);var l=Mk(e,i[0],i[1]);return Pk(function(){s.hasValue=!0,s.value=l},[l]),Ik(l),l};v0.exports=w0;var Rk=v0.exports;const Lk=ep(Rk),Ak={},mf=e=>{let t;const n=new Set,r=(p,c)=>{const d=typeof p=="function"?p(t):p;if(!Object.is(d,t)){const x=t;t=c??(typeof d!="object"||d===null)?d:Object.assign({},t,d),n.forEach(y=>y(t,x))}},o=()=>t,a={setState:r,getState:o,getInitialState:()=>u,subscribe:p=>(n.add(p),()=>n.delete(p)),destroy:()=>{(Ak?"production":void 0)!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),n.clear()}},u=t=e(r,o,a);return a},$k=e=>e?mf(e):mf,{useDebugValue:Dk}=dp,{useSyncExternalStoreWithSelector:Ok}=Lk,Bk=e=>e;function _0(e,t=Bk,n){const r=Ok(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,n);return Dk(r),r}const yf=(e,t)=>{const n=$k(e),r=(o,i=t)=>_0(n,o,i);return Object.assign(r,n),r},Fk=(e,t)=>e?yf(e,t):yf;function fe(e,t){if(Object.is(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(const[r,o]of e)if(!Object.is(o,t.get(r)))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(const r of e)if(!t.has(r))return!1;return!0}const n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;for(const r of n)if(!Object.prototype.hasOwnProperty.call(t,r)||!Object.is(e[r],t[r]))return!1;return!0}const Zs=M.createContext(null),Hk=Zs.Provider,E0=bt.error001();function ne(e,t){const n=M.useContext(Zs);if(n===null)throw new Error(E0);return _0(n,e,t)}function pe(){const e=M.useContext(Zs);if(e===null)throw new Error(E0);return M.useMemo(()=>({getState:e.getState,setState:e.setState,subscribe:e.subscribe}),[e])}const xf={display:"none"},Vk={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},C0="react-flow__node-desc",b0="react-flow__edge-desc",Wk="react-flow__aria-live",Uk=e=>e.ariaLiveMessage,Yk=e=>e.ariaLabelConfig;function Xk({rfId:e}){const t=ne(Uk);return f.jsx("div",{id:`${Wk}-${e}`,"aria-live":"assertive","aria-atomic":"true",style:Vk,children:t})}function Qk({rfId:e,disableKeyboardA11y:t}){const n=ne(Yk);return f.jsxs(f.Fragment,{children:[f.jsx("div",{id:`${C0}-${e}`,style:xf,children:t?n["node.a11yDescription.default"]:n["node.a11yDescription.keyboardDisabled"]}),f.jsx("div",{id:`${b0}-${e}`,style:xf,children:n["edge.a11yDescription.default"]}),!t&&f.jsx(Xk,{rfId:e})]})}const Js=M.forwardRef(({position:e="top-left",children:t,className:n,style:r,...o},i)=>{const s=`${e}`.split("-");return f.jsx("div",{className:we(["react-flow__panel",n,...s]),style:r,ref:i,...o,children:t})});Js.displayName="Panel";function Gk({proOptions:e,position:t="bottom-right"}){return e!=null&&e.hideAttribution?null:f.jsx(Js,{position:t,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:f.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}const Kk=e=>{const t=[],n=[];for(const[,r]of e.nodeLookup)r.selected&&t.push(r.internals.userNode);for(const[,r]of e.edgeLookup)r.selected&&n.push(r);return{selectedNodes:t,selectedEdges:n}},Si=e=>e.id;function qk(e,t){return fe(e.selectedNodes.map(Si),t.selectedNodes.map(Si))&&fe(e.selectedEdges.map(Si),t.selectedEdges.map(Si))}function Zk({onSelectionChange:e}){const t=pe(),{selectedNodes:n,selectedEdges:r}=ne(Kk,qk);return M.useEffect(()=>{const o={nodes:n,edges:r};e==null||e(o),t.getState().onSelectionChangeHandlers.forEach(i=>i(o))},[n,r,e]),null}const Jk=e=>!!e.onSelectionChangeHandlers;function e_({onSelectionChange:e}){const t=ne(Jk);return e||t?f.jsx(Zk,{onSelectionChange:e}):null}const N0=[0,0],t_={x:0,y:0,zoom:1},n_=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","nodesFocusable","edgesFocusable","edgesReconnectable","elevateNodesOnSelect","elevateEdgesOnSelect","minZoom","maxZoom","nodeExtent","onNodesChange","onEdgesChange","elementsSelectable","connectionMode","snapGrid","snapToGrid","translateExtent","connectOnClick","defaultEdgeOptions","fitView","fitViewOptions","onNodesDelete","onEdgesDelete","onDelete","onNodeDrag","onNodeDragStart","onNodeDragStop","onSelectionDrag","onSelectionDragStart","onSelectionDragStop","onMoveStart","onMove","onMoveEnd","noPanClassName","nodeOrigin","autoPanOnConnect","autoPanOnNodeDrag","onError","connectionRadius","isValidConnection","selectNodesOnDrag","nodeDragThreshold","connectionDragThreshold","onBeforeDelete","debug","autoPanSpeed","ariaLabelConfig","zIndexMode"],vf=[...n_,"rfId"],r_=e=>({setNodes:e.setNodes,setEdges:e.setEdges,setMinZoom:e.setMinZoom,setMaxZoom:e.setMaxZoom,setTranslateExtent:e.setTranslateExtent,setNodeExtent:e.setNodeExtent,reset:e.reset,setDefaultNodesAndEdges:e.setDefaultNodesAndEdges}),wf={translateExtent:To,nodeOrigin:N0,minZoom:.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function o_(e){const{setNodes:t,setEdges:n,setMinZoom:r,setMaxZoom:o,setTranslateExtent:i,setNodeExtent:s,reset:l,setDefaultNodesAndEdges:a}=ne(r_,fe),u=pe();M.useEffect(()=>(a(e.defaultNodes,e.defaultEdges),()=>{p.current=wf,l()}),[]);const p=M.useRef(wf);return M.useEffect(()=>{for(const c of vf){const d=e[c],x=p.current[c];d!==x&&(typeof e[c]>"u"||(c==="nodes"?t(d):c==="edges"?n(d):c==="minZoom"?r(d):c==="maxZoom"?o(d):c==="translateExtent"?i(d):c==="nodeExtent"?s(d):c==="ariaLabelConfig"?u.setState({ariaLabelConfig:CS(d)}):c==="fitView"?u.setState({fitViewQueued:d}):c==="fitViewOptions"?u.setState({fitViewOptions:d}):u.setState({[c]:d})))}p.current=e},vf.map(c=>e[c])),null}function Sf(){return typeof window>"u"||!window.matchMedia?null:window.matchMedia("(prefers-color-scheme: dark)")}function i_(e){var r;const[t,n]=M.useState(e==="system"?null:e);return M.useEffect(()=>{if(e!=="system"){n(e);return}const o=Sf(),i=()=>n(o!=null&&o.matches?"dark":"light");return i(),o==null||o.addEventListener("change",i),()=>{o==null||o.removeEventListener("change",i)}},[e]),t!==null?t:(r=Sf())!=null&&r.matches?"dark":"light"}const kf=typeof document<"u"?document:null;function Ao(e=null,t={target:kf,actInsideInputWithModifier:!0}){const[n,r]=M.useState(!1),o=M.useRef(!1),i=M.useRef(new Set([])),[s,l]=M.useMemo(()=>{if(e!==null){const u=(Array.isArray(e)?e:[e]).filter(c=>typeof c=="string").map(c=>c.replace("+",` -`).replace(` - -`,` -+`).split(` -`)),p=u.reduce((c,d)=>c.concat(...d),[]);return[u,p]}return[[],[]]},[e]);return M.useEffect(()=>{const a=(t==null?void 0:t.target)??kf,u=(t==null?void 0:t.actInsideInputWithModifier)??!0;if(e!==null){const p=x=>{var _,m;if(o.current=x.ctrlKey||x.metaKey||x.shiftKey||x.altKey,(!o.current||o.current&&!u)&&n0(x))return!1;const w=Ef(x.code,l);if(i.current.add(x[w]),_f(s,i.current,!1)){const g=((m=(_=x.composedPath)==null?void 0:_.call(x))==null?void 0:m[0])||x.target,h=(g==null?void 0:g.nodeName)==="BUTTON"||(g==null?void 0:g.nodeName)==="A";t.preventDefault!==!1&&(o.current||!h)&&x.preventDefault(),r(!0)}},c=x=>{const y=Ef(x.code,l);_f(s,i.current,!0)?(r(!1),i.current.clear()):i.current.delete(x[y]),x.key==="Meta"&&i.current.clear(),o.current=!1},d=()=>{i.current.clear(),r(!1)};return a==null||a.addEventListener("keydown",p),a==null||a.addEventListener("keyup",c),window.addEventListener("blur",d),window.addEventListener("contextmenu",d),()=>{a==null||a.removeEventListener("keydown",p),a==null||a.removeEventListener("keyup",c),window.removeEventListener("blur",d),window.removeEventListener("contextmenu",d)}}},[e,r]),n}function _f(e,t,n){return e.filter(r=>n||r.length===t.size).some(r=>r.every(o=>t.has(o)))}function Ef(e,t){return t.includes(e)?"code":"key"}const s_=()=>{const e=pe();return M.useMemo(()=>({zoomIn:t=>{const{panZoom:n}=e.getState();return n?n.scaleBy(1.2,{duration:t==null?void 0:t.duration}):Promise.resolve(!1)},zoomOut:t=>{const{panZoom:n}=e.getState();return n?n.scaleBy(1/1.2,{duration:t==null?void 0:t.duration}):Promise.resolve(!1)},zoomTo:(t,n)=>{const{panZoom:r}=e.getState();return r?r.scaleTo(t,{duration:n==null?void 0:n.duration}):Promise.resolve(!1)},getZoom:()=>e.getState().transform[2],setViewport:async(t,n)=>{const{transform:[r,o,i],panZoom:s}=e.getState();return s?(await s.setViewport({x:t.x??r,y:t.y??o,zoom:t.zoom??i},n),Promise.resolve(!0)):Promise.resolve(!1)},getViewport:()=>{const[t,n,r]=e.getState().transform;return{x:t,y:n,zoom:r}},setCenter:async(t,n,r)=>e.getState().setCenter(t,n,r),fitBounds:async(t,n)=>{const{width:r,height:o,minZoom:i,maxZoom:s,panZoom:l}=e.getState(),a=uc(t,r,o,i,s,(n==null?void 0:n.padding)??.1);return l?(await l.setViewport(a,{duration:n==null?void 0:n.duration,ease:n==null?void 0:n.ease,interpolate:n==null?void 0:n.interpolate}),Promise.resolve(!0)):Promise.resolve(!1)},screenToFlowPosition:(t,n={})=>{const{transform:r,snapGrid:o,snapToGrid:i,domNode:s}=e.getState();if(!s)return t;const{x:l,y:a}=s.getBoundingClientRect(),u={x:t.x-l,y:t.y-a},p=n.snapGrid??o,c=n.snapToGrid??i;return Qo(u,r,c,p)},flowToScreenPosition:t=>{const{transform:n,domNode:r}=e.getState();if(!r)return t;const{x:o,y:i}=r.getBoundingClientRect(),s=Cs(t,n);return{x:s.x+o,y:s.y+i}}}),[])};function j0(e,t){const n=[],r=new Map,o=[];for(const i of e)if(i.type==="add"){o.push(i);continue}else if(i.type==="remove"||i.type==="replace")r.set(i.id,[i]);else{const s=r.get(i.id);s?s.push(i):r.set(i.id,[i])}for(const i of t){const s=r.get(i.id);if(!s){n.push(i);continue}if(s[0].type==="remove")continue;if(s[0].type==="replace"){n.push({...s[0].item});continue}const l={...i};for(const a of s)l_(a,l);n.push(l)}return o.length&&o.forEach(i=>{i.index!==void 0?n.splice(i.index,0,{...i.item}):n.push({...i.item})}),n}function l_(e,t){switch(e.type){case"select":{t.selected=e.selected;break}case"position":{typeof e.position<"u"&&(t.position=e.position),typeof e.dragging<"u"&&(t.dragging=e.dragging);break}case"dimensions":{typeof e.dimensions<"u"&&(t.measured={...e.dimensions},e.setAttributes&&((e.setAttributes===!0||e.setAttributes==="width")&&(t.width=e.dimensions.width),(e.setAttributes===!0||e.setAttributes==="height")&&(t.height=e.dimensions.height))),typeof e.resizing=="boolean"&&(t.resizing=e.resizing);break}}}function M0(e,t){return j0(e,t)}function z0(e,t){return j0(e,t)}function xn(e,t){return{id:e,type:"select",selected:t}}function nr(e,t=new Set,n=!1){const r=[];for(const[o,i]of e){const s=t.has(o);!(i.selected===void 0&&!s)&&i.selected!==s&&(n&&(i.selected=s),r.push(xn(i.id,s)))}return r}function Cf({items:e=[],lookup:t}){var o;const n=[],r=new Map(e.map(i=>[i.id,i]));for(const[i,s]of e.entries()){const l=t.get(s.id),a=((o=l==null?void 0:l.internals)==null?void 0:o.userNode)??l;a!==void 0&&a!==s&&n.push({id:s.id,item:s,type:"replace"}),a===void 0&&n.push({item:s,type:"add",index:i})}for(const[i]of t)r.get(i)===void 0&&n.push({id:i,type:"remove"});return n}function bf(e){return{id:e.id,type:"remove"}}const Nf=e=>gS(e),a_=e=>Qg(e);function P0(e){return M.forwardRef(e)}const u_=typeof window<"u"?M.useLayoutEffect:M.useEffect;function jf(e){const[t,n]=M.useState(BigInt(0)),[r]=M.useState(()=>c_(()=>n(o=>o+BigInt(1))));return u_(()=>{const o=r.get();o.length&&(e(o),r.reset())},[t]),r}function c_(e){let t=[];return{get:()=>t,reset:()=>{t=[]},push:n=>{t.push(n),e()}}}const T0=M.createContext(null);function d_({children:e}){const t=pe(),n=M.useCallback(l=>{const{nodes:a=[],setNodes:u,hasDefaultNodes:p,onNodesChange:c,nodeLookup:d,fitViewQueued:x,onNodesChangeMiddlewareMap:y}=t.getState();let w=a;for(const m of l)w=typeof m=="function"?m(w):m;let _=Cf({items:w,lookup:d});for(const m of y.values())_=m(_);p&&u(w),_.length>0?c==null||c(_):x&&window.requestAnimationFrame(()=>{const{fitViewQueued:m,nodes:g,setNodes:h}=t.getState();m&&h(g)})},[]),r=jf(n),o=M.useCallback(l=>{const{edges:a=[],setEdges:u,hasDefaultEdges:p,onEdgesChange:c,edgeLookup:d}=t.getState();let x=a;for(const y of l)x=typeof y=="function"?y(x):y;p?u(x):c&&c(Cf({items:x,lookup:d}))},[]),i=jf(o),s=M.useMemo(()=>({nodeQueue:r,edgeQueue:i}),[]);return f.jsx(T0.Provider,{value:s,children:e})}function f_(){const e=M.useContext(T0);if(!e)throw new Error("useBatchContext must be used within a BatchProvider");return e}const p_=e=>!!e.panZoom;function mc(){const e=s_(),t=pe(),n=f_(),r=ne(p_),o=M.useMemo(()=>{const i=c=>t.getState().nodeLookup.get(c),s=c=>{n.nodeQueue.push(c)},l=c=>{n.edgeQueue.push(c)},a=c=>{var m,g;const{nodeLookup:d,nodeOrigin:x}=t.getState(),y=Nf(c)?c:d.get(c.id),w=y.parentId?e0(y.position,y.measured,y.parentId,d,x):y.position,_={...y,position:w,width:((m=y.measured)==null?void 0:m.width)??y.width,height:((g=y.measured)==null?void 0:g.height)??y.height};return kr(_)},u=(c,d,x={replace:!1})=>{s(y=>y.map(w=>{if(w.id===c){const _=typeof d=="function"?d(w):d;return x.replace&&Nf(_)?_:{...w,..._}}return w}))},p=(c,d,x={replace:!1})=>{l(y=>y.map(w=>{if(w.id===c){const _=typeof d=="function"?d(w):d;return x.replace&&a_(_)?_:{...w,..._}}return w}))};return{getNodes:()=>t.getState().nodes.map(c=>({...c})),getNode:c=>{var d;return(d=i(c))==null?void 0:d.internals.userNode},getInternalNode:i,getEdges:()=>{const{edges:c=[]}=t.getState();return c.map(d=>({...d}))},getEdge:c=>t.getState().edgeLookup.get(c),setNodes:s,setEdges:l,addNodes:c=>{const d=Array.isArray(c)?c:[c];n.nodeQueue.push(x=>[...x,...d])},addEdges:c=>{const d=Array.isArray(c)?c:[c];n.edgeQueue.push(x=>[...x,...d])},toObject:()=>{const{nodes:c=[],edges:d=[],transform:x}=t.getState(),[y,w,_]=x;return{nodes:c.map(m=>({...m})),edges:d.map(m=>({...m})),viewport:{x:y,y:w,zoom:_}}},deleteElements:async({nodes:c=[],edges:d=[]})=>{const{nodes:x,edges:y,onNodesDelete:w,onEdgesDelete:_,triggerNodeChanges:m,triggerEdgeChanges:g,onDelete:h,onBeforeDelete:v}=t.getState(),{nodes:S,edges:k}=await wS({nodesToRemove:c,edgesToRemove:d,nodes:x,edges:y,onBeforeDelete:v}),C=k.length>0,j=S.length>0;if(C){const I=k.map(bf);_==null||_(k),g(I)}if(j){const I=S.map(bf);w==null||w(S),m(I)}return(j||C)&&(h==null||h({nodes:S,edges:k})),{deletedNodes:S,deletedEdges:k}},getIntersectingNodes:(c,d=!0,x)=>{const y=nf(c),w=y?c:a(c),_=x!==void 0;return w?(x||t.getState().nodes).filter(m=>{const g=t.getState().nodeLookup.get(m.id);if(g&&!y&&(m.id===c.id||!g.internals.positionAbsolute))return!1;const h=kr(_?m:g),v=Ro(h,w);return d&&v>0||v>=h.width*h.height||v>=w.width*w.height}):[]},isNodeIntersecting:(c,d,x=!0)=>{const w=nf(c)?c:a(c);if(!w)return!1;const _=Ro(w,d);return x&&_>0||_>=d.width*d.height||_>=w.width*w.height},updateNode:u,updateNodeData:(c,d,x={replace:!1})=>{u(c,y=>{const w=typeof d=="function"?d(y):d;return x.replace?{...y,data:w}:{...y,data:{...y.data,...w}}},x)},updateEdge:p,updateEdgeData:(c,d,x={replace:!1})=>{p(c,y=>{const w=typeof d=="function"?d(y):d;return x.replace?{...y,data:w}:{...y,data:{...y.data,...w}}},x)},getNodesBounds:c=>{const{nodeLookup:d,nodeOrigin:x}=t.getState();return mS(c,{nodeLookup:d,nodeOrigin:x})},getHandleConnections:({type:c,id:d,nodeId:x})=>{var y;return Array.from(((y=t.getState().connectionLookup.get(`${x}-${c}${d?`-${d}`:""}`))==null?void 0:y.values())??[])},getNodeConnections:({type:c,handleId:d,nodeId:x})=>{var y;return Array.from(((y=t.getState().connectionLookup.get(`${x}${c?d?`-${c}-${d}`:`-${c}`:""}`))==null?void 0:y.values())??[])},fitView:async c=>{const d=t.getState().fitViewResolver??ES();return t.setState({fitViewQueued:!0,fitViewOptions:c,fitViewResolver:d}),n.nodeQueue.push(x=>[...x]),d.promise}}},[]);return M.useMemo(()=>({...o,...e,viewportInitialized:r}),[r])}const Mf=e=>e.selected,h_=typeof window<"u"?window:void 0;function g_({deleteKeyCode:e,multiSelectionKeyCode:t}){const n=pe(),{deleteElements:r}=mc(),o=Ao(e,{actInsideInputWithModifier:!1}),i=Ao(t,{target:h_});M.useEffect(()=>{if(o){const{edges:s,nodes:l}=n.getState();r({nodes:l.filter(Mf),edges:s.filter(Mf)}),n.setState({nodesSelectionActive:!1})}},[o]),M.useEffect(()=>{n.setState({multiSelectionActive:i})},[i])}function m_(e){const t=pe();M.useEffect(()=>{const n=()=>{var o,i,s,l;if(!e.current||!(((i=(o=e.current).checkVisibility)==null?void 0:i.call(o))??!0))return!1;const r=cc(e.current);(r.height===0||r.width===0)&&((l=(s=t.getState()).onError)==null||l.call(s,"004",bt.error004())),t.setState({width:r.width||500,height:r.height||500})};if(e.current){n(),window.addEventListener("resize",n);const r=new ResizeObserver(()=>n());return r.observe(e.current),()=>{window.removeEventListener("resize",n),r&&e.current&&r.unobserve(e.current)}}},[])}const el={position:"absolute",width:"100%",height:"100%",top:0,left:0},y_=e=>({userSelectionActive:e.userSelectionActive,lib:e.lib,connectionInProgress:e.connection.inProgress});function x_({onPaneContextMenu:e,zoomOnScroll:t=!0,zoomOnPinch:n=!0,panOnScroll:r=!1,panOnScrollSpeed:o=.5,panOnScrollMode:i=bn.Free,zoomOnDoubleClick:s=!0,panOnDrag:l=!0,defaultViewport:a,translateExtent:u,minZoom:p,maxZoom:c,zoomActivationKeyCode:d,preventScrolling:x=!0,children:y,noWheelClassName:w,noPanClassName:_,onViewportChange:m,isControlledViewport:g,paneClickDistance:h,selectionOnDrag:v}){const S=pe(),k=M.useRef(null),{userSelectionActive:C,lib:j,connectionInProgress:I}=ne(y_,fe),A=Ao(d),z=M.useRef();m_(k);const D=M.useCallback(R=>{m==null||m({x:R[0],y:R[1],zoom:R[2]}),g||S.setState({transform:R})},[m,g]);return M.useEffect(()=>{if(k.current){z.current=lk({domNode:k.current,minZoom:p,maxZoom:c,translateExtent:u,viewport:a,onDraggingChange:P=>S.setState(L=>L.paneDragging===P?L:{paneDragging:P}),onPanZoomStart:(P,L)=>{const{onViewportChangeStart:b,onMoveStart:N}=S.getState();N==null||N(P,L),b==null||b(L)},onPanZoom:(P,L)=>{const{onViewportChange:b,onMove:N}=S.getState();N==null||N(P,L),b==null||b(L)},onPanZoomEnd:(P,L)=>{const{onViewportChangeEnd:b,onMoveEnd:N}=S.getState();N==null||N(P,L),b==null||b(L)}});const{x:R,y:E,zoom:T}=z.current.getViewport();return S.setState({panZoom:z.current,transform:[R,E,T],domNode:k.current.closest(".react-flow")}),()=>{var P;(P=z.current)==null||P.destroy()}}},[]),M.useEffect(()=>{var R;(R=z.current)==null||R.update({onPaneContextMenu:e,zoomOnScroll:t,zoomOnPinch:n,panOnScroll:r,panOnScrollSpeed:o,panOnScrollMode:i,zoomOnDoubleClick:s,panOnDrag:l,zoomActivationKeyPressed:A,preventScrolling:x,noPanClassName:_,userSelectionActive:C,noWheelClassName:w,lib:j,onTransformChange:D,connectionInProgress:I,selectionOnDrag:v,paneClickDistance:h})},[e,t,n,r,o,i,s,l,A,x,_,C,w,j,D,I,v,h]),f.jsx("div",{className:"react-flow__renderer",ref:k,style:el,children:y})}const v_=e=>({userSelectionActive:e.userSelectionActive,userSelectionRect:e.userSelectionRect});function w_(){const{userSelectionActive:e,userSelectionRect:t}=ne(v_,fe);return e&&t?f.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:t.width,height:t.height,transform:`translate(${t.x}px, ${t.y}px)`}}):null}const Ol=(e,t)=>n=>{n.target===t.current&&(e==null||e(n))},S_=e=>({userSelectionActive:e.userSelectionActive,elementsSelectable:e.elementsSelectable,connectionInProgress:e.connection.inProgress,dragging:e.paneDragging});function k_({isSelecting:e,selectionKeyPressed:t,selectionMode:n=Io.Full,panOnDrag:r,paneClickDistance:o,selectionOnDrag:i,onSelectionStart:s,onSelectionEnd:l,onPaneClick:a,onPaneContextMenu:u,onPaneScroll:p,onPaneMouseEnter:c,onPaneMouseMove:d,onPaneMouseLeave:x,children:y}){const w=pe(),{userSelectionActive:_,elementsSelectable:m,dragging:g,connectionInProgress:h}=ne(S_,fe),v=m&&(e||_),S=M.useRef(null),k=M.useRef(),C=M.useRef(new Set),j=M.useRef(new Set),I=M.useRef(!1),A=b=>{if(I.current||h){I.current=!1;return}a==null||a(b),w.getState().resetSelectedElements(),w.setState({nodesSelectionActive:!1})},z=b=>{if(Array.isArray(r)&&(r!=null&&r.includes(2))){b.preventDefault();return}u==null||u(b)},D=p?b=>p(b):void 0,R=b=>{I.current&&(b.stopPropagation(),I.current=!1)},E=b=>{var Y,X;const{domNode:N}=w.getState();if(k.current=N==null?void 0:N.getBoundingClientRect(),!k.current)return;const $=b.target===S.current;if(!$&&!!b.target.closest(".nokey")||!e||!(i&&$||t)||b.button!==0||!b.isPrimary)return;(X=(Y=b.target)==null?void 0:Y.setPointerCapture)==null||X.call(Y,b.pointerId),I.current=!1;const{x:W,y:V}=dt(b.nativeEvent,k.current);w.setState({userSelectionRect:{width:0,height:0,startX:W,startY:V,x:W,y:V}}),$||(b.stopPropagation(),b.preventDefault())},T=b=>{const{userSelectionRect:N,transform:$,nodeLookup:O,edgeLookup:B,connectionLookup:W,triggerNodeChanges:V,triggerEdgeChanges:Y,defaultEdgeOptions:X,resetSelectedElements:Q}=w.getState();if(!k.current||!N)return;const{x:H,y:K}=dt(b.nativeEvent,k.current),{startX:ee,startY:G}=N;if(!I.current){const ie=t?0:o;if(Math.hypot(H-ee,K-G)<=ie)return;Q(),s==null||s(b)}I.current=!0;const J={startX:ee,startY:G,x:Hie.id)),j.current=new Set;const le=(X==null?void 0:X.selectable)??!0;for(const ie of C.current){const je=W.get(ie);if(je)for(const{edgeId:Vt}of je.values()){const jt=B.get(Vt);jt&&(jt.selectable??le)&&j.current.add(Vt)}}if(!rf(q,C.current)){const ie=nr(O,C.current,!0);V(ie)}if(!rf(re,j.current)){const ie=nr(B,j.current);Y(ie)}w.setState({userSelectionRect:J,userSelectionActive:!0,nodesSelectionActive:!1})},P=b=>{var N,$;b.button===0&&(($=(N=b.target)==null?void 0:N.releasePointerCapture)==null||$.call(N,b.pointerId),!_&&b.target===S.current&&w.getState().userSelectionRect&&(A==null||A(b)),w.setState({userSelectionActive:!1,userSelectionRect:null}),I.current&&(l==null||l(b),w.setState({nodesSelectionActive:C.current.size>0})))},L=r===!0||Array.isArray(r)&&r.includes(0);return f.jsxs("div",{className:we(["react-flow__pane",{draggable:L,dragging:g,selection:e}]),onClick:v?void 0:Ol(A,S),onContextMenu:Ol(z,S),onWheel:Ol(D,S),onPointerEnter:v?void 0:c,onPointerMove:v?T:d,onPointerUp:v?P:void 0,onPointerDownCapture:v?E:void 0,onClickCapture:v?R:void 0,onPointerLeave:x,ref:S,style:el,children:[y,f.jsx(w_,{})]})}function nu({id:e,store:t,unselect:n=!1,nodeRef:r}){const{addSelectedNodes:o,unselectNodesAndEdges:i,multiSelectionActive:s,nodeLookup:l,onError:a}=t.getState(),u=l.get(e);if(!u){a==null||a("012",bt.error012(e));return}t.setState({nodesSelectionActive:!1}),u.selected?(n||u.selected&&s)&&(i({nodes:[u],edges:[]}),requestAnimationFrame(()=>{var p;return(p=r==null?void 0:r.current)==null?void 0:p.blur()})):o([e])}function I0({nodeRef:e,disabled:t=!1,noDragClassName:n,handleSelector:r,nodeId:o,isSelectable:i,nodeClickDistance:s}){const l=pe(),[a,u]=M.useState(!1),p=M.useRef();return M.useEffect(()=>{p.current=XS({getStoreItems:()=>l.getState(),onNodeMouseDown:c=>{nu({id:c,store:l,nodeRef:e})},onDragStart:()=>{u(!0)},onDragStop:()=>{u(!1)}})},[]),M.useEffect(()=>{if(!(t||!e.current||!p.current))return p.current.update({noDragClassName:n,handleSelector:r,domNode:e.current,isSelectable:i,nodeId:o,nodeClickDistance:s}),()=>{var c;(c=p.current)==null||c.destroy()}},[n,r,t,i,e,o,s]),a}const __=e=>t=>t.selected&&(t.draggable||e&&typeof t.draggable>"u");function R0(){const e=pe();return M.useCallback(n=>{const{nodeExtent:r,snapToGrid:o,snapGrid:i,nodesDraggable:s,onError:l,updateNodePositions:a,nodeLookup:u,nodeOrigin:p}=e.getState(),c=new Map,d=__(s),x=o?i[0]:5,y=o?i[1]:5,w=n.direction.x*x*n.factor,_=n.direction.y*y*n.factor;for(const[,m]of u){if(!d(m))continue;let g={x:m.internals.positionAbsolute.x+w,y:m.internals.positionAbsolute.y+_};o&&(g=Xo(g,i));const{position:h,positionAbsolute:v}=Gg({nodeId:m.id,nextPosition:g,nodeLookup:u,nodeExtent:r,nodeOrigin:p,onError:l});m.position=h,m.internals.positionAbsolute=v,c.set(m.id,m)}a(c)},[])}const yc=M.createContext(null),E_=yc.Provider;yc.Consumer;const L0=()=>M.useContext(yc),C_=e=>({connectOnClick:e.connectOnClick,noPanClassName:e.noPanClassName,rfId:e.rfId}),b_=(e,t,n)=>r=>{const{connectionClickStartHandle:o,connectionMode:i,connection:s}=r,{fromHandle:l,toHandle:a,isValid:u}=s,p=(a==null?void 0:a.nodeId)===e&&(a==null?void 0:a.id)===t&&(a==null?void 0:a.type)===n;return{connectingFrom:(l==null?void 0:l.nodeId)===e&&(l==null?void 0:l.id)===t&&(l==null?void 0:l.type)===n,connectingTo:p,clickConnecting:(o==null?void 0:o.nodeId)===e&&(o==null?void 0:o.id)===t&&(o==null?void 0:o.type)===n,isPossibleEndHandle:i===wr.Strict?(l==null?void 0:l.type)!==n:e!==(l==null?void 0:l.nodeId)||t!==(l==null?void 0:l.id),connectionInProcess:!!l,clickConnectionInProcess:!!o,valid:p&&u}};function N_({type:e="source",position:t=Z.Top,isValidConnection:n,isConnectable:r=!0,isConnectableStart:o=!0,isConnectableEnd:i=!0,id:s,onConnect:l,children:a,className:u,onMouseDown:p,onTouchStart:c,...d},x){var T,P;const y=s||null,w=e==="target",_=pe(),m=L0(),{connectOnClick:g,noPanClassName:h,rfId:v}=ne(C_,fe),{connectingFrom:S,connectingTo:k,clickConnecting:C,isPossibleEndHandle:j,connectionInProcess:I,clickConnectionInProcess:A,valid:z}=ne(b_(m,y,e),fe);m||(P=(T=_.getState()).onError)==null||P.call(T,"010",bt.error010());const D=L=>{const{defaultEdgeOptions:b,onConnect:N,hasDefaultEdges:$}=_.getState(),O={...b,...L};if($){const{edges:B,setEdges:W}=_.getState();W(PS(O,B))}N==null||N(O),l==null||l(O)},R=L=>{if(!m)return;const b=r0(L.nativeEvent);if(o&&(b&&L.button===0||!b)){const N=_.getState();tu.onPointerDown(L.nativeEvent,{handleDomNode:L.currentTarget,autoPanOnConnect:N.autoPanOnConnect,connectionMode:N.connectionMode,connectionRadius:N.connectionRadius,domNode:N.domNode,nodeLookup:N.nodeLookup,lib:N.lib,isTarget:w,handleId:y,nodeId:m,flowId:N.rfId,panBy:N.panBy,cancelConnection:N.cancelConnection,onConnectStart:N.onConnectStart,onConnectEnd:(...$)=>{var O,B;return(B=(O=_.getState()).onConnectEnd)==null?void 0:B.call(O,...$)},updateConnection:N.updateConnection,onConnect:D,isValidConnection:n||((...$)=>{var O,B;return((B=(O=_.getState()).isValidConnection)==null?void 0:B.call(O,...$))??!0}),getTransform:()=>_.getState().transform,getFromHandle:()=>_.getState().connection.fromHandle,autoPanSpeed:N.autoPanSpeed,dragThreshold:N.connectionDragThreshold})}b?p==null||p(L):c==null||c(L)},E=L=>{const{onClickConnectStart:b,onClickConnectEnd:N,connectionClickStartHandle:$,connectionMode:O,isValidConnection:B,lib:W,rfId:V,nodeLookup:Y,connection:X}=_.getState();if(!m||!$&&!o)return;if(!$){b==null||b(L.nativeEvent,{nodeId:m,handleId:y,handleType:e}),_.setState({connectionClickStartHandle:{nodeId:m,type:e,id:y}});return}const Q=t0(L.target),H=n||B,{connection:K,isValid:ee}=tu.isValid(L.nativeEvent,{handle:{nodeId:m,id:y,type:e},connectionMode:O,fromNodeId:$.nodeId,fromHandleId:$.id||null,fromType:$.type,isValidConnection:H,flowId:V,doc:Q,lib:W,nodeLookup:Y});ee&&K&&D(K);const G=structuredClone(X);delete G.inProgress,G.toPosition=G.toHandle?G.toHandle.position:null,N==null||N(L,G),_.setState({connectionClickStartHandle:null})};return f.jsx("div",{"data-handleid":y,"data-nodeid":m,"data-handlepos":t,"data-id":`${v}-${m}-${y}-${e}`,className:we(["react-flow__handle",`react-flow__handle-${t}`,"nodrag",h,u,{source:!w,target:w,connectable:r,connectablestart:o,connectableend:i,clickconnecting:C,connectingfrom:S,connectingto:k,valid:z,connectionindicator:r&&(!I||j)&&(I||A?i:o)}]),onMouseDown:R,onTouchStart:R,onClick:g?E:void 0,ref:x,...d,children:a})}const Cr=M.memo(P0(N_));function j_({data:e,isConnectable:t,sourcePosition:n=Z.Bottom}){return f.jsxs(f.Fragment,{children:[e==null?void 0:e.label,f.jsx(Cr,{type:"source",position:n,isConnectable:t})]})}function M_({data:e,isConnectable:t,targetPosition:n=Z.Top,sourcePosition:r=Z.Bottom}){return f.jsxs(f.Fragment,{children:[f.jsx(Cr,{type:"target",position:n,isConnectable:t}),e==null?void 0:e.label,f.jsx(Cr,{type:"source",position:r,isConnectable:t})]})}function z_(){return null}function P_({data:e,isConnectable:t,targetPosition:n=Z.Top}){return f.jsxs(f.Fragment,{children:[f.jsx(Cr,{type:"target",position:n,isConnectable:t}),e==null?void 0:e.label]})}const bs={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},zf={input:j_,default:M_,output:P_,group:z_};function T_(e){var t,n,r,o;return e.internals.handleBounds===void 0?{width:e.width??e.initialWidth??((t=e.style)==null?void 0:t.width),height:e.height??e.initialHeight??((n=e.style)==null?void 0:n.height)}:{width:e.width??((r=e.style)==null?void 0:r.width),height:e.height??((o=e.style)==null?void 0:o.height)}}const I_=e=>{const{width:t,height:n,x:r,y:o}=Yo(e.nodeLookup,{filter:i=>!!i.selected});return{width:ct(t)?t:null,height:ct(n)?n:null,userSelectionActive:e.userSelectionActive,transformString:`translate(${e.transform[0]}px,${e.transform[1]}px) scale(${e.transform[2]}) translate(${r}px,${o}px)`}};function R_({onSelectionContextMenu:e,noPanClassName:t,disableKeyboardA11y:n}){const r=pe(),{width:o,height:i,transformString:s,userSelectionActive:l}=ne(I_,fe),a=R0(),u=M.useRef(null);M.useEffect(()=>{var x;n||(x=u.current)==null||x.focus({preventScroll:!0})},[n]);const p=!l&&o!==null&&i!==null;if(I0({nodeRef:u,disabled:!p}),!p)return null;const c=e?x=>{const y=r.getState().nodes.filter(w=>w.selected);e(x,y)}:void 0,d=x=>{Object.prototype.hasOwnProperty.call(bs,x.key)&&(x.preventDefault(),a({direction:bs[x.key],factor:x.shiftKey?4:1}))};return f.jsx("div",{className:we(["react-flow__nodesselection","react-flow__container",t]),style:{transform:s},children:f.jsx("div",{ref:u,className:"react-flow__nodesselection-rect",onContextMenu:c,tabIndex:n?void 0:-1,onKeyDown:n?void 0:d,style:{width:o,height:i}})})}const Pf=typeof window<"u"?window:void 0,L_=e=>({nodesSelectionActive:e.nodesSelectionActive,userSelectionActive:e.userSelectionActive});function A0({children:e,onPaneClick:t,onPaneMouseEnter:n,onPaneMouseMove:r,onPaneMouseLeave:o,onPaneContextMenu:i,onPaneScroll:s,paneClickDistance:l,deleteKeyCode:a,selectionKeyCode:u,selectionOnDrag:p,selectionMode:c,onSelectionStart:d,onSelectionEnd:x,multiSelectionKeyCode:y,panActivationKeyCode:w,zoomActivationKeyCode:_,elementsSelectable:m,zoomOnScroll:g,zoomOnPinch:h,panOnScroll:v,panOnScrollSpeed:S,panOnScrollMode:k,zoomOnDoubleClick:C,panOnDrag:j,defaultViewport:I,translateExtent:A,minZoom:z,maxZoom:D,preventScrolling:R,onSelectionContextMenu:E,noWheelClassName:T,noPanClassName:P,disableKeyboardA11y:L,onViewportChange:b,isControlledViewport:N}){const{nodesSelectionActive:$,userSelectionActive:O}=ne(L_,fe),B=Ao(u,{target:Pf}),W=Ao(w,{target:Pf}),V=W||j,Y=W||v,X=p&&V!==!0,Q=B||O||X;return g_({deleteKeyCode:a,multiSelectionKeyCode:y}),f.jsx(x_,{onPaneContextMenu:i,elementsSelectable:m,zoomOnScroll:g,zoomOnPinch:h,panOnScroll:Y,panOnScrollSpeed:S,panOnScrollMode:k,zoomOnDoubleClick:C,panOnDrag:!B&&V,defaultViewport:I,translateExtent:A,minZoom:z,maxZoom:D,zoomActivationKeyCode:_,preventScrolling:R,noWheelClassName:T,noPanClassName:P,onViewportChange:b,isControlledViewport:N,paneClickDistance:l,selectionOnDrag:X,children:f.jsxs(k_,{onSelectionStart:d,onSelectionEnd:x,onPaneClick:t,onPaneMouseEnter:n,onPaneMouseMove:r,onPaneMouseLeave:o,onPaneContextMenu:i,onPaneScroll:s,panOnDrag:V,isSelecting:!!Q,selectionMode:c,selectionKeyPressed:B,paneClickDistance:l,selectionOnDrag:X,children:[e,$&&f.jsx(R_,{onSelectionContextMenu:E,noPanClassName:P,disableKeyboardA11y:L})]})})}A0.displayName="FlowRenderer";const A_=M.memo(A0),$_=e=>t=>e?ac(t.nodeLookup,{x:0,y:0,width:t.width,height:t.height},t.transform,!0).map(n=>n.id):Array.from(t.nodeLookup.keys());function D_(e){return ne(M.useCallback($_(e),[e]),fe)}const O_=e=>e.updateNodeInternals;function B_(){const e=ne(O_),[t]=M.useState(()=>typeof ResizeObserver>"u"?null:new ResizeObserver(n=>{const r=new Map;n.forEach(o=>{const i=o.target.getAttribute("data-id");r.set(i,{id:i,nodeElement:o.target,force:!0})}),e(r)}));return M.useEffect(()=>()=>{t==null||t.disconnect()},[t]),t}function F_({node:e,nodeType:t,hasDimensions:n,resizeObserver:r}){const o=pe(),i=M.useRef(null),s=M.useRef(null),l=M.useRef(e.sourcePosition),a=M.useRef(e.targetPosition),u=M.useRef(t),p=n&&!!e.internals.handleBounds;return M.useEffect(()=>{i.current&&!e.hidden&&(!p||s.current!==i.current)&&(s.current&&(r==null||r.unobserve(s.current)),r==null||r.observe(i.current),s.current=i.current)},[p,e.hidden]),M.useEffect(()=>()=>{s.current&&(r==null||r.unobserve(s.current),s.current=null)},[]),M.useEffect(()=>{if(i.current){const c=u.current!==t,d=l.current!==e.sourcePosition,x=a.current!==e.targetPosition;(c||d||x)&&(u.current=t,l.current=e.sourcePosition,a.current=e.targetPosition,o.getState().updateNodeInternals(new Map([[e.id,{id:e.id,nodeElement:i.current,force:!0}]])))}},[e.id,t,e.sourcePosition,e.targetPosition]),i}function H_({id:e,onClick:t,onMouseEnter:n,onMouseMove:r,onMouseLeave:o,onContextMenu:i,onDoubleClick:s,nodesDraggable:l,elementsSelectable:a,nodesConnectable:u,nodesFocusable:p,resizeObserver:c,noDragClassName:d,noPanClassName:x,disableKeyboardA11y:y,rfId:w,nodeTypes:_,nodeClickDistance:m,onError:g}){const{node:h,internals:v,isParent:S}=ne(H=>{const K=H.nodeLookup.get(e),ee=H.parentLookup.has(e);return{node:K,internals:K.internals,isParent:ee}},fe);let k=h.type||"default",C=(_==null?void 0:_[k])||zf[k];C===void 0&&(g==null||g("003",bt.error003(k)),k="default",C=(_==null?void 0:_.default)||zf.default);const j=!!(h.draggable||l&&typeof h.draggable>"u"),I=!!(h.selectable||a&&typeof h.selectable>"u"),A=!!(h.connectable||u&&typeof h.connectable>"u"),z=!!(h.focusable||p&&typeof h.focusable>"u"),D=pe(),R=Jg(h),E=F_({node:h,nodeType:k,hasDimensions:R,resizeObserver:c}),T=I0({nodeRef:E,disabled:h.hidden||!j,noDragClassName:d,handleSelector:h.dragHandle,nodeId:e,isSelectable:I,nodeClickDistance:m}),P=R0();if(h.hidden)return null;const L=Ht(h),b=T_(h),N=I||j||t||n||r||o,$=n?H=>n(H,{...v.userNode}):void 0,O=r?H=>r(H,{...v.userNode}):void 0,B=o?H=>o(H,{...v.userNode}):void 0,W=i?H=>i(H,{...v.userNode}):void 0,V=s?H=>s(H,{...v.userNode}):void 0,Y=H=>{const{selectNodesOnDrag:K,nodeDragThreshold:ee}=D.getState();I&&(!K||!j||ee>0)&&nu({id:e,store:D,nodeRef:E}),t&&t(H,{...v.userNode})},X=H=>{if(!(n0(H.nativeEvent)||y)){if(Wg.includes(H.key)&&I){const K=H.key==="Escape";nu({id:e,store:D,unselect:K,nodeRef:E})}else if(j&&h.selected&&Object.prototype.hasOwnProperty.call(bs,H.key)){H.preventDefault();const{ariaLabelConfig:K}=D.getState();D.setState({ariaLiveMessage:K["node.a11yDescription.ariaLiveMessage"]({direction:H.key.replace("Arrow","").toLowerCase(),x:~~v.positionAbsolute.x,y:~~v.positionAbsolute.y})}),P({direction:bs[H.key],factor:H.shiftKey?4:1})}}},Q=()=>{var re;if(y||!((re=E.current)!=null&&re.matches(":focus-visible")))return;const{transform:H,width:K,height:ee,autoPanOnNodeFocus:G,setCenter:J}=D.getState();if(!G)return;ac(new Map([[e,h]]),{x:0,y:0,width:K,height:ee},H,!0).length>0||J(h.position.x+L.width/2,h.position.y+L.height/2,{zoom:H[2]})};return f.jsx("div",{className:we(["react-flow__node",`react-flow__node-${k}`,{[x]:j},h.className,{selected:h.selected,selectable:I,parent:S,draggable:j,dragging:T}]),ref:E,style:{zIndex:v.z,transform:`translate(${v.positionAbsolute.x}px,${v.positionAbsolute.y}px)`,pointerEvents:N?"all":"none",visibility:R?"visible":"hidden",...h.style,...b},"data-id":e,"data-testid":`rf__node-${e}`,onMouseEnter:$,onMouseMove:O,onMouseLeave:B,onContextMenu:W,onClick:Y,onDoubleClick:V,onKeyDown:z?X:void 0,tabIndex:z?0:void 0,onFocus:z?Q:void 0,role:h.ariaRole??(z?"group":void 0),"aria-roledescription":"node","aria-describedby":y?void 0:`${C0}-${w}`,"aria-label":h.ariaLabel,...h.domAttributes,children:f.jsx(E_,{value:e,children:f.jsx(C,{id:e,data:h.data,type:k,positionAbsoluteX:v.positionAbsolute.x,positionAbsoluteY:v.positionAbsolute.y,selected:h.selected??!1,selectable:I,draggable:j,deletable:h.deletable??!0,isConnectable:A,sourcePosition:h.sourcePosition,targetPosition:h.targetPosition,dragging:T,dragHandle:h.dragHandle,zIndex:v.z,parentId:h.parentId,...L})})})}var V_=M.memo(H_);const W_=e=>({nodesDraggable:e.nodesDraggable,nodesConnectable:e.nodesConnectable,nodesFocusable:e.nodesFocusable,elementsSelectable:e.elementsSelectable,onError:e.onError});function $0(e){const{nodesDraggable:t,nodesConnectable:n,nodesFocusable:r,elementsSelectable:o,onError:i}=ne(W_,fe),s=D_(e.onlyRenderVisibleElements),l=B_();return f.jsx("div",{className:"react-flow__nodes",style:el,children:s.map(a=>f.jsx(V_,{id:a,nodeTypes:e.nodeTypes,nodeExtent:e.nodeExtent,onClick:e.onNodeClick,onMouseEnter:e.onNodeMouseEnter,onMouseMove:e.onNodeMouseMove,onMouseLeave:e.onNodeMouseLeave,onContextMenu:e.onNodeContextMenu,onDoubleClick:e.onNodeDoubleClick,noDragClassName:e.noDragClassName,noPanClassName:e.noPanClassName,rfId:e.rfId,disableKeyboardA11y:e.disableKeyboardA11y,resizeObserver:l,nodesDraggable:t,nodesConnectable:n,nodesFocusable:r,elementsSelectable:o,nodeClickDistance:e.nodeClickDistance,onError:i},a))})}$0.displayName="NodeRenderer";const U_=M.memo($0);function Y_(e){return ne(M.useCallback(n=>{if(!e)return n.edges.map(o=>o.id);const r=[];if(n.width&&n.height)for(const o of n.edges){const i=n.nodeLookup.get(o.source),s=n.nodeLookup.get(o.target);i&&s&&jS({sourceNode:i,targetNode:s,width:n.width,height:n.height,transform:n.transform})&&r.push(o.id)}return r},[e]),fe)}const X_=({color:e="none",strokeWidth:t=1})=>{const n={strokeWidth:t,...e&&{stroke:e}};return f.jsx("polyline",{className:"arrow",style:n,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},Q_=({color:e="none",strokeWidth:t=1})=>{const n={strokeWidth:t,...e&&{stroke:e,fill:e}};return f.jsx("polyline",{className:"arrowclosed",style:n,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},Tf={[_s.Arrow]:X_,[_s.ArrowClosed]:Q_};function G_(e){const t=pe();return M.useMemo(()=>{var o,i;return Object.prototype.hasOwnProperty.call(Tf,e)?Tf[e]:((i=(o=t.getState()).onError)==null||i.call(o,"009",bt.error009(e)),null)},[e])}const K_=({id:e,type:t,color:n,width:r=12.5,height:o=12.5,markerUnits:i="strokeWidth",strokeWidth:s,orient:l="auto-start-reverse"})=>{const a=G_(t);return a?f.jsx("marker",{className:"react-flow__arrowhead",id:e,markerWidth:`${r}`,markerHeight:`${o}`,viewBox:"-10 -10 20 20",markerUnits:i,orient:l,refX:"0",refY:"0",children:f.jsx(a,{color:n,strokeWidth:s})}):null},D0=({defaultColor:e,rfId:t})=>{const n=ne(i=>i.edges),r=ne(i=>i.defaultEdgeOptions),o=M.useMemo(()=>AS(n,{id:t,defaultColor:e,defaultMarkerStart:r==null?void 0:r.markerStart,defaultMarkerEnd:r==null?void 0:r.markerEnd}),[n,r,t,e]);return o.length?f.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:f.jsx("defs",{children:o.map(i=>f.jsx(K_,{id:i.id,type:i.type,color:i.color,width:i.width,height:i.height,markerUnits:i.markerUnits,strokeWidth:i.strokeWidth,orient:i.orient},i.id))})}):null};D0.displayName="MarkerDefinitions";var q_=M.memo(D0);function O0({x:e,y:t,label:n,labelStyle:r,labelShowBg:o=!0,labelBgStyle:i,labelBgPadding:s=[2,4],labelBgBorderRadius:l=2,children:a,className:u,...p}){const[c,d]=M.useState({x:1,y:0,width:0,height:0}),x=we(["react-flow__edge-textwrapper",u]),y=M.useRef(null);return M.useEffect(()=>{if(y.current){const w=y.current.getBBox();d({x:w.x,y:w.y,width:w.width,height:w.height})}},[n]),n?f.jsxs("g",{transform:`translate(${e-c.width/2} ${t-c.height/2})`,className:x,visibility:c.width?"visible":"hidden",...p,children:[o&&f.jsx("rect",{width:c.width+2*s[0],x:-s[0],y:-s[1],height:c.height+2*s[1],className:"react-flow__edge-textbg",style:i,rx:l,ry:l}),f.jsx("text",{className:"react-flow__edge-text",y:c.height/2,dy:"0.3em",ref:y,style:r,children:n}),a]}):null}O0.displayName="EdgeText";const Z_=M.memo(O0);function tl({path:e,labelX:t,labelY:n,label:r,labelStyle:o,labelShowBg:i,labelBgStyle:s,labelBgPadding:l,labelBgBorderRadius:a,interactionWidth:u=20,...p}){return f.jsxs(f.Fragment,{children:[f.jsx("path",{...p,d:e,fill:"none",className:we(["react-flow__edge-path",p.className])}),u?f.jsx("path",{d:e,fill:"none",strokeOpacity:0,strokeWidth:u,className:"react-flow__edge-interaction"}):null,r&&ct(t)&&ct(n)?f.jsx(Z_,{x:t,y:n,label:r,labelStyle:o,labelShowBg:i,labelBgStyle:s,labelBgPadding:l,labelBgBorderRadius:a}):null]})}function If({pos:e,x1:t,y1:n,x2:r,y2:o}){return e===Z.Left||e===Z.Right?[.5*(t+r),n]:[t,.5*(n+o)]}function B0({sourceX:e,sourceY:t,sourcePosition:n=Z.Bottom,targetX:r,targetY:o,targetPosition:i=Z.Top}){const[s,l]=If({pos:n,x1:e,y1:t,x2:r,y2:o}),[a,u]=If({pos:i,x1:r,y1:o,x2:e,y2:t}),[p,c,d,x]=o0({sourceX:e,sourceY:t,targetX:r,targetY:o,sourceControlX:s,sourceControlY:l,targetControlX:a,targetControlY:u});return[`M${e},${t} C${s},${l} ${a},${u} ${r},${o}`,p,c,d,x]}function F0(e){return M.memo(({id:t,sourceX:n,sourceY:r,targetX:o,targetY:i,sourcePosition:s,targetPosition:l,label:a,labelStyle:u,labelShowBg:p,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:x,style:y,markerEnd:w,markerStart:_,interactionWidth:m})=>{const[g,h,v]=B0({sourceX:n,sourceY:r,sourcePosition:s,targetX:o,targetY:i,targetPosition:l}),S=e.isInternal?void 0:t;return f.jsx(tl,{id:S,path:g,labelX:h,labelY:v,label:a,labelStyle:u,labelShowBg:p,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:x,style:y,markerEnd:w,markerStart:_,interactionWidth:m})})}const J_=F0({isInternal:!1}),H0=F0({isInternal:!0});J_.displayName="SimpleBezierEdge";H0.displayName="SimpleBezierEdgeInternal";function V0(e){return M.memo(({id:t,sourceX:n,sourceY:r,targetX:o,targetY:i,label:s,labelStyle:l,labelShowBg:a,labelBgStyle:u,labelBgPadding:p,labelBgBorderRadius:c,style:d,sourcePosition:x=Z.Bottom,targetPosition:y=Z.Top,markerEnd:w,markerStart:_,pathOptions:m,interactionWidth:g})=>{const[h,v,S]=Za({sourceX:n,sourceY:r,sourcePosition:x,targetX:o,targetY:i,targetPosition:y,borderRadius:m==null?void 0:m.borderRadius,offset:m==null?void 0:m.offset,stepPosition:m==null?void 0:m.stepPosition}),k=e.isInternal?void 0:t;return f.jsx(tl,{id:k,path:h,labelX:v,labelY:S,label:s,labelStyle:l,labelShowBg:a,labelBgStyle:u,labelBgPadding:p,labelBgBorderRadius:c,style:d,markerEnd:w,markerStart:_,interactionWidth:g})})}const W0=V0({isInternal:!1}),U0=V0({isInternal:!0});W0.displayName="SmoothStepEdge";U0.displayName="SmoothStepEdgeInternal";function Y0(e){return M.memo(({id:t,...n})=>{var o;const r=e.isInternal?void 0:t;return f.jsx(W0,{...n,id:r,pathOptions:M.useMemo(()=>{var i;return{borderRadius:0,offset:(i=n.pathOptions)==null?void 0:i.offset}},[(o=n.pathOptions)==null?void 0:o.offset])})})}const eE=Y0({isInternal:!1}),X0=Y0({isInternal:!0});eE.displayName="StepEdge";X0.displayName="StepEdgeInternal";function Q0(e){return M.memo(({id:t,sourceX:n,sourceY:r,targetX:o,targetY:i,label:s,labelStyle:l,labelShowBg:a,labelBgStyle:u,labelBgPadding:p,labelBgBorderRadius:c,style:d,markerEnd:x,markerStart:y,interactionWidth:w})=>{const[_,m,g]=l0({sourceX:n,sourceY:r,targetX:o,targetY:i}),h=e.isInternal?void 0:t;return f.jsx(tl,{id:h,path:_,labelX:m,labelY:g,label:s,labelStyle:l,labelShowBg:a,labelBgStyle:u,labelBgPadding:p,labelBgBorderRadius:c,style:d,markerEnd:x,markerStart:y,interactionWidth:w})})}const tE=Q0({isInternal:!1}),G0=Q0({isInternal:!0});tE.displayName="StraightEdge";G0.displayName="StraightEdgeInternal";function K0(e){return M.memo(({id:t,sourceX:n,sourceY:r,targetX:o,targetY:i,sourcePosition:s=Z.Bottom,targetPosition:l=Z.Top,label:a,labelStyle:u,labelShowBg:p,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:x,style:y,markerEnd:w,markerStart:_,pathOptions:m,interactionWidth:g})=>{const[h,v,S]=i0({sourceX:n,sourceY:r,sourcePosition:s,targetX:o,targetY:i,targetPosition:l,curvature:m==null?void 0:m.curvature}),k=e.isInternal?void 0:t;return f.jsx(tl,{id:k,path:h,labelX:v,labelY:S,label:a,labelStyle:u,labelShowBg:p,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:x,style:y,markerEnd:w,markerStart:_,interactionWidth:g})})}const nE=K0({isInternal:!1}),q0=K0({isInternal:!0});nE.displayName="BezierEdge";q0.displayName="BezierEdgeInternal";const Rf={default:q0,straight:G0,step:X0,smoothstep:U0,simplebezier:H0},Lf={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},rE=(e,t,n)=>n===Z.Left?e-t:n===Z.Right?e+t:e,oE=(e,t,n)=>n===Z.Top?e-t:n===Z.Bottom?e+t:e,Af="react-flow__edgeupdater";function $f({position:e,centerX:t,centerY:n,radius:r=10,onMouseDown:o,onMouseEnter:i,onMouseOut:s,type:l}){return f.jsx("circle",{onMouseDown:o,onMouseEnter:i,onMouseOut:s,className:we([Af,`${Af}-${l}`]),cx:rE(t,r,e),cy:oE(n,r,e),r,stroke:"transparent",fill:"transparent"})}function iE({isReconnectable:e,reconnectRadius:t,edge:n,sourceX:r,sourceY:o,targetX:i,targetY:s,sourcePosition:l,targetPosition:a,onReconnect:u,onReconnectStart:p,onReconnectEnd:c,setReconnecting:d,setUpdateHover:x}){const y=pe(),w=(v,S)=>{if(v.button!==0)return;const{autoPanOnConnect:k,domNode:C,connectionMode:j,connectionRadius:I,lib:A,onConnectStart:z,cancelConnection:D,nodeLookup:R,rfId:E,panBy:T,updateConnection:P}=y.getState(),L=S.type==="target",b=(O,B)=>{d(!1),c==null||c(O,n,S.type,B)},N=O=>u==null?void 0:u(n,O),$=(O,B)=>{d(!0),p==null||p(v,n,S.type),z==null||z(O,B)};tu.onPointerDown(v.nativeEvent,{autoPanOnConnect:k,connectionMode:j,connectionRadius:I,domNode:C,handleId:S.id,nodeId:S.nodeId,nodeLookup:R,isTarget:L,edgeUpdaterType:S.type,lib:A,flowId:E,cancelConnection:D,panBy:T,isValidConnection:(...O)=>{var B,W;return((W=(B=y.getState()).isValidConnection)==null?void 0:W.call(B,...O))??!0},onConnect:N,onConnectStart:$,onConnectEnd:(...O)=>{var B,W;return(W=(B=y.getState()).onConnectEnd)==null?void 0:W.call(B,...O)},onReconnectEnd:b,updateConnection:P,getTransform:()=>y.getState().transform,getFromHandle:()=>y.getState().connection.fromHandle,dragThreshold:y.getState().connectionDragThreshold,handleDomNode:v.currentTarget})},_=v=>w(v,{nodeId:n.target,id:n.targetHandle??null,type:"target"}),m=v=>w(v,{nodeId:n.source,id:n.sourceHandle??null,type:"source"}),g=()=>x(!0),h=()=>x(!1);return f.jsxs(f.Fragment,{children:[(e===!0||e==="source")&&f.jsx($f,{position:l,centerX:r,centerY:o,radius:t,onMouseDown:_,onMouseEnter:g,onMouseOut:h,type:"source"}),(e===!0||e==="target")&&f.jsx($f,{position:a,centerX:i,centerY:s,radius:t,onMouseDown:m,onMouseEnter:g,onMouseOut:h,type:"target"})]})}function sE({id:e,edgesFocusable:t,edgesReconnectable:n,elementsSelectable:r,onClick:o,onDoubleClick:i,onContextMenu:s,onMouseEnter:l,onMouseMove:a,onMouseLeave:u,reconnectRadius:p,onReconnect:c,onReconnectStart:d,onReconnectEnd:x,rfId:y,edgeTypes:w,noPanClassName:_,onError:m,disableKeyboardA11y:g}){let h=ne(J=>J.edgeLookup.get(e));const v=ne(J=>J.defaultEdgeOptions);h=v?{...v,...h}:h;let S=h.type||"default",k=(w==null?void 0:w[S])||Rf[S];k===void 0&&(m==null||m("011",bt.error011(S)),S="default",k=(w==null?void 0:w.default)||Rf.default);const C=!!(h.focusable||t&&typeof h.focusable>"u"),j=typeof c<"u"&&(h.reconnectable||n&&typeof h.reconnectable>"u"),I=!!(h.selectable||r&&typeof h.selectable>"u"),A=M.useRef(null),[z,D]=M.useState(!1),[R,E]=M.useState(!1),T=pe(),{zIndex:P,sourceX:L,sourceY:b,targetX:N,targetY:$,sourcePosition:O,targetPosition:B}=ne(M.useCallback(J=>{const q=J.nodeLookup.get(h.source),re=J.nodeLookup.get(h.target);if(!q||!re)return{zIndex:h.zIndex,...Lf};const le=LS({id:e,sourceNode:q,targetNode:re,sourceHandle:h.sourceHandle||null,targetHandle:h.targetHandle||null,connectionMode:J.connectionMode,onError:m});return{zIndex:NS({selected:h.selected,zIndex:h.zIndex,sourceNode:q,targetNode:re,elevateOnSelect:J.elevateEdgesOnSelect,zIndexMode:J.zIndexMode}),...le||Lf}},[h.source,h.target,h.sourceHandle,h.targetHandle,h.selected,h.zIndex]),fe),W=M.useMemo(()=>h.markerStart?`url('#${Ja(h.markerStart,y)}')`:void 0,[h.markerStart,y]),V=M.useMemo(()=>h.markerEnd?`url('#${Ja(h.markerEnd,y)}')`:void 0,[h.markerEnd,y]);if(h.hidden||L===null||b===null||N===null||$===null)return null;const Y=J=>{var ie;const{addSelectedEdges:q,unselectNodesAndEdges:re,multiSelectionActive:le}=T.getState();I&&(T.setState({nodesSelectionActive:!1}),h.selected&&le?(re({nodes:[],edges:[h]}),(ie=A.current)==null||ie.blur()):q([e])),o&&o(J,h)},X=i?J=>{i(J,{...h})}:void 0,Q=s?J=>{s(J,{...h})}:void 0,H=l?J=>{l(J,{...h})}:void 0,K=a?J=>{a(J,{...h})}:void 0,ee=u?J=>{u(J,{...h})}:void 0,G=J=>{var q;if(!g&&Wg.includes(J.key)&&I){const{unselectNodesAndEdges:re,addSelectedEdges:le}=T.getState();J.key==="Escape"?((q=A.current)==null||q.blur(),re({edges:[h]})):le([e])}};return f.jsx("svg",{style:{zIndex:P},children:f.jsxs("g",{className:we(["react-flow__edge",`react-flow__edge-${S}`,h.className,_,{selected:h.selected,animated:h.animated,inactive:!I&&!o,updating:z,selectable:I}]),onClick:Y,onDoubleClick:X,onContextMenu:Q,onMouseEnter:H,onMouseMove:K,onMouseLeave:ee,onKeyDown:C?G:void 0,tabIndex:C?0:void 0,role:h.ariaRole??(C?"group":"img"),"aria-roledescription":"edge","data-id":e,"data-testid":`rf__edge-${e}`,"aria-label":h.ariaLabel===null?void 0:h.ariaLabel||`Edge from ${h.source} to ${h.target}`,"aria-describedby":C?`${b0}-${y}`:void 0,ref:A,...h.domAttributes,children:[!R&&f.jsx(k,{id:e,source:h.source,target:h.target,type:h.type,selected:h.selected,animated:h.animated,selectable:I,deletable:h.deletable??!0,label:h.label,labelStyle:h.labelStyle,labelShowBg:h.labelShowBg,labelBgStyle:h.labelBgStyle,labelBgPadding:h.labelBgPadding,labelBgBorderRadius:h.labelBgBorderRadius,sourceX:L,sourceY:b,targetX:N,targetY:$,sourcePosition:O,targetPosition:B,data:h.data,style:h.style,sourceHandleId:h.sourceHandle,targetHandleId:h.targetHandle,markerStart:W,markerEnd:V,pathOptions:"pathOptions"in h?h.pathOptions:void 0,interactionWidth:h.interactionWidth}),j&&f.jsx(iE,{edge:h,isReconnectable:j,reconnectRadius:p,onReconnect:c,onReconnectStart:d,onReconnectEnd:x,sourceX:L,sourceY:b,targetX:N,targetY:$,sourcePosition:O,targetPosition:B,setUpdateHover:D,setReconnecting:E})]})})}var lE=M.memo(sE);const aE=e=>({edgesFocusable:e.edgesFocusable,edgesReconnectable:e.edgesReconnectable,elementsSelectable:e.elementsSelectable,connectionMode:e.connectionMode,onError:e.onError});function Z0({defaultMarkerColor:e,onlyRenderVisibleElements:t,rfId:n,edgeTypes:r,noPanClassName:o,onReconnect:i,onEdgeContextMenu:s,onEdgeMouseEnter:l,onEdgeMouseMove:a,onEdgeMouseLeave:u,onEdgeClick:p,reconnectRadius:c,onEdgeDoubleClick:d,onReconnectStart:x,onReconnectEnd:y,disableKeyboardA11y:w}){const{edgesFocusable:_,edgesReconnectable:m,elementsSelectable:g,onError:h}=ne(aE,fe),v=Y_(t);return f.jsxs("div",{className:"react-flow__edges",children:[f.jsx(q_,{defaultColor:e,rfId:n}),v.map(S=>f.jsx(lE,{id:S,edgesFocusable:_,edgesReconnectable:m,elementsSelectable:g,noPanClassName:o,onReconnect:i,onContextMenu:s,onMouseEnter:l,onMouseMove:a,onMouseLeave:u,onClick:p,reconnectRadius:c,onDoubleClick:d,onReconnectStart:x,onReconnectEnd:y,rfId:n,onError:h,edgeTypes:r,disableKeyboardA11y:w},S))]})}Z0.displayName="EdgeRenderer";const uE=M.memo(Z0),cE=e=>`translate(${e.transform[0]}px,${e.transform[1]}px) scale(${e.transform[2]})`;function dE({children:e}){const t=ne(cE);return f.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:t},children:e})}function fE(e){const t=mc(),n=M.useRef(!1);M.useEffect(()=>{!n.current&&t.viewportInitialized&&e&&(setTimeout(()=>e(t),1),n.current=!0)},[e,t.viewportInitialized])}const pE=e=>{var t;return(t=e.panZoom)==null?void 0:t.syncViewport};function hE(e){const t=ne(pE),n=pe();return M.useEffect(()=>{e&&(t==null||t(e),n.setState({transform:[e.x,e.y,e.zoom]}))},[e,t]),null}function gE(e){return e.connection.inProgress?{...e.connection,to:Qo(e.connection.to,e.transform)}:{...e.connection}}function mE(e){return gE}function yE(e){const t=mE();return ne(t,fe)}const xE=e=>({nodesConnectable:e.nodesConnectable,isValid:e.connection.isValid,inProgress:e.connection.inProgress,width:e.width,height:e.height});function vE({containerStyle:e,style:t,type:n,component:r}){const{nodesConnectable:o,width:i,height:s,isValid:l,inProgress:a}=ne(xE,fe);return!(i&&o&&a)?null:f.jsx("svg",{style:e,width:i,height:s,className:"react-flow__connectionline react-flow__container",children:f.jsx("g",{className:we(["react-flow__connection",Xg(l)]),children:f.jsx(J0,{style:t,type:n,CustomComponent:r,isValid:l})})})}const J0=({style:e,type:t=qt.Bezier,CustomComponent:n,isValid:r})=>{const{inProgress:o,from:i,fromNode:s,fromHandle:l,fromPosition:a,to:u,toNode:p,toHandle:c,toPosition:d,pointer:x}=yE();if(!o)return;if(n)return f.jsx(n,{connectionLineType:t,connectionLineStyle:e,fromNode:s,fromHandle:l,fromX:i.x,fromY:i.y,toX:u.x,toY:u.y,fromPosition:a,toPosition:d,connectionStatus:Xg(r),toNode:p,toHandle:c,pointer:x});let y="";const w={sourceX:i.x,sourceY:i.y,sourcePosition:a,targetX:u.x,targetY:u.y,targetPosition:d};switch(t){case qt.Bezier:[y]=i0(w);break;case qt.SimpleBezier:[y]=B0(w);break;case qt.Step:[y]=Za({...w,borderRadius:0});break;case qt.SmoothStep:[y]=Za(w);break;default:[y]=l0(w)}return f.jsx("path",{d:y,fill:"none",className:"react-flow__connection-path",style:e})};J0.displayName="ConnectionLine";const wE={};function Df(e=wE){M.useRef(e),pe(),M.useEffect(()=>{},[e])}function SE(){pe(),M.useRef(!1),M.useEffect(()=>{},[])}function em({nodeTypes:e,edgeTypes:t,onInit:n,onNodeClick:r,onEdgeClick:o,onNodeDoubleClick:i,onEdgeDoubleClick:s,onNodeMouseEnter:l,onNodeMouseMove:a,onNodeMouseLeave:u,onNodeContextMenu:p,onSelectionContextMenu:c,onSelectionStart:d,onSelectionEnd:x,connectionLineType:y,connectionLineStyle:w,connectionLineComponent:_,connectionLineContainerStyle:m,selectionKeyCode:g,selectionOnDrag:h,selectionMode:v,multiSelectionKeyCode:S,panActivationKeyCode:k,zoomActivationKeyCode:C,deleteKeyCode:j,onlyRenderVisibleElements:I,elementsSelectable:A,defaultViewport:z,translateExtent:D,minZoom:R,maxZoom:E,preventScrolling:T,defaultMarkerColor:P,zoomOnScroll:L,zoomOnPinch:b,panOnScroll:N,panOnScrollSpeed:$,panOnScrollMode:O,zoomOnDoubleClick:B,panOnDrag:W,onPaneClick:V,onPaneMouseEnter:Y,onPaneMouseMove:X,onPaneMouseLeave:Q,onPaneScroll:H,onPaneContextMenu:K,paneClickDistance:ee,nodeClickDistance:G,onEdgeContextMenu:J,onEdgeMouseEnter:q,onEdgeMouseMove:re,onEdgeMouseLeave:le,reconnectRadius:ie,onReconnect:je,onReconnectStart:Vt,onReconnectEnd:jt,noDragClassName:gn,noWheelClassName:Mr,noPanClassName:zr,disableKeyboardA11y:Pr,nodeExtent:nl,rfId:Go,viewport:On,onViewportChange:Tr}){return Df(e),Df(t),SE(),fE(n),hE(On),f.jsx(A_,{onPaneClick:V,onPaneMouseEnter:Y,onPaneMouseMove:X,onPaneMouseLeave:Q,onPaneContextMenu:K,onPaneScroll:H,paneClickDistance:ee,deleteKeyCode:j,selectionKeyCode:g,selectionOnDrag:h,selectionMode:v,onSelectionStart:d,onSelectionEnd:x,multiSelectionKeyCode:S,panActivationKeyCode:k,zoomActivationKeyCode:C,elementsSelectable:A,zoomOnScroll:L,zoomOnPinch:b,zoomOnDoubleClick:B,panOnScroll:N,panOnScrollSpeed:$,panOnScrollMode:O,panOnDrag:W,defaultViewport:z,translateExtent:D,minZoom:R,maxZoom:E,onSelectionContextMenu:c,preventScrolling:T,noDragClassName:gn,noWheelClassName:Mr,noPanClassName:zr,disableKeyboardA11y:Pr,onViewportChange:Tr,isControlledViewport:!!On,children:f.jsxs(dE,{children:[f.jsx(uE,{edgeTypes:t,onEdgeClick:o,onEdgeDoubleClick:s,onReconnect:je,onReconnectStart:Vt,onReconnectEnd:jt,onlyRenderVisibleElements:I,onEdgeContextMenu:J,onEdgeMouseEnter:q,onEdgeMouseMove:re,onEdgeMouseLeave:le,reconnectRadius:ie,defaultMarkerColor:P,noPanClassName:zr,disableKeyboardA11y:Pr,rfId:Go}),f.jsx(vE,{style:w,type:y,component:_,containerStyle:m}),f.jsx("div",{className:"react-flow__edgelabel-renderer"}),f.jsx(U_,{nodeTypes:e,onNodeClick:r,onNodeDoubleClick:i,onNodeMouseEnter:l,onNodeMouseMove:a,onNodeMouseLeave:u,onNodeContextMenu:p,nodeClickDistance:G,onlyRenderVisibleElements:I,noPanClassName:zr,noDragClassName:gn,disableKeyboardA11y:Pr,nodeExtent:nl,rfId:Go}),f.jsx("div",{className:"react-flow__viewport-portal"})]})})}em.displayName="GraphView";const kE=M.memo(em),Of=({nodes:e,edges:t,defaultNodes:n,defaultEdges:r,width:o,height:i,fitView:s,fitViewOptions:l,minZoom:a=.5,maxZoom:u=2,nodeOrigin:p,nodeExtent:c,zIndexMode:d="basic"}={})=>{const x=new Map,y=new Map,w=new Map,_=new Map,m=r??t??[],g=n??e??[],h=p??[0,0],v=c??To;c0(w,_,m);const S=eu(g,x,y,{nodeOrigin:h,nodeExtent:v,zIndexMode:d});let k=[0,0,1];if(s&&o&&i){const C=Yo(x,{filter:z=>!!((z.width||z.initialWidth)&&(z.height||z.initialHeight))}),{x:j,y:I,zoom:A}=uc(C,o,i,a,u,(l==null?void 0:l.padding)??.1);k=[j,I,A]}return{rfId:"1",width:o??0,height:i??0,transform:k,nodes:g,nodesInitialized:S,nodeLookup:x,parentLookup:y,edges:m,edgeLookup:_,connectionLookup:w,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:n!==void 0,hasDefaultEdges:r!==void 0,panZoom:null,minZoom:a,maxZoom:u,translateExtent:To,nodeExtent:v,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:wr.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:h,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:s??!1,fitViewOptions:l,fitViewResolver:null,connection:{...Yg},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:SS,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:Ug,zIndexMode:d,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},_E=({nodes:e,edges:t,defaultNodes:n,defaultEdges:r,width:o,height:i,fitView:s,fitViewOptions:l,minZoom:a,maxZoom:u,nodeOrigin:p,nodeExtent:c,zIndexMode:d})=>Fk((x,y)=>{async function w(){const{nodeLookup:_,panZoom:m,fitViewOptions:g,fitViewResolver:h,width:v,height:S,minZoom:k,maxZoom:C}=y();m&&(await vS({nodes:_,width:v,height:S,panZoom:m,minZoom:k,maxZoom:C},g),h==null||h.resolve(!0),x({fitViewResolver:null}))}return{...Of({nodes:e,edges:t,width:o,height:i,fitView:s,fitViewOptions:l,minZoom:a,maxZoom:u,nodeOrigin:p,nodeExtent:c,defaultNodes:n,defaultEdges:r,zIndexMode:d}),setNodes:_=>{const{nodeLookup:m,parentLookup:g,nodeOrigin:h,elevateNodesOnSelect:v,fitViewQueued:S,zIndexMode:k}=y(),C=eu(_,m,g,{nodeOrigin:h,nodeExtent:c,elevateNodesOnSelect:v,checkEquality:!0,zIndexMode:k});S&&C?(w(),x({nodes:_,nodesInitialized:C,fitViewQueued:!1,fitViewOptions:void 0})):x({nodes:_,nodesInitialized:C})},setEdges:_=>{const{connectionLookup:m,edgeLookup:g}=y();c0(m,g,_),x({edges:_})},setDefaultNodesAndEdges:(_,m)=>{if(_){const{setNodes:g}=y();g(_),x({hasDefaultNodes:!0})}if(m){const{setEdges:g}=y();g(m),x({hasDefaultEdges:!0})}},updateNodeInternals:_=>{const{triggerNodeChanges:m,nodeLookup:g,parentLookup:h,domNode:v,nodeOrigin:S,nodeExtent:k,debug:C,fitViewQueued:j,zIndexMode:I}=y(),{changes:A,updatedInternals:z}=VS(_,g,h,v,S,k,I);z&&(OS(g,h,{nodeOrigin:S,nodeExtent:k,zIndexMode:I}),j?(w(),x({fitViewQueued:!1,fitViewOptions:void 0})):x({}),(A==null?void 0:A.length)>0&&(C&&console.log("React Flow: trigger node changes",A),m==null||m(A)))},updateNodePositions:(_,m=!1)=>{const g=[];let h=[];const{nodeLookup:v,triggerNodeChanges:S,connection:k,updateConnection:C,onNodesChangeMiddlewareMap:j}=y();for(const[I,A]of _){const z=v.get(I),D=!!(z!=null&&z.expandParent&&(z!=null&&z.parentId)&&(A!=null&&A.position)),R={id:I,type:"position",position:D?{x:Math.max(0,A.position.x),y:Math.max(0,A.position.y)}:A.position,dragging:m};if(z&&k.inProgress&&k.fromNode.id===z.id){const E=Ln(z,k.fromHandle,Z.Left,!0);C({...k,from:E})}D&&z.parentId&&g.push({id:I,parentId:z.parentId,rect:{...A.internals.positionAbsolute,width:A.measured.width??0,height:A.measured.height??0}}),h.push(R)}if(g.length>0){const{parentLookup:I,nodeOrigin:A}=y(),z=gc(g,v,I,A);h.push(...z)}for(const I of j.values())h=I(h);S(h)},triggerNodeChanges:_=>{const{onNodesChange:m,setNodes:g,nodes:h,hasDefaultNodes:v,debug:S}=y();if(_!=null&&_.length){if(v){const k=M0(_,h);g(k)}S&&console.log("React Flow: trigger node changes",_),m==null||m(_)}},triggerEdgeChanges:_=>{const{onEdgesChange:m,setEdges:g,edges:h,hasDefaultEdges:v,debug:S}=y();if(_!=null&&_.length){if(v){const k=z0(_,h);g(k)}S&&console.log("React Flow: trigger edge changes",_),m==null||m(_)}},addSelectedNodes:_=>{const{multiSelectionActive:m,edgeLookup:g,nodeLookup:h,triggerNodeChanges:v,triggerEdgeChanges:S}=y();if(m){const k=_.map(C=>xn(C,!0));v(k);return}v(nr(h,new Set([..._]),!0)),S(nr(g))},addSelectedEdges:_=>{const{multiSelectionActive:m,edgeLookup:g,nodeLookup:h,triggerNodeChanges:v,triggerEdgeChanges:S}=y();if(m){const k=_.map(C=>xn(C,!0));S(k);return}S(nr(g,new Set([..._]))),v(nr(h,new Set,!0))},unselectNodesAndEdges:({nodes:_,edges:m}={})=>{const{edges:g,nodes:h,nodeLookup:v,triggerNodeChanges:S,triggerEdgeChanges:k}=y(),C=_||h,j=m||g,I=[];for(const z of C){if(!z.selected)continue;const D=v.get(z.id);D&&(D.selected=!1),I.push(xn(z.id,!1))}const A=[];for(const z of j)z.selected&&A.push(xn(z.id,!1));S(I),k(A)},setMinZoom:_=>{const{panZoom:m,maxZoom:g}=y();m==null||m.setScaleExtent([_,g]),x({minZoom:_})},setMaxZoom:_=>{const{panZoom:m,minZoom:g}=y();m==null||m.setScaleExtent([g,_]),x({maxZoom:_})},setTranslateExtent:_=>{var m;(m=y().panZoom)==null||m.setTranslateExtent(_),x({translateExtent:_})},resetSelectedElements:()=>{const{edges:_,nodes:m,triggerNodeChanges:g,triggerEdgeChanges:h,elementsSelectable:v}=y();if(!v)return;const S=m.reduce((C,j)=>j.selected?[...C,xn(j.id,!1)]:C,[]),k=_.reduce((C,j)=>j.selected?[...C,xn(j.id,!1)]:C,[]);g(S),h(k)},setNodeExtent:_=>{const{nodes:m,nodeLookup:g,parentLookup:h,nodeOrigin:v,elevateNodesOnSelect:S,nodeExtent:k,zIndexMode:C}=y();_[0][0]===k[0][0]&&_[0][1]===k[0][1]&&_[1][0]===k[1][0]&&_[1][1]===k[1][1]||(eu(m,g,h,{nodeOrigin:v,nodeExtent:_,elevateNodesOnSelect:S,checkEquality:!1,zIndexMode:C}),x({nodeExtent:_}))},panBy:_=>{const{transform:m,width:g,height:h,panZoom:v,translateExtent:S}=y();return WS({delta:_,panZoom:v,transform:m,translateExtent:S,width:g,height:h})},setCenter:async(_,m,g)=>{const{width:h,height:v,maxZoom:S,panZoom:k}=y();if(!k)return Promise.resolve(!1);const C=typeof(g==null?void 0:g.zoom)<"u"?g.zoom:S;return await k.setViewport({x:h/2-_*C,y:v/2-m*C,zoom:C},{duration:g==null?void 0:g.duration,ease:g==null?void 0:g.ease,interpolate:g==null?void 0:g.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{x({connection:{...Yg}})},updateConnection:_=>{x({connection:_})},reset:()=>x({...Of()})}},Object.is);function EE({initialNodes:e,initialEdges:t,defaultNodes:n,defaultEdges:r,initialWidth:o,initialHeight:i,initialMinZoom:s,initialMaxZoom:l,initialFitViewOptions:a,fitView:u,nodeOrigin:p,nodeExtent:c,zIndexMode:d,children:x}){const[y]=M.useState(()=>_E({nodes:e,edges:t,defaultNodes:n,defaultEdges:r,width:o,height:i,fitView:u,minZoom:s,maxZoom:l,fitViewOptions:a,nodeOrigin:p,nodeExtent:c,zIndexMode:d}));return f.jsx(Hk,{value:y,children:f.jsx(d_,{children:x})})}function CE({children:e,nodes:t,edges:n,defaultNodes:r,defaultEdges:o,width:i,height:s,fitView:l,fitViewOptions:a,minZoom:u,maxZoom:p,nodeOrigin:c,nodeExtent:d,zIndexMode:x}){return M.useContext(Zs)?f.jsx(f.Fragment,{children:e}):f.jsx(EE,{initialNodes:t,initialEdges:n,defaultNodes:r,defaultEdges:o,initialWidth:i,initialHeight:s,fitView:l,initialFitViewOptions:a,initialMinZoom:u,initialMaxZoom:p,nodeOrigin:c,nodeExtent:d,zIndexMode:x,children:e})}const bE={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function NE({nodes:e,edges:t,defaultNodes:n,defaultEdges:r,className:o,nodeTypes:i,edgeTypes:s,onNodeClick:l,onEdgeClick:a,onInit:u,onMove:p,onMoveStart:c,onMoveEnd:d,onConnect:x,onConnectStart:y,onConnectEnd:w,onClickConnectStart:_,onClickConnectEnd:m,onNodeMouseEnter:g,onNodeMouseMove:h,onNodeMouseLeave:v,onNodeContextMenu:S,onNodeDoubleClick:k,onNodeDragStart:C,onNodeDrag:j,onNodeDragStop:I,onNodesDelete:A,onEdgesDelete:z,onDelete:D,onSelectionChange:R,onSelectionDragStart:E,onSelectionDrag:T,onSelectionDragStop:P,onSelectionContextMenu:L,onSelectionStart:b,onSelectionEnd:N,onBeforeDelete:$,connectionMode:O,connectionLineType:B=qt.Bezier,connectionLineStyle:W,connectionLineComponent:V,connectionLineContainerStyle:Y,deleteKeyCode:X="Backspace",selectionKeyCode:Q="Shift",selectionOnDrag:H=!1,selectionMode:K=Io.Full,panActivationKeyCode:ee="Space",multiSelectionKeyCode:G=Lo()?"Meta":"Control",zoomActivationKeyCode:J=Lo()?"Meta":"Control",snapToGrid:q,snapGrid:re,onlyRenderVisibleElements:le=!1,selectNodesOnDrag:ie,nodesDraggable:je,autoPanOnNodeFocus:Vt,nodesConnectable:jt,nodesFocusable:gn,nodeOrigin:Mr=N0,edgesFocusable:zr,edgesReconnectable:Pr,elementsSelectable:nl=!0,defaultViewport:Go=t_,minZoom:On=.5,maxZoom:Tr=2,translateExtent:wc=To,preventScrolling:lm=!0,nodeExtent:rl,defaultMarkerColor:am="#b1b1b7",zoomOnScroll:um=!0,zoomOnPinch:cm=!0,panOnScroll:dm=!1,panOnScrollSpeed:fm=.5,panOnScrollMode:pm=bn.Free,zoomOnDoubleClick:hm=!0,panOnDrag:gm=!0,onPaneClick:mm,onPaneMouseEnter:ym,onPaneMouseMove:xm,onPaneMouseLeave:vm,onPaneScroll:wm,onPaneContextMenu:Sm,paneClickDistance:km=1,nodeClickDistance:_m=0,children:Em,onReconnect:Cm,onReconnectStart:bm,onReconnectEnd:Nm,onEdgeContextMenu:jm,onEdgeDoubleClick:Mm,onEdgeMouseEnter:zm,onEdgeMouseMove:Pm,onEdgeMouseLeave:Tm,reconnectRadius:Im=10,onNodesChange:Rm,onEdgesChange:Lm,noDragClassName:Am="nodrag",noWheelClassName:$m="nowheel",noPanClassName:Sc="nopan",fitView:kc,fitViewOptions:_c,connectOnClick:Dm,attributionPosition:Om,proOptions:Bm,defaultEdgeOptions:Fm,elevateNodesOnSelect:Hm=!0,elevateEdgesOnSelect:Vm=!1,disableKeyboardA11y:Ec=!1,autoPanOnConnect:Wm,autoPanOnNodeDrag:Um,autoPanSpeed:Ym,connectionRadius:Xm,isValidConnection:Qm,onError:Gm,style:Km,id:Cc,nodeDragThreshold:qm,connectionDragThreshold:Zm,viewport:Jm,onViewportChange:ey,width:ty,height:ny,colorMode:ry="light",debug:oy,onScroll:Ko,ariaLabelConfig:iy,zIndexMode:bc="basic",...sy},ly){const ol=Cc||"1",ay=i_(ry),uy=M.useCallback(Nc=>{Nc.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),Ko==null||Ko(Nc)},[Ko]);return f.jsx("div",{"data-testid":"rf__wrapper",...sy,onScroll:uy,style:{...Km,...bE},ref:ly,className:we(["react-flow",o,ay]),id:Cc,role:"application",children:f.jsxs(CE,{nodes:e,edges:t,width:ty,height:ny,fitView:kc,fitViewOptions:_c,minZoom:On,maxZoom:Tr,nodeOrigin:Mr,nodeExtent:rl,zIndexMode:bc,children:[f.jsx(kE,{onInit:u,onNodeClick:l,onEdgeClick:a,onNodeMouseEnter:g,onNodeMouseMove:h,onNodeMouseLeave:v,onNodeContextMenu:S,onNodeDoubleClick:k,nodeTypes:i,edgeTypes:s,connectionLineType:B,connectionLineStyle:W,connectionLineComponent:V,connectionLineContainerStyle:Y,selectionKeyCode:Q,selectionOnDrag:H,selectionMode:K,deleteKeyCode:X,multiSelectionKeyCode:G,panActivationKeyCode:ee,zoomActivationKeyCode:J,onlyRenderVisibleElements:le,defaultViewport:Go,translateExtent:wc,minZoom:On,maxZoom:Tr,preventScrolling:lm,zoomOnScroll:um,zoomOnPinch:cm,zoomOnDoubleClick:hm,panOnScroll:dm,panOnScrollSpeed:fm,panOnScrollMode:pm,panOnDrag:gm,onPaneClick:mm,onPaneMouseEnter:ym,onPaneMouseMove:xm,onPaneMouseLeave:vm,onPaneScroll:wm,onPaneContextMenu:Sm,paneClickDistance:km,nodeClickDistance:_m,onSelectionContextMenu:L,onSelectionStart:b,onSelectionEnd:N,onReconnect:Cm,onReconnectStart:bm,onReconnectEnd:Nm,onEdgeContextMenu:jm,onEdgeDoubleClick:Mm,onEdgeMouseEnter:zm,onEdgeMouseMove:Pm,onEdgeMouseLeave:Tm,reconnectRadius:Im,defaultMarkerColor:am,noDragClassName:Am,noWheelClassName:$m,noPanClassName:Sc,rfId:ol,disableKeyboardA11y:Ec,nodeExtent:rl,viewport:Jm,onViewportChange:ey}),f.jsx(o_,{nodes:e,edges:t,defaultNodes:n,defaultEdges:r,onConnect:x,onConnectStart:y,onConnectEnd:w,onClickConnectStart:_,onClickConnectEnd:m,nodesDraggable:je,autoPanOnNodeFocus:Vt,nodesConnectable:jt,nodesFocusable:gn,edgesFocusable:zr,edgesReconnectable:Pr,elementsSelectable:nl,elevateNodesOnSelect:Hm,elevateEdgesOnSelect:Vm,minZoom:On,maxZoom:Tr,nodeExtent:rl,onNodesChange:Rm,onEdgesChange:Lm,snapToGrid:q,snapGrid:re,connectionMode:O,translateExtent:wc,connectOnClick:Dm,defaultEdgeOptions:Fm,fitView:kc,fitViewOptions:_c,onNodesDelete:A,onEdgesDelete:z,onDelete:D,onNodeDragStart:C,onNodeDrag:j,onNodeDragStop:I,onSelectionDrag:T,onSelectionDragStart:E,onSelectionDragStop:P,onMove:p,onMoveStart:c,onMoveEnd:d,noPanClassName:Sc,nodeOrigin:Mr,rfId:ol,autoPanOnConnect:Wm,autoPanOnNodeDrag:Um,autoPanSpeed:Ym,onError:Gm,connectionRadius:Xm,isValidConnection:Qm,selectNodesOnDrag:ie,nodeDragThreshold:qm,connectionDragThreshold:Zm,onBeforeDelete:$,debug:oy,ariaLabelConfig:iy,zIndexMode:bc}),f.jsx(e_,{onSelectionChange:R}),Em,f.jsx(Gk,{proOptions:Bm,position:Om}),f.jsx(Qk,{rfId:ol,disableKeyboardA11y:Ec})]})})}var jE=P0(NE);function ME(e){const[t,n]=M.useState(e),r=M.useCallback(o=>n(i=>M0(o,i)),[]);return[t,n,r]}function zE(e){const[t,n]=M.useState(e),r=M.useCallback(o=>n(i=>z0(o,i)),[]);return[t,n,r]}function PE({dimensions:e,lineWidth:t,variant:n,className:r}){return f.jsx("path",{strokeWidth:t,d:`M${e[0]/2} 0 V${e[1]} M0 ${e[1]/2} H${e[0]}`,className:we(["react-flow__background-pattern",n,r])})}function TE({radius:e,className:t}){return f.jsx("circle",{cx:e,cy:e,r:e,className:we(["react-flow__background-pattern","dots",t])})}var un;(function(e){e.Lines="lines",e.Dots="dots",e.Cross="cross"})(un||(un={}));const IE={[un.Dots]:1,[un.Lines]:1,[un.Cross]:6},RE=e=>({transform:e.transform,patternId:`pattern-${e.rfId}`});function tm({id:e,variant:t=un.Dots,gap:n=20,size:r,lineWidth:o=1,offset:i=0,color:s,bgColor:l,style:a,className:u,patternClassName:p}){const c=M.useRef(null),{transform:d,patternId:x}=ne(RE,fe),y=r||IE[t],w=t===un.Dots,_=t===un.Cross,m=Array.isArray(n)?n:[n,n],g=[m[0]*d[2]||1,m[1]*d[2]||1],h=y*d[2],v=Array.isArray(i)?i:[i,i],S=_?[h,h]:g,k=[v[0]*d[2]||1+S[0]/2,v[1]*d[2]||1+S[1]/2],C=`${x}${e||""}`;return f.jsxs("svg",{className:we(["react-flow__background",u]),style:{...a,...el,"--xy-background-color-props":l,"--xy-background-pattern-color-props":s},ref:c,"data-testid":"rf__background",children:[f.jsx("pattern",{id:C,x:d[0]%g[0],y:d[1]%g[1],width:g[0],height:g[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${k[0]},-${k[1]})`,children:w?f.jsx(TE,{radius:h/2,className:p}):f.jsx(PE,{dimensions:S,lineWidth:o,variant:t,className:p})}),f.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${C})`})]})}tm.displayName="Background";const LE=M.memo(tm);function AE(){return f.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:f.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function $E(){return f.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:f.jsx("path",{d:"M0 0h32v4.2H0z"})})}function DE(){return f.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:f.jsx("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"})})}function OE(){return f.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:f.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"})})}function BE(){return f.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:f.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z"})})}function ki({children:e,className:t,...n}){return f.jsx("button",{type:"button",className:we(["react-flow__controls-button",t]),...n,children:e})}const FE=e=>({isInteractive:e.nodesDraggable||e.nodesConnectable||e.elementsSelectable,minZoomReached:e.transform[2]<=e.minZoom,maxZoomReached:e.transform[2]>=e.maxZoom,ariaLabelConfig:e.ariaLabelConfig});function nm({style:e,showZoom:t=!0,showFitView:n=!0,showInteractive:r=!0,fitViewOptions:o,onZoomIn:i,onZoomOut:s,onFitView:l,onInteractiveChange:a,className:u,children:p,position:c="bottom-left",orientation:d="vertical","aria-label":x}){const y=pe(),{isInteractive:w,minZoomReached:_,maxZoomReached:m,ariaLabelConfig:g}=ne(FE,fe),{zoomIn:h,zoomOut:v,fitView:S}=mc(),k=()=>{h(),i==null||i()},C=()=>{v(),s==null||s()},j=()=>{S(o),l==null||l()},I=()=>{y.setState({nodesDraggable:!w,nodesConnectable:!w,elementsSelectable:!w}),a==null||a(!w)},A=d==="horizontal"?"horizontal":"vertical";return f.jsxs(Js,{className:we(["react-flow__controls",A,u]),position:c,style:e,"data-testid":"rf__controls","aria-label":x??g["controls.ariaLabel"],children:[t&&f.jsxs(f.Fragment,{children:[f.jsx(ki,{onClick:k,className:"react-flow__controls-zoomin",title:g["controls.zoomIn.ariaLabel"],"aria-label":g["controls.zoomIn.ariaLabel"],disabled:m,children:f.jsx(AE,{})}),f.jsx(ki,{onClick:C,className:"react-flow__controls-zoomout",title:g["controls.zoomOut.ariaLabel"],"aria-label":g["controls.zoomOut.ariaLabel"],disabled:_,children:f.jsx($E,{})})]}),n&&f.jsx(ki,{className:"react-flow__controls-fitview",onClick:j,title:g["controls.fitView.ariaLabel"],"aria-label":g["controls.fitView.ariaLabel"],children:f.jsx(DE,{})}),r&&f.jsx(ki,{className:"react-flow__controls-interactive",onClick:I,title:g["controls.interactive.ariaLabel"],"aria-label":g["controls.interactive.ariaLabel"],children:w?f.jsx(BE,{}):f.jsx(OE,{})}),p]})}nm.displayName="Controls";const HE=M.memo(nm);function VE({id:e,x:t,y:n,width:r,height:o,style:i,color:s,strokeColor:l,strokeWidth:a,className:u,borderRadius:p,shapeRendering:c,selected:d,onClick:x}){const{background:y,backgroundColor:w}=i||{},_=s||y||w;return f.jsx("rect",{className:we(["react-flow__minimap-node",{selected:d},u]),x:t,y:n,rx:p,ry:p,width:r,height:o,style:{fill:_,stroke:l,strokeWidth:a},shapeRendering:c,onClick:x?m=>x(m,e):void 0})}const WE=M.memo(VE),UE=e=>e.nodes.map(t=>t.id),Bl=e=>e instanceof Function?e:()=>e;function YE({nodeStrokeColor:e,nodeColor:t,nodeClassName:n="",nodeBorderRadius:r=5,nodeStrokeWidth:o,nodeComponent:i=WE,onClick:s}){const l=ne(UE,fe),a=Bl(t),u=Bl(e),p=Bl(n),c=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";return f.jsx(f.Fragment,{children:l.map(d=>f.jsx(QE,{id:d,nodeColorFunc:a,nodeStrokeColorFunc:u,nodeClassNameFunc:p,nodeBorderRadius:r,nodeStrokeWidth:o,NodeComponent:i,onClick:s,shapeRendering:c},d))})}function XE({id:e,nodeColorFunc:t,nodeStrokeColorFunc:n,nodeClassNameFunc:r,nodeBorderRadius:o,nodeStrokeWidth:i,shapeRendering:s,NodeComponent:l,onClick:a}){const{node:u,x:p,y:c,width:d,height:x}=ne(y=>{const w=y.nodeLookup.get(e);if(!w)return{node:void 0,x:0,y:0,width:0,height:0};const _=w.internals.userNode,{x:m,y:g}=w.internals.positionAbsolute,{width:h,height:v}=Ht(_);return{node:_,x:m,y:g,width:h,height:v}},fe);return!u||u.hidden||!Jg(u)?null:f.jsx(l,{x:p,y:c,width:d,height:x,style:u.style,selected:!!u.selected,className:r(u),color:t(u),borderRadius:o,strokeColor:n(u),strokeWidth:i,shapeRendering:s,onClick:a,id:u.id})}const QE=M.memo(XE);var GE=M.memo(YE);const KE=200,qE=150,ZE=e=>!e.hidden,JE=e=>{const t={x:-e.transform[0]/e.transform[2],y:-e.transform[1]/e.transform[2],width:e.width/e.transform[2],height:e.height/e.transform[2]};return{viewBB:t,boundingRect:e.nodeLookup.size>0?Zg(Yo(e.nodeLookup,{filter:ZE}),t):t,rfId:e.rfId,panZoom:e.panZoom,translateExtent:e.translateExtent,flowWidth:e.width,flowHeight:e.height,ariaLabelConfig:e.ariaLabelConfig}},eC="react-flow__minimap-desc";function rm({style:e,className:t,nodeStrokeColor:n,nodeColor:r,nodeClassName:o="",nodeBorderRadius:i=5,nodeStrokeWidth:s,nodeComponent:l,bgColor:a,maskColor:u,maskStrokeColor:p,maskStrokeWidth:c,position:d="bottom-right",onClick:x,onNodeClick:y,pannable:w=!1,zoomable:_=!1,ariaLabel:m,inversePan:g,zoomStep:h=1,offsetScale:v=5}){const S=pe(),k=M.useRef(null),{boundingRect:C,viewBB:j,rfId:I,panZoom:A,translateExtent:z,flowWidth:D,flowHeight:R,ariaLabelConfig:E}=ne(JE,fe),T=(e==null?void 0:e.width)??KE,P=(e==null?void 0:e.height)??qE,L=C.width/T,b=C.height/P,N=Math.max(L,b),$=N*T,O=N*P,B=v*N,W=C.x-($-C.width)/2-B,V=C.y-(O-C.height)/2-B,Y=$+B*2,X=O+B*2,Q=`${eC}-${I}`,H=M.useRef(0),K=M.useRef();H.current=N,M.useEffect(()=>{if(k.current&&A)return K.current=JS({domNode:k.current,panZoom:A,getTransform:()=>S.getState().transform,getViewScale:()=>H.current}),()=>{var q;(q=K.current)==null||q.destroy()}},[A]),M.useEffect(()=>{var q;(q=K.current)==null||q.update({translateExtent:z,width:D,height:R,inversePan:g,pannable:w,zoomStep:h,zoomable:_})},[w,_,g,h,z,D,R]);const ee=x?q=>{var ie;const[re,le]=((ie=K.current)==null?void 0:ie.pointer(q))||[0,0];x(q,{x:re,y:le})}:void 0,G=y?M.useCallback((q,re)=>{const le=S.getState().nodeLookup.get(re).internals.userNode;y(q,le)},[]):void 0,J=m??E["minimap.ariaLabel"];return f.jsx(Js,{position:d,style:{...e,"--xy-minimap-background-color-props":typeof a=="string"?a:void 0,"--xy-minimap-mask-background-color-props":typeof u=="string"?u:void 0,"--xy-minimap-mask-stroke-color-props":typeof p=="string"?p:void 0,"--xy-minimap-mask-stroke-width-props":typeof c=="number"?c*N:void 0,"--xy-minimap-node-background-color-props":typeof r=="string"?r:void 0,"--xy-minimap-node-stroke-color-props":typeof n=="string"?n:void 0,"--xy-minimap-node-stroke-width-props":typeof s=="number"?s:void 0},className:we(["react-flow__minimap",t]),"data-testid":"rf__minimap",children:f.jsxs("svg",{width:T,height:P,viewBox:`${W} ${V} ${Y} ${X}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":Q,ref:k,onClick:ee,children:[J&&f.jsx("title",{id:Q,children:J}),f.jsx(GE,{onClick:G,nodeColor:r,nodeStrokeColor:n,nodeBorderRadius:i,nodeClassName:o,nodeStrokeWidth:s,nodeComponent:l}),f.jsx("path",{className:"react-flow__minimap-mask",d:`M${W-B},${V-B}h${Y+B*2}v${X+B*2}h${-Y-B*2}z - M${j.x},${j.y}h${j.width}v${j.height}h${-j.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}rm.displayName="MiniMap";M.memo(rm);const tC=e=>t=>e?`${Math.max(1/t.transform[2],1)}`:void 0,nC={[An.Line]:"right",[An.Handle]:"bottom-right"};function rC({nodeId:e,position:t,variant:n=An.Handle,className:r,style:o=void 0,children:i,color:s,minWidth:l=10,minHeight:a=10,maxWidth:u=Number.MAX_VALUE,maxHeight:p=Number.MAX_VALUE,keepAspectRatio:c=!1,resizeDirection:d,autoScale:x=!0,shouldResize:y,onResizeStart:w,onResize:_,onResizeEnd:m}){const g=L0(),h=typeof e=="string"?e:g,v=pe(),S=M.useRef(null),k=n===An.Handle,C=ne(M.useCallback(tC(k&&x),[k,x]),fe),j=M.useRef(null),I=t??nC[n];M.useEffect(()=>{if(!(!S.current||!h))return j.current||(j.current=gk({domNode:S.current,nodeId:h,getStoreItems:()=>{const{nodeLookup:z,transform:D,snapGrid:R,snapToGrid:E,nodeOrigin:T,domNode:P}=v.getState();return{nodeLookup:z,transform:D,snapGrid:R,snapToGrid:E,nodeOrigin:T,paneDomNode:P}},onChange:(z,D)=>{const{triggerNodeChanges:R,nodeLookup:E,parentLookup:T,nodeOrigin:P}=v.getState(),L=[],b={x:z.x,y:z.y},N=E.get(h);if(N&&N.expandParent&&N.parentId){const $=N.origin??P,O=z.width??N.measured.width??0,B=z.height??N.measured.height??0,W={id:N.id,parentId:N.parentId,rect:{width:O,height:B,...e0({x:z.x??N.position.x,y:z.y??N.position.y},{width:O,height:B},N.parentId,E,$)}},V=gc([W],E,T,P);L.push(...V),b.x=z.x?Math.max($[0]*O,z.x):void 0,b.y=z.y?Math.max($[1]*B,z.y):void 0}if(b.x!==void 0&&b.y!==void 0){const $={id:h,type:"position",position:{...b}};L.push($)}if(z.width!==void 0&&z.height!==void 0){const O={id:h,type:"dimensions",resizing:!0,setAttributes:d?d==="horizontal"?"width":"height":!0,dimensions:{width:z.width,height:z.height}};L.push(O)}for(const $ of D){const O={...$,type:"position"};L.push(O)}R(L)},onEnd:({width:z,height:D})=>{const R={id:h,type:"dimensions",resizing:!1,dimensions:{width:z,height:D}};v.getState().triggerNodeChanges([R])}})),j.current.update({controlPosition:I,boundaries:{minWidth:l,minHeight:a,maxWidth:u,maxHeight:p},keepAspectRatio:c,resizeDirection:d,onResizeStart:w,onResize:_,onResizeEnd:m,shouldResize:y}),()=>{var z;(z=j.current)==null||z.destroy()}},[I,l,a,u,p,c,w,_,m,y]);const A=I.split("-");return f.jsx("div",{className:we(["react-flow__resize-control","nodrag",...A,n,r]),ref:S,style:{...o,scale:C,...s&&{[k?"backgroundColor":"borderColor"]:s}},children:i})}const Bf=M.memo(rC);function oC({nodeId:e,isVisible:t=!0,handleClassName:n,handleStyle:r,lineClassName:o,lineStyle:i,color:s,minWidth:l=10,minHeight:a=10,maxWidth:u=Number.MAX_VALUE,maxHeight:p=Number.MAX_VALUE,keepAspectRatio:c=!1,autoScale:d=!0,shouldResize:x,onResizeStart:y,onResize:w,onResizeEnd:_}){return t?f.jsxs(f.Fragment,{children:[uk.map(m=>f.jsx(Bf,{className:o,style:i,nodeId:e,position:m,variant:An.Line,color:s,minWidth:l,minHeight:a,maxWidth:u,maxHeight:p,onResizeStart:y,keepAspectRatio:c,autoScale:d,shouldResize:x,onResize:w,onResizeEnd:_},m)),ak.map(m=>f.jsx(Bf,{className:n,style:r,nodeId:e,position:m,color:s,minWidth:l,minHeight:a,maxWidth:u,maxHeight:p,onResizeStart:y,keepAspectRatio:c,autoScale:d,shouldResize:x,onResize:w,onResizeEnd:_},m))]}):null}const ru={compute:"#10b981",database:"#8b5cf6",storage:"#6366f1",network:"#3b82f6",security:"#ef4444",serverless:"#f59e0b",cache:"#8b5cf6",queue:"#f97316",cdn:"#3b82f6",monitoring:"#06b6d4",ml:"#ec4899",analytics:"#a855f7",containers:"#14b8a6",streaming:"#f97316",orchestration:"#a78bfa"},iC={ec2:"compute",ecs:"compute",eks:"compute",emr:"compute",fargate:"compute",codepipeline:"compute",codecommit:"storage",codebuild:"compute",dms:"compute",migration_hub:"compute",compute_engine:"compute",gke:"containers",app_engine:"serverless",cloud_build:"compute",virtual_machines:"compute",aks:"containers",container_apps:"containers",azure_devops:"compute",azure_migrate:"compute",rds:"database",aurora:"database",dynamodb:"database",cloud_sql:"database",azure_sql:"database",cosmos_db:"database",redshift:"database",bigquery:"database",firestore:"database",spanner:"database",alloydb:"database",s3:"storage",cloud_storage:"storage",blob_storage:"storage",ebs:"storage",ecr:"storage",fsx:"storage",efs:"storage",artifact_registry:"storage",alb:"network",nlb:"network",route53:"network",cloud_load_balancing:"network",app_gateway:"network",cloud_dns:"network",direct_connect:"network",vpn:"network",azure_lb:"network",azure_dns:"network",cloud_interconnect:"network",api_management:"network",cloudfront:"cdn",cloud_cdn:"cdn",azure_cdn:"cdn",waf:"security",cognito:"security",kms:"security",cloudtrail:"security",guardduty:"security",shield:"security",security_hub:"security",config:"security",inspector:"security",cloud_armor:"security",firebase_auth:"security",azure_waf:"security",azure_ad:"security",azure_firewall:"security",azure_sentinel:"security",azure_policy:"security",lambda:"serverless",api_gateway:"serverless",cloud_functions:"serverless",cloud_run:"serverless",azure_functions:"serverless",step_functions:"serverless",glue:"serverless",app_service:"serverless",elasticache:"cache",memorystore:"cache",azure_cache:"cache",sqs:"queue",sns:"queue",pub_sub:"queue",service_bus:"queue",kinesis:"queue",eventbridge:"queue",cloudwatch:"monitoring",cloud_logging:"monitoring",azure_monitor:"monitoring",sagemaker:"ml",vertex_ai:"ml",azure_ml:"ml",athena:"analytics",dataproc:"analytics",data_factory:"analytics",synapse:"analytics",dataflow:"streaming",event_hubs:"streaming",cloud_composer:"orchestration",logic_apps:"orchestration",databricks_sql_warehouse:"analytics",databricks_cluster:"compute",databricks_job:"orchestration",databricks_pipeline:"streaming",databricks_model_serving:"ml",databricks_unity_catalog:"security",databricks_vector_search:"database",databricks_genie:"analytics",databricks_notebook:"compute",databricks_secret_scope:"security",databricks_dashboard:"analytics",databricks_volume:"storage"},Ff={compute:"M5 12H3l9-9 9 9h-2M5 12v7a2 2 0 002 2h10a2 2 0 002-2v-7",database:"M12 2C6.48 2 2 4.24 2 7v10c0 2.76 4.48 5 10 5s10-2.24 10-5V7c0-2.76-4.48-5-10-5zM2 12c0 2.76 4.48 5 10 5s10-2.24 10-5",storage:"M20 7H4a1 1 0 00-1 1v8a1 1 0 001 1h16a1 1 0 001-1V8a1 1 0 00-1-1zM4 12h16",network:"M12 2a10 10 0 100 20 10 10 0 000-20zm0 0a14.5 14.5 0 014 10 14.5 14.5 0 01-4 10 14.5 14.5 0 01-4-10A14.5 14.5 0 0112 2zM2 12h20",security:"M12 2l7 4v5c0 5.25-3.5 10.74-7 12-3.5-1.26-7-6.75-7-12V6l7-4z",serverless:"M13 2L3 14h9l-1 8 10-12h-9l1-8z",cache:"M4 4h16v4H4zM4 10h16v4H4zM4 16h16v4H4z",queue:"M4 6h16M4 12h16M4 18h16",cdn:"M12 2a10 10 0 100 20 10 10 0 000-20zm-1 17.93A8 8 0 013 12a8 8 0 018-7.93M12 2v20M2 12h20M4.22 7h15.56M4.22 17h15.56",monitoring:"M3 3v18h18M7 16l4-8 4 4 4-6",ml:"M12 2a4 4 0 014 4c0 1.95-1.4 3.57-3.24 3.9L12 14l-.76-4.1A4 4 0 018 6a4 4 0 014-4zM8 14h8M6 18h12M9 22h6",analytics:"M18 20V10M12 20V4M6 20v-6",containers:"M21 16V8a2 2 0 00-1-1.73l-7-4a2 2 0 00-2 0l-7 4A2 2 0 003 8v8a2 2 0 001 1.73l7 4a2 2 0 002 0l7-4A2 2 0 0021 16zM3.27 6.96L12 12l8.73-5.04M12 22.08V12",streaming:"M2 12c2-3 4-3 6 0s4 3 6 0 4-3 6 0 4 3 6 0",orchestration:"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83"};function xc(e){return iC[e]||"compute"}function om(e){return ru[e]||"#94a3b8"}function vc(e){return Ff[e]||Ff.compute}function sC({data:e}){const t=e,n=xc(t.service),r=om(n),o=vc(n);return f.jsxs("div",{style:{background:"#ffffff",border:`2px solid ${r}`,borderRadius:10,padding:"8px 12px",color:"#0f172a",minWidth:160,position:"relative",boxShadow:"0 1px 3px rgba(0,0,0,0.08)"},children:[f.jsx(Cr,{type:"target",position:Z.Top,style:{background:r}}),f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,marginBottom:4},children:[f.jsx("svg",{width:16,height:16,viewBox:"0 0 24 24",fill:"none",stroke:r,strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block",width:28,height:28,padding:5,borderRadius:6,background:`${r}22`},children:f.jsx("path",{d:o})}),f.jsx("span",{style:{fontSize:9,color:"#64748b",textTransform:"uppercase",letterSpacing:1},children:n})]}),f.jsx("div",{style:{fontWeight:600,fontSize:13,marginBottom:2,color:"#0f172a"},children:t.label}),f.jsxs("div",{style:{fontSize:11,color:"#64748b"},children:[t.service,f.jsx("span",{style:{marginLeft:6,padding:"1px 4px",borderRadius:3,background:"#e2e8f0",color:"#475569",fontSize:9,textTransform:"uppercase"},children:t.provider})]}),t.monthlyCost!=null&&t.monthlyCost>0&&f.jsxs("div",{style:{fontSize:10,color:"#2563eb",marginTop:4},children:["$",t.monthlyCost.toFixed(0),"/mo"]}),f.jsx(Cr,{type:"source",position:Z.Bottom,style:{background:r}})]})}const lC=M.memo(sC);function aC({data:e,selected:t}){return f.jsxs(f.Fragment,{children:[f.jsx(oC,{color:e.dotColor,isVisible:t??!1,minWidth:200,minHeight:100,lineStyle:{borderWidth:1.5},handleStyle:{width:8,height:8,borderRadius:2}}),f.jsxs("div",{style:{position:"absolute",top:6,left:8,display:"inline-flex",alignItems:"center",gap:5,padding:"3px 10px 3px 7px",borderRadius:5,background:e.labelBg,border:`1px solid ${e.dotColor}30`,boxShadow:"0 1px 2px rgba(0,0,0,0.04)",pointerEvents:"none"},children:[f.jsx("span",{style:{width:7,height:7,borderRadius:"50%",background:e.dotColor,flexShrink:0}}),f.jsx("span",{style:{color:e.labelColor,fontSize:11,fontWeight:600,letterSpacing:"0.02em",whiteSpace:"nowrap",lineHeight:1},children:e.label})]})]})}function uC({components:e}){const[t,n]=M.useState(!1),r=M.useMemo(()=>{if(!e||e.length===0)return Object.keys(ru).map(i=>({category:i,count:0}));const o={};for(const i of e){const s=xc(i.service);o[s]=(o[s]||0)+1}return Object.entries(o).sort(([,i],[,s])=>s-i).map(([i,s])=>({category:i,count:s}))},[e]);return f.jsxs("div",{style:{position:"absolute",bottom:16,left:16,zIndex:10,background:"#ffffff",border:"1px solid #e2e8f0",borderRadius:8,padding:"8px 12px",fontSize:11,color:"#64748b",boxShadow:"0 1px 4px rgba(0,0,0,0.08)",maxHeight:t?"auto":260,overflowY:t?"visible":"auto"},children:[f.jsxs("div",{onClick:()=>n(o=>!o),style:{fontWeight:600,marginBottom:t?0:4,color:"#0f172a",cursor:"pointer",userSelect:"none",display:"flex",alignItems:"center",justifyContent:"space-between",gap:8},children:["Legend",f.jsx("span",{style:{fontSize:10,color:"#94a3b8"},children:t?"+":"-"})]}),!t&&r.map(({category:o,count:i})=>{const s=ru[o]||"#94a3b8",l=vc(o);return f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,marginBottom:2},children:[f.jsx("svg",{width:12,height:12,viewBox:"0 0 24 24",fill:"none",stroke:s,strokeWidth:2.5,strokeLinecap:"round",strokeLinejoin:"round",style:{flexShrink:0},children:f.jsx("path",{d:l})}),f.jsx("span",{style:{textTransform:"capitalize"},children:o}),i>0&&f.jsxs("span",{style:{color:"#94a3b8",fontSize:10},children:["(",i,")"]})]},o)})]})}function cC({onExportSvg:e,onExportPng:t,showBoundaries:n,onToggleBoundaries:r}){const o={padding:"4px 10px",borderRadius:4,border:"1px solid #e2e8f0",background:"#ffffff",color:"#475569",cursor:"pointer",fontSize:11};return f.jsxs("div",{style:{position:"absolute",top:16,right:16,zIndex:10,display:"flex",gap:4,background:"#ffffff",padding:4,border:"1px solid #e2e8f0",borderRadius:8,boxShadow:"0 1px 4px rgba(0,0,0,0.08)"},children:[e&&f.jsx("button",{style:o,onClick:e,children:"Export SVG"}),t&&f.jsx("button",{style:o,onClick:t,children:"Export PNG"}),f.jsxs("button",{style:{...o,background:n?"#f1f5f9":"#ffffff"},onClick:r,children:[n?"Hide":"Show"," Boundaries"]})]})}const Hf={borderTop:"1px solid #e2e8f0",margin:"12px 0"},_i={fontSize:11,fontWeight:600,color:"#64748b",textTransform:"uppercase",letterSpacing:"0.05em",marginBottom:8},Fl={display:"block",fontSize:12,fontWeight:600,color:"#64748b",marginBottom:5},Vr={width:"100%",boxSizing:"border-box",border:"1px solid #cbd5e1",borderRadius:6,padding:"8px 10px",color:"#0f172a",fontSize:13,outline:"none",background:"#ffffff"},Hl={display:"flex",justifyContent:"space-between",alignItems:"center",gap:10,color:"#475569",fontSize:13,marginBottom:7};function im(e){return typeof e=="boolean"?e?"true":"false":e==null?"":String(e)}function dC(e,t){return Object.entries(e??{}).filter(([n,r])=>r!=null&&n!=="tags").map(([n,r])=>`${n}=${im(r)}`).join(` -`)}function fC(e){const t=e==null?void 0:e.tags;return!t||typeof t!="object"||Array.isArray(t)?"":Object.entries(t).map(([n,r])=>`${n}=${im(r)}`).join(` -`)}function pC(e){const t=e.trim();return t==="true"?!0:t==="false"?!1:t!==""&&!Number.isNaN(Number(t))?Number(t):e}function Vf(e){const t={};for(const n of e.split(` -`)){const r=n.trim();if(!r)continue;const o=r.indexOf("=");if(o===-1){t[r]=!0;continue}const i=r.slice(0,o).trim();i&&(t[i]=pC(r.slice(o+1)))}return t}function hC({component:e,cost:t,onClose:n,onApply:r,onDelete:o}){var k;const i=e!==null,[s,l]=M.useState(""),[a,u]=M.useState(""),[p,c]=M.useState("2"),[d,x]=M.useState(""),[y,w]=M.useState("");M.useEffect(()=>{e&&(l(e.label),u(e.description??""),c(String(e.tier??2)),x(dC(e.config)),w(fC(e.config)))},[e]);const _=e?xc(e.service):"compute",m=om(_),g=vc(_),h=(t==null?void 0:t.monthly)??null,v=M.useMemo(()=>{const C=Number(p);return Number.isFinite(C)?C:2},[p]),S=()=>{if(!e)return;const C=Vf(d),j=Vf(y);Object.keys(j).length>0&&(C.tags=j),r({...e,label:s.trim()||e.label,description:a,tier:v,config:C})};return f.jsxs("div",{style:{position:"absolute",top:0,right:0,width:340,height:"100%",background:"#ffffff",borderLeft:"1px solid #e2e8f0",transform:i?"translateX(0)":"translateX(100%)",transition:"transform 0.2s ease",zIndex:20,display:"flex",flexDirection:"column",overflow:"hidden",boxShadow:"-2px 0 8px rgba(0,0,0,0.06)"},children:[f.jsxs("div",{style:{padding:"16px 16px 12px",borderBottom:"1px solid #e2e8f0"},children:[f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:8},children:[f.jsx("div",{style:{width:36,height:36,borderRadius:8,background:`${m}22`,border:`1.5px solid ${m}`,display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:f.jsx("svg",{width:20,height:20,viewBox:"0 0 24 24",fill:"none",stroke:m,strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block"},children:f.jsx("path",{d:g})})}),f.jsx("span",{style:{fontSize:16,fontWeight:700,color:"#0f172a",flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:(e==null?void 0:e.label)??"Resource"}),f.jsx("button",{onClick:n,style:{background:"none",border:"none",color:"#94a3b8",cursor:"pointer",fontSize:18,lineHeight:1,padding:"2px 4px",flexShrink:0},"aria-label":"Close panel",children:"x"})]}),f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[f.jsx("span",{style:{background:"#f1f5f9",color:"#475569",borderRadius:4,fontSize:11,fontWeight:600,padding:"2px 8px",textTransform:"uppercase"},children:e==null?void 0:e.provider}),f.jsx("span",{style:{color:"#64748b",fontSize:12},children:e==null?void 0:e.service})]})]}),f.jsxs("div",{style:{flex:1,overflowY:"auto",padding:"12px 16px"},children:[f.jsx("div",{style:_i,children:"Overview"}),f.jsx("label",{style:Fl,htmlFor:"resource-label",children:"Label"}),f.jsx("input",{id:"resource-label","aria-label":"Label",value:s,onChange:C=>l(C.target.value),style:{...Vr,marginBottom:10}}),f.jsx("label",{style:Fl,htmlFor:"resource-description",children:"Description"}),f.jsx("textarea",{id:"resource-description","aria-label":"Description",value:a,onChange:C=>u(C.target.value),rows:3,style:{...Vr,marginBottom:10,resize:"vertical",minHeight:72}}),f.jsx("label",{style:Fl,htmlFor:"resource-tier",children:"Tier"}),f.jsx("input",{id:"resource-tier","aria-label":"Tier",type:"number",value:p,onChange:C=>c(C.target.value),style:{...Vr,marginBottom:10}}),f.jsxs("div",{style:Hl,children:[f.jsx("span",{children:"Service"}),f.jsx("strong",{style:{color:"#0f172a"},children:e==null?void 0:e.service})]}),f.jsxs("div",{style:Hl,children:[f.jsx("span",{children:"Provider"}),f.jsx("strong",{style:{color:"#0f172a"},children:(k=e==null?void 0:e.provider)==null?void 0:k.toUpperCase()})]}),f.jsx("div",{style:Hf}),f.jsx("div",{style:_i,children:"Cost"}),h!==null?f.jsxs("div",{style:Hl,children:[f.jsx("span",{children:"Monthly"}),f.jsxs("strong",{style:{color:"#2563eb"},children:["$",h.toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:2})]})]}):f.jsx("p",{style:{color:"#94a3b8",fontSize:13},children:"No cost data"}),f.jsx("div",{style:Hf}),f.jsx("div",{style:_i,children:"Configuration"}),f.jsx("textarea",{"aria-label":"Configuration",value:d,onChange:C=>x(C.target.value),rows:7,style:{...Vr,resize:"vertical",minHeight:140,fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace"}}),f.jsx("div",{style:{..._i,marginTop:16},children:"Tags"}),f.jsx("textarea",{"aria-label":"Tags",value:y,onChange:C=>w(C.target.value),rows:5,style:{...Vr,resize:"vertical",minHeight:110,fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace"}})]}),f.jsxs("div",{style:{padding:12,borderTop:"1px solid #e2e8f0",display:"flex",gap:8},children:[f.jsx("button",{onClick:S,disabled:!e,style:{flex:1,border:"none",borderRadius:6,padding:"10px 12px",background:"#2563eb",color:"#ffffff",cursor:e?"pointer":"not-allowed",fontSize:14,fontWeight:700},children:"Apply"}),f.jsx("button",{onClick:()=>e&&o(e.id),disabled:!e,style:{border:"1px solid #fecaca",borderRadius:6,padding:"10px 12px",background:"#fef2f2",color:"#b91c1c",cursor:e?"pointer":"not-allowed",fontSize:14,fontWeight:700},children:"Delete"})]})]})}const Wf="/api",Vl={border:"1px solid #cbd5e1",background:"#ffffff",color:"#0f172a",borderRadius:6,padding:"7px 10px",cursor:"pointer",fontSize:12,fontWeight:600};function gC({provider:e,standardsResult:t,onAddResource:n,onAddModule:r,onCheckStandards:o}){const i=(e||"aws").toLowerCase(),[s,l]=M.useState(!0),[a,u]=M.useState("resources"),[p,c]=M.useState(""),[d,x]=M.useState([]),[y,w]=M.useState([]);M.useEffect(()=>{fetch(`${Wf}/catalog/services?provider=${encodeURIComponent(i)}`).then(g=>g.ok?g.json():null).then(g=>x((g==null?void 0:g.services)??[])).catch(()=>x([]))},[i]),M.useEffect(()=>{fetch(`${Wf}/modules`).then(g=>g.ok?g.json():null).then(g=>w((g==null?void 0:g.modules)??[])).catch(()=>w([]))},[]);const _=M.useMemo(()=>{const g=p.trim().toLowerCase();return g?d.filter(h=>[h.name,h.service_key,h.category,h.description??""].some(v=>v.toLowerCase().includes(g))):d},[d,p]),m=M.useMemo(()=>{const g=p.trim().toLowerCase(),h=y.filter(v=>v.provider.toLowerCase()===i);return g?h.filter(v=>[v.name,v.id,v.category,v.description??"",...v.tags??[]].some(S=>S.toLowerCase().includes(g))):h},[y,i,p]);return s?f.jsxs("div",{style:{position:"absolute",top:0,left:0,width:320,height:"100%",zIndex:14,background:"#ffffff",borderRight:"1px solid #e2e8f0",boxShadow:"2px 0 8px rgba(0,0,0,0.06)",display:"flex",flexDirection:"column"},children:[f.jsxs("div",{style:{padding:14,borderBottom:"1px solid #e2e8f0"},children:[f.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:10},children:[f.jsx("div",{style:{fontSize:15,fontWeight:700,color:"#0f172a"},children:"Catalog"}),f.jsx("button",{onClick:()=>l(!1),style:{border:"none",background:"transparent",color:"#64748b",cursor:"pointer",fontSize:18},"aria-label":"Close catalog",children:"x"})]}),f.jsx("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr 1fr",gap:4,marginBottom:10},children:["resources","modules","standards"].map(g=>f.jsx("button",{onClick:()=>u(g),style:{...Vl,padding:"6px 4px",borderColor:a===g?"#2563eb":"#cbd5e1",color:a===g?"#2563eb":"#475569",background:a===g?"#eff6ff":"#ffffff",textTransform:"capitalize"},children:g},g))}),a!=="standards"&&f.jsx("input",{value:p,onChange:g=>c(g.target.value),placeholder:"Search",style:{width:"100%",boxSizing:"border-box",border:"1px solid #cbd5e1",borderRadius:6,padding:"8px 10px",color:"#0f172a",fontSize:13,outline:"none"}})]}),f.jsxs("div",{style:{flex:1,overflowY:"auto",padding:12},children:[a==="resources"&&_.map(g=>f.jsxs("button",{onClick:()=>n(g),style:{width:"100%",textAlign:"left",border:"1px solid #e2e8f0",background:"#ffffff",borderRadius:8,padding:10,marginBottom:8,cursor:"pointer"},children:[f.jsxs("div",{style:{display:"flex",justifyContent:"space-between",gap:8},children:[f.jsx("span",{style:{color:"#0f172a",fontSize:13,fontWeight:700},children:g.name}),f.jsx("span",{style:{color:"#64748b",fontSize:10,textTransform:"uppercase"},children:g.category.replace(/_/g," ")})]}),f.jsx("div",{style:{color:"#64748b",fontSize:11,marginTop:4},children:g.service_key})]},`${g.provider}:${g.service_key}`)),a==="resources"&&_.length===0&&f.jsxs("p",{style:{color:"#64748b",fontSize:13},children:["No resources found for ",i.toUpperCase(),"."]}),a==="modules"&&m.map(g=>f.jsxs("button",{onClick:()=>r(g.id),style:{width:"100%",textAlign:"left",border:"1px solid #bfdbfe",background:"#eff6ff",borderRadius:8,padding:10,marginBottom:8,cursor:"pointer"},children:[f.jsx("div",{style:{color:"#0f172a",fontSize:13,fontWeight:700},children:g.name}),f.jsx("div",{style:{color:"#475569",fontSize:12,marginTop:4,lineHeight:1.35},children:g.description}),f.jsx("div",{style:{color:"#2563eb",fontSize:11,marginTop:6,textTransform:"uppercase"},children:g.category})]},g.id)),a==="modules"&&m.length===0&&f.jsxs("p",{style:{color:"#64748b",fontSize:13},children:["No approved modules found for ",i.toUpperCase(),"."]}),a==="standards"&&f.jsxs(f.Fragment,{children:[f.jsx("button",{onClick:o,style:{...Vl,width:"100%",marginBottom:12},children:"Check Standards"}),!t&&f.jsx("p",{style:{color:"#64748b",fontSize:13},children:"No standards check has run."}),(t==null?void 0:t.passed)&&f.jsx("div",{style:{color:"#166534",background:"#dcfce7",borderRadius:8,padding:10,fontSize:13},children:"Standards passed."}),t&&!t.passed&&f.jsx("div",{children:t.violations.map((g,h)=>f.jsxs("div",{style:{border:"1px solid #fecaca",background:"#fef2f2",borderRadius:8,padding:10,marginBottom:8},children:[f.jsx("div",{style:{color:"#991b1b",fontSize:12,fontWeight:700},children:g.code.replace(/_/g," ")}),f.jsx("div",{style:{color:"#7f1d1d",fontSize:12,marginTop:4,lineHeight:1.4},children:g.message})]},`${g.code}:${h}`))})]})]})]}):f.jsx("button",{onClick:()=>l(!0),style:{...Vl,position:"absolute",left:16,top:16,zIndex:15,boxShadow:"0 1px 4px rgba(0,0,0,0.08)"},children:"Add Resource"})}const Uf=200,Ei=90,Yf=300,mC=240,yt=32,yC=36,Wr=4,Wl="/api",xC={0:"Edge / CDN",1:"Network / Ingress",2:"Application",3:"Data Layer",4:"Platform Services",5:"Platform Services"},vC={0:"edge",1:"subnet",2:"subnet",3:"subnet"},Ul={0:{border:"#60a5fa",bg:"rgba(219, 234, 254, 0.18)",labelColor:"#1d4ed8",labelBg:"rgba(219, 234, 254, 0.92)",dot:"#3b82f6"},1:{border:"#34d399",bg:"rgba(209, 250, 229, 0.18)",labelColor:"#047857",labelBg:"rgba(209, 250, 229, 0.92)",dot:"#10b981"},2:{border:"#fb923c",bg:"rgba(255, 237, 213, 0.18)",labelColor:"#9a3412",labelBg:"rgba(255, 237, 213, 0.92)",dot:"#f97316"},3:{border:"#a78bfa",bg:"rgba(237, 233, 254, 0.18)",labelColor:"#5b21b6",labelBg:"rgba(237, 233, 254, 0.92)",dot:"#8b5cf6"},4:{border:"#2dd4bf",bg:"rgba(204, 251, 241, 0.18)",labelColor:"#0f766e",labelBg:"rgba(204, 251, 241, 0.92)",dot:"#14b8a6"},5:{border:"#2dd4bf",bg:"rgba(204, 251, 241, 0.18)",labelColor:"#0f766e",labelBg:"rgba(204, 251, 241, 0.92)",dot:"#14b8a6"}},Hn={border:"#94a3b8",bg:"rgba(241, 245, 249, 0.35)",labelColor:"#475569",labelBg:"rgba(241, 245, 249, 0.92)",dot:"#94a3b8"},wC={cloudService:lC,boundaryGroup:aC};function ou(e){return JSON.parse(JSON.stringify(e))}function Ci(e){return ou(e??{})}function bi(e,t="resource"){let n=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"_").replace(/^[_-]+|[_-]+$/g,"");return n||(n=t),/^[a-z_]/.test(n)||(n=`${t}_${n}`),n}function Yl(e,t){let n=e,r=2;for(;t.has(n);)n=`${e}-${r}`,r+=1;return t.add(n),n}function SC(e){const t=e.toLowerCase();return t.includes("cdn")||t.includes("edge")?0:t.includes("network")||t.includes("security")?1:t.includes("database")||t.includes("cache")?3:t.includes("storage")||t.includes("analytics")||t.includes("data")?4:2}function Xf(e){return{x:360+e%3*260,y:80+Math.floor(e/3)*150}}function kC(e,t){if(t==="vpc")return Hn;const n=e.match(/^tier-(\d+)$/);return n&&Ul[parseInt(n[1])]||Ul[2]}function _C(e){const t={};for(const i of e){const s=i.tier??2;t[s]||(t[s]=[]),t[s].push(i.id)}const n=Object.keys(t).map(Number).sort(),r=[];for(const i of n)r.push({id:`tier-${i}`,kind:vC[i]||"subnet",label:xC[i]||`Tier ${i}`,component_ids:t[i]});const o=r.filter(i=>i.id!=="tier-0").flatMap(i=>i.component_ids);return o.length>=2&&r.unshift({id:"vpc",kind:"vpc",label:"VPC / Virtual Network",component_ids:o}),r}function EC(e,t,n){var y,w,_,m;const r=[],o=e.boundaries||[],i=o.length>0?o:_C(e.components),s=((w=(y=e.metadata)==null?void 0:y.canvas)==null?void 0:w.nodes)??{},l={};if(t){for(const g of i)if(g.kind!=="vpc")for(const h of g.component_ids)l[h]||(l[h]=g.id)}const a={};for(const g of e.components){const h=g.tier??2;a[h]||(a[h]=[]),a[h].push(g)}const u=Object.keys(a).map(Number).sort(),p={};let c=40;const d={};for(const g of u){d[g]=c;const h=Math.ceil(a[g].length/Wr);c+=mC+(h-1)*(Ei+60)}for(const g of u){const h=a[g],v=d[g];for(let S=0;S0){const g=i.find(v=>v.kind==="vpc");let h;if(g&&g.component_ids.length>0){const v=g.component_ids.map(A=>{var z;return((z=p[A])==null?void 0:z.x)??0}),S=g.component_ids.map(A=>{var z;return((z=p[A])==null?void 0:z.y)??0}),k=Math.min(...v)-yt,C=Math.min(...S)-yt-24-yC,j=Math.max(...v)+Uf+yt,I=Math.max(...S)+Ei+yt;h=`boundary-${g.id}`,x[g.id]={x:k,y:C},r.push({id:h,type:"boundaryGroup",position:{x:k,y:C},data:{label:g.label||g.id,labelColor:Hn.labelColor,labelBg:Hn.labelBg,dotColor:Hn.dot},style:{background:Hn.bg,border:`2px dashed ${Hn.border}`,borderRadius:16,padding:yt,width:j-k,height:I-C},zIndex:-2})}for(const v of i){if(v.kind==="vpc"||v.component_ids.length===0)continue;const S=v.component_ids.map(R=>{var E;return((E=p[R])==null?void 0:E.x)??0}),k=v.component_ids.map(R=>{var E;return((E=p[R])==null?void 0:E.y)??0}),C=Math.min(...S)-yt,j=Math.min(...k)-yt-24,I=Math.max(...S)+Uf+yt,A=Math.max(...k)+Ei+yt;x[v.id]={x:C,y:j};const z=kC(v.id,v.kind),D=!!(h&&g&&v.component_ids.some(R=>g.component_ids.includes(R)));r.push({id:`boundary-${v.id}`,type:"boundaryGroup",position:D?{x:C-x[g.id].x,y:j-x[g.id].y}:{x:C,y:j},data:{label:v.label||v.id,labelColor:z.labelColor,labelBg:z.labelBg,dotColor:z.dot},style:{background:z.bg,border:`1.5px solid ${z.border}`,borderRadius:10,padding:yt,width:I-C,height:A-j},zIndex:-1,parentId:D?h:void 0})}}for(const g of u){const h=a[g];for(const v of h){const S=l[v.id],k=t&&S&&x[S];let C=((_=p[v.id])==null?void 0:_.x)??0,j=((m=p[v.id])==null?void 0:m.y)??0;k&&(C-=x[S].x,j-=x[S].y),r.push({id:v.id,type:"cloudService",position:{x:C,y:j},data:{label:v.label,service:v.service,provider:v.provider,description:v.description,tier:v.tier,config:v.config||{},monthlyCost:n[v.id]},parentId:k?`boundary-${S}`:void 0,extent:k?"parent":void 0})}}return r}function sm(e,t){return`edge:${e.source}:${e.target}:${t}`}function Qf(e){return e.connections.map((t,n)=>{let r=t.label||"";return t.protocol&&!r.includes(t.protocol)&&(r=t.protocol+(t.port?`:${t.port}`:"")),{id:sm(t,n),source:t.source,target:t.target,label:r,style:{stroke:"#94a3b8"},labelStyle:{fill:"#64748b",fontSize:11},animated:!0}})}function CC(e,t){return e&&e.map(n=>({...n,component_ids:n.component_ids.filter(r=>r!==t)}))}function bC({spec:e,onSpecChange:t}){const[n,r]=M.useState(!0),[o,i]=M.useState(null),[s,l]=M.useState(null),a=M.useCallback(R=>{l(null),t(R)},[t]),u=M.useCallback(async R=>{try{const E=await fetch(`${Wl}/export`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e,format:R})});if(!E.ok)return;const T=await E.blob(),P=URL.createObjectURL(T),L=document.createElement("a");L.href=P,L.download=`architecture.${R}`,L.click(),URL.revokeObjectURL(P)}catch{}},[e]),p=M.useMemo(()=>{var E;const R={};for(const T of((E=e.cost_estimate)==null?void 0:E.breakdown)??[])R[T.component_id]=T.monthly;return R},[e.cost_estimate]),c=M.useMemo(()=>o?e.components.find(R=>R.id===o)??null:null,[o,e.components]),d=M.useMemo(()=>{var R;return o?((R=e.cost_estimate)==null?void 0:R.breakdown.find(E=>E.component_id===o))??null:null},[o,e.cost_estimate]),[x,y,w]=ME([]),[_,m,g]=zE([]);M.useEffect(()=>{y(EC(e,n,p)),m(Qf(e))},[e,n,p,y,m]);const h=M.useCallback((R,E)=>{E.id.startsWith("boundary-")||i(E.id)},[]),v=M.useCallback(()=>{i(null)},[]),S=M.useCallback((R,E)=>{if(E.id.startsWith("boundary-"))return;const T=Ci(e.metadata),P=T.canvas??{},L={...P.nodes??{}},b=x.find($=>$.id===E.parentId),N=b?{x:b.position.x+E.position.x,y:b.position.y+E.position.y}:{x:E.position.x,y:E.position.y};L[E.id]=N,T.canvas={...P,nodes:L},a({...e,metadata:T})},[a,x,e]),k=M.useCallback(R=>{!R.source||!R.target||R.source===R.target||e.connections.some(T=>T.source===R.source&&T.target===R.target)||a({...e,connections:[...e.connections,{source:R.source,target:R.target,label:"HTTPS",protocol:"HTTPS",port:443}]})},[a,e]),C=M.useCallback(R=>{if(R.length===0)return;if(!window.confirm(`Delete ${R.length===1?"this connection":"these connections"}?`)){m(Qf(e));return}const E=new Set(R.map(T=>T.id));a({...e,connections:e.connections.filter((T,P)=>!E.has(sm(T,P)))})},[a,m,e]),j=M.useCallback(R=>{a({...e,components:e.components.map(E=>E.id===R.id?R:E)})},[a,e]),I=M.useCallback(R=>{var L,b;const E=e.components.find(N=>N.id===R);if(!E||!window.confirm(`Delete ${E.label||E.id} and its connections?`))return;const T=Ci(e.metadata);(L=T.canvas)!=null&&L.nodes&&delete T.canvas.nodes[R];const P=((b=T.modules)==null?void 0:b.instances)??{};for(const N of Object.values(P))N.component_ids.includes(R)&&(N.component_ids=N.component_ids.filter($=>$!==R),N.partial=!0,N.approved=!1,delete N.terraform);T.modules&&(T.modules.instances=P),a({...e,components:e.components.filter(N=>N.id!==R),connections:e.connections.filter(N=>N.source!==R&&N.target!==R),boundaries:CC(e.boundaries,R),metadata:T}),i(null)},[a,e]),A=M.useCallback(R=>{const E=new Set(e.components.map($=>$.id)),T=Yl(bi(R.service_key),E),P=Ci(e.metadata),L=P.canvas??{},b={...L.nodes??{}};b[T]=Xf(Object.keys(b).length+e.components.length),P.canvas={...L,nodes:b};const N={id:T,service:R.service_key,provider:R.provider.toLowerCase(),label:R.name,description:R.description??"",tier:SC(R.category),config:ou(R.default_config??{})};a({...e,components:[...e.components,N],metadata:P}),i(T)},[a,e]),z=M.useCallback(async R=>{var E;try{const T=await fetch(`${Wl}/modules/${encodeURIComponent(R)}`);if(!T.ok)return;const L=(await T.json()).module,b=new Set(e.components.map(G=>G.id)),N=Ci(e.metadata),$=N.modules??{},O={...$.instances??{}},B=new Set(Object.keys(O)),W=Yl(bi(L.id,"module"),B),V=bi(L.naming.component_id_prefix,W),Y={};for(const G of L.fragment.components)Y[G.id]=Yl(bi(`${V}_${G.id}`,V),b);const X=N.canvas??{},Q={...X.nodes??{}},H=Object.keys(Q).length+e.components.length,K=L.fragment.components.map((G,J)=>{const q=ou(G.config??{}),re={...L.default_tags??{},...typeof q.tags=="object"&&q.tags!==null?q.tags:{}};q.tags=re;const le=Y[G.id];return Q[le]=Xf(H+J),{...G,id:le,provider:G.provider.toLowerCase(),config:q}}),ee=L.fragment.connections.map(G=>({...G,source:Y[G.source],target:Y[G.target]}));O[W]={module_id:L.id,module_version:L.terraform.version,component_ids:K.map(G=>G.id),expected_component_count:K.length,required_tags:[...L.required_tags],naming_prefix:V,approved:L.approved,terraform:{...L.terraform}},N.canvas={...X,nodes:Q},N.modules={...$,instances:O},a({...e,components:[...e.components,...K],connections:[...e.connections,...ee],metadata:N}),i(((E=K[0])==null?void 0:E.id)??null)}catch{}},[a,e]),D=M.useCallback(async()=>{try{const R=await fetch(`${Wl}/canvas/validate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e})});if(!R.ok)return;l(await R.json())}catch{l({passed:!1,violations:[{code:"request_failed",severity:"error",message:"Standards check failed."}]})}},[e]);return f.jsxs("div",{style:{width:"100%",height:"100%",position:"relative"},children:[f.jsx(gC,{provider:e.provider||"aws",standardsResult:s,onAddResource:A,onAddModule:z,onCheckStandards:D}),f.jsxs(jE,{nodes:x,edges:_,nodeTypes:wC,onNodesChange:w,onEdgesChange:g,onEdgesDelete:C,onConnect:k,onNodeDragStop:S,fitView:!0,proOptions:{hideAttribution:!0},style:{background:"#f8fafc"},onNodeClick:h,onPaneClick:v,children:[f.jsx(LE,{color:"#e2e8f0",gap:20}),f.jsx(HE,{style:{background:"#ffffff",border:"1px solid #e2e8f0",borderRadius:8}})]}),f.jsx(uC,{components:e.components}),f.jsx(cC,{showBoundaries:n,onToggleBoundaries:()=>r(R=>!R),onExportSvg:()=>u("svg"),onExportPng:()=>u("png")}),f.jsx(hC,{component:c??null,cost:d,onClose:()=>i(null),onApply:R=>j({...R,description:R.description??"",config:R.config??{}}),onDelete:I})]})}function NC({estimate:e}){return f.jsxs("div",{style:{padding:32},children:[f.jsx("h2",{style:{fontSize:18,marginBottom:16,color:"#0f172a"},children:"Cost Breakdown"}),f.jsxs("table",{style:{width:"100%",maxWidth:700,borderCollapse:"collapse",fontSize:14},children:[f.jsx("thead",{children:f.jsxs("tr",{style:{borderBottom:"2px solid #e2e8f0",background:"#f8fafc"},children:[f.jsx("th",{style:{textAlign:"left",padding:"10px 12px",color:"#475569"},children:"Component"}),f.jsx("th",{style:{textAlign:"left",padding:"10px 12px",color:"#475569"},children:"Service"}),f.jsx("th",{style:{textAlign:"right",padding:"10px 12px",color:"#475569"},children:"Monthly"}),f.jsx("th",{style:{textAlign:"left",padding:"10px 12px",color:"#475569"},children:"Notes"})]})}),f.jsx("tbody",{children:e.breakdown.map(t=>f.jsxs("tr",{style:{borderBottom:"1px solid #f1f5f9"},children:[f.jsx("td",{style:{padding:"10px 12px",color:"#0f172a"},children:t.component_id}),f.jsx("td",{style:{padding:"10px 12px",color:"#475569"},children:t.service}),f.jsxs("td",{style:{padding:"10px 12px",textAlign:"right",fontFamily:"monospace",color:"#0f172a"},children:["$",t.monthly.toFixed(2)]}),f.jsx("td",{style:{padding:"10px 12px",color:"#64748b",fontSize:12},children:t.notes})]},t.component_id))}),f.jsx("tfoot",{children:f.jsxs("tr",{style:{borderTop:"2px solid #e2e8f0",background:"#f0f9ff"},children:[f.jsx("td",{style:{padding:"12px",fontWeight:700,fontSize:15,color:"#0f172a"},colSpan:2,children:"Total"}),f.jsxs("td",{style:{padding:"12px",textAlign:"right",fontWeight:700,fontSize:15,fontFamily:"monospace",color:"#2563eb"},children:["$",e.monthly_total.toFixed(2)]}),f.jsxs("td",{style:{padding:"12px",color:"#64748b",fontSize:12},children:[e.currency,"/month"]})]})})]})]})}function jC({spec:e,onDownloadTerraform:t,onDownloadYaml:n,validationSummary:r}){var o,i;return e?f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"1rem",padding:"0.5rem 1rem",background:"#ffffff",borderRadius:"0.375rem",marginBottom:"0.5rem",fontSize:"0.875rem",borderBottom:"1px solid #e2e8f0"},children:[f.jsxs("span",{style:{color:"#64748b"},children:["Components: ",f.jsx("strong",{style:{color:"#334155"},children:((o=e.components)==null?void 0:o.length)||0})]}),e.cost_estimate&&f.jsxs("span",{style:{color:"#64748b"},children:["Est. ",f.jsxs("strong",{style:{color:"#2563eb"},children:["$",(i=e.cost_estimate.monthly_total)==null?void 0:i.toFixed(0),"/mo"]})]}),f.jsxs("span",{style:{color:"#64748b"},children:[(e.provider||"aws").toUpperCase()," / ",e.region||"us-east-1"]}),r&&f.jsxs("span",{style:{padding:"0.125rem 0.5rem",borderRadius:"0.25rem",fontSize:"0.75rem",fontWeight:600,background:r.passed===r.total?"#d1fae5":"#fee2e2",color:r.passed===r.total?"#065f46":"#991b1b"},children:["WA: ",r.passed,"/",r.total]}),f.jsxs("div",{style:{marginLeft:"auto",display:"flex",gap:"0.5rem"},children:[t&&f.jsx("button",{onClick:t,style:{padding:"0.25rem 0.75rem",background:"#2563eb",color:"white",border:"none",borderRadius:"0.25rem",cursor:"pointer",fontSize:"0.75rem"},children:"Download Terraform"}),n&&f.jsx("button",{onClick:n,style:{padding:"0.25rem 0.75rem",background:"#f8fafc",color:"#475569",border:"1px solid #e2e8f0",borderRadius:"0.25rem",cursor:"pointer",fontSize:"0.75rem"},children:"Download YAML"})]})]}):null}const MC=[{key:"hipaa",label:"HIPAA"},{key:"pci-dss",label:"PCI-DSS"},{key:"soc2",label:"SOC 2"},{key:"fedramp",label:"FedRAMP"},{key:"gdpr",label:"GDPR"},{key:"well-architected",label:"Well-Architected"}],Ni={critical:0,high:1,medium:2,low:3},$o={critical:{bg:"#fef2f2",text:"#991b1b",border:"#fca5a5"},high:{bg:"#fff7ed",text:"#9a3412",border:"#fdba74"},medium:{bg:"#fffbeb",text:"#92400e",border:"#fcd34d"},low:{bg:"#f0fdf4",text:"#166534",border:"#86efac"}},zC={data_protection:"Data Protection",monitoring:"Monitoring & Logging",identity:"Identity & Access",network_security:"Network Security",reliability:"Reliability",compliance:"Compliance",operations:"Operations",security:"Security",cost:"Cost Optimization"};function PC({score:e,passed:t}){const n=Math.round(e*100),r=54,o=8,i=2*Math.PI*r,s=i*(1-e),l=t?"#16a34a":n>=70?"#f59e0b":"#dc2626";return f.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",gap:6},children:[f.jsxs("svg",{width:136,height:136,viewBox:"0 0 136 136",children:[f.jsx("circle",{cx:68,cy:68,r,fill:"none",stroke:"#f1f5f9",strokeWidth:o}),f.jsx("circle",{cx:68,cy:68,r,fill:"none",stroke:l,strokeWidth:o,strokeDasharray:i,strokeDashoffset:s,strokeLinecap:"round",transform:"rotate(-90 68 68)",style:{transition:"stroke-dashoffset 0.6s ease"}}),f.jsxs("text",{x:68,y:62,textAnchor:"middle",fontSize:28,fontWeight:700,fill:"#0f172a",children:[n,"%"]}),f.jsx("text",{x:68,y:82,textAnchor:"middle",fontSize:11,fill:"#64748b",children:"compliance"})]}),f.jsx("span",{style:{display:"inline-block",padding:"3px 12px",borderRadius:4,fontSize:12,fontWeight:600,background:t?"#dcfce7":"#fee2e2",color:t?"#166534":"#991b1b"},children:t?"PASSED":"FAILED"})]})}function TC({severity:e}){const t=$o[e]||$o.medium;return f.jsx("span",{style:{display:"inline-block",padding:"1px 8px",borderRadius:4,fontSize:11,fontWeight:600,background:t.bg,color:t.text,border:`1px solid ${t.border}`,textTransform:"uppercase",letterSpacing:"0.02em"},children:e})}function Gf({check:e,expanded:t,onToggle:n}){const r=$o[e.severity]||$o.medium;return f.jsxs("div",{style:{borderLeft:`3px solid ${e.passed?"#86efac":r.border}`,background:"#ffffff",borderRadius:"0 6px 6px 0",marginBottom:6,cursor:"pointer",transition:"box-shadow 0.15s ease"},onClick:n,onMouseEnter:o=>{o.currentTarget.style.boxShadow="0 1px 4px rgba(0,0,0,0.06)"},onMouseLeave:o=>{o.currentTarget.style.boxShadow="none"},children:[f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,padding:"10px 14px"},children:[f.jsx("span",{style:{fontSize:14,flexShrink:0,width:18,textAlign:"center"},children:e.passed?f.jsx("span",{style:{color:"#16a34a"},children:"✓"}):f.jsx("span",{style:{color:"#dc2626",fontWeight:700},children:"✕"})}),f.jsx("span",{style:{flex:1,fontSize:13,color:"#0f172a",fontWeight:500},children:e.name.replace(/_/g," ").replace(/\b\w/g,o=>o.toUpperCase())}),f.jsx(TC,{severity:e.severity}),f.jsx("span",{style:{fontSize:11,color:"#94a3b8",transform:t?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.15s ease",flexShrink:0},children:"▼"})]}),t&&f.jsxs("div",{style:{padding:"0 14px 12px 42px",fontSize:12,lineHeight:1.6},children:[f.jsx("div",{style:{color:"#475569",marginBottom:4},children:e.detail}),e.recommendation&&f.jsxs("div",{style:{marginTop:6,padding:"8px 12px",background:"#f8fafc",borderRadius:4,border:"1px solid #e2e8f0",color:"#334155"},children:[f.jsx("span",{style:{fontWeight:600,color:"#475569",fontSize:11},children:"Recommendation: "}),e.recommendation]})]})]})}function IC({spec:e,apiBase:t}){const[n,r]=M.useState(null),[o,i]=M.useState(null),[s,l]=M.useState(!1),[a,u]=M.useState(null),[p,c]=M.useState(new Set),[d,x]=M.useState(!1),y=M.useCallback(async S=>{i(S),l(!0),u(null),c(new Set),x(!1);try{const k=S==="well-architected",C=await fetch(`${t}/validate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e,compliance:k?[]:[S],well_architected:k})}),j=await C.json();if(!C.ok)throw new Error(j.detail||"Validation failed");r(j.results)}catch(k){u(k instanceof Error?k.message:"Validation failed"),r(null)}finally{l(!1)}},[e,t]),w=M.useCallback(S=>{c(k=>{const C=new Set(k);return C.has(S)?C.delete(S):C.add(S),C})},[]),_=(n==null?void 0:n[0])??null,m=_?_.checks.filter(S=>!S.passed).sort((S,k)=>(Ni[S.severity]??9)-(Ni[k.severity]??9)):[],g=_?_.checks.filter(S=>S.passed).sort((S,k)=>(Ni[S.severity]??9)-(Ni[k.severity]??9)):[],h={};for(const S of m){const k=S.category;h[k]||(h[k]=[]),h[k].push(S)}const v=_?_.checks.reduce((S,k)=>(k.passed||(S[k.severity]=(S[k.severity]||0)+1),S),{}):{};return f.jsxs("div",{style:{padding:32,maxWidth:900},children:[f.jsx("h2",{style:{fontSize:18,marginBottom:16,color:"#0f172a",fontWeight:700},children:"Validate Architecture"}),f.jsx("div",{style:{display:"flex",gap:8,marginBottom:24},children:MC.map(S=>{const k=o===S.key;return f.jsx("button",{onClick:()=>y(S.key),disabled:s,style:{padding:"8px 18px",borderRadius:6,border:k?"1.5px solid #2563eb":"1px solid #e2e8f0",background:k?"#eff6ff":"#ffffff",color:k?"#1d4ed8":"#475569",cursor:s?"wait":"pointer",fontSize:13,fontWeight:k?600:500,transition:"all 0.15s ease",opacity:s&&!k?.6:1},children:S.label},S.key)})}),s&&f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,padding:24,color:"#64748b",fontSize:14},children:[f.jsx("span",{style:{display:"inline-block",width:16,height:16,border:"2px solid #e2e8f0",borderTopColor:"#2563eb",borderRadius:"50%",animation:"spin 0.6s linear infinite"}}),"Running ",o==null?void 0:o.toUpperCase()," validation...",f.jsx("style",{children:"@keyframes spin { to { transform: rotate(360deg); } }"})]}),a&&f.jsx("div",{style:{padding:"12px 16px",background:"#fef2f2",border:"1px solid #fca5a5",borderRadius:8,color:"#991b1b",fontSize:13},children:a}),_&&!s&&f.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:24},children:[f.jsxs("div",{style:{display:"flex",gap:24,alignItems:"flex-start",padding:20,background:"#ffffff",border:"1px solid #e2e8f0",borderRadius:10},children:[f.jsx(PC,{score:_.score,passed:_.passed}),f.jsxs("div",{style:{flex:1},children:[f.jsx("div",{style:{fontSize:16,fontWeight:700,color:"#0f172a",marginBottom:4},children:_.framework}),f.jsxs("div",{style:{fontSize:13,color:"#64748b",marginBottom:14},children:[_.checks.length," checks evaluated ·"," ",g.length," passed ·"," ",m.length," failed"]}),f.jsx("div",{style:{display:"flex",gap:10,flexWrap:"wrap"},children:["critical","high","medium","low"].map(S=>{const k=v[S]||0,C=$o[S];return f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"6px 12px",borderRadius:6,background:k>0?C.bg:"#f8fafc",border:`1px solid ${k>0?C.border:"#e2e8f0"}`,minWidth:100},children:[f.jsx("span",{style:{fontSize:18,fontWeight:700,color:k>0?C.text:"#cbd5e1",lineHeight:1},children:k}),f.jsx("span",{style:{fontSize:11,fontWeight:600,color:k>0?C.text:"#94a3b8",textTransform:"uppercase",letterSpacing:"0.03em"},children:S})]},S)})})]})]}),m.length>0&&f.jsxs("div",{children:[f.jsxs("h3",{style:{fontSize:14,fontWeight:600,color:"#0f172a",marginBottom:12,display:"flex",alignItems:"center",gap:8},children:[f.jsx("span",{style:{color:"#dc2626"},children:"✕"}),"Failed Checks (",m.length,")"]}),Object.entries(h).map(([S,k])=>f.jsxs("div",{style:{marginBottom:16},children:[f.jsx("div",{style:{fontSize:11,fontWeight:600,color:"#64748b",textTransform:"uppercase",letterSpacing:"0.05em",marginBottom:6,paddingLeft:4},children:zC[S]||S.replace(/_/g," ")}),k.map(C=>{const j=`${S}-${C.name}`;return f.jsx(Gf,{check:C,expanded:p.has(j),onToggle:()=>w(j)},j)})]},S))]}),g.length>0&&f.jsxs("div",{children:[f.jsxs("button",{onClick:()=>x(S=>!S),style:{display:"flex",alignItems:"center",gap:8,background:"none",border:"none",cursor:"pointer",padding:"4px 0",fontSize:14,fontWeight:600,color:"#0f172a"},children:[f.jsx("span",{style:{color:"#16a34a"},children:"✓"}),"Passed Checks (",g.length,")",f.jsx("span",{style:{fontSize:11,color:"#94a3b8",transform:d?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.15s ease"},children:"▼"})]}),d&&f.jsx("div",{style:{marginTop:8},children:g.map(S=>{const k=`passed-${S.category}-${S.name}`;return f.jsx(Gf,{check:S,expanded:p.has(k),onToggle:()=>w(k)},k)})})]}),f.jsxs("div",{style:{fontSize:11,color:"#94a3b8",borderTop:"1px solid #f1f5f9",paddingTop:12,lineHeight:1.5},children:["Score = percentage of checks passed. A framework is marked FAILED if any critical-severity check fails, regardless of overall score. Checks are defined in the Cloudwright Validator based on ",_.framework," control requirements."]})]}),!_&&!s&&!a&&f.jsx("div",{style:{padding:40,textAlign:"center",color:"#94a3b8",fontSize:14,background:"#f8fafc",borderRadius:8,border:"1px dashed #e2e8f0"},children:"Select a compliance framework above to validate your architecture."})]})}const RC=[{key:"hipaa",label:"HIPAA"},{key:"soc2",label:"SOC 2"},{key:"pci-dss",label:"PCI-DSS"},{key:"fedramp",label:"FedRAMP"},{key:"gdpr",label:"GDPR"},{key:"iso27001",label:"ISO 27001"},{key:"nist",label:"NIST 800-53"}],Kf={critical:{bg:"#fef2f2",text:"#991b1b",border:"#fca5a5"},high:{bg:"#fff7ed",text:"#9a3412",border:"#fdba74"},medium:{bg:"#fffbeb",text:"#92400e",border:"#fcd34d"},low:{bg:"#f0fdf4",text:"#166534",border:"#86efac"}};function LC({spec:e,apiBase:t}){const[n,r]=M.useState(["hipaa","soc2","fedramp"]),[o,i]=M.useState(null),[s,l]=M.useState(!1),[a,u]=M.useState(null),p=d=>r(x=>x.includes(d)?x.filter(y=>y!==d):[...x,d]),c=M.useCallback(async()=>{l(!0),u(null);try{const d=await fetch(`${t}/compliance`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e,frameworks:n})});if(!d.ok){const x=await d.json().catch(()=>({}));throw new Error(x.detail||`Request failed (${d.status})`)}i(await d.json())}catch(d){u(d instanceof Error?d.message:"Compliance scan failed")}finally{l(!1)}},[e,t,n]);return f.jsxs("div",{style:{padding:24,maxWidth:920},children:[f.jsx("h2",{style:{fontSize:18,marginBottom:6,color:"#0f172a"},children:"Compliance Control Mapping"}),f.jsx("p",{style:{fontSize:13,color:"#64748b",marginBottom:16},children:"Every design-stage finding mapped to the framework control it violates — before any infrastructure exists. Folds in a Checkov deep scan when available."}),f.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:8,marginBottom:16},children:RC.map(d=>f.jsx("button",{onClick:()=>p(d.key),style:{padding:"6px 14px",borderRadius:999,border:`1px solid ${n.includes(d.key)?"#2563eb":"#cbd5e1"}`,background:n.includes(d.key)?"#2563eb":"#ffffff",color:n.includes(d.key)?"#ffffff":"#475569",fontSize:13,cursor:"pointer"},children:d.label},d.key))}),f.jsx("button",{onClick:c,disabled:s||n.length===0,style:{padding:"10px 22px",borderRadius:8,border:"none",background:s?"#94a3b8":"#0f172a",color:"#ffffff",fontSize:14,fontWeight:600,cursor:s?"default":"pointer"},children:s?"Scanning…":"Run compliance scan"}),a&&f.jsx("div",{style:{marginTop:16,padding:12,background:"#fef2f2",border:"1px solid #fca5a5",borderRadius:8,color:"#991b1b",fontSize:13},children:a}),o&&f.jsxs("div",{style:{marginTop:24},children:[f.jsxs("div",{style:{fontSize:12,color:"#64748b",marginBottom:8},children:["Scanner: ",f.jsx("strong",{children:o.scanner}),o.checkov_used?" (Checkov deep scan included)":""]}),f.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",marginBottom:24},children:[f.jsx("thead",{children:f.jsxs("tr",{style:{background:"#f8fafc",textAlign:"left"},children:[f.jsx("th",{style:Ur,children:"Framework"}),f.jsx("th",{style:Ur,children:"Controls satisfied"}),f.jsx("th",{style:Ur,children:"Violated"}),f.jsx("th",{style:Ur,children:"Findings"}),f.jsx("th",{style:Ur,children:"Status"})]})}),f.jsx("tbody",{children:o.frameworks.map(d=>f.jsxs("tr",{style:{borderTop:"1px solid #e2e8f0"},children:[f.jsx("td",{style:Yr,children:f.jsx("strong",{children:d.framework})}),f.jsxs("td",{style:Yr,children:[d.controls_satisfied,"/",d.controls_total]}),f.jsx("td",{style:{...Yr,color:"#991b1b"},children:d.controls_violated.length?d.controls_violated.join(", "):"—"}),f.jsx("td",{style:Yr,children:d.findings}),f.jsx("td",{style:Yr,children:f.jsx("span",{style:{padding:"2px 10px",borderRadius:999,fontSize:12,fontWeight:600,background:d.status==="pass"?"#dcfce7":"#fee2e2",color:d.status==="pass"?"#166534":"#991b1b"},children:d.status.toUpperCase()})})]},d.framework))})]}),f.jsxs("h3",{style:{fontSize:15,color:"#0f172a",marginBottom:12},children:["Findings (",o.findings.length,")"]}),o.findings.map((d,x)=>{const y=Kf[d.severity]||Kf.low;return f.jsxs("div",{style:{border:`1px solid ${y.border}`,background:y.bg,borderRadius:8,padding:14,marginBottom:10},children:[f.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[f.jsxs("span",{style:{fontSize:11,fontWeight:700,color:y.text,textTransform:"uppercase"},children:["[",d.severity,"]"]}),f.jsx("span",{style:{fontSize:14,color:"#0f172a"},children:d.message}),f.jsxs("span",{style:{fontSize:11,color:"#64748b"},children:["(",d.source,")"]})]}),d.controls.length>0&&f.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginTop:8},children:d.controls.map((w,_)=>f.jsxs("span",{title:w.title,style:{fontSize:11,padding:"2px 8px",borderRadius:4,background:"#e0e7ff",color:"#3730a3",fontFamily:"monospace"},children:[w.framework," ",w.control_id]},_))}),f.jsx("div",{style:{fontSize:12,color:"#475569",marginTop:8},children:d.remediation})]},x)})]})]})}const Ur={padding:"10px 12px",fontSize:12,color:"#475569",fontWeight:600},Yr={padding:"10px 12px",fontSize:13,color:"#0f172a"},AC=[{key:"terraform",label:"Terraform"},{key:"pulumi-python",label:"Pulumi (Python)"},{key:"pulumi-ts",label:"Pulumi (TS)"}];function $C({spec:e,apiBase:t}){const[n,r]=M.useState("terraform"),[o,i]=M.useState(null),[s,l]=M.useState(!1),[a,u]=M.useState(null),p=M.useCallback(async()=>{l(!0),u(null),i(null);try{const c=await fetch(`${t}/plan`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e,target:n,run_plan:!0})});if(!c.ok){const d=await c.json().catch(()=>({}));throw new Error(d.detail||`Request failed (${c.status})`)}i(await c.json())}catch(c){u(c instanceof Error?c.message:"Plan failed")}finally{l(!1)}},[e,t,n]);return f.jsxs("div",{style:{padding:24,maxWidth:920},children:[f.jsx("h2",{style:{fontSize:18,marginBottom:6,color:"#0f172a"},children:"Plan / Preview — prove it deploys"}),f.jsxs("p",{style:{fontSize:13,color:"#64748b",marginBottom:16},children:["Runs ",f.jsx("code",{children:"terraform validate/plan"})," or ",f.jsx("code",{children:"pulumi preview"})," against the exported artifact. Read-only — nothing is applied. Validation needs no credentials and is the offline proof of deployability."]}),f.jsx("div",{style:{display:"flex",gap:8,marginBottom:16},children:AC.map(c=>f.jsx("button",{onClick:()=>r(c.key),style:{padding:"6px 14px",borderRadius:8,border:`1px solid ${n===c.key?"#2563eb":"#cbd5e1"}`,background:n===c.key?"#2563eb":"#ffffff",color:n===c.key?"#ffffff":"#475569",fontSize:13,cursor:"pointer"},children:c.label},c.key))}),f.jsx("button",{onClick:p,disabled:s,style:{padding:"10px 22px",borderRadius:8,border:"none",background:s?"#94a3b8":"#0f172a",color:"#ffffff",fontSize:14,fontWeight:600,cursor:s?"default":"pointer"},children:s?"Running plan…":"Run plan"}),a&&f.jsx("div",{style:{marginTop:16,padding:12,background:"#fef2f2",border:"1px solid #fca5a5",borderRadius:8,color:"#991b1b",fontSize:13},children:a}),o&&f.jsxs("div",{style:{marginTop:24},children:[f.jsxs("div",{style:{display:"inline-block",padding:"8px 18px",borderRadius:8,fontSize:15,fontWeight:700,background:o.ok?"#dcfce7":"#fee2e2",color:o.ok?"#166534":"#991b1b",marginBottom:16},children:[o.ok?"DEPLOYABLE":"NOT DEPLOYABLE",o.ok&&!o.plan_ran?" (validate only — no credentials)":""]}),o.summary&&f.jsxs("div",{style:{fontSize:14,marginBottom:16},children:["Resource diff:"," ",f.jsxs("span",{style:{color:"#166534"},children:["+",o.summary.add]})," ",f.jsxs("span",{style:{color:"#92400e"},children:["~",o.summary.change]})," ",f.jsxs("span",{style:{color:"#991b1b"},children:["-",o.summary.destroy]})]}),f.jsx("ul",{style:{fontSize:13,color:"#334155",marginBottom:16,paddingLeft:18},children:o.messages.map((c,d)=>f.jsx("li",{style:{marginBottom:4},children:c},d))}),o.output_tail&&f.jsx("pre",{style:{background:"#0f172a",color:"#e2e8f0",padding:14,borderRadius:8,fontSize:12,overflowX:"auto",maxHeight:280},children:o.output_tail})]})]})}const Xl=[{key:"terraform",label:"Terraform",ext:"tf",lang:"hcl",desc:"HashiCorp Configuration Language"},{key:"cloudformation",label:"CloudFormation",ext:"yaml",lang:"yaml",desc:"AWS CloudFormation template"},{key:"mermaid",label:"Mermaid",ext:"mmd",lang:"mermaid",desc:"Mermaid diagram markup"},{key:"d2",label:"D2",ext:"d2",lang:"d2",desc:"D2 diagram language"},{key:"sbom",label:"SBOM",ext:"json",lang:"json",desc:"CycloneDX Software BOM"},{key:"aibom",label:"AIBOM",ext:"json",lang:"json",desc:"OWASP AI Bill of Materials"},{key:"html",label:"HTML Report",ext:"html",lang:"html",desc:"Self-contained shareable report"}];function qf({format:e}){const t={terraform:"HCL",cloudformation:"CFN",mermaid:"MMD",d2:"D2",sbom:"BOM",aibom:"AI"},n={terraform:"#7c3aed",cloudformation:"#ea580c",mermaid:"#0891b2",d2:"#4f46e5",sbom:"#059669",aibom:"#2563eb"};return f.jsx("span",{style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:32,height:20,borderRadius:4,fontSize:10,fontWeight:700,background:`${n[e]||"#64748b"}14`,color:n[e]||"#64748b",letterSpacing:"0.02em",flexShrink:0},children:t[e]||e.slice(0,3).toUpperCase()})}function DC({spec:e,apiBase:t}){const[n,r]=M.useState(null),[o,i]=M.useState(""),[s,l]=M.useState(!1),[a,u]=M.useState(null),[p,c]=M.useState(!1),d=M.useRef(null),x=M.useCallback(async g=>{r(g),l(!0),u(null),c(!1);try{const h=await fetch(`${t}/export`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e,format:g})}),v=await h.json();if(!h.ok)throw new Error(v.detail||"Export failed");i(v.content||JSON.stringify(v,null,2))}catch(h){u(h instanceof Error?h.message:"Export failed"),i("")}finally{l(!1)}},[e,t]),y=M.useCallback(async()=>{var g,h;try{await navigator.clipboard.writeText(o),c(!0),setTimeout(()=>c(!1),2e3)}catch{const v=d.current;if(v){const S=document.createRange();S.selectNodeContents(v),(g=window.getSelection())==null||g.removeAllRanges(),(h=window.getSelection())==null||h.addRange(S)}}},[o]),w=M.useCallback(()=>{if(!o||!n)return;const g=Xl.find(k=>k.key===n),h=new Blob([o],{type:"text/plain"}),v=URL.createObjectURL(h),S=document.createElement("a");S.href=v,S.download=`architecture.${(g==null?void 0:g.ext)||"txt"}`,S.click(),URL.revokeObjectURL(v)},[o,n]),_=o?o.split(` -`).length:0,m=Xl.find(g=>g.key===n);return f.jsxs("div",{style:{padding:32,maxWidth:960},children:[f.jsx("h2",{style:{fontSize:18,marginBottom:16,color:"#0f172a",fontWeight:700},children:"Export Architecture"}),f.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(3, 1fr)",gap:10,marginBottom:24},children:Xl.map(g=>{const h=n===g.key;return f.jsxs("button",{onClick:()=>x(g.key),disabled:s,style:{display:"flex",alignItems:"center",gap:10,padding:"10px 14px",borderRadius:8,border:h?"1.5px solid #2563eb":"1px solid #e2e8f0",background:h?"#eff6ff":"#ffffff",cursor:s?"wait":"pointer",textAlign:"left",transition:"all 0.15s ease",opacity:s&&!h?.6:1},children:[f.jsx(qf,{format:g.key}),f.jsxs("div",{children:[f.jsx("div",{style:{fontSize:13,fontWeight:h?600:500,color:h?"#1d4ed8":"#0f172a"},children:g.label}),f.jsx("div",{style:{fontSize:11,color:"#94a3b8"},children:g.desc})]})]},g.key)})}),s&&f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,padding:24,color:"#64748b",fontSize:14},children:[f.jsx("span",{style:{display:"inline-block",width:16,height:16,border:"2px solid #e2e8f0",borderTopColor:"#2563eb",borderRadius:"50%",animation:"spin 0.6s linear infinite"}}),"Generating ",(m==null?void 0:m.label)||n,"...",f.jsx("style",{children:"@keyframes spin { to { transform: rotate(360deg); } }"})]}),a&&f.jsx("div",{style:{padding:"12px 16px",background:"#fef2f2",border:"1px solid #fca5a5",borderRadius:8,color:"#991b1b",fontSize:13},children:a}),o&&!s&&f.jsxs("div",{style:{border:"1px solid #e2e8f0",borderRadius:10,overflow:"hidden"},children:[f.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 14px",background:"#f8fafc",borderBottom:"1px solid #e2e8f0"},children:[f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[f.jsx(qf,{format:n||""}),f.jsxs("span",{style:{fontSize:12,color:"#64748b"},children:["architecture.",(m==null?void 0:m.ext)||"txt"]}),f.jsxs("span",{style:{fontSize:11,color:"#cbd5e1"},children:[_," lines"]})]}),f.jsxs("div",{style:{display:"flex",gap:6},children:[f.jsx("button",{onClick:y,style:{padding:"4px 12px",borderRadius:4,border:"1px solid #e2e8f0",background:p?"#dcfce7":"#ffffff",color:p?"#166534":"#475569",cursor:"pointer",fontSize:12,fontWeight:500,transition:"all 0.15s ease"},children:p?"Copied":"Copy"}),f.jsx("button",{onClick:w,style:{padding:"4px 12px",borderRadius:4,border:"1px solid #e2e8f0",background:"#ffffff",color:"#475569",cursor:"pointer",fontSize:12,fontWeight:500},children:"Download"})]})]}),f.jsx("div",{style:{maxHeight:560,overflow:"auto"},children:f.jsx("pre",{ref:d,style:{margin:0,padding:16,fontSize:12,lineHeight:1.7,color:"#334155",background:"#ffffff",fontFamily:"'SF Mono', 'Cascadia Code', 'Fira Code', Menlo, monospace",counterReset:"line",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:o})})]}),!o&&!s&&!a&&f.jsx("div",{style:{padding:40,textAlign:"center",color:"#94a3b8",fontSize:14,background:"#f8fafc",borderRadius:8,border:"1px dashed #e2e8f0"},children:"Select an export format above to generate infrastructure code."})]})}const OC={0:"Edge / CDN",1:"Load Balancing",2:"Compute",3:"Data",4:"Supporting"};function Ql(e){if(e===null)return"null";if(typeof e=="number"||typeof e=="boolean")return String(e);const t=String(e);return/^[A-Za-z0-9_./:@-]+$/.test(t)?t:JSON.stringify(t)}function iu(e,t=0){const n=" ".repeat(t);if(Array.isArray(e))return e.length===0?"[]":e.map(r=>{if(r&&typeof r=="object"){const o=iu(r,t+2);return`${n}- ${o.trimStart()}`}return`${n}- ${Ql(r)}`}).join(` -`);if(e&&typeof e=="object"){const r=Object.entries(e).filter(([,o])=>o!==void 0);return r.length===0?"{}":r.map(([o,i])=>{if(i&&typeof i=="object"){const s=iu(i,t+2);return`${n}${o}: -${s}`}return`${n}${o}: ${Ql(i)}`}).join(` -`)}return Ql(e)}function ji({label:e,value:t,sub:n}){return f.jsxs("div",{style:{padding:"14px 16px",background:"#ffffff",border:"1px solid #e2e8f0",borderRadius:8,flex:1,minWidth:120},children:[f.jsx("div",{style:{fontSize:22,fontWeight:700,color:"#0f172a",lineHeight:1.2},children:t}),f.jsx("div",{style:{fontSize:12,color:"#64748b",marginTop:2},children:e}),n&&f.jsx("div",{style:{fontSize:11,color:"#94a3b8",marginTop:2},children:n})]})}function BC({spec:e,yaml:t}){var x;const[n,r]=M.useState("overview"),[o,i]=M.useState(!1),s=M.useRef(null),l=M.useMemo(()=>iu(e)||t||"",[e,t]),a=M.useMemo(()=>{const y=new Set(e.components.map(w=>w.provider));return Array.from(y)},[e.components]),u=M.useMemo(()=>{const y=new Set(e.components.map(w=>w.service));return Array.from(y)},[e.components]),p=M.useMemo(()=>{const y={};for(const w of e.components){const _=w.tier??2;y[_]||(y[_]=[]),y[_].push(w)}return y},[e.components]),c=M.useCallback(async()=>{var y,w;try{await navigator.clipboard.writeText(l),i(!0),setTimeout(()=>i(!1),2e3)}catch{const _=s.current;if(_){const m=document.createRange();m.selectNodeContents(_),(y=window.getSelection())==null||y.removeAllRanges(),(w=window.getSelection())==null||w.addRange(m)}}},[l]),d=M.useCallback(()=>{var m;const y=new Blob([l],{type:"text/yaml"}),w=URL.createObjectURL(y),_=document.createElement("a");_.href=w,_.download=`${((m=e.name)==null?void 0:m.replace(/\s+/g,"-").toLowerCase())||"architecture"}.yaml`,_.click(),URL.revokeObjectURL(w)},[l,e.name]);return f.jsxs("div",{style:{padding:32,maxWidth:960},children:[f.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:12,marginBottom:20},children:[f.jsx("h2",{style:{fontSize:18,color:"#0f172a",fontWeight:700,margin:0},children:e.name||"Architecture Spec"}),e.provider&&f.jsx("span",{style:{fontSize:12,fontWeight:600,color:"#475569",background:"#f1f5f9",padding:"2px 8px",borderRadius:4},children:e.provider.toUpperCase()}),e.region&&f.jsx("span",{style:{fontSize:12,color:"#94a3b8"},children:e.region})]}),f.jsx("div",{style:{display:"flex",gap:0,marginBottom:20,borderBottom:"1px solid #e2e8f0"},children:["overview","yaml"].map(y=>f.jsx("button",{onClick:()=>r(y),style:{padding:"8px 18px",background:"none",border:"none",borderBottom:n===y?"2px solid #2563eb":"2px solid transparent",color:n===y?"#1d4ed8":"#64748b",fontWeight:n===y?600:500,fontSize:13,cursor:"pointer",transition:"all 0.15s ease"},children:y==="overview"?"Overview":"YAML Source"},y))}),n==="overview"&&f.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:20},children:[f.jsxs("div",{style:{display:"flex",gap:12},children:[f.jsx(ji,{label:"Components",value:e.components.length}),f.jsx(ji,{label:"Connections",value:e.connections.length}),f.jsx(ji,{label:"Services",value:u.length,sub:a.join(", ")}),e.cost_estimate&&f.jsx(ji,{label:"Monthly Cost",value:`$${e.cost_estimate.monthly_total.toLocaleString()}`,sub:e.cost_estimate.currency})]}),f.jsx("div",{style:{border:"1px solid #e2e8f0",borderRadius:10,overflow:"hidden"},children:f.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:13},children:[f.jsx("thead",{children:f.jsxs("tr",{style:{background:"#f8fafc"},children:[f.jsx("th",{style:xt,children:"Component"}),f.jsx("th",{style:xt,children:"Service"}),f.jsx("th",{style:xt,children:"Provider"}),f.jsx("th",{style:xt,children:"Tier"}),f.jsx("th",{style:xt,children:"Description"})]})}),f.jsx("tbody",{children:Object.keys(p).map(Number).sort().flatMap(y=>p[y].map(w=>f.jsxs("tr",{style:{borderBottom:"1px solid #f1f5f9"},children:[f.jsxs("td",{style:vt,children:[f.jsx("span",{style:{fontWeight:600,color:"#0f172a"},children:w.label}),f.jsx("div",{style:{fontSize:11,color:"#94a3b8"},children:w.id})]}),f.jsx("td",{style:vt,children:f.jsx("code",{style:{fontSize:12,background:"#f1f5f9",padding:"1px 6px",borderRadius:3,color:"#334155"},children:w.service})}),f.jsx("td",{style:vt,children:f.jsx("span",{style:{fontSize:12,color:"#475569"},children:w.provider})}),f.jsx("td",{style:vt,children:f.jsx("span",{style:{fontSize:11,fontWeight:600,color:"#64748b",background:"#f1f5f9",padding:"2px 8px",borderRadius:4},children:OC[y]||`Tier ${y}`})}),f.jsx("td",{style:{...vt,color:"#64748b",maxWidth:240},children:w.description})]},w.id)))})]})}),e.connections.length>0&&f.jsxs("div",{style:{border:"1px solid #e2e8f0",borderRadius:10,overflow:"hidden"},children:[f.jsxs("div",{style:{padding:"10px 16px",background:"#f8fafc",borderBottom:"1px solid #e2e8f0",fontSize:13,fontWeight:600,color:"#0f172a"},children:["Connections (",e.connections.length,")"]}),f.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:13},children:[f.jsx("thead",{children:f.jsxs("tr",{style:{background:"#fafafa"},children:[f.jsx("th",{style:xt,children:"Source"}),f.jsx("th",{style:xt}),f.jsx("th",{style:xt,children:"Target"}),f.jsx("th",{style:xt,children:"Protocol"}),f.jsx("th",{style:xt,children:"Label"})]})}),f.jsx("tbody",{children:e.connections.map((y,w)=>{const _=e.components.find(g=>g.id===y.source),m=e.components.find(g=>g.id===y.target);return f.jsxs("tr",{style:{borderBottom:"1px solid #f1f5f9"},children:[f.jsx("td",{style:vt,children:f.jsx("span",{style:{fontWeight:500,color:"#0f172a"},children:(_==null?void 0:_.label)||y.source})}),f.jsx("td",{style:{...vt,textAlign:"center",color:"#94a3b8",fontSize:14},children:"→"}),f.jsx("td",{style:vt,children:f.jsx("span",{style:{fontWeight:500,color:"#0f172a"},children:(m==null?void 0:m.label)||y.target})}),f.jsx("td",{style:vt,children:y.protocol&&f.jsxs("code",{style:{fontSize:11,background:"#f1f5f9",padding:"1px 6px",borderRadius:3,color:"#334155"},children:[y.protocol,y.port?`:${y.port}`:""]})}),f.jsx("td",{style:{...vt,color:"#64748b"},children:y.label})]},w)})})]})]}),e.boundaries&&e.boundaries.length>0&&f.jsxs("div",{style:{border:"1px solid #e2e8f0",borderRadius:10,overflow:"hidden"},children:[f.jsxs("div",{style:{padding:"10px 16px",background:"#f8fafc",borderBottom:"1px solid #e2e8f0",fontSize:13,fontWeight:600,color:"#0f172a"},children:["Boundaries (",e.boundaries.length,")"]}),f.jsx("div",{style:{padding:16,display:"flex",flexWrap:"wrap",gap:10},children:e.boundaries.map(y=>f.jsxs("div",{style:{padding:"8px 14px",border:"1px dashed #cbd5e1",borderRadius:8,background:"#fafafa",fontSize:13},children:[f.jsx("div",{style:{fontWeight:600,color:"#0f172a"},children:y.label||y.id}),f.jsxs("div",{style:{fontSize:11,color:"#94a3b8"},children:[y.kind," · ",y.component_ids.length," components"]})]},y.id))})]})]}),n==="yaml"&&f.jsxs("div",{style:{border:"1px solid #e2e8f0",borderRadius:10,overflow:"hidden"},children:[f.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 14px",background:"#f8fafc",borderBottom:"1px solid #e2e8f0"},children:[f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[f.jsx("span",{style:{fontSize:10,fontWeight:700,color:"#7c3aed",background:"#7c3aed14",padding:"2px 8px",borderRadius:4},children:"YAML"}),f.jsxs("span",{style:{fontSize:12,color:"#64748b"},children:[((x=e.name)==null?void 0:x.replace(/\s+/g,"-").toLowerCase())||"architecture",".yaml"]}),f.jsxs("span",{style:{fontSize:11,color:"#cbd5e1"},children:[l.split(` -`).length," lines"]})]}),f.jsxs("div",{style:{display:"flex",gap:6},children:[f.jsx("button",{onClick:c,style:{padding:"4px 12px",borderRadius:4,border:"1px solid #e2e8f0",background:o?"#dcfce7":"#ffffff",color:o?"#166534":"#475569",cursor:"pointer",fontSize:12,fontWeight:500,transition:"all 0.15s ease"},children:o?"Copied":"Copy"}),f.jsx("button",{onClick:d,style:{padding:"4px 12px",borderRadius:4,border:"1px solid #e2e8f0",background:"#ffffff",color:"#475569",cursor:"pointer",fontSize:12,fontWeight:500},children:"Download"})]})]}),f.jsx("div",{style:{maxHeight:600,overflow:"auto"},children:f.jsx("pre",{ref:s,style:{margin:0,padding:16,fontSize:13,lineHeight:1.7,color:"#334155",background:"#ffffff",fontFamily:"'SF Mono', 'Cascadia Code', 'Fira Code', Menlo, monospace",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:l||"No YAML available"})})]})]})}const xt={padding:"10px 14px",textAlign:"left",fontSize:11,fontWeight:600,color:"#64748b",textTransform:"uppercase",letterSpacing:"0.05em"},vt={padding:"10px 14px",color:"#0f172a"},qe="/api",FC=["Add caching layer","Reduce cost","Increase redundancy","Add monitoring","Add security"];function Zf(e){var s;if((s=e.metadata)!=null&&s.suggestions&&e.metadata.suggestions.length>0)return e.metadata.suggestions.slice(0,3);const t=e.components.map(l=>l.label.toLowerCase()),n=e.components.map(l=>l.service.toLowerCase()),r=t.some(l=>l.includes("cache")||l.includes("redis")||l.includes("elasticache"))||n.some(l=>l.includes("cache")||l.includes("redis")),o=t.some(l=>l.includes("monitor")||l.includes("cloudwatch")||l.includes("grafana"))||n.some(l=>l.includes("cloudwatch")||l.includes("monitor")),i=t.some(l=>l.includes("waf")||l.includes("firewall")||l.includes("security"))||n.some(l=>l.includes("waf")||l.includes("shield"));return FC.filter(l=>!(l==="Add caching layer"&&r||l==="Add monitoring"&&o||l==="Add security"&&i)).slice(0,3)}function HC(e){return e.split(/(\*\*.*?\*\*)/g).map((t,n)=>t.startsWith("**")&&t.endsWith("**")?f.jsx("strong",{children:t.slice(2,-2)},n):f.jsx("span",{children:t},n))}async function Gl(e,t){var i;let n=e;const[r,o]=await Promise.all([fetch(`${qe}/cost`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:n})}).then(s=>s.ok?s.json():null).catch(()=>null),fetch(`${qe}/validate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:n,compliance:[],well_architected:!0})}).then(s=>s.ok?s.json():null).catch(()=>null)]);if(r!=null&&r.estimate&&(n={...n,cost_estimate:r.estimate}),((i=o==null?void 0:o.results)==null?void 0:i.length)>0){const s=o.results[0].checks||[],l=s.filter(a=>a.passed).length;t({passed:l,total:s.length})}return n}async function Jf(e,t,n){var a;const r=e?`${qe}/modify/stream`:`${qe}/design/stream`,o=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!o.ok){const u=await o.json();n.onError(u.detail||"Request failed");return}const i=(a=o.body)==null?void 0:a.getReader();if(!i)return;const s=new TextDecoder;let l="";for(;;){const{done:u,value:p}=await i.read();if(u)break;l+=s.decode(p,{stream:!0});const c=l.split(` -`);l=c.pop()||"";for(const d of c)if(d.startsWith("data: "))try{const x=JSON.parse(d.slice(6));switch(x.stage){case"generating":case"costing":case"validating":n.onStage(x.stage,x.message);break;case"generated":n.onSpec(x.spec,x.yaml);break;case"costed":n.onCost(x.cost_estimate);break;case"validated":n.onValidation(x.passed,x.total);break;case"done":n.onDone(x.spec,x.yaml);break;case"error":n.onError(x.message);break}}catch{}}}function VC(){var h;const[e,t]=M.useState([]),[n,r]=M.useState(""),[o,i]=M.useState("idle"),[s,l]=M.useState(null),[a,u]=M.useState("diagram"),[p,c]=M.useState(""),[d,x]=M.useState(null),y=M.useRef(null),w=M.useRef(null);M.useEffect(()=>{var v;(v=w.current)==null||v.scrollIntoView({behavior:"smooth"})},[e]);const _=async()=>{var I;if(!n.trim()||o!=="idle")return;const v={role:"user",content:n};t(A=>[...A,v]),r("");const S=s!==null;i(S?"modifying":"generating");let k=null,C="",j=!1;try{const A=S?{spec:s,instruction:n}:{description:n};try{await Jf(S,A,{onStage:E=>{E==="generating"?i("generating"):(E==="costing"||E==="validating")&&i("costing")},onSpec:E=>{l(E),k=E,i("costing")},onCost:E=>{E&&k&&(k={...k,cost_estimate:E},l(k))},onValidation:(E,T)=>{E!==null&&x({passed:E,total:T})},onDone:(E,T)=>{k=E,C=T,l(E),i("done")},onError:E=>{throw new Error(E)}}),j=k!==null}catch{i(S?"modifying":"generating")}if(!j){const E=S?await fetch(`${qe}/modify`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:s,instruction:n})}):await fetch(`${qe}/design`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({description:n})}),T=await E.json();if(!E.ok)throw new Error(T.detail||"Request failed");k=T.spec,C=T.yaml,i("costing"),k=await Gl(k,x),l(k),i("done")}const z=k,R={role:"assistant",content:`${S?"Modified":"Designed"} **${z.name}** with ${z.components.length} components on ${z.provider.toUpperCase()}.${z.cost_estimate?` Estimated cost: $${z.cost_estimate.monthly_total.toFixed(2)}/mo.`:""}`,spec:z,yaml:C,suggestions:Zf(z)};t(E=>[...E,R]),u("diagram")}catch(A){const z=A instanceof Error?A.message:"Unknown error";t(D=>[...D,{role:"assistant",content:`Error: ${z}`}])}finally{i("idle"),(I=y.current)==null||I.focus()}},m=async v=>{if(s)try{const S=await fetch(`${qe}/download`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:s,format:v})});if(!S.ok)return;const k=await S.blob(),j=(S.headers.get("Content-Disposition")||"").match(/filename=([^\s;]+)/),I=j?j[1]:`architecture.${v==="terraform"?"tf":"yaml"}`,A=URL.createObjectURL(k),z=document.createElement("a");z.href=A,z.download=I,z.click(),URL.revokeObjectURL(A)}catch{}},g=async v=>{l(v),x(null);try{const S=await Gl(v,x);l(S)}catch{}};return f.jsxs("div",{style:{display:"flex",height:"100vh",background:"#ffffff"},children:[f.jsxs("div",{style:{width:420,borderRight:"1px solid #e2e8f0",display:"flex",flexDirection:"column",background:"#f8fafc"},children:[f.jsxs("div",{style:{padding:"16px 20px",borderBottom:"1px solid #e2e8f0",display:"flex",alignItems:"center",justifyContent:"space-between"},children:[f.jsxs("div",{children:[f.jsx("h1",{style:{fontSize:20,fontWeight:700,color:"#0f172a"},children:"Cloudwright"}),f.jsx("p",{style:{fontSize:12,color:"#64748b",marginTop:4},children:"Architecture Intelligence"})]}),s&&f.jsx("button",{onClick:()=>{if(window.confirm("Discard current session and start fresh?")){try{localStorage.setItem("cloudwright_last_session",JSON.stringify(e))}catch{}l(null),t([]),x(null)}},style:{padding:"5px 12px",borderRadius:6,border:"1px solid #e2e8f0",background:"#ffffff",color:"#64748b",cursor:"pointer",fontSize:12,fontWeight:500},children:"New"})]}),f.jsxs("div",{style:{flex:1,overflowY:"auto",padding:16},children:[e.length===0&&f.jsxs("div",{style:{color:"#64748b",padding:20,textAlign:"center"},children:[f.jsx("p",{style:{fontSize:14},children:"Describe your cloud architecture"}),f.jsx("p",{style:{fontSize:12,marginTop:8,color:"#94a3b8"},children:'"3-tier web app on AWS with CloudFront, ALB, EC2, and RDS"'})]}),e.map((v,S)=>f.jsxs("div",{style:{marginBottom:12},children:[f.jsx("div",{style:{padding:"10px 14px",borderRadius:8,background:v.role==="user"?"#2563eb":"#f1f5f9",color:v.role==="user"?"#ffffff":"#1e293b",fontSize:14,lineHeight:1.5},children:HC(v.content)}),v.role==="assistant"&&v.spec&&v.suggestions&&v.suggestions.length>0&&f.jsx("div",{style:{display:"flex",gap:6,marginTop:6,flexWrap:"wrap"},children:v.suggestions.map(k=>f.jsx("button",{onClick:()=>{var C;r(k),(C=y.current)==null||C.focus()},disabled:o!=="idle",style:{padding:"4px 10px",borderRadius:12,border:"1px solid #cbd5e1",background:"#ffffff",color:"#2563eb",cursor:o!=="idle"?"not-allowed":"pointer",fontSize:12,fontWeight:500},children:k},k))})]},S)),o!=="idle"&&f.jsxs("div",{style:{padding:"10px 14px",color:"#64748b",fontSize:14},children:[o==="generating"&&"Generating architecture...",o==="modifying"&&"Modifying architecture...",o==="costing"&&"Estimating cost & validating...",o==="done"&&"Finalizing..."]}),f.jsx("div",{ref:w})]}),f.jsx("div",{style:{padding:16,borderTop:"1px solid #e2e8f0"},children:f.jsxs("div",{style:{display:"flex",gap:8},children:[f.jsx("input",{ref:y,value:n,onChange:v=>r(v.target.value),onKeyDown:v=>v.key==="Enter"&&_(),placeholder:"Describe your architecture...",style:{flex:1,padding:"10px 14px",borderRadius:8,border:"1px solid #e2e8f0",background:"#ffffff",color:"#0f172a",fontSize:14,outline:"none"}}),f.jsx("button",{onClick:_,disabled:o!=="idle"||!n.trim(),style:{padding:"10px 20px",borderRadius:8,border:"none",background:o!=="idle"?"#e2e8f0":"#2563eb",color:o!=="idle"?"#94a3b8":"#fff",cursor:o!=="idle"?"not-allowed":"pointer",fontSize:14,fontWeight:600},children:"Send"})]})})]}),f.jsxs("div",{style:{flex:1,display:"flex",flexDirection:"column",background:"#ffffff"},children:[f.jsx("div",{style:{display:"flex",borderBottom:"1px solid #e2e8f0",background:"#ffffff"},children:["diagram","cost","validate","compliance","plan","export","spec","modify"].map(v=>f.jsx("button",{onClick:()=>u(v),style:{padding:"12px 24px",border:"none",borderBottom:a===v?"2px solid #2563eb":"2px solid transparent",background:"transparent",color:a===v?"#2563eb":"#64748b",cursor:"pointer",fontSize:14,fontWeight:500,textTransform:"capitalize"},children:v},v))}),f.jsxs("div",{style:{flex:1,overflow:"auto",display:"flex",flexDirection:"column"},children:[f.jsx("div",{style:{padding:"0.5rem 1rem"},children:f.jsx(jC,{spec:s,onDownloadTerraform:s?()=>m("terraform"):void 0,onDownloadYaml:s?()=>m("yaml"):void 0,validationSummary:d})}),f.jsxs("div",{style:{flex:1,overflow:"auto"},children:[a==="diagram"&&(s||o!=="idle")&&f.jsxs("div",{style:{position:"relative",width:"100%",height:"100%"},children:[s&&f.jsx(bC,{spec:s,onSpecChange:g}),o!=="idle"&&f.jsxs("div",{style:{position:"absolute",top:16,right:16,background:"rgba(37, 99, 235, 0.9)",color:"white",padding:"8px 16px",borderRadius:8,fontSize:13,fontWeight:500,display:"flex",alignItems:"center",gap:8},children:[f.jsx("span",{style:{width:8,height:8,borderRadius:"50%",background:"white",animation:"pulse 1s infinite"}}),o==="generating"?"Generating...":o==="modifying"?"Modifying...":o==="costing"?"Costing & validating...":"Finalizing..."]})]}),a==="diagram"&&!s&&o==="idle"&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture to see the diagram."}),a==="cost"&&(s==null?void 0:s.cost_estimate)&&f.jsx(NC,{estimate:s.cost_estimate}),a==="cost"&&(!s||!s.cost_estimate)&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"No cost estimate available."}),a==="spec"&&s&&f.jsx(BC,{spec:s,yaml:((h=e.findLast(v=>v.yaml))==null?void 0:h.yaml)||"No YAML available"}),a==="spec"&&!s&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture first."}),a==="validate"&&s&&f.jsx(IC,{spec:s,apiBase:qe}),a==="validate"&&!s&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture first."}),a==="compliance"&&s&&f.jsx(LC,{spec:s,apiBase:qe}),a==="compliance"&&!s&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture first."}),a==="plan"&&s&&f.jsx($C,{spec:s,apiBase:qe}),a==="plan"&&!s&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture first."}),a==="export"&&s&&f.jsx(DC,{spec:s,apiBase:qe}),a==="export"&&!s&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture first."}),a==="modify"&&s&&f.jsxs("div",{style:{padding:32,maxWidth:800},children:[f.jsx("h2",{style:{fontSize:18,marginBottom:16,color:"#0f172a"},children:"Modify Architecture"}),o!=="idle"&&f.jsxs("div",{style:{marginBottom:12,fontSize:13,color:"#64748b"},children:[o==="modifying"&&"Modifying architecture...",o==="costing"&&"Estimating cost & validating...",o==="done"&&"Finalizing..."]}),f.jsx("div",{style:{display:"flex",gap:8},children:f.jsx("input",{value:p,onChange:v=>c(v.target.value),onKeyDown:async v=>{if(v.key==="Enter"&&p.trim()&&o==="idle"){const S=p;c(""),i("modifying");let k=null,C="",j=!1;try{try{await Jf(!0,{spec:s,instruction:S},{onStage:A=>{A==="generating"?i("modifying"):(A==="costing"||A==="validating")&&i("costing")},onSpec:A=>{l(A),k=A,i("costing")},onCost:A=>{A&&k&&(k={...k,cost_estimate:A},l(k))},onValidation:(A,z)=>{A!==null&&x({passed:A,total:z})},onDone:(A,z)=>{k=A,C=z,l(A),i("done")},onError:A=>{throw new Error(A)}}),j=k!==null}catch{i("modifying")}if(!j){const A=await fetch(`${qe}/modify`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:s,instruction:S})}),z=await A.json();if(!A.ok)throw new Error(z.detail||"Modification failed");const D=z.spec;C=z.yaml,i("costing"),k=await Gl(D,x),l(k),i("done")}const I=k;t(A=>[...A,{role:"user",content:S},{role:"assistant",content:`Modified **${I.name}** with ${I.components.length} components on ${I.provider.toUpperCase()}.${I.cost_estimate?` Estimated cost: $${I.cost_estimate.monthly_total.toFixed(2)}/mo.`:""}`,spec:I,yaml:C,suggestions:Zf(I)}])}catch(I){t(A=>[...A,{role:"user",content:S},{role:"assistant",content:`Error: ${I instanceof Error?I.message:"Modification failed"}`}])}finally{i("idle")}}},placeholder:"e.g. Add a Redis cache between web and database",style:{flex:1,padding:"10px 14px",borderRadius:8,border:"1px solid #e2e8f0",background:"#ffffff",color:"#0f172a",fontSize:14,outline:"none"}})}),f.jsx("p",{style:{fontSize:12,color:"#64748b",marginTop:8},children:"Press Enter to apply modification"})]}),a==="modify"&&!s&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture first."})]})]})]})]})}Kl.createRoot(document.getElementById("root")).render(f.jsx(dp.StrictMode,{children:f.jsx(VC,{})})); diff --git a/packages/web/cloudwright_web/static/assets/index-DU-cIjQd.js b/packages/web/cloudwright_web/static/assets/index-DU-cIjQd.js new file mode 100644 index 0000000..f3fab83 --- /dev/null +++ b/packages/web/cloudwright_web/static/assets/index-DU-cIjQd.js @@ -0,0 +1,71 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}})();function np(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var rp={exports:{}},js={},op={exports:{}},te={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Do=Symbol.for("react.element"),fy=Symbol.for("react.portal"),py=Symbol.for("react.fragment"),hy=Symbol.for("react.strict_mode"),gy=Symbol.for("react.profiler"),my=Symbol.for("react.provider"),yy=Symbol.for("react.context"),xy=Symbol.for("react.forward_ref"),vy=Symbol.for("react.suspense"),wy=Symbol.for("react.memo"),Sy=Symbol.for("react.lazy"),zc=Symbol.iterator;function ky(e){return e===null||typeof e!="object"?null:(e=zc&&e[zc]||e["@@iterator"],typeof e=="function"?e:null)}var ip={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},sp=Object.assign,lp={};function br(e,t,n){this.props=e,this.context=t,this.refs=lp,this.updater=n||ip}br.prototype.isReactComponent={};br.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};br.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function ap(){}ap.prototype=br.prototype;function au(e,t,n){this.props=e,this.context=t,this.refs=lp,this.updater=n||ip}var uu=au.prototype=new ap;uu.constructor=au;sp(uu,br.prototype);uu.isPureReactComponent=!0;var Pc=Array.isArray,up=Object.prototype.hasOwnProperty,cu={current:null},cp={key:!0,ref:!0,__self:!0,__source:!0};function dp(e,t,n){var r,o={},i=null,s=null;if(t!=null)for(r in t.ref!==void 0&&(s=t.ref),t.key!==void 0&&(i=""+t.key),t)up.call(t,r)&&!cp.hasOwnProperty(r)&&(o[r]=t[r]);var l=arguments.length-2;if(l===1)o.children=n;else if(1>>1,B=N[O];if(0>>1;Oo(Y,$))Xo(Q,Y)?(N[O]=Q,N[X]=$,O=X):(N[O]=Y,N[V]=$,O=V);else if(Xo(Q,$))N[O]=Q,N[X]=$,O=X;else break e}}return j}function o(N,j){var $=N.sortIndex-j.sortIndex;return $!==0?$:N.id-j.id}if(typeof performance=="object"&&typeof performance.now=="function"){var i=performance;e.unstable_now=function(){return i.now()}}else{var s=Date,l=s.now();e.unstable_now=function(){return s.now()-l}}var a=[],u=[],p=1,c=null,d=3,x=!1,y=!1,w=!1,k=typeof setTimeout=="function"?setTimeout:null,m=typeof clearTimeout=="function"?clearTimeout:null,g=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function h(N){for(var j=n(u);j!==null;){if(j.callback===null)r(u);else if(j.startTime<=N)r(u),j.sortIndex=j.expirationTime,t(a,j);else break;j=n(u)}}function v(N){if(w=!1,h(N),!y)if(n(a)!==null)y=!0,M(_);else{var j=n(u);j!==null&&R(v,j.startTime-N)}}function _(N,j){y=!1,w&&(w=!1,m(b),b=-1),x=!0;var $=d;try{for(h(j),c=n(a);c!==null&&(!(c.expirationTime>j)||N&&!T());){var O=c.callback;if(typeof O=="function"){c.callback=null,d=c.priorityLevel;var B=O(c.expirationTime<=j);j=e.unstable_now(),typeof B=="function"?c.callback=B:c===n(a)&&r(a),h(j)}else r(a);c=n(a)}if(c!==null)var W=!0;else{var V=n(u);V!==null&&R(v,V.startTime-j),W=!1}return W}finally{c=null,d=$,x=!1}}var S=!1,E=null,b=-1,A=5,D=-1;function T(){return!(e.unstable_now()-DN||125O?(N.sortIndex=$,t(u,N),n(a)===null&&N===n(u)&&(w?(m(b),b=-1):w=!0,R(v,$-O))):(N.sortIndex=B,t(a,N),y||x||(y=!0,M(_))),N},e.unstable_shouldYield=T,e.unstable_wrapCallback=function(N){var j=d;return function(){var $=d;d=j;try{return N.apply(this,arguments)}finally{d=$}}}})(yp);mp.exports=yp;var Iy=mp.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ry=z,Xe=Iy;function F(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ql=Object.prototype.hasOwnProperty,Ly=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,Ic={},Rc={};function Ay(e){return ql.call(Rc,e)?!0:ql.call(Ic,e)?!1:Ly.test(e)?Rc[e]=!0:(Ic[e]=!0,!1)}function $y(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function Dy(e,t,n,r){if(t===null||typeof t>"u"||$y(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function Ae(e,t,n,r,o,i,s){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=s}var Ne={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Ne[e]=new Ae(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Ne[t]=new Ae(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Ne[e]=new Ae(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Ne[e]=new Ae(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Ne[e]=new Ae(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Ne[e]=new Ae(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Ne[e]=new Ae(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Ne[e]=new Ae(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Ne[e]=new Ae(e,5,!1,e.toLowerCase(),null,!1,!1)});var fu=/[\-:]([a-z])/g;function pu(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(fu,pu);Ne[t]=new Ae(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(fu,pu);Ne[t]=new Ae(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(fu,pu);Ne[t]=new Ae(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Ne[e]=new Ae(e,1,!1,e.toLowerCase(),null,!1,!1)});Ne.xlinkHref=new Ae("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Ne[e]=new Ae(e,1,!1,e.toLowerCase(),null,!0,!0)});function hu(e,t,n,r){var o=Ne.hasOwnProperty(t)?Ne[t]:null;(o!==null?o.type!==0:r||!(2l||o[s]!==i[l]){var a=` +`+o[s].replace(" at new "," at ");return e.displayName&&a.includes("")&&(a=a.replace("",e.displayName)),a}while(1<=s&&0<=l);break}}}finally{al=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Xr(e):""}function Oy(e){switch(e.tag){case 5:return Xr(e.type);case 16:return Xr("Lazy");case 13:return Xr("Suspense");case 19:return Xr("SuspenseList");case 0:case 2:case 15:return e=ul(e.type,!1),e;case 11:return e=ul(e.type.render,!1),e;case 1:return e=ul(e.type,!0),e;default:return""}}function na(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Wn:return"Fragment";case Vn:return"Portal";case Jl:return"Profiler";case gu:return"StrictMode";case ea:return"Suspense";case ta:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case wp:return(e.displayName||"Context")+".Consumer";case vp:return(e._context.displayName||"Context")+".Provider";case mu:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case yu:return t=e.displayName||null,t!==null?t:na(e.type)||"Memo";case Xt:t=e._payload,e=e._init;try{return na(e(t))}catch{}}return null}function By(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return na(t);case 8:return t===gu?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function cn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function kp(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Fy(e){var t=kp(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var o=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(s){r=""+s,i.call(this,s)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(s){r=""+s},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function ei(e){e._valueTracker||(e._valueTracker=Fy(e))}function _p(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=kp(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Xi(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function ra(e,t){var n=t.checked;return me({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Ac(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=cn(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Ep(e,t){t=t.checked,t!=null&&hu(e,"checked",t,!1)}function oa(e,t){Ep(e,t);var n=cn(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?ia(e,t.type,n):t.hasOwnProperty("defaultValue")&&ia(e,t.type,cn(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function $c(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function ia(e,t,n){(t!=="number"||Xi(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Qr=Array.isArray;function rr(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o"+t.valueOf().toString()+"",t=ti.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function fo(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Jr={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Hy=["Webkit","ms","Moz","O"];Object.keys(Jr).forEach(function(e){Hy.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Jr[t]=Jr[e]})});function jp(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Jr.hasOwnProperty(e)&&Jr[e]?(""+t).trim():t+"px"}function Mp(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,o=jp(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}var Vy=me({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function aa(e,t){if(t){if(Vy[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(F(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(F(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(F(61))}if(t.style!=null&&typeof t.style!="object")throw Error(F(62))}}function ua(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var ca=null;function xu(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var da=null,or=null,ir=null;function Bc(e){if(e=Fo(e)){if(typeof da!="function")throw Error(F(280));var t=e.stateNode;t&&(t=Is(t),da(e.stateNode,e.type,t))}}function zp(e){or?ir?ir.push(e):ir=[e]:or=e}function Pp(){if(or){var e=or,t=ir;if(ir=or=null,Bc(e),t)for(e=0;e>>=0,e===0?32:31-(ex(e)/tx|0)|0}var ni=64,ri=4194304;function Gr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Zi(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,o=e.suspendedLanes,i=e.pingedLanes,s=n&268435455;if(s!==0){var l=s&~o;l!==0?r=Gr(l):(i&=s,i!==0&&(r=Gr(i)))}else s=n&~o,s!==0?r=Gr(s):i!==0&&(r=Gr(i));if(r===0)return 0;if(t!==0&&t!==r&&!(t&o)&&(o=r&-r,i=t&-t,o>=i||o===16&&(i&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Oo(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-ft(t),e[t]=n}function ix(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=to),Gc=" ",Kc=!1;function Zp(e,t){switch(e){case"keyup":return Ix.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function qp(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Un=!1;function Lx(e,t){switch(e){case"compositionend":return qp(t);case"keypress":return t.which!==32?null:(Kc=!0,Gc);case"textInput":return e=t.data,e===Gc&&Kc?null:e;default:return null}}function Ax(e,t){if(Un)return e==="compositionend"||!bu&&Zp(e,t)?(e=Gp(),Ii=_u=qt=null,Un=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=ed(n)}}function nh(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?nh(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function rh(){for(var e=window,t=Xi();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Xi(e.document)}return t}function Nu(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Ux(e){var t=rh(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&nh(n.ownerDocument.documentElement,n)){if(r!==null&&Nu(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var o=n.textContent.length,i=Math.min(r.start,o);r=r.end===void 0?i:Math.min(r.end,o),!e.extend&&i>r&&(o=r,r=i,i=o),o=td(n,i);var s=td(n,r);o&&s&&(e.rangeCount!==1||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==s.node||e.focusOffset!==s.offset)&&(t=t.createRange(),t.setStart(o.node,o.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(s.node,s.offset)):(t.setEnd(s.node,s.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Yn=null,ya=null,ro=null,xa=!1;function nd(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;xa||Yn==null||Yn!==Xi(r)||(r=Yn,"selectionStart"in r&&Nu(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),ro&&xo(ro,r)||(ro=r,r=es(ya,"onSelect"),0Gn||(e.current=Ea[Gn],Ea[Gn]=null,Gn--)}function ae(e,t){Gn++,Ea[Gn]=e.current,e.current=t}var dn={},Te=pn(dn),Be=pn(!1),Nn=dn;function fr(e,t){var n=e.type.contextTypes;if(!n)return dn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o={},i;for(i in n)o[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function Fe(e){return e=e.childContextTypes,e!=null}function ns(){ce(Be),ce(Te)}function ud(e,t,n){if(Te.current!==dn)throw Error(F(168));ae(Te,t),ae(Be,n)}function fh(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var o in r)if(!(o in t))throw Error(F(108,By(e)||"Unknown",o));return me({},n,r)}function rs(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||dn,Nn=Te.current,ae(Te,e),ae(Be,Be.current),!0}function cd(e,t,n){var r=e.stateNode;if(!r)throw Error(F(169));n?(e=fh(e,t,Nn),r.__reactInternalMemoizedMergedChildContext=e,ce(Be),ce(Te),ae(Te,e)):ce(Be),ae(Be,n)}var Pt=null,Rs=!1,_l=!1;function ph(e){Pt===null?Pt=[e]:Pt.push(e)}function r1(e){Rs=!0,ph(e)}function hn(){if(!_l&&Pt!==null){_l=!0;var e=0,t=se;try{var n=Pt;for(se=1;e>=s,o-=s,Tt=1<<32-ft(t)+o|n<b?(A=E,E=null):A=E.sibling;var D=d(m,E,h[b],v);if(D===null){E===null&&(E=A);break}e&&E&&D.alternate===null&&t(m,E),g=i(D,g,b),S===null?_=D:S.sibling=D,S=D,E=A}if(b===h.length)return n(m,E),de&&mn(m,b),_;if(E===null){for(;bb?(A=E,E=null):A=E.sibling;var T=d(m,E,D.value,v);if(T===null){E===null&&(E=A);break}e&&E&&T.alternate===null&&t(m,E),g=i(T,g,b),S===null?_=T:S.sibling=T,S=T,E=A}if(D.done)return n(m,E),de&&mn(m,b),_;if(E===null){for(;!D.done;b++,D=h.next())D=c(m,D.value,v),D!==null&&(g=i(D,g,b),S===null?_=D:S.sibling=D,S=D);return de&&mn(m,b),_}for(E=r(m,E);!D.done;b++,D=h.next())D=x(E,m,b,D.value,v),D!==null&&(e&&D.alternate!==null&&E.delete(D.key===null?b:D.key),g=i(D,g,b),S===null?_=D:S.sibling=D,S=D);return e&&E.forEach(function(I){return t(m,I)}),de&&mn(m,b),_}function k(m,g,h,v){if(typeof h=="object"&&h!==null&&h.type===Wn&&h.key===null&&(h=h.props.children),typeof h=="object"&&h!==null){switch(h.$$typeof){case Jo:e:{for(var _=h.key,S=g;S!==null;){if(S.key===_){if(_=h.type,_===Wn){if(S.tag===7){n(m,S.sibling),g=o(S,h.props.children),g.return=m,m=g;break e}}else if(S.elementType===_||typeof _=="object"&&_!==null&&_.$$typeof===Xt&&pd(_)===S.type){n(m,S.sibling),g=o(S,h.props),g.ref=Dr(m,S,h),g.return=m,m=g;break e}n(m,S);break}else t(m,S);S=S.sibling}h.type===Wn?(g=En(h.props.children,m.mode,v,h.key),g.return=m,m=g):(v=Fi(h.type,h.key,h.props,null,m.mode,v),v.ref=Dr(m,g,h),v.return=m,m=v)}return s(m);case Vn:e:{for(S=h.key;g!==null;){if(g.key===S)if(g.tag===4&&g.stateNode.containerInfo===h.containerInfo&&g.stateNode.implementation===h.implementation){n(m,g.sibling),g=o(g,h.children||[]),g.return=m,m=g;break e}else{n(m,g);break}else t(m,g);g=g.sibling}g=Pl(h,m.mode,v),g.return=m,m=g}return s(m);case Xt:return S=h._init,k(m,g,S(h._payload),v)}if(Qr(h))return y(m,g,h,v);if(Ir(h))return w(m,g,h,v);ci(m,h)}return typeof h=="string"&&h!==""||typeof h=="number"?(h=""+h,g!==null&&g.tag===6?(n(m,g.sibling),g=o(g,h),g.return=m,m=g):(n(m,g),g=zl(h,m.mode,v),g.return=m,m=g),s(m)):n(m,g)}return k}var hr=yh(!0),xh=yh(!1),ss=pn(null),ls=null,qn=null,Pu=null;function Tu(){Pu=qn=ls=null}function Iu(e){var t=ss.current;ce(ss),e._currentValue=t}function Na(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function lr(e,t){ls=e,Pu=qn=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(De=!0),e.firstContext=null)}function nt(e){var t=e._currentValue;if(Pu!==e)if(e={context:e,memoizedValue:t,next:null},qn===null){if(ls===null)throw Error(F(308));qn=e,ls.dependencies={lanes:0,firstContext:e}}else qn=qn.next=e;return t}var wn=null;function Ru(e){wn===null?wn=[e]:wn.push(e)}function vh(e,t,n,r){var o=t.interleaved;return o===null?(n.next=n,Ru(t)):(n.next=o.next,o.next=n),t.interleaved=n,Dt(e,r)}function Dt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var Qt=!1;function Lu(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function wh(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Lt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function on(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,oe&2){var o=r.pending;return o===null?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Dt(e,n)}return o=r.interleaved,o===null?(t.next=t,Ru(r)):(t.next=o.next,o.next=t),r.interleaved=t,Dt(e,n)}function Li(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,wu(e,n)}}function hd(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var o=null,i=null;if(n=n.firstBaseUpdate,n!==null){do{var s={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};i===null?o=i=s:i=i.next=s,n=n.next}while(n!==null);i===null?o=i=t:i=i.next=t}else o=i=t;n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:i,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function as(e,t,n,r){var o=e.updateQueue;Qt=!1;var i=o.firstBaseUpdate,s=o.lastBaseUpdate,l=o.shared.pending;if(l!==null){o.shared.pending=null;var a=l,u=a.next;a.next=null,s===null?i=u:s.next=u,s=a;var p=e.alternate;p!==null&&(p=p.updateQueue,l=p.lastBaseUpdate,l!==s&&(l===null?p.firstBaseUpdate=u:l.next=u,p.lastBaseUpdate=a))}if(i!==null){var c=o.baseState;s=0,p=u=a=null,l=i;do{var d=l.lane,x=l.eventTime;if((r&d)===d){p!==null&&(p=p.next={eventTime:x,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var y=e,w=l;switch(d=t,x=n,w.tag){case 1:if(y=w.payload,typeof y=="function"){c=y.call(x,c,d);break e}c=y;break e;case 3:y.flags=y.flags&-65537|128;case 0:if(y=w.payload,d=typeof y=="function"?y.call(x,c,d):y,d==null)break e;c=me({},c,d);break e;case 2:Qt=!0}}l.callback!==null&&l.lane!==0&&(e.flags|=64,d=o.effects,d===null?o.effects=[l]:d.push(l))}else x={eventTime:x,lane:d,tag:l.tag,payload:l.payload,callback:l.callback,next:null},p===null?(u=p=x,a=c):p=p.next=x,s|=d;if(l=l.next,l===null){if(l=o.shared.pending,l===null)break;d=l,l=d.next,d.next=null,o.lastBaseUpdate=d,o.shared.pending=null}}while(!0);if(p===null&&(a=c),o.baseState=a,o.firstBaseUpdate=u,o.lastBaseUpdate=p,t=o.shared.interleaved,t!==null){o=t;do s|=o.lane,o=o.next;while(o!==t)}else i===null&&(o.shared.lanes=0);zn|=s,e.lanes=s,e.memoizedState=c}}function gd(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=Cl.transition;Cl.transition={};try{e(!1),t()}finally{se=n,Cl.transition=r}}function $h(){return rt().memoizedState}function l1(e,t,n){var r=ln(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Dh(e))Oh(t,n);else if(n=vh(e,t,n,r),n!==null){var o=Re();pt(n,e,r,o),Bh(n,t,r)}}function a1(e,t,n){var r=ln(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Dh(e))Oh(t,o);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var s=t.lastRenderedState,l=i(s,n);if(o.hasEagerState=!0,o.eagerState=l,ht(l,s)){var a=t.interleaved;a===null?(o.next=o,Ru(t)):(o.next=a.next,a.next=o),t.interleaved=o;return}}catch{}finally{}n=vh(e,t,o,r),n!==null&&(o=Re(),pt(n,e,r,o),Bh(n,t,r))}}function Dh(e){var t=e.alternate;return e===ge||t!==null&&t===ge}function Oh(e,t){oo=cs=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Bh(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,wu(e,n)}}var ds={readContext:nt,useCallback:Me,useContext:Me,useEffect:Me,useImperativeHandle:Me,useInsertionEffect:Me,useLayoutEffect:Me,useMemo:Me,useReducer:Me,useRef:Me,useState:Me,useDebugValue:Me,useDeferredValue:Me,useTransition:Me,useMutableSource:Me,useSyncExternalStore:Me,useId:Me,unstable_isNewReconciler:!1},u1={readContext:nt,useCallback:function(e,t){return wt().memoizedState=[e,t===void 0?null:t],e},useContext:nt,useEffect:yd,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,$i(4194308,4,Th.bind(null,t,e),n)},useLayoutEffect:function(e,t){return $i(4194308,4,e,t)},useInsertionEffect:function(e,t){return $i(4,2,e,t)},useMemo:function(e,t){var n=wt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=wt();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=l1.bind(null,ge,e),[r.memoizedState,e]},useRef:function(e){var t=wt();return e={current:e},t.memoizedState=e},useState:md,useDebugValue:Vu,useDeferredValue:function(e){return wt().memoizedState=e},useTransition:function(){var e=md(!1),t=e[0];return e=s1.bind(null,e[1]),wt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=ge,o=wt();if(de){if(n===void 0)throw Error(F(407));n=n()}else{if(n=t(),Ee===null)throw Error(F(349));Mn&30||Eh(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,yd(bh.bind(null,r,i,e),[e]),r.flags|=2048,bo(9,Ch.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=wt(),t=Ee.identifierPrefix;if(de){var n=It,r=Tt;n=(r&~(1<<32-ft(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=Eo++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=s.createElement(n,{is:r.is}):(e=s.createElement(n),n==="select"&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,n),e[kt]=t,e[So]=r,Kh(e,t,!1,!1),t.stateNode=e;e:{switch(s=ua(n,r),n){case"dialog":ue("cancel",e),ue("close",e),o=r;break;case"iframe":case"object":case"embed":ue("load",e),o=r;break;case"video":case"audio":for(o=0;oyr&&(t.flags|=128,r=!0,Or(i,!1),t.lanes=4194304)}else{if(!r)if(e=us(s),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Or(i,!0),i.tail===null&&i.tailMode==="hidden"&&!s.alternate&&!de)return ze(t),null}else 2*xe()-i.renderingStartTime>yr&&n!==1073741824&&(t.flags|=128,r=!0,Or(i,!1),t.lanes=4194304);i.isBackwards?(s.sibling=t.child,t.child=s):(n=i.last,n!==null?n.sibling=s:t.child=s,i.last=s)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=xe(),t.sibling=null,n=he.current,ae(he,r?n&1|2:n&1),t):(ze(t),null);case 22:case 23:return Gu(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Ve&1073741824&&(ze(t),t.subtreeFlags&6&&(t.flags|=8192)):ze(t),null;case 24:return null;case 25:return null}throw Error(F(156,t.tag))}function y1(e,t){switch(Mu(t),t.tag){case 1:return Fe(t.type)&&ns(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return gr(),ce(Be),ce(Te),Du(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return $u(t),null;case 13:if(ce(he),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(F(340));pr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return ce(he),null;case 4:return gr(),null;case 10:return Iu(t.type._context),null;case 22:case 23:return Gu(),null;case 24:return null;default:return null}}var fi=!1,Pe=!1,x1=typeof WeakSet=="function"?WeakSet:Set,U=null;function Jn(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){ye(e,t,r)}else n.current=null}function Aa(e,t,n){try{n()}catch(r){ye(e,t,r)}}var jd=!1;function v1(e,t){if(va=qi,e=rh(),Nu(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch{n=null;break e}var s=0,l=-1,a=-1,u=0,p=0,c=e,d=null;t:for(;;){for(var x;c!==n||o!==0&&c.nodeType!==3||(l=s+o),c!==i||r!==0&&c.nodeType!==3||(a=s+r),c.nodeType===3&&(s+=c.nodeValue.length),(x=c.firstChild)!==null;)d=c,c=x;for(;;){if(c===e)break t;if(d===n&&++u===o&&(l=s),d===i&&++p===r&&(a=s),(x=c.nextSibling)!==null)break;c=d,d=c.parentNode}c=x}n=l===-1||a===-1?null:{start:l,end:a}}else n=null}n=n||{start:0,end:0}}else n=null;for(wa={focusedElem:e,selectionRange:n},qi=!1,U=t;U!==null;)if(t=U,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,U=e;else for(;U!==null;){t=U;try{var y=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(y!==null){var w=y.memoizedProps,k=y.memoizedState,m=t.stateNode,g=m.getSnapshotBeforeUpdate(t.elementType===t.type?w:it(t.type,w),k);m.__reactInternalSnapshotBeforeUpdate=g}break;case 3:var h=t.stateNode.containerInfo;h.nodeType===1?h.textContent="":h.nodeType===9&&h.documentElement&&h.removeChild(h.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(F(163))}}catch(v){ye(t,t.return,v)}if(e=t.sibling,e!==null){e.return=t.return,U=e;break}U=t.return}return y=jd,jd=!1,y}function io(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var o=r=r.next;do{if((o.tag&e)===e){var i=o.destroy;o.destroy=void 0,i!==void 0&&Aa(t,n,i)}o=o.next}while(o!==r)}}function $s(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function $a(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Jh(e){var t=e.alternate;t!==null&&(e.alternate=null,Jh(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[kt],delete t[So],delete t[_a],delete t[t1],delete t[n1])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function eg(e){return e.tag===5||e.tag===3||e.tag===4}function Md(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||eg(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Da(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=ts));else if(r!==4&&(e=e.child,e!==null))for(Da(e,t,n),e=e.sibling;e!==null;)Da(e,t,n),e=e.sibling}function Oa(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Oa(e,t,n),e=e.sibling;e!==null;)Oa(e,t,n),e=e.sibling}var Ce=null,st=!1;function Wt(e,t,n){for(n=n.child;n!==null;)tg(e,t,n),n=n.sibling}function tg(e,t,n){if(_t&&typeof _t.onCommitFiberUnmount=="function")try{_t.onCommitFiberUnmount(Ms,n)}catch{}switch(n.tag){case 5:Pe||Jn(n,t);case 6:var r=Ce,o=st;Ce=null,Wt(e,t,n),Ce=r,st=o,Ce!==null&&(st?(e=Ce,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Ce.removeChild(n.stateNode));break;case 18:Ce!==null&&(st?(e=Ce,n=n.stateNode,e.nodeType===8?kl(e.parentNode,n):e.nodeType===1&&kl(e,n),mo(e)):kl(Ce,n.stateNode));break;case 4:r=Ce,o=st,Ce=n.stateNode.containerInfo,st=!0,Wt(e,t,n),Ce=r,st=o;break;case 0:case 11:case 14:case 15:if(!Pe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){o=r=r.next;do{var i=o,s=i.destroy;i=i.tag,s!==void 0&&(i&2||i&4)&&Aa(n,t,s),o=o.next}while(o!==r)}Wt(e,t,n);break;case 1:if(!Pe&&(Jn(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(l){ye(n,t,l)}Wt(e,t,n);break;case 21:Wt(e,t,n);break;case 22:n.mode&1?(Pe=(r=Pe)||n.memoizedState!==null,Wt(e,t,n),Pe=r):Wt(e,t,n);break;default:Wt(e,t,n)}}function zd(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new x1),t.forEach(function(r){var o=j1.bind(null,e,r);n.has(r)||(n.add(r),r.then(o,o))})}}function ot(e,t){var n=t.deletions;if(n!==null)for(var r=0;ro&&(o=s),r&=~i}if(r=o,r=xe()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*S1(r/1960))-r,10e?16:e,Jt===null)var r=!1;else{if(e=Jt,Jt=null,hs=0,oe&6)throw Error(F(331));var o=oe;for(oe|=4,U=e.current;U!==null;){var i=U,s=i.child;if(U.flags&16){var l=i.deletions;if(l!==null){for(var a=0;axe()-Xu?_n(e,0):Yu|=n),He(e,t)}function ug(e,t){t===0&&(e.mode&1?(t=ri,ri<<=1,!(ri&130023424)&&(ri=4194304)):t=1);var n=Re();e=Dt(e,t),e!==null&&(Oo(e,t,n),He(e,n))}function N1(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),ug(e,n)}function j1(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;o!==null&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(F(314))}r!==null&&r.delete(t),ug(e,n)}var cg;cg=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||Be.current)De=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return De=!1,g1(e,t,n);De=!!(e.flags&131072)}else De=!1,de&&t.flags&1048576&&hh(t,is,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Di(e,t),e=t.pendingProps;var o=fr(t,Te.current);lr(t,n),o=Bu(null,t,r,e,o,n);var i=Fu();return t.flags|=1,typeof o=="object"&&o!==null&&typeof o.render=="function"&&o.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Fe(r)?(i=!0,rs(t)):i=!1,t.memoizedState=o.state!==null&&o.state!==void 0?o.state:null,Lu(t),o.updater=As,t.stateNode=o,o._reactInternals=t,Ma(t,r,e,n),t=Ta(null,t,r,!0,i,n)):(t.tag=0,de&&i&&ju(t),Ie(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Di(e,t),e=t.pendingProps,o=r._init,r=o(r._payload),t.type=r,o=t.tag=z1(r),e=it(r,e),o){case 0:t=Pa(null,t,r,e,n);break e;case 1:t=Cd(null,t,r,e,n);break e;case 11:t=_d(null,t,r,e,n);break e;case 14:t=Ed(null,t,r,it(r.type,e),n);break e}throw Error(F(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:it(r,o),Pa(e,t,r,o,n);case 1:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:it(r,o),Cd(e,t,r,o,n);case 3:e:{if(Xh(t),e===null)throw Error(F(387));r=t.pendingProps,i=t.memoizedState,o=i.element,wh(e,t),as(t,r,null,n);var s=t.memoizedState;if(r=s.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){o=mr(Error(F(423)),t),t=bd(e,t,r,n,o);break e}else if(r!==o){o=mr(Error(F(424)),t),t=bd(e,t,r,n,o);break e}else for(Ue=rn(t.stateNode.containerInfo.firstChild),Ye=t,de=!0,at=null,n=xh(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(pr(),r===o){t=Ot(e,t,n);break e}Ie(e,t,r,n)}t=t.child}return t;case 5:return Sh(t),e===null&&ba(t),r=t.type,o=t.pendingProps,i=e!==null?e.memoizedProps:null,s=o.children,Sa(r,o)?s=null:i!==null&&Sa(r,i)&&(t.flags|=32),Yh(e,t),Ie(e,t,s,n),t.child;case 6:return e===null&&ba(t),null;case 13:return Qh(e,t,n);case 4:return Au(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=hr(t,null,r,n):Ie(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:it(r,o),_d(e,t,r,o,n);case 7:return Ie(e,t,t.pendingProps,n),t.child;case 8:return Ie(e,t,t.pendingProps.children,n),t.child;case 12:return Ie(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,s=o.value,ae(ss,r._currentValue),r._currentValue=s,i!==null)if(ht(i.value,s)){if(i.children===o.children&&!Be.current){t=Ot(e,t,n);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var l=i.dependencies;if(l!==null){s=i.child;for(var a=l.firstContext;a!==null;){if(a.context===r){if(i.tag===1){a=Lt(-1,n&-n),a.tag=2;var u=i.updateQueue;if(u!==null){u=u.shared;var p=u.pending;p===null?a.next=a:(a.next=p.next,p.next=a),u.pending=a}}i.lanes|=n,a=i.alternate,a!==null&&(a.lanes|=n),Na(i.return,n,t),l.lanes|=n;break}a=a.next}}else if(i.tag===10)s=i.type===t.type?null:i.child;else if(i.tag===18){if(s=i.return,s===null)throw Error(F(341));s.lanes|=n,l=s.alternate,l!==null&&(l.lanes|=n),Na(s,n,t),s=i.sibling}else s=i.child;if(s!==null)s.return=i;else for(s=i;s!==null;){if(s===t){s=null;break}if(i=s.sibling,i!==null){i.return=s.return,s=i;break}s=s.return}i=s}Ie(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,lr(t,n),o=nt(o),r=r(o),t.flags|=1,Ie(e,t,r,n),t.child;case 14:return r=t.type,o=it(r,t.pendingProps),o=it(r.type,o),Ed(e,t,r,o,n);case 15:return Wh(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:it(r,o),Di(e,t),t.tag=1,Fe(r)?(e=!0,rs(t)):e=!1,lr(t,n),Fh(t,r,o),Ma(t,r,o,n),Ta(null,t,r,!0,e,n);case 19:return Gh(e,t,n);case 22:return Uh(e,t,n)}throw Error(F(156,t.tag))};function dg(e,t){return Dp(e,t)}function M1(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function et(e,t,n,r){return new M1(e,t,n,r)}function Zu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function z1(e){if(typeof e=="function")return Zu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===mu)return 11;if(e===yu)return 14}return 2}function an(e,t){var n=e.alternate;return n===null?(n=et(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Fi(e,t,n,r,o,i){var s=2;if(r=e,typeof e=="function")Zu(e)&&(s=1);else if(typeof e=="string")s=5;else e:switch(e){case Wn:return En(n.children,o,i,t);case gu:s=8,o|=8;break;case Jl:return e=et(12,n,t,o|2),e.elementType=Jl,e.lanes=i,e;case ea:return e=et(13,n,t,o),e.elementType=ea,e.lanes=i,e;case ta:return e=et(19,n,t,o),e.elementType=ta,e.lanes=i,e;case Sp:return Os(n,o,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case vp:s=10;break e;case wp:s=9;break e;case mu:s=11;break e;case yu:s=14;break e;case Xt:s=16,r=null;break e}throw Error(F(130,e==null?e:typeof e,""))}return t=et(s,n,t,o),t.elementType=e,t.type=r,t.lanes=i,t}function En(e,t,n,r){return e=et(7,e,r,t),e.lanes=n,e}function Os(e,t,n,r){return e=et(22,e,r,t),e.elementType=Sp,e.lanes=n,e.stateNode={isHidden:!1},e}function zl(e,t,n){return e=et(6,e,null,t),e.lanes=n,e}function Pl(e,t,n){return t=et(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function P1(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=dl(0),this.expirationTimes=dl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=dl(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function qu(e,t,n,r,o,i,s,l,a){return e=new P1(e,t,n,l,a),t===1?(t=1,i===!0&&(t|=8)):t=0,i=et(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Lu(i),e}function T1(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(gg)}catch(e){console.error(e)}}gg(),gp.exports=Ge;var $1=gp.exports,Dd=$1;Zl.createRoot=Dd.createRoot,Zl.hydrateRoot=Dd.hydrateRoot;function we(e){if(typeof e=="string"||typeof e=="number")return""+e;let t="";if(Array.isArray(e))for(let n=0,r;n{}};function Ws(){for(var e=0,t=arguments.length,n={},r;e=0&&(r=n.slice(o+1),n=n.slice(0,o)),n&&!t.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:r}})}Hi.prototype=Ws.prototype={constructor:Hi,on:function(e,t){var n=this._,r=O1(e+"",n),o,i=-1,s=r.length;if(arguments.length<2){for(;++i0)for(var n=new Array(o),r=0,o,i;r=0&&(t=e.slice(0,n))!=="xmlns"&&(e=e.slice(n+1)),Bd.hasOwnProperty(t)?{space:Bd[t],local:e}:e}function F1(e){return function(){var t=this.ownerDocument,n=this.namespaceURI;return n===Wa&&t.documentElement.namespaceURI===Wa?t.createElement(e):t.createElementNS(n,e)}}function H1(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function mg(e){var t=Us(e);return(t.local?H1:F1)(t)}function V1(){}function nc(e){return e==null?V1:function(){return this.querySelector(e)}}function W1(e){typeof e!="function"&&(e=nc(e));for(var t=this._groups,n=t.length,r=new Array(n),o=0;o=h&&(h=g+1);!(_=k[h])&&++h=0;)(s=r[o])&&(i&&s.compareDocumentPosition(i)^4&&i.parentNode.insertBefore(s,i),i=s);return this}function gv(e){e||(e=mv);function t(c,d){return c&&d?e(c.__data__,d.__data__):!c-!d}for(var n=this._groups,r=n.length,o=new Array(r),i=0;it?1:e>=t?0:NaN}function yv(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function xv(){return Array.from(this)}function vv(){for(var e=this._groups,t=0,n=e.length;t1?this.each((t==null?zv:typeof t=="function"?Tv:Pv)(e,t,n??"")):xr(this.node(),e)}function xr(e,t){return e.style.getPropertyValue(t)||Sg(e).getComputedStyle(e,null).getPropertyValue(t)}function Rv(e){return function(){delete this[e]}}function Lv(e,t){return function(){this[e]=t}}function Av(e,t){return function(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}}function $v(e,t){return arguments.length>1?this.each((t==null?Rv:typeof t=="function"?Av:Lv)(e,t)):this.node()[e]}function kg(e){return e.trim().split(/^|\s+/)}function rc(e){return e.classList||new _g(e)}function _g(e){this._node=e,this._names=kg(e.getAttribute("class")||"")}_g.prototype={add:function(e){var t=this._names.indexOf(e);t<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var t=this._names.indexOf(e);t>=0&&(this._names.splice(t,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function Eg(e,t){for(var n=rc(e),r=-1,o=t.length;++r=0&&(n=t.slice(r+1),t=t.slice(0,r)),{type:t,name:n}})}function dw(e){return function(){var t=this.__on;if(t){for(var n=0,r=-1,o=t.length,i;n()=>e;function Ua(e,{sourceEvent:t,subject:n,target:r,identifier:o,active:i,x:s,y:l,dx:a,dy:u,dispatch:p}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},identifier:{value:o,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:l,enumerable:!0,configurable:!0},dx:{value:a,enumerable:!0,configurable:!0},dy:{value:u,enumerable:!0,configurable:!0},_:{value:p}})}Ua.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};function Sw(e){return!e.ctrlKey&&!e.button}function kw(){return this.parentNode}function _w(e,t){return t??{x:e.x,y:e.y}}function Ew(){return navigator.maxTouchPoints||"ontouchstart"in this}function zg(){var e=Sw,t=kw,n=_w,r=Ew,o={},i=Ws("start","drag","end"),s=0,l,a,u,p,c=0;function d(v){v.on("mousedown.drag",x).filter(r).on("touchstart.drag",k).on("touchmove.drag",m,ww).on("touchend.drag touchcancel.drag",g).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function x(v,_){if(!(p||!e.call(this,v,_))){var S=h(this,t.call(this,v,_),v,_,"mouse");S&&(We(v.view).on("mousemove.drag",y,jo).on("mouseup.drag",w,jo),jg(v.view),Tl(v),u=!1,l=v.clientX,a=v.clientY,S("start",v))}}function y(v){if(ur(v),!u){var _=v.clientX-l,S=v.clientY-a;u=_*_+S*S>c}o.mouse("drag",v)}function w(v){We(v.view).on("mousemove.drag mouseup.drag",null),Mg(v.view,u),ur(v),o.mouse("end",v)}function k(v,_){if(e.call(this,v,_)){var S=v.changedTouches,E=t.call(this,v,_),b=S.length,A,D;for(A=0;A>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):n===8?mi(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):n===4?mi(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=bw.exec(e))?new Oe(t[1],t[2],t[3],1):(t=Nw.exec(e))?new Oe(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=jw.exec(e))?mi(t[1],t[2],t[3],t[4]):(t=Mw.exec(e))?mi(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=zw.exec(e))?Xd(t[1],t[2]/100,t[3]/100,1):(t=Pw.exec(e))?Xd(t[1],t[2]/100,t[3]/100,t[4]):Fd.hasOwnProperty(e)?Wd(Fd[e]):e==="transparent"?new Oe(NaN,NaN,NaN,0):null}function Wd(e){return new Oe(e>>16&255,e>>8&255,e&255,1)}function mi(e,t,n,r){return r<=0&&(e=t=n=NaN),new Oe(e,t,n,r)}function Rw(e){return e instanceof Wo||(e=Tn(e)),e?(e=e.rgb(),new Oe(e.r,e.g,e.b,e.opacity)):new Oe}function Ya(e,t,n,r){return arguments.length===1?Rw(e):new Oe(e,t,n,r??1)}function Oe(e,t,n,r){this.r=+e,this.g=+t,this.b=+n,this.opacity=+r}oc(Oe,Ya,Pg(Wo,{brighter(e){return e=e==null?xs:Math.pow(xs,e),new Oe(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?Mo:Math.pow(Mo,e),new Oe(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Oe(Cn(this.r),Cn(this.g),Cn(this.b),vs(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Ud,formatHex:Ud,formatHex8:Lw,formatRgb:Yd,toString:Yd}));function Ud(){return`#${kn(this.r)}${kn(this.g)}${kn(this.b)}`}function Lw(){return`#${kn(this.r)}${kn(this.g)}${kn(this.b)}${kn((isNaN(this.opacity)?1:this.opacity)*255)}`}function Yd(){const e=vs(this.opacity);return`${e===1?"rgb(":"rgba("}${Cn(this.r)}, ${Cn(this.g)}, ${Cn(this.b)}${e===1?")":`, ${e})`}`}function vs(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function Cn(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function kn(e){return e=Cn(e),(e<16?"0":"")+e.toString(16)}function Xd(e,t,n,r){return r<=0?e=t=n=NaN:n<=0||n>=1?e=t=NaN:t<=0&&(e=NaN),new ut(e,t,n,r)}function Tg(e){if(e instanceof ut)return new ut(e.h,e.s,e.l,e.opacity);if(e instanceof Wo||(e=Tn(e)),!e)return new ut;if(e instanceof ut)return e;e=e.rgb();var t=e.r/255,n=e.g/255,r=e.b/255,o=Math.min(t,n,r),i=Math.max(t,n,r),s=NaN,l=i-o,a=(i+o)/2;return l?(t===i?s=(n-r)/l+(n0&&a<1?0:s,new ut(s,l,a,e.opacity)}function Aw(e,t,n,r){return arguments.length===1?Tg(e):new ut(e,t,n,r??1)}function ut(e,t,n,r){this.h=+e,this.s=+t,this.l=+n,this.opacity=+r}oc(ut,Aw,Pg(Wo,{brighter(e){return e=e==null?xs:Math.pow(xs,e),new ut(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?Mo:Math.pow(Mo,e),new ut(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*t,o=2*n-r;return new Oe(Il(e>=240?e-240:e+120,o,r),Il(e,o,r),Il(e<120?e+240:e-120,o,r),this.opacity)},clamp(){return new ut(Qd(this.h),yi(this.s),yi(this.l),vs(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=vs(this.opacity);return`${e===1?"hsl(":"hsla("}${Qd(this.h)}, ${yi(this.s)*100}%, ${yi(this.l)*100}%${e===1?")":`, ${e})`}`}}));function Qd(e){return e=(e||0)%360,e<0?e+360:e}function yi(e){return Math.max(0,Math.min(1,e||0))}function Il(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}const ic=e=>()=>e;function $w(e,t){return function(n){return e+n*t}}function Dw(e,t,n){return e=Math.pow(e,n),t=Math.pow(t,n)-e,n=1/n,function(r){return Math.pow(e+r*t,n)}}function Ow(e){return(e=+e)==1?Ig:function(t,n){return n-t?Dw(t,n,e):ic(isNaN(t)?n:t)}}function Ig(e,t){var n=t-e;return n?$w(e,n):ic(isNaN(e)?t:e)}const ws=function e(t){var n=Ow(t);function r(o,i){var s=n((o=Ya(o)).r,(i=Ya(i)).r),l=n(o.g,i.g),a=n(o.b,i.b),u=Ig(o.opacity,i.opacity);return function(p){return o.r=s(p),o.g=l(p),o.b=a(p),o.opacity=u(p),o+""}}return r.gamma=e,r}(1);function Bw(e,t){t||(t=[]);var n=e?Math.min(t.length,e.length):0,r=t.slice(),o;return function(i){for(o=0;on&&(i=t.slice(n,i),l[s]?l[s]+=i:l[++s]=i),(r=r[0])===(o=o[0])?l[s]?l[s]+=o:l[++s]=o:(l[++s]=null,a.push({i:s,x:St(r,o)})),n=Rl.lastIndex;return n180?p+=360:p-u>180&&(u+=360),d.push({i:c.push(o(c)+"rotate(",null,r)-2,x:St(u,p)})):p&&c.push(o(c)+"rotate("+p+r)}function l(u,p,c,d){u!==p?d.push({i:c.push(o(c)+"skewX(",null,r)-2,x:St(u,p)}):p&&c.push(o(c)+"skewX("+p+r)}function a(u,p,c,d,x,y){if(u!==c||p!==d){var w=x.push(o(x)+"scale(",null,",",null,")");y.push({i:w-4,x:St(u,c)},{i:w-2,x:St(p,d)})}else(c!==1||d!==1)&&x.push(o(x)+"scale("+c+","+d+")")}return function(u,p){var c=[],d=[];return u=e(u),p=e(p),i(u.translateX,u.translateY,p.translateX,p.translateY,c,d),s(u.rotate,p.rotate,c,d),l(u.skewX,p.skewX,c,d),a(u.scaleX,u.scaleY,p.scaleX,p.scaleY,c,d),u=p=null,function(x){for(var y=-1,w=d.length,k;++y=0&&e._call.call(void 0,t),e=e._next;--vr}function Zd(){In=(ks=Po.now())+Ys,vr=Zr=0;try{t2()}finally{vr=0,r2(),In=0}}function n2(){var e=Po.now(),t=e-ks;t>$g&&(Ys-=t,ks=e)}function r2(){for(var e,t=Ss,n,r=1/0;t;)t._call?(r>t._time&&(r=t._time),e=t,t=t._next):(n=t._next,t._next=null,t=e?e._next=n:Ss=n);qr=e,Ga(r)}function Ga(e){if(!vr){Zr&&(Zr=clearTimeout(Zr));var t=e-In;t>24?(e<1/0&&(Zr=setTimeout(Zd,e-Po.now()-Ys)),Fr&&(Fr=clearInterval(Fr))):(Fr||(ks=Po.now(),Fr=setInterval(n2,$g)),vr=1,Dg(Zd))}}function qd(e,t,n){var r=new _s;return t=t==null?0:+t,r.restart(o=>{r.stop(),e(o+t)},t,n),r}var o2=Ws("start","end","cancel","interrupt"),i2=[],Bg=0,Jd=1,Ka=2,Wi=3,ef=4,Za=5,Ui=6;function Xs(e,t,n,r,o,i){var s=e.__transition;if(!s)e.__transition={};else if(n in s)return;s2(e,n,{name:t,index:r,group:o,on:o2,tween:i2,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:Bg})}function lc(e,t){var n=gt(e,t);if(n.state>Bg)throw new Error("too late; already scheduled");return n}function Nt(e,t){var n=gt(e,t);if(n.state>Wi)throw new Error("too late; already running");return n}function gt(e,t){var n=e.__transition;if(!n||!(n=n[t]))throw new Error("transition not found");return n}function s2(e,t,n){var r=e.__transition,o;r[t]=n,n.timer=Og(i,0,n.time);function i(u){n.state=Jd,n.timer.restart(s,n.delay,n.time),n.delay<=u&&s(u-n.delay)}function s(u){var p,c,d,x;if(n.state!==Jd)return a();for(p in r)if(x=r[p],x.name===n.name){if(x.state===Wi)return qd(s);x.state===ef?(x.state=Ui,x.timer.stop(),x.on.call("interrupt",e,e.__data__,x.index,x.group),delete r[p]):+pKa&&r.state=0&&(t=t.slice(0,n)),!t||t==="start"})}function A2(e,t,n){var r,o,i=L2(t)?lc:Nt;return function(){var s=i(this,e),l=s.on;l!==r&&(o=(r=l).copy()).on(t,n),s.on=o}}function $2(e,t){var n=this._id;return arguments.length<2?gt(this.node(),n).on.on(e):this.each(A2(n,e,t))}function D2(e){return function(){var t=this.parentNode;for(var n in this.__transition)if(+n!==e)return;t&&t.removeChild(this)}}function O2(){return this.on("end.remove",D2(this._id))}function B2(e){var t=this._name,n=this._id;typeof e!="function"&&(e=nc(e));for(var r=this._groups,o=r.length,i=new Array(o),s=0;s()=>e;function dS(e,{sourceEvent:t,target:n,transform:r,dispatch:o}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:r,enumerable:!0,configurable:!0},_:{value:o}})}function Rt(e,t,n){this.k=e,this.x=t,this.y=n}Rt.prototype={constructor:Rt,scale:function(e){return e===1?this:new Rt(this.k*e,this.x,this.y)},translate:function(e,t){return e===0&t===0?this:new Rt(this.k,this.x+this.k*e,this.y+this.k*t)},apply:function(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function(e){return e*this.k+this.x},applyY:function(e){return e*this.k+this.y},invert:function(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function(e){return(e-this.x)/this.k},invertY:function(e){return(e-this.y)/this.k},rescaleX:function(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var Qs=new Rt(1,0,0);Wg.prototype=Rt.prototype;function Wg(e){for(;!e.__zoom;)if(!(e=e.parentNode))return Qs;return e.__zoom}function Ll(e){e.stopImmediatePropagation()}function Hr(e){e.preventDefault(),e.stopImmediatePropagation()}function fS(e){return(!e.ctrlKey||e.type==="wheel")&&!e.button}function pS(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGElement||e,e.hasAttribute("viewBox")?(e=e.viewBox.baseVal,[[e.x,e.y],[e.x+e.width,e.y+e.height]]):[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]):[[0,0],[e.clientWidth,e.clientHeight]]}function tf(){return this.__zoom||Qs}function hS(e){return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*(e.ctrlKey?10:1)}function gS(){return navigator.maxTouchPoints||"ontouchstart"in this}function mS(e,t,n){var r=e.invertX(t[0][0])-n[0][0],o=e.invertX(t[1][0])-n[1][0],i=e.invertY(t[0][1])-n[0][1],s=e.invertY(t[1][1])-n[1][1];return e.translate(o>r?(r+o)/2:Math.min(0,r)||Math.max(0,o),s>i?(i+s)/2:Math.min(0,i)||Math.max(0,s))}function Ug(){var e=fS,t=pS,n=mS,r=hS,o=gS,i=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],l=250,a=Vi,u=Ws("start","zoom","end"),p,c,d,x=500,y=150,w=0,k=10;function m(C){C.property("__zoom",tf).on("wheel.zoom",b,{passive:!1}).on("mousedown.zoom",A).on("dblclick.zoom",D).filter(o).on("touchstart.zoom",T).on("touchmove.zoom",I).on("touchend.zoom touchcancel.zoom",P).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}m.transform=function(C,L,M,R){var N=C.selection?C.selection():C;N.property("__zoom",tf),C!==N?_(C,L,M,R):N.interrupt().each(function(){S(this,arguments).event(R).start().zoom(null,typeof L=="function"?L.apply(this,arguments):L).end()})},m.scaleBy=function(C,L,M,R){m.scaleTo(C,function(){var N=this.__zoom.k,j=typeof L=="function"?L.apply(this,arguments):L;return N*j},M,R)},m.scaleTo=function(C,L,M,R){m.transform(C,function(){var N=t.apply(this,arguments),j=this.__zoom,$=M==null?v(N):typeof M=="function"?M.apply(this,arguments):M,O=j.invert($),B=typeof L=="function"?L.apply(this,arguments):L;return n(h(g(j,B),$,O),N,s)},M,R)},m.translateBy=function(C,L,M,R){m.transform(C,function(){return n(this.__zoom.translate(typeof L=="function"?L.apply(this,arguments):L,typeof M=="function"?M.apply(this,arguments):M),t.apply(this,arguments),s)},null,R)},m.translateTo=function(C,L,M,R,N){m.transform(C,function(){var j=t.apply(this,arguments),$=this.__zoom,O=R==null?v(j):typeof R=="function"?R.apply(this,arguments):R;return n(Qs.translate(O[0],O[1]).scale($.k).translate(typeof L=="function"?-L.apply(this,arguments):-L,typeof M=="function"?-M.apply(this,arguments):-M),j,s)},R,N)};function g(C,L){return L=Math.max(i[0],Math.min(i[1],L)),L===C.k?C:new Rt(L,C.x,C.y)}function h(C,L,M){var R=L[0]-M[0]*C.k,N=L[1]-M[1]*C.k;return R===C.x&&N===C.y?C:new Rt(C.k,R,N)}function v(C){return[(+C[0][0]+ +C[1][0])/2,(+C[0][1]+ +C[1][1])/2]}function _(C,L,M,R){C.on("start.zoom",function(){S(this,arguments).event(R).start()}).on("interrupt.zoom end.zoom",function(){S(this,arguments).event(R).end()}).tween("zoom",function(){var N=this,j=arguments,$=S(N,j).event(R),O=t.apply(N,j),B=M==null?v(O):typeof M=="function"?M.apply(N,j):M,W=Math.max(O[1][0]-O[0][0],O[1][1]-O[0][1]),V=N.__zoom,Y=typeof L=="function"?L.apply(N,j):L,X=a(V.invert(B).concat(W/V.k),Y.invert(B).concat(W/Y.k));return function(Q){if(Q===1)Q=Y;else{var H=X(Q),K=W/H[2];Q=new Rt(K,B[0]-H[0]*K,B[1]-H[1]*K)}$.zoom(null,Q)}})}function S(C,L,M){return!M&&C.__zooming||new E(C,L)}function E(C,L){this.that=C,this.args=L,this.active=0,this.sourceEvent=null,this.extent=t.apply(C,L),this.taps=0}E.prototype={event:function(C){return C&&(this.sourceEvent=C),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(C,L){return this.mouse&&C!=="mouse"&&(this.mouse[1]=L.invert(this.mouse[0])),this.touch0&&C!=="touch"&&(this.touch0[1]=L.invert(this.touch0[0])),this.touch1&&C!=="touch"&&(this.touch1[1]=L.invert(this.touch1[0])),this.that.__zoom=L,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(C){var L=We(this.that).datum();u.call(C,this.that,new dS(C,{sourceEvent:this.sourceEvent,target:m,transform:this.that.__zoom,dispatch:u}),L)}};function b(C,...L){if(!e.apply(this,arguments))return;var M=S(this,L).event(C),R=this.__zoom,N=Math.max(i[0],Math.min(i[1],R.k*Math.pow(2,r.apply(this,arguments)))),j=lt(C);if(M.wheel)(M.mouse[0][0]!==j[0]||M.mouse[0][1]!==j[1])&&(M.mouse[1]=R.invert(M.mouse[0]=j)),clearTimeout(M.wheel);else{if(R.k===N)return;M.mouse=[j,R.invert(j)],Yi(this),M.start()}Hr(C),M.wheel=setTimeout($,y),M.zoom("mouse",n(h(g(R,N),M.mouse[0],M.mouse[1]),M.extent,s));function $(){M.wheel=null,M.end()}}function A(C,...L){if(d||!e.apply(this,arguments))return;var M=C.currentTarget,R=S(this,L,!0).event(C),N=We(C.view).on("mousemove.zoom",B,!0).on("mouseup.zoom",W,!0),j=lt(C,M),$=C.clientX,O=C.clientY;jg(C.view),Ll(C),R.mouse=[j,this.__zoom.invert(j)],Yi(this),R.start();function B(V){if(Hr(V),!R.moved){var Y=V.clientX-$,X=V.clientY-O;R.moved=Y*Y+X*X>w}R.event(V).zoom("mouse",n(h(R.that.__zoom,R.mouse[0]=lt(V,M),R.mouse[1]),R.extent,s))}function W(V){N.on("mousemove.zoom mouseup.zoom",null),Mg(V.view,R.moved),Hr(V),R.event(V).end()}}function D(C,...L){if(e.apply(this,arguments)){var M=this.__zoom,R=lt(C.changedTouches?C.changedTouches[0]:C,this),N=M.invert(R),j=M.k*(C.shiftKey?.5:2),$=n(h(g(M,j),R,N),t.apply(this,L),s);Hr(C),l>0?We(this).transition().duration(l).call(_,$,R,C):We(this).call(m.transform,$,R,C)}}function T(C,...L){if(e.apply(this,arguments)){var M=C.touches,R=M.length,N=S(this,L,C.changedTouches.length===R).event(C),j,$,O,B;for(Ll(C),$=0;$"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:e=>`Node type "${e}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:e=>`The old edge with id=${e} does not exist.`,error009:e=>`Marker type "${e}" doesn't exist.`,error008:(e,{id:t,sourceHandle:n,targetHandle:r})=>`Couldn't create edge for ${e} handle id: "${e==="source"?n:r}", edge id: ${t}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:e=>`Edge type "${e}" not found. Using fallback type "default".`,error012:e=>`Node with id "${e}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(e="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${e}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs."},To=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],Yg=["Enter"," ","Escape"],Xg={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:e,x:t,y:n})=>`Moved selected node ${e}. New position, x: ${t}, y: ${n}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var wr;(function(e){e.Strict="strict",e.Loose="loose"})(wr||(wr={}));var bn;(function(e){e.Free="free",e.Vertical="vertical",e.Horizontal="horizontal"})(bn||(bn={}));var Io;(function(e){e.Partial="partial",e.Full="full"})(Io||(Io={}));const Qg={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var Zt;(function(e){e.Bezier="default",e.Straight="straight",e.Step="step",e.SmoothStep="smoothstep",e.SimpleBezier="simplebezier"})(Zt||(Zt={}));var Es;(function(e){e.Arrow="arrow",e.ArrowClosed="arrowclosed"})(Es||(Es={}));var q;(function(e){e.Left="left",e.Top="top",e.Right="right",e.Bottom="bottom"})(q||(q={}));const nf={[q.Left]:q.Right,[q.Right]:q.Left,[q.Top]:q.Bottom,[q.Bottom]:q.Top};function Gg(e){return e===null?null:e?"valid":"invalid"}const Kg=e=>"id"in e&&"source"in e&&"target"in e,yS=e=>"id"in e&&"position"in e&&!("source"in e)&&!("target"in e),uc=e=>"id"in e&&"internals"in e&&!("source"in e)&&!("target"in e),Uo=(e,t=[0,0])=>{const{width:n,height:r}=Ht(e),o=e.origin??t,i=n*o[0],s=r*o[1];return{x:e.position.x-i,y:e.position.y-s}},xS=(e,t={nodeOrigin:[0,0]})=>{if(e.length===0)return{x:0,y:0,width:0,height:0};const n=e.reduce((r,o)=>{const i=typeof o=="string";let s=!t.nodeLookup&&!i?o:void 0;t.nodeLookup&&(s=i?t.nodeLookup.get(o):uc(o)?o:t.nodeLookup.get(o.id));const l=s?Cs(s,t.nodeOrigin):{x:0,y:0,x2:0,y2:0};return Gs(r,l)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return Ks(n)},Yo=(e,t={})=>{let n={x:1/0,y:1/0,x2:-1/0,y2:-1/0},r=!1;return e.forEach(o=>{(t.filter===void 0||t.filter(o))&&(n=Gs(n,Cs(o)),r=!0)}),r?Ks(n):{x:0,y:0,width:0,height:0}},cc=(e,t,[n,r,o]=[0,0,1],i=!1,s=!1)=>{const l={...Qo(t,[n,r,o]),width:t.width/o,height:t.height/o},a=[];for(const u of e.values()){const{measured:p,selectable:c=!0,hidden:d=!1}=u;if(s&&!c||d)continue;const x=p.width??u.width??u.initialWidth??null,y=p.height??u.height??u.initialHeight??null,w=Ro(l,kr(u)),k=(x??0)*(y??0),m=i&&w>0;(!u.internals.handleBounds||m||w>=k||u.dragging)&&a.push(u)}return a},vS=(e,t)=>{const n=new Set;return e.forEach(r=>{n.add(r.id)}),t.filter(r=>n.has(r.source)||n.has(r.target))};function wS(e,t){const n=new Map,r=t!=null&&t.nodes?new Set(t.nodes.map(o=>o.id)):null;return e.forEach(o=>{o.measured.width&&o.measured.height&&((t==null?void 0:t.includeHiddenNodes)||!o.hidden)&&(!r||r.has(o.id))&&n.set(o.id,o)}),n}async function SS({nodes:e,width:t,height:n,panZoom:r,minZoom:o,maxZoom:i},s){if(e.size===0)return Promise.resolve(!0);const l=wS(e,s),a=Yo(l),u=dc(a,t,n,(s==null?void 0:s.minZoom)??o,(s==null?void 0:s.maxZoom)??i,(s==null?void 0:s.padding)??.1);return await r.setViewport(u,{duration:s==null?void 0:s.duration,ease:s==null?void 0:s.ease,interpolate:s==null?void 0:s.interpolate}),Promise.resolve(!0)}function Zg({nodeId:e,nextPosition:t,nodeLookup:n,nodeOrigin:r=[0,0],nodeExtent:o,onError:i}){const s=n.get(e),l=s.parentId?n.get(s.parentId):void 0,{x:a,y:u}=l?l.internals.positionAbsolute:{x:0,y:0},p=s.origin??r;let c=s.extent||o;if(s.extent==="parent"&&!s.expandParent)if(!l)i==null||i("005",bt.error005());else{const x=l.measured.width,y=l.measured.height;x&&y&&(c=[[a,u],[a+x,u+y]])}else l&&_r(s.extent)&&(c=[[s.extent[0][0]+a,s.extent[0][1]+u],[s.extent[1][0]+a,s.extent[1][1]+u]]);const d=_r(c)?Rn(t,c,s.measured):t;return(s.measured.width===void 0||s.measured.height===void 0)&&(i==null||i("015",bt.error015())),{position:{x:d.x-a+(s.measured.width??0)*p[0],y:d.y-u+(s.measured.height??0)*p[1]},positionAbsolute:d}}async function kS({nodesToRemove:e=[],edgesToRemove:t=[],nodes:n,edges:r,onBeforeDelete:o}){const i=new Set(e.map(d=>d.id)),s=[];for(const d of n){if(d.deletable===!1)continue;const x=i.has(d.id),y=!x&&d.parentId&&s.find(w=>w.id===d.parentId);(x||y)&&s.push(d)}const l=new Set(t.map(d=>d.id)),a=r.filter(d=>d.deletable!==!1),p=vS(s,a);for(const d of a)l.has(d.id)&&!p.find(y=>y.id===d.id)&&p.push(d);if(!o)return{edges:p,nodes:s};const c=await o({nodes:s,edges:p});return typeof c=="boolean"?c?{edges:p,nodes:s}:{edges:[],nodes:[]}:c}const Sr=(e,t=0,n=1)=>Math.min(Math.max(e,t),n),Rn=(e={x:0,y:0},t,n)=>({x:Sr(e.x,t[0][0],t[1][0]-((n==null?void 0:n.width)??0)),y:Sr(e.y,t[0][1],t[1][1]-((n==null?void 0:n.height)??0))});function qg(e,t,n){const{width:r,height:o}=Ht(n),{x:i,y:s}=n.internals.positionAbsolute;return Rn(e,[[i,s],[i+r,s+o]],t)}const rf=(e,t,n)=>en?-Sr(Math.abs(e-n),1,t)/t:0,Jg=(e,t,n=15,r=40)=>{const o=rf(e.x,r,t.width-r)*n,i=rf(e.y,r,t.height-r)*n;return[o,i]},Gs=(e,t)=>({x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),x2:Math.max(e.x2,t.x2),y2:Math.max(e.y2,t.y2)}),qa=({x:e,y:t,width:n,height:r})=>({x:e,y:t,x2:e+n,y2:t+r}),Ks=({x:e,y:t,x2:n,y2:r})=>({x:e,y:t,width:n-e,height:r-t}),kr=(e,t=[0,0])=>{var o,i;const{x:n,y:r}=uc(e)?e.internals.positionAbsolute:Uo(e,t);return{x:n,y:r,width:((o=e.measured)==null?void 0:o.width)??e.width??e.initialWidth??0,height:((i=e.measured)==null?void 0:i.height)??e.height??e.initialHeight??0}},Cs=(e,t=[0,0])=>{var o,i;const{x:n,y:r}=uc(e)?e.internals.positionAbsolute:Uo(e,t);return{x:n,y:r,x2:n+(((o=e.measured)==null?void 0:o.width)??e.width??e.initialWidth??0),y2:r+(((i=e.measured)==null?void 0:i.height)??e.height??e.initialHeight??0)}},e0=(e,t)=>Ks(Gs(qa(e),qa(t))),Ro=(e,t)=>{const n=Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x)),r=Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y));return Math.ceil(n*r)},of=e=>ct(e.width)&&ct(e.height)&&ct(e.x)&&ct(e.y),ct=e=>!isNaN(e)&&isFinite(e),_S=(e,t)=>{},Xo=(e,t=[1,1])=>({x:t[0]*Math.round(e.x/t[0]),y:t[1]*Math.round(e.y/t[1])}),Qo=({x:e,y:t},[n,r,o],i=!1,s=[1,1])=>{const l={x:(e-n)/o,y:(t-r)/o};return i?Xo(l,s):l},bs=({x:e,y:t},[n,r,o])=>({x:e*o+n,y:t*o+r});function Fn(e,t){if(typeof e=="number")return Math.floor((t-t/(1+e))*.5);if(typeof e=="string"&&e.endsWith("px")){const n=parseFloat(e);if(!Number.isNaN(n))return Math.floor(n)}if(typeof e=="string"&&e.endsWith("%")){const n=parseFloat(e);if(!Number.isNaN(n))return Math.floor(t*n*.01)}return console.error(`[React Flow] The padding value "${e}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function ES(e,t,n){if(typeof e=="string"||typeof e=="number"){const r=Fn(e,n),o=Fn(e,t);return{top:r,right:o,bottom:r,left:o,x:o*2,y:r*2}}if(typeof e=="object"){const r=Fn(e.top??e.y??0,n),o=Fn(e.bottom??e.y??0,n),i=Fn(e.left??e.x??0,t),s=Fn(e.right??e.x??0,t);return{top:r,right:s,bottom:o,left:i,x:i+s,y:r+o}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function CS(e,t,n,r,o,i){const{x:s,y:l}=bs(e,[t,n,r]),{x:a,y:u}=bs({x:e.x+e.width,y:e.y+e.height},[t,n,r]),p=o-a,c=i-u;return{left:Math.floor(s),top:Math.floor(l),right:Math.floor(p),bottom:Math.floor(c)}}const dc=(e,t,n,r,o,i)=>{const s=ES(i,t,n),l=(t-s.x)/e.width,a=(n-s.y)/e.height,u=Math.min(l,a),p=Sr(u,r,o),c=e.x+e.width/2,d=e.y+e.height/2,x=t/2-c*p,y=n/2-d*p,w=CS(e,x,y,p,t,n),k={left:Math.min(w.left-s.left,0),top:Math.min(w.top-s.top,0),right:Math.min(w.right-s.right,0),bottom:Math.min(w.bottom-s.bottom,0)};return{x:x-k.left+k.right,y:y-k.top+k.bottom,zoom:p}},Lo=()=>{var e;return typeof navigator<"u"&&((e=navigator==null?void 0:navigator.userAgent)==null?void 0:e.indexOf("Mac"))>=0};function _r(e){return e!=null&&e!=="parent"}function Ht(e){var t,n;return{width:((t=e.measured)==null?void 0:t.width)??e.width??e.initialWidth??0,height:((n=e.measured)==null?void 0:n.height)??e.height??e.initialHeight??0}}function t0(e){var t,n;return(((t=e.measured)==null?void 0:t.width)??e.width??e.initialWidth)!==void 0&&(((n=e.measured)==null?void 0:n.height)??e.height??e.initialHeight)!==void 0}function n0(e,t={width:0,height:0},n,r,o){const i={...e},s=r.get(n);if(s){const l=s.origin||o;i.x+=s.internals.positionAbsolute.x-(t.width??0)*l[0],i.y+=s.internals.positionAbsolute.y-(t.height??0)*l[1]}return i}function sf(e,t){if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0}function bS(){let e,t;return{promise:new Promise((r,o)=>{e=r,t=o}),resolve:e,reject:t}}function NS(e){return{...Xg,...e||{}}}function uo(e,{snapGrid:t=[0,0],snapToGrid:n=!1,transform:r,containerBounds:o}){const{x:i,y:s}=dt(e),l=Qo({x:i-((o==null?void 0:o.left)??0),y:s-((o==null?void 0:o.top)??0)},r),{x:a,y:u}=n?Xo(l,t):l;return{xSnapped:a,ySnapped:u,...l}}const fc=e=>({width:e.offsetWidth,height:e.offsetHeight}),r0=e=>{var t;return((t=e==null?void 0:e.getRootNode)==null?void 0:t.call(e))||(window==null?void 0:window.document)},jS=["INPUT","SELECT","TEXTAREA"];function o0(e){var r,o;const t=((o=(r=e.composedPath)==null?void 0:r.call(e))==null?void 0:o[0])||e.target;return(t==null?void 0:t.nodeType)!==1?!1:jS.includes(t.nodeName)||t.hasAttribute("contenteditable")||!!t.closest(".nokey")}const i0=e=>"clientX"in e,dt=(e,t)=>{var i,s;const n=i0(e),r=n?e.clientX:(i=e.touches)==null?void 0:i[0].clientX,o=n?e.clientY:(s=e.touches)==null?void 0:s[0].clientY;return{x:r-((t==null?void 0:t.left)??0),y:o-((t==null?void 0:t.top)??0)}},lf=(e,t,n,r,o)=>{const i=t.querySelectorAll(`.${e}`);return!i||!i.length?null:Array.from(i).map(s=>{const l=s.getBoundingClientRect();return{id:s.getAttribute("data-handleid"),type:e,nodeId:o,position:s.getAttribute("data-handlepos"),x:(l.left-n.left)/r,y:(l.top-n.top)/r,...fc(s)}})};function s0({sourceX:e,sourceY:t,targetX:n,targetY:r,sourceControlX:o,sourceControlY:i,targetControlX:s,targetControlY:l}){const a=e*.125+o*.375+s*.375+n*.125,u=t*.125+i*.375+l*.375+r*.125,p=Math.abs(a-e),c=Math.abs(u-t);return[a,u,p,c]}function wi(e,t){return e>=0?.5*e:t*25*Math.sqrt(-e)}function af({pos:e,x1:t,y1:n,x2:r,y2:o,c:i}){switch(e){case q.Left:return[t-wi(t-r,i),n];case q.Right:return[t+wi(r-t,i),n];case q.Top:return[t,n-wi(n-o,i)];case q.Bottom:return[t,n+wi(o-n,i)]}}function l0({sourceX:e,sourceY:t,sourcePosition:n=q.Bottom,targetX:r,targetY:o,targetPosition:i=q.Top,curvature:s=.25}){const[l,a]=af({pos:n,x1:e,y1:t,x2:r,y2:o,c:s}),[u,p]=af({pos:i,x1:r,y1:o,x2:e,y2:t,c:s}),[c,d,x,y]=s0({sourceX:e,sourceY:t,targetX:r,targetY:o,sourceControlX:l,sourceControlY:a,targetControlX:u,targetControlY:p});return[`M${e},${t} C${l},${a} ${u},${p} ${r},${o}`,c,d,x,y]}function a0({sourceX:e,sourceY:t,targetX:n,targetY:r}){const o=Math.abs(n-e)/2,i=n0}const PS=({source:e,sourceHandle:t,target:n,targetHandle:r})=>`xy-edge__${e}${t||""}-${n}${r||""}`,TS=(e,t)=>t.some(n=>n.source===e.source&&n.target===e.target&&(n.sourceHandle===e.sourceHandle||!n.sourceHandle&&!e.sourceHandle)&&(n.targetHandle===e.targetHandle||!n.targetHandle&&!e.targetHandle)),IS=(e,t,n={})=>{if(!e.source||!e.target)return t;const r=n.getEdgeId||PS;let o;return Kg(e)?o={...e}:o={...e,id:r(e)},TS(o,t)?t:(o.sourceHandle===null&&delete o.sourceHandle,o.targetHandle===null&&delete o.targetHandle,t.concat(o))};function u0({sourceX:e,sourceY:t,targetX:n,targetY:r}){const[o,i,s,l]=a0({sourceX:e,sourceY:t,targetX:n,targetY:r});return[`M ${e},${t}L ${n},${r}`,o,i,s,l]}const uf={[q.Left]:{x:-1,y:0},[q.Right]:{x:1,y:0},[q.Top]:{x:0,y:-1},[q.Bottom]:{x:0,y:1}},RS=({source:e,sourcePosition:t=q.Bottom,target:n})=>t===q.Left||t===q.Right?e.xMath.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2));function LS({source:e,sourcePosition:t=q.Bottom,target:n,targetPosition:r=q.Top,center:o,offset:i,stepPosition:s}){const l=uf[t],a=uf[r],u={x:e.x+l.x*i,y:e.y+l.y*i},p={x:n.x+a.x*i,y:n.y+a.y*i},c=RS({source:u,sourcePosition:t,target:p}),d=c.x!==0?"x":"y",x=c[d];let y=[],w,k;const m={x:0,y:0},g={x:0,y:0},[,,h,v]=a0({sourceX:e.x,sourceY:e.y,targetX:n.x,targetY:n.y});if(l[d]*a[d]===-1){d==="x"?(w=o.x??u.x+(p.x-u.x)*s,k=o.y??(u.y+p.y)/2):(w=o.x??(u.x+p.x)/2,k=o.y??u.y+(p.y-u.y)*s);const S=[{x:w,y:u.y},{x:w,y:p.y}],E=[{x:u.x,y:k},{x:p.x,y:k}];l[d]===x?y=d==="x"?S:E:y=d==="x"?E:S}else{const S=[{x:u.x,y:p.y}],E=[{x:p.x,y:u.y}];if(d==="x"?y=l.x===x?E:S:y=l.y===x?S:E,t===r){const I=Math.abs(e[d]-n[d]);if(I<=i){const P=Math.min(i-1,i-I);l[d]===x?m[d]=(u[d]>e[d]?-1:1)*P:g[d]=(p[d]>n[d]?-1:1)*P}}if(t!==r){const I=d==="x"?"y":"x",P=l[d]===a[I],C=u[I]>p[I],L=u[I]=T?(w=(b.x+A.x)/2,k=y[0].y):(w=y[0].x,k=(b.y+A.y)/2)}return[[e,{x:u.x+m.x,y:u.y+m.y},...y,{x:p.x+g.x,y:p.y+g.y},n],w,k,h,v]}function AS(e,t,n,r){const o=Math.min(cf(e,t)/2,cf(t,n)/2,r),{x:i,y:s}=t;if(e.x===i&&i===n.x||e.y===s&&s===n.y)return`L${i} ${s}`;if(e.y===s){const u=e.x{let v="";return h>0&&hn.id===t):e[0])||null}function eu(e,t){return e?typeof e=="string"?e:`${t?`${t}__`:""}${Object.keys(e).sort().map(r=>`${r}=${e[r]}`).join("&")}`:""}function DS(e,{id:t,defaultColor:n,defaultMarkerStart:r,defaultMarkerEnd:o}){const i=new Set;return e.reduce((s,l)=>([l.markerStart||r,l.markerEnd||o].forEach(a=>{if(a&&typeof a=="object"){const u=eu(a,t);i.has(u)||(s.push({id:u,color:a.color||n,...a}),i.add(u))}}),s),[]).sort((s,l)=>s.id.localeCompare(l.id))}const c0=1e3,OS=10,pc={nodeOrigin:[0,0],nodeExtent:To,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},BS={...pc,checkEquality:!0};function hc(e,t){const n={...e};for(const r in t)t[r]!==void 0&&(n[r]=t[r]);return n}function FS(e,t,n){const r=hc(pc,n);for(const o of e.values())if(o.parentId)mc(o,e,t,r);else{const i=Uo(o,r.nodeOrigin),s=_r(o.extent)?o.extent:r.nodeExtent,l=Rn(i,s,Ht(o));o.internals.positionAbsolute=l}}function HS(e,t){if(!e.handles)return e.measured?t==null?void 0:t.internals.handleBounds:void 0;const n=[],r=[];for(const o of e.handles){const i={id:o.id,width:o.width??1,height:o.height??1,nodeId:e.id,x:o.x,y:o.y,position:o.position,type:o.type};o.type==="source"?n.push(i):o.type==="target"&&r.push(i)}return{source:n,target:r}}function gc(e){return e==="manual"}function tu(e,t,n,r={}){var u,p;const o=hc(BS,r),i={i:0},s=new Map(t),l=o!=null&&o.elevateNodesOnSelect&&!gc(o.zIndexMode)?c0:0;let a=e.length>0;t.clear(),n.clear();for(const c of e){let d=s.get(c.id);if(o.checkEquality&&c===(d==null?void 0:d.internals.userNode))t.set(c.id,d);else{const x=Uo(c,o.nodeOrigin),y=_r(c.extent)?c.extent:o.nodeExtent,w=Rn(x,y,Ht(c));d={...o.defaults,...c,measured:{width:(u=c.measured)==null?void 0:u.width,height:(p=c.measured)==null?void 0:p.height},internals:{positionAbsolute:w,handleBounds:HS(c,d),z:d0(c,l,o.zIndexMode),userNode:c}},t.set(c.id,d)}(d.measured===void 0||d.measured.width===void 0||d.measured.height===void 0)&&!d.hidden&&(a=!1),c.parentId&&mc(d,t,n,r,i)}return a}function VS(e,t){if(!e.parentId)return;const n=t.get(e.parentId);n?n.set(e.id,e):t.set(e.parentId,new Map([[e.id,e]]))}function mc(e,t,n,r,o){const{elevateNodesOnSelect:i,nodeOrigin:s,nodeExtent:l,zIndexMode:a}=hc(pc,r),u=e.parentId,p=t.get(u);if(!p){console.warn(`Parent node ${u} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}VS(e,n),o&&!p.parentId&&p.internals.rootParentIndex===void 0&&a==="auto"&&(p.internals.rootParentIndex=++o.i,p.internals.z=p.internals.z+o.i*OS),o&&p.internals.rootParentIndex!==void 0&&(o.i=p.internals.rootParentIndex);const c=i&&!gc(a)?c0:0,{x:d,y:x,z:y}=WS(e,p,s,l,c,a),{positionAbsolute:w}=e.internals,k=d!==w.x||x!==w.y;(k||y!==e.internals.z)&&t.set(e.id,{...e,internals:{...e.internals,positionAbsolute:k?{x:d,y:x}:w,z:y}})}function d0(e,t,n){const r=ct(e.zIndex)?e.zIndex:0;return gc(n)?r:r+(e.selected?t:0)}function WS(e,t,n,r,o,i){const{x:s,y:l}=t.internals.positionAbsolute,a=Ht(e),u=Uo(e,n),p=_r(e.extent)?Rn(u,e.extent,a):u;let c=Rn({x:s+p.x,y:l+p.y},r,a);e.extent==="parent"&&(c=qg(c,a,t));const d=d0(e,o,i),x=t.internals.z??0;return{x:c.x,y:c.y,z:x>=d?x+1:d}}function yc(e,t,n,r=[0,0]){var s;const o=[],i=new Map;for(const l of e){const a=t.get(l.parentId);if(!a)continue;const u=((s=i.get(l.parentId))==null?void 0:s.expandedRect)??kr(a),p=e0(u,l.rect);i.set(l.parentId,{expandedRect:p,parent:a})}return i.size>0&&i.forEach(({expandedRect:l,parent:a},u)=>{var h;const p=a.internals.positionAbsolute,c=Ht(a),d=a.origin??r,x=l.x0||y>0||m||g)&&(o.push({id:u,type:"position",position:{x:a.position.x-x+m,y:a.position.y-y+g}}),(h=n.get(u))==null||h.forEach(v=>{e.some(_=>_.id===v.id)||o.push({id:v.id,type:"position",position:{x:v.position.x+x,y:v.position.y+y}})})),(c.width0){const x=yc(d,t,n,o);u.push(...x)}return{changes:u,updatedInternals:a}}async function YS({delta:e,panZoom:t,transform:n,translateExtent:r,width:o,height:i}){if(!t||!e.x&&!e.y)return Promise.resolve(!1);const s=await t.setViewportConstrained({x:n[0]+e.x,y:n[1]+e.y,zoom:n[2]},[[0,0],[o,i]],r),l=!!s&&(s.x!==n[0]||s.y!==n[1]||s.k!==n[2]);return Promise.resolve(l)}function hf(e,t,n,r,o,i){let s=o;const l=r.get(s)||new Map;r.set(s,l.set(n,t)),s=`${o}-${e}`;const a=r.get(s)||new Map;if(r.set(s,a.set(n,t)),i){s=`${o}-${e}-${i}`;const u=r.get(s)||new Map;r.set(s,u.set(n,t))}}function f0(e,t,n){e.clear(),t.clear();for(const r of n){const{source:o,target:i,sourceHandle:s=null,targetHandle:l=null}=r,a={edgeId:r.id,source:o,target:i,sourceHandle:s,targetHandle:l},u=`${o}-${s}--${i}-${l}`,p=`${i}-${l}--${o}-${s}`;hf("source",a,p,e,o,s),hf("target",a,u,e,i,l),t.set(r.id,r)}}function p0(e,t){if(!e.parentId)return!1;const n=t.get(e.parentId);return n?n.selected?!0:p0(n,t):!1}function gf(e,t,n){var o;let r=e;do{if((o=r==null?void 0:r.matches)!=null&&o.call(r,t))return!0;if(r===n)return!1;r=r==null?void 0:r.parentElement}while(r);return!1}function XS(e,t,n,r){const o=new Map;for(const[i,s]of e)if((s.selected||s.id===r)&&(!s.parentId||!p0(s,e))&&(s.draggable||t&&typeof s.draggable>"u")){const l=e.get(i);l&&o.set(i,{id:i,position:l.position||{x:0,y:0},distance:{x:n.x-l.internals.positionAbsolute.x,y:n.y-l.internals.positionAbsolute.y},extent:l.extent,parentId:l.parentId,origin:l.origin,expandParent:l.expandParent,internals:{positionAbsolute:l.internals.positionAbsolute||{x:0,y:0}},measured:{width:l.measured.width??0,height:l.measured.height??0}})}return o}function Al({nodeId:e,dragItems:t,nodeLookup:n,dragging:r=!0}){var s,l,a;const o=[];for(const[u,p]of t){const c=(s=n.get(u))==null?void 0:s.internals.userNode;c&&o.push({...c,position:p.position,dragging:r})}if(!e)return[o[0],o];const i=(l=n.get(e))==null?void 0:l.internals.userNode;return[i?{...i,position:((a=t.get(e))==null?void 0:a.position)||i.position,dragging:r}:o[0],o]}function QS({dragItems:e,snapGrid:t,x:n,y:r}){const o=e.values().next().value;if(!o)return null;const i={x:n-o.distance.x,y:r-o.distance.y},s=Xo(i,t);return{x:s.x-i.x,y:s.y-i.y}}function GS({onNodeMouseDown:e,getStoreItems:t,onDragStart:n,onDrag:r,onDragStop:o}){let i={x:null,y:null},s=0,l=new Map,a=!1,u={x:0,y:0},p=null,c=!1,d=null,x=!1,y=!1,w=null;function k({noDragClassName:g,handleSelector:h,domNode:v,isSelectable:_,nodeId:S,nodeClickDistance:E=0}){d=We(v);function b({x:I,y:P}){const{nodeLookup:C,nodeExtent:L,snapGrid:M,snapToGrid:R,nodeOrigin:N,onNodeDrag:j,onSelectionDrag:$,onError:O,updateNodePositions:B}=t();i={x:I,y:P};let W=!1;const V=l.size>1,Y=V&&L?qa(Yo(l)):null,X=V&&R?QS({dragItems:l,snapGrid:M,x:I,y:P}):null;for(const[Q,H]of l){if(!C.has(Q))continue;let K={x:I-H.distance.x,y:P-H.distance.y};R&&(K=X?{x:Math.round(K.x+X.x),y:Math.round(K.y+X.y)}:Xo(K,M));let ee=null;if(V&&L&&!H.extent&&Y){const{positionAbsolute:Z}=H.internals,re=Z.x-Y.x+L[0][0],le=Z.x+H.measured.width-Y.x2+L[1][0],ie=Z.y-Y.y+L[0][1],je=Z.y+H.measured.height-Y.y2+L[1][1];ee=[[re,ie],[le,je]]}const{position:G,positionAbsolute:J}=Zg({nodeId:Q,nextPosition:K,nodeLookup:C,nodeExtent:ee||L,nodeOrigin:N,onError:O});W=W||H.position.x!==G.x||H.position.y!==G.y,H.position=G,H.internals.positionAbsolute=J}if(y=y||W,!!W&&(B(l,!0),w&&(r||j||!S&&$))){const[Q,H]=Al({nodeId:S,dragItems:l,nodeLookup:C});r==null||r(w,l,Q,H),j==null||j(w,Q,H),S||$==null||$(w,H)}}async function A(){if(!p)return;const{transform:I,panBy:P,autoPanSpeed:C,autoPanOnNodeDrag:L}=t();if(!L){a=!1,cancelAnimationFrame(s);return}const[M,R]=Jg(u,p,C);(M!==0||R!==0)&&(i.x=(i.x??0)-M/I[2],i.y=(i.y??0)-R/I[2],await P({x:M,y:R})&&b(i)),s=requestAnimationFrame(A)}function D(I){var V;const{nodeLookup:P,multiSelectionActive:C,nodesDraggable:L,transform:M,snapGrid:R,snapToGrid:N,selectNodesOnDrag:j,onNodeDragStart:$,onSelectionDragStart:O,unselectNodesAndEdges:B}=t();c=!0,(!j||!_)&&!C&&S&&((V=P.get(S))!=null&&V.selected||B()),_&&j&&S&&(e==null||e(S));const W=uo(I.sourceEvent,{transform:M,snapGrid:R,snapToGrid:N,containerBounds:p});if(i=W,l=XS(P,L,W,S),l.size>0&&(n||$||!S&&O)){const[Y,X]=Al({nodeId:S,dragItems:l,nodeLookup:P});n==null||n(I.sourceEvent,l,Y,X),$==null||$(I.sourceEvent,Y,X),S||O==null||O(I.sourceEvent,X)}}const T=zg().clickDistance(E).on("start",I=>{const{domNode:P,nodeDragThreshold:C,transform:L,snapGrid:M,snapToGrid:R}=t();p=(P==null?void 0:P.getBoundingClientRect())||null,x=!1,y=!1,w=I.sourceEvent,C===0&&D(I),i=uo(I.sourceEvent,{transform:L,snapGrid:M,snapToGrid:R,containerBounds:p}),u=dt(I.sourceEvent,p)}).on("drag",I=>{const{autoPanOnNodeDrag:P,transform:C,snapGrid:L,snapToGrid:M,nodeDragThreshold:R,nodeLookup:N}=t(),j=uo(I.sourceEvent,{transform:C,snapGrid:L,snapToGrid:M,containerBounds:p});if(w=I.sourceEvent,(I.sourceEvent.type==="touchmove"&&I.sourceEvent.touches.length>1||S&&!N.has(S))&&(x=!0),!x){if(!a&&P&&c&&(a=!0,A()),!c){const $=dt(I.sourceEvent,p),O=$.x-u.x,B=$.y-u.y;Math.sqrt(O*O+B*B)>R&&D(I)}(i.x!==j.xSnapped||i.y!==j.ySnapped)&&l&&c&&(u=dt(I.sourceEvent,p),b(j))}}).on("end",I=>{if(!(!c||x)&&(a=!1,c=!1,cancelAnimationFrame(s),l.size>0)){const{nodeLookup:P,updateNodePositions:C,onNodeDragStop:L,onSelectionDragStop:M}=t();if(y&&(C(l,!1),y=!1),o||L||!S&&M){const[R,N]=Al({nodeId:S,dragItems:l,nodeLookup:P,dragging:!1});o==null||o(I.sourceEvent,l,R,N),L==null||L(I.sourceEvent,R,N),S||M==null||M(I.sourceEvent,N)}}}).filter(I=>{const P=I.target;return!I.button&&(!g||!gf(P,`.${g}`,v))&&(!h||gf(P,h,v))});d.call(T)}function m(){d==null||d.on(".drag",null)}return{update:k,destroy:m}}function KS(e,t,n){const r=[],o={x:e.x-n,y:e.y-n,width:n*2,height:n*2};for(const i of t.values())Ro(o,kr(i))>0&&r.push(i);return r}const ZS=250;function qS(e,t,n,r){var l,a;let o=[],i=1/0;const s=KS(e,n,t+ZS);for(const u of s){const p=[...((l=u.internals.handleBounds)==null?void 0:l.source)??[],...((a=u.internals.handleBounds)==null?void 0:a.target)??[]];for(const c of p){if(r.nodeId===c.nodeId&&r.type===c.type&&r.id===c.id)continue;const{x:d,y:x}=Ln(u,c,c.position,!0),y=Math.sqrt(Math.pow(d-e.x,2)+Math.pow(x-e.y,2));y>t||(y1){const u=r.type==="source"?"target":"source";return o.find(p=>p.type===u)??o[0]}return o[0]}function h0(e,t,n,r,o,i=!1){var u,p,c;const s=r.get(e);if(!s)return null;const l=o==="strict"?(u=s.internals.handleBounds)==null?void 0:u[t]:[...((p=s.internals.handleBounds)==null?void 0:p.source)??[],...((c=s.internals.handleBounds)==null?void 0:c.target)??[]],a=(n?l==null?void 0:l.find(d=>d.id===n):l==null?void 0:l[0])??null;return a&&i?{...a,...Ln(s,a,a.position,!0)}:a}function g0(e,t){return e||(t!=null&&t.classList.contains("target")?"target":t!=null&&t.classList.contains("source")?"source":null)}function JS(e,t){let n=null;return t?n=!0:e&&!t&&(n=!1),n}const m0=()=>!0;function ek(e,{connectionMode:t,connectionRadius:n,handleId:r,nodeId:o,edgeUpdaterType:i,isTarget:s,domNode:l,nodeLookup:a,lib:u,autoPanOnConnect:p,flowId:c,panBy:d,cancelConnection:x,onConnectStart:y,onConnect:w,onConnectEnd:k,isValidConnection:m=m0,onReconnectEnd:g,updateConnection:h,getTransform:v,getFromHandle:_,autoPanSpeed:S,dragThreshold:E=1,handleDomNode:b}){const A=r0(e.target);let D=0,T;const{x:I,y:P}=dt(e),C=g0(i,b),L=l==null?void 0:l.getBoundingClientRect();let M=!1;if(!L||!C)return;const R=h0(o,C,r,a,t);if(!R)return;let N=dt(e,L),j=!1,$=null,O=!1,B=null;function W(){if(!p||!L)return;const[G,J]=Jg(N,L,S);d({x:G,y:J}),D=requestAnimationFrame(W)}const V={...R,nodeId:o,type:C,position:R.position},Y=a.get(o);let Q={inProgress:!0,isValid:null,from:Ln(Y,V,q.Left,!0),fromHandle:V,fromPosition:V.position,fromNode:Y,to:N,toHandle:null,toPosition:nf[V.position],toNode:null,pointer:N};function H(){M=!0,h(Q),y==null||y(e,{nodeId:o,handleId:r,handleType:C})}E===0&&H();function K(G){if(!M){const{x:je,y:Vt}=dt(G),jt=je-I,gn=Vt-P;if(!(jt*jt+gn*gn>E*E))return;H()}if(!_()||!V){ee(G);return}const J=v();N=dt(G,L),T=qS(Qo(N,J,!1,[1,1]),n,a,V),j||(W(),j=!0);const Z=y0(G,{handle:T,connectionMode:t,fromNodeId:o,fromHandleId:r,fromType:s?"target":"source",isValidConnection:m,doc:A,lib:u,flowId:c,nodeLookup:a});B=Z.handleDomNode,$=Z.connection,O=JS(!!T,Z.isValid);const re=a.get(o),le=re?Ln(re,V,q.Left,!0):Q.from,ie={...Q,from:le,isValid:O,to:Z.toHandle&&O?bs({x:Z.toHandle.x,y:Z.toHandle.y},J):N,toHandle:Z.toHandle,toPosition:O&&Z.toHandle?Z.toHandle.position:nf[V.position],toNode:Z.toHandle?a.get(Z.toHandle.nodeId):null,pointer:N};h(ie),Q=ie}function ee(G){if(!("touches"in G&&G.touches.length>0)){if(M){(T||B)&&$&&O&&(w==null||w($));const{inProgress:J,...Z}=Q,re={...Z,toPosition:Q.toHandle?Q.toPosition:null};k==null||k(G,re),i&&(g==null||g(G,re))}x(),cancelAnimationFrame(D),j=!1,O=!1,$=null,B=null,A.removeEventListener("mousemove",K),A.removeEventListener("mouseup",ee),A.removeEventListener("touchmove",K),A.removeEventListener("touchend",ee)}}A.addEventListener("mousemove",K),A.addEventListener("mouseup",ee),A.addEventListener("touchmove",K),A.addEventListener("touchend",ee)}function y0(e,{handle:t,connectionMode:n,fromNodeId:r,fromHandleId:o,fromType:i,doc:s,lib:l,flowId:a,isValidConnection:u=m0,nodeLookup:p}){const c=i==="target",d=t?s.querySelector(`.${l}-flow__handle[data-id="${a}-${t==null?void 0:t.nodeId}-${t==null?void 0:t.id}-${t==null?void 0:t.type}"]`):null,{x,y}=dt(e),w=s.elementFromPoint(x,y),k=w!=null&&w.classList.contains(`${l}-flow__handle`)?w:d,m={handleDomNode:k,isValid:!1,connection:null,toHandle:null};if(k){const g=g0(void 0,k),h=k.getAttribute("data-nodeid"),v=k.getAttribute("data-handleid"),_=k.classList.contains("connectable"),S=k.classList.contains("connectableend");if(!h||!g)return m;const E={source:c?h:r,sourceHandle:c?v:o,target:c?r:h,targetHandle:c?o:v};m.connection=E;const A=_&&S&&(n===wr.Strict?c&&g==="source"||!c&&g==="target":h!==r||v!==o);m.isValid=A&&u(E),m.toHandle=h0(h,g,v,p,n,!0)}return m}const nu={onPointerDown:ek,isValid:y0};function tk({domNode:e,panZoom:t,getTransform:n,getViewScale:r}){const o=We(e);function i({translateExtent:l,width:a,height:u,zoomStep:p=1,pannable:c=!0,zoomable:d=!0,inversePan:x=!1}){const y=h=>{if(h.sourceEvent.type!=="wheel"||!t)return;const v=n(),_=h.sourceEvent.ctrlKey&&Lo()?10:1,S=-h.sourceEvent.deltaY*(h.sourceEvent.deltaMode===1?.05:h.sourceEvent.deltaMode?1:.002)*p,E=v[2]*Math.pow(2,S*_);t.scaleTo(E)};let w=[0,0];const k=h=>{(h.sourceEvent.type==="mousedown"||h.sourceEvent.type==="touchstart")&&(w=[h.sourceEvent.clientX??h.sourceEvent.touches[0].clientX,h.sourceEvent.clientY??h.sourceEvent.touches[0].clientY])},m=h=>{const v=n();if(h.sourceEvent.type!=="mousemove"&&h.sourceEvent.type!=="touchmove"||!t)return;const _=[h.sourceEvent.clientX??h.sourceEvent.touches[0].clientX,h.sourceEvent.clientY??h.sourceEvent.touches[0].clientY],S=[_[0]-w[0],_[1]-w[1]];w=_;const E=r()*Math.max(v[2],Math.log(v[2]))*(x?-1:1),b={x:v[0]-S[0]*E,y:v[1]-S[1]*E},A=[[0,0],[a,u]];t.setViewportConstrained({x:b.x,y:b.y,zoom:v[2]},A,l)},g=Ug().on("start",k).on("zoom",c?m:null).on("zoom.wheel",d?y:null);o.call(g,{})}function s(){o.on("zoom",null)}return{update:i,destroy:s,pointer:lt}}const Zs=e=>({x:e.x,y:e.y,zoom:e.k}),$l=({x:e,y:t,zoom:n})=>Qs.translate(e,t).scale(n),tr=(e,t)=>e.target.closest(`.${t}`),x0=(e,t)=>t===2&&Array.isArray(e)&&e.includes(2),nk=e=>((e*=2)<=1?e*e*e:(e-=2)*e*e+2)/2,Dl=(e,t=0,n=nk,r=()=>{})=>{const o=typeof t=="number"&&t>0;return o||r(),o?e.transition().duration(t).ease(n).on("end",r):e},v0=e=>{const t=e.ctrlKey&&Lo()?10:1;return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*t};function rk({zoomPanValues:e,noWheelClassName:t,d3Selection:n,d3Zoom:r,panOnScrollMode:o,panOnScrollSpeed:i,zoomOnPinch:s,onPanZoomStart:l,onPanZoom:a,onPanZoomEnd:u}){return p=>{if(tr(p,t))return p.ctrlKey&&p.preventDefault(),!1;p.preventDefault(),p.stopImmediatePropagation();const c=n.property("__zoom").k||1;if(p.ctrlKey&&s){const k=lt(p),m=v0(p),g=c*Math.pow(2,m);r.scaleTo(n,g,k,p);return}const d=p.deltaMode===1?20:1;let x=o===bn.Vertical?0:p.deltaX*d,y=o===bn.Horizontal?0:p.deltaY*d;!Lo()&&p.shiftKey&&o!==bn.Vertical&&(x=p.deltaY*d,y=0),r.translateBy(n,-(x/c)*i,-(y/c)*i,{internal:!0});const w=Zs(n.property("__zoom"));clearTimeout(e.panScrollTimeout),e.isPanScrolling?(a==null||a(p,w),e.panScrollTimeout=setTimeout(()=>{u==null||u(p,w),e.isPanScrolling=!1},150)):(e.isPanScrolling=!0,l==null||l(p,w))}}function ok({noWheelClassName:e,preventScrolling:t,d3ZoomHandler:n}){return function(r,o){const i=r.type==="wheel",s=!t&&i&&!r.ctrlKey,l=tr(r,e);if(r.ctrlKey&&i&&l&&r.preventDefault(),s||l)return null;r.preventDefault(),n.call(this,r,o)}}function ik({zoomPanValues:e,onDraggingChange:t,onPanZoomStart:n}){return r=>{var i,s,l;if((i=r.sourceEvent)!=null&&i.internal)return;const o=Zs(r.transform);e.mouseButton=((s=r.sourceEvent)==null?void 0:s.button)||0,e.isZoomingOrPanning=!0,e.prevViewport=o,((l=r.sourceEvent)==null?void 0:l.type)==="mousedown"&&t(!0),n&&(n==null||n(r.sourceEvent,o))}}function sk({zoomPanValues:e,panOnDrag:t,onPaneContextMenu:n,onTransformChange:r,onPanZoom:o}){return i=>{var s,l;e.usedRightMouseButton=!!(n&&x0(t,e.mouseButton??0)),(s=i.sourceEvent)!=null&&s.sync||r([i.transform.x,i.transform.y,i.transform.k]),o&&!((l=i.sourceEvent)!=null&&l.internal)&&(o==null||o(i.sourceEvent,Zs(i.transform)))}}function lk({zoomPanValues:e,panOnDrag:t,panOnScroll:n,onDraggingChange:r,onPanZoomEnd:o,onPaneContextMenu:i}){return s=>{var l;if(!((l=s.sourceEvent)!=null&&l.internal)&&(e.isZoomingOrPanning=!1,i&&x0(t,e.mouseButton??0)&&!e.usedRightMouseButton&&s.sourceEvent&&i(s.sourceEvent),e.usedRightMouseButton=!1,r(!1),o)){const a=Zs(s.transform);e.prevViewport=a,clearTimeout(e.timerId),e.timerId=setTimeout(()=>{o==null||o(s.sourceEvent,a)},n?150:0)}}}function ak({zoomActivationKeyPressed:e,zoomOnScroll:t,zoomOnPinch:n,panOnDrag:r,panOnScroll:o,zoomOnDoubleClick:i,userSelectionActive:s,noWheelClassName:l,noPanClassName:a,lib:u,connectionInProgress:p}){return c=>{var k;const d=e||t,x=n&&c.ctrlKey,y=c.type==="wheel";if(c.button===1&&c.type==="mousedown"&&(tr(c,`${u}-flow__node`)||tr(c,`${u}-flow__edge`)))return!0;if(!r&&!d&&!o&&!i&&!n||s||p&&!y||tr(c,l)&&y||tr(c,a)&&(!y||o&&y&&!e)||!n&&c.ctrlKey&&y)return!1;if(!n&&c.type==="touchstart"&&((k=c.touches)==null?void 0:k.length)>1)return c.preventDefault(),!1;if(!d&&!o&&!x&&y||!r&&(c.type==="mousedown"||c.type==="touchstart")||Array.isArray(r)&&!r.includes(c.button)&&c.type==="mousedown")return!1;const w=Array.isArray(r)&&r.includes(c.button)||!c.button||c.button<=1;return(!c.ctrlKey||y)&&w}}function uk({domNode:e,minZoom:t,maxZoom:n,translateExtent:r,viewport:o,onPanZoom:i,onPanZoomStart:s,onPanZoomEnd:l,onDraggingChange:a}){const u={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},p=e.getBoundingClientRect(),c=Ug().scaleExtent([t,n]).translateExtent(r),d=We(e).call(c);g({x:o.x,y:o.y,zoom:Sr(o.zoom,t,n)},[[0,0],[p.width,p.height]],r);const x=d.on("wheel.zoom"),y=d.on("dblclick.zoom");c.wheelDelta(v0);function w(T,I){return d?new Promise(P=>{c==null||c.interpolate((I==null?void 0:I.interpolate)==="linear"?ao:Vi).transform(Dl(d,I==null?void 0:I.duration,I==null?void 0:I.ease,()=>P(!0)),T)}):Promise.resolve(!1)}function k({noWheelClassName:T,noPanClassName:I,onPaneContextMenu:P,userSelectionActive:C,panOnScroll:L,panOnDrag:M,panOnScrollMode:R,panOnScrollSpeed:N,preventScrolling:j,zoomOnPinch:$,zoomOnScroll:O,zoomOnDoubleClick:B,zoomActivationKeyPressed:W,lib:V,onTransformChange:Y,connectionInProgress:X,paneClickDistance:Q,selectionOnDrag:H}){C&&!u.isZoomingOrPanning&&m();const K=L&&!W&&!C;c.clickDistance(H?1/0:!ct(Q)||Q<0?0:Q);const ee=K?rk({zoomPanValues:u,noWheelClassName:T,d3Selection:d,d3Zoom:c,panOnScrollMode:R,panOnScrollSpeed:N,zoomOnPinch:$,onPanZoomStart:s,onPanZoom:i,onPanZoomEnd:l}):ok({noWheelClassName:T,preventScrolling:j,d3ZoomHandler:x});if(d.on("wheel.zoom",ee,{passive:!1}),!C){const J=ik({zoomPanValues:u,onDraggingChange:a,onPanZoomStart:s});c.on("start",J);const Z=sk({zoomPanValues:u,panOnDrag:M,onPaneContextMenu:!!P,onPanZoom:i,onTransformChange:Y});c.on("zoom",Z);const re=lk({zoomPanValues:u,panOnDrag:M,panOnScroll:L,onPaneContextMenu:P,onPanZoomEnd:l,onDraggingChange:a});c.on("end",re)}const G=ak({zoomActivationKeyPressed:W,panOnDrag:M,zoomOnScroll:O,panOnScroll:L,zoomOnDoubleClick:B,zoomOnPinch:$,userSelectionActive:C,noPanClassName:I,noWheelClassName:T,lib:V,connectionInProgress:X});c.filter(G),B?d.on("dblclick.zoom",y):d.on("dblclick.zoom",null)}function m(){c.on("zoom",null)}async function g(T,I,P){const C=$l(T),L=c==null?void 0:c.constrain()(C,I,P);return L&&await w(L),new Promise(M=>M(L))}async function h(T,I){const P=$l(T);return await w(P,I),new Promise(C=>C(P))}function v(T){if(d){const I=$l(T),P=d.property("__zoom");(P.k!==T.zoom||P.x!==T.x||P.y!==T.y)&&(c==null||c.transform(d,I,null,{sync:!0}))}}function _(){const T=d?Wg(d.node()):{x:0,y:0,k:1};return{x:T.x,y:T.y,zoom:T.k}}function S(T,I){return d?new Promise(P=>{c==null||c.interpolate((I==null?void 0:I.interpolate)==="linear"?ao:Vi).scaleTo(Dl(d,I==null?void 0:I.duration,I==null?void 0:I.ease,()=>P(!0)),T)}):Promise.resolve(!1)}function E(T,I){return d?new Promise(P=>{c==null||c.interpolate((I==null?void 0:I.interpolate)==="linear"?ao:Vi).scaleBy(Dl(d,I==null?void 0:I.duration,I==null?void 0:I.ease,()=>P(!0)),T)}):Promise.resolve(!1)}function b(T){c==null||c.scaleExtent(T)}function A(T){c==null||c.translateExtent(T)}function D(T){const I=!ct(T)||T<0?0:T;c==null||c.clickDistance(I)}return{update:k,destroy:m,setViewport:h,setViewportConstrained:g,getViewport:_,scaleTo:S,scaleBy:E,setScaleExtent:b,setTranslateExtent:A,syncViewport:v,setClickDistance:D}}var An;(function(e){e.Line="line",e.Handle="handle"})(An||(An={}));const ck=["top-left","top-right","bottom-left","bottom-right"],dk=["top","right","bottom","left"];function fk({width:e,prevWidth:t,height:n,prevHeight:r,affectsX:o,affectsY:i}){const s=e-t,l=n-r,a=[s>0?1:s<0?-1:0,l>0?1:l<0?-1:0];return s&&o&&(a[0]=a[0]*-1),l&&i&&(a[1]=a[1]*-1),a}function mf(e){const t=e.includes("right")||e.includes("left"),n=e.includes("bottom")||e.includes("top"),r=e.includes("left"),o=e.includes("top");return{isHorizontal:t,isVertical:n,affectsX:r,affectsY:o}}function Ut(e,t){return Math.max(0,t-e)}function Yt(e,t){return Math.max(0,e-t)}function Si(e,t,n){return Math.max(0,t-e,e-n)}function yf(e,t){return e?!t:t}function pk(e,t,n,r,o,i,s,l){let{affectsX:a,affectsY:u}=t;const{isHorizontal:p,isVertical:c}=t,d=p&&c,{xSnapped:x,ySnapped:y}=n,{minWidth:w,maxWidth:k,minHeight:m,maxHeight:g}=r,{x:h,y:v,width:_,height:S,aspectRatio:E}=e;let b=Math.floor(p?x-e.pointerX:0),A=Math.floor(c?y-e.pointerY:0);const D=_+(a?-b:b),T=S+(u?-A:A),I=-i[0]*_,P=-i[1]*S;let C=Si(D,w,k),L=Si(T,m,g);if(s){let N=0,j=0;a&&b<0?N=Ut(h+b+I,s[0][0]):!a&&b>0&&(N=Yt(h+D+I,s[1][0])),u&&A<0?j=Ut(v+A+P,s[0][1]):!u&&A>0&&(j=Yt(v+T+P,s[1][1])),C=Math.max(C,N),L=Math.max(L,j)}if(l){let N=0,j=0;a&&b>0?N=Yt(h+b,l[0][0]):!a&&b<0&&(N=Ut(h+D,l[1][0])),u&&A>0?j=Yt(v+A,l[0][1]):!u&&A<0&&(j=Ut(v+T,l[1][1])),C=Math.max(C,N),L=Math.max(L,j)}if(o){if(p){const N=Si(D/E,m,g)*E;if(C=Math.max(C,N),s){let j=0;!a&&!u||a&&!u&&d?j=Yt(v+P+D/E,s[1][1])*E:j=Ut(v+P+(a?b:-b)/E,s[0][1])*E,C=Math.max(C,j)}if(l){let j=0;!a&&!u||a&&!u&&d?j=Ut(v+D/E,l[1][1])*E:j=Yt(v+(a?b:-b)/E,l[0][1])*E,C=Math.max(C,j)}}if(c){const N=Si(T*E,w,k)/E;if(L=Math.max(L,N),s){let j=0;!a&&!u||u&&!a&&d?j=Yt(h+T*E+I,s[1][0])/E:j=Ut(h+(u?A:-A)*E+I,s[0][0])/E,L=Math.max(L,j)}if(l){let j=0;!a&&!u||u&&!a&&d?j=Ut(h+T*E,l[1][0])/E:j=Yt(h+(u?A:-A)*E,l[0][0])/E,L=Math.max(L,j)}}}A=A+(A<0?L:-L),b=b+(b<0?C:-C),o&&(d?D>T*E?A=(yf(a,u)?-b:b)/E:b=(yf(a,u)?-A:A)*E:p?(A=b/E,u=a):(b=A*E,a=u));const M=a?h+b:h,R=u?v+A:v;return{width:_+(a?-b:b),height:S+(u?-A:A),x:i[0]*b*(a?-1:1)+M,y:i[1]*A*(u?-1:1)+R}}const w0={width:0,height:0,x:0,y:0},hk={...w0,pointerX:0,pointerY:0,aspectRatio:1};function gk(e){return[[0,0],[e.measured.width,e.measured.height]]}function mk(e,t,n){const r=t.position.x+e.position.x,o=t.position.y+e.position.y,i=e.measured.width??0,s=e.measured.height??0,l=n[0]*i,a=n[1]*s;return[[r-l,o-a],[r+i-l,o+s-a]]}function yk({domNode:e,nodeId:t,getStoreItems:n,onChange:r,onEnd:o}){const i=We(e);let s={controlDirection:mf("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function l({controlPosition:u,boundaries:p,keepAspectRatio:c,resizeDirection:d,onResizeStart:x,onResize:y,onResizeEnd:w,shouldResize:k}){let m={...w0},g={...hk};s={boundaries:p,resizeDirection:d,keepAspectRatio:c,controlDirection:mf(u)};let h,v=null,_=[],S,E,b,A=!1;const D=zg().on("start",T=>{const{nodeLookup:I,transform:P,snapGrid:C,snapToGrid:L,nodeOrigin:M,paneDomNode:R}=n();if(h=I.get(t),!h)return;v=(R==null?void 0:R.getBoundingClientRect())??null;const{xSnapped:N,ySnapped:j}=uo(T.sourceEvent,{transform:P,snapGrid:C,snapToGrid:L,containerBounds:v});m={width:h.measured.width??0,height:h.measured.height??0,x:h.position.x??0,y:h.position.y??0},g={...m,pointerX:N,pointerY:j,aspectRatio:m.width/m.height},S=void 0,h.parentId&&(h.extent==="parent"||h.expandParent)&&(S=I.get(h.parentId),E=S&&h.extent==="parent"?gk(S):void 0),_=[],b=void 0;for(const[$,O]of I)if(O.parentId===t&&(_.push({id:$,position:{...O.position},extent:O.extent}),O.extent==="parent"||O.expandParent)){const B=mk(O,h,O.origin??M);b?b=[[Math.min(B[0][0],b[0][0]),Math.min(B[0][1],b[0][1])],[Math.max(B[1][0],b[1][0]),Math.max(B[1][1],b[1][1])]]:b=B}x==null||x(T,{...m})}).on("drag",T=>{const{transform:I,snapGrid:P,snapToGrid:C,nodeOrigin:L}=n(),M=uo(T.sourceEvent,{transform:I,snapGrid:P,snapToGrid:C,containerBounds:v}),R=[];if(!h)return;const{x:N,y:j,width:$,height:O}=m,B={},W=h.origin??L,{width:V,height:Y,x:X,y:Q}=pk(g,s.controlDirection,M,s.boundaries,s.keepAspectRatio,W,E,b),H=V!==$,K=Y!==O,ee=X!==N&&H,G=Q!==j&&K;if(!ee&&!G&&!H&&!K)return;if((ee||G||W[0]===1||W[1]===1)&&(B.x=ee?X:m.x,B.y=G?Q:m.y,m.x=B.x,m.y=B.y,_.length>0)){const le=X-N,ie=Q-j;for(const je of _)je.position={x:je.position.x-le+W[0]*(V-$),y:je.position.y-ie+W[1]*(Y-O)},R.push(je)}if((H||K)&&(B.width=H&&(!s.resizeDirection||s.resizeDirection==="horizontal")?V:m.width,B.height=K&&(!s.resizeDirection||s.resizeDirection==="vertical")?Y:m.height,m.width=B.width,m.height=B.height),S&&h.expandParent){const le=W[0]*(B.width??0);B.x&&B.x{A&&(w==null||w(T,{...m}),o==null||o({...m}),A=!1)});i.call(D)}function a(){i.on(".drag",null)}return{update:l,destroy:a}}var S0={exports:{}},k0={},_0={exports:{}},E0={};/** + * @license React + * use-sync-external-store-shim.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Er=z;function xk(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var vk=typeof Object.is=="function"?Object.is:xk,wk=Er.useState,Sk=Er.useEffect,kk=Er.useLayoutEffect,_k=Er.useDebugValue;function Ek(e,t){var n=t(),r=wk({inst:{value:n,getSnapshot:t}}),o=r[0].inst,i=r[1];return kk(function(){o.value=n,o.getSnapshot=t,Ol(o)&&i({inst:o})},[e,n,t]),Sk(function(){return Ol(o)&&i({inst:o}),e(function(){Ol(o)&&i({inst:o})})},[e]),_k(n),n}function Ol(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!vk(e,n)}catch{return!0}}function Ck(e,t){return t()}var bk=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?Ck:Ek;E0.useSyncExternalStore=Er.useSyncExternalStore!==void 0?Er.useSyncExternalStore:bk;_0.exports=E0;var Nk=_0.exports;/** + * @license React + * use-sync-external-store-shim/with-selector.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var qs=z,jk=Nk;function Mk(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var zk=typeof Object.is=="function"?Object.is:Mk,Pk=jk.useSyncExternalStore,Tk=qs.useRef,Ik=qs.useEffect,Rk=qs.useMemo,Lk=qs.useDebugValue;k0.useSyncExternalStoreWithSelector=function(e,t,n,r,o){var i=Tk(null);if(i.current===null){var s={hasValue:!1,value:null};i.current=s}else s=i.current;i=Rk(function(){function a(x){if(!u){if(u=!0,p=x,x=r(x),o!==void 0&&s.hasValue){var y=s.value;if(o(y,x))return c=y}return c=x}if(y=c,zk(p,x))return y;var w=r(x);return o!==void 0&&o(y,w)?(p=x,y):(p=x,c=w)}var u=!1,p,c,d=n===void 0?null:n;return[function(){return a(t())},d===null?void 0:function(){return a(d())}]},[t,n,r,o]);var l=Pk(e,i[0],i[1]);return Ik(function(){s.hasValue=!0,s.value=l},[l]),Lk(l),l};S0.exports=k0;var Ak=S0.exports;const $k=np(Ak),Dk={},xf=e=>{let t;const n=new Set,r=(p,c)=>{const d=typeof p=="function"?p(t):p;if(!Object.is(d,t)){const x=t;t=c??(typeof d!="object"||d===null)?d:Object.assign({},t,d),n.forEach(y=>y(t,x))}},o=()=>t,a={setState:r,getState:o,getInitialState:()=>u,subscribe:p=>(n.add(p),()=>n.delete(p)),destroy:()=>{(Dk?"production":void 0)!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),n.clear()}},u=t=e(r,o,a);return a},Ok=e=>e?xf(e):xf,{useDebugValue:Bk}=pp,{useSyncExternalStoreWithSelector:Fk}=$k,Hk=e=>e;function C0(e,t=Hk,n){const r=Fk(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,n);return Bk(r),r}const vf=(e,t)=>{const n=Ok(e),r=(o,i=t)=>C0(n,o,i);return Object.assign(r,n),r},Vk=(e,t)=>e?vf(e,t):vf;function fe(e,t){if(Object.is(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(const[r,o]of e)if(!Object.is(o,t.get(r)))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(const r of e)if(!t.has(r))return!1;return!0}const n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;for(const r of n)if(!Object.prototype.hasOwnProperty.call(t,r)||!Object.is(e[r],t[r]))return!1;return!0}const Js=z.createContext(null),Wk=Js.Provider,b0=bt.error001();function ne(e,t){const n=z.useContext(Js);if(n===null)throw new Error(b0);return C0(n,e,t)}function pe(){const e=z.useContext(Js);if(e===null)throw new Error(b0);return z.useMemo(()=>({getState:e.getState,setState:e.setState,subscribe:e.subscribe}),[e])}const wf={display:"none"},Uk={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},N0="react-flow__node-desc",j0="react-flow__edge-desc",Yk="react-flow__aria-live",Xk=e=>e.ariaLiveMessage,Qk=e=>e.ariaLabelConfig;function Gk({rfId:e}){const t=ne(Xk);return f.jsx("div",{id:`${Yk}-${e}`,"aria-live":"assertive","aria-atomic":"true",style:Uk,children:t})}function Kk({rfId:e,disableKeyboardA11y:t}){const n=ne(Qk);return f.jsxs(f.Fragment,{children:[f.jsx("div",{id:`${N0}-${e}`,style:wf,children:t?n["node.a11yDescription.default"]:n["node.a11yDescription.keyboardDisabled"]}),f.jsx("div",{id:`${j0}-${e}`,style:wf,children:n["edge.a11yDescription.default"]}),!t&&f.jsx(Gk,{rfId:e})]})}const el=z.forwardRef(({position:e="top-left",children:t,className:n,style:r,...o},i)=>{const s=`${e}`.split("-");return f.jsx("div",{className:we(["react-flow__panel",n,...s]),style:r,ref:i,...o,children:t})});el.displayName="Panel";function Zk({proOptions:e,position:t="bottom-right"}){return e!=null&&e.hideAttribution?null:f.jsx(el,{position:t,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:f.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}const qk=e=>{const t=[],n=[];for(const[,r]of e.nodeLookup)r.selected&&t.push(r.internals.userNode);for(const[,r]of e.edgeLookup)r.selected&&n.push(r);return{selectedNodes:t,selectedEdges:n}},ki=e=>e.id;function Jk(e,t){return fe(e.selectedNodes.map(ki),t.selectedNodes.map(ki))&&fe(e.selectedEdges.map(ki),t.selectedEdges.map(ki))}function e_({onSelectionChange:e}){const t=pe(),{selectedNodes:n,selectedEdges:r}=ne(qk,Jk);return z.useEffect(()=>{const o={nodes:n,edges:r};e==null||e(o),t.getState().onSelectionChangeHandlers.forEach(i=>i(o))},[n,r,e]),null}const t_=e=>!!e.onSelectionChangeHandlers;function n_({onSelectionChange:e}){const t=ne(t_);return e||t?f.jsx(e_,{onSelectionChange:e}):null}const M0=[0,0],r_={x:0,y:0,zoom:1},o_=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","nodesFocusable","edgesFocusable","edgesReconnectable","elevateNodesOnSelect","elevateEdgesOnSelect","minZoom","maxZoom","nodeExtent","onNodesChange","onEdgesChange","elementsSelectable","connectionMode","snapGrid","snapToGrid","translateExtent","connectOnClick","defaultEdgeOptions","fitView","fitViewOptions","onNodesDelete","onEdgesDelete","onDelete","onNodeDrag","onNodeDragStart","onNodeDragStop","onSelectionDrag","onSelectionDragStart","onSelectionDragStop","onMoveStart","onMove","onMoveEnd","noPanClassName","nodeOrigin","autoPanOnConnect","autoPanOnNodeDrag","onError","connectionRadius","isValidConnection","selectNodesOnDrag","nodeDragThreshold","connectionDragThreshold","onBeforeDelete","debug","autoPanSpeed","ariaLabelConfig","zIndexMode"],Sf=[...o_,"rfId"],i_=e=>({setNodes:e.setNodes,setEdges:e.setEdges,setMinZoom:e.setMinZoom,setMaxZoom:e.setMaxZoom,setTranslateExtent:e.setTranslateExtent,setNodeExtent:e.setNodeExtent,reset:e.reset,setDefaultNodesAndEdges:e.setDefaultNodesAndEdges}),kf={translateExtent:To,nodeOrigin:M0,minZoom:.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function s_(e){const{setNodes:t,setEdges:n,setMinZoom:r,setMaxZoom:o,setTranslateExtent:i,setNodeExtent:s,reset:l,setDefaultNodesAndEdges:a}=ne(i_,fe),u=pe();z.useEffect(()=>(a(e.defaultNodes,e.defaultEdges),()=>{p.current=kf,l()}),[]);const p=z.useRef(kf);return z.useEffect(()=>{for(const c of Sf){const d=e[c],x=p.current[c];d!==x&&(typeof e[c]>"u"||(c==="nodes"?t(d):c==="edges"?n(d):c==="minZoom"?r(d):c==="maxZoom"?o(d):c==="translateExtent"?i(d):c==="nodeExtent"?s(d):c==="ariaLabelConfig"?u.setState({ariaLabelConfig:NS(d)}):c==="fitView"?u.setState({fitViewQueued:d}):c==="fitViewOptions"?u.setState({fitViewOptions:d}):u.setState({[c]:d})))}p.current=e},Sf.map(c=>e[c])),null}function _f(){return typeof window>"u"||!window.matchMedia?null:window.matchMedia("(prefers-color-scheme: dark)")}function l_(e){var r;const[t,n]=z.useState(e==="system"?null:e);return z.useEffect(()=>{if(e!=="system"){n(e);return}const o=_f(),i=()=>n(o!=null&&o.matches?"dark":"light");return i(),o==null||o.addEventListener("change",i),()=>{o==null||o.removeEventListener("change",i)}},[e]),t!==null?t:(r=_f())!=null&&r.matches?"dark":"light"}const Ef=typeof document<"u"?document:null;function Ao(e=null,t={target:Ef,actInsideInputWithModifier:!0}){const[n,r]=z.useState(!1),o=z.useRef(!1),i=z.useRef(new Set([])),[s,l]=z.useMemo(()=>{if(e!==null){const u=(Array.isArray(e)?e:[e]).filter(c=>typeof c=="string").map(c=>c.replace("+",` +`).replace(` + +`,` ++`).split(` +`)),p=u.reduce((c,d)=>c.concat(...d),[]);return[u,p]}return[[],[]]},[e]);return z.useEffect(()=>{const a=(t==null?void 0:t.target)??Ef,u=(t==null?void 0:t.actInsideInputWithModifier)??!0;if(e!==null){const p=x=>{var k,m;if(o.current=x.ctrlKey||x.metaKey||x.shiftKey||x.altKey,(!o.current||o.current&&!u)&&o0(x))return!1;const w=bf(x.code,l);if(i.current.add(x[w]),Cf(s,i.current,!1)){const g=((m=(k=x.composedPath)==null?void 0:k.call(x))==null?void 0:m[0])||x.target,h=(g==null?void 0:g.nodeName)==="BUTTON"||(g==null?void 0:g.nodeName)==="A";t.preventDefault!==!1&&(o.current||!h)&&x.preventDefault(),r(!0)}},c=x=>{const y=bf(x.code,l);Cf(s,i.current,!0)?(r(!1),i.current.clear()):i.current.delete(x[y]),x.key==="Meta"&&i.current.clear(),o.current=!1},d=()=>{i.current.clear(),r(!1)};return a==null||a.addEventListener("keydown",p),a==null||a.addEventListener("keyup",c),window.addEventListener("blur",d),window.addEventListener("contextmenu",d),()=>{a==null||a.removeEventListener("keydown",p),a==null||a.removeEventListener("keyup",c),window.removeEventListener("blur",d),window.removeEventListener("contextmenu",d)}}},[e,r]),n}function Cf(e,t,n){return e.filter(r=>n||r.length===t.size).some(r=>r.every(o=>t.has(o)))}function bf(e,t){return t.includes(e)?"code":"key"}const a_=()=>{const e=pe();return z.useMemo(()=>({zoomIn:t=>{const{panZoom:n}=e.getState();return n?n.scaleBy(1.2,{duration:t==null?void 0:t.duration}):Promise.resolve(!1)},zoomOut:t=>{const{panZoom:n}=e.getState();return n?n.scaleBy(1/1.2,{duration:t==null?void 0:t.duration}):Promise.resolve(!1)},zoomTo:(t,n)=>{const{panZoom:r}=e.getState();return r?r.scaleTo(t,{duration:n==null?void 0:n.duration}):Promise.resolve(!1)},getZoom:()=>e.getState().transform[2],setViewport:async(t,n)=>{const{transform:[r,o,i],panZoom:s}=e.getState();return s?(await s.setViewport({x:t.x??r,y:t.y??o,zoom:t.zoom??i},n),Promise.resolve(!0)):Promise.resolve(!1)},getViewport:()=>{const[t,n,r]=e.getState().transform;return{x:t,y:n,zoom:r}},setCenter:async(t,n,r)=>e.getState().setCenter(t,n,r),fitBounds:async(t,n)=>{const{width:r,height:o,minZoom:i,maxZoom:s,panZoom:l}=e.getState(),a=dc(t,r,o,i,s,(n==null?void 0:n.padding)??.1);return l?(await l.setViewport(a,{duration:n==null?void 0:n.duration,ease:n==null?void 0:n.ease,interpolate:n==null?void 0:n.interpolate}),Promise.resolve(!0)):Promise.resolve(!1)},screenToFlowPosition:(t,n={})=>{const{transform:r,snapGrid:o,snapToGrid:i,domNode:s}=e.getState();if(!s)return t;const{x:l,y:a}=s.getBoundingClientRect(),u={x:t.x-l,y:t.y-a},p=n.snapGrid??o,c=n.snapToGrid??i;return Qo(u,r,c,p)},flowToScreenPosition:t=>{const{transform:n,domNode:r}=e.getState();if(!r)return t;const{x:o,y:i}=r.getBoundingClientRect(),s=bs(t,n);return{x:s.x+o,y:s.y+i}}}),[])};function z0(e,t){const n=[],r=new Map,o=[];for(const i of e)if(i.type==="add"){o.push(i);continue}else if(i.type==="remove"||i.type==="replace")r.set(i.id,[i]);else{const s=r.get(i.id);s?s.push(i):r.set(i.id,[i])}for(const i of t){const s=r.get(i.id);if(!s){n.push(i);continue}if(s[0].type==="remove")continue;if(s[0].type==="replace"){n.push({...s[0].item});continue}const l={...i};for(const a of s)u_(a,l);n.push(l)}return o.length&&o.forEach(i=>{i.index!==void 0?n.splice(i.index,0,{...i.item}):n.push({...i.item})}),n}function u_(e,t){switch(e.type){case"select":{t.selected=e.selected;break}case"position":{typeof e.position<"u"&&(t.position=e.position),typeof e.dragging<"u"&&(t.dragging=e.dragging);break}case"dimensions":{typeof e.dimensions<"u"&&(t.measured={...e.dimensions},e.setAttributes&&((e.setAttributes===!0||e.setAttributes==="width")&&(t.width=e.dimensions.width),(e.setAttributes===!0||e.setAttributes==="height")&&(t.height=e.dimensions.height))),typeof e.resizing=="boolean"&&(t.resizing=e.resizing);break}}}function P0(e,t){return z0(e,t)}function T0(e,t){return z0(e,t)}function xn(e,t){return{id:e,type:"select",selected:t}}function nr(e,t=new Set,n=!1){const r=[];for(const[o,i]of e){const s=t.has(o);!(i.selected===void 0&&!s)&&i.selected!==s&&(n&&(i.selected=s),r.push(xn(i.id,s)))}return r}function Nf({items:e=[],lookup:t}){var o;const n=[],r=new Map(e.map(i=>[i.id,i]));for(const[i,s]of e.entries()){const l=t.get(s.id),a=((o=l==null?void 0:l.internals)==null?void 0:o.userNode)??l;a!==void 0&&a!==s&&n.push({id:s.id,item:s,type:"replace"}),a===void 0&&n.push({item:s,type:"add",index:i})}for(const[i]of t)r.get(i)===void 0&&n.push({id:i,type:"remove"});return n}function jf(e){return{id:e.id,type:"remove"}}const Mf=e=>yS(e),c_=e=>Kg(e);function I0(e){return z.forwardRef(e)}const d_=typeof window<"u"?z.useLayoutEffect:z.useEffect;function zf(e){const[t,n]=z.useState(BigInt(0)),[r]=z.useState(()=>f_(()=>n(o=>o+BigInt(1))));return d_(()=>{const o=r.get();o.length&&(e(o),r.reset())},[t]),r}function f_(e){let t=[];return{get:()=>t,reset:()=>{t=[]},push:n=>{t.push(n),e()}}}const R0=z.createContext(null);function p_({children:e}){const t=pe(),n=z.useCallback(l=>{const{nodes:a=[],setNodes:u,hasDefaultNodes:p,onNodesChange:c,nodeLookup:d,fitViewQueued:x,onNodesChangeMiddlewareMap:y}=t.getState();let w=a;for(const m of l)w=typeof m=="function"?m(w):m;let k=Nf({items:w,lookup:d});for(const m of y.values())k=m(k);p&&u(w),k.length>0?c==null||c(k):x&&window.requestAnimationFrame(()=>{const{fitViewQueued:m,nodes:g,setNodes:h}=t.getState();m&&h(g)})},[]),r=zf(n),o=z.useCallback(l=>{const{edges:a=[],setEdges:u,hasDefaultEdges:p,onEdgesChange:c,edgeLookup:d}=t.getState();let x=a;for(const y of l)x=typeof y=="function"?y(x):y;p?u(x):c&&c(Nf({items:x,lookup:d}))},[]),i=zf(o),s=z.useMemo(()=>({nodeQueue:r,edgeQueue:i}),[]);return f.jsx(R0.Provider,{value:s,children:e})}function h_(){const e=z.useContext(R0);if(!e)throw new Error("useBatchContext must be used within a BatchProvider");return e}const g_=e=>!!e.panZoom;function xc(){const e=a_(),t=pe(),n=h_(),r=ne(g_),o=z.useMemo(()=>{const i=c=>t.getState().nodeLookup.get(c),s=c=>{n.nodeQueue.push(c)},l=c=>{n.edgeQueue.push(c)},a=c=>{var m,g;const{nodeLookup:d,nodeOrigin:x}=t.getState(),y=Mf(c)?c:d.get(c.id),w=y.parentId?n0(y.position,y.measured,y.parentId,d,x):y.position,k={...y,position:w,width:((m=y.measured)==null?void 0:m.width)??y.width,height:((g=y.measured)==null?void 0:g.height)??y.height};return kr(k)},u=(c,d,x={replace:!1})=>{s(y=>y.map(w=>{if(w.id===c){const k=typeof d=="function"?d(w):d;return x.replace&&Mf(k)?k:{...w,...k}}return w}))},p=(c,d,x={replace:!1})=>{l(y=>y.map(w=>{if(w.id===c){const k=typeof d=="function"?d(w):d;return x.replace&&c_(k)?k:{...w,...k}}return w}))};return{getNodes:()=>t.getState().nodes.map(c=>({...c})),getNode:c=>{var d;return(d=i(c))==null?void 0:d.internals.userNode},getInternalNode:i,getEdges:()=>{const{edges:c=[]}=t.getState();return c.map(d=>({...d}))},getEdge:c=>t.getState().edgeLookup.get(c),setNodes:s,setEdges:l,addNodes:c=>{const d=Array.isArray(c)?c:[c];n.nodeQueue.push(x=>[...x,...d])},addEdges:c=>{const d=Array.isArray(c)?c:[c];n.edgeQueue.push(x=>[...x,...d])},toObject:()=>{const{nodes:c=[],edges:d=[],transform:x}=t.getState(),[y,w,k]=x;return{nodes:c.map(m=>({...m})),edges:d.map(m=>({...m})),viewport:{x:y,y:w,zoom:k}}},deleteElements:async({nodes:c=[],edges:d=[]})=>{const{nodes:x,edges:y,onNodesDelete:w,onEdgesDelete:k,triggerNodeChanges:m,triggerEdgeChanges:g,onDelete:h,onBeforeDelete:v}=t.getState(),{nodes:_,edges:S}=await kS({nodesToRemove:c,edgesToRemove:d,nodes:x,edges:y,onBeforeDelete:v}),E=S.length>0,b=_.length>0;if(E){const A=S.map(jf);k==null||k(S),g(A)}if(b){const A=_.map(jf);w==null||w(_),m(A)}return(b||E)&&(h==null||h({nodes:_,edges:S})),{deletedNodes:_,deletedEdges:S}},getIntersectingNodes:(c,d=!0,x)=>{const y=of(c),w=y?c:a(c),k=x!==void 0;return w?(x||t.getState().nodes).filter(m=>{const g=t.getState().nodeLookup.get(m.id);if(g&&!y&&(m.id===c.id||!g.internals.positionAbsolute))return!1;const h=kr(k?m:g),v=Ro(h,w);return d&&v>0||v>=h.width*h.height||v>=w.width*w.height}):[]},isNodeIntersecting:(c,d,x=!0)=>{const w=of(c)?c:a(c);if(!w)return!1;const k=Ro(w,d);return x&&k>0||k>=d.width*d.height||k>=w.width*w.height},updateNode:u,updateNodeData:(c,d,x={replace:!1})=>{u(c,y=>{const w=typeof d=="function"?d(y):d;return x.replace?{...y,data:w}:{...y,data:{...y.data,...w}}},x)},updateEdge:p,updateEdgeData:(c,d,x={replace:!1})=>{p(c,y=>{const w=typeof d=="function"?d(y):d;return x.replace?{...y,data:w}:{...y,data:{...y.data,...w}}},x)},getNodesBounds:c=>{const{nodeLookup:d,nodeOrigin:x}=t.getState();return xS(c,{nodeLookup:d,nodeOrigin:x})},getHandleConnections:({type:c,id:d,nodeId:x})=>{var y;return Array.from(((y=t.getState().connectionLookup.get(`${x}-${c}${d?`-${d}`:""}`))==null?void 0:y.values())??[])},getNodeConnections:({type:c,handleId:d,nodeId:x})=>{var y;return Array.from(((y=t.getState().connectionLookup.get(`${x}${c?d?`-${c}-${d}`:`-${c}`:""}`))==null?void 0:y.values())??[])},fitView:async c=>{const d=t.getState().fitViewResolver??bS();return t.setState({fitViewQueued:!0,fitViewOptions:c,fitViewResolver:d}),n.nodeQueue.push(x=>[...x]),d.promise}}},[]);return z.useMemo(()=>({...o,...e,viewportInitialized:r}),[r])}const Pf=e=>e.selected,m_=typeof window<"u"?window:void 0;function y_({deleteKeyCode:e,multiSelectionKeyCode:t}){const n=pe(),{deleteElements:r}=xc(),o=Ao(e,{actInsideInputWithModifier:!1}),i=Ao(t,{target:m_});z.useEffect(()=>{if(o){const{edges:s,nodes:l}=n.getState();r({nodes:l.filter(Pf),edges:s.filter(Pf)}),n.setState({nodesSelectionActive:!1})}},[o]),z.useEffect(()=>{n.setState({multiSelectionActive:i})},[i])}function x_(e){const t=pe();z.useEffect(()=>{const n=()=>{var o,i,s,l;if(!e.current||!(((i=(o=e.current).checkVisibility)==null?void 0:i.call(o))??!0))return!1;const r=fc(e.current);(r.height===0||r.width===0)&&((l=(s=t.getState()).onError)==null||l.call(s,"004",bt.error004())),t.setState({width:r.width||500,height:r.height||500})};if(e.current){n(),window.addEventListener("resize",n);const r=new ResizeObserver(()=>n());return r.observe(e.current),()=>{window.removeEventListener("resize",n),r&&e.current&&r.unobserve(e.current)}}},[])}const tl={position:"absolute",width:"100%",height:"100%",top:0,left:0},v_=e=>({userSelectionActive:e.userSelectionActive,lib:e.lib,connectionInProgress:e.connection.inProgress});function w_({onPaneContextMenu:e,zoomOnScroll:t=!0,zoomOnPinch:n=!0,panOnScroll:r=!1,panOnScrollSpeed:o=.5,panOnScrollMode:i=bn.Free,zoomOnDoubleClick:s=!0,panOnDrag:l=!0,defaultViewport:a,translateExtent:u,minZoom:p,maxZoom:c,zoomActivationKeyCode:d,preventScrolling:x=!0,children:y,noWheelClassName:w,noPanClassName:k,onViewportChange:m,isControlledViewport:g,paneClickDistance:h,selectionOnDrag:v}){const _=pe(),S=z.useRef(null),{userSelectionActive:E,lib:b,connectionInProgress:A}=ne(v_,fe),D=Ao(d),T=z.useRef();x_(S);const I=z.useCallback(P=>{m==null||m({x:P[0],y:P[1],zoom:P[2]}),g||_.setState({transform:P})},[m,g]);return z.useEffect(()=>{if(S.current){T.current=uk({domNode:S.current,minZoom:p,maxZoom:c,translateExtent:u,viewport:a,onDraggingChange:M=>_.setState(R=>R.paneDragging===M?R:{paneDragging:M}),onPanZoomStart:(M,R)=>{const{onViewportChangeStart:N,onMoveStart:j}=_.getState();j==null||j(M,R),N==null||N(R)},onPanZoom:(M,R)=>{const{onViewportChange:N,onMove:j}=_.getState();j==null||j(M,R),N==null||N(R)},onPanZoomEnd:(M,R)=>{const{onViewportChangeEnd:N,onMoveEnd:j}=_.getState();j==null||j(M,R),N==null||N(R)}});const{x:P,y:C,zoom:L}=T.current.getViewport();return _.setState({panZoom:T.current,transform:[P,C,L],domNode:S.current.closest(".react-flow")}),()=>{var M;(M=T.current)==null||M.destroy()}}},[]),z.useEffect(()=>{var P;(P=T.current)==null||P.update({onPaneContextMenu:e,zoomOnScroll:t,zoomOnPinch:n,panOnScroll:r,panOnScrollSpeed:o,panOnScrollMode:i,zoomOnDoubleClick:s,panOnDrag:l,zoomActivationKeyPressed:D,preventScrolling:x,noPanClassName:k,userSelectionActive:E,noWheelClassName:w,lib:b,onTransformChange:I,connectionInProgress:A,selectionOnDrag:v,paneClickDistance:h})},[e,t,n,r,o,i,s,l,D,x,k,E,w,b,I,A,v,h]),f.jsx("div",{className:"react-flow__renderer",ref:S,style:tl,children:y})}const S_=e=>({userSelectionActive:e.userSelectionActive,userSelectionRect:e.userSelectionRect});function k_(){const{userSelectionActive:e,userSelectionRect:t}=ne(S_,fe);return e&&t?f.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:t.width,height:t.height,transform:`translate(${t.x}px, ${t.y}px)`}}):null}const Bl=(e,t)=>n=>{n.target===t.current&&(e==null||e(n))},__=e=>({userSelectionActive:e.userSelectionActive,elementsSelectable:e.elementsSelectable,connectionInProgress:e.connection.inProgress,dragging:e.paneDragging});function E_({isSelecting:e,selectionKeyPressed:t,selectionMode:n=Io.Full,panOnDrag:r,paneClickDistance:o,selectionOnDrag:i,onSelectionStart:s,onSelectionEnd:l,onPaneClick:a,onPaneContextMenu:u,onPaneScroll:p,onPaneMouseEnter:c,onPaneMouseMove:d,onPaneMouseLeave:x,children:y}){const w=pe(),{userSelectionActive:k,elementsSelectable:m,dragging:g,connectionInProgress:h}=ne(__,fe),v=m&&(e||k),_=z.useRef(null),S=z.useRef(),E=z.useRef(new Set),b=z.useRef(new Set),A=z.useRef(!1),D=N=>{if(A.current||h){A.current=!1;return}a==null||a(N),w.getState().resetSelectedElements(),w.setState({nodesSelectionActive:!1})},T=N=>{if(Array.isArray(r)&&(r!=null&&r.includes(2))){N.preventDefault();return}u==null||u(N)},I=p?N=>p(N):void 0,P=N=>{A.current&&(N.stopPropagation(),A.current=!1)},C=N=>{var Y,X;const{domNode:j}=w.getState();if(S.current=j==null?void 0:j.getBoundingClientRect(),!S.current)return;const $=N.target===_.current;if(!$&&!!N.target.closest(".nokey")||!e||!(i&&$||t)||N.button!==0||!N.isPrimary)return;(X=(Y=N.target)==null?void 0:Y.setPointerCapture)==null||X.call(Y,N.pointerId),A.current=!1;const{x:W,y:V}=dt(N.nativeEvent,S.current);w.setState({userSelectionRect:{width:0,height:0,startX:W,startY:V,x:W,y:V}}),$||(N.stopPropagation(),N.preventDefault())},L=N=>{const{userSelectionRect:j,transform:$,nodeLookup:O,edgeLookup:B,connectionLookup:W,triggerNodeChanges:V,triggerEdgeChanges:Y,defaultEdgeOptions:X,resetSelectedElements:Q}=w.getState();if(!S.current||!j)return;const{x:H,y:K}=dt(N.nativeEvent,S.current),{startX:ee,startY:G}=j;if(!A.current){const ie=t?0:o;if(Math.hypot(H-ee,K-G)<=ie)return;Q(),s==null||s(N)}A.current=!0;const J={startX:ee,startY:G,x:Hie.id)),b.current=new Set;const le=(X==null?void 0:X.selectable)??!0;for(const ie of E.current){const je=W.get(ie);if(je)for(const{edgeId:Vt}of je.values()){const jt=B.get(Vt);jt&&(jt.selectable??le)&&b.current.add(Vt)}}if(!sf(Z,E.current)){const ie=nr(O,E.current,!0);V(ie)}if(!sf(re,b.current)){const ie=nr(B,b.current);Y(ie)}w.setState({userSelectionRect:J,userSelectionActive:!0,nodesSelectionActive:!1})},M=N=>{var j,$;N.button===0&&(($=(j=N.target)==null?void 0:j.releasePointerCapture)==null||$.call(j,N.pointerId),!k&&N.target===_.current&&w.getState().userSelectionRect&&(D==null||D(N)),w.setState({userSelectionActive:!1,userSelectionRect:null}),A.current&&(l==null||l(N),w.setState({nodesSelectionActive:E.current.size>0})))},R=r===!0||Array.isArray(r)&&r.includes(0);return f.jsxs("div",{className:we(["react-flow__pane",{draggable:R,dragging:g,selection:e}]),onClick:v?void 0:Bl(D,_),onContextMenu:Bl(T,_),onWheel:Bl(I,_),onPointerEnter:v?void 0:c,onPointerMove:v?L:d,onPointerUp:v?M:void 0,onPointerDownCapture:v?C:void 0,onClickCapture:v?P:void 0,onPointerLeave:x,ref:_,style:tl,children:[y,f.jsx(k_,{})]})}function ru({id:e,store:t,unselect:n=!1,nodeRef:r}){const{addSelectedNodes:o,unselectNodesAndEdges:i,multiSelectionActive:s,nodeLookup:l,onError:a}=t.getState(),u=l.get(e);if(!u){a==null||a("012",bt.error012(e));return}t.setState({nodesSelectionActive:!1}),u.selected?(n||u.selected&&s)&&(i({nodes:[u],edges:[]}),requestAnimationFrame(()=>{var p;return(p=r==null?void 0:r.current)==null?void 0:p.blur()})):o([e])}function L0({nodeRef:e,disabled:t=!1,noDragClassName:n,handleSelector:r,nodeId:o,isSelectable:i,nodeClickDistance:s}){const l=pe(),[a,u]=z.useState(!1),p=z.useRef();return z.useEffect(()=>{p.current=GS({getStoreItems:()=>l.getState(),onNodeMouseDown:c=>{ru({id:c,store:l,nodeRef:e})},onDragStart:()=>{u(!0)},onDragStop:()=>{u(!1)}})},[]),z.useEffect(()=>{if(!(t||!e.current||!p.current))return p.current.update({noDragClassName:n,handleSelector:r,domNode:e.current,isSelectable:i,nodeId:o,nodeClickDistance:s}),()=>{var c;(c=p.current)==null||c.destroy()}},[n,r,t,i,e,o,s]),a}const C_=e=>t=>t.selected&&(t.draggable||e&&typeof t.draggable>"u");function A0(){const e=pe();return z.useCallback(n=>{const{nodeExtent:r,snapToGrid:o,snapGrid:i,nodesDraggable:s,onError:l,updateNodePositions:a,nodeLookup:u,nodeOrigin:p}=e.getState(),c=new Map,d=C_(s),x=o?i[0]:5,y=o?i[1]:5,w=n.direction.x*x*n.factor,k=n.direction.y*y*n.factor;for(const[,m]of u){if(!d(m))continue;let g={x:m.internals.positionAbsolute.x+w,y:m.internals.positionAbsolute.y+k};o&&(g=Xo(g,i));const{position:h,positionAbsolute:v}=Zg({nodeId:m.id,nextPosition:g,nodeLookup:u,nodeExtent:r,nodeOrigin:p,onError:l});m.position=h,m.internals.positionAbsolute=v,c.set(m.id,m)}a(c)},[])}const vc=z.createContext(null),b_=vc.Provider;vc.Consumer;const $0=()=>z.useContext(vc),N_=e=>({connectOnClick:e.connectOnClick,noPanClassName:e.noPanClassName,rfId:e.rfId}),j_=(e,t,n)=>r=>{const{connectionClickStartHandle:o,connectionMode:i,connection:s}=r,{fromHandle:l,toHandle:a,isValid:u}=s,p=(a==null?void 0:a.nodeId)===e&&(a==null?void 0:a.id)===t&&(a==null?void 0:a.type)===n;return{connectingFrom:(l==null?void 0:l.nodeId)===e&&(l==null?void 0:l.id)===t&&(l==null?void 0:l.type)===n,connectingTo:p,clickConnecting:(o==null?void 0:o.nodeId)===e&&(o==null?void 0:o.id)===t&&(o==null?void 0:o.type)===n,isPossibleEndHandle:i===wr.Strict?(l==null?void 0:l.type)!==n:e!==(l==null?void 0:l.nodeId)||t!==(l==null?void 0:l.id),connectionInProcess:!!l,clickConnectionInProcess:!!o,valid:p&&u}};function M_({type:e="source",position:t=q.Top,isValidConnection:n,isConnectable:r=!0,isConnectableStart:o=!0,isConnectableEnd:i=!0,id:s,onConnect:l,children:a,className:u,onMouseDown:p,onTouchStart:c,...d},x){var L,M;const y=s||null,w=e==="target",k=pe(),m=$0(),{connectOnClick:g,noPanClassName:h,rfId:v}=ne(N_,fe),{connectingFrom:_,connectingTo:S,clickConnecting:E,isPossibleEndHandle:b,connectionInProcess:A,clickConnectionInProcess:D,valid:T}=ne(j_(m,y,e),fe);m||(M=(L=k.getState()).onError)==null||M.call(L,"010",bt.error010());const I=R=>{const{defaultEdgeOptions:N,onConnect:j,hasDefaultEdges:$}=k.getState(),O={...N,...R};if($){const{edges:B,setEdges:W}=k.getState();W(IS(O,B))}j==null||j(O),l==null||l(O)},P=R=>{if(!m)return;const N=i0(R.nativeEvent);if(o&&(N&&R.button===0||!N)){const j=k.getState();nu.onPointerDown(R.nativeEvent,{handleDomNode:R.currentTarget,autoPanOnConnect:j.autoPanOnConnect,connectionMode:j.connectionMode,connectionRadius:j.connectionRadius,domNode:j.domNode,nodeLookup:j.nodeLookup,lib:j.lib,isTarget:w,handleId:y,nodeId:m,flowId:j.rfId,panBy:j.panBy,cancelConnection:j.cancelConnection,onConnectStart:j.onConnectStart,onConnectEnd:(...$)=>{var O,B;return(B=(O=k.getState()).onConnectEnd)==null?void 0:B.call(O,...$)},updateConnection:j.updateConnection,onConnect:I,isValidConnection:n||((...$)=>{var O,B;return((B=(O=k.getState()).isValidConnection)==null?void 0:B.call(O,...$))??!0}),getTransform:()=>k.getState().transform,getFromHandle:()=>k.getState().connection.fromHandle,autoPanSpeed:j.autoPanSpeed,dragThreshold:j.connectionDragThreshold})}N?p==null||p(R):c==null||c(R)},C=R=>{const{onClickConnectStart:N,onClickConnectEnd:j,connectionClickStartHandle:$,connectionMode:O,isValidConnection:B,lib:W,rfId:V,nodeLookup:Y,connection:X}=k.getState();if(!m||!$&&!o)return;if(!$){N==null||N(R.nativeEvent,{nodeId:m,handleId:y,handleType:e}),k.setState({connectionClickStartHandle:{nodeId:m,type:e,id:y}});return}const Q=r0(R.target),H=n||B,{connection:K,isValid:ee}=nu.isValid(R.nativeEvent,{handle:{nodeId:m,id:y,type:e},connectionMode:O,fromNodeId:$.nodeId,fromHandleId:$.id||null,fromType:$.type,isValidConnection:H,flowId:V,doc:Q,lib:W,nodeLookup:Y});ee&&K&&I(K);const G=structuredClone(X);delete G.inProgress,G.toPosition=G.toHandle?G.toHandle.position:null,j==null||j(R,G),k.setState({connectionClickStartHandle:null})};return f.jsx("div",{"data-handleid":y,"data-nodeid":m,"data-handlepos":t,"data-id":`${v}-${m}-${y}-${e}`,className:we(["react-flow__handle",`react-flow__handle-${t}`,"nodrag",h,u,{source:!w,target:w,connectable:r,connectablestart:o,connectableend:i,clickconnecting:E,connectingfrom:_,connectingto:S,valid:T,connectionindicator:r&&(!A||b)&&(A||D?i:o)}]),onMouseDown:P,onTouchStart:P,onClick:g?C:void 0,ref:x,...d,children:a})}const Cr=z.memo(I0(M_));function z_({data:e,isConnectable:t,sourcePosition:n=q.Bottom}){return f.jsxs(f.Fragment,{children:[e==null?void 0:e.label,f.jsx(Cr,{type:"source",position:n,isConnectable:t})]})}function P_({data:e,isConnectable:t,targetPosition:n=q.Top,sourcePosition:r=q.Bottom}){return f.jsxs(f.Fragment,{children:[f.jsx(Cr,{type:"target",position:n,isConnectable:t}),e==null?void 0:e.label,f.jsx(Cr,{type:"source",position:r,isConnectable:t})]})}function T_(){return null}function I_({data:e,isConnectable:t,targetPosition:n=q.Top}){return f.jsxs(f.Fragment,{children:[f.jsx(Cr,{type:"target",position:n,isConnectable:t}),e==null?void 0:e.label]})}const Ns={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},Tf={input:z_,default:P_,output:I_,group:T_};function R_(e){var t,n,r,o;return e.internals.handleBounds===void 0?{width:e.width??e.initialWidth??((t=e.style)==null?void 0:t.width),height:e.height??e.initialHeight??((n=e.style)==null?void 0:n.height)}:{width:e.width??((r=e.style)==null?void 0:r.width),height:e.height??((o=e.style)==null?void 0:o.height)}}const L_=e=>{const{width:t,height:n,x:r,y:o}=Yo(e.nodeLookup,{filter:i=>!!i.selected});return{width:ct(t)?t:null,height:ct(n)?n:null,userSelectionActive:e.userSelectionActive,transformString:`translate(${e.transform[0]}px,${e.transform[1]}px) scale(${e.transform[2]}) translate(${r}px,${o}px)`}};function A_({onSelectionContextMenu:e,noPanClassName:t,disableKeyboardA11y:n}){const r=pe(),{width:o,height:i,transformString:s,userSelectionActive:l}=ne(L_,fe),a=A0(),u=z.useRef(null);z.useEffect(()=>{var x;n||(x=u.current)==null||x.focus({preventScroll:!0})},[n]);const p=!l&&o!==null&&i!==null;if(L0({nodeRef:u,disabled:!p}),!p)return null;const c=e?x=>{const y=r.getState().nodes.filter(w=>w.selected);e(x,y)}:void 0,d=x=>{Object.prototype.hasOwnProperty.call(Ns,x.key)&&(x.preventDefault(),a({direction:Ns[x.key],factor:x.shiftKey?4:1}))};return f.jsx("div",{className:we(["react-flow__nodesselection","react-flow__container",t]),style:{transform:s},children:f.jsx("div",{ref:u,className:"react-flow__nodesselection-rect",onContextMenu:c,tabIndex:n?void 0:-1,onKeyDown:n?void 0:d,style:{width:o,height:i}})})}const If=typeof window<"u"?window:void 0,$_=e=>({nodesSelectionActive:e.nodesSelectionActive,userSelectionActive:e.userSelectionActive});function D0({children:e,onPaneClick:t,onPaneMouseEnter:n,onPaneMouseMove:r,onPaneMouseLeave:o,onPaneContextMenu:i,onPaneScroll:s,paneClickDistance:l,deleteKeyCode:a,selectionKeyCode:u,selectionOnDrag:p,selectionMode:c,onSelectionStart:d,onSelectionEnd:x,multiSelectionKeyCode:y,panActivationKeyCode:w,zoomActivationKeyCode:k,elementsSelectable:m,zoomOnScroll:g,zoomOnPinch:h,panOnScroll:v,panOnScrollSpeed:_,panOnScrollMode:S,zoomOnDoubleClick:E,panOnDrag:b,defaultViewport:A,translateExtent:D,minZoom:T,maxZoom:I,preventScrolling:P,onSelectionContextMenu:C,noWheelClassName:L,noPanClassName:M,disableKeyboardA11y:R,onViewportChange:N,isControlledViewport:j}){const{nodesSelectionActive:$,userSelectionActive:O}=ne($_,fe),B=Ao(u,{target:If}),W=Ao(w,{target:If}),V=W||b,Y=W||v,X=p&&V!==!0,Q=B||O||X;return y_({deleteKeyCode:a,multiSelectionKeyCode:y}),f.jsx(w_,{onPaneContextMenu:i,elementsSelectable:m,zoomOnScroll:g,zoomOnPinch:h,panOnScroll:Y,panOnScrollSpeed:_,panOnScrollMode:S,zoomOnDoubleClick:E,panOnDrag:!B&&V,defaultViewport:A,translateExtent:D,minZoom:T,maxZoom:I,zoomActivationKeyCode:k,preventScrolling:P,noWheelClassName:L,noPanClassName:M,onViewportChange:N,isControlledViewport:j,paneClickDistance:l,selectionOnDrag:X,children:f.jsxs(E_,{onSelectionStart:d,onSelectionEnd:x,onPaneClick:t,onPaneMouseEnter:n,onPaneMouseMove:r,onPaneMouseLeave:o,onPaneContextMenu:i,onPaneScroll:s,panOnDrag:V,isSelecting:!!Q,selectionMode:c,selectionKeyPressed:B,paneClickDistance:l,selectionOnDrag:X,children:[e,$&&f.jsx(A_,{onSelectionContextMenu:C,noPanClassName:M,disableKeyboardA11y:R})]})})}D0.displayName="FlowRenderer";const D_=z.memo(D0),O_=e=>t=>e?cc(t.nodeLookup,{x:0,y:0,width:t.width,height:t.height},t.transform,!0).map(n=>n.id):Array.from(t.nodeLookup.keys());function B_(e){return ne(z.useCallback(O_(e),[e]),fe)}const F_=e=>e.updateNodeInternals;function H_(){const e=ne(F_),[t]=z.useState(()=>typeof ResizeObserver>"u"?null:new ResizeObserver(n=>{const r=new Map;n.forEach(o=>{const i=o.target.getAttribute("data-id");r.set(i,{id:i,nodeElement:o.target,force:!0})}),e(r)}));return z.useEffect(()=>()=>{t==null||t.disconnect()},[t]),t}function V_({node:e,nodeType:t,hasDimensions:n,resizeObserver:r}){const o=pe(),i=z.useRef(null),s=z.useRef(null),l=z.useRef(e.sourcePosition),a=z.useRef(e.targetPosition),u=z.useRef(t),p=n&&!!e.internals.handleBounds;return z.useEffect(()=>{i.current&&!e.hidden&&(!p||s.current!==i.current)&&(s.current&&(r==null||r.unobserve(s.current)),r==null||r.observe(i.current),s.current=i.current)},[p,e.hidden]),z.useEffect(()=>()=>{s.current&&(r==null||r.unobserve(s.current),s.current=null)},[]),z.useEffect(()=>{if(i.current){const c=u.current!==t,d=l.current!==e.sourcePosition,x=a.current!==e.targetPosition;(c||d||x)&&(u.current=t,l.current=e.sourcePosition,a.current=e.targetPosition,o.getState().updateNodeInternals(new Map([[e.id,{id:e.id,nodeElement:i.current,force:!0}]])))}},[e.id,t,e.sourcePosition,e.targetPosition]),i}function W_({id:e,onClick:t,onMouseEnter:n,onMouseMove:r,onMouseLeave:o,onContextMenu:i,onDoubleClick:s,nodesDraggable:l,elementsSelectable:a,nodesConnectable:u,nodesFocusable:p,resizeObserver:c,noDragClassName:d,noPanClassName:x,disableKeyboardA11y:y,rfId:w,nodeTypes:k,nodeClickDistance:m,onError:g}){const{node:h,internals:v,isParent:_}=ne(H=>{const K=H.nodeLookup.get(e),ee=H.parentLookup.has(e);return{node:K,internals:K.internals,isParent:ee}},fe);let S=h.type||"default",E=(k==null?void 0:k[S])||Tf[S];E===void 0&&(g==null||g("003",bt.error003(S)),S="default",E=(k==null?void 0:k.default)||Tf.default);const b=!!(h.draggable||l&&typeof h.draggable>"u"),A=!!(h.selectable||a&&typeof h.selectable>"u"),D=!!(h.connectable||u&&typeof h.connectable>"u"),T=!!(h.focusable||p&&typeof h.focusable>"u"),I=pe(),P=t0(h),C=V_({node:h,nodeType:S,hasDimensions:P,resizeObserver:c}),L=L0({nodeRef:C,disabled:h.hidden||!b,noDragClassName:d,handleSelector:h.dragHandle,nodeId:e,isSelectable:A,nodeClickDistance:m}),M=A0();if(h.hidden)return null;const R=Ht(h),N=R_(h),j=A||b||t||n||r||o,$=n?H=>n(H,{...v.userNode}):void 0,O=r?H=>r(H,{...v.userNode}):void 0,B=o?H=>o(H,{...v.userNode}):void 0,W=i?H=>i(H,{...v.userNode}):void 0,V=s?H=>s(H,{...v.userNode}):void 0,Y=H=>{const{selectNodesOnDrag:K,nodeDragThreshold:ee}=I.getState();A&&(!K||!b||ee>0)&&ru({id:e,store:I,nodeRef:C}),t&&t(H,{...v.userNode})},X=H=>{if(!(o0(H.nativeEvent)||y)){if(Yg.includes(H.key)&&A){const K=H.key==="Escape";ru({id:e,store:I,unselect:K,nodeRef:C})}else if(b&&h.selected&&Object.prototype.hasOwnProperty.call(Ns,H.key)){H.preventDefault();const{ariaLabelConfig:K}=I.getState();I.setState({ariaLiveMessage:K["node.a11yDescription.ariaLiveMessage"]({direction:H.key.replace("Arrow","").toLowerCase(),x:~~v.positionAbsolute.x,y:~~v.positionAbsolute.y})}),M({direction:Ns[H.key],factor:H.shiftKey?4:1})}}},Q=()=>{var re;if(y||!((re=C.current)!=null&&re.matches(":focus-visible")))return;const{transform:H,width:K,height:ee,autoPanOnNodeFocus:G,setCenter:J}=I.getState();if(!G)return;cc(new Map([[e,h]]),{x:0,y:0,width:K,height:ee},H,!0).length>0||J(h.position.x+R.width/2,h.position.y+R.height/2,{zoom:H[2]})};return f.jsx("div",{className:we(["react-flow__node",`react-flow__node-${S}`,{[x]:b},h.className,{selected:h.selected,selectable:A,parent:_,draggable:b,dragging:L}]),ref:C,style:{zIndex:v.z,transform:`translate(${v.positionAbsolute.x}px,${v.positionAbsolute.y}px)`,pointerEvents:j?"all":"none",visibility:P?"visible":"hidden",...h.style,...N},"data-id":e,"data-testid":`rf__node-${e}`,onMouseEnter:$,onMouseMove:O,onMouseLeave:B,onContextMenu:W,onClick:Y,onDoubleClick:V,onKeyDown:T?X:void 0,tabIndex:T?0:void 0,onFocus:T?Q:void 0,role:h.ariaRole??(T?"group":void 0),"aria-roledescription":"node","aria-describedby":y?void 0:`${N0}-${w}`,"aria-label":h.ariaLabel,...h.domAttributes,children:f.jsx(b_,{value:e,children:f.jsx(E,{id:e,data:h.data,type:S,positionAbsoluteX:v.positionAbsolute.x,positionAbsoluteY:v.positionAbsolute.y,selected:h.selected??!1,selectable:A,draggable:b,deletable:h.deletable??!0,isConnectable:D,sourcePosition:h.sourcePosition,targetPosition:h.targetPosition,dragging:L,dragHandle:h.dragHandle,zIndex:v.z,parentId:h.parentId,...R})})})}var U_=z.memo(W_);const Y_=e=>({nodesDraggable:e.nodesDraggable,nodesConnectable:e.nodesConnectable,nodesFocusable:e.nodesFocusable,elementsSelectable:e.elementsSelectable,onError:e.onError});function O0(e){const{nodesDraggable:t,nodesConnectable:n,nodesFocusable:r,elementsSelectable:o,onError:i}=ne(Y_,fe),s=B_(e.onlyRenderVisibleElements),l=H_();return f.jsx("div",{className:"react-flow__nodes",style:tl,children:s.map(a=>f.jsx(U_,{id:a,nodeTypes:e.nodeTypes,nodeExtent:e.nodeExtent,onClick:e.onNodeClick,onMouseEnter:e.onNodeMouseEnter,onMouseMove:e.onNodeMouseMove,onMouseLeave:e.onNodeMouseLeave,onContextMenu:e.onNodeContextMenu,onDoubleClick:e.onNodeDoubleClick,noDragClassName:e.noDragClassName,noPanClassName:e.noPanClassName,rfId:e.rfId,disableKeyboardA11y:e.disableKeyboardA11y,resizeObserver:l,nodesDraggable:t,nodesConnectable:n,nodesFocusable:r,elementsSelectable:o,nodeClickDistance:e.nodeClickDistance,onError:i},a))})}O0.displayName="NodeRenderer";const X_=z.memo(O0);function Q_(e){return ne(z.useCallback(n=>{if(!e)return n.edges.map(o=>o.id);const r=[];if(n.width&&n.height)for(const o of n.edges){const i=n.nodeLookup.get(o.source),s=n.nodeLookup.get(o.target);i&&s&&zS({sourceNode:i,targetNode:s,width:n.width,height:n.height,transform:n.transform})&&r.push(o.id)}return r},[e]),fe)}const G_=({color:e="none",strokeWidth:t=1})=>{const n={strokeWidth:t,...e&&{stroke:e}};return f.jsx("polyline",{className:"arrow",style:n,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},K_=({color:e="none",strokeWidth:t=1})=>{const n={strokeWidth:t,...e&&{stroke:e,fill:e}};return f.jsx("polyline",{className:"arrowclosed",style:n,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},Rf={[Es.Arrow]:G_,[Es.ArrowClosed]:K_};function Z_(e){const t=pe();return z.useMemo(()=>{var o,i;return Object.prototype.hasOwnProperty.call(Rf,e)?Rf[e]:((i=(o=t.getState()).onError)==null||i.call(o,"009",bt.error009(e)),null)},[e])}const q_=({id:e,type:t,color:n,width:r=12.5,height:o=12.5,markerUnits:i="strokeWidth",strokeWidth:s,orient:l="auto-start-reverse"})=>{const a=Z_(t);return a?f.jsx("marker",{className:"react-flow__arrowhead",id:e,markerWidth:`${r}`,markerHeight:`${o}`,viewBox:"-10 -10 20 20",markerUnits:i,orient:l,refX:"0",refY:"0",children:f.jsx(a,{color:n,strokeWidth:s})}):null},B0=({defaultColor:e,rfId:t})=>{const n=ne(i=>i.edges),r=ne(i=>i.defaultEdgeOptions),o=z.useMemo(()=>DS(n,{id:t,defaultColor:e,defaultMarkerStart:r==null?void 0:r.markerStart,defaultMarkerEnd:r==null?void 0:r.markerEnd}),[n,r,t,e]);return o.length?f.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:f.jsx("defs",{children:o.map(i=>f.jsx(q_,{id:i.id,type:i.type,color:i.color,width:i.width,height:i.height,markerUnits:i.markerUnits,strokeWidth:i.strokeWidth,orient:i.orient},i.id))})}):null};B0.displayName="MarkerDefinitions";var J_=z.memo(B0);function F0({x:e,y:t,label:n,labelStyle:r,labelShowBg:o=!0,labelBgStyle:i,labelBgPadding:s=[2,4],labelBgBorderRadius:l=2,children:a,className:u,...p}){const[c,d]=z.useState({x:1,y:0,width:0,height:0}),x=we(["react-flow__edge-textwrapper",u]),y=z.useRef(null);return z.useEffect(()=>{if(y.current){const w=y.current.getBBox();d({x:w.x,y:w.y,width:w.width,height:w.height})}},[n]),n?f.jsxs("g",{transform:`translate(${e-c.width/2} ${t-c.height/2})`,className:x,visibility:c.width?"visible":"hidden",...p,children:[o&&f.jsx("rect",{width:c.width+2*s[0],x:-s[0],y:-s[1],height:c.height+2*s[1],className:"react-flow__edge-textbg",style:i,rx:l,ry:l}),f.jsx("text",{className:"react-flow__edge-text",y:c.height/2,dy:"0.3em",ref:y,style:r,children:n}),a]}):null}F0.displayName="EdgeText";const eE=z.memo(F0);function nl({path:e,labelX:t,labelY:n,label:r,labelStyle:o,labelShowBg:i,labelBgStyle:s,labelBgPadding:l,labelBgBorderRadius:a,interactionWidth:u=20,...p}){return f.jsxs(f.Fragment,{children:[f.jsx("path",{...p,d:e,fill:"none",className:we(["react-flow__edge-path",p.className])}),u?f.jsx("path",{d:e,fill:"none",strokeOpacity:0,strokeWidth:u,className:"react-flow__edge-interaction"}):null,r&&ct(t)&&ct(n)?f.jsx(eE,{x:t,y:n,label:r,labelStyle:o,labelShowBg:i,labelBgStyle:s,labelBgPadding:l,labelBgBorderRadius:a}):null]})}function Lf({pos:e,x1:t,y1:n,x2:r,y2:o}){return e===q.Left||e===q.Right?[.5*(t+r),n]:[t,.5*(n+o)]}function H0({sourceX:e,sourceY:t,sourcePosition:n=q.Bottom,targetX:r,targetY:o,targetPosition:i=q.Top}){const[s,l]=Lf({pos:n,x1:e,y1:t,x2:r,y2:o}),[a,u]=Lf({pos:i,x1:r,y1:o,x2:e,y2:t}),[p,c,d,x]=s0({sourceX:e,sourceY:t,targetX:r,targetY:o,sourceControlX:s,sourceControlY:l,targetControlX:a,targetControlY:u});return[`M${e},${t} C${s},${l} ${a},${u} ${r},${o}`,p,c,d,x]}function V0(e){return z.memo(({id:t,sourceX:n,sourceY:r,targetX:o,targetY:i,sourcePosition:s,targetPosition:l,label:a,labelStyle:u,labelShowBg:p,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:x,style:y,markerEnd:w,markerStart:k,interactionWidth:m})=>{const[g,h,v]=H0({sourceX:n,sourceY:r,sourcePosition:s,targetX:o,targetY:i,targetPosition:l}),_=e.isInternal?void 0:t;return f.jsx(nl,{id:_,path:g,labelX:h,labelY:v,label:a,labelStyle:u,labelShowBg:p,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:x,style:y,markerEnd:w,markerStart:k,interactionWidth:m})})}const tE=V0({isInternal:!1}),W0=V0({isInternal:!0});tE.displayName="SimpleBezierEdge";W0.displayName="SimpleBezierEdgeInternal";function U0(e){return z.memo(({id:t,sourceX:n,sourceY:r,targetX:o,targetY:i,label:s,labelStyle:l,labelShowBg:a,labelBgStyle:u,labelBgPadding:p,labelBgBorderRadius:c,style:d,sourcePosition:x=q.Bottom,targetPosition:y=q.Top,markerEnd:w,markerStart:k,pathOptions:m,interactionWidth:g})=>{const[h,v,_]=Ja({sourceX:n,sourceY:r,sourcePosition:x,targetX:o,targetY:i,targetPosition:y,borderRadius:m==null?void 0:m.borderRadius,offset:m==null?void 0:m.offset,stepPosition:m==null?void 0:m.stepPosition}),S=e.isInternal?void 0:t;return f.jsx(nl,{id:S,path:h,labelX:v,labelY:_,label:s,labelStyle:l,labelShowBg:a,labelBgStyle:u,labelBgPadding:p,labelBgBorderRadius:c,style:d,markerEnd:w,markerStart:k,interactionWidth:g})})}const Y0=U0({isInternal:!1}),X0=U0({isInternal:!0});Y0.displayName="SmoothStepEdge";X0.displayName="SmoothStepEdgeInternal";function Q0(e){return z.memo(({id:t,...n})=>{var o;const r=e.isInternal?void 0:t;return f.jsx(Y0,{...n,id:r,pathOptions:z.useMemo(()=>{var i;return{borderRadius:0,offset:(i=n.pathOptions)==null?void 0:i.offset}},[(o=n.pathOptions)==null?void 0:o.offset])})})}const nE=Q0({isInternal:!1}),G0=Q0({isInternal:!0});nE.displayName="StepEdge";G0.displayName="StepEdgeInternal";function K0(e){return z.memo(({id:t,sourceX:n,sourceY:r,targetX:o,targetY:i,label:s,labelStyle:l,labelShowBg:a,labelBgStyle:u,labelBgPadding:p,labelBgBorderRadius:c,style:d,markerEnd:x,markerStart:y,interactionWidth:w})=>{const[k,m,g]=u0({sourceX:n,sourceY:r,targetX:o,targetY:i}),h=e.isInternal?void 0:t;return f.jsx(nl,{id:h,path:k,labelX:m,labelY:g,label:s,labelStyle:l,labelShowBg:a,labelBgStyle:u,labelBgPadding:p,labelBgBorderRadius:c,style:d,markerEnd:x,markerStart:y,interactionWidth:w})})}const rE=K0({isInternal:!1}),Z0=K0({isInternal:!0});rE.displayName="StraightEdge";Z0.displayName="StraightEdgeInternal";function q0(e){return z.memo(({id:t,sourceX:n,sourceY:r,targetX:o,targetY:i,sourcePosition:s=q.Bottom,targetPosition:l=q.Top,label:a,labelStyle:u,labelShowBg:p,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:x,style:y,markerEnd:w,markerStart:k,pathOptions:m,interactionWidth:g})=>{const[h,v,_]=l0({sourceX:n,sourceY:r,sourcePosition:s,targetX:o,targetY:i,targetPosition:l,curvature:m==null?void 0:m.curvature}),S=e.isInternal?void 0:t;return f.jsx(nl,{id:S,path:h,labelX:v,labelY:_,label:a,labelStyle:u,labelShowBg:p,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:x,style:y,markerEnd:w,markerStart:k,interactionWidth:g})})}const oE=q0({isInternal:!1}),J0=q0({isInternal:!0});oE.displayName="BezierEdge";J0.displayName="BezierEdgeInternal";const Af={default:J0,straight:Z0,step:G0,smoothstep:X0,simplebezier:W0},$f={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},iE=(e,t,n)=>n===q.Left?e-t:n===q.Right?e+t:e,sE=(e,t,n)=>n===q.Top?e-t:n===q.Bottom?e+t:e,Df="react-flow__edgeupdater";function Of({position:e,centerX:t,centerY:n,radius:r=10,onMouseDown:o,onMouseEnter:i,onMouseOut:s,type:l}){return f.jsx("circle",{onMouseDown:o,onMouseEnter:i,onMouseOut:s,className:we([Df,`${Df}-${l}`]),cx:iE(t,r,e),cy:sE(n,r,e),r,stroke:"transparent",fill:"transparent"})}function lE({isReconnectable:e,reconnectRadius:t,edge:n,sourceX:r,sourceY:o,targetX:i,targetY:s,sourcePosition:l,targetPosition:a,onReconnect:u,onReconnectStart:p,onReconnectEnd:c,setReconnecting:d,setUpdateHover:x}){const y=pe(),w=(v,_)=>{if(v.button!==0)return;const{autoPanOnConnect:S,domNode:E,connectionMode:b,connectionRadius:A,lib:D,onConnectStart:T,cancelConnection:I,nodeLookup:P,rfId:C,panBy:L,updateConnection:M}=y.getState(),R=_.type==="target",N=(O,B)=>{d(!1),c==null||c(O,n,_.type,B)},j=O=>u==null?void 0:u(n,O),$=(O,B)=>{d(!0),p==null||p(v,n,_.type),T==null||T(O,B)};nu.onPointerDown(v.nativeEvent,{autoPanOnConnect:S,connectionMode:b,connectionRadius:A,domNode:E,handleId:_.id,nodeId:_.nodeId,nodeLookup:P,isTarget:R,edgeUpdaterType:_.type,lib:D,flowId:C,cancelConnection:I,panBy:L,isValidConnection:(...O)=>{var B,W;return((W=(B=y.getState()).isValidConnection)==null?void 0:W.call(B,...O))??!0},onConnect:j,onConnectStart:$,onConnectEnd:(...O)=>{var B,W;return(W=(B=y.getState()).onConnectEnd)==null?void 0:W.call(B,...O)},onReconnectEnd:N,updateConnection:M,getTransform:()=>y.getState().transform,getFromHandle:()=>y.getState().connection.fromHandle,dragThreshold:y.getState().connectionDragThreshold,handleDomNode:v.currentTarget})},k=v=>w(v,{nodeId:n.target,id:n.targetHandle??null,type:"target"}),m=v=>w(v,{nodeId:n.source,id:n.sourceHandle??null,type:"source"}),g=()=>x(!0),h=()=>x(!1);return f.jsxs(f.Fragment,{children:[(e===!0||e==="source")&&f.jsx(Of,{position:l,centerX:r,centerY:o,radius:t,onMouseDown:k,onMouseEnter:g,onMouseOut:h,type:"source"}),(e===!0||e==="target")&&f.jsx(Of,{position:a,centerX:i,centerY:s,radius:t,onMouseDown:m,onMouseEnter:g,onMouseOut:h,type:"target"})]})}function aE({id:e,edgesFocusable:t,edgesReconnectable:n,elementsSelectable:r,onClick:o,onDoubleClick:i,onContextMenu:s,onMouseEnter:l,onMouseMove:a,onMouseLeave:u,reconnectRadius:p,onReconnect:c,onReconnectStart:d,onReconnectEnd:x,rfId:y,edgeTypes:w,noPanClassName:k,onError:m,disableKeyboardA11y:g}){let h=ne(J=>J.edgeLookup.get(e));const v=ne(J=>J.defaultEdgeOptions);h=v?{...v,...h}:h;let _=h.type||"default",S=(w==null?void 0:w[_])||Af[_];S===void 0&&(m==null||m("011",bt.error011(_)),_="default",S=(w==null?void 0:w.default)||Af.default);const E=!!(h.focusable||t&&typeof h.focusable>"u"),b=typeof c<"u"&&(h.reconnectable||n&&typeof h.reconnectable>"u"),A=!!(h.selectable||r&&typeof h.selectable>"u"),D=z.useRef(null),[T,I]=z.useState(!1),[P,C]=z.useState(!1),L=pe(),{zIndex:M,sourceX:R,sourceY:N,targetX:j,targetY:$,sourcePosition:O,targetPosition:B}=ne(z.useCallback(J=>{const Z=J.nodeLookup.get(h.source),re=J.nodeLookup.get(h.target);if(!Z||!re)return{zIndex:h.zIndex,...$f};const le=$S({id:e,sourceNode:Z,targetNode:re,sourceHandle:h.sourceHandle||null,targetHandle:h.targetHandle||null,connectionMode:J.connectionMode,onError:m});return{zIndex:MS({selected:h.selected,zIndex:h.zIndex,sourceNode:Z,targetNode:re,elevateOnSelect:J.elevateEdgesOnSelect,zIndexMode:J.zIndexMode}),...le||$f}},[h.source,h.target,h.sourceHandle,h.targetHandle,h.selected,h.zIndex]),fe),W=z.useMemo(()=>h.markerStart?`url('#${eu(h.markerStart,y)}')`:void 0,[h.markerStart,y]),V=z.useMemo(()=>h.markerEnd?`url('#${eu(h.markerEnd,y)}')`:void 0,[h.markerEnd,y]);if(h.hidden||R===null||N===null||j===null||$===null)return null;const Y=J=>{var ie;const{addSelectedEdges:Z,unselectNodesAndEdges:re,multiSelectionActive:le}=L.getState();A&&(L.setState({nodesSelectionActive:!1}),h.selected&&le?(re({nodes:[],edges:[h]}),(ie=D.current)==null||ie.blur()):Z([e])),o&&o(J,h)},X=i?J=>{i(J,{...h})}:void 0,Q=s?J=>{s(J,{...h})}:void 0,H=l?J=>{l(J,{...h})}:void 0,K=a?J=>{a(J,{...h})}:void 0,ee=u?J=>{u(J,{...h})}:void 0,G=J=>{var Z;if(!g&&Yg.includes(J.key)&&A){const{unselectNodesAndEdges:re,addSelectedEdges:le}=L.getState();J.key==="Escape"?((Z=D.current)==null||Z.blur(),re({edges:[h]})):le([e])}};return f.jsx("svg",{style:{zIndex:M},children:f.jsxs("g",{className:we(["react-flow__edge",`react-flow__edge-${_}`,h.className,k,{selected:h.selected,animated:h.animated,inactive:!A&&!o,updating:T,selectable:A}]),onClick:Y,onDoubleClick:X,onContextMenu:Q,onMouseEnter:H,onMouseMove:K,onMouseLeave:ee,onKeyDown:E?G:void 0,tabIndex:E?0:void 0,role:h.ariaRole??(E?"group":"img"),"aria-roledescription":"edge","data-id":e,"data-testid":`rf__edge-${e}`,"aria-label":h.ariaLabel===null?void 0:h.ariaLabel||`Edge from ${h.source} to ${h.target}`,"aria-describedby":E?`${j0}-${y}`:void 0,ref:D,...h.domAttributes,children:[!P&&f.jsx(S,{id:e,source:h.source,target:h.target,type:h.type,selected:h.selected,animated:h.animated,selectable:A,deletable:h.deletable??!0,label:h.label,labelStyle:h.labelStyle,labelShowBg:h.labelShowBg,labelBgStyle:h.labelBgStyle,labelBgPadding:h.labelBgPadding,labelBgBorderRadius:h.labelBgBorderRadius,sourceX:R,sourceY:N,targetX:j,targetY:$,sourcePosition:O,targetPosition:B,data:h.data,style:h.style,sourceHandleId:h.sourceHandle,targetHandleId:h.targetHandle,markerStart:W,markerEnd:V,pathOptions:"pathOptions"in h?h.pathOptions:void 0,interactionWidth:h.interactionWidth}),b&&f.jsx(lE,{edge:h,isReconnectable:b,reconnectRadius:p,onReconnect:c,onReconnectStart:d,onReconnectEnd:x,sourceX:R,sourceY:N,targetX:j,targetY:$,sourcePosition:O,targetPosition:B,setUpdateHover:I,setReconnecting:C})]})})}var uE=z.memo(aE);const cE=e=>({edgesFocusable:e.edgesFocusable,edgesReconnectable:e.edgesReconnectable,elementsSelectable:e.elementsSelectable,connectionMode:e.connectionMode,onError:e.onError});function em({defaultMarkerColor:e,onlyRenderVisibleElements:t,rfId:n,edgeTypes:r,noPanClassName:o,onReconnect:i,onEdgeContextMenu:s,onEdgeMouseEnter:l,onEdgeMouseMove:a,onEdgeMouseLeave:u,onEdgeClick:p,reconnectRadius:c,onEdgeDoubleClick:d,onReconnectStart:x,onReconnectEnd:y,disableKeyboardA11y:w}){const{edgesFocusable:k,edgesReconnectable:m,elementsSelectable:g,onError:h}=ne(cE,fe),v=Q_(t);return f.jsxs("div",{className:"react-flow__edges",children:[f.jsx(J_,{defaultColor:e,rfId:n}),v.map(_=>f.jsx(uE,{id:_,edgesFocusable:k,edgesReconnectable:m,elementsSelectable:g,noPanClassName:o,onReconnect:i,onContextMenu:s,onMouseEnter:l,onMouseMove:a,onMouseLeave:u,onClick:p,reconnectRadius:c,onDoubleClick:d,onReconnectStart:x,onReconnectEnd:y,rfId:n,onError:h,edgeTypes:r,disableKeyboardA11y:w},_))]})}em.displayName="EdgeRenderer";const dE=z.memo(em),fE=e=>`translate(${e.transform[0]}px,${e.transform[1]}px) scale(${e.transform[2]})`;function pE({children:e}){const t=ne(fE);return f.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:t},children:e})}function hE(e){const t=xc(),n=z.useRef(!1);z.useEffect(()=>{!n.current&&t.viewportInitialized&&e&&(setTimeout(()=>e(t),1),n.current=!0)},[e,t.viewportInitialized])}const gE=e=>{var t;return(t=e.panZoom)==null?void 0:t.syncViewport};function mE(e){const t=ne(gE),n=pe();return z.useEffect(()=>{e&&(t==null||t(e),n.setState({transform:[e.x,e.y,e.zoom]}))},[e,t]),null}function yE(e){return e.connection.inProgress?{...e.connection,to:Qo(e.connection.to,e.transform)}:{...e.connection}}function xE(e){return yE}function vE(e){const t=xE();return ne(t,fe)}const wE=e=>({nodesConnectable:e.nodesConnectable,isValid:e.connection.isValid,inProgress:e.connection.inProgress,width:e.width,height:e.height});function SE({containerStyle:e,style:t,type:n,component:r}){const{nodesConnectable:o,width:i,height:s,isValid:l,inProgress:a}=ne(wE,fe);return!(i&&o&&a)?null:f.jsx("svg",{style:e,width:i,height:s,className:"react-flow__connectionline react-flow__container",children:f.jsx("g",{className:we(["react-flow__connection",Gg(l)]),children:f.jsx(tm,{style:t,type:n,CustomComponent:r,isValid:l})})})}const tm=({style:e,type:t=Zt.Bezier,CustomComponent:n,isValid:r})=>{const{inProgress:o,from:i,fromNode:s,fromHandle:l,fromPosition:a,to:u,toNode:p,toHandle:c,toPosition:d,pointer:x}=vE();if(!o)return;if(n)return f.jsx(n,{connectionLineType:t,connectionLineStyle:e,fromNode:s,fromHandle:l,fromX:i.x,fromY:i.y,toX:u.x,toY:u.y,fromPosition:a,toPosition:d,connectionStatus:Gg(r),toNode:p,toHandle:c,pointer:x});let y="";const w={sourceX:i.x,sourceY:i.y,sourcePosition:a,targetX:u.x,targetY:u.y,targetPosition:d};switch(t){case Zt.Bezier:[y]=l0(w);break;case Zt.SimpleBezier:[y]=H0(w);break;case Zt.Step:[y]=Ja({...w,borderRadius:0});break;case Zt.SmoothStep:[y]=Ja(w);break;default:[y]=u0(w)}return f.jsx("path",{d:y,fill:"none",className:"react-flow__connection-path",style:e})};tm.displayName="ConnectionLine";const kE={};function Bf(e=kE){z.useRef(e),pe(),z.useEffect(()=>{},[e])}function _E(){pe(),z.useRef(!1),z.useEffect(()=>{},[])}function nm({nodeTypes:e,edgeTypes:t,onInit:n,onNodeClick:r,onEdgeClick:o,onNodeDoubleClick:i,onEdgeDoubleClick:s,onNodeMouseEnter:l,onNodeMouseMove:a,onNodeMouseLeave:u,onNodeContextMenu:p,onSelectionContextMenu:c,onSelectionStart:d,onSelectionEnd:x,connectionLineType:y,connectionLineStyle:w,connectionLineComponent:k,connectionLineContainerStyle:m,selectionKeyCode:g,selectionOnDrag:h,selectionMode:v,multiSelectionKeyCode:_,panActivationKeyCode:S,zoomActivationKeyCode:E,deleteKeyCode:b,onlyRenderVisibleElements:A,elementsSelectable:D,defaultViewport:T,translateExtent:I,minZoom:P,maxZoom:C,preventScrolling:L,defaultMarkerColor:M,zoomOnScroll:R,zoomOnPinch:N,panOnScroll:j,panOnScrollSpeed:$,panOnScrollMode:O,zoomOnDoubleClick:B,panOnDrag:W,onPaneClick:V,onPaneMouseEnter:Y,onPaneMouseMove:X,onPaneMouseLeave:Q,onPaneScroll:H,onPaneContextMenu:K,paneClickDistance:ee,nodeClickDistance:G,onEdgeContextMenu:J,onEdgeMouseEnter:Z,onEdgeMouseMove:re,onEdgeMouseLeave:le,reconnectRadius:ie,onReconnect:je,onReconnectStart:Vt,onReconnectEnd:jt,noDragClassName:gn,noWheelClassName:Mr,noPanClassName:zr,disableKeyboardA11y:Pr,nodeExtent:rl,rfId:Ko,viewport:On,onViewportChange:Tr}){return Bf(e),Bf(t),_E(),hE(n),mE(On),f.jsx(D_,{onPaneClick:V,onPaneMouseEnter:Y,onPaneMouseMove:X,onPaneMouseLeave:Q,onPaneContextMenu:K,onPaneScroll:H,paneClickDistance:ee,deleteKeyCode:b,selectionKeyCode:g,selectionOnDrag:h,selectionMode:v,onSelectionStart:d,onSelectionEnd:x,multiSelectionKeyCode:_,panActivationKeyCode:S,zoomActivationKeyCode:E,elementsSelectable:D,zoomOnScroll:R,zoomOnPinch:N,zoomOnDoubleClick:B,panOnScroll:j,panOnScrollSpeed:$,panOnScrollMode:O,panOnDrag:W,defaultViewport:T,translateExtent:I,minZoom:P,maxZoom:C,onSelectionContextMenu:c,preventScrolling:L,noDragClassName:gn,noWheelClassName:Mr,noPanClassName:zr,disableKeyboardA11y:Pr,onViewportChange:Tr,isControlledViewport:!!On,children:f.jsxs(pE,{children:[f.jsx(dE,{edgeTypes:t,onEdgeClick:o,onEdgeDoubleClick:s,onReconnect:je,onReconnectStart:Vt,onReconnectEnd:jt,onlyRenderVisibleElements:A,onEdgeContextMenu:J,onEdgeMouseEnter:Z,onEdgeMouseMove:re,onEdgeMouseLeave:le,reconnectRadius:ie,defaultMarkerColor:M,noPanClassName:zr,disableKeyboardA11y:Pr,rfId:Ko}),f.jsx(SE,{style:w,type:y,component:k,containerStyle:m}),f.jsx("div",{className:"react-flow__edgelabel-renderer"}),f.jsx(X_,{nodeTypes:e,onNodeClick:r,onNodeDoubleClick:i,onNodeMouseEnter:l,onNodeMouseMove:a,onNodeMouseLeave:u,onNodeContextMenu:p,nodeClickDistance:G,onlyRenderVisibleElements:A,noPanClassName:zr,noDragClassName:gn,disableKeyboardA11y:Pr,nodeExtent:rl,rfId:Ko}),f.jsx("div",{className:"react-flow__viewport-portal"})]})})}nm.displayName="GraphView";const EE=z.memo(nm),Ff=({nodes:e,edges:t,defaultNodes:n,defaultEdges:r,width:o,height:i,fitView:s,fitViewOptions:l,minZoom:a=.5,maxZoom:u=2,nodeOrigin:p,nodeExtent:c,zIndexMode:d="basic"}={})=>{const x=new Map,y=new Map,w=new Map,k=new Map,m=r??t??[],g=n??e??[],h=p??[0,0],v=c??To;f0(w,k,m);const _=tu(g,x,y,{nodeOrigin:h,nodeExtent:v,zIndexMode:d});let S=[0,0,1];if(s&&o&&i){const E=Yo(x,{filter:T=>!!((T.width||T.initialWidth)&&(T.height||T.initialHeight))}),{x:b,y:A,zoom:D}=dc(E,o,i,a,u,(l==null?void 0:l.padding)??.1);S=[b,A,D]}return{rfId:"1",width:o??0,height:i??0,transform:S,nodes:g,nodesInitialized:_,nodeLookup:x,parentLookup:y,edges:m,edgeLookup:k,connectionLookup:w,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:n!==void 0,hasDefaultEdges:r!==void 0,panZoom:null,minZoom:a,maxZoom:u,translateExtent:To,nodeExtent:v,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:wr.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:h,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:s??!1,fitViewOptions:l,fitViewResolver:null,connection:{...Qg},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:_S,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:Xg,zIndexMode:d,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},CE=({nodes:e,edges:t,defaultNodes:n,defaultEdges:r,width:o,height:i,fitView:s,fitViewOptions:l,minZoom:a,maxZoom:u,nodeOrigin:p,nodeExtent:c,zIndexMode:d})=>Vk((x,y)=>{async function w(){const{nodeLookup:k,panZoom:m,fitViewOptions:g,fitViewResolver:h,width:v,height:_,minZoom:S,maxZoom:E}=y();m&&(await SS({nodes:k,width:v,height:_,panZoom:m,minZoom:S,maxZoom:E},g),h==null||h.resolve(!0),x({fitViewResolver:null}))}return{...Ff({nodes:e,edges:t,width:o,height:i,fitView:s,fitViewOptions:l,minZoom:a,maxZoom:u,nodeOrigin:p,nodeExtent:c,defaultNodes:n,defaultEdges:r,zIndexMode:d}),setNodes:k=>{const{nodeLookup:m,parentLookup:g,nodeOrigin:h,elevateNodesOnSelect:v,fitViewQueued:_,zIndexMode:S}=y(),E=tu(k,m,g,{nodeOrigin:h,nodeExtent:c,elevateNodesOnSelect:v,checkEquality:!0,zIndexMode:S});_&&E?(w(),x({nodes:k,nodesInitialized:E,fitViewQueued:!1,fitViewOptions:void 0})):x({nodes:k,nodesInitialized:E})},setEdges:k=>{const{connectionLookup:m,edgeLookup:g}=y();f0(m,g,k),x({edges:k})},setDefaultNodesAndEdges:(k,m)=>{if(k){const{setNodes:g}=y();g(k),x({hasDefaultNodes:!0})}if(m){const{setEdges:g}=y();g(m),x({hasDefaultEdges:!0})}},updateNodeInternals:k=>{const{triggerNodeChanges:m,nodeLookup:g,parentLookup:h,domNode:v,nodeOrigin:_,nodeExtent:S,debug:E,fitViewQueued:b,zIndexMode:A}=y(),{changes:D,updatedInternals:T}=US(k,g,h,v,_,S,A);T&&(FS(g,h,{nodeOrigin:_,nodeExtent:S,zIndexMode:A}),b?(w(),x({fitViewQueued:!1,fitViewOptions:void 0})):x({}),(D==null?void 0:D.length)>0&&(E&&console.log("React Flow: trigger node changes",D),m==null||m(D)))},updateNodePositions:(k,m=!1)=>{const g=[];let h=[];const{nodeLookup:v,triggerNodeChanges:_,connection:S,updateConnection:E,onNodesChangeMiddlewareMap:b}=y();for(const[A,D]of k){const T=v.get(A),I=!!(T!=null&&T.expandParent&&(T!=null&&T.parentId)&&(D!=null&&D.position)),P={id:A,type:"position",position:I?{x:Math.max(0,D.position.x),y:Math.max(0,D.position.y)}:D.position,dragging:m};if(T&&S.inProgress&&S.fromNode.id===T.id){const C=Ln(T,S.fromHandle,q.Left,!0);E({...S,from:C})}I&&T.parentId&&g.push({id:A,parentId:T.parentId,rect:{...D.internals.positionAbsolute,width:D.measured.width??0,height:D.measured.height??0}}),h.push(P)}if(g.length>0){const{parentLookup:A,nodeOrigin:D}=y(),T=yc(g,v,A,D);h.push(...T)}for(const A of b.values())h=A(h);_(h)},triggerNodeChanges:k=>{const{onNodesChange:m,setNodes:g,nodes:h,hasDefaultNodes:v,debug:_}=y();if(k!=null&&k.length){if(v){const S=P0(k,h);g(S)}_&&console.log("React Flow: trigger node changes",k),m==null||m(k)}},triggerEdgeChanges:k=>{const{onEdgesChange:m,setEdges:g,edges:h,hasDefaultEdges:v,debug:_}=y();if(k!=null&&k.length){if(v){const S=T0(k,h);g(S)}_&&console.log("React Flow: trigger edge changes",k),m==null||m(k)}},addSelectedNodes:k=>{const{multiSelectionActive:m,edgeLookup:g,nodeLookup:h,triggerNodeChanges:v,triggerEdgeChanges:_}=y();if(m){const S=k.map(E=>xn(E,!0));v(S);return}v(nr(h,new Set([...k]),!0)),_(nr(g))},addSelectedEdges:k=>{const{multiSelectionActive:m,edgeLookup:g,nodeLookup:h,triggerNodeChanges:v,triggerEdgeChanges:_}=y();if(m){const S=k.map(E=>xn(E,!0));_(S);return}_(nr(g,new Set([...k]))),v(nr(h,new Set,!0))},unselectNodesAndEdges:({nodes:k,edges:m}={})=>{const{edges:g,nodes:h,nodeLookup:v,triggerNodeChanges:_,triggerEdgeChanges:S}=y(),E=k||h,b=m||g,A=[];for(const T of E){if(!T.selected)continue;const I=v.get(T.id);I&&(I.selected=!1),A.push(xn(T.id,!1))}const D=[];for(const T of b)T.selected&&D.push(xn(T.id,!1));_(A),S(D)},setMinZoom:k=>{const{panZoom:m,maxZoom:g}=y();m==null||m.setScaleExtent([k,g]),x({minZoom:k})},setMaxZoom:k=>{const{panZoom:m,minZoom:g}=y();m==null||m.setScaleExtent([g,k]),x({maxZoom:k})},setTranslateExtent:k=>{var m;(m=y().panZoom)==null||m.setTranslateExtent(k),x({translateExtent:k})},resetSelectedElements:()=>{const{edges:k,nodes:m,triggerNodeChanges:g,triggerEdgeChanges:h,elementsSelectable:v}=y();if(!v)return;const _=m.reduce((E,b)=>b.selected?[...E,xn(b.id,!1)]:E,[]),S=k.reduce((E,b)=>b.selected?[...E,xn(b.id,!1)]:E,[]);g(_),h(S)},setNodeExtent:k=>{const{nodes:m,nodeLookup:g,parentLookup:h,nodeOrigin:v,elevateNodesOnSelect:_,nodeExtent:S,zIndexMode:E}=y();k[0][0]===S[0][0]&&k[0][1]===S[0][1]&&k[1][0]===S[1][0]&&k[1][1]===S[1][1]||(tu(m,g,h,{nodeOrigin:v,nodeExtent:k,elevateNodesOnSelect:_,checkEquality:!1,zIndexMode:E}),x({nodeExtent:k}))},panBy:k=>{const{transform:m,width:g,height:h,panZoom:v,translateExtent:_}=y();return YS({delta:k,panZoom:v,transform:m,translateExtent:_,width:g,height:h})},setCenter:async(k,m,g)=>{const{width:h,height:v,maxZoom:_,panZoom:S}=y();if(!S)return Promise.resolve(!1);const E=typeof(g==null?void 0:g.zoom)<"u"?g.zoom:_;return await S.setViewport({x:h/2-k*E,y:v/2-m*E,zoom:E},{duration:g==null?void 0:g.duration,ease:g==null?void 0:g.ease,interpolate:g==null?void 0:g.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{x({connection:{...Qg}})},updateConnection:k=>{x({connection:k})},reset:()=>x({...Ff()})}},Object.is);function bE({initialNodes:e,initialEdges:t,defaultNodes:n,defaultEdges:r,initialWidth:o,initialHeight:i,initialMinZoom:s,initialMaxZoom:l,initialFitViewOptions:a,fitView:u,nodeOrigin:p,nodeExtent:c,zIndexMode:d,children:x}){const[y]=z.useState(()=>CE({nodes:e,edges:t,defaultNodes:n,defaultEdges:r,width:o,height:i,fitView:u,minZoom:s,maxZoom:l,fitViewOptions:a,nodeOrigin:p,nodeExtent:c,zIndexMode:d}));return f.jsx(Wk,{value:y,children:f.jsx(p_,{children:x})})}function NE({children:e,nodes:t,edges:n,defaultNodes:r,defaultEdges:o,width:i,height:s,fitView:l,fitViewOptions:a,minZoom:u,maxZoom:p,nodeOrigin:c,nodeExtent:d,zIndexMode:x}){return z.useContext(Js)?f.jsx(f.Fragment,{children:e}):f.jsx(bE,{initialNodes:t,initialEdges:n,defaultNodes:r,defaultEdges:o,initialWidth:i,initialHeight:s,fitView:l,initialFitViewOptions:a,initialMinZoom:u,initialMaxZoom:p,nodeOrigin:c,nodeExtent:d,zIndexMode:x,children:e})}const jE={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function ME({nodes:e,edges:t,defaultNodes:n,defaultEdges:r,className:o,nodeTypes:i,edgeTypes:s,onNodeClick:l,onEdgeClick:a,onInit:u,onMove:p,onMoveStart:c,onMoveEnd:d,onConnect:x,onConnectStart:y,onConnectEnd:w,onClickConnectStart:k,onClickConnectEnd:m,onNodeMouseEnter:g,onNodeMouseMove:h,onNodeMouseLeave:v,onNodeContextMenu:_,onNodeDoubleClick:S,onNodeDragStart:E,onNodeDrag:b,onNodeDragStop:A,onNodesDelete:D,onEdgesDelete:T,onDelete:I,onSelectionChange:P,onSelectionDragStart:C,onSelectionDrag:L,onSelectionDragStop:M,onSelectionContextMenu:R,onSelectionStart:N,onSelectionEnd:j,onBeforeDelete:$,connectionMode:O,connectionLineType:B=Zt.Bezier,connectionLineStyle:W,connectionLineComponent:V,connectionLineContainerStyle:Y,deleteKeyCode:X="Backspace",selectionKeyCode:Q="Shift",selectionOnDrag:H=!1,selectionMode:K=Io.Full,panActivationKeyCode:ee="Space",multiSelectionKeyCode:G=Lo()?"Meta":"Control",zoomActivationKeyCode:J=Lo()?"Meta":"Control",snapToGrid:Z,snapGrid:re,onlyRenderVisibleElements:le=!1,selectNodesOnDrag:ie,nodesDraggable:je,autoPanOnNodeFocus:Vt,nodesConnectable:jt,nodesFocusable:gn,nodeOrigin:Mr=M0,edgesFocusable:zr,edgesReconnectable:Pr,elementsSelectable:rl=!0,defaultViewport:Ko=r_,minZoom:On=.5,maxZoom:Tr=2,translateExtent:kc=To,preventScrolling:um=!0,nodeExtent:ol,defaultMarkerColor:cm="#b1b1b7",zoomOnScroll:dm=!0,zoomOnPinch:fm=!0,panOnScroll:pm=!1,panOnScrollSpeed:hm=.5,panOnScrollMode:gm=bn.Free,zoomOnDoubleClick:mm=!0,panOnDrag:ym=!0,onPaneClick:xm,onPaneMouseEnter:vm,onPaneMouseMove:wm,onPaneMouseLeave:Sm,onPaneScroll:km,onPaneContextMenu:_m,paneClickDistance:Em=1,nodeClickDistance:Cm=0,children:bm,onReconnect:Nm,onReconnectStart:jm,onReconnectEnd:Mm,onEdgeContextMenu:zm,onEdgeDoubleClick:Pm,onEdgeMouseEnter:Tm,onEdgeMouseMove:Im,onEdgeMouseLeave:Rm,reconnectRadius:Lm=10,onNodesChange:Am,onEdgesChange:$m,noDragClassName:Dm="nodrag",noWheelClassName:Om="nowheel",noPanClassName:_c="nopan",fitView:Ec,fitViewOptions:Cc,connectOnClick:Bm,attributionPosition:Fm,proOptions:Hm,defaultEdgeOptions:Vm,elevateNodesOnSelect:Wm=!0,elevateEdgesOnSelect:Um=!1,disableKeyboardA11y:bc=!1,autoPanOnConnect:Ym,autoPanOnNodeDrag:Xm,autoPanSpeed:Qm,connectionRadius:Gm,isValidConnection:Km,onError:Zm,style:qm,id:Nc,nodeDragThreshold:Jm,connectionDragThreshold:ey,viewport:ty,onViewportChange:ny,width:ry,height:oy,colorMode:iy="light",debug:sy,onScroll:Zo,ariaLabelConfig:ly,zIndexMode:jc="basic",...ay},uy){const il=Nc||"1",cy=l_(iy),dy=z.useCallback(Mc=>{Mc.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),Zo==null||Zo(Mc)},[Zo]);return f.jsx("div",{"data-testid":"rf__wrapper",...ay,onScroll:dy,style:{...qm,...jE},ref:uy,className:we(["react-flow",o,cy]),id:Nc,role:"application",children:f.jsxs(NE,{nodes:e,edges:t,width:ry,height:oy,fitView:Ec,fitViewOptions:Cc,minZoom:On,maxZoom:Tr,nodeOrigin:Mr,nodeExtent:ol,zIndexMode:jc,children:[f.jsx(EE,{onInit:u,onNodeClick:l,onEdgeClick:a,onNodeMouseEnter:g,onNodeMouseMove:h,onNodeMouseLeave:v,onNodeContextMenu:_,onNodeDoubleClick:S,nodeTypes:i,edgeTypes:s,connectionLineType:B,connectionLineStyle:W,connectionLineComponent:V,connectionLineContainerStyle:Y,selectionKeyCode:Q,selectionOnDrag:H,selectionMode:K,deleteKeyCode:X,multiSelectionKeyCode:G,panActivationKeyCode:ee,zoomActivationKeyCode:J,onlyRenderVisibleElements:le,defaultViewport:Ko,translateExtent:kc,minZoom:On,maxZoom:Tr,preventScrolling:um,zoomOnScroll:dm,zoomOnPinch:fm,zoomOnDoubleClick:mm,panOnScroll:pm,panOnScrollSpeed:hm,panOnScrollMode:gm,panOnDrag:ym,onPaneClick:xm,onPaneMouseEnter:vm,onPaneMouseMove:wm,onPaneMouseLeave:Sm,onPaneScroll:km,onPaneContextMenu:_m,paneClickDistance:Em,nodeClickDistance:Cm,onSelectionContextMenu:R,onSelectionStart:N,onSelectionEnd:j,onReconnect:Nm,onReconnectStart:jm,onReconnectEnd:Mm,onEdgeContextMenu:zm,onEdgeDoubleClick:Pm,onEdgeMouseEnter:Tm,onEdgeMouseMove:Im,onEdgeMouseLeave:Rm,reconnectRadius:Lm,defaultMarkerColor:cm,noDragClassName:Dm,noWheelClassName:Om,noPanClassName:_c,rfId:il,disableKeyboardA11y:bc,nodeExtent:ol,viewport:ty,onViewportChange:ny}),f.jsx(s_,{nodes:e,edges:t,defaultNodes:n,defaultEdges:r,onConnect:x,onConnectStart:y,onConnectEnd:w,onClickConnectStart:k,onClickConnectEnd:m,nodesDraggable:je,autoPanOnNodeFocus:Vt,nodesConnectable:jt,nodesFocusable:gn,edgesFocusable:zr,edgesReconnectable:Pr,elementsSelectable:rl,elevateNodesOnSelect:Wm,elevateEdgesOnSelect:Um,minZoom:On,maxZoom:Tr,nodeExtent:ol,onNodesChange:Am,onEdgesChange:$m,snapToGrid:Z,snapGrid:re,connectionMode:O,translateExtent:kc,connectOnClick:Bm,defaultEdgeOptions:Vm,fitView:Ec,fitViewOptions:Cc,onNodesDelete:D,onEdgesDelete:T,onDelete:I,onNodeDragStart:E,onNodeDrag:b,onNodeDragStop:A,onSelectionDrag:L,onSelectionDragStart:C,onSelectionDragStop:M,onMove:p,onMoveStart:c,onMoveEnd:d,noPanClassName:_c,nodeOrigin:Mr,rfId:il,autoPanOnConnect:Ym,autoPanOnNodeDrag:Xm,autoPanSpeed:Qm,onError:Zm,connectionRadius:Gm,isValidConnection:Km,selectNodesOnDrag:ie,nodeDragThreshold:Jm,connectionDragThreshold:ey,onBeforeDelete:$,debug:sy,ariaLabelConfig:ly,zIndexMode:jc}),f.jsx(n_,{onSelectionChange:P}),bm,f.jsx(Zk,{proOptions:Hm,position:Fm}),f.jsx(Kk,{rfId:il,disableKeyboardA11y:bc})]})})}var zE=I0(ME);function PE(e){const[t,n]=z.useState(e),r=z.useCallback(o=>n(i=>P0(o,i)),[]);return[t,n,r]}function TE(e){const[t,n]=z.useState(e),r=z.useCallback(o=>n(i=>T0(o,i)),[]);return[t,n,r]}function IE({dimensions:e,lineWidth:t,variant:n,className:r}){return f.jsx("path",{strokeWidth:t,d:`M${e[0]/2} 0 V${e[1]} M0 ${e[1]/2} H${e[0]}`,className:we(["react-flow__background-pattern",n,r])})}function RE({radius:e,className:t}){return f.jsx("circle",{cx:e,cy:e,r:e,className:we(["react-flow__background-pattern","dots",t])})}var un;(function(e){e.Lines="lines",e.Dots="dots",e.Cross="cross"})(un||(un={}));const LE={[un.Dots]:1,[un.Lines]:1,[un.Cross]:6},AE=e=>({transform:e.transform,patternId:`pattern-${e.rfId}`});function rm({id:e,variant:t=un.Dots,gap:n=20,size:r,lineWidth:o=1,offset:i=0,color:s,bgColor:l,style:a,className:u,patternClassName:p}){const c=z.useRef(null),{transform:d,patternId:x}=ne(AE,fe),y=r||LE[t],w=t===un.Dots,k=t===un.Cross,m=Array.isArray(n)?n:[n,n],g=[m[0]*d[2]||1,m[1]*d[2]||1],h=y*d[2],v=Array.isArray(i)?i:[i,i],_=k?[h,h]:g,S=[v[0]*d[2]||1+_[0]/2,v[1]*d[2]||1+_[1]/2],E=`${x}${e||""}`;return f.jsxs("svg",{className:we(["react-flow__background",u]),style:{...a,...tl,"--xy-background-color-props":l,"--xy-background-pattern-color-props":s},ref:c,"data-testid":"rf__background",children:[f.jsx("pattern",{id:E,x:d[0]%g[0],y:d[1]%g[1],width:g[0],height:g[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${S[0]},-${S[1]})`,children:w?f.jsx(RE,{radius:h/2,className:p}):f.jsx(IE,{dimensions:_,lineWidth:o,variant:t,className:p})}),f.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${E})`})]})}rm.displayName="Background";const $E=z.memo(rm);function DE(){return f.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:f.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function OE(){return f.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:f.jsx("path",{d:"M0 0h32v4.2H0z"})})}function BE(){return f.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:f.jsx("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"})})}function FE(){return f.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:f.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"})})}function HE(){return f.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:f.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z"})})}function _i({children:e,className:t,...n}){return f.jsx("button",{type:"button",className:we(["react-flow__controls-button",t]),...n,children:e})}const VE=e=>({isInteractive:e.nodesDraggable||e.nodesConnectable||e.elementsSelectable,minZoomReached:e.transform[2]<=e.minZoom,maxZoomReached:e.transform[2]>=e.maxZoom,ariaLabelConfig:e.ariaLabelConfig});function om({style:e,showZoom:t=!0,showFitView:n=!0,showInteractive:r=!0,fitViewOptions:o,onZoomIn:i,onZoomOut:s,onFitView:l,onInteractiveChange:a,className:u,children:p,position:c="bottom-left",orientation:d="vertical","aria-label":x}){const y=pe(),{isInteractive:w,minZoomReached:k,maxZoomReached:m,ariaLabelConfig:g}=ne(VE,fe),{zoomIn:h,zoomOut:v,fitView:_}=xc(),S=()=>{h(),i==null||i()},E=()=>{v(),s==null||s()},b=()=>{_(o),l==null||l()},A=()=>{y.setState({nodesDraggable:!w,nodesConnectable:!w,elementsSelectable:!w}),a==null||a(!w)},D=d==="horizontal"?"horizontal":"vertical";return f.jsxs(el,{className:we(["react-flow__controls",D,u]),position:c,style:e,"data-testid":"rf__controls","aria-label":x??g["controls.ariaLabel"],children:[t&&f.jsxs(f.Fragment,{children:[f.jsx(_i,{onClick:S,className:"react-flow__controls-zoomin",title:g["controls.zoomIn.ariaLabel"],"aria-label":g["controls.zoomIn.ariaLabel"],disabled:m,children:f.jsx(DE,{})}),f.jsx(_i,{onClick:E,className:"react-flow__controls-zoomout",title:g["controls.zoomOut.ariaLabel"],"aria-label":g["controls.zoomOut.ariaLabel"],disabled:k,children:f.jsx(OE,{})})]}),n&&f.jsx(_i,{className:"react-flow__controls-fitview",onClick:b,title:g["controls.fitView.ariaLabel"],"aria-label":g["controls.fitView.ariaLabel"],children:f.jsx(BE,{})}),r&&f.jsx(_i,{className:"react-flow__controls-interactive",onClick:A,title:g["controls.interactive.ariaLabel"],"aria-label":g["controls.interactive.ariaLabel"],children:w?f.jsx(HE,{}):f.jsx(FE,{})}),p]})}om.displayName="Controls";const WE=z.memo(om);function UE({id:e,x:t,y:n,width:r,height:o,style:i,color:s,strokeColor:l,strokeWidth:a,className:u,borderRadius:p,shapeRendering:c,selected:d,onClick:x}){const{background:y,backgroundColor:w}=i||{},k=s||y||w;return f.jsx("rect",{className:we(["react-flow__minimap-node",{selected:d},u]),x:t,y:n,rx:p,ry:p,width:r,height:o,style:{fill:k,stroke:l,strokeWidth:a},shapeRendering:c,onClick:x?m=>x(m,e):void 0})}const YE=z.memo(UE),XE=e=>e.nodes.map(t=>t.id),Fl=e=>e instanceof Function?e:()=>e;function QE({nodeStrokeColor:e,nodeColor:t,nodeClassName:n="",nodeBorderRadius:r=5,nodeStrokeWidth:o,nodeComponent:i=YE,onClick:s}){const l=ne(XE,fe),a=Fl(t),u=Fl(e),p=Fl(n),c=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";return f.jsx(f.Fragment,{children:l.map(d=>f.jsx(KE,{id:d,nodeColorFunc:a,nodeStrokeColorFunc:u,nodeClassNameFunc:p,nodeBorderRadius:r,nodeStrokeWidth:o,NodeComponent:i,onClick:s,shapeRendering:c},d))})}function GE({id:e,nodeColorFunc:t,nodeStrokeColorFunc:n,nodeClassNameFunc:r,nodeBorderRadius:o,nodeStrokeWidth:i,shapeRendering:s,NodeComponent:l,onClick:a}){const{node:u,x:p,y:c,width:d,height:x}=ne(y=>{const w=y.nodeLookup.get(e);if(!w)return{node:void 0,x:0,y:0,width:0,height:0};const k=w.internals.userNode,{x:m,y:g}=w.internals.positionAbsolute,{width:h,height:v}=Ht(k);return{node:k,x:m,y:g,width:h,height:v}},fe);return!u||u.hidden||!t0(u)?null:f.jsx(l,{x:p,y:c,width:d,height:x,style:u.style,selected:!!u.selected,className:r(u),color:t(u),borderRadius:o,strokeColor:n(u),strokeWidth:i,shapeRendering:s,onClick:a,id:u.id})}const KE=z.memo(GE);var ZE=z.memo(QE);const qE=200,JE=150,eC=e=>!e.hidden,tC=e=>{const t={x:-e.transform[0]/e.transform[2],y:-e.transform[1]/e.transform[2],width:e.width/e.transform[2],height:e.height/e.transform[2]};return{viewBB:t,boundingRect:e.nodeLookup.size>0?e0(Yo(e.nodeLookup,{filter:eC}),t):t,rfId:e.rfId,panZoom:e.panZoom,translateExtent:e.translateExtent,flowWidth:e.width,flowHeight:e.height,ariaLabelConfig:e.ariaLabelConfig}},nC="react-flow__minimap-desc";function im({style:e,className:t,nodeStrokeColor:n,nodeColor:r,nodeClassName:o="",nodeBorderRadius:i=5,nodeStrokeWidth:s,nodeComponent:l,bgColor:a,maskColor:u,maskStrokeColor:p,maskStrokeWidth:c,position:d="bottom-right",onClick:x,onNodeClick:y,pannable:w=!1,zoomable:k=!1,ariaLabel:m,inversePan:g,zoomStep:h=1,offsetScale:v=5}){const _=pe(),S=z.useRef(null),{boundingRect:E,viewBB:b,rfId:A,panZoom:D,translateExtent:T,flowWidth:I,flowHeight:P,ariaLabelConfig:C}=ne(tC,fe),L=(e==null?void 0:e.width)??qE,M=(e==null?void 0:e.height)??JE,R=E.width/L,N=E.height/M,j=Math.max(R,N),$=j*L,O=j*M,B=v*j,W=E.x-($-E.width)/2-B,V=E.y-(O-E.height)/2-B,Y=$+B*2,X=O+B*2,Q=`${nC}-${A}`,H=z.useRef(0),K=z.useRef();H.current=j,z.useEffect(()=>{if(S.current&&D)return K.current=tk({domNode:S.current,panZoom:D,getTransform:()=>_.getState().transform,getViewScale:()=>H.current}),()=>{var Z;(Z=K.current)==null||Z.destroy()}},[D]),z.useEffect(()=>{var Z;(Z=K.current)==null||Z.update({translateExtent:T,width:I,height:P,inversePan:g,pannable:w,zoomStep:h,zoomable:k})},[w,k,g,h,T,I,P]);const ee=x?Z=>{var ie;const[re,le]=((ie=K.current)==null?void 0:ie.pointer(Z))||[0,0];x(Z,{x:re,y:le})}:void 0,G=y?z.useCallback((Z,re)=>{const le=_.getState().nodeLookup.get(re).internals.userNode;y(Z,le)},[]):void 0,J=m??C["minimap.ariaLabel"];return f.jsx(el,{position:d,style:{...e,"--xy-minimap-background-color-props":typeof a=="string"?a:void 0,"--xy-minimap-mask-background-color-props":typeof u=="string"?u:void 0,"--xy-minimap-mask-stroke-color-props":typeof p=="string"?p:void 0,"--xy-minimap-mask-stroke-width-props":typeof c=="number"?c*j:void 0,"--xy-minimap-node-background-color-props":typeof r=="string"?r:void 0,"--xy-minimap-node-stroke-color-props":typeof n=="string"?n:void 0,"--xy-minimap-node-stroke-width-props":typeof s=="number"?s:void 0},className:we(["react-flow__minimap",t]),"data-testid":"rf__minimap",children:f.jsxs("svg",{width:L,height:M,viewBox:`${W} ${V} ${Y} ${X}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":Q,ref:S,onClick:ee,children:[J&&f.jsx("title",{id:Q,children:J}),f.jsx(ZE,{onClick:G,nodeColor:r,nodeStrokeColor:n,nodeBorderRadius:i,nodeClassName:o,nodeStrokeWidth:s,nodeComponent:l}),f.jsx("path",{className:"react-flow__minimap-mask",d:`M${W-B},${V-B}h${Y+B*2}v${X+B*2}h${-Y-B*2}z + M${b.x},${b.y}h${b.width}v${b.height}h${-b.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}im.displayName="MiniMap";z.memo(im);const rC=e=>t=>e?`${Math.max(1/t.transform[2],1)}`:void 0,oC={[An.Line]:"right",[An.Handle]:"bottom-right"};function iC({nodeId:e,position:t,variant:n=An.Handle,className:r,style:o=void 0,children:i,color:s,minWidth:l=10,minHeight:a=10,maxWidth:u=Number.MAX_VALUE,maxHeight:p=Number.MAX_VALUE,keepAspectRatio:c=!1,resizeDirection:d,autoScale:x=!0,shouldResize:y,onResizeStart:w,onResize:k,onResizeEnd:m}){const g=$0(),h=typeof e=="string"?e:g,v=pe(),_=z.useRef(null),S=n===An.Handle,E=ne(z.useCallback(rC(S&&x),[S,x]),fe),b=z.useRef(null),A=t??oC[n];z.useEffect(()=>{if(!(!_.current||!h))return b.current||(b.current=yk({domNode:_.current,nodeId:h,getStoreItems:()=>{const{nodeLookup:T,transform:I,snapGrid:P,snapToGrid:C,nodeOrigin:L,domNode:M}=v.getState();return{nodeLookup:T,transform:I,snapGrid:P,snapToGrid:C,nodeOrigin:L,paneDomNode:M}},onChange:(T,I)=>{const{triggerNodeChanges:P,nodeLookup:C,parentLookup:L,nodeOrigin:M}=v.getState(),R=[],N={x:T.x,y:T.y},j=C.get(h);if(j&&j.expandParent&&j.parentId){const $=j.origin??M,O=T.width??j.measured.width??0,B=T.height??j.measured.height??0,W={id:j.id,parentId:j.parentId,rect:{width:O,height:B,...n0({x:T.x??j.position.x,y:T.y??j.position.y},{width:O,height:B},j.parentId,C,$)}},V=yc([W],C,L,M);R.push(...V),N.x=T.x?Math.max($[0]*O,T.x):void 0,N.y=T.y?Math.max($[1]*B,T.y):void 0}if(N.x!==void 0&&N.y!==void 0){const $={id:h,type:"position",position:{...N}};R.push($)}if(T.width!==void 0&&T.height!==void 0){const O={id:h,type:"dimensions",resizing:!0,setAttributes:d?d==="horizontal"?"width":"height":!0,dimensions:{width:T.width,height:T.height}};R.push(O)}for(const $ of I){const O={...$,type:"position"};R.push(O)}P(R)},onEnd:({width:T,height:I})=>{const P={id:h,type:"dimensions",resizing:!1,dimensions:{width:T,height:I}};v.getState().triggerNodeChanges([P])}})),b.current.update({controlPosition:A,boundaries:{minWidth:l,minHeight:a,maxWidth:u,maxHeight:p},keepAspectRatio:c,resizeDirection:d,onResizeStart:w,onResize:k,onResizeEnd:m,shouldResize:y}),()=>{var T;(T=b.current)==null||T.destroy()}},[A,l,a,u,p,c,w,k,m,y]);const D=A.split("-");return f.jsx("div",{className:we(["react-flow__resize-control","nodrag",...D,n,r]),ref:_,style:{...o,scale:E,...s&&{[S?"backgroundColor":"borderColor"]:s}},children:i})}const Hf=z.memo(iC);function sC({nodeId:e,isVisible:t=!0,handleClassName:n,handleStyle:r,lineClassName:o,lineStyle:i,color:s,minWidth:l=10,minHeight:a=10,maxWidth:u=Number.MAX_VALUE,maxHeight:p=Number.MAX_VALUE,keepAspectRatio:c=!1,autoScale:d=!0,shouldResize:x,onResizeStart:y,onResize:w,onResizeEnd:k}){return t?f.jsxs(f.Fragment,{children:[dk.map(m=>f.jsx(Hf,{className:o,style:i,nodeId:e,position:m,variant:An.Line,color:s,minWidth:l,minHeight:a,maxWidth:u,maxHeight:p,onResizeStart:y,keepAspectRatio:c,autoScale:d,shouldResize:x,onResize:w,onResizeEnd:k},m)),ck.map(m=>f.jsx(Hf,{className:n,style:r,nodeId:e,position:m,color:s,minWidth:l,minHeight:a,maxWidth:u,maxHeight:p,onResizeStart:y,keepAspectRatio:c,autoScale:d,shouldResize:x,onResize:w,onResizeEnd:k},m))]}):null}const ou={compute:"#10b981",database:"#8b5cf6",storage:"#6366f1",network:"#3b82f6",security:"#ef4444",serverless:"#f59e0b",cache:"#8b5cf6",queue:"#f97316",cdn:"#3b82f6",monitoring:"#06b6d4",ml:"#ec4899",analytics:"#a855f7",containers:"#14b8a6",streaming:"#f97316",orchestration:"#a78bfa"},lC={ec2:"compute",ecs:"compute",eks:"compute",emr:"compute",fargate:"compute",codepipeline:"compute",codecommit:"storage",codebuild:"compute",dms:"compute",migration_hub:"compute",compute_engine:"compute",gke:"containers",app_engine:"serverless",cloud_build:"compute",virtual_machines:"compute",aks:"containers",container_apps:"containers",azure_devops:"compute",azure_migrate:"compute",rds:"database",aurora:"database",dynamodb:"database",cloud_sql:"database",azure_sql:"database",cosmos_db:"database",redshift:"database",bigquery:"database",firestore:"database",spanner:"database",alloydb:"database",s3:"storage",cloud_storage:"storage",blob_storage:"storage",ebs:"storage",ecr:"storage",fsx:"storage",efs:"storage",artifact_registry:"storage",alb:"network",nlb:"network",route53:"network",cloud_load_balancing:"network",app_gateway:"network",cloud_dns:"network",direct_connect:"network",vpn:"network",azure_lb:"network",azure_dns:"network",cloud_interconnect:"network",api_management:"network",cloudfront:"cdn",cloud_cdn:"cdn",azure_cdn:"cdn",waf:"security",cognito:"security",kms:"security",cloudtrail:"security",guardduty:"security",shield:"security",security_hub:"security",config:"security",inspector:"security",cloud_armor:"security",firebase_auth:"security",azure_waf:"security",azure_ad:"security",azure_firewall:"security",azure_sentinel:"security",azure_policy:"security",lambda:"serverless",api_gateway:"serverless",cloud_functions:"serverless",cloud_run:"serverless",azure_functions:"serverless",step_functions:"serverless",glue:"serverless",app_service:"serverless",elasticache:"cache",memorystore:"cache",azure_cache:"cache",sqs:"queue",sns:"queue",pub_sub:"queue",service_bus:"queue",kinesis:"queue",eventbridge:"queue",cloudwatch:"monitoring",cloud_logging:"monitoring",azure_monitor:"monitoring",sagemaker:"ml",vertex_ai:"ml",azure_ml:"ml",athena:"analytics",dataproc:"analytics",data_factory:"analytics",synapse:"analytics",dataflow:"streaming",event_hubs:"streaming",cloud_composer:"orchestration",logic_apps:"orchestration",databricks_sql_warehouse:"analytics",databricks_cluster:"compute",databricks_job:"orchestration",databricks_pipeline:"streaming",databricks_model_serving:"ml",databricks_unity_catalog:"security",databricks_vector_search:"database",databricks_genie:"analytics",databricks_notebook:"compute",databricks_secret_scope:"security",databricks_dashboard:"analytics",databricks_volume:"storage"},Vf={compute:"M5 12H3l9-9 9 9h-2M5 12v7a2 2 0 002 2h10a2 2 0 002-2v-7",database:"M12 2C6.48 2 2 4.24 2 7v10c0 2.76 4.48 5 10 5s10-2.24 10-5V7c0-2.76-4.48-5-10-5zM2 12c0 2.76 4.48 5 10 5s10-2.24 10-5",storage:"M20 7H4a1 1 0 00-1 1v8a1 1 0 001 1h16a1 1 0 001-1V8a1 1 0 00-1-1zM4 12h16",network:"M12 2a10 10 0 100 20 10 10 0 000-20zm0 0a14.5 14.5 0 014 10 14.5 14.5 0 01-4 10 14.5 14.5 0 01-4-10A14.5 14.5 0 0112 2zM2 12h20",security:"M12 2l7 4v5c0 5.25-3.5 10.74-7 12-3.5-1.26-7-6.75-7-12V6l7-4z",serverless:"M13 2L3 14h9l-1 8 10-12h-9l1-8z",cache:"M4 4h16v4H4zM4 10h16v4H4zM4 16h16v4H4z",queue:"M4 6h16M4 12h16M4 18h16",cdn:"M12 2a10 10 0 100 20 10 10 0 000-20zm-1 17.93A8 8 0 013 12a8 8 0 018-7.93M12 2v20M2 12h20M4.22 7h15.56M4.22 17h15.56",monitoring:"M3 3v18h18M7 16l4-8 4 4 4-6",ml:"M12 2a4 4 0 014 4c0 1.95-1.4 3.57-3.24 3.9L12 14l-.76-4.1A4 4 0 018 6a4 4 0 014-4zM8 14h8M6 18h12M9 22h6",analytics:"M18 20V10M12 20V4M6 20v-6",containers:"M21 16V8a2 2 0 00-1-1.73l-7-4a2 2 0 00-2 0l-7 4A2 2 0 003 8v8a2 2 0 001 1.73l7 4a2 2 0 002 0l7-4A2 2 0 0021 16zM3.27 6.96L12 12l8.73-5.04M12 22.08V12",streaming:"M2 12c2-3 4-3 6 0s4 3 6 0 4-3 6 0 4 3 6 0",orchestration:"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83"};function wc(e){return lC[e]||"compute"}function sm(e){return ou[e]||"#94a3b8"}function Sc(e){return Vf[e]||Vf.compute}function aC({data:e}){const t=e,n=wc(t.service),r=sm(n),o=Sc(n);return f.jsxs("div",{style:{background:"#ffffff",border:`2px solid ${r}`,borderRadius:10,padding:"8px 12px",color:"#0f172a",minWidth:160,position:"relative",boxShadow:"0 1px 3px rgba(0,0,0,0.08)"},children:[f.jsx(Cr,{type:"target",position:q.Top,style:{background:r}}),f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,marginBottom:4},children:[f.jsx("svg",{width:16,height:16,viewBox:"0 0 24 24",fill:"none",stroke:r,strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block",width:28,height:28,padding:5,borderRadius:6,background:`${r}22`},children:f.jsx("path",{d:o})}),f.jsx("span",{style:{fontSize:9,color:"#64748b",textTransform:"uppercase",letterSpacing:1},children:n})]}),f.jsx("div",{style:{fontWeight:600,fontSize:13,marginBottom:2,color:"#0f172a"},children:t.label}),f.jsxs("div",{style:{fontSize:11,color:"#64748b"},children:[t.service,f.jsx("span",{style:{marginLeft:6,padding:"1px 4px",borderRadius:3,background:"#e2e8f0",color:"#475569",fontSize:9,textTransform:"uppercase"},children:t.provider})]}),t.monthlyCost!=null&&t.monthlyCost>0&&f.jsxs("div",{style:{fontSize:10,color:"#2563eb",marginTop:4},children:["$",t.monthlyCost.toFixed(0),"/mo"]}),f.jsx(Cr,{type:"source",position:q.Bottom,style:{background:r}})]})}const uC=z.memo(aC);function cC({data:e,selected:t}){return f.jsxs(f.Fragment,{children:[f.jsx(sC,{color:e.dotColor,isVisible:t??!1,minWidth:200,minHeight:100,lineStyle:{borderWidth:1.5},handleStyle:{width:8,height:8,borderRadius:2}}),f.jsxs("div",{style:{position:"absolute",top:6,left:8,display:"inline-flex",alignItems:"center",gap:5,padding:"3px 10px 3px 7px",borderRadius:5,background:e.labelBg,border:`1px solid ${e.dotColor}30`,boxShadow:"0 1px 2px rgba(0,0,0,0.04)",pointerEvents:"none"},children:[f.jsx("span",{style:{width:7,height:7,borderRadius:"50%",background:e.dotColor,flexShrink:0}}),f.jsx("span",{style:{color:e.labelColor,fontSize:11,fontWeight:600,letterSpacing:"0.02em",whiteSpace:"nowrap",lineHeight:1},children:e.label})]})]})}function dC({components:e}){const[t,n]=z.useState(!1),r=z.useMemo(()=>{if(!e||e.length===0)return Object.keys(ou).map(i=>({category:i,count:0}));const o={};for(const i of e){const s=wc(i.service);o[s]=(o[s]||0)+1}return Object.entries(o).sort(([,i],[,s])=>s-i).map(([i,s])=>({category:i,count:s}))},[e]);return f.jsxs("div",{style:{position:"absolute",bottom:16,left:16,zIndex:10,background:"#ffffff",border:"1px solid #e2e8f0",borderRadius:8,padding:"8px 12px",fontSize:11,color:"#64748b",boxShadow:"0 1px 4px rgba(0,0,0,0.08)",maxHeight:t?"auto":260,overflowY:t?"visible":"auto"},children:[f.jsxs("div",{onClick:()=>n(o=>!o),style:{fontWeight:600,marginBottom:t?0:4,color:"#0f172a",cursor:"pointer",userSelect:"none",display:"flex",alignItems:"center",justifyContent:"space-between",gap:8},children:["Legend",f.jsx("span",{style:{fontSize:10,color:"#94a3b8"},children:t?"+":"-"})]}),!t&&r.map(({category:o,count:i})=>{const s=ou[o]||"#94a3b8",l=Sc(o);return f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,marginBottom:2},children:[f.jsx("svg",{width:12,height:12,viewBox:"0 0 24 24",fill:"none",stroke:s,strokeWidth:2.5,strokeLinecap:"round",strokeLinejoin:"round",style:{flexShrink:0},children:f.jsx("path",{d:l})}),f.jsx("span",{style:{textTransform:"capitalize"},children:o}),i>0&&f.jsxs("span",{style:{color:"#94a3b8",fontSize:10},children:["(",i,")"]})]},o)})]})}function fC({onExportSvg:e,onExportPng:t,showBoundaries:n,onToggleBoundaries:r}){const o={padding:"4px 10px",borderRadius:4,border:"1px solid #e2e8f0",background:"#ffffff",color:"#475569",cursor:"pointer",fontSize:11};return f.jsxs("div",{style:{position:"absolute",top:16,right:16,zIndex:10,display:"flex",gap:4,background:"#ffffff",padding:4,border:"1px solid #e2e8f0",borderRadius:8,boxShadow:"0 1px 4px rgba(0,0,0,0.08)"},children:[e&&f.jsx("button",{style:o,onClick:e,children:"Export SVG"}),t&&f.jsx("button",{style:o,onClick:t,children:"Export PNG"}),f.jsxs("button",{style:{...o,background:n?"#f1f5f9":"#ffffff"},onClick:r,children:[n?"Hide":"Show"," Boundaries"]})]})}const Wf={borderTop:"1px solid #e2e8f0",margin:"12px 0"},Ei={fontSize:11,fontWeight:600,color:"#64748b",textTransform:"uppercase",letterSpacing:"0.05em",marginBottom:8},Hl={display:"block",fontSize:12,fontWeight:600,color:"#64748b",marginBottom:5},Vr={width:"100%",boxSizing:"border-box",border:"1px solid #cbd5e1",borderRadius:6,padding:"8px 10px",color:"#0f172a",fontSize:13,outline:"none",background:"#ffffff"},Vl={display:"flex",justifyContent:"space-between",alignItems:"center",gap:10,color:"#475569",fontSize:13,marginBottom:7};function lm(e){return typeof e=="boolean"?e?"true":"false":e==null?"":String(e)}function pC(e,t){return Object.entries(e??{}).filter(([n,r])=>r!=null&&n!=="tags").map(([n,r])=>`${n}=${lm(r)}`).join(` +`)}function hC(e){const t=e==null?void 0:e.tags;return!t||typeof t!="object"||Array.isArray(t)?"":Object.entries(t).map(([n,r])=>`${n}=${lm(r)}`).join(` +`)}function gC(e){const t=e.trim();return t==="true"?!0:t==="false"?!1:t!==""&&!Number.isNaN(Number(t))?Number(t):e}function Uf(e){const t={};for(const n of e.split(` +`)){const r=n.trim();if(!r)continue;const o=r.indexOf("=");if(o===-1){t[r]=!0;continue}const i=r.slice(0,o).trim();i&&(t[i]=gC(r.slice(o+1)))}return t}function mC({component:e,cost:t,onClose:n,onApply:r,onDelete:o}){var S;const i=e!==null,[s,l]=z.useState(""),[a,u]=z.useState(""),[p,c]=z.useState("2"),[d,x]=z.useState(""),[y,w]=z.useState("");z.useEffect(()=>{e&&(l(e.label),u(e.description??""),c(String(e.tier??2)),x(pC(e.config)),w(hC(e.config)))},[e]);const k=e?wc(e.service):"compute",m=sm(k),g=Sc(k),h=(t==null?void 0:t.monthly)??null,v=z.useMemo(()=>{const E=Number(p);return Number.isFinite(E)?E:2},[p]),_=()=>{if(!e)return;const E=Uf(d),b=Uf(y);Object.keys(b).length>0&&(E.tags=b),r({...e,label:s.trim()||e.label,description:a,tier:v,config:E})};return f.jsxs("div",{style:{position:"absolute",top:0,right:0,width:340,height:"100%",background:"#ffffff",borderLeft:"1px solid #e2e8f0",transform:i?"translateX(0)":"translateX(100%)",transition:"transform 0.2s ease",zIndex:20,display:"flex",flexDirection:"column",overflow:"hidden",boxShadow:"-2px 0 8px rgba(0,0,0,0.06)"},children:[f.jsxs("div",{style:{padding:"16px 16px 12px",borderBottom:"1px solid #e2e8f0"},children:[f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:8},children:[f.jsx("div",{style:{width:36,height:36,borderRadius:8,background:`${m}22`,border:`1.5px solid ${m}`,display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:f.jsx("svg",{width:20,height:20,viewBox:"0 0 24 24",fill:"none",stroke:m,strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block"},children:f.jsx("path",{d:g})})}),f.jsx("span",{style:{fontSize:16,fontWeight:700,color:"#0f172a",flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:(e==null?void 0:e.label)??"Resource"}),f.jsx("button",{onClick:n,style:{background:"none",border:"none",color:"#94a3b8",cursor:"pointer",fontSize:18,lineHeight:1,padding:"2px 4px",flexShrink:0},"aria-label":"Close panel",children:"x"})]}),f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[f.jsx("span",{style:{background:"#f1f5f9",color:"#475569",borderRadius:4,fontSize:11,fontWeight:600,padding:"2px 8px",textTransform:"uppercase"},children:e==null?void 0:e.provider}),f.jsx("span",{style:{color:"#64748b",fontSize:12},children:e==null?void 0:e.service})]})]}),f.jsxs("div",{style:{flex:1,overflowY:"auto",padding:"12px 16px"},children:[f.jsx("div",{style:Ei,children:"Overview"}),f.jsx("label",{style:Hl,htmlFor:"resource-label",children:"Label"}),f.jsx("input",{id:"resource-label","aria-label":"Label",value:s,onChange:E=>l(E.target.value),style:{...Vr,marginBottom:10}}),f.jsx("label",{style:Hl,htmlFor:"resource-description",children:"Description"}),f.jsx("textarea",{id:"resource-description","aria-label":"Description",value:a,onChange:E=>u(E.target.value),rows:3,style:{...Vr,marginBottom:10,resize:"vertical",minHeight:72}}),f.jsx("label",{style:Hl,htmlFor:"resource-tier",children:"Tier"}),f.jsx("input",{id:"resource-tier","aria-label":"Tier",type:"number",value:p,onChange:E=>c(E.target.value),style:{...Vr,marginBottom:10}}),f.jsxs("div",{style:Vl,children:[f.jsx("span",{children:"Service"}),f.jsx("strong",{style:{color:"#0f172a"},children:e==null?void 0:e.service})]}),f.jsxs("div",{style:Vl,children:[f.jsx("span",{children:"Provider"}),f.jsx("strong",{style:{color:"#0f172a"},children:(S=e==null?void 0:e.provider)==null?void 0:S.toUpperCase()})]}),f.jsx("div",{style:Wf}),f.jsx("div",{style:Ei,children:"Cost"}),h!==null?f.jsxs("div",{style:Vl,children:[f.jsx("span",{children:"Monthly"}),f.jsxs("strong",{style:{color:"#2563eb"},children:["$",h.toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:2})]})]}):f.jsx("p",{style:{color:"#94a3b8",fontSize:13},children:"No cost data"}),f.jsx("div",{style:Wf}),f.jsx("div",{style:Ei,children:"Configuration"}),f.jsx("textarea",{"aria-label":"Configuration",value:d,onChange:E=>x(E.target.value),rows:7,style:{...Vr,resize:"vertical",minHeight:140,fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace"}}),f.jsx("div",{style:{...Ei,marginTop:16},children:"Tags"}),f.jsx("textarea",{"aria-label":"Tags",value:y,onChange:E=>w(E.target.value),rows:5,style:{...Vr,resize:"vertical",minHeight:110,fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace"}})]}),f.jsxs("div",{style:{padding:12,borderTop:"1px solid #e2e8f0",display:"flex",gap:8},children:[f.jsx("button",{onClick:_,disabled:!e,style:{flex:1,border:"none",borderRadius:6,padding:"10px 12px",background:"#2563eb",color:"#ffffff",cursor:e?"pointer":"not-allowed",fontSize:14,fontWeight:700},children:"Apply"}),f.jsx("button",{onClick:()=>e&&o(e.id),disabled:!e,style:{border:"1px solid #fecaca",borderRadius:6,padding:"10px 12px",background:"#fef2f2",color:"#b91c1c",cursor:e?"pointer":"not-allowed",fontSize:14,fontWeight:700},children:"Delete"})]})]})}const Yf="/api",Wl={border:"1px solid #cbd5e1",background:"#ffffff",color:"#0f172a",borderRadius:6,padding:"7px 10px",cursor:"pointer",fontSize:12,fontWeight:600};function yC({provider:e,standardsResult:t,onAddResource:n,onAddModule:r,onCheckStandards:o}){const i=(e||"aws").toLowerCase(),[s,l]=z.useState(!0),[a,u]=z.useState("resources"),[p,c]=z.useState(""),[d,x]=z.useState([]),[y,w]=z.useState([]);z.useEffect(()=>{fetch(`${Yf}/catalog/services?provider=${encodeURIComponent(i)}`).then(g=>g.ok?g.json():null).then(g=>x((g==null?void 0:g.services)??[])).catch(()=>x([]))},[i]),z.useEffect(()=>{fetch(`${Yf}/modules`).then(g=>g.ok?g.json():null).then(g=>w((g==null?void 0:g.modules)??[])).catch(()=>w([]))},[]);const k=z.useMemo(()=>{const g=p.trim().toLowerCase();return g?d.filter(h=>[h.name,h.service_key,h.category,h.description??""].some(v=>v.toLowerCase().includes(g))):d},[d,p]),m=z.useMemo(()=>{const g=p.trim().toLowerCase(),h=y.filter(v=>v.provider.toLowerCase()===i);return g?h.filter(v=>[v.name,v.id,v.category,v.description??"",...v.tags??[]].some(_=>_.toLowerCase().includes(g))):h},[y,i,p]);return s?f.jsxs("div",{style:{position:"absolute",top:0,left:0,width:320,height:"100%",zIndex:14,background:"#ffffff",borderRight:"1px solid #e2e8f0",boxShadow:"2px 0 8px rgba(0,0,0,0.06)",display:"flex",flexDirection:"column"},children:[f.jsxs("div",{style:{padding:14,borderBottom:"1px solid #e2e8f0"},children:[f.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:10},children:[f.jsx("div",{style:{fontSize:15,fontWeight:700,color:"#0f172a"},children:"Catalog"}),f.jsx("button",{onClick:()=>l(!1),style:{border:"none",background:"transparent",color:"#64748b",cursor:"pointer",fontSize:18},"aria-label":"Close catalog",children:"x"})]}),f.jsx("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr 1fr",gap:4,marginBottom:10},children:["resources","modules","standards"].map(g=>f.jsx("button",{onClick:()=>u(g),style:{...Wl,padding:"6px 4px",borderColor:a===g?"#2563eb":"#cbd5e1",color:a===g?"#2563eb":"#475569",background:a===g?"#eff6ff":"#ffffff",textTransform:"capitalize"},children:g},g))}),a!=="standards"&&f.jsx("input",{value:p,onChange:g=>c(g.target.value),placeholder:"Search",style:{width:"100%",boxSizing:"border-box",border:"1px solid #cbd5e1",borderRadius:6,padding:"8px 10px",color:"#0f172a",fontSize:13,outline:"none"}})]}),f.jsxs("div",{style:{flex:1,overflowY:"auto",padding:12},children:[a==="resources"&&k.map(g=>f.jsxs("button",{onClick:()=>n(g),style:{width:"100%",textAlign:"left",border:"1px solid #e2e8f0",background:"#ffffff",borderRadius:8,padding:10,marginBottom:8,cursor:"pointer"},children:[f.jsxs("div",{style:{display:"flex",justifyContent:"space-between",gap:8},children:[f.jsx("span",{style:{color:"#0f172a",fontSize:13,fontWeight:700},children:g.name}),f.jsx("span",{style:{color:"#64748b",fontSize:10,textTransform:"uppercase"},children:g.category.replace(/_/g," ")})]}),f.jsx("div",{style:{color:"#64748b",fontSize:11,marginTop:4},children:g.service_key})]},`${g.provider}:${g.service_key}`)),a==="resources"&&k.length===0&&f.jsxs("p",{style:{color:"#64748b",fontSize:13},children:["No resources found for ",i.toUpperCase(),"."]}),a==="modules"&&m.map(g=>f.jsxs("button",{onClick:()=>r(g.id),style:{width:"100%",textAlign:"left",border:"1px solid #bfdbfe",background:"#eff6ff",borderRadius:8,padding:10,marginBottom:8,cursor:"pointer"},children:[f.jsx("div",{style:{color:"#0f172a",fontSize:13,fontWeight:700},children:g.name}),f.jsx("div",{style:{color:"#475569",fontSize:12,marginTop:4,lineHeight:1.35},children:g.description}),f.jsx("div",{style:{color:"#2563eb",fontSize:11,marginTop:6,textTransform:"uppercase"},children:g.category})]},g.id)),a==="modules"&&m.length===0&&f.jsxs("p",{style:{color:"#64748b",fontSize:13},children:["No approved modules found for ",i.toUpperCase(),"."]}),a==="standards"&&f.jsxs(f.Fragment,{children:[f.jsx("button",{onClick:o,style:{...Wl,width:"100%",marginBottom:12},children:"Check Standards"}),!t&&f.jsx("p",{style:{color:"#64748b",fontSize:13},children:"No standards check has run."}),(t==null?void 0:t.passed)&&f.jsx("div",{style:{color:"#166534",background:"#dcfce7",borderRadius:8,padding:10,fontSize:13},children:"Standards passed."}),t&&!t.passed&&f.jsx("div",{children:t.violations.map((g,h)=>f.jsxs("div",{style:{border:"1px solid #fecaca",background:"#fef2f2",borderRadius:8,padding:10,marginBottom:8},children:[f.jsx("div",{style:{color:"#991b1b",fontSize:12,fontWeight:700},children:g.code.replace(/_/g," ")}),f.jsx("div",{style:{color:"#7f1d1d",fontSize:12,marginTop:4,lineHeight:1.4},children:g.message})]},`${g.code}:${h}`))})]})]})]}):f.jsx("button",{onClick:()=>l(!0),style:{...Wl,position:"absolute",left:16,top:16,zIndex:15,boxShadow:"0 1px 4px rgba(0,0,0,0.08)"},children:"Add Resource"})}const Xf=200,Ci=90,Qf=300,xC=240,yt=32,vC=36,Wr=4,Ul="/api",wC={0:"Edge / CDN",1:"Network / Ingress",2:"Application",3:"Data Layer",4:"Platform Services",5:"Platform Services"},SC={0:"edge",1:"subnet",2:"subnet",3:"subnet"},Yl={0:{border:"#60a5fa",bg:"rgba(219, 234, 254, 0.18)",labelColor:"#1d4ed8",labelBg:"rgba(219, 234, 254, 0.92)",dot:"#3b82f6"},1:{border:"#34d399",bg:"rgba(209, 250, 229, 0.18)",labelColor:"#047857",labelBg:"rgba(209, 250, 229, 0.92)",dot:"#10b981"},2:{border:"#fb923c",bg:"rgba(255, 237, 213, 0.18)",labelColor:"#9a3412",labelBg:"rgba(255, 237, 213, 0.92)",dot:"#f97316"},3:{border:"#a78bfa",bg:"rgba(237, 233, 254, 0.18)",labelColor:"#5b21b6",labelBg:"rgba(237, 233, 254, 0.92)",dot:"#8b5cf6"},4:{border:"#2dd4bf",bg:"rgba(204, 251, 241, 0.18)",labelColor:"#0f766e",labelBg:"rgba(204, 251, 241, 0.92)",dot:"#14b8a6"},5:{border:"#2dd4bf",bg:"rgba(204, 251, 241, 0.18)",labelColor:"#0f766e",labelBg:"rgba(204, 251, 241, 0.92)",dot:"#14b8a6"}},Hn={border:"#94a3b8",bg:"rgba(241, 245, 249, 0.35)",labelColor:"#475569",labelBg:"rgba(241, 245, 249, 0.92)",dot:"#94a3b8"},kC={cloudService:uC,boundaryGroup:cC};function iu(e){return JSON.parse(JSON.stringify(e))}function bi(e){return iu(e??{})}function Ni(e,t="resource"){let n=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"_").replace(/^[_-]+|[_-]+$/g,"");return n||(n=t),/^[a-z_]/.test(n)||(n=`${t}_${n}`),n}function Xl(e,t){let n=e,r=2;for(;t.has(n);)n=`${e}-${r}`,r+=1;return t.add(n),n}function _C(e){const t=e.toLowerCase();return t.includes("cdn")||t.includes("edge")?0:t.includes("network")||t.includes("security")?1:t.includes("database")||t.includes("cache")?3:t.includes("storage")||t.includes("analytics")||t.includes("data")?4:2}function Gf(e){return{x:360+e%3*260,y:80+Math.floor(e/3)*150}}function EC(e,t){if(t==="vpc")return Hn;const n=e.match(/^tier-(\d+)$/);return n&&Yl[parseInt(n[1])]||Yl[2]}function CC(e){const t={};for(const i of e){const s=i.tier??2;t[s]||(t[s]=[]),t[s].push(i.id)}const n=Object.keys(t).map(Number).sort(),r=[];for(const i of n)r.push({id:`tier-${i}`,kind:SC[i]||"subnet",label:wC[i]||`Tier ${i}`,component_ids:t[i]});const o=r.filter(i=>i.id!=="tier-0").flatMap(i=>i.component_ids);return o.length>=2&&r.unshift({id:"vpc",kind:"vpc",label:"VPC / Virtual Network",component_ids:o}),r}function bC(e,t,n){var y,w,k,m;const r=[],o=e.boundaries||[],i=o.length>0?o:CC(e.components),s=((w=(y=e.metadata)==null?void 0:y.canvas)==null?void 0:w.nodes)??{},l={};if(t){for(const g of i)if(g.kind!=="vpc")for(const h of g.component_ids)l[h]||(l[h]=g.id)}const a={};for(const g of e.components){const h=g.tier??2;a[h]||(a[h]=[]),a[h].push(g)}const u=Object.keys(a).map(Number).sort(),p={};let c=40;const d={};for(const g of u){d[g]=c;const h=Math.ceil(a[g].length/Wr);c+=xC+(h-1)*(Ci+60)}for(const g of u){const h=a[g],v=d[g];for(let _=0;_0){const g=i.find(v=>v.kind==="vpc");let h;if(g&&g.component_ids.length>0){const v=g.component_ids.map(D=>{var T;return((T=p[D])==null?void 0:T.x)??0}),_=g.component_ids.map(D=>{var T;return((T=p[D])==null?void 0:T.y)??0}),S=Math.min(...v)-yt,E=Math.min(..._)-yt-24-vC,b=Math.max(...v)+Xf+yt,A=Math.max(..._)+Ci+yt;h=`boundary-${g.id}`,x[g.id]={x:S,y:E},r.push({id:h,type:"boundaryGroup",position:{x:S,y:E},data:{label:g.label||g.id,labelColor:Hn.labelColor,labelBg:Hn.labelBg,dotColor:Hn.dot},style:{background:Hn.bg,border:`2px dashed ${Hn.border}`,borderRadius:16,padding:yt,width:b-S,height:A-E},zIndex:-2})}for(const v of i){if(v.kind==="vpc"||v.component_ids.length===0)continue;const _=v.component_ids.map(P=>{var C;return((C=p[P])==null?void 0:C.x)??0}),S=v.component_ids.map(P=>{var C;return((C=p[P])==null?void 0:C.y)??0}),E=Math.min(..._)-yt,b=Math.min(...S)-yt-24,A=Math.max(..._)+Xf+yt,D=Math.max(...S)+Ci+yt;x[v.id]={x:E,y:b};const T=EC(v.id,v.kind),I=!!(h&&g&&v.component_ids.some(P=>g.component_ids.includes(P)));r.push({id:`boundary-${v.id}`,type:"boundaryGroup",position:I?{x:E-x[g.id].x,y:b-x[g.id].y}:{x:E,y:b},data:{label:v.label||v.id,labelColor:T.labelColor,labelBg:T.labelBg,dotColor:T.dot},style:{background:T.bg,border:`1.5px solid ${T.border}`,borderRadius:10,padding:yt,width:A-E,height:D-b},zIndex:-1,parentId:I?h:void 0})}}for(const g of u){const h=a[g];for(const v of h){const _=l[v.id],S=t&&_&&x[_];let E=((k=p[v.id])==null?void 0:k.x)??0,b=((m=p[v.id])==null?void 0:m.y)??0;S&&(E-=x[_].x,b-=x[_].y),r.push({id:v.id,type:"cloudService",position:{x:E,y:b},data:{label:v.label,service:v.service,provider:v.provider,description:v.description,tier:v.tier,config:v.config||{},monthlyCost:n[v.id]},parentId:S?`boundary-${_}`:void 0,extent:S?"parent":void 0})}}return r}function am(e,t){return`edge:${e.source}:${e.target}:${t}`}function Kf(e){return e.connections.map((t,n)=>{let r=t.label||"";return t.protocol&&!r.includes(t.protocol)&&(r=t.protocol+(t.port?`:${t.port}`:"")),{id:am(t,n),source:t.source,target:t.target,label:r,style:{stroke:"#94a3b8"},labelStyle:{fill:"#64748b",fontSize:11},animated:!0}})}function NC(e,t){return e&&e.map(n=>({...n,component_ids:n.component_ids.filter(r=>r!==t)}))}function jC({spec:e,onSpecChange:t}){const[n,r]=z.useState(!0),[o,i]=z.useState(null),[s,l]=z.useState(null),a=z.useCallback(P=>{l(null),t(P)},[t]),u=z.useCallback(async P=>{try{const C=await fetch(`${Ul}/export`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e,format:P})});if(!C.ok)return;const L=await C.blob(),M=URL.createObjectURL(L),R=document.createElement("a");R.href=M,R.download=`architecture.${P}`,R.click(),URL.revokeObjectURL(M)}catch{}},[e]),p=z.useMemo(()=>{var C;const P={};for(const L of((C=e.cost_estimate)==null?void 0:C.breakdown)??[])P[L.component_id]=L.monthly;return P},[e.cost_estimate]),c=z.useMemo(()=>o?e.components.find(P=>P.id===o)??null:null,[o,e.components]),d=z.useMemo(()=>{var P;return o?((P=e.cost_estimate)==null?void 0:P.breakdown.find(C=>C.component_id===o))??null:null},[o,e.cost_estimate]),[x,y,w]=PE([]),[k,m,g]=TE([]);z.useEffect(()=>{y(bC(e,n,p)),m(Kf(e))},[e,n,p,y,m]);const h=z.useCallback((P,C)=>{C.id.startsWith("boundary-")||i(C.id)},[]),v=z.useCallback(()=>{i(null)},[]),_=z.useCallback((P,C)=>{if(C.id.startsWith("boundary-"))return;const L=bi(e.metadata),M=L.canvas??{},R={...M.nodes??{}},N=x.find($=>$.id===C.parentId),j=N?{x:N.position.x+C.position.x,y:N.position.y+C.position.y}:{x:C.position.x,y:C.position.y};R[C.id]=j,L.canvas={...M,nodes:R},a({...e,metadata:L})},[a,x,e]),S=z.useCallback(P=>{!P.source||!P.target||P.source===P.target||e.connections.some(L=>L.source===P.source&&L.target===P.target)||a({...e,connections:[...e.connections,{source:P.source,target:P.target,label:"HTTPS",protocol:"HTTPS",port:443}]})},[a,e]),E=z.useCallback(P=>{if(P.length===0)return;if(!window.confirm(`Delete ${P.length===1?"this connection":"these connections"}?`)){m(Kf(e));return}const C=new Set(P.map(L=>L.id));a({...e,connections:e.connections.filter((L,M)=>!C.has(am(L,M)))})},[a,m,e]),b=z.useCallback(P=>{a({...e,components:e.components.map(C=>C.id===P.id?P:C)})},[a,e]),A=z.useCallback(P=>{var R,N;const C=e.components.find(j=>j.id===P);if(!C||!window.confirm(`Delete ${C.label||C.id} and its connections?`))return;const L=bi(e.metadata);(R=L.canvas)!=null&&R.nodes&&delete L.canvas.nodes[P];const M=((N=L.modules)==null?void 0:N.instances)??{};for(const j of Object.values(M))j.component_ids.includes(P)&&(j.component_ids=j.component_ids.filter($=>$!==P),j.partial=!0,j.approved=!1,delete j.terraform);L.modules&&(L.modules.instances=M),a({...e,components:e.components.filter(j=>j.id!==P),connections:e.connections.filter(j=>j.source!==P&&j.target!==P),boundaries:NC(e.boundaries,P),metadata:L}),i(null)},[a,e]),D=z.useCallback(P=>{const C=new Set(e.components.map($=>$.id)),L=Xl(Ni(P.service_key),C),M=bi(e.metadata),R=M.canvas??{},N={...R.nodes??{}};N[L]=Gf(Object.keys(N).length+e.components.length),M.canvas={...R,nodes:N};const j={id:L,service:P.service_key,provider:P.provider.toLowerCase(),label:P.name,description:P.description??"",tier:_C(P.category),config:iu(P.default_config??{})};a({...e,components:[...e.components,j],metadata:M}),i(L)},[a,e]),T=z.useCallback(async P=>{var C;try{const L=await fetch(`${Ul}/modules/${encodeURIComponent(P)}`);if(!L.ok)return;const R=(await L.json()).module,N=new Set(e.components.map(G=>G.id)),j=bi(e.metadata),$=j.modules??{},O={...$.instances??{}},B=new Set(Object.keys(O)),W=Xl(Ni(R.id,"module"),B),V=Ni(R.naming.component_id_prefix,W),Y={};for(const G of R.fragment.components)Y[G.id]=Xl(Ni(`${V}_${G.id}`,V),N);const X=j.canvas??{},Q={...X.nodes??{}},H=Object.keys(Q).length+e.components.length,K=R.fragment.components.map((G,J)=>{const Z=iu(G.config??{}),re={...R.default_tags??{},...typeof Z.tags=="object"&&Z.tags!==null?Z.tags:{}};Z.tags=re;const le=Y[G.id];return Q[le]=Gf(H+J),{...G,id:le,provider:G.provider.toLowerCase(),config:Z}}),ee=R.fragment.connections.map(G=>({...G,source:Y[G.source],target:Y[G.target]}));O[W]={module_id:R.id,module_version:R.terraform.version,component_ids:K.map(G=>G.id),expected_component_count:K.length,required_tags:[...R.required_tags],naming_prefix:V,approved:R.approved,terraform:{...R.terraform}},j.canvas={...X,nodes:Q},j.modules={...$,instances:O},a({...e,components:[...e.components,...K],connections:[...e.connections,...ee],metadata:j}),i(((C=K[0])==null?void 0:C.id)??null)}catch{}},[a,e]),I=z.useCallback(async()=>{try{const P=await fetch(`${Ul}/canvas/validate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e})});if(!P.ok)return;l(await P.json())}catch{l({passed:!1,violations:[{code:"request_failed",severity:"error",message:"Standards check failed."}]})}},[e]);return f.jsxs("div",{style:{width:"100%",height:"100%",position:"relative"},children:[f.jsx(yC,{provider:e.provider||"aws",standardsResult:s,onAddResource:D,onAddModule:T,onCheckStandards:I}),f.jsxs(zE,{nodes:x,edges:k,nodeTypes:kC,onNodesChange:w,onEdgesChange:g,onEdgesDelete:E,onConnect:S,onNodeDragStop:_,fitView:!0,proOptions:{hideAttribution:!0},style:{background:"#f8fafc"},onNodeClick:h,onPaneClick:v,children:[f.jsx($E,{color:"#e2e8f0",gap:20}),f.jsx(WE,{style:{background:"#ffffff",border:"1px solid #e2e8f0",borderRadius:8}})]}),f.jsx(dC,{components:e.components}),f.jsx(fC,{showBoundaries:n,onToggleBoundaries:()=>r(P=>!P),onExportSvg:()=>u("svg"),onExportPng:()=>u("png")}),f.jsx(mC,{component:c??null,cost:d,onClose:()=>i(null),onApply:P=>b({...P,description:P.description??"",config:P.config??{}}),onDelete:A})]})}function MC({estimate:e}){return f.jsxs("div",{style:{padding:32},children:[f.jsx("h2",{style:{fontSize:18,marginBottom:16,color:"#0f172a"},children:"Cost Breakdown"}),f.jsxs("table",{style:{width:"100%",maxWidth:700,borderCollapse:"collapse",fontSize:14},children:[f.jsx("thead",{children:f.jsxs("tr",{style:{borderBottom:"2px solid #e2e8f0",background:"#f8fafc"},children:[f.jsx("th",{style:{textAlign:"left",padding:"10px 12px",color:"#475569"},children:"Component"}),f.jsx("th",{style:{textAlign:"left",padding:"10px 12px",color:"#475569"},children:"Service"}),f.jsx("th",{style:{textAlign:"right",padding:"10px 12px",color:"#475569"},children:"Monthly"}),f.jsx("th",{style:{textAlign:"left",padding:"10px 12px",color:"#475569"},children:"Notes"})]})}),f.jsx("tbody",{children:e.breakdown.map(t=>f.jsxs("tr",{style:{borderBottom:"1px solid #f1f5f9"},children:[f.jsx("td",{style:{padding:"10px 12px",color:"#0f172a"},children:t.component_id}),f.jsx("td",{style:{padding:"10px 12px",color:"#475569"},children:t.service}),f.jsxs("td",{style:{padding:"10px 12px",textAlign:"right",fontFamily:"monospace",color:"#0f172a"},children:["$",t.monthly.toFixed(2)]}),f.jsx("td",{style:{padding:"10px 12px",color:"#64748b",fontSize:12},children:t.notes})]},t.component_id))}),f.jsx("tfoot",{children:f.jsxs("tr",{style:{borderTop:"2px solid #e2e8f0",background:"#f0f9ff"},children:[f.jsx("td",{style:{padding:"12px",fontWeight:700,fontSize:15,color:"#0f172a"},colSpan:2,children:"Total"}),f.jsxs("td",{style:{padding:"12px",textAlign:"right",fontWeight:700,fontSize:15,fontFamily:"monospace",color:"#2563eb"},children:["$",e.monthly_total.toFixed(2)]}),f.jsxs("td",{style:{padding:"12px",color:"#64748b",fontSize:12},children:[e.currency,"/month"]})]})})]})]})}function zC({spec:e,onDownloadTerraform:t,onDownloadYaml:n,validationSummary:r,usage:o}){var s,l;if(!e)return null;const i=[];return o!=null&&o.model&&i.push(o.model.replace("claude-","").replace("anthropic.","")),(o==null?void 0:o.input_tokens)!=null&&(o==null?void 0:o.output_tokens)!=null&&i.push(`${((o.input_tokens+o.output_tokens)/1e3).toFixed(1)}k tokens`),(o==null?void 0:o.cost_usd)!=null&&i.push(`$${o.cost_usd.toFixed(4)}`),(o==null?void 0:o.latency_ms)!=null&&i.push(`${(o.latency_ms/1e3).toFixed(1)}s`),f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"1rem",padding:"0.5rem 1rem",background:"#ffffff",borderRadius:"0.375rem",marginBottom:"0.5rem",fontSize:"0.875rem",borderBottom:"1px solid #e2e8f0"},children:[f.jsxs("span",{style:{color:"#64748b"},children:["Components: ",f.jsx("strong",{style:{color:"#334155"},children:((s=e.components)==null?void 0:s.length)||0})]}),e.cost_estimate&&f.jsxs("span",{style:{color:"#64748b"},children:["Est. ",f.jsxs("strong",{style:{color:"#2563eb"},children:["$",(l=e.cost_estimate.monthly_total)==null?void 0:l.toFixed(0),"/mo"]})]}),f.jsxs("span",{style:{color:"#64748b"},children:[(e.provider||"aws").toUpperCase()," / ",e.region||"us-east-1"]}),r&&f.jsxs("span",{style:{padding:"0.125rem 0.5rem",borderRadius:"0.25rem",fontSize:"0.75rem",fontWeight:600,background:r.passed===r.total?"#d1fae5":"#fee2e2",color:r.passed===r.total?"#065f46":"#991b1b"},children:["WA: ",r.passed,"/",r.total]}),i.length>0&&f.jsx("span",{style:{color:"#94a3b8",fontSize:"0.75rem"},children:i.join(" · ")}),f.jsxs("div",{style:{marginLeft:"auto",display:"flex",gap:"0.5rem"},children:[t&&f.jsx("button",{onClick:t,style:{padding:"0.25rem 0.75rem",background:"#2563eb",color:"white",border:"none",borderRadius:"0.25rem",cursor:"pointer",fontSize:"0.75rem"},children:"Download Terraform"}),n&&f.jsx("button",{onClick:n,style:{padding:"0.25rem 0.75rem",background:"#f8fafc",color:"#475569",border:"1px solid #e2e8f0",borderRadius:"0.25rem",cursor:"pointer",fontSize:"0.75rem"},children:"Download YAML"})]})]})}async function Go(e){if(e.status===429){const t=e.headers.get("Retry-After"),n=t?` Retry after ${t}s.`:"";try{const r=await e.json();return`${r.message||r.detail||"Rate limited"}${n}`}catch{return`Rate limited.${n}`}}try{const t=await e.json();return su(t,e.statusText)}catch{return e.statusText||"Request failed"}}function su(e,t="Request failed"){const n=e.message||e.detail||t;return e.suggestion?`${n} — ${e.suggestion}`:n}const PC=[{key:"hipaa",label:"HIPAA"},{key:"pci-dss",label:"PCI-DSS"},{key:"soc2",label:"SOC 2"},{key:"fedramp",label:"FedRAMP"},{key:"gdpr",label:"GDPR"},{key:"well-architected",label:"Well-Architected"}],ji={critical:0,high:1,medium:2,low:3},$o={critical:{bg:"#fef2f2",text:"#991b1b",border:"#fca5a5"},high:{bg:"#fff7ed",text:"#9a3412",border:"#fdba74"},medium:{bg:"#fffbeb",text:"#92400e",border:"#fcd34d"},low:{bg:"#f0fdf4",text:"#166534",border:"#86efac"}},TC={data_protection:"Data Protection",monitoring:"Monitoring & Logging",identity:"Identity & Access",network_security:"Network Security",reliability:"Reliability",compliance:"Compliance",operations:"Operations",security:"Security",cost:"Cost Optimization"};function IC({score:e,passed:t}){const n=Math.round(e*100),r=54,o=8,i=2*Math.PI*r,s=i*(1-e),l=t?"#16a34a":n>=70?"#f59e0b":"#dc2626";return f.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",gap:6},children:[f.jsxs("svg",{width:136,height:136,viewBox:"0 0 136 136",children:[f.jsx("circle",{cx:68,cy:68,r,fill:"none",stroke:"#f1f5f9",strokeWidth:o}),f.jsx("circle",{cx:68,cy:68,r,fill:"none",stroke:l,strokeWidth:o,strokeDasharray:i,strokeDashoffset:s,strokeLinecap:"round",transform:"rotate(-90 68 68)",style:{transition:"stroke-dashoffset 0.6s ease"}}),f.jsxs("text",{x:68,y:62,textAnchor:"middle",fontSize:28,fontWeight:700,fill:"#0f172a",children:[n,"%"]}),f.jsx("text",{x:68,y:82,textAnchor:"middle",fontSize:11,fill:"#64748b",children:"compliance"})]}),f.jsx("span",{style:{display:"inline-block",padding:"3px 12px",borderRadius:4,fontSize:12,fontWeight:600,background:t?"#dcfce7":"#fee2e2",color:t?"#166534":"#991b1b"},children:t?"PASSED":"FAILED"})]})}function RC({severity:e}){const t=$o[e]||$o.medium;return f.jsx("span",{style:{display:"inline-block",padding:"1px 8px",borderRadius:4,fontSize:11,fontWeight:600,background:t.bg,color:t.text,border:`1px solid ${t.border}`,textTransform:"uppercase",letterSpacing:"0.02em"},children:e})}function Zf({check:e,expanded:t,onToggle:n}){const r=$o[e.severity]||$o.medium;return f.jsxs("div",{style:{borderLeft:`3px solid ${e.passed?"#86efac":r.border}`,background:"#ffffff",borderRadius:"0 6px 6px 0",marginBottom:6,cursor:"pointer",transition:"box-shadow 0.15s ease"},onClick:n,onMouseEnter:o=>{o.currentTarget.style.boxShadow="0 1px 4px rgba(0,0,0,0.06)"},onMouseLeave:o=>{o.currentTarget.style.boxShadow="none"},children:[f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,padding:"10px 14px"},children:[f.jsx("span",{style:{fontSize:14,flexShrink:0,width:18,textAlign:"center"},children:e.passed?f.jsx("span",{style:{color:"#16a34a"},children:"✓"}):f.jsx("span",{style:{color:"#dc2626",fontWeight:700},children:"✕"})}),f.jsx("span",{style:{flex:1,fontSize:13,color:"#0f172a",fontWeight:500},children:e.name.replace(/_/g," ").replace(/\b\w/g,o=>o.toUpperCase())}),f.jsx(RC,{severity:e.severity}),f.jsx("span",{style:{fontSize:11,color:"#94a3b8",transform:t?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.15s ease",flexShrink:0},children:"▼"})]}),t&&f.jsxs("div",{style:{padding:"0 14px 12px 42px",fontSize:12,lineHeight:1.6},children:[f.jsx("div",{style:{color:"#475569",marginBottom:4},children:e.detail}),e.recommendation&&f.jsxs("div",{style:{marginTop:6,padding:"8px 12px",background:"#f8fafc",borderRadius:4,border:"1px solid #e2e8f0",color:"#334155"},children:[f.jsx("span",{style:{fontWeight:600,color:"#475569",fontSize:11},children:"Recommendation: "}),e.recommendation]})]})]})}function LC({spec:e,apiBase:t}){const[n,r]=z.useState(null),[o,i]=z.useState(null),[s,l]=z.useState(!1),[a,u]=z.useState(null),[p,c]=z.useState(new Set),[d,x]=z.useState(!1),y=z.useCallback(async _=>{i(_),l(!0),u(null),c(new Set),x(!1);try{const S=_==="well-architected",E=await fetch(`${t}/validate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e,compliance:S?[]:[_],well_architected:S})});if(!E.ok)throw new Error(await Go(E));const b=await E.json();r(b.results)}catch(S){u(S instanceof Error?S.message:"Validation failed"),r(null)}finally{l(!1)}},[e,t]),w=z.useCallback(_=>{c(S=>{const E=new Set(S);return E.has(_)?E.delete(_):E.add(_),E})},[]),k=(n==null?void 0:n[0])??null,m=k?k.checks.filter(_=>!_.passed).sort((_,S)=>(ji[_.severity]??9)-(ji[S.severity]??9)):[],g=k?k.checks.filter(_=>_.passed).sort((_,S)=>(ji[_.severity]??9)-(ji[S.severity]??9)):[],h={};for(const _ of m){const S=_.category;h[S]||(h[S]=[]),h[S].push(_)}const v=k?k.checks.reduce((_,S)=>(S.passed||(_[S.severity]=(_[S.severity]||0)+1),_),{}):{};return f.jsxs("div",{style:{padding:32,maxWidth:900},children:[f.jsx("h2",{style:{fontSize:18,marginBottom:16,color:"#0f172a",fontWeight:700},children:"Validate Architecture"}),f.jsx("div",{style:{display:"flex",gap:8,marginBottom:24},children:PC.map(_=>{const S=o===_.key;return f.jsx("button",{onClick:()=>y(_.key),disabled:s,style:{padding:"8px 18px",borderRadius:6,border:S?"1.5px solid #2563eb":"1px solid #e2e8f0",background:S?"#eff6ff":"#ffffff",color:S?"#1d4ed8":"#475569",cursor:s?"wait":"pointer",fontSize:13,fontWeight:S?600:500,transition:"all 0.15s ease",opacity:s&&!S?.6:1},children:_.label},_.key)})}),s&&f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,padding:24,color:"#64748b",fontSize:14},children:[f.jsx("span",{style:{display:"inline-block",width:16,height:16,border:"2px solid #e2e8f0",borderTopColor:"#2563eb",borderRadius:"50%",animation:"spin 0.6s linear infinite"}}),"Running ",o==null?void 0:o.toUpperCase()," validation...",f.jsx("style",{children:"@keyframes spin { to { transform: rotate(360deg); } }"})]}),a&&f.jsx("div",{style:{padding:"12px 16px",background:"#fef2f2",border:"1px solid #fca5a5",borderRadius:8,color:"#991b1b",fontSize:13},children:a}),k&&!s&&f.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:24},children:[f.jsxs("div",{style:{display:"flex",gap:24,alignItems:"flex-start",padding:20,background:"#ffffff",border:"1px solid #e2e8f0",borderRadius:10},children:[f.jsx(IC,{score:k.score,passed:k.passed}),f.jsxs("div",{style:{flex:1},children:[f.jsx("div",{style:{fontSize:16,fontWeight:700,color:"#0f172a",marginBottom:4},children:k.framework}),f.jsxs("div",{style:{fontSize:13,color:"#64748b",marginBottom:14},children:[k.checks.length," checks evaluated ·"," ",g.length," passed ·"," ",m.length," failed"]}),f.jsx("div",{style:{display:"flex",gap:10,flexWrap:"wrap"},children:["critical","high","medium","low"].map(_=>{const S=v[_]||0,E=$o[_];return f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"6px 12px",borderRadius:6,background:S>0?E.bg:"#f8fafc",border:`1px solid ${S>0?E.border:"#e2e8f0"}`,minWidth:100},children:[f.jsx("span",{style:{fontSize:18,fontWeight:700,color:S>0?E.text:"#cbd5e1",lineHeight:1},children:S}),f.jsx("span",{style:{fontSize:11,fontWeight:600,color:S>0?E.text:"#94a3b8",textTransform:"uppercase",letterSpacing:"0.03em"},children:_})]},_)})})]})]}),m.length>0&&f.jsxs("div",{children:[f.jsxs("h3",{style:{fontSize:14,fontWeight:600,color:"#0f172a",marginBottom:12,display:"flex",alignItems:"center",gap:8},children:[f.jsx("span",{style:{color:"#dc2626"},children:"✕"}),"Failed Checks (",m.length,")"]}),Object.entries(h).map(([_,S])=>f.jsxs("div",{style:{marginBottom:16},children:[f.jsx("div",{style:{fontSize:11,fontWeight:600,color:"#64748b",textTransform:"uppercase",letterSpacing:"0.05em",marginBottom:6,paddingLeft:4},children:TC[_]||_.replace(/_/g," ")}),S.map(E=>{const b=`${_}-${E.name}`;return f.jsx(Zf,{check:E,expanded:p.has(b),onToggle:()=>w(b)},b)})]},_))]}),g.length>0&&f.jsxs("div",{children:[f.jsxs("button",{onClick:()=>x(_=>!_),style:{display:"flex",alignItems:"center",gap:8,background:"none",border:"none",cursor:"pointer",padding:"4px 0",fontSize:14,fontWeight:600,color:"#0f172a"},children:[f.jsx("span",{style:{color:"#16a34a"},children:"✓"}),"Passed Checks (",g.length,")",f.jsx("span",{style:{fontSize:11,color:"#94a3b8",transform:d?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.15s ease"},children:"▼"})]}),d&&f.jsx("div",{style:{marginTop:8},children:g.map(_=>{const S=`passed-${_.category}-${_.name}`;return f.jsx(Zf,{check:_,expanded:p.has(S),onToggle:()=>w(S)},S)})})]}),f.jsxs("div",{style:{fontSize:11,color:"#94a3b8",borderTop:"1px solid #f1f5f9",paddingTop:12,lineHeight:1.5},children:["Score = percentage of checks passed. A framework is marked FAILED if any critical-severity check fails, regardless of overall score. Checks are defined in the Cloudwright Validator based on ",k.framework," control requirements."]})]}),!k&&!s&&!a&&f.jsx("div",{style:{padding:40,textAlign:"center",color:"#94a3b8",fontSize:14,background:"#f8fafc",borderRadius:8,border:"1px dashed #e2e8f0"},children:"Select a compliance framework above to validate your architecture."})]})}const AC=[{key:"hipaa",label:"HIPAA"},{key:"soc2",label:"SOC 2"},{key:"pci-dss",label:"PCI-DSS"},{key:"fedramp",label:"FedRAMP"},{key:"gdpr",label:"GDPR"},{key:"iso27001",label:"ISO 27001"},{key:"nist",label:"NIST 800-53"}],qf={critical:{bg:"#fef2f2",text:"#991b1b",border:"#fca5a5"},high:{bg:"#fff7ed",text:"#9a3412",border:"#fdba74"},medium:{bg:"#fffbeb",text:"#92400e",border:"#fcd34d"},low:{bg:"#f0fdf4",text:"#166534",border:"#86efac"}};function $C({spec:e,apiBase:t}){const[n,r]=z.useState(["hipaa","soc2","fedramp"]),[o,i]=z.useState(null),[s,l]=z.useState(!1),[a,u]=z.useState(null),p=d=>r(x=>x.includes(d)?x.filter(y=>y!==d):[...x,d]),c=z.useCallback(async()=>{l(!0),u(null);try{const d=await fetch(`${t}/compliance`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e,frameworks:n})});if(!d.ok)throw new Error(await Go(d));i(await d.json())}catch(d){u(d instanceof Error?d.message:"Compliance scan failed")}finally{l(!1)}},[e,t,n]);return f.jsxs("div",{style:{padding:24,maxWidth:920},children:[f.jsx("h2",{style:{fontSize:18,marginBottom:6,color:"#0f172a"},children:"Compliance Control Mapping"}),f.jsx("p",{style:{fontSize:13,color:"#64748b",marginBottom:16},children:"Every design-stage finding mapped to the framework control it violates — before any infrastructure exists. Folds in a Checkov deep scan when available."}),f.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:8,marginBottom:16},children:AC.map(d=>f.jsx("button",{onClick:()=>p(d.key),style:{padding:"6px 14px",borderRadius:999,border:`1px solid ${n.includes(d.key)?"#2563eb":"#cbd5e1"}`,background:n.includes(d.key)?"#2563eb":"#ffffff",color:n.includes(d.key)?"#ffffff":"#475569",fontSize:13,cursor:"pointer"},children:d.label},d.key))}),f.jsx("button",{onClick:c,disabled:s||n.length===0,style:{padding:"10px 22px",borderRadius:8,border:"none",background:s?"#94a3b8":"#0f172a",color:"#ffffff",fontSize:14,fontWeight:600,cursor:s?"default":"pointer"},children:s?"Scanning…":"Run compliance scan"}),a&&f.jsx("div",{style:{marginTop:16,padding:12,background:"#fef2f2",border:"1px solid #fca5a5",borderRadius:8,color:"#991b1b",fontSize:13},children:a}),o&&f.jsxs("div",{style:{marginTop:24},children:[f.jsxs("div",{style:{fontSize:12,color:"#64748b",marginBottom:8},children:["Scanner: ",f.jsx("strong",{children:o.scanner}),o.checkov_used?" (Checkov deep scan included)":""]}),f.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",marginBottom:24},children:[f.jsx("thead",{children:f.jsxs("tr",{style:{background:"#f8fafc",textAlign:"left"},children:[f.jsx("th",{style:Ur,children:"Framework"}),f.jsx("th",{style:Ur,children:"Controls satisfied"}),f.jsx("th",{style:Ur,children:"Violated"}),f.jsx("th",{style:Ur,children:"Findings"}),f.jsx("th",{style:Ur,children:"Status"})]})}),f.jsx("tbody",{children:o.frameworks.map(d=>f.jsxs("tr",{style:{borderTop:"1px solid #e2e8f0"},children:[f.jsx("td",{style:Yr,children:f.jsx("strong",{children:d.framework})}),f.jsxs("td",{style:Yr,children:[d.controls_satisfied,"/",d.controls_total]}),f.jsx("td",{style:{...Yr,color:"#991b1b"},children:d.controls_violated.length?d.controls_violated.join(", "):"—"}),f.jsx("td",{style:Yr,children:d.findings}),f.jsx("td",{style:Yr,children:f.jsx("span",{style:{padding:"2px 10px",borderRadius:999,fontSize:12,fontWeight:600,background:d.status==="pass"?"#dcfce7":"#fee2e2",color:d.status==="pass"?"#166534":"#991b1b"},children:d.status.toUpperCase()})})]},d.framework))})]}),f.jsxs("h3",{style:{fontSize:15,color:"#0f172a",marginBottom:12},children:["Findings (",o.findings.length,")"]}),o.findings.map((d,x)=>{const y=qf[d.severity]||qf.low;return f.jsxs("div",{style:{border:`1px solid ${y.border}`,background:y.bg,borderRadius:8,padding:14,marginBottom:10},children:[f.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[f.jsxs("span",{style:{fontSize:11,fontWeight:700,color:y.text,textTransform:"uppercase"},children:["[",d.severity,"]"]}),f.jsx("span",{style:{fontSize:14,color:"#0f172a"},children:d.message}),f.jsxs("span",{style:{fontSize:11,color:"#64748b"},children:["(",d.source,")"]})]}),d.controls.length>0&&f.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginTop:8},children:d.controls.map((w,k)=>f.jsxs("span",{title:w.title,style:{fontSize:11,padding:"2px 8px",borderRadius:4,background:"#e0e7ff",color:"#3730a3",fontFamily:"monospace"},children:[w.framework," ",w.control_id]},k))}),f.jsx("div",{style:{fontSize:12,color:"#475569",marginTop:8},children:d.remediation})]},x)})]})]})}const Ur={padding:"10px 12px",fontSize:12,color:"#475569",fontWeight:600},Yr={padding:"10px 12px",fontSize:13,color:"#0f172a"},DC=[{key:"terraform",label:"Terraform"},{key:"pulumi-python",label:"Pulumi (Python)"},{key:"pulumi-ts",label:"Pulumi (TS)"}];function OC({spec:e,apiBase:t}){const[n,r]=z.useState("terraform"),[o,i]=z.useState(null),[s,l]=z.useState(!1),[a,u]=z.useState(null),p=z.useCallback(async()=>{l(!0),u(null),i(null);try{const c=await fetch(`${t}/plan`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e,target:n,run_plan:!0})});if(!c.ok)throw new Error(await Go(c));i(await c.json())}catch(c){u(c instanceof Error?c.message:"Plan failed")}finally{l(!1)}},[e,t,n]);return f.jsxs("div",{style:{padding:24,maxWidth:920},children:[f.jsx("h2",{style:{fontSize:18,marginBottom:6,color:"#0f172a"},children:"Plan / Preview — prove it deploys"}),f.jsxs("p",{style:{fontSize:13,color:"#64748b",marginBottom:16},children:["Runs ",f.jsx("code",{children:"terraform validate/plan"})," or ",f.jsx("code",{children:"pulumi preview"})," against the exported artifact. Read-only — nothing is applied. Validation needs no credentials and is the offline proof of deployability."]}),f.jsx("div",{style:{display:"flex",gap:8,marginBottom:16},children:DC.map(c=>f.jsx("button",{onClick:()=>r(c.key),style:{padding:"6px 14px",borderRadius:8,border:`1px solid ${n===c.key?"#2563eb":"#cbd5e1"}`,background:n===c.key?"#2563eb":"#ffffff",color:n===c.key?"#ffffff":"#475569",fontSize:13,cursor:"pointer"},children:c.label},c.key))}),f.jsx("button",{onClick:p,disabled:s,style:{padding:"10px 22px",borderRadius:8,border:"none",background:s?"#94a3b8":"#0f172a",color:"#ffffff",fontSize:14,fontWeight:600,cursor:s?"default":"pointer"},children:s?"Running plan…":"Run plan"}),a&&f.jsx("div",{style:{marginTop:16,padding:12,background:"#fef2f2",border:"1px solid #fca5a5",borderRadius:8,color:"#991b1b",fontSize:13},children:a}),o&&f.jsxs("div",{style:{marginTop:24},children:[f.jsxs("div",{style:{display:"inline-block",padding:"8px 18px",borderRadius:8,fontSize:15,fontWeight:700,background:o.ok?"#dcfce7":"#fee2e2",color:o.ok?"#166534":"#991b1b",marginBottom:16},children:[o.ok?"DEPLOYABLE":"NOT DEPLOYABLE",o.ok&&!o.plan_ran?" (validate only — no credentials)":""]}),o.summary&&f.jsxs("div",{style:{fontSize:14,marginBottom:16},children:["Resource diff:"," ",f.jsxs("span",{style:{color:"#166534"},children:["+",o.summary.add]})," ",f.jsxs("span",{style:{color:"#92400e"},children:["~",o.summary.change]})," ",f.jsxs("span",{style:{color:"#991b1b"},children:["-",o.summary.destroy]})]}),f.jsx("ul",{style:{fontSize:13,color:"#334155",marginBottom:16,paddingLeft:18},children:o.messages.map((c,d)=>f.jsx("li",{style:{marginBottom:4},children:c},d))}),o.output_tail&&f.jsx("pre",{style:{background:"#0f172a",color:"#e2e8f0",padding:14,borderRadius:8,fontSize:12,overflowX:"auto",maxHeight:280},children:o.output_tail})]})]})}const Ql=[{key:"terraform",label:"Terraform",ext:"tf",lang:"hcl",desc:"HashiCorp Configuration Language"},{key:"cloudformation",label:"CloudFormation",ext:"yaml",lang:"yaml",desc:"AWS CloudFormation template"},{key:"mermaid",label:"Mermaid",ext:"mmd",lang:"mermaid",desc:"Mermaid diagram markup"},{key:"d2",label:"D2",ext:"d2",lang:"d2",desc:"D2 diagram language"},{key:"sbom",label:"SBOM",ext:"json",lang:"json",desc:"CycloneDX Software BOM"},{key:"aibom",label:"AIBOM",ext:"json",lang:"json",desc:"OWASP AI Bill of Materials"},{key:"html",label:"HTML Report",ext:"html",lang:"html",desc:"Self-contained shareable report"}];function Jf({format:e}){const t={terraform:"HCL",cloudformation:"CFN",mermaid:"MMD",d2:"D2",sbom:"BOM",aibom:"AI"},n={terraform:"#7c3aed",cloudformation:"#ea580c",mermaid:"#0891b2",d2:"#4f46e5",sbom:"#059669",aibom:"#2563eb"};return f.jsx("span",{style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:32,height:20,borderRadius:4,fontSize:10,fontWeight:700,background:`${n[e]||"#64748b"}14`,color:n[e]||"#64748b",letterSpacing:"0.02em",flexShrink:0},children:t[e]||e.slice(0,3).toUpperCase()})}function BC({spec:e,apiBase:t}){const[n,r]=z.useState(null),[o,i]=z.useState(""),[s,l]=z.useState(!1),[a,u]=z.useState(null),[p,c]=z.useState(!1),d=z.useRef(null),x=z.useCallback(async g=>{r(g),l(!0),u(null),c(!1);try{const h=await fetch(`${t}/export`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e,format:g})});if(!h.ok)throw new Error(await Go(h));const v=await h.json();i(v.content||JSON.stringify(v,null,2))}catch(h){u(h instanceof Error?h.message:"Export failed"),i("")}finally{l(!1)}},[e,t]),y=z.useCallback(async()=>{var g,h;try{await navigator.clipboard.writeText(o),c(!0),setTimeout(()=>c(!1),2e3)}catch{const v=d.current;if(v){const _=document.createRange();_.selectNodeContents(v),(g=window.getSelection())==null||g.removeAllRanges(),(h=window.getSelection())==null||h.addRange(_)}}},[o]),w=z.useCallback(()=>{if(!o||!n)return;const g=Ql.find(S=>S.key===n),h=new Blob([o],{type:"text/plain"}),v=URL.createObjectURL(h),_=document.createElement("a");_.href=v,_.download=`architecture.${(g==null?void 0:g.ext)||"txt"}`,_.click(),URL.revokeObjectURL(v)},[o,n]),k=o?o.split(` +`).length:0,m=Ql.find(g=>g.key===n);return f.jsxs("div",{style:{padding:32,maxWidth:960},children:[f.jsx("h2",{style:{fontSize:18,marginBottom:16,color:"#0f172a",fontWeight:700},children:"Export Architecture"}),f.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(3, 1fr)",gap:10,marginBottom:24},children:Ql.map(g=>{const h=n===g.key;return f.jsxs("button",{onClick:()=>x(g.key),disabled:s,style:{display:"flex",alignItems:"center",gap:10,padding:"10px 14px",borderRadius:8,border:h?"1.5px solid #2563eb":"1px solid #e2e8f0",background:h?"#eff6ff":"#ffffff",cursor:s?"wait":"pointer",textAlign:"left",transition:"all 0.15s ease",opacity:s&&!h?.6:1},children:[f.jsx(Jf,{format:g.key}),f.jsxs("div",{children:[f.jsx("div",{style:{fontSize:13,fontWeight:h?600:500,color:h?"#1d4ed8":"#0f172a"},children:g.label}),f.jsx("div",{style:{fontSize:11,color:"#94a3b8"},children:g.desc})]})]},g.key)})}),s&&f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,padding:24,color:"#64748b",fontSize:14},children:[f.jsx("span",{style:{display:"inline-block",width:16,height:16,border:"2px solid #e2e8f0",borderTopColor:"#2563eb",borderRadius:"50%",animation:"spin 0.6s linear infinite"}}),"Generating ",(m==null?void 0:m.label)||n,"...",f.jsx("style",{children:"@keyframes spin { to { transform: rotate(360deg); } }"})]}),a&&f.jsx("div",{style:{padding:"12px 16px",background:"#fef2f2",border:"1px solid #fca5a5",borderRadius:8,color:"#991b1b",fontSize:13},children:a}),o&&!s&&f.jsxs("div",{style:{border:"1px solid #e2e8f0",borderRadius:10,overflow:"hidden"},children:[f.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 14px",background:"#f8fafc",borderBottom:"1px solid #e2e8f0"},children:[f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[f.jsx(Jf,{format:n||""}),f.jsxs("span",{style:{fontSize:12,color:"#64748b"},children:["architecture.",(m==null?void 0:m.ext)||"txt"]}),f.jsxs("span",{style:{fontSize:11,color:"#cbd5e1"},children:[k," lines"]})]}),f.jsxs("div",{style:{display:"flex",gap:6},children:[f.jsx("button",{onClick:y,style:{padding:"4px 12px",borderRadius:4,border:"1px solid #e2e8f0",background:p?"#dcfce7":"#ffffff",color:p?"#166534":"#475569",cursor:"pointer",fontSize:12,fontWeight:500,transition:"all 0.15s ease"},children:p?"Copied":"Copy"}),f.jsx("button",{onClick:w,style:{padding:"4px 12px",borderRadius:4,border:"1px solid #e2e8f0",background:"#ffffff",color:"#475569",cursor:"pointer",fontSize:12,fontWeight:500},children:"Download"})]})]}),f.jsx("div",{style:{maxHeight:560,overflow:"auto"},children:f.jsx("pre",{ref:d,style:{margin:0,padding:16,fontSize:12,lineHeight:1.7,color:"#334155",background:"#ffffff",fontFamily:"'SF Mono', 'Cascadia Code', 'Fira Code', Menlo, monospace",counterReset:"line",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:o})})]}),!o&&!s&&!a&&f.jsx("div",{style:{padding:40,textAlign:"center",color:"#94a3b8",fontSize:14,background:"#f8fafc",borderRadius:8,border:"1px dashed #e2e8f0"},children:"Select an export format above to generate infrastructure code."})]})}const FC={0:"Edge / CDN",1:"Load Balancing",2:"Compute",3:"Data",4:"Supporting"};function Gl(e){if(e===null)return"null";if(typeof e=="number"||typeof e=="boolean")return String(e);const t=String(e);return/^[A-Za-z0-9_./:@-]+$/.test(t)?t:JSON.stringify(t)}function lu(e,t=0){const n=" ".repeat(t);if(Array.isArray(e))return e.length===0?"[]":e.map(r=>{if(r&&typeof r=="object"){const o=lu(r,t+2);return`${n}- ${o.trimStart()}`}return`${n}- ${Gl(r)}`}).join(` +`);if(e&&typeof e=="object"){const r=Object.entries(e).filter(([,o])=>o!==void 0);return r.length===0?"{}":r.map(([o,i])=>{if(i&&typeof i=="object"){const s=lu(i,t+2);return`${n}${o}: +${s}`}return`${n}${o}: ${Gl(i)}`}).join(` +`)}return Gl(e)}function Mi({label:e,value:t,sub:n}){return f.jsxs("div",{style:{padding:"14px 16px",background:"#ffffff",border:"1px solid #e2e8f0",borderRadius:8,flex:1,minWidth:120},children:[f.jsx("div",{style:{fontSize:22,fontWeight:700,color:"#0f172a",lineHeight:1.2},children:t}),f.jsx("div",{style:{fontSize:12,color:"#64748b",marginTop:2},children:e}),n&&f.jsx("div",{style:{fontSize:11,color:"#94a3b8",marginTop:2},children:n})]})}function HC({spec:e,yaml:t}){var x;const[n,r]=z.useState("overview"),[o,i]=z.useState(!1),s=z.useRef(null),l=z.useMemo(()=>lu(e)||t||"",[e,t]),a=z.useMemo(()=>{const y=new Set(e.components.map(w=>w.provider));return Array.from(y)},[e.components]),u=z.useMemo(()=>{const y=new Set(e.components.map(w=>w.service));return Array.from(y)},[e.components]),p=z.useMemo(()=>{const y={};for(const w of e.components){const k=w.tier??2;y[k]||(y[k]=[]),y[k].push(w)}return y},[e.components]),c=z.useCallback(async()=>{var y,w;try{await navigator.clipboard.writeText(l),i(!0),setTimeout(()=>i(!1),2e3)}catch{const k=s.current;if(k){const m=document.createRange();m.selectNodeContents(k),(y=window.getSelection())==null||y.removeAllRanges(),(w=window.getSelection())==null||w.addRange(m)}}},[l]),d=z.useCallback(()=>{var m;const y=new Blob([l],{type:"text/yaml"}),w=URL.createObjectURL(y),k=document.createElement("a");k.href=w,k.download=`${((m=e.name)==null?void 0:m.replace(/\s+/g,"-").toLowerCase())||"architecture"}.yaml`,k.click(),URL.revokeObjectURL(w)},[l,e.name]);return f.jsxs("div",{style:{padding:32,maxWidth:960},children:[f.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:12,marginBottom:20},children:[f.jsx("h2",{style:{fontSize:18,color:"#0f172a",fontWeight:700,margin:0},children:e.name||"Architecture Spec"}),e.provider&&f.jsx("span",{style:{fontSize:12,fontWeight:600,color:"#475569",background:"#f1f5f9",padding:"2px 8px",borderRadius:4},children:e.provider.toUpperCase()}),e.region&&f.jsx("span",{style:{fontSize:12,color:"#94a3b8"},children:e.region})]}),f.jsx("div",{style:{display:"flex",gap:0,marginBottom:20,borderBottom:"1px solid #e2e8f0"},children:["overview","yaml"].map(y=>f.jsx("button",{onClick:()=>r(y),style:{padding:"8px 18px",background:"none",border:"none",borderBottom:n===y?"2px solid #2563eb":"2px solid transparent",color:n===y?"#1d4ed8":"#64748b",fontWeight:n===y?600:500,fontSize:13,cursor:"pointer",transition:"all 0.15s ease"},children:y==="overview"?"Overview":"YAML Source"},y))}),n==="overview"&&f.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:20},children:[f.jsxs("div",{style:{display:"flex",gap:12},children:[f.jsx(Mi,{label:"Components",value:e.components.length}),f.jsx(Mi,{label:"Connections",value:e.connections.length}),f.jsx(Mi,{label:"Services",value:u.length,sub:a.join(", ")}),e.cost_estimate&&f.jsx(Mi,{label:"Monthly Cost",value:`$${e.cost_estimate.monthly_total.toLocaleString()}`,sub:e.cost_estimate.currency})]}),f.jsx("div",{style:{border:"1px solid #e2e8f0",borderRadius:10,overflow:"hidden"},children:f.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:13},children:[f.jsx("thead",{children:f.jsxs("tr",{style:{background:"#f8fafc"},children:[f.jsx("th",{style:xt,children:"Component"}),f.jsx("th",{style:xt,children:"Service"}),f.jsx("th",{style:xt,children:"Provider"}),f.jsx("th",{style:xt,children:"Tier"}),f.jsx("th",{style:xt,children:"Description"})]})}),f.jsx("tbody",{children:Object.keys(p).map(Number).sort().flatMap(y=>p[y].map(w=>f.jsxs("tr",{style:{borderBottom:"1px solid #f1f5f9"},children:[f.jsxs("td",{style:vt,children:[f.jsx("span",{style:{fontWeight:600,color:"#0f172a"},children:w.label}),f.jsx("div",{style:{fontSize:11,color:"#94a3b8"},children:w.id})]}),f.jsx("td",{style:vt,children:f.jsx("code",{style:{fontSize:12,background:"#f1f5f9",padding:"1px 6px",borderRadius:3,color:"#334155"},children:w.service})}),f.jsx("td",{style:vt,children:f.jsx("span",{style:{fontSize:12,color:"#475569"},children:w.provider})}),f.jsx("td",{style:vt,children:f.jsx("span",{style:{fontSize:11,fontWeight:600,color:"#64748b",background:"#f1f5f9",padding:"2px 8px",borderRadius:4},children:FC[y]||`Tier ${y}`})}),f.jsx("td",{style:{...vt,color:"#64748b",maxWidth:240},children:w.description})]},w.id)))})]})}),e.connections.length>0&&f.jsxs("div",{style:{border:"1px solid #e2e8f0",borderRadius:10,overflow:"hidden"},children:[f.jsxs("div",{style:{padding:"10px 16px",background:"#f8fafc",borderBottom:"1px solid #e2e8f0",fontSize:13,fontWeight:600,color:"#0f172a"},children:["Connections (",e.connections.length,")"]}),f.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:13},children:[f.jsx("thead",{children:f.jsxs("tr",{style:{background:"#fafafa"},children:[f.jsx("th",{style:xt,children:"Source"}),f.jsx("th",{style:xt}),f.jsx("th",{style:xt,children:"Target"}),f.jsx("th",{style:xt,children:"Protocol"}),f.jsx("th",{style:xt,children:"Label"})]})}),f.jsx("tbody",{children:e.connections.map((y,w)=>{const k=e.components.find(g=>g.id===y.source),m=e.components.find(g=>g.id===y.target);return f.jsxs("tr",{style:{borderBottom:"1px solid #f1f5f9"},children:[f.jsx("td",{style:vt,children:f.jsx("span",{style:{fontWeight:500,color:"#0f172a"},children:(k==null?void 0:k.label)||y.source})}),f.jsx("td",{style:{...vt,textAlign:"center",color:"#94a3b8",fontSize:14},children:"→"}),f.jsx("td",{style:vt,children:f.jsx("span",{style:{fontWeight:500,color:"#0f172a"},children:(m==null?void 0:m.label)||y.target})}),f.jsx("td",{style:vt,children:y.protocol&&f.jsxs("code",{style:{fontSize:11,background:"#f1f5f9",padding:"1px 6px",borderRadius:3,color:"#334155"},children:[y.protocol,y.port?`:${y.port}`:""]})}),f.jsx("td",{style:{...vt,color:"#64748b"},children:y.label})]},w)})})]})]}),e.boundaries&&e.boundaries.length>0&&f.jsxs("div",{style:{border:"1px solid #e2e8f0",borderRadius:10,overflow:"hidden"},children:[f.jsxs("div",{style:{padding:"10px 16px",background:"#f8fafc",borderBottom:"1px solid #e2e8f0",fontSize:13,fontWeight:600,color:"#0f172a"},children:["Boundaries (",e.boundaries.length,")"]}),f.jsx("div",{style:{padding:16,display:"flex",flexWrap:"wrap",gap:10},children:e.boundaries.map(y=>f.jsxs("div",{style:{padding:"8px 14px",border:"1px dashed #cbd5e1",borderRadius:8,background:"#fafafa",fontSize:13},children:[f.jsx("div",{style:{fontWeight:600,color:"#0f172a"},children:y.label||y.id}),f.jsxs("div",{style:{fontSize:11,color:"#94a3b8"},children:[y.kind," · ",y.component_ids.length," components"]})]},y.id))})]})]}),n==="yaml"&&f.jsxs("div",{style:{border:"1px solid #e2e8f0",borderRadius:10,overflow:"hidden"},children:[f.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 14px",background:"#f8fafc",borderBottom:"1px solid #e2e8f0"},children:[f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[f.jsx("span",{style:{fontSize:10,fontWeight:700,color:"#7c3aed",background:"#7c3aed14",padding:"2px 8px",borderRadius:4},children:"YAML"}),f.jsxs("span",{style:{fontSize:12,color:"#64748b"},children:[((x=e.name)==null?void 0:x.replace(/\s+/g,"-").toLowerCase())||"architecture",".yaml"]}),f.jsxs("span",{style:{fontSize:11,color:"#cbd5e1"},children:[l.split(` +`).length," lines"]})]}),f.jsxs("div",{style:{display:"flex",gap:6},children:[f.jsx("button",{onClick:c,style:{padding:"4px 12px",borderRadius:4,border:"1px solid #e2e8f0",background:o?"#dcfce7":"#ffffff",color:o?"#166534":"#475569",cursor:"pointer",fontSize:12,fontWeight:500,transition:"all 0.15s ease"},children:o?"Copied":"Copy"}),f.jsx("button",{onClick:d,style:{padding:"4px 12px",borderRadius:4,border:"1px solid #e2e8f0",background:"#ffffff",color:"#475569",cursor:"pointer",fontSize:12,fontWeight:500},children:"Download"})]})]}),f.jsx("div",{style:{maxHeight:600,overflow:"auto"},children:f.jsx("pre",{ref:s,style:{margin:0,padding:16,fontSize:13,lineHeight:1.7,color:"#334155",background:"#ffffff",fontFamily:"'SF Mono', 'Cascadia Code', 'Fira Code', Menlo, monospace",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:l||"No YAML available"})})]})]})}const xt={padding:"10px 14px",textAlign:"left",fontSize:11,fontWeight:600,color:"#64748b",textTransform:"uppercase",letterSpacing:"0.05em"},vt={padding:"10px 14px",color:"#0f172a"},Ze="/api",VC=["Add caching layer","Reduce cost","Increase redundancy","Add monitoring","Add security"];function ep(e){var s;if((s=e.metadata)!=null&&s.suggestions&&e.metadata.suggestions.length>0)return e.metadata.suggestions.slice(0,3);const t=e.components.map(l=>l.label.toLowerCase()),n=e.components.map(l=>l.service.toLowerCase()),r=t.some(l=>l.includes("cache")||l.includes("redis")||l.includes("elasticache"))||n.some(l=>l.includes("cache")||l.includes("redis")),o=t.some(l=>l.includes("monitor")||l.includes("cloudwatch")||l.includes("grafana"))||n.some(l=>l.includes("cloudwatch")||l.includes("monitor")),i=t.some(l=>l.includes("waf")||l.includes("firewall")||l.includes("security"))||n.some(l=>l.includes("waf")||l.includes("shield"));return VC.filter(l=>!(l==="Add caching layer"&&r||l==="Add monitoring"&&o||l==="Add security"&&i)).slice(0,3)}function WC(e){return e.split(/(\*\*.*?\*\*)/g).map((t,n)=>t.startsWith("**")&&t.endsWith("**")?f.jsx("strong",{children:t.slice(2,-2)},n):f.jsx("span",{children:t},n))}async function Kl(e,t){var i;let n=e;const[r,o]=await Promise.all([fetch(`${Ze}/cost`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:n})}).then(s=>s.ok?s.json():null).catch(()=>null),fetch(`${Ze}/validate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:n,compliance:[],well_architected:!0})}).then(s=>s.ok?s.json():null).catch(()=>null)]);if(r!=null&&r.estimate&&(n={...n,cost_estimate:r.estimate}),((i=o==null?void 0:o.results)==null?void 0:i.length)>0){const s=o.results[0].checks||[],l=s.filter(a=>a.passed).length;t({passed:l,total:s.length})}return n}async function tp(e,t,n){var a;const r=e?`${Ze}/modify/stream`:`${Ze}/design/stream`,o=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!o.ok){n.onError(await Go(o));return}const i=(a=o.body)==null?void 0:a.getReader();if(!i)return;const s=new TextDecoder;let l="";for(;;){const{done:u,value:p}=await i.read();if(u)break;l+=s.decode(p,{stream:!0});const c=l.split(` +`);l=c.pop()||"";for(const d of c)if(d.startsWith("data: "))try{const x=JSON.parse(d.slice(6));switch(x.stage){case"generating":case"costing":case"validating":n.onStage(x.stage,x.message);break;case"generated":n.onSpec(x.spec,x.yaml),x.usage&&n.onUsage&&n.onUsage(x.usage);break;case"costed":n.onCost(x.cost_estimate);break;case"validated":n.onValidation(x.passed,x.total);break;case"done":n.onDone(x.spec,x.yaml),x.usage&&n.onUsage&&n.onUsage(x.usage);break;case"error":n.onError(x.message);break}}catch{}}}function UC(){var _;const[e,t]=z.useState([]),[n,r]=z.useState(""),[o,i]=z.useState("idle"),[s,l]=z.useState(null),[a,u]=z.useState("diagram"),[p,c]=z.useState(""),[d,x]=z.useState(null),[y,w]=z.useState(null),k=z.useRef(null),m=z.useRef(null);z.useEffect(()=>{var S;(S=m.current)==null||S.scrollIntoView({behavior:"smooth"})},[e]);const g=async()=>{var T;if(!n.trim()||o!=="idle")return;const S={role:"user",content:n};t(I=>[...I,S]),r("");const E=s!==null;i(E?"modifying":"generating");let b=null,A="",D=!1;try{const I=E?{spec:s,instruction:n}:{description:n};try{await tp(E,I,{onStage:M=>{M==="generating"?i("generating"):(M==="costing"||M==="validating")&&i("costing")},onSpec:M=>{l(M),b=M,i("costing")},onCost:M=>{M&&b&&(b={...b,cost_estimate:M},l(b))},onValidation:(M,R)=>{M!==null&&x({passed:M,total:R})},onDone:(M,R)=>{b=M,A=R,l(M),i("done")},onUsage:M=>w(M),onError:M=>{throw new Error(M)}}),D=b!==null}catch{i(E?"modifying":"generating")}if(!D){const M=E?await fetch(`${Ze}/modify`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:s,instruction:n})}):await fetch(`${Ze}/design`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({description:n})}),R=await M.json();if(!M.ok)throw new Error(su(R));b=R.spec,A=R.yaml,R.usage&&w(R.usage),i("costing"),b=await Kl(b,x),l(b),i("done")}const P=b,L={role:"assistant",content:`${E?"Modified":"Designed"} **${P.name}** with ${P.components.length} components on ${P.provider.toUpperCase()}.${P.cost_estimate?` Estimated cost: $${P.cost_estimate.monthly_total.toFixed(2)}/mo.`:""}`,spec:P,yaml:A,suggestions:ep(P)};t(M=>[...M,L]),u("diagram")}catch(I){const P=I instanceof Error?I.message:"Unknown error";t(C=>[...C,{role:"assistant",content:`Error: ${P}`}])}finally{i("idle"),(T=k.current)==null||T.focus()}},h=async S=>{if(s)try{const E=await fetch(`${Ze}/download`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:s,format:S})});if(!E.ok)return;const b=await E.blob(),D=(E.headers.get("Content-Disposition")||"").match(/filename=([^\s;]+)/),T=D?D[1]:`architecture.${S==="terraform"?"tf":"yaml"}`,I=URL.createObjectURL(b),P=document.createElement("a");P.href=I,P.download=T,P.click(),URL.revokeObjectURL(I)}catch{}},v=async S=>{l(S),x(null);try{const E=await Kl(S,x);l(E)}catch{}};return f.jsxs("div",{style:{display:"flex",height:"100vh",background:"#ffffff"},children:[f.jsxs("div",{style:{width:420,borderRight:"1px solid #e2e8f0",display:"flex",flexDirection:"column",background:"#f8fafc"},children:[f.jsxs("div",{style:{padding:"16px 20px",borderBottom:"1px solid #e2e8f0",display:"flex",alignItems:"center",justifyContent:"space-between"},children:[f.jsxs("div",{children:[f.jsx("h1",{style:{fontSize:20,fontWeight:700,color:"#0f172a"},children:"Cloudwright"}),f.jsx("p",{style:{fontSize:12,color:"#64748b",marginTop:4},children:"Architecture Intelligence"})]}),s&&f.jsx("button",{onClick:()=>{if(window.confirm("Discard current session and start fresh?")){try{localStorage.setItem("cloudwright_last_session",JSON.stringify(e))}catch{}l(null),t([]),x(null)}},style:{padding:"5px 12px",borderRadius:6,border:"1px solid #e2e8f0",background:"#ffffff",color:"#64748b",cursor:"pointer",fontSize:12,fontWeight:500},children:"New"})]}),f.jsxs("div",{style:{flex:1,overflowY:"auto",padding:16},children:[e.length===0&&f.jsxs("div",{style:{color:"#64748b",padding:20,textAlign:"center"},children:[f.jsx("p",{style:{fontSize:14},children:"Describe your cloud architecture"}),f.jsx("p",{style:{fontSize:12,marginTop:8,color:"#94a3b8"},children:'"3-tier web app on AWS with CloudFront, ALB, EC2, and RDS"'})]}),e.map((S,E)=>f.jsxs("div",{style:{marginBottom:12},children:[f.jsx("div",{style:{padding:"10px 14px",borderRadius:8,background:S.role==="user"?"#2563eb":"#f1f5f9",color:S.role==="user"?"#ffffff":"#1e293b",fontSize:14,lineHeight:1.5},children:WC(S.content)}),S.role==="assistant"&&S.spec&&S.suggestions&&S.suggestions.length>0&&f.jsx("div",{style:{display:"flex",gap:6,marginTop:6,flexWrap:"wrap"},children:S.suggestions.map(b=>f.jsx("button",{onClick:()=>{var A;r(b),(A=k.current)==null||A.focus()},disabled:o!=="idle",style:{padding:"4px 10px",borderRadius:12,border:"1px solid #cbd5e1",background:"#ffffff",color:"#2563eb",cursor:o!=="idle"?"not-allowed":"pointer",fontSize:12,fontWeight:500},children:b},b))})]},E)),o!=="idle"&&f.jsxs("div",{style:{padding:"10px 14px",color:"#64748b",fontSize:14},children:[o==="generating"&&"Generating architecture...",o==="modifying"&&"Modifying architecture...",o==="costing"&&"Estimating cost & validating...",o==="done"&&"Finalizing..."]}),f.jsx("div",{ref:m})]}),f.jsx("div",{style:{padding:16,borderTop:"1px solid #e2e8f0"},children:f.jsxs("div",{style:{display:"flex",gap:8},children:[f.jsx("input",{ref:k,value:n,onChange:S=>r(S.target.value),onKeyDown:S=>S.key==="Enter"&&g(),placeholder:"Describe your architecture...",style:{flex:1,padding:"10px 14px",borderRadius:8,border:"1px solid #e2e8f0",background:"#ffffff",color:"#0f172a",fontSize:14,outline:"none"}}),f.jsx("button",{onClick:g,disabled:o!=="idle"||!n.trim(),style:{padding:"10px 20px",borderRadius:8,border:"none",background:o!=="idle"?"#e2e8f0":"#2563eb",color:o!=="idle"?"#94a3b8":"#fff",cursor:o!=="idle"?"not-allowed":"pointer",fontSize:14,fontWeight:600},children:"Send"})]})})]}),f.jsxs("div",{style:{flex:1,display:"flex",flexDirection:"column",background:"#ffffff"},children:[f.jsx("div",{style:{display:"flex",borderBottom:"1px solid #e2e8f0",background:"#ffffff"},children:["diagram","cost","validate","compliance","plan","export","spec","modify"].map(S=>f.jsx("button",{onClick:()=>u(S),style:{padding:"12px 24px",border:"none",borderBottom:a===S?"2px solid #2563eb":"2px solid transparent",background:"transparent",color:a===S?"#2563eb":"#64748b",cursor:"pointer",fontSize:14,fontWeight:500,textTransform:"capitalize"},children:S},S))}),f.jsxs("div",{style:{flex:1,overflow:"auto",display:"flex",flexDirection:"column"},children:[f.jsx("div",{style:{padding:"0.5rem 1rem"},children:f.jsx(zC,{spec:s,onDownloadTerraform:s?()=>h("terraform"):void 0,onDownloadYaml:s?()=>h("yaml"):void 0,validationSummary:d,usage:y})}),f.jsxs("div",{style:{flex:1,overflow:"auto"},children:[a==="diagram"&&(s||o!=="idle")&&f.jsxs("div",{style:{position:"relative",width:"100%",height:"100%"},children:[s&&f.jsx(jC,{spec:s,onSpecChange:v}),o!=="idle"&&f.jsxs("div",{style:{position:"absolute",top:16,right:16,background:"rgba(37, 99, 235, 0.9)",color:"white",padding:"8px 16px",borderRadius:8,fontSize:13,fontWeight:500,display:"flex",alignItems:"center",gap:8},children:[f.jsx("span",{style:{width:8,height:8,borderRadius:"50%",background:"white",animation:"pulse 1s infinite"}}),o==="generating"?"Generating...":o==="modifying"?"Modifying...":o==="costing"?"Costing & validating...":"Finalizing..."]})]}),a==="diagram"&&!s&&o==="idle"&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture to see the diagram."}),a==="cost"&&(s==null?void 0:s.cost_estimate)&&f.jsx(MC,{estimate:s.cost_estimate}),a==="cost"&&(!s||!s.cost_estimate)&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"No cost estimate available."}),a==="spec"&&s&&f.jsx(HC,{spec:s,yaml:((_=e.findLast(S=>S.yaml))==null?void 0:_.yaml)||"No YAML available"}),a==="spec"&&!s&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture first."}),a==="validate"&&s&&f.jsx(LC,{spec:s,apiBase:Ze}),a==="validate"&&!s&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture first."}),a==="compliance"&&s&&f.jsx($C,{spec:s,apiBase:Ze}),a==="compliance"&&!s&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture first."}),a==="plan"&&s&&f.jsx(OC,{spec:s,apiBase:Ze}),a==="plan"&&!s&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture first."}),a==="export"&&s&&f.jsx(BC,{spec:s,apiBase:Ze}),a==="export"&&!s&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture first."}),a==="modify"&&s&&f.jsxs("div",{style:{padding:32,maxWidth:800},children:[f.jsx("h2",{style:{fontSize:18,marginBottom:16,color:"#0f172a"},children:"Modify Architecture"}),o!=="idle"&&f.jsxs("div",{style:{marginBottom:12,fontSize:13,color:"#64748b"},children:[o==="modifying"&&"Modifying architecture...",o==="costing"&&"Estimating cost & validating...",o==="done"&&"Finalizing..."]}),f.jsx("div",{style:{display:"flex",gap:8},children:f.jsx("input",{value:p,onChange:S=>c(S.target.value),onKeyDown:async S=>{if(S.key==="Enter"&&p.trim()&&o==="idle"){const E=p;c(""),i("modifying");let b=null,A="",D=!1;try{try{await tp(!0,{spec:s,instruction:E},{onStage:I=>{I==="generating"?i("modifying"):(I==="costing"||I==="validating")&&i("costing")},onSpec:I=>{l(I),b=I,i("costing")},onCost:I=>{I&&b&&(b={...b,cost_estimate:I},l(b))},onValidation:(I,P)=>{I!==null&&x({passed:I,total:P})},onDone:(I,P)=>{b=I,A=P,l(I),i("done")},onUsage:I=>w(I),onError:I=>{throw new Error(I)}}),D=b!==null}catch{i("modifying")}if(!D){const I=await fetch(`${Ze}/modify`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:s,instruction:E})}),P=await I.json();if(!I.ok)throw new Error(su(P,"Modification failed"));P.usage&&w(P.usage);const C=P.spec;A=P.yaml,i("costing"),b=await Kl(C,x),l(b),i("done")}const T=b;t(I=>[...I,{role:"user",content:E},{role:"assistant",content:`Modified **${T.name}** with ${T.components.length} components on ${T.provider.toUpperCase()}.${T.cost_estimate?` Estimated cost: $${T.cost_estimate.monthly_total.toFixed(2)}/mo.`:""}`,spec:T,yaml:A,suggestions:ep(T)}])}catch(T){t(I=>[...I,{role:"user",content:E},{role:"assistant",content:`Error: ${T instanceof Error?T.message:"Modification failed"}`}])}finally{i("idle")}}},placeholder:"e.g. Add a Redis cache between web and database",style:{flex:1,padding:"10px 14px",borderRadius:8,border:"1px solid #e2e8f0",background:"#ffffff",color:"#0f172a",fontSize:14,outline:"none"}})}),f.jsx("p",{style:{fontSize:12,color:"#64748b",marginTop:8},children:"Press Enter to apply modification"})]}),a==="modify"&&!s&&f.jsx("div",{style:{padding:32,color:"#64748b"},children:"Design an architecture first."})]})]})]})]})}Zl.createRoot(document.getElementById("root")).render(f.jsx(pp.StrictMode,{children:f.jsx(UC,{})})); diff --git a/packages/web/cloudwright_web/static/index.html b/packages/web/cloudwright_web/static/index.html index fe8dac6..ac78efa 100644 --- a/packages/web/cloudwright_web/static/index.html +++ b/packages/web/cloudwright_web/static/index.html @@ -8,7 +8,7 @@ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #ffffff; color: #0f172a; } - + diff --git a/packages/web/frontend/src/App.tsx b/packages/web/frontend/src/App.tsx index ffbe563..b760fa1 100644 --- a/packages/web/frontend/src/App.tsx +++ b/packages/web/frontend/src/App.tsx @@ -7,6 +7,7 @@ import CompliancePanel from "./components/CompliancePanel"; import PlanPanel from "./components/PlanPanel"; import ExportPanel from "./components/ExportPanel"; import SpecPanel from "./components/SpecPanel"; +import { parseApiError, formatApiError } from "./lib/apiError"; interface ArchSpec { name: string; @@ -55,6 +56,14 @@ interface CostEstimate { currency: string; } +interface UsageInfo { + model?: string; + input_tokens?: number; + output_tokens?: number; + cost_usd?: number; + latency_ms?: number; +} + interface Message { role: "user" | "assistant"; content: string; @@ -146,6 +155,7 @@ async function streamDesignOrModify( onCost: (estimate: CostEstimate | null) => void; onValidation: (passed: number | null, total: number | null) => void; onDone: (spec: ArchSpec, yaml: string) => void; + onUsage?: (usage: UsageInfo) => void; onError: (message: string) => void; } ) { @@ -157,8 +167,7 @@ async function streamDesignOrModify( }); if (!response.ok) { - const data = await response.json(); - callbacks.onError(data.detail || "Request failed"); + callbacks.onError(await parseApiError(response)); return; } @@ -188,6 +197,7 @@ async function streamDesignOrModify( break; case "generated": callbacks.onSpec(event.spec, event.yaml); + if (event.usage && callbacks.onUsage) callbacks.onUsage(event.usage); break; case "costed": callbacks.onCost(event.cost_estimate); @@ -197,6 +207,7 @@ async function streamDesignOrModify( break; case "done": callbacks.onDone(event.spec, event.yaml); + if (event.usage && callbacks.onUsage) callbacks.onUsage(event.usage); break; case "error": callbacks.onError(event.message); @@ -218,6 +229,7 @@ function App() { const [modifyInput, setModifyInput] = useState(""); const [validationSummary, setValidationSummary] = useState<{ passed: number; total: number } | null>(null); + const [lastUsage, setLastUsage] = useState(null); const inputRef = useRef(null); const chatEndRef = useRef(null); @@ -272,6 +284,7 @@ function App() { setCurrentSpec(spec); setLoadingStage("done"); }, + onUsage: (usage) => setLastUsage(usage), onError: (msg) => { throw new Error(msg); }, }); streamSucceeded = finalSpec !== null; @@ -294,9 +307,10 @@ function App() { body: JSON.stringify({ description: input }), }); const data = await res.json(); - if (!res.ok) throw new Error(data.detail || "Request failed"); + if (!res.ok) throw new Error(formatApiError(data)); finalSpec = data.spec as ArchSpec; finalYaml = data.yaml; + if (data.usage) setLastUsage(data.usage as UsageInfo); setLoadingStage("costing"); finalSpec = await enrichSpec(finalSpec, setValidationSummary); @@ -529,6 +543,7 @@ function App() { onDownloadTerraform={currentSpec ? () => handleDownload("terraform") : undefined} onDownloadYaml={currentSpec ? () => handleDownload("yaml") : undefined} validationSummary={validationSummary} + usage={lastUsage} />

@@ -654,6 +669,7 @@ function App() { setCurrentSpec(spec); setLoadingStage("done"); }, + onUsage: (usage) => setLastUsage(usage), onError: (msg) => { throw new Error(msg); }, }); streamSucceeded = finalSpec !== null; @@ -668,7 +684,8 @@ function App() { body: JSON.stringify({ spec: currentSpec, instruction }), }); const data = await res.json(); - if (!res.ok) throw new Error(data.detail || "Modification failed"); + if (!res.ok) throw new Error(formatApiError(data, "Modification failed")); + if (data.usage) setLastUsage(data.usage as UsageInfo); const rawSpec = data.spec as ArchSpec; finalYaml = data.yaml; setLoadingStage("costing"); diff --git a/packages/web/frontend/src/components/CompliancePanel.tsx b/packages/web/frontend/src/components/CompliancePanel.tsx index 2e34b1a..b0134f0 100644 --- a/packages/web/frontend/src/components/CompliancePanel.tsx +++ b/packages/web/frontend/src/components/CompliancePanel.tsx @@ -1,4 +1,5 @@ import React, { useState, useCallback } from "react"; +import { parseApiError } from "../lib/apiError"; interface ControlRef { framework: string; @@ -74,10 +75,7 @@ export default function CompliancePanel({ spec, apiBase }: CompliancePanelProps) headers: { "Content-Type": "application/json" }, body: JSON.stringify({ spec, frameworks: selected }), }); - if (!res.ok) { - const j = await res.json().catch(() => ({})); - throw new Error(j.detail || `Request failed (${res.status})`); - } + if (!res.ok) throw new Error(await parseApiError(res)); setReport((await res.json()) as ComplianceReport); } catch (e) { setError(e instanceof Error ? e.message : "Compliance scan failed"); diff --git a/packages/web/frontend/src/components/ExportPanel.tsx b/packages/web/frontend/src/components/ExportPanel.tsx index 9194f36..a4b68b0 100644 --- a/packages/web/frontend/src/components/ExportPanel.tsx +++ b/packages/web/frontend/src/components/ExportPanel.tsx @@ -1,4 +1,5 @@ import React, { useState, useCallback, useRef } from "react"; +import { parseApiError } from "../lib/apiError"; interface ExportPanelProps { spec: Record; @@ -74,8 +75,8 @@ export default function ExportPanel({ spec, apiBase }: ExportPanelProps) { headers: { "Content-Type": "application/json" }, body: JSON.stringify({ spec, format: fmt }), }); + if (!res.ok) throw new Error(await parseApiError(res)); const data = await res.json(); - if (!res.ok) throw new Error(data.detail || "Export failed"); setContent(data.content || JSON.stringify(data, null, 2)); } catch (err) { setError(err instanceof Error ? err.message : "Export failed"); diff --git a/packages/web/frontend/src/components/PlanPanel.tsx b/packages/web/frontend/src/components/PlanPanel.tsx index a42f3cc..b1c53e6 100644 --- a/packages/web/frontend/src/components/PlanPanel.tsx +++ b/packages/web/frontend/src/components/PlanPanel.tsx @@ -1,4 +1,5 @@ import React, { useState, useCallback } from "react"; +import { parseApiError } from "../lib/apiError"; interface PlanResult { tool: string; @@ -38,10 +39,7 @@ export default function PlanPanel({ spec, apiBase }: PlanPanelProps) { headers: { "Content-Type": "application/json" }, body: JSON.stringify({ spec, target, run_plan: true }), }); - if (!res.ok) { - const j = await res.json().catch(() => ({})); - throw new Error(j.detail || `Request failed (${res.status})`); - } + if (!res.ok) throw new Error(await parseApiError(res)); setResult((await res.json()) as PlanResult); } catch (e) { setError(e instanceof Error ? e.message : "Plan failed"); diff --git a/packages/web/frontend/src/components/SummaryBar.tsx b/packages/web/frontend/src/components/SummaryBar.tsx index e53e1a1..c1c3e17 100644 --- a/packages/web/frontend/src/components/SummaryBar.tsx +++ b/packages/web/frontend/src/components/SummaryBar.tsx @@ -1,15 +1,31 @@ import React from 'react'; +interface UsageInfo { + model?: string; + input_tokens?: number; + output_tokens?: number; + cost_usd?: number; + latency_ms?: number; +} + interface SummaryBarProps { spec: any | null; onDownloadTerraform?: () => void; onDownloadYaml?: () => void; validationSummary?: { passed: number; total: number } | null; + usage?: UsageInfo | null; } -export default function SummaryBar({ spec, onDownloadTerraform, onDownloadYaml, validationSummary }: SummaryBarProps) { +export default function SummaryBar({ spec, onDownloadTerraform, onDownloadYaml, validationSummary, usage }: SummaryBarProps) { if (!spec) return null; + const usageParts: string[] = []; + if (usage?.model) usageParts.push(usage.model.replace("claude-", "").replace("anthropic.", "")); + if (usage?.input_tokens != null && usage?.output_tokens != null) + usageParts.push(`${((usage.input_tokens + usage.output_tokens) / 1000).toFixed(1)}k tokens`); + if (usage?.cost_usd != null) usageParts.push(`$${usage.cost_usd.toFixed(4)}`); + if (usage?.latency_ms != null) usageParts.push(`${(usage.latency_ms / 1000).toFixed(1)}s`); + return (
)} + {usageParts.length > 0 && ( + {usageParts.join(' · ')} + )}
{onDownloadTerraform && (