From a7fda67ca3d3e7e64d1399482f868c11c20de7b7 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Thu, 12 Mar 2026 19:01:39 +0000 Subject: [PATCH 01/19] add claude.md --- CLAUDE.md | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..a5d4ed1 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,157 @@ +# CLAUDE.md — Administration Data + +## Project Overview + +Indexes Cardano treasury governance data from the blockchain and exposes it via a REST API. Three components work together: + +1. **YACI Store indexer** — Java-based blockchain indexer (black-box dependency) that reads from a Cardano node and writes raw data to PostgreSQL +2. **PostgreSQL** — stores both raw blockchain data (`yaci_store` schema) and normalized app data (`treasury` schema) +3. **Rust API** — syncs from YACI Store tables into treasury tables, then serves REST endpoints + +Swagger docs are at `/docs` when the API is running. + +## Architecture & Data Flow + +``` +Cardano Node → YACI Store indexer → PostgreSQL (yaci_store schema) + ↓ + Rust API sync service + ↓ + PostgreSQL (treasury schema) + ↓ + REST API +``` + +- **`yaci_store` schema**: raw blockchain data, managed by YACI Store's Flyway migrations — never modify manually +- **`treasury` schema**: normalized app data, managed by `database/schema/treasury.sql` and init scripts +- The YACI Store plugin filter (`indexer/plugins/scripts/treasury-filter.mvel`) reduces stored data by ~95% + +## Domain Context (TOM / Cardano Treasury) + +This project implements the **Treasury Oversight Metadata (TOM)** standard, using CIP-100 metadata label **1694**. + +### Contract Hierarchy +- **Treasury Contract (TRSC)** → contains multiple **Vendor Contracts (PSSC)** → each has **Milestones** + +### Event Types +publish, initialize, fund, complete, disburse, withdraw, pause, resume, modify, cancel, sweep, reorganize + +### Financial Model +- All amounts are in **lovelace** (1 ADA = 1,000,000 lovelace) +- Milestone lifecycle: pending → completed → disbursed + +### Treasury Instance +The `TREASURY_INSTANCE` env var filters to a specific on-chain treasury. Changing it tracks a different treasury entirely. + +## Development Setup + +### Prerequisites +- Docker and docker-compose +- Rust toolchain (for native API development) + +### Quick Start +```bash +./dev.sh start # starts PostgreSQL + indexer + API +``` + +### Dev Script Commands +```bash +./dev.sh start # start all services (API runs natively if Rust is installed) +./dev.sh stop # stop all Docker services +./dev.sh restart # restart Docker services +./dev.sh logs # tail all logs (or: ./dev.sh logs indexer) +./dev.sh status # show service status +./dev.sh build # build Docker images +./dev.sh clean # stop and remove all containers + volumes +``` + +### Native API Development +```bash +# With Docker DB already running: +cd api +DATABASE_URL="postgresql://postgres:postgres@localhost:5433/administration_data" cargo run +``` + +### Build & Test +```bash +cd api +cargo build --release +cargo check # fast type-checking +cargo test # run tests +``` + +### Environment Setup +Copy `.env.example` to `.env` and configure: +- `TREASURY_INSTANCE` — the on-chain treasury to track +- `STORE_CARDANO_SYNC_START_SLOT` / `STORE_CARDANO_SYNC_START_BLOCKHASH` — where to start syncing + +## Port Mappings + +| Service | Host Port | Container Port | +|------------|-----------|----------------| +| PostgreSQL | 5433 | 5432 | +| YACI Store | 8081 | 8080 | +| API | 8080 | 8080 | + +PostgreSQL uses **5433** on the host to avoid conflicts with local PostgreSQL installations. + +Database connection string: `postgresql://postgres:postgres@localhost:5433/administration_data` + +## Code Conventions + +- Rust 2021 edition, **Axum 0.7** web framework +- **SQLx** for database queries (compile-time checked) +- **utoipa** OpenAPI decorators on all endpoints and models +- Consistent API response envelope: `{ data, pagination?, meta.timestamp }` +- Follow existing patterns in the codebase +- Add tests for new code + +## Database + +- Schema source of truth: `database/schema/treasury.sql` +- Init scripts: `database/init/` — run on first Docker PostgreSQL start +- For schema changes: create incremental migration files, don't edit `treasury.sql` directly for running systems +- YACI Store schema is auto-managed by Flyway — **never modify manually** + +## Indexer + +YACI Store is a **black-box dependency**. Only modify configuration and plugins: + +- `indexer/application.properties` — indexer config +- `indexer/config/application-plugins.yml` — plugin configuration +- `indexer/plugins/scripts/treasury-filter.mvel` — MVEL filter script + +Never modify `yaci-store.jar` or YACI Store internals. Primary network: Mainnet (`backbone.cardano.iog.io:3001`). + +## CI/CD + +- **`ci.yml`**: runs `cargo build --release && cargo test` on push/PR to main/develop +- **`push-to-ecr.yaml`**: builds Docker image and pushes to AWS ECR on push to main (or manual dispatch) +- Deployment: Helm chart bump in a separate repo + +## Gotchas + +- **Startup ordering**: YACI Store must be running and synced before the API sync service can process events. The sync service (`api/src/services/sync.rs`) waits for YACI Store tables to exist. +- **Port 5433**: PostgreSQL is on host port 5433, not 5432. +- **`.env` not committed**: copy `.env.example` and configure before first run. +- **UTXO pruning**: YACI Store prunes spent UTXOs — historical UTXO data may not be available. +- **Large JAR**: `indexer/yaci-store.jar` is ~108MB and committed to the repo. Don't regenerate unnecessarily. + +## Key File Locations + +| Purpose | Path | +|--------------------|---------------------------------------| +| API entry point | `api/src/main.rs` | +| API routes | `api/src/routes/v1/` | +| API models | `api/src/models/v1.rs` | +| Event processing | `api/src/services/event_processor.rs` | +| Sync service | `api/src/services/sync.rs` | +| DB schema | `database/schema/treasury.sql` | +| DB init scripts | `database/init/` | +| Docker setup | `docker-compose.yml` | +| Dev script | `dev.sh` | +| Indexer config | `indexer/application.properties` | +| Plugin config | `indexer/config/application-plugins.yml` | +| Treasury filter | `indexer/plugins/scripts/treasury-filter.mvel` | +| CI | `.github/workflows/ci.yml` | +| ECR push | `.github/workflows/push-to-ecr.yaml` | From 2652be28181abe62e43fc3e1ee0f247199e3e1f3 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Thu, 12 Mar 2026 22:22:54 +0000 Subject: [PATCH 02/19] update database and docs for improved milestone design --- CLAUDE.md | 17 ++++- .../001_milestone_lifecycle_redesign.sql | 54 ++++++++++++++ database/schema/treasury.sql | 74 +++++++++++++------ 3 files changed, 121 insertions(+), 24 deletions(-) create mode 100644 database/migrations/001_milestone_lifecycle_redesign.sql diff --git a/CLAUDE.md b/CLAUDE.md index a5d4ed1..5bad1bb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -38,7 +38,20 @@ publish, initialize, fund, complete, disburse, withdraw, pause, resume, modify, ### Financial Model - All amounts are in **lovelace** (1 ADA = 1,000,000 lovelace) -- Milestone lifecycle: pending → completed → disbursed + +### Milestone Lifecycle +Milestones use 3 independent boolean flags (not a linear status): +- **evidence_provided** — vendor submitted completion evidence via a `complete` transaction +- **withdrawn** — vendor withdrew payment via a `withdraw` transaction +- **archived** — milestone replaced by a `modify` event (old row preserved, new row created) + +Additionally, each milestone has a **time_limit** (POSIXTime ms) from the inline UTXO datum. +Claimability is derived: time_limit < current time AND NOT withdrawn. + +Archive model: on modify, existing row → archived=true, new row inserted. superseded_by FK links old → new. + +**Disburse vs Withdraw**: Disburse is treasury-level (moves funds from treasury contract to any address). +Withdraw is milestone-level (vendor claims matured milestone funds from vendor contract). These are completely separate. ### Treasury Instance The `TREASURY_INSTANCE` env var filters to a specific on-chain treasury. Changing it tracks a different treasury entirely. @@ -136,6 +149,8 @@ Never modify `yaci-store.jar` or YACI Store internals. Primary network: Mainnet - **`.env` not committed**: copy `.env.example` and configure before first run. - **UTXO pruning**: YACI Store prunes spent UTXOs — historical UTXO data may not be available. - **Large JAR**: `indexer/yaci-store.jar` is ~108MB and committed to the repo. Don't regenerate unnecessarily. +- **Inline datums**: `store.script.enabled` must be `true` in YACI Store config for milestone datum data (amounts, time limits). Currently disabled. +- **Milestone archiving**: Filter `WHERE NOT archived` for current milestones. Archived rows are historical versions. ## Key File Locations diff --git a/database/migrations/001_milestone_lifecycle_redesign.sql b/database/migrations/001_milestone_lifecycle_redesign.sql new file mode 100644 index 0000000..c271743 --- /dev/null +++ b/database/migrations/001_milestone_lifecycle_redesign.sql @@ -0,0 +1,54 @@ +-- Migration: Milestone Lifecycle Redesign +-- Replaces linear status field with independent boolean flags +-- and renames disburse -> withdraw (disburse is treasury-level, not milestone-level) + +BEGIN; + +-- Add new columns +ALTER TABLE treasury.milestones + ADD COLUMN time_limit BIGINT, + ADD COLUMN withdrawn BOOLEAN NOT NULL DEFAULT FALSE, + ADD COLUMN evidence_provided BOOLEAN NOT NULL DEFAULT FALSE, + ADD COLUMN archived BOOLEAN NOT NULL DEFAULT FALSE, + ADD COLUMN withdraw_tx_hash VARCHAR(64), + ADD COLUMN withdraw_time BIGINT, + ADD COLUMN withdraw_amount BIGINT, + ADD COLUMN archived_by_tx_hash VARCHAR(64), + ADD COLUMN archived_at BIGINT, + ADD COLUMN superseded_by INT REFERENCES treasury.milestones(id); + +-- Migrate: completed/disbursed → evidence_provided +UPDATE treasury.milestones +SET evidence_provided = TRUE +WHERE status IN ('completed', 'disbursed'); + +-- Migrate: disbursed → withdrawn (best-effort mapping of old incorrect model) +UPDATE treasury.milestones +SET withdrawn = TRUE, + withdraw_tx_hash = disburse_tx_hash, + withdraw_time = disburse_time, + withdraw_amount = disburse_amount +WHERE status = 'disbursed'; + +-- Drop old columns +ALTER TABLE treasury.milestones + DROP COLUMN status, + DROP COLUMN disburse_tx_hash, + DROP COLUMN disburse_time, + DROP COLUMN disburse_amount; + +-- Replace UNIQUE constraint with partial unique index +ALTER TABLE treasury.milestones + DROP CONSTRAINT IF EXISTS milestones_vendor_contract_id_milestone_id_key; + +CREATE UNIQUE INDEX idx_milestone_active_unique + ON treasury.milestones(vendor_contract_id, milestone_id) + WHERE NOT archived; + +CREATE INDEX IF NOT EXISTS idx_milestone_not_archived + ON treasury.milestones(vendor_contract_id) WHERE NOT archived; + +-- Drop old status index +DROP INDEX IF EXISTS treasury.idx_milestone_status; + +COMMIT; diff --git a/database/schema/treasury.sql b/database/schema/treasury.sql index 56b6e4e..bb4e4dd 100644 --- a/database/schema/treasury.sql +++ b/database/schema/treasury.sql @@ -55,18 +55,34 @@ CREATE TABLE IF NOT EXISTS treasury.milestones ( label TEXT, -- Milestone name description TEXT, -- Detailed description acceptance_criteria TEXT, -- Completion criteria - amount_lovelace BIGINT, -- Allocated amount (if specified) - status TEXT DEFAULT 'pending', -- pending/completed/disbursed + + -- From inline UTXO datum + amount_lovelace BIGINT, -- Lovelace amount from datum Value map + time_limit BIGINT, -- POSIXTime in milliseconds + + -- Independent boolean lifecycle flags + withdrawn BOOLEAN NOT NULL DEFAULT FALSE, + evidence_provided BOOLEAN NOT NULL DEFAULT FALSE, + archived BOOLEAN NOT NULL DEFAULT FALSE, + + -- Withdraw details (set when withdrawn = true) + withdraw_tx_hash VARCHAR(64), + withdraw_time BIGINT, + withdraw_amount BIGINT, + + -- Evidence/completion details (set when evidence_provided = true) complete_tx_hash VARCHAR(64), -- Completion transaction complete_time BIGINT, -- Completion timestamp complete_description TEXT, -- Description from complete event evidence JSONB, -- Evidence array from complete event - disburse_tx_hash VARCHAR(64), -- Disbursement transaction - disburse_time BIGINT, -- Disbursement timestamp - disburse_amount BIGINT, -- Actual disbursed amount + + -- Archive details (set when archived = true) + archived_by_tx_hash VARCHAR(64), + archived_at BIGINT, + superseded_by INT REFERENCES treasury.milestones(id), + created_at TIMESTAMPTZ DEFAULT NOW(), - updated_at TIMESTAMPTZ DEFAULT NOW(), - UNIQUE(vendor_contract_id, milestone_id) + updated_at TIMESTAMPTZ DEFAULT NOW() ); -- Events - Audit log of all TOM events @@ -138,8 +154,13 @@ CREATE INDEX IF NOT EXISTS idx_vendor_search ON treasury.vendor_contracts -- Milestones CREATE INDEX IF NOT EXISTS idx_milestone_vendor ON treasury.milestones(vendor_contract_id); -CREATE INDEX IF NOT EXISTS idx_milestone_status ON treasury.milestones(status); CREATE INDEX IF NOT EXISTS idx_milestone_order ON treasury.milestones(vendor_contract_id, milestone_order); +-- Only one active (non-archived) milestone per vendor contract + milestone_id +CREATE UNIQUE INDEX IF NOT EXISTS idx_milestone_active_unique + ON treasury.milestones(vendor_contract_id, milestone_id) + WHERE NOT archived; +CREATE INDEX IF NOT EXISTS idx_milestone_not_archived + ON treasury.milestones(vendor_contract_id) WHERE NOT archived; -- Events CREATE INDEX IF NOT EXISTS idx_event_type ON treasury.events(event_type); @@ -221,13 +242,13 @@ SELECT -- Treasury context tc.contract_instance as treasury_instance, tc.name as treasury_name, - -- Milestone counts - COUNT(DISTINCT m.id) as total_milestones, - COUNT(DISTINCT m.id) FILTER (WHERE m.status = 'pending') as pending_milestones, - COUNT(DISTINCT m.id) FILTER (WHERE m.status = 'completed') as completed_milestones, - COUNT(DISTINCT m.id) FILTER (WHERE m.status = 'disbursed') as disbursed_milestones, + -- Milestone counts (excluding archived) + COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived) as total_milestones, + COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND NOT m.evidence_provided AND NOT m.withdrawn) as pending_milestones, + COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND m.evidence_provided AND NOT m.withdrawn) as completed_milestones, + COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND m.withdrawn) as withdrawn_milestones, -- Financial totals from milestones - COALESCE(SUM(DISTINCT m.disburse_amount), 0)::BIGINT as total_disbursed_lovelace, + COALESCE(SUM(DISTINCT m.withdraw_amount) FILTER (WHERE NOT m.archived), 0)::BIGINT as total_withdrawn_lovelace, -- Current balance from UTXOs COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent), 0)::BIGINT as current_balance_lovelace, COUNT(u.id) FILTER (WHERE NOT u.spent) as utxo_count, @@ -251,14 +272,20 @@ SELECT m.description, m.acceptance_criteria, m.amount_lovelace, - m.status, + m.time_limit, + m.withdrawn, + m.evidence_provided, + m.archived, m.complete_tx_hash, m.complete_time, m.complete_description, m.evidence, - m.disburse_tx_hash, - m.disburse_time, - m.disburse_amount, + m.withdraw_tx_hash, + m.withdraw_time, + m.withdraw_amount, + m.archived_by_tx_hash, + m.archived_at, + m.superseded_by, vc.project_id, vc.project_name, vc.vendor_address @@ -359,10 +386,10 @@ SELECT tc.name as treasury_name, -- Allocation totals COALESCE(SUM(vc.initial_amount_lovelace), 0)::BIGINT as total_allocated_lovelace, - -- Disbursement totals - COALESCE(SUM(m_totals.total_disbursed), 0)::BIGINT as total_disbursed_lovelace, - -- Remaining (allocated - disbursed) - (COALESCE(SUM(vc.initial_amount_lovelace), 0) - COALESCE(SUM(m_totals.total_disbursed), 0))::BIGINT as total_remaining_lovelace, + -- Withdrawal totals + COALESCE(SUM(m_totals.total_withdrawn), 0)::BIGINT as total_withdrawn_lovelace, + -- Remaining (allocated - withdrawn) + (COALESCE(SUM(vc.initial_amount_lovelace), 0) - COALESCE(SUM(m_totals.total_withdrawn), 0))::BIGINT as total_remaining_lovelace, -- Treasury balance (actual UTXOs) COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent AND u.address = tc.contract_address), 0)::BIGINT as treasury_balance_lovelace, -- Project-level balance (sum of project UTXOs) @@ -380,8 +407,9 @@ LEFT JOIN treasury.vendor_contracts vc ON vc.treasury_id = tc.id LEFT JOIN ( SELECT m.vendor_contract_id, - SUM(COALESCE(m.disburse_amount, 0)) as total_disbursed + SUM(COALESCE(m.withdraw_amount, 0)) as total_withdrawn FROM treasury.milestones m + WHERE NOT m.archived GROUP BY m.vendor_contract_id ) m_totals ON m_totals.vendor_contract_id = vc.id LEFT JOIN treasury.utxos u ON u.address = tc.contract_address From b57bd09da8e56b69c9463678de8534e3598db819 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Fri, 13 Mar 2026 10:37:33 +0000 Subject: [PATCH 03/19] redo milestone lifecycle --- README.md | 2 +- api/README.md | 36 +++--- api/src/models/v1.rs | 147 +++++++++++++++--------- api/src/openapi.rs | 5 +- api/src/routes/v1/milestones.rs | 68 +++++++++--- api/src/routes/v1/statistics.rs | 20 ++-- api/src/routes/v1/vendor_contracts.rs | 16 ++- api/src/services/event_processor.rs | 154 ++++++++++++++++++-------- database/README.md | 32 +++--- docs/architecture.md | 32 +++--- 10 files changed, 341 insertions(+), 171 deletions(-) diff --git a/README.md b/README.md index 720c8a6..acb8058 100644 --- a/README.md +++ b/README.md @@ -249,7 +249,7 @@ SELECT * FROM treasury.v_treasury_summary; -- Vendor contracts with financials SELECT project_id, project_name, status, initial_amount_lovelace / 1000000 as allocated_ada, - total_disbursed_lovelace / 1000000 as disbursed_ada + total_withdrawn_lovelace / 1000000 as withdrawn_ada FROM treasury.v_vendor_contracts_summary; -- Recent events diff --git a/api/README.md b/api/README.md index 3a4c285..6b9ecc8 100644 --- a/api/README.md +++ b/api/README.md @@ -224,16 +224,16 @@ curl "http://localhost:8080/api/v1/vendor-contracts?status=active&search=communi "total": 5, "pending": 2, "completed": 2, - "disbursed": 1 + "withdrawn": 1 }, "financials": { "total_allocated_lovelace": 1000000000000, "total_allocated_ada": 1000000.0, - "total_disbursed_lovelace": 400000000000, - "total_disbursed_ada": 400000.0, + "total_withdrawn_lovelace": 400000000000, + "total_withdrawn_ada": 400000.0, "current_balance_lovelace": 600000000000, "current_balance_ada": 600000.0, - "disbursement_percentage": 40.0, + "withdrawal_percentage": 40.0, "utxo_count": 3 }, "treasury": { @@ -288,19 +288,23 @@ Get all milestones for a specific project. "acceptance_criteria": "Deliver research report", "amount_lovelace": 200000000000, "amount_ada": 200000.0, - "status": "disbursed", + "time_limit": 1704240000000, + "withdrawn": true, + "evidence_provided": true, + "archived": false, "completion": { "tx_hash": "abc123...", "time": 1704067200, "description": "Research completed successfully", "evidence": [...] }, - "disbursement": { + "withdrawal": { "tx_hash": "def456...", "time": 1704153600, "amount_lovelace": 200000000000, "amount_ada": 200000.0 }, + "archive_info": null, "project": { "project_id": "EC-0008-25", "project_name": "Community Hub Development" @@ -341,9 +345,11 @@ List all milestones across all projects. |-----------|------|---------|-------------| | `page` | integer | 1 | Page number | | `limit` | integer | 50 | Results per page | -| `status` | string | - | Filter by status: `pending`, `completed`, `disbursed` | +| `withdrawn` | boolean | - | Filter by withdrawn status | +| `evidence_provided` | boolean | - | Filter by evidence provided status | +| `archived` | boolean | false | Filter by archived status (defaults to false) | | `project_id` | string | - | Filter by project ID | -| `sort` | string | - | Sort field: `milestone_order`, `complete_time`, `disburse_time`, `amount` | +| `sort` | string | - | Sort field: `milestone_order`, `complete_time`, `withdraw_time`, `amount` | #### `GET /api/v1/milestones/:id` @@ -458,7 +464,7 @@ Get comprehensive statistics across all data. "total_count": 50, "pending_count": 20, "completed_count": 15, - "disbursed_count": 15 + "withdrawn_count": 15 }, "events": { "total_count": 45, @@ -475,8 +481,8 @@ Get comprehensive statistics across all data. "financials": { "total_allocated_lovelace": 5000000000000, "total_allocated_ada": 5000000.0, - "total_disbursed_lovelace": 2000000000000, - "total_disbursed_ada": 2000000.0, + "total_withdrawn_lovelace": 2000000000000, + "total_withdrawn_ada": 2000000.0, "current_balance_lovelace": 3000000000000, "current_balance_ada": 3000000.0 }, @@ -501,9 +507,9 @@ The API tracks the following Treasury Oversight Metadata (TOM) events: | `publish` | Publish a treasury contract | | `initialize` | Initialize a treasury contract | | `fund` | Fund a vendor contract from treasury | -| `complete` | Mark a milestone as complete | -| `disburse` | Disburse funds for a completed milestone | -| `withdraw` | Withdraw funds | +| `complete` | Submit evidence of milestone completion | +| `disburse` | Disburse funds from treasury (treasury-level) | +| `withdraw` | Vendor withdraws matured milestone funds (milestone-level) | | `pause` | Pause a contract | | `resume` | Resume a paused contract | | `modify` | Modify contract parameters | @@ -593,5 +599,5 @@ The API queries the `treasury` schema: | `v_treasury_summary` | Treasury with statistics and financials | | `v_vendor_contracts_summary` | Projects with milestone counts and financials | | `v_events_with_context` | Events with treasury/project/milestone context | -| `v_financial_summary` | Allocated vs disbursed vs remaining | +| `v_financial_summary` | Allocated vs withdrawn vs remaining | | `v_milestone_timeline` | Milestones with project context | diff --git a/api/src/models/v1.rs b/api/src/models/v1.rs index adea57b..572bc4c 100644 --- a/api/src/models/v1.rs +++ b/api/src/models/v1.rs @@ -355,10 +355,10 @@ pub struct MilestonesSummary { pub total: i64, /// Pending milestones pub pending: i64, - /// Completed milestones (but not yet disbursed) + /// Completed milestones (evidence provided but not yet withdrawn) pub completed: i64, - /// Disbursed milestones - pub disbursed: i64, + /// Withdrawn milestones + pub withdrawn: i64, } /// Vendor contract financial summary @@ -368,16 +368,16 @@ pub struct VendorFinancials { pub total_allocated_lovelace: i64, /// Total allocated amount in ADA pub total_allocated_ada: f64, - /// Total disbursed amount in lovelace - pub total_disbursed_lovelace: i64, - /// Total disbursed amount in ADA - pub total_disbursed_ada: f64, + /// Total withdrawn amount in lovelace + pub total_withdrawn_lovelace: i64, + /// Total withdrawn amount in ADA + pub total_withdrawn_ada: f64, /// Current balance in lovelace (from UTXOs) pub current_balance_lovelace: i64, /// Current balance in ADA pub current_balance_ada: f64, - /// Disbursement percentage - pub disbursement_percentage: f64, + /// Withdrawal percentage + pub withdrawal_percentage: f64, /// UTXO count pub utxo_count: i64, } @@ -417,8 +417,8 @@ pub struct VendorContractSummaryRow { pub total_milestones: Option, pub pending_milestones: Option, pub completed_milestones: Option, - pub disbursed_milestones: Option, - pub total_disbursed_lovelace: Option, + pub withdrawn_milestones: Option, + pub total_withdrawn_lovelace: Option, pub current_balance_lovelace: Option, pub utxo_count: Option, pub last_event_time: Option, @@ -428,10 +428,10 @@ pub struct VendorContractSummaryRow { impl From for VendorContractSummary { fn from(row: VendorContractSummaryRow) -> Self { let initial_amount = row.initial_amount_lovelace.unwrap_or(0); - let total_disbursed = row.total_disbursed_lovelace.unwrap_or(0); + let total_withdrawn = row.total_withdrawn_lovelace.unwrap_or(0); let current_balance = row.current_balance_lovelace.unwrap_or(0); - let disbursement_pct = if initial_amount > 0 { - (total_disbursed as f64 / initial_amount as f64) * 100.0 + let withdrawal_pct = if initial_amount > 0 { + (total_withdrawn as f64 / initial_amount as f64) * 100.0 } else { 0.0 }; @@ -454,16 +454,16 @@ impl From for VendorContractSummary { total: row.total_milestones.unwrap_or(0), pending: row.pending_milestones.unwrap_or(0), completed: row.completed_milestones.unwrap_or(0), - disbursed: row.disbursed_milestones.unwrap_or(0), + withdrawn: row.withdrawn_milestones.unwrap_or(0), }, financials: VendorFinancials { total_allocated_lovelace: initial_amount, total_allocated_ada: lovelace_to_ada(initial_amount), - total_disbursed_lovelace: total_disbursed, - total_disbursed_ada: lovelace_to_ada(total_disbursed), + total_withdrawn_lovelace: total_withdrawn, + total_withdrawn_ada: lovelace_to_ada(total_withdrawn), current_balance_lovelace: current_balance, current_balance_ada: lovelace_to_ada(current_balance), - disbursement_percentage: disbursement_pct, + withdrawal_percentage: withdrawal_pct, utxo_count: row.utxo_count.unwrap_or(0), }, treasury: TreasuryReference { @@ -479,10 +479,10 @@ impl From for VendorContractSummary { impl From for VendorContractDetail { fn from(row: VendorContractSummaryRow) -> Self { let initial_amount = row.initial_amount_lovelace.unwrap_or(0); - let total_disbursed = row.total_disbursed_lovelace.unwrap_or(0); + let total_withdrawn = row.total_withdrawn_lovelace.unwrap_or(0); let current_balance = row.current_balance_lovelace.unwrap_or(0); - let disbursement_pct = if initial_amount > 0 { - (total_disbursed as f64 / initial_amount as f64) * 100.0 + let withdrawal_pct = if initial_amount > 0 { + (total_withdrawn as f64 / initial_amount as f64) * 100.0 } else { 0.0 }; @@ -506,16 +506,16 @@ impl From for VendorContractDetail { total: row.total_milestones.unwrap_or(0), pending: row.pending_milestones.unwrap_or(0), completed: row.completed_milestones.unwrap_or(0), - disbursed: row.disbursed_milestones.unwrap_or(0), + withdrawn: row.withdrawn_milestones.unwrap_or(0), }, financials: VendorFinancials { total_allocated_lovelace: initial_amount, total_allocated_ada: lovelace_to_ada(initial_amount), - total_disbursed_lovelace: total_disbursed, - total_disbursed_ada: lovelace_to_ada(total_disbursed), + total_withdrawn_lovelace: total_withdrawn, + total_withdrawn_ada: lovelace_to_ada(total_withdrawn), current_balance_lovelace: current_balance, current_balance_ada: lovelace_to_ada(current_balance), - disbursement_percentage: disbursement_pct, + withdrawal_percentage: withdrawal_pct, utxo_count: row.utxo_count.unwrap_or(0), }, treasury: TreasuryReference { @@ -553,12 +553,20 @@ pub struct MilestoneResponse { pub amount_lovelace: Option, /// Allocated amount in ADA pub amount_ada: Option, - /// Milestone status (pending/completed/disbursed) - pub status: String, + /// Time limit (POSIXTime in milliseconds) + pub time_limit: Option, + /// Whether the vendor has withdrawn funds + pub withdrawn: bool, + /// Whether completion evidence has been provided + pub evidence_provided: bool, + /// Whether this milestone has been archived (replaced by a modify event) + pub archived: bool, /// Completion details pub completion: Option, - /// Disbursement details - pub disbursement: Option, + /// Withdrawal details + pub withdrawal: Option, + /// Archive info (present when archived) + pub archive_info: Option, /// Project reference pub project: ProjectReference, } @@ -576,19 +584,30 @@ pub struct MilestoneCompletion { pub evidence: Option, } -/// Milestone disbursement details +/// Milestone withdrawal details #[derive(Debug, Serialize, Deserialize, ToSchema)] -pub struct MilestoneDisbursement { - /// Disbursement transaction hash +pub struct MilestoneWithdrawal { + /// Withdrawal transaction hash pub tx_hash: String, - /// Disbursement time (Unix timestamp) + /// Withdrawal time (Unix timestamp) pub time: Option, - /// Disbursed amount in lovelace + /// Withdrawn amount in lovelace pub amount_lovelace: Option, - /// Disbursed amount in ADA + /// Withdrawn amount in ADA pub amount_ada: Option, } +/// Milestone archive info (present when milestone has been superseded by a modify event) +#[derive(Debug, Serialize, Deserialize, ToSchema)] +pub struct MilestoneArchiveInfo { + /// Transaction hash of the modify event that archived this milestone + pub archived_by_tx_hash: Option, + /// Time the milestone was archived + pub archived_at: Option, + /// ID of the new milestone that replaced this one + pub superseded_by_id: Option, +} + /// Project reference #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct ProjectReference { @@ -610,14 +629,20 @@ pub struct MilestoneRow { pub description: Option, pub acceptance_criteria: Option, pub amount_lovelace: Option, - pub status: String, + pub time_limit: Option, + pub withdrawn: bool, + pub evidence_provided: bool, + pub archived: bool, pub complete_tx_hash: Option, pub complete_time: Option, pub complete_description: Option, pub evidence: Option, - pub disburse_tx_hash: Option, - pub disburse_time: Option, - pub disburse_amount: Option, + pub withdraw_tx_hash: Option, + pub withdraw_time: Option, + pub withdraw_amount: Option, + pub archived_by_tx_hash: Option, + pub archived_at: Option, + pub superseded_by: Option, pub project_id: String, pub project_name: Option, } @@ -631,13 +656,23 @@ impl From for MilestoneResponse { evidence: row.evidence.clone(), }); - let disbursement = row.disburse_tx_hash.as_ref().map(|tx| MilestoneDisbursement { + let withdrawal = row.withdraw_tx_hash.as_ref().map(|tx| MilestoneWithdrawal { tx_hash: tx.clone(), - time: row.disburse_time, - amount_lovelace: row.disburse_amount, - amount_ada: row.disburse_amount.map(lovelace_to_ada), + time: row.withdraw_time, + amount_lovelace: row.withdraw_amount, + amount_ada: row.withdraw_amount.map(lovelace_to_ada), }); + let archive_info = if row.archived { + Some(MilestoneArchiveInfo { + archived_by_tx_hash: row.archived_by_tx_hash, + archived_at: row.archived_at, + superseded_by_id: row.superseded_by, + }) + } else { + None + }; + Self { id: row.id, milestone_id: row.milestone_id, @@ -647,9 +682,13 @@ impl From for MilestoneResponse { acceptance_criteria: row.acceptance_criteria, amount_lovelace: row.amount_lovelace, amount_ada: row.amount_lovelace.map(lovelace_to_ada), - status: row.status, + time_limit: row.time_limit, + withdrawn: row.withdrawn, + evidence_provided: row.evidence_provided, + archived: row.archived, completion, - disbursement, + withdrawal, + archive_info, project: ProjectReference { project_id: row.project_id, project_name: row.project_name, @@ -923,10 +962,10 @@ pub struct FinancialStats { pub total_allocated_lovelace: i64, /// Total allocated to projects in ADA pub total_allocated_ada: f64, - /// Total disbursed in lovelace - pub total_disbursed_lovelace: i64, - /// Total disbursed in ADA - pub total_disbursed_ada: f64, + /// Total withdrawn in lovelace + pub total_withdrawn_lovelace: i64, + /// Total withdrawn in ADA + pub total_withdrawn_ada: f64, /// Current total balance in lovelace (from UTXOs) pub current_balance_lovelace: i64, /// Current total balance in ADA @@ -1019,11 +1058,15 @@ pub struct MilestonesQuery { /// Items per page #[serde(default = "default_limit")] pub limit: u32, - /// Filter by status (pending/completed/disbursed) - pub status: Option, + /// Filter by withdrawn status + pub withdrawn: Option, + /// Filter by evidence_provided status + pub evidence_provided: Option, + /// Filter by archived status (defaults to false if not specified) + pub archived: Option, /// Filter by project ID pub project_id: Option, - /// Sort field (milestone_order, complete_time, disburse_time) + /// Sort field (milestone_order, complete_time, withdraw_time) pub sort: Option, } diff --git a/api/src/openapi.rs b/api/src/openapi.rs index 1b62629..3dc7220 100644 --- a/api/src/openapi.rs +++ b/api/src/openapi.rs @@ -4,7 +4,7 @@ use utoipa::OpenApi; use crate::models::v1::{ ApiResponse, EventMilestoneContext, EventProjectContext, EventResponse, EventStats, - EventTreasuryContext, EventsQuery, FinancialStats, MilestoneCompletion, MilestoneDisbursement, + EventTreasuryContext, EventsQuery, FinancialStats, MilestoneArchiveInfo, MilestoneCompletion, MilestoneWithdrawal, MilestoneResponse, MilestoneStats, MilestonesSummary, MilestonesQuery, PaginatedResponse, Pagination, ProjectEventsQuery, ProjectReference, ProjectStats, RecentEventsQuery, ResponseMeta, StatisticsResponse, StatusResponse, SyncStats, TreasuryFinancials, @@ -88,7 +88,8 @@ use crate::routes::v1::{ // Milestones MilestoneResponse, MilestoneCompletion, - MilestoneDisbursement, + MilestoneWithdrawal, + MilestoneArchiveInfo, ProjectReference, // Events EventResponse, diff --git a/api/src/routes/v1/milestones.rs b/api/src/routes/v1/milestones.rs index f67f548..fda296a 100644 --- a/api/src/routes/v1/milestones.rs +++ b/api/src/routes/v1/milestones.rs @@ -36,8 +36,22 @@ pub async fn list_milestones( let mut conditions = Vec::new(); let mut bind_index = 1; - if params.status.is_some() { - conditions.push(format!("m.status = ${}", bind_index)); + // Default to non-archived milestones unless archived filter is explicitly set + if let Some(archived) = params.archived { + conditions.push(format!("m.archived = ${}", bind_index)); + bind_index += 1; + let _ = archived; // used via binding below + } else { + conditions.push("NOT m.archived".to_string()); + } + + if params.withdrawn.is_some() { + conditions.push(format!("m.withdrawn = ${}", bind_index)); + bind_index += 1; + } + + if params.evidence_provided.is_some() { + conditions.push(format!("m.evidence_provided = ${}", bind_index)); bind_index += 1; } @@ -55,7 +69,7 @@ pub async fn list_milestones( // Determine sort order let sort_clause = match params.sort.as_deref() { Some("complete_time") => "m.complete_time DESC NULLS LAST", - Some("disburse_time") => "m.disburse_time DESC NULLS LAST", + Some("withdraw_time") => "m.withdraw_time DESC NULLS LAST", Some("amount") => "m.amount_lovelace DESC NULLS LAST", _ => "vc.project_id, m.milestone_order", }; @@ -73,8 +87,14 @@ pub async fn list_milestones( let mut count_q = sqlx::query_as::<_, (i64,)>(&count_query); - if let Some(ref status) = params.status { - count_q = count_q.bind(status); + if let Some(archived) = params.archived { + count_q = count_q.bind(archived); + } + if let Some(withdrawn) = params.withdrawn { + count_q = count_q.bind(withdrawn); + } + if let Some(evidence_provided) = params.evidence_provided { + count_q = count_q.bind(evidence_provided); } if let Some(ref project_id) = params.project_id { count_q = count_q.bind(project_id); @@ -100,14 +120,20 @@ pub async fn list_milestones( m.description, m.acceptance_criteria, m.amount_lovelace, - m.status, + m.time_limit, + m.withdrawn, + m.evidence_provided, + m.archived, m.complete_tx_hash, m.complete_time, m.complete_description, m.evidence, - m.disburse_tx_hash, - m.disburse_time, - m.disburse_amount, + m.withdraw_tx_hash, + m.withdraw_time, + m.withdraw_amount, + m.archived_by_tx_hash, + m.archived_at, + m.superseded_by, vc.project_id, vc.project_name FROM treasury.milestones m @@ -124,8 +150,14 @@ pub async fn list_milestones( let mut data_q = sqlx::query_as::<_, MilestoneRow>(&data_query); - if let Some(ref status) = params.status { - data_q = data_q.bind(status); + if let Some(archived) = params.archived { + data_q = data_q.bind(archived); + } + if let Some(withdrawn) = params.withdrawn { + data_q = data_q.bind(withdrawn); + } + if let Some(evidence_provided) = params.evidence_provided { + data_q = data_q.bind(evidence_provided); } if let Some(ref project_id) = params.project_id { data_q = data_q.bind(project_id); @@ -175,14 +207,20 @@ pub async fn get_milestone( m.description, m.acceptance_criteria, m.amount_lovelace, - m.status, + m.time_limit, + m.withdrawn, + m.evidence_provided, + m.archived, m.complete_tx_hash, m.complete_time, m.complete_description, m.evidence, - m.disburse_tx_hash, - m.disburse_time, - m.disburse_amount, + m.withdraw_tx_hash, + m.withdraw_time, + m.withdraw_amount, + m.archived_by_tx_hash, + m.archived_at, + m.superseded_by, vc.project_id, vc.project_name FROM treasury.milestones m diff --git a/api/src/routes/v1/statistics.rs b/api/src/routes/v1/statistics.rs index 484580c..ddf3748 100644 --- a/api/src/routes/v1/statistics.rs +++ b/api/src/routes/v1/statistics.rs @@ -117,10 +117,10 @@ async fn get_milestone_stats(pool: &PgPool) -> Result( r#" SELECT - COUNT(*), - COUNT(*) FILTER (WHERE status = 'pending'), - COUNT(*) FILTER (WHERE status = 'completed'), - COUNT(*) FILTER (WHERE status = 'withdrawn') + COUNT(*) FILTER (WHERE NOT archived), + COUNT(*) FILTER (WHERE NOT archived AND NOT evidence_provided AND NOT withdrawn), + COUNT(*) FILTER (WHERE NOT archived AND evidence_provided AND NOT withdrawn), + COUNT(*) FILTER (WHERE NOT archived AND withdrawn) FROM treasury.milestones "# ) @@ -185,9 +185,9 @@ async fn get_financial_stats(pool: &PgPool) -> Result,) = sqlx::query_as( - "SELECT COALESCE(SUM(disburse_amount), 0)::BIGINT FROM treasury.milestones WHERE status = 'disbursed'" + // Get total withdrawn + let (total_withdrawn,): (Option,) = sqlx::query_as( + "SELECT COALESCE(SUM(withdraw_amount), 0)::BIGINT FROM treasury.milestones WHERE withdrawn AND NOT archived" ) .fetch_one(pool) .await @@ -208,14 +208,14 @@ async fn get_financial_stats(pool: &PgPool) -> Result = sqlx::query_scalar( r#" UPDATE treasury.milestones - SET status = 'completed', + SET evidence_provided = TRUE, complete_tx_hash = $1, complete_time = $2, complete_description = $3, evidence = $4 - WHERE vendor_contract_id = $5 AND milestone_id = $6 + WHERE vendor_contract_id = $5 AND milestone_id = $6 AND NOT archived RETURNING id "# ) @@ -400,10 +400,10 @@ impl EventProcessor { sqlx::query( r#" UPDATE treasury.milestones - SET status = 'completed', + SET evidence_provided = TRUE, complete_tx_hash = $1, complete_time = $2 - WHERE vendor_contract_id = $3 AND milestone_id = $4 AND status = 'pending' + WHERE vendor_contract_id = $3 AND milestone_id = $4 AND NOT archived "# ) .bind(&event.tx_hash) @@ -417,7 +417,7 @@ impl EventProcessor { Ok(()) } - /// Process a disburse event - update milestone status + /// Process a disburse event - treasury-level fund movement (does not touch milestones) async fn process_disburse(&self, event: &RawTomEvent, body: &Value) -> anyhow::Result<()> { let event_body = body.get("body").unwrap_or(body); @@ -439,45 +439,13 @@ impl EventProcessor { self.find_vendor_contract_from_inputs(&event.tx_hash).await? }; - // Get disbursed amount from tx outputs - cast SUM to BIGINT - let disburse_amount: Option = sqlx::query_scalar( - "SELECT COALESCE(SUM(lovelace_amount)::bigint, 0) FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr NOT LIKE 'addr1x%'" - ) - .bind(&event.tx_hash) - .fetch_optional(&self.pool) - .await?; - - // Check for milestone field and update if present - let db_milestone_id: Option = if let (Some(vc_id), Some(milestone_id)) = (vendor_contract_id, event_body.get("milestone").and_then(|m| m.as_str())) { - sqlx::query_scalar( - r#" - UPDATE treasury.milestones - SET status = 'disbursed', - disburse_tx_hash = $1, - disburse_time = $2, - disburse_amount = $3 - WHERE vendor_contract_id = $4 AND milestone_id = $5 - RETURNING id - "# - ) - .bind(&event.tx_hash) - .bind(event.block_time) - .bind(disburse_amount) - .bind(vc_id) - .bind(milestone_id) - .fetch_optional(&self.pool) - .await? - } else { - None - }; - - // Always insert the disburse event (may be treasury-level without vendor_contract) - self.insert_event_with_destination(event, "disburse", None, vendor_contract_id, db_milestone_id, &destination, body).await?; + // Insert the disburse event (treasury-level, never updates milestones) + self.insert_event_with_destination(event, "disburse", None, vendor_contract_id, None, &destination, body).await?; Ok(()) } - /// Process a withdraw event + /// Process a withdraw event - vendor claims matured milestone funds async fn process_withdraw(&self, event: &RawTomEvent, body: &Value) -> anyhow::Result<()> { let event_body = body.get("body").unwrap_or(body); @@ -498,7 +466,39 @@ impl EventProcessor { }; if let Some(vc_id) = vendor_contract_id { - self.insert_event(event, "withdraw", None, Some(vc_id), None, body).await?; + // Get withdraw amount from tx outputs (non-script addresses) + let withdraw_amount: Option = sqlx::query_scalar( + "SELECT COALESCE(SUM(lovelace_amount)::bigint, 0) FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr NOT LIKE 'addr1x%'" + ) + .bind(&event.tx_hash) + .fetch_optional(&self.pool) + .await?; + + // Update milestone if milestone field is present in metadata + let db_milestone_id: Option = if let Some(milestone_id) = event_body.get("milestone").and_then(|m| m.as_str()) { + sqlx::query_scalar( + r#" + UPDATE treasury.milestones + SET withdrawn = TRUE, + withdraw_tx_hash = $1, + withdraw_time = $2, + withdraw_amount = $3 + WHERE vendor_contract_id = $4 AND milestone_id = $5 AND NOT archived + RETURNING id + "# + ) + .bind(&event.tx_hash) + .bind(event.block_time) + .bind(withdraw_amount) + .bind(vc_id) + .bind(milestone_id) + .fetch_optional(&self.pool) + .await? + } else { + None + }; + + self.insert_event(event, "withdraw", None, Some(vc_id), db_milestone_id, body).await?; } else { tracing::debug!("Could not find vendor contract for withdraw event {}", event.tx_hash); } @@ -582,7 +582,7 @@ impl EventProcessor { Ok(()) } - /// Process a modify event - update vendor contract + /// Process a modify event - update vendor contract, archive and replace milestones async fn process_modify(&self, event: &RawTomEvent, body: &Value) -> anyhow::Result<()> { let event_body = body.get("body").unwrap_or(body); @@ -604,6 +604,70 @@ impl EventProcessor { }; if let Some(vc_id) = vendor_contract_id { + // If milestones are present in the modify metadata, archive existing and insert new + if let Some(milestones) = event_body.get("milestones").and_then(|m| m.as_array()) { + // Archive all active milestones for this vendor contract + sqlx::query( + r#" + UPDATE treasury.milestones + SET archived = TRUE, archived_by_tx_hash = $1, archived_at = $2 + WHERE vendor_contract_id = $3 AND NOT archived + "# + ) + .bind(&event.tx_hash) + .bind(event.block_time) + .bind(vc_id) + .execute(&self.pool) + .await?; + + // Insert new milestone rows + for (idx, milestone) in milestones.iter().enumerate() { + let default_id = format!("m-{}", idx); + let milestone_id = milestone.get("identifier") + .and_then(|i| i.as_str()) + .unwrap_or(&default_id); + let label = extract_text_from_value(Some(milestone.get("label").unwrap_or(&Value::Null))); + let description = extract_text_from_value(Some(milestone.get("description").unwrap_or(&Value::Null))); + let acceptance_criteria = extract_text_from_value(Some(milestone.get("acceptanceCriteria").unwrap_or(&Value::Null))); + let amount = milestone.get("amount") + .and_then(|a| a.as_i64()); + + let new_id: i32 = sqlx::query_scalar( + r#" + INSERT INTO treasury.milestones ( + vendor_contract_id, milestone_id, milestone_order, label, + description, acceptance_criteria, amount_lovelace + ) + VALUES ($1, $2, $3, $4, $5, $6, $7) + RETURNING id + "# + ) + .bind(vc_id) + .bind(milestone_id) + .bind((idx + 1) as i32) + .bind(&label) + .bind(&description) + .bind(&acceptance_criteria) + .bind(amount) + .fetch_one(&self.pool) + .await?; + + // Update superseded_by on the archived row that matches this milestone_id + sqlx::query( + r#" + UPDATE treasury.milestones + SET superseded_by = $1 + WHERE vendor_contract_id = $2 AND milestone_id = $3 AND archived AND superseded_by IS NULL + "# + ) + .bind(new_id) + .bind(vc_id) + .bind(milestone_id) + .execute(&self.pool) + .await?; + } + } + self.insert_event_with_reason(event, "modify", None, Some(vc_id), None, &reason, body).await?; } else { tracing::debug!("Could not find vendor contract for modify event {}", event.tx_hash); diff --git a/database/README.md b/database/README.md index 542c9e9..084f643 100644 --- a/database/README.md +++ b/database/README.md @@ -49,7 +49,7 @@ Stores vendor/project contract instances (PSSC). | status | TEXT | active/paused/completed/cancelled | ### treasury.milestones -Stores milestone data for each vendor contract. +Stores milestone data for each vendor contract. Uses 3 independent boolean flags instead of a linear status. | Column | Type | Description | |--------|------|-------------| @@ -60,15 +60,21 @@ Stores milestone data for each vendor contract. | label | TEXT | Milestone name | | description | TEXT | Detailed description | | acceptance_criteria | TEXT | Completion criteria | -| amount_lovelace | BIGINT | Allocated amount | -| status | TEXT | pending/completed/disbursed | +| amount_lovelace | BIGINT | Lovelace amount from datum | +| time_limit | BIGINT | POSIXTime in milliseconds from datum | +| withdrawn | BOOLEAN | Vendor withdrew payment | +| evidence_provided | BOOLEAN | Vendor submitted completion evidence | +| archived | BOOLEAN | Milestone replaced by modify event | +| withdraw_tx_hash | VARCHAR(64) | Withdrawal transaction | +| withdraw_time | BIGINT | Withdrawal timestamp | +| withdraw_amount | BIGINT | Withdrawn amount | | complete_tx_hash | VARCHAR(64) | Completion transaction | | complete_time | BIGINT | Completion timestamp | | complete_description | TEXT | Completion notes | | evidence | JSONB | Evidence array | -| disburse_tx_hash | VARCHAR(64) | Disbursement transaction | -| disburse_time | BIGINT | Disbursement timestamp | -| disburse_amount | BIGINT | Disbursed amount | +| archived_by_tx_hash | VARCHAR(64) | Modify tx that archived this milestone | +| archived_at | BIGINT | Archive timestamp | +| superseded_by | INT | FK to replacement milestone | ### treasury.events Audit log of all TOM (Treasury Oversight Metadata) events. @@ -137,7 +143,7 @@ Vendor contracts with milestone counts, financials, and UTXO balance. SELECT * FROM treasury.v_vendor_contracts_summary; ``` -Fields: id, treasury_id, project_id, other_identifiers, project_name, description, vendor_name, vendor_address, contract_url, contract_address, fund_tx_hash, fund_slot, fund_block_time, initial_amount_lovelace, status, created_at, updated_at, treasury_instance, treasury_name, total_milestones, pending_milestones, completed_milestones, disbursed_milestones, total_disbursed_lovelace, current_balance_lovelace, utxo_count, last_event_time, event_count +Fields: id, treasury_id, project_id, other_identifiers, project_name, description, vendor_name, vendor_address, contract_url, contract_address, fund_tx_hash, fund_slot, fund_block_time, initial_amount_lovelace, status, created_at, updated_at, treasury_instance, treasury_name, total_milestones, pending_milestones, completed_milestones, withdrawn_milestones, total_withdrawn_lovelace, current_balance_lovelace, utxo_count, last_event_time, event_count ### treasury.v_events_with_context Events with full treasury/project/milestone context. @@ -149,13 +155,13 @@ SELECT * FROM treasury.v_events_with_context ORDER BY block_time DESC; Fields: id, tx_hash, slot, block_number, block_time, event_type, amount_lovelace, reason, destination, metadata, created_at, treasury_instance, treasury_name, project_id, project_name, vendor_name, project_address, milestone_id, milestone_label, milestone_order ### treasury.v_financial_summary -Financial summary showing allocated vs disbursed vs remaining. +Financial summary showing allocated vs withdrawn vs remaining. ```sql SELECT * FROM treasury.v_financial_summary; ``` -Fields: treasury_id, contract_instance, treasury_name, total_allocated_lovelace, total_disbursed_lovelace, total_remaining_lovelace, treasury_balance_lovelace, project_balance_lovelace, project_count, active_project_count +Fields: treasury_id, contract_instance, treasury_name, total_allocated_lovelace, total_withdrawn_lovelace, total_remaining_lovelace, treasury_balance_lovelace, project_balance_lovelace, project_count, active_project_count ### treasury.v_milestone_timeline Milestones with vendor contract context. @@ -164,7 +170,7 @@ Milestones with vendor contract context. SELECT * FROM treasury.v_milestone_timeline; ``` -Fields: id, milestone_id, milestone_order, label, description, acceptance_criteria, amount_lovelace, status, complete_tx_hash, complete_time, complete_description, evidence, disburse_tx_hash, disburse_time, disburse_amount, project_id, project_name, vendor_address +Fields: id, milestone_id, milestone_order, label, description, acceptance_criteria, amount_lovelace, time_limit, withdrawn, evidence_provided, archived, complete_tx_hash, complete_time, complete_description, evidence, withdraw_tx_hash, withdraw_time, withdraw_amount, archived_by_tx_hash, archived_at, superseded_by, project_id, project_name, vendor_address ### treasury.v_recent_events Events with context, ordered by slot descending (for recent activity). @@ -226,10 +232,10 @@ SELECT project_name, vendor_name, initial_amount_lovelace / 1000000.0 as allocated_ada, - total_disbursed_lovelace / 1000000.0 as disbursed_ada, + total_withdrawn_lovelace / 1000000.0 as withdrawn_ada, current_balance_lovelace / 1000000.0 as balance_ada, total_milestones, - disbursed_milestones + withdrawn_milestones FROM treasury.v_vendor_contracts_summary WHERE status = 'active' ORDER BY fund_block_time DESC; @@ -250,7 +256,7 @@ LIMIT 20; SELECT contract_instance, total_allocated_lovelace / 1000000.0 as total_allocated_ada, - total_disbursed_lovelace / 1000000.0 as total_disbursed_ada, + total_withdrawn_lovelace / 1000000.0 as total_withdrawn_ada, total_remaining_lovelace / 1000000.0 as remaining_ada, project_count, active_project_count diff --git a/docs/architecture.md b/docs/architecture.md index 184b625..6484d51 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -206,7 +206,7 @@ This document describes how data flows through the Cardano Administration Data S │ ┌─────────────┬───────────────┼───────────────┬─────────────┐ │ │ ▼ ▼ ▼ ▼ ▼ │ │ ┌─────────┐ ┌──────────┐ ┌────────────┐ ┌──────────┐ ┌──────────┐ │ -│ │ publish │ │initialize│ │ fund │ │ complete │ │ disburse │ │ +│ │ publish │ │initialize│ │ fund │ │ complete │ │ withdraw │ │ │ └─────────┘ └──────────┘ └────────────┘ └──────────┘ └──────────┘ │ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ │ @@ -224,9 +224,10 @@ This document describes how data flows through the Cardano Administration Data S │ │ id │ │ id │ │ id │ │ id │ │ │ │ instance │◄────│ treasury_id │◄───│ vendor_id │ │ tx_hash │ │ │ │ name │ │ project_id │ │ label │ │ event │ │ -│ │ publish_tx │ │ project_name │ │ status │ │ metadata │ │ +│ │ publish_tx │ │ project_name │ │ withdrawn │ │ metadata │ │ │ └───────────────┘ │ status │ │ amount │ └──────────┘ │ -│ └───────────────┘ └───────────┘ │ +│ └───────────────┘ │ archived │ │ +│ └───────────┘ │ └─────────────────────────────────────────────────────────────────────────────┘ ``` @@ -277,9 +278,9 @@ This document describes how data flows through the Cardano Administration Data S │ 3. INSERT milestones (for each milestone in array) │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ INSERT INTO treasury.milestones │ │ - │ │ (vendor_contract_id, milestone_id, label, amount, status) │ │ - │ │ VALUES (1, 'm1', 'Phase 1', 1000000, 'pending') │ │ - │ │ VALUES (1, 'm2', 'Phase 2', 2000000, 'pending') │ │ + │ │ (vendor_contract_id, milestone_id, label, amount) │ │ + │ │ VALUES (1, 'm1', 'Phase 1', 1000000) │ │ + │ │ VALUES (1, 'm2', 'Phase 2', 2000000) │ │ │ └──────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ @@ -347,9 +348,9 @@ This document describes how data flows through the Cardano Administration Data S │ UTXO₂ is spent ▼ ┌─────────────────────────────────────────────────────────────────────────┐ - │ DISBURSE TRANSACTION │ + │ WITHDRAW TRANSACTION │ │ tx_hash: "ghi789" │ - │ metadata: { "event": "disburse" } │ + │ metadata: { "event": "withdraw", "milestone": "m1" } │ │ (NO project_id!) │ │ │ │ inputs: │ @@ -359,6 +360,7 @@ This document describes how data flows through the Cardano Administration Data S │ 1. Get inputs: [(def456, 0)] │ │ 2. Lookup treasury.utxos WHERE tx_hash="def456" AND index=0 │ │ 3. Found! vendor_contract_id = 1 │ + │ 4. UPDATE milestones SET withdrawn=TRUE WHERE milestone_id='m1' │ └─────────────────────────────────────────────────────────────────────────┘ ``` @@ -410,11 +412,11 @@ This document describes how data flows through the Cardano Administration Data S │ "status": "active", │ │ "initial_amount_lovelace": 1000000000000, │ │ "initial_amount_ada": 1000000.0, │ - │ "milestones_summary": { "total": 5, "disbursed": 2 }, │ + │ "milestones_summary": { "total": 5, "withdrawn": 2 }, │ │ "financials": { │ │ "total_allocated_ada": 1000000.0, │ - │ "total_disbursed_ada": 400000.0, │ - │ "disbursement_percentage": 40.0 │ + │ "total_withdrawn_ada": 400000.0, │ + │ "withdrawal_percentage": 40.0 │ │ } │ │ }, │ │ "meta": { "timestamp": "2026-01-28T10:30:00Z" } │ @@ -462,10 +464,14 @@ This document describes how data flows through the Cardano Administration Data S │ vendor_contract_id │ │ milestone_id │ │ label │ - │ status │ │ amount_lovelace │ + │ time_limit │ + │ withdrawn │ + │ evidence_provided │ + │ archived │ + │ withdraw_tx_hash │ │ complete_tx_hash │ - │ disburse_tx_hash │ + │ superseded_by │ └─────────────────────┘ ┌─────────────────────┐ From 0e18726269b45002ab5643bf95817f4591be6634 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Fri, 13 Mar 2026 18:50:53 +0000 Subject: [PATCH 04/19] redo and fix the event processing logic --- CLAUDE.md | 19 +- api/Cargo.toml | 5 + api/src/main.rs | 1 + api/src/models/v1.rs | 73 +-- api/src/parsers/datum.rs | 273 ++++++++++ api/src/parsers/mod.rs | 1 + api/src/routes/v1/milestones.rs | 2 + api/src/routes/v1/statistics.rs | 26 +- api/src/routes/v1/vendor_contracts.rs | 1 + api/src/services/event_processor.rs | 612 ++++++++++++++------- api/src/services/sync.rs | 11 +- database/init/02-treasury-schema.sql | 83 ++- database/schema/treasury.sql | 9 +- docs/event-processing.md | 743 ++++++++++++++++++++++++++ indexer/application.properties | 2 +- 15 files changed, 1545 insertions(+), 316 deletions(-) create mode 100644 api/src/parsers/datum.rs create mode 100644 docs/event-processing.md diff --git a/CLAUDE.md b/CLAUDE.md index 5bad1bb..fe403fb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -31,18 +31,31 @@ Cardano Node → YACI Store indexer → PostgreSQL (yaci_store schema) This project implements the **Treasury Oversight Metadata (TOM)** standard, using CIP-100 metadata label **1694**. ### Contract Hierarchy -- **Treasury Contract (TRSC)** → contains multiple **Vendor Contracts (PSSC)** → each has **Milestones** +- **Treasury Contract (TRSC)** → at a unique script address, holds treasury reserve funds +- **Vendor Contract (PSSC)** → **ONE shared script address for ALL projects** (not one per project) + - Each `fund` tx creates UTXOs at the shared PSSC address + - UTXOs belong to specific projects, distinguished by inline datum, NOT by address + - UTXO chain tracking (`find_vendor_contract_from_inputs`) links events to projects by tracing spent inputs +- **Milestones** → belong to a vendor contract/project + +### Vendor Naming +- `vendor.name` does **not exist** in the TOM spec — code extracts it but always gets null +- `vendor.label` in the spec is the vendor's display name; in practice, real metadata puts the payment address here +- Vendor identity is typically embedded in the top-level `body.label` by convention (e.g., "Tastenkunst GmbH - Eternl Maintenance") ### Event Types publish, initialize, fund, complete, disburse, withdraw, pause, resume, modify, cancel, sweep, reorganize +See [`docs/event-processing.md`](docs/event-processing.md) for detailed per-event field mappings, code extraction paths, DB writes, and known bugs. + ### Financial Model - All amounts are in **lovelace** (1 ADA = 1,000,000 lovelace) ### Milestone Lifecycle -Milestones use 3 independent boolean flags (not a linear status): +Milestones use 4 independent boolean flags (not a linear status): - **evidence_provided** — vendor submitted completion evidence via a `complete` transaction - **withdrawn** — vendor withdrew payment via a `withdraw` transaction +- **paused** — oversight committee paused this milestone (from inline datum constructor 0→1) - **archived** — milestone replaced by a `modify` event (old row preserved, new row created) Additionally, each milestone has a **time_limit** (POSIXTime ms) from the inline UTXO datum. @@ -149,7 +162,7 @@ Never modify `yaci-store.jar` or YACI Store internals. Primary network: Mainnet - **`.env` not committed**: copy `.env.example` and configure before first run. - **UTXO pruning**: YACI Store prunes spent UTXOs — historical UTXO data may not be available. - **Large JAR**: `indexer/yaci-store.jar` is ~108MB and committed to the repo. Don't regenerate unnecessarily. -- **Inline datums**: `store.script.enabled` must be `true` in YACI Store config for milestone datum data (amounts, time limits). Currently disabled. +- **Inline datums**: `store.script.enabled=true` in YACI Store config enables milestone datum data (amounts, time limits, pause flags). Requires full re-sync after enabling. - **Milestone archiving**: Filter `WHERE NOT archived` for current milestones. Archived rows are historical versions. ## Key File Locations diff --git a/api/Cargo.toml b/api/Cargo.toml index 359dab0..b7ce758 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -40,3 +40,8 @@ chrono = { version = "0.4", features = ["serde"] } # UUID uuid = { version = "1.0", features = ["v4", "serde"] } + +# Cardano datum parsing (CBOR/Plutus) +pallas-primitives = "0.30" +pallas-codec = "0.30" +hex = "0.4" diff --git a/api/src/main.rs b/api/src/main.rs index 9ace2bb..9b405c7 100644 --- a/api/src/main.rs +++ b/api/src/main.rs @@ -19,6 +19,7 @@ fn env_u16(key: &str, default: u16) -> u16 { mod models; mod openapi; +mod parsers; mod routes; mod services; diff --git a/api/src/models/v1.rs b/api/src/models/v1.rs index 572bc4c..681bd48 100644 --- a/api/src/models/v1.rs +++ b/api/src/models/v1.rs @@ -1,7 +1,7 @@ //! V1 API Models with OpenAPI support //! //! These models follow the new API design with: -//! - Both lovelace AND ADA amounts in responses +//! - Amounts in lovelace (1 ADA = 1,000,000 lovelace) //! - Raw metadata AND parsed/normalized data //! - Consistent response envelopes with pagination @@ -10,18 +10,6 @@ use serde::{Deserialize, Serialize}; use sqlx::FromRow; use utoipa::{IntoParams, ToSchema}; -// ============================================================================ -// CONSTANTS -// ============================================================================ - -/// Lovelace per ADA -pub const LOVELACE_PER_ADA: f64 = 1_000_000.0; - -/// Convert lovelace to ADA -pub fn lovelace_to_ada(lovelace: i64) -> f64 { - lovelace as f64 / LOVELACE_PER_ADA -} - // ============================================================================ // RESPONSE ENVELOPE // ============================================================================ @@ -192,8 +180,6 @@ pub struct TreasuryStatistics { pub struct TreasuryFinancials { /// Treasury balance in lovelace pub balance_lovelace: i64, - /// Treasury balance in ADA - pub balance_ada: f64, } /// Database row for treasury summary @@ -248,7 +234,6 @@ impl From for TreasuryResponse { }, financials: TreasuryFinancials { balance_lovelace: balance, - balance_ada: lovelace_to_ada(balance), }, created_at: row.created_at, updated_at: row.updated_at, @@ -287,8 +272,6 @@ pub struct VendorContractSummary { pub fund_time: Option, /// Initial allocated amount in lovelace pub initial_amount_lovelace: Option, - /// Initial allocated amount in ADA - pub initial_amount_ada: Option, /// Milestone summary pub milestones_summary: MilestonesSummary, /// Financial summary @@ -318,6 +301,8 @@ pub struct VendorContractDetail { pub vendor_name: Option, /// Vendor payment address pub vendor_address: Option, + /// Vendor payment key hash from datum + pub vendor_payment_key_hash: Option, /// Contract URL (link to agreement) pub contract_url: Option, /// PSSC script address @@ -330,8 +315,6 @@ pub struct VendorContractDetail { pub fund_time: Option, /// Initial allocated amount in lovelace pub initial_amount_lovelace: Option, - /// Initial allocated amount in ADA - pub initial_amount_ada: Option, /// Milestone summary pub milestones_summary: MilestonesSummary, /// Financial summary @@ -359,6 +342,8 @@ pub struct MilestonesSummary { pub completed: i64, /// Withdrawn milestones pub withdrawn: i64, + /// Paused milestones + pub paused: i64, } /// Vendor contract financial summary @@ -366,16 +351,10 @@ pub struct MilestonesSummary { pub struct VendorFinancials { /// Total allocated amount in lovelace pub total_allocated_lovelace: i64, - /// Total allocated amount in ADA - pub total_allocated_ada: f64, /// Total withdrawn amount in lovelace pub total_withdrawn_lovelace: i64, - /// Total withdrawn amount in ADA - pub total_withdrawn_ada: f64, /// Current balance in lovelace (from UTXOs) pub current_balance_lovelace: i64, - /// Current balance in ADA - pub current_balance_ada: f64, /// Withdrawal percentage pub withdrawal_percentage: f64, /// UTXO count @@ -418,6 +397,7 @@ pub struct VendorContractSummaryRow { pub pending_milestones: Option, pub completed_milestones: Option, pub withdrawn_milestones: Option, + pub paused_milestones: Option, pub total_withdrawn_lovelace: Option, pub current_balance_lovelace: Option, pub utxo_count: Option, @@ -449,20 +429,17 @@ impl From for VendorContractSummary { fund_tx_hash: row.fund_tx_hash, fund_time: row.fund_block_time, initial_amount_lovelace: row.initial_amount_lovelace, - initial_amount_ada: row.initial_amount_lovelace.map(lovelace_to_ada), milestones_summary: MilestonesSummary { total: row.total_milestones.unwrap_or(0), pending: row.pending_milestones.unwrap_or(0), completed: row.completed_milestones.unwrap_or(0), withdrawn: row.withdrawn_milestones.unwrap_or(0), + paused: row.paused_milestones.unwrap_or(0), }, financials: VendorFinancials { total_allocated_lovelace: initial_amount, - total_allocated_ada: lovelace_to_ada(initial_amount), total_withdrawn_lovelace: total_withdrawn, - total_withdrawn_ada: lovelace_to_ada(total_withdrawn), current_balance_lovelace: current_balance, - current_balance_ada: lovelace_to_ada(current_balance), withdrawal_percentage: withdrawal_pct, utxo_count: row.utxo_count.unwrap_or(0), }, @@ -495,26 +472,24 @@ impl From for VendorContractDetail { description: row.description, vendor_name: row.vendor_name, vendor_address: row.vendor_address, + vendor_payment_key_hash: None, // populated from DB when queried directly contract_url: row.contract_url, contract_address: row.contract_address, status: row.status, fund_tx_hash: row.fund_tx_hash, fund_time: row.fund_block_time, initial_amount_lovelace: row.initial_amount_lovelace, - initial_amount_ada: row.initial_amount_lovelace.map(lovelace_to_ada), milestones_summary: MilestonesSummary { total: row.total_milestones.unwrap_or(0), pending: row.pending_milestones.unwrap_or(0), completed: row.completed_milestones.unwrap_or(0), withdrawn: row.withdrawn_milestones.unwrap_or(0), + paused: row.paused_milestones.unwrap_or(0), }, financials: VendorFinancials { total_allocated_lovelace: initial_amount, - total_allocated_ada: lovelace_to_ada(initial_amount), total_withdrawn_lovelace: total_withdrawn, - total_withdrawn_ada: lovelace_to_ada(total_withdrawn), current_balance_lovelace: current_balance, - current_balance_ada: lovelace_to_ada(current_balance), withdrawal_percentage: withdrawal_pct, utxo_count: row.utxo_count.unwrap_or(0), }, @@ -551,14 +526,14 @@ pub struct MilestoneResponse { pub acceptance_criteria: Option, /// Allocated amount in lovelace pub amount_lovelace: Option, - /// Allocated amount in ADA - pub amount_ada: Option, /// Time limit (POSIXTime in milliseconds) pub time_limit: Option, /// Whether the vendor has withdrawn funds pub withdrawn: bool, /// Whether completion evidence has been provided pub evidence_provided: bool, + /// Whether this milestone is paused + pub paused: bool, /// Whether this milestone has been archived (replaced by a modify event) pub archived: bool, /// Completion details @@ -593,8 +568,6 @@ pub struct MilestoneWithdrawal { pub time: Option, /// Withdrawn amount in lovelace pub amount_lovelace: Option, - /// Withdrawn amount in ADA - pub amount_ada: Option, } /// Milestone archive info (present when milestone has been superseded by a modify event) @@ -632,6 +605,7 @@ pub struct MilestoneRow { pub time_limit: Option, pub withdrawn: bool, pub evidence_provided: bool, + pub paused: bool, pub archived: bool, pub complete_tx_hash: Option, pub complete_time: Option, @@ -660,7 +634,6 @@ impl From for MilestoneResponse { tx_hash: tx.clone(), time: row.withdraw_time, amount_lovelace: row.withdraw_amount, - amount_ada: row.withdraw_amount.map(lovelace_to_ada), }); let archive_info = if row.archived { @@ -681,10 +654,10 @@ impl From for MilestoneResponse { description: row.description, acceptance_criteria: row.acceptance_criteria, amount_lovelace: row.amount_lovelace, - amount_ada: row.amount_lovelace.map(lovelace_to_ada), time_limit: row.time_limit, withdrawn: row.withdrawn, evidence_provided: row.evidence_provided, + paused: row.paused, archived: row.archived, completion, withdrawal, @@ -718,8 +691,6 @@ pub struct EventResponse { pub event_type: String, /// Amount in lovelace (if applicable) pub amount_lovelace: Option, - /// Amount in ADA (if applicable) - pub amount_ada: Option, /// Reason (for pause/cancel/modify events) pub reason: Option, /// Destination (for disburse events) @@ -822,7 +793,6 @@ impl From for EventResponse { block_time: row.block_time, event_type: row.event_type, amount_lovelace: row.amount_lovelace, - amount_ada: row.amount_lovelace.map(lovelace_to_ada), reason: row.reason, destination: row.destination, treasury, @@ -851,8 +821,6 @@ pub struct UtxoResponse { pub address_type: Option, /// Amount in lovelace pub lovelace_amount: Option, - /// Amount in ADA - pub ada_amount: Option, /// Creation slot pub slot: Option, /// Block number @@ -879,7 +847,6 @@ impl From for UtxoResponse { address: row.address, address_type: row.address_type, lovelace_amount: row.lovelace_amount, - ada_amount: row.lovelace_amount.map(lovelace_to_ada), slot: row.slot, block_number: row.block_number, } @@ -949,9 +916,11 @@ pub struct MilestoneStats { /// Event statistics #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct EventStats { - /// Total events - pub total_count: i64, - /// Events by type + /// Total on-chain TOM events (from yaci_store) + pub on_chain_count: i64, + /// Total processed events (in treasury schema) + pub processed_count: i64, + /// On-chain events by type pub by_type: std::collections::HashMap, } @@ -960,16 +929,10 @@ pub struct EventStats { pub struct FinancialStats { /// Total allocated to projects in lovelace pub total_allocated_lovelace: i64, - /// Total allocated to projects in ADA - pub total_allocated_ada: f64, /// Total withdrawn in lovelace pub total_withdrawn_lovelace: i64, - /// Total withdrawn in ADA - pub total_withdrawn_ada: f64, /// Current total balance in lovelace (from UTXOs) pub current_balance_lovelace: i64, - /// Current total balance in ADA - pub current_balance_ada: f64, } /// Sync status statistics diff --git a/api/src/parsers/datum.rs b/api/src/parsers/datum.rs new file mode 100644 index 0000000..31cee42 --- /dev/null +++ b/api/src/parsers/datum.rs @@ -0,0 +1,273 @@ +//! CBOR datum parser for Plutus vendor contract datums +//! +//! Parses inline datum CBOR hex from `address_utxo.inline_datum` into structured data. +//! +//! Datum structure (from Plutus vendor contract): +//! ```text +//! Constr(0, [ +//! Constr(0, [ByteString(vendor_payment_key_hash)]), +//! Array([ +//! Constr(0, [BigInt(time_limit), Map(value), Constr(0|1, [])]), // per milestone +//! ... +//! ]) +//! ]) +//! ``` +//! +//! pallas uses tag 121 = constructor 0, tag 122 = constructor 1. + +use anyhow::{anyhow, Context}; +use pallas_primitives::alonzo::{BigInt, PlutusData}; + +/// Parsed vendor contract datum +#[derive(Debug, Clone)] +pub struct ParsedVendorDatum { + /// Vendor payment key hash (hex) + pub vendor_payment_key_hash: String, + /// Per-milestone data from datum + pub milestones: Vec, +} + +/// Parsed milestone data from inline datum +#[derive(Debug, Clone)] +pub struct ParsedMilestoneDatum { + /// POSIXTime in milliseconds + pub time_limit: i64, + /// Lovelace amount from Value map {"": {"": amount}} + pub amount_lovelace: i64, + /// Constructor 0 = active, Constructor 1 = paused + pub paused: bool, +} + +/// Parse a vendor contract datum from CBOR hex string +pub fn parse_vendor_contract_datum(cbor_hex: &str) -> anyhow::Result { + let bytes = hex::decode(cbor_hex).context("invalid hex in datum")?; + let datum: PlutusData = + pallas_codec::minicbor::decode(&bytes).context("failed to decode CBOR datum")?; + + // Top-level: Constr(0, [vendor_info, milestones_array]) + let top_fields = expect_constr(&datum, 0, "top-level datum")?; + if top_fields.len() < 2 { + return Err(anyhow!( + "top-level datum has {} fields, expected 2", + top_fields.len() + )); + } + + // Field 0: Constr(0, [ByteString(vendor_payment_key_hash)]) + let vendor_fields = expect_constr(&top_fields[0], 0, "vendor info")?; + if vendor_fields.is_empty() { + return Err(anyhow!("vendor info has no fields")); + } + let vendor_payment_key_hash = expect_bytes(&vendor_fields[0], "vendor_payment_key_hash")?; + + // Field 1: Array of milestone Constrs + let milestone_data_list = expect_array(&top_fields[1], "milestones array")?; + + let mut milestones = Vec::with_capacity(milestone_data_list.len()); + for (idx, ms_datum) in milestone_data_list.iter().enumerate() { + let ms = parse_milestone_datum(ms_datum, idx) + .with_context(|| format!("milestone {}", idx))?; + milestones.push(ms); + } + + Ok(ParsedVendorDatum { + vendor_payment_key_hash, + milestones, + }) +} + +/// Parse a single milestone datum: Constr(0, [BigInt(time_limit), Map(value), Constr(0|1, [])]) +fn parse_milestone_datum(datum: &PlutusData, _idx: usize) -> anyhow::Result { + let fields = expect_constr(datum, 0, "milestone")?; + if fields.len() < 3 { + return Err(anyhow!( + "milestone datum has {} fields, expected 3", + fields.len() + )); + } + + // Field 0: time_limit as BigInt + let time_limit = expect_integer(&fields[0], "time_limit")?; + + // Field 1: Value as Map - extract lovelace from {"": {"": amount}} + let amount_lovelace = extract_lovelace_from_value(&fields[1])?; + + // Field 2: Constr(0|1, []) — 0=active, 1=paused + let paused = match &fields[2] { + PlutusData::Constr(constr) => { + // pallas tag: 121 = constructor 0 (active), 122 = constructor 1 (paused) + match constr.tag { + 121 => false, + 122 => true, + _ => { + return Err(anyhow!( + "unexpected pause constructor tag: {}", + constr.tag + )) + } + } + } + _ => return Err(anyhow!("expected Constr for pause flag")), + }; + + Ok(ParsedMilestoneDatum { + time_limit, + amount_lovelace, + paused, + }) +} + +/// Extract lovelace amount from a Plutus Value: +/// Map({ ByteString("") => Map({ ByteString("") => BigInt(amount) }) }) +fn extract_lovelace_from_value(datum: &PlutusData) -> anyhow::Result { + match datum { + PlutusData::Map(entries) => { + let pairs: Vec<_> = entries.clone().to_vec(); + // Look for the empty-bytestring key (ADA policy ID) + for (key, val) in &pairs { + if is_empty_bytes(key) { + // Inner map: {"": amount} + match val { + PlutusData::Map(inner_entries) => { + let inner_pairs: Vec<_> = inner_entries.clone().to_vec(); + for (inner_key, inner_val) in &inner_pairs { + if is_empty_bytes(inner_key) { + return expect_integer(inner_val, "lovelace amount"); + } + } + return Err(anyhow!("no empty-key entry in inner Value map")); + } + // Some datums encode Value as Map({ "" => amount }) (flat) + _ => return expect_integer(val, "lovelace amount"), + } + } + } + Err(anyhow!("no ADA (empty policy) key in Value map")) + } + _ => Err(anyhow!("expected Map for Value, got {:?}", datum_type_name(datum))), + } +} + +// ============================================================================ +// Helpers +// ============================================================================ + +fn expect_constr<'a>( + datum: &'a PlutusData, + expected_tag_offset: u64, + context: &str, +) -> anyhow::Result<&'a Vec> { + match datum { + PlutusData::Constr(constr) => { + let expected_tag = 121 + expected_tag_offset; + if constr.tag != expected_tag { + return Err(anyhow!( + "{}: expected constructor tag {}, got {}", + context, + expected_tag, + constr.tag + )); + } + Ok(&constr.fields) + } + _ => Err(anyhow!( + "{}: expected Constr, got {:?}", + context, + datum_type_name(datum) + )), + } +} + +fn expect_array<'a>( + datum: &'a PlutusData, + context: &str, +) -> anyhow::Result<&'a Vec> { + match datum { + PlutusData::Array(arr) => Ok(arr), + _ => Err(anyhow!( + "{}: expected Array, got {:?}", + context, + datum_type_name(datum) + )), + } +} + +fn expect_bytes(datum: &PlutusData, context: &str) -> anyhow::Result { + match datum { + PlutusData::BoundedBytes(bytes) => Ok(hex::encode(bytes.as_slice())), + _ => Err(anyhow!( + "{}: expected BoundedBytes, got {:?}", + context, + datum_type_name(datum) + )), + } +} + +fn expect_integer(datum: &PlutusData, context: &str) -> anyhow::Result { + match datum { + PlutusData::BigInt(big_int) => { + match big_int { + BigInt::Int(int_val) => { + // pallas_codec::utils::Int implements Into + let n: i128 = (*int_val).into(); + Ok(n as i64) + } + BigInt::BigUInt(bytes) => { + let mut val: i64 = 0; + for b in bytes.as_slice() { + val = val.checked_mul(256).unwrap_or(i64::MAX); + val = val.checked_add(*b as i64).unwrap_or(i64::MAX); + } + Ok(val) + } + BigInt::BigNInt(bytes) => { + let mut val: i64 = 0; + for b in bytes.as_slice() { + val = val.checked_mul(256).unwrap_or(i64::MIN); + val = val.checked_add(*b as i64).unwrap_or(i64::MIN); + } + Ok(-val) + } + } + } + _ => Err(anyhow!( + "{}: expected BigInt, got {:?}", + context, + datum_type_name(datum) + )), + } +} + +fn is_empty_bytes(datum: &PlutusData) -> bool { + matches!(datum, PlutusData::BoundedBytes(bytes) if bytes.is_empty()) +} + +fn datum_type_name(datum: &PlutusData) -> &'static str { + match datum { + PlutusData::Constr(_) => "Constr", + PlutusData::Map(_) => "Map", + PlutusData::BigInt(_) => "BigInt", + PlutusData::BoundedBytes(_) => "BoundedBytes", + PlutusData::Array(_) => "Array", + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_empty_hex_fails() { + assert!(parse_vendor_contract_datum("").is_err()); + } + + #[test] + fn test_parse_invalid_hex_fails() { + assert!(parse_vendor_contract_datum("zzzz").is_err()); + } + + #[test] + fn test_parse_invalid_cbor_fails() { + assert!(parse_vendor_contract_datum("deadbeef").is_err()); + } +} diff --git a/api/src/parsers/mod.rs b/api/src/parsers/mod.rs index b121b63..c4f4793 100644 --- a/api/src/parsers/mod.rs +++ b/api/src/parsers/mod.rs @@ -1 +1,2 @@ // Metadata parsers for treasury contract transactions +pub mod datum; diff --git a/api/src/routes/v1/milestones.rs b/api/src/routes/v1/milestones.rs index fda296a..cf20d70 100644 --- a/api/src/routes/v1/milestones.rs +++ b/api/src/routes/v1/milestones.rs @@ -123,6 +123,7 @@ pub async fn list_milestones( m.time_limit, m.withdrawn, m.evidence_provided, + m.paused, m.archived, m.complete_tx_hash, m.complete_time, @@ -210,6 +211,7 @@ pub async fn get_milestone( m.time_limit, m.withdrawn, m.evidence_provided, + m.paused, m.archived, m.complete_tx_hash, m.complete_time, diff --git a/api/src/routes/v1/statistics.rs b/api/src/routes/v1/statistics.rs index ddf3748..6c4a175 100644 --- a/api/src/routes/v1/statistics.rs +++ b/api/src/routes/v1/statistics.rs @@ -5,7 +5,7 @@ use sqlx::PgPool; use std::collections::HashMap; use crate::models::v1::{ - lovelace_to_ada, ApiResponse, EventStats, FinancialStats, MilestoneStats, ProjectStats, + ApiResponse, EventStats, FinancialStats, MilestoneStats, ProjectStats, StatisticsResponse, SyncStats, TreasuryStats, }; @@ -140,8 +140,8 @@ async fn get_milestone_stats(pool: &PgPool) -> Result Result { - // Get total count - let (total_count,): (i64,) = sqlx::query_as("SELECT COUNT(*) FROM treasury.events") + // Get processed event count + let (processed_count,): (i64,) = sqlx::query_as("SELECT COUNT(*) FROM treasury.events") .fetch_one(pool) .await .map_err(|e| { @@ -149,11 +149,14 @@ async fn get_event_stats(pool: &PgPool) -> Result { StatusCode::INTERNAL_SERVER_ERROR })?; - // Get counts by type - let type_rows = sqlx::query_as::<_, (String, i64)>( + // Get on-chain TOM event count and breakdown by type from yaci_store + let on_chain_rows = sqlx::query_as::<_, (String, i64)>( r#" - SELECT event_type, COUNT(*) - FROM treasury.events + SELECT + COALESCE(body::jsonb->>'type', 'unknown') as event_type, + COUNT(*) + FROM yaci_store.transaction_metadata + WHERE label = '1694' GROUP BY event_type ORDER BY COUNT(*) DESC "# @@ -165,10 +168,12 @@ async fn get_event_stats(pool: &PgPool) -> Result { StatusCode::INTERNAL_SERVER_ERROR })?; - let by_type: HashMap = type_rows.into_iter().collect(); + let on_chain_count: i64 = on_chain_rows.iter().map(|(_, c)| c).sum(); + let by_type: HashMap = on_chain_rows.into_iter().collect(); Ok(EventStats { - total_count, + on_chain_count, + processed_count, by_type, }) } @@ -213,11 +218,8 @@ async fn get_financial_stats(pool: &PgPool) -> Result self.process_initialize(event, body, instance).await?, "fund" => self.process_fund(event, body, instance).await?, "complete" => self.process_complete(event, body).await?, - "disburse" => self.process_disburse(event, body).await?, + "disburse" => self.process_disburse(event, body, instance).await?, "withdraw" => self.process_withdraw(event, body).await?, "pause" => self.process_pause(event, body).await?, "resume" => self.process_resume(event, body).await?, @@ -136,7 +136,7 @@ impl EventProcessor { .await?; // Insert event record - self.insert_event(event, "publish", Some(treasury_id), None, None, body).await?; + self.insert_event_full(event, "publish", Some(treasury_id), None, None, None, &None, &None, body).await?; Ok(()) } @@ -160,7 +160,10 @@ impl EventProcessor { .fetch_one(&self.pool) .await?; - self.insert_event(event, "initialize", Some(treasury_id), None, None, body).await?; + let event_body = body.get("body").unwrap_or(body); + let reason = extract_text(event_body, "reason"); + + self.insert_event_full(event, "initialize", Some(treasury_id), None, None, None, &reason, &None, body).await?; Ok(()) } @@ -169,28 +172,32 @@ impl EventProcessor { async fn process_fund(&self, event: &RawTomEvent, body: &Value, instance: &str) -> anyhow::Result<()> { let event_body = body.get("body").unwrap_or(body); - let project_id = event_body.get("identifier") + let raw_identifier = event_body.get("identifier") .and_then(|i| i.as_str()) .unwrap_or(""); - if project_id.is_empty() { + if raw_identifier.is_empty() { return Ok(()); } + // Split space-separated identifiers: first becomes project_id, rest merge into other_identifiers + let id_parts: Vec<&str> = raw_identifier.split_whitespace().collect(); + let project_id = id_parts[0]; + let extra_ids: Vec = id_parts[1..].iter().map(|s| s.to_string()).collect(); + let project_name = extract_text(event_body, "label"); let description = extract_text(event_body, "description"); - let vendor_name = event_body.get("vendor") - .and_then(|v| v.get("name")) - .and_then(|n| n.as_str()) - .map(|s| s.to_string()); + // TOM spec has no vendor.name field — vendor_name is not available in metadata + let vendor_name: Option = None; let vendor_address = event_body.get("vendor") .and_then(|v| extract_text_from_value(v.get("label"))); - let contract_url = event_body.get("contract") - .and_then(|c| c.as_str()) - .map(|s| s.to_string()); - let other_identifiers = event_body.get("otherIdentifiers") + let contract_url = extract_contract(event_body); + let mut other_identifiers: Vec = event_body.get("otherIdentifiers") .and_then(|o| o.as_array()) - .map(|arr| arr.iter().filter_map(|v| v.as_str()).map(|s| s.to_string()).collect::>()); + .map(|arr| arr.iter().filter_map(|v| v.as_str()).map(|s| s.to_string()).collect::>()) + .unwrap_or_default(); + other_identifiers.extend(extra_ids); + let other_identifiers = if other_identifiers.is_empty() { None } else { Some(other_identifiers) }; // Get contract address from fund tx output let contract_address: Option = sqlx::query_scalar( @@ -256,16 +263,33 @@ impl EventProcessor { .fetch_one(&self.pool) .await?; - // Process milestones - if let Some(milestones) = event_body.get("milestones").and_then(|m| m.as_array()) { - for (idx, milestone) in milestones.iter().enumerate() { - let default_id = format!("m-{}", idx); - let milestone_id = milestone.get("identifier") - .and_then(|i| i.as_str()) - .unwrap_or(&default_id); - let label = extract_text_from_value(Some(milestone.get("label").unwrap_or(&Value::Null))); - let description = extract_text_from_value(Some(milestone.get("description").unwrap_or(&Value::Null))); + // Process milestones — handle both array format and object format (keyed by ID) + let milestones_list: Vec<(String, &Value)> = if let Some(milestones_val) = event_body.get("milestones") { + if let Some(arr) = milestones_val.as_array() { + arr.iter().enumerate().map(|(idx, m)| { + let id = m.get("identifier") + .and_then(|i| i.as_str()) + .map(|s| s.to_string()) + .unwrap_or_else(|| format!("m-{}", idx)); + (id, m) + }).collect() + } else if let Some(obj) = milestones_val.as_object() { + obj.iter().map(|(k, v)| (k.clone(), v)).collect() + } else { + vec![] + } + } else { + vec![] + }; + + for (idx, (milestone_id_str, milestone)) in milestones_list.iter().enumerate() { + let milestone_id = milestone_id_str.as_str(); let acceptance_criteria = extract_text_from_value(Some(milestone.get("acceptanceCriteria").unwrap_or(&Value::Null))); + let (label, description) = extract_milestone_label_description( + extract_text_from_value(Some(milestone.get("label").unwrap_or(&Value::Null))), + extract_text_from_value(Some(milestone.get("description").unwrap_or(&Value::Null))), + &acceptance_criteria, + ); let amount = milestone.get("amount") .and_then(|a| a.as_i64()); @@ -288,10 +312,9 @@ impl EventProcessor { .bind(amount) .execute(&self.pool) .await?; - } } - self.insert_event(event, "fund", treasury_id, Some(vendor_contract_id), None, body).await?; + self.insert_event_full(event, "fund", treasury_id, Some(vendor_contract_id), None, initial_amount, &None, &None, body).await?; // Record the output UTXOs from this fund transaction for future lookups // Get all outputs from the transaction table @@ -308,24 +331,112 @@ impl EventProcessor { output.get("tx_hash").and_then(|h| h.as_str()), output.get("output_index").and_then(|i| i.as_i64()) ) { + // Look up address and amount from yaci_store + let utxo_info: Option<(String, Option)> = sqlx::query_as( + "SELECT owner_addr, lovelace_amount FROM yaci_store.address_utxo WHERE tx_hash = $1 AND output_index = $2 LIMIT 1" + ) + .bind(tx_hash) + .bind(output_index as i16) + .fetch_optional(&self.pool) + .await?; + + let (address, lovelace_amount) = match utxo_info { + Some((addr, amt)) => (Some(addr), amt), + None => (None, None), + }; + let address_type = address.as_ref().map(|a| { + if a.starts_with("addr1x") { "vendor_contract" } else { "vendor" } + }); + // Record this UTXO with the vendor_contract_id for future event lookups sqlx::query( r#" - INSERT INTO treasury.utxos (tx_hash, output_index, vendor_contract_id, slot, spent) - VALUES ($1, $2, $3, $4, false) - ON CONFLICT (tx_hash, output_index) DO NOTHING + INSERT INTO treasury.utxos (tx_hash, output_index, vendor_contract_id, slot, block_number, address, address_type, lovelace_amount, spent) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, false) + ON CONFLICT (tx_hash, output_index) DO UPDATE + SET address = COALESCE(EXCLUDED.address, treasury.utxos.address), + address_type = COALESCE(EXCLUDED.address_type, treasury.utxos.address_type), + lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxos.lovelace_amount), + block_number = COALESCE(EXCLUDED.block_number, treasury.utxos.block_number) "# ) .bind(tx_hash) .bind(output_index as i16) .bind(vendor_contract_id) .bind(event.slot) + .bind(event.block_number) + .bind(&address) + .bind(address_type) + .bind(lovelace_amount) .execute(&self.pool) .await?; } } } + // Parse inline datum for milestone amounts, time_limits, and vendor_payment_key_hash + let inline_datum: Option = sqlx::query_scalar( + "SELECT inline_datum FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' AND inline_datum IS NOT NULL LIMIT 1" + ) + .bind(&event.tx_hash) + .fetch_optional(&self.pool) + .await?; + + if let Some(datum_hex) = inline_datum { + match crate::parsers::datum::parse_vendor_contract_datum(&datum_hex) { + Ok(parsed) => { + // Store vendor_payment_key_hash + sqlx::query( + "UPDATE treasury.vendor_contracts SET vendor_payment_key_hash = $1 WHERE id = $2" + ) + .bind(&parsed.vendor_payment_key_hash) + .bind(vendor_contract_id) + .execute(&self.pool) + .await?; + + // Update milestones with datum data (amount, time_limit, paused) + let milestone_rows: Vec<(i32, i32)> = sqlx::query_as( + "SELECT id, milestone_order FROM treasury.milestones WHERE vendor_contract_id = $1 AND NOT archived ORDER BY milestone_order" + ) + .bind(vendor_contract_id) + .fetch_all(&self.pool) + .await?; + + for (db_id, order) in &milestone_rows { + let datum_idx = (*order as usize).saturating_sub(1); + if let Some(ms_datum) = parsed.milestones.get(datum_idx) { + sqlx::query( + r#" + UPDATE treasury.milestones + SET amount_lovelace = $1, time_limit = $2, paused = $3 + WHERE id = $4 + "# + ) + .bind(ms_datum.amount_lovelace) + .bind(ms_datum.time_limit) + .bind(ms_datum.paused) + .bind(db_id) + .execute(&self.pool) + .await?; + } + } + + // Store raw CBOR on the UTXO tracking row + sqlx::query( + "UPDATE treasury.utxos SET inline_datum_cbor = $1 WHERE tx_hash = $2 AND vendor_contract_id = $3" + ) + .bind(&datum_hex) + .bind(&event.tx_hash) + .bind(vendor_contract_id) + .execute(&self.pool) + .await?; + } + Err(e) => { + tracing::debug!("Could not parse fund datum for {}: {}", event.tx_hash, e); + } + } + } + Ok(()) } @@ -389,7 +500,7 @@ impl EventProcessor { .await?; if let Some(mid) = db_milestone_id { - self.insert_event(event, "complete", None, Some(vendor_contract_id), Some(mid), body).await?; + self.insert_event_full(event, "complete", None, Some(vendor_contract_id), Some(mid), None, &None, &None, body).await?; } } } @@ -418,29 +529,23 @@ impl EventProcessor { } /// Process a disburse event - treasury-level fund movement (does not touch milestones) - async fn process_disburse(&self, event: &RawTomEvent, body: &Value) -> anyhow::Result<()> { + async fn process_disburse(&self, event: &RawTomEvent, body: &Value, instance: &str) -> anyhow::Result<()> { let event_body = body.get("body").unwrap_or(body); - - let project_id_from_meta = event_body.get("identifier") - .and_then(|i| i.as_str()) - .filter(|s| !s.is_empty()); - let destination = extract_text(event_body, "destination"); - // Get vendor contract ID - either from metadata or by tracing tx chain - let vendor_contract_id: Option = if let Some(pid) = project_id_from_meta { + // Disburse is a treasury-level operation — look up treasury_id, not vendor_contract_id + let treasury_id: Option = if !instance.is_empty() { sqlx::query_scalar( - "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1" + "SELECT id FROM treasury.treasury_contracts WHERE contract_instance = $1" ) - .bind(pid) + .bind(instance) .fetch_optional(&self.pool) .await? } else { - self.find_vendor_contract_from_inputs(&event.tx_hash).await? + None }; - // Insert the disburse event (treasury-level, never updates milestones) - self.insert_event_with_destination(event, "disburse", None, vendor_contract_id, None, &destination, body).await?; + self.insert_event_full(event, "disburse", treasury_id, None, None, None, &None, &destination, body).await?; Ok(()) } @@ -474,9 +579,35 @@ impl EventProcessor { .fetch_optional(&self.pool) .await?; - // Update milestone if milestone field is present in metadata - let db_milestone_id: Option = if let Some(milestone_id) = event_body.get("milestone").and_then(|m| m.as_str()) { - sqlx::query_scalar( + // Handle milestones object (plural, keyed by ID) — spec format + if let Some(milestones) = event_body.get("milestones").and_then(|m| m.as_object()) { + for (milestone_id, _milestone_data) in milestones { + let db_milestone_id: Option = sqlx::query_scalar( + r#" + UPDATE treasury.milestones + SET withdrawn = TRUE, + withdraw_tx_hash = $1, + withdraw_time = $2, + withdraw_amount = $3 + WHERE vendor_contract_id = $4 AND milestone_id = $5 AND NOT archived + RETURNING id + "# + ) + .bind(&event.tx_hash) + .bind(event.block_time) + .bind(withdraw_amount) + .bind(vc_id) + .bind(milestone_id) + .fetch_optional(&self.pool) + .await?; + + if let Some(mid) = db_milestone_id { + self.insert_event_full(event, "withdraw", None, Some(vc_id), Some(mid), withdraw_amount, &None, &None, body).await?; + } + } + } else if let Some(milestone_id) = event_body.get("milestone").and_then(|m| m.as_str()) { + // Handle singular milestone (legacy format) + let db_milestone_id: Option = sqlx::query_scalar( r#" UPDATE treasury.milestones SET withdrawn = TRUE, @@ -493,12 +624,12 @@ impl EventProcessor { .bind(vc_id) .bind(milestone_id) .fetch_optional(&self.pool) - .await? - } else { - None - }; + .await?; - self.insert_event(event, "withdraw", None, Some(vc_id), db_milestone_id, body).await?; + self.insert_event_full(event, "withdraw", None, Some(vc_id), db_milestone_id, withdraw_amount, &None, &None, body).await?; + } else { + self.insert_event_full(event, "withdraw", None, Some(vc_id), None, withdraw_amount, &None, &None, body).await?; + } } else { tracing::debug!("Could not find vendor contract for withdraw event {}", event.tx_hash); } @@ -537,7 +668,10 @@ impl EventProcessor { }; if let Some(vc_id) = vendor_contract_id { - self.insert_event_with_reason(event, "pause", None, Some(vc_id), None, &reason, body).await?; + // Also update per-milestone pause flags from output datum if available + self.update_milestone_pause_from_datum(&event.tx_hash, vc_id).await?; + + self.insert_event_full(event, "pause", None, Some(vc_id), None, None, &reason, &None, body).await?; } else { tracing::debug!("Could not find vendor contract for pause event {}", event.tx_hash); } @@ -574,7 +708,10 @@ impl EventProcessor { }; if let Some(vc_id) = vendor_contract_id { - self.insert_event(event, "resume", None, Some(vc_id), None, body).await?; + // Also update per-milestone pause flags from output datum if available + self.update_milestone_pause_from_datum(&event.tx_hash, vc_id).await?; + + self.insert_event_full(event, "resume", None, Some(vc_id), None, None, &None, &None, body).await?; } else { tracing::debug!("Could not find vendor contract for resume event {}", event.tx_hash); } @@ -604,8 +741,51 @@ impl EventProcessor { }; if let Some(vc_id) = vendor_contract_id { + // Update naming fields if present in modify metadata + let project_name = extract_text(event_body, "label"); + let description = extract_text(event_body, "description"); + let vendor_address = event_body.get("vendor") + .and_then(|v| extract_text_from_value(v.get("label"))); + let contract_url = extract_contract(event_body); + + sqlx::query( + r#" + UPDATE treasury.vendor_contracts + SET project_name = COALESCE($1, project_name), + description = COALESCE($2, description), + vendor_address = COALESCE($3, vendor_address), + contract_url = COALESCE($4, contract_url) + WHERE id = $5 + "# + ) + .bind(&project_name) + .bind(&description) + .bind(&vendor_address) + .bind(&contract_url) + .bind(vc_id) + .execute(&self.pool) + .await?; + // If milestones are present in the modify metadata, archive existing and insert new - if let Some(milestones) = event_body.get("milestones").and_then(|m| m.as_array()) { + let milestones_list: Vec<(String, &Value)> = if let Some(milestones_val) = event_body.get("milestones") { + if let Some(arr) = milestones_val.as_array() { + arr.iter().enumerate().map(|(idx, m)| { + let id = m.get("identifier") + .and_then(|i| i.as_str()) + .unwrap_or(&format!("m-{}", idx)) + .to_string(); + (id, m) + }).collect() + } else if let Some(obj) = milestones_val.as_object() { + obj.iter().map(|(k, v)| (k.clone(), v)).collect() + } else { + vec![] + } + } else { + vec![] + }; + + if !milestones_list.is_empty() { // Archive all active milestones for this vendor contract sqlx::query( r#" @@ -621,14 +801,14 @@ impl EventProcessor { .await?; // Insert new milestone rows - for (idx, milestone) in milestones.iter().enumerate() { - let default_id = format!("m-{}", idx); - let milestone_id = milestone.get("identifier") - .and_then(|i| i.as_str()) - .unwrap_or(&default_id); - let label = extract_text_from_value(Some(milestone.get("label").unwrap_or(&Value::Null))); - let description = extract_text_from_value(Some(milestone.get("description").unwrap_or(&Value::Null))); + for (idx, (milestone_id_str, milestone)) in milestones_list.iter().enumerate() { + let milestone_id = milestone_id_str.as_str(); let acceptance_criteria = extract_text_from_value(Some(milestone.get("acceptanceCriteria").unwrap_or(&Value::Null))); + let (label, description) = extract_milestone_label_description( + extract_text_from_value(Some(milestone.get("label").unwrap_or(&Value::Null))), + extract_text_from_value(Some(milestone.get("description").unwrap_or(&Value::Null))), + &acceptance_criteria, + ); let amount = milestone.get("amount") .and_then(|a| a.as_i64()); @@ -668,7 +848,7 @@ impl EventProcessor { } } - self.insert_event_with_reason(event, "modify", None, Some(vc_id), None, &reason, body).await?; + self.insert_event_full(event, "modify", None, Some(vc_id), None, None, &reason, &None, body).await?; } else { tracing::debug!("Could not find vendor contract for modify event {}", event.tx_hash); } @@ -706,7 +886,7 @@ impl EventProcessor { }; if let Some(vc_id) = vendor_contract_id { - self.insert_event_with_reason(event, "cancel", None, Some(vc_id), None, &reason, body).await?; + self.insert_event_full(event, "cancel", None, Some(vc_id), None, None, &reason, &None, body).await?; } else { tracing::debug!("Could not find vendor contract for cancel event {}", event.tx_hash); } @@ -723,7 +903,7 @@ impl EventProcessor { .fetch_optional(&self.pool) .await?; - self.insert_event(event, "sweep", treasury_id, None, None, body).await?; + self.insert_event_full(event, "sweep", treasury_id, None, None, None, &None, &None, body).await?; Ok(()) } @@ -737,91 +917,21 @@ impl EventProcessor { .fetch_optional(&self.pool) .await?; - self.insert_event(event, "reorganize", treasury_id, None, None, body).await?; + self.insert_event_full(event, "reorganize", treasury_id, None, None, None, &None, &None, body).await?; Ok(()) } - /// Insert an event record - async fn insert_event( - &self, - event: &RawTomEvent, - event_type: &str, - treasury_id: Option, - vendor_contract_id: Option, - milestone_id: Option, - body: &Value, - ) -> anyhow::Result<()> { - sqlx::query( - r#" - INSERT INTO treasury.events ( - tx_hash, slot, block_number, block_time, event_type, - treasury_id, vendor_contract_id, milestone_id, metadata - ) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) - ON CONFLICT (tx_hash) DO NOTHING - "# - ) - .bind(&event.tx_hash) - .bind(event.slot) - .bind(event.block_number) - .bind(event.block_time) - .bind(event_type) - .bind(treasury_id) - .bind(vendor_contract_id) - .bind(milestone_id) - .bind(body) - .execute(&self.pool) - .await?; - - Ok(()) - } - - /// Insert an event with reason field - async fn insert_event_with_reason( + /// Insert an event record with all optional fields + async fn insert_event_full( &self, event: &RawTomEvent, event_type: &str, treasury_id: Option, vendor_contract_id: Option, milestone_id: Option, + amount_lovelace: Option, reason: &Option, - body: &Value, - ) -> anyhow::Result<()> { - sqlx::query( - r#" - INSERT INTO treasury.events ( - tx_hash, slot, block_number, block_time, event_type, - treasury_id, vendor_contract_id, milestone_id, reason, metadata - ) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) - ON CONFLICT (tx_hash) DO NOTHING - "# - ) - .bind(&event.tx_hash) - .bind(event.slot) - .bind(event.block_number) - .bind(event.block_time) - .bind(event_type) - .bind(treasury_id) - .bind(vendor_contract_id) - .bind(milestone_id) - .bind(reason) - .bind(body) - .execute(&self.pool) - .await?; - - Ok(()) - } - - /// Insert an event with destination field - async fn insert_event_with_destination( - &self, - event: &RawTomEvent, - event_type: &str, - treasury_id: Option, - vendor_contract_id: Option, - milestone_id: Option, destination: &Option, body: &Value, ) -> anyhow::Result<()> { @@ -829,10 +939,14 @@ impl EventProcessor { r#" INSERT INTO treasury.events ( tx_hash, slot, block_number, block_time, event_type, - treasury_id, vendor_contract_id, milestone_id, destination, metadata + treasury_id, vendor_contract_id, milestone_id, + amount_lovelace, reason, destination, metadata ) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) - ON CONFLICT (tx_hash) DO NOTHING + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) + ON CONFLICT (tx_hash) DO UPDATE SET + amount_lovelace = COALESCE(EXCLUDED.amount_lovelace, treasury.events.amount_lovelace), + reason = COALESCE(EXCLUDED.reason, treasury.events.reason), + destination = COALESCE(EXCLUDED.destination, treasury.events.destination) "# ) .bind(&event.tx_hash) @@ -843,6 +957,8 @@ impl EventProcessor { .bind(treasury_id) .bind(vendor_contract_id) .bind(milestone_id) + .bind(amount_lovelace) + .bind(reason) .bind(destination) .bind(body) .execute(&self.pool) @@ -911,17 +1027,42 @@ impl EventProcessor { output.get("tx_hash").and_then(|h| h.as_str()), output.get("output_index").and_then(|i| i.as_i64()) ) { + // Look up address, amount, and inline datum from yaci_store + let utxo_info: Option<(String, Option, Option)> = sqlx::query_as( + "SELECT owner_addr, lovelace_amount, inline_datum FROM yaci_store.address_utxo WHERE tx_hash = $1 AND output_index = $2 LIMIT 1" + ) + .bind(out_tx_hash) + .bind(output_index as i16) + .fetch_optional(&self.pool) + .await?; + + let (address, lovelace_amount, out_datum) = match utxo_info { + Some((addr, amt, datum)) => (Some(addr), amt, datum), + None => (None, None, None), + }; + let address_type = address.as_ref().map(|a| { + if a.starts_with("addr1x") { "vendor_contract" } else { "vendor" } + }); + sqlx::query( r#" - INSERT INTO treasury.utxos (tx_hash, output_index, vendor_contract_id, spent) - VALUES ($1, $2, $3, false) + INSERT INTO treasury.utxos (tx_hash, output_index, vendor_contract_id, address, address_type, lovelace_amount, inline_datum_cbor, spent) + VALUES ($1, $2, $3, $4, $5, $6, $7, false) ON CONFLICT (tx_hash, output_index) DO UPDATE - SET vendor_contract_id = EXCLUDED.vendor_contract_id + SET vendor_contract_id = EXCLUDED.vendor_contract_id, + address = COALESCE(EXCLUDED.address, treasury.utxos.address), + address_type = COALESCE(EXCLUDED.address_type, treasury.utxos.address_type), + lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxos.lovelace_amount), + inline_datum_cbor = COALESCE(EXCLUDED.inline_datum_cbor, treasury.utxos.inline_datum_cbor) "# ) .bind(out_tx_hash) .bind(output_index as i16) .bind(vc_id) + .bind(&address) + .bind(address_type) + .bind(lovelace_amount) + .bind(&out_datum) .execute(&self.pool) .await?; } @@ -936,81 +1077,129 @@ impl EventProcessor { Ok(None) } - /// Sync UTXOs for all tracked addresses - pub async fn sync_utxos(&self) -> anyhow::Result<()> { - // Get all contract addresses (both treasury and vendor) - let addresses: Vec = sqlx::query_scalar( - r#" - SELECT contract_address FROM treasury.treasury_contracts WHERE contract_address IS NOT NULL - UNION - SELECT contract_address FROM treasury.vendor_contracts WHERE contract_address IS NOT NULL - UNION - SELECT vendor_address FROM treasury.vendor_contracts WHERE vendor_address IS NOT NULL - "# + /// Update per-milestone pause flags from the output datum of a transaction + async fn update_milestone_pause_from_datum(&self, tx_hash: &str, vendor_contract_id: i32) -> anyhow::Result<()> { + // Query inline datum from the tx output at the vendor contract address + let inline_datum: Option = sqlx::query_scalar( + "SELECT inline_datum FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' AND inline_datum IS NOT NULL LIMIT 1" ) - .fetch_all(&self.pool) + .bind(tx_hash) + .fetch_optional(&self.pool) .await?; - for address in addresses { - self.sync_address_utxos(&address).await?; + if let Some(datum_hex) = inline_datum { + match crate::parsers::datum::parse_vendor_contract_datum(&datum_hex) { + Ok(parsed) => { + // Get milestones ordered by milestone_order + let milestone_ids: Vec<(i32, i32)> = sqlx::query_as( + "SELECT id, milestone_order FROM treasury.milestones WHERE vendor_contract_id = $1 AND NOT archived ORDER BY milestone_order" + ) + .bind(vendor_contract_id) + .fetch_all(&self.pool) + .await?; + + for (db_id, order) in &milestone_ids { + let datum_idx = (*order as usize).saturating_sub(1); + if let Some(ms_datum) = parsed.milestones.get(datum_idx) { + sqlx::query( + "UPDATE treasury.milestones SET paused = $1 WHERE id = $2" + ) + .bind(ms_datum.paused) + .bind(db_id) + .execute(&self.pool) + .await?; + } + } + + // Update contract-level status: paused if ALL milestones paused + let all_paused = parsed.milestones.iter().all(|m| m.paused); + let any_paused = parsed.milestones.iter().any(|m| m.paused); + if all_paused && !parsed.milestones.is_empty() { + sqlx::query("UPDATE treasury.vendor_contracts SET status = 'paused' WHERE id = $1") + .bind(vendor_contract_id) + .execute(&self.pool) + .await?; + } else if !any_paused { + sqlx::query("UPDATE treasury.vendor_contracts SET status = 'active' WHERE id = $1") + .bind(vendor_contract_id) + .execute(&self.pool) + .await?; + } + } + Err(e) => { + tracing::debug!("Could not parse datum for pause/resume: {}", e); + } + } } Ok(()) } +} - /// Sync UTXOs for a specific address - async fn sync_address_utxos(&self, address: &str) -> anyhow::Result<()> { - // Determine address type and get vendor_contract_id if applicable - let vendor_contract_id: Option = sqlx::query_scalar( - "SELECT id FROM treasury.vendor_contracts WHERE contract_address = $1 OR vendor_address = $1" - ) - .bind(address) - .fetch_optional(&self.pool) - .await?; - - let address_type = if address.starts_with("addr1x") { - if vendor_contract_id.is_some() { "vendor_contract" } else { "treasury" } - } else { - "vendor" - }; - - // Get UTXOs from yaci_store - let utxos = sqlx::query_as::<_, (String, i16, i64, i64, Option)>( - r#" - SELECT tx_hash, output_index::smallint, lovelace_amount, slot, block as block_number - FROM yaci_store.address_utxo - WHERE owner_addr = $1 - "# - ) - .bind(address) - .fetch_all(&self.pool) - .await?; +/// Extract contract URL from a field that might be a string or an object with anchorUrl +fn extract_contract(event_body: &Value) -> Option { + match event_body.get("contract") { + Some(Value::String(s)) => Some(s.clone()), + Some(Value::Object(obj)) => obj.get("anchorUrl") + .and_then(|u| u.as_str()) + .map(String::from), + _ => None, + } +} - for (tx_hash, output_index, lovelace_amount, slot, block_number) in utxos { - sqlx::query( - r#" - INSERT INTO treasury.utxos ( - tx_hash, output_index, address, address_type, - vendor_contract_id, lovelace_amount, slot, block_number, spent - ) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, false) - ON CONFLICT (tx_hash, output_index) DO NOTHING - "# - ) - .bind(&tx_hash) - .bind(output_index) - .bind(address) - .bind(address_type) - .bind(vendor_contract_id) - .bind(lovelace_amount) - .bind(slot) - .bind(block_number) - .execute(&self.pool) - .await?; +/// Extract milestone label and description from metadata fields. +/// +/// On-chain TOM metadata typically has no `label` field on milestones and an empty +/// `description`. Instead, `acceptanceCriteria` contains structured text like: +/// "Milestone 2 - Documentation\nDeliverables: detailed description" +/// or with a project prefix: +/// "Ledger App Rewrite:\nMilestone 2 – Impl\nDeliverables: ..." +/// +/// This function extracts a clean label and description: +/// - label: the milestone title (text before "\nDeliverables:" or first line) +/// - description: the deliverables text (after "Deliverables:"), or original description +fn extract_milestone_label_description( + raw_label: Option, + raw_description: Option, + acceptance_criteria: &Option, +) -> (Option, Option) { + // If label is explicitly provided, use it (truncated to first line) + if let Some(ref label) = raw_label { + let label = label.lines().next().unwrap_or(label).trim().to_string(); + if !label.is_empty() { + return (Some(label), raw_description); } + } - Ok(()) + // No label — try to derive from acceptance_criteria + let ac = match acceptance_criteria { + Some(ac) if !ac.is_empty() => ac, + _ => return (None, raw_description), + }; + + // Look for "Deliverables:" separator (case-insensitive find) + let deliverables_pos = ac.to_lowercase().find("\ndeliverables:"); + if let Some(pos) = deliverables_pos { + let label = ac[..pos].trim().to_string(); + let desc_start = pos + 1; // skip the \n + let deliverables = ac[desc_start..].trim().to_string(); + let description = if !deliverables.is_empty() { + Some(deliverables) + } else { + raw_description + }; + return ( + if label.is_empty() { None } else { Some(label) }, + description, + ); } + + // No "Deliverables:" marker — use first line as label + let label = ac.lines().next().unwrap_or(ac).trim().to_string(); + ( + if label.is_empty() { None } else { Some(label) }, + raw_description, + ) } /// Extract text from a field that might be a string or array @@ -1018,7 +1207,9 @@ fn extract_text(obj: &Value, field: &str) -> Option { extract_text_from_value(obj.get(field)) } -/// Extract text from a value that might be a string or array +/// Extract text from a value that might be a string or array of 64-byte CIP-100 chunks. +/// Joining with "" (no separator) is correct for CIP-100: text is split at fixed byte +/// boundaries, so chunks are contiguous fragments that reconstruct the original text. fn extract_text_from_value(value: Option<&Value>) -> Option { match value { Some(Value::String(s)) => Some(s.clone()), @@ -1029,6 +1220,11 @@ fn extract_text_from_value(value: Option<&Value>) -> Option { .join(""); if joined.is_empty() { None } else { Some(joined) } } + Some(Value::Object(obj)) => { + obj.get("label") + .or_else(|| obj.get("name")) + .and_then(|v| extract_text_from_value(Some(v))) + } _ => None, } } diff --git a/api/src/services/sync.rs b/api/src/services/sync.rs index 95a6d00..f20e17b 100644 --- a/api/src/services/sync.rs +++ b/api/src/services/sync.rs @@ -43,12 +43,6 @@ pub async fn run_sync_loop(pool: PgPool) { tracing::error!("Initial sync failed: {}", e); } - // Sync UTXOs for tracked addresses - tracing::info!("Syncing UTXOs for tracked addresses..."); - if let Err(e) = processor.sync_utxos().await { - tracing::error!("UTXO sync failed: {}", e); - } - tracing::info!("Initial sync complete. Starting continuous sync loop."); // Continuous sync loop @@ -83,7 +77,7 @@ async fn sync_new_events(pool: &PgPool, processor: &EventProcessor) -> anyhow::R FROM yaci_store.transaction_metadata m JOIN yaci_store.block b ON b.slot = m.slot WHERE m.label = '1694' AND m.slot > $1 - ORDER BY m.slot ASC + ORDER BY m.slot ASC, m.tx_hash ASC LIMIT 1000 "# ) @@ -126,9 +120,6 @@ async fn sync_new_events(pool: &PgPool, processor: &EventProcessor) -> anyhow::R .execute(pool) .await?; - // Also sync any new UTXOs - processor.sync_utxos().await?; - Ok(()) } diff --git a/database/init/02-treasury-schema.sql b/database/init/02-treasury-schema.sql index 56b6e4e..5d167ae 100644 --- a/database/init/02-treasury-schema.sql +++ b/database/init/02-treasury-schema.sql @@ -37,6 +37,7 @@ CREATE TABLE IF NOT EXISTS treasury.vendor_contracts ( vendor_address TEXT, -- Payment destination (vendor.label in metadata) contract_url TEXT, -- contract - link to agreement document contract_address TEXT, -- PSSC script address (from fund tx output) + vendor_payment_key_hash VARCHAR(56), fund_tx_hash VARCHAR(64) NOT NULL, -- Fund transaction fund_slot BIGINT, -- Blockchain slot fund_block_time BIGINT, -- Block timestamp @@ -55,18 +56,35 @@ CREATE TABLE IF NOT EXISTS treasury.milestones ( label TEXT, -- Milestone name description TEXT, -- Detailed description acceptance_criteria TEXT, -- Completion criteria - amount_lovelace BIGINT, -- Allocated amount (if specified) - status TEXT DEFAULT 'pending', -- pending/completed/disbursed + + -- From inline UTXO datum + amount_lovelace BIGINT, -- Lovelace amount from datum Value map + time_limit BIGINT, -- POSIXTime in milliseconds + + -- Independent boolean lifecycle flags + withdrawn BOOLEAN NOT NULL DEFAULT FALSE, + evidence_provided BOOLEAN NOT NULL DEFAULT FALSE, + archived BOOLEAN NOT NULL DEFAULT FALSE, + paused BOOLEAN NOT NULL DEFAULT FALSE, + + -- Withdraw details (set when withdrawn = true) + withdraw_tx_hash VARCHAR(64), + withdraw_time BIGINT, + withdraw_amount BIGINT, + + -- Evidence/completion details (set when evidence_provided = true) complete_tx_hash VARCHAR(64), -- Completion transaction complete_time BIGINT, -- Completion timestamp complete_description TEXT, -- Description from complete event evidence JSONB, -- Evidence array from complete event - disburse_tx_hash VARCHAR(64), -- Disbursement transaction - disburse_time BIGINT, -- Disbursement timestamp - disburse_amount BIGINT, -- Actual disbursed amount + + -- Archive details (set when archived = true) + archived_by_tx_hash VARCHAR(64), + archived_at BIGINT, + superseded_by INT REFERENCES treasury.milestones(id), + created_at TIMESTAMPTZ DEFAULT NOW(), - updated_at TIMESTAMPTZ DEFAULT NOW(), - UNIQUE(vendor_contract_id, milestone_id) + updated_at TIMESTAMPTZ DEFAULT NOW() ); -- Events - Audit log of all TOM events @@ -100,6 +118,7 @@ CREATE TABLE IF NOT EXISTS treasury.utxos ( block_number BIGINT, -- Block number spent BOOLEAN DEFAULT FALSE, -- Is spent? spent_tx_hash VARCHAR(64), -- Spending transaction + inline_datum_cbor TEXT, spent_slot BIGINT, -- When spent UNIQUE(tx_hash, output_index) ); @@ -133,13 +152,19 @@ CREATE INDEX IF NOT EXISTS idx_vendor_project_id ON treasury.vendor_contracts(pr CREATE INDEX IF NOT EXISTS idx_vendor_status ON treasury.vendor_contracts(status); CREATE INDEX IF NOT EXISTS idx_vendor_fund_time ON treasury.vendor_contracts(fund_block_time DESC); CREATE INDEX IF NOT EXISTS idx_vendor_contract_address ON treasury.vendor_contracts(contract_address); +CREATE INDEX IF NOT EXISTS idx_vendor_payment_key_hash ON treasury.vendor_contracts(vendor_payment_key_hash); CREATE INDEX IF NOT EXISTS idx_vendor_search ON treasury.vendor_contracts USING gin (to_tsvector('english', COALESCE(project_name, '') || ' ' || COALESCE(description, ''))); -- Milestones CREATE INDEX IF NOT EXISTS idx_milestone_vendor ON treasury.milestones(vendor_contract_id); -CREATE INDEX IF NOT EXISTS idx_milestone_status ON treasury.milestones(status); CREATE INDEX IF NOT EXISTS idx_milestone_order ON treasury.milestones(vendor_contract_id, milestone_order); +-- Only one active (non-archived) milestone per vendor contract + milestone_id +CREATE UNIQUE INDEX IF NOT EXISTS idx_milestone_active_unique + ON treasury.milestones(vendor_contract_id, milestone_id) + WHERE NOT archived; +CREATE INDEX IF NOT EXISTS idx_milestone_not_archived + ON treasury.milestones(vendor_contract_id) WHERE NOT archived; -- Events CREATE INDEX IF NOT EXISTS idx_event_type ON treasury.events(event_type); @@ -221,13 +246,14 @@ SELECT -- Treasury context tc.contract_instance as treasury_instance, tc.name as treasury_name, - -- Milestone counts - COUNT(DISTINCT m.id) as total_milestones, - COUNT(DISTINCT m.id) FILTER (WHERE m.status = 'pending') as pending_milestones, - COUNT(DISTINCT m.id) FILTER (WHERE m.status = 'completed') as completed_milestones, - COUNT(DISTINCT m.id) FILTER (WHERE m.status = 'disbursed') as disbursed_milestones, + -- Milestone counts (excluding archived) + COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived) as total_milestones, + COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND NOT m.evidence_provided AND NOT m.withdrawn) as pending_milestones, + COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND m.evidence_provided AND NOT m.withdrawn) as completed_milestones, + COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND m.withdrawn) as withdrawn_milestones, + COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND m.paused AND NOT m.withdrawn) as paused_milestones, -- Financial totals from milestones - COALESCE(SUM(DISTINCT m.disburse_amount), 0)::BIGINT as total_disbursed_lovelace, + COALESCE(SUM(DISTINCT m.withdraw_amount) FILTER (WHERE NOT m.archived), 0)::BIGINT as total_withdrawn_lovelace, -- Current balance from UTXOs COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent), 0)::BIGINT as current_balance_lovelace, COUNT(u.id) FILTER (WHERE NOT u.spent) as utxo_count, @@ -251,14 +277,20 @@ SELECT m.description, m.acceptance_criteria, m.amount_lovelace, - m.status, + m.time_limit, + m.withdrawn, + m.evidence_provided, + m.archived, m.complete_tx_hash, m.complete_time, m.complete_description, m.evidence, - m.disburse_tx_hash, - m.disburse_time, - m.disburse_amount, + m.withdraw_tx_hash, + m.withdraw_time, + m.withdraw_amount, + m.archived_by_tx_hash, + m.archived_at, + m.superseded_by, vc.project_id, vc.project_name, vc.vendor_address @@ -286,8 +318,8 @@ SELECT m.label as milestone_label, m.milestone_order FROM treasury.events e -LEFT JOIN treasury.treasury_contracts tc ON tc.id = e.treasury_id LEFT JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id +LEFT JOIN treasury.treasury_contracts tc ON tc.id = COALESCE(e.treasury_id, vc.treasury_id) LEFT JOIN treasury.milestones m ON m.id = e.milestone_id ORDER BY e.slot DESC; @@ -347,8 +379,8 @@ SELECT m.label as milestone_label, m.milestone_order FROM treasury.events e -LEFT JOIN treasury.treasury_contracts tc ON tc.id = e.treasury_id LEFT JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id +LEFT JOIN treasury.treasury_contracts tc ON tc.id = COALESCE(e.treasury_id, vc.treasury_id) LEFT JOIN treasury.milestones m ON m.id = e.milestone_id; -- Financial summary view (allocated vs disbursed vs remaining) @@ -359,10 +391,10 @@ SELECT tc.name as treasury_name, -- Allocation totals COALESCE(SUM(vc.initial_amount_lovelace), 0)::BIGINT as total_allocated_lovelace, - -- Disbursement totals - COALESCE(SUM(m_totals.total_disbursed), 0)::BIGINT as total_disbursed_lovelace, - -- Remaining (allocated - disbursed) - (COALESCE(SUM(vc.initial_amount_lovelace), 0) - COALESCE(SUM(m_totals.total_disbursed), 0))::BIGINT as total_remaining_lovelace, + -- Withdrawal totals + COALESCE(SUM(m_totals.total_withdrawn), 0)::BIGINT as total_withdrawn_lovelace, + -- Remaining (allocated - withdrawn) + (COALESCE(SUM(vc.initial_amount_lovelace), 0) - COALESCE(SUM(m_totals.total_withdrawn), 0))::BIGINT as total_remaining_lovelace, -- Treasury balance (actual UTXOs) COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent AND u.address = tc.contract_address), 0)::BIGINT as treasury_balance_lovelace, -- Project-level balance (sum of project UTXOs) @@ -380,8 +412,9 @@ LEFT JOIN treasury.vendor_contracts vc ON vc.treasury_id = tc.id LEFT JOIN ( SELECT m.vendor_contract_id, - SUM(COALESCE(m.disburse_amount, 0)) as total_disbursed + SUM(COALESCE(m.withdraw_amount, 0)) as total_withdrawn FROM treasury.milestones m + WHERE NOT m.archived GROUP BY m.vendor_contract_id ) m_totals ON m_totals.vendor_contract_id = vc.id LEFT JOIN treasury.utxos u ON u.address = tc.contract_address diff --git a/database/schema/treasury.sql b/database/schema/treasury.sql index bb4e4dd..5d167ae 100644 --- a/database/schema/treasury.sql +++ b/database/schema/treasury.sql @@ -37,6 +37,7 @@ CREATE TABLE IF NOT EXISTS treasury.vendor_contracts ( vendor_address TEXT, -- Payment destination (vendor.label in metadata) contract_url TEXT, -- contract - link to agreement document contract_address TEXT, -- PSSC script address (from fund tx output) + vendor_payment_key_hash VARCHAR(56), fund_tx_hash VARCHAR(64) NOT NULL, -- Fund transaction fund_slot BIGINT, -- Blockchain slot fund_block_time BIGINT, -- Block timestamp @@ -64,6 +65,7 @@ CREATE TABLE IF NOT EXISTS treasury.milestones ( withdrawn BOOLEAN NOT NULL DEFAULT FALSE, evidence_provided BOOLEAN NOT NULL DEFAULT FALSE, archived BOOLEAN NOT NULL DEFAULT FALSE, + paused BOOLEAN NOT NULL DEFAULT FALSE, -- Withdraw details (set when withdrawn = true) withdraw_tx_hash VARCHAR(64), @@ -116,6 +118,7 @@ CREATE TABLE IF NOT EXISTS treasury.utxos ( block_number BIGINT, -- Block number spent BOOLEAN DEFAULT FALSE, -- Is spent? spent_tx_hash VARCHAR(64), -- Spending transaction + inline_datum_cbor TEXT, spent_slot BIGINT, -- When spent UNIQUE(tx_hash, output_index) ); @@ -149,6 +152,7 @@ CREATE INDEX IF NOT EXISTS idx_vendor_project_id ON treasury.vendor_contracts(pr CREATE INDEX IF NOT EXISTS idx_vendor_status ON treasury.vendor_contracts(status); CREATE INDEX IF NOT EXISTS idx_vendor_fund_time ON treasury.vendor_contracts(fund_block_time DESC); CREATE INDEX IF NOT EXISTS idx_vendor_contract_address ON treasury.vendor_contracts(contract_address); +CREATE INDEX IF NOT EXISTS idx_vendor_payment_key_hash ON treasury.vendor_contracts(vendor_payment_key_hash); CREATE INDEX IF NOT EXISTS idx_vendor_search ON treasury.vendor_contracts USING gin (to_tsvector('english', COALESCE(project_name, '') || ' ' || COALESCE(description, ''))); @@ -247,6 +251,7 @@ SELECT COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND NOT m.evidence_provided AND NOT m.withdrawn) as pending_milestones, COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND m.evidence_provided AND NOT m.withdrawn) as completed_milestones, COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND m.withdrawn) as withdrawn_milestones, + COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND m.paused AND NOT m.withdrawn) as paused_milestones, -- Financial totals from milestones COALESCE(SUM(DISTINCT m.withdraw_amount) FILTER (WHERE NOT m.archived), 0)::BIGINT as total_withdrawn_lovelace, -- Current balance from UTXOs @@ -313,8 +318,8 @@ SELECT m.label as milestone_label, m.milestone_order FROM treasury.events e -LEFT JOIN treasury.treasury_contracts tc ON tc.id = e.treasury_id LEFT JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id +LEFT JOIN treasury.treasury_contracts tc ON tc.id = COALESCE(e.treasury_id, vc.treasury_id) LEFT JOIN treasury.milestones m ON m.id = e.milestone_id ORDER BY e.slot DESC; @@ -374,8 +379,8 @@ SELECT m.label as milestone_label, m.milestone_order FROM treasury.events e -LEFT JOIN treasury.treasury_contracts tc ON tc.id = e.treasury_id LEFT JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id +LEFT JOIN treasury.treasury_contracts tc ON tc.id = COALESCE(e.treasury_id, vc.treasury_id) LEFT JOIN treasury.milestones m ON m.id = e.milestone_id; -- Financial summary view (allocated vs disbursed vs remaining) diff --git a/docs/event-processing.md b/docs/event-processing.md new file mode 100644 index 0000000..4ed5b19 --- /dev/null +++ b/docs/event-processing.md @@ -0,0 +1,743 @@ +# TOM Event Processing Reference + +Comprehensive reference for how TOM (Treasury Oversight Metadata) events flow from on-chain metadata through the event processor into the treasury database schema. + +**Spec source**: [SundaeSwap treasury-contracts spec.md](https://github.com/SundaeSwap-finance/treasury-contracts/blob/main/offchain/src/metadata/spec.md) + +--- + +## 1. On-Chain Architecture (Corrected) + +### Contract Structure + +``` +Treasury Contract (TRSC) + - ONE unique script address per treasury instance + - Holds the treasury reserve funds + +Vendor Contract (PSSC) + - ONE shared script address for ALL projects + - Each fund tx creates UTXOs at this shared address + - UTXOs belong to specific projects, distinguished by inline datum, NOT by address +``` + +**Critical insight**: The codebase historically assumed each project gets its own unique PSSC script address. In reality, **all projects share ONE vendor contract script address**. The relationship is: + +``` + ┌──────────────────────────────┐ + │ Treasury Contract (TRSC) │ + │ unique script address │ + └──────────┬───────────────────┘ + │ fund events + ▼ + ┌──────────────────────────────┐ + │ Shared Vendor Contract (PSSC) │ + │ ONE script address for ALL │ + │ projects │ + └──────────┬───────────────────┘ + │ + ┌────────────────┼────────────────┐ + ▼ ▼ ▼ + ┌─────────┐ ┌─────────┐ ┌─────────┐ + │ UTXO A │ │ UTXO B │ │ UTXO C │ + │Project 1│ │Project 2│ │Project 3│ + │(datum) │ │(datum) │ │(datum) │ + └─────────┘ └─────────┘ └─────────┘ +``` + +UTXOs at the shared address are distinguished by their **inline datum** (containing milestone amounts, time limits, etc.) and by their **origin** (which fund transaction created them), not by the address they sit at. + +### Implications for UTXO Tracking + +- `find_vendor_contract_from_inputs()` traces inputs back through the UTXO chain — the correct and only approach for linking events to projects +- UTXO tracking relies exclusively on chain tracing by specific (tx_hash, output_index) pairs, not by address + +--- + +## 2. TOM Metadata Format + +### Top-Level Structure + +All TOM metadata is submitted under CIP-100 metadata label **1694**: + +```json +{ + "@context": "", + "hashAlgorithm": "blake2b-256", + "txAuthor": "", + "instance": "", + "body": { + "event": "", + ...event-specific fields... + } +} +``` + +- **`@context`**: URL pointing to the metadata specification version (varies by event type) +- **`hashAlgorithm`**: Always `"blake2b-256"` +- **`txAuthor`**: Public key hash; must appear in the transaction's required signers +- **`instance`**: Filters to the configured treasury (matches `TREASURY_INSTANCE` env var) +- **`body.event`**: Determines event type — the processor dispatches on this field + +### Code path for extraction + +``` +event.body → JSON + → body.get("body").get("event") → event_type string + → body.get("instance") → instance string + → match event_type → process_() +``` + +### CIP-100 Text Chunking + +Text fields may be either a plain string or an array of 64-character chunks that must be joined: + +```json +"label": "Short name" + +"description": [ + "This is a long description that has been split into 64-cha", + "racter chunks per the CIP-100 standard for on-chain storag", + "e." +] +``` + +The `extract_text` / `extract_text_from_value` helpers handle both formats, joining arrays with `""` (empty string, no separator). + +--- + +## 3. Event Type Reference + +### publish + +**Purpose**: Creates a new treasury instance by describing the published scriptRegistry datum. + +#### Spec Fields +| Field | Type | Description | +|-------|------|-------------| +| `event` | string | `"publish"` | +| `label` | string | Human-readable name for the instance | +| `description` | string | Markdown-formatted description | +| `expiration` | number | POSIX timestamp for instance expiration | +| `payoutUpperbound` | number | Maximum payout amount | +| `vendorExpiration` | number | Expiration timestamp for vendor contracts | +| `seedUtxo` | object | `{transactionId, outputIndex}` | +| `permissions` | object | Map of action names → permission definitions | + +#### Code Extraction (`process_publish`) +| Metadata Path | Extracted As | DB Column | +|---------------|-------------|-----------| +| `body.label` | `extract_text()` → name | `treasury_contracts.name` | +| `body.permissions` | raw JSON clone | `treasury_contracts.permissions` | + +**Not extracted**: `description`, `expiration`, `payoutUpperbound`, `vendorExpiration`, `seedUtxo` + +#### DB Writes +- **UPSERT** `treasury.treasury_contracts` (keyed on `contract_instance`) +- **INSERT** `treasury.events` + +--- + +### initialize + +**Purpose**: Documents the initialization of a treasury instance (stake address withdrawal). + +#### Spec Fields +| Field | Type | Description | +|-------|------|-------------| +| `event` | string | `"initialize"` | +| `reason` | string | Justification (optional) | +| `outputs` | object | Map of output indices → `{identifier, label}` | + +#### Code Extraction (`process_initialize`) +Minimal — only records the tx hash and block time. + +#### DB Writes +- **UPSERT** `treasury.treasury_contracts` — sets `initialized_tx_hash`, `initialized_at` +- **INSERT** `treasury.events` + +**Not extracted**: `reason`, `outputs` + +--- + +### fund + +**Purpose**: Records funds flowing from treasury into the vendor contract, creating a new project. + +#### Spec Fields +| Field | Type | Description | +|-------|------|-------------| +| `event` | string | `"fund"` | +| `identifier` | string | Unique project ID (e.g., `"EC-0008-25"`) | +| `otherIdentifiers` | array | Related project IDs | +| `label` | string | Project title (often includes vendor name by convention) | +| `description` | string | Markdown project description | +| `vendor` | object | `{label: "", details: {anchorUrl, anchorDataHash}}` | +| `contract` | object | `{anchorUrl: "", anchorDataHash}` | +| `milestones` | object | Map of milestone IDs → milestone objects | + +**Spec milestone object** (keyed by ID in an object, e.g., `{"m-0": {...}}`): +| Field | Type | Description | +|-------|------|-------------| +| `identifier` | string | Milestone ID matching datum | +| `label` | string | Human-readable name | +| `description` | string | Markdown description | +| `acceptanceCriteria` | string | Completion criteria | +| `details` | object | Additional details (optional) | + +#### Code Extraction (`process_fund`) +| Metadata Path | Extracted As | DB Column | +|---------------|-------------|-----------| +| `body.identifier` | string | `vendor_contracts.project_id` | +| `body.label` | `extract_text()` | `vendor_contracts.project_name` | +| `body.description` | `extract_text()` | `vendor_contracts.description` | +| _(not extracted)_ | `None` | `vendor_contracts.vendor_name` (always null — TOM spec has no `vendor.name` field) | +| `body.vendor.label` | `extract_text_from_value()` | `vendor_contracts.vendor_address` | +| `body.contract` | `extract_contract()` — handles both string and `{anchorUrl}` object | `vendor_contracts.contract_url` | +| `body.otherIdentifiers` | string array | `vendor_contracts.other_identifiers` | +| `body.milestones[].identifier` | string | `milestones.milestone_id` | +| `body.milestones[].label` | `extract_text_from_value()` | `milestones.label` | +| `body.milestones[].description` | `extract_text_from_value()` | `milestones.description` | +| `body.milestones[].acceptanceCriteria` | `extract_text_from_value()` | `milestones.acceptance_criteria` | +| `body.milestones[].amount` | i64 | `milestones.amount_lovelace` | + +**Milestone format handling**: Milestones are accepted in both array format (`[{identifier: "m-0", ...}]`) and object format (`{"m-0": {...}}`). For arrays, the `identifier` field inside each element provides the milestone ID. For objects, the key is the milestone ID. + +Additionally queries `yaci_store.address_utxo` for the fund tx to get: +- `contract_address` — first `addr1x%` output address +- `initial_amount_lovelace` — lovelace amount of that output + +**Datum integration**: After UTXO recording, queries `inline_datum` from the fund tx output (`addr1x%` address). If available, parses the CBOR datum via `parse_vendor_contract_datum()` to: +- Store `vendor_payment_key_hash` on the vendor contract row +- Update each milestone's `amount_lovelace`, `time_limit`, and `paused` flag from the datum (overwriting metadata-provided amounts with authoritative on-chain values) +- Store raw CBOR hex on the UTXO tracking row (`inline_datum_cbor`) + +#### DB Writes +- **UPSERT** `treasury.treasury_contracts` (ensure exists) +- **INSERT** `treasury.vendor_contracts` (ON CONFLICT by `project_id` updates name/description) +- **INSERT** `treasury.milestones` (one per milestone, ON CONFLICT DO NOTHING) +- **INSERT** `treasury.events` +- **INSERT** `treasury.utxos` (record output UTXOs for chain tracking, with `inline_datum_cbor` if available) +- **UPDATE** `treasury.vendor_contracts` — sets `vendor_payment_key_hash` (from datum, if available) +- **UPDATE** `treasury.milestones` — sets `amount_lovelace`, `time_limit`, `paused` per milestone (from datum, if available) + +--- + +### complete + +**Purpose**: Vendor provides evidence of milestone completion by spending the vendor contract UTXO without withdrawing funds. + +#### Spec Fields +| Field | Type | Description | +|-------|------|-------------| +| `event` | string | `"complete"` | +| `milestones` | object | Map of milestone IDs → `{description, evidence[]}` | + +**Evidence array item**: +| Field | Type | Description | +|-------|------|-------------| +| `label` | string | Evidence description | +| `anchorUrl` | string | Evidence location | +| `anchorDataHash` | string | Document hash (optional) | + +#### Code Extraction (`process_complete`) +| Metadata Path | Extracted As | DB Column | +|---------------|-------------|-----------| +| `body.identifier` | string (fallback) | Used to find vendor_contract_id | +| `body.milestones..description` | `extract_text_from_value()` | `milestones.complete_description` | +| `body.milestones..evidence` | raw JSON clone | `milestones.evidence` | +| `body.milestone` | string (legacy format) | Used to find milestone by ID | + +**Project identification**: First tries `body.identifier` to look up vendor contract by project_id. Falls back to `find_vendor_contract_from_inputs()` (UTXO chain tracing). + +**Milestone format handling**: Code handles milestones as an object keyed by milestone ID (`.as_object()`), which matches the spec. Also handles legacy single `body.milestone` field as a fallback. + +#### DB Writes +- **UPDATE** `treasury.milestones` — sets `evidence_provided = TRUE`, `complete_tx_hash`, `complete_time`, `complete_description`, `evidence` +- **INSERT** `treasury.events` (one per milestone completed) + +--- + +### disburse + +**Purpose**: Treasury-level fund movement — moves funds from the treasury contract to an external destination (e.g., stablecoin minting). **Not milestone-related.** + +#### Spec Fields +| Field | Type | Description | +|-------|------|-------------| +| `event` | string | `"disburse"` | +| `label` | string | Human-readable transaction title | +| `description` | string | Mechanical description of fund usage | +| `justification` | string | Markdown explaining committee remit | +| `destination` | object/array | `{label, details: {anchorUrl, anchorDataHash}}` | +| `estimatedReturn` | number | POSIX timestamp for expected fund return | + +#### Code Extraction (`process_disburse`) +| Metadata Path | Extracted As | DB Column | +|---------------|-------------|-----------| +| `instance` (top-level) | string | Used to look up `treasury_id` directly | +| `body.destination` | `extract_text()` | `events.destination` | + +**Not extracted**: `label`, `description`, `justification`, `estimatedReturn` + +Disburse is a treasury-level operation. The code looks up `treasury_id` from `instance` and does **not** call `find_vendor_contract_from_inputs`. `vendor_contract_id` is always `None` for disburse events. + +**Note**: `destination` extraction uses `extract_text()` which expects a string or string array, while the spec defines destination as an object with `label`/`details`. This means structured destination metadata may not be fully captured. + +#### DB Writes +- **INSERT** `treasury.events` (with destination field, `vendor_contract_id = NULL`) + +--- + +### withdraw + +**Purpose**: Vendor claims matured milestone funds from the vendor contract. + +#### Spec Fields +| Field | Type | Description | +|-------|------|-------------| +| `event` | string | `"withdraw"` | +| `milestones` | object | Map of milestone IDs → `{comment}` | + +#### Code Extraction (`process_withdraw`) +| Metadata Path | Extracted As | DB Column | +|---------------|-------------|-----------| +| `body.identifier` | string | Used to find vendor_contract_id | +| `body.milestones` | object keyed by milestone ID | Iterates over all milestone IDs | +| `body.milestone` | string (legacy fallback) | Used to find milestone by ID if `milestones` absent | + +**Milestone format handling**: Code first checks for `body.milestones` (plural) as an object keyed by milestone ID (spec format, handles multiple milestones per withdraw). Falls back to `body.milestone` (singular string) for legacy single-milestone format. + +Additionally queries `yaci_store.address_utxo` for the withdraw tx to calculate `withdraw_amount` (sum of non-script outputs via `owner_addr NOT LIKE 'addr1x%'`). + +**Not extracted**: `milestones..comment` + +#### DB Writes +- **UPDATE** `treasury.milestones` — sets `withdrawn = TRUE`, `withdraw_tx_hash`, `withdraw_time`, `withdraw_amount` +- **INSERT** `treasury.events` + +--- + +### pause + +**Purpose**: Oversight committee prevents milestone fund withdrawal pending resolution. + +#### Spec Fields +| Field | Type | Description | +|-------|------|-------------| +| `event` | string | `"pause"` | +| `milestones` | object | Map of milestone IDs → `{reason, resolution}` | + +#### Code Extraction (`process_pause`) +| Metadata Path | Extracted As | DB Column | +|---------------|-------------|-----------| +| `body.identifier` | string | Used to find vendor_contract_id | +| `body.reason` | `extract_text()` | `events.reason` | + +**Per-milestone pause via datum**: After identifying the vendor contract, calls `update_milestone_pause_from_datum()` which parses the output datum of the pause transaction. Each milestone in the datum has a `Constr(0|1, [])` pause flag (0=active, 1=paused), and the code updates the `paused` boolean on each milestone row accordingly. + +**Contract-level status derivation**: After updating per-milestone flags, the code derives contract status: `paused` if ALL milestones are paused, `active` if no milestones are paused. Mixed state leaves the contract status unchanged. + +**Not extracted**: per-milestone `reason`, `resolution` from metadata + +#### DB Writes +- **UPDATE** `treasury.milestones` — sets `paused` flag per milestone (from datum) +- **UPDATE** `treasury.vendor_contracts` — sets `status` to `'paused'` or `'active'` (derived from per-milestone state) +- **INSERT** `treasury.events` (with reason) + +--- + +### resume + +**Purpose**: Oversight committee resumes previously paused milestone payments. + +#### Spec Fields +| Field | Type | Description | +|-------|------|-------------| +| `event` | string | `"resume"` | +| `milestones` | object | Map of milestone IDs → `{reason}` | + +#### Code Extraction (`process_resume`) +| Metadata Path | Extracted As | DB Column | +|---------------|-------------|-----------| +| `body.identifier` | string | Used to find vendor_contract_id | + +**Per-milestone resume via datum**: Same mechanism as pause. After identifying the vendor contract, calls `update_milestone_pause_from_datum()` which parses the output datum to read each milestone's pause flag and updates the `paused` boolean per milestone row. + +**Contract-level status derivation**: Same as pause — `active` if no milestones paused, `paused` if all milestones paused. + +**Not extracted**: per-milestone `reason` from metadata + +#### DB Writes +- **UPDATE** `treasury.milestones` — sets `paused` flag per milestone (from datum) +- **UPDATE** `treasury.vendor_contracts` — sets `status` to `'paused'` or `'active'` (derived from per-milestone state) +- **INSERT** `treasury.events` + +--- + +### modify + +**Purpose**: Vendor and committee agree to alter payout amounts or milestone terms. + +#### Spec Fields +| Field | Type | Description | +|-------|------|-------------| +| `event` | string | `"modify"` | +| `identifier` | string | Project ID being modified | +| `otherIdentifiers` | array | Related project IDs | +| `label` | string | Updated project title | +| `description` | string | Updated project description | +| `reason` | string | Markdown justification | +| `vendor` | object | Updated vendor info (same format as fund) | +| `contract` | object | Updated contract info (same format as fund) | +| `milestones` | object/array | Updated milestone definitions | + +#### Code Extraction (`process_modify`) +| Metadata Path | Extracted As | DB Column | +|---------------|-------------|-----------| +| `body.identifier` | string | Used to find vendor_contract_id | +| `body.label` | `extract_text()` | `vendor_contracts.project_name` (COALESCE update) | +| `body.description` | `extract_text()` | `vendor_contracts.description` (COALESCE update) | +| `body.vendor.label` | `extract_text_from_value()` | `vendor_contracts.vendor_address` (COALESCE update) | +| `body.contract` | `extract_contract()` | `vendor_contracts.contract_url` (COALESCE update) | +| `body.reason` | `extract_text()` | `events.reason` | +| `body.milestones` | array or object of milestones | Archives old, inserts new | + +**Naming fields update**: Before processing milestones, the code extracts `label`, `description`, `vendor.label`, and `contract` and updates the vendor contract row using COALESCE (only overwrites if the new value is non-null). + +**Milestone format handling**: Same as fund — milestones are accepted in both array format (`[{identifier: "m-0", ...}]`) and object format (`{"m-0": {...}}`). + +Milestone field extraction is identical to fund (identifier, label, description, acceptanceCriteria, amount). + +#### DB Writes +- **UPDATE** `treasury.vendor_contracts` — COALESCE update of `project_name`, `description`, `vendor_address`, `contract_url` +- **UPDATE** `treasury.milestones` — sets `archived = TRUE`, `archived_by_tx_hash`, `archived_at` for all active milestones +- **INSERT** `treasury.milestones` — new milestone rows +- **UPDATE** `treasury.milestones` — sets `superseded_by` FK linking old → new rows with matching milestone_id +- **INSERT** `treasury.events` (with reason) + +--- + +### cancel + +**Purpose**: Special case of modify where project is completely cancelled and refunded. + +#### Spec Fields +| Field | Type | Description | +|-------|------|-------------| +| `event` | string | `"cancel"` | +| `reason` | string | Markdown explanation for cancellation | + +#### Code Extraction (`process_cancel`) +| Metadata Path | Extracted As | DB Column | +|---------------|-------------|-----------| +| `body.identifier` | string | Used to find vendor_contract_id | +| `body.reason` | `extract_text()` | `events.reason` | + +#### DB Writes +- **UPDATE** `treasury.vendor_contracts` — sets `status = 'cancelled'` +- **INSERT** `treasury.events` (with reason) + +--- + +### sweep + +**Purpose**: Returns surplus funds from treasury or vendor contracts back to the Cardano treasury. + +#### Spec Fields +| Field | Type | Description | +|-------|------|-------------| +| `event` | string | `"sweep"` | +| `comment` | string | Markdown explanation (optional; metadata may be omitted entirely) | + +#### Code Extraction (`process_sweep`) +Minimal — only looks up treasury_id from instance. + +**Not extracted**: `comment` + +#### DB Writes +- **INSERT** `treasury.events` + +Note: Code also matches `"sweeptreasury"` and `"sweepvendor"` as aliases. + +--- + +### reorganize + +**Purpose**: Documents fund splitting, merging, or rebalancing operations. + +#### Spec Fields +| Field | Type | Description | +|-------|------|-------------| +| `event` | string | `"reorganize"` | +| `reason` | string | Justification (optional) | +| `outputs` | object | Map of output indices → `{identifier, label}` | + +#### Code Extraction (`process_reorganize`) +Minimal — only looks up treasury_id from instance. + +**Not extracted**: `reason`, `outputs` + +#### DB Writes +- **INSERT** `treasury.events` + +--- + +## 4. Field Extraction Details + +### Text Extraction Helpers + +```rust +fn extract_text(obj: &Value, field: &str) -> Option +fn extract_text_from_value(value: Option<&Value>) -> Option +``` + +Both handle two formats: +- **String**: returned as-is +- **Array of strings**: joined with `""` (empty string — no separator) + +**Known issue**: The join with empty string means `["Hello ", "World"]` → `"Hello World"` (correct) but `["Hello", "World"]` → `"HelloWorld"` (missing space). CIP-100 chunks at fixed byte boundaries, so this typically works for continuous text but could produce incorrect results at chunk boundaries if the original text doesn't align. + +### Vendor Name vs Label + +The TOM spec defines the `vendor` object as: +```json +{ + "vendor": { + "label": "Vendor Company Name", + "details": { + "anchorUrl": "https://...", + "anchorDataHash": "..." + } + } +} +``` + +The code sets `vendor_name = None` explicitly — TOM spec has no `vendor.name` field, so `vendor_contracts.vendor_name` is always null. `vendor.label` is extracted via `extract_text_from_value()` into `vendor_contracts.vendor_address`. + +In practice, vendor identity comes from the top-level `body.label` which by convention includes the vendor name (e.g., `"Tastenkunst GmbH - Eternl Maintenance"`). The `vendor.label` field in real metadata contains the vendor's payment address (a Cardano address), not their display name. + +### Contract URL Extraction + +The `extract_contract()` helper handles both metadata formats: + +- **String**: `"contract": "https://..."` — returned directly +- **Object**: `"contract": {"anchorUrl": "https://...", "anchorDataHash": "..."}` — extracts `anchorUrl` + +This covers both spec-conformant metadata (object format) and simplified metadata (plain string). + +### Milestone Format: Object vs Array + +| Context | Spec Format | Code Handles | +|---------|------------|-------------| +| fund | Object keyed by ID: `{"m-0": {...}}` | Both array `[{identifier: "m-0", ...}]` and object `{"m-0": {...}}` | +| complete | Object keyed by ID: `{"m-0": {...}}` | Object keyed by ID (correct) | +| modify | Same as fund | Both array and object (same as fund handler) | +| withdraw | Object keyed by ID: `{"m-0": {...}}` | Object `milestones` (plural, keyed by ID) + singular string `milestone` fallback | +| pause | Object keyed by ID: `{"m-0": {...}}` | Per-milestone via inline datum parsing (not from metadata milestones field) | +| resume | Object keyed by ID: `{"m-0": {...}}` | Per-milestone via inline datum parsing (not from metadata milestones field) | + +Real on-chain metadata uses both arrays and objects for fund/modify events. The code handles both formats. + +--- + +## 5. UTXO Chain Tracking + +### How It Works + +When a `fund` event is processed, the code records all output UTXOs from that transaction in `treasury.utxos` with the `vendor_contract_id`. Subsequent events (complete, withdraw, etc.) spend those UTXOs, so the processor can trace backwards to find which project an event belongs to. + +### `find_vendor_contract_from_inputs()` + +``` +1. Get inputs to this tx: SELECT tx_hash, output_index FROM yaci_store.tx_input + WHERE spent_tx_hash = $1 +2. For each input, look up: SELECT vendor_contract_id FROM treasury.utxos + WHERE tx_hash = $1 AND output_index = $2 +3. If found: mark old UTXO as spent, record new output UTXOs with same vendor_contract_id +4. Return first matching vendor_contract_id +``` + +This correctly traces the UTXO chain regardless of address, because it tracks by specific (tx_hash, output_index) pairs. + +When recording new output UTXOs (step 3), the code also stores `inline_datum_cbor` if the output has an inline datum in `yaci_store.address_utxo`. This datum is used later by pause/resume processing. + +--- + +## 5a. Datum Integration + +### CBOR Datum Parser (`parsers/datum.rs`) + +The datum parser decodes inline Plutus datums from CBOR hex into structured data. It uses the `pallas` library for CBOR decoding. + +### Datum Structure + +```text +Constr(0, [ + Constr(0, [ByteString(vendor_payment_key_hash)]), + Array([ + Constr(0, [BigInt(time_limit), Map(value), Constr(0|1, [])]), // per milestone + ... + ]) +]) +``` + +- **vendor_payment_key_hash**: hex-encoded byte string identifying the vendor's payment key +- **Per-milestone fields**: + - `BigInt(time_limit)` — POSIXTime in milliseconds, the milestone's expiration + - `Map(value)` — Plutus Value map, structured as `{"": {"": lovelace_amount}}` (ADA policy ID is empty bytestring) + - `Constr(0|1, [])` — pause flag: constructor 0 (tag 121) = active, constructor 1 (tag 122) = paused + +### When Datums Are Parsed + +| Context | Function | What happens | +|---------|----------|-------------| +| `fund` event | `parse_vendor_contract_datum()` | Populates `vendor_payment_key_hash`, per-milestone `amount_lovelace`, `time_limit`, `paused` | +| `pause` event | `update_milestone_pause_from_datum()` | Updates per-milestone `paused` flags, derives contract status | +| `resume` event | `update_milestone_pause_from_datum()` | Updates per-milestone `paused` flags, derives contract status | +| UTXO chain tracking | `find_vendor_contract_from_inputs()` | Stores `inline_datum_cbor` on new UTXO rows for later use | + +### Fields Extracted + +| Datum Field | DB Column | Table | +|-------------|-----------|-------| +| `vendor_payment_key_hash` | `vendor_payment_key_hash` | `vendor_contracts` | +| Per-milestone `time_limit` | `time_limit` | `milestones` | +| Per-milestone lovelace from Value map | `amount_lovelace` | `milestones` | +| Per-milestone `Constr(0\|1)` | `paused` | `milestones` | + +### Prerequisite + +Requires `store.script.enabled=true` in YACI Store configuration (`indexer/application.properties`) so that `inline_datum` is populated on `address_utxo` rows. If disabled, datum parsing is skipped gracefully. + +--- + +## 6. Known Bugs & Limitations (Resolved) + +All 11 bugs have been fixed. This section documents the original issues and their resolutions. + +### Critical (Fixed) + +**1. ~~`sync_address_utxos()` misassigns UTXOs~~** — FIXED: Deleted `sync_utxos()` and `sync_address_utxos()`. UTXO tracking now relies exclusively on `find_vendor_contract_from_inputs()` chain tracing. + +**2. ~~`vendor.name` always null~~** — FIXED: Code now sets `vendor_name = None` explicitly since TOM spec has no `vendor.name` field. `vendor.label` correctly maps to `vendor_address`. + +### High (Fixed) + +**3. ~~Disburse events incorrectly linked to vendor contracts~~** — FIXED: `process_disburse` now takes `instance` parameter and looks up `treasury_id` directly. No longer calls `find_vendor_contract_from_inputs`. `vendor_contract_id` is always `None` for disburse events. + +**4. Multiple UTXO inputs → first match wins** — Acceptable: A transaction spending vendor contract UTXOs belongs to one project. First-match is the correct behavior. + +**5. ~~Pause/resume are contract-level, spec says milestone-level~~** — FIXED: Added `paused` boolean flag on milestones. `process_pause`/`process_resume` now parse the output datum to determine per-milestone pause state via `update_milestone_pause_from_datum()`. Contract-level status is derived: paused if ALL milestones paused, active if none paused. + +**6. ~~Modify doesn't update naming fields~~** — FIXED: `process_modify` now extracts and updates `project_name`, `description`, `vendor_address`, and `contract_url` using COALESCE before processing milestones. + +### Medium (Fixed) + +**7. ~~Array text concat has no separator~~** — Correct behavior: CIP-100 splits text at fixed 64-byte boundaries, so `join("")` correctly reconstructs the original text. Added explanatory comment. + +**8. ~~Fund milestones as array vs spec object~~** — FIXED: Both `process_fund` and `process_modify` now handle milestones as either an array `[{identifier: "m-0", ...}]` or an object `{"m-0": {...}}`. + +**9. ~~No slot-level ordering within blocks~~** — FIXED: Added `m.tx_hash ASC` as secondary sort in both `sync_all_events` and `sync_new_events` queries. + +**10. ~~`contract` field extraction assumes string~~** — FIXED: Added `extract_contract()` helper that handles both `contract: "url"` (string) and `contract: {anchorUrl: "url"}` (object) formats. + +**11. ~~Withdraw handles single milestone only~~** — FIXED: `process_withdraw` now checks for `milestones` object (plural, keyed by ID) first, falling back to singular `milestone` field for legacy format. + +--- + +## 7. Debugging Queries + +### Compare raw metadata vs stored values for a project + +```sql +-- Get raw metadata for a project's fund event +SELECT e.tx_hash, e.metadata +FROM treasury.events e +JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id +WHERE vc.project_id = 'EC-0008-25' AND e.event_type = 'fund'; + +-- Compare with stored values +SELECT project_id, project_name, vendor_name, vendor_address, contract_url, description +FROM treasury.vendor_contracts +WHERE project_id = 'EC-0008-25'; +``` + +### Find projects with null vendor_name + +```sql +SELECT project_id, project_name, vendor_name, vendor_address +FROM treasury.vendor_contracts +WHERE vendor_name IS NULL +ORDER BY project_id; +``` + +### Check for duplicate contract_addresses across projects + +```sql +-- All projects sharing the same contract address (expected: all share one) +SELECT contract_address, COUNT(*) as project_count, + array_agg(project_id ORDER BY project_id) as projects +FROM treasury.vendor_contracts +WHERE contract_address IS NOT NULL +GROUP BY contract_address +HAVING COUNT(*) > 1; +``` + +### Verify UTXO assignment correctness + +```sql +-- Check if UTXOs at the shared address are spread across projects or concentrated on one +SELECT u.vendor_contract_id, vc.project_id, COUNT(*) as utxo_count, + SUM(u.lovelace_amount) as total_lovelace +FROM treasury.utxos u +JOIN treasury.vendor_contracts vc ON vc.id = u.vendor_contract_id +WHERE NOT u.spent +GROUP BY u.vendor_contract_id, vc.project_id +ORDER BY utxo_count DESC; +``` + +### Check UTXO chain integrity for a project + +```sql +-- Follow the UTXO chain for a specific project +WITH RECURSIVE utxo_chain AS ( + SELECT u.tx_hash, u.output_index, u.spent, u.spent_tx_hash, u.vendor_contract_id, 1 as depth + FROM treasury.utxos u + JOIN treasury.vendor_contracts vc ON vc.id = u.vendor_contract_id + WHERE vc.project_id = 'EC-0008-25' + AND u.tx_hash = vc.fund_tx_hash + + UNION ALL + + SELECT u.tx_hash, u.output_index, u.spent, u.spent_tx_hash, u.vendor_contract_id, uc.depth + 1 + FROM treasury.utxos u + JOIN utxo_chain uc ON u.tx_hash = uc.spent_tx_hash + WHERE uc.spent = true AND uc.depth < 20 +) +SELECT * FROM utxo_chain ORDER BY depth; +``` + +### Compare events across projects + +```sql +-- All events with project context, ordered by time +SELECT e.event_type, e.block_time, e.tx_hash, + vc.project_id, vc.project_name +FROM treasury.events e +LEFT JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id +ORDER BY e.block_time DESC +LIMIT 50; +``` + +### Inspect metadata for a specific event type + +```sql +-- View raw metadata for all complete events +SELECT e.tx_hash, e.block_time, + vc.project_id, + e.metadata->'body'->'milestones' as milestones_meta +FROM treasury.events e +LEFT JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id +WHERE e.event_type = 'complete'; +``` diff --git a/indexer/application.properties b/indexer/application.properties index 8b17598..622c650 100644 --- a/indexer/application.properties +++ b/indexer/application.properties @@ -31,7 +31,7 @@ store.metadata.enabled=true store.assets.enabled=false store.epoch.enabled=false store.mir.enabled=false -store.script.enabled=false +store.script.enabled=true store.staking.enabled=false store.governance.enabled=false From 0450b64ffedd9725e326fb8e82639bedd905e686 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Fri, 13 Mar 2026 19:32:38 +0000 Subject: [PATCH 05/19] improve treasury endpoint --- .env.example | 3 +- README.md | 4 +- api/Cargo.toml | 1 + api/src/models/v1.rs | 31 -------- api/src/parsers/address.rs | 32 ++++++++ api/src/parsers/mod.rs | 1 + api/src/routes/v1/vendor_contracts.rs | 2 +- api/src/services/event_processor.rs | 104 +++++++++++++++++--------- database/README.md | 6 +- database/init/02-treasury-schema.sql | 46 ++++++------ database/schema/treasury.sql | 46 ++++++------ indexer/README.md | 4 +- 12 files changed, 161 insertions(+), 119 deletions(-) create mode 100644 api/src/parsers/address.rs diff --git a/.env.example b/.env.example index db1bf7f..ee7d8c2 100644 --- a/.env.example +++ b/.env.example @@ -8,7 +8,8 @@ TREASURY_INSTANCE= # Sync mainnet start point (slot and block hash) # The indexer will start syncing from this point on first run -# 160964954 and 560c7537831007f9670d287b15a69ba18a322b1edc39c0c23ccab3c12ad77b9f are good for Intersect 2025 budget instance +# Must be BEFORE the publish tx (slot 160963893) to capture the full event history. +# 160963800 and 65233bb713c15c4bb427ccbf0e7e5c1c6a6a9c5c04b5edfa1e0e8e72f1285c9c are good for Intersect 2025 budget instance STORE_CARDANO_SYNC_START_SLOT= STORE_CARDANO_SYNC_START_BLOCKHASH= \ No newline at end of file diff --git a/README.md b/README.md index acb8058..b00846b 100644 --- a/README.md +++ b/README.md @@ -183,8 +183,8 @@ Limitation: this is only configured for Mainnet currently The sync start point is configured via environment variables in `.env`: ```bash -STORE_CARDANO_SYNC_START_SLOT=160964954 -STORE_CARDANO_SYNC_START_BLOCKHASH=560c7537831007f9670d287b15a69ba18a322b1edc39c0c23ccab3c12ad77b9f +STORE_CARDANO_SYNC_START_SLOT=160963800 +STORE_CARDANO_SYNC_START_BLOCKHASH=65233bb713c15c4bb427ccbf0e7e5c1c6a6a9c5c04b5edfa1e0e8e72f1285c9c ``` Network settings (host, port, protocol magic) are in `indexer/application.properties`. diff --git a/api/Cargo.toml b/api/Cargo.toml index b7ce758..3c4aab5 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -44,4 +44,5 @@ uuid = { version = "1.0", features = ["v4", "serde"] } # Cardano datum parsing (CBOR/Plutus) pallas-primitives = "0.30" pallas-codec = "0.30" +pallas-addresses = "0.30" hex = "0.4" diff --git a/api/src/models/v1.rs b/api/src/models/v1.rs index 681bd48..76ff8e7 100644 --- a/api/src/models/v1.rs +++ b/api/src/models/v1.rs @@ -132,8 +132,6 @@ pub struct TreasuryResponse { pub contract_address: Option, /// Stake credential pub stake_credential: Option, - /// Human-readable name - pub name: Option, /// Contract status (active/paused) pub status: Option, /// Publish transaction hash @@ -189,7 +187,6 @@ pub struct TreasurySummaryRow { pub contract_instance: String, pub contract_address: Option, pub stake_credential: Option, - pub name: Option, pub status: Option, pub publish_tx_hash: Option, pub publish_time: Option, @@ -216,7 +213,6 @@ impl From for TreasuryResponse { contract_instance: row.contract_instance, contract_address: row.contract_address, stake_credential: row.stake_credential, - name: row.name, status: row.status, publish_tx_hash: row.publish_tx_hash, publish_time: row.publish_time, @@ -256,12 +252,8 @@ pub struct VendorContractSummary { pub project_name: Option, /// Project description pub description: Option, - /// Vendor name - pub vendor_name: Option, /// Vendor payment address pub vendor_address: Option, - /// Contract URL (link to agreement) - pub contract_url: Option, /// PSSC script address pub contract_address: Option, /// Contract status (active/paused/completed/cancelled) @@ -297,14 +289,10 @@ pub struct VendorContractDetail { pub project_name: Option, /// Project description pub description: Option, - /// Vendor name - pub vendor_name: Option, /// Vendor payment address pub vendor_address: Option, /// Vendor payment key hash from datum pub vendor_payment_key_hash: Option, - /// Contract URL (link to agreement) - pub contract_url: Option, /// PSSC script address pub contract_address: Option, /// Contract status (active/paused/completed/cancelled) @@ -366,8 +354,6 @@ pub struct VendorFinancials { pub struct TreasuryReference { /// Contract instance identifier pub contract_instance: Option, - /// Treasury name - pub name: Option, } /// Database row for vendor contract summary @@ -380,9 +366,7 @@ pub struct VendorContractSummaryRow { pub other_identifiers: Option>, pub project_name: Option, pub description: Option, - pub vendor_name: Option, pub vendor_address: Option, - pub contract_url: Option, pub contract_address: Option, pub fund_tx_hash: String, pub fund_slot: Option, @@ -392,7 +376,6 @@ pub struct VendorContractSummaryRow { pub created_at: Option>, pub updated_at: Option>, pub treasury_instance: Option, - pub treasury_name: Option, pub total_milestones: Option, pub pending_milestones: Option, pub completed_milestones: Option, @@ -421,9 +404,7 @@ impl From for VendorContractSummary { project_id: row.project_id, project_name: row.project_name, description: row.description, - vendor_name: row.vendor_name, vendor_address: row.vendor_address, - contract_url: row.contract_url, contract_address: row.contract_address, status: row.status, fund_tx_hash: row.fund_tx_hash, @@ -445,7 +426,6 @@ impl From for VendorContractSummary { }, treasury: TreasuryReference { contract_instance: row.treasury_instance, - name: row.treasury_name, }, last_event_time: row.last_event_time, event_count: row.event_count, @@ -470,10 +450,8 @@ impl From for VendorContractDetail { other_identifiers: row.other_identifiers, project_name: row.project_name, description: row.description, - vendor_name: row.vendor_name, vendor_address: row.vendor_address, vendor_payment_key_hash: None, // populated from DB when queried directly - contract_url: row.contract_url, contract_address: row.contract_address, status: row.status, fund_tx_hash: row.fund_tx_hash, @@ -495,7 +473,6 @@ impl From for VendorContractDetail { }, treasury: TreasuryReference { contract_instance: row.treasury_instance, - name: row.treasury_name, }, last_event_time: row.last_event_time, event_count: row.event_count, @@ -712,8 +689,6 @@ pub struct EventResponse { pub struct EventTreasuryContext { /// Contract instance pub contract_instance: String, - /// Treasury name - pub name: Option, } /// Project context for event @@ -723,8 +698,6 @@ pub struct EventProjectContext { pub project_id: String, /// Project name pub project_name: Option, - /// Vendor name - pub vendor_name: Option, /// Contract address pub contract_address: Option, } @@ -755,10 +728,8 @@ pub struct EventWithContextRow { pub metadata: Option, pub created_at: Option>, pub treasury_instance: Option, - pub treasury_name: Option, pub project_id: Option, pub project_name: Option, - pub vendor_name: Option, pub project_address: Option, pub milestone_id: Option, pub milestone_label: Option, @@ -769,13 +740,11 @@ impl From for EventResponse { fn from(row: EventWithContextRow) -> Self { let treasury = row.treasury_instance.as_ref().map(|inst| EventTreasuryContext { contract_instance: inst.clone(), - name: row.treasury_name.clone(), }); let project = row.project_id.as_ref().map(|pid| EventProjectContext { project_id: pid.clone(), project_name: row.project_name.clone(), - vendor_name: row.vendor_name.clone(), contract_address: row.project_address.clone(), }); diff --git a/api/src/parsers/address.rs b/api/src/parsers/address.rs new file mode 100644 index 0000000..59ba447 --- /dev/null +++ b/api/src/parsers/address.rs @@ -0,0 +1,32 @@ +//! Address parsing utilities for Cardano addresses + +use pallas_addresses::Address; + +/// Extract the stake credential from a bech32 Cardano address. +/// +/// For Shelley base addresses, returns the delegation/stake part as a hex string. +/// Returns None for non-Shelley addresses or on any parse error. +pub fn extract_stake_credential(bech32_addr: &str) -> Option { + let addr = Address::from_bech32(bech32_addr).ok()?; + match addr { + Address::Shelley(shelley) => { + let hash = shelley.delegation().as_hash()?; + Some(hex::encode(hash.as_ref())) + } + _ => None, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_extract_stake_credential_returns_some_for_base_address() { + // A typical mainnet base address (addr1q...) should return a stake credential + // Using a well-known test vector isn't practical without real addresses, + // so we just verify the function doesn't panic on a script address format + let result = extract_stake_credential("addr1x_invalid"); + assert!(result.is_none()); + } +} diff --git a/api/src/parsers/mod.rs b/api/src/parsers/mod.rs index c4f4793..5117a65 100644 --- a/api/src/parsers/mod.rs +++ b/api/src/parsers/mod.rs @@ -1,2 +1,3 @@ // Metadata parsers for treasury contract transactions +pub mod address; pub mod datum; diff --git a/api/src/routes/v1/vendor_contracts.rs b/api/src/routes/v1/vendor_contracts.rs index 24e7e21..d8ae041 100644 --- a/api/src/routes/v1/vendor_contracts.rs +++ b/api/src/routes/v1/vendor_contracts.rs @@ -45,7 +45,7 @@ pub async fn list_vendor_contracts( if params.search.is_some() { conditions.push(format!( - "(project_id ILIKE ${0} OR project_name ILIKE ${0} OR description ILIKE ${0} OR vendor_name ILIKE ${0})", + "(project_id ILIKE ${0} OR project_name ILIKE ${0} OR description ILIKE ${0})", bind_index )); bind_index += 1; diff --git a/api/src/services/event_processor.rs b/api/src/services/event_processor.rs index 81f3ff2..55475c0 100644 --- a/api/src/services/event_processor.rs +++ b/api/src/services/event_processor.rs @@ -111,24 +111,21 @@ impl EventProcessor { /// Process a publish event - create treasury contract async fn process_publish(&self, event: &RawTomEvent, body: &Value, instance: &str) -> anyhow::Result<()> { let event_body = body.get("body").unwrap_or(body); - let name = extract_text(event_body, "label"); let permissions = event_body.get("permissions").cloned(); // Upsert treasury contract let treasury_id: i32 = sqlx::query_scalar( r#" - INSERT INTO treasury.treasury_contracts (contract_instance, name, publish_tx_hash, publish_time, permissions) - VALUES ($1, $2, $3, $4, $5) + INSERT INTO treasury.treasury_contracts (contract_instance, publish_tx_hash, publish_time, permissions) + VALUES ($1, $2, $3, $4) ON CONFLICT (contract_instance) DO UPDATE - SET name = COALESCE(EXCLUDED.name, treasury.treasury_contracts.name), - publish_tx_hash = COALESCE(treasury.treasury_contracts.publish_tx_hash, EXCLUDED.publish_tx_hash), + SET publish_tx_hash = COALESCE(treasury.treasury_contracts.publish_tx_hash, EXCLUDED.publish_tx_hash), publish_time = COALESCE(treasury.treasury_contracts.publish_time, EXCLUDED.publish_time), permissions = COALESCE(EXCLUDED.permissions, treasury.treasury_contracts.permissions) RETURNING id "# ) .bind(instance) - .bind(&name) .bind(&event.tx_hash) .bind(event.block_time) .bind(&permissions) @@ -160,6 +157,24 @@ impl EventProcessor { .fetch_one(&self.pool) .await?; + // Extract treasury contract address from tx outputs + let contract_address: Option = sqlx::query_scalar( + "SELECT owner_addr FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' LIMIT 1" + ) + .bind(&event.tx_hash) + .fetch_optional(&self.pool) + .await?; + + if let Some(ref addr) = contract_address { + let stake_cred = crate::parsers::address::extract_stake_credential(addr); + sqlx::query("UPDATE treasury.treasury_contracts SET contract_address = COALESCE(contract_address, $1), stake_credential = COALESCE(stake_credential, $2) WHERE id = $3") + .bind(addr) + .bind(&stake_cred) + .bind(treasury_id) + .execute(&self.pool) + .await?; + } + let event_body = body.get("body").unwrap_or(body); let reason = extract_text(event_body, "reason"); @@ -187,11 +202,8 @@ impl EventProcessor { let project_name = extract_text(event_body, "label"); let description = extract_text(event_body, "description"); - // TOM spec has no vendor.name field — vendor_name is not available in metadata - let vendor_name: Option = None; let vendor_address = event_body.get("vendor") .and_then(|v| extract_text_from_value(v.get("label"))); - let contract_url = extract_contract(event_body); let mut other_identifiers: Vec = event_body.get("otherIdentifiers") .and_then(|o| o.as_array()) .map(|arr| arr.iter().filter_map(|v| v.as_str()).map(|s| s.to_string()).collect::>()) @@ -232,15 +244,45 @@ impl EventProcessor { None }; + // Fallback: populate treasury contract_address if still null + // The treasury address is the addr1x input that differs from the vendor contract output + if let Some(tid) = treasury_id { + if let Some(ref vc_addr) = contract_address { + let treasury_addr: Option = sqlx::query_scalar( + r#" + SELECT DISTINCT au.owner_addr + FROM yaci_store.tx_input ti + JOIN yaci_store.address_utxo au ON au.tx_hash = ti.tx_hash AND au.output_index = ti.output_index + WHERE ti.spent_tx_hash = $1 AND au.owner_addr LIKE 'addr1x%' AND au.owner_addr != $2 + LIMIT 1 + "# + ) + .bind(&event.tx_hash) + .bind(vc_addr) + .fetch_optional(&self.pool) + .await?; + + if let Some(ref addr) = treasury_addr { + let stake_cred = crate::parsers::address::extract_stake_credential(addr); + sqlx::query("UPDATE treasury.treasury_contracts SET contract_address = COALESCE(contract_address, $1), stake_credential = COALESCE(stake_credential, $2) WHERE id = $3") + .bind(addr) + .bind(&stake_cred) + .bind(tid) + .execute(&self.pool) + .await?; + } + } + } + // Insert vendor contract let vendor_contract_id: i32 = sqlx::query_scalar( r#" INSERT INTO treasury.vendor_contracts ( treasury_id, project_id, other_identifiers, project_name, description, - vendor_name, vendor_address, contract_url, contract_address, + vendor_address, contract_address, fund_tx_hash, fund_slot, fund_block_time, initial_amount_lovelace, status ) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, 'active') + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, 'active') ON CONFLICT (project_id) DO UPDATE SET project_name = COALESCE(EXCLUDED.project_name, treasury.vendor_contracts.project_name), description = COALESCE(EXCLUDED.description, treasury.vendor_contracts.description) @@ -252,9 +294,7 @@ impl EventProcessor { .bind(&other_identifiers) .bind(&project_name) .bind(&description) - .bind(&vendor_name) .bind(&vendor_address) - .bind(&contract_url) .bind(&contract_address) .bind(&event.tx_hash) .bind(event.slot) @@ -344,9 +384,13 @@ impl EventProcessor { Some((addr, amt)) => (Some(addr), amt), None => (None, None), }; - let address_type = address.as_ref().map(|a| { - if a.starts_with("addr1x") { "vendor_contract" } else { "vendor" } - }); + + // Only track UTXOs at script addresses (addr1x) — skip change outputs + if !address.as_ref().map_or(false, |a| a.starts_with("addr1x")) { + continue; + } + + let address_type = Some("vendor_contract"); // Record this UTXO with the vendor_contract_id for future event lookups sqlx::query( @@ -746,22 +790,19 @@ impl EventProcessor { let description = extract_text(event_body, "description"); let vendor_address = event_body.get("vendor") .and_then(|v| extract_text_from_value(v.get("label"))); - let contract_url = extract_contract(event_body); sqlx::query( r#" UPDATE treasury.vendor_contracts SET project_name = COALESCE($1, project_name), description = COALESCE($2, description), - vendor_address = COALESCE($3, vendor_address), - contract_url = COALESCE($4, contract_url) - WHERE id = $5 + vendor_address = COALESCE($3, vendor_address) + WHERE id = $4 "# ) .bind(&project_name) .bind(&description) .bind(&vendor_address) - .bind(&contract_url) .bind(vc_id) .execute(&self.pool) .await?; @@ -1040,9 +1081,13 @@ impl EventProcessor { Some((addr, amt, datum)) => (Some(addr), amt, datum), None => (None, None, None), }; - let address_type = address.as_ref().map(|a| { - if a.starts_with("addr1x") { "vendor_contract" } else { "vendor" } - }); + + // Only track UTXOs at script addresses (addr1x) — skip change outputs + if !address.as_ref().map_or(false, |a| a.starts_with("addr1x")) { + continue; + } + + let address_type = Some("vendor_contract"); sqlx::query( r#" @@ -1136,17 +1181,6 @@ impl EventProcessor { } } -/// Extract contract URL from a field that might be a string or an object with anchorUrl -fn extract_contract(event_body: &Value) -> Option { - match event_body.get("contract") { - Some(Value::String(s)) => Some(s.clone()), - Some(Value::Object(obj)) => obj.get("anchorUrl") - .and_then(|u| u.as_str()) - .map(String::from), - _ => None, - } -} - /// Extract milestone label and description from metadata fields. /// /// On-chain TOM metadata typically has no `label` field on milestones and an empty diff --git a/database/README.md b/database/README.md index 084f643..08e5a9d 100644 --- a/database/README.md +++ b/database/README.md @@ -143,7 +143,7 @@ Vendor contracts with milestone counts, financials, and UTXO balance. SELECT * FROM treasury.v_vendor_contracts_summary; ``` -Fields: id, treasury_id, project_id, other_identifiers, project_name, description, vendor_name, vendor_address, contract_url, contract_address, fund_tx_hash, fund_slot, fund_block_time, initial_amount_lovelace, status, created_at, updated_at, treasury_instance, treasury_name, total_milestones, pending_milestones, completed_milestones, withdrawn_milestones, total_withdrawn_lovelace, current_balance_lovelace, utxo_count, last_event_time, event_count +Fields: id, treasury_id, project_id, other_identifiers, project_name, description, vendor_name, vendor_address, contract_url, contract_address, fund_tx_hash, fund_slot, fund_block_time, initial_amount_lovelace, status, created_at, updated_at, treasury_instance, total_milestones, pending_milestones, completed_milestones, withdrawn_milestones, total_withdrawn_lovelace, current_balance_lovelace, utxo_count, last_event_time, event_count ### treasury.v_events_with_context Events with full treasury/project/milestone context. @@ -152,7 +152,7 @@ Events with full treasury/project/milestone context. SELECT * FROM treasury.v_events_with_context ORDER BY block_time DESC; ``` -Fields: id, tx_hash, slot, block_number, block_time, event_type, amount_lovelace, reason, destination, metadata, created_at, treasury_instance, treasury_name, project_id, project_name, vendor_name, project_address, milestone_id, milestone_label, milestone_order +Fields: id, tx_hash, slot, block_number, block_time, event_type, amount_lovelace, reason, destination, metadata, created_at, treasury_instance, project_id, project_name, vendor_name, project_address, milestone_id, milestone_label, milestone_order ### treasury.v_financial_summary Financial summary showing allocated vs withdrawn vs remaining. @@ -161,7 +161,7 @@ Financial summary showing allocated vs withdrawn vs remaining. SELECT * FROM treasury.v_financial_summary; ``` -Fields: treasury_id, contract_instance, treasury_name, total_allocated_lovelace, total_withdrawn_lovelace, total_remaining_lovelace, treasury_balance_lovelace, project_balance_lovelace, project_count, active_project_count +Fields: treasury_id, contract_instance, total_allocated_lovelace, total_withdrawn_lovelace, total_remaining_lovelace, treasury_balance_lovelace, project_balance_lovelace, project_count, active_project_count ### treasury.v_milestone_timeline Milestones with vendor contract context. diff --git a/database/init/02-treasury-schema.sql b/database/init/02-treasury-schema.sql index 5d167ae..3b62896 100644 --- a/database/init/02-treasury-schema.sql +++ b/database/init/02-treasury-schema.sql @@ -33,9 +33,9 @@ CREATE TABLE IF NOT EXISTS treasury.vendor_contracts ( other_identifiers TEXT[], -- Related IDs from otherIdentifiers array project_name TEXT, -- Label from fund event description TEXT, -- Project description (joined if array) - vendor_name TEXT, -- vendor.name from metadata + vendor_name TEXT, -- DEPRECATED: always null, TOM spec has no vendor.name vendor_address TEXT, -- Payment destination (vendor.label in metadata) - contract_url TEXT, -- contract - link to agreement document + contract_url TEXT, -- DEPRECATED: always null, no on-chain data available contract_address TEXT, -- PSSC script address (from fund tx output) vendor_payment_key_hash VARCHAR(56), fund_tx_hash VARCHAR(64) NOT NULL, -- Fund transaction @@ -185,8 +185,7 @@ CREATE INDEX IF NOT EXISTS idx_vendor_fulltext ON treasury.vendor_contracts USING gin (to_tsvector('english', COALESCE(project_id, '') || ' ' || COALESCE(project_name, '') || ' ' || - COALESCE(description, '') || ' ' || - COALESCE(vendor_name, '') + COALESCE(description, '') )); -- Events by milestone (for milestone event history) @@ -232,9 +231,7 @@ SELECT vc.other_identifiers, vc.project_name, vc.description, - vc.vendor_name, vc.vendor_address, - vc.contract_url, vc.contract_address, vc.fund_tx_hash, vc.fund_slot, @@ -245,7 +242,6 @@ SELECT vc.updated_at, -- Treasury context tc.contract_instance as treasury_instance, - tc.name as treasury_name, -- Milestone counts (excluding archived) COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived) as total_milestones, COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND NOT m.evidence_provided AND NOT m.withdrawn) as pending_milestones, @@ -254,9 +250,9 @@ SELECT COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND m.paused AND NOT m.withdrawn) as paused_milestones, -- Financial totals from milestones COALESCE(SUM(DISTINCT m.withdraw_amount) FILTER (WHERE NOT m.archived), 0)::BIGINT as total_withdrawn_lovelace, - -- Current balance from UTXOs - COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent), 0)::BIGINT as current_balance_lovelace, - COUNT(u.id) FILTER (WHERE NOT u.spent) as utxo_count, + -- Current balance from UTXOs (only script address UTXOs) + COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent AND u.address LIKE 'addr1x%'), 0)::BIGINT as current_balance_lovelace, + COUNT(u.id) FILTER (WHERE NOT u.spent AND u.address LIKE 'addr1x%') as utxo_count, -- Last event time (SELECT MAX(e.block_time) FROM treasury.events e WHERE e.vendor_contract_id = vc.id) as last_event_time, -- Event count @@ -265,7 +261,7 @@ FROM treasury.vendor_contracts vc LEFT JOIN treasury.treasury_contracts tc ON tc.id = vc.treasury_id LEFT JOIN treasury.milestones m ON m.vendor_contract_id = vc.id LEFT JOIN treasury.utxos u ON u.vendor_contract_id = vc.id -GROUP BY vc.id, tc.contract_instance, tc.name; +GROUP BY vc.id, tc.contract_instance; -- Milestone timeline with vendor context CREATE OR REPLACE VIEW treasury.v_milestone_timeline AS @@ -330,7 +326,6 @@ SELECT tc.contract_instance, tc.contract_address, tc.stake_credential, - tc.name, tc.status, tc.publish_tx_hash, tc.publish_time, @@ -341,15 +336,22 @@ SELECT COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'active') as active_contracts, COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'completed') as completed_contracts, COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'cancelled') as cancelled_contracts, - COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent AND u.address = tc.contract_address), 0)::BIGINT as treasury_balance, - COUNT(u.id) FILTER (WHERE NOT u.spent AND u.address = tc.contract_address) as utxo_count, + COALESCE(( + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + WHERE au.owner_addr = tc.contract_address + ), 0)::BIGINT as treasury_balance, + COALESCE(( + SELECT COUNT(*) + FROM yaci_store.address_utxo au + WHERE au.owner_addr = tc.contract_address + ), 0) as utxo_count, (SELECT COUNT(*) FROM treasury.events WHERE treasury_id = tc.id) as total_events, (SELECT MAX(block_time) FROM treasury.events WHERE treasury_id = tc.id) as last_event_time, tc.created_at, tc.updated_at FROM treasury.treasury_contracts tc LEFT JOIN treasury.vendor_contracts vc ON vc.treasury_id = tc.id -LEFT JOIN treasury.utxos u ON u.address = tc.contract_address GROUP BY tc.id; -- Events with full context (treasury, project, milestone info) @@ -368,11 +370,9 @@ SELECT e.created_at, -- Treasury context tc.contract_instance as treasury_instance, - tc.name as treasury_name, -- Project context vc.project_id, vc.project_name, - vc.vendor_name, vc.contract_address as project_address, -- Milestone context m.milestone_id, @@ -388,21 +388,24 @@ CREATE OR REPLACE VIEW treasury.v_financial_summary AS SELECT tc.id as treasury_id, tc.contract_instance, - tc.name as treasury_name, -- Allocation totals COALESCE(SUM(vc.initial_amount_lovelace), 0)::BIGINT as total_allocated_lovelace, -- Withdrawal totals COALESCE(SUM(m_totals.total_withdrawn), 0)::BIGINT as total_withdrawn_lovelace, -- Remaining (allocated - withdrawn) (COALESCE(SUM(vc.initial_amount_lovelace), 0) - COALESCE(SUM(m_totals.total_withdrawn), 0))::BIGINT as total_remaining_lovelace, - -- Treasury balance (actual UTXOs) - COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent AND u.address = tc.contract_address), 0)::BIGINT as treasury_balance_lovelace, + -- Treasury balance (actual UTXOs from yaci_store) + COALESCE(( + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + WHERE au.owner_addr = tc.contract_address + ), 0)::BIGINT as treasury_balance_lovelace, -- Project-level balance (sum of project UTXOs) COALESCE(( SELECT SUM(u2.lovelace_amount) FROM treasury.utxos u2 JOIN treasury.vendor_contracts vc2 ON vc2.id = u2.vendor_contract_id - WHERE vc2.treasury_id = tc.id AND NOT u2.spent + WHERE vc2.treasury_id = tc.id AND NOT u2.spent AND u2.address LIKE 'addr1x%' ), 0)::BIGINT as project_balance_lovelace, -- Counts COUNT(DISTINCT vc.id) as project_count, @@ -417,5 +420,4 @@ LEFT JOIN ( WHERE NOT m.archived GROUP BY m.vendor_contract_id ) m_totals ON m_totals.vendor_contract_id = vc.id -LEFT JOIN treasury.utxos u ON u.address = tc.contract_address GROUP BY tc.id; diff --git a/database/schema/treasury.sql b/database/schema/treasury.sql index 5d167ae..3b62896 100644 --- a/database/schema/treasury.sql +++ b/database/schema/treasury.sql @@ -33,9 +33,9 @@ CREATE TABLE IF NOT EXISTS treasury.vendor_contracts ( other_identifiers TEXT[], -- Related IDs from otherIdentifiers array project_name TEXT, -- Label from fund event description TEXT, -- Project description (joined if array) - vendor_name TEXT, -- vendor.name from metadata + vendor_name TEXT, -- DEPRECATED: always null, TOM spec has no vendor.name vendor_address TEXT, -- Payment destination (vendor.label in metadata) - contract_url TEXT, -- contract - link to agreement document + contract_url TEXT, -- DEPRECATED: always null, no on-chain data available contract_address TEXT, -- PSSC script address (from fund tx output) vendor_payment_key_hash VARCHAR(56), fund_tx_hash VARCHAR(64) NOT NULL, -- Fund transaction @@ -185,8 +185,7 @@ CREATE INDEX IF NOT EXISTS idx_vendor_fulltext ON treasury.vendor_contracts USING gin (to_tsvector('english', COALESCE(project_id, '') || ' ' || COALESCE(project_name, '') || ' ' || - COALESCE(description, '') || ' ' || - COALESCE(vendor_name, '') + COALESCE(description, '') )); -- Events by milestone (for milestone event history) @@ -232,9 +231,7 @@ SELECT vc.other_identifiers, vc.project_name, vc.description, - vc.vendor_name, vc.vendor_address, - vc.contract_url, vc.contract_address, vc.fund_tx_hash, vc.fund_slot, @@ -245,7 +242,6 @@ SELECT vc.updated_at, -- Treasury context tc.contract_instance as treasury_instance, - tc.name as treasury_name, -- Milestone counts (excluding archived) COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived) as total_milestones, COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND NOT m.evidence_provided AND NOT m.withdrawn) as pending_milestones, @@ -254,9 +250,9 @@ SELECT COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND m.paused AND NOT m.withdrawn) as paused_milestones, -- Financial totals from milestones COALESCE(SUM(DISTINCT m.withdraw_amount) FILTER (WHERE NOT m.archived), 0)::BIGINT as total_withdrawn_lovelace, - -- Current balance from UTXOs - COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent), 0)::BIGINT as current_balance_lovelace, - COUNT(u.id) FILTER (WHERE NOT u.spent) as utxo_count, + -- Current balance from UTXOs (only script address UTXOs) + COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent AND u.address LIKE 'addr1x%'), 0)::BIGINT as current_balance_lovelace, + COUNT(u.id) FILTER (WHERE NOT u.spent AND u.address LIKE 'addr1x%') as utxo_count, -- Last event time (SELECT MAX(e.block_time) FROM treasury.events e WHERE e.vendor_contract_id = vc.id) as last_event_time, -- Event count @@ -265,7 +261,7 @@ FROM treasury.vendor_contracts vc LEFT JOIN treasury.treasury_contracts tc ON tc.id = vc.treasury_id LEFT JOIN treasury.milestones m ON m.vendor_contract_id = vc.id LEFT JOIN treasury.utxos u ON u.vendor_contract_id = vc.id -GROUP BY vc.id, tc.contract_instance, tc.name; +GROUP BY vc.id, tc.contract_instance; -- Milestone timeline with vendor context CREATE OR REPLACE VIEW treasury.v_milestone_timeline AS @@ -330,7 +326,6 @@ SELECT tc.contract_instance, tc.contract_address, tc.stake_credential, - tc.name, tc.status, tc.publish_tx_hash, tc.publish_time, @@ -341,15 +336,22 @@ SELECT COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'active') as active_contracts, COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'completed') as completed_contracts, COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'cancelled') as cancelled_contracts, - COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent AND u.address = tc.contract_address), 0)::BIGINT as treasury_balance, - COUNT(u.id) FILTER (WHERE NOT u.spent AND u.address = tc.contract_address) as utxo_count, + COALESCE(( + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + WHERE au.owner_addr = tc.contract_address + ), 0)::BIGINT as treasury_balance, + COALESCE(( + SELECT COUNT(*) + FROM yaci_store.address_utxo au + WHERE au.owner_addr = tc.contract_address + ), 0) as utxo_count, (SELECT COUNT(*) FROM treasury.events WHERE treasury_id = tc.id) as total_events, (SELECT MAX(block_time) FROM treasury.events WHERE treasury_id = tc.id) as last_event_time, tc.created_at, tc.updated_at FROM treasury.treasury_contracts tc LEFT JOIN treasury.vendor_contracts vc ON vc.treasury_id = tc.id -LEFT JOIN treasury.utxos u ON u.address = tc.contract_address GROUP BY tc.id; -- Events with full context (treasury, project, milestone info) @@ -368,11 +370,9 @@ SELECT e.created_at, -- Treasury context tc.contract_instance as treasury_instance, - tc.name as treasury_name, -- Project context vc.project_id, vc.project_name, - vc.vendor_name, vc.contract_address as project_address, -- Milestone context m.milestone_id, @@ -388,21 +388,24 @@ CREATE OR REPLACE VIEW treasury.v_financial_summary AS SELECT tc.id as treasury_id, tc.contract_instance, - tc.name as treasury_name, -- Allocation totals COALESCE(SUM(vc.initial_amount_lovelace), 0)::BIGINT as total_allocated_lovelace, -- Withdrawal totals COALESCE(SUM(m_totals.total_withdrawn), 0)::BIGINT as total_withdrawn_lovelace, -- Remaining (allocated - withdrawn) (COALESCE(SUM(vc.initial_amount_lovelace), 0) - COALESCE(SUM(m_totals.total_withdrawn), 0))::BIGINT as total_remaining_lovelace, - -- Treasury balance (actual UTXOs) - COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent AND u.address = tc.contract_address), 0)::BIGINT as treasury_balance_lovelace, + -- Treasury balance (actual UTXOs from yaci_store) + COALESCE(( + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + WHERE au.owner_addr = tc.contract_address + ), 0)::BIGINT as treasury_balance_lovelace, -- Project-level balance (sum of project UTXOs) COALESCE(( SELECT SUM(u2.lovelace_amount) FROM treasury.utxos u2 JOIN treasury.vendor_contracts vc2 ON vc2.id = u2.vendor_contract_id - WHERE vc2.treasury_id = tc.id AND NOT u2.spent + WHERE vc2.treasury_id = tc.id AND NOT u2.spent AND u2.address LIKE 'addr1x%' ), 0)::BIGINT as project_balance_lovelace, -- Counts COUNT(DISTINCT vc.id) as project_count, @@ -417,5 +420,4 @@ LEFT JOIN ( WHERE NOT m.archived GROUP BY m.vendor_contract_id ) m_totals ON m_totals.vendor_contract_id = vc.id -LEFT JOIN treasury.utxos u ON u.address = tc.contract_address GROUP BY tc.id; diff --git a/indexer/README.md b/indexer/README.md index dc8cd3c..69146a1 100644 --- a/indexer/README.md +++ b/indexer/README.md @@ -54,8 +54,8 @@ store.cardano.protocol-magic=764824073 The sync start point is configured via environment variables in `.env`: ```bash -STORE_CARDANO_SYNC_START_SLOT=160964954 -STORE_CARDANO_SYNC_START_BLOCKHASH=560c7537831007f9670d287b15a69ba18a322b1edc39c0c23ccab3c12ad77b9f +STORE_CARDANO_SYNC_START_SLOT=160963800 +STORE_CARDANO_SYNC_START_BLOCKHASH=65233bb713c15c4bb427ccbf0e7e5c1c6a6a9c5c04b5edfa1e0e8e72f1285c9c ``` Remove these from `.env` to sync from genesis. From 8235335f7c3120a005ce0b014d30d729edd180e7 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Fri, 13 Mar 2026 19:42:13 +0000 Subject: [PATCH 06/19] fix docs --- api/README.md | 46 +++++++++++++--------------------------- database/README.md | 17 ++++++++------- docs/architecture.md | 20 ++++++++--------- docs/event-processing.md | 46 ++++++++++++++-------------------------- 4 files changed, 49 insertions(+), 80 deletions(-) diff --git a/api/README.md b/api/README.md index 6b9ecc8..c14b8ff 100644 --- a/api/README.md +++ b/api/README.md @@ -6,7 +6,7 @@ Rust-based REST API for querying Cardano treasury fund tracking data. Built with - RESTful API with OpenAPI/Swagger documentation - Consistent response envelopes with pagination -- Both lovelace AND ADA amounts in responses +- All amounts in lovelace (1 ADA = 1,000,000 lovelace) - Raw metadata AND parsed/normalized data - Background sync service for real-time data @@ -52,12 +52,11 @@ All responses use a consistent envelope: ### Amount Fields -All monetary amounts include both representations: +All monetary amounts are in lovelace (1 ADA = 1,000,000 lovelace): ```json { - "initial_amount_lovelace": 1000000000000, - "initial_amount_ada": 1000000.0 + "initial_amount_lovelace": 1000000000000 } ``` @@ -115,7 +114,6 @@ Get treasury contract details with statistics and financials. "contract_instance": "9e65e4ed7d6fd86fc4827d2b45da6d2c601fb920e8bfd794b8ecc619", "contract_address": "addr1xxzc8pt7fgf0lc0x7eq6z7z6puhsxmzktna7dluahrj6g6...", "stake_credential": "8583857e4a12ffe1e6f641a1785a0f2f036c565cfbe6ff9db8e5a469", - "name": "CC Treasury", "status": "active", "publish_tx_hash": "abc123...", "publish_time": 1704067200, @@ -132,8 +130,7 @@ Get treasury contract details with statistics and financials. "last_event_time": 1704153600 }, "financials": { - "balance_lovelace": 264568247000000, - "balance_ada": 264568247.0 + "balance_lovelace": 264568247000000 }, "created_at": "2024-01-01T00:00:00Z", "updated_at": "2024-01-15T12:00:00Z" @@ -156,7 +153,6 @@ Get all unspent UTXOs at the treasury contract address. "address": "addr1x...", "address_type": "treasury", "lovelace_amount": 100000000000, - "ada_amount": 100000.0, "slot": 163964156, "block_number": 12296746 } @@ -191,7 +187,7 @@ List all vendor contracts (projects) with pagination and filtering. | `page` | integer | 1 | Page number (1-indexed) | | `limit` | integer | 50 | Results per page (max: 100) | | `status` | string | - | Filter by status: `active`, `paused`, `completed`, `cancelled` | -| `search` | string | - | Search in project_id, project_name, description, vendor_name | +| `search` | string | - | Search in project_id, project_name, description | | `sort` | string | `fund_time` | Sort field: `fund_time`, `project_id`, `project_name`, `initial_amount` | | `order` | string | `desc` | Sort order: `asc`, `desc` | | `from_time` | integer | - | Filter by fund time (Unix timestamp, from) | @@ -211,34 +207,28 @@ curl "http://localhost:8080/api/v1/vendor-contracts?status=active&search=communi "project_id": "EC-0008-25", "project_name": "Community Hub Development", "description": "Building decentralized community infrastructure", - "vendor_name": "Acme Blockchain Solutions", "vendor_address": "addr1q...", - "contract_url": "https://...", "contract_address": "addr1x...", "status": "active", "fund_tx_hash": "abc123...", "fund_time": 1704067200, "initial_amount_lovelace": 1000000000000, - "initial_amount_ada": 1000000.0, "milestones_summary": { "total": 5, "pending": 2, "completed": 2, - "withdrawn": 1 + "withdrawn": 1, + "paused": 0 }, "financials": { "total_allocated_lovelace": 1000000000000, - "total_allocated_ada": 1000000.0, "total_withdrawn_lovelace": 400000000000, - "total_withdrawn_ada": 400000.0, "current_balance_lovelace": 600000000000, - "current_balance_ada": 600000.0, "withdrawal_percentage": 40.0, "utxo_count": 3 }, "treasury": { - "contract_instance": "9e65e4ed...", - "name": "CC Treasury" + "contract_instance": "9e65e4ed..." }, "last_event_time": 1704153600, "event_count": 8 @@ -287,7 +277,6 @@ Get all milestones for a specific project. "description": "Complete market research and requirements gathering", "acceptance_criteria": "Deliver research report", "amount_lovelace": 200000000000, - "amount_ada": 200000.0, "time_limit": 1704240000000, "withdrawn": true, "evidence_provided": true, @@ -301,8 +290,7 @@ Get all milestones for a specific project. "withdrawal": { "tx_hash": "def456...", "time": 1704153600, - "amount_lovelace": 200000000000, - "amount_ada": 200000.0 + "amount_lovelace": 200000000000 }, "archive_info": null, "project": { @@ -392,17 +380,14 @@ List all events with full context. "block_time": 1704067200, "event_type": "fund", "amount_lovelace": 1000000000000, - "amount_ada": 1000000.0, "reason": null, "destination": null, "treasury": { - "contract_instance": "9e65e4ed...", - "name": "CC Treasury" + "contract_instance": "9e65e4ed..." }, "project": { "project_id": "EC-0008-25", "project_name": "Community Hub Development", - "vendor_name": "Acme Blockchain Solutions", "contract_address": "addr1x..." }, "milestone": null, @@ -451,7 +436,8 @@ Get comprehensive statistics across all data. "data": { "treasury": { "total_count": 1, - "active_count": 1 + "active_count": 1, + "disbursed_count": 3 }, "projects": { "total_count": 10, @@ -467,7 +453,8 @@ Get comprehensive statistics across all data. "withdrawn_count": 15 }, "events": { - "total_count": 45, + "on_chain_count": 45, + "processed_count": 45, "by_type": { "fund": 10, "complete": 15, @@ -480,11 +467,8 @@ Get comprehensive statistics across all data. }, "financials": { "total_allocated_lovelace": 5000000000000, - "total_allocated_ada": 5000000.0, "total_withdrawn_lovelace": 2000000000000, - "total_withdrawn_ada": 2000000.0, - "current_balance_lovelace": 3000000000000, - "current_balance_ada": 3000000.0 + "current_balance_lovelace": 3000000000000 }, "sync": { "last_slot": 163964156, diff --git a/database/README.md b/database/README.md index 08e5a9d..fdcd2ec 100644 --- a/database/README.md +++ b/database/README.md @@ -38,9 +38,9 @@ Stores vendor/project contract instances (PSSC). | other_identifiers | TEXT[] | Related IDs | | project_name | TEXT | Project label | | description | TEXT | Project description | -| vendor_name | TEXT | Vendor name | +| vendor_name | TEXT | DEPRECATED: always null (TOM spec has no vendor.name) | | vendor_address | TEXT | Payment destination | -| contract_url | TEXT | Link to agreement | +| contract_url | TEXT | DEPRECATED: always null (no on-chain data available) | | contract_address | TEXT | PSSC script address | | fund_tx_hash | VARCHAR(64) | Fund transaction | | fund_slot | BIGINT | Fund slot | @@ -49,7 +49,7 @@ Stores vendor/project contract instances (PSSC). | status | TEXT | active/paused/completed/cancelled | ### treasury.milestones -Stores milestone data for each vendor contract. Uses 3 independent boolean flags instead of a linear status. +Stores milestone data for each vendor contract. Uses 4 independent boolean flags instead of a linear status. | Column | Type | Description | |--------|------|-------------| @@ -134,7 +134,9 @@ Treasury contracts with aggregated statistics and financials. SELECT * FROM treasury.v_treasury_summary; ``` -Fields: treasury_id, contract_instance, contract_address, stake_credential, name, status, publish_tx_hash, publish_time, initialized_tx_hash, initialized_at, permissions, vendor_contract_count, active_contracts, completed_contracts, cancelled_contracts, treasury_balance, utxo_count, total_events, last_event_time, created_at, updated_at +Fields: treasury_id, contract_instance, contract_address, stake_credential, status, publish_tx_hash, publish_time, initialized_tx_hash, initialized_at, permissions, vendor_contract_count, active_contracts, completed_contracts, cancelled_contracts, treasury_balance, utxo_count, total_events, last_event_time, created_at, updated_at + +Note: `treasury_balance` and `utxo_count` are sourced from `yaci_store.address_utxo` (live unspent UTXOs), not from `treasury.utxos`. ### treasury.v_vendor_contracts_summary Vendor contracts with milestone counts, financials, and UTXO balance. @@ -143,7 +145,7 @@ Vendor contracts with milestone counts, financials, and UTXO balance. SELECT * FROM treasury.v_vendor_contracts_summary; ``` -Fields: id, treasury_id, project_id, other_identifiers, project_name, description, vendor_name, vendor_address, contract_url, contract_address, fund_tx_hash, fund_slot, fund_block_time, initial_amount_lovelace, status, created_at, updated_at, treasury_instance, total_milestones, pending_milestones, completed_milestones, withdrawn_milestones, total_withdrawn_lovelace, current_balance_lovelace, utxo_count, last_event_time, event_count +Fields: id, treasury_id, project_id, other_identifiers, project_name, description, vendor_address, contract_address, fund_tx_hash, fund_slot, fund_block_time, initial_amount_lovelace, status, created_at, updated_at, treasury_instance, total_milestones, pending_milestones, completed_milestones, withdrawn_milestones, paused_milestones, total_withdrawn_lovelace, current_balance_lovelace, utxo_count, last_event_time, event_count ### treasury.v_events_with_context Events with full treasury/project/milestone context. @@ -152,7 +154,7 @@ Events with full treasury/project/milestone context. SELECT * FROM treasury.v_events_with_context ORDER BY block_time DESC; ``` -Fields: id, tx_hash, slot, block_number, block_time, event_type, amount_lovelace, reason, destination, metadata, created_at, treasury_instance, project_id, project_name, vendor_name, project_address, milestone_id, milestone_label, milestone_order +Fields: id, tx_hash, slot, block_number, block_time, event_type, amount_lovelace, reason, destination, metadata, created_at, treasury_instance, project_id, project_name, project_address, milestone_id, milestone_label, milestone_order ### treasury.v_financial_summary Financial summary showing allocated vs withdrawn vs remaining. @@ -220,7 +222,7 @@ The schema includes indexes for: - Foreign key relationships - Status filtering - Time-based ordering (fund_block_time, block_time) -- Text search (project_id, project_name, vendor_name) +- Text search (project_id, project_name, description) - UTXO queries (unspent UTXOs, address lookups) ## Example Queries @@ -230,7 +232,6 @@ The schema includes indexes for: SELECT project_id, project_name, - vendor_name, initial_amount_lovelace / 1000000.0 as allocated_ada, total_withdrawn_lovelace / 1000000.0 as withdrawn_ada, current_balance_lovelace / 1000000.0 as balance_ada, diff --git a/docs/architecture.md b/docs/architecture.md index 6484d51..c025e2c 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -223,9 +223,9 @@ This document describes how data flows through the Cardano Administration Data S │ ┌───────────────┐ ┌───────────────┐ ┌───────────┐ ┌──────────┐ │ │ │ id │ │ id │ │ id │ │ id │ │ │ │ instance │◄────│ treasury_id │◄───│ vendor_id │ │ tx_hash │ │ -│ │ name │ │ project_id │ │ label │ │ event │ │ +│ │ stake_cred │ │ project_id │ │ label │ │ event │ │ │ │ publish_tx │ │ project_name │ │ withdrawn │ │ metadata │ │ -│ └───────────────┘ │ status │ │ amount │ └──────────┘ │ +│ └───────────────┘ │ status │ │ paused │ └──────────┘ │ │ └───────────────┘ │ archived │ │ │ └───────────┘ │ └─────────────────────────────────────────────────────────────────────────────┘ @@ -247,7 +247,7 @@ This document describes how data flows through the Cardano Administration Data S │ "identifier": "project-001", │ │ "label": "My Project", │ │ "description": "Project description...", │ - │ "vendor": { "name": "Acme Corp" }, │ + │ "vendor": { "label": "addr1q..." }, │ │ "milestones": [ │ │ { "identifier": "m1", "label": "Phase 1", "amount": 1000000 }, │ │ { "identifier": "m2", "label": "Phase 2", "amount": 2000000 } │ @@ -270,8 +270,8 @@ This document describes how data flows through the Cardano Administration Data S │ 2. INSERT vendor_contracts │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ INSERT INTO treasury.vendor_contracts │ │ - │ │ (project_id, project_name, vendor_name, ...) │ │ - │ │ VALUES ('project-001', 'My Project', 'Acme Corp', ...) │ │ + │ │ (project_id, project_name, vendor_address, ...) │ │ + │ │ VALUES ('project-001', 'My Project', 'addr1q...', ...) │ │ │ └──────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ @@ -408,14 +408,12 @@ This document describes how data flows through the Cardano Administration Data S │ "data": { │ │ "project_id": "EC-0008-25", │ │ "project_name": "Community Hub Development", │ - │ "vendor_name": "Acme Blockchain Solutions", │ │ "status": "active", │ │ "initial_amount_lovelace": 1000000000000, │ - │ "initial_amount_ada": 1000000.0, │ │ "milestones_summary": { "total": 5, "withdrawn": 2 }, │ │ "financials": { │ - │ "total_allocated_ada": 1000000.0, │ - │ "total_withdrawn_ada": 400000.0, │ + │ "total_allocated_lovelace": 1000000000000, │ + │ "total_withdrawn_lovelace": 400000000000, │ │ "withdrawal_percentage": 40.0 │ │ } │ │ }, │ @@ -436,7 +434,7 @@ This document describes how data flows through the Cardano Administration Data S ├─────────────────────┤ │ id (PK) │ │ contract_instance │◄─────────────────────────────────────────────┐ - │ name │ │ + │ stake_credential │ │ │ publish_tx_hash │ │ │ initialized_at │ │ └─────────────────────┘ │ @@ -450,7 +448,7 @@ This document describes how data flows through the Cardano Administration Data S │ treasury_id (FK) │─────────│ treasury_id (FK) │─────────────┘ │ project_id (unique) │ │ milestone_id (FK) │─────┐ │ project_name │ │ tx_hash (unique) │ │ - │ vendor_name │ │ event_type │ │ + │ vendor_address │ │ event_type │ │ │ status │ │ slot │ │ │ contract_address │ │ metadata (JSONB) │ │ └─────────────────────┘ └─────────────────────┘ │ diff --git a/docs/event-processing.md b/docs/event-processing.md index 4ed5b19..840be82 100644 --- a/docs/event-processing.md +++ b/docs/event-processing.md @@ -127,10 +127,11 @@ The `extract_text` / `extract_text_from_value` helpers handle both formats, join #### Code Extraction (`process_publish`) | Metadata Path | Extracted As | DB Column | |---------------|-------------|-----------| -| `body.label` | `extract_text()` → name | `treasury_contracts.name` | | `body.permissions` | raw JSON clone | `treasury_contracts.permissions` | -**Not extracted**: `description`, `expiration`, `payoutUpperbound`, `vendorExpiration`, `seedUtxo` +**Not extracted**: `label`, `description`, `expiration`, `payoutUpperbound`, `vendorExpiration`, `seedUtxo` + +Note: `body.label` is intentionally not extracted — the name is a static label already known to API consumers. #### DB Writes - **UPSERT** `treasury.treasury_contracts` (keyed on `contract_instance`) @@ -150,10 +151,10 @@ The `extract_text` / `extract_text_from_value` helpers handle both formats, join | `outputs` | object | Map of output indices → `{identifier, label}` | #### Code Extraction (`process_initialize`) -Minimal — only records the tx hash and block time. +Records the tx hash and block time. Also queries `yaci_store.address_utxo` for the first `addr1x%` output to set `contract_address`, and derives `stake_credential` from that address via bech32 decoding. #### DB Writes -- **UPSERT** `treasury.treasury_contracts` — sets `initialized_tx_hash`, `initialized_at` +- **UPSERT** `treasury.treasury_contracts` — sets `initialized_tx_hash`, `initialized_at`, `contract_address`, `stake_credential` - **INSERT** `treasury.events` **Not extracted**: `reason`, `outputs` @@ -191,9 +192,7 @@ Minimal — only records the tx hash and block time. | `body.identifier` | string | `vendor_contracts.project_id` | | `body.label` | `extract_text()` | `vendor_contracts.project_name` | | `body.description` | `extract_text()` | `vendor_contracts.description` | -| _(not extracted)_ | `None` | `vendor_contracts.vendor_name` (always null — TOM spec has no `vendor.name` field) | | `body.vendor.label` | `extract_text_from_value()` | `vendor_contracts.vendor_address` | -| `body.contract` | `extract_contract()` — handles both string and `{anchorUrl}` object | `vendor_contracts.contract_url` | | `body.otherIdentifiers` | string array | `vendor_contracts.other_identifiers` | | `body.milestones[].identifier` | string | `milestones.milestone_id` | | `body.milestones[].label` | `extract_text_from_value()` | `milestones.label` | @@ -207,6 +206,8 @@ Additionally queries `yaci_store.address_utxo` for the fund tx to get: - `contract_address` — first `addr1x%` output address - `initial_amount_lovelace` — lovelace amount of that output +**Treasury address fallback**: If the treasury `contract_address` is still null, derives it from the fund tx inputs by finding the `addr1x%` input address that differs from the vendor contract output. Also derives `stake_credential` from the treasury address via bech32 decoding. + **Datum integration**: After UTXO recording, queries `inline_datum` from the fund tx output (`addr1x%` address). If available, parses the CBOR datum via `parse_vendor_contract_datum()` to: - Store `vendor_payment_key_hash` on the vendor contract row - Update each milestone's `amount_lovelace`, `time_limit`, and `paused` flag from the datum (overwriting metadata-provided amounts with authoritative on-chain values) @@ -399,18 +400,17 @@ Additionally queries `yaci_store.address_utxo` for the withdraw tx to calculate | `body.label` | `extract_text()` | `vendor_contracts.project_name` (COALESCE update) | | `body.description` | `extract_text()` | `vendor_contracts.description` (COALESCE update) | | `body.vendor.label` | `extract_text_from_value()` | `vendor_contracts.vendor_address` (COALESCE update) | -| `body.contract` | `extract_contract()` | `vendor_contracts.contract_url` (COALESCE update) | | `body.reason` | `extract_text()` | `events.reason` | | `body.milestones` | array or object of milestones | Archives old, inserts new | -**Naming fields update**: Before processing milestones, the code extracts `label`, `description`, `vendor.label`, and `contract` and updates the vendor contract row using COALESCE (only overwrites if the new value is non-null). +**Naming fields update**: Before processing milestones, the code extracts `label`, `description`, and `vendor.label` and updates the vendor contract row using COALESCE (only overwrites if the new value is non-null). **Milestone format handling**: Same as fund — milestones are accepted in both array format (`[{identifier: "m-0", ...}]`) and object format (`{"m-0": {...}}`). Milestone field extraction is identical to fund (identifier, label, description, acceptanceCriteria, amount). #### DB Writes -- **UPDATE** `treasury.vendor_contracts` — COALESCE update of `project_name`, `description`, `vendor_address`, `contract_url` +- **UPDATE** `treasury.vendor_contracts` — COALESCE update of `project_name`, `description`, `vendor_address` - **UPDATE** `treasury.milestones` — sets `archived = TRUE`, `archived_by_tx_hash`, `archived_at` for all active milestones - **INSERT** `treasury.milestones` — new milestone rows - **UPDATE** `treasury.milestones` — sets `superseded_by` FK linking old → new rows with matching milestone_id @@ -513,18 +513,13 @@ The TOM spec defines the `vendor` object as: } ``` -The code sets `vendor_name = None` explicitly — TOM spec has no `vendor.name` field, so `vendor_contracts.vendor_name` is always null. `vendor.label` is extracted via `extract_text_from_value()` into `vendor_contracts.vendor_address`. +The TOM spec has no `vendor.name` field — `vendor_contracts.vendor_name` is a deprecated column (always null). `vendor.label` is extracted via `extract_text_from_value()` into `vendor_contracts.vendor_address`. In practice, vendor identity comes from the top-level `body.label` which by convention includes the vendor name (e.g., `"Tastenkunst GmbH - Eternl Maintenance"`). The `vendor.label` field in real metadata contains the vendor's payment address (a Cardano address), not their display name. -### Contract URL Extraction - -The `extract_contract()` helper handles both metadata formats: +### Contract URL -- **String**: `"contract": "https://..."` — returned directly -- **Object**: `"contract": {"anchorUrl": "https://...", "anchorDataHash": "..."}` — extracts `anchorUrl` - -This covers both spec-conformant metadata (object format) and simplified metadata (plain string). +The `contract_url` column on `vendor_contracts` is deprecated (always null). Contract URL extraction was removed as no on-chain data populates this field. ### Milestone Format: Object vs Array @@ -620,7 +615,7 @@ All 11 bugs have been fixed. This section documents the original issues and thei **1. ~~`sync_address_utxos()` misassigns UTXOs~~** — FIXED: Deleted `sync_utxos()` and `sync_address_utxos()`. UTXO tracking now relies exclusively on `find_vendor_contract_from_inputs()` chain tracing. -**2. ~~`vendor.name` always null~~** — FIXED: Code now sets `vendor_name = None` explicitly since TOM spec has no `vendor.name` field. `vendor.label` correctly maps to `vendor_address`. +**2. ~~`vendor.name` always null~~** — FIXED: `vendor_name` column is deprecated (always null). TOM spec has no `vendor.name` field. `vendor.label` correctly maps to `vendor_address`. ### High (Fixed) @@ -630,7 +625,7 @@ All 11 bugs have been fixed. This section documents the original issues and thei **5. ~~Pause/resume are contract-level, spec says milestone-level~~** — FIXED: Added `paused` boolean flag on milestones. `process_pause`/`process_resume` now parse the output datum to determine per-milestone pause state via `update_milestone_pause_from_datum()`. Contract-level status is derived: paused if ALL milestones paused, active if none paused. -**6. ~~Modify doesn't update naming fields~~** — FIXED: `process_modify` now extracts and updates `project_name`, `description`, `vendor_address`, and `contract_url` using COALESCE before processing milestones. +**6. ~~Modify doesn't update naming fields~~** — FIXED: `process_modify` now extracts and updates `project_name`, `description`, `vendor_address` using COALESCE before processing milestones. ### Medium (Fixed) @@ -640,7 +635,7 @@ All 11 bugs have been fixed. This section documents the original issues and thei **9. ~~No slot-level ordering within blocks~~** — FIXED: Added `m.tx_hash ASC` as secondary sort in both `sync_all_events` and `sync_new_events` queries. -**10. ~~`contract` field extraction assumes string~~** — FIXED: Added `extract_contract()` helper that handles both `contract: "url"` (string) and `contract: {anchorUrl: "url"}` (object) formats. +**10. ~~`contract` field extraction assumes string~~** — N/A: `contract_url` extraction was removed (deprecated column, always null). **11. ~~Withdraw handles single milestone only~~** — FIXED: `process_withdraw` now checks for `milestones` object (plural, keyed by ID) first, falling back to singular `milestone` field for legacy format. @@ -658,20 +653,11 @@ JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id WHERE vc.project_id = 'EC-0008-25' AND e.event_type = 'fund'; -- Compare with stored values -SELECT project_id, project_name, vendor_name, vendor_address, contract_url, description +SELECT project_id, project_name, vendor_address, description FROM treasury.vendor_contracts WHERE project_id = 'EC-0008-25'; ``` -### Find projects with null vendor_name - -```sql -SELECT project_id, project_name, vendor_name, vendor_address -FROM treasury.vendor_contracts -WHERE vendor_name IS NULL -ORDER BY project_id; -``` - ### Check for duplicate contract_addresses across projects ```sql From 520816d27ec0b96d096039b33107567c3a6ec202 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Sat, 14 Mar 2026 13:58:17 +0000 Subject: [PATCH 07/19] improve db schema for setup --- database/README.md | 2 +- database/init/02-treasury-schema.sql | 18 ++-- .../001_milestone_lifecycle_redesign.sql | 54 ----------- database/schema/treasury.sql | 18 ++-- dev.sh | 94 +++++++++++-------- 5 files changed, 73 insertions(+), 113 deletions(-) delete mode 100644 database/migrations/001_milestone_lifecycle_redesign.sql diff --git a/database/README.md b/database/README.md index fdcd2ec..99caec9 100644 --- a/database/README.md +++ b/database/README.md @@ -136,7 +136,7 @@ SELECT * FROM treasury.v_treasury_summary; Fields: treasury_id, contract_instance, contract_address, stake_credential, status, publish_tx_hash, publish_time, initialized_tx_hash, initialized_at, permissions, vendor_contract_count, active_contracts, completed_contracts, cancelled_contracts, treasury_balance, utxo_count, total_events, last_event_time, created_at, updated_at -Note: `treasury_balance` and `utxo_count` are sourced from `yaci_store.address_utxo` (live unspent UTXOs), not from `treasury.utxos`. +Note: `treasury_balance` and `utxo_count` are sourced from `treasury.utxos` (unspent UTXOs tracked by the sync service). ### treasury.v_vendor_contracts_summary Vendor contracts with milestone counts, financials, and UTXO balance. diff --git a/database/init/02-treasury-schema.sql b/database/init/02-treasury-schema.sql index 3b62896..2fdf612 100644 --- a/database/init/02-treasury-schema.sql +++ b/database/init/02-treasury-schema.sql @@ -337,14 +337,14 @@ SELECT COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'completed') as completed_contracts, COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'cancelled') as cancelled_contracts, COALESCE(( - SELECT SUM(au.lovelace_amount) - FROM yaci_store.address_utxo au - WHERE au.owner_addr = tc.contract_address + SELECT SUM(u.lovelace_amount) + FROM treasury.utxos u + WHERE u.address = tc.contract_address AND NOT u.spent ), 0)::BIGINT as treasury_balance, COALESCE(( SELECT COUNT(*) - FROM yaci_store.address_utxo au - WHERE au.owner_addr = tc.contract_address + FROM treasury.utxos u + WHERE u.address = tc.contract_address AND NOT u.spent ), 0) as utxo_count, (SELECT COUNT(*) FROM treasury.events WHERE treasury_id = tc.id) as total_events, (SELECT MAX(block_time) FROM treasury.events WHERE treasury_id = tc.id) as last_event_time, @@ -394,11 +394,11 @@ SELECT COALESCE(SUM(m_totals.total_withdrawn), 0)::BIGINT as total_withdrawn_lovelace, -- Remaining (allocated - withdrawn) (COALESCE(SUM(vc.initial_amount_lovelace), 0) - COALESCE(SUM(m_totals.total_withdrawn), 0))::BIGINT as total_remaining_lovelace, - -- Treasury balance (actual UTXOs from yaci_store) + -- Treasury balance (unspent UTXOs at treasury address) COALESCE(( - SELECT SUM(au.lovelace_amount) - FROM yaci_store.address_utxo au - WHERE au.owner_addr = tc.contract_address + SELECT SUM(u.lovelace_amount) + FROM treasury.utxos u + WHERE u.address = tc.contract_address AND NOT u.spent ), 0)::BIGINT as treasury_balance_lovelace, -- Project-level balance (sum of project UTXOs) COALESCE(( diff --git a/database/migrations/001_milestone_lifecycle_redesign.sql b/database/migrations/001_milestone_lifecycle_redesign.sql deleted file mode 100644 index c271743..0000000 --- a/database/migrations/001_milestone_lifecycle_redesign.sql +++ /dev/null @@ -1,54 +0,0 @@ --- Migration: Milestone Lifecycle Redesign --- Replaces linear status field with independent boolean flags --- and renames disburse -> withdraw (disburse is treasury-level, not milestone-level) - -BEGIN; - --- Add new columns -ALTER TABLE treasury.milestones - ADD COLUMN time_limit BIGINT, - ADD COLUMN withdrawn BOOLEAN NOT NULL DEFAULT FALSE, - ADD COLUMN evidence_provided BOOLEAN NOT NULL DEFAULT FALSE, - ADD COLUMN archived BOOLEAN NOT NULL DEFAULT FALSE, - ADD COLUMN withdraw_tx_hash VARCHAR(64), - ADD COLUMN withdraw_time BIGINT, - ADD COLUMN withdraw_amount BIGINT, - ADD COLUMN archived_by_tx_hash VARCHAR(64), - ADD COLUMN archived_at BIGINT, - ADD COLUMN superseded_by INT REFERENCES treasury.milestones(id); - --- Migrate: completed/disbursed → evidence_provided -UPDATE treasury.milestones -SET evidence_provided = TRUE -WHERE status IN ('completed', 'disbursed'); - --- Migrate: disbursed → withdrawn (best-effort mapping of old incorrect model) -UPDATE treasury.milestones -SET withdrawn = TRUE, - withdraw_tx_hash = disburse_tx_hash, - withdraw_time = disburse_time, - withdraw_amount = disburse_amount -WHERE status = 'disbursed'; - --- Drop old columns -ALTER TABLE treasury.milestones - DROP COLUMN status, - DROP COLUMN disburse_tx_hash, - DROP COLUMN disburse_time, - DROP COLUMN disburse_amount; - --- Replace UNIQUE constraint with partial unique index -ALTER TABLE treasury.milestones - DROP CONSTRAINT IF EXISTS milestones_vendor_contract_id_milestone_id_key; - -CREATE UNIQUE INDEX idx_milestone_active_unique - ON treasury.milestones(vendor_contract_id, milestone_id) - WHERE NOT archived; - -CREATE INDEX IF NOT EXISTS idx_milestone_not_archived - ON treasury.milestones(vendor_contract_id) WHERE NOT archived; - --- Drop old status index -DROP INDEX IF EXISTS treasury.idx_milestone_status; - -COMMIT; diff --git a/database/schema/treasury.sql b/database/schema/treasury.sql index 3b62896..2fdf612 100644 --- a/database/schema/treasury.sql +++ b/database/schema/treasury.sql @@ -337,14 +337,14 @@ SELECT COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'completed') as completed_contracts, COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'cancelled') as cancelled_contracts, COALESCE(( - SELECT SUM(au.lovelace_amount) - FROM yaci_store.address_utxo au - WHERE au.owner_addr = tc.contract_address + SELECT SUM(u.lovelace_amount) + FROM treasury.utxos u + WHERE u.address = tc.contract_address AND NOT u.spent ), 0)::BIGINT as treasury_balance, COALESCE(( SELECT COUNT(*) - FROM yaci_store.address_utxo au - WHERE au.owner_addr = tc.contract_address + FROM treasury.utxos u + WHERE u.address = tc.contract_address AND NOT u.spent ), 0) as utxo_count, (SELECT COUNT(*) FROM treasury.events WHERE treasury_id = tc.id) as total_events, (SELECT MAX(block_time) FROM treasury.events WHERE treasury_id = tc.id) as last_event_time, @@ -394,11 +394,11 @@ SELECT COALESCE(SUM(m_totals.total_withdrawn), 0)::BIGINT as total_withdrawn_lovelace, -- Remaining (allocated - withdrawn) (COALESCE(SUM(vc.initial_amount_lovelace), 0) - COALESCE(SUM(m_totals.total_withdrawn), 0))::BIGINT as total_remaining_lovelace, - -- Treasury balance (actual UTXOs from yaci_store) + -- Treasury balance (unspent UTXOs at treasury address) COALESCE(( - SELECT SUM(au.lovelace_amount) - FROM yaci_store.address_utxo au - WHERE au.owner_addr = tc.contract_address + SELECT SUM(u.lovelace_amount) + FROM treasury.utxos u + WHERE u.address = tc.contract_address AND NOT u.spent ), 0)::BIGINT as treasury_balance_lovelace, -- Project-level balance (sum of project UTXOs) COALESCE(( diff --git a/dev.sh b/dev.sh index 4ff24d1..201d72e 100755 --- a/dev.sh +++ b/dev.sh @@ -109,69 +109,83 @@ case "$COMMAND" in fi done - # Wait a bit more for database to be fully initialized - sleep 3 - - # Verify database exists, create if it doesn't - print_info "Verifying database exists..." - MAX_RETRIES=10 + # Wait for database to be fully initialized + # POSTGRES_DB env var tells the entrypoint to create the database, + # but pg_isready returns true before init scripts finish. + print_info "Waiting for database to be ready..." + MAX_RETRIES=30 RETRY_COUNT=0 - DB_EXISTS="" - + while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do - # Try to check if database exists DB_EXISTS=$(docker-compose exec -T postgres psql -U postgres -tAc "SELECT 1 FROM pg_database WHERE datname='administration_data'" 2>/dev/null | tr -d '[:space:]' || echo "") if [ "$DB_EXISTS" = "1" ]; then - print_success "Database 'administration_data' exists" + print_success "Database 'administration_data' is ready" break fi - - # If database doesn't exist, try to create it - if [ $RETRY_COUNT -eq 0 ]; then - print_info "Database 'administration_data' does not exist, creating..." + + RETRY_COUNT=$((RETRY_COUNT + 1)) + if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then + sleep 1 fi - - CREATE_RESULT=$(docker-compose exec -T postgres psql -U postgres -c "CREATE DATABASE administration_data;" 2>&1) - CREATE_EXIT_CODE=$? - - if [ $CREATE_EXIT_CODE -eq 0 ]; then + done + + if [ "$DB_EXISTS" != "1" ]; then + # Database not created by entrypoint — try to create it manually + print_info "Database not found after ${MAX_RETRIES}s, attempting to create..." + if docker-compose exec -T postgres psql -U postgres -c "CREATE DATABASE administration_data;" 2>&1 | grep -qE "CREATE DATABASE|already exists"; then print_success "Database 'administration_data' created" - break - elif echo "$CREATE_RESULT" | grep -q "already exists"; then - print_success "Database 'administration_data' already exists" - break else - RETRY_COUNT=$((RETRY_COUNT + 1)) - if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then - sleep 1 - fi + print_error "Failed to create database 'administration_data'" + print_info "You may need to remove the postgres volume and restart: docker-compose down -v" + exit 1 fi - done - - if [ "$DB_EXISTS" != "1" ] && [ $CREATE_EXIT_CODE -ne 0 ] && ! echo "$CREATE_RESULT" | grep -q "already exists"; then - print_error "Failed to create database after $MAX_RETRIES attempts" - print_error "Last error: $CREATE_RESULT" - print_info "You may need to manually create the database or remove the postgres volume" - print_info "To remove volume: docker-compose down -v" fi - + print_success "PostgreSQL is ready" - # Ensure treasury schema exists (YACI Store creates its own schema/tables via Flyway) - print_info "Ensuring treasury schema exists..." + # Create treasury schema tables (views will fail silently since yaci_store doesn't exist yet) + print_info "Creating treasury schema tables..." + docker-compose exec -T postgres psql -U postgres -d administration_data -c " + CREATE SCHEMA IF NOT EXISTS treasury; + " 2>/dev/null || true docker-compose exec -T postgres psql -U postgres -d administration_data \ -f /docker-entrypoint-initdb.d/02-treasury-schema.sql 2>/dev/null || true - print_success "Database schemas ready" - # Start indexer if JAR is available + # Start indexer if JAR is available — Flyway will create the yaci_store schema if [ "$INDEXER_AVAILABLE" = true ]; then print_info "Starting indexer..." docker-compose up -d indexer + + # Wait for indexer to complete Flyway migrations (yaci_store tables must exist for treasury views) + print_info "Waiting for indexer to initialize (Flyway migrations)..." + INDEXER_RETRIES=0 + INDEXER_MAX=60 + while [ $INDEXER_RETRIES -lt $INDEXER_MAX ]; do + if docker-compose exec -T postgres psql -U postgres -d administration_data -tAc \ + "SELECT 1 FROM information_schema.tables WHERE table_schema='yaci_store' AND table_name='address_utxo'" 2>/dev/null | grep -q 1; then + break + fi + INDEXER_RETRIES=$((INDEXER_RETRIES + 1)) + sleep 1 + done + + if [ $INDEXER_RETRIES -ge $INDEXER_MAX ]; then + print_warning "Indexer did not create yaci_store tables within ${INDEXER_MAX}s — treasury views may be incomplete" + else + print_success "Indexer initialized (Flyway migrations complete)" + # Now re-run treasury schema to create views that reference yaci_store tables + print_info "Creating treasury views..." + docker-compose exec -T postgres psql -U postgres -d administration_data \ + -f /docker-entrypoint-initdb.d/02-treasury-schema.sql 2>/dev/null || true + print_success "Treasury views created" + fi + print_success "Indexer started (check logs with: docker logs administration-indexer -f)" else print_warning "Skipping indexer (JAR file not found)" + print_warning "Treasury views referencing yaci_store will not be created until indexer runs" fi - + # Start API if [ "$API_AVAILABLE" = true ]; then print_info "Starting API (Rust)..." From 30f160a0b6fa82d7bf572da740f745e9f0fa6020 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Mon, 27 Apr 2026 23:16:20 +0100 Subject: [PATCH 08/19] redo milestone and event handling --- .DS_Store | Bin 0 -> 8196 bytes .claude/scheduled_tasks.lock | 1 + api/.DS_Store | Bin 0 -> 6148 bytes api/api/diverging_events.csv | 98 ++++++ api/diverging_events.csv | 87 +++++ api/src/routes/v1/statistics.rs | 7 +- api/src/services/event_processor.rs | 336 +++++++++++++++----- api/src/services/sync.rs | 7 + compare_events.sh | 59 ++++ diverging_events.csv | 326 +++++++++++++++++++ indexer/logs/yaci-store.log.2026-03-14.0.gz | Bin 0 -> 47283 bytes indexer/logs/yaci-store.log.2026-03-15.0.gz | Bin 0 -> 188311 bytes indexer/logs/yaci-store.log.2026-03-16.0.gz | Bin 0 -> 301182 bytes indexer/logs/yaci-store.log.2026-03-17.0.gz | Bin 0 -> 194973 bytes indexer/logs/yaci-store.log.2026-04-26.0.gz | Bin 0 -> 40306 bytes 15 files changed, 833 insertions(+), 88 deletions(-) create mode 100644 .DS_Store create mode 100644 .claude/scheduled_tasks.lock create mode 100644 api/.DS_Store create mode 100644 api/api/diverging_events.csv create mode 100644 api/diverging_events.csv create mode 100755 compare_events.sh create mode 100644 diverging_events.csv create mode 100644 indexer/logs/yaci-store.log.2026-03-14.0.gz create mode 100644 indexer/logs/yaci-store.log.2026-03-15.0.gz create mode 100644 indexer/logs/yaci-store.log.2026-03-16.0.gz create mode 100644 indexer/logs/yaci-store.log.2026-03-17.0.gz create mode 100644 indexer/logs/yaci-store.log.2026-04-26.0.gz diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7249c71cd05f8f4e629cc832aaa8ba2ee3fcf5c8 GIT binary patch literal 8196 zcmeHMF=!M)6#bJNxdS<{3IP?i3JMZDJF!{ASqUn{R+3y!l7l;Uxl6zz#r76figgOP zPSGk=3JWVu(xedVwFsn4nK$!i_x`%OqKz2*12g|_{{Qpdy_ws&nIj^zxYcbD%@I)p z)!K^}(3BMGx3y5Fd`|#tkWaKlU3$`AZ!N7wg=pStGrw8LxjXz=- zPKQ6R;jp2%30qDl!|7x^vhgPrHn=Ri57mF$Xsf zixGpU-R|_G4m^!`{$BI&{ii!+QQhB&iZ|?SL5k+Sy*2PzrygzcO@jB$-hK{@%qKZq zdi!eofH?^N1ij3k!@c$pLpvQDE^R=GP7a-#SBnvn!|?c4>+{P@2QkhdnlP!3%JJcc z-!x_<+e02E+czBP*fBgOWm+=ROpLr*^MX$s=dGpSG{swMuR%sKpgE~rYa?-ik zJuQoo985A^dBpQj7)z?~t2oJv=)m%-fmehTI+99|xj!p?lE;<(A1@xH>%r$r{4#$I z*ZB3&qo?*pi=LqlCHlq*u}VdR5KE&%2Td~`PVRiqv6Qo5II7bRhGuJtL{=Zv& z|9_4?ky2F!RDnNLz|`7H?L}l^BQGs>mk&@^P;Ies30s$fCig=C@3TJ)@j5`L%?Z6t S*rEqTF9Mtl+Nc75Re>`Lz!2F0 literal 0 HcmV?d00001 diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock new file mode 100644 index 0000000..a99f26d --- /dev/null +++ b/.claude/scheduled_tasks.lock @@ -0,0 +1 @@ +{"sessionId":"1b21fa58-3826-405d-91ef-625e665f6645","pid":35097,"procStart":"Sun Apr 26 23:04:37 2026","acquiredAt":1777281191468} \ No newline at end of file diff --git a/api/.DS_Store b/api/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ecb483ff4631d008af4c2103b4b0b6707f621973 GIT binary patch literal 6148 zcmeHKy-EW?5T4N>2R13iYF{C5u!c)7q!u(rVv%@3V!yAF&c@2x!phnQ5qt!{`BAy# zz%EFbf!%L*{_gIB+ub1|9zIM5M13NvFa%kY4iR&w>%fD1K-L;Jw3^Qb?rgf zP4ezXw4y7zrx|U$|Hu35#ioDJ)b(WEOkl6>PM=;LpWn{5W2S$`EN_2#`dpu*L`X0Y z3<ihXsPTi23tDp$>XwPF|>4IZ$8+c{N22;J{|Rwh7)JQn1g{}pv}OcE&Fo*kMPTM zHu>$8SOo*Yz@9O{y?R^^@lk%ZZhfAdwF%=ALqy_=C=lqaO8^$KkDRE}{7H1gWyfMD TRm868z_ Result { StatusCode::INTERNAL_SERVER_ERROR })?; - // Get on-chain TOM event count and breakdown by type from yaci_store + // Get on-chain TOM event count and breakdown by type from yaci_store. + // Event type lives at body.body.event in the metadata (see event_processor::process_event). let on_chain_rows = sqlx::query_as::<_, (String, i64)>( r#" SELECT - COALESCE(body::jsonb->>'type', 'unknown') as event_type, + COALESCE(LOWER(body::jsonb -> 'body' ->> 'event'), 'unknown') AS event_type, COUNT(*) FROM yaci_store.transaction_metadata WHERE label = '1694' - GROUP BY event_type + GROUP BY 1 ORDER BY COUNT(*) DESC "# ) diff --git a/api/src/services/event_processor.rs b/api/src/services/event_processor.rs index 55475c0..496faa4 100644 --- a/api/src/services/event_processor.rs +++ b/api/src/services/event_processor.rs @@ -40,6 +40,14 @@ impl EventProcessor { tracing::info!("Processing {} total TOM events", rows.len()); + // Pre-fetch UTXOs in batches before processing to guard against pruning + let tx_hashes: Vec = rows.iter().map(|r| r.tx_hash.clone()).collect(); + for chunk in tx_hashes.chunks(100) { + if let Err(e) = self.pre_fetch_utxos(chunk).await { + tracing::warn!("UTXO pre-fetch failed (non-fatal): {}", e); + } + } + let mut processed = 0; for row in &rows { if let Err(e) = self.process_event(row).await { @@ -157,13 +165,8 @@ impl EventProcessor { .fetch_one(&self.pool) .await?; - // Extract treasury contract address from tx outputs - let contract_address: Option = sqlx::query_scalar( - "SELECT owner_addr FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' LIMIT 1" - ) - .bind(&event.tx_hash) - .fetch_optional(&self.pool) - .await?; + // Extract treasury contract address from tx outputs (with fallback for pruned UTXOs) + let (contract_address, _, _) = self.get_script_utxo_for_tx(&event.tx_hash).await?; if let Some(ref addr) = contract_address { let stake_cred = crate::parsers::address::extract_stake_credential(addr); @@ -211,21 +214,9 @@ impl EventProcessor { other_identifiers.extend(extra_ids); let other_identifiers = if other_identifiers.is_empty() { None } else { Some(other_identifiers) }; - // Get contract address from fund tx output - let contract_address: Option = sqlx::query_scalar( - "SELECT owner_addr FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' LIMIT 1" - ) - .bind(&event.tx_hash) - .fetch_optional(&self.pool) - .await?; - - // Get initial amount from fund tx output - let initial_amount: Option = sqlx::query_scalar( - "SELECT lovelace_amount FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' LIMIT 1" - ) - .bind(&event.tx_hash) - .fetch_optional(&self.pool) - .await?; + // Get contract address, initial amount, and inline datum from fund tx output + // (with fallback to treasury.utxos for pruned UTXOs) + let (contract_address, initial_amount, fund_inline_datum) = self.get_script_utxo_for_tx(&event.tx_hash).await?; // Get or create treasury contract let treasury_id: Option = if !instance.is_empty() { @@ -262,6 +253,28 @@ impl EventProcessor { .fetch_optional(&self.pool) .await?; + // Fallback: use treasury.utxos for pruned input UTXOs + let treasury_addr = match treasury_addr { + Some(addr) => Some(addr), + None => sqlx::query_scalar::<_, Option>( + r#" + SELECT DISTINCT u.address + FROM yaci_store.transaction t + CROSS JOIN LATERAL jsonb_array_elements(t.inputs::jsonb) AS inp + JOIN treasury.utxos u + ON u.tx_hash = inp->>'tx_hash' + AND u.output_index = (inp->>'output_index')::smallint + WHERE t.tx_hash = $1 AND u.address LIKE 'addr1x%' AND u.address != $2 + LIMIT 1 + "# + ) + .bind(&event.tx_hash) + .bind(vc_addr) + .fetch_optional(&self.pool) + .await? + .flatten(), + }; + if let Some(ref addr) = treasury_addr { let stake_cred = crate::parsers::address::extract_stake_credential(addr); sqlx::query("UPDATE treasury.treasury_contracts SET contract_address = COALESCE(contract_address, $1), stake_credential = COALESCE(stake_credential, $2) WHERE id = $3") @@ -371,25 +384,20 @@ impl EventProcessor { output.get("tx_hash").and_then(|h| h.as_str()), output.get("output_index").and_then(|i| i.as_i64()) ) { - // Look up address and amount from yaci_store - let utxo_info: Option<(String, Option)> = sqlx::query_as( - "SELECT owner_addr, lovelace_amount FROM yaci_store.address_utxo WHERE tx_hash = $1 AND output_index = $2 LIMIT 1" - ) - .bind(tx_hash) - .bind(output_index as i16) - .fetch_optional(&self.pool) - .await?; - - let (address, lovelace_amount) = match utxo_info { - Some((addr, amt)) => (Some(addr), amt), - None => (None, None), + // Look up address and amount (with fallback for pruned UTXOs) + let (looked_up_address, lovelace_amount, _) = self.lookup_utxo(tx_hash, output_index as i16).await?; + + // For known addresses, only track script (addr1x) outputs and skip change. + // For pruned outputs (address unknown), assume the fund event's contract_address + // — the chain trace only matches by (tx_hash, output_index, vendor_contract_id), + // so over-seeding a non-script output is harmless and lets cold replay link + // milestone events whose input UTXOs have already been pruned. + let address = match looked_up_address { + Some(addr) if addr.starts_with("addr1x") => Some(addr), + Some(_) => continue, + None => contract_address.clone(), }; - // Only track UTXOs at script addresses (addr1x) — skip change outputs - if !address.as_ref().map_or(false, |a| a.starts_with("addr1x")) { - continue; - } - let address_type = Some("vendor_contract"); // Record this UTXO with the vendor_contract_id for future event lookups @@ -398,7 +406,8 @@ impl EventProcessor { INSERT INTO treasury.utxos (tx_hash, output_index, vendor_contract_id, slot, block_number, address, address_type, lovelace_amount, spent) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, false) ON CONFLICT (tx_hash, output_index) DO UPDATE - SET address = COALESCE(EXCLUDED.address, treasury.utxos.address), + SET vendor_contract_id = COALESCE(EXCLUDED.vendor_contract_id, treasury.utxos.vendor_contract_id), + address = COALESCE(EXCLUDED.address, treasury.utxos.address), address_type = COALESCE(EXCLUDED.address_type, treasury.utxos.address_type), lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxos.lovelace_amount), block_number = COALESCE(EXCLUDED.block_number, treasury.utxos.block_number) @@ -419,14 +428,8 @@ impl EventProcessor { } // Parse inline datum for milestone amounts, time_limits, and vendor_payment_key_hash - let inline_datum: Option = sqlx::query_scalar( - "SELECT inline_datum FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' AND inline_datum IS NOT NULL LIMIT 1" - ) - .bind(&event.tx_hash) - .fetch_optional(&self.pool) - .await?; - - if let Some(datum_hex) = inline_datum { + // Uses the datum already fetched by get_script_utxo_for_tx (with pruning fallback) + if let Some(datum_hex) = fund_inline_datum { match crate::parsers::datum::parse_vendor_contract_datum(&datum_hex) { Ok(parsed) => { // Store vendor_payment_key_hash @@ -438,16 +441,17 @@ impl EventProcessor { .execute(&self.pool) .await?; - // Update milestones with datum data (amount, time_limit, paused) - let milestone_rows: Vec<(i32, i32)> = sqlx::query_as( - "SELECT id, milestone_order FROM treasury.milestones WHERE vendor_contract_id = $1 AND NOT archived ORDER BY milestone_order" + // Update milestones with datum data (amount, time_limit, paused). + // Skip withdrawn milestones — they are consumed on-chain, so the + // datum only contains entries for non-withdrawn milestones. + let milestone_rows: Vec<(i32,)> = sqlx::query_as( + "SELECT id FROM treasury.milestones WHERE vendor_contract_id = $1 AND NOT archived AND NOT withdrawn ORDER BY milestone_order" ) .bind(vendor_contract_id) .fetch_all(&self.pool) .await?; - for (db_id, order) in &milestone_rows { - let datum_idx = (*order as usize).saturating_sub(1); + for (datum_idx, (db_id,)) in milestone_rows.iter().enumerate() { if let Some(ms_datum) = parsed.milestones.get(datum_idx) { sqlx::query( r#" @@ -509,7 +513,8 @@ impl EventProcessor { let vendor_contract_id = match vendor_contract_id { Some(id) => id, None => { - tracing::debug!("Could not find vendor contract for complete event {}", event.tx_hash); + tracing::warn!("Could not find vendor contract for complete event {}", event.tx_hash); + self.insert_event_full(event, "complete", None, None, None, None, &None, &None, body).await?; return Ok(()); } }; @@ -623,6 +628,23 @@ impl EventProcessor { .fetch_optional(&self.pool) .await?; + // Fallback to treasury.utxos if yaci_store returned 0 (pruned UTXOs) + let withdraw_amount = match withdraw_amount { + Some(amt) if amt > 0 => Some(amt), + _ => { + let fallback: Option = sqlx::query_scalar( + "SELECT COALESCE(SUM(lovelace_amount)::bigint, 0) FROM treasury.utxos WHERE tx_hash = $1 AND address NOT LIKE 'addr1x%'" + ) + .bind(&event.tx_hash) + .fetch_optional(&self.pool) + .await?; + match fallback { + Some(a) if a > 0 => Some(a), + _ => withdraw_amount, + } + } + }; + // Handle milestones object (plural, keyed by ID) — spec format if let Some(milestones) = event_body.get("milestones").and_then(|m| m.as_object()) { for (milestone_id, _milestone_data) in milestones { @@ -675,7 +697,8 @@ impl EventProcessor { self.insert_event_full(event, "withdraw", None, Some(vc_id), None, withdraw_amount, &None, &None, body).await?; } } else { - tracing::debug!("Could not find vendor contract for withdraw event {}", event.tx_hash); + tracing::warn!("Could not find vendor contract for withdraw event {}", event.tx_hash); + self.insert_event_full(event, "withdraw", None, None, None, None, &None, &None, body).await?; } Ok(()) @@ -717,7 +740,8 @@ impl EventProcessor { self.insert_event_full(event, "pause", None, Some(vc_id), None, None, &reason, &None, body).await?; } else { - tracing::debug!("Could not find vendor contract for pause event {}", event.tx_hash); + tracing::warn!("Could not find vendor contract for pause event {}", event.tx_hash); + self.insert_event_full(event, "pause", None, None, None, None, &reason, &None, body).await?; } Ok(()) @@ -757,7 +781,8 @@ impl EventProcessor { self.insert_event_full(event, "resume", None, Some(vc_id), None, None, &None, &None, body).await?; } else { - tracing::debug!("Could not find vendor contract for resume event {}", event.tx_hash); + tracing::warn!("Could not find vendor contract for resume event {}", event.tx_hash); + self.insert_event_full(event, "resume", None, None, None, None, &None, &None, body).await?; } Ok(()) @@ -891,7 +916,7 @@ impl EventProcessor { self.insert_event_full(event, "modify", None, Some(vc_id), None, None, &reason, &None, body).await?; } else { - tracing::debug!("Could not find vendor contract for modify event {}", event.tx_hash); + tracing::warn!("Could not find vendor contract for modify event {}", event.tx_hash); } Ok(()) @@ -929,7 +954,7 @@ impl EventProcessor { if let Some(vc_id) = vendor_contract_id { self.insert_event_full(event, "cancel", None, Some(vc_id), None, None, &reason, &None, body).await?; } else { - tracing::debug!("Could not find vendor contract for cancel event {}", event.tx_hash); + tracing::warn!("Could not find vendor contract for cancel event {}", event.tx_hash); } Ok(()) @@ -1013,18 +1038,25 @@ impl EventProcessor { /// Subsequent events (complete/withdraw/etc) spend those UTXOs, so we can find the project /// by looking at which tracked UTXOs are being spent as inputs. async fn find_vendor_contract_from_inputs(&self, tx_hash: &str) -> anyhow::Result> { - // Get the inputs to this transaction - let inputs: Vec<(String, i16)> = sqlx::query_as( - r#" - SELECT tx_hash, output_index::smallint - FROM yaci_store.tx_input - WHERE spent_tx_hash = $1 - "# + // Get the inputs to this transaction from the transaction table's inputs JSONB. + // We use this instead of yaci_store.tx_input because tx_input is pruned + // (only retains ~44K recent slots), while transaction.inputs is permanent. + let inputs_json: Option = sqlx::query_scalar( + "SELECT inputs::jsonb FROM yaci_store.transaction WHERE tx_hash = $1" ) .bind(tx_hash) - .fetch_all(&self.pool) + .fetch_optional(&self.pool) .await?; + let inputs: Vec<(String, i16)> = match inputs_json { + Some(serde_json::Value::Array(arr)) => arr.iter().filter_map(|elem| { + let tx = elem.get("tx_hash")?.as_str()?.to_string(); + let idx = elem.get("output_index")?.as_i64()? as i16; + Some((tx, idx)) + }).collect(), + _ => vec![], + }; + // Look up each input in our tracked UTXOs for (input_tx_hash, input_output_index) in &inputs { let vendor_contract_id: Option = sqlx::query_scalar( @@ -1040,6 +1072,16 @@ impl EventProcessor { .await?; if let Some(vc_id) = vendor_contract_id { + // Get the input UTXO's script address as a fallback for pruned outputs + let input_address: Option = sqlx::query_scalar( + "SELECT address FROM treasury.utxos WHERE tx_hash = $1 AND output_index = $2" + ) + .bind(input_tx_hash) + .bind(input_output_index) + .fetch_optional(&self.pool) + .await? + .flatten(); + // Mark this UTXO as spent and record the new outputs sqlx::query( r#" @@ -1068,18 +1110,15 @@ impl EventProcessor { output.get("tx_hash").and_then(|h| h.as_str()), output.get("output_index").and_then(|i| i.as_i64()) ) { - // Look up address, amount, and inline datum from yaci_store - let utxo_info: Option<(String, Option, Option)> = sqlx::query_as( - "SELECT owner_addr, lovelace_amount, inline_datum FROM yaci_store.address_utxo WHERE tx_hash = $1 AND output_index = $2 LIMIT 1" - ) - .bind(out_tx_hash) - .bind(output_index as i16) - .fetch_optional(&self.pool) - .await?; - - let (address, lovelace_amount, out_datum) = match utxo_info { - Some((addr, amt, datum)) => (Some(addr), amt, datum), - None => (None, None, None), + // Look up address, amount, and inline datum (with fallback for pruned UTXOs) + let (address, lovelace_amount, out_datum) = { + let (addr, amt, datum) = self.lookup_utxo(out_tx_hash, output_index as i16).await?; + if addr.is_some() { + (addr, amt, datum) + } else { + // Third-level fallback: use the input's script address + (input_address.clone(), None, None) + } }; // Only track UTXOs at script addresses (addr1x) — skip change outputs @@ -1118,10 +1157,123 @@ impl EventProcessor { } } - tracing::debug!("No tracked UTXO found for tx {} inputs", tx_hash); + tracing::warn!("No tracked UTXO found for tx {} inputs", tx_hash); Ok(None) } + /// Pre-fetch UTXOs from yaci_store into treasury.utxos before they can be pruned. + /// Called before processing a batch of events to capture UTXO data that YACI Store + /// may prune (spent UTXOs are removed after ~2160 blocks / ~10 days). + pub async fn pre_fetch_utxos(&self, tx_hashes: &[String]) -> anyhow::Result<()> { + if tx_hashes.is_empty() { + return Ok(()); + } + + // Pre-fetch output UTXOs for event transactions + let output_result = sqlx::query( + r#" + INSERT INTO treasury.utxos (tx_hash, output_index, address, lovelace_amount, inline_datum_cbor) + SELECT au.tx_hash, au.output_index, au.owner_addr, au.lovelace_amount, au.inline_datum + FROM yaci_store.address_utxo au + WHERE au.tx_hash = ANY($1) + ON CONFLICT (tx_hash, output_index) DO UPDATE + SET address = COALESCE(EXCLUDED.address, treasury.utxos.address), + lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxos.lovelace_amount), + inline_datum_cbor = COALESCE(EXCLUDED.inline_datum_cbor, treasury.utxos.inline_datum_cbor) + "# + ) + .bind(tx_hashes) + .execute(&self.pool) + .await?; + + // Pre-fetch input-side UTXOs (outputs being spent by these transactions) + let input_result = sqlx::query( + r#" + INSERT INTO treasury.utxos (tx_hash, output_index, address, lovelace_amount, inline_datum_cbor) + SELECT au.tx_hash, au.output_index, au.owner_addr, au.lovelace_amount, au.inline_datum + FROM yaci_store.transaction t + CROSS JOIN LATERAL jsonb_array_elements(t.inputs::jsonb) AS inp + JOIN yaci_store.address_utxo au + ON au.tx_hash = inp->>'tx_hash' + AND au.output_index = (inp->>'output_index')::smallint + WHERE t.tx_hash = ANY($1) + ON CONFLICT (tx_hash, output_index) DO UPDATE + SET address = COALESCE(EXCLUDED.address, treasury.utxos.address), + lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxos.lovelace_amount), + inline_datum_cbor = COALESCE(EXCLUDED.inline_datum_cbor, treasury.utxos.inline_datum_cbor) + "# + ) + .bind(tx_hashes) + .execute(&self.pool) + .await?; + + let total = output_result.rows_affected() + input_result.rows_affected(); + if total > 0 { + tracing::debug!("Pre-fetched {} UTXOs ({} outputs + {} inputs) into treasury.utxos", + total, output_result.rows_affected(), input_result.rows_affected()); + } + + Ok(()) + } + + /// Fetch script UTXO data (address, lovelace_amount, inline_datum) for a transaction. + /// Tries yaci_store.address_utxo first, falls back to pre-fetched treasury.utxos. + async fn get_script_utxo_for_tx(&self, tx_hash: &str) -> anyhow::Result<(Option, Option, Option)> { + let result: Option<(String, Option, Option)> = sqlx::query_as( + "SELECT owner_addr, lovelace_amount, inline_datum FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' LIMIT 1" + ) + .bind(tx_hash) + .fetch_optional(&self.pool) + .await?; + + if let Some((addr, amt, datum)) = result { + return Ok((Some(addr), amt, datum)); + } + + // Fallback to pre-fetched treasury.utxos + let result: Option<(Option, Option, Option)> = sqlx::query_as( + "SELECT address, lovelace_amount, inline_datum_cbor FROM treasury.utxos WHERE tx_hash = $1 AND address LIKE 'addr1x%' LIMIT 1" + ) + .bind(tx_hash) + .fetch_optional(&self.pool) + .await?; + + if let Some((addr, amt, datum)) = result { + if addr.is_some() { + tracing::debug!("Used treasury.utxos fallback for tx {} (yaci_store UTXO pruned)", tx_hash); + } + return Ok((addr, amt, datum)); + } + + Ok((None, None, None)) + } + + /// Look up a specific UTXO by tx_hash + output_index. + /// Tries yaci_store.address_utxo first, falls back to treasury.utxos. + async fn lookup_utxo(&self, tx_hash: &str, output_index: i16) -> anyhow::Result<(Option, Option, Option)> { + let result: Option<(String, Option, Option)> = sqlx::query_as( + "SELECT owner_addr, lovelace_amount, inline_datum FROM yaci_store.address_utxo WHERE tx_hash = $1 AND output_index = $2 LIMIT 1" + ) + .bind(tx_hash) + .bind(output_index) + .fetch_optional(&self.pool) + .await?; + + if let Some((addr, amt, datum)) = result { + return Ok((Some(addr), amt, datum)); + } + + let result: Option<(Option, Option, Option)> = sqlx::query_as( + "SELECT address, lovelace_amount, inline_datum_cbor FROM treasury.utxos WHERE tx_hash = $1 AND output_index = $2 LIMIT 1" + ) + .bind(tx_hash) + .bind(output_index) + .fetch_optional(&self.pool) + .await?; + + Ok(result.unwrap_or((None, None, None))) + } + /// Update per-milestone pause flags from the output datum of a transaction async fn update_milestone_pause_from_datum(&self, tx_hash: &str, vendor_contract_id: i32) -> anyhow::Result<()> { // Query inline datum from the tx output at the vendor contract address @@ -1132,19 +1284,33 @@ impl EventProcessor { .fetch_optional(&self.pool) .await?; + // Fallback to pre-fetched treasury.utxos + let inline_datum = match inline_datum { + Some(d) => Some(d), + None => sqlx::query_scalar::<_, Option>( + "SELECT inline_datum_cbor FROM treasury.utxos WHERE tx_hash = $1 AND address LIKE 'addr1x%' AND inline_datum_cbor IS NOT NULL LIMIT 1" + ) + .bind(tx_hash) + .fetch_optional(&self.pool) + .await? + .flatten(), + }; + if let Some(datum_hex) = inline_datum { match crate::parsers::datum::parse_vendor_contract_datum(&datum_hex) { Ok(parsed) => { - // Get milestones ordered by milestone_order - let milestone_ids: Vec<(i32, i32)> = sqlx::query_as( - "SELECT id, milestone_order FROM treasury.milestones WHERE vendor_contract_id = $1 AND NOT archived ORDER BY milestone_order" + // Get non-withdrawn milestones ordered by milestone_order. + // Withdrawn milestones are consumed on-chain, so the datum only + // contains entries for non-withdrawn milestones. We must skip + // withdrawn rows to keep datum indices aligned with DB rows. + let milestone_ids: Vec<(i32,)> = sqlx::query_as( + "SELECT id FROM treasury.milestones WHERE vendor_contract_id = $1 AND NOT archived AND NOT withdrawn ORDER BY milestone_order" ) .bind(vendor_contract_id) .fetch_all(&self.pool) .await?; - for (db_id, order) in &milestone_ids { - let datum_idx = (*order as usize).saturating_sub(1); + for (datum_idx, (db_id,)) in milestone_ids.iter().enumerate() { if let Some(ms_datum) = parsed.milestones.get(datum_idx) { sqlx::query( "UPDATE treasury.milestones SET paused = $1 WHERE id = $2" diff --git a/api/src/services/sync.rs b/api/src/services/sync.rs index f20e17b..bf20942 100644 --- a/api/src/services/sync.rs +++ b/api/src/services/sync.rs @@ -91,6 +91,13 @@ async fn sync_new_events(pool: &PgPool, processor: &EventProcessor) -> anyhow::R tracing::info!("Processing {} new TOM events", rows.len()); + // Pre-fetch UTXOs from yaci_store into treasury.utxos before processing. + // This captures UTXO data before YACI Store can prune spent UTXOs (~2160 blocks). + let tx_hashes: Vec = rows.iter().map(|r| r.tx_hash.clone()).collect(); + if let Err(e) = processor.pre_fetch_utxos(&tx_hashes).await { + tracing::warn!("UTXO pre-fetch failed (non-fatal): {}", e); + } + let mut last_processed_slot = last_slot; let mut last_processed_tx = String::new(); let mut last_block = 0i64; diff --git a/compare_events.sh b/compare_events.sh new file mode 100755 index 0000000..0c83349 --- /dev/null +++ b/compare_events.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +set -euo pipefail + +LOCAL="http://localhost:8080/api/v1/events" +DEPLOYED="https://administration.info.intersectmbo.org/api/v1/events" +LIMIT=100 + +LOCAL_FILE=$(mktemp) +DEPLOYED_FILE=$(mktemp) +trap 'rm -f "$LOCAL_FILE" "$DEPLOYED_FILE"' EXIT + +fetch_all() { + local url=$1 outfile=$2 page=1 + > "$outfile" + while true; do + resp=$(curl -s "${url}?limit=${LIMIT}&page=${page}") + count=$(echo "$resp" | jq '.data | length') + if [ "$count" -eq 0 ]; then break; fi + echo "$resp" | jq -r '.data[] | [.tx_hash, .event_type, (.slot // ""), (.project_id // "")] | @csv' >> "$outfile" + if [ "$count" -lt "$LIMIT" ]; then break; fi + page=$((page + 1)) + done + echo "Fetched $(wc -l < "$outfile" | tr -d ' ') events from $url" >&2 +} + +echo "Fetching local events..." >&2 +fetch_all "$LOCAL" "$LOCAL_FILE" + +echo "Fetching deployed events..." >&2 +fetch_all "$DEPLOYED" "$DEPLOYED_FILE" + +# Sort both files for comparison +sort "$LOCAL_FILE" > "${LOCAL_FILE}.sorted" +sort "$DEPLOYED_FILE" > "${DEPLOYED_FILE}.sorted" + +OUTPUT="diverging_events.csv" +echo "tx_hash,event_type,slot,project_id,source" > "$OUTPUT" + +# Lines only in local +comm -23 "${LOCAL_FILE}.sorted" "${DEPLOYED_FILE}.sorted" | while IFS= read -r line; do + echo "${line},\"local_only\"" +done >> "$OUTPUT" + +# Lines only in deployed +comm -13 "${LOCAL_FILE}.sorted" "${DEPLOYED_FILE}.sorted" | while IFS= read -r line; do + echo "${line},\"deployed_only\"" +done >> "$OUTPUT" + +total=$(tail -n +2 "$OUTPUT" | wc -l | tr -d ' ') +local_only=$(grep -c 'local_only' "$OUTPUT" || true) +deployed_only=$(grep -c 'deployed_only' "$OUTPUT" || true) + +echo "" +echo "Results written to $OUTPUT" +echo " Total divergences: $total" +echo " Local only: $local_only" +echo " Deployed only: $deployed_only" + +rm -f "${LOCAL_FILE}.sorted" "${DEPLOYED_FILE}.sorted" diff --git a/diverging_events.csv b/diverging_events.csv new file mode 100644 index 0000000..3d90dad --- /dev/null +++ b/diverging_events.csv @@ -0,0 +1,326 @@ +tx_hash,event_type,slot,project_id,source +"b0b03a35eaf0fe01fd4aecc68a7217ef1f19fea7a10c798461b4c6afacec3de7","publish",160963893,"","local_only" +"00d5f6fae257e7ce826980a3de5e802087d539817943265950fa6d853cc15621","pause",180393695,"","deployed_only" +"01cc36a2b0b289df7c84e71c8e2952f3de052182a891ecde1a7eb096cbcb3f6c","complete",179954927,"","deployed_only" +"027728103e767de9bfcef251a612435e18613936805e3ebd3d371fe193696f68","pause",173850686,"","deployed_only" +"0391a598f2b2dd19d54e379d3bbb027626a48ca2f42c569f34e3aa9923224cc0","withdraw",172947126,"","deployed_only" +"03a7cc20d0eaa46ee0d9d705a73340d15ace8eccb07f0c9940ad20ce730ca788","complete",170339374,"","deployed_only" +"03f8cd4cd0f89c6c9d158846fc700d323b84fa8c9cdae75d499d79facb3406b4","pause",181778545,"","deployed_only" +"0487865cb7c6b3f2ec0aff5adce7b61abeec40aba87fc5dc4f5a7bbfbbfcc43b","withdraw",178642485,"","deployed_only" +"04dba1c2789d9b76c2322bdb32b663fe0a95d570cf3ce20fa1eed558417fda61","withdraw",173372674,"","deployed_only" +"06400975adb3dbbaad29359e25a560bedd9fb227aa085b95db6384d8c3114a01","complete",180255954,"","deployed_only" +"0a7fc25f66aec3783c174686113dea16320511e151a609873cdd7ee176c0a4a1","complete",170251960,"","deployed_only" +"0ab05b221f4daf761ffe240c0d4b4d554fc61b7b8d5ac1771502e6c234ec1961","withdraw",183634166,"","deployed_only" +"0ca0d159e53398b0727f39afa6bb3170d1259e6041a67a56278616bd280e18e6","pause",185279974,"","deployed_only" +"0d3ae215d4ccedd3f1dadf202bd0e5f5dd4e09b6f9936b6e43e68f6cde39efc7","withdraw",180952024,"","deployed_only" +"0daf99a64745e1ba2d354a37d54c37f86ec648ca2e65ea4fed619f0b2439c254","complete",167914026,"","deployed_only" +"0df5a37533afe9add04aea196b19dc1947974b399bb35cd5e0d974455612e96a","pause",180474780,"","deployed_only" +"0f681c1c5a9be4ae9c5308e6c251eff98b8128fb0ce7d2701c4ace4baa5afebe","resume",173815250,"","deployed_only" +"0ff9c7e3f54232168b4de7e205d20e1d1dbf2781608b8dde4a974a1127729096","withdraw",171830345,"","deployed_only" +"11513814e9f6b5ec3d3d7c5c18653a4582bb4c4e129c134919be7582ed60ff89","withdraw",182374954,"","deployed_only" +"13dabaff0f9beea881e1afe8d1fee696b54db1dd4279eb43df5872719cf2d83f","withdraw",180890633,"","deployed_only" +"13db13226d1864fca92b7d398145c8f5e89d2ceac1686e1c0df3379b9ff6b4b3","complete",173711060,"","deployed_only" +"145dc042092a99e209520f0de5576d527131a570dfa3f8cebde755af865c3ae2","complete",172947329,"","deployed_only" +"14dfffbd6ae611b646471285662bbfe30622918b2da97b27defca0ec40431d70","resume",170266643,"","deployed_only" +"16b2c24e07abbad48e407a5257de4722a99d6b83f2a215a46455e5c0283a9041","withdraw",179342737,"","deployed_only" +"170dccffdd3701d047299a83ae33af600559d12d7caa12db4b1eb1a65927a4d5","withdraw",173874384,"","deployed_only" +"17172c051e5d8fd4a61fe2c983915283e3626c0f282b0eda57e35060490677bd","withdraw",180714352,"","deployed_only" +"182b8f195bb8bcf3457fb26c94b0f19a0319a784e4a778a77da9bf60c646818e","complete",173018239,"","deployed_only" +"18958800a20e4c6e6f363120a11e6a1c2625be466db9fe67bcc0f54453b25241","pause",180600380,"","deployed_only" +"18f07821d410c0adab2b0b3ed8f696f2db3ff1ece428d067541361836e89a032","complete",168262163,"","deployed_only" +"19a4b22f77456369c79cf41188e58bc9c7978207e5c9185f8e60e74993833a6c","pause",173850630,"","deployed_only" +"1a6a06cde5dd832fd654cb4ea83948d32d04baa5be49c7fb108b1c5ea1955431","resume",171142114,"","deployed_only" +"1b5a5fc86eefe55afae921c62de0da1677b5c5d7924b0dc56a47ddc99bc7c26d","withdraw",173730154,"","deployed_only" +"1b760b016c474389ad91324e9167ce45b44b10c68f3e025e203d03287f28db44","withdraw",170249201,"","deployed_only" +"1bab42f67e8d2b1cd6cd4dd2fd8b00f05731a353cec79033124c216a80bdb3f8","withdraw",180010479,"","deployed_only" +"1bf3bcedd3d9c1112a649f99e9fa51d02a03567543505aea6d226355596b0710","resume",173712942,"","deployed_only" +"1c603a5506064f53d3bda1591d078a332acfddd666f674a54d1c81721135244f","withdraw",174336116,"","deployed_only" +"1db766df2f5c4a7ac4834f7382d59c0b628a8881ff83482a28b6c11c96e0591b","resume",174279389,"","deployed_only" +"1ef7a0542a6c18e69991277689d25056943b4f3a26917783fca8af9e1534d68b","complete",178059618,"","deployed_only" +"1f01a5e0c87ce91bc7047735ea2b626f595ce60d22431c47b668ffa19ef76a80","pause",181778717,"","deployed_only" +"203fb50fc09da4e9325dd9715ce50c758248dce858f6a4a97339226bdce75f1a","complete",171541368,"","deployed_only" +"20895cf2be525b6e2943ac4d9c20ca57c8e02055acf41aa1bdf2e6fc0801ec54","complete",174520419,"","deployed_only" +"21e9ed8ef408939498a8baba8dff1d372acc221c6b3919e937c4796126abc0a9","complete",171997099,"","deployed_only" +"22d9d8efc8516ba87fc30a3f15f1cf729dfbb382540521500174249736f48218","pause",173850576,"","deployed_only" +"22fc23a52f91472255de7c3b650160fb5508293c0b6f7c0aa88832d541d77f9f","complete",178643601,"","deployed_only" +"241ed3fce011cbe00665dae3b1757ce0fe03dc5b1cccf0218287a1cbbe762724","withdraw",180910985,"","deployed_only" +"24e7c271ec879e6423a640756ce0536f0b0ef811520ca727e91e34d80a350ad3","complete",165446464,"","deployed_only" +"254a246bf480f27507e90981ac48b389ec7f056a89bf3280d57a56a2234a12e1","pause",179412856,"","deployed_only" +"29d117e4b1e4ffa58cae03143846781a4d1e829ea8abdf3a1a7147640ced01c5","resume",179412587,"","deployed_only" +"2b9b5f035d399c52bca90e45b1fdc99e21efa64b1b66d8582498083c879b06ba","complete",183554997,"","deployed_only" +"2bb742561dd76fd3b5b341cd992e5e949b44eec31b76d2fde74a37a8dbb00841","withdraw",166202009,"","deployed_only" +"2c012024387193a0f48a2dcf9f0e2c08d393ad6e9e7af6b121322faaa9fb33d8","withdraw",164277330,"","deployed_only" +"2d0a90266b78b7c7d18e253a45663d3147a5456639bc5e5b7117e32bea32cdca","complete",178567231,"","deployed_only" +"2f2c98cab401f7e32c30bf25d379e3bdf48871643ca950da8ac82f27613d1ffb","resume",182781190,"","deployed_only" +"2fe6accedaca33647956ee84f757815e8d178619b9befbda21585c0e219939cd","withdraw",175537664,"","deployed_only" +"30800d921866af7d2fcf0be3ba815488a5e35a8dc4ba4abe653ebe53c3a68792","complete",176071469,"","deployed_only" +"30dfc1db2b6bba350def97fa8d7f95381b85874f54ea970c9ba8c2ddab6fd41d","withdraw",180010007,"","deployed_only" +"315c3a80f05b6a6c0ef30cc629356cf5182eb04a6618fc0545dab292d72ab3bb","withdraw",174251671,"","deployed_only" +"316da2a0bc434c5e64ca30e46eccef09c6410b9e47d30eae9310117ea1d42ecb","withdraw",183304075,"","deployed_only" +"3288a835ce8b1adab515cc1aa6771e6db9c7cb2490fe37f7b578a89f37ae64a1","complete",174415428,"","deployed_only" +"339e8a1b493d7b9e6895ea68d944829aa37a082191ffb5e6175896950d2fae04","pause",185419368,"","deployed_only" +"33dacd2b49a6cd7b112a3899b9420f78f46f6b127641708b21074aa0ec40c45d","withdraw",165131606,"","deployed_only" +"348ca29a3065c2b4b9a01377124a07e40f9a4ce6d2c2543709331f8ba4681104","pause",185280079,"","deployed_only" +"360e168a8eddedd309129b39e9cfb9aa1a1dd01381edd50c9c68f30c1ea3d6dc","withdraw",166459946,"","deployed_only" +"3632f6e44f3d88f205feb72764f7e110c143858221884686d628cf9a2116b534","withdraw",173015921,"","deployed_only" +"365eeecc296c7e84902a57d9c5826015f36ff7dde7488d9d980e5a58b01d5792","pause",181778928,"","deployed_only" +"3ad4fd02801f63d6705a5a44276b0180f1040397d67270109bff3fd7d34602ae","complete",185196991,"","deployed_only" +"3b61ea059be733c327d8ffda8c5ed2c54bf86cbe210e5844a16193caa6a01907","resume",179412365,"","deployed_only" +"3bf1846d0eabf00585d83b6300c09e996a5a92627d5aadf05ed17e96610a552a","pause",184091110,"","deployed_only" +"3dc5b8c967ed2461806300f39f9305c1e9b1f5563b378a0cbd2f281e226f433b","resume",182966607,"","deployed_only" +"3ddeac6621067a3847da04d51e1d49f99c918839ec23b192637c32051ecbe5ba","withdraw",183294120,"","deployed_only" +"3ef3160fd1296e296adc7f164ee63ed5215123555fe49ed5b59799630307edca","withdraw",165349108,"","deployed_only" +"3f0ff9d9586764354e1a968a0c81ae97b29315d3f6bfa5c1ce28960a5a5f51df","withdraw",173873994,"","deployed_only" +"40da6f604356518b03ddde945c2e23a47e9eb59eb7edd17fe870f5d6fa2ae052","complete",179320033,"","deployed_only" +"410889894bac8d6a75dff80f656c0cbf13bc9345d2ad79fb2b72f22fdbb4a705","withdraw",179579715,"","deployed_only" +"41ce449bb16da5d6242f356fe90a39f287b551484b471739c51d9c206da1cf3d","complete",176223898,"","deployed_only" +"422aa7fdac2d5bd4ca937baa7c8efbdaf65cb2ab95586b1fe39c90fca7a5bd7b","complete",177337685,"","deployed_only" +"42790dc4214dde7168729403b9fcfa07d8e733ee6e673ee2f53225acb2d49558","withdraw",182353057,"","deployed_only" +"44d90615ccfd503604055658ad0c1bb2fcce1c9f161f9309040175758162cfba","withdraw",180897663,"","deployed_only" +"45162a2280c1f9b2642f83de8ade5aaa2f19ea1f2180ac9471857b46aa598a31","withdraw",173040292,"","deployed_only" +"455483309e666ee92824686ea514a1323fea3d6ecfe7608872ae43bf1661cc23","complete",169646503,"","deployed_only" +"45869c1d773ca845d871dc266334c7c36a41a8932f469cb7c0afdd30203c92d9","pause",185419368,"","deployed_only" +"463e2143c97d986740c47390d60fa13cb1ed9d8ec8889e2f43303b87d0f262ad","complete",178643158,"","deployed_only" +"4664bc394d49772a4d7a499769232428094c92d76598d1fbfbbc7b8403382fd6","withdraw",176395813,"","deployed_only" +"47eef6eea57af23ea04759b7d4d4c7662077b31e298a13041d08ce9d882759fa","withdraw",165783920,"","deployed_only" +"484177595366cf2985674c8672ac3b263d9cebbabdfbedd50d6b8281bb6faffd","complete",165345894,"","deployed_only" +"496236c80a5ef10ccc62aad5c746cedf2b4850840f87716328189c8569f53b2e","pause",179412741,"","deployed_only" +"4b2dc0b6fb1c6861f7f58775ea3f764984ffb03bf1c464db84f4819b0f3ef7e3","complete",167690200,"","deployed_only" +"4c3302613fab64d7f5bdc8ef4bcf62ec70af98bb39f447b13039df5329be7341","pause",179412768,"","deployed_only" +"4ce287014ea067009f53408c41e3c90cabf17b279eb2dcd1ac375be6be5cc254","pause",181778880,"","deployed_only" +"4d757690a254e035de1af2a03c29b24218442f18a1d29f55942c4095c73a829f","pause",170077725,"","deployed_only" +"4d909b49ebcfbb9b457dbe05c1c895e5da9d15b2aba39ac2990ef40fa59f505f","complete",165092496,"","deployed_only" +"4dc6696f8e0072e69ec9bc2c9db6159564a4a1fd8b06cdea348c2404051a5ee0","complete",165896212,"","deployed_only" +"4e1efc51946d55483db61dc36430597e51c3e04b2584099c8f797c6f53c08771","withdraw",176149110,"","deployed_only" +"4e9e780131df78b1a5fe86f7c0ac8807ccb7daf36726de979437e28993e11454","withdraw",181172993,"","deployed_only" +"4f30e573d0af917bd7683a026ba3dc156a8c1ecbd4ea6474de1f3fc1551945a9","withdraw",173003886,"","deployed_only" +"51b15a76366d3390253a8a1122f9f1164018d1a51c23a51b8861836c0dcd1059","withdraw",185376418,"","deployed_only" +"52f8a352fa679928443ca4aa86d6ea13ad34f753be06519d35c8d3ad3fda8241","withdraw",180010290,"","deployed_only" +"54135d6ebed3aafac160fdb7d0d40f3cd14201aa6a5cebe44fc060715d5ed93a","withdraw",178456805,"","deployed_only" +"556a4086cbbea55f581298eacbeda6f76a6b84a32249d66b8fe633f972cc727c","complete",172647570,"","deployed_only" +"558e9d5f7c0a4278ccace06df62519cde4df134abab079d0caf152bf208ea84f","complete",183049823,"","deployed_only" +"58a54bcbcc712668c51ec4cbe9d4b0e408a526c75019bc1d00cce7c6310dfe27","resume",182966654,"","deployed_only" +"5a42a6193552328dff546c512657344d84ae4eb7f7d5c86ed11c2b004aba0c62","complete",173199485,"","deployed_only" +"5ac170040593bf9fc50bd8d1cba6b0432a0b41bdc713dcd7da4629e9744b1ee7","pause",181778830,"","deployed_only" +"5b82ed0ccc2df28141365a75fa71c6ec825546122f856b5495ac699592f43b7f","withdraw",180961847,"","deployed_only" +"5c14f3f732b987a9b1ab852a3c10c46e5a3e9d1b2926874cc5d2d5118241b42f","withdraw",164841521,"","deployed_only" +"5c57440fc9e7b2d224e8553fbe4990e276a32d2441da31a54c0e2848ff50eafa","complete",169646564,"","deployed_only" +"5c88278a616a3b7718fa3a8a74f410a0ea0b390f21506b43c5e479b74318be0c","complete",181694955,"","deployed_only" +"5e1808775c22d8400704142031ee9ed69ce2d9eaf0c36b08f8eda9cbfbcc537e","complete",178721723,"","deployed_only" +"5ed349ac3897b96da6d99b54b749137b20758a15095105b2fb0ac322033b2cc8","complete",178114742,"","deployed_only" +"5ff6a328237c7aac536b6f96062c81138ab520d3455db9a3a231783c9dfee4ce","resume",169492012,"","deployed_only" +"6046475721b4c392bfb29836e381a87f2f08155df00d83724d154e4d725aca1e","complete",179435106,"","deployed_only" +"605f3ceaaf4095ba8e137062f24f440e48405e4e0d43dac70b2d9b11b71e66f0","withdraw",170251780,"","deployed_only" +"60db8070603e89c5faee813afbea1334a0ef7f22c4aa473c35b90337c573a08c","withdraw",170244660,"","deployed_only" +"60fa07df1aeefd446f2affd2395f6316b60378f71ed85ffa6f5d764137ad6569","withdraw",177337733,"","deployed_only" +"611908d07eac7ba5a88733d175737ae941db9e3ecb44df436b0e1027613067aa","withdraw",180009902,"","deployed_only" +"620e2c6d4e0c7a703e1088a56cede4e49b2bedd3b811f7d2c136fa213d9c8649","withdraw",170338948,"","deployed_only" +"621a181087a0f573245581f3777602e17bdb7bb70cd9bfcfc33e4635421a379b","withdraw",173874642,"","deployed_only" +"648d07b3931c83c63057d33d336cdeb5287b176403ef3a103be5bd0b09e93f36","resume",183400182,"","deployed_only" +"6564acc24d698d3ffd157f8a3ed2eb2b3ce626613b143fd4bfbbbb1d9d2ad08b","withdraw",177337402,"","deployed_only" +"661128abb10e26f3d7d193b3806d3e6690f14ff9c934cd4884236d009bcd3f4c","withdraw",182315123,"","deployed_only" +"66b980e265075c56e28496a6854b66ec8e90568ad78cec8cd535bd2438b8abe7","pause",180474687,"","deployed_only" +"6802b7580fe2136f884ce4ba7d0679acefb31ad2b5ed2b9555b6ab2dc72e534b","resume",180474637,"","deployed_only" +"681239b19ff38f43845d748b769e4c2ea633755cd98742f7e351fa74d86fc3fd","complete",167270330,"","deployed_only" +"68f0cea150be63db0c599d072fd94a4fe4ca002811f9b1744188035dbf094464","complete",185194768,"","deployed_only" +"68ff75a56ad988841c272eb4a11ae918e086e11804d0fab99d679f190ca5b5bd","resume",182206985,"","deployed_only" +"6a0fb6cf75c94b8ef251b66f32da02708bf9c26a14725d245e3cf403727f6472","complete",170710212,"","deployed_only" +"6b645f07c1469a904b4c7c7d017da3330e7b5f214aa666dd4e0bf08d190d70d0","complete",171997251,"","deployed_only" +"6bc9fdb62d7e3fb284e659f0df22b3700e27514313a3f48d9671cad35c681fed","withdraw",170601803,"","deployed_only" +"6c88b8dfc4cb66a9f2d5f0086edcc7d71848fe12face2dae2a2ced677def0c5e","resume",180600364,"","deployed_only" +"6d39fe3d02163c3e7d43343e1a9b81699c46c17ef0880ba75baa9631a6b992c5","pause",184616827,"","deployed_only" +"6db20bb408c4ad1e43798d3d4891903744404d3c7d4562d91db60620b4b30734","complete",176999799,"","deployed_only" +"6dc2fcde5d1cb367529c7d663dfeaa150d7969589b029a1576674effbe3669a8","pause",179412674,"","deployed_only" +"6e1a9a48cbe077885b672d07548897ad03a1c6066b4618f9df6c0647db3d4581","complete",165896093,"","deployed_only" +"6e320bb4ac24814e67df67f49a0e6b7b4eca9f48666c77ac977f0960fbbb5e13","complete",178643482,"","deployed_only" +"6e8cc595739a8d3f387fa60d22bc48314ed04b7a2d9df792c5882a4684faf34c","withdraw",177337526,"","deployed_only" +"70126ef166b26857aad5876b08854b44fcf61e260a440c6f217e2a01f0e9555a","withdraw",167741481,"","deployed_only" +"70784227953813cd1deba4f284ebd26ca8c66731c4feb1771378c31dea3850bd","complete",169492956,"","deployed_only" +"7261be5e7da69023c7f3ee325551abd565b4e6aec8363020d950d65394a8c01f","withdraw",173015725,"","deployed_only" +"734bedf762ee027191b95b78c3aa771a1e3070bcbc2f35e65775254b3c7e1e95","complete",171997371,"","deployed_only" +"7360576ae7bd3248f379963877caffb9ee4d3691250ef49f672eb5def7e26e17","complete",178226888,"","deployed_only" +"7555a0101285324137b40e228c485c3fed8999756b4d335defa7137d21380e53","resume",184195087,"","deployed_only" +"75650ccd8c79eca7fdb86bd86ff186ec0dead0eae4eeaaa719f74e32dc02e98e","pause",176492974,"","deployed_only" +"76282b520c293e53c617a8c8255b88f39dc42f7eabef5e58dcc447c50f26c26f","withdraw",178196773,"","deployed_only" +"79c6be9280ccb46b26803db1eaea07d8adaa59999e0de1db87c6c36e918ffb8c","withdraw",165751367,"","deployed_only" +"79ff2ff748b6d6f5281d8bb667b16346842672dfc8fe707d9c2399c776402b14","pause",184616940,"","deployed_only" +"7a3dd39340b78ae35fb06cd729c3660ae1937fde4fd851d321ab184d22da4f63","pause",183452945,"","deployed_only" +"7ada86aacbdb933f6bd5c6e75b1053c21e174f1faf4e2d3355e81db8ea76402d","pause",172762335,"","deployed_only" +"7b6eaab1a080e510b572761b71ee3ef8a21cdf057762282b1428f843ed78ab0e","pause",177568116,"","deployed_only" +"7b8ff5517283c458df7893610f460e603bf74a206106c66c89e03663f6d53c07","complete",164915766,"","deployed_only" +"7c19931c959ff86d4f9d5ee9df0112eaac36c7b78ed0274715631b3fa844be76","withdraw",178468434,"","deployed_only" +"7cde116a38562f4bbe299ea285476f8d5a00b2af6320cef89922f8b269ce7702","withdraw",179949760,"","deployed_only" +"7d857418354f0f7e29897aeb58f86916283e8ce2637cbbded4faeabbd4ff7911","withdraw",164795387,"","deployed_only" +"7ed107ca99ebf8a44b465f6e856c08c638feda6c89d0f9fa874084fc8b910156","withdraw",172900267,"","deployed_only" +"7ee13a7163d8428668c40bdaa4d0eeaa9f7d347bee5d61daf40d2658fee1e894","pause",174503848,"","deployed_only" +"814c9da446ea05ae2d76499c12f9810137775846f302d708b5386051bb8d1c4c","resume",173712393,"","deployed_only" +"81e5b7a58428b00e0f54b272261c55ad4379ae51c91f8444868b6ae2f0525ee8","withdraw",170255997,"","deployed_only" +"822761f148472aa6232e26eae1f1ad4a15fd1de8162e318fb61fbc73872ddd8c","pause",184768492,"","deployed_only" +"82b764ca1eaf13dd520551bf641d70d9f19aa7bbc13ce180b8e76c764f16021d","withdraw",183300937,"","deployed_only" +"82ea6af90c842134f71dcb4f64d1e06a30bdfd7af55c0cd8696fc5bad294c121","withdraw",164978977,"","deployed_only" +"83a494aff3550468a626a52b730e128306e0e9c5ba8b27a7f1ac89c3a7c61c5e","withdraw",178212347,"","deployed_only" +"83af7fac77332692238f915575e46b49fec1829848cab1416624f3531641feb3","complete",181377416,"","deployed_only" +"84867b1a41cfe6f134c948e3767b23711dc194c2c1844397246582d3a32c5ef6","withdraw",169492803,"","deployed_only" +"849747c4625a847f4a1ccb25d8e24379f55c2af9af2fb234a9966148a89ae887","resume",174503913,"","deployed_only" +"84aaea5db619512a87e2b6aab4cef54daac49206df2fdc654ce0cd8f577175b2","withdraw",165253999,"","deployed_only" +"854063e313b57f88bb370db4fc6ed7babcaaef5b56396c2e2c0f7d4212b076b5","complete",169076252,"","deployed_only" +"8839f51d57232df410db100ba516fba840f4151d4a5bc2dd5cc1a2ae5fc5800f","withdraw",170238583,"","deployed_only" +"8845264170e56f1ef7e48b2044299ba5c2e65a7ea01fd57f560468f3ec7b4236","withdraw",176121131,"","deployed_only" +"88c540151c1d2296e156c292b494e41574b6229de854233f9eff8e4212dadc47","complete",174415292,"","deployed_only" +"890de7904876f2ff3c1ad6362bcc56c45d2aaf295374d95125289d3832e68d7e","complete",179954230,"","deployed_only" +"8947b905733bc20980305d21748211b6b4c8a238372ab3cd5d252c508a844d69","complete",183634575,"","deployed_only" +"8a53e7c92f43556c0975320c623fb2c986111dd84735fcdb18961d4c20dfe14f","complete",170275696,"","deployed_only" +"8a9feebe580f5503e109d0512ef0139023ae81301c85ee324475563cabe743e1","withdraw",170272352,"","deployed_only" +"8c9eba5108919917b870af9a36e8848d86db98d7c223a782dc3b4da9c3718cc8","withdraw",178419366,"","deployed_only" +"8e3ac3ad54c91c2a84caf257d3d3c20bcb0a8a2cc083416038ef6ac18b2f4b90","resume",174279286,"","deployed_only" +"8f2ca40866c9af3976bce24914330ce9ab0e7e58b4ea119ccc3fdc7a8490cfae","complete",180032472,"","deployed_only" +"908bdea3db367dfee59f790bcd900903131391c9c0e34617b545eaa517480ec2","pause",184091085,"","deployed_only" +"90af90a74390b1241f89953f202630bb9b9fa2ca9232e0a20c31a2b667777fd3","withdraw",177337316,"","deployed_only" +"918c405c42f9177f56397d82d8b5fc5a45bac2a87ef320fdbdee106f759c0945","pause",167259290,"","deployed_only" +"942749184e74ac88ee59328fc1c1722108083dcc9bae4337e70f336088d1d9bf","withdraw",175528806,"","deployed_only" +"952fbc23947cb643356152e2d26fb87753533810790641527ade413df7d9229d","complete",176130526,"","deployed_only" +"96009311ecd86d08189d11dc15056871770c3dc8653b96476d809cbec2d1785d","complete",178114481,"","deployed_only" +"9709550b764b6ef13f8f06a80525a3cf0f7c5435c5e4e6ed0d20f55af7a81f2b","withdraw",180876472,"","deployed_only" +"97b398d281f8dfd12fd70a887de7ead7332f73fec5ea4bc099da94666434fcba","complete",174520504,"","deployed_only" +"97f8fe6237bd9d3302a62ca20502c8d49440227585848b042700da778c831435","withdraw",165766373,"","deployed_only" +"9a379706ce1c042b68ece3dc5b06256c2a5d76a2ed3c370f0241676b3e9febd4","complete",172788405,"","deployed_only" +"9b69b22af874f4c595b7f74978a893404d9c42b9873ae700d0235a67998308c8","withdraw",182782041,"","deployed_only" +"9c3d63810f3325f0dd13a313081c9eb8db06a742e03a255ac8776cb6407fa40b","withdraw",167680884,"","deployed_only" +"9eb351f913c417e90a964fe639c89c0b9674ff6963fe5a28e9daa9a88b8635fb","complete",167680984,"","deployed_only" +"9f6955957498395572d14a406a320a34ea15ec6c30fd83b2d0a0f37275c255d0","withdraw",173874919,"","deployed_only" +"a0c85f08db84af661b631cf4529ba6e9ec465fc4494fb6f8742b9905a7828ae9","complete",182269260,"","deployed_only" +"a28447dc07b01a7505a3c7ef4d0701448f8bdaa715c993bfaa791cfbb61c229b","withdraw",180010134,"","deployed_only" +"a340f480ec5385c2f0fac79821f807f5b7878e0aaaf8a8cf9a55a20b05b95ed4","withdraw",167681541,"","deployed_only" +"a35431330308e87ac29a253c9aeaa672682db714dbcfe32e9a0002981d9c2f45","resume",173713308,"","deployed_only" +"a35cb3e034b73bd6894ccaf895a172e6832dbc432bd0159ec19ce9bf2d201361","withdraw",170354603,"","deployed_only" +"a365dcb6f9a46fa398300425c0411e6dea6f4538cf1574e5c143f386dd72805a","complete",167916482,"","deployed_only" +"a4b0157da84597c2aff9303e707d190545d6265e054f04a06fb94a1e0d4e3aa2","pause",172792247,"","deployed_only" +"a58458cd9b25c1be615150d7057a70ffa0d46bb5a962bc1d3d12a14c006ea1f1","withdraw",173632199,"","deployed_only" +"a6a12456a258b5e28b8f9ca790ce623b0d75d5943d5c7fc34b2daadf4d67ea8a","complete",176720993,"","deployed_only" +"a6bc7dfd7c01411dffb0ae6135b14f714485751eba1171985162537ad1dfd166","resume",182781190,"","deployed_only" +"a8c5034608045e48c7a29b4dc5e61f38a6e75904bb523a7fe4c68a44531aac22","complete",170270593,"","deployed_only" +"a98d686ae792e60e589d68694ab721c3078f51c23b143711c8583fc771d07ab9","withdraw",177337599,"","deployed_only" +"a9ed5696fc1d91bfbbe9076707f72e2ae7fbfa75a60bde1a0dab5199bbf649e4","complete",165489998,"","deployed_only" +"ab4492426519fa921d9ceb475399358eea0b8843e9a2332e9dbd1cf7de882a90","complete",177436297,"","deployed_only" +"ac71b97a7d747cfd1e1e4091c92d850351f3cac9c2399579cc3e7e935252c8b3","pause",177450760,"","deployed_only" +"ac9bc7be88b00d9a636f9dd9a123cc1d47f7eefdd035f1cf655b794f1d29e5a9","withdraw",176411400,"","deployed_only" +"aea8c00948334a35916f94aa68c50d978dd3230c2a7e0d10093fe98043a405f9","complete",167597619,"","deployed_only" +"aeb9ffd4805e5a69e88ba485cef8e9fd0b3ad62508f8eb618d68d0227e5fe8b6","withdraw",178643195,"","deployed_only" +"af299e1cc1192bbdcbc5ef4672463694717f2e20277d5cbb72823fa69bf8b429","resume",174279322,"","deployed_only" +"b11d7a4d936f43bb2b32ce1898d54daeae87ba49d8be4a1f53bd53a5aae2b362","withdraw",174380905,"","deployed_only" +"b1a046139cb0845361b647bea3f01eadb09c7df6de582a30c3b3517787557ca6","withdraw",165623680,"","deployed_only" +"b1d85a3979510cc9e4d882662f80ba9b4b49a88148d8cded73b90ef9d26fbcc6","withdraw",175694293,"","deployed_only" +"b208ffa308b925eecb4d9f1ace5893e4e8443dfe949b04dcdade7e62abe3d7c7","withdraw",167638192,"","deployed_only" +"b284d6775c038dd5d6841a75f217fc2c33f0af9bea5868275f271b01143b4938","withdraw",183404706,"","deployed_only" +"b29a1b8df54a60fbf84e5895383103d5047e90f2c21580b8ab2ff4fb53b323dd","pause",177450708,"","deployed_only" +"b381d398c31a95c3a7a569789d2507a43d30a0b0f107be34c648f2e66abb5122","complete",169076158,"","deployed_only" +"b3f6255f2b531ae85e4e876a625875cf3dc90527ad5d0325c349173d01e3ceee","complete",182865210,"","deployed_only" +"b49d27563e6757ff1d61c8c42d6812680bbfbea5c4b8d48d6792f0d24fe76e5f","pause",185419368,"","deployed_only" +"b4d7a78ec2c8d9c810bd1d8fe46ad11798d613e0cc763b9f7fedccbb82d97847","complete",177000042,"","deployed_only" +"b63805b9f7e7ef39dca21158b069425d7ab35e5eb6597c303f8316c5bf04d345","resume",174503940,"","deployed_only" +"b68fef4cc955c66666aba259671264e915f50c66b2f216ab5dc993eb33a0a555","complete",170161356,"","deployed_only" +"b6982e80525513dab3c2df4431f965a9e50ab735894a70739d0b2b515abbc2a1","pause",177568090,"","deployed_only" +"b8c263530288890d771c88b63caa94fd7d802400f7c1597b884129705fb04d39","complete",170190904,"","deployed_only" +"b9238edfb794bec7ccc38f6015f55b0dfe5dd8eed1b8aab8910e603d203ccacd","pause",169744245,"","deployed_only" +"ba22ba6f781f3262c943c56e2c206af11a588d8edfe5f4577566f50886bfeb91","resume",170029955,"","deployed_only" +"baa0e177bbadd0db464972b5d7361e528572357709fa7073a6412ed183e278f0","resume",173712821,"","deployed_only" +"bb3e6cf751a89b73e07d51d0692aa14543c49e97208cbadc3c7467b80852af11","withdraw",184688142,"","deployed_only" +"bb6e836315c1a343c769a549e55338e284be38f76ad8316fccf7da1efa5cae4f","resume",173713040,"","deployed_only" +"bce9a29f71a4e9cbf510adfe5036866d38614ac3a88f6ca051c28c4c174ee109","complete",168426805,"","deployed_only" +"be43513af2eb73dfdb4a86c9168501315ddfd263b62e04650b68a2fef6e9477e","complete",182315233,"","deployed_only" +"bf4d7c1b6be599eb7e11266ac962a214bc12bcce416fb6852275960df8e46f5c","withdraw",175507688,"","deployed_only" +"c05538a93bc366ee7e521e55d3f529a9dddd32d5d475c13b0f25773f88d449c9","withdraw",182366895,"","deployed_only" +"c0cbd67952200cde61b733c0f73c4b3e1f0f7c953a37e512fd2e0b65b7c769cf","withdraw",174252441,"","deployed_only" +"c22ccbc42e5b1c5b699fba07dfdae7a8e4b8ba5860b822802d143983b4bc8722","resume",182966483,"","deployed_only" +"c397f10cb543e8e19d4118b36011624517da2f0f157ea3bdded1fe16f1d7e662","pause",185280045,"","deployed_only" +"c3c3e6da9c658763aef921cb63674b556cf6bbce5e4f3f42717aa29664e48031","pause",174357065,"","deployed_only" +"c3d022d0786a1f996d94f99b234a09bf5c7e692b34ba4b0a967d467bf59d76a1","pause",180474905,"","deployed_only" +"c416ebd132feaf52ac87876622b82d96fe3368aa24610d5bfbb9cded88843d58","withdraw",166030324,"","deployed_only" +"c5196e8b028707bdd1f01e1bb1ebda3dbb0a08a55c462bcac17c0a85bdcb6820","withdraw",178123351,"","deployed_only" +"c6d16ef01058dd93a2a231828a51ac70c6eb426f64cb7d034a5343d1e7814a19","withdraw",173799398,"","deployed_only" +"c6fa36f8b566737ab5260932ea4b6980c40e7ac534113c71d02bf90d54bd2641","withdraw",175541770,"","deployed_only" +"c863367aa98696fe3061f7f7371a9b1d215fd27264dacca4f713829353303d04","pause",181778617,"","deployed_only" +"c87ddba47095786885e24cc81cb0a248a21398eaba7f9c141b0afc4f1a7e5861","complete",180032219,"","deployed_only" +"c87f528456692b57488b7d04c1f4053fb878537e055b4e180531b8898a5def41","complete",170899955,"","deployed_only" +"c886bceb7901dbbf6e152679346a290d28023177e7c89ab061fb8b4a3809df02","withdraw",175640878,"","deployed_only" +"c9710121dd5c12cbcb276be742c838c088c516eb10a5f49b5b6470191dde85ec","pause",181778655,"","deployed_only" +"c98ca847fb3be8347cb2305068944b6a034499ca257662f12d5e6add5dc98d3d","complete",164915478,"","deployed_only" +"ca30bd8004728c11874baa708cf56715a86d8f56fb68a26a76c60af6dc90e1df","withdraw",173029233,"","deployed_only" +"cb29149f53fe8bde37306c8bea7fbc9d39f81b29d527527efa86d3f44bf8231d","withdraw",179668787,"","deployed_only" +"cc01f6b78fc778feb0371d12b83b9917b5527bfa99d32a1f80e5c7519a8e1fe9","withdraw",179413685,"","deployed_only" +"cc142d91cb25912e6d5c1dfe1157949cd67f47314823c1c7c495280c2a01d5da","complete",170704600,"","deployed_only" +"cd3683bfd3336c997e298de3cb1a80a2010638444cc59b13d1e2621c5a75a19e","withdraw",167630995,"","deployed_only" +"ce291f36935ff550c23d1a50d9df80910346a0901fd67f495c27075e2c4b6254","complete",178043546,"","deployed_only" +"d035c62be8c84b37b2093279c087b3679ee11bbce85688722a77800bf27a084b","pause",179412815,"","deployed_only" +"d0cdc89d6b76fddbcccc7700db0ce6d9a139e633b8a581196be9669f4cfe9701","complete",173724965,"","deployed_only" +"d131e6e13c431873cbb5198331855a012d156b14818d0ba33c05297d3d4194b2","resume",173713198,"","deployed_only" +"d1d4ccb2fd6103b57f2cdfa3ad2cef655481d8d75b805653414d1a4b48d3e0d5","pause",170029902,"","deployed_only" +"d1d9baf27c322ac9f905ea0886fe0b477622d2012934acca7448a2f2b0508cde","complete",165899354,"","deployed_only" +"d232a098607b032ae2b747cd24a4a8a8dcab37dac7de1749bb700444a55232b2","pause",180639486,"","deployed_only" +"d23e618b017763119687a4dd914710e8cab6b996f97ed64c00dc148260927f90","withdraw",165345764,"","deployed_only" +"d305f50fb1ed5f1df75057628bfc606c95174b5c50f5ada24ccde7b2d087025b","pause",181778573,"","deployed_only" +"d30dd5cab801fe5b2f73bd10929d07f6d1ec5e038f5ee4329fa81bed1313a711","complete",170704773,"","deployed_only" +"d356f4644fdde237c2e6798b2a20f12e1f7db7802b71aa5680c90fb2bde226f0","resume",173712622,"","deployed_only" +"d3b6f4451d5c64b575b5f68b04c82ad4948663d22400b657efaf5fb157bac820","withdraw",185140469,"","deployed_only" +"d3e65beeb99924ad884ebea07276acc9e16445fb8561b08062ca99dbb5faf304","complete",179953964,"","deployed_only" +"d3ffacb7fc7134e95f56543e94c764be5d6c2f57f3aeedf46c2f9113f0e1d748","withdraw",174410359,"","deployed_only" +"d425fb9cb9cff5944b84281142adad09db2168ac088b33365cd728832f61da10","withdraw",170191195,"","deployed_only" +"d49cacd3ec726b39dc912931913fa2e91a1e109d665dca1667470bded3271bc2","withdraw",168630477,"","deployed_only" +"d4ad7fe0e883c205fc352efc063407ef62ffff71e88e1183f033b2a2ac36a63c","pause",176492918,"","deployed_only" +"d57a664401855f9614aa2fc3fa920e93a2e71bcf7de24caa20cf30a7ea74c526","withdraw",165448175,"","deployed_only" +"d749e9a9abf7c5b2647fa1a95a951828982377d910cc2f848a0636c0421f2433","withdraw",172964775,"","deployed_only" +"d85b90e13c5b94a086ad02cecfb2c99e5ddaacf9eb268e6d34150764f07be30f","pause",174357016,"","deployed_only" +"d8e0c729dba61e44993a2b60f3654ad6b4b3baa78eac7f65b9fb1edf4ce58afe","complete",184528152,"","deployed_only" +"d9042b5ae794d8a4ebac2e04ad4d1576f527e483439bb75f1f80863b51ddcc23","complete",170189313,"","deployed_only" +"db5a04ab8a05df6b205065a6496b5c22f636363e1f6401089d172f763d9d7d84","pause",180474931,"","deployed_only" +"db8a8c5de88ac302bf5eb3a3944c17879ba4b74e65ad08b8178b0eff9c080421","withdraw",183515789,"","deployed_only" +"dbe7399366adda63bd2472bd0055099f983168b9c7b99ab4ba15c74a45843a88","pause",184616940,"","deployed_only" +"de3da75cf8956d280ce742aa319ea97914a0fc2120f9009c69b72d45aa0cffa0","complete",180032022,"","deployed_only" +"df50b2adc927fd955e2424f0d1dda56bbfde7af3917ef4bf5466445c12b85a37","pause",180393527,"","deployed_only" +"df680566998b70aff54567f5436f56e31006a97b0f8d0fe3d3e16a1b35b8e7c9","pause",183452945,"","deployed_only" +"e0fb0c9ec844a5f86e73d22e017041232616cedea78ddd9e58ffd8879ff71177","complete",178581411,"","deployed_only" +"e1162b21968b015d6ca4e0fec578b81a28ba5891e5bb06c0de2452a07ed6f2aa","withdraw",178211249,"","deployed_only" +"e2860fddf054973b5c227a34ab25133b3213e98f39f78df1da82815247321d91","pause",185419368,"","deployed_only" +"e2bacc88c76a7a0c143f187c1cb48d233733fab71faab017e02965ddb08cc06e","complete",178643717,"","deployed_only" +"e2c1d7ffd4bcf649831c056806c8f9b611771fc4e70773baf1bc6820305a432c","pause",185280149,"","deployed_only" +"e4321a6e7798de8417a12c1e0045f6e669e4784c58456634eb9b4a04cb66a9a2","complete",179109605,"","deployed_only" +"e47c14b6c9d0b85bc2046bfe59037a391cc071157410fe293b00d98d11e924de","withdraw",178581232,"","deployed_only" +"e4d7007fe8899604d9262551346480afdf7df6e32d6592053615e1aec15b3ea2","withdraw",164541860,"","deployed_only" +"e5367321385d14e6cd5316b55a508c6a9c8a5cb55ad228d4dfa59a1c418f6d48","pause",179412456,"","deployed_only" +"e5a272230f5362f104c7e056557e105452b259a19bcb34888a70b5813d126243","complete",167581320,"","deployed_only" +"e5e39de4966aa35c79ec312bd267801dcfea8e07d44030781f0921775afb200d","complete",179413926,"","deployed_only" +"e7e5ab20a13dd96a2910f6d8c5114698b1f85475e23f0038633e6ecc337a63ac","withdraw",166550845,"","deployed_only" +"e8ffe4a8a6a21b34f485d521223b1829496b33be40b5dcef5f125415e0362dd6","pause",180474838,"","deployed_only" +"e96544bf42a1f957716d8888702ed077e643239eb85c582c6ed52c0326622d2f","complete",167742063,"","deployed_only" +"eb64afbac502d6e74eb2eaac0a0306331dff781afc85c5bd5be2d821b164dcc7","complete",184278528,"","deployed_only" +"eb668b2840feb04513f774b86586cf6a4b75462af55cb2f9a37c09ba9ba3963a","pause",183452945,"","deployed_only" +"ebce34d7ab9106f43f7dbc160111e895e44d5d338ce51c23e6211a4a7e151353","pause",173815297,"","deployed_only" +"ec43042412a65b5131241e28e62f691fcd9c32f46672aea9b0bd8ce9c482a5d6","withdraw",172495144,"","deployed_only" +"ec559410512d5987a0da52ac12c288b4391451eacd1850112e049d8a8de17869","withdraw",175736205,"","deployed_only" +"ec622118600cd92c4651841f3d3fa9a57f88410a28e345fed2b1a60fefeb2547","complete",178698845,"","deployed_only" +"ec75b59d5fa8dc96b00356428d1c16cbbda94300d295b7279035e66d0bbf67c8","withdraw",165254355,"","deployed_only" +"eeaf39d77e95263d442f32458d7c1440510b08fa2f280f7a35064d4e221183ca","complete",168262310,"","deployed_only" +"eedb19b83290d46602c08880c15d0a792e86a5a41904610800d8e665cea80836","withdraw",178059487,"","deployed_only" +"ef43761347a3f8bd72017d87d784fe657d359ea7655ea74db73031cb1b06d1ab","complete",184072370,"","deployed_only" +"ef603faac7e6ee6972b65f9add95675dc43265b4a09c98a58031f7c4584661d3","complete",178044033,"","deployed_only" +"ef7963794b791ede3a4b6f282c47130391efc922fc554d98598903925483776c","resume",185280011,"","deployed_only" +"efceae8a8998e4df317f2d538eb912fcdae258e7d773ac6104d8c8129064c4e2","complete",178419701,"","deployed_only" +"efd0f792cf0dbddcd2752d29b0d4bfd9525b6276bd25a56f0deae074ed9d8189","withdraw",173874292,"","deployed_only" +"f0220079096f3468f8c0b5bba6ae740f618d17178670d802559b93a2f962e7f4","complete",170760741,"","deployed_only" +"f076da798b0ea2bd0dc17b231a2c4b022c5a4654aee860eaebdf8e8adcdf69c6","complete",170166973,"","deployed_only" +"f0f2cff900f5ebd7aa2871797947db4881538a363045da5e2896e75a0b8a8dbc","withdraw",171828678,"","deployed_only" +"f17847c703839040fdd3450bdc36b2478643d2e339f3b0cf9f261d4f22b83a3e","withdraw",170257894,"","deployed_only" +"f310f9d0feadc5378c15e52aceb870ba0aed54ca1bc0004dff0e65371330c55f","resume",174398470,"","deployed_only" +"f41f3908d8da1c7e4ba72ab574f5b006e2bbf7e4063e62d875e326c30271f420","complete",181836972,"","deployed_only" +"f43d357c0dbd8f509088d59dfbaa670bd4b1daf2c6d14d1fd7fce71dc74b9d60","pause",177568182,"","deployed_only" +"f4bd44667bbecaebfdbe9c9758d6873e8580d83a52b1157276d417e5f509850f","pause",174356967,"","deployed_only" +"f553fda68ef253a9ebe0538061ab07fdc2aedf5c6c2efce3cd036258ce6b4376","withdraw",181082111,"","deployed_only" +"f6053940f027614c3552ad3d737cc1083cf4ce92273282d46c46400c14d251f2","withdraw",182979001,"","deployed_only" +"f62e516febf8025bb8a14033ed81409678e52d04aa9bb426517c114965455e97","pause",172001127,"","deployed_only" +"f8791ff743742ef3fd17fdeaaa11430800ec58e0adf58f8acd0c44e5351a0c4d","complete",174426807,"","deployed_only" +"f87a75d251c596e2864f88934ee9efba239dfb144b7bc61ae5087a6907a1aa99","withdraw",170268009,"","deployed_only" +"fc4144d8dcfa392c9ca1869a7f2508b42124c9c59d8be59997bacfe1d51fc2b2","withdraw",167643833,"","deployed_only" +"fdd254277c02d7e98fd70a8138b001f41b95c3a77c601a132356e6e384877abb","complete",168191165,"","deployed_only" +"fe7947e7312d634cea6e28ace9446b39a7fdf17c586703b5ab6f97815b539543","pause",180639535,"","deployed_only" +"fef025fd0b5c9b068e3d8178a07fbb5aa34d4c7eedff61d4e7d6783c977a8978","resume",174503864,"","deployed_only" +"ffdd943ec4a11e2a3c865b146ebc167fb1a1418ad7e6bbd7d069ff54be0a23f8","complete",174415144,"","deployed_only" diff --git a/indexer/logs/yaci-store.log.2026-03-14.0.gz b/indexer/logs/yaci-store.log.2026-03-14.0.gz new file mode 100644 index 0000000000000000000000000000000000000000..5df731e66439941bf4d8efe98e70ff44c567df5b GIT binary patch literal 47283 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 literal 0 HcmV?d00001 diff --git a/indexer/logs/yaci-store.log.2026-03-15.0.gz b/indexer/logs/yaci-store.log.2026-03-15.0.gz new file mode 100644 index 0000000000000000000000000000000000000000..1e5ee945c6a06abf1d181e9ce141c376e80af683 GIT binary patch literal 188311 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%0A3InWAIHG*#=`(ey(#gFod1AySxCM|VTcUtSm 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%0D<%t~y!K&!2Zqh6%zP3sCQ41@jX9*M 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%0DaZDTl-h8x1?{I0va>C%C&8%Aph{y@ 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

6Y4pUMM-mM_ESL+>DS72Su& zSTOwbv62@8qD2HLPRN=)pU|weLr{hx0teI*0@UA7RL=n%^6@STAx&PE5;N2u28R?% z`A#?Ffq#Z!+kKWM$qSB>Sinexwc9Lh<@{5%0h)shS#?!!jD1$RlN?Bg@~Y>%HERVb zy^^3Vq8?%}IDf@X3cXO<2I`Ga%t~2`y-}xL-Y@yi8zw|tWyPI5hhrJGFZRM<=H^M{ z0DHL3q*=vz(dbN08TY1HTyH(62kPGgljU9(#n*h(8IT!*`iFU`_OPvP8+v)$SQqs^ zp~$!QBiA?>D`bX$ibEFwl-1R!r4~s7cOR^e{Ef>P2`-k zW2(#~wni@gRa)^(%lrldgub{TyLBIF<{|-7Uw6~FEqs2#H)B@nuC4Y~3r4mdP@^?S z``o7PproRBNG!P~M;j}1CE_D7=t9GA$&WUZ^c10FvBi*GXOye|AUr$^ z$-V4ldIz*G;Z_TLBhjgvMo?*wR1aY5#L{zWeJ?D7_J|##2E-^e%k!IWE~Jkcp+6g*Ybra;f)qPKbZEJ%IejmkTvw1Am~KT41fA4 z)?glE`juz$SzToPA<`9D6Ym&^>_ivSXvYmW>u-#5w= zRNd#5sU^Y62e0dlbH8PMkW`2EI6ml9n*lXW%Zkg92 zxbJV|>-fk)1WSByc7fhT7j#ik2vYJj{0$Z>0I7gG1QxD!D^@Twt`?S~QsVKoE1(ip z{V}&XVbFj|w4bgxnJ6XdZ9=N+s1f3iQ0%XwjlrYkiI!N-d!K zL5KR_2`REH2}|4p1Qvs_%v&Z2bl;(&bpg!K8zKT~?qh9QO?C)i`kd`%K^HowJ!WLj z7C@x-t)OQtt(og)p{O5=kA=z^tek#T-x>==7m6(UyjO13LJrHgkFGJmkep24#2iIY z-wzqy+SgYYy%}V%a@RP=bX&7l@ZR`E*~!ow%cwi2@`zo~Z&`UC2!!&A3_#CZX=8!6 znshZ3XiD*T7+7_`Dg4c^s{uGAcN7s{RLJ#!;-=X2G&|b(V;w-!<~{f>E;;UNC+Zs- z)kwe$)K;jxv4{AT6US{BSzmAf;abyN2E!itGkg`S65Xp25`avWz1N<+3Ux@3ep&!o z^(=Jk+Ap9f2D5bd>t~ zf|`r5dzgQ!Cy>lFT}dljMWHM18mTW#e9L`SA_8;X7J&}6IwHX9lF)N}sEgE%6#Og1 z7noG1_zddd=cRJGsnM6ilI$T74d^jN(~2?}>+vv9v)U01vXd!E?O2N+jCFwhIx;F% z`=A0AJ12Kom73;yK4O1*ffX#j%L^rogT|~QHC3a6lv?L;#jHD`bO+b2h2s3>8|S5v zTdS*ekTNysK2U3wJ8cOJE0>C1*I)tNe;-Kiy!isFdps~;CC#K~jS}_MrO|U&hk{~A zjHrnwA6;`<4QC5<6}3$>b=@xwzDTkge+ z<-=VokwCYtY&-Ub5#GlkF@w)6N0u+Xk4lUX=2wyNHY3#)p)r4O^@=0h}4}>L* z4&4v#x(eY7#Hv_vdm3*KZ&p&V%6e0^-}=kp7f8o?V4n1OcQ5#sdAt=<3|^x>DFRCT z>vFm$wwWpPRqtA4fX?hM!{`0IvP2Wi*7_IbRqqX^z@ycIK&~^BlU|*sQ!1Mb8qkPN zZ=5ck{QPPsX}qADla8iXfSAK4S={<6Yv#+Lf7r=`6Kp(pEz3C}B@I0jN5Da^fX3gO zp~GaLR<5-Eta%t5t8a%2IeRqf@fc`3k%0euqEC%}G+&I)hh74A} zhXlR}wu6y;>h+H{eO1bUl%p4 zKO8CBuD@OB|0?u1O{@tBq9(aEL_NJ+J=#`v#p)ZH>Yf$892^!)X*&C0MSJf>^>3-& z?=RD68|&TA7UMm_%#Mlox{miE0=+$tm;2*xkSyMaSsXSM-F~cCBJ?%u?9ksy=Sk*u zp=$rXnHx{TL{<>f-vv>YROQ1VF|P5(ZtWfo51pFi8~4p#X%#5k{B?&Xny5gzDDDBz za%XqyJM$XCPAn#4g=rV^+VS0)abRtE`+9}U5UjqBcP`>Cu1|RO*3ANI6G^He@rB`a zW4?cL@O7hWQ7G6*?wVWdIs7YbsaUAN|LV2X%$8B z5PKkqaOoDbMcai)>|hYH4g-8UrBUa5k`H1Y-lMFC7+ZH2L9;2&XU zssZ&nSTRHuBQj;f+&Px;JGk@hmB1$OZubH|zt@Yz2Sr||ZKh3rtqiFM(#5)zTHhLH zXCOSSn{jb%i}qj1&q%UyPnwifI#m8NOZ>PjKVcnlOK*bR7*@|B9AxqX?j5TSRm}yD zE{QM&%CgHR-x%(>+@d;&FLncpE>YE}$#LDbq>>p4NHi&1*6ur+AU)Y~?n~f7IAGFDRKFr(-Zb4{@ItsLF187*p#32j@AU}C*tL`w6n_Xs`bDLr&|UzN+$UpFWn!5a|~X;A<#G4b+ke%l<&tt6yfa$Q@a3ekqiNeHihMks=cKEq0PhKHC5O}T5h5VAe#k6 zbmJfT^=gAe?A3Vm^ygigTD7+xw$gyCa68Eq1chT9Ytd0> zxQ0(7FBNg8ay;-++;If^cBYa{_=h{UiS(}9)OnV=wzxz`_JZUJC*ZR{ww;U0xZb8* z=hF>pu}3PHYQ1$EdWZ7hci@EHk+9lvxAXeg&x~+BhrBZm^v_3kyOetEH=2$Qf472| z=l1GsC+_dxwA17=;2%ESK0O@_ zH&>q4oYK4RoIYz3sXyAE9XvW)+J z?2o^f7-P5gxHyjIHd+h7Opf7_uiqIDhG!R#c)V)9+piSpO&upsPvpjUUO(77C_i0Y z^*ijJv`_necHn({v>36Q6GQ6l#^WSgru)SfR;j@$F->3ZrXYL*=XGdoRE6C!<51O>5o2Ht;WS6r8&YY3Qkz(iF zIKfx%GdJIfG#8Xzfu%%wdCkC3<)H-aLVu+JQ8aZ_7dpVO0>gL&M2b0;cbJ4tRU|cj zAa01XprEW1{jfJtDB7|}?K>~r$;lIbF+={8E^sGV#9-)z$l4H(E9{m!3`BU~Bo$4a z&xY1B)OI zNBl%uNfXP-(^s;@_91r(CLN@dD{ghif2eqM&L~KI;T5{i$8^v3TF!s}Y?F)P8Z3HE z3c=i&#xG}aDFfmN%C89ku+jZh+ovPyXh^?vJYm%s(=By5gM5-0rkyg9EKK6nUf5Vg z5CWJ1nA1ps2x%}^Sv?fmcs6Q!Itkbb9JUot6(}A7{CDhMF#NM6@VbZIk zO*(8aAcn$Ib*3gTgjl@5-E&_DY6>0j1?y@TA*VDxlnVjD0UO-qS??PAEL)dUqdmuUe1t)4iIg9c6eM0?hi5;3=xl$OmkJarBC7y0Y&=5 zxh+(wB5|$W$8+c0R>8&#ZpG9?OO2jpsFqPdFq2b?JpED8XvpHA3YDP2N)^UmgE7hp z<$<^?64|*~6!x)_a{HN&FquUl+>B?=V;}z3p@ltp{1C z10NV3)&f#OMr(rho*aJ0$nsv|VaR@xFKj0%reh4Pe?IkmMf5iktI?~~EI=2D!tkpU zFFg&o1)(?~WR@&A^{Tx3Fc*F6x~Q@CwjgiSu(eR1&Q68J;?!qV^J(~Fc9@bOttpj9 z88?bP2Z0L@x5SksimSrS(NP|P4{-o#>nT7O(i@h-rp(6>5fjWcQwcN+i7CB8(jo~z z!FiN402-BZgqXYF7tMdeW_}8)zs4S?FtW+Nq^Lvc>EEMnYW8K4FK&?0lg%+*0I9pY zQt1a(^FV@GaB(y&?)soTI`WPDv(^h`^sO$E;T0?GU6IhrBEy@KM*hMZU5(t8==8os z%y!e4@q$om0R(Ubk>mBgN9A;IEH!8Y5LWai5ntH@nz5SoAA{O@FdZD`FF^PiE0bJ~ zu69%J>y{J8$~{qjfc5vi8ygP5NrMb-GKeTF=)_LCc%pyE%lE8422A2j?Sr=os@!>R zVwo8aY@DtETW0VOfRQGm(UY^0QIp#q`=GZQ-010X3CzEh1SO$&l$Ocnp+k6f*p5t$ zxhcJ=Ol@dq7^Qrj5Ojb2>pNcbs**4?by`B2z<1=7z&x$1)xZo}NnInCCXb)!5r1^| z1ma>ytPA!-7XHA1H&9fKhEVuFsjz z(WviPvwwW#hyg%7(3Mxd1Kms@=wIjJMLV%N9~m3uR@2X$Tp&%(W^5pzVqg?wj0atE zeHWUkIktOrLPGw#1tXy0wX;XDLLWb95P^FJfm$;mDGqa54G#adv&&e8#;n@lxd(p^ zw0maGRTmyF2!1()xz|ED1Og3u_2Mw2`uTlfBHfvd?b7RA(2_r zTvTSkLKGZ-)jDF|UVl0bg%)cH9z;fBEum;4tqPZt*E%!z^;2~!pLMZcHcnpOfD*0|Lr1WFf{OFfJvveZJeZwo$MI&5y;G!#>Wf?5j9Z;fv zj7zKueo?;{U%PFR*j5h#Cem=v2%dAXCif>N;7LFsat^qW)^PFt(=2@aaR2`8>-U8@ zGC4=*FDlJu%I=tfjWCL5GG@$=Tx zcEAR19tJbJ7hyMfD}>%X;P*KP;P8q^^2pd%xZ$>hhk+5Wy0m(uq_r^nM9ErUADPf* zH5Fs|?{y~*Qn+Yh4+C#9SI|hUhdts{t~!?`fo)%BSr`2OD?QiBPqlNqU6pmXyVZTN z_YZHS6^xb2;OFKy%Z zIAB7x-tLzm`*!*2+S4+-zaR_##0F+?OuFd{2 zYZH6UU(r=WCze&U@Taco<1c`aZb=i#B#84%&As-RzwQhBx zuj*+xL{4a;n?mmtTVxU-gTw!LxE^i9teK<}5$TZD7K9y{q`#JkFoCO6vNy9gO~NS0 zUP%4}D9OIK_@WjNLL0nPu$54Hh*1y8%nxir4Rzee$!_Vku(r97lvu{S17*c~AlZYl z9eOJsS^>1@LJuGudC&9X&)Lh?tN;F5V`aW(xA|R>(Ce$|w8M2`2L=aR-A*iV_i?y+ z<*X)@3S{P9jP`^@fh`30loN8>vA)Z+|MMz@6Q9oq8+NwmGz6^7(ZNA9@|JcEs5Q9` zDp@SFhtZ}4Z52)fbTLPGn%LZHOl@y5fa1bBFL`AF*NXQQk~vxRm#j&`)Of7R!N7Sz z@#7v8?Qa)zi}t4bZXF14+yj(_17h_17w8%t3jh6BGe9C z5yNJ|3b_RgW>|m0TCD8UzB7V>i~-4$-9Oj7%pr_}^iJae+ffQECQuBwPSSv@&A3Oq{F*+4uy{J#*=#f$#men_WU zU#@hRmY`k3lCyok5__i7dFI8SVwFi|&qNm&_4^W`f)`N$MP7VLRsUlHN-h}?ZRlmJ zG6$(_y17=B1zTHzz@4P$&;!NxUj3m$Ti=(t%oIFEfM~mz@cB8 zfv37cApzO8t^oSSVX#N&Bf;c9#<+9P44EbVl5r7WSW&c~mF>^d;d^sa%eDt12p?%< zbXWYNj!}5gP**@=X~)g;gHA4@Se?+@agSuX`D^F$0u$;}5Rp6!%0t zb8ZJ!lAbyU5B~v|71v});C9DS256s7ugXNY04&Z08LGWJlbl) zce+{_(72mpp>2blyrz5^&Kl!RJHVoKHLOhRhaPu%C~4(||9}d`)mD1WihQ{s!Q+v7 zoh#gdYR`)+q60`VAJ*x?1%W}gL?M%a=m#&L`AYSl=p6*uY0!4ufgfUZfe*<8pZl9= z@!RZx2dem$c`%E!4vzUmFOc#=U1AJ`%9J$7>7NJ^;N2e}q=gSj9xU6W-0mV*oe;Yq z4KW)Xp-Q=S9o>wT634-voID|)S&ph}X>es)mARwvR+5P!iHZYII*jCP%2}CcL8Y7n z!(B(F^mL9tm4)}tOReD8H7xOCiRmCX-vTkIT`rD-_Rc?_`6I{P9?|3gw9`J&A-6&b z$(W&4iyM?8%pLF=L=?6Yq6lR|#v&r2%M7^N0`%>+-26qD0s{)kxy+0QU4>7H;d+_p z&lSD$eoEm24p%U+>n3i_$k#!Kk(Ye-M(X3OaPvu$$N36*@%Keb2vc{YFF5YO-h5kU z+LAfX^}H=uN=#A{sa^bmfdO>MHCMS?PQ}^6KCN1$xhxCSpEr?I_}nA&^ui%z|s3B6Qo0h=sy7@M`YG?qtEoL4Go1MUBm%> zKpCE{P%E^`=B1(((K&lxlwGcX4GN&v`TP`R#INr2PC8l6u~p^z2h5+rMR2$8GDj`W zaXWD*3kv_!-HvKfJ*>WWyzk!~UUMn>jM%@hW5w1aNAS6g)jx6)UuZ21YY^eV zFf&6J@}Kh6pEo+|R=U^dT{H~g4Wx}IvZ+ZhFm)9n0`ouWt{O|LyY%*?bl3Rr3BdJ- zAwnQ-UGpH|V`m=FF~1~=H=r9H2wv;1_mi~EgmFZ`F%uv;vO~wDLgB?Bm&g;Fvc)dE zEDzinTtNK_x@nDtq`^)KW=3y3fQ`M1%S_0ct!H&WvMgV5`aE%1os&wDxHUK@^Ldj7 z{tS8PG`F{SfSDk})ZU2EcfE_%~v7jY)>F#Nk`%tF^8C3xOgh{HnrF-^DNO+Aa`b!T3G#Wo_41TK=sD1m`U7ZW$5K9h?^r?2#tHSBxqj-|iz z?o&HQ8MS9*)9&i?U56(9WfuL(3j67?TP^ok15R4fY^`ssn8l~4$w)6_ z7-{yPM~q`P)x*^hm}i-(BoY2$#miuHTW{|-gIP`>&u8kxirT6iR6BlE#poMy#*^xs z@serUJKB;Q%D&UKt<%}Lc-%p!pvY<$Tj{<4K`b31{3>A~jlM{(N8oBg@{qB$c;QM5 zKj4-TH@bNuMOCZ`0;|qfrj!^D2=tMYp%GzMSKNeES|9_qUoHDVnC316aX7;MP@WNn4xHWUuG=rd}pEFE=53!mRyAi*Kw4h4p=v{b109Q!&8>)%-Za`jZCTYwhN~l|O z9eDc^8s~{aZ!I#ns`N^HNSfUH3|y_Q6)rf9Bcleb3!i^}Hl?cp<8mtI7eARXDgQ{K zJ@?AWD>iE(*A;3Xq$WbU<)K~(=LqH3$^ru|~B6(hBX8CPF+xB((N=Uqvhx#J#g zKb;}kg~Q)mXBcQwQ+aIE$Jmv&*!i~E%e&AIO{QaNAk`EO@e6}K0R|(rE2B`(AR~TJ zO^Yp@o%psuMxFdqHpA!=DSN@FUxE%ds$|0g45#7`c*}Z!jX%^r$t2G&swwCSy-}Iw z;@F@f7^XkDEfsM!-k`jnp`suq0~G0>UtfKqU)ryovvJ=0N?k7O=SUO|pBSWo{&^5b zqD8>iaqOpmgN#CB7Rpj~HfeWx;W;W>^x1XaI)XFNt|l^sU`&M~=oH)xz6m*7@(f^b zcq8I>8)aBQ(^3EXrZlqZRxaI8F^8xz>hxYC_}nDpHT*PxZA!b#(1ayOvL%?GqN*z5 zEzG)%LKuK=aheFokURV!EZ}o~3_J-cpj#>FdNSC9H>0{J3sZ_H#2Hcjb+9LN2~43m z8_*~29h#b>^@7#Tu7bfz*O9CSb&(!1+~#~_DXayRN-%B*jq9mIEznS_vDu5l;|UOl zmND3RUjvazKr{*$0W_9E$>l$4=Y;_nW9fW)M5g$VM3qB!9s(-4%9s%2Tl9C)>xQ3$ zfn1pvG885B{v|KAnr4YN*xG%`4eSltadxUDPHZ@@CV*1v+(r~nN5Lm>t<=`I`4aHS z5{s4nW*-@qdqh>s2#u9o4%-J~r341T3i5=+fICr}39#a3aUpkc1_>|1)uh~zDGRbv z&+J2`9y8Nqq$wENGgFpvG=6tw)DsqPBMP|3dT`Q8j?nN;` ztAPIULzLI=iWc}yw94dd5iy{P@vW*Aeh%u4 zyk_5#$g*$g*f!th+<$!@8!D`q%4yYH&ERUw{dE+N+f`tkzfMK9O8g>B<;| zN{9i}j3-^!d=$b|_K000@$w|h$}omfHjuJfT2fWp?rnY^1I zoVIFM-U@OwdCedCUo1uza4H2%Q{$HXbPZ$ed&JRciFQGB!PZgVf5~ifgn$3<^q{)ii$mIAdeEoZ zbk79uxt+c&O zfpu(DIs}~$vjQsjwBsnvQ!NqDXV8#I!~L0wj$iAIQS z!1yU#Wvh20?ak>ZS9<5<<*PDjc+^>|KgTP-Z3F^?5il>W1i(GoH-0~tY33Pl-vGjh zNar>%1k}#_kF5rh0ou4g1=0I{RdDkmGP4AZB&7@mq$z4$5ks%+r~Zwit@&OOn!uPW z+wa5+!&I_w?`b1-U7CdB?sG3^XVL(XLy-$I*0m}K(lAp4jl)#m7JBqt^6bEHu7t}^ zxdTBFZQ+Hu+Xv%m>s_c0>_=Bg2GHERzTYKRH4l^?oQaI+M5*UDis=3_$(FlhznEwsd_<&1k zHZ$@XQ^~>kqK_Cbp~uN`xIJR8HyI2n6yT$AOxHsCb(On&!jjuh413kLO&8fdOwT=J z9rfZovPL?lPonJ(sv3N(xL(VCYZqPkb_yN1>K<<@2TQu1%U4L@{CYy}r614GRf872 z&Jp=e!8T!Wl31&Pa@wLeB2>cvSI_HlbZ+_KyyJRvnsbqpqVQNuMjd2qkCqPMSH#&~ znVw+4YI#b9bC3HYxL5++%__RA&n@~r3V0`p;w{8_^8s@Adz&fgBg?Wt8fCnNH~8g0 zKUO&yoe;Jr^Kti{0<-LILqz4wTTpWN7s@$}_H4ONVPM&2N3b(FzCi=a*e^Qh=K$JQ z06FSkJ1%t#6zh^Irq!nA@9eZn(o$k}?-RwFKO1)LvdL}Q2%~bw(S`84kT$@zB|C5G zK4ymI#(_CL4r2&D8eR9n23X_zS^TKhJ%tqM=iGWM3no?cO;U6BHj2Kj;xCWDchPK? zmp{99kz{?;5#tLrd{Tvr1YG+`mcf24oL{VFC>x&qat>QH^6DT z*2-vizH8wAw-YZmotYHIe#0?Kz9|`sTDHb+u%a^zGx&E92>DmI9nK3v&@Oj&ke1Nd zLbF-oiMgVN_*wX-KdTNFYl7@;xkedpF4n7^M#$%51Q4YOQ;2kfX8vZkHKsQOd|z2o~3d>EQ_5MsWJwjO<#F;X(6mmQOs0Sd zv-;1Z3)L*0$_1jIQ`M!1z(NJJWlmo7HPz3`PV_KLC1X~-oL+d9BI-#t(=Xdnb*Y5zu^zjb?kz|h5|ng`CAVPh+^w<%7p_vUOQa={bD!E|Qrbtzt5 z8k!aeU>*n4f(<_QKgs;yas`HQI3D~6NVzsuoXQJ?mk75yL5B6ES*s6P_5<`ltk4v! z|0)u_`@$BLzp2=Zh304je>pG$GK(Y(PCzU>csXVzahoD~vG?>zl0m!_&<4JJ5;>D% zj*S-IxU>qbjK?bIwqXC6%oJ`E-bI+kt^5rp5+ftJNgbJ{xhB`RBO8mDsykIYmEIP~V)l z+Lb@$v<(CLSs1kr2GngIY3-jP6Pe2h`BPgIE=O_#A0P=YWFYQgjOCJz588 z%R>T1KBe8Y`_PUC)1!yhO}}ak3sv|*7*#O~BY8uDRcS@AJh|CSpk@$TqQ#(!9k2Z- zxD0TRX02nbpu8{`$_5k#RD{rPC%?GLQ%spazCg6r^53)tD8>6O65laN$Oi-H4X2DGRz^JC6ctC~ zK5Ka}+NM@9?2^Jh4VXg$AX;;71{7jG7=npN0cLGCv2-ra> zGHNDCBC*26;R)tG&HB1VKGCmm5**H_mH#>(#^8|$z^wSCx7d+6| z3xiKiVDKzNQtS@sTdo-%MV8u;URE?aO3Z*&a_b%U?MS(CM>0AGi#g_i!mqQ!8p*3I z@zT^)d6P`@QbKf;SK9z^FF$$jI;cuDF(4G``n)exd%Ti{vfyS3FQHLyvTq_KV0kt` zUr1>kUz)M{Ou)7gSPE#Bs;q?^(+S$I+%9_GOE?A>>q5Lk{7a}@!;j`1Szrv%$%{HP zgGo1UP6cbAm~UbllIOsBf9!3T0JfSk#B^X>=sf>Ca^#ykcs44yT=I8ggYLI?V*z7P zFfmZZio`Tx#kS7p(r)ZGR7U^J2-Xtub)R>BccVR=dLTHzTOYXKM;T=96?!x!n96Nh zN#3Oeu3e-t=8?-A2fkY=9c4T_fLOdVMa)dr5Q?5^#=QLK(MG+iSN`^XUOa$~-Uv!p zexbSnsvGc{!)$(6rUUfO#DE1=-YDzudRWlv4k4v&^2%Utsn1UxE_S6!x>XfJ>N|^R;0HBG*VOKwv~NC)$QE*doMP~^De@CkAFQ7j^T2)( z-pe0N{mp>uK!gR%7zb!`&oB;w$*yCUUlh$1?Hjt0J)Oy3S!B8~YmO-^ciH+3uA?t& zK8=R@{&yrm={EXihw~j1oYQ&r&8n4l!>mc#-$76IAYxVr>cN#SV+;Q9_>W{cykt8G z3#W%73Gmz&6^zv4x^w1Ik|LyxyE7-nq=yGU1Qqu?u&ho6gV0&mZzhzmb?$*mCT&c7 zVm!~lCsVj$0_0?sNkG;E?w^n_A&86>XuKP6_BcDw|Ee8*3n^k1J+=gsm4$M7oThxJ z`*zoqPsLWIY-LNRM*BS9d%V8qn>!;x-k8@~=_4cZx=7*a#evwn+1K899V&09)r?V6 z+Q>W-3ozm0nnWn{MCWM={y-xCm=W%RHkkN)kJno}D%3G3q{BndYVJ z+Lw2jG&U^&f8*Hs zUgh{NR`j&4*;@e3^m~laZMn|N562>dZ>3c6RflBO6J)U@yuK~O`y(V}Tw~yuEroRF z<$?Ifcl!LK3Rm374P*9|rG84|>Xq}^`C}3!#KA9b2a-@E3OzfMjk!e>&H7=B-bcTZ z1A;60q|@S{ZhW%ba`pL?=k!KPt2tAv)P^*tgv3ic(Bg6#hyr67moyEzS38_ z;f$xLEr2I)iS^d523_bJ8}g_Nr||D21t%cKIqG(WRWY0+jc2xW#x4FtimiC+?z4mT z&|Lw0IjsNQUB#++pZGOht1z{-Vicc*)|%UnfRd6cn#DRxCMwYe=%D zHs(Ru4sM9fk5twzd$6qdpAt;}GA1Df-~A<(SYWz9!s+l+N<2nM{5{EX@i-nva>T7B z7%u`7+8$!M5k-R&%^&zD;U-sldk8+iU@b^2`kV)7=pN7r@ z_J5y8kG_p7FnoJS4V+9k86_C?Lm*npHO;g3` zv*!BiYoWLFHqe(zyVhUCD19#HxK_SJIx1}TUQzkKuQxP5^=~yOPG)j_BNSR#Ukhnj zLrMpw3XILa<3C*kAt7{Z^cF$ITv^J1%-2nPIkd5 zD$1Ii@!?&kR9Ug!Z$YKN(Vf>}XsSLpZkx8)`?zA|k>C!lVChff+bBG+@5{F|`526D z)e+4=$K<-{SAedUBb<{zdlRhvF%|m4Qeukz{eAi-KNh7N5IEZ00_>PLID{NOLkrT- zG@T6G?=QM7=V7I7mXEmVX{FE=!He)of^yMSobO_vq4-s>UZE%ioW!#T^!rx$+lZ)8 z^rup8z(4rq5Ml*i(0 zq=QvfhIhmd0jj{n$MGxV{;QQtDLUIB=&hmlQxsDep03RshvzL-vpZ6UKC$(o=(5AR z!8%-=O3uMbA`zIT49Z$}wOUQ*FzDjd%UyfBCgsc6QE(>&zAUVelGbx8Nr(uFCa#hE zd^D)3&+ooad5|-mQVqpN#u%uedISqxgLgCi7fE^;mYHwY80D&0hVb2SfKHtF;{nL%z@P3AewsKgHSe~e4g!uC^ z^Sn|EVPHR7D>AUD^?2U$cjyCngJ8pisr%+O%Kl0G{+^UcucONwY+;A6tguEUcW<_i zfYn32)XFcYsb+&c1pEsuYLIkTc0U&l{|G1&JRB2W4GKN_W_?EsO#yGD%*dDBZ>6o1 zGX11M#53t-sooN+q@Vd+e-%m}Pbz%0iHUtbt(mbINqaDJ;V9jHCe^DR`o2C-|7pzT zfsn`-?yOk8Y4p5v+f;7xO;c-)n6Z^Ex{|ZJic9-W@NASbglVKO0CV zmG3cJZ7;j`Yv<@|$uqIjKdY@=bWI+fwIXu|g=wM>MIWjR1>S7eXgu-AyDb^*^F77t zbZ4upzbZ}i#N{F7hTj>(O4Zitv&UyA$3Nrjn+TG{R1JGP9&U4Kl>A-oZ94KUoiImq zCpqFcT$ZPb5?kjNYPuIn8aQAO{~|X@UDYGC^*@udx3{pJ4VH`7UMYz6;Nt*Wy3S%=q9Qg}IKOk+~_u8y2_r>m**qaUm+r0rB)0te&Z* zL_1i%1v27}rnxTSWOXFZV)nH@T3%)^9<}r#&5Zxs49bVPN6kd~vYIniIuZ`pmN$42 z`DMc_@yS(uTO6)iW6XrntQ7p$7Kjn?Ta(S9ljNLA)muGkxkfbwTc?dB)$$3~sToN& zZNlg3wP*o*w@2XfmpSdkAEL;T!D*`gl+Aqkr3YI!BX5YK7Ox}`P8Zx9nG%{N zB5%n-{Y&wJya`Y{`adzO$Q%3!9;7ozHZT(DRx+W=&0#nN{cHg{#HTHn_+ZnriLs*= z|HVo<@P(J1J!)QLS6F_+|DTtuLW{4&Xxg+=71|3_^1vP@oS?D|bknn}lzr8ang(Uj z<6IK#Uu(FxLetyBF(^xvCd0pMY-gHIc~72wj(AHt_$)vGg&@ccjyK34eL?b-U16V7 zogamGr9)g0`p3i0NwAE2*484VJq#PlhpzqL9HqevukNt<`KXlB3(u>rWkMH-FRF9T zs6DK$bgvUkh;~&ku$btmcQgG;6nJl{_%pa!0%+5z6se!GC|xu^iHhv>e1q%r76SQRiYQ$I_dv$OaPsf09njN9Sq(*PrNIt% z`y*qiqSciHo=DBM{RU6xV`{fr;+s4XuclSkpX@5zyum2}op(dos0gD)0LY?PE;ICl zZ2z9%Xf4YYUF&F0w!jR5gRM-$8p+omv*3c7$HgwZ7P2=#R>o6z4FvHjRaq}_XR4+jpW9zTLM16tKUP;kOUqlXf^Bd3Z0U%47eJaZ+qCKH zW8bt1;!rsuQ~YXoUnyq>RJZ~uUsYNvf+XYZVm9TyDy@=x#WgDC4^vmiy}gfj_jmU< z4t)L>V{aK2RrkdW-?xFFfKt*TFq9yj4uZtcARsLvH8e;_NGUy}14tuMBB?M)hrm$M zp_FtAx=`H}QStKe4ibNCJ_l2pzcloF<-Hvlu&3H{r0 zEv)exII!=l7&8x4I+Sabi&t2lOB>hynG-@SB@z>rCZycY81YD#gPy*QbDq7(PEE%# ziFYaNJ>~*6djQpF&D(KC5h3iO+3`W;iFwgVhX$oRUTo?ofnQQvn~= zk#aj5GK}}A>Q^KOyJXTDoisF5Q+u7VUBOHY9QfW;CV-HTa48^=$Wynt779va@p!#J@*3#yDoGI#&MJZ?2*&*kf-$**D4IpTJ4h|2pASNJfgss+SYaf?*A#E@fEp z>MPJ2CCXo{(psS2l?&Lc8Is0>X&PUY;^jKcoBWdIGZwqt!~AOGgwm_;_GpKQdty@z zEgux^d0|?u2KF+Xy7!e&tGfI^Xm1KBZzhh*lXJ^M&)M%u)z+Asd>jz`iAbQS zd#dKnp7SrRu+NVf=PYdV^4Q2AiT3xD0*6_o&+Syg=|JjkJ4O#w+&{&0{4 zx1cYoUKJXjPb$Pbs33EV{efn};_Jifz`LdfjC0%v%$#?K&E-WghYx)y=WJS>jbYL3&q3od@IaY*|ScA~07d zn&UFmC+|g-eP#A>tA1y|gRBD~@Rd4U>HNCq_u5!}&GlcQU;}_h`X;HE`tpp@zPa(K z`0==VDqJa@D%4unihRSTax|oIXNoM1WVe;EY_6$1#=ajc3Pq$=WfC>Ja}txb~3Z$bH`GN10iDJ?;C z&`6A8rrVMduC5fX^l1t16KIpIa)Pk-O@46*T`cZ`RxDm16o7(_73&fcfpusH}JonE?d(ZRaR>kO!p5`YX`)xM19(3o%t zWj&sCWQijGOJHxTrB*gh%l7co3dtD~L-Y@y0}aAd=}+M=$W7j@{cwU^Z_zAq$3)zr zq|5OqG$1!v+-1EL&;7QXg{#&(93AJPPSRLZP^Z)@uQMvjOm!KonHX*r%lzV_Iy>e* zG3B&W2Gt0Zl&l<72nyI@cs@V4Xtrc|o)WB`#X;?sN~X~&bo{;_L}$bUd*!;H5Cv1u z=_@{!hG%r)Noo5LPG($>CV7HxLXaVwq*A-rk+oiaKPQBqcv!qLBkZ>*E=rR!{O~LP zwkF{py^A8(Z`xWghqF%tg1P~l<9PF%LF zvDSAm5)waJ@3#rVQ)4n8#fabZlf7Z%hbOK0<{-L<^03FQ`J@JFv7DF`^uNS18`iP0+mb3FoA%bJkZnj^tB2x#R7rU_HYu=&>l& zwS5!RSl(68-=Dmc-Z$RnXT(m2;ni--aKd}}kKrp5qtt3w@^k96DUrNeIU&ioM4T$U z?HhuSSk0%nn-Een7?^q6n{!}gAhqqC(= zkkI51&+EDo-c2d#oBLdWcYG~DFWy6LBPZn2&jZI80wZvcsGT=;<1z|kc0r`y7Wf{L zDO8f>T0rtC*NqXl{Fw@WVr*?g@!WqzH2T z>yB8&c4Q{=pk(Hq%K%O+8K!4`Dxu!Qzsp_G zLEra$=W}#@iPo)8O`N-~g&lO@0WdT4paPkd=`{d30OCz{v872wDqB+DxQ z-d*!S5knUoO985`%Ut|(tDmt&tLfT%U%*GKyNNy6M;x*=a1Oo9YU{PT;K(a4)Ol+C zfS{3c2xU3#(9p%eW%<^_^MOzm=MdK8(1uUjM)zH|pDgok+DRy8CahlC7YitXQuOtf z-618@3-A)b-r=C3N!w0q9|?de{Y}($z|d``9P2?)8T`4P@eg)$=|H*Rp}$tn10&X- zI)pSQgHsR9@&gF_jO!Y2wa3_KZd)lVIshM;10mm@XPH%`0nR z@}yG}7RU~T%ErbnSul8yPRW(~k@AiRzbzO_2Ucn9dz14NXdW7fPXa{O$e}=#NEEyP zF(I2zg%ik#wHg8el%9S(Xn?&}<|Sl!I@ewz3^o_w53=u6jHvtii{=E~1Pkm_w6H#y zN+)-1djZ7dOt8LknpM3pzFY=kEpq@XROWQV;^%Hz^jB7O$d!C(FxUIBW*i6bOF~Z= zfyVWCulP_5uhus$OQn?)N+ic707f0oDLXe>@7gmcZ-RrYFUT8iI=Q#?9(ie6D#v?$ z*0?fueF+b!BOATkj`+NZ_8v9+@y(6tF<)0&Y8?tQjdwizF`?+)m2VOOA36n449ig5B2JQkU`@3tW;a9f9elAvLN&BB1&(AY82L}9| zcVP-R-WuyX;E+1mX}iku+5f7imyVfKbKuGG!J0bpSQit;LL`f6;UkUtdTa_4$zv5*eF;g{tc)U*1jJ+U~ zu4^lExy=>SP3(O*$1?gfw{g5(8weVYzHpA4;M}jgkIGzxDg|vqng)l6C^Dme^PlbK z;KNl>tdAbI_p6n%UmpOVout(MLNxDqcW?KhHy=P5;~wWk@l=+}T%{=!c#sY26+Uj} zWWO3I?5gj=BfLo?8x&;RtdwQSm3hGO2l!o&daLroWiWYLL+wc7wq5klJt2?hxy~8Z zw*9^*iY4F_Im2~dDNWCF3sbMWhQTZc#)&mF|9!jVM~__>*Z{I#Vr1^0`*0vNEOCe; zx=H}RxAtSM6aoBgr8O70l2O!Vutk$5D_-EfLI}Ym5TkinJjIvkYbL^}*-Y<&b=y6B z`{P$@x#%1}u17;PSi=E(#e3x8zaZ!ckZBXeq~Qp zmHuBD2;IXZa<|e1!sy)A6H7ppZr4R-t0flT%u;r2>t1as z1+L;8JnJ$rB1dH!w{E<+Z^&K_(#(bOF;I|zdQU8}8=EQh(1eE`CPBY&ejyV`SN^er zm}#vsU-+FX93v7rjgmWj^B`$U0*1N@=SwHo4iuay$kkN*lwP|k*rilCvUln!)oDD{ zT9~~TBcRekg~aS#t7G`Wr&c4eO=p=H@8H?%Lu|3T5K07&YXuK5sJlcI{5eam z`RfgthT_?gCLW-u(UKc8$Q?DQ7(sC;lplX@4cSJRSSo=-fcoX%k2W-b!SXeCx9Jq) zak)FER}Y6tz0saNWi>=|x%xGb*rlSd>B3&t7}AVMl72xTD_CKlV}gIugwsyCu$)BCv8 z`4@0%ZzhwE)xZ0iTMV!i1ktrAeb&YQASgAbvWffFUOAosFs`wlVfOipuzxH7 zX(K#D;lxwtHGVW}pHsX0lwH8RhQf`i=qO8IcXoM5{%Ykl<0iSP4X1(lJ1!D|SOn6+ zkxRDsXEa9reLwu}(z<`%-6g`S|3Fz3{0yuAU6B=+4^ zY3VSoMB=-6Xy%ETkfgip|q6B$KBlG_nf zew})eRKYBOYk4zYxnx5G<)Z{nmA+7)XWd4tXsK za#R#vZCT9`73+VU{ZBpk4sOjo{)J*vs_{)dwce>1{|?cc@5(uQlLrLBCkiJKpYY7; z@0;ZqFXl1L<%HI~whQGHtJ8tYJEDvozL9A0bvRUs3rg|pd~a}TfTg>1WlYsx40_AHeH zE`!$Aj_0pu?3)Gy;$SFDxigsm-26o1&wg|124D@^bGeE5q*Sj#|As-ah9vSlwI~~l zoi#ne^E{I0R+}}yu$E!6ME3AkiNMN!mUgf-RvDjT?HZ1-26UzI7{|g^e53RiQ3UH zK_BO8TU+B6egokmS)8r^fdqWL&*GIly2o>Xj~W%PGzP6TE>mOb^85nx0(M`Ha=sel zMueq9IBmACvj@n0Ibumue>~r~lXskkvRHB8Ok8R-H(xj;h>^>6OAf9PLvNevPnto8 zHC*d_a!vqzW(uk(_KqaQR47F}$^u>1;hmJeO&$WlrfO|K)?wPk%F0c;@Vw+m!}paE zTe1+#lUF_{yoyb&^&)Q&ezs3b5wIQ7f8$QmeoMQfVhd&dTWSb3q<<4fZd0jlUBc77 z0~nAh%f!QY*(Pj~m}K_m?GS2?6Q#)h6_NfTzLWCiK*ra=VaoVB8NtWN38L+Q=$*1J zRy%GPiKZqS4WNp;l=(a_I}HfzdE}WS{te(LXJ4Kq9{=P7e5|W&rJV}aoueddWt8v9pZ?O||$ zX?yz2pkgoE+9w{dt%I5ffC^2&R=DYd88xZyhpLr5{7vJt2a`Y_rdl)o|`+z3+&6 z;dNu^P|0xWMuLu;hdIzpQpnCdi5>0`aMQj5>1p0%m&pEBor_Sc( zu+oI9s8pxhTVE^t)a$Z>Ah=ON$VRoH3&Z{Y59UD0a9l-fE!eW-c_tuO0lWY=P;PlC~~Gx8CyzejFlsd zX$mvkiDZg{3!G+`#|J#EvT5y&9^kK70(dqz5kp)l`l>XQ+e?|@cO(Q)r@Lf@Mu+Mm z6jiC&PCRO|z(3yLjfdujj$1_7_1X}ko6+UqXO2v8lns&9b`mRUk}^qD;sLLw2MRKS9u z&egsEGbJLEfh%D@G^oV^9Eis|Y1gdS78D7N&S(gN+%?28*>9Ce-@x&R9@9bw%+{h@ zoPlj{86ATcPofq&_bK^+4;)IbwnHaIo}1r)l(^&%^Nlsw=b|h(xX-aSPrx=1K+JS6 zKVqlsRlYL~;S3R=d5ItoSK_^w2^7I{Nx`NtT7w@>^$=y6Xv;_5&=DnHL8;u6Uj)RJ za|AD`nDxmtOz1B;i((!%~m1Twz(u9vo*y+iCAHT*-mMvJL-lnmS+B8w~Q zE8hS4iJp7LeaCzCaCH6df+X*tj_AB~mQ=%w6y2WxdxhQ>_4O}r=!lt;LXx~VRx<9i5C7cf!L1kw7G*%N=IU+ziBFIX zgpNb-q0WTid1Xh{C}=lo$9UJDGeBKUn)qvMa{uE<< zL>8_Ht(o^pI0MjMlr}Ce4&J6Iiq3Y%3k```1Y4JEj|dc7LxPGX42E zUoacsZydPLc2)Z1rlxN4_GGG;;{T^*U{`a|tSpO9*V0>L+WX%TAFV$FoqYFa1CD=; z$v0xRK{vK&!0E8KFFX< zAMe_24WS;pW=DwtC$>H2>QdYXibsqZDtE2{W!2IAlQUnF7ZCKitdE`yX}o+w@%tNe zLDX3v;dBrTwh8~Fq#WUV*6A+R7keImds40fZfX7Z1*&r$pm*gs??rJ20Scg_V2u{% zf=^G%rs)6meKz%-T;!bIDjCV2#Lvt!n+%W5Te&YscF?w$-5u53oC4yK-nGx9lXMb3WMJ(pDF8zF@yy_J=Y)L+SoZkZ z1%?C8e5{j@Hh^q|U{8D0rgIhFvQY0p5goSaf(JZj`n@ym)$8+H8kq=O1akclq4t*5 z#Zzz=A*8ee)wI8ig~0rl(B+p)22afwnk{1JQ>n>_Yq30}H##BI=Zw%-9bsQahfuTq z0WvMfbHr5Q+ZRJLVY7i)GRgG#1jB&3%1LNukt?guPfvkGg{6mH)NEg4bYkdfZ7KV7 zgqC?PjYL5Xx|qR;YnwG>k*Ggm)a-uLc63PDrL@ewuMz{YdXFty-38Sx72g`9dC~d3 z#2HFo5v%!Ry5FRFF1>+N+x-uRd2g~R6G?-9C(HRTUkYBYPkSM z_n=A2PGe2xDPd{h-UVJ02JRol!|kB9ewEaj!z>M#6^zqko zTbKU>tDF=0LmB0hTg2`+e1j=j7a=JuUBSJ>o5!1j8Ttj$7Yh3Jii@&M)SXE2ZP;H7qXQL zfwU0dJSwunDXN+|Bl~u^G>@KrCf*~4EtM_O^Vo!7cKI2&iET15Y~3xP7Mu*ks3bsT zEy~1jbPwqweO+&sr|h-LyL1dWNOn6a8~5Ua5wHH5CVp$H{w9)ySS|mUG7;qv-+vdb z=2%m2W3~s6=bS&kb+dQSZv9On|4smr%0MObrUt{|0<*X;UU>cMI;-gOMYEw~u2tT5 z;hRX9)oWcmHpz{e%$H@Flk8t=5QG&u#Vdqf);PyshLcUKW~E1QSlZ?)TwT#;FG;ev zl$CNMKRA0jO4C!P&#~<}9{C3V5GrCiK1c_65LMSx0w*Uv*>;_**qZKcHMOIA{WQYp zkfP$2=yV5@ehwZL4+{|jpbJQpeo>Rk9$q0i5kjwbycT4geu6x#I~S^sINu6DTc1+u z!IN%{z@Zm89(W(~oPlHu@p^29kq^tQe=3t@@e`ZCO2#cUg%zB75T8wPCo8Yv7ED30 zT7QYRMi!oq2U{rt;?`a|gG4#?gH^YN_%t3z23d3#C*l$(bVmjs@A};1;3kCr8+b{( zcZObw0-Dp>vcggLe7w4L-=&CxmgAJBF9yyv-NnXhB37BFkYh ztS8o63n4vwiFnWjx%S^|%BiJ5OUBxsDCL=t^*JKa>t?}X>U|{~hR~zlRI9yeO#z4` z@27X{h?O@}zLb5+%u|@41gahKtt*17&e?`VVGp4w1U6-40wDAAenmFhd>@=;lD;c- z_m8isP>IB9_`Bw~z{R%e-G@z5CnrZeC#p#m)rNzw&bgozP>wOiXw??SwHL^q*@4y& zMGIxi0`gQ93__w5vJcvC>X7or(+X+ICW*C#5{c!3r`&lB`_>-$5UvE?5E#kP z+}&cX&iG=SxO2WEPvC(>twq79!!%D2yslK2CH1IKWed}nq;6;>>ZAF{!egQA_a zf>?z+3!DoBJy5|yGLod{TOpV31R1Gy49PSt&8)kk)@x@P4GGwe8ao%P`4ig>ezfzCtV`AB)%XGp}ce+LOvp>Cv!7vYchq zq)I3!z4ff%9MH>a+IP1t%)D=~=?oY1nM#>n%JKQX3A8HPs5wkqanyzTqRQ_rSBl1I z$P|BRe{_T7s|n17;%{M~K=}xs-w=(>JSHXQ=!U$gHhdL>H-p_j{7NZ(cC_164vAZg zgHf4EnrbSLatA$Mm+7pB@@NxN@hkO{@WtM75&DI^Q0PK`SMa7N0=@8juKj@?Y-M?< zv)W!{)aOSm^ZlD^8~)ISht7<$ZofsN&yn(B2mk>wi3}58X zvg4aMUY+t{KsZaYm(W=Xb7+rC6q4#X;-0qQnRNAIgwm*sujS5t*m!Lq>TBN0`n#xH zp}a1>cM~D-B4frNWhXPwzCmk`cRIUyik@{u78DQ@!(`oE8$_`3udX`O{^wM6n*I_P zF~nSst2mfG<5OIt3+t?GtXX|R4ni?z6T(urKagdm_*{CJAZG;|xkm_$J_w=w1BB`S zWrnIdRn=*1X8%j|hGZ|Th1+2rdDhz%nb*InH)ubH3f>X#N}ttXjn#p)C9!KTn5+b= zme4?SbpT$~*~{NlL=p;%toI2tfW_{sFu`pO>TCWDiS_TtvleqgI-jdAM!I=+$3A1; zY?{Yl^Z~N`k|~2sZK~n2f|*-Ws~Ml3FpcSj6-Fpwf-*o19A{NWx+De+cMyP*1=(Ta z5wFFi??AT)O0=dMrgxldauoX-!iFNAA?TPFsr5dF4BOE1vEL+&0mlJ%OE{^tz!990 z7W9MG*Q@On@~o^60b4@+MQsXBN;D|3bSC zgzqR%Bc_p#tGQt5(D4Zt#7s!gbXyc7pgm)aN>dGUPI6kuKsy$)=(F@YCOUi5cRu4c z<4if3h^&-wjNa5q4@t|5J8G2=AI2S2$+j$A&MEv*^;1RCxE1{30kqX?k}Ru&EnB-` zL2s=b%eCDsg^%bpH_IabGr8JEtYXkekU~wLPnQ-hhykdq%fGY7QdQIfmE_KOjaOza z;=h?XWnKA20?IMe&Zfe3qYsPWs!1xh;XOicxAC(nQ{+YDQux{5hPHRpyH%)NZ!MvS zWGBx{9JiaB)8nna&WRq7x!VqIasQW{fxc zo&i&{_-CUFbsjR%HKwfLL zYKy^}YXI*+tTJS|FUq`r*(X60w#t|yNOJ8~7tCGuS_seLWnt~3F4CUUVnCAIOaRIk z2Wa65`lQYy-V8f&qf2UgK&u>$=;a_tx)6)+Mj;E_TU;(rYeEh}u*Rn~sGrta^Fe?Z zoY_}1+DDi&vO>bcyNC+{U&rl<#Dw9+Msf0u){ww9LrY+9DE9QUaBUU+?+vw%1zfDw z5;)lN4T{(X1hDtS}wCvl~6 zG2qa|N(5NXm--4R-;PYz|IY+JvCyGuYLs!+Uu&V+JcioPtF6zkO=7H1OcF>W?>nM3 zy{rl@-6Kq2tPLd!ytL-1aLn-4=$gAk<>hz}*=UH!o>t1zPbVUKbIXA;O`P$dHH1TN z%@OuB`0f2#1~ zIzq7vj+ObLD}I9emw#6HoQL&K<#byw|Ej3@thoEz(#GCml}yd2Cu@siSFip(I^F+$ zHSqV&2++>Uq<4V}KH%Ehx+`9{JtwsMf1Ui<-585&K0V&)>EtuZa*p$s+9*%T?G?0l-z{fQxt6dCE};)PD=y2Xm-XC5=^o0~VzLry z4DCR|QqW&es7abB?eaW$+}Ho;=X!8P0zf$oDqM6IbHT)fp$pBJWUxkCinRD^(VQF` zVzpTqOpSRrr6b)%oN8bHnrX6%2o#da$X*!pj}ppDnl*9Gzbbf|`K&K?m1|-CTMYTE zay~)KGk`m$aMtb>P=k{~%(Krg?G-+fm3=A)_K?m45j#pp-bvcO#(2yVu;o(9fNqJ~ z@9W)_6xm%F2U+;lJ33^1w>A*B`@lvwUzmk=P2XT|v-&ap8KU)ZxHPnVAGF*3uTLhv zc;B;*U&nQQ35AKX5=L8@h7*Bijyhj(|M)IC(h14VSR-wom3vFD2??-%jS&XvL%4|) z7}$9XW5LN+C&a}75Z+@&7C*W^rEHS81FZgE39YF&mvmLf31PY6YZt>O`+`hLC)qW4 zr=df-E+WxZU)&?lX{giy5XuLFs%S#eo13eZ*V#_`l}Eg>5)VfE8_VydH~eVD2eyH4 z0Ys8_bA$|{AYlTBrUz^H04DaupKFulm|^5mG|>R(k6bXI45U$tHre@iqKV8d{T>1%mB74$5iH^$HLxQjeB|^S*kL=oleIx#)8-Ukan0Lo zf`{0RXw1S>t>5eYf|P&V9q18{rWBv^Z3bBDi!$I|=Q5|-lDNy5A?tB2lo>#Vf6v6& zeJ{$=U&eTF>^rNj9%N#cyc17PXH}BxMjI`gdJYm>1P}r>_NzI$-d%sxFf)o_S|fxs z0?KBk&tyxlL(iA9me)J3J}VQRYzSg>C+?txTo5LO=*jg^&P-Rhiwqeb6y;fmiytjy zg4z+sv6Q#_q%*O>oO5~j=I0PSUzFV+J501H#CC_g*A$QzU_fi*rTFhp&vQZP0wQaf z`KW4O6f_ z*&j7l^KMN)YviP_dn9rRNCfRZNW;(COBr8s@PVz+mr~)!k&Un?fy?a=j20`Q=a303 zdvCfdwHC%e!w}#xdMW9w?H)72SCO^WJj{So+C2X1I3POuP|yoL_xHYM`Jm+u8bT>@ zI--`o-^mHt^!@(mJk)x}C+l8Uk?Q1qv*&p)(C^!{Ao4%rTU^msg_Ad$4(6?=kHPl@ zj&uBQW%(Iv9o_r%$eul(%(wUKy2*vn>cNyz4JG^!20*=)%v*99Wt5_|W z#OJrr9Lm|<{qbk#;BXgo{fGv1j)iA21*Qge z4j-f)q)^<~xk}A)QOun5873_4xpJ^e7S|B9soS03Z$rOq=^X0VIc^BCoh&NbFo_I; z4McGm=947)5xALx@^NvO-Jg*n8vc|S{eq33ilGu!9aE`gtoj(hF8t<|$aET&Egp)F zDbhY4Y@>37mA^CfmjB%d8*-Nab07WqpAZc-@EVNR45i4k%gjcPAi->hgm|1J2m*cb={yf6w9j^oapp zx9?SY%R8RhXe`P_3m5bXEB+eDbLjOw?g;4VuS(Ip%%Yh3hc2uHmG{f)bo%A9a*0PM^tWIk1);|$yZYmMrn0_Q4M z7UlpNPz>k|T~Cm5dm&!$ z{@deBO#pf}-@naJsumU$_So%M0(HX0s85kU%B9kG-4aF7XT7_?6h&))GtnBH5e<6n z46u|8PlR06XuK<6k6}kt-ZvG|Mby&#G>|Sc)_tCx$gB3#M_S>h^q?AbC z$S+Uc*o0ZXR@iwOO;)HopaF>*j2X0Cq_`*#!wb*_DaYZSuA&R;0Vub} zWJ4yZ$h-e*)#Q%HZA5I?P6p>U`CQ~+KWS?7@je0PEU|VBa%~_LcGzGJ2Nc52Wm9Wx zv>h`X+~WN6xdr<^ekbx9mZ73J;@EKBGyhjFVGK=+#(j%;1+Vj5W|zHhFa^qOc(ONs zzG2u%|xOk_5AIekg56oog@0R?5fQ@zgI8|3=FP4GvL_j>`0+NxYva`dxE~L zmzR9l8JsG4tf?tGPc#MY24sJBX2&&e zq>4^8`qVJ#5y!=CpG54FnGk%S$9UIxfIbDI$obv#x9iY0k8G6?jlr-00Zd*?_M#LT z)$EJ|FlYkBVTD83UQv@uIWbh^i6UG@H-r-PofhW4N0FPB717*avMH#vwUI)-zM204 zl7sz35m!oC6{I;SiWi<;28eHGQ*mMQhwin$ReO8v$j@yhFOeKl5* z;rU$0Ka@?(^`^6P!j@}-h(I--R2-By_hOg;L(-pD%G0j|gC|df6*XC#cyqxexP=E= zNghJVsXYBpVV&98s!C-aEm#Z`PMB^1+pZ_BWO4jZ*vxi2aUAOo^x)Z#r!zHY*c z^b#@)GPOKd2>`<5t+O5rWRs2D4lD1uCX8W^>y zJWCjzQ(^j+tvS}mJTW@I?nQYSYfojGT(&TdqloL=l)r@t>kj@QK7tsaK z;mpCQ0In{&oAvukd)1%T|A7z?mlz&$>&wL77uABUH?6X3$pEO<*!4Cc)(1+XcP!q# z6C|fhcRza|KAzjNS819d3JzR+@p}<_eUz#XCLLK4$o<#CD1#TNjTED;{=Q00hxz0v z1f2qyl;iYZx}0-9>%GPC@jY(dgv?v2uAWB_h^87DTXcLvvlSg(Qg7m|-RfoDzH=Z> z-**wY7E&cK0d07w?Hyg9*Ze($5Mu0HS$yOTJU!=)#V#rU#T+;il-Q}aMmrr<`>5IL z46-Ok#;C!7IrA)hR5~nifTN*}D}>7U#D0Am16>CkoNwOofiaj$1lGSiAi)-dV`G64 zj>@SnG(go&l$rwm{@FkuHWhL@i^q#7H!!j4Ql$Le{GBu8c|NAAmp%pm?^Ph3TRjl) zz1y!5KBMtF#3XbmCxoMtGIxwRE&BnsVJZ{?Eib9ol0>nHs^L~Bd}&x6ObSzU}xmqRL>T$92?9&A{A%*F`KG|{(pkzK$FO_YuTs*4v{`?rId$sZHSgx`7nvj3wQA~VaHBzjDN z-FieIubc(fmz}*%TK-NL2D5+`6-Hh(s=p8A1j&ckAN_GRnaFbOr&v@upc^?i5y=CB zau*3kYy~XIk2or2+yJ^tDC2d6!%grB-c^8JoDyh5m_BWXFX7X>eNy>WHY7Zzmo0f! zj_BW}G`vD*X)9Huov`cBbp{lS2BJ?ipK++vaEjcgn&iHkH$yH>qtswzE*eculj3kLyE!NO(acCu`Ue$)$*f*nT5*mMtBQ7x#xV+koE%tJMo$)oostfaNl& zaEDi3Ovt96AnQ#`cpJ!5kkB=;G&q=%&r?qZrwxU3hW5|2iyE%-sd)3erD=SH4zGOn zHe=A#V6x_K^pxdUY}O{*{W=?>Rj! zC~*1f`{zqmz-gA36M1Qt^vS!pzpJk7g7#F(Zol^c-I<8Pk%e#gV zfz&Zhb-7>EV50X!V!3?JzayYM;da^>r?`W9UtaU?m1~c+T5+?tZ7-6(kmy4 z#bYqdh}j&4mOCdYsrrxo-n#9%0tniYr}e%zM4VM$v~IjKD1rP&Ph|EPgS=3Af z6vT!J$4#md8v9WFCvc3i5eCe)xkbJG8x#?rk|RL0iqY1#8741z^&k;e6RJRMXwTR>?Sz6tjXs*2b&+o8XX_x=}sfIiswy+QX&K{D>7L>@`(P0`?K{B9IB{^ zyDn1ZumwmS@U|LvEvTnr0q}s_4QN&YWM**s_&QwqiDQi!fKx(lvJv!?-stoI25u+( zTlBe>o7GM2P%1aII#NTnKWf>YX^CAM>;aQq$mqYWAm$Jf@3^5ympYGJ|Eo>5+BM4d)MiBgbgSi@eGh zj{9vD92>mac)pF~FAT&Y28tE?`fqp61bNf}CVs31$JV{Su2ucuGi`%+{W-`5=NtcA zwEi5O(WUl>PsMtl{f!)Wg=oGqGkWJ6&O^%0JjVeSB@MmiQrx80`=`ISO;fxtf|m^Z zcF_UUd^V2;l6*N4wE#a3Ux6>@uT=46`w$c|t;D?t*7g!BH6yRx=ur(!`R6ARt_Q8{83(Uw13tCo8z+f&c>ruoq(3Fs#}iEZ19) z9$SHe?`u4Ggx2&12dcLnl{J zRJY}af3kl$2wE6&@r|l2(a%^jlKPdvFO~uQ#4XE@R`T4(y(eDqs2wTWjMBtQ@`+9f zAe?Ym9<>@~@DcGi?ua@or*_4}0j2Bgk^&T<=Qv@1xu(% zPaQFuF$DyiSpQ-CTU~x3|LalXdtSW@e0$NhcKdg6UtAM6ha5^q!SM*Z+1leJQgA`7 zto8WD(3t8}n_!m!9&V7-K2IVjXEgB-U-v9ORD~-q=5f|N;&`W#PT>sy{yczaDB4#L z97}M?fz4U+-#teULey{iZ3MJKzu!Ar1T5SZ4X`xe2-5IS1GGzahT|t(oA`VLFko{=7 z-?8Y6=q!H(_;$Y>QMR#tg2JX{PwnWTT{oZ?vNBp=yLy=o!&u4-T1nviGs%TzDIZw} zogEkUCn5(K(y6w7B!Q#K0Eu+`$`52HF!+n#hXr^kW<#MDWFYmn46wKQb)mcredM@6 zg-}91MmOgy;|(@ENG?hh;UBGna6|x^q%T>TSnC3#Gh0)sS@pYj$4_RJ{@`aeBtLv< zA0h<$vV(X%OWOWG(BFVcF{z##VhA+(!QzMb(~Fn)mvM*~8G5LiO}q7z8(0cki0p`s zx_HMW)(KrHX0oB39e%w_dv=4j$`cjGD# zq~e*(2(ey$&l-ZTR)KMX;+1Kv*n`6fF^m+P;y_!jKq_X#A(0dba`wF#RMdp7T;`bj z%iy(8%+)s{9h{(;3%lf1?))t$gf9pM8X8^61ZEU!ulo9s!B7hT-4D(y^fz|@YQQ69 zEEO!CeD1$psgMp1>IKtYa)5XcV&K^^|GDZvewG>o&VUh9_Ub-H5ye?Xc0_@$Fq>&C}g0I(6EZd$X8~64ij*@10iBiPJ?Mw?!nC7 z<$yHa4Ljz#1OZ19l6MEBeUf z^bd$_yg3ytz#2iKVt05JmcWoGY_@nuPZa3eW8!%dLzNAtD`(gfrEidew$;m?G1S@X zlZ?*yr%QG2^l+7iVgfG#1uu;iDYsKJZb<{}?-a6iaP*}J6H^~FChF>&-xD#369OUe zsc|(?s~Zq+AXSeQq&G##JxQ`i)`2k}(9%lLq6<9ilyJRB&xM;uRR|@fD;b>!)ssYMLQ-FZ9{xtUjgMC&U8#1V4GFt6|B`G_RMo_V8Qo zpDGQ~#7H%Zf=A`(@&^p?To3MB#fm}M5`J2-Z$ZrYh~vKH{z5rf{R1S&`oXd(JL(Bd9cht*~iWpfiL_StqQ;YUJMr(0FiJ;pdfWoOpXR6CPdq+Wn?_f%f=5z!#n4f_sGoWTWe)fjoC09`_@j=UYsK6O# zqccW4Jww64GzT)pEskO1_amNCp)s&t3gMfteHVu95*R=`d#{nE1a^gPg6zHH|LmrB z-l&4B%X+=nG|?Mc@1mbrgdA>SGo~PKp@;^8AbHELmDvOASx5`kLwG7iu&`{=elW0g zgZfATzF9IULTl8dc|W-f-A-=+gd0+IHDAg5Xtmz20o-ODe~^w)@gwr>XYj=WB@Snr zvMrly*f@$v%pGu>+7*;4orz0#FhC%`0OV$CKwxmMOmm;v|G^+MPj;>qbqy+L|D|As z!zI&xg?0CE$-ucpK^yd9GmLyXEU~z zBt6B2o~uQe&M3gbAZ@o57cFa;C9o z?qtU9J}PAU3iG939u!b(_7Qf1bA`0Lmwt6FtO1xd$;u)vAG;*(5Ih%gh$iza&jN7(0^a}(MZqMr%`h4h6{K{Yl*2{R(Op&5(x?(!}Yk z!bdc=<4J#mACXF}D-hGv|4O7KHZy^{1K!%ShPGiRk7r5&Y6?)vO;KnD^|sbrq08(? z(yRp|sI?`%dhJ6T}PK|8*j6{oLQVX25$^@9TlXsiy(44^UDzep&p1vzIGBwkw{G`L z8;HVh3bI(1@d&P0P{CPE4-wCb%r9b&$W4H2Nh)Rc_0Uw4yd}=`S`3C$-ly=j#ZCXr zJ`3WPcA?*vt-)g5dJn#JW}n74(gISKjD}%ba9)@UX<_%82;4Jh26_^ajIWBk3l0>B zm@r1^U?|$c`roT=OMvnp69Zk1pO?|>oG%n}&U#a$(NkCOZ`JajA+mJglw_G$x9@2` zTkP$B5sD%-xj@~BHZ8Q~h6ytP&^DRxOOXHnSDN)!e|ehOd2jn|lV8B!ql1l3;6*-K zUQB*>zgkf;>tH0jGrY6=So7Q|K)dRnzgW-hhgALbJK6iORd7GBPe9CU56s<;G5h=U zczYF0Hv8=~ck+BMQn{1$ui(Mc<{PK`6wX^BS4gfTHvM(?e~`%FuOir;r5`(PdU#`U zG@eJpd#{QFbYn|#NnB+TO%2|Oyibm7W0$+;Qa8_UCe`!($pE=_RiPR_>XZTGtD4bZ z(3~8fIoVZLXlDqJ9l!kr#45=$Hp;P%n$1t*hVL8Mj|&Z%0kMtUyDK>%zTaQPovZSB z9<4@_o~Q=;0IDT3g)jFPe+A>6=h{bEL0w`Xd>Ku>$*Hs;k{d`Bjlo9+bW!G zL|R*?*QpX8>7>W~@L)gyX!_u(bmsVNa|?6}{@ax0H9#75VFkSuksF?6n-A9MLDBn%^-B#_)1>^ttB3fXd+^GS>BWBPR^#D3 zTmC+CbuJ^zp$7@7ndAAU#p%^&83GzZBnDy-ali1g7V=c|M9Gw9X0 z;>j+eTV5*(r&3mdTH94yD}P~V#1il-#o#4+hJbNW5+Z;wW>CP5&-WE%j=K2dY!Va( zOnx$#v;sS^qpK=#vtViC$<2 z+a9#^+awlkL|m7cbhwdzU}fIg=QAjtJ8H~_)=q4RGC_fmXvG8uWq|gjJTY0`J^g4% z9cs{uk2$^9+SS7>Vb`_9 zC!jE!9C)HQz}>~#HVoZ!i0Ge~RJi5Fg98mk{-fTkdu2B-M<({=MK;9nKoeygrymjudXA?-8{#ayvoCq)n8BdI`Z~Gn)o*8u?QcA%pxU4(Vlcnl;!Rh zz+HfcTTBvJaVq`Z0T(p{%(57Wta2>)#`TitWyV*2p#XY`bZo#zhQHs%=GBg0|Hmcz zEQ@g#Oe%Yq75M+2R5laICnBmxLKp9ibb6tvzx_D>SAg=9LL&m;DA>OyIkZ51Toi88HhC1rJwG0;8C!#K22P?5a2)v@N zo8I#icZE00bEwJ1QOBJtg(&}01rPj@Zd!d$kcxM#58;WQx44G|Vgw;e9wl5f8DJ&q z@EY`EDi!~O9bk$rj@}x~&Qq_|Vn5ily*0H}h8NG+duYJyMf~ux0o-l?>ahQZvGi^@1KQb?b%id-0eJOGgy3EMlSy#3S5tkj=Gc!9|$)_?hqGVhmo5;w_NZAxpy5HyM z^ZnhA$9@0t`_FZp^FHVOIc{myCIxyx`*Cx8*_Ut>L7Oj_e1pC1rxo*N$G!VG>sc@(%(VVNCHr@fJbGX5^=v7>Vbmbdu2=prHuiFi zDC@UNp#H$AMk|CE1l!$=ht196#JR+6+yaYk3y0QF!dkINqWhl$dnKiq`d&l7Ae6$E!hFkKoixts4YOsrtrL6+mI;a|8gMg2u=Il@lt$+k0o(?TBKNz!T%5*G~FOK)NXFGjw+1B zro5No2NDuc7pva!E2{}bZ$-D+g1*r{NceTQM7QoMR@TS?S+aB|465_cY6i)Li+?oT z_9(%8XFCOO)p%E}tWjBNSy<;_`nE?SG}ywur%y@MFoPOysO2eYrUw~N>!j1}MYdQ_ zLPI>qrKuYvt`mg!8=XjzfA@Ca--q+H>^+6h%ef5t;i!bMPdHCYKnVYx7D^YcJBor! zsMumBQ;HCvY4#ni3mOA;5z0Q_D(zId4#rQLTLRbCvLVe7^dg)+4}95XFv#&zxTuW9 zzYkJxt}^lmF|30ta(jIPrbr|*g5Y8Z1={07bl=hsLM>~`d#BU+2xL;V6yhyk5uWV? zFZ@^cE2O#@awnKFrDt+;M;m)p=6WQVP z23yTV2iIrtK52HTh!7)v@?=VeUx^(I^ZTGHPy2*mMTYMu+a{RGw?cnTI_)DXMU5a_ zFb$^r$=UXknHT>;z}N-kF}nvI7qw{V!ao(Dm~Q2aOB&OEVGhvnoD+U?75I)I3)TZT zfz;>2vM@D_vq55zN5*y&rO0CY>SD%LB|3FG)UeNV+~e`4>Mb&$Nsf3T+VS#5<~T;b*I zTLP!bjXV8%{pd#zCWN@Q&ub5ADCYbsziMBSUE#C>%|K_C`yZeK7TaX`;eE!iH6MAN& zzbWw^z_W0A2q|TWlw@*6wg~RTg98!%uV?lDb=!momw<$kh0E(~1d&!tb1cxk1^i=GiSHPGfjMTL*q z2K`qiDZWI=Eaz!%Kby!7n7sdsq!_kM*LX2kS98Kj%eR!Fv0rf!OW{RklJAeI)DW#- zA3)?akgYxI>>AOjHaXv{32H2qlU`-3?tQt45Q9g}sj2#vO-gx(q>X97ir(Q`SG~97 zNBmD_D7OrPZk`AO<)@UyxjtYj2<%}`^7mhpsM%cBhwIBh1M78F`k~6^?QX3xP`Ag_ z14Oj8j8i%|Eky;S;~oIbpG4C(&^D5{#C2Nz@JX`@q&fV_UibI{9CUyjnMgqq2Fo04 zrsSr~NbYP1XnxkX<2jbAMN$8v=l!WtNiDhR%WjSI_yh$p0LY>%r?ha_So)v@8KY_* z|Jz<5bB&YDzD9ckis8cH=oND4Q=kEkxh9tCRr6FG0m@fO|#P zec$-=P>@#*DzLrkP9DAUb0_PH>g>bP*2rCEfTp>;XZXI850WaT^0i^WZUPq|&-#*ZwnZ{e zY~;Jsj#2!WV>=kxmk@l_lm_&#pxH_q#gC@f_-Rw+1Q#G**x8xh!>_8}yf;j2gIBKa zA-S+q+dDt5PmZs?v6Y;$b);2zophDfIb{)=7MfcZmT4{c#aW*Hsg7ZP>FXN_e!taUc%EgTR*hSf1z%^t58tivOXIl{E zX33uV%~B+*@!8&W!q<$zh&cKe?tP1(N3wj{wA!5xav!{0q+Z1_GnI3c*BnKF?@Bn1 z%hn4HkhS$`i4%L(d_GI3RP@R(ktMc&%*_dz9{2`kT?yLetCI=$?pVt~OYCs>G}H72 zb?ibk=f9uC8 zpRrwP7FHAf)-2iPM?{+6l~ju4osgGu%O&K2*#mrS)w*Qu|27d!W;}B?;GeOFgIniX zLw+AlKc{X5uJ8A?A2F-7AwRbdx8*F(X$yj3U~h~QcT5yV&mIN^FJ3;^iVi+r8@2To zH@vChtt<;j;vFbB?fz!0&?~o&fout?p^F2@al?5Sw_>7gIQon9|$NI zsE{pkc>O)VZj!O#BYvw`1(=}T`APON*~-c+gcG?|bswl+b{v>>DSGMVbk0@fQhFz_ ztb^l%{RSqJ0~l#qD^4hr;OtxndKBI~7xEyk;y5Acs^!q~Ha4lh@g*+n95AKscA)HF z-n!n%o)xX7kqV7~=t_+E(o)3v!?=`k8cZoKD**@Oy+`|=$ocPFTL-$^FCOUbE=K1s zPJ!ZvNwiSeL1W60b=~Oh(>TI%F9@H2Cfv+`)%t!VX`!7npm=egx#B3e4UEPY0Au+Q zt1L{w(0`Vb_|tC!T$FY;nOtL=jLS2HzTqJ0`bkqqd_wE#4^aVnMn1Ga778SJOcYEM zc6B2`w`vzJ5SFEu{4=8uI;9~pLFR{rD>J*!Ck8t_00uu^6#!?9;T`zPhVYwgAoy|a z8px3si^NR!PYIDPW*q`KP6j2t+RrdDu5IFsLa@lmq}Ig87_m9p-1R=y{(apoWRY2x zm5B~ZrKgaMCzhS-&dQw3H43O<4Rl02X|$^#4SbR-3wJ~ScZQot0g;_elmg1&wi9$f zWa7j1>Km)7v+Tg}KNQXav5327CHZ%H&ofrdN+P)~gN7LOntyjUUc`dJ@=t?~i5xxn z@3;B0W_={#cq<6yn!V0$DMZu4F5X1Sr|Zhbg@UBJH>n=NjEI-nStQ0^0lgIVguE&?^G*%vFTA8i(pp%3SHcRpP-qqQYQSlQLG?1Y; z2a)>X?9%Z=7vEFWDWWgWKPxpHCrw zJ?`)<$R@~@gHAphx_Zjj;aYtNo2=~?AK=KNJyrrh_4~?C5h_sA=gZ?i+o$VGLUnc> zl*@j#@1#dJr=Xv&sJb<^ej6c#PO0bdw^OTg;g?;I@=X&;>Y+t*tzS~0c zTr<2z096XGrJ^fFS-$?uQS(rg16~@G0#3O0T+up#OEVIA5MZ*<$>F~})s(OU%gfbd z-j7=p9)AkbY`03?D7DUO_-dEm;1#M3uy0SEc-r-#&)^Z&wGPhs(S(C4la!7I`7O<>fEH+M}N+k z*16(();30Etg-F`dw#`W&|qKO|1$HgvWB?BpT~y+NDNm4~$={W{Cn#NZ^Zce?K9;+3;Vg-4#{;>Y@M zauYZ_8l}(D=eBL$CS7*<0=_fD)7_B9UmAkck&CLa0KLJ&` zpzl{E&`M~&+zkoj5TLV7+T!Kd`jy*8+2Ih>dQH~GIyJvcc(2D{bP@c<70ULvhP>(FOSJet~(%#mx70FlBO~g7>%3WM2j_}}F zSXXzk@jmODGw!@&hXCS@&P|ClT}SouNtiH0j)*h3M~-LBDEs66#CvJ967!P@AbwlX zV~=Ee4c|aU)qUV;{-rrl-&n{TLCu6lfBsAaew^)2;;}y1%eFNjAu=biY}yOq@}+pd zM{&W)iuS_~N>9ow=2ezA@8nwJp9p`IJ~!ZTIoslCPJiEZYprptgJ!K$y>oN3)_8}X z^=@K!HyPSu?M_&qG9o|YN0>qWz0BgtsSkKnSGo6?w>g@;c}DL>#Xn8dP$#5sCwuDh zwiA^HBhA)p5E|KJ=5(==Yxj9k$&z&V>=i=(#^eRrBC^p41gfDh`J(!4I02naTaI~z zOgl2)*A8EQfm8><*}s!x*I6QuR{Wz|&DW)j*aYA8lWdnSFPVQO7mZAkM!w)@UQj-J zL->)s*`-}#_%;aO@4v zIz&|nb#%^MmwL4X5$8H?zLvx%2=zvO!=ffa6R$5s?8`R@)O1A`hpRAYwDi6X3?$Gc zve7Th77Uh?Ls*k6WvIHFmS`C+{mk_&KE!5SA|q3BiS9f?R0r*%a`2H zeudcOhjyJ2W-s{Zkx|TOEt7H$a)&}mI%0Qh$`A)xO1KYi32|h$pgCOvnFe#gn%=T& zHzD7zONMj_IF#COo&_yF?2~7D>^<4G7>!!`#D^=-TBOdX9hoaz&?RWbt<696Ty~*~ zgNcIRcynIcMTA(ClbJ=ZjR^^zq0U_JGvZD|DEzYQczq5HT}&5t1szU*WA3PO{h%DY z+KtgZR4e6Y+;Mq-J|Lo3Nz$;rmC#)knY_ZDqhX%p0Lavsk|~=KL*Ge}sIIKIOGc{g z$s^{@jTAz>t8KWgK^|NL(VaVG;t_d2PZcGHfuvoy$F0g7eT)=0S5)-}-=F8Su3oX{ zCm-+Rj-yMexaN7&gARUda8t&?$#2y%-eI&Y44g)?)iJvwdCF-+hWMyTc<0qIv{~B0 zj@8kWFl9xHc~fw#xb)^b)al#3p3u9x$;`A@vDNzL$FV`(!3`l4wL1I8 z8R3ZAt-kk4c)X@_p@&6AzGjaMFaz$=_(+jgA^Eq`C@sA%M}LOcta+!YJSq)vC%bKWnnr9I6UGOzxA0hnGD z8TCY?r(2p51F6OM7|Cg3T}h?@v4;#q?K<>8Cq-}tgsZk~w_Yr`A2hbHH5cizG5dy; z!ewWR$>a7(bMmDpNLsY>)d*3I75%K_=Z^RXfgDp0$RbznV&f_jNVT^cA7i^;Ct0Jm z*Nxuo2&oZ=L0V?9c!>DSpy*lI8Z|;S=*~?3sCZ{|)x~Q!&V=jppBe8|OZ9J#F26ZG zRl{=+X3zL`mY|qYm9l$08MOM4=CMzq$6WcaH?F?ow8Tdi0Vyl6ioj3{k(yW4IansI z^YRVjsCsgcA{>GX)IFvNO$RRIV^@a~L_3tzlZloXZfq*%@RMK!u4sYBKGi#nungcjOSE+Q4||RNofkYuVGjR4X7cGO zZ}|e?T)k)>PF;J}UD5d5->?vsq{NUI_L~O!78*C51uq?UiCL;h@64!+^l@B9u{6?hRg+(9ezyR7^DBu#B3iniGF^yT1AN0&TSW>())CU^{CUC!4dO=S;qvx)U9i zj)uC}Iz^U!z49UO&!g6@(Al7d*S3Lq)Pm7&bfG;BD$gBT_L(#?t46aB!EF0P-(&Tj zhI$!4)WX&NWcoZJ&vHZL=G%w{!6J*zC-2gvxcTLle%HCXW^-_<&}~Ut=S>nsXJ5Z+ zIgxJH{P3tE1APY4BdYXyVBlYg z5Y=In(Ht+W1vOyHyL9(Vc!Kw1`WJFC_Ju^Y>Wz<)k`oH(GrK7YlKSlwf+9pq>A+y{ zNHD0r1#i3Z5&=Vj8ip~x4N@I<6YnKRqDvm_PjD~`wsmmZ&@uX>B3+1Fb{bKqcA?!M z-z1~HB@l0wXR_SFPrndFhUTDNOiw5VIO7vpT#i0(AA-px5A_*eEkLRhGkYHJVKtdw z#AjE>Dj#{)D2V-I)zCR%n!oZ#mT*teWa&8nls0x-c7yAcTm_J4;wFwYBQl6ivkKG5{sGpv;=@eF5$t(TNI6k+Pi4xeqA@@SFdP!4|(oo-23{FiyC_ zj7gq|b?lVjjMhd$Kz*(wOs?=FRgO(E8zlDkgNvf>((+1v&J+Fzx= zmqLmjfKgptRJ*KBbohI9a{Q<*qFC#o5}|0`;g)R(9!dXV1ZvDdylJ{_O@Rk zglF+6<7fkm%CxW!h=f55fB~9p;Your-oF7nx8V>t5Z;bj{a5kI z^#KS8Dgc0uEV@F#dX6W4j~6!Es>rsOw|i7|H7zo(cs`;zLOf;bTEsCzTt*`jR}o zk~9!Q3Uad}alX-I(c&V2H~iFZ>Wb2qH!SwJuo#3;sB3S}*jv%X<4`5TH*dRHB&osl z#UguRKD$%~vxsmOut_fb3xGbiyc8~=$lPW?TSFV-V&;_a7%i*eM@^{_mJ!JQ>Xe#=62-meZr$L4+9sj5BWPI|Gry+6zPfiVftW4KH7UQFrs!b#X? z6FnXPEN=UVE~;8llMLrp)DT>23hup!*esh|v+Im}Mo&99&d#JJqiCmkj*)iV2Sq!q z%vzEsRuwb2c*C~%*r`HOIc$Z{=njm5Ip z2+P6`!YhCQUl9dpm9dwO1h_v-U>VgLECj<$WzquXXbE|JRi^HkxZxdSzp9Rp(rV)= z(vfTzL{jO>Rm81Q!jb{7snhmER<(wlVLOF6UEB-FD5^njtak1<;KuP>r;B|dIn1Ja zO`qP%3s^<@Hn5<0T~sluw$)nu!k^Vyyb@sV$UDHAr7x&%Ni_jcaI7=EuD zD28lD{FlQRr|op+SZpE$k?eFu+xd!csXvS5md~CV#~l|Ey~Ir4Wk=>yUv43eEP93N z1HO$j#n5ou?itpng+kF(s34)xX*mxCsWTD&cN(Y%9M7kokS_=QRR!G4DL7xXQsHq6 zs;qfpb%y(&t-owWxzr~J``W_Xi2z2qL&mQ6)g4h%7{$hssqhwGNG-pf_s{9?h#xrI zlvxkCg0Q=gaNv?7sY7hJoUaSn^-6ur4OS_a{TKir=i@c;-MD0@n0w5>OcV_5 z{{{&F&)d`Xm&bt7Wvak)h%_0E{KSPxx|)YRGZ|z*XG5GSKFBktXC=_x zS-J$pD@0cC%@e$nMHW%L!9)=IyQ`)Q@v`Ve=K3z{g0HVb>KCI8_EIiq>sd%dttQ-s zZys`G9>x$~yz_+>es%OIIn3x81$8s~Q+17D%_8y6DC+KhMhod{6G3cjyA0INYWgLF?cU-(p}N1HMtbgCR{-a_&ES+;Vm2sZw+ z0EzbYLp%Hn9Mh#fFSL@n|7J}%Cmoj63n+h4TC2XI*eFGxN%B)5!Bg}uud}uqW#~!; zzpn(rXjen&5`4i3#JU0{NHqz;NH2?*p zK6<^#aG{sOXG#HxVM)ZHx?=9TjF?$`b-%jv2}y?*!v$c2l=nEpiYzn|gg*Q{V+fd% zh)0Je%2_kxgQLKyZv@-l_4%}Y63BJha7c-c2n{mE6eWH|kWI9qu>YRmX`VpfV8 z5o~Cf?c*fTMsIjInji!s7ZhOgi=cmg((WVA5z#3ajd10r*$_)CB`Sj10_j8+`6a=? zpEUEw%0EINaHWbg7PyUZ4gC$kYN;Nz_2oi~7$1*~o^Qx=WRRx{0$q!b?uwofHX7hp zKGpk~%;>YOYEPnvQ)tl~-T^BC$`s3bE~fUqf5U6B7&$)m!X`qN(Pc+DZ2Md|&{fVD zec)0H%Z^_*RF&x1-5>f+nA4G#G+btA0=+JP%=afT`;_s9gvmVo`*$CoFBWz-p*P6a@>gxXqQK_Zr zP5Bw2iD;z(h>Wv;aZR~MyM#L#4o{-E+xNLq&EHg+giQzl0o;p${^lYXHk}RQ*;0mS zW{2_Q-f?iK6MNpS53mhd(ND1up~|J+{&6t*D6^4LgXRm}vuN4-B1=In%x95G$|wUxMf-uCYCvEPDKbHi5K8OvYC_}tt- zn;j)?ce9D~90rIb%s#2u^M9=2mrTu+L(h<9iOV*TbV9fDRlyK^NWY5j+W&i2rk zeVW62{6Qb0y6DMd3@-x6RI)c}G*6hrOOB;dcZ{k*-8=)c+6BWnLCiBZhesr^Za^8b zj#}xzx)VSM|CHW!VNJf5lSx>jiP+TE(+i_^>3Vn5MLPXX>2+?yaOaEH^uo>!@y{s7 zQQ96HFMq%1r+mD5virly@Acv6jFbQG<+}|b)9)TN9{$=Jj5iJ#AZ6g=C1p{Yg!~xiD2$3#(fK{Uy`P*eu14twlUBVxnUZnhWbD)e~wcZStH`@hu57ikOYc+LCON| z?MQn`-NO`oHn`_@zOe;e64_Pyg3@pfElL2~ao0c`ryWTkrCe2?ve*qd?{xQT_?Z#k zKjL1!%3ZXehAp-^M!I-gC!czh<~=!y4vxnN1h3Z=8CiLFO2s5Pi*(peO2aE-)k|#` zw(I8R%TX2IVh|^+#lRacDoN=_^Z`hlODEk}VC z+@6<^K=5aNwixxPzIvG*@;Y2fDZOHR-M)0^FiN$Rc;CH*TJ%bIPsA{x7xc*7fWPgt zUg_PkGt6>*OO^#mBj}u5hc`=U&-k3BMOZjAhtLl#8Jo|x1KHd4dE4FbqcJ(YFrKGO zDDC{ExQ_UOTW^WsP4?%Q8@#|}cZKJkCXUps>6b~&Fe z76j>+R5#Q)3zQLW#!B4{K|nLM;=ZQ;y=`TLgq<#@>Y+a6pyj&yO_S0H+c@{|PZ+LF_f1 z%MchWlWLwd5ORq5K*aN&R(<%xN#^QY`{@dtx?EEg_RA5J5QM#DBDzR+UoOXMpo#+G z-AesVq{tAN3$6(zWEj3mx4x#2xvo!Ad(JwLs@nXMtX;T9#}6MtZq*r<=r5CoucZvh zqZdGMR_`4*r!GyB^DKD@UX@=Cz?jjt7_yB~xng^!^i0#m7@_&(2NR=^w?E4}?@yhi zgjWXW2gERv%YSo6^Rw?vl%;yW*X_h;$aHe$ENI7D{7XPLtM`aX6P?rWGv=31wSpo9 z5ogx!VItbyAB0`YQ0T<}ZVIFQMdedLNQ<2EWJTYv%4W9E;O0NH8XCj!CitUJ*{){m zTbK3QFL%fiAUL*M)w{LX}{sNg`EKD2gL4IJX+r?(4;y4oB`$iMIVv{<$XNu9Cm zay>(Kc|zJy)#?m%&a;@V8&9B6vCEtEMC!-(ZNldu5TlLgvX6z)Wd1t4Oj6bRPQP>OD!;^=HM`b$x&UD0e?)A zzQ9?#MdX6*FwLlt$mbO73q=OFTXSfKvuW_b#mNH;WlFs0CC#mF^&77oR+ zOVX+4iRnWO-Em_?Al~DSBJgV3V}T!7vRJT)Mo~|gc*#+ML#T~-3Cb-R;hc6ftwTtG z#(s^op-YJ9_)20xZ~)8$IRx!l4f2>{e5`Jndh$MJm1^q%rz8og&|_3gH-3zCTj`?& z3rt$TS*f1r;TR#`clTilS5F7H=6khReHNQw(Ni@2b11rcg}0E+KOzjmqgbS)U0nBo zP7j_3Avo8y=oq#iN{+%s>wqpXC|_Ma7R8i=N# ztA($<6#=6R+<~||+ufS~| zP1<4hg0hL~ksoA$n)7Qhn5Y|fK5$!V#zkv@6x{wBIgS*Nx)sEn>wRzaf_da@`uv&q zIrl(R7@g1IUFBM7rtQG%%B`vWe$z5VDV0#@V@;~42Y@!GA^o& z9R~5~K_5+?tI=@K)g6mMIz1?EBF+$VMw~|JQ1&qoT!beg*dQMID)UQ*q=0R(Vhl|0%T%&e(5gPUw`092HxtNxS=dTj%UQeT1|=i9ikN4*{%;5 zwN%ydyxhddn5ogFVRXaFjSGNi3d78tIt;Q?utLvkub{;uBMZ;1xUr-1Du zS7hTYpleHDY<6e^`2diuGyXF9cAMVv>!Q>HU~0LPI1(`^(&{yRmH`GU`ZhrI0xET5 zmw+PKf`3yMFHyp2G)9A>)kwT|UPd)GgAt&#c@P9F5yEou6Pq%!Od>&29mK5R>sX7q zep-A~_dYfB;1D{8i&3vuyDL6X9?D34xu(G*tW&f~(l6Fs%GyLq$dA+R8jIjbppAS- z9?)v`hO`LEk+!EuMsXJJ>HQntlFk?b1=jn|wFX^;iq87Kip>^D|D_O;%Rx%rJT^rG z4(fr@msB$J(-#KI{d|8te3ABT<5$_(qSFwaV0%ZW3#uqa=$b05gX1u$6mZwai#i{{ z8{mKfwcI;PWxX>2q}pF*bgiXwZLG<(gmBhBU62ZaY?ezgytE6REf>n`4 zF>gno7&0~&0(;E1{t9~`7*k8%&mnkMp6k>hjw9O;V`LQ&+wTUcJk_oEFL9Im!YG#_ zT)4fH2CXHM?o+ohWks?}dyzka+{!mRh4zFGq``40jGDAzLJQGfbFdK8Sxfn?+7YlK zoaZl%kVZ+UIQBl(ER6^y1<5ifb1{2*|92w8a*Ft@wb2t z*A%R?E6j%G7^$osg_r#cy~7|MC~@s^mezCCXg>1chBrTkK6Oi}1`jfyO2@j^D>LVEEDJlY6P8CN%jBgB zaO!bP+vrFt{?Ph3a%G4+wqvjSyF|kXmOA?A&{EsdTkNboZc5k7blrpyIM&_540T53 zoEn*tmwit>7;SHj2fO;S$_=D#bZFaFRz_|w@xs3f12 z=2rC*iF2hEv$uVJyRomf+?R}&2V}s;+XEVZ@3#GWEyl= zi;v0dM;zPK?~_M7t>1diAG^%e1*M++nLY4}-~6$n@n`e(?2j3@h0x}Z=GU#$2T!@< zg9hG;eD75FexI~rZll>{&^BsSi+WdsbKW_B++=Oz%Z=o*%_)iSrNMW9et2HB5uN?B zyf_`|{{YX_>loVbCpm;I{doUf$Dcp_zngnQj&pj<;ukzx!oJ!ZJFj2nJULwJ|LGJu z>i^2)V?%4uUGKYh&z-D2KQRk^JvV#soY611HQ0OR*6-hcrX&Xc+@13X^$#AK+5CC= zSJC5p{sa3*I$?CwOSbJZO?wZqUN4&t^c)&&BLt*!esz>I9*Qc(GsSy9!Y@j!6^uSw z{rLT=WqX0QrHbNC{~tLgcAKXsWz=y=qzu`S*3+dIzcQNT2H zQ~A8`X8mvH>5{`>9l6LVz0j8PJ84RaA^5oq&u!O-aSY;tIM!AQJ+8N_7%!W1zh^{3 zn_o|_AFJfrXRtJ>uf7R=JEFH9>92o8ppY@$EsF8^4$ zZF~Ng+-LES=}n@=BkI{%o|D!7lYo~SAzyEwvz<7zsJGR+Pc-Sh^@_UbP`+EoJV*#4M(C425yI({b1j+3NKDYX} z{^U_;e_kAJ_LERd-bcMklcda_vfJ{rf<9!!7rvOwf9vq+GT zh4t)~$8Eo*r9|9XtaZ!5K~|N8j-vcz%7%Xr&A_D%|= zhQ1$jr!%PM>(^FAUo|&R=PnbJWVI0+ercXo`bBHQ@#ovj$)beC`D4D53)3g9n;!MQ zzrIFYG>dYLHdj3qFrXi7gkB~v_8BBfeE-aA#QWBmCWo&)4e)8?d z0f<*lhwz3jhJId6-%yf$EV!kVu$>o7Tu|NrV8iI^kZHEks?XPWSHjLT*OGYAb{&?w z{O5_dYZaTdFQwEN_wrWsBp#n7(<@Kxw_xVmmyhI=DAQf?@9Nr~oNDBb4;VnUF?~?i zrQuYxV6%QKvn{$QuUKNE&vvl>WtIJwwrIlk>dn13Sr?Si*%w;6iyz7C9}>SLSm>z} zDs57X@2HEqvg0sCU*E(cfDLcy^_e0nAo-Rqeuy0`e&kKEPW)0TZ8LYw&1f4hYMj9n zS5b(QzD53KqBdqVfy`g!mNNLM{pK(mzc2AP(f?ZZ;N(<#P&MzqeDHf4o!qyh^V!mT zwxY3^?{5(3vn`K=YRzM~?+dsPwx_uo?c&{1H=5S!2o}M^9AVW;yXf6X3P`HUg^m`7 z3>eZRNKXIpyQTV_M0sM!?7h#mFTshrOWst!-V|Oq4|c?73kqN|O8z-L^NL*M-S>Ol z@DkXoU%b0Q;Eg}IP(L3p&v&NSyv8)Qd(GjHW+n53w5As6T!RFjk4r+;Q`-m3?*F2B^&#Bc}ZaSwl$-3Gu@YucJ z8r%5-o!oGVAEM-=A-E;iBCyDwq#v09JEuQuXU?;wcm{*PHT%Cyq+5LQjuLA5-)0aO zvo-dXkL=HHxr$8Mv}R$=J^NEbz>)3o0`x@dhJ{OzI> zD5(!qgIzt&{*}i)_^nLP7D+A(qLXhwknrWRy&0>X(MqtWRR_KT9?wz4K7Yx?9pX77 zC*&ZD$x--J%qnFW+A23y!nc!5=Lmbc3&!-J)qVdUp0M|G3SZrh{hrH}pW-Z_IxN zGLK$jz*$xqL3}3HO!2i2>?FZo0oq9>py2f}3b()P7N@Usw>YIj<#s$EC-<2#R;tc4 zH=~@u1q)QA9D9twXnAL`z?z19KD-TxwK|P$DWUD{;&bG5UTURO;DaIBdm77=L-a|N zxX}1@qzHZzxjN~0K64Q^__J7Dn_av;6-)7@xbD&O<4X|jZ)7bBonGOK!G67Q2A}4} zL;l9xkXvda8WO;C3(@jVrc18#9+)PsT~02bzypjK`--L_z$0i0wfkKA$N@0dq{5LVEHm{lJ)*Q8$P(P7_?N3N|~A zQOQdV3cv6k)osw7DnaERjA;@Rgy}%#{Erl@!T@-|%r3}U&Q>=jkmXkf83tt{XAmV9wqvTsiYpM_En)%4o>Ll^ZT1e83^ zRn1Y+#DD&CUG&XYkK^E0OP7kQln(mwj(ZcmC&EGM>7vro8=X(_bGK)|#|IxgKmX{? z)Ed6I9b>FFz;(&n#CGiMsGUYV>d9cOiw@lb_{oxNTvZKbE-Is+Tqx5DE>PnhC5Zs< ztq&{d=nXSQ(kzXWlq(&MwJ~|5RB5pI{Hx5r51U$Yad!Cg2z>t17qNw`OD~8D7&ESb zb>4IDT@0(hUoyF~pDCwfl*0oEqWxw98TNh-(ouk{S2C-8B-6BwZtZFXuY?<_?&v79 z;(&fRDt*(@CB|`{t`4#TJwV}s zuvm2E%LU1??(7TM5=o-udJTI2tspRz_bdGK>3K-Z{My9XcWJI^M~mIqZ6D0N&sr~g z1it$-Y6*7wOuOB>2bO;?N(+k?BsQsXQLg#qXfas9%T*rpZ=-Nbt7$*Ewk5@gNlnEExt&OS$p%>D(H&h_r=F`%iH&Y3?Dg5fhZ6Cg>6(!1=x0q z+QJjL`=<|}#u#1U&chB=b}XLOUh;K3q27I2^rH_<7L)}DO;XO8^A8L3zV3-qjrwc> z!pfKcZq!6`AV~@sA!_n44k8M|Dpb%JdS7Lj57Yw*EJ>T*lP0H{p$?!RkbY%`-WUknwMyt&iQj8a6_IeLjBlT*&Hf zO*5)pTm0wK3@h?ci6=DbSxMDTGeBcwb#EE{`)8)tkIy|lE|6-ly!&+QsaorXO=y$F zpAWxxqeC;lE9Q@)&E`G}vEOE9!-(g#E{JZ0(jk!fAK7v9*5TdGngNVSPl{=hfH=@p z`!gmwmruVP#qx<_ZtA?nB%dk>dhQE@+!=m%vSBy(p{mw|Q?t9i!#h>Hch zcqM+%Q={m_Y9CMzu_iDWbdgV_;nSDmWy_WL31P{S%R2<%cZL0+@L52hhf@L8Tda~uZZHfiqqxg_P09IftiI7O(ET!-cUIn z;gd4>0L7F?D~$Zt2$&ynMdK4u%j1WAXj*zYl(h6(=*xsspI&m#)$k=^A5W z`tbkkV7OeQAXPH@?D#gcR!V1KK=~QHc;`w0O^`Sz@3UyJO`z>fB|okqrkG=HYr-%~ zs{cI;jNlD1T%kiCTosfo^iNsT^x$vqw-WHlvZ!C61ptU|Aohtg<67UBlTMi7;o%K&L- z*=0#h!Mo{fu?-RqkMWQ3KjLx~C*or_vJO~s-PT!_;pMrC@42cE!%+yG-s`&wae|X( z9JE7w$-9Ps*$wEr;jET(r`V3-nqc`)?0>|g<*pA5zd*|!nh(R7&y`oBPhSHUSx0*7 zf3KwY{G|vb6*fHE(#W1xLJINN5)HHfZTvnb$LKL^vzOxehRM?o2v3H=0?DkDOr$>k3R-i$Vz1m%&7cjOM0V?yGyQ~ zbLsq20gT3qOb`yxb)_wF1}7o}3& zwq^Hc{dBQRDg*5j|X6|1J0ob58%mwJHPu8!h7o$^!PHEoqCukuu>a(Y6Xn5&jB45vVPuDDK$`S06sfQ1Uw46dK9A5`5oW+c4(cJ5*gps8iM)OT)JR%-6)g=~*gy%K_oAw?b@N)qWyV z{E6|D{{k5kpCobb)-`$nNF${xb;R}`q1w3vn6B)UPNlER_%jlw+y~4YbzwUM+%%4k z9C=`RirfLXBR07$vWwcj2tN+9&Y&@5>luQo$&UwP7KKiiGhIMmDF2TKiK}UXZU4${ z57X6lsZ)dn6eDe<>t+z-uYkjga^gUi3~y=gZKk(pOvgc5#C0|w$j(m#3~&&Q!H+{)3qHC!FeagEaoEOCHb- zcy#Rk)6Nsf*e6@3Ob+clURVPO>71h$g+LV{dz{nqTObP#Z{%t;qpz|}7D|-%t`%QHW!39fI@NO&i`#u@ z7Mvv-I34Uib#4IRg5^gvw#z6KC@k}eUBDh{$T;WA?2!3`M4$G58bJ+(*?RszAGl}` zmGkDzsi6W6hYV@JJdp7v@a*wrS*J7wIyOr9|KaSt=AaL$RMvVH&`b#@~YeMr&opZ?~raT{leZsw@Hk==CDwWvH)lsOK-I?tnq3 z@)0x*bW$JnOui^w_yQU`MnrtvFhpv(kW=R=3j_^1Za z7}L<%>}J3t{Q1r6nyN$hv%t5p+0eHIJ&%ZLfwhB9%OI{(bzMybP>eCTs}jNch;=jo zA9@c>2wh5N2}eaFSMbx^+I0ET;9p9mJDF~}?RPo_IiV-av9j*Q{$Cyh& zOTGZZ=V%{RRW<`UYlJ6lJ_S3#@IC*AcP0?H@mc_c)Daeqy%1~i=U<>2l0EmY!z;S9 z0m!+c1CcaEZ0`*4G00Sc!0sCy34Xxu&Bd_;V60ca1AT6~94m{5%#b~Fe;UjNc23#_ zJzRhljPf*6SJakx(0Ty|35-?`%@Kc+G-k$H^wU$d$cnR@Ztm@#^o>F z?rdEj{feKwPn|XpJCD|*%B_}$Vg^Y5z(u2xVSkZ8gE5}6;(4&6%xz(aM1Y7<-%bcJ z=B90enBuklpAkk}%n9-vjPk1q9{bOprkJWV!|m2q-poQr6>v5H#GkHycg4u1C+&rj5Upl(32524P@N{nN1uT zuk&~Wpp$^N!%s(HO34=|`Jrb#pL(%R3Xks~nZhLA3vhO50Q~994k8LROH}YZxt{y; z2T);Z0N_y(`7*lF+*b?vt_*^WN*f0(>9aWu>Jp;Xb)EFo45@RAnBQjw9oz&$7Tq_< zVZVWn@)h0>t!O)qK>)})Gh+xxizQfcL3|9n#@MG`29yMI?hX*&zApTN{1K3rYosH- z|6!l%*j|uw;o9-w(eKC{Q5N@Ac zcZ4v*`&BI_uV(=x)I4z>9?!Ri2wS{@0nR*#;LR7fm-uUo&kr)84_+PwG#gy+<{j>M z3E3&O*45o^f7d@H15q(>EIEjPhR{j2P%{And}<35OnMpcgH*3Cq%tHg&t;ndC!Yy^ za9yw-+#1uE!OPa(m3jXt448JPXcX`}j%Qrg7uT6R4bXtJB8YGFv=8}o)iao@}r?`4UTI;Uw^Nhgtt)+V@xU_hsj zQ_k&T8jT#UX{+ur{iSx=O2>=u*y8jtke;^!nh%KQ-zDyOLgVSWfS3r<5s+*)z$`|4X;_LL>xFI#{>RZqg@h`P$*D3BV9DAxGv31=v-(q z6jD`u3oHn|#1I^CmwC`n!EE3uZz$e0VVFF@&j^dh@zcyqGzs3;h7ca433!@xuxkZ) zwwl%GHBPSGKeD?G?qL_#PTMxjaL%MF9gFeDtBPqQmJp7itJ*M1OgpZJw~`d3+iGO8`MgOb|i^0>cn-G3WO@_Hd2DWaCn zRM4oK3d3yqxH&Gjj299l)7W?}fDz%KX_5H^S{uM*$lQo6ozuX?d$yX_3tpSL9(bx2MiVr-K03*4r;4iFwJ5aJgR1za~!|>HJJRh z&VfNIki(lX75%g>^xH?IDv`9O6 z)};?w0}DcffhLIQcDUHa++N$4_O>pw=2HAF;7WFa$X0)ej9~kimu%`FB2ENm; z4^Z*uU_N$K?=J|;Yyu=H1R&;4$GhEB-)XCYV2c`wVfq)8jS z-#mZ;JJ3W4J2Blm?#{ztw_i?6=6g2$z@0(7P&6F3vp;5$#rbSSPOO>Z;`KGLD-XW? zTRzp*=E)eaMkRfGrn)pwy*B=vW3ElJ^{t_io9)0sYz}g@+)?*OPEFyHi8t09{Tn#R z?eAxY$2Y{w%3_nAoPc^^{;&hhOxZ3@rI6ulM_3}l*$>sL#w1PBWE2F zh9a3GKBH!OB%Xv%;dUOEug+K<^T`B(>LY~@PV!;mP*ZI8e-s^uo=mLe;_914*ia{0q}_p21EI6FcO*JR9J4Y|ipj3@ z^)V(M+Rr+G9XSH-llklz^XS!e?k`=k;O+09I z(>t&y>wY+=a>BQ+lkiQ|lUdfb5TB(1rf3XzjEr~PT<^`&>ozrkzZmQ{?Yeq2fy zxsCiXlUe`u#)6XEjqo%rQt*i!2QEY4&0z4uqY;8fS(hGbe%)U^NA%n{+He0deZGLI zmH_9f%4;HDd8&bba-~9hDH9+2yk>0`l{WckHv@v6>e-!JyjPz-cM=)%2Dx~xy12Nl zNZ^fC+cCf@KfWwjS;blq+Wqbhf5hlX&loi*b8Bsz*U9x-n#H#s?t2|Yy?oR=w&X9& z-9|6VZ2lnd`J?l^;N(zAy9Pj3?z=P`G|HbYTxzg!4t$nidb$0_T86=on44pUD&KO8 zXWxFm>BnKWh;|+@G}`(|(Z1Vu(=p`xX4N}(M!(0ezM-Qe<&!&}OZJ|T z5zx9(LihC_Bd1Kp)L5%#iX-XNm24v;p3%JHE37#?I&TSGeh&}4@W^iH-7lrA({EgQ z<8sr^;p^I`j5gWtqYQrh!*<6-&VdgR_32KzbSxSQ8b_CC`X2ZXWTui1U6P2zR58xr zhQXM(xwbw+oLN3D8z5e|#Lk}bxokMfIdJucWZju9AEb!aTSwM&d=}3iOV*tmD%w9X$~g1Nvxem5Bl^z4-x{*}qBTA8{-WBo)@OWCALU;RjY&c-W-Ltj( ztNjvsBa^fRo@z$^KkM3w5Rk;~mx2#7Bf*6~p;QY!2^=L~YT zM_WDE~n6Jp!xE!l-xtogYe{vd?y05h-AqtQFA?E1V^N!W}}B??-y zG8+lNXb&RVeF`d{zqv2tyNN&190&q>m*lq2+t~)h)fxZH>7#Ba^PWt4@>|s$6{+0YK*jsrg>u0ZB~qigNNr zr*c)0g`5Bvay=!%dh+AMTkGEkIJW`x$%ZnEnnZl!A23`}nU7$+`k%7z^t5Y8ZWnih z3%y2B5chBv8!&YBrFoR9`W9TCVM@KC*6s-KgYZ`f=ki=i`fLPegSt!5{1^f?TQ;0A z^||2IA%>uR?~`yFr=5(WQuPn_BRwtm5&jZgLw;VEP`bA&|C2X7D5jN<-Q(z>Nx=^O zlBL)aTD?PDqi(E{>lg9ZMDxAUCK&ad{iwat(U0~-(k&|QZ;;($&ZcKF*cBq#E44@E zs&5>_h^uwtAA0@HMYlSeW7^(c9rNgP?Z*Wa#1m@r|9+7dUF~X6`69-T-Y-vOZG?De zOz9SBWMhSiPjQAzuX4U#Z?^4YmBlT3EIoY!HnLh`u_=|3*?{pgC!G?;d9UL)8oYR1ZO1NQ zr0w8srl9NKUHf7AS-RUv>OG_)Qmz=yX8*|LdJ>FNl${;P6WqyfdN(@wlM*ga0dbC6 z@rQi?tM%yAia4cWb;F{}_R<2OtfAKQZ$GuWRJjP@Ul&IM!IM1rB#mUe+SSE}98N`@ zaq{2U;iptwvZx%6l_~Z#Q}D6e3cbXgwl{T8_LMCU@|>fkm$&BV;56DaT6(pDHd$k8jPSYUJy%w!+-3=*526Yur`q3^K@N zT%4dbbl>kCeajy^Q3#_iddBw=M0+#u)c)c0Fzw!w4N8(BfmT0e8USl`?hx=b5)9C{KF3sn9(+MQK>~N zJ8~$`0*?NS+O$l((b!bVn&o>Q@${XNj@{kT3Z<@5mJ=3lr^}lsn@tE?Fy9HIq~Vn3 z<+MgwVzh=?n8~?5MWZvY#_liS==&GPKMoA6lCccW7YT>|gQ-_mY>2x1HnjF>ewBRy z`o4Gz=PIRAKyy6P>=}E1g&R@pxn`zNnus&?@5{Ny-~8M0xoQ{I$>+ z-Z0~yr(uC%a$K%+ee!YS?6!`bvHtA&m>*iu%*jh+aHmah0z0N|VUNa6{>Dpv`1*g;NB6CKb8C@ID1K&U08%&GeU7T5 z60qJ)zS21U7(c5!I?29J2pk4PMuIjh&5IUNT-^KeV|ZRVQFYPfgNiEUZc`jdk)?7nao<%icZZDTc0r>3eU{bmGz`5}!$ zu#>6B#$M=eC``(e1u3kiZ0w5D$9B~0SY`gx-iedBO~Vww{HrjCpWVtU zey95AXPT}=y>~%X;plD}%)kqk*PxoGTln>EXE;`A^{3g?P>byJEH;}owjCl+n+rSLSlM-#6?yYsU_w z&3DdsT&6BV5+FEq?f3L%pbexf>X$FD5yw+5zXJb9){D;Ew*S+4?OpiI^S@P!1)~>u zA5jFGU8dp&aH6q}pN?ztk4caD^lSK+%fBTNyS(>Hk&`cD&7-l$K+ZC?X(HR>%M=A2$HK`iGlP^-zfyMl_!0~ z)&gXYT8A=*m_rknKWE=If&n5qCIKc!_!LK@(lQS4i5rlU_Wh;R3l?5yg&_fbCOOo% zc3l1SYCB_e6Jo(v-yXB}DwQsoJ9xfE$xTtUByWI1_et~&P#_BWn^V1LA$bBNvxDMu zz3*|qm5{{~AHvGVt5&}WZ+;8EOFVq#@K z?hkYN8(#E`9D-~B5^?0jk&AvW8HJR`jG9lV^iAN>=-P8a?{7koDIDfFQ*w8w1{8?V z4DXL-YiEblLlf_m;MY+>x>B9@EyMy|S^)Rv^jBVFY&)T11ttPXTb~0(6XKtC|IJ!# z3l=@|4*z&PvNKyipn{?s(y|Yvw?#asn#1okf>#EI)qTbbQZcE6BO2Y0;ZQz9Sb!lH zlASu+;|nRnU~I0A?P-h-o~T2>l`*K@XDhY({0Ci&)355%`cpJ^H^f8M9LKMl8r*)j z!Tq#zAPO}-yVB6#EM+$hKr0A43cgHi8{*JP6}(D#w8#KSCRulD^gimHk1xu>D@ovx z)GC4C>&&-j-{Ccpb$>Oscj`|sLb9b#0r4VxfqEL$Q1KPa5-e5d%>}Y0s!{?Hf?U#i z`sL65l{M}ozSf|d`#yis$gGjb4}59FyC@ndL*h)uvxiDV$uKmG^gvJc$PO$Sy{#rA z{bnH!TAOnt|I$VYt3lQvBtMOdLqjgq|LL>-X#ms&AoiiaEsyUdgpfBwuvLRMUg`}y zB%}%h9r)`WfStl&AYxbCN;;e!b_h;yv10=Dxl*80-uvn?LvB&Ad62QYK@b78Ngx>x zlg$FL?9^0&hliBYcF;r7AnVjag+w-H0Xfm^2Q;98`J?3#C+LWbc4@=x^TwgmC6AE6 z3#6|W&+mXCfZI!SzNr-o-g=!C1k6EL2w8!kr9{N(M@j&BZUSSNWH^qS2d-E?hgM}*GC;Tc3n_74PNJhp&QY4&H<=rxQggqXkW22Dsg94@*PVkvv>UuWr6 zq*LtDnFm!~aAtn@+@16#4)|$PBHuHT)X5zX4$>&vX1u;j@qt^UnhZ*ykU|;FcD6$j zb_Xn3O6aJhJoXo=>rNaxKM$D?+9O3?+w?4+X_+u@A9;4#FrP}{%rC!9XCIscXSMhU zlHKOH8ejAR3jJ~Xq^AAk&|)7&1O^14)F3WCyR%x9(CRYP%uuC1E!XMS!)oo|Yfkq| z4lx(iCdp36^sH@TGi9-r;7)@%R4LJEm<|&KUSy&HJ(Uoeki@Ap4HOaxWXoO@d3neO zReMEznHmJj=|(613m?E*%2OlqrcvWfKE~J077(T#JPJh~9uTrH+gT^&HR)ykxTSzx zKWJNdy;wU-QFcPW8$;pdR93MC2QQXDoo<;hmmFxN2TP)W;042-6h_5rs@(di=F;-> zMAc>BW@XjS4}}}CxhoN?pDp^p?murXV7X0y_f-5q;ugO0EPP!aO>%sydEd*+ z{dVm*xbB-({ohnS7K_Bs!|=tcQ@my39+$7ERnykqiHV4dGat`}L-|Y^x zJuv7xn%uR&TMqa)L!QCCyV-{}*k_X-M96uZfpd<{C3M{^--o%K-Ksd4ETRCL4&2Mc zzq82Rx&7MngxzQ38m^zA0yYpbC;m|4^ zLuS+hV>CN_$6x(3z?lX0$ihQW?|V{(`q6Jc zu$cswM>8S&bDd26V790nglD4$t#}n>(PT;`4J+k;{06e?xz7nQ{Mk}?K%w;df#{|5 z@OUAYqo;)FM)NMrl5TtFv+Swv1TPLzDj8QwEGnPVB1*TsNB4sBYlqhopbZc5c7VPo zD+wTexQFi}x_dVD+&imx^RxqbxOBYT*(LG?zMYxXuICp1MY9rhmij1=yH!1Z>PWGC znbn%D)GB~m^Q(2qi{y{u0JxR56UU^uu!+Y1z%S;^DOPJL9JJudG?K@cfk8WD&HGw+ zbSgMEIXkDgEzs#RX_}!HzJzwmCAk`-E)hR_IUWN-ujAC_6~ybST~B^QELuI>Z!9uv zNnIm~FDQj#fxcBNi5;(GeCg%Ctvy_%qfC<_2(Jekx}z`V3g!v7x&9J_LlXw&Oev8S zJe~t(I^xXPD;f+SEI|uaDg5Tr8kKJX{_MOeJJMzIxBAA*VI5MFW~D1*3&5Z zg7GfbwQnse_>2aX!DeLrUUN5o1+q?UnP~}hA5;_nHeb6USB|t>xym%F|ldnM`Ldxl=#2YUQzmG`qKegy#+!dTXBJ_iKLz)jbHdZjL{I>l=)E+S|Z#&e1f4@69- z{`t$Hk~>VYsU-m7tq1aw8(my&cRwdoQh{&}#VyalzkxM@4*A)t2`sK7*8(*iAo^Vj z7*@{tS6B!+k_t8WyNU!PU4Cv3SAQ`g%71G<%_i5Bie;b$**XkKV7B)I7?bHKp@#EpD{Mc_vGHp|M3VxW1sQ~4IXQL(U_L3yf*3r!MCc<9~?z2 z7EgI7Z+)mC0mx9$XxCz(@~0zblOV6R05Cgm0Wj-4yN%P9&QAg5-k5Et{jTSIsYj~{ zI-3>zS{E!QZK#gY1{C1JzXG^42;M0pV)_X}yHGXs8EyRDMIKAAux;MKHY~`ShWBt5 zV2Fc=4m^eZ(`Wi{-F{V_xr~9ZYEQpU!xvW3gl~XQzxK$SE!6~kv6DRacKu__(A1V z#B?HuMwy}8ipH5`4dhr*q@3q(ur1V_b~Xd+h8zYPL*Fz6c;mYGYj6t}sE@|>W1EY@ z?84Fw((kb8)ynzeuw_%o&q^%M3cs%}l)|uMNbJ;l6Q7UZA?66S(xJ5?=irW!!&a@D za(fh9Vv6AxUpc{YjoVHh;f}{}eQUH^Px&hiamY#BJ0uz>>}qo|-^QmX%)Adf@R+wl z;#|>zsDuuz`v}f>3x_qGFwCih>mKKCVqxQxCtI-&KRs?It#Tz{0<8U7J2-t7PiUQy z$O;Z|! zQtF9}kn0IEA1WHzg&_lKi3=v30QU{KyzX!?6ICO3GGQ%zJfx+DqrZCH`;Np(&Z0t9 z#a7#0+#l^=IHq`0i{eh%Mf4_HA{lvdU40O9GO7+mhl@Y=PX6L`&T2*2v-SNk`#9hJ zEvX1BX6AkB%d;_U9p)^u^KXy0uyF6ZM%tBue3~9DmJ>-osm0xyzPYc#l^yPKElnO< z_jU<0M?zG0Jdlj>WkY?U4SQ>eY&Z%gRK()hwDEFj=h`Io9EPc=1z4=rty|Rk$G%7rDM) z!w;jl#p%q-a>3JuC8dqxe6A6_F%tXY4)+y-m$JXMf9`-EDwyMfd!gqf?rdLpU*CEo zxsScY=>nbXQq)`uu4dBh$w?s^x3hrFJQO)xKKHJO=AGpjl7tKa_n|z1`w!564Zn!dTx5(p2R+EGZzT%EMDn8Duw|1#v$_pTDWjyJI zQ{C6Xz44w)KN&l57y=sF3!=km;m~4?>+$!CYR)HZI8R&-cFJex?mp`zf8@#R=H(@o z@cSi{4p|-+#D2!t)~ZQiwQQbmSZ2Ug&+=gf$cHi_bg{Nh;> zPadb1#FLW$dB?E9MUPJwRa@crM!r>iv&*$k_-}6U_j&&7eWMl$CD}i8JhuCP9l8Hw zjER&>TPbd|=W#z31y2gTd)m|gdgcG_!)=*V0mW~yKJ^grwEtzY^0=NpMx$js>W!BB zV%bx;y9jNM86uud+WXb4R_NEqQcIS6!KpQW*H@lG-_&@@?&! zk(?tyjQp9TeYy$Yg5&zz7i3qXW)393_|@pSd0;kICsr?ZV1=U69F@2fB$vI$swKES^zLi4L2JHHOHrt()nkihaii8I@TPZvLzgQV^#+F)G(F%LBRTr|b$7BD!@BBYl znv7O6^}~fBkv?PK5C502@V|}wh{WQ1AnW8e?3=>J;EvA*#QrZ{`(N(N)kUeQ6fKNQ zlbHeE{Le9Ic_``!kB?7sr7{2BQrmm2=*9D5ClN|~4&rh!fZvLVSu1_ZCg3lR`+gx% zT-SWsEM}g{rYl~N@|oTeeRgZxPZyOU|Ja+fjj(JUC!z#`=0yj_kpv zHa5z(;v3|0TMw@{?p{~Ze35Kd5+=Z|FSe8V(Az2I1?$x_Gf~$yI|+JhAH91gF6GxL zE}kHFQn(SRUe6+@c;t@tow_|P9*IodlsU6)r{y1~l9JCm<6brqXmP9oXP`yHH{dts zr`n4N_lQC#$~-U$9^yDAUgfv-siGs)+{N(?#&VL>ty$=PN$Mj8tstqi5t&JMzPLm+ zPP|1YM|Hbgd8sLni}}zEEEt%4md0Z7QleOr8fRBP95@Sa?wyn;k?oW`3L-dBlFQJi z|C3aJpL4&W5gwE7@0@t1EJ~V-RxxF|C$IPx#%$sbT@Y7D6v<2|Wzx-{FW0_QZ znJJ6i+Qh+KaO>bF$jr9~Owb8=KYb657*0CiGRIqe340wUUv^xlavk7@%L~iPvd4We zY~IOBWc3E@*7}hjX5r`95!bG$ZwWdNx+y;R?#nsiY@rmH~ z)#&{(l-5|n*aWqQ|J9r7=szi=Ygym(JhO(vJ#H4z_%22~Z4-TZsO!y9H}&=7(kIjJ z1JkHh$37DG{AwYa`WJF~l{7HyaZu#TUXFt~*=0F<2m4uO+mmZ|s`#DQ?n&m1z!}`_Si+4Dv0dej4{pfVMoHt)lJGHx@I~o*yXVKL zmB^YgCRU#$r-T|i%*ENmE_YgToLe=ff2s^wBF@jUdZuBD8M#X$1ZNv@$z@5|eRWjL zHp%cUOxrY1a#;4_1@W2hlXpahLx&Q~+T~;we9vw5a~_} z`&^pZj`92BI96E>RI$}{X7{|JmYpYUAr_R*vR8cH9$c6)LOF9qzG1&Sk9#_vd(c+z zzBPv3vlqAZpEx-i`BO&Apq&OcW%p`0FDFF(t6jO0z))1l-Ptpv%>lfsf{#W&Z~kLP z8uX@Aka>nlR-S>1`E!J9^Xx<-gTtatK;5}wK?1#T-eg}{yLX&YUJmFVdXZ`p51S5GrPv2F*-@ z+XGmHJumtc7^zN_UoBO&0AKhns%`Tty)tLy+4uN^uQ@zjH91L@=g*9W`wBi$V{%yf;N>8s6{M&A*4N3*DWYl9 zAgUxxhPpBOJnzetF13Z~UvtouJMhx6PO(dqA56DzZ9pXGzGx8RhnxPl6crTiUT znH039!xiLMR>Yco^qgYd-Mrzd^OMM*vP)bOYdIIiXY4JErKhqxUY5B;qPjXOBr5M{ zK1*XEo`2S$p(?vLQzv=1Khb=in1%WptAu1|d^*ps#0$$qW5T zJ;%$;KlwpLzD0)miVDa5RaM&fhMa{B^;5U>r(L6$RbZ+eDgFg~?^Q!?gNbOInSZXy15TfBPds zC{)JOj%w3@lcT3AUs)hU?7qyMgmb(+p10I2)j5)hb|TK!4D$uqio~&bgv#7um`2!D zJ!=&hY|kFOo=g;$L4-D;UDc(VGAll{yw%xz@Q|%UPMd%R$iap)+g5|yFWi)2{!Fro zk~QM{9p3JJ>U+akZL5jlNYGEdTi*)!X>41}HYs%`6WZr^&?dL{QLlrV&ZdBNo%T$1 z4}qRP*NEoNA*|6Phqw<6Fu2nh-t3->t#*x8qh`rO z-f0)nvpVQWeW4Ydh3tGyaP|wCo#$qqS>)guYiYmtTY}v&QC`;V;-Hb~9Kl*t2Kuu4 zkZu~$HzLz&)GJ~qq!n=h;tu7MaaM~bvR(TZ23$ph_tlFFsRvNB0O3sqHPJ$)%qv5^ zz(5Rw9f?5(xXwo}Fedx|AU*_kuAkm*>=SIUh3YMIo(VWFLeh-ef*Fe5qK#CWC^69s zpNn8si`fM*+t>W1YCjk{zs}oT0|Dq2zk81s`Dl8x4D~)Y?xW%(cM z)Y2x19Q167d*a=sPm--3N{THqe@s<{L7FopVr~?V`*bFfz|tl39s!GLg>wr0p6O!+R>4D(+lo=Z?~&tLrY z#~7dDnq+Pu9)9&Jggh6_l5f@G0>@QYI6l7(H&s4MR_D78>>J8xT>*dQjcAjJCL_dR5J-rfkW+0}(clZwp8N2qv} zX@u$3tVVsIN&X$3O}{Jo8O+wY;LT+QLKYY#@Jvl;RF9+uaGnK| z?hVa2*Sr|@6Ywt1RB%tR672OT?+E;}5A#)A*FofL_J2YE_p^e>XtuwD9I2LeELve9 zdwz-v#FM4ZQ-)?v5?FFh8_K_TYeji;G0x@K#)|<912I}&`(44Xw`Kl2W=lv-to1QVf24xA+!qY)&(r|i*L3Dx;AD_Bh$Aq5=41?V&_@lT2~gosmpKFt?VDV zi<{Zy4z6{$ql5otB_BhC0}k{>Jr2qy@<{^VIM2V#Bono_H)0(;tD2Hfx!_QryEbO{ z)DI_|8~ebvpwdBntaQw9%3jv5b87$M+~Ll#n7~Q*1Z--Jl>F?>JaMz#QO(--aFbxA zJC(KQyp@TplN#)gYOh1HGwDXh`{>NPsH8-`gT$34uG^nq@wWtee}>W?+eO3R%OGJsJ%b?#vTXx-sjejJAQ>&L~VO`>nHC-q}c1OKj!t?_p_&^T8WPs z7GaSs8A@2&NLa6grEzQZwZOzHXZ)mHD^W-L#(n&whT9WewgFL9oKL^Ri_5p+kj!(e4cj^o|W<_)izfdL95!wv)7E*Z;x z2v+4WC|`JFE6w+%iyQ1w3pHt8_%5lQpl+nV+dO8P~hz_aSo`p zlowxmmA9#LzxUzXJYPq>Tp*t+JA}bo3=J|6(q{BXC?SH@YYs6=cJ1izoBed!bMv{i zY;LBvp?qwS6TzHE>`f!L60|S8|10`oB!T&aDth>A^N-?Ldph0fUR6g1&gDr}&L`KZ z7|_$YOl3Cax`|{T$iD47D(T&S&XVJ!6Ik^@{NPuAYRj!&V;xN?w$#rLuFb16jS>(G z{r1hTSxMUbP+>elRNA|u`^{6T^@&oh!KBKyr*_icF`cA-nI$V3Ruz5bYlAB%o8*b& zL)bdZa}@-(8|-jJnPmVtEZHh`gQOj=K1lOZ@zqR)qB&d)qoeJQEen_s{zyv+5wV*zWM$VZE@(` zADs4_c7X$FbK358LgSZPQi|3C@A3BK7q#6;PSGT%S!#0iCq}FEIfgizi{A*3?|bVr zlio{`ewL|`ql~?mkchg@{?bc2YPq3A{Y~5ra)o z-Pclbn>Ds{)K}lve>LqT6q>#4@n%tzi`(pvQ*DC)PvL;N+b43RtH(L}ruEz|U^URa zK0+c!l&gQcn1VtO@%e{D^{!f~Tp&lRH!w@pz41-I{P8CZ$Wgald|%z$Y3z6jL!ZLx zxuf$2jr1mO)w|3<0PQH3z5ATv+twS^AF#ho5Q%S>;3M&FZ8vL)8egV0uaevV9s@6_ z(Py}~WL}B*X!fWQKn4-2e7o4?S4829B98%*RA6{Fni`YGEkEno>TcIfo=5GO-EbC`6f)Kb7X z3XdZfMz~hRxHyRoxA}zpp55?p znyRcmw89y}&ldi*S7|q?AoMtu|Yjrr`@1nGv<@dR$pN0*(`jGpV*b1z* z5|tUKjoe%t^7+F7TTF3#oD5dMZy&FuFvDdTf(MBkZL=%a$xDpnF{K zT8y8)lukFRb5@ZrA`OHHDzlj!C%VeV5WJ?=)che^%SNwdHbniAz|yplSH?VEn9Y#* zApmkTg@F}hFJfIzuj=s%C2Ajx(cc04?Ri$o^~v-_>X-N=A&W6qmlQKsVM@E&NO%CT zf*{XUrswZt)VadAAU;NEN^?~@UNW2khqsXh1_B?a<=vH~9PK!OLV-3z5HoxuxZ69* z6QE>BA<_CW*Tb$A@m84>JsX|b7}hYOB||;y2qd0xqqZwcZ2PBlM-Ns0#PpQih*q&| zqIlL>1>KK1Nu^w zopgN;A*=;nEdlVcnq7@r}0ZR=-|7z(ImLeWv3y z313J~)tAbyX?9`SIXs6b%^vLzx_l2L0rl|beUQl`8`Y&W)Ky*Th3Jo(gE8OU%BSz_uZ$ zm9{59Vh|+=H{^pxZ7_4Wl@g+3QkW%hVU0K z!=j0ipcS@7{Bg(e6vFXLKKY=y{_8Wauvh$VtH&W#C~b3kBg~o9r$BWvRB?SG6@N^3 zDF;-Pg>{k(#Ll8klD;9{x2W-hNFrIwhUM+JW8MdX44w8_z)o+x@)Ftt>~tD?eiLP$ zt-&t1?Ui*Z2S616TJ+5ao`8Cv@hQ;oB6eMv{YyA9t%F_nOCjA05ED<`1@k}ratT2D zl9%Cl#lOE~^n%0M~5%M2|7~70a9dZUo;6h&x<)O7>{vK;d*ipHmcq zAD{99^xct}4=|0whEZ7HBt+Q3covXvwFe}P6Ii+1L5~Z~lmuB2nGAt{%bVKUzsnQG9!uu)}`?j9vRU|z@T328jz+tt>9hHP4x^c(b`l(sH7QU zFR%DDy&hej^PAVPyP_2#cmcT31UF-2Qeq3(HAe3u2v)VN6MBY|^5dhyJ~v?7JcD1& z%+|F|>9y`wazd1uiG~cAEqb&GwGD}olpw(T@fw5-zissmZWmTa@0%+Dd;%q` ztDJ$L#JkySH1Ry|$DJFe)*;pC9)4fBnhR(efLusTe5W=WbUZbBsbnwmZ9ga!fLCrL z=!CpiC$*c&7X0!GaMhYCsvYIfqY^ol11i~2rLMG?cqS4+8AvL1(-S7S2Kp6r*vM$& zWF{4zjyJHm|JT=$#zcEue z>EXjMXx|Y5%l>FUrn*02pg*-EYV*YXH)D}?wb9jqn|r4WqkfO2OkDiC7&j7^!$Mm* zcJDZPCU1N3Jc?h4sqxDsyCM3pO6DylwX%An4E9<663ITC@#J@iMc%oh4Vvt&v_T_j zEAOr(bL)52PxU$Ka29E9GaQx?`eU7C2G%o!&iQMqBr;VzRk5S>rX$A{3&jdB&ov}m zZ{nGQ97-v{O42kpxk z^n{kdKN86m=JJ>`)nmpD<5S5{DE4G!-(1>fC&)s?;_J@--{J?L8TCo?k6k?AVHd%aiU`=L; zko&hD;u#K;y+&gNoMG9ZDYynV6_wCn?`qjQKzLg`fLd`2R0{ zA-HmH70)jS>y(qE-+iDHKW9YhPxv~zp*i3i`TZ9Cou@eMv)PE_WLhIbmYIQq6pF1o zZ$|4S;T;f{pgem+QsG6u8o?vyU{V7>H&*{hsCK?{bkku(eQA8SJbYsUD(!yn=`KuWf#M2JJIXzAoa3JL zy28REi<#`L$?&L3GoHX#&c9p>!J^t=d<={x{VQ%!4HnnZBKpar)gR{8X&t*^Pl6)>|yr4 z_jO;_rzQi1>>|)z1Y7a+snKX5%mz|?z6n1tocL3uSSb8fsBSX-+q^cM6i!sQPJ*i{ zyYdlK9SzWJJMwZ1AA$E4XI-O8sNzD3CNvloWZaeY2z{i=XtV-UOs$j8zq?o?3s<7T z*RKE>6Ey+E^@Si`;d_QUBNd4&I>6<&?VCVKT*bV)#GEX6_08XAqh`v=BdT3I(#a%O z^%Lc;qq_Hpd?^juw7NQEcT$(=bdyyTL$-&R3G8O2@|8d)F--UcY&mxtmnCHjgPsl| zz5Qu)zig-YR)Twy97mRXb){-m@n!a2)4sfitPiV%-+z}S(ns-`Ixn|>mhW)pQEx9& zU#~lzW0#+x-kbNyEoD`i)O%iY%P;Nd$SFelx{Og$FKT{rSvjX4SCu2!$5D^|$ukWV{qAsH!+G%aM_2o|wmY8;`@u+nT@wjro>T}Q7m2u(P zl%CY$)2aBtzkEi*_A#@s~UDoX&04FZ=NI& zXt~HuM&7j6F{DiCzdc0h&p*)mG%1t9=$@(t8F{HH@yWWNloxW_vdXdz+-`3d(k|bO z{3)1Zoyk^Twk8s3T&4Q4S;cs^CrLYok-Iy@i<*0atteA@+(Jis)hp!A+qx0TW9%=( zvRq{Jyl;4&S$lw=MkM|2)~XL-8uzM;j-#FZs|O-PdZ4X6uF}BJNrYDme`%jDD?R|u6(K?4}nNRyEIx<3SqCyExdcy~FAO$V;& zU3L;Xq#EhuLv|~! zq8@7PYP~!OB$}rKXA&*EFZpSlGZ(m@P`9s~;d+%$=bv7Z9CcLD%u7NgWwuWB#4L5W z=_20ZqLI(}yQBE#(}P3gnqpP2UkXa&b^5H${+=XT8Z*VgYrjaRa-~;(kX}maHO%Q0 z5MOlNuGt)qUv`^O_&6fn@kRaM#cX{n>5eOk-sWojnMNY7R3oYLorW#MU)Iys#@l5} z4>e>ZcDye)?W{0Zc~7X`qOY|USbSc3HX*_GM*MiEF3+qaqatc`fu(#lbHMxNZ@!LA z$e!u=a>h21*F^COtTg{;udS`A(s{YJ8N!V!GV9osbr=IxoI4W&4XIzR0u{mPjX?l`V2~Oodp|XQQ9@j$X<5 z)vJLj-bQcCz2lf8?Un?G#0F+gr*L}DB}N&=IdP=%(2Li-W?1#^LOwBmzwx}Rizn9Pcmf$cj#Npez1*7i z6Nn~*JI{N#&v$#_rw589G}nrJvwl?V zK0YUgo~8Q=^P1Yv1g3_5O4DjXPT)5x&*NCHi-eY(v7^ttu+2A+XVPXqUj=Nl5q5h+ zfDd>$AfaV5bflQNP_$z3@Fu!RuZKP{n;7{{1-{G=f-c&aqk(6s2{X{GG>+|~Omer+ zi+Me5CRb9mX8pb7^XX!BpTC*E^RU`ooZAfr%uNw+=^Wt*tu}GMu(VbFLtqB)v|2KZa9RD zpMmsOkye}zpBR2dI*m-TlV$wsds9u8-cRtuJ3_M&&jt$Dswl*E*A@75t|TTn;4?@h zM(TgVm^sOMJSUqv9QCnr*OD+GuzvN8I4)VaX}YtMaB?T-i?Z?Tgm2;63tz1ilN(uM z3ij4z2j@sUMj{H=>g<2{UK72-=GKz$FYiFGwM(olOV{g9FwL2v$$*rCA&gBb#zsYyl{AgqPz>$D3zP?gZA!**4*8AN17rvTLi zP-su4-85U*Pm+6cTQytb@s>r#3fDXDd0V$d0KsfO(5MnBkdp2YUKpBS(#jqCLaSd< zTjfg~o0avB=to|Y;E!p9X%{F({UhCtAIDws{btCq&$Ox_UiU4i@m-$qjw6X5cC9t2 zv^D9`jVWO@2(b3l6jE=AS;b{^B;uv|Qy~jAi@78yHQXc&S;e;z{EA<_mpNP!Xo|FR z&xwyjX0Lv|T?9nOH#26rMgJ44wBy*-3DZb_aR9Y+5L0-0Figj?NAk&|JDT*=auN{| zH8k=4X|!X!|2eE?Ax{D(vb!eiAz`vocae^QTOBH$ExBSiH6R&HF~B=>K1NagOfyEP zTNra#)N|~qmRAh1LKk>xf7UBgel!aXFF1GbR3e?v3*ok5m=&{JA1aIazd>G|A^#Kd zI*CAD&p494+v6awmyf)485X8v53Dg;6{RIZqkA6@^YWAEwOjks_$5be-?sVaHR72* zOdc97c3&(jnBM{zIDTUv-w>EvCsu{7VKOKK`xuoj6cz_V@q9yY3WF zZZGD!gEwS$+^C;;|AwJoNx=7lU?~re(-cxwM3n|tMLbA{3uVn`viOEx`gSzZ$BOyK zw`UMjz%5J6RQzdzMp(My)6PdkRYYfm32Z+hf((nk{aU}|?d-FM1F>Z7wT7AKqgg!P zu}t*NNf|TuW!u(VRb+EIgWj34or^y`0ZopMteH_OYF+oVL7(0W;dk&Xp+_czv@>W0Hj=Pn}VemObV_Rj=+h8~*9@$9?ylGEr)D1fv+<#7uz-8Q7w4azJ zhK)~91I$Hie%z4MR`FA!BS)^PEW;yoQ0xZFS{X8}j&`xNoSmQyz{F=DU2pEVtTb$# z8cYL9$jAQx;@*@hOp-tiOW^U7%cmgt6K*_T=AAU`T>&Tq(G{f+Wfkg3i_2sCS2RMz zM-X3pz5fbETd{@-BX&W)By87=qv*p8U2#&NiHM!2T(LqDAaAPYT50^M^2#9w=@#Md zq}bLkoT|2>y6b@L$A>?{QRC8A3_F(+K@G$XYKis?qeAuPqVj(+sKiL+Rw8LEAhuw@ z$mNa36T_~4q@UjHcYGB5P^0iEqR|lhlp>nGA1A34Bs3i4#%GMi{1drg0pAheDm)7M zUa#<>5bbMNrWEiihNSRlLF*Iuu!t2M>Jn?W))ZhgigC06p)k?NU!ptY zNS~g?w5X=uenq>h&;70ZT3WvpfDBj##5Y3=g|{%5KsYKLO3-qc$j$^c9) zv%5xzIQWq{u_GMOL1Fb0an@6O*#UQP#SB`b-QV$~&X$OX4G2}Lt#4v4kyZ>8Toc|&6KWKig{$^cO65PMFwtDih^z*+yKO$1q2(m)jJX&1b> z(~f|9v`1Vq)wCyKB>;hBJWYwL^Hn|V3m}+FBrq-g2Oy^<5u#MpW(3~y64C-{qFd5k z{BMm-*dvy08$rG&%^CtbCE|T;J$Dm(a&x2KkPdDk-7!F3m^=29ty3}3tvE=g9k1?B z8`L$lW(0;`my@Ibe^iuzgN;DRi;vlpCwN@jQSnt18PZB@>xXwrki|+W<8UnDPPbuY zL?*CZ)~9k*H-0tkc+;?m2JI#6O)k8s-90e$8DUJS`(;Bc;NzhC;d=?6*5txUk(%)t zz5>a?K07-=%b2}b#h_?J>;XH>5LFE-a4-W4(CObjff`o%AbVzR?>Ah_YGpt;QA#A~ zE*L{d&A=9r5Hx+}pVI>y63_jWbN=ly@VPT^X`?uuZEqRzRIT*j?j15whkvkTU_tpE znrF0-ihoB0=%$?r8bm;GKXuf?(Ki!mo8V4+{EKg*b=?@qsZm-GJMmA4Ca-5;#|_@G zpVFK(tV$*ygv%8>s~L9nW9P|~2e2nP&<(BNCMXe0V-Jdxny<(`nr2EDOBW7+GKfP^ zGH@o=U&1=rEWTD#(K11k^A1sE+@L%Cd*pVR;a8>5uQ2E%=bE}t!AIHjSvJ(WrU80H z7r>cZ`5p%6cFOe%LQXUZM^h{;1LQWsLw$UD{Nnm3PSB%n#nbwF&f$S0hojV&W$uEN zewPr1_UAY`4>d{x`p2m?yyX_Fm8tuK0 zRb?aER;)2XO@$5tN{gG_-yc++%{Z6wV0eA;4T-6FdUTGCojzBEdlf@GrhGp3;a2@1 z-_@8%{_1G1?mD7_oTQo+Wzu4)11lGsLX(%PyIsGn&=uMZO4J7&9*U0d!sgDj_xx}8 zFy>(E4}AF2dYR&oQWr1Pr_;7rb2pMqJO6!j!dCItI6CfnN!=Se)1tYEr7C_4@`Lyi z=k(uEn9~ulZAqrRS-XV!`&%SAar29r^Bp_^6}#j6ZloT*Qo;xO`}Y{+e&5xN&fmst z{%ZW<`*6Vr$(Y+%tJv@aYinM`wGX{e)k(Y~)FE+lEKq^j1j`q_UFL{TF$9;%YLp<)E`yS03Dq9)HF z>G$qt$>z-TOUdWkLzB_fiuTs(4S$r>L8IdPT2&&3SHwCnpi;2JsT7DCRHN7a8$irw z@~0*+zWNtIw0$0}#5q`9L*j9WVRY@9Kbq1lRtyS->3E3!Cv3H<$9;=w8cbWHT*x6rARY(mnyUa1po!a~6+ ztPdanQ_V@fNHzM-N8URL@$0@6vRTxfq#*=q{iMojCrVqdN4y#Tw087*#C!V?{3)Vw zjDlFb|IU}-FFQI@81l}o1<%cPV%Fwc zdlC>lOFwid()or}AaNg7#<(*;VYXGy>>#?~jBL_aQBpxbnYBgF_RkY*;l=&RkPj3jU{ z8^@S!L~s;3+8>y|_4PmVD==mz$^smAkKnA?+=X^U(T%>f2lIDR8w6O=tpTc{RyPC& zMzssNd+*W;{1uN+bG=>9kHrnbP{rmYocQfPvnM;q2F=CD7$Yl=z&u^>Zsl}%R+f&V z3Bt{5@(=I^?hoJ)Lr`4GFVVs!J%=NrN+N^{LjRqAGF>V8i-vKE%U#EraiUnhqS>r_ z4tMxK=O=ONqwOXej+fi*_h|s>8PYnz7GcCU)=0~NQ5&!ABERQ~oGg8~60@L%q*C4c zM}Dv`lb;fcOIM@TVxrkwr&zFB7ZBgceSdbn@sAc=^g~S3>;EYH)O;6P)^CDpuQvvDNiMM6)>k-~Gx5 zZG68;l)kfIekA!^2AVS1EoW}s?Xm>MI-p0sQG$=5T`-IKf?m z1pAGHKhlWXTZ%sy%*SEXgdwf^qgT#q$hSXT&`^EL*41i)RLB*5yjs+PRp@lRkK(^w zrP%6Vjnj;k!`e#Q#>{^4uHZU|5B6Oc`|+8jT}!D4JL*SBrY}>vM0iM;38PDOqpP2M zU92&|Y#$?e5nB>a6;Hf5e)Db*qNG3ztGldqA5>JkbL>+_DQ#LDI;vh*Fxq=q9QFQW zQLlRc^;c3>BZCA6ZkNkm&ns@f{q4UaocnV8Fy_8xPxk%t$BUsJz4x7jm-X#FV@FH8 zX4JO3q;K{7!wLp*)4ss>y$Z#OIYlK2J@YFrF$<9kgT1G!7}U8`GsyR|T}r5yhH^+s z;>HHYYN(_2xsKL|8N_p~B>BYYiL3{F{&69|x>oz_Hx^9Km!=R6$I9flero+r6Isu!v#AV~%SpYP#J!Ml?9*8R z6JNFS&J$S$h3{aklq!jYAIp07Wp%j0q ziK`xWf3?TlY@{V%D{=qJQKA+L_5TdDKLYMombLwCZv<&%@W-QA{igo*7vznBMPGs4 zh!~NZQrkgX9(g1MPtxx6sum%tdr&gm_&Mar6v>)|oAK^02zPPD3ejP;H&#S?G>T~) zv*(n&%;bq-aIq%uJ;854fD`5f-Jj!3|EuPfU*-)vw^gS)-JlI*g?{r1AHHhVzry)O z6K}Q7M+{CT@wK24SBs9l?45=0w zELS{z4%%0tO$bce_PWD-2t=`g2~r3?5VNk0k|Dq$%#4ZU=A>n${&2bxg)h@jTMjtg z&rTX3GTgLwB@Ph1#?XvfE(BZ*xYTWaCK7mJdKeh>&1OYocW{%~O>aBTcA8-5{*XhQ z9o3VciBCpwa5%;Xws;FN1nR-6#~%;!#3r|{Dj;h4**7pZQ+JWlH<@o^>1dY}_>WkN zM`yE`)*2A<2AHYTzLalAj>6E2$eu8TOVR&DBuAIHQ8<+JjZ0PU+he-Bh0f2CgJ_h@ z@`vm9O}F{?IxaaUxq}35lzih5dY2rYm>>C6BStEnz%z8-n_QPTrzl+5b^6iEQmp;X zf91~AP2Vw(-jINiMJD&pD-U*TtRK}0(AUXhDqp&lQQH=H?q4KtqS!bHsjt~vS+M(Y zFrx3l*jA`lMUglC@~c}Hiq%_3j`@|Ux$*F4F*N_nEmQQ2mYsH&%-GYW{?D7k=VQ3L zXW!Vc@6?$d?$`gCao%Ou`BVWGxiLzN&$hwj*ci#QXWH1h-H!ix%X}T8pm#W*%mb;K zfDp;xrsYYt%JTj*u6vRm&h{gn<^Ko%cy{&oU;Y@(bMCoCCQD0}6?(KM4-YV|x(7B^ zPs#_!v|R0q-;AG`x3THlGw&~Qt1xX__GsET>(6DswP-YC51nUo*Ur%BBZboIg!OMY1lB|k-ykscZi|>HSa4hmGLiq{48)xvX(;cYSo|akM^j3w^apn zf8YP@{`T~CSIqAGSNHdV+2|en_Y;lfMi+%Ue3TY9jCOZ3c9){rK6jg~_H|g4j-4K{ zKv%ov&Ko$q}gEUH4ATn*mROD7Ar_`AAqDJn?IXS%r$6H0)U9oU$5uso!-q!z+gpQ_%gr zVJyC~h)QN9YlrVwrszhLP{S14|evl zEJc^s)M6~@$^y0ATaxoKCjars!K7=MQ;T;JpiIg=;Hk^85zi zxf{+>n~h9D*>;9|h#m+FHU&?{g(4a|n58N7buD7=NO-}94X(Mc&nRoznJVad^-sdv zK!fYa_$_n=O7V9IlOsO8!FFD7ATNJrCec_^8818!g{Q*E%eU{zXS8dN*TQdu z(Cho{{xXY7#p`Povh)e2ZSpe8v75ir^kC$(Q=Wvwuzli@ z`8QIOH_BHOoWfnW?tC70(yxqqBLYlq#2ZSMWOcTFz7 z-IvuE@4_WTaL2uV7F^+B#QIoKJtf@Y&M!mnIK3LT-kw&;-W^Rn<1wj#ob|$8V@lo# z>s~rffr)n-`}l~=BKS4c{>$J}5A}Cviv2knl-Jzz4nswM@dJr=pYj&UPRukjL&}-% z<|6!^diil5U*=t-%B5zn*k$>K2ru0gaPRyF_gb#bakLE*lK)Fd&HkD`}%v zVnv3197J)Uq%BR0gMZ5x>6I@O1U#)FX6>fQTj^;j`ln1gi#+b4O$ghXTIsDc>Xt=< zL&qDB`v^(gvvfPISw!D;dQZhwgvBJMem?ubI{bQVCBEeen2bQ~aPwKbL?O=01TWR( zfVrYq?r$5gP=Cg9A$P;2>l+KWLqzDd^=l$Btf=0HAqQJoo_Tr|3{2@!4-J<{Vf5Pa z6$F>kr#j|jdl>|h!5U@WZJ$=v$RvQByctomiN@R0VaXBe(Ce-DTB9X$W2tt&V0E5* zK~#v5#yGFm10jr2qS$0Ycu^o6_1hBpjAz$52HX}BK^z4 z{0^P~%I<@}k1s^1fRp}@M+ns*K;rdv)8&n@OCmwh@W+2(_jione*D)^baU8v4J-LD zs78D@4l#;D5;7pgIJ>Q1mQQ-!NCCdvE?8sUF?ScPGsXhE`o|5^AFLOTcNeP|g|Wxa z{e~m|0SiV>T`%GFC(7o&Qqq5|fTC#Vpvl{_g2G`U1*2JY=Q$iBfOI#CA_-Bg$RGH^6`fL#ZSI^pJs)$@hM* z-G#|Vt!3yNQnm(A(*GjmD6@KMY7d;L62+yl@-P^&bpaF%fM9d{X+CLnCCmIxZQJA5_P(Oj_cG$oW#;7q6H3u@YpS5k#+R*4z?50^i354Jd0vp_A-P z9v*g1op6*0v57WCmJE%t16UuaMuh?u-UlOYF@%3BI)$c3q=Z2`05ww1cZdesH2i1a zou=i%e+oR#HezB_a?9acvPLEdaO#!dfx4;Kwh~-TKlT@Zs;01+n(J|dsT0?tq9&;# z-J}qS1~>&lzljH;rvmRG7)T{%j#}|=6ay#VtZ9#Qx@Yt{(mp8u9c&x+&+-eU6TlyY z-FPU#JW7arP=wIA$O783Z{8|a)e z-c7~e6irdP&YEh7aSeEmFP+Q<$Me0;4k6bF>+6bQ_X$+Yjdg-A2~wzstGrubS+|q{ zQ9=Blj?ska+=Ez<-AxLf22rW)=pTYeJTWr4rzs};F4BrmdIE6j&YIxjfLQC6ND4si zN@cZ-gXf2j>E=HD?!}1%-C1TlyS{c=vtXsKFxjg0F{GZaLvU;yu%W>Lz`H{mQfg*B zc@%~2b2jaROB1mCdBhVs^Y~ZEmi&?hgL~O%<(Pev_rbVPsRxhX`D8<15)tVNr_$YI z*J=Hb)exT!7UA0q-zd4t_aAUEc>K7|ySCZrU08dy@+Vh?*4{q%CS>}$4|??Vg>aG4 z_tjN`RiFpebKA)K`cSff|9h?3hwN7thk8*pI%QECm9%wRJ39SEHZL_RdOr(oRsHH1 zB;GOBjx=85w%^&?PzsTf+Uuz<%29M?Z#4PYH?P<6Ubt#T+cKSR+}L`u@iV@`;D*T) zmudB!`<9yD32U7H$9!Az5$0QJ&wuAz!Z7AhZuNTcgT3{+?l^YxcM%_E*KF-6Fpi(z zogj^qzdzS9`~~2BiziNJ&}F3@0{oFb&H$oAb&^RqTAe|hH8U2P4C<38*Wp$h??Cw$ ziEZv$UZ6);x`-ARjC&Au`5M1I;kokxnO2D{OVq%t$p&d`yDz0$StFCy*HGqB{!1zv zw1_|8LIA-sZxj0xay^5#nr=`8^<){qB#Y-k*$^nsx1`}};HUP$bs`I`xWgBK;=i4d zItp#qmQjx%ANrZnQz*SOgLIGl++TEyT6s*=N?D1dDh9exNZOouzb=mrE{UD}!u@?> zX;XZ!xnzvn-MLtD`lBn1N)Ex*D(wPu5Aw`4hE5ISyS7yb?}gltB6&^7f|oIPKU1@J z*S*Ms*?{YOOgQ@N$K7AEJYZMKT0r00J1BJ5TCkwRsCw6YPEz&slj>%SiJqljaB`ya zq3M@W(YxfcfXxQ!(!rY^<@zR@qIOwqJ%#pFg!C2LPUnFp>5);6F@$Z)rL$+I>zg> zabf?-8KD#KrwklgHy;u?({tw4+O_6{T!BK@7`i%7bRrj|FeC7NlahB=3GKpu50jvK!hiH5oAYLYK9 zG$u0QP$Q$9$P!*-VPC&*|I(5#HIO?en{ z?Ss6-Q`sU;zCa*yHh{?Kv(DVi(ikGy%ap-Fc3_lW&5+vK#&c;3!UzB_quZfzaZRfJwI+qsJ(QZR3tBp1L^ zqhSdzpJOf*rRM9#z4|>ny{Va)(#0#gFihDCCcTRA;71+b+v<)cxIVEt zg%sB^)ISvGno9%>XZ{p$mfpmhSrg;-?oF1W=A z9S^3dIQ5+A1P;sGMMd|W%ew1_z&V90J*J5+94;xywt@I03R()dpK*vh{_DQb@1W(k zu>x;07KwjP%ahfh3OyDKVlxuGSEdX*sbR0&g1yqIJhC0|GH6)aFJS!^9QbM$p*Zwd z6oBn`UPx0xsDj*aXfxsWNUPSdL@U^48ee;@*Pbp({khf;x+UdWC` zFscNPQKI_!FTa5U?_@4F-blJQOd&D6OeOcyWh!p zs4<>(#?%Cks_4`FbD9rJX+Uq4byg_#oDYzi2s_UG`xJ*;BBIB@`T3JJ_%~z!Qs-AU ztqcMKp^JPW3=PuxwKV)jB4mP=<~*BOgC(E6VrpSI7%Us#VhuS8*des|Ow$#m)Y()W zssGN;f}%(-Pyko}(&9&0#Qb4t5%7)b#w=X5CUF1(J(=wplLg0Q5~+Ws(dWYzCuG<% z9w3@lFoMCQXT=>mA6(^OMwWB6brTXTgL$>OkE|6u)HiKzj$IMl+Ms|?g_~)Ia{w+v zQpH4rKHa}^Rn8()PT7&rzp)Qd=!0V}72Ox35U)C%|HtLcAz_4ALnIcSkJ1txR>dk7 z^zT9w=x^uGnSiqCdKuPDh`9SR6|<6#)p7mr7qGWddTs@`2uP|Zk0BNyUU3&qN9YkHVD6Y<_|`ha zfi#6u4HL8hUr*uE7vS!R;v5Z$PYoZG7{mqoh<-RO<@wdk5mDnqL9ou5;stO$Dn+YOs2_4GBUU98f%H@EP6YXQ47UqPo;rQB z9XT7=CY^ej?g~*9wjV^ac5@6;3A;!|fNS^tb)k31o9I~gx!e2Z>EA>4X*bH3sa4}i z6!@|h9+g{sCsq&meuwzwqNZ_&NrzkJ-WNi~zRylPMJU3#K;^eJ<~#3V=nc1$$k$6E zDah=(Z1In6-*j2%+a03F7T-5dRVb@5Uv??cAR@6FGg+U>@yT7TF-?^ebaJBEUVEx`O26K!>#7b z^-`{9vv}Hto24TLeucZzcGuB)1HO0H##LRa1`ev{s&|?FR|OOH>JJps>T3s z@a5zshuCyq;=-0dEMO<%M_1UqBB0a(^}YVx%MiZkEKO zn4`_i0;$a3XB|zVKEES-50m}tzD8u$BzI+ttm4AGI!7&VF#M@6F5wFho%>W{uRh)e zW^@J7VyOrRVl61xP?}FEjs~q{Mr;z>UevjCh!hXX#d9bJa@cBL>+`xS-Up}R*RI|$ zB)A4btP_&C$E(4{Y960rtqi)b6%l}1!ni*Y-uRQLL$QmwYm`ujMPoUmnMO%du=8re z_}Ojv-60y*mcP*-k2z%*dHrJ$$`mWYQP0AspoeHA;9Eg*cJe>8xJ`i zm|?|OSjn#NOs+V;7d9mZo+{;*3oP8pLadT5ngrVuD7+ku?F0~4wUnlizGgxoR8L;G z172D333fN%Mv*9mWXPYsSnd%uvd?rkO$wS|wSD?mdFoqc z6SD74)jr`kf{4O+ip&~_m>(cp9F$Xtj1rQ+8qq$&|M!C5W;aHp_pq?K3i#;bP)}+rNUGuGOi``p3XbC>JYEMM8?Y7!cW z=QwVYSZv(6(($;fy})9pJp8lY_1pQeo8bmgg z<)U>t^BP?=hd({Z${+&L=ttnqU?|=qRowJ)Ppu9#-Ox2$q9RaPm`Jx)gyeUJe?e!_3jc zLcw8(x}#3~u_sSd7L`x}ADGS%o$#~@LHrGTY(^IXfljNOil2Cj6)B!I=K@=?PD+~U zHEh|1ZV8=m(MAJ0XGF+Xl(gH@@CNY6+^3#UeWFzKJrEzdD6rdsi};J?Fb|oQUip+F zlw1e>pf}vycu^p}`&%MZ`7XX3XZ_pkqM8G)1S?oA0NIpi4P`)dOGA7fEaR9_kb+L8 zvqT8}i7x=QRwd)GnF;Wi!$>CMhXi680aXq74>pGU z`v12epHeaKe+cpo&wzM>FPUrB;a@@i%%Z=8@yn|AV>;Xi?v!iS2jh}9$2K-p%j1kX zs{mPYJIiLnMQK06H&79&GcT;eWNlhYe4a}6TU%6H=W4K*)Ix-D=abB|6-A$9zA0P; zMNHTZ5LT&6mi0dGL=sDw0d~ z_AIvW#nLcMG7ut@rPBtb>N!FsLP3CTJD3BJl@5qYCNazrk`Bz#`!Q2Al7 zA_9*38o?`FIi==7uz>W`fH^t-=4ttO4bdu92KMj0MmuIt_yuMGqqiL7!+A$ISgy72 z7DJ$Q>_zh%5suFrCnPdk2OCr&Lt&Qc(KzPSP}j5fjySyV=!Yl4;pRwt{<21TDn{ZH zQ;Q+56lgSHYWph6Rfa^LfEdiVok{<;F~@t(B*ztllg&hi$`E~FSBIU!Dn%fI&YUxB zvp`8=ySg6~N{`JZ+xVK02n&*fQ!xh6b29e@MG9`RB|5GM)YE|;pNl$SUmsDlL;7gT zFo7e8Jru2e1lVypbnp#+Qus?91VeQmG7XUs(!UGdx8T|9iE_JwII+KYv4I^`dJvYq z$sGp5hEh?9z*xL#=1ySHiWjZtOVfVNp$THx4_>Ur@CmI7Y zG336X0~N0P0z{x11)!QssEoy+1O{Z;&`P+s&c&M|aUU>svu7SlP2Bx!L)rZ)O&!*2 zjrBhKQ{8{-{GD{|NdW0=PJ%*7$&@9G;@vykU~R^(Ht9F~5yUQMO#P8g!C$CX1?kSc zVy<6=tUvg^CWD%uduBeao&#x{m~;7Iwg562cBZMLV{y7;e)m|Mt{ zE^P3c5)N4Bwi`;phAciYfFzFT8X9k_e0$tZ@ab%RuXkApP5^`S9FG^4Zm}4(Ahb28 zR27H|o*xRTbf(wjuJMxEntxlOav%$!o=5|WgmkMU9E)=4XS|ZtFg|S zxYa_zUUT}fHkM7mLOoF^B_%A+?1^V=#*vvsh zOqbGkBP&1{u@f*RegJHR+4z<9CN7*Xr^h@X7zy#5K`h_?W!Kn*PUFHqA%MgU)_@;W zxmh9@)bGx7o8p2fdb2F>6RO^WV2RiP;tjdY*|s7xU>C;b)x`B5^Y0XcT^QMO%r-Y( zv?6LfWObb8%tm_$ZnYuQ)-m9t-f%?8b%jH@Lljxx#8Q}Tu6i{K^n&r*tefFdtkw~v z)jJa97%a!KMS~11kdu?_Jpr2?Z1@f1AYDMII#zi7Z%i5dR|N;uH|0? z$fV)sw?E>_58F+A9Mz>OKX&y=evh1>An!d9_@6EL@j~C-O!ZqcwLg83WJpw_kZS0h zUA&VS5?rEgwfx43e;HZxmf#Kebas-Gzw9=w653BGllw=MGGr}rQH5EGqOP$y_@rX*v<&5`nQt>(&{3KxSoA_|))0~Z2H|2#3jT|U$^M}qZ= z0QmLeu5)l1VFt0tx>+wttsC!nJg4B+k>4Y&j+bQKCGp^-B;=a>BUFma58kf)m?dz8 z@I?$NDc<0Zp#oA7;C}NHif04T5lfc4P+Xm-Npzpn_14~EUt7>PI^ni`B!D}a`#;$v ziyezg{uO7~P^{|}jhXhlbH6T2J*lmG@%_r!d{l`w6{qHgbRT=h&Rfyt2Z1H^pQ^~+ zJ{IY0m3Nzrn7)raz|tkh2M+&_27_lm!smDiP?AWhdK;vwmk&Xn{Rxg&>CT7EVT!||A{~OFN48BU^#K1lvvk;Obg?L|DA*Q{=ah&Gyhi(qTQ3=R8@pQ3BfTa zed9)Qdv1=x>>ef2(_&-Wb4JrTjjxTjdY1lQx(up!V;8|?FpszlZeT=67B67b8d)GjnaW}>tA zmt6pM5|f7-l|9L>hzEZYxI|9}euFHl2%}8JAtVS9Xp~esTG_eqoH0l&arT~yOFc?% zFGF_!2tuJ4zsqm}3I+4fk8QGnN+z*{1TACo(OX&6Vekl&AettixTG?7Hl4Zq43sQg zrmeG;_4@1@^<0rM5zs!wsvV`ECRsTVE3b}hD=<2#$Y&X&69te;s?`||35t<4iSqoX z6o4l<`+<(tft{Xk^R3|B7+k`}C5JgwZkS@N6LKr}erw<#D}rJhJIt4*6#UD6%!B^nj>AymR;;b_-E@I=iVy?rx z!fz!pQd%R%JYo;n0E1j^Cn{K(;fjy2aB?BlT^_8tt5O7#n<(RMh+&hPpn-VgC+SNo zn}L4;CynTrFUC+AGvK}*g5g_{hA3Y!!*vXxVJT;mGv;pkqtwUbwue34QwRD)6^p{_ ziSeV2V2|m1i|jEC{lQ2o782uBrvl#rRMcv0ES7}0tnxTkJ&Vpjx`GtJy$B-Dy-{R4Y2 zXSCJ{iW|!yTv!=JLHpmXSzt)x2uML(T@?13&P44>Ls={V z0`OAI#r(0(w#o{p?P=#V_aQf$-#&5U2USznuU<1=9VS|w8DH{QjSP_dEX5!khf=%H z*Z*@DztBWt&H*^1h;(bF<42G7o{YwOGI>G1^1H%C)6>YmNeXpfjCmz=~wA5k~F9sL7q{v?2d zV>*?C754$;L)-i`kt&If$A8l>AS32|9fQJR@O%H2!QGO&-ts5MQ1Sj;Jj*#H5N#ky zah{Dr-kphT41kcpRO=_=Kp#Z=5N2nQk1vFMQ2O7sK`n<1WfFd>{kCw~2WPPaZQkdd zzs1EY>W)z7>%WoX9V*Qx9hb`KBqp&VUa@@BGmA&K$VQ}~IT1$5CjJy)Sa+>K8YQANu*T=3ASY0K`88MPl;g!w75Ef^_r*|{C(+cb*eg#qm-O|6ry&zN6tJIWA z8l7~Qx~I&S_u%kDOh@Of>pLCBZX>yrcOgPgbEvC~^2sL9bce*++xxD&qERD`==j{v zYE(m4<9K|eD$9rHrn*^}^*`wJudRj6&L&KE+E>quci&w|D+*V%n%#JpptX{Be^$kN zS*eq!Gr^2Cxi+w9ZSwQ1xRK^N!QJS-*}}PB{4As85AD06G%*$1rjuLIBb%OS4$dFk z8uJ74?JK;8?Sp*$F*{O;P0b80lWqMV?fS^=xOVk+e17rEFWp~;N4a~o^E)0;rVeE9 zrmO}AKeh8t`Z~I{Q$sR)j${^pK%r~kyEWgEdh(hjLs#3PZrrzLkt}^mA?ml-cvhpd z(MjbSPxv2(6fb-Dm{Mk&_qKg?6{2a*waXvdl-hjSbn#N^!xK#pCa2d;v@h%lPIBz` zoBV?r=c^UJaA00u9nX1d`Bvcwp5`@Ik2Uxi%aJP=yS4LlEjRl6cr5K48ffn=jxJ3l znpKbpvx$=A(_E{x9I6nRusyI4j8oJZyS^`&;<8<8O@HCA{Gfo%KDctx&qy$qv%W-E z*XKO-mu38?UrAm}cKqV#ycsaR@qNSj`QrHG=Z%CTJM%#t4wzNrA;PUwoNa@6#>da& z)i#-N&n(2XeYLIrEqdN#pT*z$O4J^&u0z{>5gifAfcc#?>i4ScZmd%liRoo)xlXU1 zeB-z3sUIWZSH49g%K<<6vcHqa!tsq!bbmyV_ely9`HQhzBFY#W`tA=0hfOk)O}h&X zb6lc|Azk=-ZnHI^ekmKzf}f%0E}Z**`VE^)M8aybkn$#5#cYU43e!YA>*r=(<*eUU@KW%8IOeB8gKfsz^M&Ui$g-oP$I0=Qj#%E$u!0s-e6 z>cEtL9+@L=PJUPQQk$E>Wcn8Bt;B0kAGi#{ORV{xawix*hTCsF3wfTNBE@Drc~-2E zuG*oXEnWJ(;91P%>cZ1Pc$8_KdaJ)1``$8PXP(m=RyuFPTg=;RUcA&U|CDmqm-XEx zhW^#~3z+Afllr7<5~O#m`_|%_S`(0mhi!u{JeCqKg#BiZqmw!(p)Vs_dvPaea5X+f zY1#^Wte98K;exJhHb?Wb)=E(;F`-Qa9C&>t5}7geYo($eUZDsLY{)?4BX%?CGrXP2 z%(tjzJu7jR%#9-iWB_EZ{O8P^6n|tYFu+##b&Q7JX4|_t@j^A<35v%k`6eZEc#^tZ zM~hScMb~6vse35yBs4ZMu~1z1V|@!6lykYtF;%6g2B9Mkuj+r?f_#toM~VC{R%qYW z5w4(#v{K}(H3I2y)|Tp2yWZfsL?%_h)`Y%OlV-e3&^`0BU8h`22Lb{fE6Dy7jm4Y{ zF;;@ACR%WT`T9SmHYsUD_B`C`ty`}L`i58IZ^Rvy=VX#+@mq$HwiYoG5OANf)2Hqz za{VrB7Q(0cA2dpCzi1|fNSMqgBJdyL-E^7H7}aQl)Sf#cM@BW*wReV7!w*7jeuR(R zi1qh-cM4HUzgAv;T1ZJb-(U0oVmE}PVV~|`NqqbIpJ#101V|-*8D&PDO)T|Q<46f5 zW#)@hwy*Kv3>7TR5^yp(U*TWOm=(KO0S7gYr{s(k08|3|)t3}rIUb!&qIPDQox>1N`*n$PQo`z!Ge1oNLdnN4u*80d4#iPylg4V?9kE5 z{Wee^6(}r8;_g~M1gE|6sO={HsT(1g#Amw_g-=j0Y`w%Uq79DNbH`qlMw{5gPRH&w zxWvedH_rN4brB;JY^lo!?BOQM+M|M#>fo<{&+SETKaf)nWHPQ>7>X@5dbfiC?1berM4`VV5PE@@noI}yeNP?iM;eO zX`eh@Y~gKe1%j8x(cu|xK5|Yx7e6$?6cP|Aan8SpYSsz4)mTyI$epx6&SlInsl}oe z*8uAnSwBy@hDlBA>F&aR9L;CnoS3jZuSw$4@!&z*+}_>oH8XLBMkexn?)<*+#@(H* zfW~Eq*t~ud*MYlv#v`w*1`o3Esy65j4YD8U#+{oZ%nNyBetU9ZXm_olsX_1u;VP4;Lt|7wqd)E$^7cNo}uYZ z$xG1|;z95VQ`kpl{p)2r2BZR=@QPGByE|4cF|FRqJqr17V7@j>O@5pRbZ z-VAUJcDug%kc^+wQuH{_mASCH?x8&VAmINZ>nj7I>bh{Hq`ML6?(XjH?gmMLp;JP- zq#H?T zE9-MgFn>V}M>Mgu6eWZrTX#1p8@fglZE~$sbixkXzfA^KPQs2G)^6VNw6$5BhVOZJ zo$#)@2pg0h>G}_}V~Eu^wXShR&$O#!m+=j1K7QWWMqhuONNf6$_vXy<=F~R(`rZl0 z*X5z{b4h-XV_M9B!0vi~I&PNtol)r8(eJ6teQSK8ea9wm(itE3Mk6C7TVqb+%eTiB zw+Hr~k2V6P0Zr&71~ea$^BoKD98+rs9l7#Z7Z5)@zH1;ceVXk=e6-?kqt`w+w)Us5e~x!?Y=Rc)Y-H!~+cXpOS7J1D-eM?F zZyMA^`Vqs$`OnYYt@k|Zp7lq{yHu{F2+#v z;YQ8Z^oex#_tAQjYFpf6e1IY!8i8Br8+uEk{kxsHMcByfE;Nj!YT)Dxbh#k(`L`bK zt7qstv~){9tpMr!0&h+6dz$O=a7Z`SAV<0b(PnM=$ZRH?6`u$ zBhVj(zV$vmS;E>nA%#C*U9tud2AdvpJT>nInX>5YXP?Eb8+mT6x9jC|>TgX28RlGX zJPb{3eVe@7(q4QBsP*sD+2ahycyhW9tbNGM9V*C+E0SD7++6y1_s_o8s6JmtH>m5; z={Yiu>gHokg@jIHBoW84>BbjR_pc__kL~KO zSA!m=Xyggk>XA!n9-8LoEkxvxY>#=B+fE&S80M*aKh0e-_#b}DR&BfWHt^fkfTH~v zr|CD<*8F$X3d`uq_moFZ=E~u&yW8WhtA3fHbPTWQzjRcaxn~qoA^o+RS8o>Enta?^ zP0}A6VM8XhVt$*;ZjDW=Nkn8Q|1DCkN6hmVA!Mc%9J4aaU#pJc4q7LBDw24Gq79E= zG9D^^#2B=WAyuJ|Z=ip-qkn!~Jy*TUegCPM=~V-6%|?SZui1!ZP+t>i%3}atdM%4& z3}VpJ87Xf$y{IGUY%bLM`^fAQtz#zCe(sv1zB_Zf<2en7>R#pYrJ!`0g&@?<+Q|2w zD@{Cyk2Z(2(h5dWg4%z$)XFb{;l4hpg!6<7r&B zlzyoOR%;$!(z5ch`dl81@))ttqz!S2<|z8FxU%weysOGfuyLF{ue}g;MSVQ9t9K(Q zOW`VY>blZ5lJd{RyB2Y z;D|5jYtLkdQfBbSa6-|Z{skk_y|TE>hvuXV%O{8%5oFBx^-H(ABw9Ujk+S|NwQpi+ zk|#!jZTz3UK4Cj7Eotg(ob4zs$Q2gX>ENk!ovm3o)UU zS^Gu?mS03mYQJHT^{lXM+Ykgv{W&a>IZvLsyF2_YS7wYb9m*UhnQnhfYhVEUmZ&lF zV0v}6%-GC#Xf)E~05!WtqYC`30mnYzt2&qVwF2IwThp4n*G6dG!M+L0)@70 zuTy?>5~Y;uxzvkV?uoInaXR9A;dkx3l&{<+8;dSSdr_cf=1#LEVw502Hk3OCKf>d` za)#i&zgOqCGJzf^%71}!`?!Hd9g;^7)E|iC@#&!eHGixAZi9W>wYj)S@$=sz{SH)* z-6D};jy3llKeEmDBR!V8%}*!37oM&G@2_$Dn$te{yhOg8OMlW#rx>xAdW_!Bd zjbQWp+rNhw)0eXBM*aU>x!dm8*f_@q8rCGH+WN7 zjc%-ieG>Y3UDkQs=aF#tp7;H}HLrm&t7uo(^--6%QF7P($&>M-@V~@#;VnNj|2}Sh zl1XoV0~HffrnK(vqx0xrvWj7AxjQZL!TdOASx3KXEp|8R10u-RTntal=2iR^ylB!<+DCZx0l#W+QFTxkMQ6`+JKf*|9G1T{wj9wk3ize&<)Q?+-Z! zH|Nqe(A)QIPu^_nTWh85r*G6dL(4Wp7bwhEx8^VTb|hO`@+L%hioD%BvbiL9U78o^ zbZZlE+9v0MAG-)wO;7^7=7RD-@*y_^9vPTfO~MYE@$DK5BPXprUo-Fy+ zMlKC8sGj9|CYR?b*ixb+<%QhFzT)8Dx z&s1!@`RhD!g0cWp*~eUY8va|`?s0y>DcH>*(%Pk%=Bxf-*OT^MEP8?TsF;f1AZwxL z+W^#r6&6YFr^g|W=7-@Y;iu!6TkBtcI-qt*`;=+3N)IHziW|i(q(A?9cwbAnJgB}< zHgWy@Wa-XrP$i-0E1Em8seH1p%^wwF5!e#%mp{Hi6LZY(H>Pp5bx{b|X>I~0s}t24 zk2@wv8O_siqO%&XGo655ZH%l_e|o z<2#h*%*7Q|74TWwj#Lum&N3u5z4Gr}+-NfgX-S=Y|XVd{6ifXWI(?xIF zTYa(nc?5lY`;H5>4c4G9g1T2$^F*u3eic22aLMh>CrrzrfS5X|W9h>;V`d$?&@$Rn zyxdZ#ewfOf^RAXBoV(^^v$Xwu&*QU$EJTyxZFiNO8^Ob$AZ~nT%GB8MvDH2?|0-C*qS|4L=S5&o;B%vvOh_6b=iu{|`=2fg-ezmG{M2^(yd%Bh8 zet+o{-D1%lM{uoXPn3Vr&M>I@yiYb`&P* z*!hfTR?J1}JKc9%(?4e6<(iTkovv}WjTC4|MnnW;YT#XLV$RtLx*uA)jQWvqTn7sD zJ@HpL1}E8lqgv@KZ`zV4YeT$G9#F&&hH6%hx`klJIM9^;=^yyYCkam2hF&VK4{PEd zKv|B&N$J)o{pkoo9e3xUVTJ4%1YF%7&^muKtL-Qr!eV3SsNI~wH7ABBf zGRE0-#_v333x1>|?UeIH!=O$9-}08JA^rmGej#7O0mghfpCdumP@beAGIZtQnA(H- z-=nm(S(A^3h?70)73s;#!yu6udO2Ry%>(pmk&m=zY0OoNOe`9ew&%3@PC+fttt(n3 z<`lOFF+op#q+Jhnx6RI-$~JFMb|XZtHT-SL)g$voKeDpG43oAs>+UD8Zh8FHKG$Ze zJkDO1Fly1CcnEB0dw2)BqGBxVQu=8r|{m23>YC<&h`8p(m@XA09k0)15S&gq@Cp!>+SUxKz)s9~h`_9G<40 z-+6ZT>6nLjpGo_R-%FoAKYV^CRv6ARm;Oxw^^fOxu$=glif0QxdySh3-T}NmO<3&`}6smqswf!ZYx&iO|B~xiKn@B8;d<5$z z>)qH?cNd?-)7}2_lTVT1Zp;exj*VOHf|u@$pGsBx4P%oiao*%V0a&Feo;3UWqM{f+ z%R$m$#7q$x|AcnZ;^WbM^lWtgr9-zx-3@mSRSCtLgO%y^z<}Dt$|D-R+m&n9K%bc~ zQPtkz1))7ZySw|71gGVVZZ6wq)Sdlq|CI{SjxH2cCIzqSbm#7esC7U0$M&F5Gx2u) z8}EGgt@*#ET%u1WbLibX0xZu#r%Q7un7k7k=%=6iE>WTf(!9z|?b6$sw?}-uFl8?% z;D5a$kcw4LBd03i4U*cr#JeUhOGj@=kp-FdzMZzFn_}+C`As#UV4?WUOmDlJX(~?#)yw zd6roaYS0tSV=Zfg_X2CIa#q9FxnErcJ|;%VHRGht*j0Vqr@Y-pCPTA`%?Up3@K>zQ zpVnIUOs5@9Yr`1}`4%MRB7RA?F0-K4Rr5Blc`hR5m-w%p?oS-@1`hM;+#$O^=It<4 zN|c!&zdI0^+a9X_IAnanPvn*Oe(X^>1ZiVvLP~F*waN|3jq&)$p;1C$!s)-}MVIwJ z|HfOzb*ov|@SE+@XWzLX%XYCGwY+r0wEg`p==V?l+;?+!^M_1=&&?+Tfa1Q@xG3F} zUOqB4@;JAhyR8SEy85=a`98U}-o!uBFMLib(&E0goS2=|HS{E zl&)2J2&Y^3!)VtZshjoA%FLheE<8j$+D`ZS|7>)=p?pi)nQpPlC=E&6TxFY-S$u0l z`7Wed&%+W+uiI-?o3dp|AotJ1-2Rw%NZ;$&m6>wVW|OO-X_EnWEiaq?!<)v(z+{v6 zKiOc-BhbcBnpVg4|ZI7VOIG4N{j7cvY#;jOry@4CyEB3P~OFCfAQfqtdN9Xji<4Vvm+!K zEFaSoxZgq@*2%>9N3KD|j@85Pk>XKP!6M8R+c-`b>tdnyt97zUG*A0P%Kk#6PE%lY z>|@dQ{_sXp{O_{~z3Zmo!!}Kqehf>Yg3kr)kD8D9954-E251Qi&D-{Of{X(XC>vrh z6nVpvNy&i$HsWznOs$oH5F-w_beNsQ;Xh`)5ju-N) zeZwunI~pq5a+${Ne?y@g40#M$Tp4An)xz)VGVy#g!^Uyed1iF+-!&M?Fb)s;Ycbi? zin1P=f3(m0Mz{T~TAdED^iQtT?rIBc1awiBg1}23qpRl*5Y8{jPfp`yF`$uE9j<+huI$Na~6`Em(0qThy1oOJf@Fz%ah^qZr-;5DSjhJMp0K3KEwIWNF?dP|^O z4T(P0Mv_NhO9v293U{@HwzLsHuGJnl2ek!+*-lL0XXgi@lT9pcxq3AosV<4`C5%5) zJNX9;%+DQ?-?gmW%$xR`J}n-a<|{Q1wFKo&i3AFEwzR~r-_iSDRBtZTmYGW&q*b%X z&Rh(6CS5IcwGm9{tm1D6GR^-UMprW{fO^K5I*t(YT6L)yY!Pnw)iQX`)VOL-UiFGk zh&hMoWaC^y1S=5#Z_(eWdo&VgCYR!Kx0M-Mb1wW!+!jqP+3CuMvA_eZ0&3J$yRznAWC_@mMN6r(_ea7W0o0 z_N5|c8`?2-fSQJ<@4TE>hx=v+=ijYb?BpZ|YV_IWt(XPRGyfmfN?S)`!xsGViY) z4N)E34=5)~y?8o!-_)F*xu9_7Mc|#eEj`XYOKEJ3T>T9)_P?}SJ=?o_H8{rC9dv0| zd9f2PySA-s^s(A)BmXrVq>gVS>MA62?-NT?i6(OIt@cKs=J8>DP}4;S$sld>=&*Pt z?#o4&SM%pt`G&(S#O^B7Ayl!A4Lnvd*w?N#lHPBiqYgg|9j>f?A0~{3ClHAPorpO6 znpw*sXM7bv^i@=pPYiV8bKyaDx1#J@wpyk|);0ml{R%o3_Q>KFzh6uBByBO_EbLG3 zgb#Jhlb7!(5FJOaX&AIRiO2+6s7>KZTL?`Zhwcw|oUOl;d!Tg*x|5ClV^BeWl;-c| z=%#abyobC;yR7R6ve%wEmmPI^mPBnQu9~h^_Wn7wz4f}UbeiAKc37I5Uri1;W(}Rl zRFXa29G|$dpF57Jn&c^|(ns0UnY)p6)wK4w+D<=S@3!q`#(VybH^yr^s212npxkv3 zbfh1wry^RcJX5vOG2|lp{BX>R@*RbD)yh52`QBv1dQR+VtU2gzZ~iL0{Om3|#D-Ax zH;QDfHLB3?Rz!I=-1cg@!vODMUwYV;B2OsdL^gXOrK*W=DG0AD&HEJATa;{Jb5oC+C4)_MUD2F#Jc%o?D~wFH<9` zzlop9xt5*NN8YfsOixB}oSY0?Jbm2fbV3(!X{uD{)|U}+K+0w}kU&~}OQvVdexF~+ z^Y|{}dMsnrIyDE-ic-dqe--Zd#L{v%(< zA;Mfs5W$=7Z74aewYlL#I{V!@ibP?4#9(I-8Im=!0fXs{|VqDV1LZ<%~%w)$6ug^@>6(V zpO%3Alj!j1{hf;yd6*pkDuJaS6wxkXj{fsRuQcbZ=BC$%IVaXMEN7o5mJ`-Y3ES%g zH(fEo18L|iE3B<0iT3x_C{l&vu*6Lih!fMb6uqgv1VW=qJ?6An(>TRH7e|JAo3|BRyI5}TA@f-3nE`#~-xGq_KM>htZ!rvN+XECm8=`qLrEQ(T&deS)$NstN>G zhjsyvJWsp36R3LK8=j9>H2lS@j zj2*L@?j{r!Fms8tZhVS5J$QPYsYzG?#={?kl5ClC6W1c6gTcKfQ~i@k*j1fCLsktk z2j3q_tI+&+1a?*?4Q5X&ibPH@k~aD)+{bgbqDrMRH-b>wUCoq>3Q`!7 z%t6o<7vr!jxZWNJlZtZQ7V3|BKM_W2xvgX!LG;ofbQWoq&IjJtI&ExN)-+_m4Sf%x zs*|M0Uo03ImDwx`huBH1q?tHDX_m2HP(mPsVcg7k%YqcL2ph21@0k!K8W-FViOjz6 z`=)N>^!|Wm@0c^mwN~L%Kk6cDfJK`K;v|pP?L;-BC2D&!yv24pLts~QbDB(jw@ctZ z`JmOTW(9+zBO4hG%DK3Tx2jTtSHF~`h91L@mpy;{QvqSmjkpW9{Z3Z#G!{I4=ncnr ztu$P{JH4UVo4sNej`MlF_PDom&A2b&LVSAe$<@l&-C~EEjy*XgYf0JWz9oadS{y@| zzI-Z2w0@gJY)Ba{;5Ez7@4MVzteS26G+<&A71z-xc@49@N+bEVNtcf%xFZ=ZpdOL& zs%jQiXsVce>p1qS(!>)^GlEb**$`J~U--jGNZ%P2Djs;g$l$po-cV2OWd%PWlwqUc zVpt@?*(yvg(S5Brr&TzJ!&;I+aT9YVh_DDY^l&PHlTkSMsn&!M%0z|TCr>wRA*ru# z(bGGQ6UO%^ct@!B1UmQQ*msY@{^LH32qqlPK7IIUo1~_W@hrO9Edrpey6HqDXS;ei z>uMHt3)Q~5aDqR*3-$uv!LqQ_)&B z=4u{GMaT$s6lt?g8f!Xu->_+#GLxByWB6zyu!}cx+ba+V=x5-?(atF1^%ZR}v{DZ( zn83k`pTxWc`o)(1&EEnFnNt&E6WGZlD)|w%5o7y^dO&<*uu|}AGG~e$I4+HwtJ^?J zbjXRhgV6FBwMk&HsqaEiBD^u_GYaeJDjDbA1B2_uV8xoQAg^DcXN;J_roOT%`vWvV zy_FM-pY)C6HN}5TXo7fltk}g3RDofT>rfS7W=R#7gUo%R<)y?bBDGSm>W3}t3-Yi6 zlnsI_A}x@%+C#Z{y@ z=RUprP`3aLPKM$t{cPexQ9q8RsTD5RWP)=d&C^ue7*^A!@WCSr$%(Z7G-)5}xgEd{ zo|8oE+Hpe;hr7X)gdr-03+@0YHwxFrobgkFMV&!0s!?Mo>ftDFJQ@cE=;cxBe(>(2 z>W})8HoKP*Y<$#*h#f$bh5=~4xliMzk(%53u;A@zA)R9O>l5bm4_K5G0{lu2DDa?f zH$q12LJKO9A|-&NP)nh}A#Lkm9CPNT1er+2LL7&;xh&(1%otISCZMwh`24SHQg0k7?+nsqRZccx!nhC6bK4jg8j8Hw=C>@eot0+azFFMH6d+bcRw{@7*9XKz~*-FidhIrinv;Dr=cY zA5Bd?a-i;@AGHUbPx4Z^W+k)Yf^e3~)UtZ1sIG=mvQoMN%+V?;51$|!^}>7{O$^Oq zeuq6A^slSgy#OABWfTUNBCfW6u_7A$@8u3#JchU;Z;CJ`-Zt<{l$%i?BW~&~25ak3 zWJvysg3c<{MAOx&3Zhkbz=NdBS@}d727Wdy>brSaR96ZEj;i7D-o`U-NSp!)!6^#dD^xl0zh;cteZN+r%^Zr^ZHK|@f-pD-sd5ev35>y_W+onhtpEgd5sNVM31?u zmBze}fN@518xF>Aa~mYIYzpl1QbqyUAs<7dpFMr!IK-aPG-=BCprfg<)eh~E1e#Z16o!?x?rD1 z%T5Zz`!a%{Cqy%&xtZ{RjB_)iSQBX$kN2w|u!#mkIwCDqlJpH3|Nb2)8i$3|$DBfu zL4-9!2BqRfN!}z0G^d-kh2EfZvQnsis7+wpV;yH7X^x-pON=%D37r=l2xGk;E;)=L2=DmURm$#HR^onM*O3;W7f$c6;S<0x zo84k@htRr)zLJpa>>}zcDM3rkklr;*NI~QK>W~aC-eKpaPjU|CTF1kX=KD$Ov_Dzn zS6oC+zcdWq5me4kN=(Pz@7x>9q}FxbWAG9xuFmSuZ8KNHo?qd_w4qthwptPuQIXdm z>UcH*QMyn7vo!J>H1k(y+aoh<`qyZTEcz*1y)B|^Qz7cyQy=9ej7#cyXLOq|Vy5$6 z%r@reKcj<4FS8*5UE7G)RrlQ^h z4C9wiqyz3J`B(~{>74TIRA)$D*G93+n{-~Mg}u0G4VTdB3&)K z)x3nidWE-~9Uo?DV_aC2aLyMzi&!hRPLOl|m(ea{2-Xq|e2M@?_m^9AaX>o6{^=8< zfML+Lj9nP;vRTAJXMIj)R>&M>3IPWfyG*SGX|CeYcC?H)7^6&arqxEfB+Bp8oYV{Z z^TWxT=EVbiwMLZcKK_;#{j7Y3SfwF(@mc+x7mPvDu@ZZX2_$Upe(4e;*kS$ zfgCxepR%-Q74Z=2j6sWqd^JM|<5XK}s2bHpOF^b0^^OKLQ@_QCf&>!xQWgV!MWx2d zD3F8r3C-euJ^>=xRV>-~x-qBQyy-=^*({HPJGbY5r5Qpc8jWJx=j{c8=8Tlm%P)5@ zhiu=nws<9R)5Q5M2MK?*m)iIz21_EM`Q+SYWSU?z)#8-vc>KvEA_#mG+`F|S4?asU z@sU3Hq(2?_c^Tg`TSFWZG4^p%^V8cJch)NAC@eXZ=9SN9lJLvA6e*EWU9033uP#)^ zBI;_LA6;BF7( z%oR0^V{IR~tS}VOgpaE~&7PRwX`cYi$J&fJbKU+_`nypc!#l=iShF*KJXc$1}`oOz@jMhRTjGGTx z)GYjV#d)E!UH<*MNx!9vs!g|ZkDDlM_ci1G<`!dEm(&fP9deVUZj|47lRS+(+W~=0 zqX#3QOerOx*R|Gm^CxFVo4+di`^ z?8gURb_cm-4Uf(XL-<4ZnbLG?8-AXTKERg%Mim}SPrKJ3W{hZ=2&CyBeR!jT262@X zoKeFT3iklXqt-(={1RrfYemL3fP)4e4CIz{W*HT008&agkAJ4QE8U59j_Q-6Q590H&Sd{^A`p&_-RD;WtGHL>M^RM<(ntzbd`OfsN5 zf9h4HseQ6DHj4ZHazBrDd5JqsNeBK1*-S*f11YSmQgX zgc7Fd3L#^(=sl4bL}AoFb$iiF7KB4T83Tvs>w%FF@sKfMHNP3YFxSrhcqso`JQ3Hm zqC~U&^Kv*PFa!W6hj3&%P3_PkM(v>?xdq62uR&?WG4J%iI4Q0}Rh2e(>h`UHDh}uj z!07YzC1raolBV;py5S@$5L^h$+{@&b-S7tsf8kC`RLF_V5uCr#>N#^mfn+)$)udct z_2hb(;-0|DvoQg(ZxZ(Nc7_GRH=ujMV-h(C2`i{pX~ot9QD$H=o+BrAo)#ZmDuiqa zd5Mr-G4N&Rb!Rs7*ax%zKR0u1{n0?10teH%8w$kO^fQa~OyGAEcO$LY8CifSChL!W zk9)^P$jM~n;~)&sKa2)4#=_ouYWJ2tymQUpU&L5CS!`2KcL5t^Gm{Kt zTJNn3k^Jaxz#I#>7BK9Tg5w8B-!mL4Wdb2w+wxQzo4T?mKz5x*$<3zN7TkxR4K2lH zAZn<J}_E9@Z+dUnDl7-A5HT5AD-lFg#$;QdlVPawJEx&=7+IEQ~KHSmx_^M)`}) z0bHiieAr+)?}5J1(2*NfvMsG^4VKOnR*0mE^vDDaDxwT%#Qavoc^wa~U#?f28n$u18kR9^85H;D{qaCPt*En( zpH$bN9SeYhuyB29+qB8G@M@!70Cuop`s)?GbID-Y*$u?K*dG{E48VVKjE~k<{)&Y# zdp_x}8J{%`a}-U`jwopEQVCWiDhhw3Ol~e)Onl12^4m~xkJL{2h$uj)U^HMt1r{z( zOa(pyBVA70Hmr~k&X*q}&b`2>s#}JbCG66(>fiJW8TQC)UP6Ig(Kbn8o+b$ZZh7}a z+|yWO4(1xquvd`0B`u^GHk%uLW)BT+YdHGm_uL-BE~BMcu~ah!v4ynOSTRjKG4|kL zVerdh0sm23ahRjakwT?(A;LtaBZWw_SM2SYDw0EY3Kyn_Nv+Q~f?#J4t&r0{3M?)o z)^rMOJ;fK0&x?}LOA6k>%@nJ_lZR}dibxIe{=zxvfZLN77XjEQ`y)(WM=efMr1lIT zGHowdW~W2^vR|fGDghR*KZdRkN5;B0B1H_sq_(fAq-_y%3(5P5xo}7kIyED^z{TTMvXR}?5HrUZ0Jn+ z^*@65PomeAd5<^WvU!5WsYdmMEaATdPq9IrLe!v7n4Uie+x3|53H~0V5u2}?{OKgG zwb~?MiAl0di0bMp|EP;&R3TWoOBID+O2=$}nQ?=J#!BC!ceOaf-#AgiTv@&eR%wDh z>HnT)m$o_DaL&Lx6b<-~k+B6gS=pY=ZF(U9EG}z;RO}WKG1XQ^$-pv*?;sz>pymq1 zkp22k9mFr}tK$BwFZs73s$7ZUj*9vHPsTPqUj6B%RjqGWh+uaFO|St#LL)NmMl~V` z*2XYlgJMhQX%_N-y3%`Z9ErOTjVN$U>fr?O ze#7*V^v*s_Hbt`F(GI>ORFZm)Wc~Q0fxaDZ0tJYQo+52Rs0$-BxP8EXF-IyoV7++l zOdTr@Mm6v|Rn+wvWHDYnV0{V}+VZkJZra@dgz=Ao4V!os9cAN=r${hHx>3X zDN!V0bt8uYxnCxcKaMfRYZtJz!8$${SJHzW8kmpD}H_{-}G zAfN!qjzscYBl=Qr+W&e@W&24D-*X#KMS#X9*_5hb5SLhlVPt00D4gmAUKjV!`=A@6 zGg-U#{fA^WdpYPSrT#4lklia)Y!xyY4QdsEhQtj(KFWtgR~xW$<%rgj%iDD%P`6zLc9nRX3?lU_jD!pbnJ7-IJ6^l#$02gqeo zfQ2N$zLaJ$r?n<;EMD5OjE~1vPwis|=YBHA&CH%JVsOUFU!-RLv%fP--K~xBkh`}4 z(lQLt4o+EG_t*-4fC&OJ8C#vXcSr~5&{J2(Ss&!@(+xndG89p(_HO*cQxL4&|44*vpHTYVwpxqfj!I)Yd!-GV1AC$WPz zuA1S)27y(y1vwLkE=$7~u-n{hOErw+V}qKR*xJqru9?yyPX*fVr-w?1XtTLD&Am z))^ZOTUEIX^->Dd_t1tAr_F7{DEryk)=e!dGpjHDH z5?B9){jsV&3WuUf@8zI?qHmnmzc+;RUk-6zDGAudbt?M4eR|x#>)YHu^Chu661zfn z*oa~+GTOTM(~SOe4>}r=ozs)rvhwGr_iNa^{L1We36FBqGAWHT z`F8b@n31%<0-y*}(xov7prv05@fqD)O@db9&)kU&9|biEtM%xhFxhBE$=!*Rb)7RD zia{co!B{k8pRLRrl_aCE9(})QghJnGotY#f@;JH9U;+Y2O%gU%-)kfX&aDZQQc@<> zEI29#8>4An^tpdIxgiBdVI?tT zS{GM@PJ19>9wB{+P)GHJXM8Q6F^vKOZ-9^3LNOPfTQT1I1Y3d-_YnXS`$Z8U zDPhOdlsEe1uF57%SMNjgkfCm_`{T^-|iQiNGW%r78pG*nSJh4?uJ=87P)9 z6sm70;=IITOG!%o5T2^$#>-_f&A#k(bUw)wC*J*q)#6hb_mZr6Z6USyZv!pnbG-0R znVl2(-_wGcmKiG;B5t98uPT;AhZh6B9xb}7d#xT*ZdOmJw`fgSKWT@!^W@v@oc;$Y6PE%`N zG37RL8!F`i&aT(%$m&=)vxI3?^aB*PV-!bK37hCmC+l1sWU%QO!^o9PAn#ltQ^vtb z2A+bP!kP-<-lqB5tb)oM68VgqKE!^8*IcS)v+0`K1JQEy)4VZE{R~J$4V3k>#J}|a zGXS(>-}Q|+;t{Hw9Dau+ap@`I!BmUg$`J+p_>|o;S>Tybyt0pYYCX~7eP9kCj$-hw zL}3u`>nIc(#L;AoZq(XC_!2`c1J=ppRdfY}0&jM<%Ts}1BiIFado)Jj>{7$G916f8 zaxDl20w*>NNcN2^v0%#(jPmb*f+=WQ7$4FecG4%U0BG&KUU23IOS}}If+T&a!TW+_ z{q|j1*!tEU3AmY;i%dq&QMy#jg9RG4T%T>jOdr)U`O-kY6 zQVh_PSv~@|?zvx>XrvS_wwZu8J_0P6$uat+|6od^@>js*@B|BzSfl!jlC0X^x4sVm zSHys;oUUQ=e`qyi2KAZ8Ke_h_VB z;ee{eEs8}n&QR@}o{g3|;ZW&T$^s{HfW{LF_&v1gJ%arYAjeurOG<<@GA7Fv_LIOk zA+t+=EhNu;r+0U@$@iiI;J6fN^>Y~()*Zl<*3aTJ-i_b#G}Si2us`viF)c}_y;XWa?PXG=F#N+&{i!@0%+sx-1dtkoD@7JC zO~nK7Cco{Gzb;@QW_kxBYagM2buPH#w8O@6Cw|P5vd9gX@oldoG79z3P${{2ex#*0 zFJn>rDop{UEJd1+jEBG9^3uV>LN=9V@zy&w4n~Kz%7z!%rk{;Qlo;@1lsyK@nXWL5 zWTkRLT)tLDCDp&k`oSmzd=kKlvb0ijp#N(Dbq?f=vB1zurEsvqsUxP8)THFj;c9jx zv4m?5=!g)bBvFO2Ifrl#25{%3uYQ$I=a^r!>>`P zskx^oMta4urGOkN&WSYxy9MGfey3g27YPJzsEt)6yLx40kS*e5kCnCsy|Xp z4tqJtYK`)+V9f%&)FdEhxae^;m&bUyPVBH}RLoP-9}Vs`z*94Ne}cjVl6uz!D8Rb# zj}-Aa2dvP%2*vr9T=$ey=WWWBU@|0s!B|#RMn4j{T+%;{T4V zgy=9-Ys7m2VFa*Y%q-W~5}w}#dJH&qB~sVDum4C{q_GRgVp~~bL2NvJOl5ksl)8iP zTEMwz0AydrG^p*pwJqQgHj5zx8Ie$6@d>y3rTpzik=FPO_i|PR?C0$ft2chb8U(VZ zQ|rdrIp#zy+o~F-T2wSXL=llEp z8C+0ae9lP6%mR1)D!nG$BsbljjeqBFxW-0eKYVi= zC4P}MRKPJGHkq_fNR%32;FA-hOc|(4Yx?iF4s;ea$iQqn59TGFxFfz_U@&PRcKvQTi*Z#SYWw6b3{(654bPeB1M=NHj1ru0mpmNV(!;Vw{g`J;q zW-kFT)TQOD<1tII&7T-CIi*?EH?1<9mHG~ z23*BejZN?|kdO2Nd*i9B)nERTJ?7?hr4(kh3$);sACA_e*`qqs?sz$l0Vpi%wD@$* zRN^#ncY&>^2SiOu>X=Cs*6JwgqW^kSSWqALI%SqE zwB;0$K$KQ50ffe2pDNAK%aJL1e1HTpfMu$*j~Vui#z5`OWvq20>ljM8QE7H*F(uXU z?q!CsrkMsk?jno{{wJJ(0_20dHbeCPENV{BDCU=@j`FY2-)62YBWPVOYSkkIX`0rE+@)Y2@bTn0GLKeN`GIA%ABBi_1ZH8QZ^V%HP z@8ehk##$rBVSuIZ`+bSW+vhR9+|7@TjEhlNeuk5%x(4e7pS7OC@($^S*rTulxXoK; z?_N*L@vo3Ga_fWrJ|J@3Y1s3aLGo??xd_0ilBH+p{~Z`nnaKfcf81Htd;GJX}KBLMIO4$wy{~bR-QRCMm6dgI?x8Ta^F6n}%Qp^l zuTzpJGim)=feg$`0@j}>xmAJkT%LupFS0n(Z^IOu_$mI)`wzzkDB_WdwXNFqHXu(~eJ?3D4`Q3gsK9d<9u-z+G2rvpLxb<886%OhVpf>f( z3~avw)g!1lO$D;vv8WDTr3V^5N8mt|S=OYhkBYCY?q9nQa_Cn6>R#6QF<7pA*&O@Cb4nCMRdwZ%*Dsz&kP7@c>^1)&xERgaDjoN zK9b=`{W@hg`yu$#F%&bA2f%DrM!AUTXWH2c{`g5yrev()RV!ZtY!(H0E#|H?Bd_EF zdKUw!75^`qmU;m{or)d+D{HfCNv7Lc=3;)}RZM&yZ#qL_4rw5-Tg|{B4Z8HCV4Y;%G zAd98$wI5afm8t4CqM5W0muC1ryv9}4vh}v5mkOEf#fuy3-BqGYCM?x|KkT4cbq|r| z-EfR@tEhGb^?baC9(A33dh7YG$4{Gve^uavR;FTo6)`2P(nSe_leFM3LF#i^wUYu{ z`V>5%XrWKh!ir}#&^Mk}5-OxPz$7!`_q(o$>HaMko6s@UIF)IQGs+vq0-_ytOT!WD zGG?sO-umn_&R}8Ll#)fz5sWj@&cXT^R#-1sZZ?ZUsZX=Z{Im_l%f1e>BQ zOXS{a}w+qjVm3(&p`WQHpB>KIw}_Uo!i;-E-^6m2#l&MnAONw8PF-oU6&b8HP) z2%k0Sef$hObjOb2LPg9eYuxJn^GUoG0|6o(5)q~vDC%!^{rU4C1RW*H5r*iqUMX`z z2&QJy@s?pEWzs1UbFO!mZj)IJ5Fq67Qb;>&BrICrM@f``nt(M^f0EolSjk*WDqTXT zUPfjJhAag)Hc(|r)3w$lrl)>lLtv+xccvj@v+d#Li(Xuz`v``}*Ed>z1sw5W076Hft03s=%d<3hd zQ}x;|xLiNiZy6rwV9~Hy1f5ml-l*N2`uz|#93 zcv5blGD2JE1~N-Ik>42es6+BQb_uK|Xf)$yR6!0P8sTsIB?tc8q$weTsyZ+L_;%_D z^`QDH`(jhdnAr6BO@UyBOH5o%s5tdMxr$6 zSlOEtIb=j3BTDsqJdfAscKiMD{qr2p^El6OAJ_f5u7^_=)Q61qbFczV*c*F$mp#he zFn$C4jN#sAGi!q6MB;?B&b$Akj!c2jI&B;!{B-6aA;Cs;Z}x7wPR`^QxD&3?19(tU zCDdCGIn5q;XjD$lkU^Ti_+^47NSIu&b?x=hqYh2lf`lkZ2254oNZxyLf^BrdO;#N7%(deRMsL3^&tPiEx z3!%DhKzo2Z)Pi?$1?~6w(P*oIAkjJ>!(d=^Zd^w6uEb=C!xCG}*8 z-z==Ct!n^=6mov9Ufqkj%I8|Y4B&4&5m;k!m_(?I#Eeoz=>(y>aD`|-xm=NHIyV19 z`#$Jt#Jsqai|{hyR}(ji0uup+MrXn*l5N><%ehv=ZeD_{ zG%)LhOTDzB1@cO8YA-PK5&t+t0X+_@H%QrQc**nEfj&pu z5bEQ?doatiVl1*p>{@32^9lxdit{0gwl^KEAvc!FCBXy@3eUxi&F(h*7y;%`3s(l0 zo0|?<&s^l@{q@SVk(1i6=RJ`tp3z=DItzS}EgkNPKo@0E%+uF_iPQxAu4VC5FL%f< zqn35yEi|RuWMC#}TzDu#^TU{><*^9fIaY z9bo44ToGFv3j{Lz^uK27@OEfB7w?Gw#Z> zi@22c4~i^~szL`E>(Drd)!@#j4MG4P2aEb}8o}4Nt6G?8*Iu1zl9&0g^ee$L=Y7Ap zo~g!YPqPcgVfF**<;Hbro}=z7&cMyS z_Pr(eou7CKTa{;TOrtddX1uN|C)*Pq84B@C$5svMVtO8~<~<)EtzPltYJ$zRJfjR)x_)Adm~YEeFfHzv~_<=EbQ8aVT8Pqv>!sA|tSK zrCMMJfW0<)#A8U9!TqT`9W(OAy_eYtHS0NfPhrn!v8fGC5AIrNwJDhNmB4n{c+$8> zDqQeQ5iYVIuy)5*&X|&*`M2)_Z-Gn{WeH8NrSxRy35;*3wq9$wCNN&+aw)*GTf(?1 z)1C3jAeUvgrfSVL7qy|B`(`;)8x}?bCU4A?24(&((iy%>a^!5CrO5G!y<0Epp)*vyPb0{F?R*I{eTaxrgTc|$}2^`1B$<^x;T9ISb z7r$G$U52s+vS6v-sNyaWc4Yht&3fRqRFUh`7tM$if^&wum`OplA=EyJm)i1phAZICm_zq)rS)B$Z=b9VUHj0%0Tba7)r==jtDz$QTBP1GuXX6a}BkzntKJ? z-1qPyghfQn@+b8C8?N@nG(lLeSGOmLCzvjq-XmLVyh@5XK>Iy#{p;`NU^q>&I+m=c zEPmWkbi0nYzXRw8Gd;@!MW|XzZeyY?a{~D@Cfq@KMgRq#Ue2q6q>B~lvc`5 zF+)E{8Jf36Xc2!cDEGAO#0@=Ig=Tr6i3WV2ULze)B{zmD9uOL#4UaG8?GtU%>&~@E z9s>KViWR=O2|pHoL_%;t&Cz^gv<_ZdZVPnacE*mrBSPu4dI*;$wm10bfC}hX`(O@g zDXen=ZJlp{^#a%&w5Mzb^N!}8zqfmSC#95+E9)la(J1vt3r2?!Tus~kr|0zcZ7;4Z(xP3-foHSmDM=Al%twi)YdQi z%dac20}?K9j*(X?C>GA#2k83b@i>^`*8R)3<`}Cn!cTfOSg)N+lAi_k^d2sGpJW(_ zxNr6i5z$cEZzsX>WnJBAY?0!S3%y>#;!zTVFaO>p;j4hMlo;}N z?Pjzd+97-eIH2i@OK_B9bpzyfWY-mh)+io<;}cK50%wCQBVMzex+o_30igD)s|X}y zdzaqa|0rD&rTN1352hJO0=Si~kZ{xX&b9r=^#F53^jMgdqphhSW`o=tP<(~93RS5U zfnU7fD3k{y1-W`>f(dd$uZ17E_x2Mhtzt}o$z_ywY^B9Z{?NrAa)7~l)GCEb!BNH) z4l(5gdP7?Zt|hRbnJCGMPK1i@?g;GJbK+9^bDzboWwc@BLSw?B!-!EjMBo9;97a}< zL6nsGwyu80;qJA6Zxy?=Ep_{SV1bUE39$t5E=lfLY$R~bzKK9bUG{(j_AJod?mAQI zdESr_V=D-si0Vqi+^-x^N)a_7hVwYkAHT3W$b& zNsVN@_zdzw}dny}c*nDcU&dF*)tFkM|aTeYzGXb$_yAX-?_> z--yTh&yqQ$Cj(QwI~ecOP6z+3?7)avZw>RLj)q6hOJ8^OZM8K1-RN)ejKqN9LC-Gj zz5hmNBhS*+>l0hMJ2z%Iu82OG-MeH?n`)xH>&eg>Iv)tY<>-V)aYe6y8d1vZ z_4z$GGML1d0t~cO1N{8$Pm=j)Xq6XRS+OM^`so2m4%WHLP`M(xrZyZ?#M_e78`*Ok z%;_#_R_b(9*%SA5?QQ?0Vwm4hT}_Ba%#le1iCgz%nnJnFj4h!`%|)`THrvQG_G!LZ zb*9qnlGDtZAN!*JXr&AIxv4*>ksR7Cn7t73P0YCfBH77(j+Ix+V7;b9Kmm9JBTr_i z6=7^a6O0OdJgAws9HTm; zriY*7sL-hbUKR#x4woOjcGV3>9+>n}vB22OYcA*OsEao6dm4#nv^#5HCoN4Bq|LK4 zzXXUm<457|;xzrgM`z~gC5y-_5U_(PcICQ>)_OwA@_(dmNUXuk!~liE>&h{6>~HxC zO+0(-bVVQhYlIzbzlrbhp%OTjQ=bJlyg#<%pw2#)byLEnLAL*_D&gFO4S{hFnoCVQ zSioR;8x}I$sRK1nV;z9^SVjt$-qbJM(7ha2&C-Uob4T_Pob zj~(;tTJ9f*a@=Uy2A7|v&CEmqk6A}zG!1QJ%z(yrLc$~bg;_fGTkPBa5dal;y1q9w z;Fq6n?SkJr>U^2tA8^;zkV#~JySX9Mh4X=;+1;ednK1Ar$5i5G-IB&0H{u8Jc@_jd zAuF>`FPXK^gv2+@h1(gg<9wNqm&82Q+r90D(wvj?cYelQPICRqi}F!z7zN@>(EL*| z@kvr)@T(;W58^1(p(Kj`NnS5kEgs*eg^9<-gw^_ zy%;Z#OXD9b=b4Q6-RnQodsF%QDoK z3jTP9kEcY?ig8O|Zw0i3aj6g2b+{u;Hu!w zGs&6Tk8yo&)Xd9~i)+QdLtwF_3$T~GxW@rWSs|3+B-Im41O)vz`K6ebvQoQZon-4G z=zho_0gs=Y3b7d#p|@?->$ra+10*~+LhX@%0QdEilxi;#>lQb1!YguhMXy`)&H^*) z3W*0h&u_Zm^;V4FWkT{@d5EjtC$<>7(kOL=IrhDbVt9yc4d}6Vbd&^x23_p2R%u>Y z){~UyJ?b)0nZEpv-{%@ni)U}7_@+-9n*GDg1j8)fi}?dXaP=pFEI8;hn6d}%8$<99 z**_hD9ZQo)Tt_?ugIF2$bvw^Nn6Y(<@~g7AaJ%{x$=Mr|2~mtNrkkW$G$yqZ56KCz zfFmOl4O|bX#GmR=JaB~oWsKYvxu>pWj8-9KPGHGM)Kg%%Y3XJw2n=Gc7!#PtJY(%j z{08q4G6t_z?w&Z3pWKvlO~DNNI93|$E6D5HV0|khboKwXW-(TZNthD7ywwy(1w9_H zTSK3O%ChMce1j->g*z~GwJXVlmP3tPn|+<1!g)$WN8b^+K~XH6Hn#VgtqMf}|6U*1b#0pejPZ-* zgUMU+OP*=yMowHZzhU(ymg`>8x}an!BruuA=_&N7q+Av4Cn#V;3C&2VM{4gRd2)tt z3jw}2oe8~}JW$tfW54;1dY$MNxbUPm`y{F$ZnEl=r#ri|kmX zJ8H?+&egj}|8N#NAqwWa7S@n)8D3F^?&b0G``6~w-yq?xMi*lf%07xhyDQ|kvFCvd zWF#)ng_OtZV&-n@W7$H+&lyVSRf)9-Um^M`&{R<3$u*NB*egDRc~G0*1Ggl^#yay@ zA*lKFNKZl}th|?Q3HEksM@?uE9*O^#xXs+;*`}T^XQoi!FS+sxS-N6LIoA*!gVe8ClXhvM7r`FHq>EkZLxx&!1Al!hhP|Q)N?@Q#6i9w|YNF^+M+}g+ zz(w$xD;p&)+KD+2Ad;8MU6T2#hL50u1mW5xx$O~~LIarhwv+^F1LQjU z3S4?>IEQ)x53!w`?(oX@w63Y`;kLz^1me$KQ@>aI$fu+#%G=PSxJ1nF_yV>BC0yh+ zck&|g1|R1 zA)&VJqrBcDbeT{HMY)wLKF+CIest)@agczk?h$*8TIYr* zs%KFSZp^9K$1N9e^a6v)5x}YYyrr-qJ$?S`E$KTn0^?~r`svC+L;4B^#Py9s9=f2s zbKYMQ_|hi+qEkH`xX+15_B>v=onBo0eeHfP#hv%uWJNlgADUl*Jw0hK{3ucWvMaGg zXXj2lM1bshSw{?V5Sd!3nsqtB<4Sz%-S7 z>epSZVJLzDkVz8Y5t#PpZ!m;318T*L zSipn_ds;UKLdp5g2-lNcpbfS*e7XDS?2XlbF5j<*9K6r)8MfY=&vS)IEmlW8i0Pyp zC9~ifFJtGYW6wOVFYrNh9v%J*aWW~`z1drNGM>h(5%=J#Tl>M64|lU1v|nZ~iZ*ZL zp%?m!cgds07)VB~%1gCYTJnA6nj=SUWhXuG5Ht%fFi7-{p2$la&G7j2N?T ziDtqbW3d6@6N(W7r>5af-QR9yhSKO)ejWH!feXp&b`~MmAL{okd*aTsHkcWZElM&3 zlT@EhFHThY;iI*Pi}lCZ;)jf{Al2{hJP!kUo zm4w#X-9%65nqji|LNc}Cs~8zRCb}=&CAbth|GMIiq2Z_>MA7^V=Xm{a58Ju~uCmS% zKO;pbsc{)>CnWWL-ITE8;jq$zF6d)|fp6sBzl|&P4?i`=*%-m3ySVhX(*s%8ehBft z?my%*^;RK$uAJ@Ykvq*oF9dU0&0lHv<{ol7{{3yGZA6&JER1r{Q=0?S_W+{&7~l_xe@G zw>nwzKGoqRjv6ypl`rQaBD(**czHkK*Y1~5*O;FIe`yY@|NQD(dGqE^@V|p+%coI+ zB7EO6mhQY#N!9uHJ@1RC7nq#BjeQ(xkj`%- zMe;vp_BWp{A={&bO-r1fep|*?d4F&XgW=lsmuF361su=QzA1(e0BpUri5jC@y<<(c zhIPv2XS6sR^wm*!?Aqn|^(B|vRIK1h)sMOO_d8y%a!6l0`&Gk8Y6Zge(-!3KwNP7` z?~z*xnuwX%I~_#yJY?&N0nZ$cj$RB6)g20d&SjeQT|?j&Z?@df7h8Q+7fQreCPV$! zYL2g%(8pH1D#9~ym1~uXc7u;=NfD3vPzSe9Upt>UOI4D8yxc-j~4nCZur%-bl?i&mwxdMn*T<}7d-aA z|LuO?&K=bzanaP4dM$@5gPfPb5w+pm_bzEVzYaZGERMYXjcHhB6D_<;JAgohU-FT; zj&*9Jo@$A^)nU&(AYZLX3rU+N0-{2Ds%tNd_yL&M-2i#8!?vx5*@UiH@V zenf;n=LC)uE1#EgaNl?2LpZ9Ta{>oK&GyN!yg7+e3 zCwm9_Vf(=-GF6KV9OKCtdqe(ZmJ`EJ7pLwN8olHU z+oO$8snN2g#>_5#YxKlWk@;wv(EF9l%!w5TuJPOD}}gB z&FlO4Pis`$*}DrOd;#$Byt;KNu>jHIT*xrHh@Fx==kc%(5Y#rGMod?>+cYor$!+ zlN(>aGXD+o4c-vAHtiv+>sQ1%Hm#0}`~f`Tc_r(t=CWO0gxZyi^AV~R=Mnc&alQ=I zvLvb26236;&_(JpP|CEd%1@BWvpijU;`M4|Z`k&@`6l|Ns?q(LZJE?MV7WlBBy0lW^s^yZdA@V1-LYv5U3~2B&q{w<@%$Q792|_PTyaJA1)r z{EUw4+owik|Ki?tB|40~7`E7_QVjnjb#w>Wo=0&(G*FEq?f`fAZmX@w1oV*@hA{0x zJ;Qt*p+*UYQc#AWBa(XUm5E+|*WXj*?Tq7P?F1`pQFg%CT|d@te_ImRBVzCDClSs| zpQbz4GfU5SwoXTho68|mJFRiw@@$id!1XarF(0P+}tloak&bKB!Pj({%aVpwCnn00rMDwyqLZ!Weqa6lxEA>Q^SU zcmIVFQDuWCgx5^S*E4IOc!cxk=7;ixmdis4YZ<*u+rV;8?dwvP#$VMVY*$5V9#>= z>2X>FW1ljHiB62w6q|-W+g&CmJmjSIkoU&kow|?z^<9+{TdsA=#AGbq(lH)3yZ4D^ zMP2V3OWchlIGSnm52``T>#KK9qgUD4+S-M(TBF|-=4bb5OE5{%FhzWHb@`e*+UFzx zMd)OXX&4O0C0U9#Z=SDkAO4Y?&_)`b@zS4<|K&Q(NYbq=@Qd@5GFX6I8u-C=h6|F3 zJy2GY-7!LYNuS@wR)x`_naCDHm503sx6a*rW8NKOr-jn~_3@Tj7GIX~{cHek{B7`B z>K4;O!`dqFN%6hmkBPYC*m5s&_6|dnn*iE4WMDGVrKkNe(+V0HW5JyX;3>s0PHp4D zXs6UoU(-EJ{HQD1Z$dl8{UQ4v74q1$Qh!?)ZmIk~p*?bHm2+NwAe#8{rfr3TeFNVIO3G$yI00|+mM(5` z@#`Ntng0v`&(T9i{ncd5q4#&paR@o#04^p^OJk?nW??r3?_XM#-!xzAC7O%l*zRx*oAoIb_U zk|OTWfO6t4SzAo;Vnc>J1bKRue~)`4AL~inh4IHO?O7| z`iIaEs(ebjkC`Q{2`7pLi$tDsg9K~9)I5>QTX4912^qW?CYR#O;kn3M>v2(LzW>Gu zh@`_cFY4bU!z_(er@ePynm%>u&Z0AlnG^LqCpo73fhU;f?9z22q(*AVZcYy$f?qxb z#ZNn8N1@7{KDqG%`0c+NFTlA7{9ngOIrb?m4q?w5UU;0n`}DKd<=>Ka z!`?C(*ERnyO)=%`AtEggx3ggX$P9)O8W9^z_b_*E621|y6)o*(oN4NISA7}6-d6DR z%JHCzUGXk8^uJhMBe>kk0VRs>rMzAl2p3+f@}C1^lO}OKpU&!6XvSsaSk|_I%x-`s z-I@UjN!eVr?E8f9kE}HIaVgL!(4LWwoREB36WJ5tKz~+@xL6wdE_;N8&=Weaj=J;- zIZx*A``?-4PqyOws_q|g{Mp@n)1~m?_)o#V&fkp-#Y4`*#@MO>hn=`?)xlKs{aly_ z-6u<{7qTh_qe_En*mc{rA-<==NCqr$NolfD$G`3>c;_!jy>7Y+) z^8R!LsNrK*mmlE=fX6mwS2xN@_tjkw--YYb@TaEmk;-K#EoACTGXxw*t$pUryKu3B z{EX&1+T%azf9NlUT)h=#1B=Jl@F>v}zYNRe1R%GV%0*+#2x+*{_Izxe-UoAxe-bK_ z+`zD_qnz^c>fO5!ptNAop56L+(=2NovK}>2 zWH-{Xz@akd0&Fr6+J3|U9v#Z*MVK~frg}Hme3*SpaS;o3By6130df-`RKUl3+RKCX zF_qRcwzG2qvug8WkZyPV zz%-rbbR{f9<-XxCi*BATPEmaC_tXC5skN!;cKJXbQBMMhO$ohu6`#PFQqvr%6mZs} z2k4ZC8;?_IvS93)1E7x;2_)Dyo1Hts%#?s>R|_PiSUKPIs`}^%2WBXu19(*O-Lb9w zHsCY}Se<2WKu$SkvOxdT`IZx26@_Noo3~NkuLxY+epdv$mni@iO{%=|V1eZ*ifkz% z372*NbOH6>Il}WGhtt(F<}${NtG$WK-(LA`gzN;c0oI8Qx66Dvjb+~~eo|F(WDmGMllIu(-%oMN zaA?zb|7Uznm*imtm0Z!j+P~X({v97I4?Z5?-7+}l`D*_AFs<+Y{ok8^H*dZ>Isavt z%MFHa3g`T6oWY6LB9qm%sA zjl1SiiPy4T$K;ytMx#eb>nyP)vR0#?$#u3B65d6WI<;D1OKSFXz7gZX#( z>ohUdT3Ubm)M!GSMv@O|xVW_Ul3Mi&YzxQtQ23>;7C!L*ciwMRi@{NRU53b3(bS`D zy@W;e_;A@?4VqM8`Y*3vB6mj zLG;oMR231EKmEKw+l6@?PLRLJyeqGyYULu$!gKO?2(X%;qm!gF?#4gb1;glj1#}U) zn&pnvn1YnSpa_k^MPK(L=_;lb+JY`agEguOrHI(54hf0Su_IiT zk=8^oJNzXX^(8_s(JzQ|T_yMR6Y(}B zDi{EDjdj7llVsL}FdVDiQ1A89>_5KfDKxn;cH>3MQ^T16jOgQvN1HGpitI%+Pm}SR_F?+P=PGm zyWv4(wZke+e23Ct%MD7G&QW^QbN{=!!#8|&4}zamM=2ga%uiTIL#aoxV_C(~LNV`& zHD4+P8vDIzK8QUWg@62IUL#&b>Z;%inx_TVy`AvZZ7uQC%1Icd2seWO4XlS7Meb6C z31+ZGY2jq7?}8SNSS(iI_hvc_W{z?M$-)%!+%1dspitrV1k^+1Ck>ow} zBl-TpW$3WnB2D9#n|*g4y>k{BHG|pSTAUNiwtlrYbo7F^@1dqC${(du23?x~TBtpQ z@rAnC7nYxczplC~=uJgDqMLh3Nuc&JNM_UA!s%A+n+O4YZ_&-AaZF${g)gAIb zqftDDfxB*?m;CNRR^!;Glax^jc&?_YNWDRE+9H;4Vr>T^+twRoM>9K_wk{XY`O>*W z_I_#aB2I+L;2-cU=-q9yz}p(wb*mnKRt55)u-r_~q{g_0v8>NvG4Te!^e6M80)GGZ zCj-vOItnH7_jOGv@G$A(a^rB1$6wy!8k;gb4K5(}U?{KgjCcME) ze$Sg5N?7T2E~r5V6y6l7lxtns`{?_D({v@of&6rM<1J2guq7yE$7i&MXesce`yUy& z_tDHEX+l^oE$y4<#YHz+Nj$Cj`yy^m{hjvx05_#I#SY1QD#qNpR5Ze_aMW?p()8%g z-bXbrRCkcd#JonIWA~#*v7Ybs)9^-AAOmcI*7Ry_(!eqyTlSkC?Pe6OU8b|S1R+wT zyBl#lOn zkgZv|5q6@(W>QY#Pi2z{oRwnW47_Shu(CDm0-^rgnOd*oTr))XoewlMIV;2M_XeO z+gJ|wL|o>9K9{Do{ib$z+jEd~$0nM@3MXW`0@7~xR4(E>p9Ag&R%Fr&UB}bK#8Y-r$ z_?CchSWNR5GcE$PuL$!|60Z~fETz~@tZ5)J3-*`F8qG%Ln>3j< zs+oKIgpwSp);iI$j>h-A79E19^-pDm0sypm;`yR#;Z-yn?LTrbeBG+9rxH zw=}E)L+6@RmS2|K;zP55i@ov88qI}v#TM6wJf0`DqorlHuZL+&BpDq@5pzB7K&hXN z-984b;E4CdvOR=n!m5{yxcb8T`O7<(W5G=A3W~hDOA)p@e=!k(WRC|1_{nnQhV z?^cDP-WMe@u+;9ho>^n?MI%F>TKADmr2eTyXd9eLIKR##ks<6T-w%Zcw~*J%b6yVo zEXsMsdQiimH}qazBW~-wb~k`sP`+Pg9-1%V*9S#4Y|^f z(_Fx7dKhH>8Y`~xu*$oXv7`qgShNyar}F_F+XXiJK`HTZuCJOf19heq*&cfIsZlgk zC2U|<5t|*=3#-N}5Jbq0tr@VM(_6G!W_29Ze38!iJ+s`}al7*?noM;e3&$qEP+XDE z+H2RLyYmpnvB`^;4|K({-_4tUp#n|jI2L)22(utWf5Al>XnaMbgqQZyYfoJtE#B9O z2Av!xhn5cPqSF$W2^pb+rayeLgDA@kEmxq=FIoaAp3H3b%p1l>Zf`0rFdjxb09fbe zm?@cR`JbK9=V|}Z7$j%#84mk}{3jhTgn1NVDXdYAb$p0Z{uQ_%?yg37jkx}*C^LbC zlARcnz^+-%~v# zYUYh3KzXLUfl%d+I~m{ReQ979Th7?o(j*F#1_bl zHgorAHmVCfmwTFXjj%o~*$lC=o{JZ) zA)%ZW>T(*6#}3IL-V$o3u12ltFyGLlRU`fO910j8%wb_^>LXQOGdNuW)%oh9o$>vG z&Vf$^&7e?s<0qB(NR*0SgA5?d6N%CEWUtujnMquh8)XRdnIJ5&DPd$+{hTsKCVTeo z%?i#YZmN2?w0ry0>2|^i(UVQXl@Eu)vWgx+^Pf$IXTh*VP^w-|BVGeKr#f&>355}* z4>InbzrgEw4NbrK2T_+F;{^Z97z5F};3FH!S_dPUy$7;qdL9rxNt9px)4-RJ5g1&0 z^x|cFEbsO6vi@frgeL0Efi?Uy#L?g4g8|Zkbftw|@HyEGny`?uqK58JAoskcX28=a3jdjF zm%kXC%L3#PZC1VurEQ3V6cli-S~Xla8iQl<7sIlI1#C0CGmC?ea}I)3`k{$#3icVN zBX%o?lof_PnzzmHBue%fQC7{xp;n*m&|t*WRVb?0{Z7@_Sv;>O(riwPKsa`_Ffe&0 z8bwD5(?jxW@hjc$!V6gTb1h#w`^#hd%1PcW2kp$Q9S|SVvX~WR9~&QUYmwUB22tf> zAj%3(a(^DE2(Hn^ss94*q@IJ80GhC%mSJGLXh9GqpvZQ8w0>-K*i1XrUznl1r0>7X zW!dF$998+`P&3#;_qJL0@KYzDi0{gRMb<5(q%w#U5W0XSTl7Q@Gc#_xQxStTK_vFj zVaZ5>9eM~#$f{o!N9)O`(~p`;53#A0bw@oyd4aN06Zlbv4YT__`ET zFoejGqxlhc;MzyrwnI#)1e(lt>cNj_$v49IqM^u>qap9*_SUO-xw}UDJv)>T2PDcG zeaC3qELiaZ7bEG?7`8IZ`1ToVxT=Y*PW&o;e&?Ynbaq40qmdyR6SS9*ihM+8f#J={ zZ6ji6s9WGmpnid9?yAi8@z}djkL*(4Mfa}t#qUc367LH9+s*N`ha_d6gZzK`A5u1~ zE~uVSV>o%2!`A!E`>$+3_y5b18=4W9djQYh2|44`ljQuBP@LtvEQ=0;rBL8H;z%^q zhD9>xkF*G>#o*;hKhA0Pp(Dol)>iheeTEQ*2)YJSmzR`k{|ODQM5yxGU8?e7#Du{3 zIz|X{ZfUHUEIgcR78g$ol{9Wav*gJjNr$;}L0PcKraThb&-<9!j42=PhNo=(A{eGO z7YTxYVo1i&&Y5CDzc-=@q{7P1u=51LL~!Cl@rIXH0qf%%v1d81va4xaaehgU9^#Xl zxY@qdTunk!bh7iHq$;wtFqMz=Yc&se}IgRvaP<^ z8+(OLCaMK+FW(0Y=-`GIjIf4Y0F}OpQNxxi*vYJV_x5P>Q4 z0HG;e)wOzTdCR2xQj8Hw7bRgeYP5}CV+Wkl8)txeY|X=%z7$0h#8xhJPbe;eVpC^` zFP0E|ad4}ZgVtS9XC9|2%__J%-yRQ@q3O%=RskajmluE2WnvRJl)BXLkb)8qqIJ}- zy!4sIRn%(pREn#}RY~z>KiuO_{nu)>3~g$ky2wHB&O_2HTt`2i@rXZ?WPa`d3{zq! zEi3}B3NYA-|8dN*AOL**JfE7qNR@OsGOU8ctdQ%qiB+gRM)hUJM1g#m)+`R!Hi83? ztoV~I)2G4%hcvpje-a@5cel0mcPg?Drhb|@iDGVnx!gn1ES!(Js_MqYz1vv8xNLg@ zsZNIHmtB?c;g_}(WtC%(*pR72?&O4}M=`1pBV@CBOe{)HG^ zhMWZNR@eovmMp?;PQ`_}98${p6{k{A5s0x=oEy-0FK9S5Vh{+WP7Zi3&XV>}sv#hR z)|wHLaB|B_zXbhm*%|Qr_n(E}1G6=@{_ooI^Wv?)Q}_+I1HrLRdtHxM9O~d(spTU3!kj`dQT&j9ddy*cs`ZE)7?5Vu38yEsN z1(SQOAq8qoqm{}V7aLKF4NdluN6S{uCE4zlzzH250fMWJSG|YaztUCNf zWBMn|86h-tQa&(a*;iq_0u`Qy5fAf&p&ZXQUH|b#(R zBp12nwt3_uWTt(NNQyxw;tCJ1ueO(#g)VQp|fBgZ2GB&yTh79N}W z=#L1I>MoDH+X0904*%DIPVslpIl80i(esz9!_F5i6cS%RoI)HlEQw25mdAB+jSUhD ziidT-@!m5sHYWF=@K}e&tq~7^D*NSdU!H+qX#7bJ0cVgrN6e}o)2wb+?`9L4KFA!w z@ZLzoQ5+knsi7eNSF)KW9z@H?u>8Wp*H!=~S##Q(hsM$D8#!x!ug`ieGinK8gl)f$Xvt>Pj^xk@2Tc zgZ{D~HI%Ke=em}YUv3x{q!And0ZAh@UweG!wcEkxDfPFpJXuBg?RVTM%5H(?TnBr( zQ7GUzEQ{1U)lm{#4s)`^GZe|{8ILtRef1K-d&<%P%UZ+ksf`L^<}A*9(~&iB+Yv0&@h(WQ~IzuYX7EHk#~BXAMjPU#}OQc(t%4VuJ;u<;CH}$cx@GnT01U zlmszNC!B&!Y{vbO7NH3t6Fb zBE&ML3P}cgQwUTbm=;_PHJ@=WsM8XJ7al6%Edimy0#+EIdnX^eb{2~?WcUU}oyF>6 z)C&2lcMV5m{viZ+NPnX1N^}1E&bO)hJ)i~y2qx20Eq|f+>HI@Q-d~*8>-y2bj~mt) zvrgS0QJ5YIV?=niNhg^Y1pM&HAo8{!HBLuYvUPt(WDVMiZms6N10iFTyV|92yZIpM(lS==T1*ooE z&(kyvkuRDJ)uD$R%q?mr^@&nvw4g(cEKN@_gQ2>Y`|C)>pGn!rVvx+csud2a&rjf7 zY9*kKJ?`=Rx+*yp|3qt2-U!+Nn4mB7e(LY;Sn+G(THTqF=&{!tlp>LL+ez4o)V+&M@Ag)#=- z7_t`Ner0$6oC-VP_Jo4}6FDteChLnACk!bJ=xI$&9!0Nb=NFVBQTQ8OWlUTP_Htpk za!F^4{BPI)B$K^i+|!Yr81Jkc8T{7S$B5zt-ETZ4xYhOIc#Q5bwfkscDdd!n5B8foB z^~VCsdwTbwcbKczu?qB+i6?omdzIumH-gn_!+Z1H8cu0+L3KIMqN@M-bt1@^P4XWp zG&7~Weo~g&BnA!}v)-UG1GPtCi}v#8+#IzLEMasJB)8q&=Y9NJ{eA|kf~c8hQ{`hYY) zapGIMy%i@IU&_E=r5s1EakPbygR=uOSWl?(W=KPz-ohwm*H;esfxKkQhk2cw3$(!M zTcp_jL<{7)tryAn-b83B2d=5ML)%eqPgy=Mg4~|iu2Q2nEVJD~voxB$8-xV08)sDq z97YGHd`kSwe4F6$rzX!%?kZnFnBwyw<*_ayXxP2xB-VUw_ANol21961od*NrzbQ4- zhGsowI;)13=zgO-|MG009!ksMF@5D4=Qr6$+%d3w=|(UD*A7 z9mBCnrdhYX`?&M8uhU%7OkSReiElOV=OqYX%Cs3-c4)EF^vdS}lSApfz5S$rS zd-3;yykdoJq3+Y(t-MNh8NJ*y%a)g?{1e;rG3)Qdp*yQ$T(;v`E|8xtt9E9hLlb*+ z7UxDx`z?Y-2fh$3)rze`YqWOe{8z|!E5BAVea|`Ugy7Gp!leg0o?UR9g}c|d7)R=6 zcET$^$Tp%brRhx_9d%Qf5Yiw}?uhihg8tkBFo;Hvzs zGjQ#UmB^qM$gjIN{ZyU|GHPo%mNQp*SeUL>zBvyZYTzX(PLh7Bac;`y-C49F@0M8X zT6;J3(#did2#%3GsP;0=w!LKf4|c$T@O@#4{uPvtz&26prU~oZgjr)1ecTY=)E^3ZjIV++sUfWJ^}ybE_rB^VQ6ed=q-s-toKyKEb%spC(6*iOusn(mZ*r}u3T2`mtVh)(_t`?`qL2TYN43bwK4Xtc98y*=|tQ zVoTwR@b#7#VqeUPvcNE?xgr&Y^-{}TRe`w*!G|zPIEgk-nWB>E= zpK5Mmnw>oMZPsaf?uB_#)7tKt7lz2-XKuH-rdHNBi%JEha>G|zT66hKS3B$1AAN`- zyQ3_kU+lI(a*+M$S=Er@4j5-!U&2krm?pB|>N&pWB*d5Fk3zaH^V@(r$UE`>G4_^W zQFU?O=zXh*Ac{0d2@FH0bV@UHhja*t2olnvg2>P%46T5GfFKMK(m0fK2?z`l(kV6c zSu@_xbKdKE&xi93*6gW0Yp?bH|7vfy`(Zha;BsO=aZYL%Aniu+a!VEifcmJ4Q#W2? zaPPJ&OZ-)`i`)KOx`R)g^W+mYV}o16#s{jEOmnUIX><{s2JtyGK*3$}5)Ih$bf|Zt z*^!UG4%J1h$|4N6p;2GY*iImT>S4ga)%T;g9cD5F#uWp-qY; z@E7!qTqg4b6$A?bsXA!@k>P+KV&X?EAY6&Uk*x00#6MO!7NL>T%HZoWx{H}5hEr;c zj*xSRd82z!VT?uJCKGG3o6Qb1Eb^@Do}6?*3o<>RY_k za}dwW=)eFW)CpoZ_|!WwmY|sx4!EDv$084+Ua^Sh=s&Y=)3gASnM!libATNFbWcoR zF2Ft6BvFQjx2TTwG2tIcSSM0^<7dCwR1k{{uBKL53_=c*2dj3*&664hfY=K>ypcC`O z`Nsn*KZR&)g^Nf?AS+&CM@%xg05wog8mj~3AsLA&d7Ci*PHWKL5*=l&s*O*SGa=wj zrGdHEp3dq3V2=>(s8{Yu-2c^q=sxO%PL>%Zj1q2T$2N>cKoM@kwTkPDxk!^Zl={xi zIWk0XAbbV0Kt|CrBum8o?^{GF8WM!2ZAyaMTVvsKaGJud>7(iFBv_@G5uj`}B5P#$ zm!1*GRiFLaGZ~4oG6u1e%S{8C;$M@ILPCO;+HN%S_sMZM2-omnCWn8M4WY}w zBd9QygC2km3-Q5z9cME*g*2Xfocf-sOG5D(_xirMH8TDDKTQomKe^w2_2ytbtb80# zC9OpJ_UU!dnJ}DBDjg3UH5Z#UcQ4}r1$9nGTH(QYv6(Zg%RSkP@#BSVxL)_=QD4?^ z;qk;pfalS{-0sC{&aJ7lft;z!K1 zLrTwObAF~yT*O$ph6JB@?fpKqs<9&4Yv#(xFQjb88<@-h98^{+Qg**ltApz&LeMNp zRA9HT2PwCo_g!JYT9DJFa2^hqwali^-4-Tf7;05aZ(2S6Hq;WFb}+)8G*zsEABAp=GrI%zmxWiI;Czh5vV#v8|+Y4zZd9hjT^uEp9h04u_@`ud?^ zU(ij{`7I5ctW04(5$<2S@Z{&lHyqT#=stN3#iZ`P+B*fbaF^k%-Y5z?3W{7zAMK6Y zv%D9Z2Ao)dG^KEGnX5cuD5=YGI<~y~1d9x3{Lm*Fjb-l;B(wb{5jWj!wy5wfSQrq$ zzIo|mHKQ%P*U4(8r`RX>hiVEmL1VkS%E@zt7GcUbD|x(}q}Ug$T=A#F$@*1j!=|ZP zbizQfzZ{uaUL01hDaK-@F*xELQT_yn`bX>LoFt@T@iiQ103fEJ5vb!4 z0j}$`g!q#k><@UuvshkW&lVzqTIe8#C*#QvIXIOLsJ2hzid7$=qlvIn=Ke4cLyFf_ zxX8>Y!&Tv?*cA$)p+laGM&Y3Rzdi%zs@ji@z=+2+4;BXp{r!Ey5?3S~x2hUJC^e65 zA9?a%J8rCP!iY+EoH=lI8AecM@fgrTswt93 zclhfsIJ@!1vv@4;Ud4xAT#dl=-bG%IEWO_)cPKyXG~wPZOYBdM^;5h+GlKNzt_rzO z#nq%`*Hd?_T*ZWC`R9{xUbZR$pp?3H8aN-v2H?Yun*c^?D3GlA>Q0RX`;_4-p6{PN z^p`h`&AJbE#vWL*uMkztfHS$q#;-jX_yOmKfG5kd;YpX|zf9P6D(*+X%8Ec8$1del z9U$*FsX{BL3^e-L=v(2of;UTq1#>Ti)O1Ag(_XoWjDf31$aw0TVUnDwH;(#Ly8S7= zSf!=5&Vx32N9S?!1oJFihJMneN=nw2d+YwrwHBaGzs1Ax^Ub7bY7%J^F&ms_x8Gj+ zn|yal9~aIcf*{$B>2VgB?-F^Fmb?=r1_R>xo(NkNo5MSj+~n9=SAeDI7$WWXxJF%y z8nNSF3jumm8xQ7u3r0U#&>gF^f`LXqs$6?Z-xTz;H<4OxmO5BT)Xj1ZGCxcfufYgp z)xrBdc6z;kqpN=oyVFMYs*WXJZYL2{LHHTgAM zvCaIFXx06jjb{z~?qClbh#Tl{%;3urEvuM{sf*kxHSb3fm{*JkLGxLy|w=% z4tJm{6&~)M_upV&KrG=-^qw=irB^E^CmACQEI{%uDh9%qi0LKoAnUfiXDKEL@jt&A zBBK@?#9=;wgcSxnyNFgC1rse+Ad8VPSG3HhE-!4SHvJh0;yQmBdn(y07gzZA5Bqu6 zh_mm4*%z(oSZcgSSWWyk1k}Avs{skMpkX{$7ky*)_>c77iPsx z0sglfF&{Okz9Nr3C$5m|Wcv*-19MtnSab!DCx+5ro(=8wXFwteZI>wk45QFqh7p)B(Krp#UJKuQng`Xr^WklU;5Fi8)WuUPTK&PJ5& zHiWX_E*{sEm9^fyPZg3cvN6eIG^tV*6+4Ut?XzQaH?mOXI-Wf(lIpl>gSs6J+qip< zR|f9M+$WM4qNp1pO`G@9C^CKJVOd7#U$!}Veg)+)*2_F^rm3m6&pW&Vxnh)baKmKn zFO{s;d&5+dHQsMQNe6q;@X7ZZzdZFAIn=U%J+WGdZ1x4?br1uP%ce9;z=8f&(Y`NBv`pB#U&wJ(8or=q4 z32zb1kp=AEEsz_}hfs?3%$20ZirtDOP@&`ro4-Cut~DNl10kPcKO`YQCumi{0qu8k zEkbv0P1CPo=}%_kQM&T%$P2pKQ#I@s)U~>3~v7I-tAOxM$7*=q)aAIr63{I-l+E z%E++K1tTDqs7Ju@on-A$@&L*@9Tks?s(K{yhNjl&z&qRJ5-nVeV$~ zK6e&QAT9#DRp^X-HoJzjBFPO^8=vo82+8S{qir9y_z);nJzr|_B$U? z?w^#qJ7yvDq4A=j? z{ddZ64G+x=6TkZZ*=+k2m!uH6G@7wiRtZBfA@K(f^vW&%#*rDd;M9_s`v?G7^0)P8m^2XDvi6wdP-6 zHylgJA$pe6?8HK{#|A0xt~c^9)z>xv!?U)=>!+>40=pSOBvL(2Q$8P;suT?{ffFy` zv!%s~a)Jy)88H9zdEcJ<{Bt%@)~tjQMCk@{)dW=Fx{Zero>ZF_9Y=CWa*}|v1Fo*? z3K8ZOkMVQ*XeT)45|F zf@d>a_Ok3x{hF7;nTJ_!ACgbwe8Se|Xc4pt` zV+R{yo!H!lik@2!#limcJ#F)|!&jzr+ty$MAFWrD3!fyUAbM$r51^Mg6p|6v_=((9 zI5_|Pv-Mx7u$;n$$@qM zGDWVF!WbB)uo}3JH3u&NvX4P>xEvpP0H;jnjgLki9 z5?RW`s0*%2jRSxp#|OB2G?sQz+qm&439Q|(>3@oI%*~xcDp(9OG@Z}r#H+2YVl_dw zD&~@Q91$mbIYA`)_kpV)3i5@6@EI}2~dD{5u- zTUy9Z^~(T}tonY3wj12nyby_s$Jkcpn!oO<)&d@Qq(+JusTJ^w(uZ-IEn~&m*bX{$ z#5tw4LHrgDG7N{r!z0wJ=VaRYjd6mTGu3C%#PlM0%`;|DfdOYwT$pufF48*xztRFr z=<1TEbibC>%)>VA!4L>wzUhC_zO!K84N{0i#fG^Q=O#tZnj?ude7C$3FbS4)`Gxp7 z#2N48J5jUz6mZ7Xb~%4S)vikYEF>kc!&LNU{m*B6J7(qQ!OpU~&-V5<%g?tljgTz)gY`yt8^`BF9;%+2tGBxt?R1lS z@=~ckQb(&0O_Ova(S_83FVa(kQf+rq)g3`-O1bLHYu_Pdp$IS*64nwzlGWg51S7@N z@k8z7hZ=!Gt~zZCX-c+vwv3@Aj<=!%tN*+UD}QNdn|Jr&sAmb;yaUx%@{UDqq`84W zGSJY#>HD!dKk~F9Tk{;2vzkjx+~qmrWuX&epRDB1nKyhsm(K$(pRHEz=UkrC(m!<) ztqa^2J*sJ*MqeP$eVPO7gKCdYHg}iy-h|A=daDyNrsooG;+y`QA9eAA(`Nx@H|}%; zc{8WK@=nI|(j#NRZ{@(d5bRHzzoTj)nTw zh~S=xY{+oFJbLJ_AOJ`$Nb(5syH^|NX>eqO%H4;9_rI}h{0H;L)LQEq?p;r`TW0|% zAw_a63DwlMG31R(GIHMJ9ZClv%0&t1*pDF+G#VIzTG1j5Y^J{tUBx&6pq4R+y&eXUiBae z@;(h4YcK_fII)`Qe80@D-~#VQg@t_6ng{k~-2r8DuI9gFaWLdg!6cHu%=!2~90?Tq zEWKZa%D#uR;a-w<)v&?;wxIY5lDwy z`Xa;ZOS2hb6E<^1L3+#sJ`ZNo5xK9fS009vGK?Pq^`!8OYeAJb{t}~m-6~+1g;GB* zk@32`m;5WrV@}I2)afIeN(iyVQsflyelcmLF_e~fS~5lnXVo3H3qOb2G5#fC^Wwtq za*<9P8~xRiK6WA)(p2@mGi{%NYo7sWtMN_&bG@<;A9tYwY>WIY&+bAimN6#pZDe#( z(k}Co^xwP|ri0U(MsL1&w{(wMdX(?>Yl(VcY9P|JaMp8X4IEp4hb@5A{kKuo@+bWLHKHvPVmZlxdLwC)`M(#o|Co(>mw ztDruWcy&O0$g$ix(1@(^JQU284j1C=Q?}hWIf1bQY97nM&y&!pNPp8sCgbKSY^)uM=*zaZ~3e<)x z*Y0oQKOFLu>m6vowOVJYZu_sD#(1*hyV?uDmOexfj!u;!l3rhhD4Zqt1B^}cW&t`C z&B?P;$MBdq2~e3>cAcd^?at`Nx7hL-05jyhvtBuWP~yK8v9LseWjfWSRo$xc+51BK zl5iUjXi-c2{daeQbfByaE-?N-;5!)he~8}v-|Eo)Pkp@LzbvwX^@Z&`?)-w^d^ zU7$tQ+8KWAnQ?&Ao$M;1)87?dVfUAj0$twhXB4HM;E#_LOGEB7Y@oe<{|FBHD&2wn z57Zd4)^}k!FeHjXxT?4)%$aNwKrnXMtYuxIoh5~$R@R-Yzp#BCfTJj+XZYpkd~9%a zEXDDXZ&rHfz1ej}+{O=>cTTln$3o3t0RA$8fV;IV98B-ySF?@fhcV_yq2L&&Qezft z&a+#$u=skVWn$l3xki-N8wrAJ))3@;tX#CXw#T!}gaq=%@0|!iMg<_Gt=&+*4v3!#) zD)!g0raD>zn7#s0a5Nuo9Z>ck5s^NJ!9^Z-;&^JH>@tux3|!n?q6Z#o)YH}nm_NJ^ z6(Y4pT=PIyLnryQt8@72xp^9uf#%P3=2HO%2?vU1+a;G{Tt7{Gv!gW?T^X^z82Ht| zS5}mN?tM_J80MwXf%)g zts&o8&}e=449vvXku-WSoahFVFcJIF-=QO(^&D@@7EKzuXag)*0Fg4K(IK9_EZ_77w{7?d}2F4Am}JNJa`3~WaKZMSl9InyVZ(7 zzKG7i)5%NCy?{Z3LW(x=XT}ypT6*a&Lk)$t#=dktRdiT+o`s4o*@UyYAht~OvhKO* z&^C@P&s+Iew9Ixq4`$Oqc>ZB9y{UG`qsh`&;H3YWj2}h2<|d|##ycT_R2k#`ke{UK zJ*z&6uKLFhc4n5^SYAs(elkD5gPhI#3JvzRuvIOhmRF1pqjjGS1mYHOiGx!OE^(z) zvQ!Uj00Y>XiqktxD81v?@)c(X{lIT?(r>Dtmu(R?v1I_5u&5i?!3W#PCzl>N|9)Gx z&bn>cJ)l()6HW;@Q=W0WPSzd`joKVC@Rb@-GHWmcr&z?Sssz+_aUEOVVVYWsbmOJW z+QkLtB;nTVft#%TkzapPR*T=keLj_jCsuE=zul8;{M+lX$+HUM3OX=WA$|4*lnH0wQ(xG$TU9mQN~-G_fbGu z00=4Ynp^{i-i4|7;_0ugv;Wcanq{O5;RYr@LbYgJZYUS$wfRC_z*u-G@E10{AFDPl z+Fg3f!;bB27_t(OdCD;DpC&(@zE$|Ugjw*6yX-{pt}gsYV4dD8So z*{QDx^!&OHu-v`Olh_nZ<;4$#3d!a_$l`$Fej_tXK>N&*=EP0NVxH*E3>*YA%KnAd3JO#(pT!l@GM#g< zusoG9)$dQH9`HRC1g1&UYYC>eESJ=V%*@Ej1Y!O-sx;AypZ(umdEtHMxU;7919zzt zp8@V;;hU!VHtaN7k3G(Dq7_FiE9dLJc0}|@(k~U%fyWgP*p#T)Y8#n-&sXy2-j4w5HicTCLf;>~ z{m{9|cDc4G8EB%OghAX@f*3M#M>OW47yn?BVX{$FNe2)|#cIqE4QM;nrC^Nq^8Q;S zQlf6ZX~=@(fW15aJxAmml(!xaE3&G9yo^?N=G|X_eh+aZ0-x+QIHag!_2Xo*d0pFmR;jYL02)n% z8TP?C@Lav;@a`|x_;X5?mTtTblpD=w}nzr@lgqDnz$|E#9bnbbCwJ-|jcrrmWi91tjd zmQ{omXF2jIv1A$Q?=~z?ub@!dC`UeFAOZfobV!SpBz{&aC1=&&_o6Hd-n-=kkV_L* zt;jNq{Qaz$qS_2NmYuN8FS=XKUPL4M<}q%IkFE7q8yiVVzOozcYTZUWVhDf>K_hL^ zx|OTVab6mMAqSiwn1+YnsLwP$ap4yIU%REbaDOpDx2}EC0r(nm2EgL^I_?sy3Pfpwut<~2tnj(EUq!2-|c&{Ml+J&eZ?C~ zlmR_8r)}+*DzAuUTF`odzCu}934ZrqAAFEP16UcQD>ONyHxRWydIzvZAkg#}O20K0 z*kN0hgU1qH=c-`F#s{q2lfcRohb(#H!F^=hN)0^|V>6P3aQlVQ$^Om4f;cCWu&*CNL1AH}fPKg!@6wC4u4k#Pr{|5_b2L57enuIht_ISo_XWw7k~ z{`7C}+6CV~=5qF)i^l-C6W&BY0K|RWVfjnJGj4kJSd0#|A{p4&GUIBVnS2yuKIp8d z3k&NYRDL3jFv^ z_LOA2lafNyk*0b81M>J@UAU;4^SSUvsN=tXm9n`TjcsWpNymG>F?Ev-!zogto`6ls zpfv}GT7J)M5x!1v%glH&$@SL*umZaHfb^{FCDQB%mG{3E!+R*#00;%1R^!uwOa_ty<~ViDdH0EH%G-g6)7&xlx&0Iuz2p1;*bt_6QZ zQC%8ak4OS84^^Wo3cA+4UF`B|Iv-X3igbA`kwCYP3-BSdphnNrh@VhO6|lI-pL40! zyMoQL5O`dsy>H~1S(a9x_LuQWs0qI_^BVOH4m-r$(A4(9R z#{D=jG)qWWV9rNRcU~n>;C+#}CVs|oOun5FCd&XgGGw~?*WnfIeKS(Hi(B=|W6p>9 zEh2KDdHAN0Or0ojUA<3YCGxjVBBS6ZE=4%Y>KD3v2fl*JU9YQT!3@zrBL&pQTmO8_ z#|lB3sQ}DV6i)srG%#cz4!?|K&4&D3ni$J;=#spU0!;AJz+6<4qNA#=H51+i05*3p zUdg_RCK|(JIa=;Xd7}bz3!zhHAqIm-2WB$(v4RYO1r z*(jDJ4O37D!Jua=f*IlhSf~mNa6y@Km)m?kS0>=$oJ2_&AM&3PMNliI>mmvsz^AY_ zJeh>aHd$2FcIl`XQ3FT~n|J`}?1&$!ZGLWT-`Rhb4QcrHs+8Q&Xi3{ruZ9K&E|G;B z8UMWD)*BO)g_MDfD#Fe8%@1$i2E~D+&tia)%8&ap-yN%&{Q>-DXgVKj-b^UxNL7;+ z#R~W5YzsUzZveq0U^Z#**{6$Mk?p}q=%2~wI*ODYy|kJHDYc>^>U4S9Q1iLc<7($j zJtu`+hg8CZzNcwGYGRh+J8rG{wQZ-qCMdOAV4yPTo*sVKK;nd#F)r4ER|1m6@^yY_ z{Ci?D*T(dCBvE}^{SavFj=D)@89(hBn@pljVipicZ8mr3rXDn5cu>k!vaPjBNadYS zp!_2Y&MUe32wW{49aM)MORwOJzmf(7Vh3qM6r}}XQ6aa;$U^+3I>qFh2`eI6kJ`HA zi>A^10=og<#485}<;~Vc8$uT+PQ&2@RtY`gm3RE7z>OZqI1J-!qqpD$mytb_1EN(f zfk3+Wjdp--?rlzU{7PMOe%q3}hK8?80X7CCMs|auvI33aUf?1YgY5^V!k^-SB;f4d zlLK#j>@{!il!<2hrGUf=WUosBFYc_%GWwIHn(S}vz3%I6!E%!pUMp0G>4(SPm(qZ6 zK_=v|?7h{5vC_i2wB!?4+qOIprFm)&+Tr`0F?0d5IQ4~?GUw(>euqG!UA?EaMy(w; zY3D?FH_7Uo;i+cdRV_Rhou=%hGFzpfDL1zy0u#OmRY?4C)5LOJODJbH0)5=vmMT1VS#XvGj&Hg z_{-`5vV@Pp9#yhp{+GFFs7f?&LX%9D1}dV3OIhC!UE7F z9fKe~;AIDK2N7%v5$iA;WA5r!w%9+fUu@d*kqp{!CVi03!njf6b|Mz^lXPiwQI)?t zYYb+z;cKn|X|>nEE1Ds^l_9l_2tLGZs$uAj$9uQ2%4NVb7?bUjze_5~h^e({i$dqV z#Uxm3{?LEXM3W{WF!V@f2t++S+f4q@L8|{J(CN8#?g(-2Tk6DLnvxIL_2RM70m1ZO z=|FR>5`JNJ<1VY{{cw3t7g;F&JrF?$mT7gkaO4(#G!JJitkfA2c|DX(Upt$k`f@cF}oUY1zv6pMF}<#$)eICH#uij*<=#j8<)~Coq&WgLmgE|1Vz>X1hNeQ0k-B- zii@J1CdOA3nWyA!;8gjGmpTWxZDE0f_OOTv4R>6iNFv4w(C8G~&GW!J)$0qypN%Xz>CZn`-l_npZr5kj z>EHt$#=<0Ps2^I|YM9rlsnm(tjUU;V*pRpG;7~OFl5RxRK8?~lNuOaXSLU;HdBVN+d8W%NoQ1M*%4ODk>a*z}h|uwVW~ zzX>e$$B(-xFSOJ!=c@4tpz|8_)Xp4spu#$zfQ30C{iIA;qz6|J0drB>;r3&ac&Uu2 zNG$h-NYK&H8x8NOSQr3l&=4|+E99Z3cPu8M1e|EZZO~!&?q^71P5e@li9-GuE1PRwU+z{`z?*^6cvjm{VR*2C zz_L%-TqFuxuj~LWmyg)PujT-{k>DUnv@37no|EfG-vB`6`w~j-&Hr2e{(o}vuP=l` zE_0nVxIarW8vJh*oQjM)L5O0IbMwV6X4_46MmFfFSjfAEx_8z8BY)o`i!J{tmG2Xq z?z`fx#bla-Vxqi#u}<{pF$3uY1OYH>NFn*i?w%JqpG)Jj@6>dFgBJR=;($%}>+f!d z*aFd^8%adX#Uv~hxJUw4RTIb+<)j0}pu2~_O$aysOh~?OPiSkI%%2CJ5JcXDUN8uo zVdKoDMfu4mm_LGGqv$@MoJV-P9@;n7=XXV8ZQf?~Y`Xk54r5VC$m7Au78KVCE8!AX zefIXIL<=oY+Y_HJ-qZb@9_ge7+5Ae2Y4ioryz_K;gyHWv4#_Z0U{eO=RS4?kkfC&w(Lj_vOZh!q9SCE7tj1UNR<;MHLsTIR(7r89_0nLn`WBT&;1@e_ z$;7k%ME8hf*qoA4?6l?&y!+pfQ9Y9hi|8xU91^$wY(4?KVL~#JrCa)`=$apXH&S66 z$5^N&2CV;?-)CPT#p0f4S{~kzy24EdX{8>6$&RboRs(SMTc(9_+R-^4zcgm>kn=u? zNY-xYh2joeyo7C($4cjUnwLcB)5yjJQen_|5a`HE-KC zh5H8^us=@zrCpS4o!j8#0MS-btrMp$oU$ym)uRlQ1lwuFs3hMfbh*3L{2kk(|3&md z&>5wLO!>qcr6X_xVqzmW+wSBw>1@;<6Ns@nf*8)jPS~xbJ&_HLNC&W3(Sr&WgqV&f zpd71ZG1!n?;3O!!KX@9WznHrK+h5$i*5vf>o8x&?D3`m6bbNVXIRfcoTnLAIt8|0Z za^gi6*RXbE2!^80uI<#86&xf$Q_j{g_h-p~pMQvL#2y6GHy}3$HJq8>HrcxZ%yPxk zu+q`Tz&|Ofl$aeFFd1%xM0*+q%JRX>!2LPloJh0U|EK!y(L8u9-{gn+G@c~=CC9h+`1o-A!spC#i83(eNlv`?-CtWmJw?Iw z@}c#jP2q=z^x&G%?ka9{Hs{0#71*r-hnoGz0qEj78IKeZ0B5xUoV)%*D%lbj9TECa zI6lY_DGJ-COS&p)?`50&)Th#M%EDjRe3-2E*>hwzHpAUZr2ZBUZAsC;<&K`wY)}cF zLaG)5@=~aha6r2HhENn7-W00^4*H$tvpKh>J7|3IOaklV=q)>ft`eA%$ZCMt&rf$@ zy<0_W2Kwikv9*g|;c#AYb%;Ry`&qr>x~|BVPiMqIrCNcqy$)^?k@AE$fOiFK+uQF@ z^silRBz$6OID6NX;~)WTa5Q0tORiZg9SF(ZD%-Ic0asu~BIs7!ICJ?*cDQ0wW~1<- z=5lPikP5^*wjH`F8QGxUYgO|(gdAi&?^r#K4C>B&g`2|CuuVfExgkr9gsCXdUsKg1 z**;3+&#tYuOl6DvFk}Kj$3S-eA=jI*u1xamBKa;M<$f@R&W+!&n3FW&^m*;q z8dlf^1uy^Hi))l@#(5x9Jse=|WHU*U0f|4&&=k@OALwSoeQf8)K?>wY=};+lPOI1r zzh|~>EH}3{V9o>JMg-w3NUv3Y9@UxzP__ovVXitc*xJ6n=VhDEHl7Y&WZa zM_A|Px1mB|A!fs?zbC6d4IrMSlElh<$^%6avGLl7Sm9|j!K?*1zx5AGDFQcS?Ams4uy%_!6{^NUR&5E-7QQ5;sJcn zBikE(6C)j;U&f-6%HXC1^iS?sOyrlv(nddTjgEM+23V7%{a9fmP5agZrmf6Zc@?+M zq^Q9Y4=t&jy%Sez!(Wr_;bVWC3ebo=QGHn-bQJ){!0`lb+~UFM`AhV#!8{QatY_$n z_-JmI>!^mgq{2^C=R}>0rI*RE{q4XGHXd$fjJjYOgiP}1peF> zA7Wm_47VQ5c^$G`)zk$l5>2vfj$JoEf9Wt9kVU1p7}?I;00a(*;wVbhO31$cGC{ou zADBk7`??siJft1MW~{`@$G zt?Sgoa-CG6IWVx4g2riNn%en|*dH*bOGiMaUZL55Oy7aor)Vc3))?cbMvEXDI$?d1 zzHaEuXkap1khUfVf$`bd0GLSfZltsMebI9;)3;*Rz#+jObPl`_PuFkz>;Vu*vKtJ^ z%=0QrJDyV47VV)><)NfLi%B2-*GjvUsuevw+IqrDPzic5yhyBa=B~o(;jA zxA38@Q}-PM4k5QbA@Uvh4ijjLj-%nX-5!CV;AsMIt5ZS>FBgTMFHPrSd<3!R);fLp z*al<>si_Txo+)ZNYLohNy?QmVm=Du&S;)ExW&WoU_*Nk{`$Q^>jWyZ+qlYvgWq?(qYN74mEi@Z_%+mHraj(Y$y#_r$Nsq_FHSn+F^1-AD_vwnyZQ z(_=$m%r!Mq-;+V(CH?NR*07q&Uav#Qd+p9j|DVt*&6ru3#1gSsU#2vSI?M6^(huo0 zA_7)Q`@!NBOPKsd0xKH%bLX(UtxJowqpR&YNC~dUI*cn^ zAS(sMvu>8Zq8f<8*YJva_&^BmtwA6m31^446C*I|ziOdF75xPegP+q>wB$tpjeP87 zQvPJ@b>PCN(}^tGR%pTBQ5X#b=K4mYh72N zUwKpRXfg{Yc?l7W3*Th6aljt%81W(Lp!Eaq6H@NpDava?RpS+92`#GEU&OZBHh*9s zJJ(9W1A{8Xk0P}SiI{vR^T6kkBzX6}QH$!w4Pi}W`}KmW&=ZLpPEO?uy486jgc-Dk z71k~LnDu*#NvNL>y&^L`jdh)PO;WoH<1BqzsQQpmuP}O>l_N z7g3d0`pzsI7P=$15G(F@4~zrI0v5z2p7+%9RHxJM@A{BNFvC-~1@so*wM2MAvVfoR7#9q30u=bgU)hj#x?pYC@j}YDIk45Y z^UWL(Kb7UX&EPSbS(j*thxHAZ`FUq{MwIpk=}3CFM7so#{)&SwH#A>W*pnC{`r+0CmnqtetNnw zZuN~!%ZP~6k$xCqhRiqrR;_u* z`DFC)-{%uqpEWw)SMQ%mgB$%-$vW$$=9j8#a9Kdu+giTW}1!+$Kh|M$n$rNTX< zDZkPRboDTeXoK;zIfG}(Cz6yJ-iyi^zUJl=^81npg?mYUo!VhiX#*CR=dq53SqM+J ztoY8YiQX{{#vC=4EXk*K_0EOMmcF8*n~&X6JEsvps$!?+j04k}s4uD?UOqb+DWBS* z4L5Ew&62VjsP8O9{uW6OswTK;Q=?(Eo}*}P;yv?u@TmOsEJ^!9;5{y^Ai)nDjgHZ#+(;f5U3iqjd@&n7^`XKk~u- z^4$Mu%%d)Nrq8WGN!C?sSiP+aE<4j;xzV3)==*I68TI>jNjqmufty2#pZT`T&8QIH z$1hCFPsVeI81Dq1TbOSws0fu0Q1*P**s`jNxoFvPsd#$5%7Ie((sr!3{waS4?Bp0< zdwf+|WG2KSoKF-9?tS>Y2HxBgEO%2@Y(2#5yg+>0+i~5GjKbE3L6xjmHt3@JQg}+Z z8_|h;demOuD|l@4xAnWG0pUJ7sv@qO*nZoTh&_{7J9 zhGBPm-YU3(sOQI0KjUYjCeqV^b_XAEvqQIwtr}m!`sr|zfHQ}5-4`^%uDMUCsn+{q zr8m!`N@jV2r{iWyeuafmHLjI4@BYdvj~>`pjS!KkxCmwZFc3g4bY(#>Fl0~LitZrf zxQCvkS>iS$Nt5?CQkSNSBi^7nxz&2OvRaJNo^!NP)lroOBC>vKe8!Ai)VzT0o4N<0 zO`VjCN)7$uuFTx|=dWUh6EWH+ynYokOMZ9rt@<3P>OZSqtIBc6;A*KzJ&GH;Y5)EB zWNM6WJx7xLol)0|R&lA->ZvN3f0;r>-w@SV&iHm)=+wEtQ3^^+>B?O4GwErYtr5+^ zWUsYi;`WQQ?DBZg#G|=W`+=9s7n2HdU&P7Ttv@!bG@jUa#g?Y3F}g5G2&M1)_&4Zk z;j5~E8~bQs!OEQSJWq0$yA36K)L$|~ z^hWnNJLqMq3W&G8-ARJFMlhdT^`Y)JAdT9z3~r>8t$8jNeth#$I!CUz=+Manb#@3O95D30M^0{2ix%f!r)ttd6+PTY9nrc%Xoimjq&s$9ubkEg? zlI~#6%rO7d@?+@4O81w?S}E&A9?oJ*!T6MnZSu+-RV|aj#UK8?5ai}lpo2c{-sVf~ zp;}imIS~;JLnlpgs+9zfyU2Vh541`6dV_2DX#SMV5!ue!bUJ<>?J#9SB#Sv4dDp9z zd*`W4Om6Habnro;=AD3&7QxEl+c`(4=jEiS=qUX0kWC+j{_>QL3w(wz8Z(xZ+h4Pr zAI+D{@&#{&)-=z!1;@1ief+yef2;^5HmhJ^T^`%e9g z^`FH{t1W0cK7Om%cdK9Jd3I1CDx)!T`R(v@cJj`m-N3gOek24ZJYW{PXWA8}N(+b!ERM*Ey(dV-o!GrML&;X4*Xtp{28@apGw_spmP24F`>_5QbI= z+da=4v*^@E4@rYh)!VY&#LQ`Ac2b%vE+;Y;%Fh09#kJ^#)DrH_=}`y2U49!^?;~wA z{-&K+iCppc?M#zZ>4LmS;Kp`%^M(7DtSoOA&k@@itGc-H429635Ek3dM^aYaJzMtU zeV5x?eW7Nv+IN1?PfM`enPTMij@oOVt@k5Pq4NrQ{fnGET4v>5a1=AcMDzK_pLF(* zdhg#k@m!WMycaZYNcl?b-q`k$0eULq)SZaAnNcs2zkQsTQ8@7X-emi>;uXL3^>6Vy zZ;sDsp~wE!GY2^-m3Qo*${LrdU*F})SESgCY33F;X_oFtR{LuI zyqBZ<|BPw*P!>u?UGi*mKlGbjH+Yd8(ey)$lWsKd__x`?nC(!G2@hMf42|$&Obs zFQZ2SWBk(iaxHj7##znBD_a4h1LbX&O3xn}YUK(vNMkwK`6>3%4z1O#*%V)>h{iWc8Y^ z=uMD#5AwgJFZ{ef?w#2dt3R>Z>=SK6D5+(m^1q*ZB7uGGzenA%k8~=`He_9S+#K`Z zt~XwVi<+TDqj91f)di&UQJ)#ts%DXF=kQf>lU1RvjXm8v&p$uGV_dB^jr-Yr)i1%;-2UevhPq-Hsks|`=oW2+8N=vaD+N@j$;?W{0cg9LHsKEwZ? zgN@-q3DvgIr?0vY?JC>o&$wUeWhR(fzFMlR`Te%6dZqDh61cvsM)a*PqxeboET1;i z@`>C3-9d&57!&>g@p^^~72-csqO$HvrI~~dA0x6>9b`uRf1TOCEblLqgW9MG=$24^ z)_ynh>2YuUnhFUmFas=US5KkVY6DNFkI?=%|GPfn%xjP~9$*^b?fsCpBP2fIcNxHl z{@npSKfvHwy3g?nZA*uCS-J&f=l^e-2?Svgh$%#L0se!VD|L%U&Ig~7=6P+-^ORUs z0Wu@%FZZRXDhiTmvDB*mbkicLg$sSCv0N%uSX@S&YBnr=qQ$QdY_d&8+&DYd)A>!Z zhIPKL;jLXbfNwc`PW)%5@k2gnp;*yA+C^~o)-=h?fS1f49gqxNejAN?B$78{YwQF z8OwZ&g%_tNrCM>Up*V*^TW7i0iqR>AK5nkgft4b zaQA=9G4mf;?hJnuBJT;vOp$zC_4GH#UlR-Mjt5jWo zb8*=D1CfUl9L+p?zP361q`Z;*`l#V+;Q31&Gq);+?v~(3Si!%X_g^bVXrJQz!IK=_ z-;!UduI~8!_Lcu7rjH#K8>d9&+r4P^f@Aogd_JV3w_FtcVm^<52 zjDtY3?bZ$}w(2@763~P1M{QX+_C{srZhhN*`xPSy+Z1ZVoZ-dro zod)bWdS(aCl2l2C`LqHxhmU$4~4GBTP^H7 ze$@x7;OYctvF&WR^R|jHlb0b6wa`hcazJb_zj4KWC70bcd~3IEy_sRUcVki#rqHtmq!$%0K#Ak$T(#SjJmq#rR#_ZoVcrxd%;2n64=w)dIUarq4UXwZ>x;|Zw}&Zy7dlUWD9?$^IC zAm>>dH@)5beSO(@69utEU6Nd96q|Wk6S_uR9fnrFum^b?P~AOK>U*R8_(uZIr6yRo zg~sU4N77*6YEivC(x0Y%5>%oq^?}UNBsl->+Og5xHa6cj8})|qj)}7~(Dlzy#GTOV z^0{I8HSsDM0n1GaTPh9Jws)=s65%Gn#@a70S;gC*q9Uzp0bf{L{#+e)JC}6l92C&~ zy3No1EG#&=n{6egQU)7BwQpa)H=y5;LqsTi-&5t^5^&;oZWFXLK3Fxqdd{Ri`ehSj z7?(mLFv%=GCntKn9(!jRU!SxdyKpP^rmtt~V$OFd>RH>4>G82-hhvikjHAkaOsZ?a ze%#+Ph4f{Pxrn)X!UG@nh3_e5B+2G6J?CvnI#2FZ`kMabfykZ{3`oY1nmx6F%u@3t5BlR!_!A2NF2~x>q@E=8AUT zueF|icA2tQ$y#3xm~N=Bo6+R+VR7^DC5Vz1n-JN(Cnr5}(JR^88vp$Bfg06?Vbdo? zP_oBxXNa2VL0}^ox3KbXJdfMwubVh!5bSDgV0&`zcO_c6c@_>+yEQL5c00=A+xCMY zi^;!6RUNpNoIcxk5@O}5{y*eSoTl6AWCw+o>`s1;}Pb8umoq!Ky zaq4#-r00#8m2#(a7>#d9z7_bTzRcd@yZFZ2m*9L&@3ZGI1#A}Me%ouYs4ep6i+u0w z$NAPn;bc90vo$6l<7&x2He6|SCIK5p4J}u+x$33Cm%E?0EPR~#Zmb*hjia=ocoPky?kZGRQlN$CoEcvt*Ad}l18(>vSt^RmUo z)|C@UYA-h^3DUAw@U~B!viWq1{uO8CGgA+WpwcU+4E1~xgIqMpNM_v!(qF%WO}xzS zE)y;v#&vD$4yE-T-KYjiMw2S?lpwkBEau)RpZvAw+q-Krn~fS3GVh5)9q&=_YsVO3 zFE2dW>8KYLVH9=^Gtpxawb_2zoOcP^UVc+2ys(mjGUL)wY&dpvfJX-lD=j$s`}A$f z)Ea~TOhwD#(tPK|!<{Hi{n>0BAE#Qy8joNPTec5rqiRBc!W3TBI~SUJU8_3W-zPyR zf~9Yo21y0KwKI9MIZQ3Fm#pUFy*73cyKxgVt!i1*IZsDuGibilCz47rT|9Fg1Ig{k zYs1`A@sukK-}3K4WhtjK;?fk4T2z)KOgW44*>xwUTOO0&2YIvvURhIgEuBH1I)tZS zdqa6F4sKImPdX$*@G=@%!WXGt%CP|7bPLX@c=39>uc z*y(j%m|hKjnm1ZC_o3LXCirfy`m9LY?eaXR>-Kn<@wlYwY;nrB`nTpGGN-cp6rXd5 zd7Pu8NyO&u)jBZ3Shq&sM0dPM&(`3)xmBm@k%)i=TuP6J)Vr4*=h!x_Td~!NCUW`f zv9YIew#(KF4V0AJt*XJXSA%{Ob=v6Yj7RO{Uy{Lt2$_x2iHc6PN!xs&Ft!X!S^pyvm|0 zcv@O>#HRnYSVYy-0FuhHzc2A}K*ft~!smu$Q^BCO=|<;i561D&8TUXc(o-@QFI)5C zD|lgt6Sdju;zje~t6%#GDXY_uc-_NhX#-X9e;b*u&U)Y({)j`%;@PBrAyh z-Qv)J`}W`9@4a`XJ;?b&cLQX>$vgeHtM|?R(*a%*0r}41D4d_lFtEgs+BSUVAqjrP zl;ZpR>=r&iBwrWzTE3tl%r-bIhlvEY%+4+1akJuf3NDe8@SL_b`fLg*W!>}-|9tr? zyxidvZ+~In^Vka-h6#l;arwcEy_rJ0Nl4b66~+0N;n<)!cHK|Ma+0+1624cAVu>CN z9dQ?b$UZN-pZ%P^!^4yG4s0P6Oj4J8NLQD*T94gYZC$><6~LG<^>+~wuk-PAykHD) zBa)KX9pmzH2_wzQb;%x(uJ3qLsr|7t(|J5^oRcP^5!+?*W^Gw;X!&qx!B^?~>#?~x0Wrvc zi3H7GE}6X1eK;O`@IPyfS{1$dskgi@edBvQUZU3t)c4%e+~V4eSJBLCmFUx^Y4;^a-H(T)lSS?QV-Ss-7zW+ibcuP#-RYkS zd(VybEXlx=KLfU^mnUN7PNU)Gksmt~9`q$~AHImR&~TduKGZMVUC-4W_QH1GbnM;_ zANZ_xz7|irM-D^zo3=K06Zf=A;->9te{p;D{`(I3{lo2a)SBL(s2--H4?TY=*h%GA zzT9;;wTWxdPB`*R-g}O!X^A{NA2{6pP^&tz7`?H8Z>ba|I(mkc#ih&>ov~rLPnFz+ z{SbR_YvDmL4SdJgm^|*N>LE*_nd0@tAJdws&jrxd#SQo1LBDo$)6s3W_p9+F5=t!0 zM|-1ZLLH-cx;8z^*LP*DqQI4eX zNRZ^BS7Y~BCzk20ws%ex?1p|6veenJqnkkbS-z7!?4-6SzLKVM;TdX;PoPtBLt50} zL(GDJ>S>}SrSnL(@cz1iwdnH>cdn@$XNyXU>(Z@-s-tq(M0ci(PVZE@7WzBw-^qNY z)*6!bxNI2g*`jdLyaxJUvu-C9CP8E;0ZnN6@A$CU0x~Aea zwE$O;&((D2!{r}q0?n6Pbbkrb^%iQlEHSFFnpQ_S^>+PE1lHB-{*LQmY8=ga1TTuf za1%JM%=UgY=f1^p3Z%$8=+KhNJRLLtxYzUH6xJATvrg3}YUktL96i{3$LaZn?G@Rp zz-_5XVO7-USFPr`@5)~Mk()v>srjp>V0O3UN%roiO%){RSiP$1C&hf2Te~05p056j zo*eQwv#aw27khK}H>!SJ%V|6%2k(2`sl0aL+xO!a>Sk_14J6lZYOX~{e;IKFH|HUn zs~VJuu=Lc-B&xcKKtn*kXZY#T^Z_poK z-DOwjNiL3Lr4OHRs*K+mx_^iMBq%g*6WdE0-XA6Tw!+&r`B`g8zyXI}?(w{wyp@mA zAi4QW?*@7K5$WK!oy$kGELWlo7($IvEOQkE6;6TA*)EW~daHkU@6qnqt{rfNo7OFT z7EkT%dKWyAao>Ee9{N1a`s6j+;R}j498HUiB<1GjXn!RZ&u`>f=u^5OH#3bsm6S&X z6dC?)L|z2V@jR;hdcUCc_==;~*R!K)n@bDRmY*sdn%xH0)GO-- z@=0nVda4-z>}=h7S-ZQTW9C!FZRAQu*nDLLi(V+c#p&LmPyzs)U-?5{3lIZWZJ}2ut*(-bv;DkYX zbMvHh7n=OBw8j0Cq*wxWTDeBP5L7wFu120OFNCFA*G4#6Am*o0o)F2~Y>d+#$Nc6Ub()T5nZ9UPq2-!u~?RI_cEM*CMLPIX1Cu$Hs(;= zTDn$|cE&y*&t;$awh@HvftRN1pIPWV;P>C{Mm_!L8P?e4+ss>$H=g2RwB5Gx`U_LX z247Etxa4kx@Rr)B65ubdHM=yo{y&l+{4}8qL1N5hp%OqKP z4stf!0_X+`tCE7~dgvH@51y&}ym*d|TC>|d&0(@1i$C!@Vh(@1D|z0OaXxqjCw>v% zSz84+fGMfPqf&o_bnm1NOX@(5(*0yr6>_0W*(!Bf(zox_k=dTd;Uf95F+W8ez2MGq zRng*u;R)lwyWac8QIG5hBi|PZ$0ppBs1l_Y5zTi6VQ+PJzn|rTzgo6mFdCL?31oGy zs1#QKA50y3fwwjMmDpoB=B3CpQKiMevISF1n$^}nME3hRAAOi8?LF(-p-+3R-M!tK z{h8wMzgku5_gi-5)oxzT&?1|jQ%I|xk89R(LESs%^GdLG=2m~q$+VOO)XuM{Wm@6~~H~jtH65n2EOQ}1%tm1M7Uta#WZ5S_?&{1JJZj-k%q89#0#NAJnwEFG{ zk7k^(P znNPjt(l0itA-C#oJ9zTw>mRP~0i857dEU;`VorI^HumrQ#Qn9U>PF((@_QtPX?Jwq zqI4;2+ETbYUJ6JP!&o@3i_17jymafd&8+2<&o8$9>%+;Gg<5=SjU}fNfaM;78m_+E zpZ&DJU;+)j!%CWcWF+jdMOXC<5oNes%J2!}$c2Jga|tR#Z`f~I(zeBz5#^fz5XG5L zbzZUE;t>4qZnWOxwx4Lnr>b?Ag1yDRJ59)?aFFvHu%xW?gi%^Z50Cg1E4Q8X0<~+s zy{78eysf)cwlQ?1Sk zEQiBTVtM&!!S722g~JOaWK2o6CSPS{$b&X4QXS8FSoU4hn-ls>U$wUQwersTRBZTL zY|5iZ7TurMZRX$P`?;pd{`yjTE_eQ5`L|eNlkqm+&G^{Y_Ok8E0Mo4Sa*GHVQ(b13 zql8DLwpI>=X}?KaLeOwb)J5%l@FC$MVb^@*)y?LG-a#--O+CW7FB&V~Y^&?l@1{Ka zZQHfGD|^?=ILS0VH+NRGw=Zz=2dwutmv#&^9x>gTPdnQr+}PgxK7XOvmmOCqbDy`h zoIXyNwb#{OWB2vlkO5116?n~w`O)tqRssDJLs9M7L7)n8>gRJ&15Cz#e^!_?N82AW zCZ&K2d{A<#mAQj9kJ+K!Fd7&(f{md$h=en7k3Ae>n4X&rj_wqC39i*ri8GCo=QG

A(?nZHfgk6>FZgi9G^CCuK*nL>q$q4xT(+Ynu7q}4^Z`~9w^R&-x?zSTj z-lSCDO38OEkxhx<^VHdjlud!MET~@IOX)RexwC?R+C9zG*+O4YOdhoqp*e*si7)p1 z_Fpvi6@({$*g={WC> z*d;`BPN9H{Fb9cS{0BT=+Xkx3*ocr;LIU1GGsTsm#>D2u{`oED&%TA#LSj7=qG`N{ z@tc|1i6Hc7dL)hf78YVVBVj;`7*Pc8ayx6(C?R9ZPg49uMx%Zn*zwniMh+Ky{gh0k z=R?dZMHE%{5ke@w1{4e`0gX>!aaJSRbjjHLi!uC489OBtk3sK>%#+5fg9ZbADgIUF z(oyKy@zx19g>O~}o5RK}FbU+9G(>|F%OKE}0kC9nBEDOZ@uALOQ#fNo9-ASzncpdX zVuS+W=5yuKo3wX7Obs#EYBBx6rY_Z0ftRy0sLsvf(>>*EF6^O(7E3mfTgPe0M*1lW zmQg#UAzQ$SwXyDIY?`oxAVN?fu{ppw%SNVxjjjvz=wUP z?-ucXl*jeTN{n>V8JQItF%|g*{aa=0#x9hFz7tF+%h)jfYS#f3WOL5`+(PXI<1WgV zh|+Is5z+f8Wo|qJ35H!_xdmxc9rd&uKzTCNoUGW^73NFE(!L%kHY0pYzPg`H+)wPX zSVS$k%V&ze{tf{OsN>lRLu@i>b;zbj#}|M)??$C}$^hPl^~h|!kv;swX31>x=5g^i{*WfR)R*K!9Fro`sKYfHu!do`)c)}C$BG(DQ9c#b=cH3Nr)UahsDxvN z{twQ3@t=PGHQF5&$CQh~g6Kpamv(oL$jvlCHfvVFv2K-UV{|OCQvNCdrrHUPb0J$9 zJCF6#5KQ2sa;G+xioPzc2-&< zndP2m(h^_P6o3BZuL5}hza+L)5h~UOwu0B~_d}xhD;$Aq(%fXSj8YxmAMhO6@_>1s z1iu$PUgJ#GvvK>XbGd>I=27aYr_Sv=sNy~UM9Q^mGW99zDjG_bY_XHz=pbx6S}mnMt(TCZ z6qbYFXhIWoa%hs)kwWAM>o+5#l?OsbKhB6y=1=-pDQZzNmTVrvS};J31Qn%NBqbA^ zG;n-=#6C0s^ zRQjOfCIEp?A-XrO)aqmP8@6l=LTei-DB&c>G=x((V||lZ3_bt`n58nOC|&jUF%R|V z&S%bO!Xi$_(di@1=<=k zo)^glI6skBf*@bJ34o?jtwrUt+ck%HPJ^e1fRnV2XJp|Q*ANd<5*dXLuNkY_*eo0 zm)<9$WV1uEw&+T?1Q-N#Vv!?*e|q|LG$fI6sMXrLZE*WN~t~ z1|AT&U=n0plcu)mtlcIgp<#jkDiCWDgfu!aNXXyU@)nulocNpr9OF7loXcxanUT+} zv7P`dEvDVr`-QjGH5!Xj(SQ3dNnzk7^GG#s*}Wkp1PfA#p8rYvUPS-6Z>&$e_^S|L z9m0$lB-Q7s1mr9=bYUH+ECd5oxs)pXIMlphT9 z%jRKZh-+e?1=9@F$iI&V8A;(LNsMWiq^7QA;M5x`4-e_GkF$!kWh%A?%n;mx;6rAC z$F_#vx&Z>cwde~dWY);_jx71r=HZVJgTk-AZDn$N`~lHMz9>lVk% zrFvZn-ZTK2uLPw%A=I6SVTt>tX6Fl2GC+Z+H26GKp7`8W#AeOGWHfN=iJ0XHQ@6!v zNG;5QM&}0<&{7&M(qax?dUxobQUmt(v&l8J=9;2}Xe!0|NQn`F8O<3J<@7`f-}@YQ z;TSwH1B*M`AkMA5YS3S`F97S2I~cXq===t})(GQ_)ciKqBK2w{ZWwFTUw$s2=rLX#j3<}ZYTf4-V zIPW82lZO@`(RAXNgCY5;2?A8r(h=2skso+8tr$cBiVMAdoD^Rg2?S5ocN&Irroj zXs8{*n+!%sMaz6A7Q*>sU58QRUgGZb6%TQSf#LB))`CPYPG)36JMp-N5KgQN-xJr2 z5GkoKZ#BVx14WTwfIgS1@kcWi+`r!wyNyh`p}eYjdLk7a#AyozL~Y7Y!}Re@_<(?T zY1?HGv%E(9?mqCo}jeKDKJjDAwXGWF1jkts!O&s39tnPCh@kMM`WwU}q& zhzC!;wkFfEvvM!4Trd6V%Uo6~ zW9E<-Cz)=CE$UixIG$nBtkkzF`cd3p3@lgek!26RDriO$VP{;6c7ZjkO(jeIC~SLm zqx(@b3*B|~prNfH4Z86p6uccPVkJOkd35Ywzj=piac>rm3K$%)P;oQ@K4hT9IKd&787gtl>&yp=Lf} zstG5b&@e=`G%IkDKG95*#;YzMl{SB`s5oty_R70Au<5%Rzbn;O zSBh&)X&aavo_@3Nx5d}e&^&x;`E{>H#_%E0;#Sj(chB4cMXkC)8K%Y+YL0y=v~_m| zMnCQW)0Xs=sDu$_6;7wAk}THZr0jeadPb(nO4{uX*-txa$apVo2IE={FqZwK|4q>{ zM@ahR?_!krP(l;%ksCp=1vO}N5L?<5Vver#3+l)Hvk9tIgPZvE(7Av{-JKgt2C<8wpHi#|AY!hNfoDGx{vw#yFydmM54LE?K}kGnm!fb+(uU5Myq&fv^sa zx94zdlR+_&I)R8i)+;X**I4&Q!51G0|6Wu_WAyr5u?Fx=4Jj)EJ$5@|Ry0Uo(omWwjTBsuCH#@b9^Cs3;4jwC>moXPmh;BZpFw}x_cvRqrlF7x;+{h5s@O9cSJk!NDJ!4a~M z(1kD`5Yju1h3AE=j%Ee77zog@O;Y1Sa%OAgMzBTVL=MMY9rs2OAv6RQ#1t7~1Eju! ziVLiCYoafc0@WFrh%QyK9coqR?#=H35Jx~eK916>4dPAok8=SeiD^cUq$&a}M0+~Kpz#YgPV)kh09vnNW^5CRRzDPP1_Q4~lE9gja;Z;lX?bWOp-BuglsHkE zVNxVryKip}nZf<6(+t7gbd%grJQ?&T;ZLRzU0&?afZvr?sj92S+ za(=1?r*a_K6sxd!ChAk|g%AZG_b7c1u)&42xHRq5LeGC_48zujDEVL*IVDS&!N$#T zCP72IgM%Y$hI#x5oF&za|3WUo%1xu))*25ti6U7swPSMbz6y7KM1Dgr8*r#O7(oQv ze#KMJQ;AFskAkAFKQr+?uHbY;@I!nSm`EMuI?HW;=q0zsddY7`DCy+na0$_Sdp7xO zK!npXec2058)>wn%KX`u)-$D_(a2#(>j3swYTWr!l@mv=ataNjNT(B>vHdWeIZR@b z8A`Yc&m#t|+0A>NTYj}LgVXDuO_Z2+VVE!bQ+fKvi~*D0t)|eU6P<0ubYvhw{$UX| zAQiojmE|UoG{OFXzsrIrJCv|J2@3C%7R>{3P=2A8*_}uzUSQTg1C5te)A0{RUa5E@ zJ?#57V#K0*SU}_ua5Rz1SV(yzjGOgds{PvH6~7q3vNl>22Hc-B8(>IbQ5sBb`M{rl zz%wyk=+-E%Hg&=&*`h=g-Vfh|7|4II0xIV#JPN?3XdGZNHDQKKm&gOaCZ{4#G_jBx1B82L|DV3F+jHhS&?8og`P;`u&*%a zUw#WR?BAu&p0{Ys2qg@B@&Zaokn@FH==Q@X+c4cfeJC25fv;*qggL)?$%&w~!~|Ks zGC^_n!#rI8rL5bbH3XAy?VLKFwEe-ffIGPzfq5n)cZK}q2cs$n>D{*MuGfW#bkdy8Hj(TLLk1ji2w{GW0|3;Fc1XF?P!+JWuu&Qv0a1Gg8+v`=oV=)=r|4e6 zmxi3OEbhr=dnw855F0nKyPNu01ZSS4`%yzmXN*#zZK~Ug;7fk=1uStMJvS*^2-Z7E zhcr6<39~5Rs^eu5mFZ}GHjeaReose%wPOunLgeo9%2x#y(bgfud;o>d#pD1ZxiYHE>{+Ib3)0xFqUmXDf79V~O zdr<>Jm=9|h969M_EtFsK#@92ay8{OaginPq9)9GKlD5GZvZ&;Oy8(i#e{$vU^h6Oo zeKJQifwI#3gFH-)LFko}zmNv(MHp}i=BU1?cGJ9zZ2>qP6hd>zNJ?hUK_MykWfMyK zj~Qdy#i*S{aN9ee>0E9r0bMXhr|dHsVh5)XfT0C;W!yQH)UCDnst{ed`AGaHQC1;Q z{A5Fl>3=Cpgjov%-(yuC5hR3XMPm#K=R(Wu|37}CzJ1*JS)mya2ALo4AU&HP<|CKg zDkwf=MFaK}7O3ItM0#19rQ(IY-M9GQ0~jojc5o}(K0WWFSBB3Pkhf(HU_e4#mUI|v z`aT`MH-HD0u?m|4)K@jmv|fb}1XWax~#89)M-` z$ds8ZR2>?bJp@E1v5&I8X6qL!O?(1v#HgmBDV@q97T!SA+}@g1i(U(M!-Fu}QZ0^5 zR^A4V5+=Az10-qB1ciBdqygcQj=?X6v;eg&TA++S7nh?y6$ko{DWzCZZSYcZk80^9 zEfF$aFHjYr2gqnc#H2qBYwm)h_m%z`VM%3unbkLh_+v*$N!SG zHc(x3=@5`TtHch3w;8iV>+W9)8NHK+DWl!A-cPS|%Yv;5%BriL)8L_Xk@Y1|$=Kns zms&gvVa$MO%f_AzjqXK6(`cifn&8(l}G}eouBL_xLIRPcrW+*t#RZQ)K@Nvs-*0=lTUap z_i9x|ym>v`U;`lJ{@|nQN+y1nZzJYD zEWzPh-8%NswNS!f5!o=AHZhO?~It*VYctR?5^;LkAoMA8P0SaM}*bD@6*q z2`O^*Jlr?kc-~ofG(X`NqRr0Z7dukrpHuWZzCr(Eg(S=85fbqA@&FXaehz796-$s5 z_4gF`4${2#J8?g{;GFOo8>W9&)sgJK_qEiA!0KzSu03q?O@Nns&mSbiy5+wHhI?%E zRsjrSv9?^uj16_f%)q8RZ@8Ny3Hc>wLkI(3EbS=cTckGhy28`A@Z1qKFvpS$Ce3elMS~;uoswgYOTb`eM}-nCFaD5U=Rs zYS1y>^L~5Yt#DcW^*u%S)c0BG2cB7J+(f!s>!oB7@%Md>B!Ku1oMQ%rN)L#kAEl<3 zH6cR_-#1_rx9reqP&iyGOH1Y`B$|e19bX(2uJ3XXEbQBO_+Im)N|3!A!Xh@?sxFJmlE2L^6%R|ru$ohM@7M?~O>ZgcvgR;_kQIbjuaENp9(M*jQFgt?D$jwX@jjR(3ZIBpnUetGd9*}S{WD5N1=zK~lx&y-jN=^{wCi*Ia`agLV z91ET2ijE`2oY)MJ>F#X=csj-aaV|T>zR5x|u#^QYB`6 zi5U9%TWjndpy+R(JAnIRVy$3dA3;zAo9%`2t4!^V+W1IH-t zwP5I|I0`Ysv+lg^^RYvW2-&s>y#4_v6B?(v$#K zlNL|RqG#J%2yD7wB?5p?F6yD57G4$&q@>o*wZN!ku^Q0lpSPe3};X269bHj*aEsu}$53U7Zyubc%*#vm6y*bUA;lKUZre2ZD zFx_z0SDFAGB*=+@qh0$@asxc*hO{^}*Q-MD8M>*p$r*$~voWf`^&lYM0z{;4aUuxo z2VredN(4eCf%2}>MhIH%mE92I08}PJ8}9ugX>HVD?SCS5491vnZfjJTK3z}&IN>+q zL72~|L*i+^B;X@InVnKRdf)ds8`#LCWHy37ZPpl$m&v4i=v09`5q&{= zyZW;IZoP#!j9r!x-Uq4u4^dWevI9$OaU7ab09>uoP?=(RXWZct4o^j3;Kx}d)8YDy zwd4pD3D|>-8kDv{X|bq0kcxJZdQTXA@o6W=k@V^7bvRpPNz}KGkE0v)tl5PZSzv?# zNo|;#Lh7(ZYZnsH3mQ74ia&vE?IQ3wiZd}o^9$xOJJSx|>vW}(>@ zO1PYgbZV|{7ddtW)v|U$NPFOfois&7xyhNSKq7`~BgcU~9-(1U!BnJw}hSli&eccX}j{X{)Q z4wR0j1)dGq&+BngX8c&C{G}O)SaL${ZAku78-O+psZOsYp7>!2;|klrnfK@ayTcy# zQ7j5EM@1NTyvb@DLKSRu|7s0lT)R+mwXE7Ioapos(hGf>Vqu|dIkSIQG_dkC2c0yN zVd<+=im7SE*cIZ8Em=?DP5gBcj5VwRDldVuIG{LhiFb52PI_-Bj2w%vjuss6I#ABA zq3U7IS|@B4gkp*YlLsGa@1mSH|9VS|2Zn2f(jXrxI-(3*Q|4dI&n;FOegacTGdg)x zQo-&*57>AJ(1U*i!rG!}5dBwPCA=ds?!qj=F7gY6ea8_fz*)zWhSCzGQHXL(`_v5f z0Eah*c(egEVkaupKY8VDy$OWprx*5*#qM|h%#i4Vl}%kHNS8~=B3BppkJ<8Jx43f9lVK=DwC zbbX?Zx$H+vX>EtxFTl6Gr)hsEwEV1oZ-8FRx!FmF7>xQQ4UVkmqc4eU@)8gs;~^T4Q1AU_fmH3zAbGj^mikAe;fM){O&pEVT6-~yKBY}G~` zAT`ag0TF#ZtTpHfhHqi=5Kdsri3Hj){W`W6_@|ps)^L$fAeRjZup+`e2h6fJU1dnI zCYk{-aVaQi^qIvDz3bjopdaE69E5v)6Cw^XZEaWxCBu$@BeT0S_0bGy(+B&%JH}v& zng<$*?ETwA1BtF2wmjT>HP!`nsb)ru75-Y%%VQwi`fDq)k|6=3P`V11OQm}Xm}nuT zi^^)Dz38XQzTb?%5L9lD`cDZ)dFcjybaK-D9{uH+6c0NZ1Dbe72Z7{Qu@~_RTC#bV zY6Hc`BqlU0leyQxHR4&@R-BObo)Bg@C4NPakg6w~YnU&SQdYdr15{x)u`2->m@BiX zRBKnzdx0`wO`!h8ap$zErZ3_JB9zxc2Zo;iSPe#5Q6+WbWTm&Fv6dxWGhgvbE2B=A z6(i-Dgyd+MW@95HLTiEq0bzQ%3y9s8DO{HeK#m`Vg^(Wjy^sFxVL+TF&UlS#J%eaN zLC@u6?C_BfD(J;^F7+}dMdg2%L&Ce=-u9)~2pa%wLEg$(A9myofnr7D*JyN%*E4c6 zG7$vZBZLl2TS_dK$P8Yt3SaO|dQm+hhWP9Ix`ERq8wB+@z~pXyhN1#H&CFlw7cDKG zWql@v#XZjYIK7}fd@K7&?%iyVK83eyDq5Xfh;<&|wnk z{vX!F!VvP^3GT?pi{mTSU5%M#?t=f`BwiS-*Q1 zKi}u~y`F!cf9?xr=Z={7INCtuwAzRg)#(D75Ox9qJB-+eh6 zUv>XctA4ryY;2T`$u%jCx8xW)@6nO4^m@;~Y4zkznWp&1Nu68w*qU<{J>e5=qf8_6 zSHm|F8~h2=C%)|=_As|~^NQ@PmoGPdcfV-rvcSxHn5y8-@jr;I91N3BRq=*@`Hj6^ zIAB<2*e-uDrx#u@^Ey6D(vs2Eu|?lhLQ+cctmxP8!HH+VSsQI+V4(v`3$m8Fb0FSP z!#JZSq{yzQZwwVf2qL#(_yleT{teZiTI;z9A9@-B&9(6C|kzDw*4)sq;6R-05}uuSGL5d zo=7?hW&X>yR;s}LiIaOtF*w zAWA2b0hL_@;C7^|3Yixz5aR5GKoeDzYg0mY&rlKotiTFQ971#Rujj!UHxe!xtZqz0 zWMEV{WhLivXSX5^bsAG`r2&DkNsV(KV0K4TVo7!T$E)<^ClW4jhW>@<1hn=sx&u!` zONKU~3~EqSwYLHk@VaOOsQ|cUdK%XLdl)B7!%u~g-l`r8SqGCahT(Ct#sE}1Hj|jQ z%(k8{H!QKqffvjvIR6F+Keontaz>WfS&73-~bd(rO!So$!@I)Stzgrsvm#`TOYJUB+_K(tSA&izt9CSg z+D<<}GTI`DRE-{r&ZO4N(EHGPqVo(*;a+yH?>j*~$zLA!7KyRtS^BQ|ql!&Z;{Y?U zpohpgv?W-}pbD1`ByvD*D~!l6G_q^-ueI_0pk5OW?9xiPxZ?{QqQ;5j`s#hc-9m}X za3UeXgzr2FldeU zt)-Y3%}2FE$6!#yjYV|visxfN-GPz7H+y_B$`ds-gN^;1Spbb7miXi&pM9- zzr>JlRpE)2V;|Ke)kjBUNrtz^I^=!OL_e6!qrHzEo9waX%BJ(Q!>NGSuMH4A(3s5~ zXkJOO13--fbt>2gre>67PI~XbgJ#U+^;Zl<(^TRfMe(Y{1(MTA0rn}LISG+f1h{&_ zkuViOIih>wFmUexGENF_j$=U3>Kvdsp`b8VvzYi1(r=pxJ~EO6U>5|QQz{Ia?t*eS z&Xs}GMjSe69wAgi!yb>Q|6z;(d!>^4FO^7cnghg`Q?jG-T1`)}3{Vurtl(Lm!tc_b z{+Hqj234H=%v~e>!}0Mq4I((F20GYQyq82)CY~1mbSZ<^lLvwzk{x+1z!x9|B~!_h z^+6@_!Vumsi=uR8SP5VId!)(*u$P2_BgI_i5#>FR&14SWZ>5{f+#viPu`OK~ztY|O z0BLPiK;yZke!Hs%TFdu-MJxf=cpB9!IG7mVTWnY4fV{63|9FO4TXqR)fIR;WU^!Nj z@F^UFUYZ4M*go^D0QDl8$!#bbe^TzY%icC5j^(_4gwU9wD_(4fS|=nGk2jt)3wbfKuv&C$wLAa ze{tQfV?l%je1$ShD9q6aU@P^lo02>GFAK)$FX?}h8FVjB3jg;obK zFW9Y4Qb>Qrpq2#5*CQS=mpjnCV(C^gw9M2U1q2;9X}NPJG-CjwZbY^ zq~A)W9YB2mZZ2mTCO&g!JZdI~R5dZpuacY#s^uMQoTzy;|94LU~zb#5+mD~yv zO`TdAVx;0uXQCb*46lEMNYw*u0qXHKdY(;zR*Rou%|;r>+^|52d5Ctn`#eM4=I*woeo9ZRM^yXSeM&80HDo2yTo|1adNhhe@CS7Yn30 z+Phyd99S4{!&i<&`i6>!0UZi=B%(C5Ds5TG5={r<4n*j8!;>pV{XRnV8kO1{$fQgO zCc74F1?A)wTUu$PZ{^EU;zG`&IULqYxp2rSs5kBj#2^K%MjWX)oJ4`Jq%aVc1kl$c zh{~MJJ2Aq|xp*m^9YF_pTO^OI2+7UO`Sn;R;u9g3RnP%$v#Pcu#rbe2~Vei1YeF(z{K-@2n3omWVdrrfU;oanOp=ErcXt*s96dn=RDJxDwksO&c z;I~N29jMRwmVi(zOiI8)6a8_`{AL;?bphlw2+LK6DK`zWA~?)c@^jc);rjN$2H-U) zqWs==;1PA-XQ9fqP1n_qd+9+k%WpMe))lWsR-Kon4%^qmnB{*|8YKC)ac?)G5(yc= zAf_WP`__Wj7?ps_KpG7wu3SBP(X@-g1|TJZ1Qn7%801Az4})SZC&9zMHx<&YS^%L72yRIZZU?!;kViPAugrqTOEUVsvYxt?|Y z%LAHY(!;=hmB`J@y@i1c@A+G31342tsE62DmH!gG)6#t;J?_F$cpn0MF!m2r+K(i8 zTlO0{z6o5&@nU5%G_f2Tst7PAbXHXR^_^07^hc!9!Ntp_^)uNxx@1&;i|i(gmLYH5 zSD=2iX!A1YH9GJR^gO464^a;f{1JQ4zkGfmYQY%YtbWpfCtC|5 zx2lH;143pXMAFyZ!3Mc*ud6I6G873sccrnP<0HYF$GTT`VAkg<)U&>pz&NGr#9Nzd zE&W40O-A+1B%pzz@ni?fR^y#Z+U zU>N+HP}Z7%dLqr<2I2?-gMC3cAj}D@5ULbT2xTonnhtx%?0>F9AF`Z z9vPK+T|9!01O(2uZ3Df6a`+|1s|cCGW4@W4ln+*xuM}Iq|Jd8zKDBJkZvq_Vn7STb zQLW*@p5HvE4?a6^ZKzjmW(e*s-G@9WTmTf|`OcktfWxLN7$Xep3|DiZMz6s=NCqjz zASFZ!g{q-c)xA(FHo3AEUahNTXA~mSTkUma{fYo{GtBiD+4NeKhin41M)Id&*-;Wm zc*uq496gIuXaDX#5YFV0+vi+^D^pc39*zK0a6 zXQ{gbMKWN)h-XoNd7$Zt_fX#lSW9!idLdq?-DG!J7EooMJHfij9+Mb_52xx^u3D;w z-akckMrp8JGL`>G-}Sjte*l$4rW=1BS)^J;7|p%>F>$M4S#5o6pI#?`gRN?+@a%k4H#nmJ!+zksw|2TCZXky^8XWP9k3t$^r^qWZd z{&y9f;Ugf|^HU}kB+R&J+ey7DHI}cv2#FUE_H!0jEykhB5s-dF{xg#q+rImtQdZT! z)Mh}9&Yo9rZ$$zN0f6)%s5jhP2&?YRt9z>j9byu+9}@85PPXoYQ2uZNAVh0y>eRw` z%2u<91tp-q5kZw{jKZP>i^UNJWT=1=6pgE_lsF{Ci*U*RYiB6IMOZFL6>ejZ5=Act z4;0PMhCJ(&2a8c(n!$^}k~SV7Nq0b>YqzhBi@p&!9z&798NI=FdYGK~Cx#?e!U2%u z24o?HL)G918;oSTT;GuY$3tDoTZPH+u|S58J`W+E!ZNR;w&+`bqz$aBMVBX4m6xjE z&!Fr*dCKmDZk2MieG%BTQY13Nx6JOO{lW3IvE}p8y-EJ}Jo>b)FI19TTOI*hn*--A z_;s(iKl{y`JoEh7vWTUDR3;jAxdHdue zzi9SrSwHmV1Jyy2O{iaC1^de%VL#S6;)NSdz23h4q|vecCjUTYT-jgGz9^hk{bM+w z%5#dnmlHo|u@Y_X0bylHUVxz(=-6m?$fm^y^2X^dctk$1p^(dDt`ZB*@d8vl<^z3R z+Bs$qeSj)6ZPJtFp(N!ky(!P!y|Eh@qK^Pu%S}^_R=Z;n zTEZOc2B1WLR4|)LtkbnvO+O?o$zuUa(_LdR9lUSHVCJ|Br9BzIIu&vVF}~!U03NS` z-REIn3Lv|yu_VfbnA3x1&8t@^PDbnTf557$ZIw~(I=zgz-x!z{0{03TM#*zB zAW1a!{+3r@nLzjmrmB1kUAJ)x8jd+_y`@gNxpTZma(e>j1WpO$gxrly7BeAJ zdg%NalU`R63#jIox7bNNcmAhjWPcM^dI&g@gvEAyX3IyUYzI?bo4qOHwXKL9G8593 zrKF1iwm(E_-(&|wS5L;Pfl3Qx8j{L$7Ub)O$c3E7%y+RdtkmVtNY3it@RHL|A_HK| z7J_o@+*394sH)m=#bj^>-$=KSgD;RSTSs<88lY<|%@#mzVl;7Q^#Dl_oVLnMWC)hLNxENXfdKf0nnR1reX?=%vk)M9ODpVu z!ChDPzg2cBzFIr>cGX=&rdgiUNM}a^L zeFTto$g@y1#q%_?#0cR5LlZehSw>3P4H99@_n!&G;v^D1r9S_}5VQryov>V64I*vW81V%h}6KyBvxrT!$phx=Q)3{S9iiQPHt*KG-(LX-;`o4 zuad3Juh0>B?Xy6_G`WVjr2dML5)i#99w0<4kgM_w-56_TF1$yo&f_df-%R&$c%_;Nu{wF3oubMRM@(JmbSCkQE0HpOo>Lm2^PC7ZX93A+<4!a;lQAy zm49PueU92d&>vPaODiYFr>M~bdqa~Om_=F(!2*uU5d^$@jqXg3u^~GRA9^~DIsV^W zKD_C(kWzf(VX2qM^`N6|Kt4eH)T6q1Y;_=KnQ4EtEmrk+hv4%WH02WhVcA!Cbbf|fO&gF={O zPplG#&N`Fq#G0tRg1|%YBBK(7Elp-`T&16gj?QG8mpR z;+V$QiJ?SoWocJR(~Su+;z)WZR!zun%Lrm?cd|tHNW-rmLyp=yM7N`qpD{@~ z5sebiiId>Y7KH@#4OeXGAMR)ZEg@YFT5PmsYz5z_!BSt@%uc3{CAF`jAr5PZN zdo;KMJn0eA#CRot|FhbvxV)U+yWgx8EZ=}4hYbWh(++Rr9I zZUoUGZJjD;knubPXlo?93T%W3lq7n^Xyit6)rzNPb|o7(-$`9QH%wQeyS;7)CNLM` z*Fg4a910{sBV2Bh(H1%C8c+f7N`^Qw_iI!`U?5r{W-I6rt!kNb!P17k0r-8VVT_cS zm8*rq6^R@8w$ zP;$u$_dtV$H#5r8axsDPYgdQT)~ZuDrblsHTN{a*K9_+W$YsQPi%^M1A?t)=QfMwF zEf>5pc!$lTMna{A7}m6~SMd(hbSsX!BL8arK+`0Z=xRcl&bEz%++!9@eJEaMQjI?VmoOWP@x$ui~ep->KZrM>c8<(7eq=7qUPbAkMm1`5u&j9GnL@9aU~z+O};HN&^tOudnBR%M3_XZWJ-7A9B0l z=SQppB1ci0mJ1H;wy1ExV^Z6x*G#%PMT|qF?vR08`2BoWbk^vUv0!m;Qq4!sOp4O# zUGu?c^d}xEfMB%P0Joq#XblN|PF7=1e=iplz~sfvE`>9dA6a=4B4l~(z49mlP>H%Q zk~h8t>JozM*7_3L872^{wPmt;R3q=QQBX4XhqgqJ>1Ym})9`6&a{wagPq}#-oJPbOs2LI({cYsQZ*nxWro7{R;0&&B!2_EsS!sLIXO} z9ZF;bnE^kzVI$1FRA03R?!$Yfv-Jq~$R`n6`W#CQ zHgb$h{d<$S?z^jQf$PxX(@>-?V`Mhr$~G@okFj_c2}rKGN%>zXS-VKgWt`N7EGlOl zgc-1i^vf^f(e={7n`UpFiKdjSa{;H+<~F$WO_6AS7yNM zW2x6P9i?xZgj^ZqW$eBHhz@14bp*bq7R{=$qhy$bbp~2?y*eJx-I*xp!mB(lkN}E+ zv0@6*@Oz+q$RVfC@eG5~4HA}O-{cm|h3o6U*aNOSw~sL?N9~Cu&pqot{Ln|PNUWP@ zHPEE=_Zla`GUkd!ilxT^msxGWfMwbFFWtE9$E%f!uI9vigwA!dmdw~8JC z_0SYR7O;WS`-;xWV%zp##m@Iomk&dk1~e)Z4zW6GJnq1iK_W_kufWpG{z#o8p(YP$ zK1hJm*Waw74`%ha#m$RnF6?*mm6{rmK5`elp9th6sw&Rf?(!8!V8GpYf#(LXNNIG! z?)XYdXnyhTpQXTnHLm2b7PON32qX0_8(3ff?6ydGs4qg6CXhrwNd0@66|%zXk!C$x z_HTlbHN6(bs^k?tFn37;A)jg?-o|m7*X}HY>~{sF@W|M{yoelMIAJRAkV~7StZ!g5 zTkRjXY1Ib>oUpfOi_Tqi^gkEbHU%6e6x|6O6~aIHL*)~AZlevAjz;;gb z_MGOUKwPTI2fNBBjapU1Jrg zm5O0^D`GUBwxo5|nRrbT7<{EcbepvpRobk4uo`Z(M=(Pfj5{w|b7jDqfu7lD3)w0ibyzhAD;yNldnReDbg6aPwK zLu`(?(=a-WFAFUXf0I;OyeHGRd`P3-oy|@b%vtrH7taoZ5pz=&h}^x6iy})RC#mU+ zq#af27#%i&JDn>kpm2@w8T~OR)B7Tw6!gQ?{w5&06iX5sfY>STr_zQg2PIU58VhjPa@*^J?WoNd2+{i^e5*(MCyw zc$4n(jbzIJ4MK12;K$$&O_FsvO#jRYf z4#zci6S~)4N&*i)MZQz%5G=_fx;KSXAl$g)IeV}}b4b*@cz%Nan9ApM2OVcYP4%3S zD(i|tB{ZJb&eNRoBo6hyz&J?I9L%OMu=V1OCV5Jcls<|D!Gj(LFKQ}-r~bn`#{EIe zXc$GFEigU$R`HWROaB)t*OZv#c$HmNV8o2E$~`61tuL^N-U!y|!Kc!>Z1TKfhyyOu zF#IUcf-k;P>OUn1Hi4@e(iLMwbuOvNGof4adCwI(OEVRX@spANT#r1M`+C19MHo$xy5xHg4*@$|?&8VGh5lFgYJbkyuJ$qm68 z&J#Ug%$rLn5tySnb9&Ao=l+nGB)NO{P0xsUXJVpLIE`--fU zw>qW(4Dtf^8!=~CR^&2Ale7z&wJ$z^TXd(`OBL&fp&kT+NUcg8bxV9jtZN~x_76QI zpgG4WzQZw#?LlZm4gYE!JC?@LYC0~GK!j@3iHQ@?`ZbovN;8`!b8n+_a0dUJF6RhG z360eO&WKn(V1cJb1wrEt51E#jWRZBuhKayGgk%>Lg1LX0Wk+d4UBwhfNQM9^A_)Ue zQI+=8$yovH^D}Z)f4F4&&HpiIQRKKftE;ofIaQ5Q6}jd|fNenbS-%wWJ~E&hN4AAy zOR;t3JFD7)u)sM`;54+Ukkk;0+ZaV~FK1+18}JX&ybi$bZd3lwire430nf$HZLFaC zMJ>`MdV}~>tW#vz63s>B{y{rwhQ%VyM#He!`R{@SHwd3&m`%?%AlrMA4(X+s8L+Ty zK+WFPOOz^xMI%6pqM|%_eTU4Y1xF3Gca1Qjp^x9pRoIn^I;+C=L|k~ez=JDh3elW~ zYy^e^no@hITr_&8qqssa;ZK1KOlkaipuAVFf+ecmfkzkdl)1NE=hMy(iKrz zL{zav6`~bFo0TUqu+$Hm0AKGRL75_&QfDKZJe#`&^!_{ItqoCZ9?%k+S@;32lMDcD z(@+LSk8)r2uGM+n``IkS(3~;0W$CEQHu`&Mjl)0%U6C$nnkC`_TFH-K!G=jrCD4AF zv%ou`Jr*gz0-!KQ-3c4>kQh#cUnK~#&Si6b<4Rq*G_49?mXF@-WLtllP9vhNHQUh* z$(P>PP>a=EXz_*53SYa{Ij*H_giTRF0c*=nA?IA6L$YPp zo%=0bvr!4~qWh$}RB)%uuJ8m63kF5hc0^tN8&@QzzS?OWsV=S-`uLy>z%CgH43OE2 zC>e6OOgjB?NIfp_GClc(W5F7(pUc$$d$M5M@%Yov6R-wq_^oDRMj}J&kj8YNU|~#?d54PPn~%bLiAD+t8FzIqM{BJFx?xZQ@b0|U*-|DHUQyj0Jz;S<2bgFq z5~0f17z%o7Oz*O&?XdNqT%7|>Al>_P9mTt4jwExE?)6b-h*GCaA*#ILNVXi%VE`*J zp=z&B=2JpJE94{C}RvWp-<{1#?s~YD)Tw|3o zsY6;`f=bTbGk|xHXC62%9rP)297IqTjcLipY4Mk4sZKylcpNXX?JA-hK=in|3i$=V-3%_U=WhM7h zk!*_SPA$~s7sts7eabAymZ(U*N9iyae(RwVla8a+>6Id1SWPXuERe*#`02qHP@cd7 z$Y`N`scaHpNzlowDv<0(I6ml;biG83%OKkkJBwEg3Q)yVmqU<_R0jHa2U6xHUNUp4U{Q6 z7erna3~89swuZYrifefr1q{?@mZs?W^RU;U$6&Y*dcZS$pn0h)7*9SHM(}#FA@t8% zD%|0tURe`;>&$4isP1qV=`YoYTX%*!luO~SxN<)+AZ#HgP>aiRh6~Q4dk_KmY_B`> zGf-M%p=@_%u0<>sHAF@N(=+{^TJn?R7t8w*iOO8hq?V5S-+SRc6|?0pjk<#Pkn>{4 zL0vX_);`6&iv*05dxWc4A<`ih2FG_{4nU(fHRqA$tT8`T#ktArLFLZGtRd3T-eV@s z5O#K+Cir3lP)JC`=#Nnnb=7Ja9&%*t`Oq^b}T9pJ-C!-uYTY^d8( zL6I&@C1nVRE03OTLMpP4&HJ{55nwZ2)6!CLf^mF^t9kM6#hXM*J|R~77*rx;^;+KL z7v;gpkd?eJII*f`jN@{j3pQfj?*9yE5mn8P5>DC5U<3@8`}ir2wsbghZKp*4Bf7vn zi4o5G0f0go)ruqfcplsubSV=jzYqhr(w!A3xE z(SaPz-ScY6l=^U&7i8ZWL2Ni}D&ZQY4{O6+timPT5hz$(d>y9=>S97c@ax3!2!|Jg zwZAALl1rVyNZY9srL<^kS%digkh$A3_Y2816|9k?ll*U{QOe&>zV>HhG(A0i7VniCgkCbqC*2 zfJCBMWKTvj&?k6B_L9cs9XKh_kSPsy3t&sbI`ZJ2{{|-%a3J2G!QoPqORQPX_HPWjvG4v)WJGqY+$#od?LoppV*W zs(PNpa$qAOecd=*Qk3vuz0pw_F2DM!E8Im~jRL4=N*vBIMNO!ZLH@`K2{l6K@C!{1 zG!wahJ_SD74O5cG3<~&yp4z$1&m)okh_^8)W2`7kg!HD}EF1^n#!!~4sL-tVrR&W3 zk^`>o7O_T56(%W1g$&qU&A3$}=Pme)*_PIJQ0&M3(Cp z=8q|M&2jPB)s&gC010;^l@a8e5 z%!$qGQKeA1hwv;YybNiLP9R~pkS>5D^09-&Shq}0)AGXLZgk%bRnhjWPt6Q-&in<*2;sIUO3+wUR1K(~T=< zBcy6LeJ~ZkwhM9s+Yil?0@F9Dgvz%>;lxF1NZ(zt?z%eB^GX0or-Q;gM zjhD|}TT_2LL!&*Jz>K?|t*CPvYg8M|P&ry%T{|KM434=;$zT~KCb@@rQd&4yosz9~ zyrxRcnh>B-o@7h%P?sKyY-!luNIW5&;R1lr>!S=7q1C6oEdP6rti?^z2TQK|p%ZZ_1Ryn-jhP>@7UgmKZf=Qq}R268d5~Y@en_)O(APD&{ zD%P`3;8nYiSD8^XfG8fX*@&^CI+q$ItQfOd0do#;R$x%;*($|evs%v^%YI0`jxwTz zWM-_0&WG`ONg42`q^%eZ;Vfth;7p z>rP3e%L~FoZ!jp`o+wK2E-DZ2Ip=tTylv8GD(eIv{vOhz(#GY?%J@HCHCI#J zU;S>EbCx6S z*dXCR>2U|VMlXY5bK zAaCo9lh4crT+}-rcrRh$wjk)L0y0-I%)w-nR~#YfAI~o8vIuKa73jiD%Da>FSG!?p zt@^D8uC+~3gR%M71Nep`u7stDJ&gFK{y84N=%gTq6|g{f<%G5(tZ4$8KgX&Y6jY%E zlY?|bDc#xjm<#@t0zU#cR8wP76GI9Dpbc)JNB zidI01{@Mc>t0B@dQSY@!2K^=Y;OtJX9gIS9dpY8@*NL6%1*IojmRO22GVZ({`h9JR zd17Hp#{8?jqj%+X(NV9MM%7@5P`~>8xP7Q1mb_Jn-Z=U6Na6Djf9O8D#1Wyq;g`lr z)20sz{7D@ltap0AqFwbm_ZehnCSk^V%h{?R_`qA@Pk~o&YiHF9avquMU%!8LoQfPx z$$_!oKHb~>7(O+jr#svuBw^gZa`*L8;+IF-3#Hou^#ZSkONTtvvvOd2!os~t<;hz- zEVLJnrUVJ&-@f}xhmb}wIih`7{%Q3{n?7^lptmE3bkaB|Z}(Dpk)A-IC_z9A%aoXC z8#0j-s}GsEsll0FnF#?s`1L9lEoLc4<71D#FXFtNbvW$ z;;@sb6QcWyo|nL)6)LLoI}8)mZoE%>M_eV8dSJBQ8--HoRk2e!Zn2t!uZU1RnTr2Qoyh8N;w)z?b^JhNt@AB)kM)f5Ottu7> zzMfc`jCtR(JRx7WkQzK>JF`%?=nQ;#I=LE%rr+D^tDD9BkiQ47D0`rSPWv6tlRi7b z-RqPhvJ0`j+xJFi?b%uHpVTuF6@UGDIC(bQ`pea4tMKb&3)7{5Ki6aI3h-3%$?vnj z73vM<8VO78MpM~eOdqKkXYAgso;^LiToByY2`|{oCrYmGxw!uB_k1en<;>5&FSxya z$^LgLr@~Q6^Qidm!IsbMcCifOBdR{$&+m9uQ|oTr_%_A$Lb>L=>2l=#)}o?r#b8s7 zIeeE5ljMU#%7@KH@pSGSi`dV<=f75EPHv6&=^2bbTp50W^eBc~y z_EE*9NMHTrq>V<74b1f1_pa*(_6?07(k5)lhy9veGc{2;T8@0-jryHzl(7AK9qljV ztI$j8E1|%5D|F}7OS;#_YSlj0)Q30EWtn$`WE%cjCBNgFW!Rw5NqXaJC+JEcH&1X~^RmLue1%jfZU;A8v;~H3BsCUrbHA3WKEj}NkdFBa zGgquhk)bjYM@Vc6~H;-o9Y)3v&ZGsv#mKESS>lf zyJ@t^mr{P~B~}UFINfr)Mx0LmeASt}{L!##^oktq{YNh)#<1zvcYMW{7hT@Q+*Rr% zi*sbzS@?puNuSdfcxJlKBST&W76IEOpi^S!G(O>f0c$XOb!=g78~0SJ+Ra9lLO5`3 zQ}wd_bmHy64{?K2@9Je0|N6|EZ77A+M=g}%;s_qK)-SgZT8)eBa`xRxU-qyhj)%+z z{(2`ENv|hNKTw;?0S(@C)JggFd^D@!Wl*{*v(fG3Zo-A*UzF`z=4|3?Ka9HZb<*8Pm+u(KmN*!E?!mXG(`-hC^RQ z>D5z47vA?izgSb`S*;Z*p$?-P}(>Y*Q=zvozF=@h%S{!QtEHaxCOf&sorvb5`X+ESs@1wm>@xZ7LCS8cPt?Opy(xykxwR zLKt~MShOllBqKg{5Fgr&0|?4P85>KetlJj>n)FrlM|nWyrG$+mNz+%j-FJPB*v`nsphtPc%3e*0hz%4vUt)-s-{*qWR(icG%(=y9|_)WcW-O+DJ>=XD=;JOH16f zk3vEFxeVRHKP-XJ`)It0eYA)sxH&=Q|NdbPl~1xy5xa9A<*V1zInpKC zW#|Q=ldB!bi-mvRH90NuZL7Awto)le!q{erbp$k)B^hgwu~M+y<)|g`l4UERlv0V* z?eLCK)AzB{piPd$pzf@$6vIXw;b-aVoyD0l9?A!Ld3akt%cbdugT9RR@;3{pl02e5 z3xrS(L1OhDf0uYTza@~&u^YdJDos4SkMg(_0uF-RLbORFDQ5#A6ARV?cwkZMau!vn z?A9ujv?XU(dRif`|CC*tAm-M&>S-ALh0-xf^y%UpYAMj_|EFEq2dLuNt|>*xBP28&;^RvAzpK+GE(>~y&`j{{S4oOhAv}AIEfTtL=n!U zdM{I1!jr%g+X7&ptX-GGDk?i0Ng5WO!$Tg1^yB@oFv1;K0ur?t=1xOOhr|&^+JRs} zdO~zOj^l*EH^*L0YIJ>n(!q29utg5L=)n`;jtR+EvDdCi- z)aDjk#dGl$%J8Y7thMkf8lJ_l%wbTUv2#Vr15F{ zOQt1W{wTjbxJP?_*6pPkNIhnjXC! z(aB&a7YECh@)m|KIF()v+^`y_Gggio^L7~Z2fFCRWdRYIRtrO-%Sj7ILJ*7)^G8OA z3e`qmiV~x9LmClIVEUK%J51cmd=OsT<9IBP)0Q<1OIIyw3=8yNKCF`9Crx8PoGx+l z=PXW4frufZXk4fMRNcqP8HIP4jOx@s@NGk?l66Y>p#4!Coy3?FWuN6qX`=i{Kj?}p zZ}F6S|6e~?#D?SRdNbkyg%a;9V+ZIRTPpzMcLW!D2_9$E!2Kg zc~U0O)j%o@hQfP!LYZ}GXIm9Qs@l>R#(e_Q++_SN!Y5?IM-7*@BEbxFvmPviKen?I zuAF*4soo|(+b>BIr&7FSAOh3f>88RZh_L-hlT5TOS%`$Pb_aQ^H|UeGRL2@iF&qX> zENCGEft|Dv@PaPg*MYA-Bg|Um5R&oKd031f5%ZHX_aWtQ_D8fzHd$CMlmkmVGp2mo z;P-)?RILZ_PTQOcdp5bf^=3**t;!u%)IixRW?=zHMAPgGe zyq1IFt`kz@qOm=VP%?=;U6f0ww~Nq=1L8dl8i`?wkY_XRAMtETES|o6;&iv*-xfwC)#;rusp#E>!$;A-%hXvA zHEDW(A#~YVdz$LWah=6qAzY*$(Sy@@CtkjlNz7mgeIWdayo6@-TSXG51hZ;hRcKIH`8={3P+bCJlRX{z zyCHp|$dASjA%BHF$c?Vsr_lJ>v3V? z7QWRj_K;t@nPZ^IU`0XJ-lJ3PmvGe=O(i+2Aj zyQ`)JKki8^@`MT(knaEViXmBLFV#}1{I9F+*;2-~qHf4t)wNU*rr9qHu~vTqr?txi z-=3bpLal{`5Gx7TTtIw!9<1+0(DjhMo%Y|EFn?+M2JCnN=0{;InWg)uLU;)y%7nNIDVnD^F?NeOV9T`x*3iJ0Z}inzeq7o!bI^<#pO|2=qFs^| zk(VK_d>ocepZsnKPIXjB6eHfI>oah_2_+m|_D_4=KV~iB;Bt2W+iQzqf;mXV?xfk2ZgJ z$c7feUOw*rZpxZI6s8hwwrw2;pb<~?n?D_q)KADzEkAiHZ&rJ~l{sC^ZV(9{yXq&y z!u}Y2@KMNWI_TL_<49%yizl&R8}++ajuxMlj6PkB9_}{Cq9{w`da1i#PpoASpFCX2 z=iRe(D`JYZ{X?t0ZLOKzQ$e1ugxHM_~2Fd`@=rn5}b&4THERz z0{wdzmJ#0kQg#c(dek%%i*!Mw0n4eWvSyDPEUr~sL+K_t8r|f~g6&_M8$Jsv{P4ma zJXU%Anv?O$?=NrKuL8cT-A@%BM8Z`97+Ph{KkE!&zrNY(-lhb@%_W4hC!hP9rtp0` z&o{H+`!?qw(_N>W{bOJLokevv{tw?$tAB-~UaT#B|NFI>?#+6E#d10F-k1AxzNRUg zt<>AibcLK#xdR1=%O4%nlqPzbN1@eq&b*U;!723F{O`nun>sk(B#G2)1z6T}W4bv7 ze9!-?nDx0<}~ff+w8GsVUo?06Dx+y!>Rn&R&Z|Mw?8J4yJ!gYR*6v4;>=gJ%k;Jco`AGUzUD>6EHjYl zVR{`Hz$>qF9W3C&(xU`Hq<*56RPwEHN?@N)DN!*$symhJR&O<=WY*xJEF^L7m(4V0n$t*lgj&jm^yMJ2s6F_@!}S++eQw9}~RFHz6ar;stSo>6l;JF{Iit zoVFWDOND*JNn-w8j^46l<5&Bjitv@}1wW|nYGz4W3*>NjD+1qSq2lGb71_22#fvCs zxDjsWMT9UrMF4+DgFYPHXy(usvJV6?@tAshsyEuHdl%uTgCw;hFQMZ1m!V!6&}PZ> z*q=R$Ws?sD`lAv71zRWW1(KlSi&EH+gmzc!MZPo&#q)#Wi-W&XzwgK#Kd;{COVVdh zTs)qccQA{0J67j>9B53Mf$iOr(AywV$o& z84lIdI@7`R6_MPWHa}KBtEmBfAT0HQ#8LTc9HL|X>5u~U0lml%B>z9gzA`GVrdby! zSg>G0gIjP5?hxGF3GVI|+})kv!9BQZfZ#rZyE}v3A@BQrXWe`MoIky0TXj`+byd%< z-SupM75Gn6YbW2&Y0m0MLGh1%l!t6f-c$LmN3gfp4BLp<;yVs}%zEv{L+WBR&c7n& zdJUjJny^7|wMLlmGoTUP6R>}Q{}xOlP3`|N0kAO~uV7xFEJx|o!tKpE$Pw<%)~=O_SnU7*0y6&Z1Vmh_#IZv2 z{h=Z9p}`o2Tc(Sv1WKkyOEZRR8#_y{c9(nTf{&tJR#uVL__ zgAF6+-QS^oYr=fINIQixuV)sm1Dc<6PVHiYF6#}BMUb7 zYrqxpe`&xQ|R9l7-gQeV1_kUN1+itJfzR!qS z3;)+VG13TqpGw?L7cm0evgAsB@nD_MM@sq`H*kfKS_mJOVpAcSy`}8o4_1;rEJYUH zphMMJhSL|;DAvCJ^6{Gq%!etiS%||wO`1=rLu(!}&h^%J-_C`+T&sSfkd!$)gM1S# z2917QAp~`W-oNCm`SEpx5Wq?>9kS~^-hVUf|7!nA6s-Nf*70w1dlG&RXCq#f7vyxv zRTATLxOg;+uxTtn$sF10O-;RA31R;$YI-SZJ@~S=!33W#T51a0wCeu{rNZ2lH`K9|ba?*3FDVGdrdvk_S-%A)ICbS~V^>h@Cu70&A>+ zcXgU#;(CUecK&Kv0G8^+J%AyH1-&;>J;2)Fe4};F{?~UPk!17xeaIgd2bOyL=wY!Q zdy%F}BH?To(0qjuA0`|~Z5RiPkaP8U*E+}R3FOmFVmu(3%-{KNh-6{u{O&t{Tg7KC z0EzpOV67)}UZ1uX)QQ`#NXM{nX?}mgJ|#3(&cFbCTn=u=?e$-W_m5KwxV+llJ-%2g zX*n;P=adpUunk~jqw2GX;A+uDr{cu0Z}B_#!m;nSRqgIc@qY$Dot`o|JVME_O+rGm zrZpk9ptL<>rU5P~e{W`5qbIqAG^}<8J-keY>kX~SHoY4?0g`@`IA6)?UBP(oDSeO6 zwPSvb@)OqE(MSQq@(Zxy+|iDfK>AG zR}V0-Pi<^peiR}x-q323d$YhCMic8mtv@$WWJ>40T={t@C9#|$2eG8)6QzF>NcE)| z3r%b&;5AWLg#u*m%pfnmwAlQ?EdE86By)l^G70aIvV*6Iy(fq_0{@Wfw+-Du+>=J; zlVlh0VQ|cWTZmKetA_(b$6~C{*}nBJl?zRnLN6t(ZbRnX*zS&XhM9&ej_#2XP3}pK z^kr?{j=E5fu4J^=rSF2;?t``TQ>QRY$_7vjX123c4b6F;H=h1w}=!J5%V96!VCVrowD| zrwyXv&iqk9m<#Z`(y_Ce4rkbj7r}v8WxX(HFk|Q%Wt2umL>7!j*|X0g%f81Fgtr=K zZM)YfAs1og=V!ZX-nO33-y8G zJ^EnA6)}+;+pqfsy>EezvM==db1_tQWM6_pLZ*#TgB{z^r!V?KZz8t@?QfaJCoagV z-gm{~5%o!&jY`YC+>ZYE&ZOU1qKI+7%rjcr-*#J=AB@?Ad1-y_mUfC)4l@^1_i=Mj zK+BNrYVWWfIl5qPYX*ZX%l4PIQ5Mub`K9;kqJ$TQb_3*`4v{*f&*!t;1q@%UobN>R zSHW44WD1%SmshiGfv%IW(?lM7i-Fnl5L}+H;IG;X;cJWXc2=Uih(aO~8L*3_V#&d7cF=Gr_XGyV#A{q3 zvG*&uh2zxJ!H1!oob z>n{9${JJrzIMp*WEa8^ol7|gNc|E%^!fLv-Wuw-t-T=hT?X}AJ8C?psQ!Ax8VaGXO zK;?^7a^K4Z=hNNQfhHoS7IZ1?fX0~@<9c_0?^mY8 z&ZvO&9{z|NuesfRL#OF1=FDYTXh*$Pq8+j7s~vA%9c$(9^QerqDOZe0>>A4hzR<#5ZT+)gYR}Bz{sv}xMalnjg zdf+c6SQ!LD*UfLcMo|J>HLIrixK;>wZ+OQdEcCvZ2*mDW&5+e`LCMoe4HbzL0*mH)v)MNxX z1SxEVa-Od-26vAJ8-g$%$Mo0txWR@C8f1t0z+sk1Z zzN`u%W%K!|ZdCxQD>FVHam27;P3ht?P3LMGw!b{G8(ahU!M^I0bZ6WW^JK!m5?FyQ z>9f&XHQaub+wJ>uYUBZje`3T%JjvwK9uXn31KUBhbzu7;UNLMA zyGir;%C`o?H=5A3|}P{<{A=$GKBx)MzzU2^mn4o^^~@6b6Zw;9S;!vJw>End z&m1%2B4RNuF<*vV+*%*!z3qped-4MA)wxd#Q_e2@!+Uq_&H-rrDQLdFsKcD%D=aFY z2_HM8cdK^1moXW4L77#84$rx-7p?-IkhsA6*fwBa_|9IR);+X@1HUMRt#hENLAe0DQ)%uflWBJWzI$OoXp1Qx*K7_xX8!%lA zHS_BLk*M}6oa&O*`_f6$S zeFi-z?H-m-XmqIC%UVFPF)3AlEcCZ)>Z)Z3Q4Cocf?H0H=i~X)blo!O^BFN?PM6CjD05+?*)hWz@) z=`<6%+nGnTUZ?Lv57Hly-`RwZd%q+1lYd|pqkJ6hM0@m;f!^sv(hu-{DBTY4?re() z9AF~PLFYtR6?6qZ*`K+TN=hqiKktFB0l##AUb6|@R{g=K5(-+t9R?TK$ks?W96v@h z@1Ci3#VWOl4F1i2)#2wi-0qk9`l#Ow(WsqqBX85Gny#6%^W&yEm7|;t8R&U^{k+0? zH+9iIN_@hbvrHKe^Qi9Cq)T=^y{hQ2;$Kr}_Ytj!5M(73QkRDEfc2s`*9h7A*@3rO zMrOKX%ZA~ch)xy*61{Z^4j+x~9^UU^%{#cqSKEi0*6?YE@p3}XB|u$YG0-Y-8ra@Z zu3QoM#UsIlYs5`981)+rV&|C+zx&el&q8o2TH5JT^dHBSwpeL1-Y%|N^Y!e&1XD!L zu$sYVmG4kD#y)6Gqw=igjwRK@EYCrp!}__0hk>sTM!M0cuJ+z5KLK~;sFsg4L6hL&?RAB~} zi#kM~?}}c6d)SE%hjB$C4KV`=bd#rr+SM4h&&HWm6ak}NFIc+4#(3PC0&aBgRlbfY z(i*dN6*}oaN(*D_1da~Ri*>f^d!U}zFwXtCU`rIT zo|!Q|TU$v)_49ds5=CJ?PUqp&gdfVugJptmsh*xwq2#n9@s-5MoxhMzyVBX^CY!a~ zFMO{iIevotzQzc4OM3x9fi&6z$ZEBPpMax#`Fs7N&Ldt<)h@2IPL9%%a+!-VA4~@J zJ0)PS54I*}mN+krUhQzGS~n-XsUMkx4MW6$!;~!89iR=b)YYh>^YVkN$i`aaIX^O{#jK zkp_qvd+Ag-jN-KJZVNdi$G>L|iZ0G9MAs;g{&wPV1PT z;kwf{$ixfYjLUka%Fh?Pv5dfrne`wQD*$z1C435ZIRksVH@R14oeeiu50H-G+r@NZ zlAE|3A@9x=)U}j!g_n04+GgJwuSW!bcli(v%d&_r z{_^i-K*`);GTPIHjXCoO&+CwmhsWKWsh0QWK0Mhvy!f%=bWi*2ydbhD+E&yy6Mlg& z(($PLmuJ$R9v5$)fIaXfN1&q%?8^{N#R(3Px`)TF<-vTW%f&Bu&eSX7dhURCd?EJY z%zlOUl#E{QxDnZWN}cquc8=dNzBN|iwvw!V=y5r%ZZ6@)XQXu{ZN51Cp$21E!t7$V z5+PHa`5|)tL<}jW7fx-wI$=zWO4mdwxNXe3B%wFK5z9uF@!>YIgTC-^sJ*<0X=mKG z_lE5BRnjjwnu=CnZ`SKpnJT2S|8#e+NuSZ=y0?j5Vm>?B&4cAqB>UIYO-9i4s4E578s$DY-KI>tq zqKs9~pvA}9e)tVj!z|H2#WZmtIe5}oZ-G1^V#OIq31aZ3m5!v2m$oc@p>-k*YewYgk{?sHi5j-(_Nfmd>H=SiRH5e3yn%6p5d#XsD=7t@C-@B_d7 zS>k<8kaG<^z#ye9lrL|;l_FOxpvkl$(5{_N9heamUa~b`Q8h4HYuK~;zC=hJ_eX`h zw@TDmrds^iKOF1YCtatlHILpmJj5UV_r`$w)(}l) zZ+J?~!B`((dQq(CtF;ehK;Bea3w3C*Lpp`hvD;FAqdZAIJM1!jvS_IB^$%A?@(Z}e zx>Viy<#(VL_J~~D^`r8!W}3}yS0r)?PIUWCZS4S0q^%b!A!5iYE0sKef61f1zZVWu z#~Nr@=#}&a|F~7P)KAlL-~WcCgWt zv8MAw@)@qfRw!;Isivy&*&t*2hBG`3MuxR-M78X7_vdUiJl{N{yw@Mv8+^gm6aHJ> zBHy!jx2i?H&@#Sg*O2Fn90$ZBPK&S?)1)HXui zC#|5zQl+lJPtG>(DJo?^hy_ANW!1wUVn_;W-AaI_G-eVm$H4?W*~ZiDy;Khu zG(?K|kegMCI=_#uw;$@p_bViW*hQ;W!WVQX?%A74-H`LXSl3qRcRMG08ox_cJw#c3 zJ_O4K;WZ5E&`SoP1hu$nM5cq!1U*aZ6BbDM1czc)9Zj%l7Wqaq?CbwHy8St8mw(1L z|Hd`R?c~Q*<7CihTuvH~pCS4BMZQRbFJn6RWlEE*MBuj>&#Gmp9;3ZNyp}Y|UFe!; z37;S7mAhcKNZ7mX6pCN|pjB%Y`=UtmK#T!cZnP(-{rcE-i(m2#>{N<<1Ai+(UiPJc zh06j29l4Ip5`TD*9hCYQOH9O|Zfsuu&2%U(@KXYI1l9~V6Cw2OVAZ@9m$ znWuY-DA-lXJkMX<{1MvZG552)txl;gG~*Khaju$JmTYlZG#})% z@yif4jXf%l$M4~hUZpEu&<$gdQ@hkR7PSn$%grkIkTVv~?NlGwqXD@8)D>MTV_S64 z&3@K3RNiU@ljr!6hjjVqy< zY`Xe_Jof~|DfF?TQgjne@IW{LE?)7uh%H|AD$Xv)Y7)3EECWB*JZrz}imZA!AFXnH z_dexx0V}_QrWX$Sh>+PiulOClO;%jIeoM-Pq6Cz+ev&LSG;qN(4riVoC*x9xUfXUBZjru*FYRe}LpT~F)}BYs zhpE=KI^%%NTCMV5VyDYiU%%^mx&6Gp*tN#J`s6u|MtiK5ddSFJ_sm$Q=Q6P*+Z3kJ zoV8jhb?<6*^T@eG+EA(7Ok?2Crp)!rlraeLiL*w6Ag^AH7&3GLNJ?#3msnsGd@f-T zOaiaFUquUDi6$l3D!q?ZiAD>vJUgdB7le^!`_=PDB^pSG^$%jepiqH%Fo{D*>*vV# z(}+UCVGVRJAFYGC3wo%-`tx8fDw~DlxQy1Ips*W-~JJut2&KnX40Dt<9T-Syy-vr z@zPbdL!I(#N$S+I2GZu)Ak8)}Ba|8R--k^i2Vt&R0Ljx$Br`?bZos;vJj97 zucg2r(SRy`ZwoxAt43AU{x*z%1=rplVxf83B4nhylyZ4OoUvE7l17ng&bWsh7!KN)t@6EXUB>A_Q^e5=y) z$Dxxqfhn~EUZG~P+6D@|dL{gELEhT=#N52Sqbs-n6=F zt6Ig;CvD$nt{iaG?<{Rq=C~!P?#$~AjIeCV@@uDL^0_+~+7&pE%{9qXsO>D6 zak&HHY7pu!;21EPlyP>;N`AA`fyc@seOE&zcnCbr@BX>vlH>Pv&s=KcvicWGCv?s9 z%G@CuUA0QUNzE8Tu>W-6q36oay^ofVCe3uJQ@=i2F5I`|JdKtf0hEqx=2}kE)D$;- zATI+C;WS%yvhPBi+seKF@XhoKsk&L9zNQ%;(P$ctBcjww-04!A#Ldlt2(n^UE!WHNswtqJPfFz z%=SW@sr>H2s=QB_&t5I?L1DQ?a?@&T#uE=$qym|)B2uhbm{x%lh6*5LuqAKloqzlds{m^ zBGVxn$a0BCEhf7)%_WbT>+g$R8(FcB%f#uvu%N!-iWSZ3>;VtH^la>00kz+k85}s+ z#Li%N>}NjMN5zJ^3+Il${CW&m_zvW*8Ziw$X*-;PBQA8}fTR(hpigH! zzjd1Dx7d5eua;!R(}+3RO;~&PaK~2NaJEA!GV|Usq-^aRYB}=k2h^r$>ua=*m@MSl z_@LjAb}u*+QBNRp%}?)?S8GNesfl$UEL)+T8fL3gw6wxr4q18K{j$|A&Kx-hN#E6o z2MyxtJ8c~i69I^~z&R)Wn23jxSk>@YtKrKUbOQ=Gk3kcNV$K$R%nJx^XE$qN9Qf?W z>CcPmmaSO7-%~W6hA|NlIL{Ypa?^RrH;G6Pk`~8y;RFICGJG-CZulmr)&Ah5`BK#% zi3LEG9$Xq*Je)?KtN1E(4#ElFA613%sF#?9a{8$ghTUMqJ7^`<`RN= zexDM}??MlpqxKTBBYIaf9f7pO`vn+F(I1%%>W>TBXxIcnH^21557ys13hO z0{3pVdd4ZYRUJU2xxYs<5E=E_&wX+qHd{^^Vzj$?`dc-2XAEEH=r2-RK0R~DPF`)b zcGQ+9K#)YaG}b>HU=OyYm2b*ND=37Ftj%$@H=pSnZ$!vO&&9z6CFTyDCrN$F?>sp{ zrn3IbT#>IR^OIwa@n|`IWq93`iSJwWJbdDl6Mva!%|gdSvOR{6)5CWI&1F2ANa|AY zVvO0$UN6|ke|M`j(=^86*uTh z{EgHI@EkZ+o*bz2p!ef<%wg~+&2^drS)rg{4ao2(4=e09F{ZL>V!Uypi z$psx&NLUwt($(SNs;;!Xecz=sD>gLp1Vmd&tVav!r01(Q9)=yZOwr%$>Coc=!FtwU z?IlxwJ0xH{GOd)+vT1Lj+PAN&?x`{7{3*1(yb5VyGq#Town6N4AhM`R-r~C%N zuWZkguR*nFZfSSDY)?~7=Bm8&w4XRIlHuXwJr1USonOF@Qb-!wNScPkNdloDr)Wh~K(N z+U!!UN1qNS7622mz%5#r zcQtPc6A{++$pfu=fwXfbzI7pc;K|dCI~St?>%`vKH>^ENU=@w&bH4h#yRGd?H}#R* zp%B0vE>Bn>D9}2Xd!R4>M3|^b0H8-Gk!i+T zl`B;gLedY&9F(~%P1NL%S5Nlm2<0))uivY-%({7W32#Yp$?WeydL%=}J(#Ry(tCaW z$mB`Pyz_z9E&kHfrK2qyQoBo&EDqFbr=f(1y{As!(yX1;rDHl*9Xn};SqBl`9QG^# zJ^DTVosjn7RpcH?J2t|LSrRPU-qQYCiiUMU)rl8|ugT8i);9h`#b%{LSXcUhiOHWR zOD+P^djE_e#cZ)wSPQw`gMW0dl!viABmkVJ5xeCG>u~cW44Wfr(tH6YYf5dsYa9>0 zhFi<#V$9E2CX7*NKt7${HmcvrUkdW+Ncj+93sI=5z{mQ0UsuBB*GPbw50I)S7VAX2N`}_wUm?nu;mNxSo#w-F% z^YxU4+d_aSCH(}CRe4+j)_3~Lj}8S+1Edk zjaf3Wr?dK1oy|0=i2rw9q>JBbI(A&;`GZPsTtaZL@aQL-FhC{ zrF!WL?CB>4g6w@5v$Et4hT;Op*t{0!RY0;D(wHfm(1by!oJv@IIrz2t1k&+3Ov zX;ugtdMYTDgMOOq$vl0}A=xor=W8M^)EXVD-VrfvleT3K+#8KGpj`EUJ38sRk{+{c z>mC)*r$KO>vA8;M7Y`>XSI8{A#(+aPT9PgKi^_?wH**> z0wAc(`2&X9r29lyJN7y}A3!_sjDlCM9Xxj%=wk=x(C=G2d4-I)t~f3OJ$~^h$G|r;eP08L5@b|w%BZk-y1=3uAkWUJnx1)Dv|7M$CKGCkt!IbR zY*Tx&DPeKDF?EGyBRN!NeC5teMOmyly6+PB2Iv}leXiE_U;aD}D&YW@AJb1>PJtGr z$>z|p`~3dN(R556d`lKs_TWucgvzyhtv6la6lNSJWN$`sVP)swvJZXHipxLNr&^Ir zsXW$$0;X`~sB=&r%wBNd7_1mjgtZ9N>-GrTkDcw(S!dVa?JmRLrgjbUc+J7;`G}!Z zp+vZPI6U7*qJHDETXJ%^>KQ9GF0vid0I}grBYtk~cx-VVyoxlAEx_?!{{F}j!KlU)VX_VoCQvy*EP(5eZJNuzQ&`qK|8gx%;jG#ct051Gb7 z4%Y69oD@s0lT}L#AR&|7xVOB_um9#{K0_9l3>^U~EWh7 zhEUayXi)vA2b(k8OmImba6`Sdgeybj4h@25S0~mX=+u}x=WtZ4(c^BL&TX?qE(@fq z@N@#LB>I#!?_0Tx=1Y{uia#ExdmaQ7!+xK2Gt3p6M=3!^4N#}Qlpfc$gPkwo&Gm>1 zVV{Zrt*-}!l6UG`Jl31*ys1JI;pyQjuf(hcbRACec?jj&(33)*G{Pw*Br-nu^X8h? zLtSsGZyl7t#?2aCdep-i$kS|RY}eQ%FKm#eec$!i9T|wsM+B@j(n*?hL7IaQhJ02g zXZchN(=wyYXglf-*_0qvp@T-;vk_8VIig{|jUpL*A0WSkWe70JfNU(C(9|JS!Vzkd z77hwiZT&&qBb;*$|dVG1&}C!C_Bp(F&7ifFlFLa)E> zObZ*sCuV-0Q8^A4x!INMVzzUUT_=J3&jzmrdcfLhRtQJabiB5`Jp**PQ zq-$r;N2Dv{8{F%E@<#_bSt(gf0ELhBxWNi?$v|u_ScCH^Z_qx&$LF(hs2<}@w-P^@ zp0UDnDJrsKPxf?|$J%ZIeEUNd3z`UboH$7UYycoE6%BIxzC zp^RyFyL^~U?Pn%3pje1rD zgA<6ib`U8#biL1)u-f{;c{~o}WQ-kjLAzTy*xp=nXVcn{sNR?&Hr!tH;X=E57}1PK zBHjzWuH*Yylqlva-xwnVwZ`1?5o15Cn~~X*_fuqdAt*AS*`o?TaObmG^N5{t*TCzhvGWX)Q?^DY%j1YpX zFcDQd0GXBRB8|9jiDQ%n5?*uH%m^2m6lMA9_ZC;+=pWf-A_lPVFHklJOeb!mTTX}$+~_>0V@zf? zpM=(OenyG(K>LnC>w5+<QV&9MW%G!-uf}#7JiRV zpx$|oZtr5pqkc`jMuZ!Fs4i_IK%pX~e(q9=TISSC>vOOlmGNbiOvFsYOLo$PRQ1K) z;!mf>$)QN6bo}Or(o>HPxltm#XbCvTEiRsz}W;h&Jxs`!ofF^GF zw^%L79C{v!uepK4J_1vCnbzM@ti#tZxcWmR?zoWRwLr@5mbSA^0PL^}4DPUrfwTQ^};bIBomBcsS!s-{;u))t;8;B)D6sV+fh>*1_>${_X2zd&XPGkjeKof zH~J*NM&-StE8OQ3ZU1<1&2#5vKHSUz!+#M*z*q(34WUT&Y0U^sY?Hxcgp|D|Lgv~q zxC%E!{~{B>#?YW(*u ztt`p7(zc+sFMGm~AC2D%IBI24*Nm{>O=GiDwxEoCs~8A}N^o|YVBgbG;L(u%2h<^m z{P@(;c}0j4j8?)226+(ek3Ci_)XqZsTN)5tkRD@s+rS1Z5B+b6*!V@tJz?Ai0@4t0 zp;D$PBhqlWM;Bv5xv!B#Y5NVjz&0?#L)dwMi58|g4yC16-dkbWLvWp0>}BH##IlUh z^uK@xnCMCNn4S9LT+GF$|KNJ`i9%>iXG@x&eo#9K_}g=zC=3~7J*7A)+M$SO0h<6c zm~i)Q@_be=sr3>xdeMWjMrimuxgdmuLaS-@A<2JW7%(BtKNh8rd+f{(!YIEL!7?Nj zMzf6nn%nr7<#%z9+%hnEu(#Vt=Pf3vqDi~3r30c+y=}_RvItDOpIN~;1WoXcV1ynR z@=k}B1ERGIOXKhVRL6~vQviM}!H5L!Dg9f^*ogEKLMxqlhO)6%%3t6Hux+AYhqCLW z4OFuJwerR^NzpVu>9poTKB=VQ8^Kd6=J>FnHK8PvT=2{D!Oy4~&^Q(}&ib34`l>k9 zQt9*0CG!F$A#;StP9hrPv-i!c6@2k>zI0tKDp=zM{KbXvD>pV}>wQ95C~($-eN#*^ zTO<*iLKwS>a#z$BS7{OGCez6}k?D?$1LQ3@^0IdO`iakRUx>qaZ#Pa!qgZkxtk+p{_W~b@Qcgb)J>?YO z5=W>zTe5S0uv_~RF_0Wo8}_P3^>g}Sz!?z2l-Ib>Cbb>W6>N`pD9lM)zd+pb7<$W;}i(lvQJ7O z%(=d1*pV~i3ftv91H>W$A-3kqAg1y<7V&T2f^1_olY|BPiR2qTo_u=<^i}y?@BxbS z*1Z6Qha%8Ixy4W65?1us0f9kR9w8s0rOcg&`k{@hdR_l3>=b=+Oe}ZRgzyBleCoB-y5@lp}w7 ztt0axO>bZV5xjVRxJ-jPUt~I^!5X4u{s$;wIr3kYB?fdhT4S};!TxcWBNJY%!0r#6 zneW1t-o5)0f83g#Lh7UJGy-N=Sgx?;TPczt@Ldb_!BQId>ZVrROem>sXFwv$6;Ng1og#}9K^40Q4b72sZW>?X&=eu@FJ%jcK;q(pb?fHUQM^J+Qxh}#f)N69F9 zJ}YsH2&D~WpG2iDs2TaDgvYWrpEy6HqrK6|*+;1S*c$nhozuIxkl4;-7}JFF`1h&Q zGCM7p4BDmW00mECVx8Kl9GEHLoYIz2+_FGG&?>zl#^1|x9z1)2WwttB-Uh&<;IJ-R zYJh-K+Ffxv_MUY+yxht)L+7XZ*Ib$dJA(jTMHk~VghFH0nC39Bg$-k}{G$hjXx-bte=We!m|^) zigPDws0V(C@+yW+NU#zoR_XGSDj`Cm%d<^oWb@40IC1yA&66Bz@&&v^NFnvp&{JAe znO2(eFdD=qRdF&?dlWN15(BVk=*k}=#zN-LPst?To+zeP**noOtkh!7Hj{e65SLNZ z_)Idscv&p#4<3}2%ZRjsKRULin`y0)2VavIVXfn64jC4IiLN!2;eeT?SS3-OHS;$Z zRGn{qfJ=BYUo6e>&EMo9b@Lb5Z*V9(YtHM6fB;Zn z)d%$Ce)qEHC;JHq1oA!cV)>+Xl}_Ip7BkqJ@uEuk{`S8wPSZIs?R_a{*YhYY41FfN zke!;n2`OLGpnTIckZr0ppXW;Jj^WKZFJx<56@f9gturmN$ulj1{W92eo;Et~(3N?m z`+Em=K`7#8otNJl?@_|j1ZS4&57yJy|f3oVp(mR zH*e)&R;D3E&^*rm{@ZP&~ z@Y8Hl5!s}m>Fc;8F&Y?A8F27DGTKF?l(`W9q9$TnD(z!#aLS(g7D9H^{N#723$Z{-0Y! zg*8)hZFN|H`XE!%AM8;K(>$Q9W?8M^Df|#bz+T+YEJ=Gsg_tPmnu|$LuCVP}iGjJV zt25*qGsEG?a`h0`;xFRe8@sQm3}A;6LgyM&dbJyLllM)Xc%qaDt>*s08pXqKZS>8p zhhe6h&rN(Fa!FffrDz)^m*@{qGO!>$QTd7!CkmDp9N?@%GJ^Wzx4`@;Glu$VI>Z$gTa!H1rPOs9v7+HxBMGz-yGDCE}%fC zm)|B|{`2)sYAiSn3Vc4fn>+)&?mSQC`nCzY47L&bJt^joPV8wTHvIryKCC_W^@YlJ zt$|+ykM(WMkm*f&u32~KSGW}g3uFrjsAS`3zxQ5ST-PV=+- zw>kJLCtj_XflJe`_lxRTTFP*riO5a)8}b`uYeaiLOx77s)-9z!>vEDsyqEHA;YWiE zrE~pW^yi9ll>oT)#Qz`-+sC}PCI@ILrQo8XSUWHDN6-jNuQsUCnhuqqfr$$9?}6oc z)^G&=oel=QFxIXhhlL8foWz7zI8)JX=ft=}wKhqWy{PQ8C-oWw#9MR9IEzEbm#-th z5IRx=hl}FVTbpVFHAW47Lu}B2YU{0-AxiuYf{Oh7yk(^8{zCmy$pu^T3P{1uOa$0i zXfoBF;1Qr?)rn+U{tL45Nrh20;L@kJz2|eOI&B&{4+hj8G#Ep5O8p|>tNsAq1=*)x z{Vj~p&CWBYFj;BWPj2GKU#TUTu0r}x^v?tU0)W@6suX_lR6Njz|pnJ>X&db7$ z{1a94u@j2$^q*OaT|-$fNx<(tvyfU4{8M)!l{%|Yk+9PVH{WwtY-cRfXr|L`q>Ru( z@ohrRO0)h)&V!*LRkNjyrBoDr`AO)E z+*AJ1X?G{{3~c9b#*P&|g~f9acY=@G)wg=1gGR+Yg{*7-M`G;nRrF|!Q(Du4&;o$$ z-rLkA{#al1wTt4Q1OuMJ2a_f&Gt)dce$R6Y|8K~9Z&?s+YKk*ot#RUa{jf)LxjTA@<^Kq>@{lN;@#YOT^aJ< zSWK5t5E=5(*&4A>g zmF%nsxE+v~u}bg4G~%;NgG@{@mvqtp`g1y#sf>KP^7xMFPk-bGf!xY;b%orubI}pTM4~VpnjR0H6GYblk~aq394c7unlzTHE@ApN-a*WhC&V0WU&`aLvc4ZqhHJ%e4~obE_%UBmXSN7x|>? zW3P(^J%d$PC+a)sM2`sk$E>eWGs_%2AFWz`2GfJh zV7*Z+(yBs`z!gSi=q)&x~R0zF|jNE^aeW0C|{|{wf9TipB z#`!4?f~1rfG@{fH!jKX&Fmxkb(#;SO3P__8(p^eRDczuScS<)(h?MSo2fsag&hFW> z`{&GDhC6rO`#isT-th)>sV<`?&<5t55lMSvvwrNF?hsLnXY7+^8yM+?(L1vbv2yzd zt=Zr%H!z!Kgww&*Ch@g5^$q02i@wnm@$}+8Hr3J)hpsZTxaM4sj%d$sY#O|Q;6#cn zE`SpjlpI@9Q!&wv1fT&Uc_kky6<+lTKsledPW2;~>+wv{H#hWZ)lJU|0(4m*!|RfE z0E-iA7>DUHgdOzTEb1_f3SD7mRS1ia;T7h7$u#pv6^B4~c8V-3Op1@Jb0gOqx)oNW z!e~)zU7yP-9KC}zd&o{({gB9Up^DRV6@33NLr}?ui}A#mZ1_UOyePg z!#MbG!gAlL-h}@8^=0QhrK|JIJMC#|{yJei2$73@FyB3;TyLzA@`_IAdVN&FGO7ar zIsG3`!u8q~jm!y=?%T2EHL^PqSVUfRnPf4(!to^R=}QVp<&6hqGw&DA?{UX0(@Be& z8$lO>kwVpZN|9iwj4ci-?PIb)-_XTm#WSb4aSGRi!8!{} zS#s=34mBOuv(^W&z_9I|1Z@e7hWJ(KV&42p#>zf@2zz(hND5hlP)2+NU99&t63*xV zd6bY5QE9Ru^nO3-$?VKviID{;)9+As%{7I5rYn%V*2)#5V3~aW98itXav+n`Sg&idokW7p z>kYB))Grl*BldWla(|ew3r6jQrRHmTy1d%Y$O+~qbf$0fgv)EEhq$N?$2$h3gyaWW z_jo2>gO`>7{C84h++&C`Kaa(sHt97f8Wm7|e7++^r(FZw1`7%}#f zpYto4#pal;*Comd2{Z@=NdpT1MjJ5Go;*#lJ<%^W~Y z(uXG-UWG^hA>4UKkzX=pg#>diXxb;8#0IP1WP{!r99gH_8_4Z8q7?&u`9-qsRiI01 z-TMZ;sAyJg^kKWLq&5V-FuplPaywEMa}3{<22JO^YZHoo6Q^k}I0=DkQN{Z`C+F*{ z<>}DdmQ|C28mi0U0Dt_L4$a|{<#++pv@cQ9Z<#eQSM;+#P!iREuC6b?#FJ&N8+ zVM)HLpW`+kXD>K+19%ihF$GLf%0YSH>S1V{-ZxM$RF|7$qMHZ|q1QEG4n`_5cK7DODG+OMlyWZ71e0BEZy!RT7pq8>Sxw*I62V$Zd0tiTtk`)30Sp)KubDQE5$FqUdmjR+4b=coR&9ol&5zImzOf2FRxI$@B8{#f! z$>Lrr2Uy_nGTt(t-Bv16NV){wU^}S0VzdkmlUAe(!cqKDIR@l{Y=DP?W8JEfby__s zW&bNK&al0)+7kDN*bBG;pVe+_v_VoMqk}ORVLO&J=F>L4L;9%l$OLIHxn!T#{8+}Iw&1Tucy3FBif?+~6DNw@$Z@3+F zrkpR?3Bj>;@{Zobxd=rM(9-|Q-0jz=r}oCludtl9Ub)(iPIMZT5bI`WCMH0#L8+R~ zxm!4aI81+Of&994K*;=KzPH;Bh1L$iilXrAp>GcOzJKy|e?Hwq$x_Vca&zWv_9>4`TV@@ zyhBK`@b`zqb)|w|1sH}4y%!U~oNo>N{`>~RiG{mwa}3wh{e=IVA1WC(`X=%Ey%Z+1 zISlpFac+R8T^wTUNlRFjEM#!}a?5X2ZKRgFlsdT7tr~y0KJi*1>viC%vzx`j_VLzj zj@b;qxxzH_hd+}uM_ED>Ek$xZb)6!6C7N_&F@8P7G5sYty(8D8>#BS}DT#@RoF67m zFZrATT9Pjdi&XPQeQJ;0eRUtg3a;1w)GAzaD=)lZSappdH<4!)3)D;3@io^25@`#{ z9FQlk5KXi(?0FfP$#`zISQkVBWX_V9wjBI$&x!&{b-LK2w)k1@YcB*Ug4{J~AcfU^t;KuRW&H*6u)UGtvs z(6743`U%h?>XlXGm_e}S=od!5?owhUZ;x2nDNmh|W&i+OqRS5pG_G*=)!plj9BMSy z!w9N5V->@i(>oPh9Tie~Dh492djr+&)W{+IoxX%sOK~3GP1*~!3(jTrRy)P2g_XF| zoSv%?>nS(eQW&#tU0UKv5UjFk-ml)T{_ncJLw2X@$&Yg(<#QpwnHQN^Jd}qq zCc~<0%7um!bXv_1358iVuh~jJ9Hp7)s@}V1PoJzSgf1`2HhLdY?_W1pqeqLrw+hVS z!9H8#b7;Owf2)98%VALc$c_5Z-Pq|S>DI?SlG`2A7Gey>joxvD;MTRCC(O&OKhRmL zzRw*~@V4$2<3kA5`|$(8YvZvkR*o{L1%CW%!I6zr(W$&{O`GTsIocOb6#xmfiT_=9;(BsCUq$25cVOY?DW{-0ZVuLf>cSWiGgWleQKPU zbVE`Hgk_sPKgZE6bD?E=+b002T=l=CJR^q=P;310bN_t;N0-Q=@fE^upbzT2z=-Lz zR0-n8p2MH~U2Fvh<&gk|jm2~<#{h5{t{{op^4bwL4GYudY$K%68Lf}JF~#i=3cUH(w#@0dcdO7C z15n(cGncQKrQgvAMAJ;673P|$Vi)ucoEcEUG2?f8SqEPTp=AgPoq*XJ=IVv^pqHQV z3qwsOEcH#TPHIE{)zM~@o5wU&M?g+)AKdEB5R)f`a5TH_VJy|_@eS%@3xLiVUxu(J zS@tPcuvgu_$XW4IAl4!WpSPra<>UE5Ky<3E4G>w!_~1-h(sZ+((Dljt*f&s-D3n_7 z@*a&v!jf!Id+Y0|g=ki*HmYAaLjPp{4TJ>1v315DH4=1DUTBWO7B)`^UufPKvmPLe z@o5|sUJ5gDoa-YaMSPEsHW<@o= zQuvFFhWIRUEgJA;wL+nG@Wl{>cw~|5SE@0pRQL+Jpw(v}=f+`2ecUw$^b{B$IV<$0 z%H*}78=6;S6WEn~y|mi=U6@b_aH40c8|=O9kgM?hFzbRyp2~@y?9oi31%-g-UPjK{ zPs{*7OzgD3a&jSnN-NOaA4u|%;mEk9O(Q`22HG_foG?{&?#f96O3r&*=67!->~4FR z3^QzE>O}4N1HdykDhTSlIG2QGj*Bg`(69s9SG00Ov1vc~(-}ec5xs&m&8pishW~?4 zC9r_@Ez0TJ_|6*`i2#K6*N)<|8&tfPkd-z9RB;C*833c@Tad6f)%nMux~(TsLr{z+ ziKCJ7-4oCPz{|7|&%^UfU10z>6wAsK$r5o;TN6+naRosw0*Km$K}m_24UexL%D(BJ znUWe_TVlAv0iki_sj)|Edp!RhT6~;-Y*&&Bimw7DxI}hT_@<*eMpqO%8YpjS1sL)k zKpT7bjtr5a&g8|KWjF)$Z_N^MMMkA~E9OKlv6{V0uzbhkCP#Tvz|hBkVcQ?LOOg(9x5kpJp-56kcW!@Y?o@eddGDKEUyJ|acC z-sSW_pN#*roYxr-U9}=vRGXrw=FwRuE;tulov0=M)bEF78-ka>BE0th#P!N+R23r${K)>4V{oWrAiS<#1g^oNw~ zl0sfSagvDGP%RTndDlNhmAao2R_BOJM)xkr9ZMX_KD84l0Trp)hDFu)2LMQHms!kY z00o05oHHokhqvVhi*AG7<*^HX6wkF`60y0hRicFSx`%rMoLd(Kyf6JIbf1L@h-shc zai&>;cbihB9|$$w&!9>q7ex2#3I$y~#F>tuD#lG1bs7@xro4_aS~{0v=kS6Va1@%} z0(Gd_h8_Bsrtgm$>CoJcLU1rBRot--0JxbRH|X#}4j!8NECFeLO*D}KI%zRr8`6(d zMA)WI_~2YWeX{uE9gOUgA4B~buo0KBcP|a(aj!b)X1_aZGr{hkNuC34xv$+2twEE% zHZ1t6PL)I4k1Vr^FK$MQ=dbv~5}9U`G#PzVK?nrsZzGI}R&bJ|nC~n|FPwTJq_^0h z98Zj@g34dqtHp>ngasF&0!(y2C+CCd%g}usUE_>~N5p3TdXEfG%*aIPjjINX*Tp31 zUNY8W04xYPj9#5|%PCMLXJr8CU}0*g&c<*VzgcPV?MC6MG`PBiQbn@byZ8INF=D3u zc5-r_lf4w&#?j^GjelT&g`n6~^W=FxV~j^Lp%^23gekEXkBJj1d^6nOU4c2jGDX-n z4X6?-M29p3RAKTSwQ~CC+Ura|XCBn!Er0&-iYOOKb}4{qh&|^+#dFN=|pW1YDr_o zj^C{$=g<(-L;D>duCUhlT)KHw0DUKdMjFAvCB%@SP%LmA=+gqkKc&cur}BB&lAi&E zNGw7^80d-Is+t)ulfB#_gz)OsKG`Fiis=Zi1q7{@`6A`Jr7RWwPbmEAOl zT^0yGkOE`<;jj1{c@HpZWoZ(Aiw*_lvbi%sr37)}+}wV0AbHR~)AgLtZT#Vt(Gbd? z1s0}&n<5UAzBqJO5R{O^@LFix{;5Tb((>!i%r_w4LTuqWbK_mh_bNeWpZVpkYNV=j zs8iWpy;hAc^f*i+(b&)dbBc`m7i(y5frPz$(0(hL=>Oe{6}UrC{eO01&wgHB&Rv=` zus^!oyg1FYjx@k&-0Qt4y=i!->CeT_fw8wK+jkL7{bGMTE>70d8@(@it^WMS^Ulu! zmOtiQ$9olh`*tgP&Z2frM;x5J1!zX^4nY!ALK|5PJQC(_J`TgraQS^ehJ*&Thrk{dMUVUeygx8ne0mH`z?j`sc(n8oHK_HtQchZ<7*uKEjM9Jh6BwiXq$2Qbqv6kd{a>m~Zbx~9fV7|3+~CJJ`5MKTYwbB-jdrJH#`qRkW~_LW$MkTa?qHWqRB8Vl8%dKa zz~vj9*x8^z^RagA+)T#QyE4e~5S`VT;NKFbMa?%aRl)Eev*o-hvcRTMsmdiavw*S? z-2f;x-kyr0f}RW*>7u`{dVUog-7m22lB436siNH_CpI@VCS2d!uB#dsCo7nNN=I>C z6)ZH^$#qCLx{n1_)`>d>C7TaYo%C-$QXE2VkTEr>76PjE%vy-Xf0{QYn2j8i(jO%q zU+TV3j6Di65MZ_D$w!6~R?LZ=qXImG24+8#0}3fyl@PK%q%4++MyQ&t%dLs*)dVW{rgM(fYGXWh`7ElDrgrJNSWIgTk&0oN7tHV_-RwP{rJN1uFw zyIdQ7uL{o$9-3dCesqUSzZU?LU7 z%+1jcO&)wGb-x3ev!*>rlB-ivX>rfTA)(@YpQSv^sMo`|;k6i=8AtJ-2*6&s&I$f& zRzQ5WyW6ImjB^OYqjwYlb#h>2W`|V54WZ9%CLL55k@s#%jgTaD^sJF=a{4Y505sp)I_D47o7zv zLe1RL=&oukxr4LKq8nC4V=!RAPX$LqAAmN^M@^zuDfEy9_PJiG0SVb9ka9@d(K}Hs zGe`DF&e!4*=t1UMH}oY`X=x$M5yB$ZF|3|no_~zS0HAvmq++yY@#ic-mq1Bf|DnZ$ zUF+GvBQ)p_4LU^84^IkA;NC?3p$S3`S$CLpYW(_Cwi+JY7(`|gR_@->e~KhLdwL~< zst|Dig*|zi5jc@`-GRUr7~iQJWt09we^u$7S6u5PzZf?RZf2|imybfHID6MMmR(^% z3T+XFt$4?HDwN9Kcs~nlw{FEY4*717U?FvquBmnnFxr2QXgurF%M4(gNt~dnpMC)D z9pIM@I;Sq^!HC>#dFIjoWzac!eh7J~x8S32i^=b~_{Ee|a^APFmvxL3;Rm@dsSlpd z_0dg+y|f!CMsv#xou8lyF9p=eKJt3A+Pu=_A0kmP<}Qk=`ssZs8oB;d=C*EE$uuH1 zNI&nWIp--4b(v*h_6vbS>K&E8H$an&e9UmGSe>$-+BD}aC)#2%kEQx5^@XfKWpH$K6iaJdw=3Fi|9HNNA zqrLKz(LxhFj_&7?Q^EZ82Bp}G8M9T$5eX8i+Ja49f$HIL?@TjG@0UUZ@Be%J7qZR^ zL$u;hnkrktFC$m{_%YjNSD@Ff)HKc8W$FO`A?)W@pdI)nIJ%~0JuL#tsS?1LT5g68 zO5%*&;e9;9(gI;3a87iGuXk?n&{`W}U*WP2zRq>(hNe#-0E!01Zc~bWCAAf3I|#7B zo(MdxMN&<)p#qp^ZLU>ylY=kDAXYK4>w1327)>~Uv+;?P&H@!x@QWHi!mrMR zW%T!}EkAHd4xG_KmJv{yq$qd1G3&ev+M!ya$(R#ru}1sY?~^AMBH@WddwAfE(6Se~ zZpQnn>&0X-cjN`yBLbHSGUcq?)>;q!GWcAY8oTy&#Ic&;yVEJJ{jj83-@{4sB7rNw3}AQPBsBXoS1T(+uA zhX9n~)cYlT(ppK0ZxL#o$h6oa)6`em9kF_qBMrHGn0nA{;P<)q?u=7)@g`0<`bHg4 zMfLSleJ_3qsA9=u;umq<5y!p1XY`{s0Q&!e@l(o5*8%RX@9$7ssF!fTI0oExYak5p z8O&Hv-iOMST4f1YG6~m8){NY(JY`}h>8WSd^Q5(2HYe>llsGrqBaoH$>#&3|4z%Q9 zB2%6}C8j}#-JgAt{c`99(APJz1P-x3XE-pR&qsz?w_+q;^rpytw61KysFZERa$jxu zDwhu3v_6wvEU|rn%L3pHi>@f_Lf#(Xr`!j0RlGfXW$Ajh!PX;@QM6?fzTy_^V1c*Z zXC4XEPeMTN-MAB`UdvC6;QjMt*6LHc!u5AEQL51}T{S?ZBdCoN1y|p?xfq7LK2>db zsU5{*XW>z&L+R_}bH`p+^xRl*Tt{q9@>3N2(Yf9N76f^tgJf`hETeb^n1 zuE$|+2=RWR2aj&l?I-Lcr{-!=8MOp3F1@PL=IO9jPh~5sl=$;1OF@26Eq+W#9gXok zni90J+mf0EIlH*fi8nc=aaNny8bhV^Uk96NzB)!HoF-wGe(qj14twso8+m3u&yS(a zjz3okM5P=k<$t+_1F97KU ze?&J|cKj}dzgE)CMa--KJ&LzeK(&EhlJ40xoVsUSo1fz?Y%b?DS`y}KHU zn;YUM0N7G%pM>~YnfU^3z5)tN0pD%4nY#)vgBUGsgf)NV{SRIr&f0VQFkvRrS?)vq z4}X9BCH-FsT8=+vAdHqB4fQq6z^IAEV>c+5hE|*d!Xvtz0RgqWes#v7n!76%(bLOl zpR!0cA_e|nL!ZNk^6GG&AvqqPwz)w78){|jq%j02ifmWE1%$9?HbtA* zzdVcG=^s-QZ>P##D^IoJg<>WvoW@Yoa31lx`2X==ZC?Ce{Z}t7-9ICzhb$V&CR?|D zxQR9U`TRckeZ2nGZ?CNV_TT?KUOb}J|6fi!aI@M6W@eWak*sIx@qR=2yua~$!NVd@hRrKwVjTn#b4_J4( zOPKCx+-I<47pv%~3wzAUT{Nl+6#7NFQ%yn- zK)pgX@iUOw5mE}cD19<3euvf~f6<#BC-Cy_vwDu*1Yn@v8XRNlhO!MZ*~}s;72!S& z|2-WUF*eN&6FRFm$2~(J4BMBdBW_!oPM+d_?xO)Kk59Oy@0)fi-8td()cgZd^}4LP zu>podg2bGpKe8Dc62&w>d7%vmf*MHnj-n+vg>%2WNMH|DDss0d8Ke2qx1 z7KbV%9Di=ugRMd6H2|AZNOh_bZm$PfCre9fY86~l_=>{fEgS3oCV4WY`3>0UMk?I_ zMzg%UkF_D+R7!7DiZ;l0V^A(nN$wAANcBgmIW99vfz3r}#FxzN5`lY0&VBv4CHnLr z8s=DBf zyu_mnRuI_!N$&*KL!&Zs>(ckmnmiW9lJs!IK?60g;?v%tlTMsGL#%GkK2i=%a6$Fa zBZ^!v-{RNztj`XsQ2pdAuMOtP>&Uz$afP9yQwC;Pd@}3Te$amW{20v@IHRN4QAzEU z8I&Pt(UuZ1_1c>GO};d{${P9|c!nNi|Gilqc=%sAEIRBE71mQO6c-I$5h$63!Zz7; zhLV)DRQFj_^($Ss_N)ZfssHG0c_k6^Q2SkEwT>i`ht!k zKf&A05up>iGyIVlR8@Tw-dyqhgwKMyz~EA31Y{j&eRq^{OyS8f$mX>|QyO3FY<_W%Qod zr>H%=-TK@A`jJdN{2JEm?J#hUyYvChDZGaLe2uV3qI4Inxw5O)=kjb8ym1j?+uTe* zbJFlcnjXz#1+YZEa)(f`wNSvXk7vFRgalU59=q`m`lN>Io&ewF4`DBOy-Q)hM7p^) z6a$U(!ix4Hf(~?&W8AL93Z}Zz-uhRbwgBTEDKIjCS-tgLSF=+6{WO&Fa9cveb2nlvNiR4I%}kW@@}Ep_O25WfWYRrbi#Q1 zPaF=Y7~NFui@;Ml&9+>La9_R~_0nlaZiOvxOJXLcR@KI6*2GK?zMRUJRu7hkqlQIX z{;JmZ!2IpZyyGASs-6C+H2=ypbgu#wlhh7%M!KX|stSzi7@#B_K-u_sqw&(a1r zGciya7ZLg+jeCILc_C;*Zd&r?PqPN z5h4Z3VJ;%s@;-9FIPW^kM;FO7?o)gN-E0;hy=_Sk=@LM5jv+97FuV}|q;TByXJT|y z_&pROqr6SE6(3Rx-G3tkcZNSLuRob&t>)VFEupt(B#+;@VMjIH_xrh=mwz$61*1CU z4Zg(TvqE9D;V<9AJfa5mPJJt?-iymvjT}cHN+pXzsPX1JWng};S;sO!rdA@*1mK@n z@)dIa^)RGln90;`2d$-Bef>^Z~i<2FEmFJ3i~_@RhD%;+p2PdAs3l z)_yBcu;1B3>Hdy>x3D>8G^SEC;|ur2eccr}0~W#TlY%3};+r1UUeAX}{mCn`uaC`#mjUJLSr zZf*UvlkSj>()5bXnLc&I14Be}+6NQlhiUhKR0XDEPeu6I&=swmzA&{eQOhy5j|NR+ z*vo69W~eg-%l};Y^c0AZ4>R0t_oW)@mz!7i+d?Q2uxFO8CS?|ayBLa9yf_%8_efcc#vV#C;^Llj48MA3v0q-#6|PiP7r z&Cq?_z9o5h@Ma4Znz%nb+jpeyL$6U2{ybE>awqks#nLh{KXd$Rpo%`!B`V?W&yv8h znXn-uLVCIK5WoGLbk6-msnS`&W=)|T#8jCdJ*NyyM2;O%C2Q1kZRQues;<U3Gk_7aHXo$}yzW##bdwzFxO3whMuB(|2m$Wg#l{bMH7nBL`F> zOPN}kveZMUj8%`T>U~n%Om)A?5O9MC^d#GGPqGU)y2ym(_CL3=AY*g;7b{NFnApA1 zq`a;prdAGfACgS_ShLl)BAPsYa+#B3m>6-#nLbbVnWmjTkZ2Q5K-K+^VAOZvEi3*l?0+mJYUmLTvD7 zN&AD@u<$?|PUnoo+LIz5EG4;GO1ufs&T;|v)oIfase&ZL(uQxZfE%P6SHKT`xf^;c zt3BuI!cX>%ys96aeEJ1UStGrtQnaUb=;ggwMTuAV%(*INbfPZt0IU-#=x_R>*+j{N ziMiq=3XIt7QfTjo7w0n!9*3Yb4ham3|VFY|t_pyHQwIWRfI9vg0 zLzt9QU2>oL%_zStomx9;EPuS8gVbaOsyp_N=>Z5*(}LqO z^F8u`V1BPGtNrBE(-{)4lpgf8qLl3UJy;UfW8a}SF75xfTKa(M5U3QCZ{&HQ> zE+|F@1Wj9x`NgnNb~@ePYjRTvlQkK2m2=h~&~)t$T|K@$3(>FnwppeSisrGLi*5s3 z1n40J}+;0<;I^lNSp@aH`(6$gIyS26iX5aPUCJMM}wiCbxj>QLy$28BXb}~Wc%Sd ziv#KLL(m*i8yH02_0NiC@TZ8FOF&|2;gB73)2x37X zPtPMQe-$eRRkgch5>a$q5HAYAfh|%ZMfO2l0r55m5hGZd04eEJj3j-wEjff@&tSfb z0|#J3ur+V-l8l_|{e+(`3|rK%1ETHM zX_jQVh4^^Y7$;-yAn(Q=DSx_epTjt@+pCh8raBP5*+_~1k?E}v^VLY{e^WkZk zP=gn4UmJN3EY7P;czJ7l(w@uh$Zeqf$N^hTG>Q@C^tF~OSFGnX;w{|kNt(IKl%l!4 zrHZ_Si1ER>^>GC2@2U z4;~g4q6+jRr`RBao?ohEt(J+CuF|!i%p%(`X_rprQ=RqmSZlR?Z=mVkJP^mcT{4BR z3eNcT0yv2G4}QG#=YH()98*1nHl~d06qX?)PL5p29LiKuVM0WF!{eoP0>3?gmWQcK zom!O3;Qtu_>;X5nu|42(XYTbV|S-GOmb3}BOnOg-SH`oe1Nh^Z^E2)F*G*)@^1m}EJh~8L+dP*QzmVQ4j|j_T%#Tyc)V!j{W>{F5>y8*-+c?Df{xCi>fG@PrRB7~rGcrid4!xy+ z2c=myPrcN>Qo3a068oly0JT<+8cRp})bo~E=4w{+87RDE<3@EZgBRJATXQ}FG2avT z?Epc}@xxxO5=^pe8=icbNwg2fEB1K6F&M=&Y=YL-9YYAjKv{>4WVA1CmnWQs@UW+t z!aD^_g#Va+hpgPOxM3sRLOl9#HMEN(S@!4jyBxQPJRi8ob zQ-~A|IopEX0t@*KaDF*#@eA|ZAjn}_3elq&T>%j&p!H&{W@Qj5r67SrlPUSN=3j1d z%GJ^$LTK^Yn1HjS*XnZxlpqoycbNUDk*dE@_)x?3qESf%@l}OyYM6DBq;8KANKA4GYt+S=Bn#^{XS>^I-D>Fj{ zS5q4e$Y`d>q>`AtDm9wu`vLqtYD5S{C|Epg>_OABKo6u$0UQ=tY0Q$%mvsjh_=Rsl z4pg?NgqxIZ<026~Ve1wSf}mx6xGlZ>dhS=!XOV2WL}Q}ulOM@#eIR3@`0X7fb;%@k zI_ZFx0%NsD8fP__}f;n%YRL#FUxDzU~iG|=)E->6PfO$8q4Q+ zI3mO#5Io~3+5649qTO;P=oYIjI&ei#_!G>`D@&GZ@<$y(+A(lIwX&#TTKtcMfua^~ zGoi`&cd;SY`EsdB0F+=qjMCz7ug0lah>T?9Q!m_950*iUFtt zP@ubiS2Fz)3XQ~1fT>*#d7qNwvp3KL@ClUA95Y^{)gDU`1!4|JXdZ0w04^`}rpg9! z$%6D1EtCXtY5V7_?o%Dyz%wKS33(5#8)Hd@ZUt9@+!Mz!#YA&l2|p~ID|^;$#ayO^ zhabe_&iHwVIm>nJrt=job!-+vcOlco07|CJDJtkOPU(ELAor#X6_tfw24Sb8>>!cA zt|MSWcS|rTb`GsIrgtJ#c4^^YUmYv}?LU@iz{-x49q2?=_`O&Ok>vx08deo9?mi!L z*Ps(wlGaR@gljdLOeRFVPCPBWXCjl8escnO4;GpG;2-U^w2pOEE44!#Ka@H?Xa0!- zpEP}F!8kuL7sm49&C2;c+{w}F*)h?((mY&*qNSq2<_S)13aJW?s^xQz*g-Ap*#nuW zIo4Av>Q~AVuq&Tq+G#xdmJ++8z=%xgc&t>}}vfkHPTmseI*;ejtR=(R!jxV_d__ScER{u)=Z{%Tw_r6m}(1s>2u( zM!!L5a_8v2{FVm^nzYcf)!KegZ?cExOq)VM(1l5Bhw)hQN3zztKr~8yz<~{0mowH{ z>4fG=Er9;ndGMbT}gPjBCc2K3XXsC=rJ@G ziZYO>3Lb}YQBbh|nKfI3P8*tmNjsxDlp`1OnxWBEARuvYOi_QHTKZ=#Q*@1KIIPi9 zElpzb5X9K8y)4`Itg5p|t&InBxx#zV*Da@)YoWhOwFqo^0>;!6u-8h~$80ADKQ=a! z0ptw;PGl^YZwsx_r=vwr%z$D^2+uU)gwXz}s<_eKnUs9oUhi?ADELfGubO9%>udD| z;CQb|j_rPD1IhWw9p`Y)?*}}G#-=AH-mRr+5 z59|IOf?cOr^nQZi!deLX%ExrBPtYiuw+b~F(_8!fet^enz&R=*bk}5By`&7hRFASW zuX0d8$^Ctz+++(1CZ8U>vi$4|N>b;#&(=+_Ts?LNySK!)sH>(d)1-IHzCp0%S!H=G zC37d=(@)oh3aV^an8ljwep!O3aJy_)rk!Y&?I8m3g{t}S893|>?X0q=zA~}PAY$i8 z;jNpcL`x{5>85hYu8B@0IZj(hra}N;9W;JqFw^0Dq*Cd^QXnnz5!xT46ddA1j>8b| zAB3sXGo1$Z#PGHo?%pzq-@Wk?Pg>;9@)aKsBZ%;=cd&{%lIj|GLD^3Iddr)?BBXAb zeJ^LF)VQ5W0o=py^p&1nd$I1o5WSLD|h{7^Xo{W=UqJ4!ffz){b^%4asAAP{V!F4Rq)raiiri3^uxFUXh6oWpE0e zB_@XACV9c3AUlWz>Y0Z3wdWK&%s20I>j`SLQ*>giTQ|=z668Ind>Mpqopc+krKt`JsEav^4EsaZH z-Yai}P<9P5!F4tl>(b&xxi%3kZxW)$f?MACdsalEAwF$ahcrC?p`>PMep-U7z=jAaarG%jhrEU;{bdaHji;^@{}vCsd1 z7{*R&`$=0p>+UBvZ{8KXM4fC0bKZQbG~gk!^Y!G!{UrRjr1A_5>;@MI`nY5|Tz|S= zs$~54_Cz(1}NgmAg%CIl>JIE!kB3j9NDv&8Xt2)TJS*5M&mw@8(P*JFSQs9Lp zj%-}6(di|)R&di~82#W-hh;h=HT-aHB7Hy3l3-2f@xiSM3vM|BS9s-+D#Sn3hG{IK;?W>_#MU(`J5DC97~rRaK@y zd0gQx8ui&7R;uX6FiK{TJ1Gm~QY{biqU;Gk6 z_48;uyHr)qMtjbS=$9VR>iT6d$#~|=2qGlPJ`b}!W|9UoUS@Ewc6=X(R{|cdEQZ}z zS_*EAxt*|cWBY=V1Pkm$ktY~bq^SHIsx?Z{72y#uYgd*jk7$gTMoJv;Cp_`Nsg}%k zuuDJQ^KU&17RIPWHt4p*0` z>i7w$7hBQ-p;XJx#j$MAm(lwd$A6YDmoLR8+6NN?n!x^88cg1)O$UxAJ(s21cTbhd zq{0>QZe%ObYE;;uIz96mPybWKWhi`>Lh=l~Uco^pJeyzXaum>_(;w)abg99;9Jj!HHlQ)PJ_Ji{$+&P`&iG8=>6@ z#z4HMOmL^~3*A%`?y+f`d^2@Rz>@TL?eop>Uk?juBRp<<$4T=2g%sG*Vw-1Gb*tDo zuS#FU-De~DDq&)wAC&d0WgTMk2^*iLou;}v3w(Yk$$7acKM{64Dw$u**m{5Wvo3HZ z`g5~{+D_YZp2w0dtt}@lKWD8dna5m(76trnc5aHER-Fn&uR@aFo-#i=GB^=LAVOn^ zNa1)}1wTaLd(O%MVc30x8bcx` z(^}aby+3IvL>+T8^p@boooPbd*4f@>brCNR#i%0(hQ8Z(?Eb~~Bu`a(HyA@v90$QE z$NFKA&J?XJYlD&deCk2~!&HeBuJgH4u*(R#FpRfU-7m4bX0=3n;sh8`DdGpUg{II8 zIgd5}UP>6o*VxPM6!p}zy)=QIHGAglxQv}zYgote-eE_=qzlh-b)SWK4v(C1COXFE zLM{I>xSHeUHeR1!qyMj6SKl$MH;=*T!@{L4=FrU3FhN_MX&mOuT6Kx?N1ou*PnneV z`CBhcN`o*avzrAU_^Ra@XH@Ii1vUhayL)vs7605Mg*)w#EBnMj4sMjKd}u%AuZkNQ zUH*3%Q3s+-n~4<|F@GOM)hp@fWAvurMHJ!OhL~TpE!&i|1Iq=`*5pUBn9_UEORTSB zD5NQ!h6sXgBE6VYBuEKz>%0Tpf4JRU8IN7rl`vu6h;%y=Sgsq8zVafrva$@jD<8 zG{I3@+Cti;*yR|evak+5o`01=-A1UU-W}V8#U_RBR7Q(5^BdNGUC{^oHr^HZeMA30 z{adTN=$lyj#LWS?*rcuc4sPomP^eI{-iC_96;@_}YyB7GvKqr^m-HtRz}Rlo9-|8aXrinQW!me0t^uz&G{Ms0C8&w5+#6H1ns~?cFRvZ{Z z6v8_+BuyFp7mAi%Bb0P`+iw@^AW*u$2ln6GAp#1Bk6Q z574x^tgg1c@lWqK!k zae#eOHTgBo92-YDF^leiL25z=ndX9DM8aTK8?Zx|e&rXn5?z6($8*@5!&^}ZqkY{Re(|(qK)8y zJ!{^IKw$f$gFNi2LGok0w3EXYWcMLHQ2b5%OSKv-W;9)FaQsIo*nk6go8YO2R4uNJ z%*D_ylnb9;a#WeU6N~&KhS9@g(B@=Xt7xfhOq>KN!@_lQ-Asm?0=`ebiQsb-;38_6 z=k48U&%uG7K~{oI6rGINKJwiG#Ig+P$5j8$Nfja@#N9@ zPeCA>a1N_(wm=RF0Fiu{%2MzBnaf5l2xbsS)qYmgxxI2gN)|a60#Yox?F5Rqw2T$I z|5G7xmm5uN272xyCa8$=-YS@&l0n}GZs^De^|fpu-@w$b+t}ec-|%+W#w`USj?F$?rnMeU!(CqM8+}&= z+=p-^933CVm^UapwZ*SoN4*7FW%+XZul8BXN!&&Ma!hzu3&D1=Br$;p!1!#>8`ZKR znp3#$-WR|NXk`HU`+O2H0M{^MFb2mzhY^ndtGN}8BWJCvKfMPJD(A2t`h}QzQ*CaK z+nrsT48PBvFR!?JmsVh1DQv`BE;N1nIC+!qT?05ryuh_8Fyr}r!f z04k*_3?%Lk6>z{lGFoC3`~if0e!^$6o-iDI2O4d70e-4edw_$yWsQlX>fO9@ucURU zO;MRA3loGc-p>__@sre4n|&yEtUT=UrMYvCUFuWFc=i>ZW25I$>%i6Tm-IIdimP`X zs3%y+#D5iSFi&dWdC6nXb-p&abM?ad(-UbOLJ_ww=(@E5KS_Ml_4pQje?G>wz}&(E zwSN!1RD6Z;S&X|Rsjw61MkA;{yr#@HlWTr)pA=}4C=5lzo<`}L2Je?_q2Gh;oTsEt z=sqmyzslH=+bX8s`9(T6y-p&L8h1#6*A_KxLS5>o{fG*2H<=~=D$0HNsHfs>Xx>JR zTg&w&;qk<1cZ|E(LC-`-Qq@UJ^>c8X9t?!1B$%JAG@tma{keZ?5r|>T6{ipEKIxq^ zCF_}|hi?Z^r{tq%Wzn;Ct>{5<4tv2Bn`k37!|7~tIc*F|P7Iy(hfZlH`_Zb#PLlmd z!dF+32$c){BRIqcT#!An()2zXpYC6Ze>W@iU}LG*{xv>>;jH<(3psF zf@3I+FKGIFiC*zoN8VI{uiwI(F0l9MGvKxXRyDn9nQ_&^o2@ME zsfAaG_t3(*@YHJGRpz&SJi0QpNOuEvAiUT`V`act&TDlDEQmf`Ljdj$8%d zBl&Tdk(h2h8#!mYDdT>-5c`85M(LTzpv`o^uOlV+v|X5?O;?{h9( z>U+w}!t~BIZSn9!fC3~V^`s*8lIOdDxE0Cbo<(Z0XPvF}c;?Yl6nxdfuIHTKaw@f> z{o{NA%58P#{Y#ey+}mbTY9mPOe-1>P=6mXY;oG1<_jJO0kVLcx z;lvJU#h$cLzkS+F(|=R?cx(H>NlseJ zex$;akUUJSnqO`@5p~Z$?q2qRh}uA0l99cALqXDr;A;Z_6qXoRULEmsq`1--aA?_F z_s>LQN>#G+T*&)Ma+YjH0a*{%VY@wPsZUhlg{|2d>$waQxr)jyB z0J&jlI=GS@UK$H^WJe8O0H5gV0a3>=bm6JhMgvbegTfO|DEc$%FpkUy3&o5Mjborq z9Gtu>2~$EacDbLQX=8;hk-<`SZ{KiB<%9{-LM2ch#x!xRR6UM0HcA^f>3MM>H-?!cp9iK4~6th5>ojtjhMC0uq5!EDkBoi+}>RLjeHs`Ahp zOdc?amdX1AqJQX|d&hT(F*zo>(nit}A>b7_y10U?dHhsdG65yzIX2l~z`yXc>!To~ z08-Rf&K2m#)qB)Csy89+$_>TA*bIZV?9mrkZc9{~=2%f~(sbfgX3qi;siQN`r15D3 ze_$;y&c0GwZeect$d9RBSx4O82Z!T)P9m=ml(9;yBzl;d7o7+|Di%g+cs|X^Y4Y%h zaD%nG$1rNu%LKYDv1xA9*hY~3e7VW}9}h2BT5W>BiB{^ntWE^~>~~}N8=LIU^1)2+J`!XLL9&e@Dg$BgBAzME8o|j@--|{oH|hs zAyM{P|22V+D&E7_*@{C)=M)@W;mOiH!<65V^X>MpPEho_gHdQOJxGG3V` zL(A|$7Le(dcPE8NgZ$MXS0A1rTB7lB9kT+qTu|3lKHf&Yg*k^NCd@%0?mUnT?DyZj zl`VUier`@=*-?5xJOvP_{aa%_f)Xe(PyKk374{pqfzIPyn*+-cjf&QcYNXB-^f9j! zg{d@mGc5OQ(2qN<7oI)Ho1N5Hb~k~P<9Fv>MaZM@Z``#Vl+n(}`Dq~dLbT<*J zGMLrZ;7m^31OnuG#<3p44pi)h9kgXkH9>^%(!>n%D=N`pyV5eVCRDi`m_z($$;B>S z5!j$T{e$tI!v|&3+mW7!*(%Y*oufw^1wNX-CF3G_t8fOx33q zdsi(#6kU|fT;?%Pf10Izw>&<2_OkyxEf#bdHVpNb4?E_g_UO@J-FkSTKV)lRZ5y9% zG`BZ9(8Pqzn+VY#DIKIUK&F6~*#{jzUgZ>hWqwZviZ(XC)=v)8eXZiJof1cqOsgv9 zVd9XkQi##w`k2i{4gz_R;PSAZ)^=se(dyp~2z~KjtMb;r=obgh3Cl$#|d8(q!eSLr{!16T<&Q-HE%gH4I`kSGX|!@Cihre5*e$p z4_lMQyvX1gu`PsyXNvVXln{oc7C22sx5!CELxxqDkg0SfPn#mqa=@m61CAXhv}la8 zmqrV(qWwo+j_hW=8zO_h$s4+NF@KVx1j1(31KH`0MUY}or(5xdYjIVn%|7Y8k+a|o zc@bnENEe-LWICrCdoOWk`1z$2b%6zKs)+EZH6crKRYKJ?d8b~ty7V&%xm@MIRf-r{g<7b z!Qd6+cE$vJKe0kV#`Z^my*Z{U193`xu&7^g;>EeBExi)>A@zQxilE!_L2tG33B*GkbddnBXafOFVwUZtW>(_+G*OBIjFVXg;`MZ(R~Ro)Tdr{x(zYBuh} zy043~ss;Ivfwye}&d&r2tnwil_zBXn%!E_RQ}(0CCh{q0r9v!Djw>a10`-W8+f$e} zy_NLBhv?LNO!{E@>ZLo}9U_LPy_idwv1Pn`|Lni?ha{)^_8eKQIK70(Eio9{)8{zg z((^_2B9X%vcqJ@Agef%q`aW#mKhHqH@@UXOsS;Tb$9tqhKPf+b-!b?o(hh@4r{;Ue z&%&kc);@NvR8c1L=btBjwR&>rMZSrtPIbt*SgiS)E1HU#c z2zM)qu3zR$_{b0p4|ca@!gP@2_ngu3{kzo8Ppf6^8~N{vZKJ#TXE@-UUJ|hNP5wH3GMAkCw^Q%km*%0gRJK)yU0NfF;BY=@`0cJCL8oS3eLlS3r6?xY zrtj;{T_p=zig|n>ddKrkiRr}gAzsva`Qf?q6_K-z-uLzlEWmOwP^0bem7BXtEFgev zTKpfrmd!jlPO!lv;vX*g$iWlKZget^|AA^@5ygS%?Rc$;wZ=*QLs56;Ly-4e><=7+ zBPk%GTRW~hl`@ua4me?K&xhx_W1dBqQ~@yQ6{zPHRvl~G#9YkaqH}+yx8JX^mB4bh ztCaq9+B$EZjjDlC@(lH+LiKD}YciC=>p{^y6O@2WCO)-#7Nxy5Vx69)K51+(vcgtS z^wcUSO8YO|Rb#SPRRp00$E*LCyOh+F(v_RC{MZe#Q%?<+p`@B_1$L__(`;P|OEHm-C*VzPZ6ZP1^V}%(lC_F~M&rq4Zkf zcKpetjR-Ft*BYGXX2QDyho`A+`Ju0i0?&?7H`7#wS<78{ZV|fjt3qJv)epgmhc(xp z&Frk2^KbFi48MqO-j?!k#?q*7MUk)bsz2yc&T-AKB#s6&OJsv0+F|hPV5Im@z?$9S zza1kdeLs$g2^ve*GP5^XVs8(*@C^j2nbukyi9F@dpBXfwmMQ}<4Whs|21ib268AAzv4FLOll@767a#hiSC99!%gK2;ghL=fVHUwp$?pxJ z(fxhOT0RpzBencWYjnkQ$wU*dU|uwn3{tknA`}RxLmczO-C^hn3hdy>RsVC}-r_Cq zA>um;_s=B!7+8k2kEW%i0&soR-A0D9U%nLdPp)@Ipz3*&*CwlDci&wkf<(f(L8liK z_Q*!&C^%Y(kdsrziS3y-!%kJv7_GN&-dma{{U-t#)X3_DmRaWCdln&@zf2KfNHWNU zHwrC_B?_}hcG_YQVuKY%&GQIEaal}FjjzZ8D8klA4w@ujoGLz*{F9l06PzlGL+(+| zvbd0%A7Iu?$^B*c5aeaWQW9e62&)xqkjQlqAx*mq&?}J=6WGCHFji*v)2X2NHq+y3 zAqW$@Q~e0TZ+5}T?lyNHdt3)~vp0k!@R-QR` zVMzImdXL~C_`5?a5T@a8QAuZ|1i#wvs0VtJzTMSdhzGi5|Dxm0^M9DabFa1V#YCqV zPDN&4Y;zDR$2oN+*p!dYSTep zJH_J&VL3WumRQzRea1;2P2mw#rRT-OUrzkMeRrRIQd~wzbOy^6;Yo8&xmsE%q7BcO zBxxBQvEw|}3S01A89z4ZUhwl*_xOJqQn87NE$lXbpsHAV1R+xuZNt5-r=vZ3W-daU z7Z=hLh|HFc>WiWhp={ZCzJU!gh3_m4FhroDX$%}2y>_qr=mn#$mi;gmlz9L_Pn8@v z{2jZ;C{GPGzgMPQtm@srO^`CkM4D5#g#K_;nxQ`mx`NhP!zQNxe-pq{h92UoOn97J zQ>2o7ECQlr%LYV=GDc>C5F3G9V4pO)pFhf%?0S1?4JI_eYH4L%LLm9vJmfrcWNL{k{PLImtkm+oa+89Kb7#tFXMnSX&4gb(I|rl(glPd;6obUW0> zNCeb7&qGz8_|AuzXn)oA-5%TJ1S^baERz@h?3tZP50>D^DQ7KjT|+7`VC?-e9`{Ql zp9@Efyg>Z67s|16 zn@d@7NqAKQj{n&z<8+Pt&WI6=IHLfNWRGi8m#Ex!^MS^lA8wCLnp zqh3v!^fr>lz;6T}X9(!R_s7J>Rh^baD@PC|gv^Zr|k2DoMlQU&MbW$D<8bZhB)l|M4+45c-4_s}1F6w+*C6 zuZ*BgEiM?P9g{f{2y)OE>1{}G3 z()jt8D}I?==QpUgkAoN6pqj$)d`XiV@`5qxv@a|8KXs?kax(6!k*kMTB{j39Z{i;{ zFdtB0iZ(C|#WxT>-}BLS+eeIExrf}7P)QwE&=42zheDFlYLC1-c#pB_W-j=^uRD6+ z=gdq;7dEz!+*f;m8v+(>P$Z59Ghn3o_sSx2v`)%>5XK4XdPE$DBp+A;WYio#d~NIe zCUqH67(AX@bzHrhjWuUnFD$z+{t@sfzr$BE*awsqH(L^d*OOS%COpLYDZN_M9K&tX z?z={p%I@;YMgJ%R{dGvLHs%PSq=5!)^$N_dROSjFe_fAhi;OJ^%T;3H@%)?s8=)Ycc?WZzsTa&PG7z$?z9)F3JHtCPo z_Z2&9=eZgqulFk5{M2u8yX!q?8W-F?>(!e+D4_0ES(OVv?Ac+{KtD=Cph2MMA4J{) zP89i(V^(q6dSH8znS4$;#hEmFoO%@kuMeFUQ#GXJQuAr)3uYYBWI@$2;DT{`PLZ$q zzlAX%a&k#Py;LhXK0P7wLzjZcMOZ=}iN{@)k{{Y@FyXf2P`lZ$*sTntQi?-YGZV$A z{gjKo@m~;7bFb^OmK>@!6+?_Q3(lohxO}@qo1by>I4CAquU^V)OB;XI0&@?6#{u@`)eCHBD? z3o4FI&!r)9oZA~uf8>uR0p4l#q4mQ9)u3Kw`5kU|Fy6D2jz3vr*HI|PoA3dyYfyQY zZhCRy(id+p2*WY}9@?E+y9-850mYfWR{q@)zv%^*)%wIl$e~af^_-JBT5Np(@UPpH zWI#@{xdo|8HjajW2(AbGzKU2m!-xcYv~3(|l!JGACMOw7uFo{4-16D(4=U~v|Hg$$ zbl{CsfqpGCEW|nN*z5b>zrE4%D5>^E_CJ_4%n;`NxIQaiKY~Ka#`-p~8)R0!_x@FV zXCEqGxqZE)4h?;4mHm`^9yjq|FlY2>v&1u6EFI+hoK`%B$d@xgTk91f^8`JUIHl)wUdiu^h$q~2q#KQV0E!{87J}%aCM)m=M zLd;wHdydNOEiRn8_h_ zflZIZdAI@;2x_aF>b()+tYHUfT#`m(iT%yR6_?Qwy-K9@bJac#8}xh!BkD-i03%y9 z)?^g!h`(^2G^erfQGfJnBg;zl$7=*ya!mTk(HTB>8hHW%OV)Ti^~e67(+95kRh@1^ z--0_9mffdzs>~zENXnmE9sH>HP?pRMHidk&z>V9@4-RaJ1{Sc5(8* zgk0}XNoZxU@~8hP#c@w*aUkwocV=16-77i-lm>3do1Cu%pGj*zSPfh)FGC$sZknE@ z{MOZS=}ih((}5pSOG{JuqhY0ThsW8%mHa_HU7ugSVhblt6e9Dgt(&#ek;72Z}LpG>v3= zl`*lmi3CS#QrU1O+^+G2DF|HP$T*F;C-|}1UWyDLo<2N;Ooo~9z7I($wT)C1(3dEu z+otKNvhg8SQRh%QpwcBrxqo&;=POLpc@_JvL3s7v`XZWaMVg5%f(VD3WCiCa=h6)3 zjn)VL8~T3vZ|H02g$#WYhHJN12DX3ORl6;ZKUWsEof;%)7>d_cc{#5yPL)*|O1Qf? zyKe@N?6%i;cIG_`+C5yhrnbN}OhL=L$#J>J%M&pTn`_!V%pSRsvxO+5Cl*3?H@B8w zovt3w-zdfO{V>Y!qzdlvF{a)IIRxh&!TmHmNmE7+2E{%<>r=GvI)Nf7A``(KJ zAC|1o8}fe{|4e;Kz9#!rRa5C%L3*2mhS*U~3TR$gH+V@sDJL7~O}gkqe?9yDCe8ao zx!)hA&4XC%<4dg*NAO;6jSR&&?FH<;7=lFgfLT49*uKm0=8T0qdvukO8PbZx#k0_o z&wMv(ZJe#Y&wFtM&;a_Rky8~$jY*v08>0T#EMjqjz(#_R^mo}=AhByO{un1r)up^L({2n& zIho#Hkw956leJ!#@~jJ5L5q)Xqtb-lvi=WxP!Q>+OokIl;7|XDOYtMa6Btu+-0I@S zbr?~^*+Cyxd!sQd+g7Sg(ZEWb2k?gElZ|01qkcpks|uU_dxKDpzPpti@m_CuKt>{_ zFMUbwXq2UyYj@X?OMu*nG=`5&UQ9kgL)1!7U=O>oyMZ00>m`zR zmm94`)henixq|1WA@2tEp@(WS+t_4o?*7YGMO`nDr7jF{@t4odpe~0dpH9YI<2T>H zNvFHm`w+WRrb=C)dLDuZm+udnMxeWcv{Es5@yUHy@)Kx4r_{^IB%*xBcf`aHYI|tX zR(IllN0S}TpA^}7lj7ygDyTZMT}Et~tK|NJ+9qpLaH$sfZrPU|Fb287N*py8zy|9mEWdt4^^`_H9WP9!e|nt#=|Mp(gxbs{BFmB_ ztj75CPYu=M<-)B`S32X~Pwc8Wh9r&ryIgJ(L9cein6f!P2vorRuG(2rj zr>`oaY$@_y~wRB@5)Ll7g4^q zN_QmK`;z$|Sq~#8lR`{ghaoQgp%8r`rsY~={?%Ku2+%Skq{aWrDBaj&rk}T6uDQKd z=?K{J`w(ZFZVyBeBWG_5xPA(zYIl$=w&@#ZLZNgFU0O$R*PQ5Eau;NKH<6JnEj~2< zMk__axHCaSI|K8w2^;M-_O40_SCcl{@kiKOo32-QzI63=vy{p$IX=}h7)C4HMy zAlfAdEW|vQfGa50cKfp^kif%q3|n|gx3BqvMhV{r$XeO=39=hs`C=aAFXGwNl^GQN z8$$_P;mhFX9Y^c2-X+)k?r;!1r=yAmh5|Mbuf*Yhmc8C8OVy4s*!H%~oq2}j%)pLT zK3*16(ZV-PrGQ)vzt0I)j<>mccLhzRA4c|B=dfr!{K|ow*c)Prh%pL`Enx?{Pp=mw z!+^k9!0grA2JQMcEF<7aV&NgszO{88Yhl77yuMo9K!3)7K}}rP$SJlrP)AQC8iD?n zg|9EhTC)c)ws)|!B!qz~e7A?(6xsFQM_d3_>s;?3%1Db26Y@|KStjRPC1RkvM)qK> z+1Cwb>Iwh8&WDPsXcrEhZk@#cDyvYu@@N`?8SP5=!_&SLcg-X^Y@1BINui8B#vfjo zDj>74`T#k~*|4|=zkP1bl|MY; zI6H293S6m>h^vU9bcuLj47<%){>yqr>gFfI`<-8+MXqcJpAaVN%6O(>J8x?{0C3pw zDjtH*RBZRjDgYVSq>zDjn<8GqF4F`3<3q+q!-?jic7%GcKv6o-Fi!(oZ8h%@OA-$+ z6h|`qq8%l)3}x&l`qcW@_rMV#V|=U7{Tw&57q|)Bk5;Cdz@sJo?jS1%UmO|vM-A=f zwb59)oCBaWfZK%gaXJmsL_ZX!!KVNz_~gy%Ec?9-+{+z>#One!nZ-xtJ$vQD5e18c+c^FS-tG zODg2{$M9m3JYS%-@%ex*-jkWml>N(j^bx~4i>}|dC3!F`LPh>Ty-~Bw=ePaFT>H0y z7uxl`&{lGfLBsKI)6s8$Y`IH!P$&#e=7(YIVEvLvt*+5LGK*3BSJ8zf$ z3yB2r#}uv}O}5~F6o4#6OlAu{L=^!Gb?n|vrDBr_R)t>qCS`fgbk0e)ksESY8Pd<01h7PX$Ha~}FThv!bTaIGyJQIISMZiR{V!E#cyeZGto;KWlg3nO3=#7`8L!1K{nm@S6sGhm-ruXFt zGhp=Z_MT9q-E(mSKA46Uyztt|Is2Eq)P)I1!4BJ?HWPnj9hNLEsQ@A-^X-vO$w{Ba zhm02B{_SSL7JhRnWa*<{VI|%Y4t54+a7l}q3A$#0GU(I0-z7aE8-9DKGB-1HdY-dbWcth=FwMq zVrZTf^X}xno4t5OVsu#ii;B|}wO<2M38QDJ#ExGRnDTC2Rb1yP7Hl0On@Jmbt1+?R ztCD-`J%6zXxsZMElLB=RphozRFr$q9589N|+rCyC;2S{*Zcr7LAAjT)&W2UK%g5q0 zG?!iQMo&-ZDdMSqf9+TINFJkfo`b0bm3r1m9JbqNGsSeE!aTW5*VbVdzk5QDOJ?6#|j_nb3S4ml%O0j$ILNV^M(x3SL-0~qZ*C;fi< zI@n*Bs5PhWJs*ie;(ZTv|jjjzQZy)A*GyLp%-{r~qlXm);7a ztsqyUgD@`OcB}#+Buvc_>vVf5l=f4Q5O$V@UDHM#Y1btUOsUf@vm5a-^A}#2avNEd zf`7(1!`P$09G%%h*+12prP|1(0NNE0|yGM-y7?us{D^+u$>DE zf9P=m^-#cQ5N{WGmcd}1hPE-Fangs#FYv03QMR(~1Om5mPRy;WoRXutcT|3}XL0q~ z`qQYZ&jr6eYl!1VH&xIZFbC@~>z*!Rc%b3x(uzDoOAjw~XXJFb+%y|-4&23PU?Ed5 zR_rrH$rFH(7oVDqJUowDogjW>vBcgK!3>XHq;Ll|jq<%i#ntzU(2JlkkmHL>I0P~q z240f)Y1n%XOZ5D#fq__?)TsW&VZASN}b04BPRv6Gh06H{5P6skZUIYh&xfv zmhtDiAF4l){meJua)rgD&)pX&oc?*~_54De94Ct7evLDMZ-dIB>!~ftIPqrXhwuI4 zuHzxb8Oi|5+`%{gf6c_+djvAmVa{rP#Ti4_XczD;saxNqdhwPzb7dZ2e?j{Sr5iq& zj$fatdgHL=AJ{iju|m(Ar>lW^cbTE2cGbIYDzvU^)oAl+lwL9B@MSwb3Up&-%t=ci z#P5tL$vWQdT&^PdPBH2d>XjeaXfL2Cxuxc-*~QDQcI(g4v9SS7nwMl2VZJ=D|Bx>N zq3d->RoPHC)i0L)ZE{*rspcw9sNGrm-O%v2s&;2*WALv;t=C_KWIgP>Hr~ekG_(D@ zn?n8nz2hEwDemdD){^i*pgt9&yxCAXsA=KxA;s~6^EIO_Kr8twdTu0mcGlq$|Fjev)Qb;{_7iYX1tK+Xo=QWn zGtEyPoW-suyz;Ry%OU}p%=SLMz@%5SEY7)};o%Dqw~^HG;I4tdRDs`FN(hpML{#N*X3mehL2M1oaQs_zP4Ukje7HR~6mNC~`&F%^{_=e#Y{>&83 zV2$(fT5kt7`BF^r9wE;yXD~e^qkX212B2w-~ z)+9nE#7;+dcvOMrdT_#v_+R3(*Uw?IgUu6s9M7eRBCAsE<;zkN z%hMD}CsNm^XxSJ5{`)vJ$r^#KI=3KPpviyQ><(H(Cnq`0HEDi!cgo8st%WQUg>rV0 zi+)p!vt!}i^JO6Fqnrgd?2hNAod2UNu{o{>$ObJlgLY!+N%A;Rr3uIf#Nd7;nGkx~ zYkpk#w+Ja}2x$^8i#Y8?*Cv_R$3N8Z845JpmiIwemUPmr;cvleIPOPuko=8OiFnixj!9`5Y5G zF$pb%A9Xnpd@N2c;MN#my5KIL9<3(AjYf4M+_HWP@yfsZ(RC$YOgN6z{^9ke3F^QN zYxPX<+({yNvKu5FBd(N>z$GfLDus}b?6gQ^)xl(HwrIs~*Dxrlh$}pzr9;v2){w@9 zf6S=14fBry95sgEjs~`S=Ug-|#08`*e*{l!Ys_mgWQuSCy5sBzoo=*J&b;C%J(2vOX`xNMat&X|E`F8si%mwKDvOl@X+~*9DtGY6N>)M}| zeK2ifz=aC^;7muH?4Z}b<2v&S`$Y+Q4RIdeFF7;LeYZ->m{>u7ELfLa2EJ090*X_^ zk+AtTwVAK52NBbA8^>~B_DAI-eph;RK%;~4ad+7-rQt9b5cx~N7`BJ$bI9YkBMJ!c zg1)->{@le&@L8ffFto}3EQt9a2;!p$8?@xMSAm5J_Ss`a)11klkzNyaAz>U*aUkv2 z0jRrRULvX=eiFkX*)s_IFBNlXWFMyziyqLUMh@f)#;M$IF+Vha?j06jRp^RoEjxBm z=}KB<y$FABsrW}-n8Ss2}Y#Lx^S+Hl$^Z!b$s-`%=NtUsV->Y6R!2DU#-pB zM}H8hPoNSC*NW(O^}Rm+)K|61$yZf{4#OxEp&E1;W(Bxk|Cp%(G3bW`VYWeb5bvL<9wQY?~8hgb3)b-V@hR`H? z1-gD*Z>r<|>)9rREaS%nzY5~)CM3mO9AB&l$kDvLY;u=N*I1GA=CI3j)1I^ahjPAC zKnii8??zAB8+Y}$XTN`Xr8FLZT)%p%+3f>UuV3{%R6{R!IAu#CwiGQ%$Vv>SG<}X4 zMkg~PdEOl)mnN;0y@-M zSrhsnXp&s0UxUX)dMUQ+-hKM-hyP_&J*%jxem6h%R5)MPW)t-P zX*4&851Si~*Pj0o_{gEJ-MbgdsJDlcGW;5IHRJc2eCe|Yr$zIzN1d#ElmM#x-)Q;8 zX@AM^&)pL_XRgI%x*xWQ$N_VOVY=Ue6_Af&{D|Mpq08;ti|7EXiPpe5a9O#TdA77< zy<$6p?e^1CFNYtk))iuQ&8E_K5Ql@i=Z;pAk)~?RPTk}xu;*n~>+F(4@5aC5V60&EW zUtzM^Id>p}?co{jkWT$0_|8ZV`(dx!ooxRT=E%G4w@g(`YFz^sjiJ%4r6a&2&}neo zo2cZqxf^V|Y*EJ^t`@k`JRGwT(Wq>~=`wfS?LF1XNQzc##WEhel?`i(WV-bmTBe`t(TE_imtYA zAdF_h<(Agp8Zfd}cRmB@j|w!wt{s7$$Wjizk^Z^g-cB=5fA|-@`r z(~R*joct7bu9-+nIyK*xv@&17A!`KeBnoSuayF+3fR({z`M?u`&pnFZN`b|eL5DxM z_0niK)*Csw0X4ef;fh%%?@bwoZEIGx(z!9PaU`4=uia%gnE<(??Q)Ev&S6ZvO2?0? zvZlM3fPxoB5|6G%3$lCAQ|#^W0e#f24;O@5FZ zUN;TPw@2wPEtez9ubz^P{^Hg0_)2k)#n*PnUl&}HB9XO-MRztAkJ+zmog)NB7YRB0 zK$@%6fv+uEnX4*0$Q3}0>l$B82FqJdg+|`A)q|fDvxh{49Z-_l3GLd{>j{!QFN;M+C46Z_+ED{E+GAK0uvTnLRd+M6?`sb=mge@V1ULUMawsdv zLEg&bu6o=+L5xzqt>s&&tgkonq(Q7aVf5zQIw;)N>in6Cg~tC_b9#Ko_5}j`k>l@w zBMt~Yp%sbB3+U416$NgY`|D4wi2a{PdoP_=Oz8n@ffZQu+&80)Vm} z(^$xE^zHRIbjg$Uvm%IUrBnh~iu~rF;|uQChzR8ywWE8CiNZ?N{;8s{o&r{`^M-pv zTG{I*G5aMOu$3DP2KemOC(QWqKO>fY`W47ywRK<=58e(eBkNFOY5{_)3`M zMFvlO7IgVU6!kc4Llry*=fG=Ox!i$==h$tIh5^;>{mF;tQY%lvI$mG{{2#O-c6c>Q z=96fn2F0rwT`SZM;H4z2A@YR>xeyWg`fOzAL|X}(#_kd}dg@-gXl&0g$p4WGJ8UUp z4a*%}^YZcZuT8mT!}lZuP@gro(&bLi$Rp#nmJ&wpEcHi)7>lfouo3$6KTj6IbTNp< zoPB^c-y&TAT`;6SPcM9*tyZ?tY>@-9=-seKbC4&WsW%&4kvo15u6Rag8@Pi)Z!U5} z*(9fKvT@AIhoqH~9aY-*)t^fE7%Gp;k=3D=-liV^I&?8awGDk|c-8c?skxQs`Vlo6 zh&G82FstO`jF{`-g^zNq7%7b7AK>{&RsFm1$l4SLYz_Tsd?$s{T(ui4@`ytJY{jRH z(Su!^RWL;AR0)HpywESjka3WeuWmPsI&hvO(fco+wI#wI+;h7^kMI ztdKM8H!`u#lZNc(L5X*6UO&VVx3^Ybg|eL<8s1)A`?4^!yRki>Qai}D`>_gZHHj*i9(s9t$6*I_%Bj;d4?pweFIX#GWHHtS>?6c!%grXQg(|9 z?5iR+m5ABB1CnJ~a2xyn_IvMQ-b!a%Ui}RY*yGmwXdfv3Phf?7`nT&At^E=CAjp80 z#@VS=Zl?SI7u)Fn?NiSe$~J3rQD*=vr6YK$df|X3#i2_nZGw-CI+HiGj*+(rvEW0( z1iCpHA(W5hhP$d|t`p{^Vu8&Oup8UVdhAyo)~!Ek1|8hNlzBRe^*59mPB%JE4uxg~1GV=*f+YfnxKA@gt zVj&SslgvorCnXpQMJGc6->Uut6PI#N{kCQvYwdwU5ZKi?QZB;bSo5xUg_=;J-2mMC zpgdMN{k%g>)bsv^S6Fi!7vy?*uHn91Ghxx~=?Z9mcRypNpSfrC@WuX^n=HxwxQRy7 z1dAR+x8wkk11D~(-uR>&IN4~r@TtcToVt7US@H36&yKH_PuH1FG-uTk05GRFC&(N> zm>}#60t@ZmCAdrp=>^M5y$^XV=a*mYWptG@zdbZO4;fu5_;>BKzxSNnYJV@hx_0&X zxo7h(!j3L4){MF0DJ*ThpK*J-HIhDDQTjWxmcaNC!#)K?5tU!z-#z*t3%-?a=uOJc zr?siO^MiwOCR{Vw+GkLF&Ux^T-VEX5vB3W39~8@nX0826&)c59AL{ejoqs+gXL4Vd zqojE%pt)UKE3|wbF^)W?rfoO|v(SO??#Ir9$1iOJ_fX00%@4C}17Gj^V5FJ8DUODM zy`G0*J*VBvTst3h8+A~B#0>%URqH4a>27-w3KG-E7W^x>bZHFB9S?dti77^Uy>Fge52=^3!j1&5Y~37Y*!8%COTgUhdxT z1uGi|cIZ&9i zi}B;!W<`Dw*iOv_;4W#_Ve9P;EJ~C&kq&ffZvPsYM4&_`pge^izu&@Kow~g8UxuS_ z>Y%briQP~tOXP}MDr92O>En+pKXxVmNxt&B{!{RsHlV2ay(9ElM=l6>yawOifXSJC21Cgg1eKHNvM#%^yyfsE=Ye(UgV z{~K7uQes(eZprW4o3@~1?zv)bp6Po=$XNkKD^;fHTVVYWDUML41=(*&aAP)}q$tmh zAssc$Fs|68bLETABEJHu)!W*wrZdGG5$Ag&&@&44&|Yc#rl~2g;~!F2f*>o7AFpT? z6V!J1tlR^$ca#XZ64Y@9A+#prdrq=S1uCA@*4=1}nCo2;u~c|mRstbjpsoZNQWJ0ld{ zgNq`TST)+|fI+}Qgm4nx3XZfxVEsQxg>4MrSdbL3=T_?$v_dagDc~C3`}H|Z6x^K{ zYvA#ekwBtbTdpz=t;M;*lX!xsamCc{`eUCXe@M2hyzRFN1`0VM4pE~4N#SDqAz=Ei z=T=o5i0}$Q49+xhc7o{#1}VVMiO=X(tL!vi-_)#wkcleH1y@omZ+(|N)sC@rGSD_h zrv

PS}0DGHJ=p)gsoAK9p606+Y)axq~AIms7i5yo*~VyijB_`ISy(rvA6- zJ%SW`U3$>0ygOUiyi$O)X*ZdpWI9sXUh*Rq^|z!S`Xa}B>;jL%+{s1c*j)|9jnCCC z9cZLQX@)7NvM>spv-1F4`O)4L>Y#EQ=Dn%1$0+5w*peUfaNI?G4OL*|nkO;HScqI0 z85czHq4Fd(Vi_icC%x@7SU7M(1}IOg`P;s$(jp$lX#0Z%FgYjq{Q1&L&x|hY(pn3W zxMsN;FA*q)0o$A3pKQ-^5yd$7FwLSa=B$jLt^YvG2l1+!&%{4`M<82|ny=T!q#*d9 z^?1!BMi9h#e+|TI}?LgTr9Ey=9H%WD1ycL*<;;>lP-+O{Lc` zE!c`Mvdc>$j!MV_Po_~s0Vmo>3By#Dlkp{3`U>yD=XeG_vEq63Mi>`*{ZUW&=6}!F zNXB+|OFd6PKNlYVWz2atx;s(`De7&cH#@FH{FXn?+ud;)gaU>@+y-~I%-S#0J&@uV zdf+ujQ1KXO}6!w4uD!yu#0%ahgzV4Fvk&LrDgSPkPcS3o*z&vU1GWvI~$K5Pi$* zjU$fVaCHOKazII-KsfboBI8viFueI;`R%JRO21QiXqyrSl8DNJQ`Z)6=@HT28H6mC zt+Gd>PPI*|KR}nl;IW=h{fhDec1sZUJ=nGn`S4<)?d-SDUH6vCu_;Ve48Oqifpq|- zxef;>FJui96Xkkc+5Uq|ZH{A_9%xN0h^a1FnLajN@erm`gfx#w->uQ$FMtj&8VfDs zE!IpB*M3;@7A2Ff*u1%h|3L)FWa)>iWg9Ki3v8yte9EZR$!Y=sfw^S{tH z>~Hl`Hg3{)YKo%`CtexIw+C)v`sMU&?=7T1){aC%?bFIZVS=7j*RrX|V-_%r` zTEDyR&qJ*ywsqGwe@Cog+OhV+*n$#Ya3$d)_x6TqaODrf-JkEwHEvOfgGcOEl(a_` z2!Fg<2y?+e6#RLx=CFYX!7Q-gtYA^m)9m*BW2l@fMX7jJGXoQk1!;UfJU$vN=knNV0cj9l}9& zR(3KYj?8Q#BQxTpPR8@TZ+(B)^IX?+UBAm;XFB&e_x<_2-|yF&l^ta3efjD8(y5cu z4=9UEeYB=0PbPUykZ;PotEs6p&GAV4AOm(?MBDX?PUV-Twtge7-leCuIbTfQTt;2J zfB*SfBfY&bHJ=f%O7#(QI!5OA%e21AuNm93+ZLJN-=F-kb=dC27){(IB`^IlmZBUQ zjq^HK)veva6*VS_BTs))Q-@?teJBP(AR17&FpKwzUMIc*Ipwb=wkU~|;^f-1SPmh%TwsI!Bm ztOajUOx%*G0f>;=njIz6OT=AASd@p6oW6BJ^{#{I3z3An+=-&ZNaGmqZ5myWB)dQg z`+<@nQTTWLyY}~S$|%$vDn75=8MO=CecP)&P-CzcE9_JcPeD&Tc6y@Q#ibW}^6b76 z-d(h-7mnlJIA$qnA?3 z+g7Vb=Y0L%$j<={A$yk-3`Lud9qCrM8Y^ux=pM>FWCf@~=l$LSFn`D0I%s^@)-DhP z?{fz%l$4#Hj!SediFlG&(90;Y(9b9?z&dM?=?jrqL&fUPj(Eh}Pt20GLw%TJG(on= zW8vX`VnwONq;AA?Fk(W_-Q`X9k4v~k<3B*U;a=M63gs{Ua)48Amu&6lXvgISV$JJ$ z^v=o1WQS}6l{~L{D_*_Inqtm>b76~&jLpUYciyT`v0aTt!^!<*!72@-K!H3M*qKlw z0vLU`_pdSsa&MtrJ1?tbZYIa&6EpZfuObuSK0(g8t*&tX;__N%PfroG=sb8Q(+Iam zvx_QP)v(6?MttD!A||hHn3o538(;dY78>l|w-O4j!eoi8^{YQu54fgev4_<>Z+T zk^7Dg{tuFl(^kJ(g}9fG{69!~*ly*ZA2cM2tZ~ou51PT2n&qi49%;j4;PfSeN!*gz zmr8}%z2fG)%(}0Q6U*o=9no`Vx=yUAY#@?}N9OF6VQWM|oTF5Eq7w`$o%S^tr;`;M zRc(^u#r5V{dHz(SQ#BZ4!Ksg~oSggkDAHL9b`OUy_OFVpZ8U*KrjuhrurG&Ec1bha zmlr5j^scc_f+Su)@HAIcuk&kYZ@k%&br1Z;O6Be>0VTA}K~qBFCAv_$y1F&0Z~BQ( zg(G>hcO0+@b3(s#{7=%O!3FZI10@dA42MkSeLO5g5{sc`u#A2dgg@GL&(*mFNegL0 z^hdINDxK#;4l9GK_ZQTCZ!uhIiyd;{HiyWQXrzivR-2d#U~P|~Gu8HK1%@i20OjAB zigx-DnAnGqso!c8H5h|cSY;3#yDo}90CE}9nBZ*M%{zJQQH~x9U(1wPhK~R;?n0Mv zhTNgqipW-^xY*D_G;tN-!0{8-ozfYWQ1$eZVAmzC%_8!0t@k7exTH&ssDWU0OiChG z?Y{A5NaUl#ruQS>jAljKOvkC8Pe!^MA>^Klg+Hv?EAN&AlfCq=f*Y37jVu8@fB5#Q z-pZR_j-#$u2%`WLTZmo>WConjp~b=`trg(Y-`H`X*Y9vkk-4}kU?U!w&u2b;)zt&R#wYrQ6fT$dyS`~frKq^XHdGG{^5g>GiOx$65cTH-92CE+t z&0lTbW}GokV9s>;ewK{2TSH@$^5VHKrZKfvYI zeQAKs5MqI&c}DzM|DY~s&G8Mp3D^CXi`wiC4w8_f4C#>IO-l$2^tIUo>5 zcM<3`Z7fX?15z-rwV5>`-qFlL3sd-bYPk0CDn1`{fCw%*huG?GM|Ge8#`#FFh&W;> zIX4UOONkw};HkJ*_*raF`O!5+%B#s|!Vo($Kw9n%d@MPS3q??hP=GOX7mLf9-CYlY z7ck#2JFiH>dB1n>jk&6YfRlecN3rFEsGEOfUsM*t-kp&D_z@f>8o0kD{dMipG*ZS5 zzZtFj1C?|a+X}~rZdZ)As-D!+f77X6tfsr(C~DMYLKK~0(aP)$;=Y`=qnr=QxgCSY z$$ooi3+&x9A$KFXjID^R8oSAJ`xpVJpo0JBsR-UiCS(fgB)9@t{ZMR<#s?lWCKa5w zHdE`9z`a!j)0_}8Wb zN7YL>0BnjE%FBhpilE5gn`DDcAWuSH`DNH$c=vrF*CK zNBV7$u9w}JG0DvKn1_KIq8FC~M>!_@8d#tNvCJo(IoL_eV{Jzq-2e072?r%1m7kE? zITy3SRpEMo(T*}LYV#fFD;ABq@>l}uR5c-= z;xXFZx;;^nBaLXKcOze-P#iJ2myIF`c}t(h9|QE6unwnH&bwbIBNa}oLc)Pd<+sxs#58XOKp272KPErR{@Z+?-E0Kth#=o*%*GLmG) z;4<2PdTC9{eLO_hmQa`GfWSDiT-UI~HoD$6KBHcCEc_0!bnLuc)4y>zYN|~V50qGF zvu=rHkBJhbj8LG#AaYvC`(;aZZHlOSyqReQATn??ttf zi2jyCTo24CoxAYQE(K_AMElzlKvY$$E}o_htZgGje|xoh>xx_d@PXmcM)c)xEdEa- zx3xI7B(L{5EIWODy4x`fSgE|)%C@WVdyBf04u<&Z|L$cu8&`0svd;@$Dw6apQ&}(F zdNlrSx}@=q;=+Y{H7$0Kb>$dv;kS`d;VO=pMIxgupY+W12F*qFs*Xyx#!6sIjObq* zA{^pE2o?&`v@adhZ~QJC6S-9b%zlN&GUxN4f2^@qa5>mmsj-;jcbuH}56bMHQUNx& zZAs<`0a*(huDoQ)V!|LHN!STwbU-acM>fXoCPpz#aiz_f1PGPm}2y$ zWu6`b_dX|W@MK*S`W?hv5R~@mbZr~&>l^mySr(@I`ThmWx{CETo|njWamg^&Jc}TD zwcV2^9=RRd2|nmdtKWj!NPO22#cMg9bC&nJ@iJ~tED?LeD`iqSjZYJEt^8(2PXpw_#rj6_h_>v6;bS2hLhFHn6sycg&y(-yXMB{ zSU7Q=x99$P?ch1UAPgf${GIzaMEbF#HV6jv7K(=)Y_W03m^4AreWbnFo0wj-v$cr6 z1pl$fVmC&3JA^b?K`{A1Ibn{hDlQxV(wVC&8%jk1#|08K_(2r3kpFt+SgA#0(-ZeXfnG#_U%KuH#8=M7DMlE>R|$=ghN~=V1UK z-cJX6rlHs>&5MwDRFQ)@Qla8kQU5v>*o~fN(1$As@uU>SaIl-hbkSi7DYm!l>NcdJ%6KgT(yhfTU|MRx&(`@?{#1I8AB-*0ZTj$-x2(*I<5S&j_>Y zRf<0Z2k+4&Jn`DeD}_y%)PD0>q2!MIEr|F9EboGgNjvOO6E4zeu_|e~ySKYzzaJNZ z6ofn*h0m?WpsX>x0>td1wI$wfpfpml(%er)N~ShdVbVu#ljrS$_X?f36n zls_{b-?ulm7Bj|{!XAAciI;FZn&tLYc=CU9^SS|UUJo)aZmg@VBtD)`3;xg0Yn%RN zerMSK2WKviZA;o{?V2B1>E2!onW|hWy)D+IDp3}6Z{X+Whn-4ZMtry0x|X@BBSWA5 zesC}J%PRRtPWzbI)=-dFEA#y!AY@&YzbU^* zG@uvqO^NS=WK@&u3P+7n7fHiU*GZS@pvKat+x^V0Gx#1`{0C&>bU)uvFanh$XtstTUOk{sSu)GjW zy4>O2GKScF76MYv)RH^rQBK8Eo^E>91g@b=34B~8}T(`l*iGgIE!hMaNXMvNeWT$NrAtauY0-$do7uZd>T+@y9-8@ z5mlbva#CsK)wgTW5$qy3ZrRS*a%KN_^GBy@S{!wH5v4x?u6p2&QyEs*ij9-9D8*G< zQ1_?Rm$0;CGbvgZyYE}2JOsz6$?x8M;LobCXZC=YPU#O03PUPG)X8RF@ECn`u=XkI zuxEA79nRl*QT;976*fD60wdGj*Y0L?lIQUl1DZ}p@k!Xd*iHYWRGFkIC@dYd|8}`} zp(6kcZs{$H6H^CoUrF^SLa2~J9PiHXyj(OAAx4w!p&)l;;jjQRicxI2lFq4zARv!9 zjdXM5JG@fbCAQQ%ctU}GTqx#;0*G+Jtl;Sr#{(R|2x!jepT7^^_=KB@#Jvvr0%CG6 z5qSOcTOLp`-qy*!3%+ItIq+P^u<>$k^z#l7)-cv3hk*U&8E%z_|0gzASNKKj{klPM z#27K7nZZIKGB;A#U2$Y*N|$}M#$?Gm|6VfrFYFwnk?5E2k{l3NB>b5(FF_fv{pzl}A(?^a54lg9PFS-MSgR(t?wqwoAqJqt&yjw; zKH|oTN<*cy_F=P*<^JwX)koHe6%DA#Quy8KMs?rU)mVS>4}&o4_B5<6Z#KGUhno1&6n|LpIm9^MA1i4M0RT?F?a{ToMM7@>im z+)|Di_IjhlCrBUD93aZH5S)d*YQG1Gu|!C$W;2U@uVKA};@CGw(W4j3^tdon4Ur45 zgVW0!EfIpmCk1_Ix%k76L0pMLe23*-1|a6aNv{jmbk%7}wep*LpqfAt1!$O6462!S zO5kR1@rCG@Q|V8IcS>#8Zc8k9f^XXrE+HGEJ+w4#E$z{5Sy%~>Pe13ILXeUA(3jmq z5y<7=2Sn_bq-e@&Ut1PBwj?M@o}3m*^h>qB)I%Qz924euZ#k?l^ONv`eM22t3|M8# zh-Wq2MZ>WktYTMOp6{98fE=cYuV@W}af361%6V0aq$WE?#Hba=5gXo{cNbdR=uD7O zj7IucehUKA@g&Y;&YbK9ADbJ}#bY3$G0HFlqGPBVdmW}-FbBjk$-XU*oOI}AK)Mwy z+4N1Ls>N17RY5Hm8euNs3VqWW*_xaPAKI(jEqL71W2S4bPLJYFcBwp4XU zBQs6yEMKL;FF2TKaOkSQOR&5r^Uw%iFQ{nyN57-Piy;QZawP*vQ?@)pg!^O#fZJ&o zSuH{>JUX#O!=J^2kd)kAVhyZ~?zDGstP2laL&M?wf|UEwr}OKsRbobK@qQ?tIC^G( zJNG{c9H4ytdt1J5F*uaQfUU;WqU-xj)`<|!!f3wyxhj;UEXI%8i$S(rflufAvN(IMC@>$^*1!MjN<2&%h z78)QVgYa2@))wzoMdqqZjihd{!{rVJ>W%K9W21{Z#;2Ib)PIBf#FqQ_?HF^faAf!S z5?-iVYZZgRBG{`1PEPui7WwwRm`CdaguT6XSo20RT3rCG)NlG$ni^RgafsaO%u!xu z%X|2c>rf|xl;+G`0iU>bCJak%489U9IllWqEOVo4dhU~hp`=Yj9}Me$)9Vs{1$?B-H98^Pg zcuhn1D0mnyHV|wVc89-m5PSi%F+?8WlnVS3c{Yl>W?_9y`Q!8ZbLKHofzFiCb83UQk0xOVN_ zjI|kXmm*UnUq}7Hs^Y7?{^`RJK_J?Qt@hGt-RUWUedkgL0}(oG@6fUhV7(Fxh4(4A zoks(~h#5E(nX5c#s{j@DotaJdLAJj$m}{k?t{D_GexC2DS@5Q}?qYDk`Ky&TXJA*N zW44s(^ji&nYx#{dJxyl-dP6GJ0-268zg>zAs_|k-iY$WJ>n@()ko|NE0h;|80!HPV zeg-#rQ`mPb`m9pOIG!Y(p79{S^gr&_THrN|p??v3vA06$uOl#00g`Zc{(Ave9%C1- zF6KDdu3XXfg8-Vkl#TB)P+}YY>r$7Ow+}plbl0rvt|~Fn#h5>ORRWWXGA6XjO;9xA zUWSL$rQOk9hW7|0mL0G9T!GFbpw@Tp#WHJUCDI~OPIg{R0kPt?c&j~d!a=ETo~bU= zSRpCT$g|A=XqwXqHhwwhtqpqZor|mr!h2Gur^oNe?V-0no~5RKe}_qV43=dnf!iwG zVdls@#akHhB<`llzk4~}NxjSQ`D5W_ck%`Pk+y1F*xw_CkZh(!)rVP?vWN{aP$j_O z{veqw?Xz?7Y2w9(gzMucV&s)h4Ku>)fqQm`H+a@o&lTC=VIYPT#Yk=zlrtj(D(KCP z)ZlBQ6UY5}KZ%4zf%5Z%a&0!vUD#PK?vB}Os+ZK|aI0Bu*^&X`b}LwRAE@o?eO){d zVC8qweF5N6k6ll`@ET65e%{9*qC;46vgpz>e9!f(!jMSf918St|3>=`-Csj;PPzs! zY1?S(gzX0tH^N>Xcq0ozYfP=%9rIOcG)IaJ!7se85A@6-m8(BnOTBf|QHkO|zFs>{ zHh8Z5CT5(^?0=s4tbC(gy9OiOFz88xvnm-7<$Be3O6m=QI;#34*?4P7`@Lfvcz{kS zpsk2YX3_DKMS{{`(!*V0^Pz1@ZHEC2oE9Bu(R5j}_VD6?%14N_S?R!#AA(b(;N2n0e+C6mP1Dr?T;O#Z&IUjLh`gzpBPE9TmwE&$3w1 z9W@tuLKKMVv#YhCr@MF{rosz&1$%hh8UB)ZZyGDhVxs8U3|3ukL~mTwF`K4%D`Z|( zP$8A5AW`ekBp3Hii}h#r-k9q}=2Eb&L!E15R226g5BTOo7p+oD`5uRNmw+d>hoO(Q zcpQ!>Zw1z+)Hw#Wn>Nq`4r72$wF$-D||#u=861Lmm=OIN>SXKs36l|7mF zsv0?Fx7w9x5#uT;E}MwRT0f#UO*Bs9O=bu)`VN8nZti{OhltXUiBw@l^x*AhMkx+{ zzyT27&0IbjDwu{p$v;*0mkbU|kZnfQ>tJ+}CwN-Or8@UygrA?-_lX$r-k5?9u=tHW zmXuJpN?V+5j!e8^pZZ`f;d&@cO>_Gdv5#r@UN|Ikn@hdWMkD$#6R<^MW)lDQdYHt6 zC@#RI68EwSqN93##2|LOz@^BZ$5XyEru;0NL9x5$ zHNG+{VIuSM>z_ZBe;PgYJh!@k&)mrRnX}ilCSc=#Xv~uj{hj}J{!)MXE`f-%Q71HZpdy^fS@vTU~JsD*h~zItl@W1oB0@+6~EZK+t9>xWgn z6g%klr?%oRHihKzIwF7s(516kJKH$g4eULB`nLQcJoVYD@us|sbVfhhgsR}oY@^wV z&91wAW~Duwm5iIlv`97ZE2Z~IGxq0Ohq==`tI#B*Ctj7yw12VuYj@O$a9SOndq`J8Uv$Rg`VL ze+9JUsRpeKGLy;v!h@NPhfS)j5$iGtc=Z14=rnu3=*S-uFRCGuN`05;jhF2cmA3Q9 z1p@Pzl2fzuES86HhbL0RN6?K<>PQMJKAn2sW*Q^ZCjR{q>Iq@E_6U}Db2H7}h@ccg z+7d};$`V`V4}Lx+#Cw6KAuQ)vuwUZwlH?EFkUwxr)t@~89GP-WuZ_xqe!nwM=Zyb_ z$P1(+mJ|P8io8k-$xRe%^J^y%i)Wtl)F=nC%`$Y3?%WOG4LH8UQ0J(Z1~F?&xx(zB zT;Q)(^}HqC6mwG5JP?+1&S1HuWJS-opjc0seJ$D zjLlxfk-$P^mx)leb4q8~4Nj8!$R3QDNY!*|#9qwI{8W8InR2AvKg96-KZ~mCJs$#5 z%p^#;Wxo{gJWhG;szt_eg0?9k<~SOUlIQ5azwEVkLaF8C6TNezK>CmPl#(cqyXSfc-8oqd!Z;T%J+y&k zY6q73QLKco=#+3L{zbI{J|A*-&i$L2he&%4aa;9>m;Ei^!DUa$r z+Q(xT=piuxwliXFn9X(_iTwv>lUCCn$q3wSIY-*Tb9mG$4up$o<@$V}ol$DZ56KE= zn8nl;x*p`sW%{V3bYo7hIlxV&(c1IWG|+4#^THWe7)WhQ7q-p7Tmm6q1v1a??I2tJ z`mnb9H6+EPe(&?|O zbzqY{(M@+=lOj5Yn}|toZ$wZRXtXax30}dx6c6h?tO`ABT6>J1?T^%HlY~Oszw+AFMRMhh3!eW3VOw*z9fs(f8^m^{C(4 zNw~bCQTTYmsKIvi8R#dDtlNR&KZ}*5Uj8mF5{YxqUu>3(cb*fnyq@k8|HKy!P2jX7 zE3DuZ_;II-iERN&`Q*huzsV~qeOd)J0XikgT<9LJcvw`n&sFlamoGFDavO?@FPezB z67_K8)`DV;xh;m_U-6Q`4I+%J{Gs^bj0>=;px{w&0}x=S^Rsc3&qbg}A|Usl7mHI` zZ9}M#CIn)Dk?_WzC!>cVkaw$Uo?FK8CWrUhuEHVsA3{9kSO_5<+*QB#FmYebzIYlc z&621a&2zoYN=h<_YQExMzdf^Ml4yu3a#D1w1bJRYn**#B5KWSG>Y6?xv?^#0y17_9 zFAVpN?}9l%ZsceOOnZp^}mxu`qebTjWPi5Z~78#k5I%Z9yn!^noy91t9U z<2ju0=#2)L^2l5@^V`%PaY+TTP?qPJhh_-77%AXGBhtk=?x#$i;(Sl{ry#DHv1ypK zxJU2d1E?!XubKsJ%C+WUrWJh-HlHWXpJQmS*?QiYn{xSAtRr&AvDJ!zgCt1waf@oMAAz|_Hk)} zccsSt2;dEdnVY$6cz<3DwrP>S(E?O|;%OmCFL*_ZX2^@BovC{;GWffeuDyvTAbofh zXcL4EoKE43RpWvq0|(Tg$%R6~t!G1MUM`GDMm9=g%ld!8o$#z!8bo2%v+wn`ge^4 zf+057ZGcdRh!L&iby-RY7o65n3&C&(z88CDjdMkJs{0AUVpsn=gICz1-Ogpum~3zF ORu>8%Q`~i9*Z%?TiggCNp==J!kKI_6bk)ng59Yj(h6A#W}SnWCy7m zZk+a&JsnA_&ch&lYBE!9sOe3#@Oud-s{8bMN1fDu7iH-w-rqD-|HZ9hMx7h9{(@^j zwAe!I@&&|Z;rl=SRd+l+7mE9*$A71b9=Cpl&xWNVr;fv3b%*WshaD_N*9QNY40siG z80IxKWqm~Wz5ENcOP8U3{B7PweJXUX#io>p=P1K4L+#imAcI>yZ1gxXthP>G{dLts zW9t4<*m`L|SbfL?`Npui+GD>zxw*%LjHAunmh9vH)b8WZUBa);p=X9($E%0)jgymV zm#owqY82hV0(K>d#2F z3%%5QF9-C2p5%w}d6bSdg)y4Cd9g5Ei{SR?wOIH_?H5*ffp>CMMgtfZQ8?>Rg{ zV|h8_-j%e-YdM1QUbf}6H}2UE7VBIoitNr&ln=M< z*ZAB9Ux|NKNn4N7>U`RFJg&CpaWcKvgXh_>jPJpiMthcpOx_tpo$QDFGT)J|((gC{ z_W*Dfj*SLwOV=x}zc{MEg*nud5fhPgZD#UbZz^iN0&NFvnq$W3dGzgY-!794!HSio zmz!-72a$$3a;jx9_scK5P9_wYBdF0{FqsHaDRB#bj?SjJ#z&DCC_~U+X3-B6#YGjR zc5@W@;{+Zb-Lv5~jBoT*dA9pw;m3yL>gg;%#zX`^}u#_m0MDtnYZ+gs(Feq;Pt9q~1=}tT_|; zH}iAL9aXnC6?R$Qn{bj5WE)xo?753?+FtZ}ALDTpGSCYgJOp8v=-{dTPgYEt!Nz*9 z)y{WM*x*#OdV2;|=im&!Vb!iodMYOmg=5*}h4;A_7S+xg8kTuJu;TX8&5R6xZRg#m z&Oo7~IiaK79b-k2@@8VKMF6^|SiEbRDP}0jfR>CxP+irM9zHl=@@0!sdp9jw3tVJ% zLfn_4l-r7$yL)8OKJ@2g_7fC4u8wu5X<^qLzfwTvAbcEfcw2=D|UmfY0lw(;QFEB!-LZlf|D=dc&2Q7 z`|Fr*#ok-wiQo?|m|lbe}i{H;bL#YM|7AE`G8@5!t0RJIRdm8i-mPDQP~&@ zK^6V;KWju+T&Cny(Wu4rB%HF;c!SJW-&?~2S8S|@9d}J$#66(X^>^Y2ug$g9`<5;; z=qKHh<4j(g?Q)^FnM*0NjFpwN>>A#JRt5Z-iSZT{OvsG$H}QC`*c+9$>&fF}EOCnO zLkES!wx8vO*;-YAZTS#pfUhAhOAuixy+_j>-h;z6M$k(0a}`T_-l)T^MQMYmNCvy| z`gQrFIYlRs zN{;RdSvMRXJxC}RAD!?IxE_!(Wxc-crGDfS6!0M6_%|W4y&^O)tlo-ZRT#fJxv`b+ zDy%`Swl4L1^jqz-_EfrQvUS(I-O;@G!*zA_gP%k30r5O4eWk+j6GmZk0ar__wgwt^ zKk>~)9xPG+@!4p&cx&E6Os2C+w7b}&zR(7~`mM>4l~jxMn&R=L=naDNase~)Q({O&^7h&UJLB8f8?;e^gIh z#Q4u?Y^kLN-nHLkor@B&AY9L$@4cufvdiOrl~fO8F|AMDe?W|7oLv%!*$((l%Q7pu zNsBB;zX^zZI3B3_^FgA8V=s8{gye@>10E{gV*?tWJMlxsv9b7{|}6e}4$oFU~d%3Q;_l~#=crkc1B$%XE-P_1d#5116{@jBPV>o0(s zCCJgz)nD>7JWOuif|8>n7X9(@ z?6U^_he`I?Js0DB=zmYd=~b=_ySI)b2M8LS$4|ju@X(N*;@7$S&E(qM=0}Ogc3iYi-fAy1EOu)asBUpW=Lh)%4!*U?UsCZV&+Ufu>C#p{IAj-tN1Km1NUPe+rj=< zGc^}BX3yWZ~MN4_~(WEqQO-uL4(Kf~ql{ z&lyEhBxpK&O@qLxo-^jdmTEQ_TH`D+GBOJaVyCVc;8F^lm#Tt84&Kap@jYj}o1(1a zys;?(tu~ntU$2~2#=Egy43w!96KwSztjJG$S$TZ9Ost8T5weFoBYd`Jd=#ESajlr} zJ$A&m;5Oc__!3kR(U0A&jQDN+?1gepV?v8=pA#J%D93szMpdmtmlMfM*;<{~7S&Pj zd~&$#@_N9Mr1)ME|1z>O-r<}mLxDGHPrJKU{D1Fj^{01MBF~hARA50b%8=q6vv*hO zT#-+L473x<`Fb5ywYq%vmxOeWgsi{^iYZYBFMOVpIYPP9Qyi@qC1(Rl-P7h3Gfh_aJ69wc58d=psBh6pNmMip9LWQKe>K%00 zdA>Av_v*dWTjY$Gh6Fi$tY2l~$Q-FQ;UhhSU;##$+Z%nmz%lhgh?ocfgh<31!J>XD z5?6o&X+31rP+jBE@(+PTqZVA-^sm^NY^vMgV{vv#!$sj2yrwTxLAwKiz%&=-TzVT= zbD9xao(;aN&No9_l)1eUdYQp6+j0mlBp8Q2vrfjWs=x$QX!Tgi`8pLp-F;CKTWa9?nW}X}tlEV&NBrH3kq5y&()l+k9@4_{FRMC!=W zNN|f*T16{VysP*ai&vI|8H9A?^%v`CpKZH%{>37m+!ZA9^zVK3I&86t%mj7oC%Lh#Y&Z1o#Q>oK`^& z&X37Z0eX7RS?{(jzm8$}>cn^fS}1ee>zR?^GdZ`F!yyc-Nbjuw1v65b3V%-AOZ1C+ zgP8ccGsz%_O7hNVroq+nf=*W`Iz1L``CST{orQ z{<{E2t&5AwA|KCmQTRe-4+NG&aSB|@qd*19o6ni=!j>sXhjKa+q4l&#u#LT=r>Zf1 zc|1x__v5S6ZLNltdAW*qH*E0G%@=hn{VmPalp-7NE`xHmC_`GOwZ5)0Tq##wWI6SW zl$csi+;Pk-d1ZqOl&AMN&QM2ZxF8LAxwaMg`6SwBrD62>Hd$`ejcTs%#vf(SFDtv#_MW@dEGiU`L4e#Hrt7E09XK^0BpeDW~a zoQ5{tEP?uOS8BH|2Gr9l1_A-E@?kL>GY=)X=Y2`Sy;m8FmutMn9v!DYWFl@-CPu>W z>u2dFfd+Qu`E7T;+RG_W6e}gTCSs?AYC42giK~W=snK#J)l(6Y5ni^Vmhx2Xc`Jm1 z&F@*vClTpr8J{=q>+l?5)`^1%am@u1_oy4ivbs)Ijg2GA1wR41&_O)Zp>A8QdC!d> zSD+A76{P98mEoe*U-YArm6+Wu64+u#O)s#uN<Uf|WnKqmvPq^{1oG$7 zGT+hx>}@N=(du+KW5b6XNimaR5swl*7aj(!+VzC!qE0oJ=l9#6Y$1;Aq6MpxpLLvQ zV*WQX4Kg0HGXMAH>zv%4I*-12Vi{#d_7QmM**p&Je^ctAgVV)_u{WZ&y49P=zaH$) z8&-ui(oXs$APLkz?;E6HT3dpT#KH&G8O15&8!km}(FZ~WOH_A?RP}?;=+Fx&q^dLH zz7Vb}&sXj~CK7p3-Dc9l1xDIb6;>h)W4d2iB*c4Wrm_p5AWHrm;X4?DRl~LiW->k5 z?*?g4D4oNBF51Yg(q6l$V-46eIT0$~OlYDckhl;&HgeFAu@h z6ffuhiJ2)xXhFoS&T&!6M7$T}S2^~|S=H-JU&a=+&^#K8kJsMS zYogW*jdvhV@pUcIIVa=?F{TSbiLoOXeHVLHkS8YFVW%iHw2 zPG?Qea=eNe#e6CK(pmT&@Ax2rx+iqqW&Ckbj_rVw_mxlKol}vrQU~=}%nt0@w35qL zAlj!1s8hFAuS{~fI|3#c#;n;BSqNL9Br68dV~7!`q4%0$v+@ zQyeygz=X=6(gr`8LLuee`><>2?Oh&_P~GB;nXvRiY*69DJb zmT4mVQM~y|sEs-79?itCCGlnevS6CDjI!IJ#1QX|A-HPA_2Aw_eK=9fi1DlJa!HA5 z2;Y=AsSO>P4|=7XWDYj=e(xNH|9QMKJ8Q_}xjt=k^m}*c+n>g;u&s?(s|Spd(_zQ; zdfNq0@>L3I4ZTYL{HfvztEsE4uMG=C;b$$?>l&>~9&IPO9sy2zbwuoR2G7L7_Rg;# z8w)J~7oJ)b9m=mb9Pjtjh3yk&CuiH^wnV$S8D0NJNsnhKg~A0>2voa`rM0iD54?V5 z^9W4$Ej?|`ndjrU&9bl=^d+%hz2ALPG)Cm$qq8Mu`gz`l%9IBu|5@Llmoz~yvnhOB z74}mU1_s~YIIy-r;S)h2e3V|n-~ zwf{&e?#4LKRCD`RoJj)TQW%Na+<9vwp|=a!N-KwmgW5 z4wom{&cY_{ze~6*tREZEOmUa%lGJjUo^locT{(?N{oWf^MNC~# z66pV_lcIW#iE>QAix*^WB8xO18B4H&N89eQ%=;}*#Q9Yg+`Zz&qHR(%K9z{Y=IFf4_JRO|mUs)jNX6{H4zT=`7XXdhL4`bP3c* zZBf)tg4oo0P$rJ+z*Y0~vs4_vUXtU%C{SpQ>Q2!Lr~>c6J64A*+y&&Mpk>eMwAX5X-8FR^*r)CKhOK zelGFdA+kL|R?V>L&}ucSum+}A+OpC6{j(pI9FAl6yA4MJW~VpSUs-tg-xa^wpUPjW zVLkHL_AVyg!B`@md&BrbGA?)U16qF_q!V(Ba~vZBDOen8B2AZ=O<0*TMPe9wUJ-t& z3NI^E@=9D3m`zPNltkA@5vyYKipy(nE^02}s_~VJwpeO`dxc zR$m}jpY3WUpu1Xn*Zta7YZTZqfj{P(aJ6|+)p>DWZd?HyP&u-M=LUzVio#W!^{L_I{5!KU{1mu^y~TT4VuPL$!1chr~5-gU}Qw3h(|-a`Jp z$X!X^C&a@nxULbVpGu=IhfWt!kq3w=s9|hO9(+Cmy(g$eThut7-9J_Fp3&fF6S-x= zFu#~Q`^Y<`ekgGRxb-^ErNr$yW5hqe^gs_qI*|l7&^_V+aH>n>HOV*R2mQOl_&HI4 zGaVmrW+5~d;ZAW+08tDCRfM1!(dkKstE9ONK(>yyn^~_YTdSHah2UYP#??9O$ z%>YT)z%ay^`2k+tSY}UD>=fAk_cQVr9V-@kVOO9Vtkda&S<2VGi%zZhf$r?fXE_^` z;EA#R!Ey9anr!OG>0CP_8Y>E)8tomu{K*O{I2VUp;ff^jSi*YSBp`-ukY2e|@-cT#zF8 z$Q36XhrX&{g=J+6v|)j)&PX6ctn^v2Ky@FmxGz`5R8Jv9GKiR=D6%5wZj=L_h3Qhy zA{7cBUF}$uDgEt(I}=E7rV{bV^snUZo9mm=I-aCSZ=g3?j)+-veurwhH7;u;M_8!( z9|T}!KUCPR9E?hRO#ScSiOb7}$Ml!8zD^1zp_iONU@po#8I&k55dRo&#z?r%rCs*= z8z7vT=OhOQZkjWmft6j4080Tb)XDzy7I_rLGcc*2jMQn&ureq2^(`h9G?YQ*{Y;bK$E7Qr-L%`PkxspXv%bT&Uj@5Vq7aGn&CNQ-$N2 zQDa6gpfsci+8Kno(;!f#q9Nvcuy-lt3k6tM(F`<{HZBMa>czUAT7D;Lkeuu%OHKW* zKkH7Qzw1mgp8?$>5fA~swB2L#CuobxKo2EwMh|>qxoE`nt(gMy5ZM_;JZ6!qQd7UL`epWM`oCl&m{H>7#%pxgX05q!FbaNmwE&Rn%Nr*(h{9x{@*eKC}a>eZC|*3k~w zX#@H{(^a9HLqmA+%3jz^V=L@bPiTMEy8otY+zXQl{0X{5<6Mfc-3qntr=V@(!#990 z5~9^hB?5DhQH^(Tu-8WL5VjL)+}XB#*U=L0!A6n2cow`p_y;Z@URju0OUsC9jJ|A+ z+bO*YGHPA$;(a5Tuh&&s&#@h0wQILC7u_edyj@qqk%sxFTBf^~?xz#hTHc~WGC(7i zpWSxv0egK)JvP9|^X+}3O`B#&0HVs8RYz^vP?4Ra7F>+esDZJXM%^~bXmE=X0BN*2 zVU95|*$~?PfKA1{RD$P!?&dqW_CQYrNLIcj0yZo^PTrSEd7`4fsB0n|Vzk+k>?lgllRcXVEYZOF&un_4C?kG4$;(WOU(@d60J0OYeNLg z>y!quIBKQIPHx?$|J-@|2b~^@_jF9yx=X{eGp;fNG$09 z^Jp2Kea+ifr6fG=WlKih^lBjgx~a)M%&0T8b^UQ!FWw-UZVMA*d?GRc5cfjK>2DCn zdJ?mN!$+Yc)0+ZkXJTB}F0 zf;~qcKuqzYL@uP(bQv?L`qp5}dGlr?NID30sG| znE_=@5Is+dfHq?Pnn=<>Y{_ZWiv^g+ooF9UiP-2->Dpd60H(`qwsR=<$&_Mju(@ve zLt@H^@{{ZOOe&Wls6F`axN?CY76BB%6A|gV-scLM?vQOdNT`Rpt;=X!YMQ<+bl>Iz zfwRRaF|IM2`3%IAh~GxPB*auvrcx2pmpvqy$)>kP-)K0w(`A>ah0{Uabu=fi(bRMj-YBzmfdYMr z`naD^U;*J#GpYUw9g=C>_BoS%B$k~hXqgM#WZZUST!CfCivY>aTtIo2Fjt|Qcufp6xZ_A* zC9ej&CRb`a`Qgu@aOX33lq)iH^-ri2*-TG5&?hb9lXh8YGF9*5j>ZyT`hNZ5gJ*k_S$WB%O+@!Z}Tj*brVpZaj1s!CcCj55X%h(~=$+mI*by6Za z*HTUi8*yL%|JxkBSm%oT9=Gyq=-cYy;m>v(iFMEQUp!dsM&KCTdg-fG+j`v1(13#j z27?{ra)naQo4p44$K%<@Vb4c&^18Nw0*4k2=<$T6-;K z9dACq#b6PYUuu-3e)REY>C69*8KS*bA#$N#GVJ5w{`;XhSGd5m*vQOizid_SBJz`! zn&I@r{;m5Z6`_+AMfqIN2k(H~f!i}&N^&RU!!spS~*EfhmvjiuB5=p4h$ z_-;A>^eQ4i$To}abWz!bQ!q>v&`7;5(hCV5(&(|!zpJ%GQ1Ja`obscAV1u$=Q<0Ec zg1bbgbW%vO(=0s7I#uhmTQw_4OJS|DhRxx+Y(M45D)G zKD=-(oEmJN-xJY#l@=qxpS-K0nGEvVfVj{4+NC#tgHPI>%snRI0f33txVVPD#>Q$0 zz5Gq+TIxGA-B46tvjWS5j5Y&)_)3~AT9K$amCXIG@6+cd6xOG_pdUQ|0ntfK<@E4~8Rvu~ol9V@# zqW%M&{+{-OjWZF|^rMO+GrzA}Dhakg66acEK#G%Ft?m4MP?DaxjYj-U7)ZQf_#{G9 zg^U7r7+Avl6i>lOkc+uyNlQUwqZc*?9JN{ttm}A*bdwY9)h7M)XEWC<&VZEycFd0u zL%vHX8B-SBp$hsmH(e$kDacO4T%S@}?d~&#NyOePj^wB8lhZ#vu8$=>2JC;U!INt(r!gLglqWqp^7_U#pld?1k9Txtf?kk~ z-MBYUYLV8}2K0nW0sJ1;UOTP~`+d@5F^-bt`o%o)UE%UBABC?!(2S>3+|}BR_2f_7L%dgSeoFnC zS*dEcxiC_suI2t1)EL&^zCt5yy=%Co8MEj9m!ax9S%Y!ia{7?Du`A_K_uuC@GPF=n9uY^88}5Nns2?q?HfGLsmegnq_+_M54h3GZz18R4AKvWnl_u8TmftpytmHrmAp(%+C95y`EzB<+R^ zn|g9X4@*EkT+cHV4zT?!8}xzw_P2{|DHfA0M4}zZ@keQ7jnA?tmj{ru3zCDN-$oM` z#E2vcqM|d!WifB-U4oM8h;#-LA(-BWHDyHR3S_t%>Y@a=&H;TG8Ixac%Uj*~zjIjST;!%gXDTuY*n;?EcA(RD4bXep#K>M$~PC_KVO11n4V5_Co&nv-D|4M+;!+ zh~!}Z`Ib$H)&-6)2EC)jQwV$vsaG0y=zhkW5wQ`OoFD~LE*yUrJ@yDqgmVc4HrED( z#6CzsWE*^grvB)YITGO8JG3HY<5CA3jISzD!Mo=TE_XY8V1rBib(c#51!6E2w*pEO z5J*1j{dS$Wr;{4|36J|`XX}5U*^Qz_L@2^vL+1}naETrDb%Ud6?$ZH*1$;j4<+h*1 z^ITD&ZNkqbgKtQ|R)(J2|I3v`xJ{bOHI0bY=z7hnTxzVwNo2m}xGXco4Jv}8!H&-f zh|@GXeDrCd?ZyGi;iL0XDxsM`Kxhk?rv&)vY54ethg=Oc>Qgf3{Kal0lFs2FctxS6 z$91Y{=8i1H@`$ZGeSL)d{y$onrXyo*_~MR_k3j~2g#dFpMqv#VJ$&}WzzUwi%&Oc} zkk6z4JlfYDc5Yc)#GvmUR7=Je5?!E%au6(yX9E2<#t(ee&u+6 z(&f=6etTiFKZD0pJ)~~;cd23HcGyJNU&3!giP2==GaCVhUQNd#zQ;!y?wv;qdws`i zlZGP=_1>e2p+~!m!Sx?dTfbnV0VVYhz8(AS)o6O%>bbyrW3o1_C9BK4`H?#$)O+U_< zvSc+S9Nw5d{N+<$yPKPvdlYt*nkV_0Z6kXxbXkef=l-*f#-9p9nP)9|i(t3pH)2!F|dt)0a~&9X8QVDqGp(tmgsHPt2WarT||^|g##*a%T11=w)WKd z4u&U45E898T!$S$l+u^p^s( z!%U6}6I9?f`C2tqL(H=jTOo<|jAg>7-0>2&u(#!gu#xE76?Dpu5VK+R^L z8pt>2*HC_#)Lf~mrn|)}WTHP}y8lvvc^E|GJk^|L%7#Jjc{T;{Rw2OpK{44h%`Dku~>(yqzlzhfWy#*40%e!tx{H3J$avxA_c#Ha>7KNjI<2XmGlT zJSf4n4!ak}8{5YZ&Il|HDRU!9Y#y^j!@!*8Mdvz+>a(mrtm1Tt+h(BE(vVl2hUDl9 z*mmc^ZKF{sR#Dok;OYRntmK|8MCKzzvUS0CX{JT`wyhvxG39o~&EcKux4a)!^svdTsME3uSDPKh?GaWomZpVY zVf%I`PHL;57l^*u(r1Qf-b%6eRD&WY`?}?f+T*+*x`m{wYnA_;DNdXx|GeUAr+Wc&1mF@MQ|35U64xde3s7- zKV*eyc{2aB-jMI1&|a_IHeNtTq&6Z_iRudzf`|We#Qt$b#UIen_`2qph;#PhV$Pds zarBm;WAwh8uWe9zFLe7pk5iHV)l8T(y~m4gO3*iXr3{bx75hG?;nQSpDeC3qP~dA# z!_T+eU-+N_tXjIi_~m^T+3Z+!5uJj&&M@vm@bAI%-M}X|UxW6~qS}&QSPQ*vU47^u z8^SjrOY&(%jEiMU>Xmbl=i+1@tozBqZRO){mv?xL9ae(-Ozgv-)m-Y{!bhyu28H!n zH#i1QR`l$`7v(9?SZ8*ee}iVvyd^eQaY8XgqSPpQ??wM0mD?Kc07mq;piU>?OjazZ zMe6+@s=e{I`fgD)?3{PQ=p~N$C0uf zUvK7~MMP?)3X-FyE^ic2L+&Ax4J|c}S0kLa5gToikR||mg_o9fu=od5puAQ}@mk|q zhX|Zl6-o2N-=LXzL3U8jcH)_Ke9@#64-8xp(7x}wUSJ9EgyarTO25a9$SU^*-7WZ! zo=8Wy^b=CMQ)7u&lMMPuqeHaHXw@;I9KlZ6tcfr^`?vgM9X(x-*Bjt@zf!e=Ld}fo ziz$jM`%Cb73S2kcCQPw8U>wPi5P0CC>}6{6yDn8>GZ#aY^2+!f5H;K+t4{Q3Nd(g^ z;AdOX^K)(Z!S`N32qXl67Ep{fKPG;QmL4qdVHD+atvq}+TQaS<1?{8lrH+_6zm2Nu zu0DzCMrP)m&-0|JwMgpD(mb#f%c;LY*>{8G^q~{^j7H|-(@{N29V^6d}B z6yw+Uc=eF#`mnIwmPJFa>Eolr-gcXkEyKFt<~M)s z{5txv%pU*j@b?j_hW5*~g6)9z{@j902hOH>IqKcjpOY=Kz0cOKh`+7b{C@?D_V&*_ zyOW<+e+Co08s425Z94BuA2+p@2;r%WF2<2b(i~BopF325wtU zw-1pK+hzu8*2SkT=$0H&V!~crQn{?L7&|m{OOmNf+nY04V)+c?vB)r_Y%}Gy!DMLjW-+pI82}~Y0r0l2^RA0E8^*q}EoL!dB_RBC# zQP*?;RGV~TL|Q^&n+$nt#PmG_6QmjhfH%N~xmb`*oqE~H2snz?I;!`3T{OulhBmb? zNiX~3c>VDzv(YJL_hQ5om<5Pi82?ASufSNU%QT-(Zx3N|PGzP7iPHT&SF`l5-TR5% zl!9t$-hv1+#uDNX%QJC1`BT9}KO{c(@7I>=@(FqdJ_w>~q#CqEtbZi`82NH}nT?1Y zsuR8g;^D+dskP<@oXwbZRV+|zhJ3c2| zR_hHHhW(pw31C_WSlw;4pw40GXX)J$<@Ank|2%aUINI+aCC@K_2_Hr(<_*5L$!|p7 zzPkmq1J#!$k?fRUFJukWU-P;79O^|vyK#uI^DooXiv(G=K-=53~yh7+p=dn|_p>TAX>%)nDwYS)-#CMHoYev?Whk> zv1e&Yvuzm}=fQM=^#@;HCdB=q;h_O#CQ(5&tsY8otWO*nIJ>v_HqYrwL)RyWKUWFZ zF=mXI zn1VT+%S&teZdGV|tHVw0nC3|Ou`e0WL0fMqU@FMTjsM8%Wep5-g{OBl$%J4kw5u8y za%}Tm>n^kGTXF(I+24Czn?v7cgtXk4(-1PYYSvxX&Z>N-NtSdq64|Mc)yHSvMKL5^ z$wG1!lTJjD-X@`bcg=k*I0sKGqI?L~o?d&a(ktr@USwj^wyeM^9$zZ+^WZ%xlVmuw zBj`b^z8tHOjZ7OLTFdJq4O4Xcv&QCt`O4}tg=K=HiBSa_uaAH-KHw?1{A>1k0wUY$9(D0(5Ws6nZy9|w&~_Sdn#}Z7C0B_=l|cXjB6$~oOW}Y1EP@ts&%3y z9&X>irN-m{Z6k95i`nfYZ0<#h2q2}L;UjXe5{84P@aXTjxpryb_3m?21wP&QP-6fF zeMwa9K{Lz~2vvvtj%owL#NaJTPo z0P}>H#)|mdH7#iQ1gwhuGf^f|2K~j+ zAM!t>CK2!mO)F#VLi66IFuMC{!pj^t!EqE!=H}~0+=vteExfh3ic7!VB-KleHYE}s z=4{7LqCI6H?@|5#6j104NPWGOPv%W2OVW2Wtp<|E3Y`D5oT%m_u2__b^hvpBH_elcYnPO=cAHh?5)!h ze@~bJuq`o)OP_~7diy5Od;SehD0`>|gjcVkD%Sw9w+AjZ1F}kP6A%Wq#Bc(wy%`SY zeezr<`WUSOMWTlpB@p@PwFT;NS)k^MYfIh#n+o z>L_Dg_PXdAO+673RHf|!j_qc`Z?ou!*}ClFL~TaPO2$0?VTq-PXo&45*bz~RWi*K&o9O<`IJG7N(k*mIrT zZ*2Pb1egH+`V?4tUv4LT)AFW0025?SIcB0VWgc7Dr5X29AEA!@l8ig8!ydKn4MJVY|N6%P5ob;xvl3&+P-d(ktxM<=4&_=Aa-TLK1NVoqq{-1|E$W7eyXI18y-kj3IEk9NCZ>EfOP6U92QKtYWfvn`tTN@k)3 z94O>^$6wx`Nmlq1O2q4|?Bb@(v7r;yb|+cbL_s>AUdn?iju@cK$W}#F%Ho;%nD02; zEqYtpkl>ZS`LMV16AKK7@Vj~|;Yx(Na#k@Y<=UOGYkQHz88s(?-ni%(s+$C^9upIg zB*I!3!QLb@i{*?^jKV(KwbHOe?L0tjY8t*&0#h4fo|H+&6mY zBZbzz=4q{17Ye~+4mIFmB-C!9)*>%afLW=qmPLQZ%=b5vcL*;qwXQFaDJj%JEZwbv zfUjJFBksz@Ws!=ypiHb|g#`CEU;kNb6OL{3#!AyJ2)>7b{%gtuJgZVaI}`QIEdlu? z$V|ZZAunq_bCHonD3O>iZpf*u=kGqwvhWHp8YH8R6!95n0>RXAw<4NaZ%^a?Wvc{H z*d6%`cj*oHh|wnEGh(3{66f#&;|8V#X!vtn2$MsY@3HpRXo=Y+3iRD6OD^b890JX~ zl%7{~kfszX+Ow&&4TO6zJCzmRnBu#_%UuDr$AEdc_@bl`H-RVV;5Hl7x|Lpe*Cd5V zvxb7h4iAalSdlM%&Oxkpc4{}yC2Oh=M1j#RmLPgZ=w{6EU=X(Q2KB#jYUYgrMTC~x zUz%HG9G}C%m>^{BNx_<+KO#>Cog`-%7uU`lJZ=4EN{luD28tFL0?$2||Cc-~D5JWj z0w7iS*F&hial$ycKk_ems2v)T5~Ssy#9k?Z07?B%iVh+_JfmB zQfRfM$z!O&c>B5WPE{)eGFnzR!fzo z+li=3^R)>F%@T&|_seSxRHc{ug!%hiHt4AFz3Y|DZ2u(=M~9i9Q%lt$+f@VR&G(&|fW;I;>8uE+p)`>f6J=e}|rZ+yC=QJ@|;QbGSY| z9egmae2nk@GaV*rB!_|GmrJVdJ&V&F!TY z%<2)X@WdudZKv`0;CGdw`jl$unqp(-rL;T$vx|cX=0viW?p7D3*SSO9-%0eUQomlM z{QlwtqEnpwMxT1WG}+&I7n@gAF6O9~LUauODXE)O<{vJJ0s4-Zvs4%=!q#a`q#=Mq zZ7LIIO18zp5j%uIXUyXp&3;p2yl2XVlj+I!)v|@YyIbFU4(&wn0~D*vQP`BE5753g z*KBGSm+>)i(F(7Og`9gFV1#*So!3kxpc`s!zmI&FFfko1oEU0np`;3i3btT8vu-6(9sW(j(`7fkc=mn{0vQF>T( zs~>bX9&9xp^k>$~hq1d7yMGk zZ0@t}{nSQl=TGxTIoD9rVcu6$J1bj{`UerfoT#Q!BmFJBbK3q~;bMUZ>f=s3ufNlS zPjjP(X84s@0~%DCE@P=3F<}%g79&w#cWy`rfqps|=D`}O1{-bB#Q(}GkKo!eqvMbw zqc2^I-YB)b+F0)1dki~#@I0?3Y9@1RcC85)MnhAUzE$w8yYXr1gO?=-IX{01h!_l1 zFg=jxN+vK}xk`O+=^7%qrsANBrAxX~0QJ?AnPXlNP2{Oj&p_9GpMEy_1#qPY1KS{X zR6eS0t5P`E@1%;*>6>!BIBWjVDZq9UegiLoaGnt*4F2uvHKR&`p))63UK#{tNbOQ^ z(nyy`CqLg7>(IX>vaX7gJrL0i!tM z?U~)h#+jWLpH)$YwCQT@ENP2F1mY^_pA(P(DzGf2G zQo(TLb@n^wjr%){Sko#KfGL)@C;e7_+{@=|5r62TwJIoJwNnz+zM^Jr1aYn6GZjlX zU?MkP>q{TjEJV?Mt_WNJV?tz?;3jusBp*zs7D!GY6cVV3rhlCm#)S(6Kkh^?YtY*Z z8M^>%W%F+q7+>zw0&hJ0TsePlpsK^soc~G7CMFOl?C^J<{{Nr?G(q=AC`#N0D|~w2 zMOqOb9q7ClU7&SYD0dhvtNicpz;Ro@Jn)Kz>{b$MGqANz(sGyasok?;s6G=lbo(UH zZx|1~8-w{D1J=hb9uK;W=Ip+vpV8yDh(8Gv$;_S=PoUPF2&zGL9zO6j`RDrQWCv`Gn#D& zbwvw|Q@=i?Z*oAiRQgE2U#PA-4_MiSViXgM^oAMR{+cKNd&@^=H2C`wQq^AX!WVQ4 zM83v+H>E(Via6qaL3B_~pHs5-GLbk~B)I5r0?+D%Bgx5zL-+l~InjvOL5@TrQhvz! zR_2MM^3Aa_Hg+#&(j)!i!Q%t*wcU_1~EKEIkL|9*mY{VH*} zB!TBrsnm=I_rsn&1`i|0<@14spTdcOS~Rha5=AwUITnsRIhmZ3Lf-h3tg$D*-r$@W zW$d-u=4Nm(T59`#4+wtEfPqi@N`XMjw@0`+@N5{_voZ>?ic%hGKQxekK7qk~V^a$3 zcetG%Xi^8r%xPvK!LaFXm)mPzkg@|>hI0Cb-tGSXhO7ndV{owCb@&L;d(eT#H8d`l z`P9OR7I!eSU5=IitRyM4Z3+EogE_9DtS?aY_Jloy|iQ4(WCLkLC z?1>4GvsF0T@H>Yvw>z}>fOBg{hXk2}X>;E9yt5!Wu@4f^2=s|Gq={CS>4= zv7I^@I_roM7$OkvU9+Dih0G_SbDBC=y*^7sn8eO&Adeq|<0x;GXK`-%_!DU04*Z%y zo4LHmh`EA+qtRfo)f3QFMH+^f_xzhXQA%iI4?NuvZl4Zj6rd6QnKbCPoJt~xCV}IX zFA})7^mkDH3F)uFZ)EHxM+GJfh^9&ZIr~!sW?l6IO8!p3pkI7m)}&}{0nA+qT7U__ z6iRD-L?N2u8iim8WH8$JLaOS7xAg82gyd&${;9hutMAxD!6a0Gy=_ED$jV63!vA6H zE5o9Sy0#w$Q4mnNM0x<}E)kXP4v~(bK~g{g0Yw@KsS!{>Is`$wWF(}!MVcX{6r{d= z4nFVoUf1{i_mcpfqWApkkf%vF+e%>I@Iiu|#2+SDtwh8@w3P=QhBkJn7R zf{oGl{2ugm>~RVYinC3i6tI!toHok)A-_K-oZf=+*{)0ssoA+o2&X}~<^>)3QuBJL zT=P4T3w;aVyt`?|PbKAsK;Ah6N1PCCS^Er)DBDEJ>9t5e=zY{z{INn2uN-m+S&5xu zJ`H0J4mg>#gmrS0MK+Hgi2vPxm6to}ri~C_!@PASO0K;(Ky4XBQ%&GPm;}Z;4kx5! zYyin^zlOz<)OitGgVmfK*lO<1%g>IP;^p;d08gRU_maM;jPU|q@Tf=_VaC=@;2^zN z(P0DQd5D{lx@v&0bw&-DQ}P4S4f(o@=>ypqUG*^e@o5PtVtJ^?oO1h#1CfUFoU2B8 z7YQS;hhL^_+g421$aNy8%B{b=bW?M_A-GY#~Y5 z5$pxLYu@D`57`*;AL+4mTko0uZv3a3j%&}%2DO8lhY!T5g;^!{WOvn?e-jwm$(pVC z(w>HVPEW7sMfflw;duw-V5mfbnxjN1#6Ak~9nta4%V_~N1VzFvVHP>ShKPMP75lpl zkaIow@92KFqlMt+%?_C?tL~O}dWnQ`aKXrON!7r|f>q4=y`U%l6K>k-0NyW2b~+6t)v~jD5QFSYl5cS2O4S8r z*+-b8|3XU|DnQGTZ>A?iL3R`fY)~eROjEj+bV75Xgr4_VLzZrQaH@WPXMB)1gp^a@ z0%4z?8e`(zyTID}VJA2KkjrY#X3bi9`1X_+(wGB9hN%AG`rwi8c78DKBKHu`iW9D` z1l8k%NXLXOx#@>o2B6f|2dO&F19^-lb9D4eKuz!u%8Jh~qQ`}EZ45LSBa0uk-w@D3 zHe-kBLwmk&fuF;h(+o94jP^9Su%kh2BKl;TmJJ9>8Gq!bUyu%s_=Vjjw*p7Z+ zYa&{ZyI{pdTFg4dr&{8ypylS&lV|TgKvRFSs865z>Ev!8$wq4m``vG z@Y6Gb~m_H<>lyzQ|ddu2#_YPd-P^3xy z)M5DA>en2)7Ib#fyZ>O#O|6bQbFtll@+n;-pu za@7Oxc#52*w#@$Dk?{X!tB=y{4fSQ{aH-cE-#FtB%LJ7prp+O+2gQVS;j81|oj2o)OWLl8+ zqw#_GT7Lb3k5<>s_Fe@2pekg&?ePPT#UA`<-AsBqb{q9Beb1KSy$zPFF@1U4cnK&rl7a0&iK@K=K*ec|%%nYeNM;6Hj5yiah6S?_W zSFSRfX$pGi*kcr--=8QbvOF)!uC4K1fTq@QJecZQ2es$<`%T1E0) zn!Rt=*h~RA;K{%N@3#ys6f9c5&JsW&SKpD0n>O;2uao5{!QG-<0Iw5pl5rOHr~h=& z@bI%wAh{nwSu-u*NIzP$fEZaoLn9Kw*A^G-WLEAd3(*}sfM3jn9%Op|c7gJrCoOzh z=0McXl3#sz9Z@GPA%>1%b}-a&uN7>QjR3ay@Ba4UO@X+2*V2Cb?e#nDMW*XS847Gs zN zS8O=HF?M6@^?IM=NmNe`6!V^(|F4+$IPK+zk+I|B&PR7vo>=m~%dC<9FzgahbNARi z03#PzF*3w8vqb-q{f0`d^q&Zv&?Hu1GR%ak9q2wef6D7MQ_o>Q&Jw zww|BNHrS&K-qX*ThIatq(o`jL!2&_3(68yC8dt?^3DmpiI7hnddQZfT5fOB!bvU(1K~7Fcq<{-stL9) zDs&+AoCEuNbId)12rZCqqSr&~sydnZ{<;H{MKR8z^dOjH7hjJnm4>!%A`X583IE#n z7FC(lpYZ%DQUG=4)Vi+`tQC;IL>Nl8^JUw`UO1LbXh4h&Y$D(Y2KZsBjg*VVFyBWs z*0o(jUAvFo^AX4hN=j-&Ny`Y|d*-e|tg(>K$7orRrA^Xyas#_48d4lOS^b>5OyFpu z1^~~D>y*HO4pt0Dc!%rq0{}Zr1|4>2`z}49;(65m`)r9=AYddlNm@X}o7BU47gqQ| zvo0J6hD1M5%Y(K+p!=a};n5qUd_`mmfbtxGBngc47f$Ocf_T`8)KbwEbkFN#w}Yms z6;MusauIOu4V-GvpJj}H=O-eX0onrfvhD7;a)9!|Fn~bfmNB+a7uxvSkSizrH+Zbf zQ&dcX#PPFVQSjUY3SqLt1JNoV5Q5ib5xOEddiXr z$~rWApllPff;Nn_|KW5PvAJ;;^`sKvfO zxvN6nD~*+GYEGEb6mO1SM3@r+sDc_US|Q+cdn*Y1qF>WthZD>ueb{@9{$N}rX@`2# zLg}1Ju&@X!+`cKr0;P&7#?9$)m5PFuUeEGD#zUFTrp=Mw;!wJ%ubPu4bm)nu#6bCZQ+L^z0`%d zL{5%c^c_$%_+>@U3J3&A%PJ+nWePuQz$}Z7U;R&OGH1Zoi!iF%HAX3lD*8eFo!ys@ z4rh6xQVY$4X^$srj0j%cxrocut{du*&MmY)p1fvOBw>MwN@CO4*40f=9 zakK2El_uebiC9%cpfKuowjn6T`2H_jOF@_c>+)5FUSr{@Yl+$VHOh6J4$yUuK(UB zt08i_K)$fTN*cb;4TWoMVnUbOW-g=`rh$o#Wbd#|K|SZ^XFtl|1?8`Xdw}v;M#Tov zFm@OjsAq>?^0^fYLLVU*Ou&fv&ii+y7eT3&N|63SNU*ml1erjE2KDK3LH<=?Z!RpV z3Zbu;d07TPd?`Q~bq!CS{otTa{99P?jk4+DY+Fg_x0` zdXHqkC~!h4i4d}yU~#r#FacVpuwto0~nQsGaV( zxwCh*U%&)lVil}x`F<~_pi0=UTc@G~WvBqk^ZnJa_x8f>Dt-Xt*ljd3oq|g6;JJ!# zlmQ$9zu5UDYGrtG%M6MN=zI>Vo)^Z06n%&|;>z=Nqo{5>30MK*U4sf4WzCjNp_U|t z>0V9*5%fg6jFnmWK35)3Ve^Bb2k05`4}((nV!Et&#uQc+e-bLQWncOA$G5UXa8h*+ zw6qSIvyaWqR(<6o5EwD4PBkSE;-BdLng()_R=2VQF0ILBJ1vIs4{qLqPzsi|kJCw3 zAAKN=E}ZEGs)wm@1r}Ftz@I2^v-I;b z32zTvXzIarlaKm5BDa1%g>g;>9<5pmP0Qt=@yoBE83^oPy*`P;vmG<27zj*AzzVy~ zZ*tcNQgi^Jsr{P6?X_i+lG*pAJ~+sd*AvbL>JnX?IXdv&K?gQQ8t;Ck4w&&G+-vP= zT`+Ac{c*B;<5Qq;fdA3Z=4>e~w`diE<{q2z1ZO*xgkuCu5HiV24@i#%=o0o%@hQ*Y z_obpq-bDt#e|EP(0YYNct?;B=09$ihUT%6lA*8Fxfnx4`=KJ*oXB!Bq)$3Nqyrh3C zu>-v?Q^869wVGyq;VwWb$Z)+x@{`qY^fP|W9Tzm9FyW1F06WjkElAo=sscZYUT*aD>LnIJQ8N|Go?nRd5>#6%!`A+=fa{{4L{dnUp zlokm*W#pcZCd~HC3q6575V_}bGS_U`jF+&t(Lfa&Fxh(1`U<5DCdxb$H`O6AM=IPO zq`A2!oCXuUsw%Y%I3dliC)_pr^f_;=gQ}}iK+Trxla)+*qWuGJ{Lt^{1;a0MkNODT z0#A$h&0BEo`OQOK>MxHZ7oI&Oi-4a3(BpK559gSFFM&*lKPBa5I=R*_*)}xJ7Eg^X z?&=}m19gtbwMD2-3n0`G-%eeP*To+B2sY7SKXgC}zxH~BI|69HK*AH0Dx*V>KTk%z zfb0o696g>^o2viG$^IVv12QVxQePqG|4+#+HQ#?>~oS3n$^bc~943PMlW{yzc!KF*PV^9<)r< zKQwA8xZHJ|2o+>&{ydGd$D}_#0|hk_+8RZhU7MH{G3Sy-qZW{X6jpH29r4hetgQA) z#ENg2pjdxllTx2!a`?fKvkz^RF;B5hbOk7f;aDwKge4&mb;P;*rN32L4%-YZ4~#^f zn%sJG^fG0($_G|^Gu=(ZDg7&?|;un?WBvRjyGWT7|(-)uG z!P585LDwh+XZQ;&XtBY5@QLwqj=n2psi$h!L=ShI=xM}J9{K42dfEj#pnTk)b{s3p&1E3DhZ`~e4bt!Rb_P3{;3IVsrKGHS z5_Q0Jo(Ej#xco;wL@EKRaV+?M3?rv_v9j1GK4j!p` z%|7FK2AUVRUy+=bf4+IWB2~9vw~XZ|Q1M1CbVNW^{Xu+$8lg1;amw)<^c|QfSnO9C9Bwlp$9GG!B~|FyLI0-W_PK$bc9*H7(M1v z5$8XpwQR8fg}zWS3bgAhP%ut&?+=q5{%oFaEpFW%L@rFA@@I~kxH?x~bj%_m`%hAA zi!M+7i_w-;j6+t;smK!{-ScZ9YP8kq_>^gVE%B1wdq< zPrUk?uh=x43BC7S*YZFnhz}Osrx|!To)=9{#j3VS!)AO-912dk3$kOUJ&;Y zHTP1KXj=>`FB_|qOr0ckPFlmghH8LE!< zT82NYF_Zm3p~lV{loE^%08F;gDf$a5;+$4yLxJ-2`!I7(ymxRCwARKU&&KL^{J3t^ z#YflN=z&EnCnWd3jVk)(ZEH+^1(#}c4s3w|{;jI6=c!Kz0DL`CY zP$q1mb{&SaK@y0Kb?m1+XD=0C!@7X#WWb&18^?(u`>4Rr$VfbIZH58!I zrpJp42SfJ{go}c8B#)92gq`q9G+~wlBKV(`P{(>u8Lb{V0zGW0BV-=wj*2IO#XscQ zbZ*NX5#BAZ_>cDfyrIzySMQ9zVC?RA)9lcWiQ$e^Gn z1G@!B4(oT78`gK`<>JN?hId`Hc>uksOhtA>Asn&hbH#5wVdFD&K`DL-th|Zvcv0)U z_lw(1p>&F!GLpIOWsX2RX`eqO{4h2FP{`vuP1ICA159N6rqm!%dgtagcmMO>@(?{L zK5}u}2VP9^aa*A@AaTQI(s$|Ew9#XDVge%K$4t5APc?!d8gKw(rX{4;_c3-=1lB!Wra&@EJE;Ntkv*KrC_ujk30R5PyS4b_a?gk=Zp1J{KLMfXBHz@b zfn?H}hj5I!B?HM9{n6dxgmTVzpECM**s1uIIP1B-6!~}lz{j%Hl#Gpc2JfGkmG?Zk zlGCv=ki)kwW>Wg-PV5}?H;=*J2+9GTG-oC>F=l_&kU?4;M47)xaYwnSDp+7}9)4Tpl93{34#$sxrUxI~cLn&N)MdfJk8rrhE z{1gAGHmlD}DBvhZ!6gVtwCqrQs%-xf+mzV9(oTLc&?JYY15!b4A8fvMbhp;&4mI_p z$W+t?2pm;y5q?`@4DH|!1Z_xVrh#7UD%J1ARs<>NUkmDFdO!or*X+4NSue`H4SLZ8H)9{& z{rkKUs9|{Zc75nZXK$myq3F?IY`JY;53gOhW;Mm8Q^UYZyR^mjlM05D8%(e}6&aOovcx5#k_Fw{cgn?Atvk+~i|ou&?Ed+eCs`2o|_tNHGG6 zwyVOW7a1N#2AbU579Y~rq;T-dL!7!3=@n~Rx!o3tucH3cy?OsIOpmeww_ig;7|eH* zVm$m9c*xwvDN=7;q<=y57MG6HVCa-*y6{6~a`WXrgbLh-l9Z95RAE^OkE3X#O@7E+ zAOT^G^4EY7N?sI&dkTQ8{Kgx;wrfUM-?;CBq&o!;qFo(Ca7N6bGd)1#h9(-oR#`zR zeZ?$g0hghNDq}pCa$ot9)$Zzu(Z^iF7@)C;uUxA;#^`Zg!?_^Z(mf z#67uYwm7^tbIyr_Kl3DHuxiXymx_a*5M=$!8BusQ$Uoi$uqa87#tO3N@3&hKT2REZ z!N0H`q?Y)j{%d^s&K0mGT_@C{1~ihK(-TfyKxIrpVMzJk4-Tj2Fw@l0v{Z_8n~@0} z)bnXe7NG0O_(i5t{k3V8C{K4_C`lm^LC!2^#G8qf8dQl58@lXiS!dj+r(_94VX%G%@L^mwqm+5tZEeKON}8P{=*p6xcc;T^`0)mAIG z_?<4dTV8brU=s;wg>*$WB7c$YJStTOO0IY&b+KQN*t!y4+%lEJNiZS$(zC|`&iDkR zx7L_Cz@M6+z!}q&T&O6#f()8ugVMzs< z6dwR{>SJei>??tsW)>(jQ&7Eb4f2SUf}i~TGIhr`jBdQnUbX^9LfPEnM0BFVy4XMgEIPIhAs^k+~0x_o-&b#gQl&~%=0Jd$@iSnVs@ zs%#<4u--3{`18k%y=+BK%8?jnY~_G47H5XL7_R&f?gnAAU z1J$$g?Xo^QX^UlRg^z1It-$}@7N76es#a{<@%mFua|Mf)7W|ykFr0g8!X{Sa5^!sq zu5E|PD%<&E#uZ&m|AwGdzJGBZB;!=t(Pl*Q6)Vhi4;YT9I1||4>a|0xX36dB@I?ds*iy1{l8)9 z{rF%q?JKhq1N~xOcz(oCp6SeI@Es^8;ufGbYkv1X3-|mW{z79kI8O~%`c2M6pPhDe~OH!Wi9^wPd2ad#_^&;_G6L<>nDtFB! zlemJkCbrRig3nC#sLtJvs-E2?_v>IZ%zL`UE|3*mD z52;4Kr}Kb&y}z__W1H^B%;{1UC^tUE%%EbLe$bt_)zJl~|Cwx`Y%T4ot z@=TYd0-l|W`5+@3F^cGJ{cqah3ARPDm#yni&fp+ z6awvj1gNAy8Fp;WFemlYw@TC2xoQmx#C*7PIpim!oN3TivXX)MmHkE29joWp(#xj=AiW{OOLC~2L92&*s|z9GKEBy61I@F*=6j}`m;4|RRNZMnr~21$CFocam`Pw zlcFdd!3^nggf;Kl^=A1e?u5|V3Z+oYCU{|{SG&H=3q68&tj-LtpljJ^RM7Q!$q)9- z=*aBl+O+JS8V)ULkgt&(J8WDwq&JZ1F9ga{q=KmUm?k7#Y{gXdUMFQF?_Yieip|~` zu_H-USk{~u0gf;a4pa`zsA;NEkh}G?tdYAqPd#^I_NE~U1sXO zdS$~`>kYJ^x)n@jHjx$>USZh`P|-}<9ZJ(_nf}C!A5SsH3RE~rfNRdr@KzLiI`SWb z6Y}2@iIkJa-H`AZ`63qjDEZ+7bacXeP@3#3zA@-Q{NE%vNb!&IFOc@2gIIJn>48F; z`hVER{H=4#N9*OB)0X6icPh=g3 zWt4mRN%C~{K`kolCq{1j;!8FsU*5l18xe-LwLA@@3hnHq1MvZpcmSnjA|^ixa2Fzr zhf(ri)Qc4IxF_r=zuVV!U8phw|L37W#$pTPjOZ~7_WF?=Vizdi1WaE3&p`8W)2M2w zEOGdYHZ<|dK=U5{W$!={V*fon9;Gu5{713NIF>8o)Qam9`(Q(ewtGW{;hvnp&lqg$ ziiONN8Kz{CJw|Em8Uu8Ja>g|6COm(v5mj?mmWH{42WnQ;{oTV!A7>aIf&qI7KJs_J z`zq#Kjtd3=PXrw%vmKPSmS@Z#2u+!H9ej6NRUUp~mVASR>?$j9Fo#!qbBW&XU(hrs z2^%=FLJ)RK_qD-Rm?Xvao5n(e_*n>)rHvMiwag1j(XV!zZw9v-g#qXLG~PlI#!~rU z0P_*Pz&DmQCoJ)r`^NWwy_~=lbJLbFmepFZqHflU-$;B7w$6G5$CB~RYa#Eqlo!E9 z1T;Fh8oo6+0##4EOAG@1&gD;b^%}Tk)p0?44TD-~q*b+f?mam=3)tC1GW&>7UJo3w zw9=l99p&dadjRHmnDEAQca&<%8lb^mBLsb(R&)B1*g7b{l?K~PRQ6&>+M_rD(&1ph zzH^qx0sY}3_XsvKzoQC20$D;lLUeTY+H>ALd_7O0W&nrj+t@%Fq2rVZLXdnoz$*Or%OFuC{2oO$f)Dn zGM~$^>l3-S826!OV~vvc_R{v1q9G}Z%U%*ys2U7=ad6yoA^t01E%)y2IU;zBGjF%u zN?1%7B?XQuNzX7agV;dliv-X!jf}p0rh4z}EJDHZ>>Y*_%q5>FlyLmpbeq{_B4%hP zIR=eB57pj2$yo?_#ZLONzN5PH{&-Tce_H8lH47VNll`@vSdw_hh-H_s@l0ZsC_Mt* z^K`f*#8hyg_Cti8r!W_^0uD3dj4Mdqwq^HV_)fU9hfZUWLt(NJcNIcnjikH!siuDlZ7jux1DTye`;EqAII<6Yvbb*$2l*O zK+?E4KVx5_M6g!PqMcOrbU!KZ6}x|zvVKK>9F2&}ksjqVO znt;#tL+$h6l6s29Bo-%yZf3`<+Jv~!qmwF?P+g;iZs#{wy(e6#P`{(nm}k0OsA?1a zSS`Y5iCv4$4Gd$bg1j!tph@uOz}+b+ ztJCcEXt-J$6?h!pDHTD~PT77Ug9<|$>V-3gL9aB2Wt-U2>4xw1>EXK`|-dUD; zAt~~8A2O0APAV}erj|mT!#LxBiv(b!!gf6;u5QMcCPMq3)%9gGrc5~!C%-DLm?y7 zL9JwAWBQEJ(0mWf9m7g`Br~hB-3XC~NIUF}GACh%JB4mCEY~vd?TO*?VIE)t6=U-8 zEFyOC|76l$Y29)%fGmS)!jz1F_G^Lj`=za7yckc>D|~X+X=EGQVKHtvXhn;PGxk^Em!skKz);G$_VsJ?PV3J3z0=y0`N(P6lXW%be z9GWPjz2+R*xJQ<;{Jt%6cyCg)u8j%~eKgYh4eR zrdXb9>OrM3du0X@?ep+o*FH%c`@vQutSG&g{xJXVpG6>9Krpt>kZ9XTfrRPVw0nA=5?62o|zLONJB>tMfsMzfP<6VZ)<-E@Z?Or zYQG%zsJ4-WrE%v>r=FRV^L}#)6KzX)S6ccs5=6J_RWox}6+a26d~C~UO1d5|6_~~F zLx?QN@QDPVz=Z#m4pa6 zXdGMT9c);XbehP*R@V2xf>kQdS)R$_-Z_^<+@p?(S6`)gnrf=L%{^n*(RQ7~&2Z|?xDQXTc-I@~_L$)~v9Csgu`4JKeP&F++ZDPR%qonZV zqZPO}<9%ya#}lu(X%a$-OuyM-b(@Bo?4DN-dZ)YOd6FpY+Dnn8s zmxce9L&|po#xJPK-%i*@2`BoLiW~{csUMaHv!m?hAU}YoN$(M5>YpWuGYq}P2kp8Q zi!PsB7e4MOG`aSxGxw;piOE(DynPMq)2%T=@sh9C1A@t;D9#ekP^(*EXtl~=!@iP> zfW$;%wOZ*uqh${E#^cIE5Hyn3|1NeV*#8|lw_)ayDI5p+8e_F!6A}Eur0MISqVY9<)ulEFPkxKjXTA!hu=<4_yPxx-L8UYjSOcb*lNQ-<4@u zyKLzsa+mV~&3Fqmosi5$>DL6>6~;#0h}j`;KTJU88gf^sM*fr@U4$ZU~w0R6t!>I665zk&3!h5YW? zJE1JITWg8AtSWyARtj{klD^XmD-*{qnozV)V!HuCD9SkEcU1zEATG^0MK4|jozGKj zXL<>=^}D=*qsvA@B&C(<5XrVKq?-p`3t;mqxsCL0t=`^``I(8oA7ciHM4gGwt4d=I zGX}6%rc%*+=+sjG6Hx|Q2S~SsR>xv(CN^!h{2DuMui93tXRXL+JUN*=ZLO;o|4w|NzhTg7*m&r796xSN@7y?<~Pn#}jHfouHe z{_x;3u2I5%so8Gm3kU0MIY!LxVbHB^Cq= zY71AhvrRK|US3P)a@xYvrEPg)u}jwy$!1_ISh2}o=vfBf*1h+plVb*OnhordY7_@LtPKrFQwdaF= zc;!f!e{b8&){8Jq07SmhYh9sqVKXcemCQcz6fn{w0a`$$1$`<~djLH#P|hB^Pb=Wh zUC05N0zlq8vy0u&`)sI$uYrn9Cf~vQ?j(@#X(1iHoe%ElLl-zOp(|a*L?Z>_?wHu1 z>ewvzwr)PHy4%WdAP*e#;DMm9=ucxqLC|gqluA9nsXdj|wVArW78HA~NC-&V_pe*Q z^E4uR>o0*9;mn3t{%V*Vyylq1YPuDwK9qTkWq>ZwTdzR}DmSmrUjMGL8b&y%65$^R zp%u{@X;_Ds0tn-KdYeOXgzxM@AreKW!^do@OVS!ikvm{}1XXi!b%mWO%p|Ge*OH(B zXcn(4l(+hXQdP^qJA$D$`RU>WiN?SUkH@!J%~Q z>u#NDElZTXyuimR>;+UurKjI|X`jtBv_jyYh5Yv?Exr6rwU`ETcvSfZYH6j$PL`SA zD0?dQB>0aruf5%Xt+;KK@?Dh=KP%}{Y&)Z#A9>a1$nN+3q1&R{KKB=~FXo$(Jo)lh zwyC>m=gFVFQ=avvoebeoDjk-I$b}KSul3?zQ$H{?7TZ7l3`$y>{OY{4e1rt4QpFRG z<(jwoJ&TNK^0A7?scA_3l2@1=RwuoGGCn(s&$D+@%nCuNr^ z_j{)%jMJW~L(b*3nmoRM#{#p>cZDxLr{rPY)TL;P=06pO(pFx8(5&lkw~V`Cto#kM zsT2Lg1bUT@ZC1=)Emg}{g3(gq%m^>NuBG>=IiM^Z?g6=*ZbKN`(#Y(C3slP>_Kne} z_-;;#OB67-Rz*-+-As=)7i2xOL8pfg)wX$}AM*=&;oTzQ<=S%9U}TX0AL4l4SAfq1 z$U|L*YKFxpVbInfLfjfj)cua>QQG?!pn>r7{+fUq(_ehpRVPrm$lmfsgmQGE8xV&&Pq$Veim$_ILjNGsr7Y_)~{I@s}&E8>hkYrmmQ6&E_djW64h0bQ-Lw7@2~<;=J~5(+<_!uLpRF7`aN zekr~Qkr#aQAy%0L62;a|+M({i`piGsl>dI?UNv>M6xu2|`*!lRkf{A4k?aOzIjG4fx$PviCXj?yRsGzbNS2Bn({ zk5Do3Y4_z!8Qru77m~d<WziOb|dg}^D13c}rCba3(z-Xk0<;ck=U zJK6>;;IB`L$8oRxyB$6zhwU%4B2{(du=Nrk4rY-s8gbRWn7#m>BgI{ty?-&a`D&eQ zET+dBzDC4tEknq#`#}G0;4Kf4r)Gm#fL9VbZfthQ{EN2NS1AGxBs*j{ytE7-ZI(*1 zV?bBX9Y)tDsW<}@UA}6+AQ&PPRCXt}scz0wLRl+--#PIrJ?$?`L5YTdp$2Fmqf^Ia zCQRltG1%{8WUm$l_?xP+8hA9UmPi8tcGm&O%ux*(j&p1P5Xz2GuFy<=237i?3IG>e zK&gas@`H}B`p?X4I>sxmjO=v=-9}DddPWe?EEa{(azVeP%*XH_0Gj_3L!}m8Bnc>- zga9|i5ipWpdMb(koh+Q0vi7p1r1Bm+#-#ebTDHV&_ch9gqdmM}P6K-CR(RT+xQ{kn zD+CtmSykKG5NT@X20%O08!{^A@fxyxYs--KKdWavp=6yuw3_s%ljmeR*;f34U|CUz z%(@p2xnAW_#sv~eSTdD@EhL=#3nEyTF#-_GhG<~RBpw=Aa59G%wh9dgoW#{*X4TJ3 zaYlWJRs&+WfgZ9&3ccJc0`M>$ z{HEsUFc9I}1juNvyxD>7mL$JqGUesiFc~jM8+;e)2ph)m_uOJ+Uj-F17gKmpbCw-6LgjVjtOY%o0?{VN;rs6y?F5-t8G`9@?5eO z|L5E1qb1!Z??HJ)v_Y(v@h1Un7m<^f|AxllTQ`vE*nI^1AhJsCv3%L2s_m;(y8kXF z;R1RyyU4vMgI+Qqh@=rM2Aen!ed@e;Z?()4xlg84hybD;=+WfG=ovM>??qmh`>tX> znk4?7$OqHMv9)bk->llYKK55cj)ryKuqtWj0Eu(KTjWBy-=Q4#v)J0@ENf|&Ad?8} z47RJM_TEO%VzHcf`%MIzLNCmQXHOExjEd5yyiF5$=cUMZXnePgREsU@4S;gKrQni! zsUUe1(*wiL@HO|YNL)|!%7qdo-kY+7g3<@FEbFg39(11LfK(2)@=u=m_4Jha>Z(Af6c&#vbixCD+WTW|NkZYFvC^5(e0{FFfyoP+>dL+DuhND-5KIWL8 z8iqk{@Lh)tjn~)YFJhoQIiQv60gnEnFRy#?aC~~qql8G}|A0+e#v;9`IK{>6nrGI} zuU1bZn9Uac%5ZSY3&fc9qGDjw%K#*%%H#W~bwye)CW6Ih4?g`7e-_v|XS543h|H&4 z<*3KC0+eEjNYLEUSXfZol-A5cYp~(kCzpm2_Kz*SULVs^ETLHkL?-Nc_pqH!;SBo@ zBRiNy{UU`?>o7Uzc=SdEX-{&E=odg;hXyajmMK*%WIYER1y4$aJ0;_ogmZJejzkR=X?GKidpum^%XOaSFXy)eFs??by1W4T`(b>$vL6{HUHT-CYK+vMP z+a7erT)U~CP`KWrqGISiY+3NCQ~eEA-RwHG+x#XQ zOXt4V_dxc3;j&(ndc|sZ+J+S%87smLQ^I0Unh>9ET4WcL)iJTk6q0VxMzy^Sj-zX% zH_0x#ll=JX%hguXZMxY;iJkO*|G&F?um9ZG-a6Zz%B|Wy+us7R)!Q)v3o|iNXL%ad zD=vR~rZoM4zSr5@+$s3V-{<^jZU@6^(sZy;cU*V;t=4~7>Ro_;p7_I|z|zM>=l=~= z4IakSWEOhIK0IKw@W}M5<{UPWqp#KvN}p?oc}1 zs6Ds$7#FUmUZ4+?%@q)P)(!WN=8Tjiihz`AjM;+|1;9^Y*AD3=Zu2V)(uow*2nS2kC52_GrBSslwv80U&)PvqqYuvEL!BlmeERIacK3r zGO^cK*wp3tz+z%=61cK_xtB1e0NW}rBC zg<~FcNbEzBI_gS=0?x8lA)~XE=WP}V(+7SDd=L&Z4)7a(kGh1BkP!eeP|2Kh*h^Y? zaJ}y{>$e2m!RXYO{F(cB3sc3y7M@3W0w%;Mm18JF=LCyHG`B}(!#p}$Dwu$e*{9kq zc>8CU()RL-v$RFdKo)w&MU3zIjFB*!hHN{C)!uYl2|?rYG5jetbODfl4{? z-$GGXYYu)MB5?I^ps7jI46lK}%>8RcOd-yhZ=IJ{%g#dgf;yRa=tk(M~muI?#!XHOF4?9l|@^mVC8wle|_rD0zL(KRT}`AdTvhTW-}aIqbFcDaL3`I^zPLKbhnD{{^{vq_G>y5MVRObT14j7j00nmj&{6{= zTZEzYIP<=<`yNnFx<|tM47lry^=YDrLgO2(EE4&tK#Uq;_(j{TWLsL4ec~V3P!VHKK$dH z7|etsv2UTW??78Xa%{Ez{T>~=k<8csP#}w^WfQLMC_E}?@8e@~txn#k|GK779v>Hg z$Aq*}H7wU=(2g)+=>SuR5oxu_R7KK8I=e6b#9Yt!Ap~kgG!?eC|3?B zB0@`TT1~;X72${nxNrg%6^v%o7a{d92XEuug6TVvS~%4HS_Lku)vW9 zG?sJWX+@3qEMPzVox<;4eE@%G?LP*+x7;t00M{CjCUO#Q4yQ!2B2Jl-Z*s(C?Rjmz z^#z^4E;fG>r*TXQjsG4n#*hQr2@KZ^Awx*dMNScTRsw<<5<-%1;CttZi@5Gp-_Z*? zEnoN*2}1j3^x7h&zcOK6@w-MA`$R8FpG+j+a(B!0t+Ap3LV?WR)Zp;}*NK`KS40*sW3?yg?+C1nhrXKwHH@r%2cF9LLYFMQ( z&jipkK;TYm%Hr4<7!h}l$E22Rr7W9hXBh$wH_#2%=SrFDVE~+T6G{WK*|GXx_N)w) zC(HJG&Dl+@%{a$rg1pm_LDoa1u$QBk{b*8&Z@6q33Q(h^lCI#rrg(k19$=TzhxJapW4`{2bplUL4m+=W?4?uE2|Y+J&7mkN`K`) zK}SNObfuRpYA_5V0D}BANf9N)$uULsWM+6v0QQb$KLAX!Pezvl2}NU}T&cDpyYZe+ z@p)jXb!I>3+tmF6>oM4OCVM4RKds_byx7B`0<9ll9S9_zN!8V|1VU>Cv_+be z#&G`EaSXOSdd!HiR4NYQ6T};HIEE-k=#dK?SQs1A`DyK9QK3OIOroCW*p@T(FgQ9d zJHMauE%L>OeC;zBvyMb>J?C>DqTAP{g>`u(ezsG4uhgZy{E8exhXHF>&eS@%iPSxA zhJmGM=IzuEN#ibYhA<{1KR8L~yiC+B-DC#kUx_5*GWQ}Kc=nMp>h@epA?x7zy&(9O z*gJ$x>utcLz0{uCKv^s!Oq;h@yvQ%`Klb2TjPE&po5*k90 zavbCY72mDhWq$zBLHVz^!otX=P6lOTGjrB&i=}B7`^s>0?23YbQ%? zm~ts7rQW04uy{!yEY&0vs}BVFR796oW!)z4249aqCpJxu4I{6Q@VYZIe5QYK-Mb&& zBA1C&Ch1B4`#H+CjW9QJI`Sq+KSI|irtIn^$+NBi43zuOd_~&&S!-~Mgn<=Z{{yS3 zKlA@k_LpH%z26%+`cVmKX^>JHl^jAqRJyyQyQKvQ0Y#)i3F&4C>F$t_knU~-q`Tw) z?7{EvI_Em)#W^owX7=pa``PPR>t6SLFHjZpL{wCT0G10>=Sn-HBM;GoQ4F_LAft7d zK4X55_qi0nWk51uO`>@Y?_r=*0xv(s3zv2_6{O2w^#vaW{QQ!#UAW~Dg&xyc7TdDO ze(+w84?7n$_`Xx377h54lpI^eb>7bzSpn~u1Hq7B4D%1Xd=&aE04N+8oexeW4FFqp*LeWqSN7K8pdHFZA(Al!$saK5ks@pl{Ly;BW2P>pTv95QO3*8t& zrz2u;ENGrs6W~NbncOqCR87)=5m#G!f@hOplUA zdRmAo;(CD1hQo*(rKVY3{#HN$6yP(Vq@D5W*w9wEM_pX|mLW^C%+xO;JXyIOy86D- z&NZTKnY||nfRIpf)|KDgJBOPx3A!5y+>5WUi=GKV;g+LCj^2E`U=uHdfTaMu=ZJ3J zwCIC-bT|DU@V?%CE|?6p%l<-{MK z?_|I9a&y1g-MwBaeBW3HETK;i@eAk9_hznUt_*b+uBduny;7y%+jYu5?*n6<8-aMZ zJ-p3)i*!ButZ$C;=IC!$pWaKkggM1ofz;mQ%Y(s@BpH^go@N%FlEu*#co5O9dp^zK#fi`MtV;l&~w)=K0++&jCVEc5&UnB(v$=0l3!bN&zdgBXUOD3fyN z=|xuCji25EEFfes7-;kvzp(oq;eI1hs3%xVlTkI?{Q;#bGwl=%Xsr$$2Y}z9X+cp9 zH-8L7M5~}N2zmU(*%WnbxjeEN-*n!O1JG*IOw_mF1Zme`)-!x3nt5vybnn*#6I(4w zCWo5~V-CA5YmaI0t-qhg?zQS1(EyyYzufATLrRDxeFDomFNDVHUWD0UvUi%M{ml~} zx^3L?_6H^&muPbdw?nT_h20C`xO<0Uv5|0>AJfu&%!W3P6fbfI#;8B^6=2d{n0mEg zMSQ2}sXA-|Z=oyxo}?Ij>3Ao`XpSmvQslc=W1u0mj(GsK%y>=gW0BZ3Q#cKnoJzb& z@XI%i`8l}Auf+Ha#nRpz#7HuUBp-p^EZ8JLb#21m?c>e zWHEt_T{eJZFadPNkQ+Htt$}!HRb(+okHp!u%_o!ZoI&QgKgK>0Kj5kL)|U1+EWNUe zL?8rO4B1GK(7xw@nvRZE|9E2(xi3JHm4|FBz`v@kwv9}sxqdh3MFUzm&9c7c0*uB^OOzaq77nmQWZS`5Oh#s5%RAw`Nuaiz;Dxg!yfAynzT) z|E?5LEOZsP{aVZY;(!En0^Gc4~;tl9D6VhJ^fC<|@uS?9 zNW9~d1Zm=fx8<6{JFZyCb{~a9>TnR%?}Lqsff)14;CkGxx`~>X-`33QNa3k8V9U^w z0O*;1aB`2D+2*A;=u?SOFN*GSt_R~Ptm)jae0vN%41g7Y;f%s8+SrN4B6FS@^bq7+ zenHMQQ9=qEe)2NMk?{|4`IRnZw>50JIXTwVrEil@DZ3ek^43e|4Txa!oC45t20sV@ zY1rc*WHE^3_FLpxfT=dQceHf6&Ftbe#rcMn2&N<{%e4Nh?jB7>Ct;{vqe~Wk`1yoo z+%*6MI(Eok>hC1ra{|3isaR@mtudks5e`@DlQ9jR7ZfHvdi0Y0Z>mfUH?0L064qSm z)P6jjhCFSs#cOjTseU1E{0Lo^u!4L=O&#&hcqTzCL7n_oK)lk`N-q<$%G6)^OkU4d zv(*Z3NBTSYP_}Hl4Xc5Hr*=bW_0a*y5ynOtDI&07_4XB>u&#Mp_5-aIymDhg9Ed$g z&zw(LXJb|?BBdi8lN9qVBC0@Elh18;^XY^0M%OcRaiH1J>~HAmG@U;7f}5`3+Bf}Tv2*~C%|yeeD1o2ZHFfYg;ntTK|pv% zkW4Z!rhvDRW9YYkT$NJko^G0$_{peFh&g9NOH53vMse7(9!!0UdgAA+!%}5r&-uHd zM8$?yop@8*rY&#v2#8Us3Ls)UY^{P?zt>Ia`)#JK`-{PJQ+t|%`p6w#1{CNHr7FHu zen~03}R!mIVQ(Y2Ud*??^a}`%N#} z3j!gSF(cD8h4}?3zUUfQ@PU}Zv2xPd&80s2z8^r$X}_GUgZI}T=K1Eis>X-O0cNVp z79hGW9!jQupVADygfF8akM*v-hH?5di1lbfpz~NSW1-D}+vlx0p4{nC>_srZn0cxk z_FKG^(dZ%3B!9}UBPduMTNy=;Q491jW_|dBxa+!P>7ZaC6jslrlaq4ut^}KOUCsAZ zduy@RP7$48!rPaNa?;LRjp`{T7j#7(u@8oW%F9=i09RSqXTz6LZ{!t4@VA1Hb_TJw zzv_-hCN)|}y^?U?ax{549LxIxQYV5TQL90*g_4R|gYr-(g$aGai65U)*~(1>_`Z6$ zifb#zER-aE%X$0uk6{zQ!<~ zD2)awqweMIqigd>kSRhDCvI0>hw) zvGS4j*12v1IFbX%v02AH4pL&1Vvb2E4xm3tS~Khx$a);axyj4 zKJ#sJh^#uhkATRCHH@+XNnz1`*GRXJt7H?M?Ft&XC>bUK#4fZr~f$YifnV)aY&bzTR%^Y7q~syg32m7oD35^*d6?01PTQGk@^c8^hVI{2D* zpQNTH>%7%?RYeQT;Ik}XbF=JU`61iH0I(&1YjRFkHL34@$@eJ-k^&JV_M;wK$!3B^ zFhACzsO%oSv6BZ9)J8Z>)7CC7y+`j}&VSvy3>akWzel+Ev6>#+uxM&P93av^E0)}j znOklokV|T?KTNY{);UntVN&HApvzopisUH<*pRGeA1lg-Q^j1GJ=hbY1Kmbl1{Wtn zBIp}p05yD*@y&>&Bm{yjh5-FY@BCB=lP02|0nHuEFC4BBkD!egY*Oo&);-HS&iVHc zzf>GhI!cckqW;Hrk}6eUR=gDZ3CLZbp3CSv=;_vR@?Y;C1v!v(mKBeZ=Wdg0TOA5# zK4F>Baw~ie1_%Ef?f7PHULmJo7MvLKjwife2DHC(VElrat{8$4FAgM->FomYr$-#MBsOIaHh?Q04h@GA1i?iLz4Jx0D|=l{SDo zRqL4Z^6Ok@DY^Y^a(eJvAaahf`Ujv5l371J1n4og9>~D+-C&Y}^=kppoyV*WTL`D% zNsFFA&=^Qb3s7LBU$R5XAlw_&yO+Tay6c)JHc~kuq#D4;*6qCsee)xq1^`q`(CH7# zQ=luN)DeNt6y2gZfK1ai!ZqoWnW2gRqyS#f8)J+$>O#9^6M73Do3n7jT>p~SQg)C7 z)nquxKYSC}EIay(RpP}V$`C-<*I34R{Yq<4{%;pDHBXaJBYpx!F+kWc^3>Us@l#o~ zhQ9L~F=>G~EK8yX!22}zh>sr@uy5D(yONwUAp*aev1|~#N=i|uB$$w8`v|yeV(yb- z@c#5sn|=Wx*4cf92Y^BGy9gh3`+pB0yL|NF`P{Jyg^K-$(%`KC;~2^OU(dNgvTiKj zVTsHxTFl!=l~`~c)ib!fLz3gE-U==3#Xhx-Gc51gXlHI`5Z&ecmBP2*HOLowisl(U zDVUN}gTFaUIB7P1`wb7BT9+M&?U(D0iq#Q|l2F-kCLWEma*PF)USKfKUqfbQkj3{$ ziYL4nN*uIgT2$K%-TQ59Eq@|n0JG^%c;bwZ?AC9@&RQ8$nvq$;$xZki7zI7`AO8gy z%&Fb~e=wN0jHds;^n`hIUmf4}gx%D|u3FAk<#WV-Q8CYNLV-l^G3;b2@4VLJ0; zbT#5l88r-=jkESIo#UL01l`f-qf~Y8>EhUDd4KS)$;q4xSU>gmZsHQt!k_lYsQ(3O zSbb4~;DQOJ8Z2FkEPKO!!ngk36K9sI{4v7;<-ovv;aP*TxYJSlsHN%4#TUcew(Mxi zj4oS}>+9VXO>zV2>glog5wrCJg#wZ~`Mkg6FtpU8Um;p)QSgGc@Qyb)U!r6z1|9)u z*=0*&eLbkdd0R<%nyHHIFN1xfGc7)Iby!d9&|~#{B|zEpLdF%xTRr)MLXpJUrA(9z zSd3{onsLr_Ab|y|FT~J(59R$aYwfGGKk*3%_>yeOKO&FlGN2lcnuVE8eZ0{mFJqn7 z*_7z0DqsXOzL~z9{!*DvX^hVIaBMjhFGXC+yn`Oq^pxfRh$A(nRTlsks!SS`6gn;iW6 zVqIcD^FPA|((kT6CxC6e4K?U2dj&r7gqNLpa4(4qsfeRPc{!jRx0vv|wkr%{cQVMh z=_s6xdBXD@aD|7+gj80;_Mz0>6HcLguqD$ft5bU)!5G?-;Li~y(KA1M6fi010PZfp zMz*q@ib`qdLo+F8M-O=-0@7xSt|9yihoe8UcJCncY)N+8j5jf(SZhU*RV+)$_KCz?AOHd&;;1B)GOf1y66KUC>+HAtbwPMb-16{>Z)oic^N^Y41Db z>|d+x{6gF%@T!4Xf~{)S611xQg93kjF{LNw!NI-C15Wi+KueK*>LLE~HLMx&c9CCB z7H{bZOFR%MeX9rs%%Dd_-Po!6*2E(_K#g>&TaWm*QydTo>!>UpGdK+S7!=M5#qBCd z;;ww`um)G)-25t<6zaD4CO&MR3F%EU#tbHgG|#T;L5UKY6jgwY3bV&8re=!M#EBD{tf>W|<}E&Ob#k6js1;Kr`vXJ_f(Z{`;ii$6X5*s4>uUx0 z5!VzlK*(;8)M_eqxUZnD3o`En86Zpug^_R`5Jjh;eg?!zICeg? zxB%feEy%}BTZ8i|oW*>;99ym(p#fXs@LoXNce<`HN`Ceblc@_0zZ#6hLd7YeH@0^_6#N60= z-MqW8JJ}mrnyKZvse4s{El?L5__DjPDz(RWGVHptYz7eUjst7-cHnRZOOECJ(U82@ z1G-%0(Im#d80hZ4+Ou{60}L3x{vHRefIu-Bi&mW)#SCcJ$c1QHAncLC#6eN1$&7)p=>&RCi(&C<{L(Nk^g!F35RsWAD|68bG><>C(;Ri-;*CnbYkn?2S zhpIi0Bu8!4HBZ?-f}G3=OQ>g#OxrNCQnQS(rD{kEz7cBRUxQ@HM7jDGC<6eW)efC( zK-~o&6-vp+)Zm2!pGV~WsHwBgfCsmx5fGmn#Bhj&?_x89DY_u4BueNx9@Heh6_Q(* ziN=rE{C(?QUn0ihbJB=OIV=#~YdUkJJ=!6x*%dJ)@*p$D5#@sc0w z`X$J%5YfNWrELTKJ2Y}58bF724-0h(i+N^khp9_Z@> zHV3$bpiCjq$u{NSsC^R$VF29{nu1ZJJe6Hw)+tm~!oop^YEtw!{r}h&00(q_z5~P^ zk~kTtK(XUI(EB@9n|tmxM9GG@E^a{o_r&cJ=559tz+Dmxe=2a?5Cttu`F_!_Y!;>_*X&wE1~>&u;gz4<_}wV%rK}E1U8h0gIfz85nr;-Zl)IjJf=WF^>yLzmpjOgcE#YSHy}nUf!059 zC#-GXG&Bs36AyM9)?N}ycA9FSntJisXzhRG6s{M{v7HRT*c>wtxObPa;~b z&U%)jz498*SH`?PGnXy(?Ob16-AuDqjdIgE7ifr&=%Em;9L#Y%>do$Msc4|wGHEpV z3p|hL>o8I`xK0t8WO{2XOoOr~=|o1#ZslwkSLXNqCAF4N)@+6IOaRC88@dj~J{Y?3 zlvli}BFKnq8;9T8H5Dn}|8FbYFK%Iy1qh4*A-2XhsZ2i+Dy5EtjGVT~EagH~DNbF0 z2-$RDk}Y(^b(WOSa!tX>srf$~ki=P&v=5wGt)jom%x?Sz0L}Swg9P(|5z|%X-gRU^ zVg^J6b~#REr{}5JM&e-aki;wWm=t*$<#wPs_Br-*xJ~F{Iq$<<`;q>R=H>US_BYsM z&SG`k;;5RX5pRF2GamxrB!Fg7LT#fkQ7VC>3<(uljwIm$qg!Pis}+Rb2JbLHvq=tF zCP?`;hq3M>wqMYTt}I<*vJFM3XY6U%tH=S-Ji`VOb_yf0)8xLN>`nU#pLIcO$HW1^ zxyXj4976BF{8FL34k4{%v)S2#&hIzxwc4;J-Y=Y81`I(}`PuhJ{|OvCOJt+)|=K$U5TVx@NkW zrblppKw-_S;W`M znaFoIkysa!x7t&8){=CSQ)?uyBO;0%n2g0wA#spfivLXrJmU!x=)F^W&Ae;&2tL;H zut;X+JMtEeUw|{y(+DtqLCL-;l+YsnU3c2@+-u|3KsaAxpXp-E`~l=`@lw6$5g?7o zPQ4Xv%4D%an4YnQ$4NUEd@q^o>4U%~5HB%`OH1i(3k(o`87^VNGeyc>_(GG6~U_JYdYW{t5jK@rDlR7S3w&s~>!k9r}0lzV4r`Ui5v{oBeQV^f$F!#q;aA$@M{H zyO+oL--GC{_^aqwe%%BB1kTI5T&yXqJl817HOwO$iEW0|bh#m;|nbj?8TvDIT9y<(oKy1Mml#>v{M zOI_-`M@pEyQ-my74N2j3&!9&J92H{3rdC^;nTc(=v2{Rzq9<*ED!Qq6lS;YwO<~MC z@v#T5@FFsBlZq``ZW;{tlLcG9wU&?fbPK*Hlh%P~275I2Np_f(p=uN68NPb#2nvf~ zDW}aV7whX~b(wS6IB@A3`}r33_itMH)`twZSr)&c_~N?_=XG=daylstmU2+oLw#2? z6VuZge7jwm*wCu5=h_A-sUb!+R0w7V55xir{^((jj|5Hv^u$8p3*kIVtCRF#90EuR zc*1=%CcHA%s1O=-U^&${HyRA4cqI@)u_Fdj5+zVquSaj*?&1!1ouTo$@m(38!>`eC zS_7BYgxC+zD@$Cz5Yq|d@;!L!FkBeVDjwxNp8Ih5!q!50_tD zxhj8*W_6}#_zYiE3#FXih8l7!2=h^ui{Bi^5Thz{IY%qqOK!3f$5Z3YuY_UHau#L~ z%E|1T**yWpezRt>IU_5KqH~4W=CZY0<@Tdwn^lWvn3fCkhz%y(r~Kn!zesXG{&y>= zfio5b0KO%>Ev}F>uZA1D8<(3C!tBFuJCvSUI_Y{Vb1qdEXV=k3bEon!tE4#_-trpP z{12w#sM3n93jBU@QVvoU*N0=e>#t!dKhz_l6#1CW*pUn~LjUBOK4i@0K3jwvSCY$s zej{PH^n{FIeU9lh9PU+rZxJp8=|>pY;Cb!?Ut9%3=2y_E<({YzW6?zh#;LDDNg)Ga zy;W1NclFz}@p}=T4^Uerf6Yq)x%T@bw=gJg4^|02z_4x$Jg&lJbCBZ)IBYt7Tq-lx zy1qQLXp0rutIe|lUhF`uM^Nkm?s;j%z%$D^!rLq@MyG6uzuE&VhnXH^sLs^{^k$7M zttCKaW&^DmB4UyZ47*3!7*&j&Fw9H<6KZ5!j#WR8`&hkUv;7mEOpUt-_61|JN6J%3 z-nTPnAe$BwBUz)_`_IRbp8zMIK)AkTO3~yeL=*?|IO5G=iSnMFW5G_ZFSpb_IxMFM zS$$}MKMfDZnCWHD%SU^RpfW+FsD_MedU{Rr5(E8AFz|UZ?jt?&eL`}m09h;nq8WApyQlWyqXBtCD7xDNarpD@ z(*=bbn|}st%O4^<*mISv6J5(e@aCG97sa*MNvjtIHgB_vk5^l#Yw46TVvi5~?>FjV^qW8jK@&F(!O zHmGfGs+6lr(GFBah0z?41fd+(^e78rYk~|$uv_9U3!sBU$$sw!4qGTh&`Pi|FDu~d z34{*VEkRnq{?Pk1PgW=~0;{Q)&>j*1?jr7mVuJ`u3UPoH_m|YaU<3|xxtAfZr5Mwt zEtnvPjAwm!KY&jWG=BB)qOD+fV{g%Ivz%B=w#XqYybv(qqqbtgHhFfS)*tX##V)hS zUaqrx4;c5a!mGJy?3usI_#%-{_S}d1x<`}2Xc+DJUcXLgaM`7cNF$E}?h;MVhNp-K<`Rs{v35Xv|W)mU(R3|Qr&iK0+G1;7mv zVv-4pCQ+P>4FH%zb?Yzt7zEwQXqKiMKYdnb%eN z0dE%_)HtZCTQXucs;r>*3!Ga(EBM{Z_)avG#%dCcm`iKdpD1Vd@+UhtqB9|T7$Cdj z?r7(V`#BXWPNX#V0&r(-RzDK%@0nX+`}P_*ZLA~wCSXb{xMr)~^|{uLh-6+&$}TlN zz}R;Tb^*aUcMvC4(~!eAc>?u-{7IQMe8A&YAsd3ICS$_FwJTs4IhFsK@j#8C_zRoXKh+*m``JWNivS+*tvw@#qWo$;EE2{~nFoEyg62S&RTu+2536hh5GNHyM`#^ImmLDoH$c`=>gaSkw5*}un1|Ba3%_V%dLtaQ;?!f^c=JWd+RXEyEGfS&;tdbm{9TX_JjRx zQtg<-csl(nH_ahYp|W)S&T~n`M5RlKwO%tA!=8d!d@`v24fJooJJ{0_d0#|mCnPIiU2)P}~qW7VswoQFatT$0G}X6DrK}=M~@} z5E&5croCWyiJ%7>&QSjGY6BGzo;w+>0gD{!mx5bcIm8t`V(186#1iTuGd0*2{*(gyH8+v4n@bGnZMg~gxiM*-Z=KcoFr ze{PfXQ&duZ<6iCR5T>KF|OY}dW1rByd;J-NY z*e2%)0ZjzZ?xayL;H4)inn1UUfn&gdM|p*aM;Br73uLiY!7ti3nh`1zdq6zK1S;#d z(12(tRKn-eQjLX%pdk@prg1&^$(_DQKX0YO)SzM{jZ1tmGU^4L1>ninya7Ub*Aw&z z=Il9zh!74)%nmcXkHcH&zuh7_;j3o=&dM{om9Kom zX9DV>Z3Uiagg4=`NZ^L^pa$35gbq07;akk2cLMo|Xq^hy-Q!4u5cqpndTeMi_QBTl z?-1Ek2o(Y%d~)rI2$>Fk7+6wNf~|qeq{}e+pcD+7!^u!+pfMzn>NA~Ps3Dzex{bhQ zfcJt~SfZ%|8EOHLs`|O@D#_pV%<716O0>IH;11ZB6?u}?#DZ}{x=3$oUk>DSIctt> zY!hfeng-VJc+lm3S{H9{%X;y~jz`d)t@SZeEvUJD!(&;@@*--lYzPt{-Gop5Wl@yt;Nf=>ov?SNT_a z=lN7~GjlVnqh~tXUe9kX6}VP&?qzj-J^a58Wv+bn^8Wv4hqBIHDDnSQw|W+pA;M$R zPYM~8ztr6Bv!!gjG`bq$X}rGB&=P4+p1V4^xT#L&5%b z1z7dmM9t7Nn!KNtGm%}hOvc7hW+eF!S$Hvc2n5{`>Lb8KNIdihI@uDKFl$?mR~Rw< ztHg2ql=+8U#%B961(F!Max!j-UVSm%i35@W*x$!W01F3%b)D{ZZF>HtO3TUnRZ?W9 zJG*?|CBhvZ0+~fBO^gajL6T* zPh&K$E4+tRHois?(gfC3IGI>ilTUO@lb6gfg6{CIx9r+eH6`ntmfS|cxtdZ47;bhg z8--K3ZD6EK04nL;q^p{lF(^*ta+?5_6Ndlubik&2o}Q!Yj({%NHLZlOu(q*14(_u6 zF$*AQgGmI0_nEK-2wt#FsItMz#0kh**fJ#>OnWh*<5dAjVT+T$B2WCEjB@aB{g=$M znPE{&`N;3U?!?qMKeNb4Y;c9(A2so=nKy=u$;>~}E-*A;mQ4aSkGC>I(3KeJho_f; z!L*>RsFTnXc;)QiEu8DSf=CU*OAefW|5wY`y$Xk~s?dO#J87MzSw@9?X!WW7YSL5MkC>tcJ|l zL9+=p|4}kPsePt9>?V3IT|9`#B_(k(@fXEPfOJlfBgba-4YY#++uytCe=y4&EhG5; z_xp2WyLvK@e<9j1WExXUn|TNEUMb=nw|ra&hx(XmQqpxb9mq-@W+?8EWNuoLbASU4 zM+E5)MQ7#{Gx70%N;EMCC!-i%KVg*%a=7c;%!lQA98?Sy&GH1 zKh~bwj)Xw?d$U#4ZS{F|PqjvEGe0ELnyxblPcCa9_}ecuNm=IfMMp5QK1AELQ6>QE zCiwU;FDGQ`Wl~)cbcC9$!&Y`(pOZBV41P+!Th+c%M@_FR{cN1g_24$Dy#TI8PZA1N zx^3a&1Qx^fU&|K7%AHyG*Err)d#t1VTdPzLSyE_*_0=w;h%wXXzRQX+dFJqC3I9sZw7Q4z4vkZh3NC2 zegw}V5TpT*-C~+lmwa;ImoOCuj$g$Q1!Vl|A-K2eWL(GEl)6bfoIC3i#LAeKAZMAh z*kW2o9|n%~fZ+mIUA`+WrcPA5l9FD2WQJm+)DQVrcUhtkz#lB!JIMK=yI8;8KLam- z6I$eCi^^}6Ldg-SM$eFQCTCuUG~quomsIamXU@72%fE_)Q~0ym@3wAcsq2*QzHfll zZdqw(eMJus;@yDQP8Q7jW)1mbg#ZZ3AIADV4^vrLosc0>9w|ry8hqs~kbaGrv^`|n z)fAzi_@D$vJX1JOTeqEpKG^Ib{7_KR>kI#~NR4!qCfNZ{rGwe0nZjzu-S>KXY2JV) z;cY87ftMJ2t**2{51X}H;wuvWqNsy?5-!~PuTS1>$_$d;$)chA99{>BA3x6x4S^(R zgVWKpFg%A}3_=Gwf(~69pgwDj+$P*uuZIo?q0APhJx$SLhB#)R5qvdYzX1%W9;-2@ z+8LHOYIf?mhgBS#6SvvjJ#>51#ek^nbm942laY_*=4sye9pfQL@uu+nGm`J@UD!IC zKMKSkm%73k39SPP^rcZ0%*>G|G$4)MoeU}CnoAx3QAWPbod&9GLO^M>?s;Ft8S^AN z-31{x<{uordrq{;m_5dr5VHwa+lNRzXr%Rk5fAkDeUH!%s=XH`zX8@vjG%X{RQ|W& z3togT94&tS1g}JiCIf=s>PagiJ@h1Zk`q!T0sNenxDFWBh1{y~!ECjpIWw3=e*Z8# z5ChHhBe#YkDU&6JH{b&jC7@Wn!t>2&%Sd4W1NH#>=9|b)TB2P|w)8FE1w3t&z-01( zzVtV=3Y=+s8O!5;>}RhNphH2GW>IW0P^qV`S)<l$M^D^nkrz!R-Kv1>!-2eP|2i;M$f5b=~@}@p(7yg3eB|6ZiftzAg;(_9x)7RS18jAO^G2| z+Ms48v=#d~|Jk#?f$g3^s3fG49M>qK_%K0RMg(yUUBZ@U7(qb!HXNb{*nG@l-4ag# z?Q105V`K+RQL0Il_9v4ZIV0Q5sME-Zr<4IUfn7a5(01)h$}`BF3V^)#G-&oTKV&&! z#q*b+fpnqyLxH~7ro=kSq#|4HQZ=-ETSJ%Eyc2sfhDRnEKo0mc1|)@JE_Z=}5sq7k z%r&Jjfs)uIpxsQx(kXL0Be2FziQXu&p{NF2L}-}?4ouE*V!tz27gFHFF2=3F%iy{s z`RV>&@4mXm+}!DJrpi&ua$_@e;d|sl)D#(V_o28(-0AVq3C2V7*tFgR49Vbm@gM&< z4uBr6oU(KEcHe&rtL1e%4>np+q_0;^e#H=F0cb0ItK_EIm&TiCD-~> zR~Tu2|H#$CO?379zXKa$qg*#q*z)&Syqoxu-{RD;JTK)wPZ0}&efv{J_nMjXw@PY% zV?*Z=dzW0nyy=Jj=G>nXNvDy2+HvQom$2H9{dhGLsKpGq1m(xb2dE3bHYYr*Qm4s~ z&v8%Z*uR1>UzxYW@nGFrw;> z_+x>Ms)!~0NJi*y-a)Oa{D=2^TkFdg!IhR;_U~%@8@u*Rtx_VZ)vFngYtc=%Fiub3 zbc4<=GU5)MVXLaJn-YgesFglx%>-G8ZlAdPOicX1_*wy6q`RYOAtDD0=8(F>w48Ox3+p^pYZXIpgUB%yo(vi9g zp076~c-SY=rS3#KU~_sT#!?7>ZAp09rwOJbZPvmXue_^A&!%bZ>a zmgDKE;S*wcY7A#kMDDH+O5MGOVx_H$Z@bd0cMM%lIm4gk;Yo1Ops3Tad(drWE!Nlj zFMH)Gqe%J~x_+NqKTf!`x(HZ^q9m8U2G=H-$&GEul?y#{2#w$WMB!^K6V}IoGZYQh594dWH z74Mq>qJZ90xL8o+_dEP_=L{ryB0(aB7Cnq-KUW)YWDW($^F)GM_4AT^EgGx*5XaD@ z6*H<&dhJUw>yr*GHR}4XinTM}d;IR^`iqSQ0VDxu;VK6vhCYS~+tURQ)ut^=Y9doMCFFAZ4JOa;1PPZg@x_9&i10GtKOUfsI&_)_U zJW*VWd5;B1zZ89Q{NJCM!9p73-v9pUKoS^In|$0s_CSP}R3T05q2>VWKG%bjhL?;B zsVNcJxU0cq5ejbvf>WT!aacmQ%WYJ1R~i|G?iw@FA9pO7e7Fufy4lQ_&&2zcjavYb z{T=1k^!ePYzsNzbN)ZXHGFMWI7^K#O8!N;_Ak!(eW;oYnpP}IuPlefme~4<*#;2_E z#H>?CqJWD=U=jB6w`9m2>E)4KK{R4V-89iUSn---3(FqS3$_J9bX{t(Iv%*W@>70) zVsUWB)M6hveq`g)yewJju#GwGZivnXV{S)>yktE(NUWMd(V}T|sl`9AGn)<@Ha$2C zz8kn-e&@4DC}){M1yigosl#4n``531UmIU6ixm8w$(p-p4JzD9c5ypB+Z(&yIW>A9 z{+mUQSN`Jb2Y-xT2jHP~o?ew{Of%G(kF3SGu#<}_!B5zK zREs9)ym*oZ_OZY+2`;#qiT82lM7&Fk;Y@ja}Ozrldp>W#W2mZms}(g)T;j??ONL{U{`(vv9Ou&E&|yPYp}`C z<GqvP(fU*2*q2op-`r^y?b$@cRf$6~L+?V|NgK%KTd40BzNAj5rcJQxZWcvLSxV z;VI8rWrsS;)PU1cg{HTOGn4G5syPL%pqNx|{HuL~vZ0V@3q zf@gT_LiM2%Jp$U#lJP{Kh2kIf@|lvn5dFw6Rz&Qe7CSGJ5STGrn69~-0m3#ejmH~! zl0$LKsouOGn!2NCn&?B#K}Qtd?sj&@-(x7#TZN6OVX5#;C%UBgEa-}Y;BfR~%xxcS z;YG+Mj?5`@iI%>XFh(5uHY00E4l4aMO_V=ww9MI+= zIxb~{p?oF`ME4ES%@% zMzAji*}Dzq5VS1vjI%8iI@(t@U%%d1N;*vN?lsj7CXYEa0v`fFSosMF@lHHqEwc~$ z{d&W-6K~wt5|#?ZP)k}78PfDJT{nA7=mC^kmXOF?!)-NDv<^u7VEuCj?}AKIFC}G# zM$TXl>oX#a0#U%tcap8=5L!}rybhQ_ibg++vQH5EXGd6nyZDCdW8Evn9uJPMvQ!`U zhA+YFK#+;yUSO*Pm+0374A(t0#KFoW-f~FxC7eGvdx(6yRsxI@D4CV|ur?7#2hZNJ zJeTEj)|x`Z<10m5)1#?q^+} zR)7|dCatM3nE%l53=>LS7ze2{bnGmDPY3Gx3_^P?HFKKfUanSm3Y6x6z4_XUo`7qt zD62yQ1OhK_cXlBU;E7{N-SqG|mtQ(`8PPAu;&{})#!0U}?ty-oJF`%G@FO3Ya29Oi z5przD5|C;rB-<|$l;e~N&_L;|JF`Oyo#@l|zZZ$enfB&(b%PYB@I>4wqtaF>$3Q&R zx&57MXvU`%tca9>DD|ZY(<6F246jeCCiq?o&G(vS?tZD;k1S`? zhjzXddw|&SL^~?(OZTvTd%HNxZ68y}Ts5WVC4A7P$7Z?RAh}T-g&YvK%|tv=toyvX zGa64rOc7GzGwKSx9vMJL039Zi;DIn&gHxk1wa3|OZhTl#}YuP)lKop1c1)M>+ z`r1r2(kmkY{B~!&Ec*79XIlJ0EeRi(B<)WvwaBwUI5vq~_7LL!>rI_|vE5}Ddr=Z*ELvObuo##F z5)D>5*W_9EyI(ylO?$`X(z4n{27X6B0v9N}PCl4k`+=d}x0VgsKnEB0-C`Vc=!P{BP))wYX1i33SBgksR zpuQ6jnOuGTP?O`x`?!YRh?|Ot)@{+&@T3ydrFz?r*{-glO( zF5JGd9dbagQ#8HM>;5vyf&8;bj{p^U?F0t2p2C;x6o(4jq}~QW&qfMu>HIm#-FHzP zNqYRK0ddh*=x;^Qu%QcEI`4*$#V5VI__y5g8{;|4#K0uPb)->bonLR_?-6^~^{)FOB?pvF*ZhS=A zrn$$6MKTf9pZj@uIroExu`P~F6<$X;xp-No2v_VE66%|h_xjDb2c@*74-x~2pP%%) zH;jU3t@aZhf8T@KE8ySMkF4CalW%Fb?JMW~28a15L+7-_XwieI)4p|l+qH@%bo%{- z#9=qG#^$?r1G$FC<>!X%8EH$l?giu&w3am!b!I%V|E_g|yn_noRv#|^m8X7l`fN$x zv(uNqg751ty-!l)kQi>A8;JVC%1{5oUF$d&c}{wC8kwk0IpkcqZAZ+ZNyWFTL3)wH z6S0W8y?2a4){$v=wl`5QUty-Qh zr+)h6)|B*Boboh$%@(>C)M$%NT=vFae4s}5q6wt?DDjzSp#)@JIPB?ogQX``!rTtfFB-E>XYJ? zh&8o?pVLWtHK>9S@pX$#K=NJS8OnTLKtZICHlVr4(x*vs2Ry8qYE=iwu zUbNDCv{X`&zW0m{9iUAVkT*vKp%-uvn8%`0`m>^ga9?@CY-I%jXgYXV)Cm=4I_Te9I0nV&Z2xZi24F zsz-CN=3nm_m6Hb1x{M5xpoaM0x2+3GTDb- zrN{26eWS%%&MmQd%_q?}UdmTFzdNOz7CM zctg3+2N7-_^LyEgNU&sqb2i?@>Hr>^`)mVw@f43pBSBG<5`=jM_*U{2nO-;VMf9-v_e>#)ueYSU~`SX&aDr>YfMTHc`a6wI8YI3`+*FGHgruq(Nlsb5*=!zOe@5Zape5lFD zSB2T1e-QhYEb1{@8H*K9D}3-GyuyusU)S<1P){B*ojKNk2k#(|MK~=`SCe_Lz@r=D zht7ri^0&s3bzRg5)Xm|ha6)QuiUSIsiDC6=t=Bz(!m8^6sY`D)p|bU?*t}_9qO|wC zS%UbX$l?mnWo{FyAW*JBFR?MrmM!1g=g&;Ym#W3&hsXw8 z3A@js{^+1^Y-4>2Eq!F33Wwv>M6uddm2a4(fNX!>2NvIX!7@kib8c#b+vF_Nw?LI7 zF$wjE$F@A^Xte-aIw>aq^2#kByvcJ@iKU~=-);?uG-#_P^TsmxZOrp&-Jc2<{%&}_ z1kc7V9?Os&_vChv51R6{#++(EI$L=b{d(2FeNK_yVaAe0YN%4-j_BmQFi<#D_LgNx z{NbWFImv&!IU=QTp!L#!LzwBqe=iw_dCBU`r4*hncaKYHppwq{C)>TiPAusAEioB= z)+(Pm_av?tC+A@_B#EIw)ckbsZ>B9{I(&{@m1cc0-J+g#4z{Vg4a%%CIL8MeX?{HZ z$vL*r#KB_fGmiL=su}r%P&>sqBbtE!J)K{c2d=BDT6{wCLt5j)X7NdwB)cy`$d&NV zHMfy)?XxNQgB7LG9*^nxIS;L?b8yoRv0n$4dsOZR{ggs|?F_6bpL#11{?=(pVmIbY zn5{9P+}?)xY;vKkZMn_lo~?Iu0kLZRvGJGx6Sz=?XmWWP_I{zjD~P?UR0735vp`l7DPbj&K)$)2YQ^>(Sp z?xK=zogOb}4$@Tk#lK~=k8iHue2gX7$vZSZV@d3b8o9}npEYT}&Ws_T$~m>}8_<-J zx_45Al(?yOzp5N}($Sih3sB9gqzyvS^V8QEwEVu|^_bDukmLm)10I{gZE%I{lRt{MZAU zk4VRc-+^$2lrPO=)I8`u`O@(G8=4MKBr~5;(mlMuMbOqt@XpmYvZ{x2Qw{8!Ed&|K z0w|c1wcmz2asIGbJJG8Kgf;Tm6+s>4c6d+YBE_<4n+);sGj-HpO&d=SOh@&%%tIg? zk|D}*Dh$MQ0Vzv<3KSVwTO0bq$0!gT+0$LccI!Z2RTs-DN2lWNN;>Wg|FKMxM|Q(Fx$)`b|<{Bl+HJoJpVE~O099=fT?;7xQd;iOO(6$(%= zO}gSLc}(92haKJI6ao*h&x@e+N7Fg-W&L_PGUCwOEc1&r|5XWO|u5zF^Nq)=_~Fa9Xq1~qo=16%7N98cSM zjlE{sBg|W0Yn^e=EgovA-JIVl^}$o!U#fk;UYjhmw%VSyR?*;WI?q)xDwi2wBG>%J zDF=u2`VL*f&hbtS`q*RkwKrMaF6)HK7xoT3;Z*vMP&}+I6$0!ISrS1~sHJCb<2H9d zlB=8QDjgUVIf1MZY)@TUikP@Sg`ywnmKmc{I$Ss#C1H=+=$_b$(CZKyTi)!mJ>$;W_)d7D=JN#W(MU?46tN>a`SskkOHp#z6 zzSTwfq9UKYKO{=o*_KmxJdgl%+>a54p*?QmdL_`)gukdQxq0;~9yh!ClGnomEud4O z(s>|NeM0#d9R_XraAOV#wC;Bm$X30WznQCrkXvtQ4aWUaT_vmv{sV`JitFWq5Fws< z`~)$23s7-AUmy$X=5T+}7>+12E%S(a9&wrr&+YsyQ2Exu6!kOL?sy>ki?%t*pp$`h+VvJG)uvhTw)2 z;+ca*HN{hqL7>Bwkqp$`AZ6nmM`s+NT9bwiTV(RUUYakQuZ7uIk7KKdb8$dG4Gr01 zQrN^23qjozF`+QwLuY2==po~tq}xwRdAnX#GXIo9yti$Ksly6B>e>ZScRw zRzS%ozp}P{@2k?jkBf~){%%2+RoLNMB)wbvv?(SP*>m92Q##=M7ej9(r+sNjkxo3#SG<%c48VjuM#B6Ry{vqbMX zG1j^A@A2|ceOl4T$KS_Vm~LR=D8qefRa@?;BsVV1X+<%7p{y>91@-jkjD+V|*I@N= zM7`(b$;lrcwr8eTtA%uQGw;vN&adI8bP`hySKEcD5?&_n&2r_<*fhs2e`InG6Ix$5@y z`mPT9>8MF`Ugpn5NXLsFi zlkE*2$#Yjiz7`YGfK*0VicVr;FkX8#`fL5V?fT^=$Jq8|{?XdD7m@nwquUZ7yNs$8VJ4a%bDk6lYGnsCH-!AoEGtu{bd&1t&H ztx3=fD&OHf+I(UnwU}q@hCC#ZAnQHvaxKlx+3D8nl4qj_@`L;Ydu#3llogp(=+sCJ zg>pp_v4PM`e{l!7cuQ}pOAG;2T&j?xIh6(715Y+fKjnz`PjU@!&)+BVr+^BvP>U4& z_$TOeB3?aOcW0ym;=GsgvmJk-3t&J(Gn9$2eh9OeT5xo;Z&u(}xf>%@yrzJ#2Qb&R zQOMi@4a+BvXE*Fn`Y4L5)q8B!b6u6QF zp%b0qlLxUo>3NA8rYs${1-K~6Q)1E<5fM!k$^#5fVohv?!V!pAP`RphEmnL zDo&S==U_4-CK)y@kJ8p$U1;aelt8}{-7W3hYNQ5vZ}qZ~Uo|~Nrk_2xrXBhP-D~he z_yk|4Exk(XjH9hJZL-gS_3yVOn;rON{7^n|i(J7I;V%!y$DGr$`2+3V$C|lQ?>i}! zPsCGUz7o%4X2-d@aAs3rD^X3l#_SEHN>vOiTl)<9G;PSQ&!hGSPay}&e1k!5! zePSzDSK#|{M}vQSP)2Q&-3d%KY z5B-Zzs6?4BYVU7q3(~%=IQ*tVAhH7p(Or^h<7y2$#uOngBx~{+C^gDgN_9eq)<4Pj z+DG0PeTCbME^l-~okOEW1TzJ>IB%g9E~7R>ZSrktPgnKda1Vo%`vTj3M^)=MqT4+5 zU^hXd!0j$t7lR6?xto=JFR2+(W8(%tRctpJ@dSndJmJ~wNspYoWdX}@W z{;UulK00#8R3P80r?0Vod+$d}>P?{}h$#OG6VL5&Oql^U!56AB-!TM98rbemTpENl z(W}Q4GB8LKNTch}Y{u=d+S#hw!T7m@9&!1DY=Y0HhX3O4|KJIc$vW+WWgx2?i|x~~ zNbN!X+xOD%)j~PZz-Irj0fM-F5-M+)A?TTCP<@9g-4BX<#RiQ-|D6-qo=9woi4Fs-7UqX!I)7?TaC`yz`d#rrp0)Lkn|RHm;h)4% z@reNvle=gjflXbGk2-!x_q&!$_F#j5YMVAH)J(|#am@29u4xm{Z{aX?f|@|QFxx$f zUK-6#Kp00ki1E}PvWVl3`>y*S>IaURvcHI^OnTWa`m$q)18yg;HRJELb#q6gi>0Rx z{#G07#*~%D7y2PoFG}0LgA!A`SVyiPKAAm~cS=3@zy2g615>ZA-0Yk#gz`5=0Jka0xWa8tTU{kpEL z6Fa;O+9?spnTiujWREwwc>+bqn{S!2}pn)>-vP0dT5}E1A z)|Bvw%$PQXcE7 zlciJchfvw7F>>Q!+5|WB-fm0^wr(LiPTI{S3OJqcg>`WH+o6!*{bUrCiCCmp)G&pY z_q9lKlREKo1J;Wu6IL!v?}J17F=X%7`{$pnCs1s>tQ_@)iqG`18zEeHFBW!Bf1mq+ z+Ie-omrhcw*8AjqJ9Vb^di}gS^}UDKRr5zW?~AA}wy4tq=h@)3u4UHQV7>V|^z6swVehiH_tk3G zXx*P9)mTQ>ll9VkwrJlhqjvZX}c_kmvmnih$51(dJ27A zFk#57`IutF%?DZ08_$>Odqj;u^6|8Y^!z0knt_}n@Rqpg;HN=XcgFr0&!dam3!te9 z?UUe}KmTkqGI(ztI(g&WPycdjiis@7i`|#OY7YjAK5Zat0r;VMr0~xSOXV0uF4kCx znZ7u46pNI*VM+pT_8dl$IuuJ0X&&|FWqFDM0wjkKT z5<)W#P`{B{nQA$E`CjO2cDwt%4b9#y&`m18U5e!P_&+=Rg_M}KA((H;Mds&6YUIon zaWpE6wd>~mOePwLIR+wzuRBgs3p*)mlF9h1AU{^$*X?RaLN`Ain^dtscs~i%;3V9M=Jr;W zhsvH$)W_CK`{*L^BmsLr=EnyH8?%A@vi$iCU*Xs~^8MomVZZ4JNuI z2^FiU5=fDQ0I-YT10!9f&J(~QC?SH6EH-fTD$hL?4r56wqgeI3bolAK)6sWOtCYCa zc&EnOUe15tl2Hn_7eMkfzXl4vtk52us2Bfp)!*=+3#uUBf{2eiZow8`M(o=SE;abi z5UQh=JyiE`41%|45NZhtoAmwZa^~~Jf54rl3k9`+!`BtPtKT>NF~+)=;6O;p1edT_ zIJ9oK%~|*_P#z#?nAkAZU;NIIN8^Uy@0Yt($f2`c zd#P^d(;))|Y9|^xGMWT8$d;x4hS5ew)(-))-b-B2j(p9mReojN?+*!1;wG)Kb6f_u z6q;Ep99+vj7u=|DoYEffEKCNyBXWufF+7h)BDsf`Ol{inPEUrc1e26KELg+MhpXdm zfOV54dr=+Kz{k8qO_~WfZ_OF-an{> ztY}o~s=A*8rWj7(bJ8t+!tKXijOOWf;rd6=qRn{pQuq91L2gDjn#c0;t=%dYrqS$e zvzy1kv31SuZ*H~&Yu4jxWyIVI@9#G@n<;9&MMhd3^MLID**f%uo97o%$SB6Auxz9} z;N5kdFqX}lo=KS>@trB2n6;0fqXQj^jXK^Pr=z*mG6#R}j zzE}3jW=PoA;0m1yk(E_inl^FFc1lo0g$IlWwYX|r+Mez&f^y?6`mD}0-4$0nB$_o{ z+#<6pse^inFwngd3HL*r55^o;y*v(nGOEuriqq{e!BUT8#;WX#$?HA$i~+!opK_O2 zjiwSPdv-H-a2~`hP}mLDZC5)Z5%pkg=`p;IBP0UVUmmP&E`*Ijtb58J5uQ5;6a;JR zY@BAPVBLj)*GRr0i0Xn`ka8)%MR0 zXL`P*Ujs08@1}9tgP_0n`9SZV6W1KKTuM4vaBRc85k5wnun=T1kE5;WdN#mU$ex1T zkIz<{$(~v$%DZdz4K@k&bEF8Zt}7wmp6cL}A37Oe>aCB&^b*BfMaKL;4xX7n_m5^2 z$PQ7X4Kwi=eSn>kL??8%E(5Ny0!UWITVAFt0vIl!gsU<_tfAg;a{ull`5}uQ@XSfe zQlRYc)Y}BS#Q9Qib`}Rq$so)Tw5Z2y;hxHc6|?Tkxg7=@E5!h_q04hg)v>njz;0e5 zPW<Cs@3WZ-=yA5swOx1yh;%(s*MK~1>y8%}KMw4r; zrSh2I-R)N2je;N4Oeh8$exMK+c~ygKe3rSB3bdQ`K?*22n!BmP*n<}0bSj`V2?2<3 zvj{2KFPb7GD524HFTB}(;XwJuQrj~k#e+dzCd54(YduvwxW%J;H<=9kqGZA=%qIS1 zwSE|J;(?XN z0!FhM_C}?wU>InhfL5$7fohn>kBlpI1gwW;fOlaR+61a( zf6BX{P1v!XP&kke0x}8Y>a_8-ChY~i`a&1E0*@yquBgl1PfW8SQf7l-xhS3p_{FfM z8xIrGiEj&N;=4qyR2u$dQ2Bsfm?So}x#zxJhdodg58F5QU~mnIi|^Q&q-h-5qg%nV zIwd0_KSWa$&Yt>@EYQDX#>QC_vwR_iX@s1^S{5N1A;%A1r6ft?BB)4c zZPf2#h-r%cKMB8X*&miKKfeY$q8as6Hk1dwO^==G4ysP%S5}H%_QV6??G_P*m}@J# zsM;chWRA9&@J;O(TZtZ7P$%r1Om2f?@%|HO%Q+S9DdnbZ=)P6N zm-!;4WBbr^RrZImI##je=LKBmt7nsWD}hUZ*My(-ki0k?T5)5(ErZAS^p#i z$K3KME1|NRClod@Y`GAOR3<8t{exLLEi1u@oqv-bqy|19f{Mf2ERFe4m`c%nrqr!b z`lyR@g?t$gQ!DbpU-=>fx0{bRFiQwKeS6S%b{}u`K$&0uK+FVcz!DB3C0kU%wE1%{ z`Qg9|~>&+4FuwS^G+SNldCUJ=iSh6JTK{E0cH)fXaDRlF-H^-<1Gps^3Kl z$ZTLS*)-nuXrykeJ+$dgafxKz`y=gyDSxodfz}#2aUqi`g*Qs6j-v2;DAhX;c!Nb{=qhRL}c61pm1gfWxY+`pT8sQcYN0Ot|&v@bM{yqGNsKW(f?1M}lwlTG5$ z4vDP?*q&yk0se_psZ^bSnU$(Lj=TjeVDN>$CQEmOyC5iB5^%zSMmk1@s>LE1c^29E zfCI>K_m!eq(-R0+6~=YSg|QzoT`)X@ia^f^yoLIm3p@qA)SCXtN4H1mhCQuO3HGo) z<=h5kBBM>=Q`^*g1_!M3l#H(Uppde6Kp%O(Hm7-*Xw(9*qkxfl_|_}RgcIu5g`u{o zKdBBw1L!*qeXUKKKEE0;zB_C#RfBp+3?BQ8Cdszq)He?sk~po$!}mY~5_Q~}eFUGC zhWALB{a^yg0%zZtYS@5~tt!fYBZm_Jb{(Y^?RC;X@${8xTU&oq;6(|N|K}oO{3ckt z+4S3%`kRa@KXLf>QdCZt^FIUi$Ue`X_L%~7y!L3(J$D!m(q-YPHG+5}0auYB`-xR< zS*3X9{m}2pi!Luhpm`DRjR?R9d8~CPlnHleORq}vts_@*Ue5}Mpo?_q=EV9z-o4GW zF_)*972)#kG+Nv){*USy9Ozd-;p%c|q3@a1;w!=P-Vc<0)h`h)gciA9&mwgzbmAKE zhOLaAW5nZ8Zd}uZM`i>IF;LM0>cn(i6d4t zYvZDy#(gXSbWy?zpbKz-?G0<52|(qj)fmF0A3Rs}(cm<6|CNST5Q{^D5fnA%hLJ47 zKx3vA^}6(4!cIk5F$k^C z$W5m;n@oeNzrxcSTt|DvLRO}h)NgMxU6D@X3tF91s>}P+8?kmZXYhbIquJ+a?*u_~ z<}jOsi}-+iSbifvU1WizF79hm<(+3}jLAT6s9!%QljRo$O?lHQ4yk=(KIN)4S8J82 z+3veP%QcvDDc4^N{A!)xHT&H3U$$$z2D8oQA%DQJzm0A{L)9Yo4xODQhS4;aw;vExPs@nkz3bF$(u~=FKw!nJF#>P z!hFRLl}*yg{7Rpy{gCA!J`;mTkUgV1o`vCf9V)*(!yz?v?E{=JV-I!J<5$z;)t{EC z`~Xh7jED2)F)jvWp{g_;z&UJobumsM|5Y2AtzJn+;fjUf;4&*MZg@s1sU(AHnyOab zJ!&6>uR6f^>S*P!DNPOC28gi~!t6k$n_+D^bMOZidi|eNOQ9%h1%6~#8X4(bfalL& z*sGx^y-1;W;^Sl0?mtH8J8Vl|k@_f${EPYi>NC%dO}G&cXCb;ha%bo-s53ot^gqOY z2Nb>Pbq~^F1-)SEG8cnKpV&U z3XB5Y{y!r(xvfT`#OAVxfA*`}va*N)sB?1oGd^qib3}DX>Wrj>n9ImVi{Hcx+cV$v zD^)B1UEbWhE+jTV*4JI0#B1e8bX?s%e09E_+IxL zf_T(DRmmK&6@4{XO(eX`zYCkOzg^U;Nl5G%^Ta1%a5>R-{5{f3`54D)+pF$?n@fJk ze-26O{SQF;6PfC|xq`IJrSJ`1+rcs^W;cLn6vBxqN}v56=Yc2Dol2vacV<}zYE0*! zl(X+<3RLD6(VsR4yb*4T$qbUt<#81j`-2@g^HqsU~Ra0h912-~&f*X|vO zyZ39Cd?Ud@Z^k07!I$esge{b@rwB0uunZxCiqdj=*}(&UatJeB#jWiI>H?#*ehh-o7+#3Yn;pp{cZ>F}smmx+1Z^x7Xlr0+V70 zH+&$a{vvbVllQG@69nle6YciO(}zNARI_nE4ExKZ{}(UI>ZqH{7m5(5<6;Wlvj`k6 zgDXjZYQ_dJ(y7#?aqjfse`tUih$?8medty%e}^W);R`j4pG#MB79l|QjMxH{<}3!K zaTKBG8~|;kOje-yHd4J`z4#^vEWe%3W^oq`zLWt_oetQ{Ap!dc?0)!OI z5o<;1wswis()BRdy8BX3cnChG_nR0#^f3=c-B^B(DQRYn`Klzg*%n3%&NNBJLA#gk zf=Cg1#5*UlR-qGGAnDtWqoQ+s%Ab1f1XN<3s=-!t1(;fJVwkqXgnO*pVcFHaXA$r@ zBp;QUEp^d}s*)w!d}7-)kBU9AIm689~eobSqe=~YTR zM_)pqS(uF7Lo^LIUbjjAl_vCVmQ{eYMT!ld1W^GQvg-VjDnylx=U3&8P7d55k9 zD^)K}%;^;6SRlpXIK@C`rTBu|qv|Ey^-X4D(=AfTE5ZQsi?rS`GgY4rsrdskr{-?v z_ZZ0I7(qAl(J>2x-vCs~oZWW;;=OBm7{I}X5rMM2zu;>)^_B2@L|UAczY5qP83e}$ z!ABp&G5TaY;%aJ5Et^vYyLwBKh@i!`_z#qdFYbDnHpRHPr=IM3-P*iEOYF)#x}bpO z_YkSgJ+>Hq3CnxWRCjBxvG{2n=I~7z{CVQ@r!_nvO1lER>dC|YB!|Whml-dcRl&q< zIceK1B|6UImA{gRwn}~ZRa%J4_Oy>)8ysDUJEI$z$W&V~9!9gH*_$;^=8_*K| z@hk)BRAL!8yj0UP&j7Rz798iWr^2n1W1AgETv&0}M<=_xr@QeIzx}_t0?}Lfb?e8% zO*;3#<9a-&=4&N{`+_f?J`lO;d?)_ix1Q?hlF}9|$Opga!(h>VzhlDSwnJ(fUTu3B zss&50ZR$HveC$5<+4TE+U95q)OgrLY&1Z zBZh>Ki^@YP)-@4leCV&(9cOlc=|^= zRG#eAiDV9gEjX9=wi@*XxmfWTi-?GZ+J3#VaMJYrJRtu84;rkrbxcE#aHg( zF=2j$L)dUEq?2WfD?sF39*8!sTA`3jOuIVTxBK9;b{J01?{A?vAT;3|Q;8nAs8*%5 zZx?f7PhJ8*Zn?wwNt?vy;nlmGGfMB={)%4WUTx%QVy&JA(|*>aL*uN6W*c!?h}kD@ zmo_zXVKS=U?i%VRv(Td}{y$V6e^&1h8|zp$u{uq7o1#jRE(7oAMkQ78ROL%bRnj`9JrJT!#rx^BWZy2qbLe!{T{5|vG9yiJk488^j{h{>nYpee{E zD3CASfD({K9n{@fI3oI2SMrG;RC>Fz%&px->zp)az4~jFU3v# zU*4iHur6dy3l9qb)r^cz?rnwUs8=_;ai|r!*I(;m4}l4iG-d?MvBe+4zP}w4KPN^A z&^Wx!4wfxFe6(N;WX-~5b<#VF#k}-EptDPnp*eNYS<#zSyOFwunfbI%4X*!ohO~Q)4 zn-kR1dBbxwJ(S(x>Je|htkWW_lT|n7_P-@NIbX=GI3zH9F+aXVG?J?D=%L$d1iHFY zmupNU;HmoIrIo=p5n3GD@@XR;)#VWS|RsVz5+P_GP=;Z4QXi6tQiaz!-A5mb6x z<#B{=h6B=7Q2xL(K8m*MBf1&y52jekx_WvWsR; z8|Bk=wH2<4k`XV8fIv)qF(iXC0W<1&p^7=k9V+V~%=L&4Gs=NlHs@cx@x^obuE#wE zPsVgS(NKfC{ur?JT(H#k0tc&Ni?f0#D@V{zrdKN| zQp5}K_r(n3j&C{Q(PKI8fTR@zel~SURC+d^-AY zhBW|W`L@mu2G=)=;6NUtsj@$4d2{x_><}5g1;weyJ%DmKq%O$Ue&c(3(6O|ivx_FX zvV-@L9-E-erFlBGEUdxvy~fO?H)XxAX;sBElC>%mpRNQGgq&y!l7f)~_ce0v4FHm%n~ycMxME0k zaD`dtpj?|w`gL*6x$aepcBAZQ0BGNsLP*fQJrA)a@OhOwc1H=eZK=K$qn(p`>Yrk1 zqKb~eOjYea46yk=KTlfSpPK9f;s#$mhS21}(vEPNbGQ(??!J{C_=!ii#cTXTgS(QC zb*^KHvtPDWSTwJHNo41^T?)^8yB*3m?+dUewk26kOzTX-$eon7+!&O+d@mG$h18$2 zN#a9GY!?k*9&cls1>i%F2XDQ4*=A*dwn@>2**06oaAz0Qb$d;Uk(`fo zfz}piiJ#UKg!p@XYej=B?Ib43KF6JtZfk{rgg|LHZ4g*t>U;jZA766t@NJEztPi8F zsyql;N#uM8jCcpjX`pSW1?>f|sb^n45iR9JTI&WhZ+q2Gz6fgK# z`{npPgUNVBquRfnI@m#&g$o|#DMxc?p>)~wAq9H*W}Fp<+uds1$L2QtFu6jP3gi-pLf|l-Vf9OP zZ%QZ>{T>R&%<^tG@oFZhfr12UzlgEbv3|yZ#GSk>&ma?FG1h*^&=L^8DVbd1fyIEFcY$k<%XaXe)yno%@^j1`F zL^==;^(kmY9fNX>JF4NP76uwqS@ipQz^&)<4?TvdBoivlWvTu&ra_8PF|)2+@<01^ zU-zQvL)gFqSa7n9N!eM(oEGzRmB1TDd;?7Q$HzSqsuC+U62~Z0xd!_9&AuadZigyi zNuxtnsXR|tudT+b%Dquu%ufixwjaRx5$jqu5Ig9yN{u)FH8M~uBpY}Pq%uSG$b36U zwv3wJbIea#UxdTce8w4hvU+zGC z$fMbU#+3*5-R|>ZNFV%s`~4uG$c9|IMWC;hhIOv(IAoI5E4^9gJ{<8lWLj57+edA_ zs?&rK0}2I<^g+SSWvo8L#W+^#K z8Qfo5pVjgqPyV(nfFh+(vP7jE`;s?*O5OuX9Xhv%rKxpS7rQ?P&p*~*UjaE!eVzCD zYI)m&s^`gW8=W4z_v%X5o#FW2?R%+6Ai~|88wL0d(w=*(?*04glbtcW^R!*M))~of zidt^7UVO{{Yx(1ps=L~hs$O4Ke|37X-7D#JdX_VHfpEIDzqH5m+jyI3wElEkHyY0$ znWj-<66sk^mi@@}^?nYpVLEUZg?b`u9kwU83#vU=YY2gZlTKVo0M9eDK<>c6WaQze zP+0;Y3jN6XZy+uf<3k~$F=W3&l$&KYut1fz7nTyQnH#Rv*8qa&l)q+1OrDO8F8V&OwMPG&k)yvc?}=Deo>&Z6q2r9 ze*6fu5GpkJ&A#e`30*5=L_WC16DIevt zjU4qapdKh4zKe2mLDVSt zr6TjiU(#BA7p-@x?GjFGqhV2u1(X9?B&|gJlz@~IRalg#BT36TPuW;wUIhnu6%K;R z6A+g3?2cQN4nXx84I_aeCz!I9A6CHWMR@0O8i5wxSVvHEydVZ#yA}lo1y4cs-UPe( zHbwveK@%kT;>SpKjLoa+1*nJ^|tR>Q;i?j_NJYvgYnMi*-8fgv%lY}v*-&myABudx{ ztjudRd-vlhDA0<1AdQ#NW}FMZZ>f6CB%pQ(7s5MpSRqZQL zx&;y%3&4kKpVH^`GZuU|c!9}q{fvC&@+PX|mM_Gq0xI9Sso?ZLxtHI^B zD+_=?@i~ommWF={eZr|6GveSNz+-|IA+D7ME}bcx3Dq}RP?!{*bEn62J8x+;&|B>r1jB2Q*dDs2bndJV@SCHq3 zXK!1`#Lu~M9ELxDv!5}ITM@Jm8zd!;=IP$w2Eyfg-=HZjoVsc;ufH@~rhwB_eX5NL zhx-tr&ef@iokHk=HoMZ7y&oo#n9Y*pxPiR}E{mWhQ&Ka9<{iT1ovHml;8W~Pn37<+ z=7-%o%=7FTH(xf+z@RG7U_3aSIymA&WQ=dOmQWj|Al;ItkcZ;h-}|>2^g#VEkdivy zw8&1}lRfSHFs%qvC}mz74bSFWC~9>z_3N?Nwad6zX{{CBDMl-p#fxphVG_Fv&{GXAZb!uqGEiyz)-wmtZLv0|_>Z zul&t~wg1So*+WPgJP;+1xm-2J!3i5J@Z))!9l`Poeg?_=Gmz^Cy%e6e;d#13sj5E= z!%>>!$H%y8h)8>huHKns;^|T3l?EE&UgB;YFM-=>kRe+Ye%elCoKZeyMW78~v9plVu`> z`ALdgbSS%E+ycU^yOQW(6|hM^7jt~pqKsX!<=Te9n@^7%R}{L&I@|aG0_4>JA_pW% z?tY9>Ge0IlNzI?7?bu%vPFK!N_P(k%1`S?u4v7TwV{~6+&8VXSoB`R{eRSf%j#J-) zO|*NE9t`!KMW2wK0yx+P`g+lC7mkD|=~D8VzI+dEkUS$D;VK?}=lqv{(do+=68ZE@v8M>rzp?%X7 zWsHKpUTOilh87Dy10A+C2=m>9W*ipfBK`$FF^c|L@~sp?5z2gfK47W#R_+?3(y8?2 zv|1o>tOjri)?J@anWq7EH_T{@cMxpcJq^$BRJU&;!fmaGb91T)rV4&hD7x{p$(PD! z2i|^5n5i9~_X-RJ#wbX^X3u%Ia=r=lMEE=H4SG>P0M;_RM&u#>Dj)dikSPcF-bvqja2)^c}|jONX!qe|DBKA`J550QDe zdd=`4URQ+7-PoPS%xE_{^21wZ@8=Hy70ciuG=C=SI8dSqD+)LVo{)IkE#NB;2{M8< zN*AT@R9R&ZmjCG?7f1=u^8F)--Cw)~8m2LSZt3p%i~+h#(x+<^@@!4r>w zen4n`p6ONF)&^}+mXR1B#(8G=6n!vgLZ%F5Wk$}v59gy=U`&B^4pW!o{*20^jlS`S z1`E?Qg&FeQ?dRkqz$cHoltM%(F%7h9lafpt2HZ7vk-m+&B~*uhD1(CZ^c|WoZM=Za zCssz)1fzn13S|99U`h3!OUXa#n3-_|dTS<^^wA99gzTd@)#d7XudZE6&ruq=aV-4; zPp(SVqB)yPPcB~Y~# zV`b;B?$9bCgsZ%9YfB1I-w&%|b$ddwQCPP|(O%|Hta!nrh6<79eXhFN$3E$)HlMD6 z;Km=;&0A_@9I84Aqz0A%%e;c zGMKdP{u{M%0x)e7S=8ki#HJQLp5rS1^hz7B{sf zbM!ae1b%fa0h@W~erhU@WTtC87a1jcFd80UQo z#(4*ci$!tOV+#p@J!H7sE1)9iX@28I8@pmJtP22oiyCBEcN5Xm|C%;1D3W%6bvn05 zljkRWKWW_8s{aNyo7z7rF$YWm|D7AEDC^xl_Fri1n62MhBGIk!ScMRgJe=uBe>)0|B)Y|`k?t=Udz-X@u8k24h%h+u)|5;PS03Dq|!V7u#AkWM0 znVZi086zAB8zWJqBBVT*fHl$KBq_LWHo+D^eh>l^10yS-_XNXB#;Qhiak4~UI)j5J zT7FcG8?nP(tuTgHgi+*dQsv)oR;tzFFe59CUdtt71!$OCVEs0H zck`^i>mPawgX>#p79Es6rel-cF>6`&z)1}__8=G#dYa32mN)0oZk&qPh=QupuqbIR1r!YGc*qbKx~M zQ6?D3j5R%7L_r14T0-iH%Ou7g24K%lrV!ymkL7t{3k;>iE8163!$B12Ee0%MBzN9e zOL|?NE_}>7CicF*1l}^hMr#qEy;Dc^DFosK(KX(KDsZl->{s7|kZ&;qZ{p7| z5d_ZXjsBSGTX9^R4IrE!Kq1c;4mQ3OI_{FVDqg7a-Xf46Ir+9s3G2GXe#9){8g(?! zdUWp}*(YOcMTJ#>0N_L(MZ=DuE*Cqa$Lvj~nT0wzHh#m~kKD$#_^DWNv1=`lLp;j@ZHaqD+>>X)6%?r~eA-PZ4rRMg2 zNy<{JcEiU0`HcyHov|s{4j*|-pxMd_#I{$&Qd0cT>tAN+Dm`H6cxXst~Dg)2TMU)nUVx^y2ui*%M*rvHhhc@Q4is$&` zaRXx#Vl9}eG9>UOZl1v$$RAQoie>Jengt`@Gw+4>lBS_EdWO0~AS#Jt)4Fw;)6KNW z&zB)ejxZlCv?f*(ciRtokBkh#j}MFkEIm9Q5@Bi#$^cV-RFeTa*SK^L1|*DCx0do9 z+z(Z?al{Ag5Bf7<3kRVh!4hvbVL%iaAz!NQ%)BmwYtY`y!Uj}>Vn(nDR=6g~=R5x7 z&ZQ@Wz$qa(f8&nAnm|g*_0h#@%35*qbKGh913?iMii+>H0Pn}KEDWR4ha_s>dG4qV z?8|^kgE}+aOhLV@v#8`8Fxp}{9K4{0WSqIo3g z1nf+sYlUsC$6>N>vU5vw(sJmZ|>ocFok z_kF)!_r|(oWJ)wTNIr|pl`(Z`Qt`*H1!eLuTN^mV)jOJDi%2G-4sYD zn(3z7kAcP8(>7%{WTY17tCvg8eDMI-i1Q5yB75AB=cETL(H@?#IFnB zwZCwdxQ2w-W1fONVWEJNad$)a#f@91pNTYqUiztO2rHu`4fny=<80D8-5BbpE?n8L z4M-zGK18JHGSB0zTbIOzSV{is8_Y=RQk_8VUop+{rzzcqfH`2wc5aFW4Nnj8?YdV? zKcSdqU;DVY)5NB0d-VViu|c{PQ>D(CihHt)A!r9P13xO|<%bKf*|oNEEmuGmYM z@6rAlQyjD6N!QXzOKS>pEh}9AHToAM?EL2qFavkp4|ns#d+=?qTi1_0<$pEjq`9{w zvF3wi{HYeYV1W>*#VCZaG^7Eof>`w=Kk;$whPM=T#5S>z?Qc7aW7$x_Sop^$-6#SK4PH=%6nF+THFJv&ga_o4RR0;hF-B&yS#Uozdo+yE^fyI>{z; zZG1?|)nG4te=q>dnV=T#;>NJG%6qTMn(Z`TLo`_VVu}j*RI)C8AtDwbSkI*U^5GWK z^M@V$%z(l#iiN2U^k(EbPpe@Eeg?7F53E!&| zF5OvVhgYyhZB7-Q`pT z&^D091qZ@e7RH;He;*Z*97=NC=bb{|q&>#Ih=2qh+@?J~wUwvaK1t$@_e%_ICg?yA zV^jzdW=S#DZ>0t3l*Mu5HwVFsb2qyt0SL)mpInqTIAmLIwz~ODUVop)s2=?B{O&c- zyl0wk3$6Bu%o;IVe1Gw%lZ#XJ#1?NsoB4!DG*)&Hi{TZ6wg3F{^|UN^HE(?~M8BCJ2JN`5U!XFm2mw|Q zm9Iy@>lY)Io)h?<99jgE)H|}}PI2kIXfcncQY6KUZ*WS^4JRbCw4L+^zqt5B8XFU% z4+4iuP?IMW;tQ&1(HOJSeo??GhtcbQk1i=r9Xcf2k1>Kkhb4|>Dad+P`#$Zz!2c7;IC5%T@_q{XQl;{u-;7Hvw zwnm_x=zkA8KkI=S&jfp3PR8Kb42Ns;24q#Co;abD$)E?ihq4ArSH7ewG~z$*Ahz1V zP+Pb*c92v#W>d8DSeHeTPT$5qw=rkttyY@|9~feAT9jvglbV-3AXO23VAA-6TbA3j zO_aGWplC~wbCtIH+PaWsub?$zSCJIN1p^hTR5r144Gx70j@kP`b&`MyN()3hrh?H1nuVJ-jw|!CdNqeM_Cm5VTDii z8jQnx^`P`MsH=SMXB%3!UqtvButH3__-{t6vTbkOSko~jk@}4Mc*M|%Olf1(FT^?0 zM-*U0q-@2Rmc~kuR=7|Ld#iyI|s=dj}KLXt!2rsrtT5&&`eL*;zD{l)O86Y4J=6f@@~6fr9hJXco`YP*upW~f?9lGth=+*tho(|+7TtzP{r8KkD8i50GJjbXl9^gaLn}j zocK8sIg4jnq?sGi8qo3>9C#ZU+j#K{Vya%ip;vHJq?@0KM1wjJ;Kk9V?(J`n&j2_f z4f@Lx_~#gzod?eDyr1g^5hqYj4+bHWmv-|0X8*6l(Z-mTmSnRDgSdS<3G(_8Sm%;K zu%W*BJV{W&UQFjJqdFtp6my#7^6PMLIJ@T5t=;m)-3Nhe2@rdj4*50YY_VC0Ir$LU z8hNdiC|KOGBI3kQLQR%bC>~#1yZ4lk_rSCe9WMX5{N4o8mStLk6y%DH1bJfd)~YX4 zLI7i)gaZMIKcDPmAJ8&330(*1K>n##oK{Jhryx^TS2zf3fl>*4>C%J1tL1>b0VP$u zk{PA^;u&N66QmEN0DD@#s}Ml>&q-ZV0>SxtZp>nHpgpN}rW9&BjcX|GPmf4y!oYQ@Bmq+=bdsc}G?AA^sLWAA&eu12b>?PUn2StEs-T zJa?-j(Hjp{oP4;XV!RwxAx#F20&vH3X0^#^T>5{WIWv6w#?0&g|DiKA8(`=ReFcl{ zy_vs)fB(1s;QaLutISIyJ0og&$A9-r#2wURbJR>#Crq+?+HME6DA^s)M?I4e`OCgI z9_G2b()l8)R*!$*OWjXsGmfoNa+3mHIcWCk&hfqao?qcQi%KEvqy}{1kL+9qKoggd z)=!o*`qW@VK`C6+>eE&@75yb?U6IjMQCW^lg)i;l5>RI7_%-x<)6cGa{LBQUK*>Fyf?tq#6e^By*>+6 zOaMHCY;_lk_jKrmI`nU}B%l$x8s0MlDH8}U%^48n%MgU=!n&DMF0eSOi0guqwre7I zBoABO&=u4hll|{3qztd*NM}qUvVgd^0Fr)=Ia4voCUL{knA)qj#IvBSw1^mp3%2O0 z8_K{3iMq#t>qCOLpp*OAPp@^PcUA7a%HuFDfZ$t+o1zO5d66w+EJDS}~|-1L}o1qB5AZ$Q_dimLs97XLhP zTg-=)pX@mXneo^Y|K)K)<1+RmwSbZsBgis!cn7)&RRsz}Klv~)^WetY~UNM-S6cR}~#&C}qUtiBT7zL&!^6#Tv#q)&}X@*bha zZdol29tNXz0^8q!_EnU9jc>!~1U^}{ehR26EK7XfgYD#2T-$E|Ig6mh(6tt6bRxxR zUrk2`i7(zy$3WW-@eFFAn|AL-L2qd-9f~o%+cw<%PZtdD!{pDfL_^mkgiEXb!c|DU z7G#g!KbGDVQwf;vu3xbF@UOfHT4JyG{+xPKdH=~AFr}pLseG5Mq*61ZI{t1M`bqZ~ zxiG{{ersWB=z>pP-@p6yXtO$e!-phC4+ zDj9$IQ#$p)SPE@jA-|_eEl+|j)iL>^hprtr8O^;5$*U1*O0oPX`}SHsUlr;LTSc^R z??%*AEQ8Jkz`V$zu{bVLExQ+;4WRzX0Ag6yqP zCAr>PPDFZQE$>aYFIQA_^(rrgvI5JE4h}$8wnbd_%Z#Ef?!AL`?6^RsdmdMdy6Cr8 zqe*TBBKW?I;`6Uf5m%5a#;p#o`#(4!P4T|Xo11a&3dDG*f zo`Q93P#np=P^zHsH1Ai*&v!(Vn(+qsTeKyVxV!HoVB-0N!A7U^Wmh}?g^y{NijnCl zU(?i&A)n9!ITW$?Va5yP)uz3?pdO$L#iyvGq=b8R%T2vc@chI)(`xE^Lt4ruMQ^$r zva^3beO<8=V4S02ImP#|^0h*L?OBxEteY9J?J_QJb0yp-LSyfj0baaH5o3?pY6eB) za&3H+n?Jl4`HH)(G_f!?L9HXbs17?I426#I!?jPAHBuvBtxp1R!tQQKi|Yer*@v2R zF@B6D#27O6M;YzBA*HkO?I0_B1B(-0dfFYHh4YUx?9NMFzsn)+i>7;lcw-T4e0Nh9 z=gSfIsZI(R$1CdW)j+zhDjlch8q*ro6a^se@Q!F%lDWKK|esCXpZ(F8C zl!dN*Mcihv8!&qBn$(@N3+2TMmD~fd7AqkS3yUDBZ|&ioy``a zrYY+(;USd|ctzLi--Fu2W8J4>r98=>XYA{PpB!ZRg%GbUE1HMYMgoR`1K#ICXyfT< zriih1^mieD)F>bz$@^V~&cd78?;+dC;SjGCwpIQ07%0zBE@I$wA-qxw&;6rKeUo=~ zhM+G{&0EPaFywJ@U6O)nzA&GV*kB)0)|JRKm6#76oG+AMo3gEZnAXd|mFjaUg^;+H zYgveryTHqB#+JICVUWBB9E7droP%DAGw4Q2feqfN%%4L{(Ux*NoI0fA*4<=~TKOR= zNWKda-(`@TYTwJ1A!p1h@DY6($GM?C_)q-Ieo{w%B)>X8j(vl1P*cOkw&z(sw3GQP ziwe-_J2w*AFi)XFBV^JCY+?9^YH1%7N?9ZWX^E`kBtu9VxTE*X$etmtjLHJ;62_;!qk7)YN$tK(R4D+$lKVv~9gLGK=*RAJHs{WZCA zTTOPu>Qs0A(N5Yop(Jw4pcpgz>mbuENZF&)hG9q^I%Lbc^@CefpOdJJRJf3D1k+Zgm$|)|pI{Jr?$YeX&<827*0W!0S#P?1 zW+==qF}Wdspu+~-=4-yg`YI6vI9zue3&hO9<>cIPM=l~c5Q3-U|Ibe#a?RX0f8%dN3G zk+TLzAq3S`j=u6>%pJ#$-t)T8qhnDwRPrunUz8Sv6du}6>f9G`D>pQZ+vxI%sA>ww z_&poD832?F5bMRw@RlrBzP<$e%+x(|E$|<*3Jc%84VZyeQ}21SFbFm`1+tuoF(8Oj z1Xq5!(1Y4yrheRWFqN$2Akua43beA&n|vKS?Y=7nt$V69qqoH?-|?Id()NLGID1^- zb({)*5CIFNzYXIjJ{7cxzyE;y{zIT1!O3|B!~V1>Hx}HC3<9rA>o!OCp;%Pp+YJ*y ziKiBBgMzGGApYSQ+$&vI@(msfrXTvJDBz2l z+;tanvPx#p?<4h@AY%|qE)~f}Ey&crsUK)Uq=2qT+xkwaO>6;qebB!MmsanK%WuX} z7D770zG(N(y8G$_1&@I%VCDc9Zw7|@PwL$ARv_MNuVRa|iNs+o8!<8S1E}`XQ6#M? z$yU|Xi@%W#qJ*pzd|pUxLu$+V_%Bg49diTWnOgxEbh% z_F%jm`~}A;^KZd`xJ6&avkG=v$c|*#Dab>w#dHtvBYoPYzhK*k%cpjf~>^ND^z70OD?-m;bm zP}yN|_)@XqSLQ?S|DTwPwlXl|2gb-b!Gz31HkP<+i7id>!_u{5UGc2yK!fTvL-h`3 z&U<3oq$^kp00$R+F;65OTJ}K3a@3Np#f$9wU-Joh2q1qR<9Wlu52AYINCu!en%A(G zO<2h<(5#~++Ho1H>ED@>6=bk|SkavyIene{`p9)}`qZV}um@nKtUEMQmOJmr_1J3q zXove{g51&JYMa{Ms)M7@OcniP#v8gdc?0`z_C-Ms%w2dp`QGRO;mV%(P2OEwKy~t0 z_%D-p@m`*~eFEiwAF+oD{?y+!7#q@oO_ZPMEBCm{M(YVeq~=3-0RjodaxV zvQ<}`3aA|NwM3qKQSd(d4B44?YOCDSVL5@Ubq={xAxB&58>?$=Aa=d6km%iZ7@&64 z*_0Rh2lq^9HI239!tm>=wKZ-o)sX#_)psS{^oi+t4aZ*-x!2ZKm402TSrp&w6EA=G z@$|vm-MuQ~X|BAf(4$+Q6)4KXv_ssF4>vca9m4i^ww^&*;a;c}{^PIPShdhU3l5i< z9=>M}i?GYCsDJI^Hu>=TBTw&tU&a0Pa7=gYifk)oVkPgXW!(&I3m>^)p&)rGHNWCd zqh;kE_D79}Y4+>3+P9wPI*(__RVkf@w{e7PsaqH_eo&k`?&2O`uGY#7w=h1XFs*$W zsQnBinPN&r7TRt!vmgc5_OMp#vNy)K=IJyt81g}44c*Q(5QNb^K{lmF`F-uW*ic0vdxjgD6?ekFQd_EQ3X?zI!N$O9-m)~kH=(b2O zn%RjkN%*P1(8aN?F9Uo1%AMR`x#8)_p;^^3ZFE4yKo_4FDgx{^;7mLyF6F!CJULOM zm5q1jbBPT9Am6>+_LyBT;3+82JozoT+Q<;|FlSs~RPu{tCUlk*Dn;`fv!r(=AZy!V zfQzaCO4cYe|2@z%GN^k}f%Jt!D))GdJd9uIQca)HC2Hr4Y$?J@fc|%m2a{VuL#)C2dE=xY(rGDKjbfHTb7a;;fv7ADP4}9Z$ zq5H0?PmN|XKgv#>-kiOf=-mzukjggkDNZq zeXT|m?B7s1c^|=_Y7olys#fz1FROIF-l zOBwU~*?n~ixA6^r~JjZD2W6k0Yiv!u9X9h3z0wo)Caax~*NNNycmsD79_Q?&tF(JmL zg?Hn=2XtA%`~2?IMs6nhAk@EW)d)tHyWCX1bwHs388xG#jQg0jgVyioAP41XH*U+9 z)7|Lbnr!7^5L_ak8;kiaUq2F6anBOr#7}Ktu%~byGMkM7=PDYzO`LySAb~{4ZRb%r zmHC#QivZL>?qv66VXTn0R1hlxyhQFKX7z#>6SMOATq6nn$%C*hXHf3PeHE3%^y~j0P0~Uj5uk2AkVcrH5vBvIKJT5`Cx~SHtzx1y{W#sbz9TmUTpveU+~h+cvo)O z{)@gEi#xsh0ze>U#&mvsnZWeb)=xi&19<_*bahU{qxb9f$xMNO7`So|_ZMzpwOt=| zYtM;g?CHEmZkP^b)0X3+oaNM+NHSsyYP%G`ylE#E=+M`6Xc@;v&k#^TNrD%JrIVH3 z{fskjeAQDynqkRV3JN)M$bd~I6Z%YLPnlj35((_i=2R~sh@Zjb`G2(rSOp()p5(OJ znQGEt#mGG+m&qedfD;RjK_z35cGq+%$gvuf(zV0$g5jI`Eq%~Vhrk}hBV5$R>$bgp zai2ofqtOK?==a%K>z(1^{i|YwFz5*-(Jj5KWeQr|wc-RgJT&nG%<6lgFE%_y%j5bm z4(C9C*?v#1#_Dm!ENE&1ANQOq4nQ6X$xqkVIKC-MKq8B_M`kY#M?U=auvsCR)8&3P zUPOvF1eTiRkKFI&r_3sUMJXV~JDij|)%{^(?H!2hrL$z>-3zU1ss6mY+Hny=egN5i zP0DT0zFB)V;3MVq=~zOX3~+v2KnRocuAid4jjkCFn?)aTMMGYAAmbXS>LeG*)@oPB zO`nE<@Uv1Es?F`=6Tb)qX#1KKyygFAqfTYVxFw?uFYO*Sfl(r+0J;XtD3sl^F1%Ju z4jltW-0QB0Y}3X4H;o@|8#H9YX{){6-Y4baL!8GxKEqKtybl-LX}o)t8tlSrv!M42 zh&MXMg{)o+$MoHJnHTaLA}%iDE>Nj3>lk~b!aaxW84mE zb9ZMy8XaV%u9xt&(;hsu1S;yfPBh~9(j$mI+QYkzA3g6(bPl-EUqqk*Dh?%uwwE7_FMt-r zt$OkleD+8d^9T-c*x>w~bHJw$l;eH2%YUEtU5ZhK6HO^;56YWi!@{o&4=Fb!HAFZ& z5t)_8@ek(>FHh7I(dSJ3q9nmmkZ~(v`DOjzddZ*Q@d5*QK@3o%bs)OK1-_iR#}^y` zo|mIa09mVqR^;20nj{A{_n7((pk`U$+i#8m zjqeaoT0u()&N}2fhX1|XgZ(D;`;G(jK_S0-@n%o=UFMwBnT1&tU=o;8YO};8QhNny z!9p`B;N1`DgciNGDQezTkpKt3#uS*s&H;yQSUNirnNzLtQ$n5Prb)ry#lckeDuA10 z>XwE?h=kTEW4#7W7K4}KEmj8ogO7!rj}Rno0060CfibC?>ry^o_cMK}5^otZ>No$* zFuL0PKfd(yTy5oQ4}fv0=-sF~N9gNH`K@Garszm?jD2J|F6NKFZT)Ys#q;LLH-G7` z^%s^l-KMoG76PkDq8o0z+dn!zu6_#Ij2nm+og_%PhYy^PGrrDJh5OYqJ)Y2~Z3g@d zF-I30K5%DK2FwFdzuCU`2YjGFaKI*BL|;oCO<1B77 z(gvGwkZ3Q2y;a(?>16<8f&C_rW$zVT<$c#xX95uz z^02~kywc&!0FEk*n}xQT+l~1PQQJ)i;SDM-jxORy@g{L-Wkt%K`DN4yNO}VWJKR*m z428d5)&*bks0Xo8K=CDkKrQ>holU9$y+8wXiO$xoopYvrMQJ;>HDn|J9g5uHk#ZM{ zhMqB*dk+`5IceOGc7?!@GUwB8N`{1T7e?2Bqe*~|?@-MTj7$me zEM0v!?0Z&{v~$5VsWUIK_;SYNdI5J8NpXGgEQj-(;=0t#pb`?t6mPl`50hDWuzX7v zx?(wY$t^X%RG9hTv#j7Ok6*jU-nUFo8u@xWnWW?bD{ZyLWR_K zglFh6VXOubRW04ai;MAT(GDl94ChU^$6J)$F4>Ut4tdP**sLT=y+cE+Nr$FQ_`mC~ zSgC|LY?;PT?*N23s|Q%d8tu5N=`4;OJ0K4PxP~zejy1U|FKb@>0A3Xh6K#aI+ZQeL zqGEQwdkLZB7v;nD5&HsmhQx zj4#(&+qJK*Z?Lt?>?yk2ZBw$1ez<;OrWR!@vA-vNquNfN_+qLYpwsQ|Yf(jTI9Do* zK?FDG6S#PJjQrWjMkJa8bWUkKmL>uon@X>_Tfo=C{Ns7~Q=%kt=;_R_?3uXXK_-Es zkHR2lFu+=Zy0zdQe5+2r=q1&!rx17Jf+W8tuAgntlYo2e53NLcgQC`*oOQ8omVd4Z zY`mHQztM@Z4-7ihI;)DP2+UfkgRlI+Qr8fJs@+uM=L@CMpTKm3uDMA(+4tl@)nC;+ z(rqY%2uZg#)SLIuK$Ius-IGoJPLpLj@;%-=nj@ol@h-^k{&kS378ZQ) z`(#^e>@a>uuHlWnRYV3O#;epTaFr$L&blAS&^?&H7P>E6Z;P|v(IvC{t=9xsfDe982S zklrnSV=&VCm+k|7t$SswU9PG}Ir|yZ#PZjy9^ZSN9?Nv$J0ruRmTQ49^b3E1_1v>j z`^48Cfi=@omMRZu0-Bk?#z;bv?Icsk7Ss~tyx*8;-<}A6otrDEPIy{q;<)ma)+(Mg>&W zk4*USbuL329sN#(*`p}DbLA)uvu}1;QSm8_%@DjZ*3R-w64=T=;}mV=A~Sx8GD&!n zFQ@w4($#UjtxkhQ(cN2BfMI}DzO8-XMWcO{_S;W}-eJWAP#EW`HH=glZv74qtK!Z8 z6e=+eyYnXZ`Xx)TZ-;TX&?IE?CEoNauYTUOyY6@q(wyv#9x+z_*_C*;Xp*>I{~m+G ze!5qGs6Zl4GZ?L8>4ZK^ynW@Ww|DKE?x*P2otCmyw3$K0r_6wJ^a({zck1K6y^F8RUa9--cvN$m!^jMDhFWh|ppJH!rXN zrPmmTC^HaND?4#iVJ`x}FF9b!n^s-V>CJD{1d=jgh!c0Olp6APx(eFe+N%SfjS;?@ z6dFNjvjPP<>WB?qp6uI$v3j;OSdEB!k5(`!&f&eQn#T1VeY4Ha_Kl0Qmw|zOSbL#B^$oeypsC`| zIDg(0*b#yKvsdJwpUIcq1JwOI>c0{qyO=u0;!X0dnPK|G*cvvf`!d$AN#v|hZhzn` zDvf#T|Nfva!$*_#b7)b)HdUv4y?Wu>A0G`24pjr?kf%lS#HpsurT@M@=-W-)ZJTN)XgcWB_WuRD)Rx}(7dHngyUuA}an-O)Sso1yI^t52*r?DUKI5=KpYIz0^|v&d zB#6p%4*=-of%_9K$E#4}!6-&UDQ7!UQ#mXO#L>>KUX(No*-FiQbOF&cMm|T+7S~Uk ztkpjB*+n+}+8RUFb1L*ck_cv97+Qa{}ZL=>{+w0LJD_|oMVWvcY zw1)=a6D7So1A?>O z>H3Kz9FvnC354frfO|M#2})TZBek{Yiv5;EUe5@M7JxSi9&jLKvNp(y6bgTi$qNmL z*bf?!McuM`PKV3wMQ&7IWBT#iT+hH%Q{SS`W^~jKvKzGortRN$Dk~<+<3AXnm5>At zMtBD9Mpn@ToJ43rkXr}N_|VEGs%0OfY96X4p^F9Bt6YEI_085Khe)O0TI}Xmg~U3h zCKjbp;-RJ{&M{b)(ySRTbD!F1(DBp7)Z}|ic^P*84E%AgJSBv5Mhh=@BC;0rdbCID ze}N23I>7z?{7~+0M6C1WRZlew@;?P44GjUhCjLpOgtc%|gb>F`1v=lJ`u(Pi1C+pu zzr;*nC?9SGKltF?dSbZaBLn(I%)Ly9qS;#RV}ha)LI)Tp@g zqmItw8}MwP*NdJ+!^c;;xfy{Jd;w5#7k)T(zh4F-X)K&{oTTtW&0^@jt`kvH8sLAt zgcFGTxZnxsV@WgU3iUtq`tt3)T$B({Y=F{8nU42fGE4C9ZQ4D~z*~c?pRG>MECCWL z(B-2br=RN z#Ihj=ki5WpM5VmQv*)h#&cdKz5P&Y)8g93kGh>@A))4OlLU9IV?uAr`|2RROWOvL^ zz&kVEeAk7S#(H~P0&LD|AbkCuJd_rUk_6C4t2-;7zt{m0Mo(hGawxY&0%bv~kV8Qz zx|@0lta)-)prz9|1IbS`ip<$C?UhAU?_UM6AX8?8>bos#)rH^L5P*^(Ik#wmtU^~h zr8XsPFj0+@=@U4?+xx5k za@CY6MtOD6Spn?dxJ$P@Ed1jbs#U%MxnjdNFphNnDOb?`J?~56=6rcSvzuKJCsK2p zf>H!D;AKI-2i#5OE{9^0I#41uf56T^yHW220c$|)w)j`&o*UtVRu_n2IQx#5Oz!aD zC(#vP^Vh{qBsy9Pw(nN~*t|C>NJdIlVVqvIwv2zW`I!EH4gIYh+WYGmrqkm64Z@~Mw22{~x z$I3wX^}AMcHTKQjhPPd{kkUr*6XQoVn^yxKkq9;LS3&h&u7-*|j@0#AagG5kzf|6V z;Zulw*RD__y+CDsiGM=#`Or7sWnTd;7~9TLpLyFfb$e1#mh8+ot?QRbcZ9`{zz3(# z!2dfk)V_^7%>5UAi3C>Lnx=N9m+p<+_Rw)4$s7)8o|6@Od+G@wt^hFsUwj|z-f`8} z^~cHO1KH+ff(l#9Gh@0`ZJm^zZB42H9XxM>K&KJIg-DR^vq%H|b|-vmYx9MY_=Mmr zg+utp+UXZpWc4qt5lK-*9GvQ_vkF<-M~M3I6+%eVyIAURQsd>HJyF zo#K&Chs*kPfuf!d^xoYU?c?g*?YyRI>|Iz46Q0SBRHAKH#!ep?DWF&0k196k;*QDs zSbBFWb=xZ#`x!YaA;XcYlC^d%1!K%}{s*uL)QMlBeL`#Y-TI9gL0v4 zip`&#HnIsr%{FFEX9wm;Ujwr?eM#!7@pX9Df)}8>RRuCIYe79pg(XZlk!)2N$ysBr zaQs&5>t;&qM=HUZA3kt+D?PRLz`>VI#A2f{|LP~_L1U@uh zUCwRxoq`gYwA&?-V%ZGC9^t{UawJrp2o+b1%dDKgK;koXu#Gk5{@FW^J<}8=H>mXv zLGjO0nEoO;foUgvYQ?)^(pMh_>| zSfGj*(zSYYcalm69dL>;5xc1e^_9BpiUF-tP%3ef6&pYxNDYrpx9xtd9El>3K7*EFGjN-Q}iC>)hukdN&R}e~)U&KbnYjtV7 zMKTLrJKcnq|3dj;fpRzLMC*D=vS<-q@&(O~h-79~iaxOy1!zM-V(QhrSSY4A4mySb z1QG1z)FTSuFk_yljpnbXzlQ88sIze~P^7P^uHSt1MXuNPs1T_RkWrHK86~=-;ul4`u=<#p)6`@y8|Lko4{rm1+iFn&27}~osyYZWIm-}F2?(bxX zYm0vU;fr{6?x(N+uZJ(vSZn-uD2PFn8}aQ$kNl4G32zHdn^Q|FmEqN1D#v zGC`vh1Y5L`5xT=3`U@lfAR=D z4RnKqKKbnx4~rB}Lr>Xt(1q(z%o<632EN@aW`2Y7v7te8xJ99(tYA6rzD|!^Pj<#S zm?K9<(c-C8mzy$btLpavNC6TT?i`b=T-Bk;jz>C+4(tY5oz z3{Ib)<+qm0BhlnUonR@WK8Av3$pw=1URb=>fE9}v17=IUXVb_@C)mr1Ts8n%{p@ZE z?3hAtIl8J-aH;O`XlOhfqKgyA!CaS93|g6O1|%XS076xkXC0ondQ zuJWX0T)z7mn1Tl$A;7tg8RGU2U6>=F<4|Pk&K#hiy?Fu0{qVE?GUgvc41TIu{#JuI z@h${JEzCP))w*t&5#_-V&e_9a@O4`0?*ulIw&ZQ8s4ZMgXiAkJpZQiF)Yaa##iYds%Pq}hDgMvF-%-EaCpMyTZqpl zT{u{RzFcHNq&AxR_XTwn>PR(k2e}cyS^V>!3$=pJ>@c8hU8tek91j+Cvo5^dC*r7f z-5p!w1$1if)9H$(QzP^I)LZ30FIz3Ex2C|tO$d-e=+@YQs z`RYv2yHyvNTO{u=IQZ-9)t#0Q5DZBTOrE)7G57`5K~h5CNcNSW$Q|DNt~l2~LC0k4 zWKiB(6g<@H>0{E-_7>@jb`z1(+6nDZsjtP-S?5D>%W0n zD^+TOv;4kzHkd0IE$tAkoGmOXIeV`MO~m9#SN=48c`1|;jM)r_=@3C>tks*2#KD}5 zJqr(w=enwz!s0S0?Ql`tI$&8HyWgBU3UN7!HvaVqpT+aG%)y+Yp-BE>;>L1cT@j?Q#^ zz@!_ytwTI-Cepn=EYA{N%0YXrewjGj?_%gm-kQpY+|6TT&k~m-eW=gJjCFge;?4ztg>C5U+i{}SIPm@0@ktjyDUXGmc(&X)_Q75CJqpVssd(t6NAVew5sp!01M@Uc z+(&N$Bhsm$q93?96$AY_1E2e}ssxcH9z%k$%@|pGV_gTI|I&wR5Fs8+x1=G1)Jh+Eh{_dGS;ZKNvG)x0E4S|a*)GD zQ3*wu5tKLr{Qv@F06D^pJTQm|+lO4BksO4w7;a`&Wslvo1Qi^)4CL2WIkN_b{NIfB zf*MW;x-wFOH2hPdIv&}bG$_QoU?`$3kXcxAu9u?eDgh)4(SVp7$lY^~m<|Tj^T2+^ zZBdJ>cqK%yd?v|81LFdng{(O5;}_qvAMPyFux~vGBf8If0ZqY(WOO2>Mv@kFwP_-UYuKj$$L7OCR zYDDZ?v-pB>E?$tsUx&y_T0SWkf9vUX_(T@)jX$t{*WJ87$SO;4zM9IF^Tzz*E zf!_cfl@)Z{e`r#J9%#UhW5nsLwg|2F{wD;lsUIEv%;a*9nhyyYc_EW{R9-wFqUsW% zl?6nMWqDQ?zWJV$4kVDDFg`2c`7Tsl-3vGA^cq+hKfUg2Y16zYtKZ-y_Ft5is{ImB z(ivkL7gAth@%T%46HvoaGHlrk+@Fl~>(&yJs=GWl`AU7?X?ggIlXhCH)~&)^b(^sb zvU7TS2o~DceIb}{qGo}W%PT*Gj0;QiFfPA*0OPC0#aAzYo!c6!8Ztb^KvMCsP7+0~ z7cD03^h}{ew;ck}+2WR_y}**&d*UWeu}(78rHm4_b7x8L+?Hwl8anZQyX_Ia;yR-I z8nD5wrCVf%i4D&&*<7qf?KCLW-AlRgri<^sCFcrtC-e$~F3?{JZp&#u10EpOuTyAT zmc-5M09G&~f8p61Yq1-&Br!)nW4&5Zqc&at8PVvu7X2bRk5T(Q& zp8=ktLJC6!O;l_~FINZj&7b3GIuY~JdaRO4KLedQdT*pz^QL<_#d}#ywplPRX@Qb2 zwq#W$=`sZjnOf;xr;Zf)8bZ?6Sf+f2@Xqnw`zJ}$NIFB)#DwmzQY3OIln?~k#T2@$ zDTV;L_^QXS6w+E|)iNk8B?0Z#E)u8X+f9dL$+s&V&dJiNZQ6-`^ zB<+p;6W+=t+f1Z#ZFfh8Sna2M}X%8sbpEv4TXAL zCZ6X&WjEmWa97N?2)9rZ{7*wxu zq|RS2e*!c0YXMLeyqJ*tMqM@Hgn`111@8Vm*u2xY);i^*9&bUAA7yCj z$h#bnVuUkNO0Xox{Q2pw6(18QClpo!mUKnSDfZ8@yUN_X>)$;YPj(;n{as7{{HPkx z{SwmswpR{*-dG#5D*- zJw!aYX1a3WEH#2kJ4c}X2?7p3q8b=u8Mc?qd&)(z?+UW0LF9*ZSXJTDlJ59UlqZ+6 z`GQ==dDg2Wk)+ktX<8J$1;(KrZT#)R-BmyMu{gP4OwYY` zbaXJX%N=&Kx6|XjJLlbeuvn7ER_^rC@cO<|xwpggw3>48pWow?k3d>8m$;hm@e6LX zsp-kPUz?nNIn3udTU8>_c=jng&wixZLkce@Pt7^6<|pRu=sO;T93RyscjT>>#G9t=~_ z!{W}nuhnKep%K6lriG4DJOJ&%l#D}x-(Ucv7>~kjMT$+#8*pa)bZY-uqt)*IJokeR zT@d8n9jaQBQ}28U#m4O1`f;rx{MTbV0;HS0vv-QukYgIY^6|UjIwL8I2Fmj-v+B(r9m|hYLj%0I zXkl`-SMvOl3l+3|fC;x!U(EEI8S~R8ZP&OhAprss>8tN%4{C74WMk}!=s#{+74tN4 zQO0in#fX+QYlbJT>&@(5CeePN*Mxc>kC|MF#DCeQh0>;d{c45rte_9s@6?MMh%eK7 zbn8l|rIb!YMjZB(M+VG7)M$5!_~0M+IHtF(@89 zlH;vLg2@xE&HoHff@j?AVVBTkumW= z;;e(ppQgOPLqe%aNej&0%>=Mhh3872g4t$8B)b4a9w$XUFFVky<~+5T=+>Hy z3`Hu!%d`FoyPc+n1{}dOukImc3#BNVcX6zjlj?*zbb2depY}Czy$jTMs7c)bf|e)A=isc!hiC}^nqAvzU?@N5=N;ZguwqK7u7Ld=vsSs)&|JxP6alIN`dlKh2t9>` zo?zp?*#E`5=xL+yCJ-q;9apmBtvu1vbliW;8MgJ~W!i7-%Z99mCmZ3FB@b+8!h+Aw z|DMZ>XWBlWbvS1eL^+UF04ZBuv`Q38m_zZ_B+0XK#HcC>E-A=R;ZGqB$$RF(Xh7rymOwxjs$-_|B_xFt!tX`B*GpO=OLyFZqnmcC|3 zX=VRAE7(CBMv{^-jI2yQoA^!n?=_9p0Idx=DS$gE*d@8WTE8jjwR#8`j{y-FKU#&O zaQqGA2MvANFYE@;RC) zmRuh#wvEuOSB=CeiT*7t=c_=g{I1)#N<1dvNtsFHmk`7BcwL{K0^^lbilZlR3&F&s ztZmK_;LE%&ZP2xidefaz8!n5MR!Vs7lM`-0o*=nS|<;rJ& z=>!Zr-ku)z59LG@U$;pw-65JK`CB^JAGubsI8U5eFz+Yt0@!K+_N@=*JyA ztyRQ71+R87vwpuBkP~Kqn?77R{0sX1kGk+Wa8@-K8|>YdU;26SHwLCGm}@u%B2$@# zVz284lS%{4dg^9)37W+qH%0k3$BTCunQ%hZ01D8ZM^6-#7=ID^OIZXYvaWpg-vZ0m zvVBDOX0~o6_{1BH@?+b(6lyHja^;sMSizBSK!sK3WBES}QzM}T$qzzZ_{Ew8-cD{v z=lxODwh9V~NaY6Q)sIKc{pt-9#8=-2aJ-T5kGEKIK^jzrB`(1*fC`s6-D8n^(U2OZ z;$+Ia&J+RVAExo=GVPC?{WLP^F{zun^MVsWZ}v2L{EFQ>ub>XU%;Qu+qEJ@rvF}&Y zg7RO`abSa=^7zoY100ircmT(Gj=3%a>G zPi$Xa#jEL1xIGxJ0*b|MT^Q;i%?pm7hZqRzZ`HQdd8y`*lw*@^F9-r(8jc5P#zQeQ9j#Iv#9Pd`tVv=LJQR zz~!2fFF0Jb6U>d0d$EaW{j{?lOt=DA44uM#1i+QW=9D188*nB^X!bi=*so&{h! z0Hpw1qb*3U52v0K3xLmC!H8pXP(H4J#p>3JAg1(=_OjI86Hk^qLW* zsR4>c>ASMsrq*^D`5@`!V5(&LDJu0kz;*zzCm?{=0(Y=|Mb%llrORFld<}i^tj3N9 zJAOzLOrR~EXwVq3kyA+-_*|OYI|Y+^sEJoP4|zt}?!WWXnI(|SAfI{}9giuy)#Cnd z+BMcDE=6&moVvLeRk`Kr8R-Q`xk6cu5ex&PyLBINLu7a=f(4Lg;oP{)TA#lH;z>xC zi94`E@Wgxw&CJr1>pOWN zA=-OQhMnJGdo9M2nIwv4{!x4tibIuT?wyP*&BrUX-2=yM-UuPwX@quXWT zS9+fAHc&-sQgdTD1gJ>#k-&Q8W}m6iu#3ZvBcPSCxkGz?a!$HAUxiRN{`X~E$t&|q z*hmM=i7Z%9Vi8QH-yuj`Xu}*W?EhEk0P5p@&q(Z~0N7=a)^Rt3 zKKQNz{F*(uy^qxWXba#qB~W(@l)ZixpY(SK*8j(^r$#qEkniT0Wxfy6iDbtn<+ztEeLSzrt7aFvKP(=K!J!;OVsi6WVbj^@2U(zZ}QBfLta3& zdC0pT>u2J&)YWDKAw%GE72kcr5|cC$J0fQ_3iycTcOC8BfX2fxIHNO>P7|qB2;n$4}qQ}I-FiP z*PYG%pQq0e*hLkpi0+%9hj%uNa3NRFb=&mwTDV6<=bM0CeiurrJA+@KKMHRZI2h!6 zW>o!)=gT|x&=wT-J+SjP$M^E?bjNo_d{TAdP+u@#2U9XPGjX{e-*8+SRX}yn;Gds< zGhmrsazzv4&z}x0X`XH>-96kfd!;WS9=lZEY5Z79n^D7&hYtt=CO|s1=&rZleHB_s z6;2qnegQ$zDus6t>%$K%vaRvcyxnyYjF1Z;^+yADoQ3?B;+D8{53KUXUGxEDVtFA=jH~YHAMlIow^Stp|i=DM^c6$`6&jpD{YodN@N$cT?To#~dqe+-|%$fTF4 zR;=wmpv_ZpXZ^-;27mk26qLQ}ekhB8m=ak(Z*+1}und3JMH6 ztY@8lpXJS)f^15mf_4aqJinhQg;+IyP*nV}JI;n}1&G1@6h-|LhO3@M{>-^cevm5z z*bNwPPN)!8*Yl>X$iJDO9T|Kx8yp%@)$YCgI{a%n=w$&&B@s87B(p-ZN*~c(4`VPGv&RsYh<$!oZOqtvY%U0%Dy*6PCX8OFi_+Xf$m( z1Yf3!K;(JEr(J^wFxkg|=1>Ep6k0t=cx?J}ST;@@WaIoAni6p}8=DwcFnl5u9Pz7p zj){+XzVS|ke{1RuF8=UIV$zA}L;?D7(f$7&LH>vBFuX-i;u5li3!5s)0VkohYT@kvc7sYgw6(ENd1i)unU;J0%*E};>e)A@V`WKn zKI}=&M*=|EA?|JBF~?N?ly_jSs(5i(mBgpWO8Vr}V0NWjU*Flc5p18U@*s|L!c|id ztm=gkYhgh*XM;JuMmq;8z^~8c&Zf7gotxjQmY!%hn}hO_>jHah>K&d5)g*~oZg?Jt zMAzWS3nM9RR+ZU=4*ZT7Dh50%%AN+8rXtXmUmSu*eq`pGc+F;H1MiL~X4TWYM@qMu zF0-poTW7>+s?{}j!Gc#pinO~CYQmdrpzZ7y3Uixx7NB>gBzch)0m`m}6{amk3}0JD ze_-6ZM`@{>f$x=XqrFMhyG4f2pS{w%IFm z#{c4pRLa1*#Ncq`F{)*g*<^+q&A8Q<^k(UHg^L}K2W2yZda#rf08|Y0w1S_f4F)}8$3-AK8%~)et=4%xG z99aWxS0$K^5VMo;f$IYA-vt`D4xk?}S2h z)$6Vyc5^=Rwf^L(?bR3$w-v4a152Z_6K-9fpPgq9LsDO{H)g+=qk+RmS8n?6JNf1+ zz4?{rxv$^54I)|XF6zKE1jMWD)mxr!o-=Mgq<20&r8zB8+q#C<^>o<5tf_|rI*cmX zdo4CkL|MAQgT1i)9#Jk1aR|RL>~jy|qOtOf8tS_JC}001B|K;-C(Fwc!E(c?`3}lr z7bpLVfs$)$2aHe;jr*hDoac=;P66X{0^(L(t+Aph47xCrh#C0X7hKf#(?MMtSa@LT zuV@aM)MYI@MnqiB*SBsz9xQ&Ey3e}EB*8T6jCmGnWBOta`ogzeIiz4ouJ7&4Xzsni zB`y<94bgu50YWDr$34&94qt|ww!hAwe>%PNP-pk@md66gA`W+vy!2UDXmN}5v}KC+O1E8%6EU^ zTKHTJ`bgPnTH|8v+J2M%@;HST#8+nfb=ctI9~(pwwr_hme+oRszN6r=7w4aG2u(aZ z(u(>epd;kRQwJ1o&sEs?``!xAIN@w>!SgPv5G2GX3_8s)gcGFRM34j^rjo!(^81Y=XUD|pNp*lnNL*SkFZ#Iv?`V$a>!6umh(}Mixx!S7`d6&80 zXtd#`%K)v3psZ$$ekDDA?khNRG;|s8rU=E|7JJly=|s(QUyy=X zqjqrRduY}6KL|yQfPxV~|2ZdxsrFwxzfp0?DK3IL4WFysL%V&y+s%(|)44*eRB zLy5<8aQQDVA99x>)m}FNoSH;Cd^NP~0L2`|>-Jf7Q=#_C3s6UDfXWdEYfUIad zUjeQDhX}W1+PaaQ9dxq0P)@cXGYJyCqw_J#M<$=){k_>6Q$fDRXU*9c)Jq?BFM^Ky z+2p{0(F;}Y4c-e=?~9`opE6Ic1^7vo(!F(PX*VJZG3MmIPyOGwL`X-Qa{x^aq;Kkuy<->s`)A70$EM|W?2*W z#%j5AcrC+ZilvO6iqQN?ZCQ|V*^ug30oj^c!RETOI9(9;#<_?0#oAi1dC=a)S@8Q~ z1MgFoX2YqamZ_Kk3{&%+BlCvXa+8{$lh<*7d`ZzS9xDR&;7|?Avl~V47=-|#*{Bf= zfpAcD@%JiLq!ypGoX4Y!RpV92JrZ(M@?lq440?I48Tj~puSgFFC4T+qAuwsC{}{jg zu{=Ceq~tA-)S9j=k99UxgjIO<(*;|tmjG!KU9kA^e#}j^2RH(-A-F09wTERpfzu>R z1S^WQ-=8gZz56Euq&2&1^xPR?j!t)_2I}7O_JYi36FP}sq3<(kvD#Jozvqxfmm(tX zOJ7TQ3S@AGo69lcCSz6&=}O&Nb@4yIUjz14pK@Y`l9gn=DI!si4J8n}@;i;Or!kUX zQhDOaGI%IAw(~g5L%DtdA5bozT`VbLAbJ{=IKcMWFv}vsxs>IzsLd^{bOi8ev8@zys3_i@7 z>Eo;;9aF2IfdZ!XZG*{#XJ3f<(+Uz{Q_}ZTOXCmHLtK9DkTc;MKQu>+fkw-YH%J^~ckF>yI&i26bIY{j6hL4BMOHvcgQ>|`;*_)Ygyldf zLJ*5Qpl^A{bI}nn=LY~05EA4W1bto)#-ByYAV9Z4^Mf)8VwstD*XR>6O%m&%R+q;G zXi&PDH$GtdLtaJ~(ETM>@u&U6d%;+XYEEa#T~t#Q-Z>}+^9UR{VV;y#MUkla4!g%d z6bZH^3G8I*tKEj7DEszuD!|OjSQ(+$*8I^om?dt!?kdAS!@9k&8dE4jc`fp`-|UqS zm-sC?je6H3{33Px1ny)>`q$#Q-V@||lm*30_u!^=W;GCv><{=DH+F+ijN1>tb$bBg z)E1OEc*{$*5hVohM(b6k8BtKI$NV0l7piuS#E7ZMn+XZrfbx)-LbCf_5qFDyOo$F9 z`9NY1@)tothXf2y*}O;zXbDImUi-j^;hf@#Z;SVUnYeQm=N3y+RIMLYKCQb2)X5zW z!3o9bNP#AL)&^kt6Ub0%FpJ0(*t@dB?UrXXU)&9cH&iJLJcSYDZ24gqc;wF&rTF^T z5FcQg{qrmq0*uBcZZi4E;=!NBK~(q~gu(eI?$&*xJle$bwUCGazNX@j z*X@PdW!Ntv@9u+kQT(B!i=HQ}AnUK61t4%CH2*v|s{Jd<48pNdB&2)RxnPv9uzq@z zXM(2R3QSK*zg(GglmVFa!OtN(BJOPe)#+qDh9P{9u`7ZX&SYWrLNzsmeM=2+?E&Zl z42ay_P;^}V9DSNzujLJL)3F6_I7j~ zUCQi_eG7{Sv90Ql1KY#K#DFQ$+w@Wgy4=ruB*E=r8=-&$%=BU5EgMgkNG+I$0TSm} zoNX~i|F+yhD6ouZA`=IC&9*pfvGi>F?|=BAoERFPD(5rvH16>U-qubu!HD1UL*C;D zM{1CaVtOR5PTS~BL78C1yJUQcAvf!1{v6Bl0+qEW4H8}uqm^k*JTol1?cP^f(}1=u z(0tZeq`r0PcPY%!1hd92nVzpIjo&KJaF&*h9FI`=D+}G#?Xi^_&^%@*HfVVcK4n#D z^uk9j@_IsC-7ww^4_u?HtVsD=MW9!zne4in5B8-5`}8=p?EmpmJHGu553TeNg{{>Fo%#fO zPZ^K3Z%d}R7ysrY3vivg_&+9UP9ndTzhrA?kIGyGoF4qLY?9imNDanjo^17gH~ZFE z*)#w9Ue6$%VB@FXVNa5VTDE&xWLC}dE?jxJzQTg9DOvM;ANc5JfvHWi_n&aG6gYU{ z4gOUrh5gs=$k|#G-Xrcr_lSS3bQr!gc|iqd=!2H&Xiw+aFC#Dp24M7ba04sf@{H*G zReji2d>+_P$zHN(^QB|i44&nRk#kgHBKvTVnba9vii&5)9od@YT@536h1MPjjO(QaxJ#920^lJeU>-76x{xgZ zctTJ&+QEC?UpfK1I+jqkIg$%n2@a~W{^AK(Ml|KBBIJ27J(6&UQKz8FD`i26--601 z7ev5DJ8>G~p1P$yMK8!beR(n5=#57C9a59dso&b&l|ZzGWV-yS4L-Pi}24(S&5s%rUdvBFyz~5<*%Bo zTF2IhylPmQdUbjth+_JyhCMWoffG@V226EUc|gQy_zG_#EGP{DUYdEfIafB0wtxBC zFB63=WlZQ%7_hsTAH9GvWNX0WW)c`EU3Uad#Y6kISj(pF2oNeRpoUEzx-_7q{pXv8qwRn z!qJXx74E^a&riXI#{6)pUn#%a?#f?gejtnwOP&9|Q88v*cME`UZN^CDkYfGSet0FY zZgg5V1{F7OcVdInuXjj$0rPd%*TzT$Q(AFB^*8}4?i((wdB6_9E>byay&@fkz$VMb zj8Rn*(FM5i1v@CuoIB80!`RyD6pFp#s9M>i_zQ6@$G(qL>3L{BU$EMwkpX1WwySxsSO&g>jqCO;>SCXm?x%HoS zd3x&M**yLT*SAT=Y>54QIMD>IllxApuD-8f_vi$4DhEw_7TI^tctgt{`jNtjv9CH332_sYdj%#bP(|FKTT z9Hj36u&gn9^8eP+e>%}t2d!#LYybC_KT6W)>e5u#*KCl;*tzq$>~7c9*dz^24YaDu z4>#nj$eXH>=*CxpF;f@spDw(BH#pz$VU(rJy*gFFl##*DUy(*|Rx3HSK3v~YKo@np zsq%woCD^h5^zV@7LwmgM^?z^{)--NfjzN$AnSSlm01AGImB^)5>%Rs6KgeLAS0aa9 z05KVh?*=f!V|cw7ulE10JP%p|S3X(z6jlD;Kh!WBU6>$UQXnTN;+peV{+S;8(1pF^ z*>m4J8w?*@mt);(W+jFIk+)Yj#;E854=UF66@jd%>Z|y7dnX{JJ5OdIiaZ3C9J9^8 z&XO6M{7%6Lw4uD-)jAr$4lz|}6?p4?$#B5Arhl=WpRc0ZuRbK}S9(TNhUv5tm<<;l!ZPWJwX0gX&Phaw&=}F#Y>AcKq<%&Nnl`GTr2K0tSo?nAwD_XZr zF*)2twH-Sm%HB;LaYcKQourj6u8Tjog8e~@vKji8lb0X0l6th3pKv$&?==a4LdUdY zTjV;PRf6RXG;nHd*5Lc&5m(4T|1|A!RxAXLA*xw%8K=o2^}$s~9e@Q+%fcVysNU4_ zY=#bZhY+3q^Twqy0Sd^L6x>ZU5svqte%J2u-l@hM^s6D;1@;wp&cxc|Pp&G^ z_5JBTG90M}t8Md+lfBoB1_!h@FgCYIxhHdf?tC!zA9o`v)_uKR@xt>dei18~(wYdL zU(q!y>&hoB&-~2NMfPO5a#X#;E#jud>;vS3mJ4zu35Cn*&$5F6Wgh?g z9xw(h{C5FBwVtP7F;Guw znkLFW(=?pTeC?x5nu5GZh}Rt|i402o4Z1gfZfj6XE2D{t23jkZ?D4Yck=~_A>DQDW zl09A8xuABh>@1efFyjzBfC+`Zt`V%8hW_|F5s|EQZZTb}%L%GtU2&?9v4T?Q4-;XDL*)B$``{aQ~QU1phK_@+g{ zm?lifL9RY+)8P{SISc2%Jm>Zdwcuu)=8yoM^dt}5_5VQJ1e@(A#rx!09m+NLXNEPf zY)9NXIik>-{?5+d*GJbs@H8o5E)-3=b5p4WsI$zxNZJ{%Jh)0#9W$i~l1G;a7&U!P zg`dW+hE7?$<+qxbT066%nMzJYJ(MZORRfsq}6X{>v1*lD$|3C&>C> zCJA8vEZ2lOaN{2+#G#imE(`+U0*%h?^Fhs~# zkwk2^|3M#W6Vd%8fNJ)eGA|b;V_Wwx@C`FbgbOvdjweGDDrfpLz6y<3>l^S5VcHV; z{hY}AsqrkBR%2S7u77)bkp+-S>7FM0B&4c8tfoyF%BZ07$G2Ez-BM1sw)|^EL2X#nA}-__Gkrz`L=lX3eecT&m={xNtt=*Bo6Cv)e>r` z)Uok6$n^i{7^L$e{WQYS3V#cw<-NesMof1%=?~RD`ZClyuVMb+K+NGh`GCXiru)~h z>@N#0O3n=C3^xofyX(sFNJfJn1^6J23S<^D5y&lIR(MiHmO1_3g*Zs)_*-cAd%|>) zrioA^rx%sG{}GPR^!&9?cq$DfnX)fD_L-l~%W)8YpYQlz4>C@$+UhqcZRW)9G@kru zF#atC^iG-Ix|Cv+;0`0&+ralLxd^8Eu0@Uvc zT%xF3CFb(UvVMAj1QqHQ4Op6F_a7Sp;TwF`6Ht9!<&DNCxC*|IJT(7rGD%h z>*Rnwn%RBCR{n9G-sf)k|Fma@YVy_hlTnFtkkJY-vSe`oa8?8Cn1TZBs7giB(C%3w zw$Qu_T_KJ-vUJNk&wB^N2`C{&#%mJ}6gH+|${0 zfN>FmiML9Ofb2o&y0#r_!*|A1ium_df2RI)|9Zcb(PbZQy6{~3A6yFJwN zOx)t%UQ+%Vwp33J%&JJh#Nm=Iyfg9lYFspKxU9(e^vTI3Xui&7YH}iAFedM*^+maa z79s$fC<_;Z8`Ka5Jh$=OQoJw;Sj4d6Sa_|~UcLM0uSAQb#e)Zm>DR>>*EK2j z0{c-h?`kIcXtkjoQMFEi>}dh`IXrNeiM~6nxX_f_9d#?>NJlmp9N@n7%2A4KeWRVl z`Cou~#M-&uoTD#BP_Qz+Cmt95(l;MhK9fWL@y!Bu@miNzzcjEc z17^;J=D@M^-$%1+fQH=s9`M~6-CX2*3qLr~YwfCG7bPG4`rPeCgbzsk*ocwk+(zTN znr?u=UUiGR#jFC1?R}kl5=53RQMg8h;BILP?_D|R>^9h1{|g93k?X6cRZ-3kxze$==&c%1+_-0SE*?mOsa#w4k!6goG1BN>6 z5;N1U(v3N+r$Jh?(s(Yo54eRhiye}>kcL}mdkFMv%9>G%w)2S0bk)~6tqhL%jMIo& zvz=OKh~2HH3JfYy)SiuM5D??~L{54BfG+ik10`!u;oH|4m=B>d3Oc@c-`-uoN^NwC!eI zelS-MywioGNw)n)ny_9j!H89rBszOffvs!XHgaVWyy0n#X)>4A_%5*9NPTK5o^cMXo2c7 zRHYlELpnuqrmuH}6Cw1(=XNnY%YOs{`D5vWex7HKv-xL+B*f4mKMxC+SUPb_BP41* zJx|5!nSZZLM_y4B?d253i);{%xuINsI-X`P$ABvzr?fu|oN$L<>4CWDSC0dL*vY)= z#e^N}v6MSJ(fBeKQU^9{V`T@;hc-;n*x@J#^9j(BX92I7sdY4a_=F_E|3efUi2z3e z^EKf@Y>0Q`Pj4szbLM~=mO-Us9|hk8G}k;PHNtrX!c*R2T4~6&nYX%N=XYg6xW#Z2 z?OnzJ?~q9`;X2UfdYg8yf+Z&Er*6p7h2`R;ol^On@>t{RPycu`k&*jOKcM)IaeYgN zS*1~UE&rd3jujPYPI-_+8Si(4JSK0&=Py#MFMj{KrRsMY^ypob$o=cut9PNO?tHJ4 zJ-fudRhCm<_$k!JjAli*vEI+IdJ|m)+44KzLzI>ckNh`GmDC*i_kD!T(DN(@KJ?x! zpbP(wY){CY#=aelO34qr1U3nwWMHIF!8xDzkyA7E2|-DFVy=tRf^6`sJdX(gduq)g zbe@j%DCq7YVhDM`Wb{wYlAT6u4^Wtv_H9$pa%?o!pF^-)S1OLCktj&NB7`?-)jLZP zQ7w_Ge^5rMo&tLTLLp38&i8Vy)BQ^9AnmzchYxc_;%_^R?KG72Y;y;#H*UTzz(0BU z1vk6)F*hMPZR&nU;!UW`E!uL*%o5S-QS4_A!sDq0ZSM7Mj+=BMTgM*A)^Y&sgCio{ zs2W+^z2qvuIWl#YIH?w0&%cC~emIuJ8{^hs&E(8_lK}KVb6&eX>yr0*u8;zfGT#%_ zzLWd7y4-JE^&j#!4psnUc@OqTb6dy-+)z#WAo5uuQjHBhZdYBU`D)JN6RUtmZLlv( zHtLIf7ojPosc3ZYmEQHj9DT#pRl`@ZCV#fW(6RPC7+c&)Oe2jZ zOf|t74Tnpo_kr}uOqf!e&^>}3;=;`#knU|-R3YX4^v5{)Y?i)9l8Dl?uR?Q(^y)$i z;4@cP!BQbsQ+1~_QvWs(sJ&^AXW77J`N!Vd_kkj+Q26|(F%gPyyE1VJp-?s!&4}oW z7ug{vku{+@2}3uzL|E7;>v)jHKOKPE7rQ9)sCgmbe&DRt;~Zy2S(wr`U|E}%^0O4x z**bVRI96-Fx1ue&Ngxy+);@bjz=;5>9&+3&UqFTZbqhwD#bw_!d(&3QTN_(N%+ z?>qnf^+y+`ch-ZNE}ovMo(pvH_@3)N&*N2(xq&vX9?;do$-YX2nZs{{wyQp^j=Wm& z+U~!MF@C7~)vluL-lCDEpj>_Q49r-}BBSL}_(>q=Jucl@YlC0zud$0Be4bzF*k zfjh({A%n=ol98woN<<73kD8BxfMY3T)lT>oUV@5rI#AdZR_J7!-`}NAQZfX~M}@<= zfs)#AZJhVY{x-tHy7fy-A-}HVO|5jqw><{kn~*aWI56H@XAi$UZq93wwCTu)Aw|#% ze7MR#WNB*0xPJemb?c+cNJ)tVLE;cOzQjQiF%?T-;Sp;$I})E;(Q&J?Ow}LuDq9xM znE^*$);2uk?I~#+KwA6@RhlRkCpFd*)NxA)sJxm$D>4l_l%(e%kwzm{6$9}-=@Puu zS*!FM7)?H*i8Q-%fki_Oym7dw$`P3c{0o&rS5}q!*$XvL@JZY~gDAj?x|awXMWRET zx9ug}cY}6FfI&o_Dy`D}@Pv_(5A*`63-(}tB!x#aqeli=bw@aWwr)xmy!z=YagfOv zxnlwpx!gmd3BzXWC`yvqggX%K2d&2rtxlWBZ3G0-4vHoW+MFTT-dtA*y21<07-&@! zu-{RB+H~JB*AQ(_=-9b40d?9d~1tR|^;@PA`=3kzXn)CZ^VW8n3z#NAD-KQv{ z#$9f^P~eku6+=oC{mHdvKn09k0&|UC-alGZa!h(!i(DikDMFy%fnDq}FfCQo_fVfY z_w^kSPPksd$iH(xjI$>Wa0_c^T%yHIJo_|gyftR`frW>r&SI4iR-~^U=@9B^<^CU_ zv=Z(c+e9Ou{OlPYRS!PH;bcN-A5kX03a`1J$Emc>-nB%0Gg>He9{bke2O&qxb5O7i z`s8%gwa2t0ACR6PjdK_;p{Bue*Vf-}7;jXZ+L^ z2pe&BF`=b1ZJNk$e6sLXlMW`(Z0DHq1r!RuX4SuGw!BUIaj>a+Gwg@DCtlZjd;)qJ}D{Ycgiv8?-7y~skr5UY?TSs zx9M*$95m!}D!2D+yxsK%`bUN$8ox)_2ib{o*Azfv2%#X`!Hm()>ZESgT?Mp^l3-A7 z4h?aEZ{kE9`&Rk;_Sh#LojqEMaX9Tb&_sv=8!pA7qL%Rp56{)~q{G-Z?J-`09Z!?* zD{vTifhzi$`kZ3jN9O{iSd+1w?ETOP;Q|M@*mSOf>4 zLV3^FNX(|tT54A&PAx+T+S-8Nh@ShSBU^zM&b_i z_)Kk&jWziJRyXMoFd^bb_FBgagH^SLj;CCA!yq$qMW5Y!T7o;|T}Xnl+%URX6pC5W zi+9*9ljr`ctL3YA4)piLcK2+|O zT0JGGI9C$W6pc{j0@Sed^$UIWTZyWu8p`-_N8k)rp|(vc1M9TIv6-CEQ+{WMDsWmk z*vI;(0y|e8l6VMuT4TSo%nOCH+@vOnejbHTAqCTD5LkDXichu@r4c-80fIRo z&VICAx_8~;whZKBKIoG$Z?4dl_S4|I3)Amw6j^5KvU7;`YDb)o;p5=^x|Tc8=C#Fw zzRf1lr#3NP10iv=nhEJU5i2gE5$Pgs?q6~K32(N*BghE9%vnBaTzm@V5uJJw)2cq4 zw7Z;MAu{S3yhIz(F<2o)Cf~}nfoB~f-V=3hNezfum zhRKehm1{kVlGAH1sWte9FJgtlb8}uB-g>_8j35vzhnOqinx5pvwN3a3$O2~Yker9U zJ1XbV;~nCZ4ZeGDg=qSj-|QKk&M)4dTt#(lY?2QSle_W^cb49Cx4jv&{qY%MPEp*X z!c)C#)+`B{#pI&6z1+oDZOZg2>pgz;QFrDP)(_KMAi$JUXuAMH2g%5UjJKr*j{OAm z_y(xrw*G6ECDvq-Rp4YwGL_V0&k~EBk9eRvYQ5!01OZ3F%)U|nY`6gXHHmwpV)&>V zJzr8hreXgn!qrx1Rwl$j#N#cMgak(UHsU!HUNhoP;g?fx5LvFRCDhg5etBdjD_$Qj znLlVcTF&eioDHxrjsD^I2Qh1EmzT>7gI@8f9XiAb2C>+7`Pf6(%n{)i2s3}3R`)!C z@j4s`{1U^!3GFfVOW_0l93p{VTn-cEZIqE7Ej@Lk$qP@Q`3r^kctvEd+`tH#lsca( zuPT`d?p*&>>HA-^>Q6zZQ)OG~HOc1+rHNoxqO#(g5)##^b?+8#=p~xSFit3l<)$GC zhjK>4&?KY`}_;SdE;cZJP%tU%fZjCP~){%4LF2H#g7M-I{}g4$jK~Q}1}~{FrU>Z1W4* ze^m9G#cP8S#k|>56TsEraCdB?oS{ilax!Rk%T%VRxw)R9)LSgKxl5*5PaR`By~DNL zOJ;eex#{fCl6y!;_k{WPuk&9rcP{quGuEGG%4qe}HC@bGhFffuWuJFbyt*;viQ;~f zrMRVim!l`R*^Y~wo8}qqJUiKoj}4gll}*3ou~p|ygCWY+?3zjqn1H1Td`lNl8-rAb zPLo#y_&v+}NlSNyAqcKYvBkydkvzNpC*!o#!)I0Olq40wzq@?yTxXF91rIuRnK(g7 z)|uf41T`1%eWdjqxT;(>Y`j5VJS-9ZC7{e|iBy490de@?0W)LcF;Pmix}k^4^S=7!b4A#mz$wwyt4-u&JR6dJrk z8tQXO!+O+@NirNjBIrMxzr~#CpX-+2&6LbC6-T0Wdc6WA%<@#N?0YzEe2!7+lP|c~ zWM>B@9VJ%cF`~jyvpH%0Ew;{)gh76hd&65^&)Y7`KpWU9;&;Y0J@d_iM>#YVNP7@s z6ROyXa^gbBUuNDfpKgmT1bQ1IM+Z$EC7Nfo0}kXyw^ao|ld3LD3Ze9fFRx{PmQ zjUGU#IS6+~-1_AP$tp3fNd)v=alecb=ChOn-hPO+O1uQ(-{apMkM1Fqt{pl4Zp!<$ z`t>9hvXdWQ7{&5>lQqY-SCyY__|%;oo&Va}IMkH6O<;0d`l%dN;`qDJicipz|8m6? zaJxO-rxkdOy@rbU4Ci@Vr``G}u;WpKo(j)s=Q}q);Hxao{Lo@94uI0?ord;s+H?&$z!rhPVjyl+D ziyT>N%Js*H8?I-j`A&EZuxqZlz_Xk*EAhCxC|~5PjchbMQPJ0{sBhf5@y&l@1q0D) z`rA7eWjd%}WGgp6h%9>#D4=4(1Y=m>h9n9C`kDNI$P5*#$~+@QuRD371D%3r|U0 zCFvtUB2(%P3fTvzHQ#V*N!)ll6@a_cc=cKQS){s?v}prEZ*I;{E(C6NZPHRwcJ)hMWV9*!3**6PZ&GfBLZ_6l}Kt*SlRtJ-X}F8*G9{3}>6$)oYB zzDsMR7)Ey{3g}DQD2k`QwH{G$X#%-`q0yWIdtI2(K+!G}l5h!Rl1#K*_tRC^T+AHZ zcZh*8@$Ez*1KVAK5t`MMZ*XQ$>sFZ%<2i*w@frbbc%>-J1=%`bHk3-f&qHe>nb>v* zhbC&a@1+%KZ6T0gZb`4($3G4HVB;N4dzk><2M!s;&RtiPQdZ4);zfVD>C9SMN7KyA zW3$?})o*V@Lv;sJ<70+aORsgzMlB(TdWkrPzIh9_%3qzTlyLrgy0x%AHV$hx?{3|y zN#161BCu*^E!h zx|O@rxBT?MpCEc`kq^mXBE5I7g0y9+ar@G{k5&$9+y{i}2JdZx2nk}7b918e|C5-p zx~k)P1LC4rgIOHAzrJ)y)f-h1=Yn5GG@{ zE^6!}gXD&7?Z96#SZvU5%E=plm!B3=d)p`o4Yp9hz)4P-ACWt#sYfbWK8b-Gwe}vh^o;*>r zg*a~#gJTP;+alG?m)ie;#*C0fZjQbLDpkZ7OwAVf_ozW5=#7F>#7f2}+mpY8-od*5 zXjL%CzJd8Hi|!%X_Dwq_2wk>`BnNyq-wXCbcym_ z(*uAKy{4d%Q|z*}snM|2n#~3;i_Ugj+P~>L;dtY~v%d6rl|H)h8miPRB14%LunG$+ zm~NX@S4D_kPW~PUDgndIhM2%N3SFo6kJ~<0hf{zBP{_|b9u3FBjD2sY4(w;MZ}C>N zM|la#?e*t%2q{8s+-MqWROguQO9X8^2^fAeSQp=C=Io#s5c7~?i-Pt17D#E<6^Z!Y zsT^H*>+FaPmV&ou+TKq7iLPcnSmk#~+-t zmvXw*zGs64X}>GkTRXft;E)rf}cCqxu?zGoVOPa1sTM5cBYm|OrMtOAk zU<$QzkLm~^ZGCv*;*fno9?e_O$58dQ_y%t44(guyCK3f%?H58tztwU$PDBjT#J8nX z0Yb!L#}Ajy{k)PenmawP#G)1@NI3pZ;#gUYD)Kgxe$+^79LHv;uzhX$)rE(cp;At zeko*cyPIM!5ID^0Vlg92)XXBiVZ-1!$b4DgzajWkCFJJ<@|58`m-g$1ybSpH57AUK zXL%@{lcElSQ2dIddb^6vdOWKqtcmw@uu%{<;j-W6XZ?P33lGIdYPs7wQ1PF1GyVr2 zEIs4+-$(&wtBDuQs3a6M=FX^!N9~pq~m)N=VDxvO~r35b?!SErEi6Ivt`=Eb^ zP6A}$%xOD{`_GfjKkU%tQVRE4$)L9mzAQzrUV3N5Ii4b7i0^f{hMiE4YK@51b~A&B z-?!__=pUIQ_HLNyiX04_0?|4^j8*80(O;8gih*aO9)`|?jz_i23QFS}2R`u#XNfuQ za4bm4+EE01iHs6J#A8TH$lag5lZVnbpU>{`#w}(ejpv5beK*SPAZe$dDxJD#Ql*_0jzABR!{0p48K|}#(*-+nb zHK)I(5@d^PJ&QoHp1iPk+(?kLd#clVEt-;UWX|yitHh(wVK)qZBu;y@nPd5phZ#w5 zb8x^x(CoyIpyT76uViE!8|V8cOWqq7$LDJWQ|skmZZ4V3>0Oe#-{Qms>{zX9XsO_{@K>Wqg%=fupwG0=JRzrx;=Ml#r zF7{%-1_z$6eE+3MzeJYgEi!nX7);~WSRZs8e9^ksd#}%XX=`mZ`XXpKHu+?0ZSL0v zeenN}vGIgfMBqrcql)#ZJ?->=tmy}pi5|J^O4&i~r~{qMq?y-EK}t0>){ z9JRzB*KhODW0ZT5Q%e<`5&uM59njRZIRj8CAmke!C&^!lssaBrd&kELhO+EWsU?0!kEiiln*21rN)avM^Daowj$@ zpyvjT^!|zBG4EFIiw3|6NwJ$a04wU~@XD&L+bP5AI=U9lo@c)Qs=xXlbqo?Q-RKbXiJQ_Qir$TxXbjl3N+#DuB;l$4t0$z zWZMJ$M<84Hpc@qhLwiKzT-U*kr&>K$$oBwVPW7@>yj_HSDLo3BYCeYT-8!X}C3t@$ zVJW4$o1yX4qoi3>dk0%aZt=bnA84{$XFc0I z+mN&Joh#x@H(Ka&epqwbFF&xsCq1D||C#csTK5*&Yaz7ABhZ2-= z^&;s>j*EPJ^;10CRXkdRn|TQt&f?O-!85yYyKbb77cqu4td zR>iO7Ky5++^rPPJPeio;X<2K~T*ZV&E!N@!_mm_uh`{+mlKTC?r&V7CTZDv>;3vhP zBq(|RsCAH2K%jvd|t^tY4 zuLXsmC2icy!D)oqm3e^qeT>TfeBJfHCDeuS5Ge8y6%(oHCS@ZZccYnOv_Ml8H*(G;7Y9Oj#PWg;TsDlG-+wfn1#fjbEy|0`8JI?10^Ov}n z2GIr4ze~5wrG93_=PkX_qPn57@YvhP_;h9l&(poz#w*~Er+;r=T+04VcO{s7#>$a> z-j^)7O^4V{f7_+;(z!jA-xFNVlDD%U!jna8GX>vZA9 zJ~|#Ql`}~moB8*IZx)R~Lnt5{hk0>;7soML3*sg;e_iTw1IHG&3{sF@Y*Kp8I*~No z*n0QhcecnJb}w$C1(3cwsjRm28t-;%8y}19oU)uqNZ&g3d@pj-(kA`KMv~0YQ|cG* z|L`tCWSWn?T^xE8@=uGGZtME6k^6gd*&IwrI6VKnn=U2<><-`)?ivo3n=tTZKa{Pkx?mitlXhiMcx8x zAdQH1$}2_|uh?D*tQI{5pr^XJ=moDr(kp>aiGD-oG~Xmja)JuE;}lxZ7iek-kM?jS z$qDZ78d2ide%#FK^zcJ?x%X(FRcOb|`>&`5#Re#A#*Rby6@A53{ASqbN21@E zESeLs`NiphhoYHv(8M)ds79`f3vR-Sf!`M`i_ixIaHJmgU&)Z=?V&DOZNI>i-WnT# z*6b{wN-wPv5yWd>C3b!*t<_!!OsGon8g~%U4UP~a; z(P1fdi9i;YGe``tCq$VK6-~Nj6m0(nQk(~C*6 zs4fcRO=xPk;}4M;O+cU`bZs!mk9|C2w0mZS4+U)0)y+ih-FoF>{b6=-jPkpY#17H% z=To{|S8Qf(N4}aCv2g%yL?*+#h0CMT0zJ|>B7d8hK7Z+vO;RM1%>3s8hIrG-KEIK_ z)jiwLLo@(;-sHaTETG3uZ{-PbsWdvm_a$xz49Ex$7`m>qI;1Gh&%KR{PJX$i7J0NJ zYIrk0?huP!#kEwQ>(uBLrB-~nr&srS`E2YyrYENDApa_3LOo(;_9J+x$lYQLwc#r+ zl+3V3vhfCoT)+9B%)zA6h|Aa|wcm(ByPtuI)zzZWtlB}!`(X=_--=Ex7 zfBo(KiUv3<@Oc0=Ja!{?eE*>aBTyXFE6QteGwC1i?w~$)8C>Xdte%vZw;MuV zZ&|%AKmaOJsRi+9!UuF?6Kft#%!$P}Ko^31p9b=clS6&_t?YBb%@0Gx1jMvHtJR&B zl}@-NH%S6i0S6#pz))VQPfiY&L1y8i5SDc`!vTdW%C3-f{&6&BR!*t@M93u?aXxS5 z*_P1p=Y9ymsQu7xo;gx0rqC-rf}scQ3Av>9598~U&%QswMP&VAX}Ao)P`@W8UiPvV zKR?}_G<#5oG;%+x;^?ehX}~>bvYP8htlmF7G=92N$Kl(`tI`_pF!4^ry&a9Sa_QC2 zG4wPN@FlbivkZ*J%?>>NW}7#)agWWLq!Tlw+oVtKw5D(fwLmamtEMp?H589jbAZZ1 zK>#snnD|Rgp)K*TZB$hCuoV){lsW86&t^G(tD_mtMAY?$-CiS%=9MX zWwP9qA1bQEjK9jIcu#dnXvO}VFv*ST{T0}=BoLvNI~H4)<#qCA_#}xMFf^unAEmW-G-PjweJJugn>xzCjJ}Z3)L+C@TjCu2hVm*pNzdUic;4;GMiH zU5@)0MDy}U-_v>H?tdk0;?-}7B^eVTXQSjOQJGC#=r&6@^L7D;J}<}$c;S!ajj^(> zy!gbTG~42(z^4lj?a$vhp%*sPN9O!cFQ*3>X0XI}xkv`b_VSBOG#OpuBTDU@;ad%g zK`dBRGC~d{0hI*1n|}&Kcu}T4w#$XN9IyV2Y<(~hBFHr?&R7y8@weEz)*$O?6Fr+g zJdPpjadcMJ5SS?=vhmp;Z3E9U>wUSV_wO&Q=by<|KYLKSFe?x{$mdco}%8l z8g(X%kRiQsrZ>~yIj3Jjs&94ftG_#|Z{BRbXx#m~HM!mR>gM)h?e^E)fQ>iD&XOB1 ze=&)#eU7=$ApQp zB!FBoOH;;O*}#`rj?D*2imzV$Wbt0Wd^_HK{uEBkbnJp|K*wm3dK0erTBFHmfNjc; z_i8-%ZV{rJ-(EWuJs0!FY)=x_x+fTpo+H{Gv4meEWLMxAiJvbkj zK5~zx@eOPOm~1OpAQV~KUtl~ohw00V9JK1{%zMe@zfGwgIE+ZSpvj!vhP^o2!4B$3h7Zh1#O{NuJ_4sEztJBsRALeb z)s&n@M2NtgaQ1%b3)RW1)mOP*_=@!W04+I*fiypv>=jK8nVUm>*z7y$tY9q>{>s`1 zMT|_^igfVRPsr4?$#d3kV2p!ATh8+GLn;}q&LKF{k3N9c@w!voe#Ftjbx#s4me`6N zu0E@M_a?UzdGl51gE@-5?EQW-)ZA_;^C?O_drGk`apcn9#5rY5Rc@SvF)>J@f2ai~;7>^(BV%hT9#h^DuNSju7T{wEjbi+Q`#cMkRyIHE zBg7l5pneLp~T<_>SSEy7BWgIKBX z#L~Ee#$yk9R5`~^k;rStZayIn)xd%#$TPe8*fM2U<>E+@-r5_pY+X~OnP|>l32_3e ze(?LFkA6}bmYv8-zj`4J#G3?nJYLw#?GxZ1V`p92DfrEnb)^;$q$7=3V+%--W+k%% zNweeykU^TDj_Ik$v6O8r+}`=u;l|)LCy)-8z_9DShyAB0#{PZBm8(qaZG4(+AOh6dtAIpVfj~6HwC`6w2KO9LzVqq06i;u*vWb;H823$63 z?x#78Ener_{CivWGs$(`lapflx^*-UtCHOa`64XZN7~W)@O4!(_*bNP?2a0VLnL?L zHF%M1TV5dcpeNt|c+?27yLdd6H9gb$nSFFKHowjOvHrc1ltk1C0HmnsSnqi~7Zy z==*#`miSQ(DN(@-RdKS5d`Qm02LlY@+8uaLVt6tB`j`qWKRWIa)E7Q00q=-ts0I^69TE2llVk?M7m&1TcG?d%nwObo6Zh%B8Y(HzR`Y)lJM6vA$s*6EBiRlV# zw1HbefI5fh#5xqrXXbF(WZz|Xw@Kd=t8A0-@mplzTYdTC%EPn09O)SRE04&zs>^mW z3v0Mo|G8ytal%PnqU1^#%POT?gD{g>bjFSrxrpBA1BeO9m6^K#qFkNo{$?Bd2})oB z=e}5XHm-g$;bVODBYNV)4XfmW%;!umPpj?yvOFjO&ekv1hgqMmQ+_Rk|DCB=^2q3a zY-~rY=`N)I&@5(u`4vFrv5dz_Nh!m@%`G=au(rDV!I5dT!k{QFmZ&KN#ud;WJO&d#TJ`8e zBIzjlB8SS?!%92KzZsT(yrV&6})`G~|egWl;K$b8~fLhtNa@^3%C z9VvFija5#$(@;D)r8sLFICEr0lP7lL?VFAlP!GXnwtMQjOdfkJ8I-%{GohqJQMIlL zR@P_ikUIjwRYzn&J2^9=FYHy3)xXbrXg;pDb7r8GQxLq1^aG%z6dj`x|8+JI2%t@W za|g|l7xX<1Z<@Sp_Js!tSFbvD43fFNlsvwcai`aviXxu&KkT(zh8ADRkq-o&B@-1d zZg4(i7I9W&4$ITx7P2yu3$Dc3??Z!E@x`OhKgSFPl=34QdX?rg2G8Ej(A|+<`b9x^ zB`Rwe4ml-kW~awJAwB#7pn@N8XfgjDNIjY)qJ-E$z?`(`GB9W!n@~XGej)u!QtdpX z<;IZBjv82Mri_{9ibD?XDJ|xAkF#=ycyG(yEYJ|3bS1MM0>#)fX*yOXluRv*WPIgEirD&%wBeDMP2$)bun&(h7D6 z=5iLL3`F1Fj>eNKdTQqh^SLov9w8`0=k@fND1-g$#`PuLD!J4Yr<-{ z5gK{SQQ8ypJ`Oj}Gt#0>hIYX*Fy10Z0JZY@Nm9zE)iFQeu63HP}*{e)jWoid!N~gJkwE|JlcOLY+VJf?yh<}>@?Pdy6A>??I z;E~wi9PZ%_DmUsB+E--QdmHyOw4CxH6`8)wgwtV_qAe}OCzWsw%wwQALr@M6P`mSc zPt@&OWMX61m9Sb($7SV~fkqHcm&Q9v7s*HoW|+$%k4(_;$8s*Z#C)MLntB=zI54sT zHxuJbSC-3 zvIpl6`tgy$*XGda*o3w?1K$%8EtfJ3JDk=SkLd;&MN5Z-0<$ivp*#|N z*bopAN6;zXVqq>gqb1AGxKGS{8tDaTv$*V593c9+m@*=U&^ZMPo-#JF#UOgUs6@qhoEbNk_`L`sAI~?$(i_v-o5&-qogsxOoc9 zR5tfrWa?Oa%K!`g@y|TZVwVSHkfbfZ07T*7wr>*A|AXK>P-e21n|KsiltzWYybhH` zfRZKb_+Gnhr_J*J$PaD5y>R0<$tjB^Teq3@hir5H5#V~l@M+*BDY?GU!#3q$?x4mE zDvFuP2)%51q(!b7vUQ2=aU|18{QQs1jp?hle`NlspjWtOnlPwBOgm$fG7i{5_HXUA@wR*ZJLO(Cx8+98z4*KH z?WWSs^lqJYKXit4@7pnqVlzkxnM1UZU#Gq?rwiQ&BGfB*_aYV!1@KC z`y0*CEwd5aZsqhKe-!?Q@ z@p4eMojd|r7cqlu-)&o&U)n5LQa*yBS+p_-abGmBsH8>zqCqg@2a}rhssD{#8Wrk4 zgHG}2)vU+=$0)_wbi9?u96cRCD&Xk07fe%>HzmI6+X*HRKWTjDTPcBlUNmEIMU&N% zzEj^`{CX;YRA^@1;Is2R`t8zANnwWix=%S5{hZGxwH*@iD(Wu}x2=RB5R;DYKlO#o zhP6G3#7pe#{#~8ij`UaAUi{k6c~-HZaeMrG?)1yOuiLe`Auk&LM*5%K`Egg1!S)$H zPUH97+KcV*@MG|s?cZZ*jrmLHz~Ow>LvJ ze{TL>Y2R}jPH)@Pc>iSg$xX$-U)L_!z6x2AzxgnmNoJRSPx9Aw|J`3+56sQ&1as!b zTZ2Z243F)|Vy1gb3o9!~7>5r*Al|T4YjDV!Quimv7he9*uGMawJ4vJyo2%P8bsi+} zTA9<8&rdL<8@`REJIv2l7y9fSQMrleazrB8JVS9Dm~8OJl+lQvuA#dcmN`3d43wBp zUFbbTUn(>FF6HfS(Ls%&rOHk8y3{u1hM;aC<-e+NAWyyN1V^KC!_UfxC)LJ)={f1I zIQlwYJa;d($vs5JGE$LK){6vM4e>AZA`w}PD@v3Kbcl8}hV?+z8h*_CPdM(MHA-}a z)z?#_siw2-X1wdN^?4|td$+!)32v@c`YKd5qB0{^L%(~l4HriQ#q#k@JUARHmp?nw zcP~NF4N28_OjK8mTUq|)GE*Obp0zAA8{$Jf*lewm0Tg16G1TaeC{>!fktzS^KMjCb z0i{im=+)~YwY>j1J(|{YAs?6$@6ZlbmlgJI;y*d+G*~=*MMdqy5r;- z@(gcZ5qQw|g8yl7{MFMr)LI&)eT~X$3+`lh?LUnagr-FnRl%9uJIK8HdS)jgl0r;X z&-tvfm-5wK{Y7hC6CXdh9B%M0bNkHa<9h*cPnm#Jl?Os8NKbxFh`%7vRcglYI8PdmU?{MwR!L@PfEH`v(q~}AKGSTRs`?LX%mMJP+q%N3OzP(5 z4XQ&sV|#JoFLJ-%z~I?*tcs$Mz`_v{w1kcHDtH8lj8r_ z*GWLGglq}HN%eOkK0VrlfQrc3WGph5-xsAc1n$?!Y^}4`A755G_nhJ;DwU0$u`lkE zQ1kBWg9O4iYM%*p^=>Yur<}I552CfG(FFUbf;!&x1i;Jz>xRMQPl(C7N#Fet*2kHx zwf4bjsfDYhMxtnx4&IQ-q8s<%wU8_|m@buHX1^qlpA`0Jk5*;G%0g&uO@4MSd3@Z{ zv5(kvK~K#dRZ=Z|ci^zcudb`@@Wtq+MdD40aDX;ra z#I|RKdK9@hFaJ2spo-MWx)xNTqmh(R0mbNANv~$ksr4Pc->M{pZd3)Wvj^=j)vpT+ z9JNJeBgu%KN-7OgCuNvwXd$7q*)WC&WX+b#@(P6TvmgtGGdniPf2hy->brMH?FJHD zdUh5ejw3!b#}H^<0^=IPB(X;8o3hp`040(vsPYDq2;EvWJm_-c(CTzjAxO-w1f$g~ zht_OEUSeVOzXk*rIx$BhAz+P$J>^G%F7T0{d=@#M7t02KD|k6$f$m-yJoTNF6rrJd zI-V7D>AGcRX1_ydvXTZ(@2NhIEYp8VJ14cM?%qCO5&cbsd@m{MaN!d7^-^No?t)># z)fsHU3k;O98l5qBoEFs1Aq|z7^3*+-dHT+*nY?J)8^G~(2#~U?@#2*3sA~0?7IWOhRmP&Q{mQ?9aQ>+L6?J#y|L~>YmrIy2xw&{w z^H_FCFcrFJq03@%yVtYt^MuzwuJ>4A6OiN4)2?P>Q82l8tNbuIZY-m8MEfowSk&&V zIjG6USbk-KS{gQ)DAHJlMX2hnya&#Zz6!1y;bP%Fxx<~WL;2~OM`LFP z+}iL*X}e~A|3Gpl`tg|fQ#a^)TO>_%DPag24}?esiY!Ls`NG00zVZ07-FqA)PVpz+*cGYXj`oYw)egX&eL&rL4<{f9sldoN2}S!XaY1}6 zW3U|yK(yj1c$-<}(jk2t6J1^8Y9gO}CXr&`QpuIT5%xETK6eJbo?O!lyP`Ig3In7x za|8NTIHFKw%*^~~A-Xq-(bnrJiwK!qPZY3@Mcq_37}fTO0}s2(9-1$}&}>tTYni4% zAI~90m(t$W3}hlPjV`P3-~gpPe{{{Bh0?!0jU_C#AkTcoN_4728wU(M&&o6$RsE)qJ_S9u@8a7lk0!e5pF4Oc{Z34kTh3(7uu;oxY{%){~ld=05IB)<3a?C$gY>#7s{2lVeRRhaJO zhaQ%MBSbp&@!($2M(y6;?|Tc4wJsNQjJNk@OaW*wxbD|@6OnA@kvwmlp5EKoeX|h1 z*Rba!w{8?Q4JozNIG2~C--n5v1yzNxT^?>bft8W%A_&cOq z{^6D6721%Po#5W~PyEK?y*Zb5+~>vKy+3&-aulF zoHmkB<(1CxV55h%QLQ(Tqn|T>ggFA)LO07L&Ya9FJ}IEZnt}4No2QP7j<|NYW!(kw ze^6y*n^)|Ok%icey0Uj|KW)JSEALLl#NUn=;<8Mn9)?4^?2Z%x?aTC>$nI9> z)XUo58te-(DIPP`rC-{QsF%9INStgHHc9*(fw|BMM|07_VG!XeF`KP9{ zPr~S>OC+MB6okAt^=WTajMM$5YICi72txlN@kqG|)-$xwANuDND}@*Enz+tBhKk_3 z(f{*%7S^iMePlexJ6$^yPa^I4vYKdhR7ZyJlYUhx ze}d}7N0EaMUTU($j)!V)hICK7)1t`TEEH#d=m#Ee3#%c>rZAO zbBBWwQD(=oEV{4^)R$8^wy@Cb)9aCi;pDi!Pw6eJAWFC(Ah6z@CfB)9`+59s+3NJM zoHx6h>#JY);u?RicHRl#T1&R$7)5wH zf;3OsN}!(N642$iDcJHNDW%$dl0o*6p_=fJW zgnA_V_;cKqnTC5>6!GNrrQf<;&d1{Q6C0l6)Q|<>Vc1o{rTFA0v*`I(d{CZsQnyxY zOP&_UlJlk7_~=g80eMk(jEKvxV)_z1iUyLkla9@RtFD(}{9CvA`N`#;r_`>=CzLNM zT@)9pnM@5N0LcHz=Ms{gN*j3K=;EQ4AXjq%fq6BW2`9UCKXEvDXZ~zKWPTWrGEZG4NErdu z#d5&G@yUDn?N(#-r|*zo zHg%zaZR~183snY+1^N}?ZW;~Ib5zFq-#Za4%ejhUaH%6bT8Ru_DgndyigLlQtrwv zco}9ie0N?A4nAw^s_?lxq?>gqtfj}5^W}&L*kM^F3}irNJ~z_iZJQZv4#?-bSFWTO z2xR&gS={-^*={C&`-==^T*g5>J;wX*9)!CrPX-Fpdz?v?x;Qqva+kdd0iy`YP4Y?I z_!xhh@iWjZ2ecO$9+$pioJDfsr~g&EnI{AuS9CeLj_2Qfi;IFL<>ft0l-$Oy+t$B}=X&;zqvZ^F?&~Sgsr8U9QoPd+7rs z;x>uuZq-#6j&@K1rk>*ictFwxY_aCpF3)d>;8N2;J)NCNO0emRoaZd?Uu2*Tt2*My zM^7c9?*Jhy<_XgHP_{#Q86z7uO5jY}93ls2DO=7FtDXXr?N9tU;M@$sYJdqzeYCE& zs_4r)@teARF9PF( zs%311^V7+pY+oE)u3NB$mrQ- zzG=uJyD)=9?ye>q*(5bl-!Ld9qUt0+-vnJ%TYTu)T@k4PKN^jrXmN+fq_f(*yOVM; z9Y!00-P20Pu7}*bp*i*N^I;Ag?b2nuI6iUAG?me39?`nEy9R<4D#Zgm~y1idh zUrn)<>_L2&*_Xf@#n1>04oGrOKC&L>y}yli+%_1#_J}^ED~Wfq2Ut^n>@G^UH)xiL zjxO%z8_mh%>}G-*E8C)5<`3o*FKm-{36?|GJlKU)lqaoSyEGDHy?Y+EaJ~UA>3YS} zjEjy;?Os8fwasw0Y^`50owdj(JysA60%4z_ zK05g^Do4Qesj5WbD_kF3o^@dLLa@>Pc6y{RT~Rdpnl=AzH(+n|@9N*QkhXP_#)&gK zN?|{4tlVsWGugk<7gN&z8tr4EZyV~W+Gr7hy5k6ZhCZa+wq68+4 zOut03sUd5-Oo++k&jA-c8l#_WYPX?$HW4i`U;3aq!_0^Don2}sI;Y%=J@*;*F16Ta zS8$#!<{mGRL{v8`dS0d#E4PcNrYt;$fJ@dBN{q(t8ZbLOwqGZ zHVQ-=75LvGr?=E+np-p^Svl2O16w}GI*B@7qE@0#{8lTU9| zM5J(zB1{N<`6Juz9VqD-U+cGHyeQfC-*0drGq3rU-jn0|GVXM%r&6kq2_3%!QTm1H za?LZ&haHCzisy%m`bd1;R;4Lke>Gx~`iqLR)-i!JOpe>{)d(d0IKA_)1cpGlc3ZZ-sl zALctPn0}`#N;>Vh6vL~$uUnC{AyK42enBkNucKa-6lf8}KmjI^jQUHgoTLboZJv1C zs*+AiuGp3u&F$mns;BKCy~AN~)KL^U-Nk52qFZ(K?_XL92xvxPexztK*YMxMORLLi zkQV^vRG%t$(Xr*cQaEzrD}Imv?lRyI#_L{7(n0aB$MCDpURJz~`5%ot%jeGJY;Md- z7YWLFYHB!OyBRbs{3(zx6p+YlUHQIF@WnrQdkZmkq>qccd?h45RAX?Vca`LdA4x{w z!Qw0WmqFJGT5?sN2R)d=uaD#pAS=n6J5glF#UzOY&CP`-4Zr)PiuEet^nsmCIK$&1V+aMqE&_pMQp{*w95|HZ`zUIoc zAFIX{yNi+*d;fFAI;cL#p(PMSER8{RA1=8txk_@X&TS#&%%-0GUNe+IL>|}W8EN07 zSv~!)`Ktbk1#3SyZ>Nf=y}NAoH3+;Qa{b+(!TWhj{&RJ1Q!n*4Kzfmo_cRyMHforF z&xOwgJFZg5Lk6=IDk)aqBaWc72B1MFDf0-vL{a@kCei|0CawM5j8mWDRe7Yptc1F& zMJUwLj&m}vtb3+jphXh}k_>#B^shH+`d&j;44AbDMP0h`9X7J9=&i+-w^W()OX(Tk z0;IU@@Id|cUi@-urIq-VI2!Zjdi^9`@2UUs39Eh zHS!;0%&twoe>o}n9r~6))P$MlMsFW@An*zQtpOYIu=SgCZ$tB`j==q0H~OlNhclne z6bBHA(59Akr2EjVkbjvIN2Y9pEg9$}BaX3GS-paYk>$NP4bH3~<6_+viv<*OBpFM77JP&jBt*H&R|*yDFpDK1bv@Nb`f>mx(g*+DXi zf{{|RZ3(G%&c7A3blj0E=`4kWFKuuuXyOBm5RC!y4o4jOl8nv~AzuIuaJt;%5{X}z z>H43y@X0%Gb980sk>7JA!B1PEYfGEAKd_IEn%yrf3_pjgPqTLaYH^FK-j>^3nnB6A z;-7AR4D<&Fy-sUy!<+lF^8YRnSG_?mJtd=9(7pgADs;Ai<3Ltg<=}odMgcA*pGBed z5J-l+(Hpn89hUUksSHOgf3LKw0c-VsQ$Ox5YMm$82C4E2yEtGn) z&Y|g5-rN+`h9)eUOk2m%W)+|w;np5H0VdRVBBSr9dr9(rWy-8a52(!!xn*l=ryg9) zo()DvoPAb3ZK3i@T9{<<9}Xp-sCwp{xNk&)d>{2bl!SPK!Zo9^R7h2~bk7-i*d80c z#fu$f&hLH6j>MoisnzQ!TLlPSpz&ru0hJt-9Ua)pi+t&Fqoine7xmVB4yXRQrqkIv z<;x5y@(vEoX|>7k`m_9~_REmdtZb}JbpIF2vpXnNy#MPeP<1xeBHlO?L*v@1&z{_J zIc9%}a4p$F(YlyDr@g;XLLsDoMg6tj=ih1+Oa{aoFA2oL!opE6Qox1H%#oj+%#t(s z#eaZ46;N(4GF^L>si3Ajfhj~2GsT)a=j`Trae=oXKe4fuRjPU7rj?ZI?n$qw5IYun z$Ns?fJ<}Cw&s4pQv*-z}URRgUI9U?^|H8rF2=A8Z#^C2!<8HYA+|S{Tm6%y#Hf+f= zdD_8{3kAP#zPCCs2$zNjG~-H;&B583emda0y?Ao2h&}Nrq7;cT`N46jF15!>;+I&C z@lPa2MbVNV|H#S7YhIYyH}xRQ;sHr`>`eN)D!$@*NjeYItxq1>vjnr>J$*1AW1ErJ zGxI1klH!;X{rE?*>eL?g78wt+Py-;XV-4Ap^><3AB>(?=pXba@g-!i`c%SqBI{n?! z8~VwA(T7B7obbP>V@jp_20A-DU;npkuLo!C^qt?|ToY4y>ObtY_lu5+(Qc;HSiPaA z^jQPf`Iv+R+kVhR|cxzA_UwzWiGDNlcdUNlLQkGNJG8$u@r>VWA=mk^zA zwlY#OWITJPgb`I_87o<|JKn<~=8`rq2)3}UfT$mMVaOHjbf?E?MC9{2 zS*z1NX$2hXl>T{w-M3s9saM2YywA6p=1`3lK^TAzK;)I;8P8k@yieBE;<39n)Yo&@ zpq0!SVxo4m3Jk86@zlO6ZM9+NgY-ZRZ~NFgvr##;?}Yj$!I;>t{_CP1&q*vFcxGaM zo`;jWyELgSp&;hc^So14X%73x3IzAMIiEM9ah^e&NjwH@$UiTa-}1pgGiiHyurAS< zgXOg9jQVT+$g`@@xVaQ$_A1_%@YJWdz7kWXe?FFlMNc5ChKH9p>VnX{bzof`8GXw@ z*&X6(hub`J(shDd0(WGo776bWBpa-w5fUBKa=&LZXFlH?TJ%g40=+E8dX6jK=Kuq6 z{2|Eu8NqrLl~rUN-4b~Pn2+lqGp&9f&-K8R0bOAq#emB*xe!+SDNJFuTF+}n^)saH z;x;|B2H7}YSV}rXIp_^q0`vLYL@6lAZ)k@rGqBoh#pL=S2r*(oY{K{mGUc?_o9jii z>0rvF9*bEdYteJe{|CBZB{JqG&Echdn#@Soy-Mzji zZ%0;}yYz)1`qbpw8P%;l8mf@{{m$b#Z5&>uU%rjJEtre>vW*U>;H`5A# zDgEO&e8zVtmlxBtp~&L}3mOF}+*v3v%d4Hri=VeWtZ=CIjvj9JWtBOCll8a?2t z8pF$~+FTJ|SrO+E{0!-xw7a)6cNhT;R=ufI#O*?r{&=*<|7oM_U{O%-%*92tn>!Cq9N zi)LyAQiMFUN{8Sb)E*XQe8_uD7R_0U{lYqMS%6jd{E{c^qz#u8u(Yf^;+Z+k86R6E z!J-GV88uyE@**PYC0C@F=LjG#TlmyHnh32uZGMIBHdWM|7kaAm5M>D5>co+mu*mqL z=(fbr6MW2W;R(*Yz%nAP2f|TOVxif1_DcoGg@i|lm;uYoD2?&Zxco&mKfNI6_5qt`_Mnt_`d8va!CZvF7 z+$({=QtQepriQ5D74-1pWs%Z6?hu-C5Lc{#H=1!^LF^Q*eY_OW-J3`&>;bq_R5$+g z#8Yb{)rklm3iA#wh(jdLr>VvqaKG%SvATD=i4g+e1zyn5D1mRC13o-_eCpa3@O5 zUjx1gYVA|@kae!+g1L~8o&F;_?9r+kJ3E)YI^(c!%=k7GU_)%Te#PR%xZ7dR?dy9L~hA96AY|pQ=I=>&t%sDj1{p~l(!DZ8I zFdra(JDO8F0YUCm1v=}s%G^^ z!ULB|wl+^8GM)D`?qyfZd$Wwgt8Q}TGe(!uh|!oI&nkxdJP9Yg7#@H<9Maa zNYdxVi>a6Gn{%74LN0Em>K!nF|1i-uL^b}Nv&zDFDsRT&eAJoi8LAN-geJ!ff;@)q~lj2O5t1mivC#=QND($4*ZA(;z zWbdIk`KbdyRJ;aueE6iP3jb=`AnHg9!|>_!8V^MG8t>l`k;|DJ8nnssMu|_<83Wi3 zX+Ux~WGugM8vBL?y-q*mvBhw;;e~SZnatYZ0F-71?YJ7#@!KV)=Tpy2Leq9gCeBe; zyr!xKd;H3Sre7Q--{sxdwYbxwGoojXx6rWce~#80&rEL&SM-}y&-6{wYmn0x_u=@N zquM&$qVHZKb{|&}ioi6H@)j+h>%W^-{Z)Mi&1os)j%V2Z&dx%7JR$V_vAlUFct=LF zva^EY&>}VtL@H3ibYunTqg7&pfzQxekAsa8kfw`d>T@+q@0K>+$x35JtmzV%mUQns zOYZf(F#X`uBY9Uy=@?!XDT)rc=<9cR=7K#a$Z=hR3}eBE5A!uxak)};GFN)F4_?Uy zqnIj+d(Y5TjMCaZ|6Zdvmu8>f{r75By3dF}p> z)O5rEM?;wO`BTPmx{rNT-6#YJ!3?Ou1olMqhlSm^!ufAD=&WJJ#B$2sqx1s1Lx{c! zo{@4-S@iO=Cf)IdR_ZEeZ}e>hj+Ad&w-$F{n)+^-F$~i}T+I!poL<8d$;~Re`0BLX z)L#oP-zB%`-eQ`&e+4}U$E)MiD@HQ7nCi5&wj(KOU4v^}w=(~DI`?X=u>k?Tw*LNyZPtAicBAP zf!WnH7Sv8;WwCsKll#c8*#3{Osma^N>O|+UX<|Et8Y7)hHYSacXI@{2r8{Dq7eHiz z59S2TCzZW_eyhh{Ie}aR2-bj9ExpWZblndji!mJ{wtvYm*Vq4=`Sl`_VviCB;;B&v z)g?77tv_h!kQN5Aq0^RiV@K!cMYRJk$?%HmvXPAJ`>jDbXipW_;`WtCK(++gg-!4U zSYB-Gl3I47JQ^O!rqy}hZJy&%4i6e~G@)tFME#q|DEV|Ua@;{OT4i*^Xqd%W{vuNp zU6V_SI)blPUTQl|fUjpR?TP54w z?hi>3@EyTp{Za?7u4K4Y2?dZMW7&QtVC$xu)n+8}E$R}9RUHQRHI6SZd_qntyyLQn zHjX>v?_r}LarAhDNPPbg9DU4;5yTX4@Ic&ZItN=x^5`sF@`hVL*S6J1I`Tie@Ju@w z=CAp28zYa8FrYj-;}oLIm6xS7#lgif7n}8+2onvRQXY(ZF+v=sxY` zOwurMAPixG*^+#IpBjIj|MmM*4XNM^g#)B z^TO$u{!-ece5uwoU9M<+t1U^_HQNvf=7;(%E@9K*v;o#%tiG>oz9z-Z+My>Lk%v%Q zGTK=dr5Azf#Tkdwh?Nn`RzA4Y-VQa2V}%UxU;3hV1Rs{%*?TOR_AjOI`UhK=>|RIu zK|WqYk_iZ;^t@vFb0>bH3j@->S8{`Mtka@e%hfvNM`(<_>kXFP8=Zr{vxA@e8Sdxo zK}hdh!WtinR+MCGUh^pWmMy1%W?ytgN`vC*mI-@)JW8S^5@p}&TQo)r-$yDHV~;Yi z+7C)nrk+$wseo)>70w?qw^et}EVOSD=&MCbjRx}A;u|=64=q_=6kTItd3giRO4Jz% zCPP4H5K)bisW4C)F28wz$jNY!;uH?gcQW}DS5eCza06CCf;l(vW=B~NU;9@ zohk;Mb@b@}Lubtv&$<0CRqX5ZG@6-RuFHK@;aK73LbzDG?R3b_laJ3oq<)Dnv)#7c z3)mT6$bA*O`#$jRtw4W=mH&zrDd~b$+tk=n>&Na-GC#y>7ii)$EaX& zbj!~TU=GjTH6+;iJL1)4TQK-2q$W?Nr)-mW&>QocFV5&M%;NSUL`qZgrBU~u(-Gkn zL;iNa;{G|@)+1&9((xrkw`{9i;yLNBftwdfXw77YW58~JJl*;k9d($6Ts#uOV=hB! z+K#u+Nbm=`FW}o9=_!H01?tHKf1Dvi_&&Jp7z=?yXpJ#jOf5IG7$>JZgmn75nA}rZY%1MsGcoVhv$Se;VUl;;Y!#0y z;bY--2n`fsNkS9)HOH7Q*(7IFEB|=mU*|xpSf0=yR$%=bGob68lWmQWD@qv*`Ib$tjw&2qAlwNOm1FjzspBm0fY{l|4d^mA&_RuIn7WzvuP5o`1@H z?)$#(YkbE0{r+6{IawJ>GTSAu&1AV%+f~VUFM3SB^!B%9{EO5|ysATLd`7ZXK!b{* zgjhjd;-eQCr;gDaz9z3{Z=`4b4*2rF*ZRcQg<9R}8Z|R4w~g!t5QlDuTb|vXe-_^@ zT3OHVHC21|WGsr6BNi7tD|Iaw7Z={mueR(D&3NwT9NJ&{a$wUtGDN2}(kqfavC02s zWCU^dPcd7@dhkr=mW;uDVMpaBe$pcqa`_b%p4S|Df0g)4khc&W{u#V_-yvG1 z%}6m=D9YF$+gBco#faIULa5Y`%a-`jfDZ^VDq&1*5K<}=OaVci+ zb{|Yy^*(j|Ud3Xt5}7i%JGCiHX<4B-Iy57BxHh^k;G93b5kI(AMv;ZDAL&?xU)gD8 zDjdUalcCS~?naWwKihAmtNWGmmH6&)n?3HUy6C(RfWVZLodT^xL_tlQ~#K3i-RnNyohA54uL}j7;h!At7 z_okIwDph|O4_|q@mQ6QBJ8Wf&b*(3QGN2G_+a_=z;XAx~G+ z`AjQszt!7)v-z>FXI4(N{o`FVVIAt-fspmb=^0K=)Rpe28d{y-kvh&MQ8W*B6|15v zF>RZRIsA8qyXzjyjM2_A({J5XL~VvvxoSQxj$4THRf(|)CteQxvAP}SyBh90*0z36 zdE$_ku+VpbmMCN@q*E+AcY5YBo11-+@I;vBxpg(|{6lxA1xK`yV%6c5Y@x1IW6#Yl zf!&>I<+0+5pH2seLv@O(5z%1;g3jB()XjWkW9=NKq;^X7E_uyisq;au>zwC;wU}q_ z1xy=l)mp~WgRpzKAKe?*r!?<=@h~7>oK4?W%Z}3zocB%mtG}Hta9R1nYMW$v$*%52 zAxAMcuO0gu{HTJ+Q`$}MMmja=cd{wG7Ux%RL(VK;KhH*zW`Ki2l? z#ePwx`l`FBD=fq0-n*Um6*2750u4A9FCQ=s7e;;9Id5U?xUu%x#Qg3$ZrHe%E=S(lA=n^piBSr*`s7!J7gN?ON^uuAlgD(H8XKs@ zxXDd7Q!2{i$qSDQAx$Dj%P;E!~-9e znhX7+k{lcL{`Sq-4qRS7Vfm8G^FVrBs_^FM$$=*kl^T@91t$GY6q7OUwOw+Anap&v zmvRGHnmb%gl+vu+q%0pez2=Wf+BBt(dMrcbDfcrKbeg?FEK3Z1wNNOH`)5CBMU>f2 zj&eN1OwC!amh{>5TmO_-q!q{Gm6>4q+-YRVO7yl$Hi|2l^{lLg)2JVTh0`xBcFlcpxI?6|&gwKf{ukX%C!Y^ljL z#b$wN%9kT=xhQ6UoqtS#yJl_i4a;jpb;3Sdm|sRB+5=j_V>901Z;W!f9?l*YKdWjY z&-Hk$<*cGL?2)Q^R7Cs2CL&t&{n`Q^qy5(uAs0LrW3QfBKxe}0u z?KffL16IF#=+gy1-E1B%gkcIayWV-9fBtqG^CclQzYL5zncIN+k)vGk7r6NU>~1!B zs*usKSZ6GA*Qi}vMdxi@l%0ykEw9W~p9+DG6BVE>b`OaN{!hjuZBHr%uZrC?vkrI< zTFuu>upMN;8D^zmY|s46@m%ONwac#vgoBlWhHyV?G~8EIpy3)gn2?(HBLP;;ZJ-yx zBd1gC2l^eiYgD#Sx)M2)8Myr}?ELf4hh&Eiy=1DEh&sx^24;Cu)edAB81(#QvMk}7 zj$dS*U-JtFgz@c#`x;&A0mk%UD!jT*abwejrQ^(BlfMD4Y7?9$pd zw*_(#1jB9T!qE6EgIi!CM!<_7!cTi7-Q-#7F#O+XV7#1o0beHN8kG)+A4 zvP-9sW)-cX&~jE4M7zm=(3$&aHQWOCq8`caqOs8ue4e|ybYE?d1}y7+6<6J(wd=l^ z#$wE&<-zXpgK_pD@%)A(;%w!b7ffP!UzThQ5qo zPb}U6i{TauRxj+Ts>M1TQQh4U?`@3Ept>qTss?K+YTBv`e7N=>o89E&g^vY(+IUV} zh%v}_4EPK1P5EQ<*tkQpf5B4A=pAS!I+6ui!6%DQ9s}x{E>U{0WPjOzKUhHnOI9#x zCYOmW_d#Q$K5)};;*Q90ocW}dlZ8bp;ru$wl2slXIVS^rCj3;fMvDsj7#4FMcRpd7 z!_AwYx+2)J*3Cv$MLqZ;ahn2FuVJNNMyq@Wb_w&N*v+gnR@z619Iu0gjT-)%hz;nb z;rDUgdD-BFaJP{7z(deFjG_rw#{)nBtc;rlX9_xywmC4~z`6dMAi7OF;1t0FV>i;< zEL00Dc3ztMFhdLQf5Xb(@45I3rIXk#+3VcC+K{nSusw!0E$x<<$KXLs>MKCAQ^An} z<924m_&zTB7B#BXILJJ|!fZQ-T`gAG^pbWb!5$V68k2&)@EWjUEjiW}X)dRN9sivA zhcJ9u?D+H4`sJbn{G28SD4NN8J%*5OJj5_a+K`sC$~+&_8U`V$SLZFVhvgQwm5Rm$ z+!d?n_&{sfSyFiQDq38K&MfxGxx$t?Sf1e`uwW|tboP1N;;Wdc>tblJ406^ZkQk9=J~0tBMB}tD}jj7k-Wk^r}AWf0WV+`Sx$?4P#TE1(A{o6`vGrd zpB6ohYhK$-Why${*O(J5qlQM8o}RPdq!Emu3= z-D;YLv<(IBbS-$jjE()xE%JXCEG6o=$&JB-<^8=jfU&==0{zs^DoCtYtHox*@3~sC z?oA*EyS)YLNJ2jk1_PJ=1)n0v1YN=CzpRB^567PRQaWg5Sa%lh5SFUp?L9Z^XllV_ zCu@hDX5+l{(5~4i|Kp(d9A=h3y)|HHWL%Bpnl$GO0%5PxLf403iiT0rlpf}XpSy-| zV&eOH#Uzf*J9Y)xngaTy7r1T2G)wqu44^aMXutL@5x414Wsc|@=1Hq&YCBV`1mt-* z`k>|0KS5w*1kd;(cYfZXdFO-&y7#sNxuA?Q6zZ_qGu>73xS*MOnf^E#QG5UQS9pYa zO4c&>9Iij9!+Ppi-;gm}{qM022^-ANR4L?Db=0YquwlVQ)nuO}=?F2%N~yRe9FIw! z?5YJW<)Omk|7{j%QQ<7lXPqbo*O81U`W6s}?@`r|mnmrs(L?*j1nAHAay;j>0%?nA z)=^W-jpS8a{4#eS3ml#-()MgB)&(7O?3LPuyPYU{UcwVM8>R&%s3NGZWRAqrrCYjq z^RpLfz}fK`4_pUvsMQS|w331x&dGQbI<;gSyVVn56*yIl*r@wy+&hs}|AIty?BV&i28RM%P8MVdrJo0R9_PPgTxlT>$Kpd$5Iu|8xi!oUBRFV)dL*MlZkfk_jBDuE zGqVt%4KLMUtvl^F>1b=XSK+*>&rwc(U@+l$p8a?GWS$#SE+{*L4l<>WID;^~e*Z3f zNa76(g^vLH1Gn7PsZ#53m4rs6ok?Dx1PvF);QQ;VNk=Ww(^)7myerG3nRT2B${e^C zgV%VzTP+V-KTAVR}XD8KP-I7T7Q>XapS z1apQJ39iS#Trvb`f;WLJ6-JgM9s>`p+Tz4~5uEpgf-JNFY%J;*$a296iz~-HL;)O6 zdIaWB>P1M*OWY0l9pW9s8WV;~0$NpNza+lpczW~Gd*B1S1IPm_Kp$t}LOhkV9{^*D zI#sDfj=Eim9^VZD(2g;8MBkYBm8ewR>4KA$-}BBeJ>#T-@%V25m3+^)f(BAkzk5`F z1MmYhbXxTgD=(YTKgb2hxTXm2Tn8Spg{dW(`16Lw83d<3@DPgbhLY2Ype?Y%sXP!? zz($??9k-4FCO>Oq$&@_20`SdP6pj2VY!K>wJZZGT{15A_*%i$U+eWyt#U>u80jS~z zk!B>zbj1e1prL^)c?=6d z<p*7MD6?SKP|7|5r@-{0?TWQD2>%4TLwpfoPlM9#|1Ktm-kDf{s-(d+&Sba> zC^(ED;D=*NdXGK~PoQ7abfze$oddRL>t{e8YoS5&?k*mf$-H{uRfeM&dLzZEqrUpf zB{)(f%0(C6?Jebq+;Is+5X_Rok5P#gS+&)dd9nSiPm_`c6AW`%gRRSh4y>C2EGpZ+ zO$v>08SR6n6rWX}$OG064jAgwWW@iwVTbA_0ljL9$HTL zD7*BrahXG~x2S^cAwAn{1+FuK%p8rok7&*y~m28*UzB~*83FIavvUh)7R8_M3PxJ71xjbv^% z2_>O+-u&PTmo3l2i8|vidJRB4#M`Pj`wQ3P`H_=HSuvmWQ0c>wz+gJTY#V#T835Wz zNTk-mLBIS)+Koh8A^D21+^;sDA z-U)(R*w}UY+`fLA1o@VnjA;hzE;lOsx(1SwlbB!CAM$CRfDmD%&Sb__vBJGZa|sSI zFZN5tD_myA4@mh=3!*nYNRQykS`wCx8zJqCs^jI5D6+F?zCKEifr$qML4c(Cf-we! zs@HiRr%jRqPe~kHeWcw5a1_?jzfSuU9)kl5MLpSNQstoG6VP9nQ%vXUt6#Rl12XZ7 zZW-Lr+1M+cIIyha<{|JlHg@r|fW5;3gBTl5-#zmM=Nsw4x2z416)Tzl2{XZs@{L>o zU|0yk&`0m@7D;zxsDceMv*I{Df$VCF494O)m`7>O9%HWt+nv@<7)>HF;V^MeHJzYe zr-5k-Fwu<5CKUp2=r*sx9P(fG>T{5j$C)OUw#nYT0385J+f*&TfJO9t3zJbos~e7D z6zNdPR-8yX$`%2srLyozD2DsuJXoN-j4tXi47-C((EzUobs%R{j%iEge+CnThcsWq zaitgP$X8;hqlFNbt+0jR{ucd}kRzJw9mFKNG^o z0JmZVbXF@l`V-7Zx7a@8_{R61RBWI=0wZi`p4c>QdJ$=!#ZU8YA0Xe@EI_c(M>cyQAb!-QzAGL$jdhfRZ1q`!Vd)|phDH@~mRTa6Jfgq@)fZ#nyPS%uL zRw&p`5dz4I$b}(3njN02a8yzeRcVN|Nt)dE z?2Xw7C>wz20PvA{miT|9PD6v^_R$JAN_PN8^{?&8t)9hJp`@>0DmZXNs_Ykre*MD> z1c5Q24w_nC%$`6eYjdN+dWZ^02ZnuvzjlU%5*|+m6s8^f&WA4kyAo8vIvK?9rc+X) zi^p(e?okoI2L$WZ@Ihy_ok;;$s|1qTL!~Ycn~BjS4;W+B=JKz{D=J|fu~o{1eq9!H zz>Wt#^E>;0+%uhmzU7E;GIa~d8vEnqn8ZwgutAjJx(=URp7_}c=Zj2NSP1d zWx=LCSzw)>rKy9_1h;Hi9mt&_oK3$7zd8YvA9PZ+SY`t~sD43H==K5A3XOis!d(o`pK10b?7DLO1F|ZXXGEid z(F3G3O}R=~IvUw!oCc&(0_dP54C}p#xX^|-IC!KDuu?rek`Qgw#Z`e3VMT?njYkYI zic6{SVT}V$rvfpNg)0p}+#~iXn}8Dmj2l=Tk(i~%>c7@cszmY^giR(;zA&`D=CWdc z+!}jd7&N+s1`sRllPo|W04(M{m$l!385+V&`8=kV-uw~qzE8bjp2^%!UU~Waw405w zpRIX$AcA_9bO~UYRL=MPRqwD053i&K+21d;%C<(}#gs(Wcnwn1P+2NH{Jr5VAHl^wTY0WH75d?`j=fr9r4JC*-aP%F%=V`!uq2-{A!iidl-MO1)P9M465B&rVReR7-LP+ z2{Cr!HZ@~^@OFVzjCK8U^0R(*O{gI<bh@my~Y$rDKMG*LkdHlhC6_p-3XA{Vv+MA*hsFWHW5^@(Nd?I6dCZvv(-iNGRcHWuFq8~{r3 zN)#@D4~JDJhVHL8z}Uyek>+?7XC9BWWnHIX&8?Yy_jcufjI%<{cIRFv5KP`c4|u4f zYCr@-U+b-=Be8^9{ewEyd)x%x$dKm3wWeYwyS@)i6%-b~t#qW}{$hR5s0dXO;A82T z3=?<&zd(62u^@3*4cEC8fN{F3%n$@P&ESK2##`8QKD~e0)nnLYqaode(@lV2s-$|? zABVv5{eKM~MX3Bn@&Dl-5ff&YRF3XrI9M#AUk`BXJFMPH%7-l<0n3S< zp`VC4PFLXt5IXLG?9V_IKt zBNtq79ildgJxaEE7PYcEDL@W!1sOS?kNkmZ^F7E;w2&Pj$N;De{2P;qO1#E(v@o|T zk85Z)tYf-8QMVde&cKCiD%I_AqA&=SwC}xZp++cKp}ENU;Kl3c%P`dgx+sK6a0{5>QZzb2$3MB0sUt zF(IdL7@f17c;HOa7wptOmBq#2Kr~Qj8g_Bc^};0fsBG}!(Mzw^YMk1b7yjrF>xMu- zef41+l$x**2N-jKj0&zsQwE*l3bikUKCH5(=K%?tga|Z=VZ9N=FxLb)N+Skb_3kB^ z$~GG3Os=3vdQ^TglXcX_Dd?DiCcO?l-$ZZk`90hb!@? zDj<(5Xu*wY|MKp7>ZO=xEs^=*7A=mp5Fg2uVtxFrE#-0ax% z4JA#&D=!0C{s!!qb~e^K1J!V)4V{S}Qu_WO%ft@ZPbCla+!wip&3OXQBX-9su`RD28u2aAo=q zM$%d@RJsp%P&jZESC17B)KE5FSRR^hAE`jNiMdbAyk1F(EGvsCqtzVTkjj`J&CsCr zyg|6JF;SEMvyoPm?4wNX`V0|Ko4}^y{=5O<$a==nCdT=)%Vmzfb-OwHoxYp=YqFcq zuEbKl`ze$^6!~dz!F^dyzskSRlY?g4*@pmW4erD_7nj=J>51G&uA##J+2{e8oM~Dl#}5v>-4TwtMrP zW5#Hn=i$))P}@FN)d3sl(qODY8`;)o_52cIPNUS@>uaNOMoVr^Rl>#g$E_cp(emx^Boe zN?*81)c%a7;8BFml8paPlv91En?L{Rm#p0HE+5#QD}Y4G!$&kw@R&+cP0!&IKUgN= zv(Y?cWaR2(q2s*E+?i@$D8KSsSUl%sVefnf=tJ{~77BZL{t!}f&j@qiZNo7oTs`Z5 zWRut#gaSXDhxRZOsluRhB@yV$PS&rv94vW5Zk>Dr+pZHn>z1cG_z+PVmiX(VZ)Lpg z?{iy5z5MkIaEHtl&H%u%c7->kc*s9q0F{2+fsoxY)S92yYH1ZDKD{IXpwBN%&`b^W zngW90;M^VKOm>xahBZIm(aQvPjJx8qKWR6^!uWdK*j+T1bJ=V{HPKqoa<;2*^2O7`ol!??yX6Cph~ef9g@Bh4Yxhnodd@y_ETnB z5oVH5YzI#%VZY?%?-GO{on>r4XPnk>&1e#suwmuN77E2)yi^^QN+%3RqW5^EzxHO= zaFI5|H5E`g3l@CZ#Wbq+oaLD!xB|-{&ugDImo|Bk*k1(0wFAT>U4}fL3HaokpVza% z8SK8|<} z&jSbxOd$f4Ib?z48xLYeo=XU1?qqz;lfzdCN#)fI=Oa?Pxd0;Y)2Cpv=J)l%OnoKRNneF^2 zOei>nLwio-C{q!}!?(;`E&y+|Dddg~6LiBEzONSNmCmrBaf(C-rh#Qsc=Igqd<3&X z%vlrG>@O{U0Dri0X6VglSm}j5?@P_32l*2&(F>xMdgg0;9KaU<+?cHF>*3G|&ksWt z0fPfS)dLK!6^~U^X!&Kczz_1WQpYSb=_=FsNf6EEba-zIEw_z9C>LGa2{pDg4o2lyN7i8}!ZynsoyCbo-M}eDyE?C|4hKR}2KKTr*`I7IKn7Nc z;C$1bofx?c_H|9NXX`pjOL0k20Y3v1Q6@R0$z!)%Q~ftUoVT_S^N7?gTL@O{!HoGx znTqdvfMa^Ge$4+e5cc%0>tLZ;U2i81_s9@v7g+UAYWs9ms5zF-dLbS%|` z?4L8y1eZ811n9>eoSBGHK&%}|zkL>%J#;dxbKD#gA3}Kt>+)=EvT`2FHIlTx7Qi|S zMPAD)SasA?FAtvp?()swsP)NFsBj618y{}CZ7EH&b64e3G*9WnI!C7DXOlHp%Z>ls zLd8=!4*l#0x$nRXvolX+6xJhb%1$$>FJOH%%XSUL^AWUOSHgh!P@^WO#a04 z{u7v}cRXNSN*&rb9E~<$bE5Gq@s5F;=p#kIZa12ix9*g{@L=4xjvTxR9O0Y>g z1^Dy!xwWzkb`=wU_aYq8orJr$bTQ=63jw%p2NDvYKlu{Yl8r`Y6auE5fh%W@g8K}YwI5z8^8@_)qye@0;Z=@g zu32De*7vGJMp`E)y5!>^n)@3t=sw4sT(nvPwi2E&pq|}-b3ae43~Orer2aZHqk!KB zfb9P{PN~hC_BUYHtAt_=z_AG-ds3kc`9d=sqR8m&FtQB=kx|PI@WHII?D;m;KO)*+ zF2UW4;t>P+znk9k8Gt~&`~iLDDt(0jEGfmUgCbm|n)ZW=EFg6|nL}(?u=<5Qk!u$0 zVEg!JXv<;rmJoaw!?b5SJF{6%>X{txdA86upCesH{pbd zcnM7dmLWBO@tHypZcTbOOnt_aLV*>4q|34S@WF5o8<8aS!W%A!btNUz4l%Ha^C$WF zzX7@&6VzwG&oqO4b@4U2*RF^Ls9;-|zMiu}tH7AxGNH_s=~$enfgia{{5#=h zqcf zTuy;Vd@~#;P5K>);v|WDgGYV-40%a zVdItCD;NMf+gArutgWBTt?jjR=~r+(L(j1*A*k6#5k_q64BvVrSY1BCAV3_`Gpm%L z^g!S)PbwB@fxjM-4Jjvi* zevT_me$Lka0EtO-uF=qX<@cdR&>G^dCwV6Q>e>$`ciBK3hc`wAPim|}0N@LvYVWfQ zR+Xm&T;0h_PlN4QPa5b^6{bB;oa<3W5R|Q7+%g)xE#~v*9^5<&vSAP7#YT^4Cklr) zk|nfnKd-Vhf+Vq zi7QBtf=v6)^lyM#*3%)shOQ_luseSVoi_abmJk~2i+xvGevqfQWC*D~U4n`;Hlfqr zHXnz^xV9KH4Jrnoh-Dv;FKB{^T=z{>qxF=Rc zI{NcYX|Hil`lUI18+#gAO!8-g%J4ZMHZ8VBU9pwHl13;V6$gqelgmV}7l1A^M; z-e_kN)D7@@fh4)r*Qv@rb-2wYa}>(y5hu6NK1nqdwr(J~=PFH?0MafBOorhQx~Sf1 zgE`&sRQ97hc*)I1M5dW^yF8%K@6MwFYzmEbWi|z10|b^xUG7l}HPDcHjUcI2Ga(z$w;gOS`8fa7YgOul$mbeh2?9-u~m3$@q= zUOiSo*#C`BRXPPqFM>r%D-yyp?&F53GfxPxR~y;hl%er2e*^=SS(c?Caegr$V8WJ^ zU?p4Z8PmKApc#*XKDF8}mR?c2XoVSF0!VDiAyU5CT~Pw;q9EJC=-Cm82<>_RvQrr+ z1@Nyd+(-oa;II%dA0Hr#!~`$_VDw@Nrc0(|Ngw*9V^ z^N|NlOXd6AE7V$*yP3$AnbCvfy=rTZ{GBF?i!m#4YgX&=8j;)21}{CEvaE6(9N%dr ziqSe4dGT#<(V=x>ztw8Pz3+v<+YO;bho1GKRhPwIqLz-^G0w7|roWO9^ok9Q3|s9a z?2YCh-ojeeR-0 zR$seD4CjUo6>8YB(}US_)?!A!*KFw0aEV7>O0J!7(swHU7|S@v3Q7rgky6FOvxQtc zC6!A9hs!2*uB&VDWRc)E6|k?4&4grm9tbKBCGIC1C>ktJ?QX^qUD~yIj$)}5@O0Ot zb-fH$vP4VMMw{ZPXW02jSFZ}8`zY1TU|2~Kq#^G z!a>i-@SMline~kKlc%QqxX!MK#U1X_T&G@j8S-%y>QX{`>Xu zo%iXlNc)50h`fruQl+JGxfHM8FKn}K$p7dWbz|mQ)f8{sLh#abSK9-Z%M5d)sH$hQ zSMS^7doeq{30<)`ud;9|WlH9(%Fu7{-t5#OKMgo3|CX6tSwEPQIJG=!AdSw8{k?4$ z&%b5yu&R4T%PKZ;l9&)bu43WnEblezoKH@D3O|#KqZmTtrT~`Dc3D|Mu+QP zR<^C1ueQ-kOJiy{EklIDC@9+m_GPZi^_}%42~vndef7j-yXd@P=K1z9Me(`~v&}t3 zf4Ca89Q9?ccC(dKchA{~Sh=P4Pr3iJjJ!oW`yOv-B^Z9npRNBKH~5I`M@WgjCQn$8 zzAe|^K*5;=4`@lk!QT=;nc~})5vr3$`cq(-U4NqrJwFJ}2m>R^sN{BkKS9|L{I%vT zwRVaA`BZ%M7vCMIO}N_cZo8D|(_yyTHZb7-{xqfKba1{XR5`ri7qjb%(rs-Dld)~a z`D-QmdM^XsGP}NMyry{};a5X{6nWb`&;+92J~7qmNq1YRZMxdJ3CZ=1;-(%(`^i&H zV=Xsjm}hxp6p**W8�SjRv0t0M`L6ho3F8=yY_Cu=h=l;?!u%b*YY5hDN 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%0D@NN=4TI;CI?ZlwS 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 Jv`OFI{eQDl9Z3KH literal 0 HcmV?d00001 diff --git a/indexer/logs/yaci-store.log.2026-04-26.0.gz b/indexer/logs/yaci-store.log.2026-04-26.0.gz new file mode 100644 index 0000000000000000000000000000000000000000..ad4b7063e066af520367dc2b463011628c05574d GIT binary patch literal 40306 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 literal 0 HcmV?d00001 From ea0ac13cf91d03bcc6944423e2b7b0fa4dbe6346 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Fri, 1 May 2026 15:23:50 +0100 Subject: [PATCH 09/19] clean up ahead of merge --- .DS_Store | Bin 8196 -> 0 bytes .gitignore | 4 + CLAUDE.md | 1 + api/.DS_Store | Bin 6148 -> 0 bytes api/api/diverging_events.csv | 98 ----- api/diverging_events.csv | 87 ----- api/src/services/event_processor.rs | 368 ++++++++++-------- diverging_events.csv | 326 ---------------- indexer/logs/yaci-store.log.2026-03-14.0.gz | Bin 47283 -> 0 bytes indexer/logs/yaci-store.log.2026-03-15.0.gz | Bin 188311 -> 0 bytes indexer/logs/yaci-store.log.2026-03-16.0.gz | Bin 301182 -> 0 bytes indexer/logs/yaci-store.log.2026-03-17.0.gz | Bin 194973 -> 0 bytes indexer/logs/yaci-store.log.2026-04-26.0.gz | Bin 40306 -> 0 bytes .../compare_events.sh | 4 +- 14 files changed, 220 insertions(+), 668 deletions(-) delete mode 100644 .DS_Store delete mode 100644 api/.DS_Store delete mode 100644 api/api/diverging_events.csv delete mode 100644 api/diverging_events.csv delete mode 100644 diverging_events.csv delete mode 100644 indexer/logs/yaci-store.log.2026-03-14.0.gz delete mode 100644 indexer/logs/yaci-store.log.2026-03-15.0.gz delete mode 100644 indexer/logs/yaci-store.log.2026-03-16.0.gz delete mode 100644 indexer/logs/yaci-store.log.2026-03-17.0.gz delete mode 100644 indexer/logs/yaci-store.log.2026-04-26.0.gz rename compare_events.sh => scripts/compare_events.sh (94%) diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 7249c71cd05f8f4e629cc832aaa8ba2ee3fcf5c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMF=!M)6#bJNxdS<{3IP?i3JMZDJF!{ASqUn{R+3y!l7l;Uxl6zz#r76figgOP zPSGk=3JWVu(xedVwFsn4nK$!i_x`%OqKz2*12g|_{{Qpdy_ws&nIj^zxYcbD%@I)p z)!K^}(3BMGx3y5Fd`|#tkWaKlU3$`AZ!N7wg=pStGrw8LxjXz=- zPKQ6R;jp2%30qDl!|7x^vhgPrHn=Ri57mF$Xsf zixGpU-R|_G4m^!`{$BI&{ii!+QQhB&iZ|?SL5k+Sy*2PzrygzcO@jB$-hK{@%qKZq zdi!eofH?^N1ij3k!@c$pLpvQDE^R=GP7a-#SBnvn!|?c4>+{P@2QkhdnlP!3%JJcc z-!x_<+e02E+czBP*fBgOWm+=ROpLr*^MX$s=dGpSG{swMuR%sKpgE~rYa?-ik zJuQoo985A^dBpQj7)z?~t2oJv=)m%-fmehTI+99|xj!p?lE;<(A1@xH>%r$r{4#$I z*ZB3&qo?*pi=LqlCHlq*u}VdR5KE&%2Td~`PVRiqv6Qo5II7bRhGuJtL{=Zv& z|9_4?ky2F!RDnNLz|`7H?L}l^BQGs>mk&@^P;Ies30s$fCig=C@3TJ)@j5`L%?Z6t S*rEqTF9Mtl+Nc75Re>`Lz!2F0 diff --git a/.gitignore b/.gitignore index 4c49bd7..4a96f0b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ .env +.DS_Store +api/logs/ +indexer/logs/ +scripts/diverging_events.csv diff --git a/CLAUDE.md b/CLAUDE.md index fe403fb..d75e9da 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -161,6 +161,7 @@ Never modify `yaci-store.jar` or YACI Store internals. Primary network: Mainnet - **Port 5433**: PostgreSQL is on host port 5433, not 5432. - **`.env` not committed**: copy `.env.example` and configure before first run. - **UTXO pruning**: YACI Store prunes spent UTXOs — historical UTXO data may not be available. +- **Cold replay vs continuous operation**: The milestone-event chain trace (`find_vendor_contract_from_inputs`) needs UTXO history to link withdraw/complete/pause/resume to a vendor contract. A continuously-running deployment captures each output before YACI Store prunes it; a fresh local sync from an old `STORE_CARDANO_SYNC_START_SLOT` cannot reconstruct chains whose inputs were pruned before sync caught up. Result: a fraction of historical milestone events will land in `treasury.events` with `vendor_contract_id = NULL` and won't update `treasury.milestones` flags. Mitigations: keep the API running, or pick a more recent start slot. - **Large JAR**: `indexer/yaci-store.jar` is ~108MB and committed to the repo. Don't regenerate unnecessarily. - **Inline datums**: `store.script.enabled=true` in YACI Store config enables milestone datum data (amounts, time limits, pause flags). Requires full re-sync after enabling. - **Milestone archiving**: Filter `WHERE NOT archived` for current milestones. Archived rows are historical versions. diff --git a/api/.DS_Store b/api/.DS_Store deleted file mode 100644 index ecb483ff4631d008af4c2103b4b0b6707f621973..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKy-EW?5T4N>2R13iYF{C5u!c)7q!u(rVv%@3V!yAF&c@2x!phnQ5qt!{`BAy# zz%EFbf!%L*{_gIB+ub1|9zIM5M13NvFa%kY4iR&w>%fD1K-L;Jw3^Qb?rgf zP4ezXw4y7zrx|U$|Hu35#ioDJ)b(WEOkl6>PM=;LpWn{5W2S$`EN_2#`dpu*L`X0Y z3<ihXsPTi23tDp$>XwPF|>4IZ$8+c{N22;J{|Rwh7)JQn1g{}pv}OcE&Fo*kMPTM zHu>$8SOo*Yz@9O{y?R^^@lk%ZZhfAdwF%=ALqy_=C=lqaO8^$KkDRE}{7H1gWyfMD TRm868z_ anyhow::Result<()> { let event_body = body.get("body").unwrap_or(body); - // First try to get project_id from metadata (older format) let project_id_from_meta = event_body.get("identifier") .and_then(|i| i.as_str()) .filter(|s| !s.is_empty()); - // Get vendor contract ID - either from metadata or by tracing tx chain + // Hints used to disambiguate when chain tracing finds multiple candidate + // vendor contracts (e.g. the tx pulls fee inputs from a sibling project). + let milestone_hints = collect_milestone_id_hints(event_body); + let vendor_contract_id: Option = if let Some(pid) = project_id_from_meta { sqlx::query_scalar( "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1" @@ -506,23 +508,17 @@ impl EventProcessor { .fetch_optional(&self.pool) .await? } else { - // Trace back through transaction chain to find the project - self.find_vendor_contract_from_inputs(&event.tx_hash).await? + self.find_vendor_contract_from_inputs(&event.tx_hash, &milestone_hints).await? }; - let vendor_contract_id = match vendor_contract_id { - Some(id) => id, - None => { - tracing::warn!("Could not find vendor contract for complete event {}", event.tx_hash); - self.insert_event_full(event, "complete", None, None, None, None, &None, &None, body).await?; - return Ok(()); - } - }; + if vendor_contract_id.is_none() { + tracing::warn!("Could not find vendor contract for complete event {}", event.tx_hash); + } - // Process completed milestones - if let Some(milestones) = event_body.get("milestones") { - // Milestones can be an object keyed by milestone_id - if let Some(obj) = milestones.as_object() { + let mut matched_milestone_id: Option = None; + + if let Some(vc_id) = vendor_contract_id { + if let Some(obj) = event_body.get("milestones").and_then(|m| m.as_object()) { for (milestone_id, milestone_data) in obj { let description = extract_text_from_value(Some(milestone_data.get("description").unwrap_or(&Value::Null))); let evidence = milestone_data.get("evidence").cloned(); @@ -543,37 +539,43 @@ impl EventProcessor { .bind(event.block_time) .bind(&description) .bind(&evidence) - .bind(vendor_contract_id) + .bind(vc_id) .bind(milestone_id) .fetch_optional(&self.pool) .await?; - if let Some(mid) = db_milestone_id { - self.insert_event_full(event, "complete", None, Some(vendor_contract_id), Some(mid), None, &None, &None, body).await?; + if matched_milestone_id.is_none() { + matched_milestone_id = db_milestone_id; } } } - } - // Also check for single milestone field (older format) - if let Some(milestone_id) = event_body.get("milestone").and_then(|m| m.as_str()) { - sqlx::query( - r#" - UPDATE treasury.milestones - SET evidence_provided = TRUE, - complete_tx_hash = $1, - complete_time = $2 - WHERE vendor_contract_id = $3 AND milestone_id = $4 AND NOT archived - "# - ) - .bind(&event.tx_hash) - .bind(event.block_time) - .bind(vendor_contract_id) - .bind(milestone_id) - .execute(&self.pool) - .await?; + if let Some(milestone_id) = event_body.get("milestone").and_then(|m| m.as_str()) { + let db_milestone_id: Option = sqlx::query_scalar( + r#" + UPDATE treasury.milestones + SET evidence_provided = TRUE, + complete_tx_hash = $1, + complete_time = $2 + WHERE vendor_contract_id = $3 AND milestone_id = $4 AND NOT archived + RETURNING id + "# + ) + .bind(&event.tx_hash) + .bind(event.block_time) + .bind(vc_id) + .bind(milestone_id) + .fetch_optional(&self.pool) + .await?; + + if matched_milestone_id.is_none() { + matched_milestone_id = db_milestone_id; + } + } } + self.insert_event_full(event, "complete", None, vendor_contract_id, matched_milestone_id, None, &None, &None, body).await?; + Ok(()) } @@ -607,7 +609,8 @@ impl EventProcessor { .and_then(|i| i.as_str()) .filter(|s| !s.is_empty()); - // Get vendor contract ID - either from metadata or by tracing tx chain + let milestone_hints = collect_milestone_id_hints(event_body); + let vendor_contract_id: Option = if let Some(pid) = project_id_from_meta { sqlx::query_scalar( "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1" @@ -616,38 +619,42 @@ impl EventProcessor { .fetch_optional(&self.pool) .await? } else { - self.find_vendor_contract_from_inputs(&event.tx_hash).await? + self.find_vendor_contract_from_inputs(&event.tx_hash, &milestone_hints).await? }; - if let Some(vc_id) = vendor_contract_id { - // Get withdraw amount from tx outputs (non-script addresses) - let withdraw_amount: Option = sqlx::query_scalar( - "SELECT COALESCE(SUM(lovelace_amount)::bigint, 0) FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr NOT LIKE 'addr1x%'" - ) - .bind(&event.tx_hash) - .fetch_optional(&self.pool) - .await?; + if vendor_contract_id.is_none() { + tracing::warn!("Could not find vendor contract for withdraw event {}", event.tx_hash); + } - // Fallback to treasury.utxos if yaci_store returned 0 (pruned UTXOs) - let withdraw_amount = match withdraw_amount { - Some(amt) if amt > 0 => Some(amt), - _ => { - let fallback: Option = sqlx::query_scalar( - "SELECT COALESCE(SUM(lovelace_amount)::bigint, 0) FROM treasury.utxos WHERE tx_hash = $1 AND address NOT LIKE 'addr1x%'" - ) - .bind(&event.tx_hash) - .fetch_optional(&self.pool) - .await?; - match fallback { - Some(a) if a > 0 => Some(a), - _ => withdraw_amount, - } + // Withdraw amount comes from tx outputs (non-script addresses) and is independent of vc lookup. + let withdraw_amount: Option = sqlx::query_scalar( + "SELECT COALESCE(SUM(lovelace_amount)::bigint, 0) FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr NOT LIKE 'addr1x%'" + ) + .bind(&event.tx_hash) + .fetch_optional(&self.pool) + .await?; + + let withdraw_amount = match withdraw_amount { + Some(amt) if amt > 0 => Some(amt), + _ => { + let fallback: Option = sqlx::query_scalar( + "SELECT COALESCE(SUM(lovelace_amount)::bigint, 0) FROM treasury.utxos WHERE tx_hash = $1 AND address NOT LIKE 'addr1x%'" + ) + .bind(&event.tx_hash) + .fetch_optional(&self.pool) + .await?; + match fallback { + Some(a) if a > 0 => Some(a), + _ => withdraw_amount, } - }; + } + }; - // Handle milestones object (plural, keyed by ID) — spec format - if let Some(milestones) = event_body.get("milestones").and_then(|m| m.as_object()) { - for (milestone_id, _milestone_data) in milestones { + let mut matched_milestone_id: Option = None; + + if let Some(vc_id) = vendor_contract_id { + if let Some(obj) = event_body.get("milestones").and_then(|m| m.as_object()) { + for (milestone_id, _milestone_data) in obj { let db_milestone_id: Option = sqlx::query_scalar( r#" UPDATE treasury.milestones @@ -667,12 +674,13 @@ impl EventProcessor { .fetch_optional(&self.pool) .await?; - if let Some(mid) = db_milestone_id { - self.insert_event_full(event, "withdraw", None, Some(vc_id), Some(mid), withdraw_amount, &None, &None, body).await?; + if matched_milestone_id.is_none() { + matched_milestone_id = db_milestone_id; } } - } else if let Some(milestone_id) = event_body.get("milestone").and_then(|m| m.as_str()) { - // Handle singular milestone (legacy format) + } + + if let Some(milestone_id) = event_body.get("milestone").and_then(|m| m.as_str()) { let db_milestone_id: Option = sqlx::query_scalar( r#" UPDATE treasury.milestones @@ -692,15 +700,14 @@ impl EventProcessor { .fetch_optional(&self.pool) .await?; - self.insert_event_full(event, "withdraw", None, Some(vc_id), db_milestone_id, withdraw_amount, &None, &None, body).await?; - } else { - self.insert_event_full(event, "withdraw", None, Some(vc_id), None, withdraw_amount, &None, &None, body).await?; + if matched_milestone_id.is_none() { + matched_milestone_id = db_milestone_id; + } } - } else { - tracing::warn!("Could not find vendor contract for withdraw event {}", event.tx_hash); - self.insert_event_full(event, "withdraw", None, None, None, None, &None, &None, body).await?; } + self.insert_event_full(event, "withdraw", None, vendor_contract_id, matched_milestone_id, withdraw_amount, &None, &None, body).await?; + Ok(()) } @@ -723,7 +730,7 @@ impl EventProcessor { .await? } else { // Find via tx chain first, then update - if let Some(vc_id) = self.find_vendor_contract_from_inputs(&event.tx_hash).await? { + if let Some(vc_id) = self.find_vendor_contract_from_inputs(&event.tx_hash, &[]).await? { sqlx::query("UPDATE treasury.vendor_contracts SET status = 'paused' WHERE id = $1") .bind(vc_id) .execute(&self.pool) @@ -764,7 +771,7 @@ impl EventProcessor { .fetch_optional(&self.pool) .await? } else { - if let Some(vc_id) = self.find_vendor_contract_from_inputs(&event.tx_hash).await? { + if let Some(vc_id) = self.find_vendor_contract_from_inputs(&event.tx_hash, &[]).await? { sqlx::query("UPDATE treasury.vendor_contracts SET status = 'active' WHERE id = $1") .bind(vc_id) .execute(&self.pool) @@ -806,7 +813,7 @@ impl EventProcessor { .fetch_optional(&self.pool) .await? } else { - self.find_vendor_contract_from_inputs(&event.tx_hash).await? + self.find_vendor_contract_from_inputs(&event.tx_hash, &[]).await? }; if let Some(vc_id) = vendor_contract_id { @@ -940,7 +947,7 @@ impl EventProcessor { .fetch_optional(&self.pool) .await? } else { - if let Some(vc_id) = self.find_vendor_contract_from_inputs(&event.tx_hash).await? { + if let Some(vc_id) = self.find_vendor_contract_from_inputs(&event.tx_hash, &[]).await? { sqlx::query("UPDATE treasury.vendor_contracts SET status = 'cancelled' WHERE id = $1") .bind(vc_id) .execute(&self.pool) @@ -1037,7 +1044,11 @@ impl EventProcessor { /// When a fund event is processed, its output UTXOs are recorded with the vendor_contract_id. /// Subsequent events (complete/withdraw/etc) spend those UTXOs, so we can find the project /// by looking at which tracked UTXOs are being spent as inputs. - async fn find_vendor_contract_from_inputs(&self, tx_hash: &str) -> anyhow::Result> { + async fn find_vendor_contract_from_inputs( + &self, + tx_hash: &str, + milestone_id_hints: &[String], + ) -> anyhow::Result> { // Get the inputs to this transaction from the transaction table's inputs JSONB. // We use this instead of yaci_store.tx_input because tx_input is pruned // (only retains ~44K recent slots), while transaction.inputs is permanent. @@ -1057,7 +1068,10 @@ impl EventProcessor { _ => vec![], }; - // Look up each input in our tracked UTXOs + // Collect every input that maps to a tracked vendor contract. A single tx can + // include inputs from multiple project chains (e.g. fee/collateral from another + // contract), so we don't want to commit to the first match blindly. + let mut candidates: Vec<(String, i16, i32)> = Vec::new(); for (input_tx_hash, input_output_index) in &inputs { let vendor_contract_id: Option = sqlx::query_scalar( r#" @@ -1072,93 +1086,121 @@ impl EventProcessor { .await?; if let Some(vc_id) = vendor_contract_id { - // Get the input UTXO's script address as a fallback for pruned outputs - let input_address: Option = sqlx::query_scalar( - "SELECT address FROM treasury.utxos WHERE tx_hash = $1 AND output_index = $2" - ) - .bind(input_tx_hash) - .bind(input_output_index) - .fetch_optional(&self.pool) - .await? - .flatten(); + candidates.push((input_tx_hash.clone(), *input_output_index, vc_id)); + } + } - // Mark this UTXO as spent and record the new outputs - sqlx::query( - r#" - UPDATE treasury.utxos - SET spent = true, spent_tx_hash = $1 - WHERE tx_hash = $2 AND output_index = $3 - "# - ) - .bind(tx_hash) - .bind(input_tx_hash) - .bind(input_output_index) - .execute(&self.pool) - .await?; + if candidates.is_empty() { + tracing::warn!("No tracked UTXO found for tx {} inputs", tx_hash); + return Ok(None); + } - // Record the outputs of this transaction with the same vendor_contract_id - let outputs: Option = sqlx::query_scalar( - "SELECT outputs::jsonb FROM yaci_store.transaction WHERE tx_hash = $1" + // Disambiguate when multiple project chains feed this tx. Prefer the candidate + // whose stored milestones match the hint keys carried by the event metadata + // (the `body.milestones` keys for complete/withdraw). Falls back to the first + // candidate if no hint matches. + let chosen_idx = if candidates.len() > 1 && !milestone_id_hints.is_empty() { + let mut best_idx = 0usize; + let mut best_score: i64 = -1; + for (i, (_, _, vc_id)) in candidates.iter().enumerate() { + let score: i64 = sqlx::query_scalar( + "SELECT COUNT(*) FROM treasury.milestones WHERE vendor_contract_id = $1 AND milestone_id = ANY($2)" ) - .bind(tx_hash) - .fetch_optional(&self.pool) + .bind(vc_id) + .bind(milestone_id_hints) + .fetch_one(&self.pool) .await?; + if score > best_score { + best_score = score; + best_idx = i; + } + } + best_idx + } else { + 0 + }; - if let Some(serde_json::Value::Array(output_arr)) = outputs { - for output in output_arr { - if let (Some(out_tx_hash), Some(output_index)) = ( - output.get("tx_hash").and_then(|h| h.as_str()), - output.get("output_index").and_then(|i| i.as_i64()) - ) { - // Look up address, amount, and inline datum (with fallback for pruned UTXOs) - let (address, lovelace_amount, out_datum) = { - let (addr, amt, datum) = self.lookup_utxo(out_tx_hash, output_index as i16).await?; - if addr.is_some() { - (addr, amt, datum) - } else { - // Third-level fallback: use the input's script address - (input_address.clone(), None, None) - } - }; - - // Only track UTXOs at script addresses (addr1x) — skip change outputs - if !address.as_ref().map_or(false, |a| a.starts_with("addr1x")) { - continue; - } - - let address_type = Some("vendor_contract"); + let (input_tx_hash, input_output_index, vc_id) = candidates[chosen_idx].clone(); - sqlx::query( - r#" - INSERT INTO treasury.utxos (tx_hash, output_index, vendor_contract_id, address, address_type, lovelace_amount, inline_datum_cbor, spent) - VALUES ($1, $2, $3, $4, $5, $6, $7, false) - ON CONFLICT (tx_hash, output_index) DO UPDATE - SET vendor_contract_id = EXCLUDED.vendor_contract_id, - address = COALESCE(EXCLUDED.address, treasury.utxos.address), - address_type = COALESCE(EXCLUDED.address_type, treasury.utxos.address_type), - lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxos.lovelace_amount), - inline_datum_cbor = COALESCE(EXCLUDED.inline_datum_cbor, treasury.utxos.inline_datum_cbor) - "# - ) - .bind(out_tx_hash) - .bind(output_index as i16) - .bind(vc_id) - .bind(&address) - .bind(address_type) - .bind(lovelace_amount) - .bind(&out_datum) - .execute(&self.pool) - .await?; + // Get the input UTXO's script address as a fallback for pruned outputs + let input_address: Option = sqlx::query_scalar( + "SELECT address FROM treasury.utxos WHERE tx_hash = $1 AND output_index = $2" + ) + .bind(&input_tx_hash) + .bind(input_output_index) + .fetch_optional(&self.pool) + .await? + .flatten(); + + // Mark this UTXO as spent and record the new outputs + sqlx::query( + r#" + UPDATE treasury.utxos + SET spent = true, spent_tx_hash = $1 + WHERE tx_hash = $2 AND output_index = $3 + "# + ) + .bind(tx_hash) + .bind(&input_tx_hash) + .bind(input_output_index) + .execute(&self.pool) + .await?; + + // Record the outputs of this transaction with the same vendor_contract_id + let outputs: Option = sqlx::query_scalar( + "SELECT outputs::jsonb FROM yaci_store.transaction WHERE tx_hash = $1" + ) + .bind(tx_hash) + .fetch_optional(&self.pool) + .await?; + + if let Some(serde_json::Value::Array(output_arr)) = outputs { + for output in output_arr { + if let (Some(out_tx_hash), Some(output_index)) = ( + output.get("tx_hash").and_then(|h| h.as_str()), + output.get("output_index").and_then(|i| i.as_i64()) + ) { + let (address, lovelace_amount, out_datum) = { + let (addr, amt, datum) = self.lookup_utxo(out_tx_hash, output_index as i16).await?; + if addr.is_some() { + (addr, amt, datum) + } else { + (input_address.clone(), None, None) } + }; + + if !address.as_ref().map_or(false, |a| a.starts_with("addr1x")) { + continue; } - } - return Ok(Some(vc_id)); + let address_type = Some("vendor_contract"); + + sqlx::query( + r#" + INSERT INTO treasury.utxos (tx_hash, output_index, vendor_contract_id, address, address_type, lovelace_amount, inline_datum_cbor, spent) + VALUES ($1, $2, $3, $4, $5, $6, $7, false) + ON CONFLICT (tx_hash, output_index) DO UPDATE + SET vendor_contract_id = EXCLUDED.vendor_contract_id, + address = COALESCE(EXCLUDED.address, treasury.utxos.address), + address_type = COALESCE(EXCLUDED.address_type, treasury.utxos.address_type), + lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxos.lovelace_amount), + inline_datum_cbor = COALESCE(EXCLUDED.inline_datum_cbor, treasury.utxos.inline_datum_cbor) + "# + ) + .bind(out_tx_hash) + .bind(output_index as i16) + .bind(vc_id) + .bind(&address) + .bind(address_type) + .bind(lovelace_amount) + .bind(&out_datum) + .execute(&self.pool) + .await?; + } } } - tracing::warn!("No tracked UTXO found for tx {} inputs", tx_hash); - Ok(None) + Ok(Some(vc_id)) } /// Pre-fetch UTXOs from yaci_store into treasury.utxos before they can be pruned. @@ -1402,6 +1444,20 @@ fn extract_milestone_label_description( ) } +/// Extract milestone identifier hints from a complete/withdraw event body. +/// Used to disambiguate which vendor contract a tx belongs to when its inputs span +/// multiple project chains (e.g. fee/collateral pulled from a sibling contract). +fn collect_milestone_id_hints(event_body: &Value) -> Vec { + let mut hints: Vec = Vec::new(); + if let Some(obj) = event_body.get("milestones").and_then(|m| m.as_object()) { + hints.extend(obj.keys().cloned()); + } + if let Some(s) = event_body.get("milestone").and_then(|m| m.as_str()) { + hints.push(s.to_string()); + } + hints +} + /// Extract text from a field that might be a string or array fn extract_text(obj: &Value, field: &str) -> Option { extract_text_from_value(obj.get(field)) diff --git a/diverging_events.csv b/diverging_events.csv deleted file mode 100644 index 3d90dad..0000000 --- a/diverging_events.csv +++ /dev/null @@ -1,326 +0,0 @@ -tx_hash,event_type,slot,project_id,source -"b0b03a35eaf0fe01fd4aecc68a7217ef1f19fea7a10c798461b4c6afacec3de7","publish",160963893,"","local_only" -"00d5f6fae257e7ce826980a3de5e802087d539817943265950fa6d853cc15621","pause",180393695,"","deployed_only" -"01cc36a2b0b289df7c84e71c8e2952f3de052182a891ecde1a7eb096cbcb3f6c","complete",179954927,"","deployed_only" -"027728103e767de9bfcef251a612435e18613936805e3ebd3d371fe193696f68","pause",173850686,"","deployed_only" -"0391a598f2b2dd19d54e379d3bbb027626a48ca2f42c569f34e3aa9923224cc0","withdraw",172947126,"","deployed_only" -"03a7cc20d0eaa46ee0d9d705a73340d15ace8eccb07f0c9940ad20ce730ca788","complete",170339374,"","deployed_only" -"03f8cd4cd0f89c6c9d158846fc700d323b84fa8c9cdae75d499d79facb3406b4","pause",181778545,"","deployed_only" -"0487865cb7c6b3f2ec0aff5adce7b61abeec40aba87fc5dc4f5a7bbfbbfcc43b","withdraw",178642485,"","deployed_only" -"04dba1c2789d9b76c2322bdb32b663fe0a95d570cf3ce20fa1eed558417fda61","withdraw",173372674,"","deployed_only" -"06400975adb3dbbaad29359e25a560bedd9fb227aa085b95db6384d8c3114a01","complete",180255954,"","deployed_only" -"0a7fc25f66aec3783c174686113dea16320511e151a609873cdd7ee176c0a4a1","complete",170251960,"","deployed_only" -"0ab05b221f4daf761ffe240c0d4b4d554fc61b7b8d5ac1771502e6c234ec1961","withdraw",183634166,"","deployed_only" -"0ca0d159e53398b0727f39afa6bb3170d1259e6041a67a56278616bd280e18e6","pause",185279974,"","deployed_only" -"0d3ae215d4ccedd3f1dadf202bd0e5f5dd4e09b6f9936b6e43e68f6cde39efc7","withdraw",180952024,"","deployed_only" -"0daf99a64745e1ba2d354a37d54c37f86ec648ca2e65ea4fed619f0b2439c254","complete",167914026,"","deployed_only" -"0df5a37533afe9add04aea196b19dc1947974b399bb35cd5e0d974455612e96a","pause",180474780,"","deployed_only" -"0f681c1c5a9be4ae9c5308e6c251eff98b8128fb0ce7d2701c4ace4baa5afebe","resume",173815250,"","deployed_only" -"0ff9c7e3f54232168b4de7e205d20e1d1dbf2781608b8dde4a974a1127729096","withdraw",171830345,"","deployed_only" -"11513814e9f6b5ec3d3d7c5c18653a4582bb4c4e129c134919be7582ed60ff89","withdraw",182374954,"","deployed_only" -"13dabaff0f9beea881e1afe8d1fee696b54db1dd4279eb43df5872719cf2d83f","withdraw",180890633,"","deployed_only" -"13db13226d1864fca92b7d398145c8f5e89d2ceac1686e1c0df3379b9ff6b4b3","complete",173711060,"","deployed_only" -"145dc042092a99e209520f0de5576d527131a570dfa3f8cebde755af865c3ae2","complete",172947329,"","deployed_only" -"14dfffbd6ae611b646471285662bbfe30622918b2da97b27defca0ec40431d70","resume",170266643,"","deployed_only" -"16b2c24e07abbad48e407a5257de4722a99d6b83f2a215a46455e5c0283a9041","withdraw",179342737,"","deployed_only" -"170dccffdd3701d047299a83ae33af600559d12d7caa12db4b1eb1a65927a4d5","withdraw",173874384,"","deployed_only" -"17172c051e5d8fd4a61fe2c983915283e3626c0f282b0eda57e35060490677bd","withdraw",180714352,"","deployed_only" -"182b8f195bb8bcf3457fb26c94b0f19a0319a784e4a778a77da9bf60c646818e","complete",173018239,"","deployed_only" -"18958800a20e4c6e6f363120a11e6a1c2625be466db9fe67bcc0f54453b25241","pause",180600380,"","deployed_only" -"18f07821d410c0adab2b0b3ed8f696f2db3ff1ece428d067541361836e89a032","complete",168262163,"","deployed_only" -"19a4b22f77456369c79cf41188e58bc9c7978207e5c9185f8e60e74993833a6c","pause",173850630,"","deployed_only" -"1a6a06cde5dd832fd654cb4ea83948d32d04baa5be49c7fb108b1c5ea1955431","resume",171142114,"","deployed_only" -"1b5a5fc86eefe55afae921c62de0da1677b5c5d7924b0dc56a47ddc99bc7c26d","withdraw",173730154,"","deployed_only" -"1b760b016c474389ad91324e9167ce45b44b10c68f3e025e203d03287f28db44","withdraw",170249201,"","deployed_only" -"1bab42f67e8d2b1cd6cd4dd2fd8b00f05731a353cec79033124c216a80bdb3f8","withdraw",180010479,"","deployed_only" -"1bf3bcedd3d9c1112a649f99e9fa51d02a03567543505aea6d226355596b0710","resume",173712942,"","deployed_only" -"1c603a5506064f53d3bda1591d078a332acfddd666f674a54d1c81721135244f","withdraw",174336116,"","deployed_only" -"1db766df2f5c4a7ac4834f7382d59c0b628a8881ff83482a28b6c11c96e0591b","resume",174279389,"","deployed_only" -"1ef7a0542a6c18e69991277689d25056943b4f3a26917783fca8af9e1534d68b","complete",178059618,"","deployed_only" -"1f01a5e0c87ce91bc7047735ea2b626f595ce60d22431c47b668ffa19ef76a80","pause",181778717,"","deployed_only" -"203fb50fc09da4e9325dd9715ce50c758248dce858f6a4a97339226bdce75f1a","complete",171541368,"","deployed_only" -"20895cf2be525b6e2943ac4d9c20ca57c8e02055acf41aa1bdf2e6fc0801ec54","complete",174520419,"","deployed_only" -"21e9ed8ef408939498a8baba8dff1d372acc221c6b3919e937c4796126abc0a9","complete",171997099,"","deployed_only" -"22d9d8efc8516ba87fc30a3f15f1cf729dfbb382540521500174249736f48218","pause",173850576,"","deployed_only" -"22fc23a52f91472255de7c3b650160fb5508293c0b6f7c0aa88832d541d77f9f","complete",178643601,"","deployed_only" -"241ed3fce011cbe00665dae3b1757ce0fe03dc5b1cccf0218287a1cbbe762724","withdraw",180910985,"","deployed_only" -"24e7c271ec879e6423a640756ce0536f0b0ef811520ca727e91e34d80a350ad3","complete",165446464,"","deployed_only" -"254a246bf480f27507e90981ac48b389ec7f056a89bf3280d57a56a2234a12e1","pause",179412856,"","deployed_only" -"29d117e4b1e4ffa58cae03143846781a4d1e829ea8abdf3a1a7147640ced01c5","resume",179412587,"","deployed_only" -"2b9b5f035d399c52bca90e45b1fdc99e21efa64b1b66d8582498083c879b06ba","complete",183554997,"","deployed_only" -"2bb742561dd76fd3b5b341cd992e5e949b44eec31b76d2fde74a37a8dbb00841","withdraw",166202009,"","deployed_only" -"2c012024387193a0f48a2dcf9f0e2c08d393ad6e9e7af6b121322faaa9fb33d8","withdraw",164277330,"","deployed_only" -"2d0a90266b78b7c7d18e253a45663d3147a5456639bc5e5b7117e32bea32cdca","complete",178567231,"","deployed_only" -"2f2c98cab401f7e32c30bf25d379e3bdf48871643ca950da8ac82f27613d1ffb","resume",182781190,"","deployed_only" -"2fe6accedaca33647956ee84f757815e8d178619b9befbda21585c0e219939cd","withdraw",175537664,"","deployed_only" -"30800d921866af7d2fcf0be3ba815488a5e35a8dc4ba4abe653ebe53c3a68792","complete",176071469,"","deployed_only" -"30dfc1db2b6bba350def97fa8d7f95381b85874f54ea970c9ba8c2ddab6fd41d","withdraw",180010007,"","deployed_only" -"315c3a80f05b6a6c0ef30cc629356cf5182eb04a6618fc0545dab292d72ab3bb","withdraw",174251671,"","deployed_only" -"316da2a0bc434c5e64ca30e46eccef09c6410b9e47d30eae9310117ea1d42ecb","withdraw",183304075,"","deployed_only" -"3288a835ce8b1adab515cc1aa6771e6db9c7cb2490fe37f7b578a89f37ae64a1","complete",174415428,"","deployed_only" -"339e8a1b493d7b9e6895ea68d944829aa37a082191ffb5e6175896950d2fae04","pause",185419368,"","deployed_only" -"33dacd2b49a6cd7b112a3899b9420f78f46f6b127641708b21074aa0ec40c45d","withdraw",165131606,"","deployed_only" -"348ca29a3065c2b4b9a01377124a07e40f9a4ce6d2c2543709331f8ba4681104","pause",185280079,"","deployed_only" -"360e168a8eddedd309129b39e9cfb9aa1a1dd01381edd50c9c68f30c1ea3d6dc","withdraw",166459946,"","deployed_only" -"3632f6e44f3d88f205feb72764f7e110c143858221884686d628cf9a2116b534","withdraw",173015921,"","deployed_only" -"365eeecc296c7e84902a57d9c5826015f36ff7dde7488d9d980e5a58b01d5792","pause",181778928,"","deployed_only" -"3ad4fd02801f63d6705a5a44276b0180f1040397d67270109bff3fd7d34602ae","complete",185196991,"","deployed_only" -"3b61ea059be733c327d8ffda8c5ed2c54bf86cbe210e5844a16193caa6a01907","resume",179412365,"","deployed_only" -"3bf1846d0eabf00585d83b6300c09e996a5a92627d5aadf05ed17e96610a552a","pause",184091110,"","deployed_only" -"3dc5b8c967ed2461806300f39f9305c1e9b1f5563b378a0cbd2f281e226f433b","resume",182966607,"","deployed_only" -"3ddeac6621067a3847da04d51e1d49f99c918839ec23b192637c32051ecbe5ba","withdraw",183294120,"","deployed_only" -"3ef3160fd1296e296adc7f164ee63ed5215123555fe49ed5b59799630307edca","withdraw",165349108,"","deployed_only" -"3f0ff9d9586764354e1a968a0c81ae97b29315d3f6bfa5c1ce28960a5a5f51df","withdraw",173873994,"","deployed_only" -"40da6f604356518b03ddde945c2e23a47e9eb59eb7edd17fe870f5d6fa2ae052","complete",179320033,"","deployed_only" -"410889894bac8d6a75dff80f656c0cbf13bc9345d2ad79fb2b72f22fdbb4a705","withdraw",179579715,"","deployed_only" -"41ce449bb16da5d6242f356fe90a39f287b551484b471739c51d9c206da1cf3d","complete",176223898,"","deployed_only" -"422aa7fdac2d5bd4ca937baa7c8efbdaf65cb2ab95586b1fe39c90fca7a5bd7b","complete",177337685,"","deployed_only" -"42790dc4214dde7168729403b9fcfa07d8e733ee6e673ee2f53225acb2d49558","withdraw",182353057,"","deployed_only" -"44d90615ccfd503604055658ad0c1bb2fcce1c9f161f9309040175758162cfba","withdraw",180897663,"","deployed_only" -"45162a2280c1f9b2642f83de8ade5aaa2f19ea1f2180ac9471857b46aa598a31","withdraw",173040292,"","deployed_only" -"455483309e666ee92824686ea514a1323fea3d6ecfe7608872ae43bf1661cc23","complete",169646503,"","deployed_only" -"45869c1d773ca845d871dc266334c7c36a41a8932f469cb7c0afdd30203c92d9","pause",185419368,"","deployed_only" -"463e2143c97d986740c47390d60fa13cb1ed9d8ec8889e2f43303b87d0f262ad","complete",178643158,"","deployed_only" -"4664bc394d49772a4d7a499769232428094c92d76598d1fbfbbc7b8403382fd6","withdraw",176395813,"","deployed_only" -"47eef6eea57af23ea04759b7d4d4c7662077b31e298a13041d08ce9d882759fa","withdraw",165783920,"","deployed_only" -"484177595366cf2985674c8672ac3b263d9cebbabdfbedd50d6b8281bb6faffd","complete",165345894,"","deployed_only" -"496236c80a5ef10ccc62aad5c746cedf2b4850840f87716328189c8569f53b2e","pause",179412741,"","deployed_only" -"4b2dc0b6fb1c6861f7f58775ea3f764984ffb03bf1c464db84f4819b0f3ef7e3","complete",167690200,"","deployed_only" -"4c3302613fab64d7f5bdc8ef4bcf62ec70af98bb39f447b13039df5329be7341","pause",179412768,"","deployed_only" -"4ce287014ea067009f53408c41e3c90cabf17b279eb2dcd1ac375be6be5cc254","pause",181778880,"","deployed_only" -"4d757690a254e035de1af2a03c29b24218442f18a1d29f55942c4095c73a829f","pause",170077725,"","deployed_only" -"4d909b49ebcfbb9b457dbe05c1c895e5da9d15b2aba39ac2990ef40fa59f505f","complete",165092496,"","deployed_only" -"4dc6696f8e0072e69ec9bc2c9db6159564a4a1fd8b06cdea348c2404051a5ee0","complete",165896212,"","deployed_only" -"4e1efc51946d55483db61dc36430597e51c3e04b2584099c8f797c6f53c08771","withdraw",176149110,"","deployed_only" -"4e9e780131df78b1a5fe86f7c0ac8807ccb7daf36726de979437e28993e11454","withdraw",181172993,"","deployed_only" -"4f30e573d0af917bd7683a026ba3dc156a8c1ecbd4ea6474de1f3fc1551945a9","withdraw",173003886,"","deployed_only" -"51b15a76366d3390253a8a1122f9f1164018d1a51c23a51b8861836c0dcd1059","withdraw",185376418,"","deployed_only" -"52f8a352fa679928443ca4aa86d6ea13ad34f753be06519d35c8d3ad3fda8241","withdraw",180010290,"","deployed_only" -"54135d6ebed3aafac160fdb7d0d40f3cd14201aa6a5cebe44fc060715d5ed93a","withdraw",178456805,"","deployed_only" -"556a4086cbbea55f581298eacbeda6f76a6b84a32249d66b8fe633f972cc727c","complete",172647570,"","deployed_only" -"558e9d5f7c0a4278ccace06df62519cde4df134abab079d0caf152bf208ea84f","complete",183049823,"","deployed_only" -"58a54bcbcc712668c51ec4cbe9d4b0e408a526c75019bc1d00cce7c6310dfe27","resume",182966654,"","deployed_only" -"5a42a6193552328dff546c512657344d84ae4eb7f7d5c86ed11c2b004aba0c62","complete",173199485,"","deployed_only" -"5ac170040593bf9fc50bd8d1cba6b0432a0b41bdc713dcd7da4629e9744b1ee7","pause",181778830,"","deployed_only" -"5b82ed0ccc2df28141365a75fa71c6ec825546122f856b5495ac699592f43b7f","withdraw",180961847,"","deployed_only" -"5c14f3f732b987a9b1ab852a3c10c46e5a3e9d1b2926874cc5d2d5118241b42f","withdraw",164841521,"","deployed_only" -"5c57440fc9e7b2d224e8553fbe4990e276a32d2441da31a54c0e2848ff50eafa","complete",169646564,"","deployed_only" -"5c88278a616a3b7718fa3a8a74f410a0ea0b390f21506b43c5e479b74318be0c","complete",181694955,"","deployed_only" -"5e1808775c22d8400704142031ee9ed69ce2d9eaf0c36b08f8eda9cbfbcc537e","complete",178721723,"","deployed_only" -"5ed349ac3897b96da6d99b54b749137b20758a15095105b2fb0ac322033b2cc8","complete",178114742,"","deployed_only" -"5ff6a328237c7aac536b6f96062c81138ab520d3455db9a3a231783c9dfee4ce","resume",169492012,"","deployed_only" -"6046475721b4c392bfb29836e381a87f2f08155df00d83724d154e4d725aca1e","complete",179435106,"","deployed_only" -"605f3ceaaf4095ba8e137062f24f440e48405e4e0d43dac70b2d9b11b71e66f0","withdraw",170251780,"","deployed_only" -"60db8070603e89c5faee813afbea1334a0ef7f22c4aa473c35b90337c573a08c","withdraw",170244660,"","deployed_only" -"60fa07df1aeefd446f2affd2395f6316b60378f71ed85ffa6f5d764137ad6569","withdraw",177337733,"","deployed_only" -"611908d07eac7ba5a88733d175737ae941db9e3ecb44df436b0e1027613067aa","withdraw",180009902,"","deployed_only" -"620e2c6d4e0c7a703e1088a56cede4e49b2bedd3b811f7d2c136fa213d9c8649","withdraw",170338948,"","deployed_only" -"621a181087a0f573245581f3777602e17bdb7bb70cd9bfcfc33e4635421a379b","withdraw",173874642,"","deployed_only" -"648d07b3931c83c63057d33d336cdeb5287b176403ef3a103be5bd0b09e93f36","resume",183400182,"","deployed_only" -"6564acc24d698d3ffd157f8a3ed2eb2b3ce626613b143fd4bfbbbb1d9d2ad08b","withdraw",177337402,"","deployed_only" -"661128abb10e26f3d7d193b3806d3e6690f14ff9c934cd4884236d009bcd3f4c","withdraw",182315123,"","deployed_only" -"66b980e265075c56e28496a6854b66ec8e90568ad78cec8cd535bd2438b8abe7","pause",180474687,"","deployed_only" -"6802b7580fe2136f884ce4ba7d0679acefb31ad2b5ed2b9555b6ab2dc72e534b","resume",180474637,"","deployed_only" -"681239b19ff38f43845d748b769e4c2ea633755cd98742f7e351fa74d86fc3fd","complete",167270330,"","deployed_only" -"68f0cea150be63db0c599d072fd94a4fe4ca002811f9b1744188035dbf094464","complete",185194768,"","deployed_only" -"68ff75a56ad988841c272eb4a11ae918e086e11804d0fab99d679f190ca5b5bd","resume",182206985,"","deployed_only" -"6a0fb6cf75c94b8ef251b66f32da02708bf9c26a14725d245e3cf403727f6472","complete",170710212,"","deployed_only" -"6b645f07c1469a904b4c7c7d017da3330e7b5f214aa666dd4e0bf08d190d70d0","complete",171997251,"","deployed_only" -"6bc9fdb62d7e3fb284e659f0df22b3700e27514313a3f48d9671cad35c681fed","withdraw",170601803,"","deployed_only" -"6c88b8dfc4cb66a9f2d5f0086edcc7d71848fe12face2dae2a2ced677def0c5e","resume",180600364,"","deployed_only" -"6d39fe3d02163c3e7d43343e1a9b81699c46c17ef0880ba75baa9631a6b992c5","pause",184616827,"","deployed_only" -"6db20bb408c4ad1e43798d3d4891903744404d3c7d4562d91db60620b4b30734","complete",176999799,"","deployed_only" -"6dc2fcde5d1cb367529c7d663dfeaa150d7969589b029a1576674effbe3669a8","pause",179412674,"","deployed_only" -"6e1a9a48cbe077885b672d07548897ad03a1c6066b4618f9df6c0647db3d4581","complete",165896093,"","deployed_only" -"6e320bb4ac24814e67df67f49a0e6b7b4eca9f48666c77ac977f0960fbbb5e13","complete",178643482,"","deployed_only" -"6e8cc595739a8d3f387fa60d22bc48314ed04b7a2d9df792c5882a4684faf34c","withdraw",177337526,"","deployed_only" -"70126ef166b26857aad5876b08854b44fcf61e260a440c6f217e2a01f0e9555a","withdraw",167741481,"","deployed_only" -"70784227953813cd1deba4f284ebd26ca8c66731c4feb1771378c31dea3850bd","complete",169492956,"","deployed_only" -"7261be5e7da69023c7f3ee325551abd565b4e6aec8363020d950d65394a8c01f","withdraw",173015725,"","deployed_only" -"734bedf762ee027191b95b78c3aa771a1e3070bcbc2f35e65775254b3c7e1e95","complete",171997371,"","deployed_only" -"7360576ae7bd3248f379963877caffb9ee4d3691250ef49f672eb5def7e26e17","complete",178226888,"","deployed_only" -"7555a0101285324137b40e228c485c3fed8999756b4d335defa7137d21380e53","resume",184195087,"","deployed_only" -"75650ccd8c79eca7fdb86bd86ff186ec0dead0eae4eeaaa719f74e32dc02e98e","pause",176492974,"","deployed_only" -"76282b520c293e53c617a8c8255b88f39dc42f7eabef5e58dcc447c50f26c26f","withdraw",178196773,"","deployed_only" -"79c6be9280ccb46b26803db1eaea07d8adaa59999e0de1db87c6c36e918ffb8c","withdraw",165751367,"","deployed_only" -"79ff2ff748b6d6f5281d8bb667b16346842672dfc8fe707d9c2399c776402b14","pause",184616940,"","deployed_only" -"7a3dd39340b78ae35fb06cd729c3660ae1937fde4fd851d321ab184d22da4f63","pause",183452945,"","deployed_only" -"7ada86aacbdb933f6bd5c6e75b1053c21e174f1faf4e2d3355e81db8ea76402d","pause",172762335,"","deployed_only" -"7b6eaab1a080e510b572761b71ee3ef8a21cdf057762282b1428f843ed78ab0e","pause",177568116,"","deployed_only" -"7b8ff5517283c458df7893610f460e603bf74a206106c66c89e03663f6d53c07","complete",164915766,"","deployed_only" -"7c19931c959ff86d4f9d5ee9df0112eaac36c7b78ed0274715631b3fa844be76","withdraw",178468434,"","deployed_only" -"7cde116a38562f4bbe299ea285476f8d5a00b2af6320cef89922f8b269ce7702","withdraw",179949760,"","deployed_only" -"7d857418354f0f7e29897aeb58f86916283e8ce2637cbbded4faeabbd4ff7911","withdraw",164795387,"","deployed_only" -"7ed107ca99ebf8a44b465f6e856c08c638feda6c89d0f9fa874084fc8b910156","withdraw",172900267,"","deployed_only" -"7ee13a7163d8428668c40bdaa4d0eeaa9f7d347bee5d61daf40d2658fee1e894","pause",174503848,"","deployed_only" -"814c9da446ea05ae2d76499c12f9810137775846f302d708b5386051bb8d1c4c","resume",173712393,"","deployed_only" -"81e5b7a58428b00e0f54b272261c55ad4379ae51c91f8444868b6ae2f0525ee8","withdraw",170255997,"","deployed_only" -"822761f148472aa6232e26eae1f1ad4a15fd1de8162e318fb61fbc73872ddd8c","pause",184768492,"","deployed_only" -"82b764ca1eaf13dd520551bf641d70d9f19aa7bbc13ce180b8e76c764f16021d","withdraw",183300937,"","deployed_only" -"82ea6af90c842134f71dcb4f64d1e06a30bdfd7af55c0cd8696fc5bad294c121","withdraw",164978977,"","deployed_only" -"83a494aff3550468a626a52b730e128306e0e9c5ba8b27a7f1ac89c3a7c61c5e","withdraw",178212347,"","deployed_only" -"83af7fac77332692238f915575e46b49fec1829848cab1416624f3531641feb3","complete",181377416,"","deployed_only" -"84867b1a41cfe6f134c948e3767b23711dc194c2c1844397246582d3a32c5ef6","withdraw",169492803,"","deployed_only" -"849747c4625a847f4a1ccb25d8e24379f55c2af9af2fb234a9966148a89ae887","resume",174503913,"","deployed_only" -"84aaea5db619512a87e2b6aab4cef54daac49206df2fdc654ce0cd8f577175b2","withdraw",165253999,"","deployed_only" -"854063e313b57f88bb370db4fc6ed7babcaaef5b56396c2e2c0f7d4212b076b5","complete",169076252,"","deployed_only" -"8839f51d57232df410db100ba516fba840f4151d4a5bc2dd5cc1a2ae5fc5800f","withdraw",170238583,"","deployed_only" -"8845264170e56f1ef7e48b2044299ba5c2e65a7ea01fd57f560468f3ec7b4236","withdraw",176121131,"","deployed_only" -"88c540151c1d2296e156c292b494e41574b6229de854233f9eff8e4212dadc47","complete",174415292,"","deployed_only" -"890de7904876f2ff3c1ad6362bcc56c45d2aaf295374d95125289d3832e68d7e","complete",179954230,"","deployed_only" -"8947b905733bc20980305d21748211b6b4c8a238372ab3cd5d252c508a844d69","complete",183634575,"","deployed_only" -"8a53e7c92f43556c0975320c623fb2c986111dd84735fcdb18961d4c20dfe14f","complete",170275696,"","deployed_only" -"8a9feebe580f5503e109d0512ef0139023ae81301c85ee324475563cabe743e1","withdraw",170272352,"","deployed_only" -"8c9eba5108919917b870af9a36e8848d86db98d7c223a782dc3b4da9c3718cc8","withdraw",178419366,"","deployed_only" -"8e3ac3ad54c91c2a84caf257d3d3c20bcb0a8a2cc083416038ef6ac18b2f4b90","resume",174279286,"","deployed_only" -"8f2ca40866c9af3976bce24914330ce9ab0e7e58b4ea119ccc3fdc7a8490cfae","complete",180032472,"","deployed_only" -"908bdea3db367dfee59f790bcd900903131391c9c0e34617b545eaa517480ec2","pause",184091085,"","deployed_only" -"90af90a74390b1241f89953f202630bb9b9fa2ca9232e0a20c31a2b667777fd3","withdraw",177337316,"","deployed_only" -"918c405c42f9177f56397d82d8b5fc5a45bac2a87ef320fdbdee106f759c0945","pause",167259290,"","deployed_only" -"942749184e74ac88ee59328fc1c1722108083dcc9bae4337e70f336088d1d9bf","withdraw",175528806,"","deployed_only" -"952fbc23947cb643356152e2d26fb87753533810790641527ade413df7d9229d","complete",176130526,"","deployed_only" -"96009311ecd86d08189d11dc15056871770c3dc8653b96476d809cbec2d1785d","complete",178114481,"","deployed_only" -"9709550b764b6ef13f8f06a80525a3cf0f7c5435c5e4e6ed0d20f55af7a81f2b","withdraw",180876472,"","deployed_only" -"97b398d281f8dfd12fd70a887de7ead7332f73fec5ea4bc099da94666434fcba","complete",174520504,"","deployed_only" -"97f8fe6237bd9d3302a62ca20502c8d49440227585848b042700da778c831435","withdraw",165766373,"","deployed_only" -"9a379706ce1c042b68ece3dc5b06256c2a5d76a2ed3c370f0241676b3e9febd4","complete",172788405,"","deployed_only" -"9b69b22af874f4c595b7f74978a893404d9c42b9873ae700d0235a67998308c8","withdraw",182782041,"","deployed_only" -"9c3d63810f3325f0dd13a313081c9eb8db06a742e03a255ac8776cb6407fa40b","withdraw",167680884,"","deployed_only" -"9eb351f913c417e90a964fe639c89c0b9674ff6963fe5a28e9daa9a88b8635fb","complete",167680984,"","deployed_only" -"9f6955957498395572d14a406a320a34ea15ec6c30fd83b2d0a0f37275c255d0","withdraw",173874919,"","deployed_only" -"a0c85f08db84af661b631cf4529ba6e9ec465fc4494fb6f8742b9905a7828ae9","complete",182269260,"","deployed_only" -"a28447dc07b01a7505a3c7ef4d0701448f8bdaa715c993bfaa791cfbb61c229b","withdraw",180010134,"","deployed_only" -"a340f480ec5385c2f0fac79821f807f5b7878e0aaaf8a8cf9a55a20b05b95ed4","withdraw",167681541,"","deployed_only" -"a35431330308e87ac29a253c9aeaa672682db714dbcfe32e9a0002981d9c2f45","resume",173713308,"","deployed_only" -"a35cb3e034b73bd6894ccaf895a172e6832dbc432bd0159ec19ce9bf2d201361","withdraw",170354603,"","deployed_only" -"a365dcb6f9a46fa398300425c0411e6dea6f4538cf1574e5c143f386dd72805a","complete",167916482,"","deployed_only" -"a4b0157da84597c2aff9303e707d190545d6265e054f04a06fb94a1e0d4e3aa2","pause",172792247,"","deployed_only" -"a58458cd9b25c1be615150d7057a70ffa0d46bb5a962bc1d3d12a14c006ea1f1","withdraw",173632199,"","deployed_only" -"a6a12456a258b5e28b8f9ca790ce623b0d75d5943d5c7fc34b2daadf4d67ea8a","complete",176720993,"","deployed_only" -"a6bc7dfd7c01411dffb0ae6135b14f714485751eba1171985162537ad1dfd166","resume",182781190,"","deployed_only" -"a8c5034608045e48c7a29b4dc5e61f38a6e75904bb523a7fe4c68a44531aac22","complete",170270593,"","deployed_only" -"a98d686ae792e60e589d68694ab721c3078f51c23b143711c8583fc771d07ab9","withdraw",177337599,"","deployed_only" -"a9ed5696fc1d91bfbbe9076707f72e2ae7fbfa75a60bde1a0dab5199bbf649e4","complete",165489998,"","deployed_only" -"ab4492426519fa921d9ceb475399358eea0b8843e9a2332e9dbd1cf7de882a90","complete",177436297,"","deployed_only" -"ac71b97a7d747cfd1e1e4091c92d850351f3cac9c2399579cc3e7e935252c8b3","pause",177450760,"","deployed_only" -"ac9bc7be88b00d9a636f9dd9a123cc1d47f7eefdd035f1cf655b794f1d29e5a9","withdraw",176411400,"","deployed_only" -"aea8c00948334a35916f94aa68c50d978dd3230c2a7e0d10093fe98043a405f9","complete",167597619,"","deployed_only" -"aeb9ffd4805e5a69e88ba485cef8e9fd0b3ad62508f8eb618d68d0227e5fe8b6","withdraw",178643195,"","deployed_only" -"af299e1cc1192bbdcbc5ef4672463694717f2e20277d5cbb72823fa69bf8b429","resume",174279322,"","deployed_only" -"b11d7a4d936f43bb2b32ce1898d54daeae87ba49d8be4a1f53bd53a5aae2b362","withdraw",174380905,"","deployed_only" -"b1a046139cb0845361b647bea3f01eadb09c7df6de582a30c3b3517787557ca6","withdraw",165623680,"","deployed_only" -"b1d85a3979510cc9e4d882662f80ba9b4b49a88148d8cded73b90ef9d26fbcc6","withdraw",175694293,"","deployed_only" -"b208ffa308b925eecb4d9f1ace5893e4e8443dfe949b04dcdade7e62abe3d7c7","withdraw",167638192,"","deployed_only" -"b284d6775c038dd5d6841a75f217fc2c33f0af9bea5868275f271b01143b4938","withdraw",183404706,"","deployed_only" -"b29a1b8df54a60fbf84e5895383103d5047e90f2c21580b8ab2ff4fb53b323dd","pause",177450708,"","deployed_only" -"b381d398c31a95c3a7a569789d2507a43d30a0b0f107be34c648f2e66abb5122","complete",169076158,"","deployed_only" -"b3f6255f2b531ae85e4e876a625875cf3dc90527ad5d0325c349173d01e3ceee","complete",182865210,"","deployed_only" -"b49d27563e6757ff1d61c8c42d6812680bbfbea5c4b8d48d6792f0d24fe76e5f","pause",185419368,"","deployed_only" -"b4d7a78ec2c8d9c810bd1d8fe46ad11798d613e0cc763b9f7fedccbb82d97847","complete",177000042,"","deployed_only" -"b63805b9f7e7ef39dca21158b069425d7ab35e5eb6597c303f8316c5bf04d345","resume",174503940,"","deployed_only" -"b68fef4cc955c66666aba259671264e915f50c66b2f216ab5dc993eb33a0a555","complete",170161356,"","deployed_only" -"b6982e80525513dab3c2df4431f965a9e50ab735894a70739d0b2b515abbc2a1","pause",177568090,"","deployed_only" -"b8c263530288890d771c88b63caa94fd7d802400f7c1597b884129705fb04d39","complete",170190904,"","deployed_only" -"b9238edfb794bec7ccc38f6015f55b0dfe5dd8eed1b8aab8910e603d203ccacd","pause",169744245,"","deployed_only" -"ba22ba6f781f3262c943c56e2c206af11a588d8edfe5f4577566f50886bfeb91","resume",170029955,"","deployed_only" -"baa0e177bbadd0db464972b5d7361e528572357709fa7073a6412ed183e278f0","resume",173712821,"","deployed_only" -"bb3e6cf751a89b73e07d51d0692aa14543c49e97208cbadc3c7467b80852af11","withdraw",184688142,"","deployed_only" -"bb6e836315c1a343c769a549e55338e284be38f76ad8316fccf7da1efa5cae4f","resume",173713040,"","deployed_only" -"bce9a29f71a4e9cbf510adfe5036866d38614ac3a88f6ca051c28c4c174ee109","complete",168426805,"","deployed_only" -"be43513af2eb73dfdb4a86c9168501315ddfd263b62e04650b68a2fef6e9477e","complete",182315233,"","deployed_only" -"bf4d7c1b6be599eb7e11266ac962a214bc12bcce416fb6852275960df8e46f5c","withdraw",175507688,"","deployed_only" -"c05538a93bc366ee7e521e55d3f529a9dddd32d5d475c13b0f25773f88d449c9","withdraw",182366895,"","deployed_only" -"c0cbd67952200cde61b733c0f73c4b3e1f0f7c953a37e512fd2e0b65b7c769cf","withdraw",174252441,"","deployed_only" -"c22ccbc42e5b1c5b699fba07dfdae7a8e4b8ba5860b822802d143983b4bc8722","resume",182966483,"","deployed_only" -"c397f10cb543e8e19d4118b36011624517da2f0f157ea3bdded1fe16f1d7e662","pause",185280045,"","deployed_only" -"c3c3e6da9c658763aef921cb63674b556cf6bbce5e4f3f42717aa29664e48031","pause",174357065,"","deployed_only" -"c3d022d0786a1f996d94f99b234a09bf5c7e692b34ba4b0a967d467bf59d76a1","pause",180474905,"","deployed_only" -"c416ebd132feaf52ac87876622b82d96fe3368aa24610d5bfbb9cded88843d58","withdraw",166030324,"","deployed_only" -"c5196e8b028707bdd1f01e1bb1ebda3dbb0a08a55c462bcac17c0a85bdcb6820","withdraw",178123351,"","deployed_only" -"c6d16ef01058dd93a2a231828a51ac70c6eb426f64cb7d034a5343d1e7814a19","withdraw",173799398,"","deployed_only" -"c6fa36f8b566737ab5260932ea4b6980c40e7ac534113c71d02bf90d54bd2641","withdraw",175541770,"","deployed_only" -"c863367aa98696fe3061f7f7371a9b1d215fd27264dacca4f713829353303d04","pause",181778617,"","deployed_only" -"c87ddba47095786885e24cc81cb0a248a21398eaba7f9c141b0afc4f1a7e5861","complete",180032219,"","deployed_only" -"c87f528456692b57488b7d04c1f4053fb878537e055b4e180531b8898a5def41","complete",170899955,"","deployed_only" -"c886bceb7901dbbf6e152679346a290d28023177e7c89ab061fb8b4a3809df02","withdraw",175640878,"","deployed_only" -"c9710121dd5c12cbcb276be742c838c088c516eb10a5f49b5b6470191dde85ec","pause",181778655,"","deployed_only" -"c98ca847fb3be8347cb2305068944b6a034499ca257662f12d5e6add5dc98d3d","complete",164915478,"","deployed_only" -"ca30bd8004728c11874baa708cf56715a86d8f56fb68a26a76c60af6dc90e1df","withdraw",173029233,"","deployed_only" -"cb29149f53fe8bde37306c8bea7fbc9d39f81b29d527527efa86d3f44bf8231d","withdraw",179668787,"","deployed_only" -"cc01f6b78fc778feb0371d12b83b9917b5527bfa99d32a1f80e5c7519a8e1fe9","withdraw",179413685,"","deployed_only" -"cc142d91cb25912e6d5c1dfe1157949cd67f47314823c1c7c495280c2a01d5da","complete",170704600,"","deployed_only" -"cd3683bfd3336c997e298de3cb1a80a2010638444cc59b13d1e2621c5a75a19e","withdraw",167630995,"","deployed_only" -"ce291f36935ff550c23d1a50d9df80910346a0901fd67f495c27075e2c4b6254","complete",178043546,"","deployed_only" -"d035c62be8c84b37b2093279c087b3679ee11bbce85688722a77800bf27a084b","pause",179412815,"","deployed_only" -"d0cdc89d6b76fddbcccc7700db0ce6d9a139e633b8a581196be9669f4cfe9701","complete",173724965,"","deployed_only" -"d131e6e13c431873cbb5198331855a012d156b14818d0ba33c05297d3d4194b2","resume",173713198,"","deployed_only" -"d1d4ccb2fd6103b57f2cdfa3ad2cef655481d8d75b805653414d1a4b48d3e0d5","pause",170029902,"","deployed_only" -"d1d9baf27c322ac9f905ea0886fe0b477622d2012934acca7448a2f2b0508cde","complete",165899354,"","deployed_only" -"d232a098607b032ae2b747cd24a4a8a8dcab37dac7de1749bb700444a55232b2","pause",180639486,"","deployed_only" -"d23e618b017763119687a4dd914710e8cab6b996f97ed64c00dc148260927f90","withdraw",165345764,"","deployed_only" -"d305f50fb1ed5f1df75057628bfc606c95174b5c50f5ada24ccde7b2d087025b","pause",181778573,"","deployed_only" -"d30dd5cab801fe5b2f73bd10929d07f6d1ec5e038f5ee4329fa81bed1313a711","complete",170704773,"","deployed_only" -"d356f4644fdde237c2e6798b2a20f12e1f7db7802b71aa5680c90fb2bde226f0","resume",173712622,"","deployed_only" -"d3b6f4451d5c64b575b5f68b04c82ad4948663d22400b657efaf5fb157bac820","withdraw",185140469,"","deployed_only" -"d3e65beeb99924ad884ebea07276acc9e16445fb8561b08062ca99dbb5faf304","complete",179953964,"","deployed_only" -"d3ffacb7fc7134e95f56543e94c764be5d6c2f57f3aeedf46c2f9113f0e1d748","withdraw",174410359,"","deployed_only" -"d425fb9cb9cff5944b84281142adad09db2168ac088b33365cd728832f61da10","withdraw",170191195,"","deployed_only" -"d49cacd3ec726b39dc912931913fa2e91a1e109d665dca1667470bded3271bc2","withdraw",168630477,"","deployed_only" -"d4ad7fe0e883c205fc352efc063407ef62ffff71e88e1183f033b2a2ac36a63c","pause",176492918,"","deployed_only" -"d57a664401855f9614aa2fc3fa920e93a2e71bcf7de24caa20cf30a7ea74c526","withdraw",165448175,"","deployed_only" -"d749e9a9abf7c5b2647fa1a95a951828982377d910cc2f848a0636c0421f2433","withdraw",172964775,"","deployed_only" -"d85b90e13c5b94a086ad02cecfb2c99e5ddaacf9eb268e6d34150764f07be30f","pause",174357016,"","deployed_only" -"d8e0c729dba61e44993a2b60f3654ad6b4b3baa78eac7f65b9fb1edf4ce58afe","complete",184528152,"","deployed_only" -"d9042b5ae794d8a4ebac2e04ad4d1576f527e483439bb75f1f80863b51ddcc23","complete",170189313,"","deployed_only" -"db5a04ab8a05df6b205065a6496b5c22f636363e1f6401089d172f763d9d7d84","pause",180474931,"","deployed_only" -"db8a8c5de88ac302bf5eb3a3944c17879ba4b74e65ad08b8178b0eff9c080421","withdraw",183515789,"","deployed_only" -"dbe7399366adda63bd2472bd0055099f983168b9c7b99ab4ba15c74a45843a88","pause",184616940,"","deployed_only" -"de3da75cf8956d280ce742aa319ea97914a0fc2120f9009c69b72d45aa0cffa0","complete",180032022,"","deployed_only" -"df50b2adc927fd955e2424f0d1dda56bbfde7af3917ef4bf5466445c12b85a37","pause",180393527,"","deployed_only" -"df680566998b70aff54567f5436f56e31006a97b0f8d0fe3d3e16a1b35b8e7c9","pause",183452945,"","deployed_only" -"e0fb0c9ec844a5f86e73d22e017041232616cedea78ddd9e58ffd8879ff71177","complete",178581411,"","deployed_only" -"e1162b21968b015d6ca4e0fec578b81a28ba5891e5bb06c0de2452a07ed6f2aa","withdraw",178211249,"","deployed_only" -"e2860fddf054973b5c227a34ab25133b3213e98f39f78df1da82815247321d91","pause",185419368,"","deployed_only" -"e2bacc88c76a7a0c143f187c1cb48d233733fab71faab017e02965ddb08cc06e","complete",178643717,"","deployed_only" -"e2c1d7ffd4bcf649831c056806c8f9b611771fc4e70773baf1bc6820305a432c","pause",185280149,"","deployed_only" -"e4321a6e7798de8417a12c1e0045f6e669e4784c58456634eb9b4a04cb66a9a2","complete",179109605,"","deployed_only" -"e47c14b6c9d0b85bc2046bfe59037a391cc071157410fe293b00d98d11e924de","withdraw",178581232,"","deployed_only" -"e4d7007fe8899604d9262551346480afdf7df6e32d6592053615e1aec15b3ea2","withdraw",164541860,"","deployed_only" -"e5367321385d14e6cd5316b55a508c6a9c8a5cb55ad228d4dfa59a1c418f6d48","pause",179412456,"","deployed_only" -"e5a272230f5362f104c7e056557e105452b259a19bcb34888a70b5813d126243","complete",167581320,"","deployed_only" -"e5e39de4966aa35c79ec312bd267801dcfea8e07d44030781f0921775afb200d","complete",179413926,"","deployed_only" -"e7e5ab20a13dd96a2910f6d8c5114698b1f85475e23f0038633e6ecc337a63ac","withdraw",166550845,"","deployed_only" -"e8ffe4a8a6a21b34f485d521223b1829496b33be40b5dcef5f125415e0362dd6","pause",180474838,"","deployed_only" -"e96544bf42a1f957716d8888702ed077e643239eb85c582c6ed52c0326622d2f","complete",167742063,"","deployed_only" -"eb64afbac502d6e74eb2eaac0a0306331dff781afc85c5bd5be2d821b164dcc7","complete",184278528,"","deployed_only" -"eb668b2840feb04513f774b86586cf6a4b75462af55cb2f9a37c09ba9ba3963a","pause",183452945,"","deployed_only" -"ebce34d7ab9106f43f7dbc160111e895e44d5d338ce51c23e6211a4a7e151353","pause",173815297,"","deployed_only" -"ec43042412a65b5131241e28e62f691fcd9c32f46672aea9b0bd8ce9c482a5d6","withdraw",172495144,"","deployed_only" -"ec559410512d5987a0da52ac12c288b4391451eacd1850112e049d8a8de17869","withdraw",175736205,"","deployed_only" -"ec622118600cd92c4651841f3d3fa9a57f88410a28e345fed2b1a60fefeb2547","complete",178698845,"","deployed_only" -"ec75b59d5fa8dc96b00356428d1c16cbbda94300d295b7279035e66d0bbf67c8","withdraw",165254355,"","deployed_only" -"eeaf39d77e95263d442f32458d7c1440510b08fa2f280f7a35064d4e221183ca","complete",168262310,"","deployed_only" -"eedb19b83290d46602c08880c15d0a792e86a5a41904610800d8e665cea80836","withdraw",178059487,"","deployed_only" -"ef43761347a3f8bd72017d87d784fe657d359ea7655ea74db73031cb1b06d1ab","complete",184072370,"","deployed_only" -"ef603faac7e6ee6972b65f9add95675dc43265b4a09c98a58031f7c4584661d3","complete",178044033,"","deployed_only" -"ef7963794b791ede3a4b6f282c47130391efc922fc554d98598903925483776c","resume",185280011,"","deployed_only" -"efceae8a8998e4df317f2d538eb912fcdae258e7d773ac6104d8c8129064c4e2","complete",178419701,"","deployed_only" -"efd0f792cf0dbddcd2752d29b0d4bfd9525b6276bd25a56f0deae074ed9d8189","withdraw",173874292,"","deployed_only" -"f0220079096f3468f8c0b5bba6ae740f618d17178670d802559b93a2f962e7f4","complete",170760741,"","deployed_only" -"f076da798b0ea2bd0dc17b231a2c4b022c5a4654aee860eaebdf8e8adcdf69c6","complete",170166973,"","deployed_only" -"f0f2cff900f5ebd7aa2871797947db4881538a363045da5e2896e75a0b8a8dbc","withdraw",171828678,"","deployed_only" -"f17847c703839040fdd3450bdc36b2478643d2e339f3b0cf9f261d4f22b83a3e","withdraw",170257894,"","deployed_only" -"f310f9d0feadc5378c15e52aceb870ba0aed54ca1bc0004dff0e65371330c55f","resume",174398470,"","deployed_only" -"f41f3908d8da1c7e4ba72ab574f5b006e2bbf7e4063e62d875e326c30271f420","complete",181836972,"","deployed_only" -"f43d357c0dbd8f509088d59dfbaa670bd4b1daf2c6d14d1fd7fce71dc74b9d60","pause",177568182,"","deployed_only" -"f4bd44667bbecaebfdbe9c9758d6873e8580d83a52b1157276d417e5f509850f","pause",174356967,"","deployed_only" -"f553fda68ef253a9ebe0538061ab07fdc2aedf5c6c2efce3cd036258ce6b4376","withdraw",181082111,"","deployed_only" -"f6053940f027614c3552ad3d737cc1083cf4ce92273282d46c46400c14d251f2","withdraw",182979001,"","deployed_only" -"f62e516febf8025bb8a14033ed81409678e52d04aa9bb426517c114965455e97","pause",172001127,"","deployed_only" -"f8791ff743742ef3fd17fdeaaa11430800ec58e0adf58f8acd0c44e5351a0c4d","complete",174426807,"","deployed_only" -"f87a75d251c596e2864f88934ee9efba239dfb144b7bc61ae5087a6907a1aa99","withdraw",170268009,"","deployed_only" -"fc4144d8dcfa392c9ca1869a7f2508b42124c9c59d8be59997bacfe1d51fc2b2","withdraw",167643833,"","deployed_only" -"fdd254277c02d7e98fd70a8138b001f41b95c3a77c601a132356e6e384877abb","complete",168191165,"","deployed_only" -"fe7947e7312d634cea6e28ace9446b39a7fdf17c586703b5ab6f97815b539543","pause",180639535,"","deployed_only" -"fef025fd0b5c9b068e3d8178a07fbb5aa34d4c7eedff61d4e7d6783c977a8978","resume",174503864,"","deployed_only" -"ffdd943ec4a11e2a3c865b146ebc167fb1a1418ad7e6bbd7d069ff54be0a23f8","complete",174415144,"","deployed_only" diff --git a/indexer/logs/yaci-store.log.2026-03-14.0.gz b/indexer/logs/yaci-store.log.2026-03-14.0.gz deleted file mode 100644 index 5df731e66439941bf4d8efe98e70ff44c567df5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47283 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 diff --git a/indexer/logs/yaci-store.log.2026-03-15.0.gz b/indexer/logs/yaci-store.log.2026-03-15.0.gz deleted file mode 100644 index 1e5ee945c6a06abf1d181e9ce141c376e80af683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188311 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%0A3InWAIHG*#=`(ey(#gFod1AySxCM|VTcUtSm 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%0D<%t~y!K&!2Zqh6%zP3sCQ41@jX9*M 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%0DaZDTl-h8x1?{I0va>C%C&8%Aph{y@ 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

5}7^c38Rbc9v($}#edmn0|M$lhr2Ph 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≫rYIj(DywmBeV0P3az40?Wv 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

6Y4pUMM-mM_ESL+>DS72Su& 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�SjRv0t0M`L6ho3F8=yY_Cu=h=l;?!u%b*YY5hDN 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%0D@NN=4TI;CI?ZlwS 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 Jv`OFI{eQDl9Z3KH diff --git a/indexer/logs/yaci-store.log.2026-04-26.0.gz b/indexer/logs/yaci-store.log.2026-04-26.0.gz deleted file mode 100644 index ad4b7063e066af520367dc2b463011628c05574d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40306 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 diff --git a/compare_events.sh b/scripts/compare_events.sh similarity index 94% rename from compare_events.sh rename to scripts/compare_events.sh index 0c83349..fb7ce95 100755 --- a/compare_events.sh +++ b/scripts/compare_events.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + LOCAL="http://localhost:8080/api/v1/events" DEPLOYED="https://administration.info.intersectmbo.org/api/v1/events" LIMIT=100 @@ -33,7 +35,7 @@ fetch_all "$DEPLOYED" "$DEPLOYED_FILE" sort "$LOCAL_FILE" > "${LOCAL_FILE}.sorted" sort "$DEPLOYED_FILE" > "${DEPLOYED_FILE}.sorted" -OUTPUT="diverging_events.csv" +OUTPUT="${SCRIPT_DIR}/diverging_events.csv" echo "tx_hash,event_type,slot,project_id,source" > "$OUTPUT" # Lines only in local From 097c5d369dac7edc441b0ed067627afaab4c42c6 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Fri, 1 May 2026 16:06:08 +0100 Subject: [PATCH 10/19] update docs --- README.md | 12 +- api/README.md | 44 +++++ database/README.md | 20 ++- docs/architecture.md | 46 +++++ docs/known-issues.md | 416 +++++++++++++++++++++++++++++++++++++++++++ indexer/SETUP.md | 8 +- 6 files changed, 539 insertions(+), 7 deletions(-) create mode 100644 docs/known-issues.md diff --git a/README.md b/README.md index b00846b..011cb36 100644 --- a/README.md +++ b/README.md @@ -223,9 +223,10 @@ The system uses two schemas: |-------|-------------| | `treasury.treasury_contracts` | Treasury reserve contracts (TRSC) | | `treasury.vendor_contracts` | Vendor/project contracts (PSSC) | -| `treasury.milestones` | Project milestones | +| `treasury.milestones` | Project milestones (4 independent boolean flags + archive model) | | `treasury.events` | All TOM event audit log | -| `treasury.utxos` | UTXO tracking for event linking | +| `treasury.utxos` | UTXO tracking for event linking (chain trace + datum cache) | +| `treasury.sync_status` | Heartbeat: per-stream `last_slot` / `last_block` / `updated_at` | ### Connecting to Database @@ -268,10 +269,17 @@ This reduces database size by ~95% while keeping all treasury data. ## Component Documentation - [Architecture & Data Flow](docs/architecture.md) - System architecture and data flow diagrams +- [Event Processing](docs/event-processing.md) - Per-event-type field mappings and write paths +- [Known Issues](docs/known-issues.md) - Indexed catalog of NULL-field cases, on-chain data quirks, and sync-loop gotchas - [API Documentation](api/README.md) - Full API reference - [Indexer Setup](indexer/README.md) - YACI Store configuration - [Database Schema](database/schema/) - Treasury schema definitions +## Gotchas + +- **Cold replay vs continuous operation**: a fresh local sync from an old `STORE_CARDANO_SYNC_START_SLOT` cannot reconstruct UTXO chains whose inputs YACI Store has already pruned. A fraction of historical milestone events will land with `vendor_contract_id = NULL`. See [`docs/known-issues.md`](docs/known-issues.md) `KI-CR-01` and `CLAUDE.md` for details. +- **Stale-looking sync timestamp**: `treasury.sync_status.updated_at` only bumps when new events arrive. A long delta does not mean the sync loop is dead. See `KI-SY-01`. + ## License See [LICENSE](./LICENSE). diff --git a/api/README.md b/api/README.md index c14b8ff..4485bf3 100644 --- a/api/README.md +++ b/api/README.md @@ -501,6 +501,50 @@ The API tracks the following Treasury Oversight Metadata (TOM) events: | `sweep` | Sweep remaining funds | | `reorganize` | Reorganize treasury funds | +For per-event field mappings (which JSON path becomes which DB column) see +[`docs/event-processing.md`](../docs/event-processing.md). For the catalog of +known data-quality holes (NULL fields, on-chain inconsistencies, sync-loop +quirks) see [`docs/known-issues.md`](../docs/known-issues.md). + +--- + +## Event Processing Pipeline + +The API runs a background sync task (`api/src/services/sync.rs::run_sync_loop`) +that drives event ingestion. The pipeline has four stages: + +1. **Pre-fetch UTXOs** — `EventProcessor::pre_fetch_utxos` + (`api/src/services/event_processor.rs:1209`) batches the tx_hashes of + pending TOM events and copies their outputs and inputs from + `yaci_store.address_utxo` into `treasury.utxos`. This captures UTXO data + before YACI Store can prune spent UTXOs (~2160 blocks / ~10 days). +2. **Dispatch** — `process_event` (`event_processor.rs:82`) reads + `body.body.event` and delegates to a per-event handler. Treasury-level + events (`publish`, `initialize`, `disburse`, `sweep`, `reorganize`) write + to `treasury_contracts` + `events`; vendor-level events write to + `vendor_contracts` + `milestones` + `events`. +3. **Vendor-contract resolution** — milestone-level events + (`complete`/`withdraw`/`pause`/`resume`) take their `vendor_contract_id` + from `body.identifier` when present, otherwise from + `find_vendor_contract_from_inputs` (`:1047`), which traces input UTXOs + back to the seed planted by the project's `fund` event. When multiple + project chains feed a single tx (sibling-project fee inputs, etc.) the + trace disambiguates by scoring candidate vendor_contracts against the + metadata's milestone keys (`collect_milestone_id_hints`, `:1450`). +4. **Insert** — `insert_event_full` (`:999`) writes one row per + `tx_hash` into `treasury.events` with `ON CONFLICT (tx_hash) DO UPDATE`, + preserving idempotency. Events are recorded even when the chain trace + fails (`vendor_contract_id IS NULL`) so nothing is silently dropped. + +Datum parsing (milestone amounts, time limits, paused flags, vendor payment +key hash) lives in `api/src/parsers/datum.rs`; address parsing +(stake-credential extraction from bech32) lives in +`api/src/parsers/address.rs`. + +For the SQL queries that surface where this pipeline produces NULLs in +practice, see the repro queries in +[`docs/known-issues.md`](../docs/known-issues.md). + --- ## Error Responses diff --git a/database/README.md b/database/README.md index 99caec9..d1cf187 100644 --- a/database/README.md +++ b/database/README.md @@ -49,7 +49,13 @@ Stores vendor/project contract instances (PSSC). | status | TEXT | active/paused/completed/cancelled | ### treasury.milestones -Stores milestone data for each vendor contract. Uses 4 independent boolean flags instead of a linear status. +Stores milestone data for each vendor contract. Uses 4 independent boolean flags instead of a linear status; archive model preserves prior versions via `superseded_by`. + +State flags (all default FALSE, all independent): +- `evidence_provided` — vendor submitted a `complete` event +- `withdrawn` — vendor pulled funds via a `withdraw` event +- `paused` — derived from inline-datum parsing in `update_milestone_pause_from_datum` (`api/src/services/event_processor.rs:1320`); not present in metadata +- `archived` — milestone replaced by a `modify` event; the new row is linked via `superseded_by` and queries for current state should include `WHERE NOT archived` | Column | Type | Description | |--------|------|-------------| @@ -64,6 +70,7 @@ Stores milestone data for each vendor contract. Uses 4 independent boolean flags | time_limit | BIGINT | POSIXTime in milliseconds from datum | | withdrawn | BOOLEAN | Vendor withdrew payment | | evidence_provided | BOOLEAN | Vendor submitted completion evidence | +| paused | BOOLEAN | Oversight committee paused this milestone (datum-derived) | | archived | BOOLEAN | Milestone replaced by modify event | | withdraw_tx_hash | VARCHAR(64) | Withdrawal transaction | | withdraw_time | BIGINT | Withdrawal timestamp | @@ -96,7 +103,9 @@ Audit log of all TOM (Treasury Oversight Metadata) events. | metadata | JSONB | Original TOM metadata body | ### treasury.utxos -Tracks UTXOs at treasury-related addresses for event linking. +Tracks UTXOs at treasury-related addresses for event linking. Two responsibilities: +1. **Chain trace seed** — outputs of `fund` txs are written here with `vendor_contract_id` set, so `find_vendor_contract_from_inputs` can later trace milestone-event inputs back to a project. +2. **Datum cache** — `inline_datum_cbor` is stored on each UTXO so pause/resume datum parsing (`update_milestone_pause_from_datum`) keeps working after YACI Store has pruned the row out of `yaci_store.address_utxo`. | Column | Type | Description | |--------|------|-------------| @@ -105,8 +114,9 @@ Tracks UTXOs at treasury-related addresses for event linking. | output_index | SMALLINT | Output index | | address | TEXT | Owner address | | address_type | TEXT | treasury/vendor_contract/vendor | -| vendor_contract_id | INT | FK to vendor_contracts | +| vendor_contract_id | INT | FK to vendor_contracts (chain-trace seed) | | lovelace_amount | BIGINT | Amount | +| inline_datum_cbor | TEXT | Hex-encoded inline datum (cached for post-prune datum parsing) | | slot | BIGINT | Creation slot | | block_number | BIGINT | Block number | | spent | BOOLEAN | Is spent? | @@ -114,7 +124,9 @@ Tracks UTXOs at treasury-related addresses for event linking. | spent_slot | BIGINT | When spent | ### treasury.sync_status -Tracks synchronization progress. +Tracks synchronization progress. Two rows by convention: +- `sync_type='events'` — heartbeat for the TOM-event sync loop. `updated_at` only bumps when a new event is processed (idle ticks do not bump it; see [known issue KI-SY-01](../docs/known-issues.md#ki-sy-01--treasurysync_statusupdated_at-doesnt-bump-on-idle-ticks)). +- `sync_type='utxos'` — checkpoint for the UTXO pre-fetch worker. | Column | Type | Description | |--------|------|-------------| diff --git a/docs/architecture.md b/docs/architecture.md index c025e2c..5d61005 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -176,6 +176,28 @@ This document describes how data flows through the Cardano Administration Data S ### Stage 3: API Sync Service (Rust) +The background sync task (`api/src/services/sync.rs::run_sync_loop`) does +three things every 15 seconds: + +1. Reads `treasury.sync_status` to find `last_slot` for `sync_type = 'events'`. +2. Selects new label-`1694` rows from `yaci_store.transaction_metadata` past + that slot, plus a one-shot pre-fetch of their UTXOs into `treasury.utxos` + via `EventProcessor::pre_fetch_utxos`. The pre-fetch captures both the + tx's outputs and the inputs it spends, *before* YACI Store can prune + spent UTXOs (~2160 blocks / ~10 days). This is what makes pause/resume + datum parsing and chain tracing keep working long after the on-chain + UTXO is gone. +3. Dispatches each event through the per-type handler and updates + `treasury.sync_status` to the highest successfully-processed slot. + +> **Caveat — `last_slot` advancement on errors.** If a single event fails +> mid-batch (e.g. DB connection reset), the loop logs and continues; later +> successful events advance `last_slot` past the failed one, so it is never +> retried by the continuous loop. Restarting the API runs `sync_all_events` +> from the beginning, which is idempotent (`ON CONFLICT (tx_hash) DO UPDATE`) +> and recovers the missed rows. Tracked as +> [`KI-SY-02`](known-issues.md#ki-sy-02--last_slot-can-advance-past-failed-events-on-connection-reset). + ``` ┌──────────────────────────────────────────────────────────────────────────────┐ │ BACKGROUND SYNC LOOP (every 15 seconds) │ @@ -192,6 +214,10 @@ This document describes how data flows through the Cardano Administration Data S │ │ def456 | 1050 | 1694 | {"body":{"event":"complete",...}} │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────────────┘ + │ + │ pre_fetch_utxos(batch tx_hashes) + │ ──► treasury.utxos (raw output rows + │ captured before YACI prunes) │ │ SELECT WHERE slot > last_synced_slot ▼ @@ -364,6 +390,26 @@ This document describes how data flows through the Cardano Administration Data S └─────────────────────────────────────────────────────────────────────────┘ ``` +#### Disambiguation when a tx pulls inputs from multiple project chains + +A single milestone-level tx can include fee/collateral inputs from a sibling +project's UTXO chain. `find_vendor_contract_from_inputs` collects every +candidate `vendor_contract_id`, then scores each candidate by how many of the +tx's metadata `body.milestones` keys (collected via +`collect_milestone_id_hints`, `event_processor.rs:1450`) match milestones +stored for that vendor contract. The best-scoring candidate wins; ties fall +back to the first input. + +#### Cold replay — when chain tracing can't reconstruct the link + +If a fresh local sync starts from a `STORE_CARDANO_SYNC_START_SLOT` far behind +tip, by the time the indexer is processing event N some of its input UTXOs +from earlier events may already have been pruned by YACI Store. The chain +trace returns `None`; the event is still recorded in `treasury.events` (with +`vendor_contract_id = NULL`) so nothing is silently dropped, but milestone +state flags can't be updated. See +[`docs/known-issues.md` `KI-CR-01`](known-issues.md#ki-cr-01--fresh-local-sync-cant-reconstruct-fully-pruned-chains). + ### Stage 6: API Request Flow ``` diff --git a/docs/known-issues.md b/docs/known-issues.md new file mode 100644 index 0000000..e6ce0e9 --- /dev/null +++ b/docs/known-issues.md @@ -0,0 +1,416 @@ +# Known issues — data quality and behavioural quirks + +> **Last refreshed:** 2026-05-01 against commit `ea0ac13`, mainnet sync at block +> 13,354,543 / slot 185,915,933. +> Counts come from the local DB after a clean sync; rerun the per-entry repro +> SQL for fresh numbers. Production parity is checked via +> `bash scripts/compare_events.sh` (target: `0 deployed-only`). + +## How to use this doc + +- Each entry has a stable ID (`KI--`) referenced from PRs and issues. +- "Repro query" runs as-is against the local Postgres + (`postgresql://postgres:postgres@localhost:5433/administration_data`). +- "Current count" is point-in-time at the date above. +- Entries are split into: + - **Section A — NULL fields** (the data-quality holes) + - **Section B — On-chain inconsistencies** (chain data the code can't fully reconcile) + - **Section C — Cold-replay limitation** (UTXO pruning during fresh local sync) + - **Section D — Sync-loop quirks** (operational gotchas) + - **Section E — Spec/code mismatches** + +When opening an issue, cite the ID. When fixing one, remove the entry (or +update its count to zero) in the same PR. + +--- + +## Section A — NULL fields + +### A.1 `treasury.treasury_contracts` + +All five nullable columns are populated for the only treasury we currently +track. No active anomalies — listed for completeness because the schema +allows NULL. + +| Column | When NULL is expected | When NULL is anomalous | +|---|---|---| +| `contract_address`, `stake_credential` | Before `initialize` event | Initialize ran but neither `yaci_store.address_utxo` nor `treasury.utxos` had the script output (`event_processor.rs:169`) | +| `publish_tx_hash`, `publish_time` | Treasury never published on chain | A publish event was received but didn't write — investigate | +| `initialized_tx_hash`, `initialized_at` | Treasury never initialized | Same as above for initialize | +| `permissions` | Publish metadata didn't include the field | Publish metadata included it but extraction failed | + +**Repro query** + +```sql +SELECT id, contract_instance, + contract_address IS NULL AS missing_addr, + publish_tx_hash IS NULL AS missing_publish, + initialized_tx_hash IS NULL AS missing_init, + permissions IS NULL AS missing_perms +FROM treasury.treasury_contracts; +``` + +**Current count:** 0 anomalous NULLs across 1 row. + +--- + +### A.2 `treasury.vendor_contracts` + +#### KI-VND-01 — `vendor_payment_key_hash` NULL when datum parse fails +- **Code path:** `process_fund` calls `parse_vendor_contract_datum` + (`api/src/parsers/datum.rs:42`) and only updates the column on `Ok(_)` + (`event_processor.rs:436-442`). On parse error the warn is logged and the + column stays NULL. +- **Currently affected:** all 10 `UTXO-*` projects (24% of vendor contracts) + — the `UTXO-EC-0002-25-*` family, `UTXO-EC-0003-25`, `UTXO-EG-0003-25`, + `UTXO-EMI-0001-25`, `UTXO-ER-0001-25`. Strongly correlates with + KI-OC-01 / KI-MIL-01: these projects use a different milestone-id and + datum convention that the current parser doesn't handle. + +**Repro query** + +```sql +SELECT project_id, fund_tx_hash +FROM treasury.vendor_contracts +WHERE vendor_payment_key_hash IS NULL +ORDER BY project_id; +``` + +**Current count:** 10 / 42 vendor contracts. + +#### KI-VND-02 — `vendor_name` always NULL (deprecated) +- **Why:** the TOM spec has no `vendor.name` field; the doc string at + `database/schema/treasury.sql:36` and `docs/event-processing.md:515-518` + marks it deprecated. `process_fund` never writes to it. +- **Currently affected:** 100% (42 / 42). +- **Action:** consider dropping the column in a follow-up migration. + +#### KI-VND-03 — `contract_url` always NULL (deprecated) +- Same shape as KI-VND-02. No on-chain field maps to it. +- **Currently affected:** 100% (42 / 42). + +#### KI-VND-04 — `contract_address` NULL on cold replay +- **Code path:** `get_script_utxo_for_tx` (`event_processor.rs:1213`) tries + `yaci_store.address_utxo`, then falls back to `treasury.utxos`. If both + miss (UTXO already pruned and pre-fetch never captured it), NULL. +- **Currently affected:** 0 / 42 — local DB has been kept warm. +- **Cross-ref:** KI-CR-01 (cold-replay limitation). + +**Repro query** + +```sql +SELECT project_id, fund_tx_hash +FROM treasury.vendor_contracts +WHERE contract_address IS NULL; +``` + +--- + +### A.3 `treasury.milestones` + +#### KI-MIL-01 — `amount_lovelace` / `time_limit` / `label` / `acceptance_criteria` NULL together +- **Why correlated:** all four come from the fund event metadata + datum. + Projects whose fund metadata uses a milestones-array with bare descriptions + (no `label`, no `acceptanceCriteria`, no `amount`, no parseable datum) + produce milestones where every derived field is NULL except `description` + (which comes from the metadata field directly via + `extract_text_from_value`). +- **Currently affected:** 136 / 386 active milestones (35%) — entirely + concentrated in the 10 `UTXO-*` projects from KI-VND-01: + + | project_id | NULL `label` count | total milestones | + |---|---:|---:| + | UTXO-EC-0002-25-05 | 21 | 21 | + | UTXO-EC-0002-25-06 | 21 | 21 | + | UTXO-EC-0002-25-03 | 20 | 20 | + | UTXO-EC-0002-25-02 | 19 | 19 | + | UTXO-EC-0002-25-04 | 18 | 18 | + | UTXO-EC-0002-25-01 | 16 | 16 | + | UTXO-EC-0003-25 | 8 | 8 | + | UTXO-EMI-0001-25 | 5 | 5 | + | UTXO-EG-0003-25 | 4 | 4 | + | UTXO-ER-0001-25 | 4 | 4 | + +- **Code path:** `process_fund` → `extract_milestone_label_description` + (`event_processor.rs:1403`) for label/AC; datum parse for amount/time_limit. +- **Likely root cause:** these projects use `MS-N` milestone identifiers + with a different datum format that `parse_vendor_contract_datum` doesn't + yet handle (see KI-OC-01). + +**Repro query** + +```sql +SELECT vc.project_id, COUNT(*) AS missing_label +FROM treasury.milestones m +JOIN treasury.vendor_contracts vc ON vc.id = m.vendor_contract_id +WHERE NOT m.archived AND m.label IS NULL +GROUP BY vc.project_id ORDER BY 2 DESC; +``` + +#### KI-MIL-02 — `withdraw_*` / `complete_*` / `archived_*` columns +- All conditional on the corresponding boolean flag being true. No anomalies + observed (`withdrawn=TRUE` rows always have non-NULL `withdraw_*`). + +**Repro query** + +```sql +SELECT COUNT(*) FILTER (WHERE withdrawn AND withdraw_tx_hash IS NULL) AS withdrawn_no_tx, + COUNT(*) FILTER (WHERE evidence_provided AND complete_tx_hash IS NULL) AS evidenced_no_tx, + COUNT(*) FILTER (WHERE archived AND archived_by_tx_hash IS NULL) AS archived_no_tx +FROM treasury.milestones; +``` + +**Current count:** 0, 0, 0. + +--- + +### A.4 `treasury.events` + +#### KI-EVT-01 — `vendor_contract_id` NULL on chain-trace failure +- **Code path:** every milestone-level handler (`process_complete:511`, + `process_withdraw:626`, `process_pause:721`, `process_resume:764`) calls + `find_vendor_contract_from_inputs` (`event_processor.rs:1047`) when + `body.identifier` is empty. If the trace returns `None`, the event is + inserted with `vendor_contract_id = NULL` (intentional — see fix history; + events are never silently dropped). +- **Why it happens:** input UTXOs for these txs were pruned from + `yaci_store.address_utxo` before the local sync caught up, and no `fund` + output we processed seeded them either. +- **Currently affected:** + + | event_type | NULL vc | total | % | + |---|---:|---:|---:| + | complete | 30 | 188 | 16% | + | withdraw | 9 | 126 | 7% | + | pause | 10 | 63 | 16% | + | resume | 7 | 32 | 22% | + | **total** | **56** | **409** | **14%** | + + Treasury-level events (publish, initialize, disburse) have NULL `vc` by + design — they aren't tied to a vendor contract. + +**Repro query** + +```sql +SELECT event_type, + COUNT(*) FILTER (WHERE vendor_contract_id IS NULL) AS null_vc, + COUNT(*) AS total +FROM treasury.events +WHERE event_type IN ('complete','withdraw','pause','resume') +GROUP BY 1 ORDER BY 1; +``` + +#### KI-EVT-02 — `milestone_id` NULL when metadata keys don't match stored ids +- **Code path:** `process_complete:521-562`, `process_withdraw:649-695`. + After the milestone-key disambiguation hint was added to + `find_vendor_contract_from_inputs`, all currently-recorded events whose + `vendor_contract_id` resolved have a matching milestone too. +- **Currently affected:** 0 events (where `vc IS NOT NULL AND milestone_id IS NULL`). + +**Repro query** + +```sql +SELECT COUNT(*) FROM treasury.events +WHERE event_type IN ('complete','withdraw') + AND vendor_contract_id IS NOT NULL + AND milestone_id IS NULL; +``` + +#### KI-EVT-03 — fund/initialize/etc have NULL `milestone_id` by design +- Treasury- and contract-level events aren't tied to a single milestone; + schema permits NULL. Listed only because grouped count looks suspicious + at first glance. + +**Repro query** + +```sql +SELECT event_type, COUNT(*) FILTER (WHERE milestone_id IS NULL) AS null_milestone +FROM treasury.events GROUP BY 1 ORDER BY 1; +``` + +#### KI-EVT-04 — `amount_lovelace` NULL on withdraw with zero non-script outputs +- **Code path:** `process_withdraw:622-650`. Sums `lovelace_amount` of + non-`addr1x*` outputs from `yaci_store.address_utxo`, then falls back to + `treasury.utxos`. If both return 0 → NULL. +- **Currently affected:** 0 / 126 withdraw events (every recorded withdraw + has a non-zero amount). + +--- + +### A.5 `treasury.utxos` + +#### KI-UTX-01 — 767 / 1222 rows with `vendor_contract_id IS NULL` +- **Why:** `pre_fetch_utxos` (`event_processor.rs:1209`) inserts every output + of every TOM-event tx without `vendor_contract_id`. The chain-trace seed + (set later by `process_fund` and `find_vendor_contract_from_inputs`) only + fills it for outputs at the script address. Non-script change/fee outputs + remain NULL by design — they aren't part of the chain. +- **Currently affected:** 767 / 1222 rows. Not anomalous — expected. + +**Repro query** + +```sql +SELECT + CASE + WHEN vendor_contract_id IS NOT NULL AND address IS NOT NULL THEN 'fully_tracked' + WHEN vendor_contract_id IS NULL AND address IS NOT NULL THEN 'address_only' + WHEN vendor_contract_id IS NULL AND address IS NULL THEN 'sparse' + ELSE 'other' + END AS state, + COUNT(*) AS count +FROM treasury.utxos GROUP BY 1 ORDER BY 2 DESC; +``` + +**Current breakdown:** `address_only=767`, `fully_tracked=455`. + +#### KI-UTX-02 — 5 rows with NULL `lovelace_amount` +- Output recorded but `yaci_store.address_utxo` had no row when looked up + (probably collateral / null-value outputs). +- **Currently affected:** 5 / 1222. + +**Repro query** + +```sql +SELECT tx_hash, output_index, address FROM treasury.utxos WHERE lovelace_amount IS NULL; +``` + +--- + +## Section B — On-chain data inconsistencies + +### KI-OC-01 — Milestone-id naming drift (`m-N` vs `MS-N`) +- **Pattern:** fund events for some projects emit milestones as an array + whose elements have `identifier: "m-N"`; fund events for the `UTXO-*` + family emit milestones as an array of `MS-N` identifiers, but our parser + stores them as `m-N`/`MS-N` based on whatever the `identifier` field says. +- **Effect on complete events:** of 188 complete events, 107 use `m-N` keys + and 81 use `MS-N` keys. After the disambiguation hint to + `find_vendor_contract_from_inputs`, this no longer causes silent event + drops (every event lands in `treasury.events`), but it surfaces as + KI-VND-01 / KI-MIL-01 because the same projects have a different datum + format the parser can't handle. + +**Repro query** + +```sql +WITH cmp AS ( + SELECT body::jsonb -> 'body' -> 'milestones' AS ms_field + FROM yaci_store.transaction_metadata + WHERE label='1694' AND body::jsonb->'body'->>'event'='complete' +) +SELECT + COUNT(*) FILTER (WHERE k LIKE 'm-%') AS m_dash, + COUNT(*) FILTER (WHERE k LIKE 'MS-%') AS ms_dash, + COUNT(*) FILTER (WHERE k NOT LIKE 'm-%' AND k NOT LIKE 'MS-%') AS other +FROM cmp, jsonb_object_keys(ms_field) k +WHERE jsonb_typeof(ms_field) = 'object'; +``` + +### KI-OC-02 — `body.identifier` empty on every milestone-level event +- 100% of `complete`, `withdraw`, `pause`, `resume` on-chain events have an + empty top-level `identifier`, so the cheap project lookup is never + available — every such event must chain-trace. This is what makes + KI-EVT-01 visible at all. +- **Currently affected:** complete 188/188, withdraw 126/126, pause 63/63, + resume 32/32 — 100% across the board. + +**Repro query** + +```sql +SELECT body::jsonb->'body'->>'event' AS event_type, + COUNT(*) FILTER (WHERE COALESCE(body::jsonb->'body'->>'identifier','') = '') AS empty_id, + COUNT(*) AS total +FROM yaci_store.transaction_metadata +WHERE label='1694' AND body::jsonb->'body'->>'event' IN ('complete','withdraw','pause','resume') +GROUP BY 1 ORDER BY 1; +``` + +### KI-OC-03 — Multi-input txs with sibling-project fee inputs +- A single complete/withdraw tx can take fee/collateral inputs from another + project's UTXO chain. Without disambiguation, the older code attributed + the event to whichever project's input came first. +- **Mitigation in code:** `find_vendor_contract_from_inputs` + (`event_processor.rs:1047`) now scores candidate vendor_contract_ids + against `body.milestones` keys and prefers the one whose stored milestones + match (`collect_milestone_id_hints` at `:1450`). +- **Currently affected:** observable indirectly via KI-EVT-02 = 0. + +--- + +## Section C — Cold-replay UTXO-pruning limitation + +### KI-CR-01 — Fresh local sync can't reconstruct fully-pruned chains +- **Symptom:** the 56 events under KI-EVT-01 with NULL `vendor_contract_id`. +- **Why:** YACI Store prunes spent UTXOs after ~2160 blocks (~10 days). On a + cold replay from an old `STORE_CARDANO_SYNC_START_SLOT`, by the time the + indexer is processing event N, its input UTXOs from event N-K may already + be gone. `pre_fetch_utxos` (`event_processor.rs:1209`) cannot capture what + YACI Store no longer has. +- **Mitigation 1:** keep the API running continuously — it captures outputs + before pruning gets a chance. +- **Mitigation 2:** set `STORE_CARDANO_SYNC_START_SLOT` to a more recent + block so less history needs to be reconstructed. +- **Cross-ref:** the gotcha in `CLAUDE.md` under "Gotchas". + +--- + +## Section D — Sync-loop quirks + +### KI-SY-01 — `treasury.sync_status.updated_at` doesn't bump on idle ticks +- **Code:** `sync_new_events` in `api/src/services/sync.rs` returns early + when `rows.is_empty()` and never UPDATEs. `/api/v1/statistics`'s + `last_updated` looks "stale" even when the loop is alive and polling + every 15 s. +- **Workaround:** trust the indexer cursor for liveness, or check + `lsof -i :8080`. +- **Fix candidate:** bump `updated_at` (and optionally write the indexer's + current slot) on every poll, even when no work is found. + +### KI-SY-02 — `last_slot` can advance past failed events on connection reset +- **Symptom observed:** during a postgres restart mid-batch + (2026-04-28), 5 events failed to insert. Continuous-sync logged + `Sync error: error communicating with database` then advanced `last_slot` + past those events on the next successful batch, so they were never + retried. +- **Why:** `sync.rs` `for row in rows { if Err { continue } else { last_slot + = row.slot } }` — the success of later events bumps the watermark past + the failed ones. +- **Recovery:** restart the API; `sync_all_events` re-processes from the + beginning. All inserts are idempotent via `ON CONFLICT (tx_hash) DO UPDATE`. +- **Fix candidate:** track `last_slot` as the slot of the LAST contiguous + success (don't advance past holes), or run `sync_all_events` periodically. + +--- + +## Section E — Spec / code mismatches + +### KI-API-01 — `disburse.destination` typed as string instead of `{label, details}` +- **Spec:** `docs/event-processing.md` line ~286 documents `body.destination` + as an object `{label, details}`. +- **Code:** `process_disburse` (`event_processor.rs:583`) extracts via + `extract_text` and stores the resulting string in + `treasury.events.destination`. The `details` sub-field is dropped. +- **Currently affected:** all 4 `disburse` events in the DB. +- **Fix candidate:** change `treasury.events.destination` to `JSONB`, keep + the full object, expose both fields in the API response. + +--- + +## Index summary + +| ID | Area | Severity | Status | +|---|---|---|---| +| KI-VND-01 | datum parse failure on `UTXO-*` projects | High — breaks downstream KI-MIL-01 | open | +| KI-VND-02 | `vendor_name` deprecated, always NULL | Cleanup | open | +| KI-VND-03 | `contract_url` deprecated, always NULL | Cleanup | open | +| KI-VND-04 | `contract_address` NULL on cold replay | Acceptable; mitigation documented | open | +| KI-MIL-01 | NULL `label`/`amount`/`time_limit`/`AC` for `UTXO-*` | High — same root as VND-01 | open | +| KI-EVT-01 | NULL `vendor_contract_id` on chain-trace failure | Medium — cold-replay only | open | +| KI-UTX-01 | NULL `vendor_contract_id` on non-script UTXOs | By design | not a bug | +| KI-OC-01 | milestone-id naming drift | Documented; mitigated by disambiguation | open | +| KI-OC-02 | empty `body.identifier` everywhere | On-chain data; can't fix locally | not a bug | +| KI-OC-03 | multi-input sibling-project txs | Mitigated | resolved | +| KI-CR-01 | cold-replay limitation | Documented mitigation | open | +| KI-SY-01 | idle `updated_at` doesn't bump | Low — UX confusion | open | +| KI-SY-02 | `last_slot` advances past failed events | Medium — recoverable via restart | open | +| KI-API-01 | `destination` schema mismatch | Low — data loss for one field | open | diff --git a/indexer/SETUP.md b/indexer/SETUP.md index 40dba84..19746df 100644 --- a/indexer/SETUP.md +++ b/indexer/SETUP.md @@ -7,7 +7,13 @@ ## Download YACI Store JAR -The YACI Store JAR file needs to be downloaded manually: +> **For the standard Docker Compose setup (`./dev.sh start`), this section is +> not needed.** `docker-compose.yml` runs the prebuilt +> `bloxbean/yaci-store:2.0.0` image, which already bundles the JAR and +> handles startup. Skip ahead to **Configuration**. + +The instructions below apply only if you are running the indexer outside +Docker (e.g. directly on the host JVM): 1. Visit https://github.com/bloxbean/yaci-store/releases 2. Download the latest `yaci-store-all-*.jar` file (e.g., `yaci-store-all-2.0.0.jar`) From 90635580c2b5e2a354fb66f3d0d1088eea7d5365 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Fri, 1 May 2026 21:11:29 +0100 Subject: [PATCH 11/19] address known issues --- .claude/scheduled_tasks.lock | 1 - api/src/models/v1.rs | 8 +- api/src/parsers/datum.rs | 52 +++++- api/src/routes/v1/statistics.rs | 2 +- api/src/routes/v1/treasury.rs | 2 +- api/src/routes/v1/vendor_contracts.rs | 2 +- api/src/services/event_processor.rs | 134 +++++++++------ api/src/services/sync.rs | 138 +++++++++++++++- database/init/02-treasury-schema.sql | 26 ++- database/schema/treasury.sql | 26 ++- docs/known-issues.md | 229 ++++++++++++++------------ 11 files changed, 429 insertions(+), 191 deletions(-) delete mode 100644 .claude/scheduled_tasks.lock diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock deleted file mode 100644 index a99f26d..0000000 --- a/.claude/scheduled_tasks.lock +++ /dev/null @@ -1 +0,0 @@ -{"sessionId":"1b21fa58-3826-405d-91ef-625e665f6645","pid":35097,"procStart":"Sun Apr 26 23:04:37 2026","acquiredAt":1777281191468} \ No newline at end of file diff --git a/api/src/models/v1.rs b/api/src/models/v1.rs index 76ff8e7..f7ad3e2 100644 --- a/api/src/models/v1.rs +++ b/api/src/models/v1.rs @@ -670,8 +670,8 @@ pub struct EventResponse { pub amount_lovelace: Option, /// Reason (for pause/cancel/modify events) pub reason: Option, - /// Destination (for disburse events) - pub destination: Option, + /// Destination (for disburse events) — TOM `{label, details}` object preserved as-is. + pub destination: Option, /// Treasury context pub treasury: Option, /// Project context @@ -724,7 +724,7 @@ pub struct EventWithContextRow { pub event_type: String, pub amount_lovelace: Option, pub reason: Option, - pub destination: Option, + pub destination: Option, pub metadata: Option, pub created_at: Option>, pub treasury_instance: Option, @@ -933,7 +933,7 @@ pub struct VendorContractsQuery { pub limit: u32, /// Filter by status (active/paused/completed/cancelled) pub status: Option, - /// Search in project_id, project_name, description, vendor_name + /// Search in project_id, project_name, description pub search: Option, /// Sort field (fund_time, project_id, project_name) pub sort: Option, diff --git a/api/src/parsers/datum.rs b/api/src/parsers/datum.rs index 31cee42..6a22b80 100644 --- a/api/src/parsers/datum.rs +++ b/api/src/parsers/datum.rs @@ -38,7 +38,21 @@ pub struct ParsedMilestoneDatum { pub paused: bool, } -/// Parse a vendor contract datum from CBOR hex string +/// Parse a vendor contract datum from CBOR hex string. +/// +/// Two on-chain vendor-info shapes are supported: +/// +/// 1. Single-key (`m-N` projects): +/// `Constr(0, [Constr(0, [bytes(28)]), [milestones]])` +/// +/// 2. Multi-key (`UTXO-*` projects, e.g. `UTXO-EC-0002-25-*`): +/// `Constr(0, [Constr(1, [(Constr(0, [bytes(28)]), Constr(N, [bytes(28)]))]), [milestones]])` +/// — vendor info wraps a tuple of two parties (different signature +/// types). We walk the subtree and collect every 28-byte BoundedBytes +/// (Cardano key-hash size, Blake2b-224), joining them with `,` for +/// storage in the single `vendor_payment_key_hash` column. +/// +/// The milestones array structure is identical between the two formats. pub fn parse_vendor_contract_datum(cbor_hex: &str) -> anyhow::Result { let bytes = hex::decode(cbor_hex).context("invalid hex in datum")?; let datum: PlutusData = @@ -53,12 +67,14 @@ pub fn parse_vendor_contract_datum(cbor_hex: &str) -> anyhow::Result = Vec::new(); + collect_key_hashes(&top_fields[0], &mut hashes); + if hashes.is_empty() { + return Err(anyhow!("no 28-byte key hash found in vendor info")); } - let vendor_payment_key_hash = expect_bytes(&vendor_fields[0], "vendor_payment_key_hash")?; + let vendor_payment_key_hash = hashes.join(","); // Field 1: Array of milestone Constrs let milestone_data_list = expect_array(&top_fields[1], "milestones array")?; @@ -152,6 +168,29 @@ fn extract_lovelace_from_value(datum: &PlutusData) -> anyhow::Result { // Helpers // ============================================================================ +/// Walk a Plutus datum subtree and collect every 28-byte BoundedBytes +/// (Cardano key-hash size, Blake2b-224) it contains, in pre-order. +fn collect_key_hashes(datum: &PlutusData, acc: &mut Vec) { + match datum { + PlutusData::BoundedBytes(b) => { + if b.len() == 28 { + acc.push(hex::encode(b.as_slice())); + } + } + PlutusData::Constr(c) => { + for f in &c.fields { + collect_key_hashes(f, acc); + } + } + PlutusData::Array(arr) => { + for x in arr { + collect_key_hashes(x, acc); + } + } + _ => {} + } +} + fn expect_constr<'a>( datum: &'a PlutusData, expected_tag_offset: u64, @@ -192,6 +231,7 @@ fn expect_array<'a>( } } +#[allow(dead_code)] fn expect_bytes(datum: &PlutusData, context: &str) -> anyhow::Result { match datum { PlutusData::BoundedBytes(bytes) => Ok(hex::encode(bytes.as_slice())), diff --git a/api/src/routes/v1/statistics.rs b/api/src/routes/v1/statistics.rs index 44711e3..24ab400 100644 --- a/api/src/routes/v1/statistics.rs +++ b/api/src/routes/v1/statistics.rs @@ -204,7 +204,7 @@ async fn get_financial_stats(pool: &PgPool) -> Result,) = sqlx::query_as( - "SELECT COALESCE(SUM(lovelace_amount), 0)::BIGINT FROM treasury.utxos WHERE NOT spent" + "SELECT COALESCE(SUM(lovelace_amount), 0)::BIGINT FROM treasury.utxo_history WHERE NOT spent" ) .fetch_one(pool) .await diff --git a/api/src/routes/v1/treasury.rs b/api/src/routes/v1/treasury.rs index 85f334d..d63e040 100644 --- a/api/src/routes/v1/treasury.rs +++ b/api/src/routes/v1/treasury.rs @@ -85,7 +85,7 @@ pub async fn get_treasury_utxos( lovelace_amount, slot, block_number - FROM treasury.utxos + FROM treasury.utxo_history WHERE address = $1 AND NOT spent ORDER BY slot DESC "# diff --git a/api/src/routes/v1/vendor_contracts.rs b/api/src/routes/v1/vendor_contracts.rs index d8ae041..81b6f25 100644 --- a/api/src/routes/v1/vendor_contracts.rs +++ b/api/src/routes/v1/vendor_contracts.rs @@ -440,7 +440,7 @@ pub async fn get_vendor_contract_utxos( u.lovelace_amount, u.slot, u.block_number - FROM treasury.utxos u + FROM treasury.utxo_history u JOIN treasury.vendor_contracts vc ON vc.id = u.vendor_contract_id WHERE vc.project_id = $1 AND NOT u.spent ORDER BY u.slot DESC diff --git a/api/src/services/event_processor.rs b/api/src/services/event_processor.rs index f0cdffb..8a1d76e 100644 --- a/api/src/services/event_processor.rs +++ b/api/src/services/event_processor.rs @@ -215,7 +215,7 @@ impl EventProcessor { let other_identifiers = if other_identifiers.is_empty() { None } else { Some(other_identifiers) }; // Get contract address, initial amount, and inline datum from fund tx output - // (with fallback to treasury.utxos for pruned UTXOs) + // (with fallback to treasury.utxo_history for pruned UTXOs) let (contract_address, initial_amount, fund_inline_datum) = self.get_script_utxo_for_tx(&event.tx_hash).await?; // Get or create treasury contract @@ -253,7 +253,7 @@ impl EventProcessor { .fetch_optional(&self.pool) .await?; - // Fallback: use treasury.utxos for pruned input UTXOs + // Fallback: use treasury.utxo_history for pruned input UTXOs let treasury_addr = match treasury_addr { Some(addr) => Some(addr), None => sqlx::query_scalar::<_, Option>( @@ -261,7 +261,7 @@ impl EventProcessor { SELECT DISTINCT u.address FROM yaci_store.transaction t CROSS JOIN LATERAL jsonb_array_elements(t.inputs::jsonb) AS inp - JOIN treasury.utxos u + JOIN treasury.utxo_history u ON u.tx_hash = inp->>'tx_hash' AND u.output_index = (inp->>'output_index')::smallint WHERE t.tx_hash = $1 AND u.address LIKE 'addr1x%' AND u.address != $2 @@ -403,14 +403,14 @@ impl EventProcessor { // Record this UTXO with the vendor_contract_id for future event lookups sqlx::query( r#" - INSERT INTO treasury.utxos (tx_hash, output_index, vendor_contract_id, slot, block_number, address, address_type, lovelace_amount, spent) + INSERT INTO treasury.utxo_history (tx_hash, output_index, vendor_contract_id, slot, block_number, address, address_type, lovelace_amount, spent) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, false) ON CONFLICT (tx_hash, output_index) DO UPDATE - SET vendor_contract_id = COALESCE(EXCLUDED.vendor_contract_id, treasury.utxos.vendor_contract_id), - address = COALESCE(EXCLUDED.address, treasury.utxos.address), - address_type = COALESCE(EXCLUDED.address_type, treasury.utxos.address_type), - lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxos.lovelace_amount), - block_number = COALESCE(EXCLUDED.block_number, treasury.utxos.block_number) + SET vendor_contract_id = COALESCE(EXCLUDED.vendor_contract_id, treasury.utxo_history.vendor_contract_id), + address = COALESCE(EXCLUDED.address, treasury.utxo_history.address), + address_type = COALESCE(EXCLUDED.address_type, treasury.utxo_history.address_type), + lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxo_history.lovelace_amount), + block_number = COALESCE(EXCLUDED.block_number, treasury.utxo_history.block_number) "# ) .bind(tx_hash) @@ -471,7 +471,7 @@ impl EventProcessor { // Store raw CBOR on the UTXO tracking row sqlx::query( - "UPDATE treasury.utxos SET inline_datum_cbor = $1 WHERE tx_hash = $2 AND vendor_contract_id = $3" + "UPDATE treasury.utxo_history SET inline_datum_cbor = $1 WHERE tx_hash = $2 AND vendor_contract_id = $3" ) .bind(&datum_hex) .bind(&event.tx_hash) @@ -522,6 +522,7 @@ impl EventProcessor { for (milestone_id, milestone_data) in obj { let description = extract_text_from_value(Some(milestone_data.get("description").unwrap_or(&Value::Null))); let evidence = milestone_data.get("evidence").cloned(); + let order_hint = canonical_milestone_order(milestone_id); let db_milestone_id: Option = sqlx::query_scalar( r#" @@ -531,7 +532,9 @@ impl EventProcessor { complete_time = $2, complete_description = $3, evidence = $4 - WHERE vendor_contract_id = $5 AND milestone_id = $6 AND NOT archived + WHERE vendor_contract_id = $5 + AND NOT archived + AND (milestone_id = $6 OR milestone_order = $7) RETURNING id "# ) @@ -541,6 +544,7 @@ impl EventProcessor { .bind(&evidence) .bind(vc_id) .bind(milestone_id) + .bind(order_hint) .fetch_optional(&self.pool) .await?; @@ -551,13 +555,16 @@ impl EventProcessor { } if let Some(milestone_id) = event_body.get("milestone").and_then(|m| m.as_str()) { + let order_hint = canonical_milestone_order(milestone_id); let db_milestone_id: Option = sqlx::query_scalar( r#" UPDATE treasury.milestones SET evidence_provided = TRUE, complete_tx_hash = $1, complete_time = $2 - WHERE vendor_contract_id = $3 AND milestone_id = $4 AND NOT archived + WHERE vendor_contract_id = $3 + AND NOT archived + AND (milestone_id = $4 OR milestone_order = $5) RETURNING id "# ) @@ -565,6 +572,7 @@ impl EventProcessor { .bind(event.block_time) .bind(vc_id) .bind(milestone_id) + .bind(order_hint) .fetch_optional(&self.pool) .await?; @@ -582,7 +590,9 @@ impl EventProcessor { /// Process a disburse event - treasury-level fund movement (does not touch milestones) async fn process_disburse(&self, event: &RawTomEvent, body: &Value, instance: &str) -> anyhow::Result<()> { let event_body = body.get("body").unwrap_or(body); - let destination = extract_text(event_body, "destination"); + // Per TOM spec, `destination` is an object `{label, details}`. Preserve the + // full object in JSONB so neither sub-field is lost (KI-API-01). + let destination = event_body.get("destination").cloned(); // Disburse is a treasury-level operation — look up treasury_id, not vendor_contract_id let treasury_id: Option = if !instance.is_empty() { @@ -638,7 +648,7 @@ impl EventProcessor { Some(amt) if amt > 0 => Some(amt), _ => { let fallback: Option = sqlx::query_scalar( - "SELECT COALESCE(SUM(lovelace_amount)::bigint, 0) FROM treasury.utxos WHERE tx_hash = $1 AND address NOT LIKE 'addr1x%'" + "SELECT COALESCE(SUM(lovelace_amount)::bigint, 0) FROM treasury.utxo_history WHERE tx_hash = $1 AND address NOT LIKE 'addr1x%'" ) .bind(&event.tx_hash) .fetch_optional(&self.pool) @@ -655,6 +665,7 @@ impl EventProcessor { if let Some(vc_id) = vendor_contract_id { if let Some(obj) = event_body.get("milestones").and_then(|m| m.as_object()) { for (milestone_id, _milestone_data) in obj { + let order_hint = canonical_milestone_order(milestone_id); let db_milestone_id: Option = sqlx::query_scalar( r#" UPDATE treasury.milestones @@ -662,7 +673,9 @@ impl EventProcessor { withdraw_tx_hash = $1, withdraw_time = $2, withdraw_amount = $3 - WHERE vendor_contract_id = $4 AND milestone_id = $5 AND NOT archived + WHERE vendor_contract_id = $4 + AND NOT archived + AND (milestone_id = $5 OR milestone_order = $6) RETURNING id "# ) @@ -671,6 +684,7 @@ impl EventProcessor { .bind(withdraw_amount) .bind(vc_id) .bind(milestone_id) + .bind(order_hint) .fetch_optional(&self.pool) .await?; @@ -681,6 +695,7 @@ impl EventProcessor { } if let Some(milestone_id) = event_body.get("milestone").and_then(|m| m.as_str()) { + let order_hint = canonical_milestone_order(milestone_id); let db_milestone_id: Option = sqlx::query_scalar( r#" UPDATE treasury.milestones @@ -688,7 +703,9 @@ impl EventProcessor { withdraw_tx_hash = $1, withdraw_time = $2, withdraw_amount = $3 - WHERE vendor_contract_id = $4 AND milestone_id = $5 AND NOT archived + WHERE vendor_contract_id = $4 + AND NOT archived + AND (milestone_id = $5 OR milestone_order = $6) RETURNING id "# ) @@ -697,6 +714,7 @@ impl EventProcessor { .bind(withdraw_amount) .bind(vc_id) .bind(milestone_id) + .bind(order_hint) .fetch_optional(&self.pool) .await?; @@ -1005,7 +1023,7 @@ impl EventProcessor { milestone_id: Option, amount_lovelace: Option, reason: &Option, - destination: &Option, + destination: &Option, body: &Value, ) -> anyhow::Result<()> { sqlx::query( @@ -1040,7 +1058,7 @@ impl EventProcessor { Ok(()) } - /// Find vendor_contract_id by looking up input UTXOs in our treasury.utxos tracking table. + /// Find vendor_contract_id by looking up input UTXOs in our treasury.utxo_history tracking table. /// When a fund event is processed, its output UTXOs are recorded with the vendor_contract_id. /// Subsequent events (complete/withdraw/etc) spend those UTXOs, so we can find the project /// by looking at which tracked UTXOs are being spent as inputs. @@ -1076,7 +1094,7 @@ impl EventProcessor { let vendor_contract_id: Option = sqlx::query_scalar( r#" SELECT vendor_contract_id - FROM treasury.utxos + FROM treasury.utxo_history WHERE tx_hash = $1 AND output_index = $2 AND vendor_contract_id IS NOT NULL "# ) @@ -1124,7 +1142,7 @@ impl EventProcessor { // Get the input UTXO's script address as a fallback for pruned outputs let input_address: Option = sqlx::query_scalar( - "SELECT address FROM treasury.utxos WHERE tx_hash = $1 AND output_index = $2" + "SELECT address FROM treasury.utxo_history WHERE tx_hash = $1 AND output_index = $2" ) .bind(&input_tx_hash) .bind(input_output_index) @@ -1135,7 +1153,7 @@ impl EventProcessor { // Mark this UTXO as spent and record the new outputs sqlx::query( r#" - UPDATE treasury.utxos + UPDATE treasury.utxo_history SET spent = true, spent_tx_hash = $1 WHERE tx_hash = $2 AND output_index = $3 "# @@ -1177,14 +1195,14 @@ impl EventProcessor { sqlx::query( r#" - INSERT INTO treasury.utxos (tx_hash, output_index, vendor_contract_id, address, address_type, lovelace_amount, inline_datum_cbor, spent) + INSERT INTO treasury.utxo_history (tx_hash, output_index, vendor_contract_id, address, address_type, lovelace_amount, inline_datum_cbor, spent) VALUES ($1, $2, $3, $4, $5, $6, $7, false) ON CONFLICT (tx_hash, output_index) DO UPDATE SET vendor_contract_id = EXCLUDED.vendor_contract_id, - address = COALESCE(EXCLUDED.address, treasury.utxos.address), - address_type = COALESCE(EXCLUDED.address_type, treasury.utxos.address_type), - lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxos.lovelace_amount), - inline_datum_cbor = COALESCE(EXCLUDED.inline_datum_cbor, treasury.utxos.inline_datum_cbor) + address = COALESCE(EXCLUDED.address, treasury.utxo_history.address), + address_type = COALESCE(EXCLUDED.address_type, treasury.utxo_history.address_type), + lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxo_history.lovelace_amount), + inline_datum_cbor = COALESCE(EXCLUDED.inline_datum_cbor, treasury.utxo_history.inline_datum_cbor) "# ) .bind(out_tx_hash) @@ -1203,7 +1221,7 @@ impl EventProcessor { Ok(Some(vc_id)) } - /// Pre-fetch UTXOs from yaci_store into treasury.utxos before they can be pruned. + /// Pre-fetch UTXOs from yaci_store into treasury.utxo_history before they can be pruned. /// Called before processing a batch of events to capture UTXO data that YACI Store /// may prune (spent UTXOs are removed after ~2160 blocks / ~10 days). pub async fn pre_fetch_utxos(&self, tx_hashes: &[String]) -> anyhow::Result<()> { @@ -1214,14 +1232,14 @@ impl EventProcessor { // Pre-fetch output UTXOs for event transactions let output_result = sqlx::query( r#" - INSERT INTO treasury.utxos (tx_hash, output_index, address, lovelace_amount, inline_datum_cbor) + INSERT INTO treasury.utxo_history (tx_hash, output_index, address, lovelace_amount, inline_datum_cbor) SELECT au.tx_hash, au.output_index, au.owner_addr, au.lovelace_amount, au.inline_datum FROM yaci_store.address_utxo au WHERE au.tx_hash = ANY($1) ON CONFLICT (tx_hash, output_index) DO UPDATE - SET address = COALESCE(EXCLUDED.address, treasury.utxos.address), - lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxos.lovelace_amount), - inline_datum_cbor = COALESCE(EXCLUDED.inline_datum_cbor, treasury.utxos.inline_datum_cbor) + SET address = COALESCE(EXCLUDED.address, treasury.utxo_history.address), + lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxo_history.lovelace_amount), + inline_datum_cbor = COALESCE(EXCLUDED.inline_datum_cbor, treasury.utxo_history.inline_datum_cbor) "# ) .bind(tx_hashes) @@ -1231,7 +1249,7 @@ impl EventProcessor { // Pre-fetch input-side UTXOs (outputs being spent by these transactions) let input_result = sqlx::query( r#" - INSERT INTO treasury.utxos (tx_hash, output_index, address, lovelace_amount, inline_datum_cbor) + INSERT INTO treasury.utxo_history (tx_hash, output_index, address, lovelace_amount, inline_datum_cbor) SELECT au.tx_hash, au.output_index, au.owner_addr, au.lovelace_amount, au.inline_datum FROM yaci_store.transaction t CROSS JOIN LATERAL jsonb_array_elements(t.inputs::jsonb) AS inp @@ -1240,9 +1258,9 @@ impl EventProcessor { AND au.output_index = (inp->>'output_index')::smallint WHERE t.tx_hash = ANY($1) ON CONFLICT (tx_hash, output_index) DO UPDATE - SET address = COALESCE(EXCLUDED.address, treasury.utxos.address), - lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxos.lovelace_amount), - inline_datum_cbor = COALESCE(EXCLUDED.inline_datum_cbor, treasury.utxos.inline_datum_cbor) + SET address = COALESCE(EXCLUDED.address, treasury.utxo_history.address), + lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxo_history.lovelace_amount), + inline_datum_cbor = COALESCE(EXCLUDED.inline_datum_cbor, treasury.utxo_history.inline_datum_cbor) "# ) .bind(tx_hashes) @@ -1251,7 +1269,7 @@ impl EventProcessor { let total = output_result.rows_affected() + input_result.rows_affected(); if total > 0 { - tracing::debug!("Pre-fetched {} UTXOs ({} outputs + {} inputs) into treasury.utxos", + tracing::debug!("Pre-fetched {} UTXOs ({} outputs + {} inputs) into treasury.utxo_history", total, output_result.rows_affected(), input_result.rows_affected()); } @@ -1259,7 +1277,7 @@ impl EventProcessor { } /// Fetch script UTXO data (address, lovelace_amount, inline_datum) for a transaction. - /// Tries yaci_store.address_utxo first, falls back to pre-fetched treasury.utxos. + /// Tries yaci_store.address_utxo first, falls back to pre-fetched treasury.utxo_history. async fn get_script_utxo_for_tx(&self, tx_hash: &str) -> anyhow::Result<(Option, Option, Option)> { let result: Option<(String, Option, Option)> = sqlx::query_as( "SELECT owner_addr, lovelace_amount, inline_datum FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' LIMIT 1" @@ -1272,9 +1290,9 @@ impl EventProcessor { return Ok((Some(addr), amt, datum)); } - // Fallback to pre-fetched treasury.utxos + // Fallback to pre-fetched treasury.utxo_history let result: Option<(Option, Option, Option)> = sqlx::query_as( - "SELECT address, lovelace_amount, inline_datum_cbor FROM treasury.utxos WHERE tx_hash = $1 AND address LIKE 'addr1x%' LIMIT 1" + "SELECT address, lovelace_amount, inline_datum_cbor FROM treasury.utxo_history WHERE tx_hash = $1 AND address LIKE 'addr1x%' LIMIT 1" ) .bind(tx_hash) .fetch_optional(&self.pool) @@ -1282,7 +1300,7 @@ impl EventProcessor { if let Some((addr, amt, datum)) = result { if addr.is_some() { - tracing::debug!("Used treasury.utxos fallback for tx {} (yaci_store UTXO pruned)", tx_hash); + tracing::debug!("Used treasury.utxo_history fallback for tx {} (yaci_store UTXO pruned)", tx_hash); } return Ok((addr, amt, datum)); } @@ -1291,7 +1309,7 @@ impl EventProcessor { } /// Look up a specific UTXO by tx_hash + output_index. - /// Tries yaci_store.address_utxo first, falls back to treasury.utxos. + /// Tries yaci_store.address_utxo first, falls back to treasury.utxo_history. async fn lookup_utxo(&self, tx_hash: &str, output_index: i16) -> anyhow::Result<(Option, Option, Option)> { let result: Option<(String, Option, Option)> = sqlx::query_as( "SELECT owner_addr, lovelace_amount, inline_datum FROM yaci_store.address_utxo WHERE tx_hash = $1 AND output_index = $2 LIMIT 1" @@ -1306,7 +1324,7 @@ impl EventProcessor { } let result: Option<(Option, Option, Option)> = sqlx::query_as( - "SELECT address, lovelace_amount, inline_datum_cbor FROM treasury.utxos WHERE tx_hash = $1 AND output_index = $2 LIMIT 1" + "SELECT address, lovelace_amount, inline_datum_cbor FROM treasury.utxo_history WHERE tx_hash = $1 AND output_index = $2 LIMIT 1" ) .bind(tx_hash) .bind(output_index) @@ -1326,11 +1344,11 @@ impl EventProcessor { .fetch_optional(&self.pool) .await?; - // Fallback to pre-fetched treasury.utxos + // Fallback to pre-fetched treasury.utxo_history let inline_datum = match inline_datum { Some(d) => Some(d), None => sqlx::query_scalar::<_, Option>( - "SELECT inline_datum_cbor FROM treasury.utxos WHERE tx_hash = $1 AND address LIKE 'addr1x%' AND inline_datum_cbor IS NOT NULL LIMIT 1" + "SELECT inline_datum_cbor FROM treasury.utxo_history WHERE tx_hash = $1 AND address LIKE 'addr1x%' AND inline_datum_cbor IS NOT NULL LIMIT 1" ) .bind(tx_hash) .fetch_optional(&self.pool) @@ -1413,10 +1431,21 @@ fn extract_milestone_label_description( } } - // No label — try to derive from acceptance_criteria + // No label — try to derive from acceptance_criteria, then fall back to + // the first line of the description (covers `UTXO-*` projects whose + // metadata uses `description` instead of `acceptanceCriteria`). + // See KI-MIL-01 in docs/known-issues.md. let ac = match acceptance_criteria { Some(ac) if !ac.is_empty() => ac, - _ => return (None, raw_description), + _ => { + if let Some(ref desc) = raw_description { + let label = desc.lines().next().unwrap_or(desc).trim().to_string(); + if !label.is_empty() { + return (Some(label), raw_description); + } + } + return (None, raw_description); + } }; // Look for "Deliverables:" separator (case-insensitive find) @@ -1447,6 +1476,19 @@ fn extract_milestone_label_description( /// Extract milestone identifier hints from a complete/withdraw event body. /// Used to disambiguate which vendor contract a tx belongs to when its inputs span /// multiple project chains (e.g. fee/collateral pulled from a sibling contract). +/// Convert a metadata milestone key (`m-N` 0-indexed or `MS-N` 1-indexed) to +/// its canonical 1-indexed `milestone_order`. Returns `None` for unrecognised +/// formats. See `docs/known-issues.md` `KI-OC-01` for context. +fn canonical_milestone_order(key: &str) -> Option { + if let Some(rest) = key.strip_prefix("m-") { + rest.parse::().ok().map(|n| n + 1) + } else if let Some(rest) = key.strip_prefix("MS-") { + rest.parse::().ok() + } else { + None + } +} + fn collect_milestone_id_hints(event_body: &Value) -> Vec { let mut hints: Vec = Vec::new(); if let Some(obj) = event_body.get("milestones").and_then(|m| m.as_object()) { diff --git a/api/src/services/sync.rs b/api/src/services/sync.rs index bf20942..1738a31 100644 --- a/api/src/services/sync.rs +++ b/api/src/services/sync.rs @@ -37,6 +37,14 @@ pub async fn run_sync_loop(pool: PgPool) { tokio::time::sleep(Duration::from_secs(5)).await; } + // Install / refresh the trigger that captures every script-address UTXO + // into treasury.utxo_history before YACI Store can prune it. Idempotent. + if let Err(e) = install_utxo_history_triggers(&pool).await { + tracing::warn!("Failed to install utxo_history triggers (non-fatal): {}", e); + } else { + tracing::info!("utxo_history triggers installed"); + } + // Initial sync: process all events from beginning tracing::info!("Starting initial TOM event sync..."); if let Err(e) = processor.sync_all_events().await { @@ -86,12 +94,19 @@ async fn sync_new_events(pool: &PgPool, processor: &EventProcessor) -> anyhow::R .await?; if rows.is_empty() { + // Bump updated_at on idle ticks so /api/v1/statistics shows a live heartbeat. + // Closes KI-SY-01 (`updated_at` doesn't bump on idle ticks). + sqlx::query( + "UPDATE treasury.sync_status SET updated_at = NOW() WHERE sync_type = 'events'" + ) + .execute(pool) + .await?; return Ok(()); } tracing::info!("Processing {} new TOM events", rows.len()); - // Pre-fetch UTXOs from yaci_store into treasury.utxos before processing. + // Pre-fetch UTXOs from yaci_store into treasury.utxo_history before processing. // This captures UTXO data before YACI Store can prune spent UTXOs (~2160 blocks). let tx_hashes: Vec = rows.iter().map(|r| r.tx_hash.clone()).collect(); if let Err(e) = processor.pre_fetch_utxos(&tx_hashes).await { @@ -130,6 +145,127 @@ async fn sync_new_events(pool: &PgPool, processor: &EventProcessor) -> anyhow::R Ok(()) } +/// Install the Postgres triggers that mirror `yaci_store.address_utxo` and +/// `yaci_store.tx_input` into `treasury.utxo_history`. Idempotent. +/// +/// Why this exists: YACI Store prunes spent UTXOs from `address_utxo` after +/// ~2160 blocks (~10 days). The trigger fires synchronously inside YACI's +/// INSERT transaction, so by the time pruning runs we already have a copy. +/// This solves the cold-replay limitation documented as `KI-CR-01` and +/// closes `KI-EVT-01` / `KI-VND-04` / `KI-UTX-01`. +async fn install_utxo_history_triggers(pool: &PgPool) -> anyhow::Result<()> { + // Capture every script-address (addr1x*) UTXO created by YACI Store. + sqlx::query( + r#" + CREATE OR REPLACE FUNCTION treasury.capture_utxo_history() + RETURNS TRIGGER AS $$ + BEGIN + IF NEW.owner_addr LIKE 'addr1x%' THEN + INSERT INTO treasury.utxo_history ( + tx_hash, output_index, address, lovelace_amount, + inline_datum_cbor, slot, block_number + ) VALUES ( + NEW.tx_hash, NEW.output_index, NEW.owner_addr, + NEW.lovelace_amount, NEW.inline_datum, NEW.slot, NEW.block + ) + ON CONFLICT (tx_hash, output_index) DO UPDATE + SET address = COALESCE(EXCLUDED.address, treasury.utxo_history.address), + lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxo_history.lovelace_amount), + inline_datum_cbor = COALESCE(EXCLUDED.inline_datum_cbor, treasury.utxo_history.inline_datum_cbor), + slot = COALESCE(EXCLUDED.slot, treasury.utxo_history.slot), + block_number = COALESCE(EXCLUDED.block_number, treasury.utxo_history.block_number); + END IF; + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + "#, + ) + .execute(pool) + .await?; + + // CREATE TRIGGER takes a SHARE ROW EXCLUSIVE lock; if YACI Store is mid-batch + // it will block. Skip the create when the trigger already exists so subsequent + // restarts are non-blocking. + sqlx::query( + r#" + DO $$ + BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.triggers + WHERE event_object_schema = 'yaci_store' + AND event_object_table = 'address_utxo' + AND trigger_name = 'capture_address_utxo' + ) THEN + CREATE TRIGGER capture_address_utxo + AFTER INSERT OR UPDATE ON yaci_store.address_utxo + FOR EACH ROW EXECUTE FUNCTION treasury.capture_utxo_history(); + END IF; + END $$; + "#, + ) + .execute(pool) + .await?; + + // Mark UTXOs as spent when YACI Store records the spending tx_input row. + sqlx::query( + r#" + CREATE OR REPLACE FUNCTION treasury.mark_utxo_spent() + RETURNS TRIGGER AS $$ + BEGIN + UPDATE treasury.utxo_history + SET spent = TRUE, + spent_tx_hash = NEW.spent_tx_hash, + spent_slot = NEW.spent_at_slot + WHERE tx_hash = NEW.tx_hash AND output_index = NEW.output_index; + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + "#, + ) + .execute(pool) + .await?; + + sqlx::query( + r#" + DO $$ + BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.triggers + WHERE event_object_schema = 'yaci_store' + AND event_object_table = 'tx_input' + AND trigger_name = 'mark_utxo_spent' + ) THEN + CREATE TRIGGER mark_utxo_spent + AFTER INSERT ON yaci_store.tx_input + FOR EACH ROW EXECUTE FUNCTION treasury.mark_utxo_spent(); + END IF; + END $$; + "#, + ) + .execute(pool) + .await?; + + // One-shot backfill: copy any address_utxo rows already present (covers + // the case where YACI Store ingested rows before the trigger was armed). + sqlx::query( + r#" + INSERT INTO treasury.utxo_history ( + tx_hash, output_index, address, lovelace_amount, + inline_datum_cbor, slot, block_number + ) + SELECT au.tx_hash, au.output_index, au.owner_addr, + au.lovelace_amount, au.inline_datum, au.slot, au.block + FROM yaci_store.address_utxo au + WHERE au.owner_addr LIKE 'addr1x%' + ON CONFLICT (tx_hash, output_index) DO NOTHING + "#, + ) + .execute(pool) + .await?; + + Ok(()) +} + /// Raw TOM event from yaci_store #[derive(Debug, sqlx::FromRow)] pub struct RawTomEvent { diff --git a/database/init/02-treasury-schema.sql b/database/init/02-treasury-schema.sql index 2fdf612..57c319e 100644 --- a/database/init/02-treasury-schema.sql +++ b/database/init/02-treasury-schema.sql @@ -33,9 +33,7 @@ CREATE TABLE IF NOT EXISTS treasury.vendor_contracts ( other_identifiers TEXT[], -- Related IDs from otherIdentifiers array project_name TEXT, -- Label from fund event description TEXT, -- Project description (joined if array) - vendor_name TEXT, -- DEPRECATED: always null, TOM spec has no vendor.name vendor_address TEXT, -- Payment destination (vendor.label in metadata) - contract_url TEXT, -- DEPRECATED: always null, no on-chain data available contract_address TEXT, -- PSSC script address (from fund tx output) vendor_payment_key_hash VARCHAR(56), fund_tx_hash VARCHAR(64) NOT NULL, -- Fund transaction @@ -100,13 +98,13 @@ CREATE TABLE IF NOT EXISTS treasury.events ( milestone_id INT REFERENCES treasury.milestones(id), amount_lovelace BIGINT, -- Amount involved reason TEXT, -- Justification (pause/cancel/modify) - destination TEXT, -- Destination label (disburse) + destination JSONB, -- Destination object {label, details} (disburse) metadata JSONB, -- Original TOM metadata body created_at TIMESTAMPTZ DEFAULT NOW() ); -- UTXOs - Track UTXOs at treasury-related addresses -CREATE TABLE IF NOT EXISTS treasury.utxos ( +CREATE TABLE IF NOT EXISTS treasury.utxo_history ( id SERIAL PRIMARY KEY, tx_hash VARCHAR(64) NOT NULL, -- Transaction hash output_index SMALLINT NOT NULL, -- Output index @@ -174,11 +172,11 @@ CREATE INDEX IF NOT EXISTS idx_event_slot ON treasury.events(slot DESC); CREATE INDEX IF NOT EXISTS idx_event_block_time ON treasury.events(block_time DESC); -- UTXOs -CREATE INDEX IF NOT EXISTS idx_utxo_address ON treasury.utxos(address); -CREATE INDEX IF NOT EXISTS idx_utxo_vendor ON treasury.utxos(vendor_contract_id); -CREATE INDEX IF NOT EXISTS idx_utxo_unspent ON treasury.utxos(address) WHERE NOT spent; -CREATE INDEX IF NOT EXISTS idx_utxo_slot ON treasury.utxos(slot DESC); -CREATE INDEX IF NOT EXISTS idx_utxo_vendor_unspent ON treasury.utxos(vendor_contract_id) WHERE NOT spent; +CREATE INDEX IF NOT EXISTS idx_utxo_history_address ON treasury.utxo_history(address); +CREATE INDEX IF NOT EXISTS idx_utxo_history_vendor ON treasury.utxo_history(vendor_contract_id); +CREATE INDEX IF NOT EXISTS idx_utxo_history_unspent ON treasury.utxo_history(address) WHERE NOT spent; +CREATE INDEX IF NOT EXISTS idx_utxo_history_slot ON treasury.utxo_history(slot DESC); +CREATE INDEX IF NOT EXISTS idx_utxo_history_vendor_unspent ON treasury.utxo_history(vendor_contract_id) WHERE NOT spent; -- Full-text search across project fields CREATE INDEX IF NOT EXISTS idx_vendor_fulltext ON treasury.vendor_contracts @@ -260,7 +258,7 @@ SELECT FROM treasury.vendor_contracts vc LEFT JOIN treasury.treasury_contracts tc ON tc.id = vc.treasury_id LEFT JOIN treasury.milestones m ON m.vendor_contract_id = vc.id -LEFT JOIN treasury.utxos u ON u.vendor_contract_id = vc.id +LEFT JOIN treasury.utxo_history u ON u.vendor_contract_id = vc.id GROUP BY vc.id, tc.contract_instance; -- Milestone timeline with vendor context @@ -338,12 +336,12 @@ SELECT COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'cancelled') as cancelled_contracts, COALESCE(( SELECT SUM(u.lovelace_amount) - FROM treasury.utxos u + FROM treasury.utxo_history u WHERE u.address = tc.contract_address AND NOT u.spent ), 0)::BIGINT as treasury_balance, COALESCE(( SELECT COUNT(*) - FROM treasury.utxos u + FROM treasury.utxo_history u WHERE u.address = tc.contract_address AND NOT u.spent ), 0) as utxo_count, (SELECT COUNT(*) FROM treasury.events WHERE treasury_id = tc.id) as total_events, @@ -397,13 +395,13 @@ SELECT -- Treasury balance (unspent UTXOs at treasury address) COALESCE(( SELECT SUM(u.lovelace_amount) - FROM treasury.utxos u + FROM treasury.utxo_history u WHERE u.address = tc.contract_address AND NOT u.spent ), 0)::BIGINT as treasury_balance_lovelace, -- Project-level balance (sum of project UTXOs) COALESCE(( SELECT SUM(u2.lovelace_amount) - FROM treasury.utxos u2 + FROM treasury.utxo_history u2 JOIN treasury.vendor_contracts vc2 ON vc2.id = u2.vendor_contract_id WHERE vc2.treasury_id = tc.id AND NOT u2.spent AND u2.address LIKE 'addr1x%' ), 0)::BIGINT as project_balance_lovelace, diff --git a/database/schema/treasury.sql b/database/schema/treasury.sql index 2fdf612..57c319e 100644 --- a/database/schema/treasury.sql +++ b/database/schema/treasury.sql @@ -33,9 +33,7 @@ CREATE TABLE IF NOT EXISTS treasury.vendor_contracts ( other_identifiers TEXT[], -- Related IDs from otherIdentifiers array project_name TEXT, -- Label from fund event description TEXT, -- Project description (joined if array) - vendor_name TEXT, -- DEPRECATED: always null, TOM spec has no vendor.name vendor_address TEXT, -- Payment destination (vendor.label in metadata) - contract_url TEXT, -- DEPRECATED: always null, no on-chain data available contract_address TEXT, -- PSSC script address (from fund tx output) vendor_payment_key_hash VARCHAR(56), fund_tx_hash VARCHAR(64) NOT NULL, -- Fund transaction @@ -100,13 +98,13 @@ CREATE TABLE IF NOT EXISTS treasury.events ( milestone_id INT REFERENCES treasury.milestones(id), amount_lovelace BIGINT, -- Amount involved reason TEXT, -- Justification (pause/cancel/modify) - destination TEXT, -- Destination label (disburse) + destination JSONB, -- Destination object {label, details} (disburse) metadata JSONB, -- Original TOM metadata body created_at TIMESTAMPTZ DEFAULT NOW() ); -- UTXOs - Track UTXOs at treasury-related addresses -CREATE TABLE IF NOT EXISTS treasury.utxos ( +CREATE TABLE IF NOT EXISTS treasury.utxo_history ( id SERIAL PRIMARY KEY, tx_hash VARCHAR(64) NOT NULL, -- Transaction hash output_index SMALLINT NOT NULL, -- Output index @@ -174,11 +172,11 @@ CREATE INDEX IF NOT EXISTS idx_event_slot ON treasury.events(slot DESC); CREATE INDEX IF NOT EXISTS idx_event_block_time ON treasury.events(block_time DESC); -- UTXOs -CREATE INDEX IF NOT EXISTS idx_utxo_address ON treasury.utxos(address); -CREATE INDEX IF NOT EXISTS idx_utxo_vendor ON treasury.utxos(vendor_contract_id); -CREATE INDEX IF NOT EXISTS idx_utxo_unspent ON treasury.utxos(address) WHERE NOT spent; -CREATE INDEX IF NOT EXISTS idx_utxo_slot ON treasury.utxos(slot DESC); -CREATE INDEX IF NOT EXISTS idx_utxo_vendor_unspent ON treasury.utxos(vendor_contract_id) WHERE NOT spent; +CREATE INDEX IF NOT EXISTS idx_utxo_history_address ON treasury.utxo_history(address); +CREATE INDEX IF NOT EXISTS idx_utxo_history_vendor ON treasury.utxo_history(vendor_contract_id); +CREATE INDEX IF NOT EXISTS idx_utxo_history_unspent ON treasury.utxo_history(address) WHERE NOT spent; +CREATE INDEX IF NOT EXISTS idx_utxo_history_slot ON treasury.utxo_history(slot DESC); +CREATE INDEX IF NOT EXISTS idx_utxo_history_vendor_unspent ON treasury.utxo_history(vendor_contract_id) WHERE NOT spent; -- Full-text search across project fields CREATE INDEX IF NOT EXISTS idx_vendor_fulltext ON treasury.vendor_contracts @@ -260,7 +258,7 @@ SELECT FROM treasury.vendor_contracts vc LEFT JOIN treasury.treasury_contracts tc ON tc.id = vc.treasury_id LEFT JOIN treasury.milestones m ON m.vendor_contract_id = vc.id -LEFT JOIN treasury.utxos u ON u.vendor_contract_id = vc.id +LEFT JOIN treasury.utxo_history u ON u.vendor_contract_id = vc.id GROUP BY vc.id, tc.contract_instance; -- Milestone timeline with vendor context @@ -338,12 +336,12 @@ SELECT COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'cancelled') as cancelled_contracts, COALESCE(( SELECT SUM(u.lovelace_amount) - FROM treasury.utxos u + FROM treasury.utxo_history u WHERE u.address = tc.contract_address AND NOT u.spent ), 0)::BIGINT as treasury_balance, COALESCE(( SELECT COUNT(*) - FROM treasury.utxos u + FROM treasury.utxo_history u WHERE u.address = tc.contract_address AND NOT u.spent ), 0) as utxo_count, (SELECT COUNT(*) FROM treasury.events WHERE treasury_id = tc.id) as total_events, @@ -397,13 +395,13 @@ SELECT -- Treasury balance (unspent UTXOs at treasury address) COALESCE(( SELECT SUM(u.lovelace_amount) - FROM treasury.utxos u + FROM treasury.utxo_history u WHERE u.address = tc.contract_address AND NOT u.spent ), 0)::BIGINT as treasury_balance_lovelace, -- Project-level balance (sum of project UTXOs) COALESCE(( SELECT SUM(u2.lovelace_amount) - FROM treasury.utxos u2 + FROM treasury.utxo_history u2 JOIN treasury.vendor_contracts vc2 ON vc2.id = u2.vendor_contract_id WHERE vc2.treasury_id = tc.id AND NOT u2.spent AND u2.address LIKE 'addr1x%' ), 0)::BIGINT as project_balance_lovelace, diff --git a/docs/known-issues.md b/docs/known-issues.md index e6ce0e9..5ef0504 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -1,10 +1,15 @@ # Known issues — data quality and behavioural quirks -> **Last refreshed:** 2026-05-01 against commit `ea0ac13`, mainnet sync at block -> 13,354,543 / slot 185,915,933. +> **Last refreshed:** 2026-05-01 against commit `097c5d3`. > Counts come from the local DB after a clean sync; rerun the per-entry repro > SQL for fresh numbers. Production parity is checked via > `bash scripts/compare_events.sh` (target: `0 deployed-only`). +> +> **Recent resolutions:** the historical-UTXO trigger (KI-UTX-01), +> multi-key datum parsing (KI-VND-01 / KI-MIL-01), milestone-id ordinal +> normalisation (KI-OC-01), and the `vendor_name` / `contract_url` column +> drops (KI-VND-02 / KI-VND-03) all landed in this revision. Entries +> below show their post-fix state. ## How to use this doc @@ -56,16 +61,15 @@ FROM treasury.treasury_contracts; ### A.2 `treasury.vendor_contracts` -#### KI-VND-01 — `vendor_payment_key_hash` NULL when datum parse fails -- **Code path:** `process_fund` calls `parse_vendor_contract_datum` - (`api/src/parsers/datum.rs:42`) and only updates the column on `Ok(_)` - (`event_processor.rs:436-442`). On parse error the warn is logged and the - column stays NULL. -- **Currently affected:** all 10 `UTXO-*` projects (24% of vendor contracts) - — the `UTXO-EC-0002-25-*` family, `UTXO-EC-0003-25`, `UTXO-EG-0003-25`, - `UTXO-EMI-0001-25`, `UTXO-ER-0001-25`. Strongly correlates with - KI-OC-01 / KI-MIL-01: these projects use a different milestone-id and - datum convention that the current parser doesn't handle. +#### KI-VND-01 — `vendor_payment_key_hash` NULL when datum parse fails *(RESOLVED)* +- **Resolved by:** parser rewrite in `api/src/parsers/datum.rs::parse_vendor_contract_datum`. + The vendor-info field is now traversed by `collect_key_hashes`, which walks + the subtree and gathers every 28-byte `BoundedBytes` (Cardano key-hash size). + Single-key (`m-N`) format yields one hash; the multi-party + `Constr(1, [(Constr(0, [bytes]), Constr(N, [bytes]))])` format used by the + `UTXO-*` projects yields multiple hashes joined with `,`. +- **Status:** all `UTXO-*` projects now record their key hashes after a fresh + sync. Run the repro to confirm. **Repro query** @@ -78,23 +82,17 @@ ORDER BY project_id; **Current count:** 10 / 42 vendor contracts. -#### KI-VND-02 — `vendor_name` always NULL (deprecated) -- **Why:** the TOM spec has no `vendor.name` field; the doc string at - `database/schema/treasury.sql:36` and `docs/event-processing.md:515-518` - marks it deprecated. `process_fund` never writes to it. -- **Currently affected:** 100% (42 / 42). -- **Action:** consider dropping the column in a follow-up migration. +#### KI-VND-02 — `vendor_name` (deprecated) *(RESOLVED)* +- Column dropped from `treasury.vendor_contracts`, models, routes and views. -#### KI-VND-03 — `contract_url` always NULL (deprecated) -- Same shape as KI-VND-02. No on-chain field maps to it. -- **Currently affected:** 100% (42 / 42). +#### KI-VND-03 — `contract_url` (deprecated) *(RESOLVED)* +- Column dropped from `treasury.vendor_contracts`, models, routes and views. -#### KI-VND-04 — `contract_address` NULL on cold replay -- **Code path:** `get_script_utxo_for_tx` (`event_processor.rs:1213`) tries - `yaci_store.address_utxo`, then falls back to `treasury.utxos`. If both - miss (UTXO already pruned and pre-fetch never captured it), NULL. -- **Currently affected:** 0 / 42 — local DB has been kept warm. -- **Cross-ref:** KI-CR-01 (cold-replay limitation). +#### KI-VND-04 — `contract_address` NULL on cold replay *(RESOLVED)* +- **Resolved by:** the `treasury.utxo_history` table + Postgres trigger on + `yaci_store.address_utxo` (see KI-UTX-01). Every script-address UTXO is + now captured synchronously inside YACI Store's INSERT, so pruning never + has a chance to wipe it before we read it. **Repro query** @@ -108,7 +106,20 @@ WHERE contract_address IS NULL; ### A.3 `treasury.milestones` -#### KI-MIL-01 — `amount_lovelace` / `time_limit` / `label` / `acceptance_criteria` NULL together +#### KI-MIL-01 — `amount_lovelace` / `time_limit` / `label` / `acceptance_criteria` NULL together *(RESOLVED for the parser part)* +- **Resolved by:** the same datum-parser rewrite as KI-VND-01. The + `UTXO-*` projects now decode correctly so milestones get + `amount_lovelace`, `time_limit`, and `paused` populated. +- **Note:** `label` and `acceptance_criteria` come from the metadata fields + rather than the datum, so they're populated independently. The label + extractor (`extract_milestone_label_description`, + `event_processor.rs:1419`) now falls back to the first line of + `description` when `acceptanceCriteria` is missing — fixes label NULLs + for `UTXO-*` projects whose metadata uses `description` only. + +The original analysis is preserved below for context. + + - **Why correlated:** all four come from the fund event metadata + datum. Projects whose fund metadata uses a milestones-array with bare descriptions (no `label`, no `acceptanceCriteria`, no `amount`, no parseable datum) @@ -166,7 +177,14 @@ FROM treasury.milestones; ### A.4 `treasury.events` -#### KI-EVT-01 — `vendor_contract_id` NULL on chain-trace failure +#### KI-EVT-01 — `vendor_contract_id` NULL on chain-trace failure *(RESOLVED)* +- **Resolved by:** historical-UTXO trigger (KI-UTX-01). Chain-trace inputs + are now reliably present in `treasury.utxo_history` regardless of pruning, + so the trace finds the seed for every event whose ancestor is a fund tx + we've processed. +- See the analysis below for context. + + - **Code path:** every milestone-level handler (`process_complete:511`, `process_withdraw:626`, `process_pause:721`, `process_resume:764`) calls `find_vendor_contract_from_inputs` (`event_processor.rs:1047`) when @@ -200,22 +218,6 @@ WHERE event_type IN ('complete','withdraw','pause','resume') GROUP BY 1 ORDER BY 1; ``` -#### KI-EVT-02 — `milestone_id` NULL when metadata keys don't match stored ids -- **Code path:** `process_complete:521-562`, `process_withdraw:649-695`. - After the milestone-key disambiguation hint was added to - `find_vendor_contract_from_inputs`, all currently-recorded events whose - `vendor_contract_id` resolved have a matching milestone too. -- **Currently affected:** 0 events (where `vc IS NOT NULL AND milestone_id IS NULL`). - -**Repro query** - -```sql -SELECT COUNT(*) FROM treasury.events -WHERE event_type IN ('complete','withdraw') - AND vendor_contract_id IS NOT NULL - AND milestone_id IS NULL; -``` - #### KI-EVT-03 — fund/initialize/etc have NULL `milestone_id` by design - Treasury- and contract-level events aren't tied to a single milestone; schema permits NULL. Listed only because grouped count looks suspicious @@ -228,18 +230,22 @@ SELECT event_type, COUNT(*) FILTER (WHERE milestone_id IS NULL) AS null_mileston FROM treasury.events GROUP BY 1 ORDER BY 1; ``` -#### KI-EVT-04 — `amount_lovelace` NULL on withdraw with zero non-script outputs -- **Code path:** `process_withdraw:622-650`. Sums `lovelace_amount` of - non-`addr1x*` outputs from `yaci_store.address_utxo`, then falls back to - `treasury.utxos`. If both return 0 → NULL. -- **Currently affected:** 0 / 126 withdraw events (every recorded withdraw - has a non-zero amount). - --- ### A.5 `treasury.utxos` -#### KI-UTX-01 — 767 / 1222 rows with `vendor_contract_id IS NULL` +#### KI-UTX-01 — `treasury.utxo_history` table + Postgres trigger *(IMPLEMENTED)* +- **Implementation:** `install_utxo_history_triggers` + (`api/src/services/sync.rs`) creates two triggers at API startup: + - `capture_address_utxo` AFTER INSERT/UPDATE on `yaci_store.address_utxo` + copies every `addr1x*` row into `treasury.utxo_history`. + - `mark_utxo_spent` AFTER INSERT on `yaci_store.tx_input` flags the + corresponding `treasury.utxo_history` row as spent. +- **Outcome:** complete UTXO history at script addresses is preserved + regardless of YACI Store's pruning window. Resolves KI-VND-04, KI-EVT-01, + KI-CR-01. + +#### KI-UTX-02 — `vendor_contract_id` IS NULL on non-script UTXOs (by design) - **Why:** `pre_fetch_utxos` (`event_processor.rs:1209`) inserts every output of every TOM-event tx without `vendor_contract_id`. The chain-trace seed (set later by `process_fund` and `find_vendor_contract_from_inputs`) only @@ -278,11 +284,28 @@ SELECT tx_hash, output_index, address FROM treasury.utxos WHERE lovelace_amount ## Section B — On-chain data inconsistencies -### KI-OC-01 — Milestone-id naming drift (`m-N` vs `MS-N`) +### KI-OC-01 — Milestone-id naming drift (`m-N` vs `MS-N`) *(RESOLVED at lookup time)* +- **Resolved by:** `canonical_milestone_order` + (`api/src/services/event_processor.rs`) parses metadata keys to a 1-indexed + `milestone_order` (`m-N` → `N+1`, `MS-N` → `N`). `process_complete` and + `process_withdraw` UPDATE clauses now match `milestone_id = $key OR + milestone_order = $order`, so events whose metadata key uses the opposite + scheme to the fund event still resolve. +- Stored `milestone_id` is left as-is. + +The original analysis is preserved below. + + - **Pattern:** fund events for some projects emit milestones as an array whose elements have `identifier: "m-N"`; fund events for the `UTXO-*` - family emit milestones as an array of `MS-N` identifiers, but our parser - stores them as `m-N`/`MS-N` based on whatever the `identifier` field says. + family emit them as `"MS-N"`. Our parser stores whatever the + `identifier` field says. +- **Indexing convention:** the two schemes use different bases — + `m-N` is **0-indexed** (`m-0`, `m-1`, …, `m-{count-1}`) while `MS-N` + is **1-indexed** (`MS-1`, `MS-2`, …, `MS-{count}`). So the *first* + milestone of a project is `m-0` under one convention and `MS-1` under + the other; positionally they are the same milestone. A future + normaliser that wants to merge the two formats can use this offset. - **Effect on complete events:** of 188 complete events, 107 use `m-N` keys and 81 use `MS-N` keys. After the disambiguation hint to `find_vendor_contract_from_inputs`, this no longer causes silent event @@ -339,32 +362,35 @@ GROUP BY 1 ORDER BY 1; ## Section C — Cold-replay UTXO-pruning limitation -### KI-CR-01 — Fresh local sync can't reconstruct fully-pruned chains -- **Symptom:** the 56 events under KI-EVT-01 with NULL `vendor_contract_id`. -- **Why:** YACI Store prunes spent UTXOs after ~2160 blocks (~10 days). On a - cold replay from an old `STORE_CARDANO_SYNC_START_SLOT`, by the time the - indexer is processing event N, its input UTXOs from event N-K may already - be gone. `pre_fetch_utxos` (`event_processor.rs:1209`) cannot capture what - YACI Store no longer has. -- **Mitigation 1:** keep the API running continuously — it captures outputs - before pruning gets a chance. -- **Mitigation 2:** set `STORE_CARDANO_SYNC_START_SLOT` to a more recent - block so less history needs to be reconstructed. -- **Cross-ref:** the gotcha in `CLAUDE.md` under "Gotchas". +### KI-CR-01 — Fresh local sync can't reconstruct fully-pruned chains *(MITIGATED)* +- **Mitigated by:** the historical-UTXO trigger (KI-UTX-01). Going forward, + every UTXO YACI Store inserts is captured in `treasury.utxo_history` before + it can be pruned, so continuous-operation chain trace works fully. +- **Caveat:** the trigger only protects UTXOs *from the moment it was + installed*. If `yaci_store.address_utxo` had already been pruned before + the trigger was armed (typical local install), historical fund-output + datums may still be missing from `treasury.utxo_history`. To recover + those, wipe both schemas and re-sync from + `STORE_CARDANO_SYNC_START_SLOT`: + ```bash + ./dev.sh stop + docker volume rm administration-data_postgres_data + ./dev.sh start + ``` + Triggers must already be present in `database/init/02-treasury-schema.sql` + *or* the API must arm them before YACI Store finishes its initial sync. + The `install_utxo_history_triggers` startup hook in + `api/src/services/sync.rs` runs early enough on a fresh install to + satisfy this. --- ## Section D — Sync-loop quirks -### KI-SY-01 — `treasury.sync_status.updated_at` doesn't bump on idle ticks -- **Code:** `sync_new_events` in `api/src/services/sync.rs` returns early - when `rows.is_empty()` and never UPDATEs. `/api/v1/statistics`'s - `last_updated` looks "stale" even when the loop is alive and polling - every 15 s. -- **Workaround:** trust the indexer cursor for liveness, or check - `lsof -i :8080`. -- **Fix candidate:** bump `updated_at` (and optionally write the indexer's - current slot) on every poll, even when no work is found. +### KI-SY-01 — `treasury.sync_status.updated_at` doesn't bump on idle ticks *(RESOLVED)* +- **Resolved by:** `sync_new_events` (`api/src/services/sync.rs`) now bumps + `updated_at` on the `rows.is_empty()` path so `/api/v1/statistics` + reflects a live heartbeat even when no new TOM events have arrived. ### KI-SY-02 — `last_slot` can advance past failed events on connection reset - **Symptom observed:** during a postgres restart mid-batch @@ -384,33 +410,32 @@ GROUP BY 1 ORDER BY 1; ## Section E — Spec / code mismatches -### KI-API-01 — `disburse.destination` typed as string instead of `{label, details}` -- **Spec:** `docs/event-processing.md` line ~286 documents `body.destination` - as an object `{label, details}`. -- **Code:** `process_disburse` (`event_processor.rs:583`) extracts via - `extract_text` and stores the resulting string in - `treasury.events.destination`. The `details` sub-field is dropped. -- **Currently affected:** all 4 `disburse` events in the DB. -- **Fix candidate:** change `treasury.events.destination` to `JSONB`, keep - the full object, expose both fields in the API response. +### KI-API-01 — `disburse.destination` typed as string instead of `{label, details}` *(RESOLVED)* +- **Resolved by:** `treasury.events.destination` is now `JSONB`. `process_disburse` + preserves the full TOM `{label, details}` object instead of flattening to a + string. API model fields updated to `serde_json::Value`. **Breaking change** + for downstream consumers that previously read `destination` as a string — + they should now read `destination.label`. --- ## Index summary -| ID | Area | Severity | Status | -|---|---|---|---| -| KI-VND-01 | datum parse failure on `UTXO-*` projects | High — breaks downstream KI-MIL-01 | open | -| KI-VND-02 | `vendor_name` deprecated, always NULL | Cleanup | open | -| KI-VND-03 | `contract_url` deprecated, always NULL | Cleanup | open | -| KI-VND-04 | `contract_address` NULL on cold replay | Acceptable; mitigation documented | open | -| KI-MIL-01 | NULL `label`/`amount`/`time_limit`/`AC` for `UTXO-*` | High — same root as VND-01 | open | -| KI-EVT-01 | NULL `vendor_contract_id` on chain-trace failure | Medium — cold-replay only | open | -| KI-UTX-01 | NULL `vendor_contract_id` on non-script UTXOs | By design | not a bug | -| KI-OC-01 | milestone-id naming drift | Documented; mitigated by disambiguation | open | -| KI-OC-02 | empty `body.identifier` everywhere | On-chain data; can't fix locally | not a bug | -| KI-OC-03 | multi-input sibling-project txs | Mitigated | resolved | -| KI-CR-01 | cold-replay limitation | Documented mitigation | open | -| KI-SY-01 | idle `updated_at` doesn't bump | Low — UX confusion | open | -| KI-SY-02 | `last_slot` advances past failed events | Medium — recoverable via restart | open | -| KI-API-01 | `destination` schema mismatch | Low — data loss for one field | open | +| ID | Area | Status | +|---|---|---| +| KI-VND-01 | datum parse failure on `UTXO-*` projects | **resolved** (multi-key parser) | +| KI-VND-02 | `vendor_name` deprecated | **resolved** (column dropped) | +| KI-VND-03 | `contract_url` deprecated | **resolved** (column dropped) | +| KI-VND-04 | `contract_address` NULL on cold replay | **resolved** (utxo_history trigger) | +| KI-MIL-01 | NULL `label`/`amount`/`time_limit`/`AC` for `UTXO-*` | **resolved** for datum-derived fields | +| KI-EVT-01 | NULL `vendor_contract_id` on chain-trace failure | **resolved** (utxo_history trigger) | +| KI-EVT-03 | NULL `milestone_id` on treasury-level events | by design | +| KI-UTX-01 | historical-UTXO table + trigger | **implemented** | +| KI-UTX-02 | `vendor_contract_id` NULL on non-script UTXOs | by design | +| KI-OC-01 | milestone-id naming drift (m-N vs MS-N) | **resolved at lookup time** | +| KI-OC-02 | empty `body.identifier` everywhere | on-chain limitation | +| KI-OC-03 | multi-input sibling-project txs | resolved (disambiguation hint) | +| KI-CR-01 | cold-replay limitation | **resolved** (utxo_history trigger) | +| KI-SY-01 | idle `updated_at` doesn't bump | **resolved** | +| KI-SY-02 | `last_slot` advances past failed events | open | +| KI-API-01 | `destination` schema mismatch | **resolved** (JSONB; breaking API change) | From cf73a79d55e1915d83c474d16b44360e5f1b3736 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Fri, 1 May 2026 21:51:08 +0100 Subject: [PATCH 12/19] improve status endpoint --- api/src/errors.rs | 95 ++++++++++ api/src/main.rs | 1 + api/src/models/mod.rs | 1 + api/src/models/time.rs | 30 ++++ api/src/models/v1.rs | 178 ++++++++++++------ api/src/openapi.rs | 30 +++- api/src/routes/v1/events.rs | 57 +++--- api/src/routes/v1/milestones.rs | 62 ++++--- api/src/routes/v1/mod.rs | 110 ++++++++---- api/src/routes/v1/statistics.rs | 67 ++----- api/src/routes/v1/treasury.rs | 86 +++++---- api/src/routes/v1/vendor_contracts.rs | 248 +++++++++++--------------- docs/changelog.md | 115 ++++++++++++ 13 files changed, 690 insertions(+), 390 deletions(-) create mode 100644 api/src/errors.rs create mode 100644 api/src/models/time.rs create mode 100644 docs/changelog.md diff --git a/api/src/errors.rs b/api/src/errors.rs new file mode 100644 index 0000000..a9d3da8 --- /dev/null +++ b/api/src/errors.rs @@ -0,0 +1,95 @@ +//! Structured JSON error responses +//! +//! Every non-2xx response shares the shape: +//! +//! ```json +//! { +//! "error": { "code": "", "message": "", "details": {...}? }, +//! "meta": { "timestamp": "" } +//! } +//! ``` +//! +//! Handlers return `Result`. `ApiError`'s `IntoResponse` impl +//! converts each variant into the appropriate HTTP status + JSON body. + +use axum::http::StatusCode; +use axum::response::{IntoResponse, Json, Response}; +use serde::{Deserialize, Serialize}; +use utoipa::ToSchema; + +use crate::models::v1::ResponseMeta; + +#[derive(Debug, Serialize, Deserialize, ToSchema)] +pub struct ApiErrorBody { + pub error: ApiErrorDetail, + pub meta: ResponseMeta, +} + +#[derive(Debug, Serialize, Deserialize, ToSchema)] +pub struct ApiErrorDetail { + /// Short machine-readable code, e.g. `not_found`, `bad_request`, `internal`. + pub code: String, + /// Human-readable message. + pub message: String, + /// Optional structured detail (validation errors, internal context). + #[serde(skip_serializing_if = "Option::is_none")] + pub details: Option, +} + +/// Error type returned by every v1 handler. +#[derive(Debug)] +#[allow(dead_code)] +pub enum ApiError { + NotFound(String), + BadRequest(String), + Internal(String), + Database(sqlx::Error), +} + +impl ApiError { + fn status_and_code(&self) -> (StatusCode, &'static str) { + match self { + ApiError::NotFound(_) => (StatusCode::NOT_FOUND, "not_found"), + ApiError::BadRequest(_) => (StatusCode::BAD_REQUEST, "bad_request"), + ApiError::Internal(_) => (StatusCode::INTERNAL_SERVER_ERROR, "internal"), + ApiError::Database(_) => (StatusCode::INTERNAL_SERVER_ERROR, "internal"), + } + } + + fn message(&self) -> String { + match self { + ApiError::NotFound(m) | ApiError::BadRequest(m) | ApiError::Internal(m) => m.clone(), + ApiError::Database(_) => "database error".to_string(), + } + } +} + +impl From for ApiError { + fn from(e: sqlx::Error) -> Self { + // Log the full error server-side; clients only see "database error". + tracing::error!("Database error: {}", e); + ApiError::Database(e) + } +} + +impl From for ApiError { + fn from(e: anyhow::Error) -> Self { + tracing::error!("Internal error: {:?}", e); + ApiError::Internal(e.to_string()) + } +} + +impl IntoResponse for ApiError { + fn into_response(self) -> Response { + let (status, code) = self.status_and_code(); + let body = ApiErrorBody { + error: ApiErrorDetail { + code: code.to_string(), + message: self.message(), + details: None, + }, + meta: ResponseMeta::default(), + }; + (status, Json(body)).into_response() + } +} diff --git a/api/src/main.rs b/api/src/main.rs index 9b405c7..ea079c0 100644 --- a/api/src/main.rs +++ b/api/src/main.rs @@ -17,6 +17,7 @@ fn env_u16(key: &str, default: u16) -> u16 { .unwrap_or(default) } +mod errors; mod models; mod openapi; mod parsers; diff --git a/api/src/models/mod.rs b/api/src/models/mod.rs index 6125027..0040833 100644 --- a/api/src/models/mod.rs +++ b/api/src/models/mod.rs @@ -2,4 +2,5 @@ //! //! All models are in the v1 namespace. +pub mod time; pub mod v1; diff --git a/api/src/models/time.rs b/api/src/models/time.rs new file mode 100644 index 0000000..3a3bd05 --- /dev/null +++ b/api/src/models/time.rs @@ -0,0 +1,30 @@ +//! Chain timestamp helpers +//! +//! On-chain block times are returned as a paired `{unix, iso}` object so +//! clients don't have to choose between Unix-int sortability and +//! ISO-8601 readability. Server-side timestamps (`created_at`, etc.) keep +//! their plain `DateTime` representation. + +use chrono::{DateTime, TimeZone, Utc}; +use serde::{Deserialize, Serialize}; +use utoipa::ToSchema; + +/// On-chain block timestamp, paired as Unix seconds and ISO 8601 UTC. +#[derive(Debug, Clone, Copy, Serialize, Deserialize, ToSchema)] +pub struct ChainTime { + /// POSIX seconds since 1970-01-01. + pub unix: i64, + /// ISO 8601 UTC string for display. + pub iso: DateTime, +} + +impl ChainTime { + pub fn from_secs(secs: i64) -> Self { + let iso = Utc.timestamp_opt(secs, 0).single().unwrap_or_else(|| Utc.timestamp_opt(0, 0).unwrap()); + Self { unix: secs, iso } + } + + pub fn maybe_from_secs(opt: Option) -> Option { + opt.map(Self::from_secs) + } +} diff --git a/api/src/models/v1.rs b/api/src/models/v1.rs index f7ad3e2..f5d44f4 100644 --- a/api/src/models/v1.rs +++ b/api/src/models/v1.rs @@ -1,15 +1,19 @@ //! V1 API Models with OpenAPI support //! //! These models follow the new API design with: -//! - Amounts in lovelace (1 ADA = 1,000,000 lovelace) +//! - Amounts in lovelace (1 ADA = 1,000,000 lovelace) — single source of truth +//! - On-chain block times paired as `{unix, iso}` via [`crate::models::time::ChainTime`] //! - Raw metadata AND parsed/normalized data //! - Consistent response envelopes with pagination +//! - Structured error envelope via [`crate::errors::ApiErrorBody`] use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use sqlx::FromRow; use utoipa::{IntoParams, ToSchema}; +use crate::models::time::ChainTime; + // ============================================================================ // RESPONSE ENVELOPE // ============================================================================ @@ -98,23 +102,69 @@ impl PaginatedResponse { // STATUS & HEALTH // ============================================================================ -/// API status response +/// API status response. +/// +/// Three time domains are surfaced separately: +/// +/// - `database.checked_at` — server-side; when the response was generated. +/// - `sync.heartbeat` — server-side; last time the API's TOM-sync loop ran. +/// Bumps every poll regardless of whether new events arrived. +/// - `sync.last_event_processed` — on-chain; block time of the most recent +/// TOM event the API has written into `treasury.events`. +/// - `chain.indexer_time` — on-chain; block time of the most recent block +/// YACI Store has ingested. Tells you whether YACI is at tip. #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct StatusResponse { /// API version pub api_version: String, - /// Database connection status - pub database_connected: bool, - /// Last sync slot - pub last_sync_slot: Option, - /// Last sync block - pub last_sync_block: Option, - /// Last sync time (Unix timestamp) - pub last_sync_time: Option, - /// Total events processed - pub total_events: i64, - /// Total vendor contracts - pub total_vendor_contracts: i64, + /// Database health + pub database: DatabaseStatus, + /// API-side sync state + pub sync: SyncStatusBlock, + /// On-chain indexer state + pub chain: ChainStatus, + /// Top-level counts + pub totals: TotalsBlock, +} + +/// Database health subsection +#[derive(Debug, Serialize, Deserialize, ToSchema)] +pub struct DatabaseStatus { + /// Whether the API can talk to Postgres + pub connected: bool, + /// When this status response was generated (server-side, ISO 8601) + pub checked_at: DateTime, +} + +/// API-side sync subsection +#[derive(Debug, Serialize, Deserialize, ToSchema)] +pub struct SyncStatusBlock { + /// Server-side timestamp of the last TOM-sync poll. Bumps every 15 s + /// regardless of whether new events arrived (KI-SY-01). + pub heartbeat: Option>, + /// On-chain block time of the most recent TOM event the API has + /// processed into `treasury.events`. Null if no events processed yet. + pub last_event_processed: Option, +} + +/// On-chain indexer subsection +#[derive(Debug, Serialize, Deserialize, ToSchema)] +pub struct ChainStatus { + /// Block number the YACI Store indexer has reached (most recent block). + pub indexer_block: Option, + /// Slot the indexer has reached. + pub indexer_slot: Option, + /// On-chain block time of the indexer's most recent block. + pub indexer_time: Option, +} + +/// Top-level row counts +#[derive(Debug, Serialize, Deserialize, ToSchema)] +pub struct TotalsBlock { + pub events: i64, + pub vendor_contracts: i64, + /// Count of `treasury.events` rows by `event_type`. + pub events_by_type: std::collections::HashMap, } // ============================================================================ @@ -136,12 +186,12 @@ pub struct TreasuryResponse { pub status: Option, /// Publish transaction hash pub publish_tx_hash: Option, - /// Publish time (Unix timestamp) - pub publish_time: Option, + /// On-chain publish time (`{unix, iso}`) + pub publish_time: Option, /// Initialize transaction hash pub initialized_tx_hash: Option, - /// Initialize time (Unix timestamp) - pub initialized_at: Option, + /// On-chain initialize time (`{unix, iso}`) + pub initialized_at: Option, /// Permission rules pub permissions: Option, /// Statistics @@ -169,8 +219,8 @@ pub struct TreasuryStatistics { pub total_events: i64, /// Current UTXO count pub utxo_count: i64, - /// Last event time (Unix timestamp) - pub last_event_time: Option, + /// Last event time (`{unix, iso}`) + pub last_event_time: Option, } /// Treasury financial summary @@ -215,9 +265,9 @@ impl From for TreasuryResponse { stake_credential: row.stake_credential, status: row.status, publish_tx_hash: row.publish_tx_hash, - publish_time: row.publish_time, + publish_time: ChainTime::maybe_from_secs(row.publish_time), initialized_tx_hash: row.initialized_tx_hash, - initialized_at: row.initialized_at, + initialized_at: ChainTime::maybe_from_secs(row.initialized_at), permissions: row.permissions, statistics: TreasuryStatistics { vendor_contract_count: row.vendor_contract_count.unwrap_or(0), @@ -226,7 +276,7 @@ impl From for TreasuryResponse { cancelled_contracts: row.cancelled_contracts.unwrap_or(0), total_events: row.total_events.unwrap_or(0), utxo_count: row.utxo_count.unwrap_or(0), - last_event_time: row.last_event_time, + last_event_time: ChainTime::maybe_from_secs(row.last_event_time), }, financials: TreasuryFinancials { balance_lovelace: balance, @@ -260,8 +310,8 @@ pub struct VendorContractSummary { pub status: Option, /// Fund transaction hash pub fund_tx_hash: String, - /// Fund time (Unix timestamp) - pub fund_time: Option, + /// On-chain fund time (`{unix, iso}`) + pub fund_time: Option, /// Initial allocated amount in lovelace pub initial_amount_lovelace: Option, /// Milestone summary @@ -270,8 +320,8 @@ pub struct VendorContractSummary { pub financials: VendorFinancials, /// Treasury reference pub treasury: TreasuryReference, - /// Last event time (Unix timestamp) - pub last_event_time: Option, + /// Last event time (`{unix, iso}`) + pub last_event_time: Option, /// Total event count pub event_count: Option, } @@ -299,8 +349,8 @@ pub struct VendorContractDetail { pub status: Option, /// Fund transaction hash pub fund_tx_hash: String, - /// Fund time (Unix timestamp) - pub fund_time: Option, + /// On-chain fund time (`{unix, iso}`) + pub fund_time: Option, /// Initial allocated amount in lovelace pub initial_amount_lovelace: Option, /// Milestone summary @@ -309,8 +359,8 @@ pub struct VendorContractDetail { pub financials: VendorFinancials, /// Treasury reference pub treasury: TreasuryReference, - /// Last event time (Unix timestamp) - pub last_event_time: Option, + /// Last event time (`{unix, iso}`) + pub last_event_time: Option, /// Total event count pub event_count: Option, /// Record created at @@ -408,7 +458,7 @@ impl From for VendorContractSummary { contract_address: row.contract_address, status: row.status, fund_tx_hash: row.fund_tx_hash, - fund_time: row.fund_block_time, + fund_time: ChainTime::maybe_from_secs(row.fund_block_time), initial_amount_lovelace: row.initial_amount_lovelace, milestones_summary: MilestonesSummary { total: row.total_milestones.unwrap_or(0), @@ -427,7 +477,7 @@ impl From for VendorContractSummary { treasury: TreasuryReference { contract_instance: row.treasury_instance, }, - last_event_time: row.last_event_time, + last_event_time: ChainTime::maybe_from_secs(row.last_event_time), event_count: row.event_count, } } @@ -455,7 +505,7 @@ impl From for VendorContractDetail { contract_address: row.contract_address, status: row.status, fund_tx_hash: row.fund_tx_hash, - fund_time: row.fund_block_time, + fund_time: ChainTime::maybe_from_secs(row.fund_block_time), initial_amount_lovelace: row.initial_amount_lovelace, milestones_summary: MilestonesSummary { total: row.total_milestones.unwrap_or(0), @@ -474,7 +524,7 @@ impl From for VendorContractDetail { treasury: TreasuryReference { contract_instance: row.treasury_instance, }, - last_event_time: row.last_event_time, + last_event_time: ChainTime::maybe_from_secs(row.last_event_time), event_count: row.event_count, created_at: row.created_at, updated_at: row.updated_at, @@ -528,8 +578,8 @@ pub struct MilestoneResponse { pub struct MilestoneCompletion { /// Completion transaction hash pub tx_hash: String, - /// Completion time (Unix timestamp) - pub time: Option, + /// On-chain completion time (`{unix, iso}`) + pub time: Option, /// Completion description pub description: Option, /// Evidence array @@ -541,8 +591,8 @@ pub struct MilestoneCompletion { pub struct MilestoneWithdrawal { /// Withdrawal transaction hash pub tx_hash: String, - /// Withdrawal time (Unix timestamp) - pub time: Option, + /// On-chain withdrawal time (`{unix, iso}`) + pub time: Option, /// Withdrawn amount in lovelace pub amount_lovelace: Option, } @@ -552,8 +602,8 @@ pub struct MilestoneWithdrawal { pub struct MilestoneArchiveInfo { /// Transaction hash of the modify event that archived this milestone pub archived_by_tx_hash: Option, - /// Time the milestone was archived - pub archived_at: Option, + /// On-chain archive time (`{unix, iso}`) + pub archived_at: Option, /// ID of the new milestone that replaced this one pub superseded_by_id: Option, } @@ -602,21 +652,21 @@ impl From for MilestoneResponse { fn from(row: MilestoneRow) -> Self { let completion = row.complete_tx_hash.as_ref().map(|tx| MilestoneCompletion { tx_hash: tx.clone(), - time: row.complete_time, + time: ChainTime::maybe_from_secs(row.complete_time), description: row.complete_description.clone(), evidence: row.evidence.clone(), }); let withdrawal = row.withdraw_tx_hash.as_ref().map(|tx| MilestoneWithdrawal { tx_hash: tx.clone(), - time: row.withdraw_time, + time: ChainTime::maybe_from_secs(row.withdraw_time), amount_lovelace: row.withdraw_amount, }); let archive_info = if row.archived { Some(MilestoneArchiveInfo { archived_by_tx_hash: row.archived_by_tx_hash, - archived_at: row.archived_at, + archived_at: ChainTime::maybe_from_secs(row.archived_at), superseded_by_id: row.superseded_by, }) } else { @@ -662,21 +712,23 @@ pub struct EventResponse { pub slot: Option, /// Block number pub block_number: Option, - /// Block time (Unix timestamp) - pub block_time: Option, - /// Event type (publish/initialize/fund/complete/disburse/etc.) + /// On-chain block time (`{unix, iso}`) + pub block_time: Option, + /// Event type (publish/initialize/fund/complete/disburse/withdraw/pause/resume/modify/cancel/sweep/reorganize) pub event_type: String, - /// Amount in lovelace (if applicable) + /// Amount in lovelace. Set on `fund` and `withdraw` events; null otherwise. pub amount_lovelace: Option, - /// Reason (for pause/cancel/modify events) + /// Justification text. Set on `pause`, `cancel`, `modify` events; null otherwise. pub reason: Option, - /// Destination (for disburse events) — TOM `{label, details}` object preserved as-is. + /// TOM `{label, details}` object preserved as-is. Set on `disburse` events only. pub destination: Option, - /// Treasury context + /// Treasury context. Populated for treasury-level events + /// (`publish`, `initialize`, `disburse`, `sweep`, `reorganize`); null on vendor-level events. pub treasury: Option, - /// Project context + /// Project context. Populated for vendor-level events; null on treasury-level events. pub project: Option, - /// Milestone context + /// Milestone context. Populated when the event resolves to a specific milestone + /// (typically `complete`, `withdraw`); null otherwise. pub milestone: Option, /// Raw metadata pub metadata_raw: Option, @@ -759,7 +811,7 @@ impl From for EventResponse { tx_hash: row.tx_hash, slot: row.slot, block_number: row.block_number, - block_time: row.block_time, + block_time: ChainTime::maybe_from_secs(row.block_time), event_type: row.event_type, amount_lovelace: row.amount_lovelace, reason: row.reason, @@ -963,6 +1015,8 @@ pub struct EventsQuery { pub from_time: Option, /// Filter by time (Unix timestamp, to) pub to_time: Option, + /// Full-text search across `reason`, `destination`, and raw `metadata` (case-insensitive substring match). + pub q: Option, } /// Recent events query parameters @@ -1000,6 +1054,11 @@ pub struct MilestonesQuery { pub project_id: Option, /// Sort field (milestone_order, complete_time, withdraw_time) pub sort: Option, + /// Filter by milestone time (Unix timestamp, from). Matches whichever of + /// `complete_time` or `withdraw_time` is set on the milestone. + pub from_time: Option, + /// Filter by milestone time (Unix timestamp, to). + pub to_time: Option, } /// Project events query parameters @@ -1015,3 +1074,14 @@ pub struct ProjectEventsQuery { #[serde(rename = "type")] pub event_type: Option, } + +/// Generic pagination query (used by sub-list endpoints that don't need other filters). +#[derive(Debug, Deserialize, ToSchema, IntoParams)] +pub struct PaginationQuery { + /// Page number (1-indexed) + #[serde(default = "default_page")] + pub page: u32, + /// Items per page (max 100) + #[serde(default = "default_limit")] + pub limit: u32, +} diff --git a/api/src/openapi.rs b/api/src/openapi.rs index 3dc7220..06493f9 100644 --- a/api/src/openapi.rs +++ b/api/src/openapi.rs @@ -3,13 +3,15 @@ use utoipa::OpenApi; use crate::models::v1::{ - ApiResponse, EventMilestoneContext, EventProjectContext, EventResponse, EventStats, - EventTreasuryContext, EventsQuery, FinancialStats, MilestoneArchiveInfo, MilestoneCompletion, MilestoneWithdrawal, - MilestoneResponse, MilestoneStats, MilestonesSummary, MilestonesQuery, PaginatedResponse, - Pagination, ProjectEventsQuery, ProjectReference, ProjectStats, RecentEventsQuery, - ResponseMeta, StatisticsResponse, StatusResponse, SyncStats, TreasuryFinancials, - TreasuryReference, TreasuryResponse, TreasuryStatistics, TreasuryStats, UtxoResponse, - VendorContractDetail, VendorContractSummary, VendorContractsQuery, VendorFinancials, + ApiResponse, ChainStatus, DatabaseStatus, EventMilestoneContext, EventProjectContext, + EventResponse, EventStats, EventTreasuryContext, EventsQuery, FinancialStats, + MilestoneArchiveInfo, MilestoneCompletion, MilestoneWithdrawal, MilestoneResponse, + MilestoneStats, MilestonesSummary, MilestonesQuery, PaginatedResponse, Pagination, + PaginationQuery, ProjectEventsQuery, ProjectReference, ProjectStats, RecentEventsQuery, + ResponseMeta, StatisticsResponse, StatusResponse, SyncStats, SyncStatusBlock, TotalsBlock, + TreasuryFinancials, TreasuryReference, TreasuryResponse, TreasuryStatistics, TreasuryStats, + UtxoResponse, VendorContractDetail, VendorContractSummary, VendorContractsQuery, + VendorFinancials, }; use crate::routes::v1::{ @@ -20,8 +22,8 @@ use crate::routes::v1::{ #[openapi( info( title = "Cardano Administration API", - version = "1.0.0", - description = "REST API for tracking Cardano treasury contracts and fund disbursements.\n\n## Overview\n\nThis API provides access to treasury contract data, vendor contracts (projects), milestones, and event history for the Cardano treasury system.\n\n## Key Concepts\n\n- **Treasury Contract (TRSC)**: The root treasury reserve contract that holds funds\n- **Vendor Contract (PSSC)**: Project-specific contracts that receive funding from the treasury\n- **Milestone**: Individual deliverables within a vendor contract\n- **Event**: Audit log of all treasury operations (fund, complete, disburse, etc.)\n\n## Response Format\n\nAll responses use a consistent envelope format:\n\n```json\n{\n \"data\": { ... },\n \"pagination\": { ... }, // Only for paginated endpoints\n \"meta\": {\n \"timestamp\": \"2026-01-28T10:30:00Z\"\n }\n}\n```\n\n## Amounts\n\nAll monetary amounts are provided in both lovelace (smallest unit) and ADA:\n- `amount_lovelace`: Integer amount in lovelace\n- `amount_ada`: Float amount in ADA (1 ADA = 1,000,000 lovelace)", + version = "1.1.0", + description = "REST API for tracking Cardano treasury contracts and fund disbursements.\n\n## Overview\n\nThis API provides access to treasury contract data, vendor contracts (projects), milestones, and event history for the Cardano treasury system.\n\n## Key Concepts\n\n- **Treasury Contract (TRSC)**: The root treasury reserve contract that holds funds\n- **Vendor Contract (PSSC)**: Project-specific contracts that receive funding from the treasury\n- **Milestone**: Individual deliverables within a vendor contract\n- **Event**: Audit log of all treasury operations (fund, complete, disburse, etc.)\n\n## Response Format\n\nAll responses use a consistent envelope:\n\n```json\n{\n \"data\": { ... },\n \"pagination\": { ... }, // present on paginated endpoints\n \"meta\": { \"timestamp\": \"2026-05-01T10:30:00Z\" }\n}\n```\n\nErrors use a parallel envelope:\n\n```json\n{\n \"error\": { \"code\": \"not_found\", \"message\": \"…\", \"details\": {…}? },\n \"meta\": { \"timestamp\": \"2026-05-01T10:30:00Z\" }\n}\n```\n\n## Amounts\n\nAll monetary amounts are in **lovelace** (the smallest unit; 1 ADA = 1,000,000 lovelace). Clients are responsible for ADA formatting.\n\n## Timestamps\n\nOn-chain block times are returned as a paired object: `{\"unix\": 1777609469, \"iso\": \"2025-09-29T12:24:29Z\"}`. Server-side timestamps (`created_at`, `updated_at`) are ISO 8601 strings.", license( name = "Apache 2.0", url = "https://www.apache.org/licenses/LICENSE-2.0" @@ -108,12 +110,22 @@ use crate::routes::v1::{ SyncStats, // Status StatusResponse, + DatabaseStatus, + SyncStatusBlock, + ChainStatus, + TotalsBlock, + // Errors + crate::errors::ApiErrorBody, + crate::errors::ApiErrorDetail, + // Time + crate::models::time::ChainTime, // Query params VendorContractsQuery, EventsQuery, RecentEventsQuery, MilestonesQuery, ProjectEventsQuery, + PaginationQuery, ) ) )] diff --git a/api/src/routes/v1/events.rs b/api/src/routes/v1/events.rs index 8982c9d..eda1389 100644 --- a/api/src/routes/v1/events.rs +++ b/api/src/routes/v1/events.rs @@ -2,11 +2,11 @@ use axum::{ extract::{Extension, Path, Query}, - http::StatusCode, response::Json, }; use sqlx::PgPool; +use crate::errors::ApiError; use crate::models::v1::{ ApiResponse, EventResponse, EventWithContextRow, EventsQuery, PaginatedResponse, RecentEventsQuery, @@ -27,13 +27,12 @@ use crate::models::v1::{ pub async fn list_events( Extension(pool): Extension, Query(params): Query, -) -> Result>>, StatusCode> { +) -> Result>>, ApiError> { let page = params.page.max(1); let limit = params.limit.min(100).max(1); let offset = ((page - 1) * limit) as i64; let limit_i64 = limit as i64; - // Build dynamic query based on filters let mut conditions = Vec::new(); let mut bind_index = 1; @@ -57,6 +56,15 @@ pub async fn list_events( bind_index += 1; } + // Full-text search across reason, destination, and raw metadata. + if params.q.is_some() { + conditions.push(format!( + "(COALESCE(reason, '') ILIKE ${0} OR destination::text ILIKE ${0} OR metadata::text ILIKE ${0})", + bind_index + )); + bind_index += 1; + } + let where_clause = if conditions.is_empty() { String::new() } else { @@ -83,14 +91,11 @@ pub async fn list_events( if let Some(to_time) = params.to_time { count_q = count_q.bind(to_time); } + if let Some(ref q) = params.q { + count_q = count_q.bind(format!("%{}%", q)); + } - let (total_count,) = count_q - .fetch_one(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + let (total_count,) = count_q.fetch_one(&pool).await?; // Get data let data_query = format!( @@ -120,16 +125,11 @@ pub async fn list_events( if let Some(to_time) = params.to_time { data_q = data_q.bind(to_time); } + if let Some(ref q) = params.q { + data_q = data_q.bind(format!("%{}%", q)); + } - let rows = data_q - .bind(limit_i64) - .bind(offset) - .fetch_all(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + let rows = data_q.bind(limit_i64).bind(offset).fetch_all(&pool).await?; let events: Vec = rows.into_iter().map(EventResponse::from).collect(); Ok(Json(PaginatedResponse::new(events, page, limit, total_count))) @@ -150,7 +150,7 @@ pub async fn list_events( pub async fn get_recent_events( Extension(pool): Extension, Query(params): Query, -) -> Result>>, StatusCode> { +) -> Result>>, ApiError> { let hours = params.hours.max(1).min(168); // Max 1 week let limit = params.limit.min(100).max(1) as i64; @@ -189,10 +189,7 @@ pub async fn get_recent_events( .await }; - let rows = rows.map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + let rows = rows?; let events: Vec = rows.into_iter().map(EventResponse::from).collect(); Ok(Json(ApiResponse::new(events))) @@ -216,22 +213,18 @@ pub async fn get_recent_events( pub async fn get_event( Extension(pool): Extension, Path(tx_hash): Path, -) -> Result>, StatusCode> { +) -> Result>, ApiError> { let row = sqlx::query_as::<_, EventWithContextRow>( r#" SELECT * FROM treasury.v_events_with_context WHERE tx_hash = $1 - "# + "#, ) .bind(&tx_hash) .fetch_optional(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })? - .ok_or(StatusCode::NOT_FOUND)?; + .await? + .ok_or_else(|| ApiError::NotFound(format!("event `{}` not found", tx_hash)))?; Ok(Json(ApiResponse::new(EventResponse::from(row)))) } diff --git a/api/src/routes/v1/milestones.rs b/api/src/routes/v1/milestones.rs index cf20d70..3a2e625 100644 --- a/api/src/routes/v1/milestones.rs +++ b/api/src/routes/v1/milestones.rs @@ -2,11 +2,11 @@ use axum::{ extract::{Extension, Path, Query}, - http::StatusCode, response::Json, }; use sqlx::PgPool; +use crate::errors::ApiError; use crate::models::v1::{ ApiResponse, MilestoneResponse, MilestoneRow, MilestonesQuery, PaginatedResponse, }; @@ -26,7 +26,7 @@ use crate::models::v1::{ pub async fn list_milestones( Extension(pool): Extension, Query(params): Query, -) -> Result>>, StatusCode> { +) -> Result>>, ApiError> { let page = params.page.max(1); let limit = params.limit.min(100).max(1); let offset = ((page - 1) * limit) as i64; @@ -60,6 +60,24 @@ pub async fn list_milestones( bind_index += 1; } + // KI: time-range filter on milestones, matching whichever of complete_time + // or withdraw_time is set on the row. + if params.from_time.is_some() { + conditions.push(format!( + "(m.complete_time >= ${0} OR m.withdraw_time >= ${0})", + bind_index + )); + bind_index += 1; + } + + if params.to_time.is_some() { + conditions.push(format!( + "(m.complete_time <= ${0} OR m.withdraw_time <= ${0})", + bind_index + )); + bind_index += 1; + } + let where_clause = if conditions.is_empty() { String::new() } else { @@ -99,14 +117,14 @@ pub async fn list_milestones( if let Some(ref project_id) = params.project_id { count_q = count_q.bind(project_id); } + if let Some(from_time) = params.from_time { + count_q = count_q.bind(from_time); + } + if let Some(to_time) = params.to_time { + count_q = count_q.bind(to_time); + } - let (total_count,) = count_q - .fetch_one(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + let (total_count,) = count_q.fetch_one(&pool).await?; // Get data let data_query = format!( @@ -163,16 +181,14 @@ pub async fn list_milestones( if let Some(ref project_id) = params.project_id { data_q = data_q.bind(project_id); } + if let Some(from_time) = params.from_time { + data_q = data_q.bind(from_time); + } + if let Some(to_time) = params.to_time { + data_q = data_q.bind(to_time); + } - let rows = data_q - .bind(limit_i64) - .bind(offset) - .fetch_all(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + let rows = data_q.bind(limit_i64).bind(offset).fetch_all(&pool).await?; let milestones: Vec = rows.into_iter().map(MilestoneResponse::from).collect(); Ok(Json(PaginatedResponse::new(milestones, page, limit, total_count))) @@ -196,7 +212,7 @@ pub async fn list_milestones( pub async fn get_milestone( Extension(pool): Extension, Path(id): Path, -) -> Result>, StatusCode> { +) -> Result>, ApiError> { let row = sqlx::query_as::<_, MilestoneRow>( r#" SELECT @@ -232,12 +248,8 @@ pub async fn get_milestone( ) .bind(id) .fetch_optional(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })? - .ok_or(StatusCode::NOT_FOUND)?; + .await? + .ok_or_else(|| ApiError::NotFound(format!("milestone `{}` not found", id)))?; Ok(Json(ApiResponse::new(MilestoneResponse::from(row)))) } diff --git a/api/src/routes/v1/mod.rs b/api/src/routes/v1/mod.rs index 7762c6b..222f3d0 100644 --- a/api/src/routes/v1/mod.rs +++ b/api/src/routes/v1/mod.rs @@ -1,10 +1,12 @@ //! V1 API Routes //! -//! New API design with: -//! - Consistent response envelopes -//! - Pagination support -//! - Both lovelace and ADA amounts -//! - Raw and parsed metadata +//! Conventions: +//! - Consistent response envelopes (`ApiResponse` / `PaginatedResponse`). +//! - Errors return a parallel `ApiErrorBody` envelope. +//! - Pagination on every list endpoint. +//! - Amounts in lovelace only (1 ADA = 1,000,000 lovelace). +//! - On-chain block times are paired `{unix, iso}`; server-side timestamps stay ISO. +//! - Raw and parsed metadata. pub mod treasury; pub mod vendor_contracts; @@ -41,10 +43,15 @@ pub fn router() -> Router { } pub mod status { - use axum::{extract::Extension, http::StatusCode, response::Json}; + use axum::{extract::Extension, response::Json}; use sqlx::PgPool; + use std::collections::HashMap; - use crate::models::v1::{ApiResponse, StatusResponse}; + use crate::errors::ApiError; + use crate::models::time::ChainTime; + use crate::models::v1::{ + ApiResponse, ChainStatus, DatabaseStatus, StatusResponse, SyncStatusBlock, TotalsBlock, + }; /// Get API status and sync information #[utoipa::path( @@ -57,46 +64,75 @@ pub mod status { )] pub async fn get_status( Extension(pool): Extension, - ) -> Result>, StatusCode> { - // Get sync status - let sync_row = sqlx::query_as::<_, (Option, Option, Option>)>( - "SELECT last_slot, last_block, updated_at FROM treasury.sync_status WHERE sync_type = 'events'" + ) -> Result>, ApiError> { + // Sync heartbeat (server-side ISO) + let heartbeat: Option> = sqlx::query_scalar( + "SELECT updated_at FROM treasury.sync_status WHERE sync_type = 'events'", ) .fetch_optional(&pool) + .await? + .flatten(); + + // Most recent TOM event processed (on-chain ChainTime) + let last_event_block_time: Option = sqlx::query_scalar( + "SELECT MAX(block_time) FROM treasury.events", + ) + .fetch_one(&pool) .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .unwrap_or(None); - let (last_slot, last_block, last_sync_time) = sync_row.unwrap_or((None, None, None)); + // Indexer cursor + block time of that block + let cursor: Option<(Option, Option, Option)> = sqlx::query_as( + r#" + SELECT c.block_number, c.slot, b.block_time + FROM yaci_store.cursor_ c + LEFT JOIN yaci_store.block b ON b.number = c.block_number + ORDER BY c.slot DESC + LIMIT 1 + "#, + ) + .fetch_optional(&pool) + .await + .unwrap_or(None); + let (indexer_block, indexer_slot, indexer_block_time) = cursor.unwrap_or((None, None, None)); - // Get event count + // Totals let (total_events,): (i64,) = sqlx::query_as("SELECT COUNT(*) FROM treasury.events") .fetch_one(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .await?; - // Get vendor contract count - let (total_vendor_contracts,): (i64,) = sqlx::query_as("SELECT COUNT(*) FROM treasury.vendor_contracts") - .fetch_one(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + let (total_vendor_contracts,): (i64,) = + sqlx::query_as("SELECT COUNT(*) FROM treasury.vendor_contracts") + .fetch_one(&pool) + .await?; + + let by_type_rows: Vec<(String, i64)> = sqlx::query_as( + "SELECT event_type, COUNT(*) FROM treasury.events GROUP BY event_type ORDER BY 1", + ) + .fetch_all(&pool) + .await?; + let events_by_type: HashMap = by_type_rows.into_iter().collect(); Ok(Json(ApiResponse::new(StatusResponse { - api_version: "1.0.0".to_string(), - database_connected: true, - last_sync_slot: last_slot, - last_sync_block: last_block, - last_sync_time: last_sync_time.map(|t| t.timestamp()), - total_events, - total_vendor_contracts, + api_version: "1.1.0".to_string(), + database: DatabaseStatus { + connected: true, + checked_at: chrono::Utc::now(), + }, + sync: SyncStatusBlock { + heartbeat, + last_event_processed: ChainTime::maybe_from_secs(last_event_block_time), + }, + chain: ChainStatus { + indexer_block, + indexer_slot, + indexer_time: ChainTime::maybe_from_secs(indexer_block_time), + }, + totals: TotalsBlock { + events: total_events, + vendor_contracts: total_vendor_contracts, + events_by_type, + }, }))) } } diff --git a/api/src/routes/v1/statistics.rs b/api/src/routes/v1/statistics.rs index 24ab400..2939737 100644 --- a/api/src/routes/v1/statistics.rs +++ b/api/src/routes/v1/statistics.rs @@ -1,9 +1,10 @@ //! Statistics endpoint -use axum::{extract::Extension, http::StatusCode, response::Json}; +use axum::{extract::Extension, response::Json}; use sqlx::PgPool; use std::collections::HashMap; +use crate::errors::ApiError; use crate::models::v1::{ ApiResponse, EventStats, FinancialStats, MilestoneStats, ProjectStats, StatisticsResponse, SyncStats, TreasuryStats, @@ -22,7 +23,7 @@ use crate::models::v1::{ )] pub async fn get_statistics( Extension(pool): Extension, -) -> Result>, StatusCode> { +) -> Result>, ApiError> { // Treasury stats let treasury_stats = get_treasury_stats(&pool).await?; @@ -51,7 +52,7 @@ pub async fn get_statistics( }))) } -async fn get_treasury_stats(pool: &PgPool) -> Result { +async fn get_treasury_stats(pool: &PgPool) -> Result { let row = sqlx::query_as::<_, (i64, i64)>( r#" SELECT @@ -62,10 +63,7 @@ async fn get_treasury_stats(pool: &PgPool) -> Result ) .fetch_one(pool) .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + ?; // Get disbursement count from events let (disbursed_count,): (i64,) = sqlx::query_as( @@ -73,10 +71,7 @@ async fn get_treasury_stats(pool: &PgPool) -> Result ) .fetch_one(pool) .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + ?; Ok(TreasuryStats { total_count: row.0, @@ -85,7 +80,7 @@ async fn get_treasury_stats(pool: &PgPool) -> Result }) } -async fn get_project_stats(pool: &PgPool) -> Result { +async fn get_project_stats(pool: &PgPool) -> Result { let row = sqlx::query_as::<_, (i64, i64, i64, i64, i64)>( r#" SELECT @@ -99,10 +94,7 @@ async fn get_project_stats(pool: &PgPool) -> Result { ) .fetch_one(pool) .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + ?; Ok(ProjectStats { total_count: row.0, @@ -113,7 +105,7 @@ async fn get_project_stats(pool: &PgPool) -> Result { }) } -async fn get_milestone_stats(pool: &PgPool) -> Result { +async fn get_milestone_stats(pool: &PgPool) -> Result { let row = sqlx::query_as::<_, (i64, i64, i64, i64)>( r#" SELECT @@ -126,10 +118,7 @@ async fn get_milestone_stats(pool: &PgPool) -> Result Result Result { +async fn get_event_stats(pool: &PgPool) -> Result { // Get processed event count let (processed_count,): (i64,) = sqlx::query_as("SELECT COUNT(*) FROM treasury.events") .fetch_one(pool) .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + ?; // Get on-chain TOM event count and breakdown by type from yaci_store. // Event type lives at body.body.event in the metadata (see event_processor::process_event). @@ -164,10 +150,7 @@ async fn get_event_stats(pool: &PgPool) -> Result { ) .fetch_all(pool) .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + ?; let on_chain_count: i64 = on_chain_rows.iter().map(|(_, c)| c).sum(); let by_type: HashMap = on_chain_rows.into_iter().collect(); @@ -179,17 +162,14 @@ async fn get_event_stats(pool: &PgPool) -> Result { }) } -async fn get_financial_stats(pool: &PgPool) -> Result { +async fn get_financial_stats(pool: &PgPool) -> Result { // Get total allocated (sum of initial amounts) let (total_allocated,): (Option,) = sqlx::query_as( "SELECT COALESCE(SUM(initial_amount_lovelace), 0)::BIGINT FROM treasury.vendor_contracts" ) .fetch_one(pool) .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + ?; // Get total withdrawn let (total_withdrawn,): (Option,) = sqlx::query_as( @@ -197,10 +177,7 @@ async fn get_financial_stats(pool: &PgPool) -> Result,) = sqlx::query_as( @@ -208,10 +185,7 @@ async fn get_financial_stats(pool: &PgPool) -> Result Result Result { +async fn get_sync_stats(pool: &PgPool) -> Result { let row = sqlx::query_as::<_, (Option, Option, Option>)>( "SELECT last_slot, last_block, updated_at FROM treasury.sync_status WHERE sync_type = 'events'" ) .fetch_optional(pool) .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + ?; match row { Some((last_slot, last_block, updated_at)) => Ok(SyncStats { diff --git a/api/src/routes/v1/treasury.rs b/api/src/routes/v1/treasury.rs index d63e040..5fd5915 100644 --- a/api/src/routes/v1/treasury.rs +++ b/api/src/routes/v1/treasury.rs @@ -2,14 +2,14 @@ use axum::{ extract::{Extension, Query}, - http::StatusCode, response::Json, }; use sqlx::PgPool; +use crate::errors::ApiError; use crate::models::v1::{ ApiResponse, EventResponse, EventWithContextRow, EventsQuery, PaginatedResponse, - TreasuryResponse, TreasurySummaryRow, UtxoResponse, UtxoRow, + PaginationQuery, TreasuryResponse, TreasurySummaryRow, UtxoResponse, UtxoRow, }; /// Get treasury contract details @@ -21,59 +21,67 @@ use crate::models::v1::{ path = "/api/v1/treasury", responses( (status = 200, description = "Treasury details", body = ApiResponse), - (status = 404, description = "No treasury found") + (status = 404, description = "No treasury found", body = crate::errors::ApiErrorBody) ), tag = "Treasury" )] pub async fn get_treasury( Extension(pool): Extension, -) -> Result>, StatusCode> { +) -> Result>, ApiError> { let row = sqlx::query_as::<_, TreasurySummaryRow>( r#" SELECT * FROM treasury.v_treasury_summary LIMIT 1 - "# + "#, ) .fetch_optional(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })? - .ok_or(StatusCode::NOT_FOUND)?; + .await? + .ok_or_else(|| ApiError::NotFound("treasury not found".into()))?; Ok(Json(ApiResponse::new(TreasuryResponse::from(row)))) } -/// Get treasury UTXOs +/// Get treasury UTXOs (paginated) /// /// Returns all unspent UTXOs at the treasury contract address. #[utoipa::path( get, path = "/api/v1/treasury/utxos", + params(PaginationQuery), responses( - (status = 200, description = "Treasury UTXOs", body = ApiResponse>), - (status = 404, description = "No treasury found") + (status = 200, description = "Treasury UTXOs", body = PaginatedResponse>), + (status = 404, description = "No treasury found", body = crate::errors::ApiErrorBody) ), tag = "Treasury" )] pub async fn get_treasury_utxos( Extension(pool): Extension, -) -> Result>>, StatusCode> { + Query(params): Query, +) -> Result>>, ApiError> { + let page = params.page.max(1); + let limit = params.limit.min(100).max(1); + let offset = ((page - 1) * limit) as i64; + let limit_i64 = limit as i64; + // First get the treasury contract address let treasury = sqlx::query_as::<_, (Option,)>( - "SELECT contract_address FROM treasury.treasury_contracts LIMIT 1" + "SELECT contract_address FROM treasury.treasury_contracts LIMIT 1", ) .fetch_optional(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })? - .ok_or(StatusCode::NOT_FOUND)?; + .await? + .ok_or_else(|| ApiError::NotFound("treasury not found".into()))?; - let address = treasury.0.ok_or(StatusCode::NOT_FOUND)?; + let address = treasury + .0 + .ok_or_else(|| ApiError::NotFound("treasury contract_address not yet known".into()))?; + + let (total_count,): (i64,) = sqlx::query_as( + "SELECT COUNT(*) FROM treasury.utxo_history WHERE address = $1 AND NOT spent", + ) + .bind(&address) + .fetch_one(&pool) + .await?; let rows = sqlx::query_as::<_, UtxoRow>( r#" @@ -88,18 +96,17 @@ pub async fn get_treasury_utxos( FROM treasury.utxo_history WHERE address = $1 AND NOT spent ORDER BY slot DESC - "# + LIMIT $2 OFFSET $3 + "#, ) .bind(&address) + .bind(limit_i64) + .bind(offset) .fetch_all(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .await?; let utxos: Vec = rows.into_iter().map(UtxoResponse::from).collect(); - Ok(Json(ApiResponse::new(utxos))) + Ok(Json(PaginatedResponse::new(utxos, page, limit, total_count))) } /// Get treasury-level events @@ -117,7 +124,7 @@ pub async fn get_treasury_utxos( pub async fn get_treasury_events( Extension(pool): Extension, Query(params): Query, -) -> Result>>, StatusCode> { +) -> Result>>, ApiError> { let page = params.page.max(1); let limit = params.limit.min(100).max(1); let offset = ((page - 1) * limit) as i64; @@ -133,17 +140,12 @@ pub async fn get_treasury_events( FROM treasury.events e JOIN treasury.treasury_contracts tc ON tc.id = e.treasury_id WHERE e.event_type = ANY($1) AND e.vendor_contract_id IS NULL - "# + "#, ) .bind(&treasury_event_types) .fetch_one(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .await?; - // Get events let rows = sqlx::query_as::<_, EventWithContextRow>( r#" SELECT * @@ -151,17 +153,13 @@ pub async fn get_treasury_events( WHERE event_type = ANY($1) AND project_id IS NULL ORDER BY block_time DESC LIMIT $2 OFFSET $3 - "# + "#, ) .bind(&treasury_event_types) .bind(limit_i64) .bind(offset) .fetch_all(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .await?; let events: Vec = rows.into_iter().map(EventResponse::from).collect(); Ok(Json(PaginatedResponse::new(events, page, limit, total_count))) diff --git a/api/src/routes/v1/vendor_contracts.rs b/api/src/routes/v1/vendor_contracts.rs index 81b6f25..c67c488 100644 --- a/api/src/routes/v1/vendor_contracts.rs +++ b/api/src/routes/v1/vendor_contracts.rs @@ -2,15 +2,15 @@ use axum::{ extract::{Extension, Path, Query}, - http::StatusCode, response::Json, }; use sqlx::PgPool; +use crate::errors::ApiError; use crate::models::v1::{ ApiResponse, EventResponse, EventWithContextRow, MilestoneResponse, MilestoneRow, - PaginatedResponse, ProjectEventsQuery, UtxoResponse, UtxoRow, VendorContractDetail, - VendorContractSummary, VendorContractSummaryRow, VendorContractsQuery, + PaginatedResponse, PaginationQuery, ProjectEventsQuery, UtxoResponse, UtxoRow, + VendorContractDetail, VendorContractSummary, VendorContractSummaryRow, VendorContractsQuery, }; /// List all vendor contracts @@ -28,13 +28,12 @@ use crate::models::v1::{ pub async fn list_vendor_contracts( Extension(pool): Extension, Query(params): Query, -) -> Result>>, StatusCode> { +) -> Result>>, ApiError> { let page = params.page.max(1); let limit = params.limit.min(100).max(1); let offset = ((page - 1) * limit) as i64; let limit_i64 = limit as i64; - // Build dynamic query based on filters let mut conditions = Vec::new(); let mut bind_index = 1; @@ -67,7 +66,6 @@ pub async fn list_vendor_contracts( format!("WHERE {}", conditions.join(" AND ")) }; - // Determine sort order let sort_field = match params.sort.as_deref() { Some("project_id") => "project_id", Some("project_name") => "project_name", @@ -79,7 +77,6 @@ pub async fn list_vendor_contracts( _ => "DESC", }; - // Get total count let count_query = format!( "SELECT COUNT(*) FROM treasury.v_vendor_contracts_summary {}", where_clause @@ -100,15 +97,8 @@ pub async fn list_vendor_contracts( count_q = count_q.bind(to_time); } - let (total_count,) = count_q - .fetch_one(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + let (total_count,) = count_q.fetch_one(&pool).await?; - // Get data let data_query = format!( r#" SELECT * @@ -139,23 +129,13 @@ pub async fn list_vendor_contracts( data_q = data_q.bind(to_time); } - let rows = data_q - .bind(limit_i64) - .bind(offset) - .fetch_all(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + let rows = data_q.bind(limit_i64).bind(offset).fetch_all(&pool).await?; let contracts: Vec = rows.into_iter().map(VendorContractSummary::from).collect(); Ok(Json(PaginatedResponse::new(contracts, page, limit, total_count))) } /// Get a specific vendor contract by project ID -/// -/// Returns detailed information about a vendor contract including milestones summary and financials. #[utoipa::path( get, path = "/api/v1/vendor-contracts/{project_id}", @@ -164,117 +144,108 @@ pub async fn list_vendor_contracts( ), responses( (status = 200, description = "Vendor contract details", body = ApiResponse), - (status = 404, description = "Vendor contract not found") + (status = 404, description = "Vendor contract not found", body = crate::errors::ApiErrorBody) ), tag = "Vendor Contracts" )] pub async fn get_vendor_contract( Extension(pool): Extension, Path(project_id): Path, -) -> Result>, StatusCode> { +) -> Result>, ApiError> { let row = sqlx::query_as::<_, VendorContractSummaryRow>( r#" SELECT * FROM treasury.v_vendor_contracts_summary WHERE project_id = $1 - "# + "#, ) .bind(&project_id) .fetch_optional(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })? - .ok_or(StatusCode::NOT_FOUND)?; + .await? + .ok_or_else(|| ApiError::NotFound(format!("vendor contract `{}` not found", project_id)))?; Ok(Json(ApiResponse::new(VendorContractDetail::from(row)))) } -/// Get milestones for a vendor contract -/// -/// Returns all milestones for a specific project. +/// Get milestones for a vendor contract (paginated) #[utoipa::path( get, path = "/api/v1/vendor-contracts/{project_id}/milestones", params( - ("project_id" = String, Path, description = "Project identifier") + ("project_id" = String, Path, description = "Project identifier"), + PaginationQuery ), responses( - (status = 200, description = "Project milestones", body = ApiResponse>), - (status = 404, description = "Vendor contract not found") + (status = 200, description = "Project milestones", body = PaginatedResponse>), + (status = 404, description = "Vendor contract not found", body = crate::errors::ApiErrorBody) ), tag = "Vendor Contracts" )] pub async fn get_vendor_contract_milestones( Extension(pool): Extension, Path(project_id): Path, -) -> Result>>, StatusCode> { - // First verify the project exists + Query(params): Query, +) -> Result>>, ApiError> { + let page = params.page.max(1); + let limit = params.limit.min(100).max(1); + let offset = ((page - 1) * limit) as i64; + let limit_i64 = limit as i64; + let exists = sqlx::query_as::<_, (i32,)>( - "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1" + "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1", ) .bind(&project_id) .fetch_optional(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .await?; if exists.is_none() { - return Err(StatusCode::NOT_FOUND); + return Err(ApiError::NotFound(format!( + "vendor contract `{}` not found", + project_id + ))); } + let (total_count,): (i64,) = sqlx::query_as( + r#" + SELECT COUNT(*) + FROM treasury.milestones m + JOIN treasury.vendor_contracts vc ON vc.id = m.vendor_contract_id + WHERE vc.project_id = $1 AND NOT m.archived + "#, + ) + .bind(&project_id) + .fetch_one(&pool) + .await?; + let rows = sqlx::query_as::<_, MilestoneRow>( r#" SELECT - m.id, - m.vendor_contract_id, - m.milestone_id, - m.milestone_order, - m.label, - m.description, - m.acceptance_criteria, - m.amount_lovelace, - m.time_limit, - m.withdrawn, - m.evidence_provided, - m.paused, - m.archived, - m.complete_tx_hash, - m.complete_time, - m.complete_description, - m.evidence, - m.withdraw_tx_hash, - m.withdraw_time, - m.withdraw_amount, - m.archived_by_tx_hash, - m.archived_at, - m.superseded_by, - vc.project_id, - vc.project_name + m.id, m.vendor_contract_id, m.milestone_id, m.milestone_order, + m.label, m.description, m.acceptance_criteria, + m.amount_lovelace, m.time_limit, + m.withdrawn, m.evidence_provided, m.paused, m.archived, + m.complete_tx_hash, m.complete_time, m.complete_description, m.evidence, + m.withdraw_tx_hash, m.withdraw_time, m.withdraw_amount, + m.archived_by_tx_hash, m.archived_at, m.superseded_by, + vc.project_id, vc.project_name FROM treasury.milestones m JOIN treasury.vendor_contracts vc ON vc.id = m.vendor_contract_id WHERE vc.project_id = $1 AND NOT m.archived ORDER BY m.milestone_order - "# + LIMIT $2 OFFSET $3 + "#, ) .bind(&project_id) + .bind(limit_i64) + .bind(offset) .fetch_all(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .await?; let milestones: Vec = rows.into_iter().map(MilestoneResponse::from).collect(); - Ok(Json(ApiResponse::new(milestones))) + Ok(Json(PaginatedResponse::new(milestones, page, limit, total_count))) } /// Get events for a vendor contract -/// -/// Returns paginated event history for a specific project. #[utoipa::path( get, path = "/api/v1/vendor-contracts/{project_id}/events", @@ -284,7 +255,7 @@ pub async fn get_vendor_contract_milestones( ), responses( (status = 200, description = "Project events", body = PaginatedResponse>), - (status = 404, description = "Vendor contract not found") + (status = 404, description = "Vendor contract not found", body = crate::errors::ApiErrorBody) ), tag = "Vendor Contracts" )] @@ -292,45 +263,38 @@ pub async fn get_vendor_contract_events( Extension(pool): Extension, Path(project_id): Path, Query(params): Query, -) -> Result>>, StatusCode> { +) -> Result>>, ApiError> { let page = params.page.max(1); let limit = params.limit.min(100).max(1); let offset = ((page - 1) * limit) as i64; let limit_i64 = limit as i64; - // First verify the project exists let exists = sqlx::query_as::<_, (i32,)>( - "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1" + "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1", ) .bind(&project_id) .fetch_optional(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .await?; if exists.is_none() { - return Err(StatusCode::NOT_FOUND); + return Err(ApiError::NotFound(format!( + "vendor contract `{}` not found", + project_id + ))); } - // Build query based on event type filter let (total_count, rows) = if let Some(ref event_type) = params.event_type { let (count,): (i64,) = sqlx::query_as( r#" SELECT COUNT(*) FROM treasury.v_events_with_context WHERE project_id = $1 AND event_type = $2 - "# + "#, ) .bind(&project_id) .bind(event_type) .fetch_one(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .await?; let rows = sqlx::query_as::<_, EventWithContextRow>( r#" @@ -339,18 +303,14 @@ pub async fn get_vendor_contract_events( WHERE project_id = $1 AND event_type = $2 ORDER BY block_time DESC LIMIT $3 OFFSET $4 - "# + "#, ) .bind(&project_id) .bind(event_type) .bind(limit_i64) .bind(offset) .fetch_all(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .await?; (count, rows) } else { @@ -359,15 +319,11 @@ pub async fn get_vendor_contract_events( SELECT COUNT(*) FROM treasury.v_events_with_context WHERE project_id = $1 - "# + "#, ) .bind(&project_id) .fetch_one(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .await?; let rows = sqlx::query_as::<_, EventWithContextRow>( r#" @@ -376,17 +332,13 @@ pub async fn get_vendor_contract_events( WHERE project_id = $1 ORDER BY block_time DESC LIMIT $2 OFFSET $3 - "# + "#, ) .bind(&project_id) .bind(limit_i64) .bind(offset) .fetch_all(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .await?; (count, rows) }; @@ -395,41 +347,56 @@ pub async fn get_vendor_contract_events( Ok(Json(PaginatedResponse::new(events, page, limit, total_count))) } -/// Get UTXOs for a vendor contract -/// -/// Returns all unspent UTXOs for a specific project. +/// Get UTXOs for a vendor contract (paginated) #[utoipa::path( get, path = "/api/v1/vendor-contracts/{project_id}/utxos", params( - ("project_id" = String, Path, description = "Project identifier") + ("project_id" = String, Path, description = "Project identifier"), + PaginationQuery ), responses( - (status = 200, description = "Project UTXOs", body = ApiResponse>), - (status = 404, description = "Vendor contract not found") + (status = 200, description = "Project UTXOs", body = PaginatedResponse>), + (status = 404, description = "Vendor contract not found", body = crate::errors::ApiErrorBody) ), tag = "Vendor Contracts" )] pub async fn get_vendor_contract_utxos( Extension(pool): Extension, Path(project_id): Path, -) -> Result>>, StatusCode> { - // First verify the project exists + Query(params): Query, +) -> Result>>, ApiError> { + let page = params.page.max(1); + let limit = params.limit.min(100).max(1); + let offset = ((page - 1) * limit) as i64; + let limit_i64 = limit as i64; + let exists = sqlx::query_as::<_, (i32,)>( - "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1" + "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1", ) .bind(&project_id) .fetch_optional(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .await?; if exists.is_none() { - return Err(StatusCode::NOT_FOUND); + return Err(ApiError::NotFound(format!( + "vendor contract `{}` not found", + project_id + ))); } + let (total_count,): (i64,) = sqlx::query_as( + r#" + SELECT COUNT(*) + FROM treasury.utxo_history u + JOIN treasury.vendor_contracts vc ON vc.id = u.vendor_contract_id + WHERE vc.project_id = $1 AND NOT u.spent + "#, + ) + .bind(&project_id) + .fetch_one(&pool) + .await?; + let rows = sqlx::query_as::<_, UtxoRow>( r#" SELECT @@ -444,16 +411,15 @@ pub async fn get_vendor_contract_utxos( JOIN treasury.vendor_contracts vc ON vc.id = u.vendor_contract_id WHERE vc.project_id = $1 AND NOT u.spent ORDER BY u.slot DESC - "# + LIMIT $2 OFFSET $3 + "#, ) .bind(&project_id) + .bind(limit_i64) + .bind(offset) .fetch_all(&pool) - .await - .map_err(|e| { - tracing::error!("Database query error: {}", e); - StatusCode::INTERNAL_SERVER_ERROR - })?; + .await?; let utxos: Vec = rows.into_iter().map(UtxoResponse::from).collect(); - Ok(Json(ApiResponse::new(utxos))) + Ok(Json(PaginatedResponse::new(utxos, page, limit, total_count))) } diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 0000000..037fbd3 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,115 @@ +# API Changelog + +This file tracks user-visible changes to the `/api/v1/` surface and the +treasury data pipeline. Each release ships as a single commit on `main` (or +the equivalent merge). Pre-1.0 versions allowed breaking changes; the +project is now operating under a 1.x line and breaking changes here are +flagged as such. + +## v1.1.0 — 2026-05-01 + +API consistency pass. Several breaking response-shape changes — frontends +update once and stay on `/api/v1/`. + +### Breaking + +- **`/api/v1/status` restructured.** Old flat fields + (`last_sync_slot`, `last_sync_block`, `last_sync_time`, + `database_connected`, `total_events`, `total_vendor_contracts`) + replaced with nested groups: + - `database: { connected, checked_at }` — server-side ISO. + - `sync: { heartbeat, last_event_processed }` — heartbeat is the + server-side ISO of the last sync poll; `last_event_processed` is the + on-chain block time of the most recent TOM event the API has written + (`ChainTime`). + - `chain: { indexer_block, indexer_slot, indexer_time }` — what YACI + Store has reached. `indexer_time` is `ChainTime`. + - `totals: { events, vendor_contracts, events_by_type }`. + +### Other breaking + +- **Timestamps**: every on-chain block-time field is now an object + `{ "unix": 1777623100, "iso": "2026-05-01T08:11:40Z" }` instead of a + bare integer. Affects `EventResponse.block_time`, + `VendorContract*.fund_time` and `last_event_time`, + `MilestoneCompletion.time`, `MilestoneWithdrawal.time`, + `MilestoneArchiveInfo.archived_at`, and `TreasuryResponse.publish_time` + / `initialized_at`. Server-side timestamps (`created_at`, + `updated_at`, `last_updated`) remain ISO strings. +- **Errors**: every non-2xx response now returns a JSON body + `{ "error": { "code", "message", "details"? }, "meta": { "timestamp" } }` + instead of an empty body. `code` values: `not_found`, `bad_request`, + `internal`. +- **Pagination**: `/api/v1/treasury/utxos`, + `/api/v1/vendor-contracts/:project_id/milestones`, and + `/api/v1/vendor-contracts/:project_id/utxos` now return + `{ data, pagination, meta }` with `?page=1&limit=50` (max 100). + Previous responses returned an unbounded array under `data`. +- **`destination` on disburse events**: now JSONB preserving the full TOM + `{ label, details }` object instead of flattened to a string. + Released earlier in v1.0.x but listed here for completeness. +- **`vendor_name` and `contract_url`**: dropped from + `treasury.vendor_contracts` and from API responses. They were always + NULL; not part of the TOM spec. + +### Added + +- **`?q=`** full-text search on `/api/v1/events` matching against + `reason`, `destination::text`, and `metadata::text` (case-insensitive + substring). +- **`?from_time=` / `?to_time=`** filters on `/api/v1/milestones` matching + whichever of `complete_time` or `withdraw_time` is set on the row. +- **OpenAPI**: per-`event_type` field-applicability descriptions on + `EventResponse` (which fields apply to which event type), and + documented response/error envelope shapes. + +### Fixed + +- `/api/v1/statistics.events.by_type` now reports real categories instead + of all-`unknown` (the SQL was reading the wrong JSON path). +- `treasury.sync_status.updated_at` now bumps on idle polls so + `/api/v1/statistics` reflects a live heartbeat + ([`KI-SY-01`](known-issues.md#ki-sy-01--treasurysync_statusupdated_at-doesnt-bump-on-idle-ticks)). + +## Pipeline / data-quality changes (no API shape impact) + +These shipped alongside or just before v1.1.0. They affect *what data* +the API serves, not the response shape. + +- **Multi-key vendor datum parser** — `parse_vendor_contract_datum` now + handles the `UTXO-*` family's two-party vendor info constructor. Closes + [`KI-VND-01`](known-issues.md), unblocks [`KI-MIL-01`](known-issues.md). +- **Milestone-id ordinal normalisation** — when a complete/withdraw event + uses `MS-N` (1-indexed) but the fund used `m-N` (0-indexed) for the same + project (or vice versa), the lookup now matches by canonical + `milestone_order`. Closes [`KI-OC-01`](known-issues.md). +- **`treasury.utxo_history` + Postgres triggers** — every script-address + UTXO that YACI Store inserts is captured synchronously into a permanent + history table before pruning can run. Resolves the cold-replay + limitations [`KI-VND-04`](known-issues.md), + [`KI-EVT-01`](known-issues.md), [`KI-CR-01`](known-issues.md). Caveat: + the trigger only protects from the moment it's armed, so to recover + pre-existing pruned data you need a full YACI Store re-sync. +- **Label fallback for `UTXO-*` milestones** — when a milestone's metadata + has no `acceptanceCriteria`, the label now falls back to the first line + of `description`. +- **Documentation** — new [`docs/known-issues.md`](known-issues.md) index + with stable IDs, repro SQL, and live counts. Existing docs (`README`, + `api/README`, `database/README`, `docs/architecture.md`, + `indexer/SETUP.md`, `CLAUDE.md`) refreshed for the post-redesign reality. + +## Earlier history + +This file starts at v1.1.0. For commits prior to that, see `git log`. The +big pre-1.1 milestones were: + +- **Milestone-event silent-drop fix** — restructured `process_complete` + and `process_withdraw` so every on-chain TOM event is recorded in + `treasury.events`, even when chain-trace fails. Brought local event + parity from 55/378 to full coverage versus the deployed feed. +- **Milestone lifecycle redesign** — 4 independent boolean flags + (`evidence_provided`, `withdrawn`, `paused`, `archived`) plus archive + model via `superseded_by`. +- **Disburse `destination` JSONB** — column type changed from `TEXT` to + `JSONB` so the TOM `{ label, details }` object is preserved. (Listed + again under v1.1.0 Breaking for visibility.) From 6db158125ca809fe428a10c1260440669ae40635 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Fri, 1 May 2026 22:36:24 +0100 Subject: [PATCH 13/19] improve stats endpoint --- api/src/models/v1.rs | 80 ++++++-- api/src/openapi.rs | 51 +++-- api/src/parsers/datum.rs | 12 +- api/src/routes/v1/milestones.rs | 102 ++++++++- api/src/routes/v1/mod.rs | 30 +-- .../v1/{vendor_contracts.rs => projects.rs} | 74 +++---- api/src/routes/v1/statistics.rs | 63 ++++-- api/src/routes/v1/treasury.rs | 2 +- api/src/routes/v1/vendor_contract.rs | 62 ++++++ api/src/services/event_processor.rs | 194 ++++++++++-------- database/init/02-treasury-schema.sql | 86 ++++---- database/schema/treasury.sql | 86 ++++---- docs/changelog.md | 62 ++++++ 13 files changed, 629 insertions(+), 275 deletions(-) rename api/src/routes/v1/{vendor_contracts.rs => projects.rs} (83%) create mode 100644 api/src/routes/v1/vendor_contract.rs diff --git a/api/src/models/v1.rs b/api/src/models/v1.rs index f5d44f4..1c88d0a 100644 --- a/api/src/models/v1.rs +++ b/api/src/models/v1.rs @@ -162,11 +162,36 @@ pub struct ChainStatus { #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct TotalsBlock { pub events: i64, - pub vendor_contracts: i64, + pub projects: i64, /// Count of `treasury.events` rows by `event_type`. pub events_by_type: std::collections::HashMap, } +// ============================================================================ +// VENDOR CONTRACT (singleton — the shared PSSC) +// ============================================================================ + +/// Response for `/api/v1/vendor-contract` — the *one* shared PSSC script +/// address every project sits at, plus a quick rollup of the projects. +#[derive(Debug, Serialize, Deserialize, ToSchema)] +pub struct VendorContractResponse { + /// Shared PSSC script address (`addr1x...`). + pub address: String, + /// Stake credential portion of the address. + pub stake_credential: Option, + /// Project rollup at this vendor contract. + pub projects: VendorContractProjectsBlock, +} + +/// Project rollup nested inside `VendorContractResponse`. +#[derive(Debug, Serialize, Deserialize, ToSchema)] +pub struct VendorContractProjectsBlock { + /// Total projects. + pub total: i64, + /// Counts keyed by `status` (`active`, `paused`, `completed`, `cancelled`). + pub by_status: std::collections::HashMap, +} + // ============================================================================ // TREASURY // ============================================================================ @@ -207,13 +232,13 @@ pub struct TreasuryResponse { /// Treasury statistics #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct TreasuryStatistics { - /// Total vendor contracts - pub vendor_contract_count: i64, - /// Active vendor contracts + /// Total projects + pub project_count: i64, + /// Active projects pub active_contracts: i64, - /// Completed vendor contracts + /// Completed projects pub completed_contracts: i64, - /// Cancelled vendor contracts + /// Cancelled projects pub cancelled_contracts: i64, /// Total events pub total_events: i64, @@ -243,7 +268,7 @@ pub struct TreasurySummaryRow { pub initialized_tx_hash: Option, pub initialized_at: Option, pub permissions: Option, - pub vendor_contract_count: Option, + pub project_count: Option, pub active_contracts: Option, pub completed_contracts: Option, pub cancelled_contracts: Option, @@ -270,7 +295,7 @@ impl From for TreasuryResponse { initialized_at: ChainTime::maybe_from_secs(row.initialized_at), permissions: row.permissions, statistics: TreasuryStatistics { - vendor_contract_count: row.vendor_contract_count.unwrap_or(0), + project_count: row.project_count.unwrap_or(0), active_contracts: row.active_contracts.unwrap_or(0), completed_contracts: row.completed_contracts.unwrap_or(0), cancelled_contracts: row.cancelled_contracts.unwrap_or(0), @@ -293,7 +318,7 @@ impl From for TreasuryResponse { /// Vendor contract (project) summary #[derive(Debug, Serialize, Deserialize, ToSchema)] -pub struct VendorContractSummary { +pub struct ProjectSummary { /// Internal database ID pub id: i32, /// Logical project identifier (e.g., "EC-0008-25") @@ -328,7 +353,7 @@ pub struct VendorContractSummary { /// Vendor contract detail (full response) #[derive(Debug, Serialize, Deserialize, ToSchema)] -pub struct VendorContractDetail { +pub struct ProjectDetail { /// Internal database ID pub id: i32, /// Logical project identifier (e.g., "EC-0008-25") @@ -409,7 +434,7 @@ pub struct TreasuryReference { /// Database row for vendor contract summary #[derive(Debug, FromRow)] #[allow(dead_code)] -pub struct VendorContractSummaryRow { +pub struct ProjectSummaryRow { pub id: i32, pub treasury_id: Option, pub project_id: String, @@ -438,8 +463,8 @@ pub struct VendorContractSummaryRow { pub event_count: Option, } -impl From for VendorContractSummary { - fn from(row: VendorContractSummaryRow) -> Self { +impl From for ProjectSummary { + fn from(row: ProjectSummaryRow) -> Self { let initial_amount = row.initial_amount_lovelace.unwrap_or(0); let total_withdrawn = row.total_withdrawn_lovelace.unwrap_or(0); let current_balance = row.current_balance_lovelace.unwrap_or(0); @@ -483,8 +508,8 @@ impl From for VendorContractSummary { } } -impl From for VendorContractDetail { - fn from(row: VendorContractSummaryRow) -> Self { +impl From for ProjectDetail { + fn from(row: ProjectSummaryRow) -> Self { let initial_amount = row.initial_amount_lovelace.unwrap_or(0); let total_withdrawn = row.total_withdrawn_lovelace.unwrap_or(0); let current_balance = row.current_balance_lovelace.unwrap_or(0); @@ -622,7 +647,7 @@ pub struct ProjectReference { #[allow(dead_code)] pub struct MilestoneRow { pub id: i32, - pub vendor_contract_id: i32, + pub project_db_id: i32, pub milestone_id: String, pub milestone_order: i32, pub label: Option, @@ -881,8 +906,10 @@ impl From for UtxoResponse { /// Comprehensive statistics response #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct StatisticsResponse { - /// Treasury statistics + /// Treasury (singleton TRSC) statistics pub treasury: TreasuryStats, + /// Vendor contract (singleton shared PSSC) statistics + pub vendor_contracts: VendorContractStats, /// Project statistics pub projects: ProjectStats, /// Milestone statistics @@ -906,6 +933,23 @@ pub struct TreasuryStats { pub disbursed_count: i64, } +/// Vendor contract (singleton) statistics — the shared PSSC every project sits at. +#[derive(Debug, Serialize, Deserialize, ToSchema)] +pub struct VendorContractStats { + /// Total vendor contracts known to the API. Expected to be 1 for our deployment. + pub total_count: i64, + /// Shared PSSC script address (`addr1x...`). Null until the first fund event lands. + pub address: Option, + /// Number of distinct projects bound to this vendor contract. + pub project_count: i64, + /// Total UTXOs ever observed at this address (regardless of spent state). + pub utxo_history_count: i64, + /// Currently unspent UTXOs at this address. + pub unspent_utxo_count: i64, + /// Sum of unspent lovelace held at this address. + pub current_balance_lovelace: i64, +} + /// Project statistics #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct ProjectStats { @@ -976,7 +1020,7 @@ fn default_limit() -> u32 { 50 } /// Vendor contracts query parameters #[derive(Debug, Deserialize, ToSchema, IntoParams)] -pub struct VendorContractsQuery { +pub struct ProjectsQuery { /// Page number (1-indexed) #[serde(default = "default_page")] pub page: u32, diff --git a/api/src/openapi.rs b/api/src/openapi.rs index 06493f9..f993f01 100644 --- a/api/src/openapi.rs +++ b/api/src/openapi.rs @@ -7,23 +7,23 @@ use crate::models::v1::{ EventResponse, EventStats, EventTreasuryContext, EventsQuery, FinancialStats, MilestoneArchiveInfo, MilestoneCompletion, MilestoneWithdrawal, MilestoneResponse, MilestoneStats, MilestonesSummary, MilestonesQuery, PaginatedResponse, Pagination, - PaginationQuery, ProjectEventsQuery, ProjectReference, ProjectStats, RecentEventsQuery, - ResponseMeta, StatisticsResponse, StatusResponse, SyncStats, SyncStatusBlock, TotalsBlock, - TreasuryFinancials, TreasuryReference, TreasuryResponse, TreasuryStatistics, TreasuryStats, - UtxoResponse, VendorContractDetail, VendorContractSummary, VendorContractsQuery, - VendorFinancials, + PaginationQuery, ProjectDetail, ProjectEventsQuery, ProjectReference, ProjectStats, + ProjectSummary, ProjectsQuery, RecentEventsQuery, ResponseMeta, StatisticsResponse, + StatusResponse, SyncStats, SyncStatusBlock, TotalsBlock, TreasuryFinancials, + TreasuryReference, TreasuryResponse, TreasuryStatistics, TreasuryStats, UtxoResponse, + VendorContractProjectsBlock, VendorContractResponse, VendorContractStats, VendorFinancials, }; use crate::routes::v1::{ - events, milestones, statistics, status, treasury, vendor_contracts, + events, milestones, projects, statistics, status, treasury, vendor_contract, }; #[derive(OpenApi)] #[openapi( info( title = "Cardano Administration API", - version = "1.1.0", - description = "REST API for tracking Cardano treasury contracts and fund disbursements.\n\n## Overview\n\nThis API provides access to treasury contract data, vendor contracts (projects), milestones, and event history for the Cardano treasury system.\n\n## Key Concepts\n\n- **Treasury Contract (TRSC)**: The root treasury reserve contract that holds funds\n- **Vendor Contract (PSSC)**: Project-specific contracts that receive funding from the treasury\n- **Milestone**: Individual deliverables within a vendor contract\n- **Event**: Audit log of all treasury operations (fund, complete, disburse, etc.)\n\n## Response Format\n\nAll responses use a consistent envelope:\n\n```json\n{\n \"data\": { ... },\n \"pagination\": { ... }, // present on paginated endpoints\n \"meta\": { \"timestamp\": \"2026-05-01T10:30:00Z\" }\n}\n```\n\nErrors use a parallel envelope:\n\n```json\n{\n \"error\": { \"code\": \"not_found\", \"message\": \"…\", \"details\": {…}? },\n \"meta\": { \"timestamp\": \"2026-05-01T10:30:00Z\" }\n}\n```\n\n## Amounts\n\nAll monetary amounts are in **lovelace** (the smallest unit; 1 ADA = 1,000,000 lovelace). Clients are responsible for ADA formatting.\n\n## Timestamps\n\nOn-chain block times are returned as a paired object: `{\"unix\": 1777609469, \"iso\": \"2025-09-29T12:24:29Z\"}`. Server-side timestamps (`created_at`, `updated_at`) are ISO 8601 strings.", + version = "2.0.0", + description = "REST API for tracking Cardano treasury contracts and fund disbursements.\n\n## Overview\n\nThis API provides access to the treasury contract, the shared vendor contract, projects, milestones, and event history for the Cardano treasury system.\n\n## Key Concepts\n\n- **Treasury Contract (TRSC)**: The singleton on-chain reserve contract that holds funds.\n- **Vendor Contract (PSSC)**: The singleton on-chain script address every project sits at, distinguished only by inline datum.\n- **Project**: One row per `fund` event (e.g. `EC-0008-25`). 42 of these in our deployment.\n- **Milestone**: An individual deliverable within a project.\n- **Event**: Audit log of all treasury operations (fund, complete, disburse, etc.).\n\n## Response Format\n\nAll responses use a consistent envelope:\n\n```json\n{\n \"data\": { ... },\n \"pagination\": { ... }, // present on paginated endpoints\n \"meta\": { \"timestamp\": \"2026-05-01T10:30:00Z\" }\n}\n```\n\nErrors use a parallel envelope:\n\n```json\n{\n \"error\": { \"code\": \"not_found\", \"message\": \"…\", \"details\": {…}? },\n \"meta\": { \"timestamp\": \"2026-05-01T10:30:00Z\" }\n}\n```\n\n## Amounts\n\nAll monetary amounts are in **lovelace** (the smallest unit; 1 ADA = 1,000,000 lovelace). Clients are responsible for ADA formatting.\n\n## Timestamps\n\nOn-chain block times are returned as a paired object: `{\"unix\": 1777609469, \"iso\": \"2025-09-29T12:24:29Z\"}`. Server-side timestamps (`created_at`, `updated_at`) are ISO 8601 strings.", license( name = "Apache 2.0", url = "https://www.apache.org/licenses/LICENSE-2.0" @@ -37,8 +37,9 @@ use crate::routes::v1::{ ), tags( (name = "Status", description = "API health and status endpoints"), - (name = "Treasury", description = "Treasury contract endpoints"), - (name = "Vendor Contracts", description = "Vendor contract (project) endpoints"), + (name = "Treasury", description = "Treasury contract (singleton TRSC) endpoints"), + (name = "Vendor Contract", description = "Shared vendor contract (singleton PSSC) endpoint"), + (name = "Projects", description = "Project endpoints (one per fund event)"), (name = "Milestones", description = "Milestone endpoints"), (name = "Events", description = "Event log endpoints"), (name = "Statistics", description = "Aggregated statistics endpoints") @@ -48,12 +49,14 @@ use crate::routes::v1::{ treasury::get_treasury, treasury::get_treasury_utxos, treasury::get_treasury_events, - vendor_contracts::list_vendor_contracts, - vendor_contracts::get_vendor_contract, - vendor_contracts::get_vendor_contract_milestones, - vendor_contracts::get_vendor_contract_events, - vendor_contracts::get_vendor_contract_utxos, + vendor_contract::get_vendor_contract, + projects::list_projects, + projects::get_project, + projects::get_project_milestones, + projects::get_project_events, + projects::get_project_utxos, milestones::list_milestones, + milestones::list_milestones_by_project, milestones::get_milestone, events::list_events, events::get_recent_events, @@ -64,7 +67,8 @@ use crate::routes::v1::{ schemas( // Response envelopes ApiResponse, - ApiResponse, + ApiResponse, + ApiResponse, ApiResponse>, ApiResponse>, ApiResponse>, @@ -72,18 +76,22 @@ use crate::routes::v1::{ ApiResponse, ApiResponse, ApiResponse, - PaginatedResponse>, + PaginatedResponse>, PaginatedResponse>, PaginatedResponse>, + PaginatedResponse>, Pagination, ResponseMeta, // Treasury TreasuryResponse, TreasuryStatistics, TreasuryFinancials, - // Vendor Contracts - VendorContractSummary, - VendorContractDetail, + // Vendor Contract (singleton) + VendorContractResponse, + VendorContractProjectsBlock, + // Projects + ProjectSummary, + ProjectDetail, VendorFinancials, MilestonesSummary, TreasuryReference, @@ -103,6 +111,7 @@ use crate::routes::v1::{ // Statistics StatisticsResponse, TreasuryStats, + VendorContractStats, ProjectStats, MilestoneStats, EventStats, @@ -120,7 +129,7 @@ use crate::routes::v1::{ // Time crate::models::time::ChainTime, // Query params - VendorContractsQuery, + ProjectsQuery, EventsQuery, RecentEventsQuery, MilestonesQuery, diff --git a/api/src/parsers/datum.rs b/api/src/parsers/datum.rs index 6a22b80..24ac1aa 100644 --- a/api/src/parsers/datum.rs +++ b/api/src/parsers/datum.rs @@ -20,7 +20,7 @@ use pallas_primitives::alonzo::{BigInt, PlutusData}; /// Parsed vendor contract datum #[derive(Debug, Clone)] -pub struct ParsedVendorDatum { +pub struct ParsedProjectDatum { /// Vendor payment key hash (hex) pub vendor_payment_key_hash: String, /// Per-milestone data from datum @@ -53,7 +53,7 @@ pub struct ParsedMilestoneDatum { /// storage in the single `vendor_payment_key_hash` column. /// /// The milestones array structure is identical between the two formats. -pub fn parse_vendor_contract_datum(cbor_hex: &str) -> anyhow::Result { +pub fn parse_project_datum(cbor_hex: &str) -> anyhow::Result { let bytes = hex::decode(cbor_hex).context("invalid hex in datum")?; let datum: PlutusData = pallas_codec::minicbor::decode(&bytes).context("failed to decode CBOR datum")?; @@ -86,7 +86,7 @@ pub fn parse_vendor_contract_datum(cbor_hex: &str) -> anyhow::Result>), + (status = 404, description = "Project not found", body = crate::errors::ApiErrorBody) + ), + tag = "Milestones" +)] +pub async fn list_milestones_by_project( + Extension(pool): Extension, + Path(project_id): Path, + Query(params): Query, +) -> Result>>, ApiError> { + let page = params.page.max(1); + let limit = params.limit.min(100).max(1); + let offset = ((page - 1) * limit) as i64; + let limit_i64 = limit as i64; + + let exists = sqlx::query_as::<_, (i32,)>( + "SELECT id FROM treasury.projects WHERE project_id = $1", + ) + .bind(&project_id) + .fetch_optional(&pool) + .await?; + if exists.is_none() { + return Err(ApiError::NotFound(format!( + "project `{}` not found", + project_id + ))); + } + + let (total_count,): (i64,) = sqlx::query_as( + r#" + SELECT COUNT(*) + FROM treasury.milestones m + JOIN treasury.projects p ON p.id = m.project_db_id + WHERE p.project_id = $1 AND NOT m.archived + "#, + ) + .bind(&project_id) + .fetch_one(&pool) + .await?; + + let rows = sqlx::query_as::<_, MilestoneRow>( + r#" + SELECT + m.id, m.project_db_id, m.milestone_id, m.milestone_order, + m.label, m.description, m.acceptance_criteria, + m.amount_lovelace, m.time_limit, + m.withdrawn, m.evidence_provided, m.paused, m.archived, + m.complete_tx_hash, m.complete_time, m.complete_description, m.evidence, + m.withdraw_tx_hash, m.withdraw_time, m.withdraw_amount, + m.archived_by_tx_hash, m.archived_at, m.superseded_by, + p.project_id, p.project_name + FROM treasury.milestones m + JOIN treasury.projects p ON p.id = m.project_db_id + WHERE p.project_id = $1 AND NOT m.archived + ORDER BY m.milestone_order + LIMIT $2 OFFSET $3 + "#, + ) + .bind(&project_id) + .bind(limit_i64) + .bind(offset) + .fetch_all(&pool) + .await?; + + let milestones: Vec = + rows.into_iter().map(MilestoneResponse::from).collect(); + Ok(Json(PaginatedResponse::new(milestones, page, limit, total_count))) +} diff --git a/api/src/routes/v1/mod.rs b/api/src/routes/v1/mod.rs index 222f3d0..da4a7fc 100644 --- a/api/src/routes/v1/mod.rs +++ b/api/src/routes/v1/mod.rs @@ -9,7 +9,8 @@ //! - Raw and parsed metadata. pub mod treasury; -pub mod vendor_contracts; +pub mod vendor_contract; +pub mod projects; pub mod milestones; pub mod events; pub mod statistics; @@ -21,19 +22,22 @@ pub fn router() -> Router { Router::new() // Status endpoint .route("/status", get(status::get_status)) - // Treasury endpoints + // Treasury endpoint (the singleton TRSC) .route("/treasury", get(treasury::get_treasury)) .route("/treasury/utxos", get(treasury::get_treasury_utxos)) .route("/treasury/events", get(treasury::get_treasury_events)) - // Vendor contracts endpoints - .route("/vendor-contracts", get(vendor_contracts::list_vendor_contracts)) - .route("/vendor-contracts/:project_id", get(vendor_contracts::get_vendor_contract)) - .route("/vendor-contracts/:project_id/milestones", get(vendor_contracts::get_vendor_contract_milestones)) - .route("/vendor-contracts/:project_id/events", get(vendor_contracts::get_vendor_contract_events)) - .route("/vendor-contracts/:project_id/utxos", get(vendor_contracts::get_vendor_contract_utxos)) + // Vendor contract endpoint (the singleton shared PSSC) + .route("/vendor-contract", get(vendor_contract::get_vendor_contract)) + // Project endpoints (one per fund event; 42 of these for our deployment) + .route("/projects", get(projects::list_projects)) + .route("/projects/:project_id", get(projects::get_project)) + .route("/projects/:project_id/milestones", get(projects::get_project_milestones)) + .route("/projects/:project_id/events", get(projects::get_project_events)) + .route("/projects/:project_id/utxos", get(projects::get_project_utxos)) // Milestones endpoints .route("/milestones", get(milestones::list_milestones)) - .route("/milestones/:id", get(milestones::get_milestone)) + .route("/milestones/by-id/:id", get(milestones::get_milestone)) + .route("/milestones/:project_id", get(milestones::list_milestones_by_project)) // Events endpoints .route("/events", get(events::list_events)) .route("/events/recent", get(events::get_recent_events)) @@ -101,8 +105,8 @@ pub mod status { .fetch_one(&pool) .await?; - let (total_vendor_contracts,): (i64,) = - sqlx::query_as("SELECT COUNT(*) FROM treasury.vendor_contracts") + let (total_projects,): (i64,) = + sqlx::query_as("SELECT COUNT(*) FROM treasury.projects") .fetch_one(&pool) .await?; @@ -114,7 +118,7 @@ pub mod status { let events_by_type: HashMap = by_type_rows.into_iter().collect(); Ok(Json(ApiResponse::new(StatusResponse { - api_version: "1.1.0".to_string(), + api_version: "2.0.0".to_string(), database: DatabaseStatus { connected: true, checked_at: chrono::Utc::now(), @@ -130,7 +134,7 @@ pub mod status { }, totals: TotalsBlock { events: total_events, - vendor_contracts: total_vendor_contracts, + projects: total_projects, events_by_type, }, }))) diff --git a/api/src/routes/v1/vendor_contracts.rs b/api/src/routes/v1/projects.rs similarity index 83% rename from api/src/routes/v1/vendor_contracts.rs rename to api/src/routes/v1/projects.rs index c67c488..0fd4df9 100644 --- a/api/src/routes/v1/vendor_contracts.rs +++ b/api/src/routes/v1/projects.rs @@ -10,7 +10,7 @@ use crate::errors::ApiError; use crate::models::v1::{ ApiResponse, EventResponse, EventWithContextRow, MilestoneResponse, MilestoneRow, PaginatedResponse, PaginationQuery, ProjectEventsQuery, UtxoResponse, UtxoRow, - VendorContractDetail, VendorContractSummary, VendorContractSummaryRow, VendorContractsQuery, + ProjectDetail, ProjectSummary, ProjectSummaryRow, ProjectsQuery, }; /// List all vendor contracts @@ -18,17 +18,17 @@ use crate::models::v1::{ /// Returns a paginated list of vendor contracts with filtering and search support. #[utoipa::path( get, - path = "/api/v1/vendor-contracts", - params(VendorContractsQuery), + path = "/api/v1/projects", + params(ProjectsQuery), responses( - (status = 200, description = "List of vendor contracts", body = PaginatedResponse>) + (status = 200, description = "List of vendor contracts", body = PaginatedResponse>) ), - tag = "Vendor Contracts" + tag = "Projects" )] -pub async fn list_vendor_contracts( +pub async fn list_projects( Extension(pool): Extension, - Query(params): Query, -) -> Result>>, ApiError> { + Query(params): Query, +) -> Result>>, ApiError> { let page = params.page.max(1); let limit = params.limit.min(100).max(1); let offset = ((page - 1) * limit) as i64; @@ -78,7 +78,7 @@ pub async fn list_vendor_contracts( }; let count_query = format!( - "SELECT COUNT(*) FROM treasury.v_vendor_contracts_summary {}", + "SELECT COUNT(*) FROM treasury.v_projects_summary {}", where_clause ); @@ -102,7 +102,7 @@ pub async fn list_vendor_contracts( let data_query = format!( r#" SELECT * - FROM treasury.v_vendor_contracts_summary + FROM treasury.v_projects_summary {} ORDER BY {} {} NULLS LAST LIMIT ${} OFFSET ${} @@ -114,7 +114,7 @@ pub async fn list_vendor_contracts( bind_index + 1 ); - let mut data_q = sqlx::query_as::<_, VendorContractSummaryRow>(&data_query); + let mut data_q = sqlx::query_as::<_, ProjectSummaryRow>(&data_query); if let Some(ref status) = params.status { data_q = data_q.bind(status); @@ -131,31 +131,31 @@ pub async fn list_vendor_contracts( let rows = data_q.bind(limit_i64).bind(offset).fetch_all(&pool).await?; - let contracts: Vec = rows.into_iter().map(VendorContractSummary::from).collect(); + let contracts: Vec = rows.into_iter().map(ProjectSummary::from).collect(); Ok(Json(PaginatedResponse::new(contracts, page, limit, total_count))) } /// Get a specific vendor contract by project ID #[utoipa::path( get, - path = "/api/v1/vendor-contracts/{project_id}", + path = "/api/v1/projects/{project_id}", params( ("project_id" = String, Path, description = "Project identifier (e.g., EC-0008-25)") ), responses( - (status = 200, description = "Vendor contract details", body = ApiResponse), + (status = 200, description = "Vendor contract details", body = ApiResponse), (status = 404, description = "Vendor contract not found", body = crate::errors::ApiErrorBody) ), - tag = "Vendor Contracts" + tag = "Projects" )] -pub async fn get_vendor_contract( +pub async fn get_project( Extension(pool): Extension, Path(project_id): Path, -) -> Result>, ApiError> { - let row = sqlx::query_as::<_, VendorContractSummaryRow>( +) -> Result>, ApiError> { + let row = sqlx::query_as::<_, ProjectSummaryRow>( r#" SELECT * - FROM treasury.v_vendor_contracts_summary + FROM treasury.v_projects_summary WHERE project_id = $1 "#, ) @@ -164,13 +164,13 @@ pub async fn get_vendor_contract( .await? .ok_or_else(|| ApiError::NotFound(format!("vendor contract `{}` not found", project_id)))?; - Ok(Json(ApiResponse::new(VendorContractDetail::from(row)))) + Ok(Json(ApiResponse::new(ProjectDetail::from(row)))) } /// Get milestones for a vendor contract (paginated) #[utoipa::path( get, - path = "/api/v1/vendor-contracts/{project_id}/milestones", + path = "/api/v1/projects/{project_id}/milestones", params( ("project_id" = String, Path, description = "Project identifier"), PaginationQuery @@ -179,9 +179,9 @@ pub async fn get_vendor_contract( (status = 200, description = "Project milestones", body = PaginatedResponse>), (status = 404, description = "Vendor contract not found", body = crate::errors::ApiErrorBody) ), - tag = "Vendor Contracts" + tag = "Projects" )] -pub async fn get_vendor_contract_milestones( +pub async fn get_project_milestones( Extension(pool): Extension, Path(project_id): Path, Query(params): Query, @@ -192,7 +192,7 @@ pub async fn get_vendor_contract_milestones( let limit_i64 = limit as i64; let exists = sqlx::query_as::<_, (i32,)>( - "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1", + "SELECT id FROM treasury.projects WHERE project_id = $1", ) .bind(&project_id) .fetch_optional(&pool) @@ -209,7 +209,7 @@ pub async fn get_vendor_contract_milestones( r#" SELECT COUNT(*) FROM treasury.milestones m - JOIN treasury.vendor_contracts vc ON vc.id = m.vendor_contract_id + JOIN treasury.projects vc ON vc.id = m.project_db_id WHERE vc.project_id = $1 AND NOT m.archived "#, ) @@ -220,7 +220,7 @@ pub async fn get_vendor_contract_milestones( let rows = sqlx::query_as::<_, MilestoneRow>( r#" SELECT - m.id, m.vendor_contract_id, m.milestone_id, m.milestone_order, + m.id, m.project_db_id, m.milestone_id, m.milestone_order, m.label, m.description, m.acceptance_criteria, m.amount_lovelace, m.time_limit, m.withdrawn, m.evidence_provided, m.paused, m.archived, @@ -229,7 +229,7 @@ pub async fn get_vendor_contract_milestones( m.archived_by_tx_hash, m.archived_at, m.superseded_by, vc.project_id, vc.project_name FROM treasury.milestones m - JOIN treasury.vendor_contracts vc ON vc.id = m.vendor_contract_id + JOIN treasury.projects vc ON vc.id = m.project_db_id WHERE vc.project_id = $1 AND NOT m.archived ORDER BY m.milestone_order LIMIT $2 OFFSET $3 @@ -248,7 +248,7 @@ pub async fn get_vendor_contract_milestones( /// Get events for a vendor contract #[utoipa::path( get, - path = "/api/v1/vendor-contracts/{project_id}/events", + path = "/api/v1/projects/{project_id}/events", params( ("project_id" = String, Path, description = "Project identifier"), ProjectEventsQuery @@ -257,9 +257,9 @@ pub async fn get_vendor_contract_milestones( (status = 200, description = "Project events", body = PaginatedResponse>), (status = 404, description = "Vendor contract not found", body = crate::errors::ApiErrorBody) ), - tag = "Vendor Contracts" + tag = "Projects" )] -pub async fn get_vendor_contract_events( +pub async fn get_project_events( Extension(pool): Extension, Path(project_id): Path, Query(params): Query, @@ -270,7 +270,7 @@ pub async fn get_vendor_contract_events( let limit_i64 = limit as i64; let exists = sqlx::query_as::<_, (i32,)>( - "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1", + "SELECT id FROM treasury.projects WHERE project_id = $1", ) .bind(&project_id) .fetch_optional(&pool) @@ -350,7 +350,7 @@ pub async fn get_vendor_contract_events( /// Get UTXOs for a vendor contract (paginated) #[utoipa::path( get, - path = "/api/v1/vendor-contracts/{project_id}/utxos", + path = "/api/v1/projects/{project_id}/utxos", params( ("project_id" = String, Path, description = "Project identifier"), PaginationQuery @@ -359,9 +359,9 @@ pub async fn get_vendor_contract_events( (status = 200, description = "Project UTXOs", body = PaginatedResponse>), (status = 404, description = "Vendor contract not found", body = crate::errors::ApiErrorBody) ), - tag = "Vendor Contracts" + tag = "Projects" )] -pub async fn get_vendor_contract_utxos( +pub async fn get_project_utxos( Extension(pool): Extension, Path(project_id): Path, Query(params): Query, @@ -372,7 +372,7 @@ pub async fn get_vendor_contract_utxos( let limit_i64 = limit as i64; let exists = sqlx::query_as::<_, (i32,)>( - "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1", + "SELECT id FROM treasury.projects WHERE project_id = $1", ) .bind(&project_id) .fetch_optional(&pool) @@ -389,7 +389,7 @@ pub async fn get_vendor_contract_utxos( r#" SELECT COUNT(*) FROM treasury.utxo_history u - JOIN treasury.vendor_contracts vc ON vc.id = u.vendor_contract_id + JOIN treasury.projects vc ON vc.id = u.project_db_id WHERE vc.project_id = $1 AND NOT u.spent "#, ) @@ -408,7 +408,7 @@ pub async fn get_vendor_contract_utxos( u.slot, u.block_number FROM treasury.utxo_history u - JOIN treasury.vendor_contracts vc ON vc.id = u.vendor_contract_id + JOIN treasury.projects vc ON vc.id = u.project_db_id WHERE vc.project_id = $1 AND NOT u.spent ORDER BY u.slot DESC LIMIT $2 OFFSET $3 diff --git a/api/src/routes/v1/statistics.rs b/api/src/routes/v1/statistics.rs index 2939737..9139542 100644 --- a/api/src/routes/v1/statistics.rs +++ b/api/src/routes/v1/statistics.rs @@ -7,7 +7,7 @@ use std::collections::HashMap; use crate::errors::ApiError; use crate::models::v1::{ ApiResponse, EventStats, FinancialStats, MilestoneStats, ProjectStats, - StatisticsResponse, SyncStats, TreasuryStats, + StatisticsResponse, SyncStats, TreasuryStats, VendorContractStats, }; /// Get comprehensive statistics @@ -24,26 +24,17 @@ use crate::models::v1::{ pub async fn get_statistics( Extension(pool): Extension, ) -> Result>, ApiError> { - // Treasury stats let treasury_stats = get_treasury_stats(&pool).await?; - - // Project stats + let vendor_contract_stats = get_vendor_contract_stats(&pool).await?; let project_stats = get_project_stats(&pool).await?; - - // Milestone stats let milestone_stats = get_milestone_stats(&pool).await?; - - // Event stats let event_stats = get_event_stats(&pool).await?; - - // Financial stats let financial_stats = get_financial_stats(&pool).await?; - - // Sync stats let sync_stats = get_sync_stats(&pool).await?; Ok(Json(ApiResponse::new(StatisticsResponse { treasury: treasury_stats, + vendor_contracts: vendor_contract_stats, projects: project_stats, milestones: milestone_stats, events: event_stats, @@ -52,6 +43,50 @@ pub async fn get_statistics( }))) } +async fn get_vendor_contract_stats(pool: &PgPool) -> Result { + let (total_count,): (i64,) = + sqlx::query_as("SELECT COUNT(*) FROM treasury.vendor_contracts") + .fetch_one(pool) + .await?; + + let address: Option = + sqlx::query_scalar("SELECT address FROM treasury.vendor_contracts ORDER BY id LIMIT 1") + .fetch_optional(pool) + .await?; + + let (project_count,): (i64,) = sqlx::query_as("SELECT COUNT(*) FROM treasury.projects") + .fetch_one(pool) + .await?; + + let (utxo_history_count, unspent_utxo_count, current_balance_lovelace): (i64, i64, Option) = + if let Some(ref addr) = address { + sqlx::query_as( + r#" + SELECT + COUNT(*)::BIGINT, + COUNT(*) FILTER (WHERE NOT spent)::BIGINT, + COALESCE(SUM(lovelace_amount) FILTER (WHERE NOT spent), 0)::BIGINT + FROM treasury.utxo_history + WHERE address = $1 + "#, + ) + .bind(addr) + .fetch_one(pool) + .await? + } else { + (0, 0, Some(0)) + }; + + Ok(VendorContractStats { + total_count, + address, + project_count, + utxo_history_count, + unspent_utxo_count, + current_balance_lovelace: current_balance_lovelace.unwrap_or(0), + }) +} + async fn get_treasury_stats(pool: &PgPool) -> Result { let row = sqlx::query_as::<_, (i64, i64)>( r#" @@ -89,7 +124,7 @@ async fn get_project_stats(pool: &PgPool) -> Result { COUNT(*) FILTER (WHERE status = 'completed'), COUNT(*) FILTER (WHERE status = 'paused'), COUNT(*) FILTER (WHERE status = 'cancelled') - FROM treasury.vendor_contracts + FROM treasury.projects "# ) .fetch_one(pool) @@ -165,7 +200,7 @@ async fn get_event_stats(pool: &PgPool) -> Result { async fn get_financial_stats(pool: &PgPool) -> Result { // Get total allocated (sum of initial amounts) let (total_allocated,): (Option,) = sqlx::query_as( - "SELECT COALESCE(SUM(initial_amount_lovelace), 0)::BIGINT FROM treasury.vendor_contracts" + "SELECT COALESCE(SUM(initial_amount_lovelace), 0)::BIGINT FROM treasury.projects" ) .fetch_one(pool) .await diff --git a/api/src/routes/v1/treasury.rs b/api/src/routes/v1/treasury.rs index 5fd5915..69988e8 100644 --- a/api/src/routes/v1/treasury.rs +++ b/api/src/routes/v1/treasury.rs @@ -139,7 +139,7 @@ pub async fn get_treasury_events( SELECT COUNT(*) FROM treasury.events e JOIN treasury.treasury_contracts tc ON tc.id = e.treasury_id - WHERE e.event_type = ANY($1) AND e.vendor_contract_id IS NULL + WHERE e.event_type = ANY($1) AND e.project_db_id IS NULL "#, ) .bind(&treasury_event_types) diff --git a/api/src/routes/v1/vendor_contract.rs b/api/src/routes/v1/vendor_contract.rs new file mode 100644 index 0000000..d2cfed5 --- /dev/null +++ b/api/src/routes/v1/vendor_contract.rs @@ -0,0 +1,62 @@ +//! Vendor Contract endpoint (singleton — the shared PSSC) + +use axum::{extract::Extension, response::Json}; +use sqlx::PgPool; +use std::collections::HashMap; + +use crate::errors::ApiError; +use crate::models::v1::{ + ApiResponse, VendorContractProjectsBlock, VendorContractResponse, +}; + +/// Get the shared vendor contract (PSSC) details +/// +/// Returns the singleton vendor contract — the on-chain script address +/// where every project's funds sit, distinguished only by inline datum — +/// plus a quick rollup of the projects bound to it. +#[utoipa::path( + get, + path = "/api/v1/vendor-contract", + responses( + (status = 200, description = "Vendor contract details", body = ApiResponse), + (status = 404, description = "Vendor contract not yet known", body = crate::errors::ApiErrorBody) + ), + tag = "Vendor Contract" +)] +pub async fn get_vendor_contract( + Extension(pool): Extension, +) -> Result>, ApiError> { + let row: Option<(String, Option)> = sqlx::query_as( + "SELECT address, stake_credential FROM treasury.vendor_contracts ORDER BY id LIMIT 1", + ) + .fetch_optional(&pool) + .await?; + + let (address, stake_credential) = row.ok_or_else(|| { + ApiError::NotFound( + "vendor contract not yet known — first fund event has not been processed" + .into(), + ) + })?; + + let (total,): (i64,) = sqlx::query_as("SELECT COUNT(*) FROM treasury.projects") + .fetch_one(&pool) + .await?; + + let by_status_rows: Vec<(Option, i64)> = sqlx::query_as( + "SELECT status, COUNT(*) FROM treasury.projects GROUP BY status", + ) + .fetch_all(&pool) + .await?; + + let by_status: HashMap = by_status_rows + .into_iter() + .map(|(status, count)| (status.unwrap_or_else(|| "unknown".into()), count)) + .collect(); + + Ok(Json(ApiResponse::new(VendorContractResponse { + address, + stake_credential, + projects: VendorContractProjectsBlock { total, by_status }, + }))) +} diff --git a/api/src/services/event_processor.rs b/api/src/services/event_processor.rs index 8a1d76e..d12c976 100644 --- a/api/src/services/event_processor.rs +++ b/api/src/services/event_processor.rs @@ -287,18 +287,46 @@ impl EventProcessor { } } - // Insert vendor contract - let vendor_contract_id: i32 = sqlx::query_scalar( + // Upsert the singleton vendor contract row (one per shared PSSC address) + // so /api/v1/vendor-contract has something to return. Reject any address + // that matches the treasury contract — `get_script_utxo_for_tx` may return + // the treasury change output if the vendor output happens to be later in + // the tx. Filtering here prevents the treasury address from leaking into + // the vendor_contracts singleton. + if let Some(ref vc_addr) = contract_address { + let stake_cred = crate::parsers::address::extract_stake_credential(vc_addr); + sqlx::query( + r#" + INSERT INTO treasury.vendor_contracts (treasury_id, address, stake_credential) + SELECT $1, $2, $3 + WHERE NOT EXISTS ( + SELECT 1 FROM treasury.treasury_contracts + WHERE contract_address = $2 + ) + ON CONFLICT (address) DO UPDATE + SET treasury_id = COALESCE(EXCLUDED.treasury_id, treasury.vendor_contracts.treasury_id), + stake_credential = COALESCE(EXCLUDED.stake_credential, treasury.vendor_contracts.stake_credential) + "#, + ) + .bind(treasury_id) + .bind(vc_addr) + .bind(&stake_cred) + .execute(&self.pool) + .await?; + } + + // Insert project + let project_db_id: i32 = sqlx::query_scalar( r#" - INSERT INTO treasury.vendor_contracts ( + INSERT INTO treasury.projects ( treasury_id, project_id, other_identifiers, project_name, description, vendor_address, contract_address, fund_tx_hash, fund_slot, fund_block_time, initial_amount_lovelace, status ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, 'active') ON CONFLICT (project_id) DO UPDATE - SET project_name = COALESCE(EXCLUDED.project_name, treasury.vendor_contracts.project_name), - description = COALESCE(EXCLUDED.description, treasury.vendor_contracts.description) + SET project_name = COALESCE(EXCLUDED.project_name, treasury.projects.project_name), + description = COALESCE(EXCLUDED.description, treasury.projects.description) RETURNING id "# ) @@ -349,14 +377,14 @@ impl EventProcessor { sqlx::query( r#" INSERT INTO treasury.milestones ( - vendor_contract_id, milestone_id, milestone_order, label, + project_db_id, milestone_id, milestone_order, label, description, acceptance_criteria, amount_lovelace ) VALUES ($1, $2, $3, $4, $5, $6, $7) - ON CONFLICT (vendor_contract_id, milestone_id) WHERE NOT archived DO NOTHING + ON CONFLICT (project_db_id, milestone_id) WHERE NOT archived DO NOTHING "# ) - .bind(vendor_contract_id) + .bind(project_db_id) .bind(milestone_id) .bind((idx + 1) as i32) .bind(&label) @@ -367,7 +395,7 @@ impl EventProcessor { .await?; } - self.insert_event_full(event, "fund", treasury_id, Some(vendor_contract_id), None, initial_amount, &None, &None, body).await?; + self.insert_event_full(event, "fund", treasury_id, Some(project_db_id), None, initial_amount, &None, &None, body).await?; // Record the output UTXOs from this fund transaction for future lookups // Get all outputs from the transaction table @@ -389,7 +417,7 @@ impl EventProcessor { // For known addresses, only track script (addr1x) outputs and skip change. // For pruned outputs (address unknown), assume the fund event's contract_address - // — the chain trace only matches by (tx_hash, output_index, vendor_contract_id), + // — the chain trace only matches by (tx_hash, output_index, project_db_id), // so over-seeding a non-script output is harmless and lets cold replay link // milestone events whose input UTXOs have already been pruned. let address = match looked_up_address { @@ -400,13 +428,13 @@ impl EventProcessor { let address_type = Some("vendor_contract"); - // Record this UTXO with the vendor_contract_id for future event lookups + // Record this UTXO with the project_db_id for future event lookups sqlx::query( r#" - INSERT INTO treasury.utxo_history (tx_hash, output_index, vendor_contract_id, slot, block_number, address, address_type, lovelace_amount, spent) + INSERT INTO treasury.utxo_history (tx_hash, output_index, project_db_id, slot, block_number, address, address_type, lovelace_amount, spent) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, false) ON CONFLICT (tx_hash, output_index) DO UPDATE - SET vendor_contract_id = COALESCE(EXCLUDED.vendor_contract_id, treasury.utxo_history.vendor_contract_id), + SET project_db_id = COALESCE(EXCLUDED.project_db_id, treasury.utxo_history.project_db_id), address = COALESCE(EXCLUDED.address, treasury.utxo_history.address), address_type = COALESCE(EXCLUDED.address_type, treasury.utxo_history.address_type), lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxo_history.lovelace_amount), @@ -415,7 +443,7 @@ impl EventProcessor { ) .bind(tx_hash) .bind(output_index as i16) - .bind(vendor_contract_id) + .bind(project_db_id) .bind(event.slot) .bind(event.block_number) .bind(&address) @@ -430,14 +458,14 @@ impl EventProcessor { // Parse inline datum for milestone amounts, time_limits, and vendor_payment_key_hash // Uses the datum already fetched by get_script_utxo_for_tx (with pruning fallback) if let Some(datum_hex) = fund_inline_datum { - match crate::parsers::datum::parse_vendor_contract_datum(&datum_hex) { + match crate::parsers::datum::parse_project_datum(&datum_hex) { Ok(parsed) => { // Store vendor_payment_key_hash sqlx::query( - "UPDATE treasury.vendor_contracts SET vendor_payment_key_hash = $1 WHERE id = $2" + "UPDATE treasury.projects SET vendor_payment_key_hash = $1 WHERE id = $2" ) .bind(&parsed.vendor_payment_key_hash) - .bind(vendor_contract_id) + .bind(project_db_id) .execute(&self.pool) .await?; @@ -445,9 +473,9 @@ impl EventProcessor { // Skip withdrawn milestones — they are consumed on-chain, so the // datum only contains entries for non-withdrawn milestones. let milestone_rows: Vec<(i32,)> = sqlx::query_as( - "SELECT id FROM treasury.milestones WHERE vendor_contract_id = $1 AND NOT archived AND NOT withdrawn ORDER BY milestone_order" + "SELECT id FROM treasury.milestones WHERE project_db_id = $1 AND NOT archived AND NOT withdrawn ORDER BY milestone_order" ) - .bind(vendor_contract_id) + .bind(project_db_id) .fetch_all(&self.pool) .await?; @@ -471,11 +499,11 @@ impl EventProcessor { // Store raw CBOR on the UTXO tracking row sqlx::query( - "UPDATE treasury.utxo_history SET inline_datum_cbor = $1 WHERE tx_hash = $2 AND vendor_contract_id = $3" + "UPDATE treasury.utxo_history SET inline_datum_cbor = $1 WHERE tx_hash = $2 AND project_db_id = $3" ) .bind(&datum_hex) .bind(&event.tx_hash) - .bind(vendor_contract_id) + .bind(project_db_id) .execute(&self.pool) .await?; } @@ -500,24 +528,24 @@ impl EventProcessor { // vendor contracts (e.g. the tx pulls fee inputs from a sibling project). let milestone_hints = collect_milestone_id_hints(event_body); - let vendor_contract_id: Option = if let Some(pid) = project_id_from_meta { + let project_db_id: Option = if let Some(pid) = project_id_from_meta { sqlx::query_scalar( - "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1" + "SELECT id FROM treasury.projects WHERE project_id = $1" ) .bind(pid) .fetch_optional(&self.pool) .await? } else { - self.find_vendor_contract_from_inputs(&event.tx_hash, &milestone_hints).await? + self.find_project_from_inputs(&event.tx_hash, &milestone_hints).await? }; - if vendor_contract_id.is_none() { + if project_db_id.is_none() { tracing::warn!("Could not find vendor contract for complete event {}", event.tx_hash); } let mut matched_milestone_id: Option = None; - if let Some(vc_id) = vendor_contract_id { + if let Some(vc_id) = project_db_id { if let Some(obj) = event_body.get("milestones").and_then(|m| m.as_object()) { for (milestone_id, milestone_data) in obj { let description = extract_text_from_value(Some(milestone_data.get("description").unwrap_or(&Value::Null))); @@ -532,7 +560,7 @@ impl EventProcessor { complete_time = $2, complete_description = $3, evidence = $4 - WHERE vendor_contract_id = $5 + WHERE project_db_id = $5 AND NOT archived AND (milestone_id = $6 OR milestone_order = $7) RETURNING id @@ -562,7 +590,7 @@ impl EventProcessor { SET evidence_provided = TRUE, complete_tx_hash = $1, complete_time = $2 - WHERE vendor_contract_id = $3 + WHERE project_db_id = $3 AND NOT archived AND (milestone_id = $4 OR milestone_order = $5) RETURNING id @@ -582,7 +610,7 @@ impl EventProcessor { } } - self.insert_event_full(event, "complete", None, vendor_contract_id, matched_milestone_id, None, &None, &None, body).await?; + self.insert_event_full(event, "complete", None, project_db_id, matched_milestone_id, None, &None, &None, body).await?; Ok(()) } @@ -594,7 +622,7 @@ impl EventProcessor { // full object in JSONB so neither sub-field is lost (KI-API-01). let destination = event_body.get("destination").cloned(); - // Disburse is a treasury-level operation — look up treasury_id, not vendor_contract_id + // Disburse is a treasury-level operation — look up treasury_id, not project_db_id let treasury_id: Option = if !instance.is_empty() { sqlx::query_scalar( "SELECT id FROM treasury.treasury_contracts WHERE contract_instance = $1" @@ -621,18 +649,18 @@ impl EventProcessor { let milestone_hints = collect_milestone_id_hints(event_body); - let vendor_contract_id: Option = if let Some(pid) = project_id_from_meta { + let project_db_id: Option = if let Some(pid) = project_id_from_meta { sqlx::query_scalar( - "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1" + "SELECT id FROM treasury.projects WHERE project_id = $1" ) .bind(pid) .fetch_optional(&self.pool) .await? } else { - self.find_vendor_contract_from_inputs(&event.tx_hash, &milestone_hints).await? + self.find_project_from_inputs(&event.tx_hash, &milestone_hints).await? }; - if vendor_contract_id.is_none() { + if project_db_id.is_none() { tracing::warn!("Could not find vendor contract for withdraw event {}", event.tx_hash); } @@ -662,7 +690,7 @@ impl EventProcessor { let mut matched_milestone_id: Option = None; - if let Some(vc_id) = vendor_contract_id { + if let Some(vc_id) = project_db_id { if let Some(obj) = event_body.get("milestones").and_then(|m| m.as_object()) { for (milestone_id, _milestone_data) in obj { let order_hint = canonical_milestone_order(milestone_id); @@ -673,7 +701,7 @@ impl EventProcessor { withdraw_tx_hash = $1, withdraw_time = $2, withdraw_amount = $3 - WHERE vendor_contract_id = $4 + WHERE project_db_id = $4 AND NOT archived AND (milestone_id = $5 OR milestone_order = $6) RETURNING id @@ -703,7 +731,7 @@ impl EventProcessor { withdraw_tx_hash = $1, withdraw_time = $2, withdraw_amount = $3 - WHERE vendor_contract_id = $4 + WHERE project_db_id = $4 AND NOT archived AND (milestone_id = $5 OR milestone_order = $6) RETURNING id @@ -724,7 +752,7 @@ impl EventProcessor { } } - self.insert_event_full(event, "withdraw", None, vendor_contract_id, matched_milestone_id, withdraw_amount, &None, &None, body).await?; + self.insert_event_full(event, "withdraw", None, project_db_id, matched_milestone_id, withdraw_amount, &None, &None, body).await?; Ok(()) } @@ -739,17 +767,17 @@ impl EventProcessor { let reason = extract_text(event_body, "reason"); // Get vendor contract ID - either from metadata or by tracing tx chain - let vendor_contract_id: Option = if let Some(pid) = project_id_from_meta { + let project_db_id: Option = if let Some(pid) = project_id_from_meta { sqlx::query_scalar( - "UPDATE treasury.vendor_contracts SET status = 'paused' WHERE project_id = $1 RETURNING id" + "UPDATE treasury.projects SET status = 'paused' WHERE project_id = $1 RETURNING id" ) .bind(pid) .fetch_optional(&self.pool) .await? } else { // Find via tx chain first, then update - if let Some(vc_id) = self.find_vendor_contract_from_inputs(&event.tx_hash, &[]).await? { - sqlx::query("UPDATE treasury.vendor_contracts SET status = 'paused' WHERE id = $1") + if let Some(vc_id) = self.find_project_from_inputs(&event.tx_hash, &[]).await? { + sqlx::query("UPDATE treasury.projects SET status = 'paused' WHERE id = $1") .bind(vc_id) .execute(&self.pool) .await?; @@ -759,7 +787,7 @@ impl EventProcessor { } }; - if let Some(vc_id) = vendor_contract_id { + if let Some(vc_id) = project_db_id { // Also update per-milestone pause flags from output datum if available self.update_milestone_pause_from_datum(&event.tx_hash, vc_id).await?; @@ -781,16 +809,16 @@ impl EventProcessor { .filter(|s| !s.is_empty()); // Get vendor contract ID - either from metadata or by tracing tx chain - let vendor_contract_id: Option = if let Some(pid) = project_id_from_meta { + let project_db_id: Option = if let Some(pid) = project_id_from_meta { sqlx::query_scalar( - "UPDATE treasury.vendor_contracts SET status = 'active' WHERE project_id = $1 RETURNING id" + "UPDATE treasury.projects SET status = 'active' WHERE project_id = $1 RETURNING id" ) .bind(pid) .fetch_optional(&self.pool) .await? } else { - if let Some(vc_id) = self.find_vendor_contract_from_inputs(&event.tx_hash, &[]).await? { - sqlx::query("UPDATE treasury.vendor_contracts SET status = 'active' WHERE id = $1") + if let Some(vc_id) = self.find_project_from_inputs(&event.tx_hash, &[]).await? { + sqlx::query("UPDATE treasury.projects SET status = 'active' WHERE id = $1") .bind(vc_id) .execute(&self.pool) .await?; @@ -800,7 +828,7 @@ impl EventProcessor { } }; - if let Some(vc_id) = vendor_contract_id { + if let Some(vc_id) = project_db_id { // Also update per-milestone pause flags from output datum if available self.update_milestone_pause_from_datum(&event.tx_hash, vc_id).await?; @@ -823,18 +851,18 @@ impl EventProcessor { let reason = extract_text(event_body, "reason"); // Get vendor contract ID - either from metadata or by tracing tx chain - let vendor_contract_id: Option = if let Some(pid) = project_id_from_meta { + let project_db_id: Option = if let Some(pid) = project_id_from_meta { sqlx::query_scalar( - "SELECT id FROM treasury.vendor_contracts WHERE project_id = $1" + "SELECT id FROM treasury.projects WHERE project_id = $1" ) .bind(pid) .fetch_optional(&self.pool) .await? } else { - self.find_vendor_contract_from_inputs(&event.tx_hash, &[]).await? + self.find_project_from_inputs(&event.tx_hash, &[]).await? }; - if let Some(vc_id) = vendor_contract_id { + if let Some(vc_id) = project_db_id { // Update naming fields if present in modify metadata let project_name = extract_text(event_body, "label"); let description = extract_text(event_body, "description"); @@ -843,7 +871,7 @@ impl EventProcessor { sqlx::query( r#" - UPDATE treasury.vendor_contracts + UPDATE treasury.projects SET project_name = COALESCE($1, project_name), description = COALESCE($2, description), vendor_address = COALESCE($3, vendor_address) @@ -882,7 +910,7 @@ impl EventProcessor { r#" UPDATE treasury.milestones SET archived = TRUE, archived_by_tx_hash = $1, archived_at = $2 - WHERE vendor_contract_id = $3 AND NOT archived + WHERE project_db_id = $3 AND NOT archived "# ) .bind(&event.tx_hash) @@ -906,7 +934,7 @@ impl EventProcessor { let new_id: i32 = sqlx::query_scalar( r#" INSERT INTO treasury.milestones ( - vendor_contract_id, milestone_id, milestone_order, label, + project_db_id, milestone_id, milestone_order, label, description, acceptance_criteria, amount_lovelace ) VALUES ($1, $2, $3, $4, $5, $6, $7) @@ -928,7 +956,7 @@ impl EventProcessor { r#" UPDATE treasury.milestones SET superseded_by = $1 - WHERE vendor_contract_id = $2 AND milestone_id = $3 AND archived AND superseded_by IS NULL + WHERE project_db_id = $2 AND milestone_id = $3 AND archived AND superseded_by IS NULL "# ) .bind(new_id) @@ -957,16 +985,16 @@ impl EventProcessor { let reason = extract_text(event_body, "reason"); // Get vendor contract ID - either from metadata or by tracing tx chain - let vendor_contract_id: Option = if let Some(pid) = project_id_from_meta { + let project_db_id: Option = if let Some(pid) = project_id_from_meta { sqlx::query_scalar( - "UPDATE treasury.vendor_contracts SET status = 'cancelled' WHERE project_id = $1 RETURNING id" + "UPDATE treasury.projects SET status = 'cancelled' WHERE project_id = $1 RETURNING id" ) .bind(pid) .fetch_optional(&self.pool) .await? } else { - if let Some(vc_id) = self.find_vendor_contract_from_inputs(&event.tx_hash, &[]).await? { - sqlx::query("UPDATE treasury.vendor_contracts SET status = 'cancelled' WHERE id = $1") + if let Some(vc_id) = self.find_project_from_inputs(&event.tx_hash, &[]).await? { + sqlx::query("UPDATE treasury.projects SET status = 'cancelled' WHERE id = $1") .bind(vc_id) .execute(&self.pool) .await?; @@ -976,7 +1004,7 @@ impl EventProcessor { } }; - if let Some(vc_id) = vendor_contract_id { + if let Some(vc_id) = project_db_id { self.insert_event_full(event, "cancel", None, Some(vc_id), None, None, &reason, &None, body).await?; } else { tracing::warn!("Could not find vendor contract for cancel event {}", event.tx_hash); @@ -1019,7 +1047,7 @@ impl EventProcessor { event: &RawTomEvent, event_type: &str, treasury_id: Option, - vendor_contract_id: Option, + project_db_id: Option, milestone_id: Option, amount_lovelace: Option, reason: &Option, @@ -1030,7 +1058,7 @@ impl EventProcessor { r#" INSERT INTO treasury.events ( tx_hash, slot, block_number, block_time, event_type, - treasury_id, vendor_contract_id, milestone_id, + treasury_id, project_db_id, milestone_id, amount_lovelace, reason, destination, metadata ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) @@ -1046,7 +1074,7 @@ impl EventProcessor { .bind(event.block_time) .bind(event_type) .bind(treasury_id) - .bind(vendor_contract_id) + .bind(project_db_id) .bind(milestone_id) .bind(amount_lovelace) .bind(reason) @@ -1058,11 +1086,11 @@ impl EventProcessor { Ok(()) } - /// Find vendor_contract_id by looking up input UTXOs in our treasury.utxo_history tracking table. - /// When a fund event is processed, its output UTXOs are recorded with the vendor_contract_id. + /// Find project_db_id by looking up input UTXOs in our treasury.utxo_history tracking table. + /// When a fund event is processed, its output UTXOs are recorded with the project_db_id. /// Subsequent events (complete/withdraw/etc) spend those UTXOs, so we can find the project /// by looking at which tracked UTXOs are being spent as inputs. - async fn find_vendor_contract_from_inputs( + async fn find_project_from_inputs( &self, tx_hash: &str, milestone_id_hints: &[String], @@ -1091,11 +1119,11 @@ impl EventProcessor { // contract), so we don't want to commit to the first match blindly. let mut candidates: Vec<(String, i16, i32)> = Vec::new(); for (input_tx_hash, input_output_index) in &inputs { - let vendor_contract_id: Option = sqlx::query_scalar( + let project_db_id: Option = sqlx::query_scalar( r#" - SELECT vendor_contract_id + SELECT project_db_id FROM treasury.utxo_history - WHERE tx_hash = $1 AND output_index = $2 AND vendor_contract_id IS NOT NULL + WHERE tx_hash = $1 AND output_index = $2 AND project_db_id IS NOT NULL "# ) .bind(input_tx_hash) @@ -1103,7 +1131,7 @@ impl EventProcessor { .fetch_optional(&self.pool) .await?; - if let Some(vc_id) = vendor_contract_id { + if let Some(vc_id) = project_db_id { candidates.push((input_tx_hash.clone(), *input_output_index, vc_id)); } } @@ -1122,7 +1150,7 @@ impl EventProcessor { let mut best_score: i64 = -1; for (i, (_, _, vc_id)) in candidates.iter().enumerate() { let score: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM treasury.milestones WHERE vendor_contract_id = $1 AND milestone_id = ANY($2)" + "SELECT COUNT(*) FROM treasury.milestones WHERE project_db_id = $1 AND milestone_id = ANY($2)" ) .bind(vc_id) .bind(milestone_id_hints) @@ -1164,7 +1192,7 @@ impl EventProcessor { .execute(&self.pool) .await?; - // Record the outputs of this transaction with the same vendor_contract_id + // Record the outputs of this transaction with the same project_db_id let outputs: Option = sqlx::query_scalar( "SELECT outputs::jsonb FROM yaci_store.transaction WHERE tx_hash = $1" ) @@ -1195,10 +1223,10 @@ impl EventProcessor { sqlx::query( r#" - INSERT INTO treasury.utxo_history (tx_hash, output_index, vendor_contract_id, address, address_type, lovelace_amount, inline_datum_cbor, spent) + INSERT INTO treasury.utxo_history (tx_hash, output_index, project_db_id, address, address_type, lovelace_amount, inline_datum_cbor, spent) VALUES ($1, $2, $3, $4, $5, $6, $7, false) ON CONFLICT (tx_hash, output_index) DO UPDATE - SET vendor_contract_id = EXCLUDED.vendor_contract_id, + SET project_db_id = EXCLUDED.project_db_id, address = COALESCE(EXCLUDED.address, treasury.utxo_history.address), address_type = COALESCE(EXCLUDED.address_type, treasury.utxo_history.address_type), lovelace_amount = COALESCE(EXCLUDED.lovelace_amount, treasury.utxo_history.lovelace_amount), @@ -1335,7 +1363,7 @@ impl EventProcessor { } /// Update per-milestone pause flags from the output datum of a transaction - async fn update_milestone_pause_from_datum(&self, tx_hash: &str, vendor_contract_id: i32) -> anyhow::Result<()> { + async fn update_milestone_pause_from_datum(&self, tx_hash: &str, project_db_id: i32) -> anyhow::Result<()> { // Query inline datum from the tx output at the vendor contract address let inline_datum: Option = sqlx::query_scalar( "SELECT inline_datum FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' AND inline_datum IS NOT NULL LIMIT 1" @@ -1357,16 +1385,16 @@ impl EventProcessor { }; if let Some(datum_hex) = inline_datum { - match crate::parsers::datum::parse_vendor_contract_datum(&datum_hex) { + match crate::parsers::datum::parse_project_datum(&datum_hex) { Ok(parsed) => { // Get non-withdrawn milestones ordered by milestone_order. // Withdrawn milestones are consumed on-chain, so the datum only // contains entries for non-withdrawn milestones. We must skip // withdrawn rows to keep datum indices aligned with DB rows. let milestone_ids: Vec<(i32,)> = sqlx::query_as( - "SELECT id FROM treasury.milestones WHERE vendor_contract_id = $1 AND NOT archived AND NOT withdrawn ORDER BY milestone_order" + "SELECT id FROM treasury.milestones WHERE project_db_id = $1 AND NOT archived AND NOT withdrawn ORDER BY milestone_order" ) - .bind(vendor_contract_id) + .bind(project_db_id) .fetch_all(&self.pool) .await?; @@ -1386,13 +1414,13 @@ impl EventProcessor { let all_paused = parsed.milestones.iter().all(|m| m.paused); let any_paused = parsed.milestones.iter().any(|m| m.paused); if all_paused && !parsed.milestones.is_empty() { - sqlx::query("UPDATE treasury.vendor_contracts SET status = 'paused' WHERE id = $1") - .bind(vendor_contract_id) + sqlx::query("UPDATE treasury.projects SET status = 'paused' WHERE id = $1") + .bind(project_db_id) .execute(&self.pool) .await?; } else if !any_paused { - sqlx::query("UPDATE treasury.vendor_contracts SET status = 'active' WHERE id = $1") - .bind(vendor_contract_id) + sqlx::query("UPDATE treasury.projects SET status = 'active' WHERE id = $1") + .bind(project_db_id) .execute(&self.pool) .await?; } diff --git a/database/init/02-treasury-schema.sql b/database/init/02-treasury-schema.sql index 57c319e..5589a18 100644 --- a/database/init/02-treasury-schema.sql +++ b/database/init/02-treasury-schema.sql @@ -25,8 +25,20 @@ CREATE TABLE IF NOT EXISTS treasury.treasury_contracts ( updated_at TIMESTAMPTZ DEFAULT NOW() ); --- Vendor Contracts (PSSC) - Project-specific contracts linked to treasury +-- Vendor Contract (PSSC) - the *one* on-chain script address that holds every +-- project's funds, distinguished only by inline datum. Singleton in our deployment. CREATE TABLE IF NOT EXISTS treasury.vendor_contracts ( + id SERIAL PRIMARY KEY, + treasury_id INT REFERENCES treasury.treasury_contracts(id), + address TEXT UNIQUE NOT NULL, -- Shared PSSC script address (addr1x...) + stake_credential TEXT, -- Stake credential portion of the address + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Projects - One row per `fund` event; identified by `project_id` (e.g. EC-0008-25). +-- Funds and milestones live at the shared PSSC above, distinguished by datum. +CREATE TABLE IF NOT EXISTS treasury.projects ( id SERIAL PRIMARY KEY, treasury_id INT REFERENCES treasury.treasury_contracts(id), project_id TEXT UNIQUE NOT NULL, -- Logical identifier (e.g., "EC-0008-25") @@ -48,7 +60,7 @@ CREATE TABLE IF NOT EXISTS treasury.vendor_contracts ( -- Milestones - Each vendor contract has ordered milestones CREATE TABLE IF NOT EXISTS treasury.milestones ( id SERIAL PRIMARY KEY, - vendor_contract_id INT NOT NULL REFERENCES treasury.vendor_contracts(id) ON DELETE CASCADE, + project_db_id INT NOT NULL REFERENCES treasury.projects(id) ON DELETE CASCADE, milestone_id TEXT NOT NULL, -- Logical identifier (e.g., "m-0") milestone_order INT NOT NULL, -- Position (1, 2, 3...) label TEXT, -- Milestone name @@ -94,7 +106,7 @@ CREATE TABLE IF NOT EXISTS treasury.events ( block_time BIGINT, -- Block timestamp event_type TEXT NOT NULL, -- publish/initialize/fund/complete/disburse/etc. treasury_id INT REFERENCES treasury.treasury_contracts(id), - vendor_contract_id INT REFERENCES treasury.vendor_contracts(id), + project_db_id INT REFERENCES treasury.projects(id), milestone_id INT REFERENCES treasury.milestones(id), amount_lovelace BIGINT, -- Amount involved reason TEXT, -- Justification (pause/cancel/modify) @@ -110,7 +122,7 @@ CREATE TABLE IF NOT EXISTS treasury.utxo_history ( output_index SMALLINT NOT NULL, -- Output index address TEXT, -- Owner address (optional for tracking) address_type TEXT, -- treasury/vendor_contract/vendor - vendor_contract_id INT REFERENCES treasury.vendor_contracts(id), + project_db_id INT REFERENCES treasury.projects(id), lovelace_amount BIGINT, -- Amount (optional for tracking) slot BIGINT, -- Creation slot (optional for tracking) block_number BIGINT, -- Block number @@ -145,41 +157,41 @@ CREATE INDEX IF NOT EXISTS idx_treasury_address ON treasury.treasury_contracts(c CREATE INDEX IF NOT EXISTS idx_treasury_status ON treasury.treasury_contracts(status); -- Vendor contracts (projects) -CREATE INDEX IF NOT EXISTS idx_vendor_treasury ON treasury.vendor_contracts(treasury_id); -CREATE INDEX IF NOT EXISTS idx_vendor_project_id ON treasury.vendor_contracts(project_id); -CREATE INDEX IF NOT EXISTS idx_vendor_status ON treasury.vendor_contracts(status); -CREATE INDEX IF NOT EXISTS idx_vendor_fund_time ON treasury.vendor_contracts(fund_block_time DESC); -CREATE INDEX IF NOT EXISTS idx_vendor_contract_address ON treasury.vendor_contracts(contract_address); -CREATE INDEX IF NOT EXISTS idx_vendor_payment_key_hash ON treasury.vendor_contracts(vendor_payment_key_hash); -CREATE INDEX IF NOT EXISTS idx_vendor_search ON treasury.vendor_contracts +CREATE INDEX IF NOT EXISTS idx_project_treasury ON treasury.projects(treasury_id); +CREATE INDEX IF NOT EXISTS idx_project_project_id ON treasury.projects(project_id); +CREATE INDEX IF NOT EXISTS idx_project_status ON treasury.projects(status); +CREATE INDEX IF NOT EXISTS idx_project_fund_time ON treasury.projects(fund_block_time DESC); +CREATE INDEX IF NOT EXISTS idx_project_contract_address ON treasury.projects(contract_address); +CREATE INDEX IF NOT EXISTS idx_project_payment_key_hash ON treasury.projects(vendor_payment_key_hash); +CREATE INDEX IF NOT EXISTS idx_project_search ON treasury.projects USING gin (to_tsvector('english', COALESCE(project_name, '') || ' ' || COALESCE(description, ''))); -- Milestones -CREATE INDEX IF NOT EXISTS idx_milestone_vendor ON treasury.milestones(vendor_contract_id); -CREATE INDEX IF NOT EXISTS idx_milestone_order ON treasury.milestones(vendor_contract_id, milestone_order); +CREATE INDEX IF NOT EXISTS idx_milestone_vendor ON treasury.milestones(project_db_id); +CREATE INDEX IF NOT EXISTS idx_milestone_order ON treasury.milestones(project_db_id, milestone_order); -- Only one active (non-archived) milestone per vendor contract + milestone_id CREATE UNIQUE INDEX IF NOT EXISTS idx_milestone_active_unique - ON treasury.milestones(vendor_contract_id, milestone_id) + ON treasury.milestones(project_db_id, milestone_id) WHERE NOT archived; CREATE INDEX IF NOT EXISTS idx_milestone_not_archived - ON treasury.milestones(vendor_contract_id) WHERE NOT archived; + ON treasury.milestones(project_db_id) WHERE NOT archived; -- Events CREATE INDEX IF NOT EXISTS idx_event_type ON treasury.events(event_type); -CREATE INDEX IF NOT EXISTS idx_event_vendor ON treasury.events(vendor_contract_id); +CREATE INDEX IF NOT EXISTS idx_event_vendor ON treasury.events(project_db_id); CREATE INDEX IF NOT EXISTS idx_event_treasury ON treasury.events(treasury_id); CREATE INDEX IF NOT EXISTS idx_event_slot ON treasury.events(slot DESC); CREATE INDEX IF NOT EXISTS idx_event_block_time ON treasury.events(block_time DESC); -- UTXOs CREATE INDEX IF NOT EXISTS idx_utxo_history_address ON treasury.utxo_history(address); -CREATE INDEX IF NOT EXISTS idx_utxo_history_vendor ON treasury.utxo_history(vendor_contract_id); +CREATE INDEX IF NOT EXISTS idx_utxo_history_vendor ON treasury.utxo_history(project_db_id); CREATE INDEX IF NOT EXISTS idx_utxo_history_unspent ON treasury.utxo_history(address) WHERE NOT spent; CREATE INDEX IF NOT EXISTS idx_utxo_history_slot ON treasury.utxo_history(slot DESC); -CREATE INDEX IF NOT EXISTS idx_utxo_history_vendor_unspent ON treasury.utxo_history(vendor_contract_id) WHERE NOT spent; +CREATE INDEX IF NOT EXISTS idx_utxo_history_vendor_unspent ON treasury.utxo_history(project_db_id) WHERE NOT spent; -- Full-text search across project fields -CREATE INDEX IF NOT EXISTS idx_vendor_fulltext ON treasury.vendor_contracts +CREATE INDEX IF NOT EXISTS idx_project_fulltext ON treasury.projects USING gin (to_tsvector('english', COALESCE(project_id, '') || ' ' || COALESCE(project_name, '') || ' ' || @@ -208,8 +220,8 @@ CREATE TRIGGER trg_treasury_contracts_updated_at BEFORE UPDATE ON treasury.treasury_contracts FOR EACH ROW EXECUTE FUNCTION treasury.update_updated_at(); -CREATE TRIGGER trg_vendor_contracts_updated_at - BEFORE UPDATE ON treasury.vendor_contracts +CREATE TRIGGER trg_projects_updated_at + BEFORE UPDATE ON treasury.projects FOR EACH ROW EXECUTE FUNCTION treasury.update_updated_at(); CREATE TRIGGER trg_milestones_updated_at @@ -221,7 +233,7 @@ CREATE TRIGGER trg_milestones_updated_at -- ============================================================================ -- Vendor contracts with milestone stats, financials, and balance -CREATE OR REPLACE VIEW treasury.v_vendor_contracts_summary AS +CREATE OR REPLACE VIEW treasury.v_projects_summary AS SELECT vc.id, vc.treasury_id, @@ -252,13 +264,13 @@ SELECT COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent AND u.address LIKE 'addr1x%'), 0)::BIGINT as current_balance_lovelace, COUNT(u.id) FILTER (WHERE NOT u.spent AND u.address LIKE 'addr1x%') as utxo_count, -- Last event time - (SELECT MAX(e.block_time) FROM treasury.events e WHERE e.vendor_contract_id = vc.id) as last_event_time, + (SELECT MAX(e.block_time) FROM treasury.events e WHERE e.project_db_id = vc.id) as last_event_time, -- Event count - (SELECT COUNT(*) FROM treasury.events e WHERE e.vendor_contract_id = vc.id) as event_count -FROM treasury.vendor_contracts vc + (SELECT COUNT(*) FROM treasury.events e WHERE e.project_db_id = vc.id) as event_count +FROM treasury.projects vc LEFT JOIN treasury.treasury_contracts tc ON tc.id = vc.treasury_id -LEFT JOIN treasury.milestones m ON m.vendor_contract_id = vc.id -LEFT JOIN treasury.utxo_history u ON u.vendor_contract_id = vc.id +LEFT JOIN treasury.milestones m ON m.project_db_id = vc.id +LEFT JOIN treasury.utxo_history u ON u.project_db_id = vc.id GROUP BY vc.id, tc.contract_instance; -- Milestone timeline with vendor context @@ -289,7 +301,7 @@ SELECT vc.project_name, vc.vendor_address FROM treasury.milestones m -JOIN treasury.vendor_contracts vc ON vc.id = m.vendor_contract_id +JOIN treasury.projects vc ON vc.id = m.project_db_id ORDER BY vc.project_id, m.milestone_order; -- Recent events with full context @@ -312,7 +324,7 @@ SELECT m.label as milestone_label, m.milestone_order FROM treasury.events e -LEFT JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id +LEFT JOIN treasury.projects vc ON vc.id = e.project_db_id LEFT JOIN treasury.treasury_contracts tc ON tc.id = COALESCE(e.treasury_id, vc.treasury_id) LEFT JOIN treasury.milestones m ON m.id = e.milestone_id ORDER BY e.slot DESC; @@ -330,7 +342,7 @@ SELECT tc.initialized_tx_hash, tc.initialized_at, tc.permissions, - COUNT(DISTINCT vc.id) as vendor_contract_count, + COUNT(DISTINCT vc.id) as project_count, COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'active') as active_contracts, COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'completed') as completed_contracts, COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'cancelled') as cancelled_contracts, @@ -349,7 +361,7 @@ SELECT tc.created_at, tc.updated_at FROM treasury.treasury_contracts tc -LEFT JOIN treasury.vendor_contracts vc ON vc.treasury_id = tc.id +LEFT JOIN treasury.projects vc ON vc.treasury_id = tc.id GROUP BY tc.id; -- Events with full context (treasury, project, milestone info) @@ -377,7 +389,7 @@ SELECT m.label as milestone_label, m.milestone_order FROM treasury.events e -LEFT JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id +LEFT JOIN treasury.projects vc ON vc.id = e.project_db_id LEFT JOIN treasury.treasury_contracts tc ON tc.id = COALESCE(e.treasury_id, vc.treasury_id) LEFT JOIN treasury.milestones m ON m.id = e.milestone_id; @@ -402,20 +414,20 @@ SELECT COALESCE(( SELECT SUM(u2.lovelace_amount) FROM treasury.utxo_history u2 - JOIN treasury.vendor_contracts vc2 ON vc2.id = u2.vendor_contract_id + JOIN treasury.projects vc2 ON vc2.id = u2.project_db_id WHERE vc2.treasury_id = tc.id AND NOT u2.spent AND u2.address LIKE 'addr1x%' ), 0)::BIGINT as project_balance_lovelace, -- Counts COUNT(DISTINCT vc.id) as project_count, COUNT(DISTINCT CASE WHEN vc.status = 'active' THEN vc.id END) as active_project_count FROM treasury.treasury_contracts tc -LEFT JOIN treasury.vendor_contracts vc ON vc.treasury_id = tc.id +LEFT JOIN treasury.projects vc ON vc.treasury_id = tc.id LEFT JOIN ( SELECT - m.vendor_contract_id, + m.project_db_id, SUM(COALESCE(m.withdraw_amount, 0)) as total_withdrawn FROM treasury.milestones m WHERE NOT m.archived - GROUP BY m.vendor_contract_id -) m_totals ON m_totals.vendor_contract_id = vc.id + GROUP BY m.project_db_id +) m_totals ON m_totals.project_db_id = vc.id GROUP BY tc.id; diff --git a/database/schema/treasury.sql b/database/schema/treasury.sql index 57c319e..5589a18 100644 --- a/database/schema/treasury.sql +++ b/database/schema/treasury.sql @@ -25,8 +25,20 @@ CREATE TABLE IF NOT EXISTS treasury.treasury_contracts ( updated_at TIMESTAMPTZ DEFAULT NOW() ); --- Vendor Contracts (PSSC) - Project-specific contracts linked to treasury +-- Vendor Contract (PSSC) - the *one* on-chain script address that holds every +-- project's funds, distinguished only by inline datum. Singleton in our deployment. CREATE TABLE IF NOT EXISTS treasury.vendor_contracts ( + id SERIAL PRIMARY KEY, + treasury_id INT REFERENCES treasury.treasury_contracts(id), + address TEXT UNIQUE NOT NULL, -- Shared PSSC script address (addr1x...) + stake_credential TEXT, -- Stake credential portion of the address + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Projects - One row per `fund` event; identified by `project_id` (e.g. EC-0008-25). +-- Funds and milestones live at the shared PSSC above, distinguished by datum. +CREATE TABLE IF NOT EXISTS treasury.projects ( id SERIAL PRIMARY KEY, treasury_id INT REFERENCES treasury.treasury_contracts(id), project_id TEXT UNIQUE NOT NULL, -- Logical identifier (e.g., "EC-0008-25") @@ -48,7 +60,7 @@ CREATE TABLE IF NOT EXISTS treasury.vendor_contracts ( -- Milestones - Each vendor contract has ordered milestones CREATE TABLE IF NOT EXISTS treasury.milestones ( id SERIAL PRIMARY KEY, - vendor_contract_id INT NOT NULL REFERENCES treasury.vendor_contracts(id) ON DELETE CASCADE, + project_db_id INT NOT NULL REFERENCES treasury.projects(id) ON DELETE CASCADE, milestone_id TEXT NOT NULL, -- Logical identifier (e.g., "m-0") milestone_order INT NOT NULL, -- Position (1, 2, 3...) label TEXT, -- Milestone name @@ -94,7 +106,7 @@ CREATE TABLE IF NOT EXISTS treasury.events ( block_time BIGINT, -- Block timestamp event_type TEXT NOT NULL, -- publish/initialize/fund/complete/disburse/etc. treasury_id INT REFERENCES treasury.treasury_contracts(id), - vendor_contract_id INT REFERENCES treasury.vendor_contracts(id), + project_db_id INT REFERENCES treasury.projects(id), milestone_id INT REFERENCES treasury.milestones(id), amount_lovelace BIGINT, -- Amount involved reason TEXT, -- Justification (pause/cancel/modify) @@ -110,7 +122,7 @@ CREATE TABLE IF NOT EXISTS treasury.utxo_history ( output_index SMALLINT NOT NULL, -- Output index address TEXT, -- Owner address (optional for tracking) address_type TEXT, -- treasury/vendor_contract/vendor - vendor_contract_id INT REFERENCES treasury.vendor_contracts(id), + project_db_id INT REFERENCES treasury.projects(id), lovelace_amount BIGINT, -- Amount (optional for tracking) slot BIGINT, -- Creation slot (optional for tracking) block_number BIGINT, -- Block number @@ -145,41 +157,41 @@ CREATE INDEX IF NOT EXISTS idx_treasury_address ON treasury.treasury_contracts(c CREATE INDEX IF NOT EXISTS idx_treasury_status ON treasury.treasury_contracts(status); -- Vendor contracts (projects) -CREATE INDEX IF NOT EXISTS idx_vendor_treasury ON treasury.vendor_contracts(treasury_id); -CREATE INDEX IF NOT EXISTS idx_vendor_project_id ON treasury.vendor_contracts(project_id); -CREATE INDEX IF NOT EXISTS idx_vendor_status ON treasury.vendor_contracts(status); -CREATE INDEX IF NOT EXISTS idx_vendor_fund_time ON treasury.vendor_contracts(fund_block_time DESC); -CREATE INDEX IF NOT EXISTS idx_vendor_contract_address ON treasury.vendor_contracts(contract_address); -CREATE INDEX IF NOT EXISTS idx_vendor_payment_key_hash ON treasury.vendor_contracts(vendor_payment_key_hash); -CREATE INDEX IF NOT EXISTS idx_vendor_search ON treasury.vendor_contracts +CREATE INDEX IF NOT EXISTS idx_project_treasury ON treasury.projects(treasury_id); +CREATE INDEX IF NOT EXISTS idx_project_project_id ON treasury.projects(project_id); +CREATE INDEX IF NOT EXISTS idx_project_status ON treasury.projects(status); +CREATE INDEX IF NOT EXISTS idx_project_fund_time ON treasury.projects(fund_block_time DESC); +CREATE INDEX IF NOT EXISTS idx_project_contract_address ON treasury.projects(contract_address); +CREATE INDEX IF NOT EXISTS idx_project_payment_key_hash ON treasury.projects(vendor_payment_key_hash); +CREATE INDEX IF NOT EXISTS idx_project_search ON treasury.projects USING gin (to_tsvector('english', COALESCE(project_name, '') || ' ' || COALESCE(description, ''))); -- Milestones -CREATE INDEX IF NOT EXISTS idx_milestone_vendor ON treasury.milestones(vendor_contract_id); -CREATE INDEX IF NOT EXISTS idx_milestone_order ON treasury.milestones(vendor_contract_id, milestone_order); +CREATE INDEX IF NOT EXISTS idx_milestone_vendor ON treasury.milestones(project_db_id); +CREATE INDEX IF NOT EXISTS idx_milestone_order ON treasury.milestones(project_db_id, milestone_order); -- Only one active (non-archived) milestone per vendor contract + milestone_id CREATE UNIQUE INDEX IF NOT EXISTS idx_milestone_active_unique - ON treasury.milestones(vendor_contract_id, milestone_id) + ON treasury.milestones(project_db_id, milestone_id) WHERE NOT archived; CREATE INDEX IF NOT EXISTS idx_milestone_not_archived - ON treasury.milestones(vendor_contract_id) WHERE NOT archived; + ON treasury.milestones(project_db_id) WHERE NOT archived; -- Events CREATE INDEX IF NOT EXISTS idx_event_type ON treasury.events(event_type); -CREATE INDEX IF NOT EXISTS idx_event_vendor ON treasury.events(vendor_contract_id); +CREATE INDEX IF NOT EXISTS idx_event_vendor ON treasury.events(project_db_id); CREATE INDEX IF NOT EXISTS idx_event_treasury ON treasury.events(treasury_id); CREATE INDEX IF NOT EXISTS idx_event_slot ON treasury.events(slot DESC); CREATE INDEX IF NOT EXISTS idx_event_block_time ON treasury.events(block_time DESC); -- UTXOs CREATE INDEX IF NOT EXISTS idx_utxo_history_address ON treasury.utxo_history(address); -CREATE INDEX IF NOT EXISTS idx_utxo_history_vendor ON treasury.utxo_history(vendor_contract_id); +CREATE INDEX IF NOT EXISTS idx_utxo_history_vendor ON treasury.utxo_history(project_db_id); CREATE INDEX IF NOT EXISTS idx_utxo_history_unspent ON treasury.utxo_history(address) WHERE NOT spent; CREATE INDEX IF NOT EXISTS idx_utxo_history_slot ON treasury.utxo_history(slot DESC); -CREATE INDEX IF NOT EXISTS idx_utxo_history_vendor_unspent ON treasury.utxo_history(vendor_contract_id) WHERE NOT spent; +CREATE INDEX IF NOT EXISTS idx_utxo_history_vendor_unspent ON treasury.utxo_history(project_db_id) WHERE NOT spent; -- Full-text search across project fields -CREATE INDEX IF NOT EXISTS idx_vendor_fulltext ON treasury.vendor_contracts +CREATE INDEX IF NOT EXISTS idx_project_fulltext ON treasury.projects USING gin (to_tsvector('english', COALESCE(project_id, '') || ' ' || COALESCE(project_name, '') || ' ' || @@ -208,8 +220,8 @@ CREATE TRIGGER trg_treasury_contracts_updated_at BEFORE UPDATE ON treasury.treasury_contracts FOR EACH ROW EXECUTE FUNCTION treasury.update_updated_at(); -CREATE TRIGGER trg_vendor_contracts_updated_at - BEFORE UPDATE ON treasury.vendor_contracts +CREATE TRIGGER trg_projects_updated_at + BEFORE UPDATE ON treasury.projects FOR EACH ROW EXECUTE FUNCTION treasury.update_updated_at(); CREATE TRIGGER trg_milestones_updated_at @@ -221,7 +233,7 @@ CREATE TRIGGER trg_milestones_updated_at -- ============================================================================ -- Vendor contracts with milestone stats, financials, and balance -CREATE OR REPLACE VIEW treasury.v_vendor_contracts_summary AS +CREATE OR REPLACE VIEW treasury.v_projects_summary AS SELECT vc.id, vc.treasury_id, @@ -252,13 +264,13 @@ SELECT COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent AND u.address LIKE 'addr1x%'), 0)::BIGINT as current_balance_lovelace, COUNT(u.id) FILTER (WHERE NOT u.spent AND u.address LIKE 'addr1x%') as utxo_count, -- Last event time - (SELECT MAX(e.block_time) FROM treasury.events e WHERE e.vendor_contract_id = vc.id) as last_event_time, + (SELECT MAX(e.block_time) FROM treasury.events e WHERE e.project_db_id = vc.id) as last_event_time, -- Event count - (SELECT COUNT(*) FROM treasury.events e WHERE e.vendor_contract_id = vc.id) as event_count -FROM treasury.vendor_contracts vc + (SELECT COUNT(*) FROM treasury.events e WHERE e.project_db_id = vc.id) as event_count +FROM treasury.projects vc LEFT JOIN treasury.treasury_contracts tc ON tc.id = vc.treasury_id -LEFT JOIN treasury.milestones m ON m.vendor_contract_id = vc.id -LEFT JOIN treasury.utxo_history u ON u.vendor_contract_id = vc.id +LEFT JOIN treasury.milestones m ON m.project_db_id = vc.id +LEFT JOIN treasury.utxo_history u ON u.project_db_id = vc.id GROUP BY vc.id, tc.contract_instance; -- Milestone timeline with vendor context @@ -289,7 +301,7 @@ SELECT vc.project_name, vc.vendor_address FROM treasury.milestones m -JOIN treasury.vendor_contracts vc ON vc.id = m.vendor_contract_id +JOIN treasury.projects vc ON vc.id = m.project_db_id ORDER BY vc.project_id, m.milestone_order; -- Recent events with full context @@ -312,7 +324,7 @@ SELECT m.label as milestone_label, m.milestone_order FROM treasury.events e -LEFT JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id +LEFT JOIN treasury.projects vc ON vc.id = e.project_db_id LEFT JOIN treasury.treasury_contracts tc ON tc.id = COALESCE(e.treasury_id, vc.treasury_id) LEFT JOIN treasury.milestones m ON m.id = e.milestone_id ORDER BY e.slot DESC; @@ -330,7 +342,7 @@ SELECT tc.initialized_tx_hash, tc.initialized_at, tc.permissions, - COUNT(DISTINCT vc.id) as vendor_contract_count, + COUNT(DISTINCT vc.id) as project_count, COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'active') as active_contracts, COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'completed') as completed_contracts, COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'cancelled') as cancelled_contracts, @@ -349,7 +361,7 @@ SELECT tc.created_at, tc.updated_at FROM treasury.treasury_contracts tc -LEFT JOIN treasury.vendor_contracts vc ON vc.treasury_id = tc.id +LEFT JOIN treasury.projects vc ON vc.treasury_id = tc.id GROUP BY tc.id; -- Events with full context (treasury, project, milestone info) @@ -377,7 +389,7 @@ SELECT m.label as milestone_label, m.milestone_order FROM treasury.events e -LEFT JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id +LEFT JOIN treasury.projects vc ON vc.id = e.project_db_id LEFT JOIN treasury.treasury_contracts tc ON tc.id = COALESCE(e.treasury_id, vc.treasury_id) LEFT JOIN treasury.milestones m ON m.id = e.milestone_id; @@ -402,20 +414,20 @@ SELECT COALESCE(( SELECT SUM(u2.lovelace_amount) FROM treasury.utxo_history u2 - JOIN treasury.vendor_contracts vc2 ON vc2.id = u2.vendor_contract_id + JOIN treasury.projects vc2 ON vc2.id = u2.project_db_id WHERE vc2.treasury_id = tc.id AND NOT u2.spent AND u2.address LIKE 'addr1x%' ), 0)::BIGINT as project_balance_lovelace, -- Counts COUNT(DISTINCT vc.id) as project_count, COUNT(DISTINCT CASE WHEN vc.status = 'active' THEN vc.id END) as active_project_count FROM treasury.treasury_contracts tc -LEFT JOIN treasury.vendor_contracts vc ON vc.treasury_id = tc.id +LEFT JOIN treasury.projects vc ON vc.treasury_id = tc.id LEFT JOIN ( SELECT - m.vendor_contract_id, + m.project_db_id, SUM(COALESCE(m.withdraw_amount, 0)) as total_withdrawn FROM treasury.milestones m WHERE NOT m.archived - GROUP BY m.vendor_contract_id -) m_totals ON m_totals.vendor_contract_id = vc.id + GROUP BY m.project_db_id +) m_totals ON m_totals.project_db_id = vc.id GROUP BY tc.id; diff --git a/docs/changelog.md b/docs/changelog.md index 037fbd3..391bdb2 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -6,6 +6,68 @@ the equivalent merge). Pre-1.0 versions allowed breaking changes; the project is now operating under a 1.x line and breaking changes here are flagged as such. +## v2.0.0 — 2026-05-01 + +Semantic rename pass: split "vendor contract" into the *singleton on-chain +script address* (the shared PSSC, one row) and the 42 *projects* (one per +fund event) that sit at it. Old paths are gone (404), not aliased — pre-1.0 +contract still applies. + +### Breaking — paths + +- `/api/v1/vendor-contracts` → `/api/v1/projects` (list + filter) +- `/api/v1/vendor-contracts/{project_id}` → `/api/v1/projects/{project_id}` +- `/api/v1/vendor-contracts/{project_id}/milestones` → + `/api/v1/projects/{project_id}/milestones` +- `/api/v1/vendor-contracts/{project_id}/events` → + `/api/v1/projects/{project_id}/events` +- `/api/v1/vendor-contracts/{project_id}/utxos` → + `/api/v1/projects/{project_id}/utxos` + +### Added + +- **`GET /api/v1/vendor-contract`** — singleton: returns + `{ address, stake_credential, projects: { total, by_status: {...} } }`. + The shared PSSC every project sits at. +- **`GET /api/v1/milestones/{project_id}`** — paginated milestones list + under the `/milestones/` root. Equivalent to + `/projects/{project_id}/milestones`; differs only in URL hierarchy. +- **`GET /api/v1/milestones/by-id/{id}`** — single milestone by integer + database ID. The previous `/milestones/{id}` lookup moved here to free + the parameterised `/milestones/{project_id}` slot for project lookups. + +### Breaking — response shapes + +- `StatusResponse.totals.vendor_contracts` → `totals.projects`. +- `TreasuryStatistics.vendor_contract_count` → `project_count`. +- `Milestone.vendor_contract_id` (FK) is no longer exposed; the canonical + link is via `project_id` (text). +- Numerous internal struct/field renames are not visible in the JSON wire + format but appear in the OpenAPI schema list. + +### Schema + +- Renamed `treasury.vendor_contracts` → `treasury.projects`. +- Renamed FK column `vendor_contract_id` → `project_db_id` in + `treasury.events`, `treasury.milestones`, `treasury.utxo_history`. +- New singleton `treasury.vendor_contracts (id, treasury_id, address, + stake_credential, …)` stores one row per shared PSSC. +- Renamed view `v_vendor_contracts_summary` → `v_projects_summary`; + view bodies updated to use new names. +- Trigger `trg_vendor_contracts_updated_at` → `trg_projects_updated_at`. + +### Internal renames (impact code readers, not the API surface) + +- `find_vendor_contract_from_inputs` → `find_project_from_inputs`. +- `parse_vendor_contract_datum` → `parse_project_datum`; + `ParsedVendorDatum` → `ParsedProjectDatum`. + +### Migration + +Existing deployments must wipe `treasury` schema and re-sync (the +`utxo_history` Postgres triggers come back via the API's startup hook). +There is no in-place column-rename migration shipped — pre-1.x stance. + ## v1.1.0 — 2026-05-01 API consistency pass. Several breaking response-shape changes — frontends From 05939103145f6951235911f4d0f297d1a2e8ff5f Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Sat, 2 May 2026 20:30:13 +0100 Subject: [PATCH 14/19] add tests, improve docs --- api/src/parsers/datum.rs | 164 +++++-- api/src/services/event_processor.rs | 236 ++++++---- api/src/services/sync.rs | 53 ++- api/tests/fixtures/utxo_ec_0002_25_01.hex | 1 + api/tests/fixtures/utxo_emi_0001_25.hex | 1 + api/tests/fixtures/utxo_er_0001_25.hex | 1 + database/init/02-treasury-schema.sql | 6 +- database/schema/treasury.sql | 6 +- docs/event-processing.md | 33 +- docs/known-issues.md | 536 ++++++++++++++++------ 10 files changed, 763 insertions(+), 274 deletions(-) create mode 100644 api/tests/fixtures/utxo_ec_0002_25_01.hex create mode 100644 api/tests/fixtures/utxo_emi_0001_25.hex create mode 100644 api/tests/fixtures/utxo_er_0001_25.hex diff --git a/api/src/parsers/datum.rs b/api/src/parsers/datum.rs index 24ac1aa..ed2db92 100644 --- a/api/src/parsers/datum.rs +++ b/api/src/parsers/datum.rs @@ -18,13 +18,24 @@ use anyhow::{anyhow, Context}; use pallas_primitives::alonzo::{BigInt, PlutusData}; -/// Parsed vendor contract datum +/// Parsed vendor contract datum. +/// +/// Partial: each section may independently succeed or fail. The call site +/// persists what's `Ok` and writes the error string to `datum_parse_error` +/// for the relevant row, so failures are queryable in SQL rather than +/// scraped from logs. #[derive(Debug, Clone)] pub struct ParsedProjectDatum { - /// Vendor payment key hash (hex) - pub vendor_payment_key_hash: String, - /// Per-milestone data from datum - pub milestones: Vec, + /// Vendor payment key hash (hex). `None` means vendor-info section + /// failed to parse — see `vendor_info_error`. + pub vendor_payment_key_hash: Option, + /// Error message if vendor-info section couldn't be parsed. + pub vendor_info_error: Option, + /// Per-milestone results. `Ok` rows update the milestone row; + /// `Err` rows record the error in `treasury.milestones.datum_parse_error`. + pub milestones: Vec>, + /// Top-level CBOR / shape error. When set, every other field is empty. + pub top_level_error: Option, } /// Parsed milestone data from inline datum @@ -53,18 +64,39 @@ pub struct ParsedMilestoneDatum { /// storage in the single `vendor_payment_key_hash` column. /// /// The milestones array structure is identical between the two formats. -pub fn parse_project_datum(cbor_hex: &str) -> anyhow::Result { - let bytes = hex::decode(cbor_hex).context("invalid hex in datum")?; - let datum: PlutusData = - pallas_codec::minicbor::decode(&bytes).context("failed to decode CBOR datum")?; +/// +/// Returns a partial result: a top-level CBOR/shape error short-circuits +/// the whole datum, otherwise vendor info and each milestone parse +/// independently so a single bad milestone doesn't lose the rest. +pub fn parse_project_datum(cbor_hex: &str) -> ParsedProjectDatum { + let mut out = ParsedProjectDatum { + vendor_payment_key_hash: None, + vendor_info_error: None, + milestones: Vec::new(), + top_level_error: None, + }; + + let bytes = match hex::decode(cbor_hex).context("invalid hex in datum") { + Ok(b) => b, + Err(e) => { out.top_level_error = Some(format!("{:#}", e)); return out; } + }; + let datum: PlutusData = match pallas_codec::minicbor::decode(&bytes) + .context("failed to decode CBOR datum") { + Ok(d) => d, + Err(e) => { out.top_level_error = Some(format!("{:#}", e)); return out; } + }; // Top-level: Constr(0, [vendor_info, milestones_array]) - let top_fields = expect_constr(&datum, 0, "top-level datum")?; + let top_fields = match expect_constr(&datum, 0, "top-level datum") { + Ok(f) => f, + Err(e) => { out.top_level_error = Some(format!("{:#}", e)); return out; } + }; if top_fields.len() < 2 { - return Err(anyhow!( + out.top_level_error = Some(format!( "top-level datum has {} fields, expected 2", top_fields.len() )); + return out; } // Field 0: vendor info. Walk the subtree and collect every 28-byte @@ -72,24 +104,30 @@ pub fn parse_project_datum(cbor_hex: &str) -> anyhow::Result let mut hashes: Vec = Vec::new(); collect_key_hashes(&top_fields[0], &mut hashes); if hashes.is_empty() { - return Err(anyhow!("no 28-byte key hash found in vendor info")); + out.vendor_info_error = Some("no 28-byte key hash found in vendor info".to_string()); + } else { + out.vendor_payment_key_hash = Some(hashes.join(",")); } - let vendor_payment_key_hash = hashes.join(","); // Field 1: Array of milestone Constrs - let milestone_data_list = expect_array(&top_fields[1], "milestones array")?; - - let mut milestones = Vec::with_capacity(milestone_data_list.len()); - for (idx, ms_datum) in milestone_data_list.iter().enumerate() { - let ms = parse_milestone_datum(ms_datum, idx) - .with_context(|| format!("milestone {}", idx))?; - milestones.push(ms); + match expect_array(&top_fields[1], "milestones array") { + Ok(milestone_data_list) => { + out.milestones.reserve(milestone_data_list.len()); + for (idx, ms_datum) in milestone_data_list.iter().enumerate() { + let r = parse_milestone_datum(ms_datum, idx) + .with_context(|| format!("milestone {}", idx)) + .map_err(|e| format!("{:#}", e)); + out.milestones.push(r); + } + } + Err(e) => { + // Surface as a top-level error so the call site doesn't silently + // skip the milestones UPDATE loop. + out.top_level_error = Some(format!("{:#}", e)); + } } - Ok(ParsedProjectDatum { - vendor_payment_key_hash, - milestones, - }) + out } /// Parse a single milestone datum: Constr(0, [BigInt(time_limit), Map(value), Constr(0|1, [])]) @@ -297,17 +335,83 @@ mod tests { use super::*; #[test] - fn test_parse_empty_hex_fails() { - assert!(parse_project_datum("").is_err()); + fn test_parse_empty_hex_returns_top_level_error() { + let r = parse_project_datum(""); + assert!(r.top_level_error.is_some()); + assert!(r.vendor_payment_key_hash.is_none()); + assert!(r.milestones.is_empty()); + } + + #[test] + fn test_parse_invalid_hex_returns_top_level_error() { + let r = parse_project_datum("zzzz"); + assert!(r.top_level_error.is_some()); + } + + #[test] + fn test_parse_invalid_cbor_returns_top_level_error() { + let r = parse_project_datum("deadbeef"); + assert!(r.top_level_error.is_some()); + } + + #[test] + fn test_utxo_emi_0001_25_fixture_parses() { + // Real on-chain datum from project UTXO-EMI-0001-25 + // (tx 5849b0ec727e062ef2ee29076f0f5fcc72206081f40c2dc9cba604bca93c9e3c, output 0). + // Multi-key vendor info (Constr(1, [Array([Constr(0, [bytes28]), Constr(N, [bytes28])])])). + let hex = include_str!("../../tests/fixtures/utxo_emi_0001_25.hex").trim(); + let r = parse_project_datum(hex); + assert!(r.top_level_error.is_none(), "top-level error: {:?}", r.top_level_error); + assert!(r.vendor_info_error.is_none(), "vendor info error: {:?}", r.vendor_info_error); + let kh = r.vendor_payment_key_hash.expect("key hash"); + assert!(kh.contains(','), "expected multi-key (comma-joined), got {}", kh); + assert_eq!(r.milestones.len(), 5, "expected 5 milestones"); + for (i, m) in r.milestones.iter().enumerate() { + assert!(m.is_ok(), "milestone {} failed: {:?}", i, m); + } } #[test] - fn test_parse_invalid_hex_fails() { - assert!(parse_project_datum("zzzz").is_err()); + fn test_utxo_ec_0002_25_01_fixture_parses() { + // 16-milestone fund datum from UTXO-EC-0002-25-01 (largest variant). + let hex = include_str!("../../tests/fixtures/utxo_ec_0002_25_01.hex").trim(); + let r = parse_project_datum(hex); + assert!(r.top_level_error.is_none(), "top-level error: {:?}", r.top_level_error); + assert!(r.vendor_payment_key_hash.is_some()); + assert_eq!(r.milestones.len(), 16); + assert!(r.milestones.iter().all(|m| m.is_ok())); } #[test] - fn test_parse_invalid_cbor_fails() { - assert!(parse_project_datum("deadbeef").is_err()); + fn test_partial_parse_keeps_vendor_info_when_milestones_fail() { + // Hand-crafted datum: valid vendor info, milestones array contains a + // bogus milestone (tag 199 instead of 121). The partial parser should + // still surface the vendor key hash. + // Constr(0, [ + // Constr(0, [bytes(28)]), // vendor_info: single-key + // [Constr(199, [])] // milestones with one bad entry + // ]) + // tag 199 is not a valid Plutus constructor, so milestone parsing + // returns Err for that entry but the vendor info is still extracted. + let mut bytes = Vec::new(); + bytes.extend_from_slice(&[0xd8, 0x79, 0x9f]); // Constr(0, [ + bytes.extend_from_slice(&[0xd8, 0x79, 0x9f]); // Constr(0, [ + bytes.push(0x58); bytes.push(28); // bytes(28) + bytes.extend_from_slice(&[0xaa; 28]); + bytes.push(0xff); // ]) + bytes.push(0x9f); // [ + bytes.extend_from_slice(&[0xd9, 0x05, 0x06]); // tag 1286 (constructor 6 in extended range) + bytes.push(0x80); // [] + bytes.push(0xff); // ] + bytes.push(0xff); // ]) + + let hex = hex::encode(&bytes); + let r = parse_project_datum(&hex); + // Vendor info should succeed even though the milestone is malformed. + assert_eq!( + r.vendor_payment_key_hash.as_deref(), + Some("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") + ); + assert!(r.vendor_info_error.is_none()); } } diff --git a/api/src/services/event_processor.rs b/api/src/services/event_processor.rs index d12c976..81f83a6 100644 --- a/api/src/services/event_processor.rs +++ b/api/src/services/event_processor.rs @@ -455,36 +455,67 @@ impl EventProcessor { } } - // Parse inline datum for milestone amounts, time_limits, and vendor_payment_key_hash - // Uses the datum already fetched by get_script_utxo_for_tx (with pruning fallback) + // Parse inline datum for milestone amounts, time_limits, and vendor_payment_key_hash. + // Uses the datum already fetched by get_script_utxo_for_tx (with pruning fallback). + // + // The parser is partial — vendor info and each milestone parse independently. + // We persist whatever is Ok and stash any error string in `datum_parse_error` + // so failures are queryable in SQL. if let Some(datum_hex) = fund_inline_datum { - match crate::parsers::datum::parse_project_datum(&datum_hex) { - Ok(parsed) => { - // Store vendor_payment_key_hash - sqlx::query( - "UPDATE treasury.projects SET vendor_payment_key_hash = $1 WHERE id = $2" - ) - .bind(&parsed.vendor_payment_key_hash) - .bind(project_db_id) - .execute(&self.pool) - .await?; + let parsed = crate::parsers::datum::parse_project_datum(&datum_hex); - // Update milestones with datum data (amount, time_limit, paused). - // Skip withdrawn milestones — they are consumed on-chain, so the - // datum only contains entries for non-withdrawn milestones. - let milestone_rows: Vec<(i32,)> = sqlx::query_as( - "SELECT id FROM treasury.milestones WHERE project_db_id = $1 AND NOT archived AND NOT withdrawn ORDER BY milestone_order" - ) - .bind(project_db_id) - .fetch_all(&self.pool) - .await?; + // Project-level error column reflects either a top-level CBOR/shape error + // (no vendor_info, no milestones) or just the vendor-info error. + let project_err = parsed.top_level_error.clone() + .or_else(|| parsed.vendor_info_error.clone()); + + if let Some(ref e) = project_err { + tracing::warn!( + "Fund datum parse error for tx {} (project {}): {}", + event.tx_hash, project_id, e + ); + } + + sqlx::query( + r#" + UPDATE treasury.projects + SET vendor_payment_key_hash = COALESCE($1, vendor_payment_key_hash), + datum_parse_error = $2 + WHERE id = $3 + "# + ) + .bind(&parsed.vendor_payment_key_hash) + .bind(&project_err) + .bind(project_db_id) + .execute(&self.pool) + .await?; + + // Update milestones with datum data (amount, time_limit, paused). + // + // The FUND tx output's datum represents the *initial* project state — + // every milestone is non-withdrawn and present in original order. So + // we apply by `milestone_order` to ALL non-archived milestones, + // including ones now marked withdrawn by later events. Without this, + // a periodic re-run after withdrawals would skip the withdrawn rows + // and they would keep their NULL amount/time_limit forever. + if parsed.top_level_error.is_none() { + let milestone_rows: Vec<(i32,)> = sqlx::query_as( + "SELECT id FROM treasury.milestones WHERE project_db_id = $1 AND NOT archived ORDER BY milestone_order" + ) + .bind(project_db_id) + .fetch_all(&self.pool) + .await?; - for (datum_idx, (db_id,)) in milestone_rows.iter().enumerate() { - if let Some(ms_datum) = parsed.milestones.get(datum_idx) { + for (datum_idx, (db_id,)) in milestone_rows.iter().enumerate() { + match parsed.milestones.get(datum_idx) { + Some(Ok(ms_datum)) => { sqlx::query( r#" UPDATE treasury.milestones - SET amount_lovelace = $1, time_limit = $2, paused = $3 + SET amount_lovelace = $1, + time_limit = $2, + paused = $3, + datum_parse_error = NULL WHERE id = $4 "# ) @@ -495,22 +526,43 @@ impl EventProcessor { .execute(&self.pool) .await?; } + Some(Err(err)) => { + tracing::warn!( + "Milestone {} datum parse error for tx {}: {}", + datum_idx, event.tx_hash, err + ); + sqlx::query( + "UPDATE treasury.milestones SET datum_parse_error = $1 WHERE id = $2" + ) + .bind(err) + .bind(db_id) + .execute(&self.pool) + .await?; + } + None => {} // datum has fewer entries than DB has milestones } - - // Store raw CBOR on the UTXO tracking row - sqlx::query( - "UPDATE treasury.utxo_history SET inline_datum_cbor = $1 WHERE tx_hash = $2 AND project_db_id = $3" - ) - .bind(&datum_hex) - .bind(&event.tx_hash) - .bind(project_db_id) - .execute(&self.pool) - .await?; - } - Err(e) => { - tracing::debug!("Could not parse fund datum for {}: {}", event.tx_hash, e); } } + + // Store raw CBOR on the UTXO tracking row, but only if we have a + // *better* datum than what's already stored. The trigger and + // pre_fetch may have captured the larger original datum already; + // overwriting with a shorter one (e.g., a re-fetch that picked + // a sibling change output) would corrupt the project's saved + // datum. Preserve the longest one we've seen. + sqlx::query( + r#" + UPDATE treasury.utxo_history + SET inline_datum_cbor = $1 + WHERE tx_hash = $2 AND project_db_id = $3 + AND (inline_datum_cbor IS NULL OR length($1) > length(inline_datum_cbor)) + "# + ) + .bind(&datum_hex) + .bind(&event.tx_hash) + .bind(project_db_id) + .execute(&self.pool) + .await?; } Ok(()) @@ -1306,9 +1358,22 @@ impl EventProcessor { /// Fetch script UTXO data (address, lovelace_amount, inline_datum) for a transaction. /// Tries yaci_store.address_utxo first, falls back to pre-fetched treasury.utxo_history. + /// + /// Ordering: prefer the addr1x output with the LARGEST inline_datum. Fund txs + /// can produce multiple script outputs — typically a vendor-contract output + /// carrying the project datum (kilobytes) plus a treasury-contract change + /// output carrying a trivial `Constr(0, [])` datum (3 bytes). Picking the + /// larger datum reliably selects the vendor contract output without needing + /// to know its address up front. async fn get_script_utxo_for_tx(&self, tx_hash: &str) -> anyhow::Result<(Option, Option, Option)> { let result: Option<(String, Option, Option)> = sqlx::query_as( - "SELECT owner_addr, lovelace_amount, inline_datum FROM yaci_store.address_utxo WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' LIMIT 1" + r#" + SELECT owner_addr, lovelace_amount, inline_datum + FROM yaci_store.address_utxo + WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' + ORDER BY length(COALESCE(inline_datum, '')) DESC + LIMIT 1 + "# ) .bind(tx_hash) .fetch_optional(&self.pool) @@ -1320,7 +1385,13 @@ impl EventProcessor { // Fallback to pre-fetched treasury.utxo_history let result: Option<(Option, Option, Option)> = sqlx::query_as( - "SELECT address, lovelace_amount, inline_datum_cbor FROM treasury.utxo_history WHERE tx_hash = $1 AND address LIKE 'addr1x%' LIMIT 1" + r#" + SELECT address, lovelace_amount, inline_datum_cbor + FROM treasury.utxo_history + WHERE tx_hash = $1 AND address LIKE 'addr1x%' + ORDER BY length(COALESCE(inline_datum_cbor, '')) DESC + LIMIT 1 + "# ) .bind(tx_hash) .fetch_optional(&self.pool) @@ -1385,48 +1456,57 @@ impl EventProcessor { }; if let Some(datum_hex) = inline_datum { - match crate::parsers::datum::parse_project_datum(&datum_hex) { - Ok(parsed) => { - // Get non-withdrawn milestones ordered by milestone_order. - // Withdrawn milestones are consumed on-chain, so the datum only - // contains entries for non-withdrawn milestones. We must skip - // withdrawn rows to keep datum indices aligned with DB rows. - let milestone_ids: Vec<(i32,)> = sqlx::query_as( - "SELECT id FROM treasury.milestones WHERE project_db_id = $1 AND NOT archived AND NOT withdrawn ORDER BY milestone_order" - ) - .bind(project_db_id) - .fetch_all(&self.pool) - .await?; + let parsed = crate::parsers::datum::parse_project_datum(&datum_hex); - for (datum_idx, (db_id,)) in milestone_ids.iter().enumerate() { - if let Some(ms_datum) = parsed.milestones.get(datum_idx) { - sqlx::query( - "UPDATE treasury.milestones SET paused = $1 WHERE id = $2" - ) - .bind(ms_datum.paused) - .bind(db_id) - .execute(&self.pool) - .await?; - } - } + if let Some(ref e) = parsed.top_level_error { + tracing::warn!( + "Pause/resume datum parse error for tx {}: {}", + tx_hash, e + ); + return Ok(()); + } - // Update contract-level status: paused if ALL milestones paused - let all_paused = parsed.milestones.iter().all(|m| m.paused); - let any_paused = parsed.milestones.iter().any(|m| m.paused); - if all_paused && !parsed.milestones.is_empty() { - sqlx::query("UPDATE treasury.projects SET status = 'paused' WHERE id = $1") - .bind(project_db_id) - .execute(&self.pool) - .await?; - } else if !any_paused { - sqlx::query("UPDATE treasury.projects SET status = 'active' WHERE id = $1") - .bind(project_db_id) - .execute(&self.pool) - .await?; - } + // Get non-withdrawn milestones ordered by milestone_order. + // Withdrawn milestones are consumed on-chain, so the datum only + // contains entries for non-withdrawn milestones. We must skip + // withdrawn rows to keep datum indices aligned with DB rows. + let milestone_ids: Vec<(i32,)> = sqlx::query_as( + "SELECT id FROM treasury.milestones WHERE project_db_id = $1 AND NOT archived AND NOT withdrawn ORDER BY milestone_order" + ) + .bind(project_db_id) + .fetch_all(&self.pool) + .await?; + + for (datum_idx, (db_id,)) in milestone_ids.iter().enumerate() { + if let Some(Ok(ms_datum)) = parsed.milestones.get(datum_idx) { + sqlx::query( + "UPDATE treasury.milestones SET paused = $1 WHERE id = $2" + ) + .bind(ms_datum.paused) + .bind(db_id) + .execute(&self.pool) + .await?; } - Err(e) => { - tracing::debug!("Could not parse datum for pause/resume: {}", e); + } + + // Update contract-level status: paused if ALL milestones paused. + // Only consider successfully-parsed milestones; if any failed to + // parse we can't trust the all/any predicate and skip the update. + let parsed_ms: Vec<&crate::parsers::datum::ParsedMilestoneDatum> = + parsed.milestones.iter().filter_map(|m| m.as_ref().ok()).collect(); + if !parsed_ms.is_empty() && parsed_ms.len() == parsed.milestones.len() { + let all_paused = parsed_ms.iter().all(|m| m.paused); + let any_paused = parsed_ms.iter().any(|m| m.paused); + if all_paused { + sqlx::query("UPDATE treasury.projects SET status = 'paused' WHERE id = $1") + .bind(project_db_id) + .execute(&self.pool) + .await?; + } else if !any_paused { + sqlx::query("UPDATE treasury.projects SET status = 'active' WHERE id = $1") + .bind(project_db_id) + .execute(&self.pool) + .await?; } } } diff --git a/api/src/services/sync.rs b/api/src/services/sync.rs index 1738a31..13555a5 100644 --- a/api/src/services/sync.rs +++ b/api/src/services/sync.rs @@ -53,7 +53,27 @@ pub async fn run_sync_loop(pool: PgPool) { tracing::info!("Initial sync complete. Starting continuous sync loop."); - // Continuous sync loop + // Periodic full re-sync (every 10 minutes) as a belt-and-braces safety net + // for KI-VND-01 / KI-MIL-01 / KI-EVT-01-residual / KI-SY-02. The cold-resync + // race that leaves UTXO-* fund datums NULL on first pass is invisible to the + // 15s incremental loop because it never re-visits already-processed slots; + // sync_all_events re-runs every fund event and the idempotent + // ON CONFLICT DO UPDATE chain backfills missing fields. + let pool_for_full_sync = pool.clone(); + tokio::spawn(async move { + let processor = EventProcessor::new(pool_for_full_sync); + // First periodic run after a short delay so we don't double up with + // the initial sync above. + tokio::time::sleep(Duration::from_secs(60)).await; + loop { + if let Err(e) = processor.sync_all_events().await { + tracing::error!("Periodic full-sync failed (non-fatal): {}", e); + } + tokio::time::sleep(Duration::from_secs(600)).await; + } + }); + + // Continuous sync loop (15s incremental) loop { tokio::time::sleep(Duration::from_secs(15)).await; @@ -113,19 +133,36 @@ async fn sync_new_events(pool: &PgPool, processor: &EventProcessor) -> anyhow::R tracing::warn!("UTXO pre-fetch failed (non-fatal): {}", e); } + // Track the watermark as the slot of the LAST CONTIGUOUSLY-SUCCESSFUL row. + // If a row fails, every later row in this batch — even successful ones — + // does NOT advance the watermark, so retry on the next tick will revisit + // them. Closes KI-SY-02: previously a later success bumped the watermark + // past a failed earlier row, silently losing it. + // + // Cost: a permanently-failing event wedges the loop at its slot until an + // operator fixes it. That's intentional — visible stall beats silent loss. let mut last_processed_slot = last_slot; let mut last_processed_tx = String::new(); let mut last_block = 0i64; + let mut hole_seen = false; for row in rows { - if let Err(e) = processor.process_event(&row).await { - tracing::error!("Failed to process event {}: {}", row.tx_hash, e); - continue; + match processor.process_event(&row).await { + Err(e) => { + tracing::error!( + "Failed to process event {} at slot {:?}: {:#}", + row.tx_hash, row.slot, e + ); + hole_seen = true; + } + Ok(()) => { + if !hole_seen { + last_processed_slot = row.slot.unwrap_or(last_processed_slot); + last_block = row.block_number.unwrap_or(last_block); + last_processed_tx = row.tx_hash.clone(); + } + } } - - last_processed_slot = row.slot.unwrap_or(last_processed_slot); - last_block = row.block_number.unwrap_or(last_block); - last_processed_tx = row.tx_hash.clone(); } // Update sync status diff --git a/api/tests/fixtures/utxo_ec_0002_25_01.hex b/api/tests/fixtures/utxo_ec_0002_25_01.hex new file mode 100644 index 0000000..9818f60 --- /dev/null +++ b/api/tests/fixtures/utxo_ec_0002_25_01.hex @@ -0,0 +1 @@ +d8799fd87a9f9fd8799f581c33afc56ecef7fc370f59d5574416826d6bd3d1f88e0f449ed5ae79f5ffd87f9f581ccfc13c3728f4dd600a33f4e977aa0168eaf2ffb3474826fdd90af37effffff9fd8799f1b0000019a37905c18a140a1401b000000d86a846f00d87a80ffd8799f1b0000019de0d5c418a140a1401b000000d86a846f00d87980ffd8799f1b0000019fb5787818a140a1401b000000d86a846f00d87980ffd8799f1b000001a18f418818a140a1401b000000d86a846f00d87980ffd8799f1b0000019c11596c18a140a1401b0000016f405f8740d87980ffd8799f1b0000019fb5787818a140a1401b0000016f405f8740d87980ffd8799f1b0000019fb5787818a140a1401b0000016f406ec980d87980ffd8799f1b0000019a37905c18a140a1401b00000078a0bfcd40d87a80ffd8799f1b0000019ca6b1d818a140a1401b00000078a0bfcd40d87980ffd8799f1b0000019fb5787818a140a1401b00000078a0cf0f80d87980ffd8799f1b0000019a37905c18a140a1401b00000226e096ec00d87a80ffd8799f1b0000019ad7358018a140a1401b00000226e096ec00d87a80ffd8799f1b0000019b71b44818a140a1401b00000226e096ec00d87a80ffd8799f1b0000019c11596c18a140a1401b00000226e096ec00d87980ffd8799f1b0000019c11596c18a140a1401b00000226e096ec00d87980ffd8799f1b0000019fb5787818a140a1401b00000226e096ec00d87980ffffff diff --git a/api/tests/fixtures/utxo_emi_0001_25.hex b/api/tests/fixtures/utxo_emi_0001_25.hex new file mode 100644 index 0000000..7f01400 --- /dev/null +++ b/api/tests/fixtures/utxo_emi_0001_25.hex @@ -0,0 +1 @@ +d8799fd87a9f9fd8799f581cef8374e8b6b05099c6f9b595bf5e849a10daa2080e68c4a4745c28e1ffd87f9f581c038fbe947fc62c66869340f58069cc9e93a4cb520eb17d76aaada264ffffff9fd8799f1b0000019881d3d400a140a1401b000000f03c128e00d87980ffd8799f1b0000019c0c331400a140a1401b000000f03c128e00d87980ffd8799f1b0000019c0c331400a140a1401b000000f03c128e00d87980ffd8799f1b000001a363e44000a140a1401b000000f03c128e00d87980ffd8799f1b000001a363e44000a140a1401b000000f03c128e00d87980ffffff diff --git a/api/tests/fixtures/utxo_er_0001_25.hex b/api/tests/fixtures/utxo_er_0001_25.hex new file mode 100644 index 0000000..dbcec29 --- /dev/null +++ b/api/tests/fixtures/utxo_er_0001_25.hex @@ -0,0 +1 @@ +d8799fd87a9f9fd8799f581cb6ab16a52a4e4ae64a2492b1cc928683e65d7e09bc9c9a73be81c3efffd87f9f581ca5b3687601f904254c31b9c0b29b7dea163ab31ad62f492b7b264bfeffffff9fd8799f1b000001999d119418a140a1401b0000055c89618600d87a80ffd8799f1b000001999d119418a140a1401b000006d80cf3b200d87a80ffd8799f1b0000019c11596c18a140a1401b0000055c89618600d87980ffd8799f1b0000019c11596c18a140a1401b000006d80cf3b200d87980ffffff diff --git a/database/init/02-treasury-schema.sql b/database/init/02-treasury-schema.sql index 5589a18..01b3461 100644 --- a/database/init/02-treasury-schema.sql +++ b/database/init/02-treasury-schema.sql @@ -47,12 +47,13 @@ CREATE TABLE IF NOT EXISTS treasury.projects ( description TEXT, -- Project description (joined if array) vendor_address TEXT, -- Payment destination (vendor.label in metadata) contract_address TEXT, -- PSSC script address (from fund tx output) - vendor_payment_key_hash VARCHAR(56), + vendor_payment_key_hash TEXT, -- Comma-joined hex hashes; multi-party datums produce multiple fund_tx_hash VARCHAR(64) NOT NULL, -- Fund transaction fund_slot BIGINT, -- Blockchain slot fund_block_time BIGINT, -- Block timestamp initial_amount_lovelace BIGINT, -- Initial funding amount (from tx output) status TEXT DEFAULT 'active', -- active/paused/completed/cancelled + datum_parse_error TEXT, -- Set when fund datum parse failed; cleared on success created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); @@ -93,6 +94,9 @@ CREATE TABLE IF NOT EXISTS treasury.milestones ( archived_at BIGINT, superseded_by INT REFERENCES treasury.milestones(id), + -- Datum parse diagnostics (per-milestone) + datum_parse_error TEXT, + created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); diff --git a/database/schema/treasury.sql b/database/schema/treasury.sql index 5589a18..01b3461 100644 --- a/database/schema/treasury.sql +++ b/database/schema/treasury.sql @@ -47,12 +47,13 @@ CREATE TABLE IF NOT EXISTS treasury.projects ( description TEXT, -- Project description (joined if array) vendor_address TEXT, -- Payment destination (vendor.label in metadata) contract_address TEXT, -- PSSC script address (from fund tx output) - vendor_payment_key_hash VARCHAR(56), + vendor_payment_key_hash TEXT, -- Comma-joined hex hashes; multi-party datums produce multiple fund_tx_hash VARCHAR(64) NOT NULL, -- Fund transaction fund_slot BIGINT, -- Blockchain slot fund_block_time BIGINT, -- Block timestamp initial_amount_lovelace BIGINT, -- Initial funding amount (from tx output) status TEXT DEFAULT 'active', -- active/paused/completed/cancelled + datum_parse_error TEXT, -- Set when fund datum parse failed; cleared on success created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); @@ -93,6 +94,9 @@ CREATE TABLE IF NOT EXISTS treasury.milestones ( archived_at BIGINT, superseded_by INT REFERENCES treasury.milestones(id), + -- Datum parse diagnostics (per-milestone) + datum_parse_error TEXT, + created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); diff --git a/docs/event-processing.md b/docs/event-processing.md index 840be82..069f2bf 100644 --- a/docs/event-processing.md +++ b/docs/event-processing.md @@ -208,19 +208,22 @@ Additionally queries `yaci_store.address_utxo` for the fund tx to get: **Treasury address fallback**: If the treasury `contract_address` is still null, derives it from the fund tx inputs by finding the `addr1x%` input address that differs from the vendor contract output. Also derives `stake_credential` from the treasury address via bech32 decoding. -**Datum integration**: After UTXO recording, queries `inline_datum` from the fund tx output (`addr1x%` address). If available, parses the CBOR datum via `parse_vendor_contract_datum()` to: -- Store `vendor_payment_key_hash` on the vendor contract row -- Update each milestone's `amount_lovelace`, `time_limit`, and `paused` flag from the datum (overwriting metadata-provided amounts with authoritative on-chain values) -- Store raw CBOR hex on the UTXO tracking row (`inline_datum_cbor`) +**Datum integration**: After UTXO recording, queries `inline_datum` from the fund tx's largest `addr1x%` script output (ordered by datum length DESC to avoid picking the trivial change-output datum). If available, parses the CBOR datum via `parse_project_datum()` to: +- Store `vendor_payment_key_hash` (TEXT, comma-joined for multi-key datums) on the project row +- Update each milestone's `amount_lovelace`, `time_limit`, and `paused` flag from the datum (overwriting metadata-provided amounts with authoritative on-chain values). Updates by `milestone_order` regardless of current `withdrawn` flag — the fund datum represents initial state. +- Store raw CBOR hex on the UTXO tracking row (`inline_datum_cbor`), but only if the new datum is longer than what's already stored (preserves originals against later corrupting overwrites). + +The parser is partial: vendor info and each milestone parse independently. Errors land in `treasury.projects.datum_parse_error` and `treasury.milestones.datum_parse_error`. #### DB Writes - **UPSERT** `treasury.treasury_contracts` (ensure exists) -- **INSERT** `treasury.vendor_contracts` (ON CONFLICT by `project_id` updates name/description) -- **INSERT** `treasury.milestones` (one per milestone, ON CONFLICT DO NOTHING) +- **UPSERT** `treasury.vendor_contracts` (singleton PSSC row at the shared script address) +- **INSERT** `treasury.projects` (ON CONFLICT by `project_id` updates `project_name`/`description`) +- **INSERT** `treasury.milestones` (one per milestone, ON CONFLICT DO NOTHING on active key) - **INSERT** `treasury.events` -- **INSERT** `treasury.utxos` (record output UTXOs for chain tracking, with `inline_datum_cbor` if available) -- **UPDATE** `treasury.vendor_contracts` — sets `vendor_payment_key_hash` (from datum, if available) -- **UPDATE** `treasury.milestones` — sets `amount_lovelace`, `time_limit`, `paused` per milestone (from datum, if available) +- **UPSERT** `treasury.utxo_history` (record output UTXOs for chain tracking, with `inline_datum_cbor` if available) +- **UPDATE** `treasury.projects` — sets `vendor_payment_key_hash` and `datum_parse_error` (from datum, if available) +- **UPDATE** `treasury.milestones` — sets `amount_lovelace`, `time_limit`, `paused` per milestone, plus `datum_parse_error` for individual failures --- @@ -587,19 +590,21 @@ Constr(0, [ | Context | Function | What happens | |---------|----------|-------------| -| `fund` event | `parse_vendor_contract_datum()` | Populates `vendor_payment_key_hash`, per-milestone `amount_lovelace`, `time_limit`, `paused` | -| `pause` event | `update_milestone_pause_from_datum()` | Updates per-milestone `paused` flags, derives contract status | -| `resume` event | `update_milestone_pause_from_datum()` | Updates per-milestone `paused` flags, derives contract status | -| UTXO chain tracking | `find_vendor_contract_from_inputs()` | Stores `inline_datum_cbor` on new UTXO rows for later use | +| `fund` event | `parse_project_datum()` | Populates `vendor_payment_key_hash`, per-milestone `amount_lovelace`, `time_limit`, `paused` | +| `pause` event | `update_milestone_pause_from_datum()` | Updates per-milestone `paused` flags, derives project status | +| `resume` event | `update_milestone_pause_from_datum()` | Updates per-milestone `paused` flags, derives project status | +| UTXO chain tracking | `find_project_from_inputs()` | Stores `inline_datum_cbor` on new UTXO rows for later use | ### Fields Extracted | Datum Field | DB Column | Table | |-------------|-----------|-------| -| `vendor_payment_key_hash` | `vendor_payment_key_hash` | `vendor_contracts` | +| Vendor info key hashes (comma-joined for multi-key) | `vendor_payment_key_hash` | `projects` | | Per-milestone `time_limit` | `time_limit` | `milestones` | | Per-milestone lovelace from Value map | `amount_lovelace` | `milestones` | | Per-milestone `Constr(0\|1)` | `paused` | `milestones` | +| Parse failures (top-level or vendor-info) | `datum_parse_error` | `projects` | +| Per-milestone parse failures | `datum_parse_error` | `milestones` | ### Prerequisite diff --git a/docs/known-issues.md b/docs/known-issues.md index 5ef0504..cf22d85 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -1,15 +1,44 @@ # Known issues — data quality and behavioural quirks -> **Last refreshed:** 2026-05-01 against commit `097c5d3`. -> Counts come from the local DB after a clean sync; rerun the per-entry repro -> SQL for fresh numbers. Production parity is checked via -> `bash scripts/compare_events.sh` (target: `0 deployed-only`). +> **Last refreshed:** 2026-05-02 (post five-bug-cascade fix; see KI-VND-01) +> against commit `6db1581`+. Counts come from the local DB after the fix +> landed. Rerun the per-entry repro SQL for fresh numbers. > -> **Recent resolutions:** the historical-UTXO trigger (KI-UTX-01), -> multi-key datum parsing (KI-VND-01 / KI-MIL-01), milestone-id ordinal -> normalisation (KI-OC-01), and the `vendor_name` / `contract_url` column -> drops (KI-VND-02 / KI-VND-03) all landed in this revision. Entries -> below show their post-fix state. +> **Verified resolved this session:** +> - **KI-VND-01** — `vendor_payment_key_hash` NULL: **10/42 → 1/42** +> (the 1 is a data-corruption casualty; see KI-VND-05). +> - **KI-MIL-01 (datum-derived)** — NULL `amount_lovelace`/`time_limit`: +> **136/386 → 16/364** (8 from KI-VND-05 corruption, 8 from KI-MOD-01 +> modify-event gap). +> - **KI-EVT-01-residual** — partially resolved; the 4 remaining NULL +> `project_db_id` events trace to KI-VND-05's corrupted projects. +> - **KI-SY-02** — Phase 1 (contiguous-success watermark) shipped. +> - **KI-VND-04**, **KI-CR-01**, **KI-UTX-03** — all confirmed clean. +> +> **Five distinct bugs were the cause of KI-VND-01** (not the suspected +> single parser-strictness defect): +> 1. Sync race during cold catch-up (`sync_all_events` only ran once at +> startup; race with yaci_store's address_utxo ingestion meant fund +> datums weren't visible at process-time). +> 2. `vendor_payment_key_hash VARCHAR(56)` rejected the 113-char +> multi-key hash from UTXO-* projects. +> 3. `get_script_utxo_for_tx` LIMIT 1 with no ORDER BY picked the +> smaller change/treasury output (`d87980`, 3 bytes) instead of the +> real vendor-contract output (kilobytes). +> 4. `process_fund`'s seed-UTXO datum UPDATE blindly overwrote the +> captured good datum with the bad one when bug #3 fired. +> 5. `process_fund`'s milestone-update loop filtered `NOT withdrawn`, +> breaking index alignment with the fund datum (which always +> represents initial state) on periodic re-runs. +> +> **Schema refactor note:** project-level columns moved out of +> `treasury.vendor_contracts` into `treasury.projects`. Milestones and +> events FK to `projects.id` via `project_db_id`. `treasury.utxos` was +> removed in favour of `treasury.utxo_history`. +> +> **Still open:** KI-OC-02 (on-chain limitation, can't fix), KI-VND-05 +> (2 corrupted-datum projects requiring true cold resync), KI-MOD-01 +> (modify-event milestones don't pick up datum updates). ## How to use this doc @@ -59,28 +88,148 @@ FROM treasury.treasury_contracts; --- -### A.2 `treasury.vendor_contracts` - -#### KI-VND-01 — `vendor_payment_key_hash` NULL when datum parse fails *(RESOLVED)* -- **Resolved by:** parser rewrite in `api/src/parsers/datum.rs::parse_vendor_contract_datum`. - The vendor-info field is now traversed by `collect_key_hashes`, which walks - the subtree and gathers every 28-byte `BoundedBytes` (Cardano key-hash size). - Single-key (`m-N`) format yields one hash; the multi-party - `Constr(1, [(Constr(0, [bytes]), Constr(N, [bytes]))])` format used by the - `UTXO-*` projects yields multiple hashes joined with `,`. -- **Status:** all `UTXO-*` projects now record their key hashes after a fresh - sync. Run the repro to confirm. - -**Repro query** +### A.2 `treasury.projects` (formerly project-level cols on `vendor_contracts`) + +#### KI-VND-01 — `vendor_payment_key_hash` NULL on `UTXO-*` projects *(RESOLVED — five-bug cascade fixed)* + +The original "10/42 NULL" symptom turned out to be a cascade of five +separate bugs, not the single parser-strictness defect the previous +analysis suspected. The parser was always correct on real CBOR (proven +by three new fixture tests in `api/src/parsers/datum.rs`); a postgres +column-width error in the `UPDATE` step was being swallowed by an +all-or-nothing `match` and a misleading DEBUG-level log. + +##### The five bugs and their fixes + +1. **Sync race during cold catch-up** — `sync_all_events` ran once at + API startup. During catch-up, `yaci_store.transaction_metadata` was + visible to the API before the matching `address_utxo` row, so + `get_script_utxo_for_tx` returned `None` at fund-time and the datum + lookup never happened. Once yaci_store caught up, the trigger + captured the datum into `treasury.utxo_history` — but `process_fund` + wasn't re-run. + **Fix:** added a separate `tokio::spawn` task in `sync.rs` running + `sync_all_events` every 10 minutes. The idempotent `ON CONFLICT DO + UPDATE` chain backfills as soon as yaci_store catches up. +2. **`vendor_payment_key_hash` column too narrow** — `VARCHAR(56)` + rejected the 113-char joined multi-key hash from UTXO-* projects + (`hash1,hash2`) with `value too long for type character varying(56)`. + The all-or-nothing `match parse_project_datum() { Ok => …; Err => + debug!(…) }` swallowed the error. + **Fix:** widened to `TEXT` in `database/schema/treasury.sql`, + `database/init/02-treasury-schema.sql`, plus an `ALTER TABLE` against + the live DB. +3. **`get_script_utxo_for_tx` picked the wrong UTXO** — `LIKE 'addr1x%' + LIMIT 1` with no `ORDER BY` could return the change/treasury output + carrying an empty `Constr(0, [])` datum (`d87980`, 3 bytes) instead + of the vendor-contract output with the actual project datum + (kilobytes). On fund txs that produce two `addr1x*` outputs (vendor + contract + treasury change), this was nondeterministic. + **Fix:** `ORDER BY length(COALESCE(inline_datum, '')) DESC` — the + largest datum reliably points to the vendor contract output. +4. **`process_fund` overwrote the captured datum** — when bug #3 fired, + the `UPDATE treasury.utxo_history SET inline_datum_cbor = $1` at the + end of `process_fund` blindly wrote the bad 3-byte datum over a + previously-captured 1.3kB good datum. Once corrupted and yaci_store + pruned the source, recovery required a true cold resync. + **Fix:** `WHERE inline_datum_cbor IS NULL OR length($1) > + length(inline_datum_cbor)` — only overwrite with a *better* datum. +5. **`process_fund` filtered `NOT withdrawn`** — the milestone-update + loop selected only non-withdrawn rows. Fine on first run, but on a + periodic re-run after some milestones became withdrawn, index + alignment between the (full, fund-time) datum array and the + (filtered, current-state) DB rows broke, leaving the now-withdrawn + milestones permanently NULL. + **Fix:** removed `AND NOT withdrawn` from the select. The fund tx's + datum represents *initial* state; we always update by + `milestone_order` regardless of current withdrawn flag. + +##### Defensive hardening also landed + +- **Partial parser** — `parse_project_datum` now returns + `ParsedProjectDatum { vendor_payment_key_hash: Option, + vendor_info_error: Option, milestones: Vec>, + top_level_error: Option }` so vendor info persists even when + individual milestones fail to parse. +- **`datum_parse_error TEXT`** columns added to `treasury.projects` and + `treasury.milestones` for SQL-queryable diagnostics. +- **`tracing::debug!` → `tracing::warn!`** for parse failures so they + appear in default logs. +- **Three real-CBOR fixture tests** in `api/src/parsers/datum.rs` + (UTXO-EMI-0001-25, UTXO-EC-0002-25-01, partial-parse smoke test). + +##### Verified counts (after fix landed + 2 sync_all_events runs) + +| Metric | Before | After | +|---|---:|---:| +| `treasury.projects` NULL `vendor_payment_key_hash` | 10 / 42 | **1 / 42** | +| `treasury.projects.datum_parse_error` set | n/a | **2 / 42** | +| `treasury.milestones` NULL `amount_lovelace` (active) | 136 / 386 | **16 / 364** | + +The remaining 1 NULL key hash + 16 NULL milestone amounts are +concentrated in the 2 projects flagged by KI-VND-05 (data-corruption +casualties of bug #4 before it was fixed) and 1 project surfaced by +KI-MOD-01 (modify events create new milestone rows that don't pick up +the new contract output's datum). + +##### Repro queries ```sql -SELECT project_id, fund_tx_hash -FROM treasury.vendor_contracts -WHERE vendor_payment_key_hash IS NULL +SELECT project_id, fund_tx_hash, datum_parse_error +FROM treasury.projects +WHERE vendor_payment_key_hash IS NULL OR datum_parse_error IS NOT NULL ORDER BY project_id; + +SELECT p.project_id, COUNT(*) AS missing +FROM treasury.milestones m JOIN treasury.projects p ON p.id = m.project_db_id +WHERE NOT m.archived AND m.amount_lovelace IS NULL +GROUP BY p.project_id ORDER BY 2 DESC; ``` -**Current count:** 10 / 42 vendor contracts. +#### KI-VND-05 — Datum corruption from prior bug #4 *(OPEN — requires cold resync to recover)* +- **Affected:** `UTXO-EC-0002-25-03` (fund tx `b39d013c…`) and + `EC-0013(1,2,7)-25` (fund tx `5bc5a75e…`). Their + `treasury.utxo_history.inline_datum_cbor` is currently `d87980` (6 + bytes — empty `Constr(0, [])`) instead of the original kilobyte-scale + project datum. +- **Why:** before bug #4 was fixed, a periodic re-run of `process_fund` + picked the wrong UTXO (bug #3) and overwrote the good captured datum + with the empty change-output datum (bug #4). yaci_store has since + pruned the original outputs, so the datum can't be re-fetched from + the local DB. +- **Recovery:** wipe the postgres volume and re-sync from + `STORE_CARDANO_SYNC_START_SLOT`. The triggers (KI-UTX-01) capture + the original outputs before pruning, and the now-fixed `process_fund` + preserves them. + ```bash + ./dev.sh stop + docker volume rm administration-data_postgres_data + ./dev.sh start + ``` +- **Impact if not run:** 8 + 8 = 16 active milestones permanently NULL + on `amount_lovelace`/`time_limit`/`paused`. Production deployments + that ran continuously while bug #4 was active are likely also + affected; check + `SELECT project_id FROM treasury.projects WHERE datum_parse_error LIKE 'top-level datum has 0 fields%'`. + +#### KI-MOD-01 — `modify` events create milestones with NULL datum fields *(OPEN — small follow-up)* +- **Pattern:** when a `modify` event archives a milestone and creates a + replacement (often with a new `MS-N` ID), the new row's + `amount_lovelace` / `time_limit` / `paused` come out NULL because + `process_modify` doesn't re-parse the modify-tx's output datum to + populate them. +- **Currently affected:** 8 active milestones in `UTXO-EC-0002-25-04` + (IDs MS-5, MS-6, MS-8, MS-9, MS-12, MS-13, MS-17, MS-18 — all created + by modify events; gaps imply earlier IDs were modified out). +- **Why this is separate from KI-VND-01:** the fund datum *did* parse + successfully for this project; the issue is exclusively in + `process_modify` which doesn't run the datum-update path that + `process_fund` does. +- **Proposed fix (small):** at the end of `process_modify`, look up the + modify tx's output datum via the same mechanism `process_fund` uses + (`get_script_utxo_for_tx` + `parse_project_datum`) and run the + milestone-update loop. Matching by `milestone_order` should align — + the modified contract's datum reflects current state. #### KI-VND-02 — `vendor_name` (deprecated) *(RESOLVED)* - Column dropped from `treasury.vendor_contracts`, models, routes and views. @@ -88,48 +237,47 @@ ORDER BY project_id; #### KI-VND-03 — `contract_url` (deprecated) *(RESOLVED)* - Column dropped from `treasury.vendor_contracts`, models, routes and views. -#### KI-VND-04 — `contract_address` NULL on cold replay *(RESOLVED)* +#### KI-VND-04 — `contract_address` NULL on cold replay *(RESOLVED — verified by 2026-05-02 cold resync)* - **Resolved by:** the `treasury.utxo_history` table + Postgres trigger on `yaci_store.address_utxo` (see KI-UTX-01). Every script-address UTXO is now captured synchronously inside YACI Store's INSERT, so pruning never has a chance to wipe it before we read it. +- **Verified:** with the trigger armed before YACI Store ingestion, a fresh + cold sync from `STORE_CARDANO_SYNC_START_SLOT` produces 0 NULL + `contract_address` across all 42 projects. **Repro query** ```sql SELECT project_id, fund_tx_hash -FROM treasury.vendor_contracts +FROM treasury.projects WHERE contract_address IS NULL; ``` +**Current count:** 0 / 42. + --- ### A.3 `treasury.milestones` -#### KI-MIL-01 — `amount_lovelace` / `time_limit` / `label` / `acceptance_criteria` NULL together *(RESOLVED for the parser part)* -- **Resolved by:** the same datum-parser rewrite as KI-VND-01. The - `UTXO-*` projects now decode correctly so milestones get - `amount_lovelace`, `time_limit`, and `paused` populated. -- **Note:** `label` and `acceptance_criteria` come from the metadata fields - rather than the datum, so they're populated independently. The label - extractor (`extract_milestone_label_description`, - `event_processor.rs:1419`) now falls back to the first line of - `description` when `acceptanceCriteria` is missing — fixes label NULLs - for `UTXO-*` projects whose metadata uses `description` only. - -The original analysis is preserved below for context. - - -- **Why correlated:** all four come from the fund event metadata + datum. - Projects whose fund metadata uses a milestones-array with bare descriptions - (no `label`, no `acceptanceCriteria`, no `amount`, no parseable datum) - produce milestones where every derived field is NULL except `description` - (which comes from the metadata field directly via - `extract_text_from_value`). -- **Currently affected:** 136 / 386 active milestones (35%) — entirely - concentrated in the 10 `UTXO-*` projects from KI-VND-01: - - | project_id | NULL `label` count | total milestones | +#### KI-MIL-01 — milestone field NULLs across the four sub-fields +- **`label`** *(RESOLVED)* — description fallback in + `extract_milestone_label_description` covers the missing + `acceptanceCriteria` case. **0 / 364 active milestones NULL.** +- **`amount_lovelace` / `time_limit`** *(LARGELY RESOLVED — see KI-VND-01)* — + was 136/386, now 16/364: + - 8 from `UTXO-EC-0002-25-03` (KI-VND-05 corruption) + - 8 from `UTXO-EC-0002-25-04` (KI-MOD-01 modify-event gap) +- **`acceptance_criteria`** *(NOT A BUG — correct on-chain truth)* — the + remaining NULLs reflect the actual fund metadata. UTXO-* projects + emit milestones as `{identifier: "MS-N", description: …}` with no + `acceptanceCriteria` key (verified against `5849b0ec…`'s + `transaction_metadata.body`). Leave the column NULL — do not invent + a fallback. + +##### Per-project breakdown (NULL `amount_lovelace`) + + | project_id | NULL count | total milestones | |---|---:|---:| | UTXO-EC-0002-25-05 | 21 | 21 | | UTXO-EC-0002-25-06 | 21 | 21 | @@ -142,20 +290,14 @@ The original analysis is preserved below for context. | UTXO-EG-0003-25 | 4 | 4 | | UTXO-ER-0001-25 | 4 | 4 | -- **Code path:** `process_fund` → `extract_milestone_label_description` - (`event_processor.rs:1403`) for label/AC; datum parse for amount/time_limit. -- **Likely root cause:** these projects use `MS-N` milestone identifiers - with a different datum format that `parse_vendor_contract_datum` doesn't - yet handle (see KI-OC-01). - -**Repro query** +##### Repro query ```sql -SELECT vc.project_id, COUNT(*) AS missing_label +SELECT p.project_id, COUNT(*) AS missing FROM treasury.milestones m -JOIN treasury.vendor_contracts vc ON vc.id = m.vendor_contract_id -WHERE NOT m.archived AND m.label IS NULL -GROUP BY vc.project_id ORDER BY 2 DESC; +JOIN treasury.projects p ON p.id = m.project_db_id +WHERE NOT m.archived AND m.amount_lovelace IS NULL +GROUP BY p.project_id ORDER BY 2 DESC; ``` #### KI-MIL-02 — `withdraw_*` / `complete_*` / `archived_*` columns @@ -177,41 +319,47 @@ FROM treasury.milestones; ### A.4 `treasury.events` -#### KI-EVT-01 — `vendor_contract_id` NULL on chain-trace failure *(RESOLVED)* +#### KI-EVT-01 — `project_db_id` NULL on chain-trace failure *(RESOLVED — verified by 2026-05-02 cold resync)* - **Resolved by:** historical-UTXO trigger (KI-UTX-01). Chain-trace inputs are now reliably present in `treasury.utxo_history` regardless of pruning, so the trace finds the seed for every event whose ancestor is a fund tx we've processed. -- See the analysis below for context. +- **Verified:** after a fresh cold resync with the trigger armed from the + start, NULL counts dropped from 56 / 409 (14%) to **4 / 411 (~1%)**. - -- **Code path:** every milestone-level handler (`process_complete:511`, - `process_withdraw:626`, `process_pause:721`, `process_resume:764`) calls - `find_vendor_contract_from_inputs` (`event_processor.rs:1047`) when - `body.identifier` is empty. If the trace returns `None`, the event is - inserted with `vendor_contract_id = NULL` (intentional — see fix history; - events are never silently dropped). -- **Why it happens:** input UTXOs for these txs were pruned from - `yaci_store.address_utxo` before the local sync caught up, and no `fund` - output we processed seeded them either. -- **Currently affected:** - - | event_type | NULL vc | total | % | + | event_type | NULL `project_db_id` | total | % | |---|---:|---:|---:| - | complete | 30 | 188 | 16% | - | withdraw | 9 | 126 | 7% | - | pause | 10 | 63 | 16% | - | resume | 7 | 32 | 22% | - | **total** | **56** | **409** | **14%** | - - Treasury-level events (publish, initialize, disburse) have NULL `vc` by - design — they aren't tied to a vendor contract. + | complete | 2 | 189 | 1.1% | + | withdraw | 2 | 129 | 1.6% | + | pause | 0 | 62 | 0% | + | resume | 0 | 31 | 0% | + | **total** | **4** | **411** | **1.0%** | + +- Treasury-level events (publish, initialize, disburse) have NULL + `project_db_id` by design — they aren't tied to a project. + +#### KI-EVT-01-residual — 4 events still NULL, blocked on KI-VND-05 corruption *(OPEN — backfills on cold resync)* +- The 4 events are descendants of the 2 KI-VND-05 corrupted projects. + Their seed UTXOs in `treasury.utxo_history` have `project_db_id IS + NULL` because `process_fund` skipped seed propagation for those + projects when bug #4 corrupted the captured datum. +- **Tx hashes:** + - `76ea3cc35a57…` (withdraw, slot 172714231) + - `6db20bb408c4…` (complete, slot 176999799) + - `b4d7a78ec2c8…` (complete, slot 177000042) + - `d3b6f4451d5c…` (withdraw, slot 185140469) +- **Recovery:** runs automatically once KI-VND-05's cold resync clears + the corrupted utxo_history rows. The next `sync_all_events` re-runs + `process_fund` on the original captured datums, seeds + `project_db_id` on the fund outputs, and `find_project_from_inputs` + (`event_processor.rs:1093`) backfills these 4 events via + `ON CONFLICT DO UPDATE`. **Repro query** ```sql SELECT event_type, - COUNT(*) FILTER (WHERE vendor_contract_id IS NULL) AS null_vc, + COUNT(*) FILTER (WHERE project_db_id IS NULL) AS null_project, COUNT(*) AS total FROM treasury.events WHERE event_type IN ('complete','withdraw','pause','resume') @@ -232,9 +380,9 @@ FROM treasury.events GROUP BY 1 ORDER BY 1; --- -### A.5 `treasury.utxos` +### A.5 `treasury.utxo_history` (formerly `treasury.utxos`) -#### KI-UTX-01 — `treasury.utxo_history` table + Postgres trigger *(IMPLEMENTED)* +#### KI-UTX-01 — `treasury.utxo_history` table + Postgres trigger *(IMPLEMENTED — verified by 2026-05-02 cold resync)* - **Implementation:** `install_utxo_history_triggers` (`api/src/services/sync.rs`) creates two triggers at API startup: - `capture_address_utxo` AFTER INSERT/UPDATE on `yaci_store.address_utxo` @@ -242,42 +390,45 @@ FROM treasury.events GROUP BY 1 ORDER BY 1; - `mark_utxo_spent` AFTER INSERT on `yaci_store.tx_input` flags the corresponding `treasury.utxo_history` row as spent. - **Outcome:** complete UTXO history at script addresses is preserved - regardless of YACI Store's pruning window. Resolves KI-VND-04, KI-EVT-01, - KI-CR-01. - -#### KI-UTX-02 — `vendor_contract_id` IS NULL on non-script UTXOs (by design) -- **Why:** `pre_fetch_utxos` (`event_processor.rs:1209`) inserts every output - of every TOM-event tx without `vendor_contract_id`. The chain-trace seed - (set later by `process_fund` and `find_vendor_contract_from_inputs`) only - fills it for outputs at the script address. Non-script change/fee outputs + regardless of YACI Store's pruning window. Resolves KI-VND-04, + KI-EVT-01, KI-CR-01 — all confirmed by the 2026-05-02 cold resync. + +#### KI-UTX-02 — `project_db_id` IS NULL on non-script UTXOs (by design) +- **Why:** `pre_fetch_utxos` inserts every output of every TOM-event tx + without `project_db_id`. The chain-trace seed (set later by + `process_fund` and `find_vendor_contract_from_inputs`) only fills it + for outputs at the script address. Non-script change/fee outputs remain NULL by design — they aren't part of the chain. -- **Currently affected:** 767 / 1222 rows. Not anomalous — expected. +- **Currently affected:** 786 / 1235 rows. Not anomalous — expected. **Repro query** ```sql SELECT CASE - WHEN vendor_contract_id IS NOT NULL AND address IS NOT NULL THEN 'fully_tracked' - WHEN vendor_contract_id IS NULL AND address IS NOT NULL THEN 'address_only' - WHEN vendor_contract_id IS NULL AND address IS NULL THEN 'sparse' + WHEN project_db_id IS NOT NULL AND address IS NOT NULL THEN 'fully_tracked' + WHEN project_db_id IS NULL AND address IS NOT NULL THEN 'address_only' + WHEN address IS NULL THEN 'sparse' ELSE 'other' END AS state, COUNT(*) AS count -FROM treasury.utxos GROUP BY 1 ORDER BY 2 DESC; +FROM treasury.utxo_history GROUP BY 1 ORDER BY 2 DESC; ``` -**Current breakdown:** `address_only=767`, `fully_tracked=455`. +**Current breakdown:** `address_only=786`, `fully_tracked=449`. -#### KI-UTX-02 — 5 rows with NULL `lovelace_amount` -- Output recorded but `yaci_store.address_utxo` had no row when looked up - (probably collateral / null-value outputs). -- **Currently affected:** 5 / 1222. +#### KI-UTX-03 — NULL `lovelace_amount` rows *(RESOLVED — verified by 2026-05-02 cold resync)* +- Previously 5 / 1222 rows had NULL `lovelace_amount` (outputs whose + `yaci_store.address_utxo` row was already pruned by the time we looked + it up). With the historical-UTXO trigger capturing rows on insert, no + such gaps remain. +- **Currently affected:** 0 / 1235. **Repro query** ```sql -SELECT tx_hash, output_index, address FROM treasury.utxos WHERE lovelace_amount IS NULL; +SELECT tx_hash, output_index, address +FROM treasury.utxo_history WHERE lovelace_amount IS NULL; ``` --- @@ -306,7 +457,7 @@ The original analysis is preserved below. milestone of a project is `m-0` under one convention and `MS-1` under the other; positionally they are the same milestone. A future normaliser that wants to merge the two formats can use this offset. -- **Effect on complete events:** of 188 complete events, 107 use `m-N` keys +- **Effect on complete events:** of 189 complete events, 108 use `m-N` keys and 81 use `MS-N` keys. After the disambiguation hint to `find_vendor_contract_from_inputs`, this no longer causes silent event drops (every event lands in `treasury.events`), but it surfaces as @@ -334,7 +485,7 @@ WHERE jsonb_typeof(ms_field) = 'object'; empty top-level `identifier`, so the cheap project lookup is never available — every such event must chain-trace. This is what makes KI-EVT-01 visible at all. -- **Currently affected:** complete 188/188, withdraw 126/126, pause 63/63, +- **Currently affected:** complete 189/189, withdraw 129/129, pause 63/63, resume 32/32 — 100% across the board. **Repro query** @@ -362,16 +513,21 @@ GROUP BY 1 ORDER BY 1; ## Section C — Cold-replay UTXO-pruning limitation -### KI-CR-01 — Fresh local sync can't reconstruct fully-pruned chains *(MITIGATED)* -- **Mitigated by:** the historical-UTXO trigger (KI-UTX-01). Going forward, +### KI-CR-01 — Fresh local sync can't reconstruct fully-pruned chains *(RESOLVED — verified by 2026-05-02 cold resync)* +- **Resolved by:** the historical-UTXO trigger (KI-UTX-01). Going forward, every UTXO YACI Store inserts is captured in `treasury.utxo_history` before it can be pruned, so continuous-operation chain trace works fully. +- **Verified:** the 2026-05-02 cold resync was run with + `install_utxo_history_triggers` arming the triggers before YACI Store + began ingesting. KI-VND-04 and KI-EVT-01 both improved to ~zero in this + run, confirming the recovery procedure works end-to-end. (KI-VND-01 and + the datum-derived part of KI-MIL-01 remain — those are parser issues, + not pruning issues.) - **Caveat:** the trigger only protects UTXOs *from the moment it was installed*. If `yaci_store.address_utxo` had already been pruned before - the trigger was armed (typical local install), historical fund-output - datums may still be missing from `treasury.utxo_history`. To recover - those, wipe both schemas and re-sync from - `STORE_CARDANO_SYNC_START_SLOT`: + the trigger was armed, historical fund-output datums may still be + missing from `treasury.utxo_history`. To recover those, wipe both + schemas and re-sync from `STORE_CARDANO_SYNC_START_SLOT`: ```bash ./dev.sh stop docker volume rm administration-data_postgres_data @@ -392,19 +548,109 @@ GROUP BY 1 ORDER BY 1; `updated_at` on the `rows.is_empty()` path so `/api/v1/statistics` reflects a live heartbeat even when no new TOM events have arrived. -### KI-SY-02 — `last_slot` can advance past failed events on connection reset +### KI-SY-02 — `last_slot` can advance past failed events on connection reset *(RESOLVED — Phase 1 + periodic full sync shipped)* + +**Resolution:** the contiguous-success watermark in `sync.rs` (Phase 1 +in the proposed fix below) is now in place. Additionally, a separate +`tokio::spawn` task runs `sync_all_events` every 10 minutes as a safety +net — any event that wedges the incremental loop is recovered by the +next full re-sync via the idempotent `ON CONFLICT DO UPDATE` chain. +Phase 2 (a `treasury.failed_events` table + per-event retry interval) +was de-scoped in favour of the simpler periodic full sync, which proved +sufficient when applied to the KI-VND-01 cascade. + +The original analysis is preserved below for context. + + + - **Symptom observed:** during a postgres restart mid-batch (2026-04-28), 5 events failed to insert. Continuous-sync logged `Sync error: error communicating with database` then advanced `last_slot` past those events on the next successful batch, so they were never retried. -- **Why:** `sync.rs` `for row in rows { if Err { continue } else { last_slot - = row.slot } }` — the success of later events bumps the watermark past - the failed ones. -- **Recovery:** restart the API; `sync_all_events` re-processes from the - beginning. All inserts are idempotent via `ON CONFLICT (tx_hash) DO UPDATE`. -- **Fix candidate:** track `last_slot` as the slot of the LAST contiguous - success (don't advance past holes), or run `sync_all_events` periodically. +- **Why** (confirmed by reading `api/src/services/sync.rs:67–146`): + ```rust + let mut last_processed_slot = last_slot; + for row in rows { + if let Err(e) = processor.process_event(&row).await { + tracing::error!("Failed to process event {}: {}", row.tx_hash, e); + continue; // <-- skip + } + last_processed_slot = row.slot.unwrap_or(last_processed_slot); // <-- bumps past skipped + } + ``` + A success at row `i+1` bumps the watermark past a skipped row `i`. The + watermark is then persisted to `treasury.sync_status` (line ~139), + making the skipped event unrecoverable until the API restarts and + `sync_all_events` reprocesses from slot 0. +- **Why retries are safe**: all inserts use `ON CONFLICT (tx_hash) DO + UPDATE` (`event_processor.rs:1057–1084`, `:327`, `:432–453`, + `:1227–1233`), and child-table updates COALESCE to preserve existing + values. Re-applying any event is idempotent. + +##### Proposed fix — Phase 1 (small, ship first) + +Replace the watermark loop with a contiguous-success tracker: + +```rust +let mut watermark = last_slot; +let mut hole_seen = false; +for row in rows { + match processor.process_event(&row).await { + Err(e) => { + tracing::error!( + "Failed to process event {} at slot {:?}: {:#}", + row.tx_hash, row.slot, e + ); + hole_seen = true; + } + Ok(()) => { + if !hole_seen { + watermark = row.slot.unwrap_or(watermark); + } + } + } +} +``` + +- **Cost:** if an event fails *permanently* (e.g., schema mismatch), the + loop wedges at that slot until an operator intervenes. That's the + point — silent loss is worse than visible stall, and the WARN log + surfaces it. + +##### Proposed fix — Phase 2 (durable, follow-up) + +Add a `treasury.failed_events` table and a periodic auto-retry: + +```sql +CREATE TABLE treasury.failed_events ( + tx_hash VARCHAR(64) PRIMARY KEY, + slot BIGINT, + event_type TEXT, + error TEXT NOT NULL, + retry_count INT NOT NULL DEFAULT 0, + first_seen TIMESTAMPTZ NOT NULL DEFAULT NOW(), + last_attempt TIMESTAMPTZ NOT NULL DEFAULT NOW() +); +CREATE INDEX idx_failed_events_retry + ON treasury.failed_events (retry_count, last_attempt); +``` + +- On the `Err` path in the loop, upsert (`ON CONFLICT (tx_hash) DO + UPDATE SET retry_count = retry_count + 1, last_attempt = NOW(), + error = EXCLUDED.error`). +- Spawn a tokio interval (e.g. every 10 min) that selects from + `treasury.failed_events` and re-runs `process_event` for each — same + idempotent path. Delete the row on success. +- Operator visibility: `SELECT * FROM treasury.failed_events ORDER BY + retry_count DESC` shows the backlog. Optional: expose a count on the + `/api/v1/statistics` endpoint. + +##### Operational note when this lands + +`treasury.sync_status.last_slot` semantics shift from "last successful +row" to "last contiguous success". Operationally invisible to consumers +of `/api/v1/status`, but worth a one-line release note. --- @@ -421,21 +667,27 @@ GROUP BY 1 ORDER BY 1; ## Index summary -| ID | Area | Status | -|---|---|---| -| KI-VND-01 | datum parse failure on `UTXO-*` projects | **resolved** (multi-key parser) | -| KI-VND-02 | `vendor_name` deprecated | **resolved** (column dropped) | -| KI-VND-03 | `contract_url` deprecated | **resolved** (column dropped) | -| KI-VND-04 | `contract_address` NULL on cold replay | **resolved** (utxo_history trigger) | -| KI-MIL-01 | NULL `label`/`amount`/`time_limit`/`AC` for `UTXO-*` | **resolved** for datum-derived fields | -| KI-EVT-01 | NULL `vendor_contract_id` on chain-trace failure | **resolved** (utxo_history trigger) | -| KI-EVT-03 | NULL `milestone_id` on treasury-level events | by design | -| KI-UTX-01 | historical-UTXO table + trigger | **implemented** | -| KI-UTX-02 | `vendor_contract_id` NULL on non-script UTXOs | by design | -| KI-OC-01 | milestone-id naming drift (m-N vs MS-N) | **resolved at lookup time** | -| KI-OC-02 | empty `body.identifier` everywhere | on-chain limitation | -| KI-OC-03 | multi-input sibling-project txs | resolved (disambiguation hint) | -| KI-CR-01 | cold-replay limitation | **resolved** (utxo_history trigger) | -| KI-SY-01 | idle `updated_at` doesn't bump | **resolved** | -| KI-SY-02 | `last_slot` advances past failed events | open | -| KI-API-01 | `destination` schema mismatch | **resolved** (JSONB; breaking API change) | +| ID | Area | Status | Blocked on | +|---|---|---|---| +| KI-VND-01 | NULL `vendor_payment_key_hash` on `UTXO-*` projects | **resolved** (5-bug cascade, 10/42 → 1/42) | — | +| KI-VND-02 | `vendor_name` deprecated | **resolved** (column dropped) | — | +| KI-VND-03 | `contract_url` deprecated | **resolved** (column dropped) | — | +| KI-VND-04 | `contract_address` NULL on cold replay | **resolved** (verified, 0/42) | — | +| KI-VND-05 | 2 corrupted utxo_history datums from prior bug #4 | **open** — requires cold resync to recover | — | +| KI-MIL-01 (`label`) | NULL `label` for `UTXO-*` | **resolved** (description fallback, 0/364) | — | +| KI-MIL-01 (`amount`/`time_limit`) | NULL datum-derived fields for `UTXO-*` | **largely resolved** (136/386 → 16/364) | KI-VND-05, KI-MOD-01 | +| KI-MIL-01 (`acceptance_criteria`) | NULL for `UTXO-*` | **not a bug** — metadata genuinely lacks the field | — | +| KI-EVT-01 | NULL `project_db_id` on chain-trace failure | **resolved** (verified, 4/413 residual upstream) | — | +| KI-EVT-01-residual | 4 events still NULL on KI-VND-05 descendants | **open** — backfills on cold resync | KI-VND-05 | +| KI-MOD-01 | `modify` events create milestones with NULL datum fields | **open** — small follow-up fix | — | +| KI-EVT-03 | NULL `milestone_id` on treasury-level events | by design | — | +| KI-UTX-01 | historical-UTXO table + trigger | **implemented & verified** | — | +| KI-UTX-02 | `project_db_id` NULL on non-script UTXOs | by design | — | +| KI-UTX-03 | NULL `lovelace_amount` rows | **resolved** (verified, 0/1235) | — | +| KI-OC-01 | milestone-id naming drift (m-N vs MS-N) | **resolved at lookup time** | — | +| KI-OC-02 | empty `body.identifier` everywhere | on-chain limitation | — | +| KI-OC-03 | multi-input sibling-project txs | resolved (disambiguation hint) | — | +| KI-CR-01 | cold-replay limitation | **resolved** (verified by 2026-05-02 cold resync) | — | +| KI-SY-01 | idle `updated_at` doesn't bump | **resolved** | — | +| KI-SY-02 | `last_slot` advances past failed events | **resolved** (contiguous-success watermark + periodic full sync) | — | +| KI-API-01 | `destination` schema mismatch | **resolved** (JSONB; breaking API change) | — | From ca935384af61a2bcd12992a7d702deeb4275aade Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Sun, 3 May 2026 11:37:22 +0100 Subject: [PATCH 15/19] update issues --- api/src/models/v1.rs | 42 ++++- api/src/parsers/datum.rs | 13 ++ api/src/routes/v1/milestones.rs | 12 ++ api/src/routes/v1/projects.rs | 4 + api/src/services/event_processor.rs | 119 ++++++++----- api/tests/fixtures/ec_0013_25.hex | 1 + api/tests/fixtures/utxo_ec_0002_25_03.hex | 1 + docs/known-issues.md | 201 ++++++++++++---------- 8 files changed, 262 insertions(+), 131 deletions(-) create mode 100644 api/tests/fixtures/ec_0013_25.hex create mode 100644 api/tests/fixtures/utxo_ec_0002_25_03.hex diff --git a/api/src/models/v1.rs b/api/src/models/v1.rs index 1c88d0a..792b114 100644 --- a/api/src/models/v1.rs +++ b/api/src/models/v1.rs @@ -584,7 +584,7 @@ pub struct MilestoneResponse { pub withdrawn: bool, /// Whether completion evidence has been provided pub evidence_provided: bool, - /// Whether this milestone is paused + /// Whether this milestone is currently paused (latest pause/resume state) pub paused: bool, /// Whether this milestone has been archived (replaced by a modify event) pub archived: bool, @@ -594,10 +594,33 @@ pub struct MilestoneResponse { pub withdrawal: Option, /// Archive info (present when archived) pub archive_info: Option, + /// Pause/resume history (present when at least one pause event has been recorded) + pub pause_history: Option, /// Project reference pub project: ProjectReference, } +/// Pause/resume history for a milestone. +/// +/// Present when at least one pause OR resume event has been recorded for the +/// milestone. `currently_paused` reflects the milestone's current state (set +/// by the contract output datum). Either `last_pause_*` or `last_resume_*` +/// may be null if that side hasn't happened yet (e.g., a milestone that was +/// resumed but whose original pause predates our indexing). +#[derive(Debug, Serialize, Deserialize, ToSchema)] +pub struct MilestonePauseHistory { + /// Whether the milestone is currently paused (mirrors the top-level `paused`) + pub currently_paused: bool, + /// Most recent pause transaction + pub last_pause_tx_hash: Option, + /// On-chain time of the last pause (`{unix, iso}`) + pub last_pause_time: Option, + /// Most recent resume transaction + pub last_resume_tx_hash: Option, + /// On-chain time of the last resume (`{unix, iso}`) + pub last_resume_time: Option, +} + /// Milestone completion details #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct MilestoneCompletion { @@ -669,6 +692,10 @@ pub struct MilestoneRow { pub archived_by_tx_hash: Option, pub archived_at: Option, pub superseded_by: Option, + pub last_pause_tx_hash: Option, + pub last_pause_time: Option, + pub last_resume_tx_hash: Option, + pub last_resume_time: Option, pub project_id: String, pub project_name: Option, } @@ -698,6 +725,18 @@ impl From for MilestoneResponse { None }; + let pause_history = if row.last_pause_tx_hash.is_some() || row.last_resume_tx_hash.is_some() { + Some(MilestonePauseHistory { + currently_paused: row.paused, + last_pause_tx_hash: row.last_pause_tx_hash.clone(), + last_pause_time: ChainTime::maybe_from_secs(row.last_pause_time), + last_resume_tx_hash: row.last_resume_tx_hash.clone(), + last_resume_time: ChainTime::maybe_from_secs(row.last_resume_time), + }) + } else { + None + }; + Self { id: row.id, milestone_id: row.milestone_id, @@ -714,6 +753,7 @@ impl From for MilestoneResponse { completion, withdrawal, archive_info, + pause_history, project: ProjectReference { project_id: row.project_id, project_name: row.project_name, diff --git a/api/src/parsers/datum.rs b/api/src/parsers/datum.rs index ed2db92..cc8dcd7 100644 --- a/api/src/parsers/datum.rs +++ b/api/src/parsers/datum.rs @@ -382,6 +382,19 @@ mod tests { assert!(r.milestones.iter().all(|m| m.is_ok())); } + #[test] + fn test_utxo_ec_0002_25_03_fixture_parses() { + // Real on-chain datum from project UTXO-EC-0002-25-03 (20 milestones). + // This datum was historically corrupted by a prior bug; ensures the + // post-fix parser still handles it correctly. + let hex = include_str!("../../tests/fixtures/utxo_ec_0002_25_03.hex").trim(); + let r = parse_project_datum(hex); + assert!(r.top_level_error.is_none(), "top-level error: {:?}", r.top_level_error); + assert!(r.vendor_payment_key_hash.is_some()); + assert_eq!(r.milestones.len(), 20); + assert!(r.milestones.iter().all(|m| m.is_ok())); + } + #[test] fn test_partial_parse_keeps_vendor_info_when_milestones_fail() { // Hand-crafted datum: valid vendor info, milestones array contains a diff --git a/api/src/routes/v1/milestones.rs b/api/src/routes/v1/milestones.rs index 8a5f508..2671a5c 100644 --- a/api/src/routes/v1/milestones.rs +++ b/api/src/routes/v1/milestones.rs @@ -154,6 +154,10 @@ pub async fn list_milestones( m.archived_by_tx_hash, m.archived_at, m.superseded_by, + (SELECT tx_hash FROM treasury.events WHERE milestone_id = m.id AND event_type = 'pause' ORDER BY block_time DESC LIMIT 1) AS last_pause_tx_hash, + (SELECT block_time FROM treasury.events WHERE milestone_id = m.id AND event_type = 'pause' ORDER BY block_time DESC LIMIT 1) AS last_pause_time, + (SELECT tx_hash FROM treasury.events WHERE milestone_id = m.id AND event_type = 'resume' ORDER BY block_time DESC LIMIT 1) AS last_resume_tx_hash, + (SELECT block_time FROM treasury.events WHERE milestone_id = m.id AND event_type = 'resume' ORDER BY block_time DESC LIMIT 1) AS last_resume_time, vc.project_id, vc.project_name FROM treasury.milestones m @@ -243,6 +247,10 @@ pub async fn get_milestone( m.archived_by_tx_hash, m.archived_at, m.superseded_by, + (SELECT tx_hash FROM treasury.events WHERE milestone_id = m.id AND event_type = 'pause' ORDER BY block_time DESC LIMIT 1) AS last_pause_tx_hash, + (SELECT block_time FROM treasury.events WHERE milestone_id = m.id AND event_type = 'pause' ORDER BY block_time DESC LIMIT 1) AS last_pause_time, + (SELECT tx_hash FROM treasury.events WHERE milestone_id = m.id AND event_type = 'resume' ORDER BY block_time DESC LIMIT 1) AS last_resume_tx_hash, + (SELECT block_time FROM treasury.events WHERE milestone_id = m.id AND event_type = 'resume' ORDER BY block_time DESC LIMIT 1) AS last_resume_time, vc.project_id, vc.project_name FROM treasury.milestones m @@ -321,6 +329,10 @@ pub async fn list_milestones_by_project( m.complete_tx_hash, m.complete_time, m.complete_description, m.evidence, m.withdraw_tx_hash, m.withdraw_time, m.withdraw_amount, m.archived_by_tx_hash, m.archived_at, m.superseded_by, + (SELECT tx_hash FROM treasury.events WHERE milestone_id = m.id AND event_type = 'pause' ORDER BY block_time DESC LIMIT 1) AS last_pause_tx_hash, + (SELECT block_time FROM treasury.events WHERE milestone_id = m.id AND event_type = 'pause' ORDER BY block_time DESC LIMIT 1) AS last_pause_time, + (SELECT tx_hash FROM treasury.events WHERE milestone_id = m.id AND event_type = 'resume' ORDER BY block_time DESC LIMIT 1) AS last_resume_tx_hash, + (SELECT block_time FROM treasury.events WHERE milestone_id = m.id AND event_type = 'resume' ORDER BY block_time DESC LIMIT 1) AS last_resume_time, p.project_id, p.project_name FROM treasury.milestones m JOIN treasury.projects p ON p.id = m.project_db_id diff --git a/api/src/routes/v1/projects.rs b/api/src/routes/v1/projects.rs index 0fd4df9..15219e7 100644 --- a/api/src/routes/v1/projects.rs +++ b/api/src/routes/v1/projects.rs @@ -227,6 +227,10 @@ pub async fn get_project_milestones( m.complete_tx_hash, m.complete_time, m.complete_description, m.evidence, m.withdraw_tx_hash, m.withdraw_time, m.withdraw_amount, m.archived_by_tx_hash, m.archived_at, m.superseded_by, + (SELECT tx_hash FROM treasury.events WHERE milestone_id = m.id AND event_type = 'pause' ORDER BY block_time DESC LIMIT 1) AS last_pause_tx_hash, + (SELECT block_time FROM treasury.events WHERE milestone_id = m.id AND event_type = 'pause' ORDER BY block_time DESC LIMIT 1) AS last_pause_time, + (SELECT tx_hash FROM treasury.events WHERE milestone_id = m.id AND event_type = 'resume' ORDER BY block_time DESC LIMIT 1) AS last_resume_tx_hash, + (SELECT block_time FROM treasury.events WHERE milestone_id = m.id AND event_type = 'resume' ORDER BY block_time DESC LIMIT 1) AS last_resume_time, vc.project_id, vc.project_name FROM treasury.milestones m JOIN treasury.projects vc ON vc.id = m.project_db_id diff --git a/api/src/services/event_processor.rs b/api/src/services/event_processor.rs index 81f83a6..83bfa35 100644 --- a/api/src/services/event_processor.rs +++ b/api/src/services/event_processor.rs @@ -839,11 +839,17 @@ impl EventProcessor { } }; - if let Some(vc_id) = project_db_id { + let matched_milestone_id = if let Some(vc_id) = project_db_id { // Also update per-milestone pause flags from output datum if available self.update_milestone_pause_from_datum(&event.tx_hash, vc_id).await?; + // Resolve the affected milestone(s) from body.milestones keys + self.resolve_first_milestone_from_body(event_body, vc_id).await? + } else { + None + }; - self.insert_event_full(event, "pause", None, Some(vc_id), None, None, &reason, &None, body).await?; + if let Some(vc_id) = project_db_id { + self.insert_event_full(event, "pause", None, Some(vc_id), matched_milestone_id, None, &reason, &None, body).await?; } else { tracing::warn!("Could not find vendor contract for pause event {}", event.tx_hash); self.insert_event_full(event, "pause", None, None, None, None, &reason, &None, body).await?; @@ -880,11 +886,16 @@ impl EventProcessor { } }; - if let Some(vc_id) = project_db_id { + let matched_milestone_id = if let Some(vc_id) = project_db_id { // Also update per-milestone pause flags from output datum if available self.update_milestone_pause_from_datum(&event.tx_hash, vc_id).await?; + self.resolve_first_milestone_from_body(event_body, vc_id).await? + } else { + None + }; - self.insert_event_full(event, "resume", None, Some(vc_id), None, None, &None, &None, body).await?; + if let Some(vc_id) = project_db_id { + self.insert_event_full(event, "resume", None, Some(vc_id), matched_milestone_id, None, &None, &None, body).await?; } else { tracing::warn!("Could not find vendor contract for resume event {}", event.tx_hash); self.insert_event_full(event, "resume", None, None, None, None, &None, &None, body).await?; @@ -1115,6 +1126,9 @@ impl EventProcessor { ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) ON CONFLICT (tx_hash) DO UPDATE SET + treasury_id = COALESCE(EXCLUDED.treasury_id, treasury.events.treasury_id), + project_db_id = COALESCE(EXCLUDED.project_db_id, treasury.events.project_db_id), + milestone_id = COALESCE(EXCLUDED.milestone_id, treasury.events.milestone_id), amount_lovelace = COALESCE(EXCLUDED.amount_lovelace, treasury.events.amount_lovelace), reason = COALESCE(EXCLUDED.reason, treasury.events.reason), destination = COALESCE(EXCLUDED.destination, treasury.events.destination) @@ -1357,38 +1371,31 @@ impl EventProcessor { } /// Fetch script UTXO data (address, lovelace_amount, inline_datum) for a transaction. - /// Tries yaci_store.address_utxo first, falls back to pre-fetched treasury.utxo_history. /// - /// Ordering: prefer the addr1x output with the LARGEST inline_datum. Fund txs - /// can produce multiple script outputs — typically a vendor-contract output - /// carrying the project datum (kilobytes) plus a treasury-contract change - /// output carrying a trivial `Constr(0, [])` datum (3 bytes). Picking the - /// larger datum reliably selects the vendor contract output without needing - /// to know its address up front. + /// Picks the addr1x output with the LARGEST inline_datum across BOTH + /// `yaci_store.address_utxo` AND `treasury.utxo_history`. Fund txs + /// often produce two script outputs — a vendor-contract output carrying + /// the kilobyte project datum, plus a treasury-contract reference + /// output carrying a trivial `Constr(0, [])` datum (3 bytes). yaci_store + /// prunes spent UTXOs (~2160 blocks) so the spent vendor-contract + /// output may only survive in `treasury.utxo_history` (captured by the + /// trigger before pruning); the unspent treasury-reference output stays + /// in yaci_store. Querying yaci_store alone returns the trivial datum + /// for these txs; merging across both reliably surfaces the real + /// project datum. async fn get_script_utxo_for_tx(&self, tx_hash: &str) -> anyhow::Result<(Option, Option, Option)> { - let result: Option<(String, Option, Option)> = sqlx::query_as( - r#" - SELECT owner_addr, lovelace_amount, inline_datum - FROM yaci_store.address_utxo - WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' - ORDER BY length(COALESCE(inline_datum, '')) DESC - LIMIT 1 - "# - ) - .bind(tx_hash) - .fetch_optional(&self.pool) - .await?; - - if let Some((addr, amt, datum)) = result { - return Ok((Some(addr), amt, datum)); - } - - // Fallback to pre-fetched treasury.utxo_history let result: Option<(Option, Option, Option)> = sqlx::query_as( r#" SELECT address, lovelace_amount, inline_datum_cbor - FROM treasury.utxo_history - WHERE tx_hash = $1 AND address LIKE 'addr1x%' + FROM ( + SELECT owner_addr AS address, lovelace_amount, inline_datum AS inline_datum_cbor + FROM yaci_store.address_utxo + WHERE tx_hash = $1 AND owner_addr LIKE 'addr1x%' + UNION ALL + SELECT address, lovelace_amount, inline_datum_cbor + FROM treasury.utxo_history + WHERE tx_hash = $1 AND address LIKE 'addr1x%' + ) merged ORDER BY length(COALESCE(inline_datum_cbor, '')) DESC LIMIT 1 "# @@ -1397,14 +1404,7 @@ impl EventProcessor { .fetch_optional(&self.pool) .await?; - if let Some((addr, amt, datum)) = result { - if addr.is_some() { - tracing::debug!("Used treasury.utxo_history fallback for tx {} (yaci_store UTXO pruned)", tx_hash); - } - return Ok((addr, amt, datum)); - } - - Ok((None, None, None)) + Ok(result.unwrap_or((None, None, None))) } /// Look up a specific UTXO by tx_hash + output_index. @@ -1513,6 +1513,47 @@ impl EventProcessor { Ok(()) } + + /// Resolve the first milestone referenced in an event's `body.milestones` + /// keys (or `body.milestone` string) to a `treasury.milestones.id` for the + /// given project. Used by pause/resume to populate `events.milestone_id` + /// so consumers don't have to re-parse the metadata to know which + /// milestone the event affects. + async fn resolve_first_milestone_from_body( + &self, + event_body: &Value, + project_db_id: i32, + ) -> anyhow::Result> { + let candidates: Vec = if let Some(obj) = event_body.get("milestones").and_then(|m| m.as_object()) { + obj.keys().cloned().collect() + } else if let Some(s) = event_body.get("milestone").and_then(|m| m.as_str()) { + vec![s.to_string()] + } else { + return Ok(None); + }; + + for key in candidates { + let order_hint = canonical_milestone_order(&key); + let id: Option = sqlx::query_scalar( + r#" + SELECT id FROM treasury.milestones + WHERE project_db_id = $1 + AND NOT archived + AND (milestone_id = $2 OR milestone_order = $3) + LIMIT 1 + "#, + ) + .bind(project_db_id) + .bind(&key) + .bind(order_hint) + .fetch_optional(&self.pool) + .await?; + if id.is_some() { + return Ok(id); + } + } + Ok(None) + } } /// Extract milestone label and description from metadata fields. diff --git a/api/tests/fixtures/ec_0013_25.hex b/api/tests/fixtures/ec_0013_25.hex new file mode 100644 index 0000000..098b125 --- /dev/null +++ b/api/tests/fixtures/ec_0013_25.hex @@ -0,0 +1 @@ +d8799fd8799f581c6c170db91076434de83f93868e61f4020ef7840123636ba0a4a512abff9fd8799f1b0000019896365580a140a1401b000000746a528800d87980ffd8799f1b0000019ca18b8000a140a1401b00000045d964b800d87980ffd8799f1b0000019ddb787d80a140a1401b00000045d964b800d87980ffd8799f1b0000019f159c6980a140a1401b000000174876e800d87980ffd8799f1b000001a04fc05580a140a1401b000000174876e800d87980ffd8799f1b000001a18a1b3000a140a1401b0000001176592e00d87980ffd8799f1b000001a18a1b3000a140a1401b0000002e90edd000d87980ffd8799f1b000001a2c43f1c00a140a1401b000000266ac43200d87980ffd8799f1b000001a363e44000a140a1401b0000000ba43b7400d87980ffd8799f1b000001a363e44000a140a1401b00000002540be400d87980ffd8799f1b0000019896365580a140a1401b000000174876e800d87980ffd8799f1b0000019bbef3b000a140a1401b0000002e90edd000d87980ffd8799f1b0000019ca18b8000a140a1401b0000002e90edd000d87980ffd8799f1b0000019ceecae400a140a1401b000000746a528800d87980ffd8799f1b0000019e28b7e180a140a1401b000000746a528800d87980ffd8799f1b0000019f62dbcd80a140a1401b0000006b1a22f800d87980ffd8799f1b000001a0a2261580a140a1401b00000004a817c800d87980ffd8799f1b000001a1dc80f000a140a1401b00000004a817c800d87980ffd8799f1b0000019896365580a140a1401b00000004a817c800d87980ffd8799f1b0000019a84cfc400a140a1401b00000004a817c800d87980ffd8799f1b0000019ca18b8000a140a1401b000000174876e800d87980ffd8799f1b0000019fb01b3180a140a1401b00000005d21dba00d87980ffd8799f1b000001a363e44000a140a1401b00000002540be400d87980ffffff diff --git a/api/tests/fixtures/utxo_ec_0002_25_03.hex b/api/tests/fixtures/utxo_ec_0002_25_03.hex new file mode 100644 index 0000000..8f9a2cb --- /dev/null +++ b/api/tests/fixtures/utxo_ec_0002_25_03.hex @@ -0,0 +1 @@ +d8799fd87a9f9fd8799f581c33afc56ecef7fc370f59d5574416826d6bd3d1f88e0f449ed5ae79f5ffd87f9f581ccfc13c3728f4dd600a33f4e977aa0168eaf2ffb3474826fdd90af37effffff9fd8799f1b0000019a37905c18a140a1401b000000b0f387b000d87a80ffd8799f1b0000019a37905c18a140a1401b000000b0f387b000d87a80ffd8799f1b0000019c11596c18a140a1401b000000b0f387b000d87980ffd8799f1b0000019fb5787818a140a1401b000000b0f387b000d87980ffd8799f1b0000019fb5787818a140a1401b000000b0f387b000d87980ffd8799f1b0000019c11596c18a140a1401b0000006c35423780d87980ffd8799f1b0000019a37905c18a140a1401b0000006c35423780d87a80ffd8799f1b0000019c11596c18a140a1401b0000006c35423780d87980ffd8799f1b0000019c11596c18a140a1401b0000006c35423780d87980ffd8799f1b0000019c11596c18a140a1401b0000006c35423780d87980ffd8799f1b0000019de0d5c418a140a1401b0000006c35423780d87980ffd8799f1b0000019de0d5c418a140a1401b0000006c35423780d87980ffd8799f1b0000019fb5787818a140a1401b0000006c35423780d87980ffd8799f1b0000019ad7358018a140a1401b0000002cf8384bc0d87a80ffd8799f1b0000019ad7358018a140a1401b0000002cf8384bc0d87a80ffd8799f1b0000019b71b44818a140a1401b0000002cf8384bc0d87a80ffd8799f1b0000019b71b44818a140a1401b0000002cf8384bc0d87a80ffd8799f1b0000019ad7358018a140a1401b0000002cf8384bc0d87a80ffd8799f1b0000019c11596c18a140a1401b0000002cf8384bc0d87980ffd8799f1b0000019ca6b1d818a140a1401b0000002cf8384bc0d87980ffffff diff --git a/docs/known-issues.md b/docs/known-issues.md index cf22d85..bbcf4d8 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -1,44 +1,51 @@ # Known issues — data quality and behavioural quirks -> **Last refreshed:** 2026-05-02 (post five-bug-cascade fix; see KI-VND-01) -> against commit `6db1581`+. Counts come from the local DB after the fix -> landed. Rerun the per-entry repro SQL for fresh numbers. +> **Last refreshed:** 2026-05-03 (post six-bug-cascade fix + true cold +> resync) against commit `6db1581`+. Rerun the per-entry repro SQL for +> fresh numbers. > -> **Verified resolved this session:** -> - **KI-VND-01** — `vendor_payment_key_hash` NULL: **10/42 → 1/42** -> (the 1 is a data-corruption casualty; see KI-VND-05). +> **Verified resolved by cold resync:** +> - **KI-VND-01** — `vendor_payment_key_hash` NULL: **10/42 → 0/42** > - **KI-MIL-01 (datum-derived)** — NULL `amount_lovelace`/`time_limit`: -> **136/386 → 16/364** (8 from KI-VND-05 corruption, 8 from KI-MOD-01 -> modify-event gap). -> - **KI-EVT-01-residual** — partially resolved; the 4 remaining NULL -> `project_db_id` events trace to KI-VND-05's corrupted projects. +> **136/386 → 16/364** (all 16 are KI-MOD-01 modify-event milestones). +> - **KI-VND-05** — corrupted utxo_history datums: **resolved** by cold +> resync + the merged-source `get_script_utxo_for_tx` query (bug #6). +> - **KI-EVT-01-residual** — 12/413 events still NULL, all clustered on +> the 2 KI-MOD-01-affected projects' descendants (slight regression +> from 4 pre-cold-resync — likely milestone-id-hint ambiguity in +> `find_project_from_inputs` when modify events introduce new IDs). > - **KI-SY-02** — Phase 1 (contiguous-success watermark) shipped. -> - **KI-VND-04**, **KI-CR-01**, **KI-UTX-03** — all confirmed clean. +> - **KI-VND-04**, **KI-CR-01**, **KI-UTX-03** — confirmed clean. > -> **Five distinct bugs were the cause of KI-VND-01** (not the suspected +> **Six distinct bugs were the cause of the KI-VND-01 cascade** (not a > single parser-strictness defect): -> 1. Sync race during cold catch-up (`sync_all_events` only ran once at -> startup; race with yaci_store's address_utxo ingestion meant fund -> datums weren't visible at process-time). +> 1. Sync race during cold catch-up — `sync_all_events` only ran once at +> startup, racing yaci_store's address_utxo ingestion. **Fix:** +> periodic 10-min `sync_all_events` task. > 2. `vendor_payment_key_hash VARCHAR(56)` rejected the 113-char -> multi-key hash from UTXO-* projects. -> 3. `get_script_utxo_for_tx` LIMIT 1 with no ORDER BY picked the -> smaller change/treasury output (`d87980`, 3 bytes) instead of the -> real vendor-contract output (kilobytes). -> 4. `process_fund`'s seed-UTXO datum UPDATE blindly overwrote the -> captured good datum with the bad one when bug #3 fired. -> 5. `process_fund`'s milestone-update loop filtered `NOT withdrawn`, -> breaking index alignment with the fund datum (which always -> represents initial state) on periodic re-runs. +> multi-key hash. **Fix:** widened to `TEXT`. +> 3. `get_script_utxo_for_tx` LIMIT 1 with no ORDER BY picked a tiny +> `d87980` reference output instead of the kilobyte project datum. +> **Fix:** ORDER BY length DESC. +> 4. `process_fund` blindly overwrote a good captured datum with the bad +> one when bug #3 fired. **Fix:** preserve-larger-datum guard. +> 5. `process_fund`'s milestone-update filtered `NOT withdrawn`, breaking +> index alignment with the fund datum on re-runs. **Fix:** removed. +> 6. `get_script_utxo_for_tx` queried yaci_store first and never fell +> back to `treasury.utxo_history` even when the latter had a longer +> captured datum (only surfaces post-resync because some funds have +> a *spent-and-pruned* vendor-contract output and an *unspent* +> treasury reference output — yaci_store retains the small one). +> **Fix:** UNION ALL across both sources, ORDER BY length DESC. > -> **Schema refactor note:** project-level columns moved out of -> `treasury.vendor_contracts` into `treasury.projects`. Milestones and -> events FK to `projects.id` via `project_db_id`. `treasury.utxos` was -> removed in favour of `treasury.utxo_history`. +> **Schema refactor note:** project-level columns moved from +> `treasury.vendor_contracts` to `treasury.projects`. Milestones and +> events FK via `project_db_id`. `treasury.utxos` removed in favour of +> `treasury.utxo_history`. > -> **Still open:** KI-OC-02 (on-chain limitation, can't fix), KI-VND-05 -> (2 corrupted-datum projects requiring true cold resync), KI-MOD-01 -> (modify-event milestones don't pick up datum updates). +> **Still open:** KI-OC-02 (on-chain limitation, can't fix), KI-MOD-01 +> (modify-event milestones don't pick up datum updates), small KI-EVT-01 +> regression on KI-MOD-01-affected projects (12 NULL events). ## How to use this doc @@ -90,16 +97,19 @@ FROM treasury.treasury_contracts; ### A.2 `treasury.projects` (formerly project-level cols on `vendor_contracts`) -#### KI-VND-01 — `vendor_payment_key_hash` NULL on `UTXO-*` projects *(RESOLVED — five-bug cascade fixed)* +#### KI-VND-01 — `vendor_payment_key_hash` NULL on `UTXO-*` projects *(RESOLVED — six-bug cascade, verified post cold resync)* -The original "10/42 NULL" symptom turned out to be a cascade of five +The original "10/42 NULL" symptom turned out to be a cascade of six separate bugs, not the single parser-strictness defect the previous analysis suspected. The parser was always correct on real CBOR (proven -by three new fixture tests in `api/src/parsers/datum.rs`); a postgres +by four fixture tests in `api/src/parsers/datum.rs`); a postgres column-width error in the `UPDATE` step was being swallowed by an all-or-nothing `match` and a misleading DEBUG-level log. -##### The five bugs and their fixes +After the cold resync verified all six fixes work end-to-end: +**0/42 NULL key hashes, 0 parse errors.** + +##### The six bugs and their fixes 1. **Sync race during cold catch-up** — `sync_all_events` ran once at API startup. During catch-up, `yaci_store.transaction_metadata` was @@ -143,6 +153,21 @@ all-or-nothing `match` and a misleading DEBUG-level log. **Fix:** removed `AND NOT withdrawn` from the select. The fund tx's datum represents *initial* state; we always update by `milestone_order` regardless of current withdrawn flag. +6. **`get_script_utxo_for_tx` never preferred `utxo_history` over + yaci_store when both had a row** — the yaci_store query ran first + and returned whatever was there. For some fund txs (e.g. + `b39d013c…`, `5bc5a75e…`) the *vendor-contract* output was spent and + pruned from yaci_store but captured by the trigger into + utxo_history; the *unspent* treasury-reference output (`d87980`, + 3 bytes) survived in yaci_store. Result: yaci_store returned the + trivial datum and we never consulted utxo_history's real one. + This bug was invisible on the first cold-resync test because the + spent-and-pruned outputs were re-fetched while the trigger was + armed; it surfaced only when querying for fund-time state of older + txs after their vendor-contract outputs had since been spent. + **Fix:** `UNION ALL` yaci_store and utxo_history in a single query, + `ORDER BY length(datum) DESC LIMIT 1`. Source-agnostic: always picks + the longer datum across both. ##### Defensive hardening also landed @@ -155,22 +180,22 @@ all-or-nothing `match` and a misleading DEBUG-level log. `treasury.milestones` for SQL-queryable diagnostics. - **`tracing::debug!` → `tracing::warn!`** for parse failures so they appear in default logs. -- **Three real-CBOR fixture tests** in `api/src/parsers/datum.rs` - (UTXO-EMI-0001-25, UTXO-EC-0002-25-01, partial-parse smoke test). +- **Four real-CBOR fixture tests** in `api/src/parsers/datum.rs` + (UTXO-EMI-0001-25, UTXO-EC-0002-25-01, UTXO-EC-0002-25-03, + partial-parse smoke test). -##### Verified counts (after fix landed + 2 sync_all_events runs) +##### Verified counts (after cold resync from `STORE_CARDANO_SYNC_START_SLOT`) | Metric | Before | After | |---|---:|---:| -| `treasury.projects` NULL `vendor_payment_key_hash` | 10 / 42 | **1 / 42** | -| `treasury.projects.datum_parse_error` set | n/a | **2 / 42** | +| `treasury.projects` NULL `vendor_payment_key_hash` | 10 / 42 | **0 / 42** | +| `treasury.projects.datum_parse_error` set | n/a | **0 / 42** | | `treasury.milestones` NULL `amount_lovelace` (active) | 136 / 386 | **16 / 364** | -The remaining 1 NULL key hash + 16 NULL milestone amounts are -concentrated in the 2 projects flagged by KI-VND-05 (data-corruption -casualties of bug #4 before it was fixed) and 1 project surfaced by -KI-MOD-01 (modify events create new milestone rows that don't pick up -the new contract output's datum). +The remaining 16 NULL milestone amounts are all from KI-MOD-01 (modify +events created new milestone rows with new IDs that don't pick up the +new contract output's datum). 8 each on `UTXO-EC-0002-25-03` and +`UTXO-EC-0002-25-04`. ##### Repro queries @@ -186,31 +211,24 @@ WHERE NOT m.archived AND m.amount_lovelace IS NULL GROUP BY p.project_id ORDER BY 2 DESC; ``` -#### KI-VND-05 — Datum corruption from prior bug #4 *(OPEN — requires cold resync to recover)* -- **Affected:** `UTXO-EC-0002-25-03` (fund tx `b39d013c…`) and - `EC-0013(1,2,7)-25` (fund tx `5bc5a75e…`). Their - `treasury.utxo_history.inline_datum_cbor` is currently `d87980` (6 - bytes — empty `Constr(0, [])`) instead of the original kilobyte-scale - project datum. -- **Why:** before bug #4 was fixed, a periodic re-run of `process_fund` - picked the wrong UTXO (bug #3) and overwrote the good captured datum - with the empty change-output datum (bug #4). yaci_store has since - pruned the original outputs, so the datum can't be re-fetched from - the local DB. -- **Recovery:** wipe the postgres volume and re-sync from - `STORE_CARDANO_SYNC_START_SLOT`. The triggers (KI-UTX-01) capture - the original outputs before pruning, and the now-fixed `process_fund` - preserves them. - ```bash - ./dev.sh stop - docker volume rm administration-data_postgres_data - ./dev.sh start - ``` -- **Impact if not run:** 8 + 8 = 16 active milestones permanently NULL - on `amount_lovelace`/`time_limit`/`paused`. Production deployments - that ran continuously while bug #4 was active are likely also - affected; check - `SELECT project_id FROM treasury.projects WHERE datum_parse_error LIKE 'top-level datum has 0 fields%'`. +#### KI-VND-05 — Datum corruption from prior bug #4 *(RESOLVED — cold resync + bug #6 fix)* +- **Was:** `UTXO-EC-0002-25-03` (fund tx `b39d013c…`) and + `EC-0013(1,2,7)-25` (fund tx `5bc5a75e…`) had their captured datums + overwritten with `d87980` (6 bytes) before bug #4 was fixed. +- **Resolution path:** the cold resync from + `STORE_CARDANO_SYNC_START_SLOT` (with the trigger armed before + yaci_store ingestion) captured the original kilobyte-scale datums + into `treasury.utxo_history`. The merged-source query (bug #6 fix in + `get_script_utxo_for_tx`) ensures the captured datum wins over the + surviving 3-byte yaci_store reference output. +- **Verified:** `b39d013c…` output 0 = 1320 bytes, `5bc5a75e…` output 0 + = 1414 bytes; both parse to 20 + 23 milestones with no errors. + `vendor_payment_key_hash` and `datum_parse_error` columns now + populated/clear on these projects. +- **Operator note:** if a production deployment ran continuously while + bugs #3 and #4 were active, it may have similarly corrupted datums. + Check with `SELECT project_id FROM treasury.projects WHERE + datum_parse_error IS NOT NULL`. Recovery is the same wipe-and-resync. #### KI-MOD-01 — `modify` events create milestones with NULL datum fields *(OPEN — small follow-up)* - **Pattern:** when a `modify` event archives a milestone and creates a @@ -338,22 +356,23 @@ FROM treasury.milestones; - Treasury-level events (publish, initialize, disburse) have NULL `project_db_id` by design — they aren't tied to a project. -#### KI-EVT-01-residual — 4 events still NULL, blocked on KI-VND-05 corruption *(OPEN — backfills on cold resync)* -- The 4 events are descendants of the 2 KI-VND-05 corrupted projects. - Their seed UTXOs in `treasury.utxo_history` have `project_db_id IS - NULL` because `process_fund` skipped seed propagation for those - projects when bug #4 corrupted the captured datum. -- **Tx hashes:** - - `76ea3cc35a57…` (withdraw, slot 172714231) - - `6db20bb408c4…` (complete, slot 176999799) - - `b4d7a78ec2c8…` (complete, slot 177000042) - - `d3b6f4451d5c…` (withdraw, slot 185140469) -- **Recovery:** runs automatically once KI-VND-05's cold resync clears - the corrupted utxo_history rows. The next `sync_all_events` re-runs - `process_fund` on the original captured datums, seeds - `project_db_id` on the fund outputs, and `find_project_from_inputs` - (`event_processor.rs:1093`) backfills these 4 events via - `ON CONFLICT DO UPDATE`. +#### KI-EVT-01-residual — 12 events still NULL after cold resync *(OPEN — likely tied to KI-MOD-01)* +- After cold resync: 11 complete + 1 withdraw events have NULL + `project_db_id`. All cluster around slots 170M–173M, on + KI-MOD-01-affected projects where modify events introduced milestones + with non-original IDs (MS-N gaps). +- **Hypothesis:** `find_project_from_inputs` + (`event_processor.rs:1093`) uses `collect_milestone_id_hints` to + disambiguate when chain trace finds multiple candidate projects (see + KI-OC-03). When the event's milestone IDs (e.g., `MS-15`) appear in + modify-created milestone rows on more than one project, the hint + scoring is ambiguous and trace returns `None`. +- **Status:** investigation pending. Slight regression from the 4 NULLs + seen pre-cold-resync; the wipe also wiped any partially-seeded chain + state. Resolution probably involves tightening + `collect_milestone_id_hints` to use both milestone_id AND + milestone_order, or falling back to the input UTXO's + `project_db_id` directly when ambiguous. **Repro query** @@ -669,16 +688,16 @@ of `/api/v1/status`, but worth a one-line release note. | ID | Area | Status | Blocked on | |---|---|---|---| -| KI-VND-01 | NULL `vendor_payment_key_hash` on `UTXO-*` projects | **resolved** (5-bug cascade, 10/42 → 1/42) | — | +| KI-VND-01 | NULL `vendor_payment_key_hash` on `UTXO-*` projects | **resolved** (6-bug cascade, 10/42 → 0/42 post cold resync) | — | | KI-VND-02 | `vendor_name` deprecated | **resolved** (column dropped) | — | | KI-VND-03 | `contract_url` deprecated | **resolved** (column dropped) | — | | KI-VND-04 | `contract_address` NULL on cold replay | **resolved** (verified, 0/42) | — | -| KI-VND-05 | 2 corrupted utxo_history datums from prior bug #4 | **open** — requires cold resync to recover | — | +| KI-VND-05 | 2 corrupted utxo_history datums from prior bug #4 | **resolved** (cold resync + bug #6 merged-source query) | — | | KI-MIL-01 (`label`) | NULL `label` for `UTXO-*` | **resolved** (description fallback, 0/364) | — | -| KI-MIL-01 (`amount`/`time_limit`) | NULL datum-derived fields for `UTXO-*` | **largely resolved** (136/386 → 16/364) | KI-VND-05, KI-MOD-01 | +| KI-MIL-01 (`amount`/`time_limit`) | NULL datum-derived fields for `UTXO-*` | **largely resolved** (136/386 → 16/364) | KI-MOD-01 | | KI-MIL-01 (`acceptance_criteria`) | NULL for `UTXO-*` | **not a bug** — metadata genuinely lacks the field | — | -| KI-EVT-01 | NULL `project_db_id` on chain-trace failure | **resolved** (verified, 4/413 residual upstream) | — | -| KI-EVT-01-residual | 4 events still NULL on KI-VND-05 descendants | **open** — backfills on cold resync | KI-VND-05 | +| KI-EVT-01 | NULL `project_db_id` on chain-trace failure | **resolved** (verified, 12/413 residual upstream) | — | +| KI-EVT-01-residual | 12 events still NULL on KI-MOD-01-affected projects | **open** — likely milestone-id-hint disambiguation issue | KI-MOD-01 | | KI-MOD-01 | `modify` events create milestones with NULL datum fields | **open** — small follow-up fix | — | | KI-EVT-03 | NULL `milestone_id` on treasury-level events | by design | — | | KI-UTX-01 | historical-UTXO table + trigger | **implemented & verified** | — | From 2d0723707acb6a05d35857bd651aade17d268892 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Sun, 3 May 2026 12:01:19 +0100 Subject: [PATCH 16/19] update docs --- CLAUDE.md | 11 +- README.md | 36 +++--- api/README.md | 237 ++++++++++++++++++++++++++------------- database/README.md | 111 ++++++++++-------- docs/architecture.md | 208 +++++++++++++++++++--------------- docs/event-processing.md | 110 +++++++++--------- docs/known-issues.md | 14 +-- 7 files changed, 433 insertions(+), 294 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index d75e9da..530f08b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -31,12 +31,13 @@ Cardano Node → YACI Store indexer → PostgreSQL (yaci_store schema) This project implements the **Treasury Oversight Metadata (TOM)** standard, using CIP-100 metadata label **1694**. ### Contract Hierarchy -- **Treasury Contract (TRSC)** → at a unique script address, holds treasury reserve funds -- **Vendor Contract (PSSC)** → **ONE shared script address for ALL projects** (not one per project) +- **Treasury Contract (TRSC)** → at a unique script address, holds treasury reserve funds. Stored in `treasury.treasury_contracts`. +- **Vendor Contract (PSSC)** → **ONE shared script address for ALL projects** (not one per project). Stored in `treasury.vendor_contracts` (singleton row: `address`, `stake_credential`). - Each `fund` tx creates UTXOs at the shared PSSC address - UTXOs belong to specific projects, distinguished by inline datum, NOT by address - - UTXO chain tracking (`find_vendor_contract_from_inputs`) links events to projects by tracing spent inputs -- **Milestones** → belong to a vendor contract/project + - UTXO chain tracking (`find_project_from_inputs`) links events to projects by tracing spent inputs +- **Project** → one row per `fund` event (e.g. `EC-0008-25`). Stored in `treasury.projects`. Foreign-keyed from milestones, events, and UTXO history via `project_db_id`. +- **Milestones** → belong to a project ### Vendor Naming - `vendor.name` does **not exist** in the TOM spec — code extracts it but always gets null @@ -161,7 +162,7 @@ Never modify `yaci-store.jar` or YACI Store internals. Primary network: Mainnet - **Port 5433**: PostgreSQL is on host port 5433, not 5432. - **`.env` not committed**: copy `.env.example` and configure before first run. - **UTXO pruning**: YACI Store prunes spent UTXOs — historical UTXO data may not be available. -- **Cold replay vs continuous operation**: The milestone-event chain trace (`find_vendor_contract_from_inputs`) needs UTXO history to link withdraw/complete/pause/resume to a vendor contract. A continuously-running deployment captures each output before YACI Store prunes it; a fresh local sync from an old `STORE_CARDANO_SYNC_START_SLOT` cannot reconstruct chains whose inputs were pruned before sync caught up. Result: a fraction of historical milestone events will land in `treasury.events` with `vendor_contract_id = NULL` and won't update `treasury.milestones` flags. Mitigations: keep the API running, or pick a more recent start slot. +- **Cold replay vs continuous operation**: The milestone-event chain trace (`find_project_from_inputs`) needs UTXO history to link withdraw/complete/pause/resume to a project. The Postgres triggers installed by `install_utxo_history_triggers` (in `api/src/services/sync.rs`) capture every script-address UTXO into `treasury.utxo_history` synchronously with YACI Store's INSERT, so pruning no longer drops chain-trace inputs. Triggers only protect from the moment they're armed — to recover pre-existing pruned data, wipe the database volume and re-sync with the API running so the triggers arm before YACI Store ingests. See [`docs/known-issues.md`](docs/known-issues.md) `KI-CR-01` and `KI-UTX-01`. - **Large JAR**: `indexer/yaci-store.jar` is ~108MB and committed to the repo. Don't regenerate unnecessarily. - **Inline datums**: `store.script.enabled=true` in YACI Store config enables milestone datum data (amounts, time limits, pause flags). Requires full re-sync after enabling. - **Milestone archiving**: Filter `WHERE NOT archived` for current milestones. Archived rows are historical versions. diff --git a/README.md b/README.md index 011cb36..cb6f19c 100644 --- a/README.md +++ b/README.md @@ -124,22 +124,29 @@ Interactive documentation available at `/docs` (Swagger UI). | `GET /api/v1/treasury/utxos` | Treasury UTXOs | | `GET /api/v1/treasury/events` | Treasury-level events | -### Vendor Contracts (Projects) +### Vendor Contract (singleton PSSC) | Endpoint | Description | |----------|-------------| -| `GET /api/v1/vendor-contracts` | List all vendor contracts (with pagination, filtering, search) | -| `GET /api/v1/vendor-contracts/:project_id` | Get vendor contract details | -| `GET /api/v1/vendor-contracts/:project_id/milestones` | Get project milestones | -| `GET /api/v1/vendor-contracts/:project_id/events` | Get project event history | -| `GET /api/v1/vendor-contracts/:project_id/utxos` | Get project UTXOs | +| `GET /api/v1/vendor-contract` | Shared PSSC script address + project rollup by status | + +### Projects + +| Endpoint | Description | +|----------|-------------| +| `GET /api/v1/projects` | List all projects (with pagination, filtering, search) | +| `GET /api/v1/projects/:project_id` | Get project details | +| `GET /api/v1/projects/:project_id/milestones` | Get project milestones | +| `GET /api/v1/projects/:project_id/events` | Get project event history | +| `GET /api/v1/projects/:project_id/utxos` | Get project UTXOs | ### Milestones | Endpoint | Description | |----------|-------------| | `GET /api/v1/milestones` | List all milestones (with pagination, filtering) | -| `GET /api/v1/milestones/:id` | Get milestone details | +| `GET /api/v1/milestones/:project_id` | List milestones for a project (paginated) | +| `GET /api/v1/milestones/by-id/:id` | Get milestone by integer database ID | ### Events @@ -222,10 +229,11 @@ The system uses two schemas: | Table | Description | |-------|-------------| | `treasury.treasury_contracts` | Treasury reserve contracts (TRSC) | -| `treasury.vendor_contracts` | Vendor/project contracts (PSSC) | -| `treasury.milestones` | Project milestones (4 independent boolean flags + archive model) | -| `treasury.events` | All TOM event audit log | -| `treasury.utxos` | UTXO tracking for event linking (chain trace + datum cache) | +| `treasury.vendor_contracts` | Singleton row for the shared PSSC script address (one per deployment) | +| `treasury.projects` | One row per `fund` event (e.g. `EC-0008-25`); holds project metadata | +| `treasury.milestones` | Project milestones (4 independent boolean flags + archive model). FKs to `projects` via `project_db_id` | +| `treasury.events` | All TOM event audit log. FKs to `projects` via `project_db_id`; `destination` is JSONB | +| `treasury.utxo_history` | Persistent UTXO history (populated by Postgres triggers on `yaci_store.address_utxo`) for chain trace + datum cache | | `treasury.sync_status` | Heartbeat: per-stream `last_slot` / `last_block` / `updated_at` | ### Connecting to Database @@ -247,11 +255,11 @@ SELECT * FROM yaci_store.block ORDER BY number DESC LIMIT 5; -- Treasury summary SELECT * FROM treasury.v_treasury_summary; --- Vendor contracts with financials +-- Projects with financials SELECT project_id, project_name, status, initial_amount_lovelace / 1000000 as allocated_ada, total_withdrawn_lovelace / 1000000 as withdrawn_ada -FROM treasury.v_vendor_contracts_summary; +FROM treasury.v_projects_summary; -- Recent events SELECT * FROM treasury.v_events_with_context @@ -277,7 +285,7 @@ This reduces database size by ~95% while keeping all treasury data. ## Gotchas -- **Cold replay vs continuous operation**: a fresh local sync from an old `STORE_CARDANO_SYNC_START_SLOT` cannot reconstruct UTXO chains whose inputs YACI Store has already pruned. A fraction of historical milestone events will land with `vendor_contract_id = NULL`. See [`docs/known-issues.md`](docs/known-issues.md) `KI-CR-01` and `CLAUDE.md` for details. +- **Cold replay vs continuous operation**: a fresh local sync from an old `STORE_CARDANO_SYNC_START_SLOT` cannot reconstruct UTXO chains whose inputs were pruned *before* the `treasury.utxo_history` triggers were installed. With the triggers armed, every script-address UTXO YACI Store inserts is captured before pruning runs. To recover pre-existing pruned data, wipe the volume and re-sync with the API running so the triggers arm before YACI Store ingests. See [`docs/known-issues.md`](docs/known-issues.md) `KI-CR-01` / `KI-UTX-01`. - **Stale-looking sync timestamp**: `treasury.sync_status.updated_at` only bumps when new events arrive. A long delta does not mean the sync loop is dead. See `KI-SY-01`. ## License diff --git a/api/README.md b/api/README.md index 4485bf3..7267466 100644 --- a/api/README.md +++ b/api/README.md @@ -78,22 +78,37 @@ Returns the health status of the API. #### `GET /api/v1/status` -Get API status and sync information. +Get API status and sync information. Three time domains are surfaced separately: +`database.checked_at` (server-side), `sync.heartbeat` (server-side, last sync poll), +`sync.last_event_processed` (on-chain block time of most recent processed TOM event), +and `chain.indexer_time` (on-chain block time of YACI Store's tip). **Response:** ```json { "data": { - "api_version": "1.0.0", - "database_connected": true, - "last_sync_slot": 163964156, - "last_sync_block": 12296746, - "last_sync_time": 1704067200, - "total_events": 21, - "total_vendor_contracts": 5 + "api_version": "2.0.0", + "database": { + "connected": true, + "checked_at": "2026-05-01T10:30:00Z" + }, + "sync": { + "heartbeat": "2026-05-01T10:29:55Z", + "last_event_processed": { "unix": 1777623100, "iso": "2026-05-01T08:11:40Z" } + }, + "chain": { + "indexer_block": 12296746, + "indexer_slot": 163964156, + "indexer_time": { "unix": 1777623200, "iso": "2026-05-01T08:13:20Z" } + }, + "totals": { + "events": 411, + "projects": 42, + "events_by_type": { "fund": 42, "complete": 189, "withdraw": 129, "pause": 63, "resume": 32 } + } }, "meta": { - "timestamp": "2026-01-28T10:30:00Z" + "timestamp": "2026-05-01T10:30:00Z" } } ``` @@ -116,18 +131,18 @@ Get treasury contract details with statistics and financials. "stake_credential": "8583857e4a12ffe1e6f641a1785a0f2f036c565cfbe6ff9db8e5a469", "status": "active", "publish_tx_hash": "abc123...", - "publish_time": 1704067200, + "publish_time": { "unix": 1704067200, "iso": "2024-01-01T00:00:00Z" }, "initialized_tx_hash": "def456...", - "initialized_at": 1704067300, + "initialized_at": { "unix": 1704067300, "iso": "2024-01-01T00:01:40Z" }, "permissions": { ... }, "statistics": { - "vendor_contract_count": 10, - "active_contracts": 8, - "completed_contracts": 2, - "cancelled_contracts": 0, + "project_count": 42, + "active_contracts": 35, + "completed_contracts": 6, + "cancelled_contracts": 1, "total_events": 45, "utxo_count": 12, - "last_event_time": 1704153600 + "last_event_time": { "unix": 1704153600, "iso": "2024-01-02T00:00:00Z" } }, "financials": { "balance_lovelace": 264568247000000 @@ -174,11 +189,37 @@ Get treasury-level events (publish, initialize, sweep, reorganize). --- -### Vendor Contracts +### Vendor Contract (singleton PSSC) + +#### `GET /api/v1/vendor-contract` + +Get the shared vendor contract — the singleton on-chain script address every project sits at, plus a quick rollup of the projects bound to it. + +**Response:** +```json +{ + "data": { + "address": "addr1x...", + "stake_credential": "8583857e...", + "projects": { + "total": 42, + "by_status": { "active": 35, "completed": 6, "cancelled": 1 } + } + }, + "meta": { ... } +} +``` + +**Errors:** +- `404 Not Found` - Vendor contract not yet known (first fund event has not been processed) + +--- + +### Projects -#### `GET /api/v1/vendor-contracts` +#### `GET /api/v1/projects` -List all vendor contracts (projects) with pagination and filtering. +List all projects (one per `fund` event) with pagination and filtering. **Query Parameters:** @@ -195,7 +236,7 @@ List all vendor contracts (projects) with pagination and filtering. **Example:** ```bash -curl "http://localhost:8080/api/v1/vendor-contracts?status=active&search=community&limit=10" +curl "http://localhost:8080/api/v1/projects?status=active&search=community&limit=10" ``` **Response:** @@ -211,7 +252,7 @@ curl "http://localhost:8080/api/v1/vendor-contracts?status=active&search=communi "contract_address": "addr1x...", "status": "active", "fund_tx_hash": "abc123...", - "fund_time": 1704067200, + "fund_time": { "unix": 1704067200, "iso": "2024-01-01T00:00:00Z" }, "initial_amount_lovelace": 1000000000000, "milestones_summary": { "total": 5, @@ -230,7 +271,7 @@ curl "http://localhost:8080/api/v1/vendor-contracts?status=active&search=communi "treasury": { "contract_instance": "9e65e4ed..." }, - "last_event_time": 1704153600, + "last_event_time": { "unix": 1704153600, "iso": "2024-01-02T00:00:00Z" }, "event_count": 8 } ], @@ -244,9 +285,9 @@ curl "http://localhost:8080/api/v1/vendor-contracts?status=active&search=communi } ``` -#### `GET /api/v1/vendor-contracts/:project_id` +#### `GET /api/v1/projects/:project_id` -Get detailed information about a specific vendor contract. +Get detailed information about a specific project. **Path Parameters:** @@ -256,14 +297,22 @@ Get detailed information about a specific vendor contract. **Response:** Same as list item but with additional fields: - `other_identifiers`: Related project IDs +- `vendor_payment_key_hash`: Vendor payment key hash from inline datum - `created_at`, `updated_at`: Timestamps **Errors:** -- `404 Not Found` - Vendor contract not found +- `404 Not Found` - Project not found + +#### `GET /api/v1/projects/:project_id/milestones` + +Get all (non-archived) milestones for a specific project. Paginated. -#### `GET /api/v1/vendor-contracts/:project_id/milestones` +**Query Parameters:** -Get all milestones for a specific project. +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `page` | integer | 1 | Page number | +| `limit` | integer | 50 | Results per page (max: 100) | **Response:** ```json @@ -280,30 +329,35 @@ Get all milestones for a specific project. "time_limit": 1704240000000, "withdrawn": true, "evidence_provided": true, + "paused": false, "archived": false, "completion": { "tx_hash": "abc123...", - "time": 1704067200, + "time": { "unix": 1704067200, "iso": "2024-01-01T00:00:00Z" }, "description": "Research completed successfully", "evidence": [...] }, "withdrawal": { "tx_hash": "def456...", - "time": 1704153600, + "time": { "unix": 1704153600, "iso": "2024-01-02T00:00:00Z" }, "amount_lovelace": 200000000000 }, "archive_info": null, + "pause_history": null, "project": { "project_id": "EC-0008-25", "project_name": "Community Hub Development" } } ], + "pagination": { ... }, "meta": { ... } } ``` -#### `GET /api/v1/vendor-contracts/:project_id/events` +`pause_history` is non-null when at least one pause/resume event has been recorded for the milestone. It carries `currently_paused`, `last_pause_tx_hash` / `last_pause_time` and `last_resume_tx_hash` / `last_resume_time`. + +#### `GET /api/v1/projects/:project_id/events` Get event history for a specific project. @@ -315,9 +369,9 @@ Get event history for a specific project. | `limit` | integer | 50 | Results per page | | `type` | string | - | Filter by event type | -#### `GET /api/v1/vendor-contracts/:project_id/utxos` +#### `GET /api/v1/projects/:project_id/utxos` -Get current (unspent) UTXOs for a specific project. +Get current (unspent) UTXOs for a specific project. Paginated. --- @@ -338,10 +392,22 @@ List all milestones across all projects. | `archived` | boolean | false | Filter by archived status (defaults to false) | | `project_id` | string | - | Filter by project ID | | `sort` | string | - | Sort field: `milestone_order`, `complete_time`, `withdraw_time`, `amount` | +| `from_time` | integer | - | Filter by milestone time (Unix timestamp, from). Matches whichever of `complete_time` or `withdraw_time` is set on the row. | +| `to_time` | integer | - | Filter by milestone time (Unix timestamp, to). | -#### `GET /api/v1/milestones/:id` +#### `GET /api/v1/milestones/:project_id` -Get a specific milestone by database ID. +List milestones for a specific project (paginated). Convenience endpoint mirroring `/api/v1/projects/{project_id}/milestones`, served under the `/milestones/` root. + +**Path Parameters:** + +| Parameter | Type | Description | +|-----------|------|-------------| +| `project_id` | string | Project identifier (e.g., "EC-0008-25") | + +#### `GET /api/v1/milestones/by-id/:id` + +Get a specific milestone by integer database ID. The integer ID is rarely useful to clients; prefer the project-scoped lookup above. **Path Parameters:** @@ -367,6 +433,7 @@ List all events with full context. | `project_id` | string | - | Filter by project ID | | `from_time` | integer | - | Filter by time (Unix timestamp, from) | | `to_time` | integer | - | Filter by time (Unix timestamp, to) | +| `q` | string | - | Full-text search across `reason`, `destination`, and raw `metadata` (case-insensitive substring) | **Response:** ```json @@ -377,7 +444,7 @@ List all events with full context. "tx_hash": "abc123...", "slot": 163964156, "block_number": 12296746, - "block_time": 1704067200, + "block_time": { "unix": 1704067200, "iso": "2024-01-01T00:00:00Z" }, "event_type": "fund", "amount_lovelace": 1000000000000, "reason": null, @@ -400,6 +467,8 @@ List all events with full context. } ``` +`destination` is a JSONB `{label, details}` object preserved as-is from the TOM metadata; populated on `disburse` events only. + #### `GET /api/v1/events/recent` Get recent events for activity feeds. @@ -439,30 +508,36 @@ Get comprehensive statistics across all data. "active_count": 1, "disbursed_count": 3 }, + "vendor_contracts": { + "total_count": 1, + "address": "addr1x...", + "project_count": 42, + "utxo_history_count": 1235, + "unspent_utxo_count": 449, + "current_balance_lovelace": 600000000000 + }, "projects": { - "total_count": 10, - "active_count": 8, - "completed_count": 2, + "total_count": 42, + "active_count": 35, + "completed_count": 6, "paused_count": 0, - "cancelled_count": 0 + "cancelled_count": 1 }, "milestones": { - "total_count": 50, - "pending_count": 20, - "completed_count": 15, - "withdrawn_count": 15 + "total_count": 364, + "pending_count": 100, + "completed_count": 60, + "withdrawn_count": 204 }, "events": { - "on_chain_count": 45, - "processed_count": 45, + "on_chain_count": 411, + "processed_count": 411, "by_type": { - "fund": 10, - "complete": 15, - "disburse": 15, - "publish": 1, - "initialize": 1, - "pause": 2, - "resume": 1 + "fund": 42, + "complete": 189, + "withdraw": 129, + "pause": 63, + "resume": 32 } }, "financials": { @@ -473,13 +548,15 @@ Get comprehensive statistics across all data. "sync": { "last_slot": 163964156, "last_block": 12296746, - "last_updated": "2024-01-15T12:00:00Z" + "last_updated": "2026-05-01T08:11:40Z" } }, "meta": { ... } } ``` +`vendor_contracts` is the singleton-PSSC rollup (see `GET /api/v1/vendor-contract`); `projects` counts rows in `treasury.projects`. + --- ## Event Types @@ -514,27 +591,35 @@ The API runs a background sync task (`api/src/services/sync.rs::run_sync_loop`) that drives event ingestion. The pipeline has four stages: 1. **Pre-fetch UTXOs** — `EventProcessor::pre_fetch_utxos` - (`api/src/services/event_processor.rs:1209`) batches the tx_hashes of + (`api/src/services/event_processor.rs`) batches the tx_hashes of pending TOM events and copies their outputs and inputs from - `yaci_store.address_utxo` into `treasury.utxos`. This captures UTXO data - before YACI Store can prune spent UTXOs (~2160 blocks / ~10 days). -2. **Dispatch** — `process_event` (`event_processor.rs:82`) reads + `yaci_store.address_utxo` into `treasury.utxo_history`. This is a + defensive backstop on top of the Postgres triggers (`install_utxo_history_triggers` + in `api/src/services/sync.rs`) that capture every script-address UTXO + into `treasury.utxo_history` synchronously with YACI Store's INSERT. +2. **Dispatch** — `process_event` (`event_processor.rs`) reads `body.body.event` and delegates to a per-event handler. Treasury-level events (`publish`, `initialize`, `disburse`, `sweep`, `reorganize`) write - to `treasury_contracts` + `events`; vendor-level events write to - `vendor_contracts` + `milestones` + `events`. -3. **Vendor-contract resolution** — milestone-level events - (`complete`/`withdraw`/`pause`/`resume`) take their `vendor_contract_id` + to `treasury_contracts` + `events`; project-level events write to + `projects` + `milestones` + `events`. +3. **Project resolution** — milestone-level events + (`complete`/`withdraw`/`pause`/`resume`) take their `project_db_id` from `body.identifier` when present, otherwise from - `find_vendor_contract_from_inputs` (`:1047`), which traces input UTXOs - back to the seed planted by the project's `fund` event. When multiple - project chains feed a single tx (sibling-project fee inputs, etc.) the - trace disambiguates by scoring candidate vendor_contracts against the - metadata's milestone keys (`collect_milestone_id_hints`, `:1450`). -4. **Insert** — `insert_event_full` (`:999`) writes one row per - `tx_hash` into `treasury.events` with `ON CONFLICT (tx_hash) DO UPDATE`, - preserving idempotency. Events are recorded even when the chain trace - fails (`vendor_contract_id IS NULL`) so nothing is silently dropped. + `find_project_from_inputs`, which traces input UTXOs back to the seed + planted by the project's `fund` event. When multiple project chains + feed a single tx (sibling-project fee inputs, etc.) the trace + disambiguates by scoring candidate projects against the metadata's + milestone keys (`collect_milestone_id_hints`). +4. **Insert** — `insert_event_full` writes one row per `tx_hash` into + `treasury.events` with `ON CONFLICT (tx_hash) DO UPDATE`, preserving + idempotency. Events are recorded even when the chain trace fails + (`project_db_id IS NULL`) so nothing is silently dropped. + +In addition to the incremental loop, a separate `tokio::spawn` task runs +`sync_all_events` every 10 minutes as an idempotent backfill — any event +that wedged the incremental loop (e.g. a postgres restart mid-batch) is +recovered by the next full re-sync via the `ON CONFLICT DO UPDATE` chain. +See `KI-SY-02` in `docs/known-issues.md`. Datum parsing (milestone amounts, time limits, paused flags, vendor payment key hash) lives in `api/src/parsers/datum.rs`; address parsing @@ -614,10 +699,11 @@ The API queries the `treasury` schema: | Table | Description | |-------|-------------| | `treasury.treasury_contracts` | Treasury reserve contracts (TRSC) | -| `treasury.vendor_contracts` | Vendor/project contracts (PSSC) | -| `treasury.milestones` | Project milestones | -| `treasury.events` | All TOM event audit log | -| `treasury.utxos` | UTXO tracking for event linking | +| `treasury.vendor_contracts` | Singleton row for the shared PSSC script address | +| `treasury.projects` | One row per `fund` event (the 42 active projects) | +| `treasury.milestones` | Project milestones; FK to `projects.id` via `project_db_id` | +| `treasury.events` | All TOM event audit log; FK to `projects.id` via `project_db_id`; `destination` is JSONB | +| `treasury.utxo_history` | Persistent UTXO history (Postgres-trigger captured) for chain trace + datum cache | | `treasury.sync_status` | Sync progress tracking | ### Views @@ -625,7 +711,8 @@ The API queries the `treasury` schema: | View | Description | |------|-------------| | `v_treasury_summary` | Treasury with statistics and financials | -| `v_vendor_contracts_summary` | Projects with milestone counts and financials | +| `v_projects_summary` | Projects with milestone counts and financials | | `v_events_with_context` | Events with treasury/project/milestone context | +| `v_recent_events` | Events with context, ordered by slot DESC | | `v_financial_summary` | Allocated vs withdrawn vs remaining | | `v_milestone_timeline` | Milestones with project context | diff --git a/database/README.md b/database/README.md index d1cf187..4b99b0a 100644 --- a/database/README.md +++ b/database/README.md @@ -11,12 +11,12 @@ The system uses two schemas: ## Treasury Schema Tables ### treasury.treasury_contracts -Stores treasury reserve contract instances (TRSC). +Stores treasury reserve contract instances (TRSC). Singleton in our deployment. | Column | Type | Description | |--------|------|-------------| | id | SERIAL | Primary key | -| contract_instance | TEXT | On-chain instance identifier (policy ID) | +| contract_instance | TEXT | On-chain instance identifier (policy ID, unique) | | contract_address | TEXT | Script address | | stake_credential | TEXT | Shared stake credential | | name | TEXT | Human-readable name | @@ -28,39 +28,49 @@ Stores treasury reserve contract instances (TRSC). | status | TEXT | active/paused | ### treasury.vendor_contracts -Stores vendor/project contract instances (PSSC). +Singleton row for the shared on-chain vendor contract (PSSC) script address — the *one* address every project's UTXOs sit at, distinguished only by inline datum. | Column | Type | Description | |--------|------|-------------| | id | SERIAL | Primary key | | treasury_id | INT | FK to treasury_contracts | -| project_id | TEXT | Logical identifier (e.g., "EC-0008-25") | -| other_identifiers | TEXT[] | Related IDs | -| project_name | TEXT | Project label | +| address | TEXT | Shared PSSC script address (unique) | +| stake_credential | TEXT | Stake credential portion of the address | + +### treasury.projects +One row per `fund` event (e.g. `EC-0008-25`). 42 rows in our deployment. Identified by `project_id`; funds and milestones live at the shared PSSC above, distinguished by inline datum. + +| Column | Type | Description | +|--------|------|-------------| +| id | SERIAL | Primary key | +| treasury_id | INT | FK to treasury_contracts | +| project_id | TEXT | Logical identifier (e.g., "EC-0008-25", unique) | +| other_identifiers | TEXT[] | Related IDs from `otherIdentifiers` array | +| project_name | TEXT | Label from fund event | | description | TEXT | Project description | -| vendor_name | TEXT | DEPRECATED: always null (TOM spec has no vendor.name) | -| vendor_address | TEXT | Payment destination | -| contract_url | TEXT | DEPRECATED: always null (no on-chain data available) | -| contract_address | TEXT | PSSC script address | +| vendor_address | TEXT | Payment destination (`vendor.label` in metadata) | +| contract_address | TEXT | PSSC script address (from fund tx output) | +| vendor_payment_key_hash | TEXT | Comma-joined hex hashes (multi-party datums produce multiple) | | fund_tx_hash | VARCHAR(64) | Fund transaction | -| fund_slot | BIGINT | Fund slot | -| fund_block_time | BIGINT | Fund block time | -| initial_amount_lovelace | BIGINT | Initial funding amount | +| fund_slot | BIGINT | Blockchain slot | +| fund_block_time | BIGINT | Block timestamp | +| initial_amount_lovelace | BIGINT | Initial funding amount (from tx output) | | status | TEXT | active/paused/completed/cancelled | +| datum_parse_error | TEXT | Set when fund datum parse failed; cleared on success | ### treasury.milestones -Stores milestone data for each vendor contract. Uses 4 independent boolean flags instead of a linear status; archive model preserves prior versions via `superseded_by`. +Stores milestone data for each project. Uses 4 independent boolean flags instead of a linear status; archive model preserves prior versions via `superseded_by`. State flags (all default FALSE, all independent): - `evidence_provided` — vendor submitted a `complete` event - `withdrawn` — vendor pulled funds via a `withdraw` event -- `paused` — derived from inline-datum parsing in `update_milestone_pause_from_datum` (`api/src/services/event_processor.rs:1320`); not present in metadata +- `paused` — derived from inline-datum parsing in `update_milestone_pause_from_datum` (`api/src/services/event_processor.rs`); not present in metadata - `archived` — milestone replaced by a `modify` event; the new row is linked via `superseded_by` and queries for current state should include `WHERE NOT archived` | Column | Type | Description | |--------|------|-------------| | id | SERIAL | Primary key | -| vendor_contract_id | INT | FK to vendor_contracts | +| project_db_id | INT | FK to projects (CASCADE) | | milestone_id | TEXT | Logical identifier (e.g., "m-0") | | milestone_order | INT | Position (1, 2, 3...) | | label | TEXT | Milestone name | @@ -82,6 +92,9 @@ State flags (all default FALSE, all independent): | archived_by_tx_hash | VARCHAR(64) | Modify tx that archived this milestone | | archived_at | BIGINT | Archive timestamp | | superseded_by | INT | FK to replacement milestone | +| datum_parse_error | TEXT | Set when datum parse failed for this milestone | + +A partial unique index `idx_milestone_active_unique` on `(project_db_id, milestone_id) WHERE NOT archived` ensures only one active row per logical milestone. ### treasury.events Audit log of all TOM (Treasury Oversight Metadata) events. @@ -95,18 +108,21 @@ Audit log of all TOM (Treasury Oversight Metadata) events. | block_time | BIGINT | Block timestamp | | event_type | TEXT | Event type | | treasury_id | INT | FK to treasury_contracts | -| vendor_contract_id | INT | FK to vendor_contracts | +| project_db_id | INT | FK to projects | | milestone_id | INT | FK to milestones | | amount_lovelace | BIGINT | Amount involved | | reason | TEXT | Justification (pause/cancel/modify) | -| destination | TEXT | Destination label (disburse) | +| destination | JSONB | Destination object `{label, details}` from disburse events | | metadata | JSONB | Original TOM metadata body | +| created_at | TIMESTAMPTZ | Row insert timestamp | -### treasury.utxos -Tracks UTXOs at treasury-related addresses for event linking. Two responsibilities: -1. **Chain trace seed** — outputs of `fund` txs are written here with `vendor_contract_id` set, so `find_vendor_contract_from_inputs` can later trace milestone-event inputs back to a project. +### treasury.utxo_history +Persistent UTXO history at treasury-related script addresses. Two responsibilities: +1. **Chain trace seed** — outputs of `fund` txs are written here with `project_db_id` set, so `find_project_from_inputs` can later trace milestone-event inputs back to a project. 2. **Datum cache** — `inline_datum_cbor` is stored on each UTXO so pause/resume datum parsing (`update_milestone_pause_from_datum`) keeps working after YACI Store has pruned the row out of `yaci_store.address_utxo`. +Population: Postgres triggers installed by `install_utxo_history_triggers` (`api/src/services/sync.rs`) capture every script-address (`addr1x*`) UTXO from `yaci_store.address_utxo` synchronously on INSERT, and flag rows as spent on `yaci_store.tx_input` INSERT. `pre_fetch_utxos` is a defensive backstop run during event processing. + | Column | Type | Description | |--------|------|-------------| | id | SERIAL | Primary key | @@ -114,7 +130,7 @@ Tracks UTXOs at treasury-related addresses for event linking. Two responsibiliti | output_index | SMALLINT | Output index | | address | TEXT | Owner address | | address_type | TEXT | treasury/vendor_contract/vendor | -| vendor_contract_id | INT | FK to vendor_contracts (chain-trace seed) | +| project_db_id | INT | FK to projects (chain-trace seed; NULL on non-script outputs) | | lovelace_amount | BIGINT | Amount | | inline_datum_cbor | TEXT | Hex-encoded inline datum (cached for post-prune datum parsing) | | slot | BIGINT | Creation slot | @@ -123,15 +139,19 @@ Tracks UTXOs at treasury-related addresses for event linking. Two responsibiliti | spent_tx_hash | VARCHAR(64) | Spending transaction | | spent_slot | BIGINT | When spent | +`UNIQUE(tx_hash, output_index)`. + ### treasury.sync_status Tracks synchronization progress. Two rows by convention: -- `sync_type='events'` — heartbeat for the TOM-event sync loop. `updated_at` only bumps when a new event is processed (idle ticks do not bump it; see [known issue KI-SY-01](../docs/known-issues.md#ki-sy-01--treasurysync_statusupdated_at-doesnt-bump-on-idle-ticks)). +- `sync_type='events'` — heartbeat for the TOM-event sync loop. `updated_at` bumps on every poll, including idle ticks. - `sync_type='utxos'` — checkpoint for the UTXO pre-fetch worker. +`last_slot` advances only on contiguous success — if an event fails mid-batch the watermark stays put so the failed event is retried on the next poll. A separate task runs `sync_all_events` every 10 minutes as an idempotent backfill safety net (see [`KI-SY-02`](../docs/known-issues.md)). + | Column | Type | Description | |--------|------|-------------| | id | SERIAL | Primary key | -| sync_type | TEXT | events/utxos | +| sync_type | TEXT | events/utxos (unique) | | last_slot | BIGINT | Last processed slot | | last_block | BIGINT | Last processed block | | last_tx_hash | VARCHAR(64) | Last processed tx | @@ -146,18 +166,18 @@ Treasury contracts with aggregated statistics and financials. SELECT * FROM treasury.v_treasury_summary; ``` -Fields: treasury_id, contract_instance, contract_address, stake_credential, status, publish_tx_hash, publish_time, initialized_tx_hash, initialized_at, permissions, vendor_contract_count, active_contracts, completed_contracts, cancelled_contracts, treasury_balance, utxo_count, total_events, last_event_time, created_at, updated_at +Fields: `treasury_id`, `contract_instance`, `contract_address`, `stake_credential`, `status`, `publish_tx_hash`, `publish_time`, `initialized_tx_hash`, `initialized_at`, `permissions`, `project_count`, `active_contracts`, `completed_contracts`, `cancelled_contracts`, `treasury_balance`, `utxo_count`, `total_events`, `last_event_time`, `created_at`, `updated_at`. -Note: `treasury_balance` and `utxo_count` are sourced from `treasury.utxos` (unspent UTXOs tracked by the sync service). +`treasury_balance` and `utxo_count` are sourced from `treasury.utxo_history` (unspent UTXOs at the treasury script address). -### treasury.v_vendor_contracts_summary -Vendor contracts with milestone counts, financials, and UTXO balance. +### treasury.v_projects_summary +Projects with milestone counts, financials, and UTXO balance. ```sql -SELECT * FROM treasury.v_vendor_contracts_summary; +SELECT * FROM treasury.v_projects_summary; ``` -Fields: id, treasury_id, project_id, other_identifiers, project_name, description, vendor_address, contract_address, fund_tx_hash, fund_slot, fund_block_time, initial_amount_lovelace, status, created_at, updated_at, treasury_instance, total_milestones, pending_milestones, completed_milestones, withdrawn_milestones, paused_milestones, total_withdrawn_lovelace, current_balance_lovelace, utxo_count, last_event_time, event_count +Fields: `id`, `treasury_id`, `project_id`, `other_identifiers`, `project_name`, `description`, `vendor_address`, `contract_address`, `fund_tx_hash`, `fund_slot`, `fund_block_time`, `initial_amount_lovelace`, `status`, `created_at`, `updated_at`, `treasury_instance`, `total_milestones`, `pending_milestones`, `completed_milestones`, `withdrawn_milestones`, `paused_milestones`, `total_withdrawn_lovelace`, `current_balance_lovelace`, `utxo_count`, `last_event_time`, `event_count`. ### treasury.v_events_with_context Events with full treasury/project/milestone context. @@ -166,7 +186,10 @@ Events with full treasury/project/milestone context. SELECT * FROM treasury.v_events_with_context ORDER BY block_time DESC; ``` -Fields: id, tx_hash, slot, block_number, block_time, event_type, amount_lovelace, reason, destination, metadata, created_at, treasury_instance, project_id, project_name, project_address, milestone_id, milestone_label, milestone_order +Fields: `id`, `tx_hash`, `slot`, `block_number`, `block_time`, `event_type`, `amount_lovelace`, `reason`, `destination`, `metadata`, `created_at`, `treasury_instance`, `project_id`, `project_name`, `project_address`, `milestone_id`, `milestone_label`, `milestone_order`. + +### treasury.v_recent_events +Same projection as `v_events_with_context`, ordered by `slot DESC` for activity feeds. ### treasury.v_financial_summary Financial summary showing allocated vs withdrawn vs remaining. @@ -175,29 +198,20 @@ Financial summary showing allocated vs withdrawn vs remaining. SELECT * FROM treasury.v_financial_summary; ``` -Fields: treasury_id, contract_instance, total_allocated_lovelace, total_withdrawn_lovelace, total_remaining_lovelace, treasury_balance_lovelace, project_balance_lovelace, project_count, active_project_count +Fields: `treasury_id`, `contract_instance`, `total_allocated_lovelace`, `total_withdrawn_lovelace`, `total_remaining_lovelace`, `treasury_balance_lovelace`, `project_balance_lovelace`, `project_count`, `active_project_count`. ### treasury.v_milestone_timeline -Milestones with vendor contract context. +Milestones with project context. ```sql SELECT * FROM treasury.v_milestone_timeline; ``` -Fields: id, milestone_id, milestone_order, label, description, acceptance_criteria, amount_lovelace, time_limit, withdrawn, evidence_provided, archived, complete_tx_hash, complete_time, complete_description, evidence, withdraw_tx_hash, withdraw_time, withdraw_amount, archived_by_tx_hash, archived_at, superseded_by, project_id, project_name, vendor_address - -### treasury.v_recent_events -Events with context, ordered by slot descending (for recent activity). - -```sql -SELECT * FROM treasury.v_recent_events LIMIT 10; -``` +Fields: `id`, `milestone_id`, `milestone_order`, `label`, `description`, `acceptance_criteria`, `amount_lovelace`, `time_limit`, `withdrawn`, `evidence_provided`, `archived`, `complete_tx_hash`, `complete_time`, `complete_description`, `evidence`, `withdraw_tx_hash`, `withdraw_time`, `withdraw_amount`, `archived_by_tx_hash`, `archived_at`, `superseded_by`, `project_id`, `project_name`, `vendor_address`. ## Running Migrations -### Using the API (automatic) - -The API automatically creates/updates the schema on startup via `db::init_treasury_schema()`. +The treasury schema is created on first PostgreSQL container start by `database/init/02-treasury-schema.sql`. The API also installs the `treasury.utxo_history` triggers at startup via `install_utxo_history_triggers` (`api/src/services/sync.rs`); these arm before YACI Store ingests so a fresh sync captures every script-address UTXO before pruning runs. ### Using psql directly @@ -225,7 +239,7 @@ YACI Store creates its own tables in the `yaci_store` schema. Key tables include - `tx_input` - Transaction inputs - `cursor_` - Current sync position -These tables are automatically created and maintained by YACI Store. +These tables are automatically created and maintained by YACI Store via Flyway. ## Indexes @@ -233,9 +247,10 @@ The schema includes indexes for: - Primary key lookups - Foreign key relationships - Status filtering -- Time-based ordering (fund_block_time, block_time) -- Text search (project_id, project_name, description) +- Time-based ordering (`fund_block_time`, `block_time`) +- Text search (`project_id`, `project_name`, `description`) - UTXO queries (unspent UTXOs, address lookups) +- A partial unique index on milestones to enforce one active row per `(project_db_id, milestone_id)` ## Example Queries @@ -249,7 +264,7 @@ SELECT current_balance_lovelace / 1000000.0 as balance_ada, total_milestones, withdrawn_milestones -FROM treasury.v_vendor_contracts_summary +FROM treasury.v_projects_summary WHERE status = 'active' ORDER BY fund_block_time DESC; diff --git a/docs/architecture.md b/docs/architecture.md index 5d61005..99e9363 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -32,10 +32,11 @@ This document describes how data flows through the Cardano Administration Data S │ │ (raw blockchain data) │ │ (normalized app data) │ │ │ │ │ │ │ │ │ │ • block │ │ • treasury_contracts │ │ -│ │ • transaction │ │ • vendor_contracts │ │ -│ │ • address_utxo │ │ • milestones │ │ -│ │ • transaction_metadata │ │ • events │ │ -│ │ • tx_input │ │ • utxos │ │ +│ │ • transaction │ │ • vendor_contracts (PSSC) │ │ +│ │ • address_utxo │ │ • projects │ │ +│ │ • transaction_metadata │ │ • milestones │ │ +│ │ • tx_input │ │ • events │ │ +│ │ │ │ • utxo_history │ │ │ └─────────────────────────────┘ └─────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────────────────┘ │ @@ -181,14 +182,18 @@ three things every 15 seconds: 1. Reads `treasury.sync_status` to find `last_slot` for `sync_type = 'events'`. 2. Selects new label-`1694` rows from `yaci_store.transaction_metadata` past - that slot, plus a one-shot pre-fetch of their UTXOs into `treasury.utxos` - via `EventProcessor::pre_fetch_utxos`. The pre-fetch captures both the - tx's outputs and the inputs it spends, *before* YACI Store can prune - spent UTXOs (~2160 blocks / ~10 days). This is what makes pause/resume - datum parsing and chain tracing keep working long after the on-chain - UTXO is gone. -3. Dispatches each event through the per-type handler and updates - `treasury.sync_status` to the highest successfully-processed slot. + that slot, plus a one-shot pre-fetch of their UTXOs into + `treasury.utxo_history` via `EventProcessor::pre_fetch_utxos`. This is + a defensive backstop on top of the Postgres triggers + (`install_utxo_history_triggers` in `api/src/services/sync.rs`) that + capture every script-address UTXO into `treasury.utxo_history` + synchronously with YACI Store's INSERT, regardless of pruning. This is + what makes pause/resume datum parsing and chain tracing keep working + long after the on-chain UTXO is gone. +3. Dispatches each event through the per-type handler and advances + `treasury.sync_status` only on contiguous success (any failed event + wedges the watermark). A separate task runs `sync_all_events` every 10 + minutes as an idempotent backfill via `ON CONFLICT DO UPDATE`. > **Caveat — `last_slot` advancement on errors.** If a single event fails > mid-batch (e.g. DB connection reset), the loop logs and continues; later @@ -216,8 +221,9 @@ three things every 15 seconds: └─────────────────────────────────────────────────────────────────────────────┘ │ │ pre_fetch_utxos(batch tx_hashes) - │ ──► treasury.utxos (raw output rows - │ captured before YACI prunes) + │ ──► treasury.utxo_history (raw output rows + │ captured before YACI prunes; primary + │ capture is via Postgres triggers) │ │ SELECT WHERE slot > last_synced_slot ▼ @@ -245,15 +251,20 @@ three things every 15 seconds: ┌─────────────────────────────────────────────────────────────────────────────┐ │ treasury schema │ │ │ -│ treasury_contracts vendor_contracts milestones events │ -│ ┌───────────────┐ ┌───────────────┐ ┌───────────┐ ┌──────────┐ │ -│ │ id │ │ id │ │ id │ │ id │ │ -│ │ instance │◄────│ treasury_id │◄───│ vendor_id │ │ tx_hash │ │ -│ │ stake_cred │ │ project_id │ │ label │ │ event │ │ -│ │ publish_tx │ │ project_name │ │ withdrawn │ │ metadata │ │ -│ └───────────────┘ │ status │ │ paused │ └──────────┘ │ -│ └───────────────┘ │ archived │ │ -│ └───────────┘ │ +│ treasury_contracts projects milestones events │ +│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ ┌──────────┐ │ +│ │ id │ │ id │ │ id │ │ id │ │ +│ │ instance │◄───│ treasury_id │◄───│ project_db_id │ │ tx_hash │ │ +│ │ stake_cred │ │ project_id │ │ label │ │ event │ │ +│ │ publish_tx │ │ project_name │ │ withdrawn │ │ metadata │ │ +│ └───────────────┘ │ status │ │ evidence_* │ └──────────┘ │ +│ └───────────────┘ │ paused │ │ +│ vendor_contracts │ archived │ │ +│ ┌───────────────┐ │ superseded_by │ │ +│ │ id │ └───────────────┘ │ +│ │ address (PSSC)│ │ +│ │ stake_cred │ │ +│ └───────────────┘ │ └─────────────────────────────────────────────────────────────────────────────┘ ``` @@ -293,34 +304,41 @@ three things every 15 seconds: │ └──────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ - │ 2. INSERT vendor_contracts │ + │ 2. UPSERT vendor_contracts (singleton PSSC row at the shared addr) │ │ ┌──────────────────────────────────────────────────────────────┐ │ - │ │ INSERT INTO treasury.vendor_contracts │ │ + │ │ INSERT INTO treasury.vendor_contracts (address, ...) │ │ + │ │ ON CONFLICT (address) DO NOTHING │ │ + │ └──────────────────────────────────────────────────────────────┘ │ + │ │ │ + │ ▼ │ + │ 3. INSERT projects │ + │ ┌──────────────────────────────────────────────────────────────┐ │ + │ │ INSERT INTO treasury.projects │ │ │ │ (project_id, project_name, vendor_address, ...) │ │ │ │ VALUES ('project-001', 'My Project', 'addr1q...', ...) │ │ │ └──────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ - │ 3. INSERT milestones (for each milestone in array) │ + │ 4. INSERT milestones (for each milestone in array) │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ INSERT INTO treasury.milestones │ │ - │ │ (vendor_contract_id, milestone_id, label, amount) │ │ + │ │ (project_db_id, milestone_id, label, amount) │ │ │ │ VALUES (1, 'm1', 'Phase 1', 1000000) │ │ │ │ VALUES (1, 'm2', 'Phase 2', 2000000) │ │ │ └──────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ - │ 4. INSERT event record │ + │ 5. INSERT event record │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ INSERT INTO treasury.events │ │ - │ │ (tx_hash, event_type, vendor_contract_id, metadata) │ │ + │ │ (tx_hash, event_type, project_db_id, metadata) │ │ │ └──────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ - │ 5. Track UTXOs for future event lookups │ + │ 6. Track UTXOs for future event lookups │ │ ┌──────────────────────────────────────────────────────────────┐ │ - │ │ INSERT INTO treasury.utxos (tx_hash, output_index, │ │ - │ │ vendor_contract_id, spent) │ │ + │ │ INSERT INTO treasury.utxo_history (tx_hash, output_index, │ │ + │ │ project_db_id, spent) │ │ │ └──────────────────────────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────────────────┘ @@ -346,8 +364,8 @@ three things every 15 seconds: │ outputs: │ │ [0] → UTXO₁ (contract address, 10,000 ADA) │ │ │ - │ ──► Record in treasury.utxos: │ - │ (tx_hash="abc123", output_index=0, vendor_contract_id=1) │ + │ ──► Record in treasury.utxo_history: │ + │ (tx_hash="abc123", output_index=0, project_db_id=1) │ └─────────────────────────────────────────────────────────────────────────┘ │ │ UTXO₁ is spent @@ -364,11 +382,11 @@ three things every 15 seconds: │ outputs: │ │ [0] → UTXO₂ (contract address, 9,000 ADA) │ │ │ - │ ──► find_vendor_contract_from_inputs("def456"): │ + │ ──► find_project_from_inputs("def456"): │ │ 1. Get inputs: [(abc123, 0)] │ - │ 2. Lookup treasury.utxos WHERE tx_hash="abc123" AND index=0 │ - │ 3. Found! vendor_contract_id = 1 │ - │ 4. Mark UTXO₁ as spent, record UTXO₂ with vendor_contract_id=1 │ + │ 2. Lookup treasury.utxo_history WHERE tx_hash="abc123" AND index=0│ + │ 3. Found! project_db_id = 1 │ + │ 4. Mark UTXO₁ as spent, record UTXO₂ with project_db_id=1 │ └─────────────────────────────────────────────────────────────────────────┘ │ │ UTXO₂ is spent @@ -382,10 +400,10 @@ three things every 15 seconds: │ inputs: │ │ [0] ← UTXO₂ (spending def456:0) │ │ │ - │ ──► find_vendor_contract_from_inputs("ghi789"): │ + │ ──► find_project_from_inputs("ghi789"): │ │ 1. Get inputs: [(def456, 0)] │ - │ 2. Lookup treasury.utxos WHERE tx_hash="def456" AND index=0 │ - │ 3. Found! vendor_contract_id = 1 │ + │ 2. Lookup treasury.utxo_history WHERE tx_hash="def456" AND index=0│ + │ 3. Found! project_db_id = 1 │ │ 4. UPDATE milestones SET withdrawn=TRUE WHERE milestone_id='m1' │ └─────────────────────────────────────────────────────────────────────────┘ ``` @@ -393,22 +411,25 @@ three things every 15 seconds: #### Disambiguation when a tx pulls inputs from multiple project chains A single milestone-level tx can include fee/collateral inputs from a sibling -project's UTXO chain. `find_vendor_contract_from_inputs` collects every -candidate `vendor_contract_id`, then scores each candidate by how many of the -tx's metadata `body.milestones` keys (collected via -`collect_milestone_id_hints`, `event_processor.rs:1450`) match milestones -stored for that vendor contract. The best-scoring candidate wins; ties fall -back to the first input. +project's UTXO chain. `find_project_from_inputs` collects every candidate +`project_db_id`, then scores each candidate by how many of the tx's metadata +`body.milestones` keys (collected via `collect_milestone_id_hints` in +`event_processor.rs`) match milestones stored for that project. The +best-scoring candidate wins; ties fall back to the first input. #### Cold replay — when chain tracing can't reconstruct the link -If a fresh local sync starts from a `STORE_CARDANO_SYNC_START_SLOT` far behind -tip, by the time the indexer is processing event N some of its input UTXOs -from earlier events may already have been pruned by YACI Store. The chain -trace returns `None`; the event is still recorded in `treasury.events` (with -`vendor_contract_id = NULL`) so nothing is silently dropped, but milestone +The Postgres triggers installed by `install_utxo_history_triggers` +(`api/src/services/sync.rs`) capture every script-address UTXO into +`treasury.utxo_history` synchronously with YACI Store's INSERT, so the +chain-trace input is always available regardless of pruning — *provided +the triggers were armed before the relevant blocks were ingested*. If a +fresh local sync runs against a database where YACI Store has already +pruned UTXOs from before the triggers were installed, the chain trace can +return `None`; the event is still recorded in `treasury.events` (with +`project_db_id = NULL`) so nothing is silently dropped, but milestone state flags can't be updated. See -[`docs/known-issues.md` `KI-CR-01`](known-issues.md#ki-cr-01--fresh-local-sync-cant-reconstruct-fully-pruned-chains). +[`docs/known-issues.md` `KI-CR-01`](known-issues.md) and `KI-UTX-01`. ### Stage 6: API Request Flow @@ -417,24 +438,24 @@ state flags can't be updated. See │ API REQUEST FLOW │ └──────────────────────────────────────────────────────────────────────────────┘ - Client Request: GET /api/v1/vendor-contracts/EC-0008-25 + Client Request: GET /api/v1/projects/EC-0008-25 │ ▼ ┌─────────────────────────────────────────────────────────────────────────┐ │ AXUM ROUTER │ │ │ │ .nest("/api/v1", routes::v1::router()) │ - │ → /vendor-contracts/:project_id → get_vendor_contract() │ + │ → /projects/:project_id → get_project() │ └─────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────┐ - │ routes/v1/vendor_contracts.rs │ + │ routes/v1/projects.rs │ │ │ - │ pub async fn get_vendor_contract( │ + │ pub async fn get_project( │ │ Extension(pool): Extension, │ │ Path(project_id): Path, │ - │ ) -> Result>, StatusCode> │ + │ ) -> Result>, ApiError> │ └─────────────────────────────────────────────────────────────────────────┘ │ │ SQL Query @@ -442,7 +463,7 @@ state flags can't be updated. See ┌─────────────────────────────────────────────────────────────────────────┐ │ PostgreSQL │ │ │ - │ SELECT * FROM treasury.v_vendor_contracts_summary │ + │ SELECT * FROM treasury.v_projects_summary │ │ WHERE project_id = 'EC-0008-25' │ └─────────────────────────────────────────────────────────────────────────┘ │ @@ -475,43 +496,45 @@ state flags can't be updated. See │ TREASURY SCHEMA (treasury.*) │ └──────────────────────────────────────────────────────────────────────────────┘ - ┌─────────────────────┐ - │ treasury_contracts │ + ┌─────────────────────┐ ┌─────────────────────┐ + │ treasury_contracts │ │ vendor_contracts │ (Singleton PSSC row) + ├─────────────────────┤ ├─────────────────────┤ + │ id (PK) │ │ id (PK) │ + │ contract_instance │◄─┐ │ treasury_id (FK) │─┐ + │ stake_credential │ │ │ address (PSSC, uniq)│ │ + │ publish_tx_hash │ │ │ stake_credential │ │ + │ initialized_at │ │ └─────────────────────┘ │ + └─────────────────────┘ │ │ + │ │ │ + │ 1:N │ │ + ▼ │ │ + ┌─────────────────────┐ │ ┌─────────────────────┐ + │ projects │ │ │ events │ + ├─────────────────────┤ │ ├─────────────────────┤ + │ id (PK) │◄─┼───│ project_db_id │ + │ treasury_id (FK) │──┘ │ treasury_id (FK) │ + │ project_id (unique) │ │ milestone_id (FK) │─┐ + │ project_name │ │ tx_hash (unique) │ │ + │ vendor_address │ │ event_type │ │ + │ status │ │ slot │ │ + │ contract_address │ │ destination (JSONB) │ │ + │ vendor_payment_* │ │ metadata (JSONB) │ │ + └─────────────────────┘ └─────────────────────┘ │ + │ │ + │ 1:N │ + ▼ │ + ┌─────────────────────┐ │ + │ milestones │◄─────────────────────────────┘ ├─────────────────────┤ │ id (PK) │ - │ contract_instance │◄─────────────────────────────────────────────┐ - │ stake_credential │ │ - │ publish_tx_hash │ │ - │ initialized_at │ │ - └─────────────────────┘ │ - │ │ - │ 1:N │ - ▼ │ - ┌─────────────────────┐ ┌─────────────────────┐ │ - │ vendor_contracts │ │ events │ │ - ├─────────────────────┤ ├─────────────────────┤ │ - │ id (PK) │◄────────│ vendor_contract_id │ │ - │ treasury_id (FK) │─────────│ treasury_id (FK) │─────────────┘ - │ project_id (unique) │ │ milestone_id (FK) │─────┐ - │ project_name │ │ tx_hash (unique) │ │ - │ vendor_address │ │ event_type │ │ - │ status │ │ slot │ │ - │ contract_address │ │ metadata (JSONB) │ │ - └─────────────────────┘ └─────────────────────┘ │ - │ │ - │ 1:N │ - ▼ │ - ┌─────────────────────┐ │ - │ milestones │◄────────────────────────────────────┘ - ├─────────────────────┤ - │ id (PK) │ - │ vendor_contract_id │ + │ project_db_id │ │ milestone_id │ │ label │ │ amount_lovelace │ │ time_limit │ │ withdrawn │ │ evidence_provided │ + │ paused │ │ archived │ │ withdraw_tx_hash │ │ complete_tx_hash │ @@ -519,13 +542,14 @@ state flags can't be updated. See └─────────────────────┘ ┌─────────────────────┐ - │ utxos │ (Tracks UTXO chain for event linking) + │ utxo_history │ (Trigger-captured UTXO history at script addresses) ├─────────────────────┤ - │ tx_hash (PK) │ - │ output_index (PK) │ - │ vendor_contract_id │ + │ tx_hash │ + │ output_index │ + │ project_db_id │ │ address │ │ lovelace_amount │ + │ inline_datum_cbor │ │ spent │ │ spent_tx_hash │ └─────────────────────┘ diff --git a/docs/event-processing.md b/docs/event-processing.md index 069f2bf..7f3c799 100644 --- a/docs/event-processing.md +++ b/docs/event-processing.md @@ -49,7 +49,7 @@ UTXOs at the shared address are distinguished by their **inline datum** (contain ### Implications for UTXO Tracking -- `find_vendor_contract_from_inputs()` traces inputs back through the UTXO chain — the correct and only approach for linking events to projects +- `find_project_from_inputs()` traces inputs back through the UTXO chain — the correct and only approach for linking events to projects - UTXO tracking relies exclusively on chain tracing by specific (tx_hash, output_index) pairs, not by address --- @@ -189,11 +189,11 @@ Records the tx hash and block time. Also queries `yaci_store.address_utxo` for t #### Code Extraction (`process_fund`) | Metadata Path | Extracted As | DB Column | |---------------|-------------|-----------| -| `body.identifier` | string | `vendor_contracts.project_id` | -| `body.label` | `extract_text()` | `vendor_contracts.project_name` | -| `body.description` | `extract_text()` | `vendor_contracts.description` | -| `body.vendor.label` | `extract_text_from_value()` | `vendor_contracts.vendor_address` | -| `body.otherIdentifiers` | string array | `vendor_contracts.other_identifiers` | +| `body.identifier` | string | `projects.project_id` | +| `body.label` | `extract_text()` | `projects.project_name` | +| `body.description` | `extract_text()` | `projects.description` | +| `body.vendor.label` | `extract_text_from_value()` | `projects.vendor_address` | +| `body.otherIdentifiers` | string array | `projects.other_identifiers` | | `body.milestones[].identifier` | string | `milestones.milestone_id` | | `body.milestones[].label` | `extract_text_from_value()` | `milestones.label` | | `body.milestones[].description` | `extract_text_from_value()` | `milestones.description` | @@ -247,12 +247,12 @@ The parser is partial: vendor info and each milestone parse independently. Error #### Code Extraction (`process_complete`) | Metadata Path | Extracted As | DB Column | |---------------|-------------|-----------| -| `body.identifier` | string (fallback) | Used to find vendor_contract_id | +| `body.identifier` | string (fallback) | Used to find project_db_id | | `body.milestones..description` | `extract_text_from_value()` | `milestones.complete_description` | | `body.milestones..evidence` | raw JSON clone | `milestones.evidence` | | `body.milestone` | string (legacy format) | Used to find milestone by ID | -**Project identification**: First tries `body.identifier` to look up vendor contract by project_id. Falls back to `find_vendor_contract_from_inputs()` (UTXO chain tracing). +**Project identification**: First tries `body.identifier` to look up the project by project_id. Falls back to `find_project_from_inputs()` (UTXO chain tracing). **Milestone format handling**: Code handles milestones as an object keyed by milestone ID (`.as_object()`), which matches the spec. Also handles legacy single `body.milestone` field as a fallback. @@ -284,12 +284,12 @@ The parser is partial: vendor info and each milestone parse independently. Error **Not extracted**: `label`, `description`, `justification`, `estimatedReturn` -Disburse is a treasury-level operation. The code looks up `treasury_id` from `instance` and does **not** call `find_vendor_contract_from_inputs`. `vendor_contract_id` is always `None` for disburse events. +Disburse is a treasury-level operation. The code looks up `treasury_id` from `instance` and does **not** call `find_project_from_inputs`. `project_db_id` is always `None` for disburse events. **Note**: `destination` extraction uses `extract_text()` which expects a string or string array, while the spec defines destination as an object with `label`/`details`. This means structured destination metadata may not be fully captured. #### DB Writes -- **INSERT** `treasury.events` (with destination field, `vendor_contract_id = NULL`) +- **INSERT** `treasury.events` (with `destination` JSONB, `project_db_id = NULL`) --- @@ -306,7 +306,7 @@ Disburse is a treasury-level operation. The code looks up `treasury_id` from `in #### Code Extraction (`process_withdraw`) | Metadata Path | Extracted As | DB Column | |---------------|-------------|-----------| -| `body.identifier` | string | Used to find vendor_contract_id | +| `body.identifier` | string | Used to find project_db_id | | `body.milestones` | object keyed by milestone ID | Iterates over all milestone IDs | | `body.milestone` | string (legacy fallback) | Used to find milestone by ID if `milestones` absent | @@ -335,7 +335,7 @@ Additionally queries `yaci_store.address_utxo` for the withdraw tx to calculate #### Code Extraction (`process_pause`) | Metadata Path | Extracted As | DB Column | |---------------|-------------|-----------| -| `body.identifier` | string | Used to find vendor_contract_id | +| `body.identifier` | string | Used to find project_db_id | | `body.reason` | `extract_text()` | `events.reason` | **Per-milestone pause via datum**: After identifying the vendor contract, calls `update_milestone_pause_from_datum()` which parses the output datum of the pause transaction. Each milestone in the datum has a `Constr(0|1, [])` pause flag (0=active, 1=paused), and the code updates the `paused` boolean on each milestone row accordingly. @@ -346,7 +346,7 @@ Additionally queries `yaci_store.address_utxo` for the withdraw tx to calculate #### DB Writes - **UPDATE** `treasury.milestones` — sets `paused` flag per milestone (from datum) -- **UPDATE** `treasury.vendor_contracts` — sets `status` to `'paused'` or `'active'` (derived from per-milestone state) +- **UPDATE** `treasury.projects` — sets `status` to `'paused'` or `'active'` (derived from per-milestone state) - **INSERT** `treasury.events` (with reason) --- @@ -364,7 +364,7 @@ Additionally queries `yaci_store.address_utxo` for the withdraw tx to calculate #### Code Extraction (`process_resume`) | Metadata Path | Extracted As | DB Column | |---------------|-------------|-----------| -| `body.identifier` | string | Used to find vendor_contract_id | +| `body.identifier` | string | Used to find project_db_id | **Per-milestone resume via datum**: Same mechanism as pause. After identifying the vendor contract, calls `update_milestone_pause_from_datum()` which parses the output datum to read each milestone's pause flag and updates the `paused` boolean per milestone row. @@ -374,7 +374,7 @@ Additionally queries `yaci_store.address_utxo` for the withdraw tx to calculate #### DB Writes - **UPDATE** `treasury.milestones` — sets `paused` flag per milestone (from datum) -- **UPDATE** `treasury.vendor_contracts` — sets `status` to `'paused'` or `'active'` (derived from per-milestone state) +- **UPDATE** `treasury.projects` — sets `status` to `'paused'` or `'active'` (derived from per-milestone state) - **INSERT** `treasury.events` --- @@ -399,21 +399,21 @@ Additionally queries `yaci_store.address_utxo` for the withdraw tx to calculate #### Code Extraction (`process_modify`) | Metadata Path | Extracted As | DB Column | |---------------|-------------|-----------| -| `body.identifier` | string | Used to find vendor_contract_id | -| `body.label` | `extract_text()` | `vendor_contracts.project_name` (COALESCE update) | -| `body.description` | `extract_text()` | `vendor_contracts.description` (COALESCE update) | -| `body.vendor.label` | `extract_text_from_value()` | `vendor_contracts.vendor_address` (COALESCE update) | +| `body.identifier` | string | Used to find project_db_id | +| `body.label` | `extract_text()` | `projects.project_name` (COALESCE update) | +| `body.description` | `extract_text()` | `projects.description` (COALESCE update) | +| `body.vendor.label` | `extract_text_from_value()` | `projects.vendor_address` (COALESCE update) | | `body.reason` | `extract_text()` | `events.reason` | | `body.milestones` | array or object of milestones | Archives old, inserts new | -**Naming fields update**: Before processing milestones, the code extracts `label`, `description`, and `vendor.label` and updates the vendor contract row using COALESCE (only overwrites if the new value is non-null). +**Naming fields update**: Before processing milestones, the code extracts `label`, `description`, and `vendor.label` and updates the project row using COALESCE (only overwrites if the new value is non-null). **Milestone format handling**: Same as fund — milestones are accepted in both array format (`[{identifier: "m-0", ...}]`) and object format (`{"m-0": {...}}`). Milestone field extraction is identical to fund (identifier, label, description, acceptanceCriteria, amount). #### DB Writes -- **UPDATE** `treasury.vendor_contracts` — COALESCE update of `project_name`, `description`, `vendor_address` +- **UPDATE** `treasury.projects` — COALESCE update of `project_name`, `description`, `vendor_address` - **UPDATE** `treasury.milestones` — sets `archived = TRUE`, `archived_by_tx_hash`, `archived_at` for all active milestones - **INSERT** `treasury.milestones` — new milestone rows - **UPDATE** `treasury.milestones` — sets `superseded_by` FK linking old → new rows with matching milestone_id @@ -434,11 +434,11 @@ Milestone field extraction is identical to fund (identifier, label, description, #### Code Extraction (`process_cancel`) | Metadata Path | Extracted As | DB Column | |---------------|-------------|-----------| -| `body.identifier` | string | Used to find vendor_contract_id | +| `body.identifier` | string | Used to find project_db_id | | `body.reason` | `extract_text()` | `events.reason` | #### DB Writes -- **UPDATE** `treasury.vendor_contracts` — sets `status = 'cancelled'` +- **UPDATE** `treasury.projects` — sets `status = 'cancelled'` - **INSERT** `treasury.events` (with reason) --- @@ -516,13 +516,13 @@ The TOM spec defines the `vendor` object as: } ``` -The TOM spec has no `vendor.name` field — `vendor_contracts.vendor_name` is a deprecated column (always null). `vendor.label` is extracted via `extract_text_from_value()` into `vendor_contracts.vendor_address`. +The TOM spec has no `vendor.name` field — `vendor_name` was a deprecated column on the old `vendor_contracts` table and has been dropped. `vendor.label` is extracted via `extract_text_from_value()` into `projects.vendor_address`. In practice, vendor identity comes from the top-level `body.label` which by convention includes the vendor name (e.g., `"Tastenkunst GmbH - Eternl Maintenance"`). The `vendor.label` field in real metadata contains the vendor's payment address (a Cardano address), not their display name. ### Contract URL -The `contract_url` column on `vendor_contracts` is deprecated (always null). Contract URL extraction was removed as no on-chain data populates this field. +The `contract_url` column was a deprecated column on the old `vendor_contracts` table and has been dropped. Contract URL extraction was removed as no on-chain data populates this field. ### Milestone Format: Object vs Array @@ -543,22 +543,26 @@ Real on-chain metadata uses both arrays and objects for fund/modify events. The ### How It Works -When a `fund` event is processed, the code records all output UTXOs from that transaction in `treasury.utxos` with the `vendor_contract_id`. Subsequent events (complete, withdraw, etc.) spend those UTXOs, so the processor can trace backwards to find which project an event belongs to. +When a `fund` event is processed, the code records all output UTXOs from that transaction in `treasury.utxo_history` with the `project_db_id`. Subsequent events (complete, withdraw, etc.) spend those UTXOs, so the processor can trace backwards to find which project an event belongs to. -### `find_vendor_contract_from_inputs()` +In addition, Postgres triggers installed by `install_utxo_history_triggers` (`api/src/services/sync.rs`) capture every script-address UTXO YACI Store inserts into `treasury.utxo_history` synchronously, regardless of any TOM event. This makes the chain trace robust against YACI Store's UTXO pruning. + +### `find_project_from_inputs()` ``` 1. Get inputs to this tx: SELECT tx_hash, output_index FROM yaci_store.tx_input WHERE spent_tx_hash = $1 -2. For each input, look up: SELECT vendor_contract_id FROM treasury.utxos +2. For each input, look up: SELECT project_db_id FROM treasury.utxo_history WHERE tx_hash = $1 AND output_index = $2 -3. If found: mark old UTXO as spent, record new output UTXOs with same vendor_contract_id -4. Return first matching vendor_contract_id +3. If found: mark old UTXO as spent, record new output UTXOs with same project_db_id +4. Return best-scoring project_db_id (see disambiguation below) ``` This correctly traces the UTXO chain regardless of address, because it tracks by specific (tx_hash, output_index) pairs. -When recording new output UTXOs (step 3), the code also stores `inline_datum_cbor` if the output has an inline datum in `yaci_store.address_utxo`. This datum is used later by pause/resume processing. +When multiple inputs map to different projects (e.g. a sibling project's fee/collateral input), the trace scores each candidate against `body.milestones` keys via `collect_milestone_id_hints` and prefers the one whose stored milestones match. + +When recording new output UTXOs (step 3), the code also stores `inline_datum_cbor` if the output has an inline datum. This datum is used later by pause/resume processing. --- @@ -618,13 +622,13 @@ All 11 bugs have been fixed. This section documents the original issues and thei ### Critical (Fixed) -**1. ~~`sync_address_utxos()` misassigns UTXOs~~** — FIXED: Deleted `sync_utxos()` and `sync_address_utxos()`. UTXO tracking now relies exclusively on `find_vendor_contract_from_inputs()` chain tracing. +**1. ~~`sync_address_utxos()` misassigns UTXOs~~** — FIXED: Deleted `sync_utxos()` and `sync_address_utxos()`. UTXO tracking now relies exclusively on `find_project_from_inputs()` chain tracing. **2. ~~`vendor.name` always null~~** — FIXED: `vendor_name` column is deprecated (always null). TOM spec has no `vendor.name` field. `vendor.label` correctly maps to `vendor_address`. ### High (Fixed) -**3. ~~Disburse events incorrectly linked to vendor contracts~~** — FIXED: `process_disburse` now takes `instance` parameter and looks up `treasury_id` directly. No longer calls `find_vendor_contract_from_inputs`. `vendor_contract_id` is always `None` for disburse events. +**3. ~~Disburse events incorrectly linked to vendor contracts~~** — FIXED: `process_disburse` now takes `instance` parameter and looks up `treasury_id` directly. No longer calls `find_project_from_inputs`. `project_db_id` is always `None` for disburse events. **4. Multiple UTXO inputs → first match wins** — Acceptable: A transaction spending vendor contract UTXOs belongs to one project. First-match is the correct behavior. @@ -654,22 +658,22 @@ All 11 bugs have been fixed. This section documents the original issues and thei -- Get raw metadata for a project's fund event SELECT e.tx_hash, e.metadata FROM treasury.events e -JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id -WHERE vc.project_id = 'EC-0008-25' AND e.event_type = 'fund'; +JOIN treasury.projects p ON p.id = e.project_db_id +WHERE p.project_id = 'EC-0008-25' AND e.event_type = 'fund'; -- Compare with stored values SELECT project_id, project_name, vendor_address, description -FROM treasury.vendor_contracts +FROM treasury.projects WHERE project_id = 'EC-0008-25'; ``` ### Check for duplicate contract_addresses across projects ```sql --- All projects sharing the same contract address (expected: all share one) +-- All projects sharing the same contract address (expected: all share the singleton PSSC) SELECT contract_address, COUNT(*) as project_count, array_agg(project_id ORDER BY project_id) as projects -FROM treasury.vendor_contracts +FROM treasury.projects WHERE contract_address IS NOT NULL GROUP BY contract_address HAVING COUNT(*) > 1; @@ -679,12 +683,12 @@ HAVING COUNT(*) > 1; ```sql -- Check if UTXOs at the shared address are spread across projects or concentrated on one -SELECT u.vendor_contract_id, vc.project_id, COUNT(*) as utxo_count, +SELECT u.project_db_id, p.project_id, COUNT(*) as utxo_count, SUM(u.lovelace_amount) as total_lovelace -FROM treasury.utxos u -JOIN treasury.vendor_contracts vc ON vc.id = u.vendor_contract_id +FROM treasury.utxo_history u +JOIN treasury.projects p ON p.id = u.project_db_id WHERE NOT u.spent -GROUP BY u.vendor_contract_id, vc.project_id +GROUP BY u.project_db_id, p.project_id ORDER BY utxo_count DESC; ``` @@ -693,16 +697,16 @@ ORDER BY utxo_count DESC; ```sql -- Follow the UTXO chain for a specific project WITH RECURSIVE utxo_chain AS ( - SELECT u.tx_hash, u.output_index, u.spent, u.spent_tx_hash, u.vendor_contract_id, 1 as depth - FROM treasury.utxos u - JOIN treasury.vendor_contracts vc ON vc.id = u.vendor_contract_id - WHERE vc.project_id = 'EC-0008-25' - AND u.tx_hash = vc.fund_tx_hash + SELECT u.tx_hash, u.output_index, u.spent, u.spent_tx_hash, u.project_db_id, 1 as depth + FROM treasury.utxo_history u + JOIN treasury.projects p ON p.id = u.project_db_id + WHERE p.project_id = 'EC-0008-25' + AND u.tx_hash = p.fund_tx_hash UNION ALL - SELECT u.tx_hash, u.output_index, u.spent, u.spent_tx_hash, u.vendor_contract_id, uc.depth + 1 - FROM treasury.utxos u + SELECT u.tx_hash, u.output_index, u.spent, u.spent_tx_hash, u.project_db_id, uc.depth + 1 + FROM treasury.utxo_history u JOIN utxo_chain uc ON u.tx_hash = uc.spent_tx_hash WHERE uc.spent = true AND uc.depth < 20 ) @@ -714,9 +718,9 @@ SELECT * FROM utxo_chain ORDER BY depth; ```sql -- All events with project context, ordered by time SELECT e.event_type, e.block_time, e.tx_hash, - vc.project_id, vc.project_name + p.project_id, p.project_name FROM treasury.events e -LEFT JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id +LEFT JOIN treasury.projects p ON p.id = e.project_db_id ORDER BY e.block_time DESC LIMIT 50; ``` @@ -726,9 +730,9 @@ LIMIT 50; ```sql -- View raw metadata for all complete events SELECT e.tx_hash, e.block_time, - vc.project_id, + p.project_id, e.metadata->'body'->'milestones' as milestones_meta FROM treasury.events e -LEFT JOIN treasury.vendor_contracts vc ON vc.id = e.vendor_contract_id +LEFT JOIN treasury.projects p ON p.id = e.project_db_id WHERE e.event_type = 'complete'; ``` diff --git a/docs/known-issues.md b/docs/known-issues.md index bbcf4d8..b8fc102 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -75,7 +75,7 @@ allows NULL. | Column | When NULL is expected | When NULL is anomalous | |---|---|---| -| `contract_address`, `stake_credential` | Before `initialize` event | Initialize ran but neither `yaci_store.address_utxo` nor `treasury.utxos` had the script output (`event_processor.rs:169`) | +| `contract_address`, `stake_credential` | Before `initialize` event | Initialize ran but neither `yaci_store.address_utxo` nor `treasury.utxo_history` had the script output (`process_initialize` in `event_processor.rs`) | | `publish_tx_hash`, `publish_time` | Treasury never published on chain | A publish event was received but didn't write — investigate | | `initialized_tx_hash`, `initialized_at` | Treasury never initialized | Same as above for initialize | | `permissions` | Publish metadata didn't include the field | Publish metadata included it but extraction failed | @@ -362,7 +362,7 @@ FROM treasury.milestones; KI-MOD-01-affected projects where modify events introduced milestones with non-original IDs (MS-N gaps). - **Hypothesis:** `find_project_from_inputs` - (`event_processor.rs:1093`) uses `collect_milestone_id_hints` to + (`event_processor.rs`) uses `collect_milestone_id_hints` to disambiguate when chain trace finds multiple candidate projects (see KI-OC-03). When the event's milestone IDs (e.g., `MS-15`) appear in modify-created milestone rows on more than one project, the hint @@ -415,7 +415,7 @@ FROM treasury.events GROUP BY 1 ORDER BY 1; #### KI-UTX-02 — `project_db_id` IS NULL on non-script UTXOs (by design) - **Why:** `pre_fetch_utxos` inserts every output of every TOM-event tx without `project_db_id`. The chain-trace seed (set later by - `process_fund` and `find_vendor_contract_from_inputs`) only fills it + `process_fund` and `find_project_from_inputs`) only fills it for outputs at the script address. Non-script change/fee outputs remain NULL by design — they aren't part of the chain. - **Currently affected:** 786 / 1235 rows. Not anomalous — expected. @@ -478,7 +478,7 @@ The original analysis is preserved below. normaliser that wants to merge the two formats can use this offset. - **Effect on complete events:** of 189 complete events, 108 use `m-N` keys and 81 use `MS-N` keys. After the disambiguation hint to - `find_vendor_contract_from_inputs`, this no longer causes silent event + `find_project_from_inputs`, this no longer causes silent event drops (every event lands in `treasury.events`), but it surfaces as KI-VND-01 / KI-MIL-01 because the same projects have a different datum format the parser can't handle. @@ -522,10 +522,10 @@ GROUP BY 1 ORDER BY 1; - A single complete/withdraw tx can take fee/collateral inputs from another project's UTXO chain. Without disambiguation, the older code attributed the event to whichever project's input came first. -- **Mitigation in code:** `find_vendor_contract_from_inputs` - (`event_processor.rs:1047`) now scores candidate vendor_contract_ids +- **Mitigation in code:** `find_project_from_inputs` + (`event_processor.rs`) now scores candidate `project_db_id`s against `body.milestones` keys and prefers the one whose stored milestones - match (`collect_milestone_id_hints` at `:1450`). + match (`collect_milestone_id_hints`). - **Currently affected:** observable indirectly via KI-EVT-02 = 0. --- From b226a04ca664add34c5c9901932b68008b728bf1 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Mon, 4 May 2026 21:27:14 +0100 Subject: [PATCH 17/19] update known issues --- api/src/routes/v1/projects.rs | 43 +++++++---- api/src/routes/v1/statistics.rs | 57 +++++++++++++-- api/src/routes/v1/treasury.rs | 37 +++++++--- database/init/02-treasury-schema.sql | 101 ++++++++++++++++++++------ database/schema/treasury.sql | 102 +++++++++++++++++++++------ docs/known-issues.md | 80 ++++++++++++++++----- 6 files changed, 328 insertions(+), 92 deletions(-) diff --git a/api/src/routes/v1/projects.rs b/api/src/routes/v1/projects.rs index 15219e7..7eb6633 100644 --- a/api/src/routes/v1/projects.rs +++ b/api/src/routes/v1/projects.rs @@ -389,12 +389,21 @@ pub async fn get_project_utxos( ))); } + // Source of truth for "currently unspent" is yaci_store.address_utxo (rows + // pruned on spend; anti-join against tx_input handles the pruning-window lag). + // utxo_history is used only for project attribution. let (total_count,): (i64,) = sqlx::query_as( r#" SELECT COUNT(*) - FROM treasury.utxo_history u - JOIN treasury.projects vc ON vc.id = u.project_db_id - WHERE vc.project_id = $1 AND NOT u.spent + FROM yaci_store.address_utxo au + JOIN treasury.utxo_history uh + ON uh.tx_hash = au.tx_hash AND uh.output_index = au.output_index + JOIN treasury.projects vc ON vc.id = uh.project_db_id + WHERE vc.project_id = $1 + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) "#, ) .bind(&project_id) @@ -404,17 +413,23 @@ pub async fn get_project_utxos( let rows = sqlx::query_as::<_, UtxoRow>( r#" SELECT - u.tx_hash, - u.output_index, - u.address, - u.address_type, - u.lovelace_amount, - u.slot, - u.block_number - FROM treasury.utxo_history u - JOIN treasury.projects vc ON vc.id = u.project_db_id - WHERE vc.project_id = $1 AND NOT u.spent - ORDER BY u.slot DESC + au.tx_hash, + au.output_index, + au.owner_addr AS address, + uh.address_type, + au.lovelace_amount, + au.slot, + au.block AS block_number + FROM yaci_store.address_utxo au + JOIN treasury.utxo_history uh + ON uh.tx_hash = au.tx_hash AND uh.output_index = au.output_index + JOIN treasury.projects vc ON vc.id = uh.project_db_id + WHERE vc.project_id = $1 + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) + ORDER BY au.slot DESC LIMIT $2 OFFSET $3 "#, ) diff --git a/api/src/routes/v1/statistics.rs b/api/src/routes/v1/statistics.rs index 9139542..0b3b2d9 100644 --- a/api/src/routes/v1/statistics.rs +++ b/api/src/routes/v1/statistics.rs @@ -58,16 +58,32 @@ async fn get_vendor_contract_stats(pool: &PgPool) -> Result) = if let Some(ref addr) = address { sqlx::query_as( r#" SELECT - COUNT(*)::BIGINT, - COUNT(*) FILTER (WHERE NOT spent)::BIGINT, - COALESCE(SUM(lovelace_amount) FILTER (WHERE NOT spent), 0)::BIGINT - FROM treasury.utxo_history - WHERE address = $1 + (SELECT COUNT(*) FROM treasury.utxo_history WHERE address = $1)::BIGINT, + (SELECT COUNT(*) FROM yaci_store.address_utxo au + WHERE au.owner_addr = $1 + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ))::BIGINT, + (SELECT COALESCE(SUM(au.lovelace_amount), 0) FROM yaci_store.address_utxo au + WHERE au.owner_addr = $1 + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ))::BIGINT "#, ) .bind(addr) @@ -214,9 +230,36 @@ async fn get_financial_stats(pool: &PgPool) -> Result .await ?; - // Get current balance (unspent UTXOs) + // Current balance: raw live unspent at TRSC + PSSC addresses, from yaci's UTXO + // set (rows pruned on spend; anti-join against tx_input handles pruning lag). + // We do NOT trust treasury.utxo_history.spent — pre-trigger captures and + // KI-UTX-02 non-script captures leave stale spent=FALSE rows that would + // over-count. We do NOT join through utxo_history for project attribution + // either — chain-trace gaps would *under*-count the vendor contract balance. let (current_balance,): (Option,) = sqlx::query_as( - "SELECT COALESCE(SUM(lovelace_amount), 0)::BIGINT FROM treasury.utxo_history WHERE NOT spent" + r#" + SELECT ( + COALESCE(( + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + JOIN treasury.treasury_contracts tc ON tc.contract_address = au.owner_addr + WHERE NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) + ), 0) + + + COALESCE(( + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + JOIN treasury.vendor_contracts vco ON vco.address = au.owner_addr + WHERE NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) + ), 0) + )::BIGINT + "# ) .fetch_one(pool) .await diff --git a/api/src/routes/v1/treasury.rs b/api/src/routes/v1/treasury.rs index 69988e8..799e4b8 100644 --- a/api/src/routes/v1/treasury.rs +++ b/api/src/routes/v1/treasury.rs @@ -76,8 +76,19 @@ pub async fn get_treasury_utxos( .0 .ok_or_else(|| ApiError::NotFound("treasury contract_address not yet known".into()))?; + // Source of truth for "currently unspent" is yaci_store.address_utxo (rows are + // deleted on prune). Anti-join against tx_input handles the pruning-window lag + // window. We do NOT trust treasury.utxo_history.spent — pre-trigger captures + // and KI-UTX-02 non-script captures leave stale spent=FALSE rows. let (total_count,): (i64,) = sqlx::query_as( - "SELECT COUNT(*) FROM treasury.utxo_history WHERE address = $1 AND NOT spent", + r#" + SELECT COUNT(*) FROM yaci_store.address_utxo au + WHERE au.owner_addr = $1 + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) + "#, ) .bind(&address) .fetch_one(&pool) @@ -86,16 +97,20 @@ pub async fn get_treasury_utxos( let rows = sqlx::query_as::<_, UtxoRow>( r#" SELECT - tx_hash, - output_index, - address, - address_type, - lovelace_amount, - slot, - block_number - FROM treasury.utxo_history - WHERE address = $1 AND NOT spent - ORDER BY slot DESC + au.tx_hash, + au.output_index, + au.owner_addr AS address, + 'treasury'::TEXT AS address_type, + au.lovelace_amount, + au.slot, + au.block AS block_number + FROM yaci_store.address_utxo au + WHERE au.owner_addr = $1 + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) + ORDER BY au.slot DESC LIMIT $2 OFFSET $3 "#, ) diff --git a/database/init/02-treasury-schema.sql b/database/init/02-treasury-schema.sql index 01b3461..a3149ac 100644 --- a/database/init/02-treasury-schema.sql +++ b/database/init/02-treasury-schema.sql @@ -251,7 +251,19 @@ SELECT vc.fund_slot, vc.fund_block_time, vc.initial_amount_lovelace, - vc.status, + -- Raw on-chain status as written by event handlers (active/paused/cancelled). + -- TOM has no "complete project" event, so this column never holds 'completed'. + vc.status as raw_status, + -- Derived status: 'completed' once every non-archived milestone has been + -- withdrawn. 'cancelled' wins; otherwise paused/active mirror raw_status. + CASE + WHEN vc.status = 'cancelled' THEN 'cancelled' + WHEN COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived) > 0 + AND COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND NOT m.withdrawn) = 0 + THEN 'completed' + WHEN vc.status = 'paused' THEN 'paused' + ELSE COALESCE(vc.status, 'active') + END AS status, vc.created_at, vc.updated_at, -- Treasury context @@ -264,9 +276,31 @@ SELECT COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND m.paused AND NOT m.withdrawn) as paused_milestones, -- Financial totals from milestones COALESCE(SUM(DISTINCT m.withdraw_amount) FILTER (WHERE NOT m.archived), 0)::BIGINT as total_withdrawn_lovelace, - -- Current balance from UTXOs (only script address UTXOs) - COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent AND u.address LIKE 'addr1x%'), 0)::BIGINT as current_balance_lovelace, - COUNT(u.id) FILTER (WHERE NOT u.spent AND u.address LIKE 'addr1x%') as utxo_count, + -- Current balance: live unspent UTXOs from yaci_store.address_utxo (authoritative + -- because pruning removes spent rows), restricted to UTXOs that utxo_history has + -- linked to this project. Avoids ghost-unspent rows in utxo_history.spent. + COALESCE(( + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + JOIN treasury.utxo_history uh + ON uh.tx_hash = au.tx_hash AND uh.output_index = au.output_index + WHERE uh.project_db_id = vc.id + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) + ), 0)::BIGINT as current_balance_lovelace, + COALESCE(( + SELECT COUNT(*) + FROM yaci_store.address_utxo au + JOIN treasury.utxo_history uh + ON uh.tx_hash = au.tx_hash AND uh.output_index = au.output_index + WHERE uh.project_db_id = vc.id + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) + ), 0) as utxo_count, -- Last event time (SELECT MAX(e.block_time) FROM treasury.events e WHERE e.project_db_id = vc.id) as last_event_time, -- Event count @@ -274,7 +308,6 @@ SELECT FROM treasury.projects vc LEFT JOIN treasury.treasury_contracts tc ON tc.id = vc.treasury_id LEFT JOIN treasury.milestones m ON m.project_db_id = vc.id -LEFT JOIN treasury.utxo_history u ON u.project_db_id = vc.id GROUP BY vc.id, tc.contract_instance; -- Milestone timeline with vendor context @@ -347,18 +380,30 @@ SELECT tc.initialized_at, tc.permissions, COUNT(DISTINCT vc.id) as project_count, - COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'active') as active_contracts, - COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'completed') as completed_contracts, - COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'cancelled') as cancelled_contracts, + COUNT(DISTINCT vc.id) FILTER (WHERE vps.status = 'active') as active_contracts, + COUNT(DISTINCT vc.id) FILTER (WHERE vps.status = 'completed') as completed_contracts, + COUNT(DISTINCT vc.id) FILTER (WHERE vps.status = 'cancelled') as cancelled_contracts, + COUNT(DISTINCT vc.id) FILTER (WHERE vps.status = 'paused') as paused_contracts, + -- Live treasury balance from yaci's UTXO set (authoritative; spent rows are + -- pruned out). utxo_history.spent flag is unreliable for historical/pre-trigger + -- captures so we don't trust it for current totals. COALESCE(( - SELECT SUM(u.lovelace_amount) - FROM treasury.utxo_history u - WHERE u.address = tc.contract_address AND NOT u.spent + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + WHERE au.owner_addr = tc.contract_address + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) ), 0)::BIGINT as treasury_balance, COALESCE(( SELECT COUNT(*) - FROM treasury.utxo_history u - WHERE u.address = tc.contract_address AND NOT u.spent + FROM yaci_store.address_utxo au + WHERE au.owner_addr = tc.contract_address + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) ), 0) as utxo_count, (SELECT COUNT(*) FROM treasury.events WHERE treasury_id = tc.id) as total_events, (SELECT MAX(block_time) FROM treasury.events WHERE treasury_id = tc.id) as last_event_time, @@ -366,6 +411,7 @@ SELECT tc.updated_at FROM treasury.treasury_contracts tc LEFT JOIN treasury.projects vc ON vc.treasury_id = tc.id +LEFT JOIN treasury.v_projects_summary vps ON vps.id = vc.id GROUP BY tc.id; -- Events with full context (treasury, project, milestone info) @@ -408,18 +454,29 @@ SELECT COALESCE(SUM(m_totals.total_withdrawn), 0)::BIGINT as total_withdrawn_lovelace, -- Remaining (allocated - withdrawn) (COALESCE(SUM(vc.initial_amount_lovelace), 0) - COALESCE(SUM(m_totals.total_withdrawn), 0))::BIGINT as total_remaining_lovelace, - -- Treasury balance (unspent UTXOs at treasury address) + -- Treasury reserve balance: live unspent at TRSC address from yaci's UTXO set. + -- Anti-join against tx_input handles pruning-window lag. COALESCE(( - SELECT SUM(u.lovelace_amount) - FROM treasury.utxo_history u - WHERE u.address = tc.contract_address AND NOT u.spent + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + WHERE au.owner_addr = tc.contract_address + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) ), 0)::BIGINT as treasury_balance_lovelace, - -- Project-level balance (sum of project UTXOs) + -- PSSC (vendor contract) balance: raw live unspent at the singleton PSSC address. + -- This is the on-chain truth for "funds currently held by the vendor contract". + -- Per-project attribution lives in v_projects_summary.current_balance_lovelace + -- and may sum to less than this when chain-trace gaps leave unattributed UTXOs. COALESCE(( - SELECT SUM(u2.lovelace_amount) - FROM treasury.utxo_history u2 - JOIN treasury.projects vc2 ON vc2.id = u2.project_db_id - WHERE vc2.treasury_id = tc.id AND NOT u2.spent AND u2.address LIKE 'addr1x%' + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + JOIN treasury.vendor_contracts vco ON vco.address = au.owner_addr + WHERE NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) ), 0)::BIGINT as project_balance_lovelace, -- Counts COUNT(DISTINCT vc.id) as project_count, diff --git a/database/schema/treasury.sql b/database/schema/treasury.sql index 01b3461..a93c1ee 100644 --- a/database/schema/treasury.sql +++ b/database/schema/treasury.sql @@ -251,7 +251,19 @@ SELECT vc.fund_slot, vc.fund_block_time, vc.initial_amount_lovelace, - vc.status, + -- Raw on-chain status as written by event handlers (active/paused/cancelled). + -- TOM has no "complete project" event, so this column never holds 'completed'. + vc.status as raw_status, + -- Derived status: 'completed' once every non-archived milestone has been + -- withdrawn. 'cancelled' wins; otherwise paused/active mirror raw_status. + CASE + WHEN vc.status = 'cancelled' THEN 'cancelled' + WHEN COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived) > 0 + AND COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND NOT m.withdrawn) = 0 + THEN 'completed' + WHEN vc.status = 'paused' THEN 'paused' + ELSE COALESCE(vc.status, 'active') + END AS status, vc.created_at, vc.updated_at, -- Treasury context @@ -264,9 +276,31 @@ SELECT COUNT(DISTINCT m.id) FILTER (WHERE NOT m.archived AND m.paused AND NOT m.withdrawn) as paused_milestones, -- Financial totals from milestones COALESCE(SUM(DISTINCT m.withdraw_amount) FILTER (WHERE NOT m.archived), 0)::BIGINT as total_withdrawn_lovelace, - -- Current balance from UTXOs (only script address UTXOs) - COALESCE(SUM(u.lovelace_amount) FILTER (WHERE NOT u.spent AND u.address LIKE 'addr1x%'), 0)::BIGINT as current_balance_lovelace, - COUNT(u.id) FILTER (WHERE NOT u.spent AND u.address LIKE 'addr1x%') as utxo_count, + -- Current balance: live unspent UTXOs from yaci_store.address_utxo (authoritative + -- because pruning removes spent rows), restricted to UTXOs that utxo_history has + -- linked to this project. Avoids ghost-unspent rows in utxo_history.spent. + COALESCE(( + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + JOIN treasury.utxo_history uh + ON uh.tx_hash = au.tx_hash AND uh.output_index = au.output_index + WHERE uh.project_db_id = vc.id + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) + ), 0)::BIGINT as current_balance_lovelace, + COALESCE(( + SELECT COUNT(*) + FROM yaci_store.address_utxo au + JOIN treasury.utxo_history uh + ON uh.tx_hash = au.tx_hash AND uh.output_index = au.output_index + WHERE uh.project_db_id = vc.id + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) + ), 0) as utxo_count, -- Last event time (SELECT MAX(e.block_time) FROM treasury.events e WHERE e.project_db_id = vc.id) as last_event_time, -- Event count @@ -274,7 +308,6 @@ SELECT FROM treasury.projects vc LEFT JOIN treasury.treasury_contracts tc ON tc.id = vc.treasury_id LEFT JOIN treasury.milestones m ON m.project_db_id = vc.id -LEFT JOIN treasury.utxo_history u ON u.project_db_id = vc.id GROUP BY vc.id, tc.contract_instance; -- Milestone timeline with vendor context @@ -347,18 +380,30 @@ SELECT tc.initialized_at, tc.permissions, COUNT(DISTINCT vc.id) as project_count, - COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'active') as active_contracts, - COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'completed') as completed_contracts, - COUNT(DISTINCT vc.id) FILTER (WHERE vc.status = 'cancelled') as cancelled_contracts, + COUNT(DISTINCT vc.id) FILTER (WHERE vps.status = 'active') as active_contracts, + COUNT(DISTINCT vc.id) FILTER (WHERE vps.status = 'completed') as completed_contracts, + COUNT(DISTINCT vc.id) FILTER (WHERE vps.status = 'cancelled') as cancelled_contracts, + COUNT(DISTINCT vc.id) FILTER (WHERE vps.status = 'paused') as paused_contracts, + -- Live treasury balance from yaci's UTXO set (authoritative; spent rows are + -- pruned out). utxo_history.spent flag is unreliable for historical/pre-trigger + -- captures so we don't trust it for current totals. COALESCE(( - SELECT SUM(u.lovelace_amount) - FROM treasury.utxo_history u - WHERE u.address = tc.contract_address AND NOT u.spent + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + WHERE au.owner_addr = tc.contract_address + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) ), 0)::BIGINT as treasury_balance, COALESCE(( SELECT COUNT(*) - FROM treasury.utxo_history u - WHERE u.address = tc.contract_address AND NOT u.spent + FROM yaci_store.address_utxo au + WHERE au.owner_addr = tc.contract_address + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) ), 0) as utxo_count, (SELECT COUNT(*) FROM treasury.events WHERE treasury_id = tc.id) as total_events, (SELECT MAX(block_time) FROM treasury.events WHERE treasury_id = tc.id) as last_event_time, @@ -366,6 +411,7 @@ SELECT tc.updated_at FROM treasury.treasury_contracts tc LEFT JOIN treasury.projects vc ON vc.treasury_id = tc.id +LEFT JOIN treasury.v_projects_summary vps ON vps.id = vc.id GROUP BY tc.id; -- Events with full context (treasury, project, milestone info) @@ -408,18 +454,30 @@ SELECT COALESCE(SUM(m_totals.total_withdrawn), 0)::BIGINT as total_withdrawn_lovelace, -- Remaining (allocated - withdrawn) (COALESCE(SUM(vc.initial_amount_lovelace), 0) - COALESCE(SUM(m_totals.total_withdrawn), 0))::BIGINT as total_remaining_lovelace, - -- Treasury balance (unspent UTXOs at treasury address) + -- Treasury reserve balance: live unspent at TRSC address from yaci's UTXO set. + -- Anti-join against tx_input handles pruning-window lag (rows not yet pruned + -- but already spent are excluded). COALESCE(( - SELECT SUM(u.lovelace_amount) - FROM treasury.utxo_history u - WHERE u.address = tc.contract_address AND NOT u.spent + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + WHERE au.owner_addr = tc.contract_address + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) ), 0)::BIGINT as treasury_balance_lovelace, - -- Project-level balance (sum of project UTXOs) + -- PSSC (vendor contract) balance: raw live unspent at the singleton PSSC address. + -- This is the on-chain truth for "funds currently held by the vendor contract". + -- Per-project attribution lives in v_projects_summary.current_balance_lovelace + -- and may sum to less than this when chain-trace gaps leave unattributed UTXOs. COALESCE(( - SELECT SUM(u2.lovelace_amount) - FROM treasury.utxo_history u2 - JOIN treasury.projects vc2 ON vc2.id = u2.project_db_id - WHERE vc2.treasury_id = tc.id AND NOT u2.spent AND u2.address LIKE 'addr1x%' + SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + JOIN treasury.vendor_contracts vco ON vco.address = au.owner_addr + WHERE NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) ), 0)::BIGINT as project_balance_lovelace, -- Counts COUNT(DISTINCT vc.id) as project_count, diff --git a/docs/known-issues.md b/docs/known-issues.md index b8fc102..4bc6444 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -44,8 +44,11 @@ > `treasury.utxo_history`. > > **Still open:** KI-OC-02 (on-chain limitation, can't fix), KI-MOD-01 -> (modify-event milestones don't pick up datum updates), small KI-EVT-01 -> regression on KI-MOD-01-affected projects (12 NULL events). +> (modify events don't reflect updated milestone amounts / time limits in +> the API — new milestone rows ship with NULL datum-derived fields), small +> KI-EVT-01 regression on KI-MOD-01-affected projects (12 NULL events), +> KI-FIN-04 (per-project balance under-counts the raw PSSC total when +> chain trace can't attribute every UTXO). ## How to use this doc @@ -230,24 +233,33 @@ GROUP BY p.project_id ORDER BY 2 DESC; Check with `SELECT project_id FROM treasury.projects WHERE datum_parse_error IS NOT NULL`. Recovery is the same wipe-and-resync. -#### KI-MOD-01 — `modify` events create milestones with NULL datum fields *(OPEN — small follow-up)* -- **Pattern:** when a `modify` event archives a milestone and creates a - replacement (often with a new `MS-N` ID), the new row's - `amount_lovelace` / `time_limit` / `paused` come out NULL because - `process_modify` doesn't re-parse the modify-tx's output datum to - populate them. +#### KI-MOD-01 — `modify` events don't update milestone amounts or time limits *(OPEN — TODO)* +- **User-visible symptom:** when an oversight committee submits a `modify` + event to change a milestone's payout amount or time limit, the API + continues to surface stale or NULL values for those fields. The on-chain + contract reflects the new state, but `/api/v1/projects/{id}/milestones` + doesn't. +- **Pattern:** `process_modify` (`api/src/services/event_processor.rs`) + archives the existing milestone rows and inserts new ones, then COALESCE- + updates project naming fields from metadata. It does **not** re-parse the + modify-tx's output datum, so the new milestone rows' `amount_lovelace` / + `time_limit` / `paused` fields come out NULL — even when the on-chain + datum carries the updated values. - **Currently affected:** 8 active milestones in `UTXO-EC-0002-25-04` (IDs MS-5, MS-6, MS-8, MS-9, MS-12, MS-13, MS-17, MS-18 — all created - by modify events; gaps imply earlier IDs were modified out). + by modify events; gaps imply earlier IDs were modified out). The same + cluster also drives the KI-EVT-01-residual NULL `project_db_id` events. - **Why this is separate from KI-VND-01:** the fund datum *did* parse - successfully for this project; the issue is exclusively in + successfully for these projects; the issue is exclusively in `process_modify` which doesn't run the datum-update path that `process_fund` does. -- **Proposed fix (small):** at the end of `process_modify`, look up the - modify tx's output datum via the same mechanism `process_fund` uses - (`get_script_utxo_for_tx` + `parse_project_datum`) and run the - milestone-update loop. Matching by `milestone_order` should align — - the modified contract's datum reflects current state. +- **Proposed fix (small, deferred):** at the end of `process_modify`, look + up the modify tx's output datum via the same mechanism `process_fund` + uses (`get_script_utxo_for_tx` + `parse_project_datum`) and run the + milestone-update loop. Matching by `milestone_order` should align — the + modified contract's datum reflects current state. Re-running + `sync_all_events` after the fix lands will backfill via the idempotent + `ON CONFLICT DO UPDATE` chain; no resync needed. #### KI-VND-02 — `vendor_name` (deprecated) *(RESOLVED)* - Column dropped from `treasury.vendor_contracts`, models, routes and views. @@ -397,6 +409,41 @@ SELECT event_type, COUNT(*) FILTER (WHERE milestone_id IS NULL) AS null_mileston FROM treasury.events GROUP BY 1 ORDER BY 1; ``` +#### KI-FIN-04 — per-project balance under-counts the raw PSSC total *(OPEN — TODO)* +- **Pattern:** `v_projects_summary.current_balance_lovelace` joins live + `yaci_store.address_utxo` against `treasury.utxo_history` so that each + unspent PSSC UTXO is attributed to the specific project that funded it. + Unspent PSSC UTXOs that `utxo_history` has *not* attributed to a project + (chain-trace gaps — primarily KI-EVT-01-residual / KI-MOD-01-affected + projects whose modify-chain we didn't fully trace) are excluded from + every project's per-project balance. +- **Currently affected:** sum of per-project balances ≈ 80.65M ADA vs the + raw on-chain PSSC total of 88.34M ADA — gap of ~7.7M ADA sits at the + shared PSSC address but isn't claimed by any project row. +- **Why this is OK at the treasury level:** `v_financial_summary + .project_balance_lovelace` and `/api/v1/statistics.financials + .current_balance_lovelace` deliberately use the *raw* PSSC SUM (not the + attributed sum), so the treasury-level total reports the on-chain truth. + The under-count only surfaces if a consumer sums per-project balances. +- **Proposed fix (deferred):** resolve the underlying chain-trace gaps via + KI-MOD-01 (modify-tx datum re-parse) and KI-EVT-01-residual + (`collect_milestone_id_hints` disambiguation tightening). Once chain + trace covers every PSSC UTXO, attributed sum should match raw PSSC sum. + +**Repro query** + +```sql +SELECT + (SELECT SUM(au.lovelace_amount) + FROM yaci_store.address_utxo au + JOIN treasury.vendor_contracts vc ON vc.address = au.owner_addr + WHERE NOT EXISTS (SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash=au.tx_hash AND ti.output_index=au.output_index)) + / 1e6 AS raw_pssc_ada, + (SELECT SUM(current_balance_lovelace) FROM treasury.v_projects_summary) + / 1e6 AS attributed_pssc_ada; +``` + --- ### A.5 `treasury.utxo_history` (formerly `treasury.utxos`) @@ -698,7 +745,8 @@ of `/api/v1/status`, but worth a one-line release note. | KI-MIL-01 (`acceptance_criteria`) | NULL for `UTXO-*` | **not a bug** — metadata genuinely lacks the field | — | | KI-EVT-01 | NULL `project_db_id` on chain-trace failure | **resolved** (verified, 12/413 residual upstream) | — | | KI-EVT-01-residual | 12 events still NULL on KI-MOD-01-affected projects | **open** — likely milestone-id-hint disambiguation issue | KI-MOD-01 | -| KI-MOD-01 | `modify` events create milestones with NULL datum fields | **open** — small follow-up fix | — | +| KI-MOD-01 | `modify` events don't update milestone amounts / time limits in API | **open** — TODO | — | +| KI-FIN-04 | per-project balance under-counts raw PSSC total (chain-trace gaps) | **open** — TODO | KI-MOD-01 | | KI-EVT-03 | NULL `milestone_id` on treasury-level events | by design | — | | KI-UTX-01 | historical-UTXO table + trigger | **implemented & verified** | — | | KI-UTX-02 | `project_db_id` NULL on non-script UTXOs | by design | — | From 1e6f32fa30ac84d7efdf40c01c3857cb41043121 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Tue, 5 May 2026 12:46:27 +0100 Subject: [PATCH 18/19] add utxo endpoints --- api/src/models/v1.rs | 75 +++++++++++++++++++ api/src/openapi.rs | 15 ++-- api/src/routes/v1/mod.rs | 1 + api/src/routes/v1/projects.rs | 34 ++++++++- api/src/routes/v1/vendor_contract.rs | 105 ++++++++++++++++++++++++++- 5 files changed, 220 insertions(+), 10 deletions(-) diff --git a/api/src/models/v1.rs b/api/src/models/v1.rs index 792b114..30fd10c 100644 --- a/api/src/models/v1.rs +++ b/api/src/models/v1.rs @@ -388,6 +388,9 @@ pub struct ProjectDetail { pub last_event_time: Option, /// Total event count pub event_count: Option, + /// Currently-unspent UTxOs belonging to this project at the vendor contract. + /// Empty when the project has no live outputs (fully withdrawn or pre-fund). + pub current_utxos: Vec, /// Record created at pub created_at: Option>, /// Record updated at @@ -431,6 +434,20 @@ pub struct TreasuryReference { pub contract_instance: Option, } +/// Compact UTxO reference embedded on `ProjectDetail` to give clients the +/// project's currently-unspent outputs without a second round trip. +#[derive(Debug, Serialize, Deserialize, ToSchema, FromRow)] +pub struct ProjectCurrentUtxo { + /// Transaction hash + pub tx_hash: String, + /// Output index + pub output_index: i16, + /// Amount in lovelace + pub lovelace_amount: Option, + /// Creation slot + pub slot: Option, +} + /// Database row for vendor contract summary #[derive(Debug, FromRow)] #[allow(dead_code)] @@ -551,6 +568,7 @@ impl From for ProjectDetail { }, last_event_time: ChainTime::maybe_from_secs(row.last_event_time), event_count: row.event_count, + current_utxos: Vec::new(), // populated by handler after this conversion created_at: row.created_at, updated_at: row.updated_at, } @@ -939,6 +957,63 @@ impl From for UtxoResponse { } } +/// UTXO at the shared vendor contract, labeled with the owning project. +#[derive(Debug, Serialize, Deserialize, ToSchema)] +pub struct ProjectUtxoResponse { + /// Transaction hash + pub tx_hash: String, + /// Output index + pub output_index: i16, + /// Address (always the singleton PSSC for this endpoint) + pub address: Option, + /// Amount in lovelace + pub lovelace_amount: Option, + /// Creation slot + pub slot: Option, + /// Block number + pub block_number: Option, + /// Internal project DB id + pub project_db_id: i32, + /// Logical project identifier (e.g., "EC-0008-25") + pub project_id: String, + /// Project display name + pub project_name: Option, + /// Project status (active/paused/completed/cancelled) + pub project_status: Option, +} + +/// Database row for a project-labeled vendor-contract UTXO. +#[derive(Debug, FromRow)] +pub struct ProjectUtxoRow { + pub tx_hash: String, + pub output_index: i16, + pub address: Option, + pub lovelace_amount: Option, + pub slot: Option, + pub block_number: Option, + pub project_db_id: i32, + pub project_id: String, + pub project_name: Option, + pub project_status: Option, +} + +impl From for ProjectUtxoResponse { + fn from(row: ProjectUtxoRow) -> Self { + Self { + tx_hash: row.tx_hash, + output_index: row.output_index, + address: row.address, + lovelace_amount: row.lovelace_amount, + slot: row.slot, + block_number: row.block_number, + project_db_id: row.project_db_id, + project_id: row.project_id, + project_name: row.project_name, + project_status: row.project_status, + } + } +} + // ============================================================================ // STATISTICS // ============================================================================ diff --git a/api/src/openapi.rs b/api/src/openapi.rs index f993f01..ac98cdf 100644 --- a/api/src/openapi.rs +++ b/api/src/openapi.rs @@ -7,11 +7,12 @@ use crate::models::v1::{ EventResponse, EventStats, EventTreasuryContext, EventsQuery, FinancialStats, MilestoneArchiveInfo, MilestoneCompletion, MilestoneWithdrawal, MilestoneResponse, MilestoneStats, MilestonesSummary, MilestonesQuery, PaginatedResponse, Pagination, - PaginationQuery, ProjectDetail, ProjectEventsQuery, ProjectReference, ProjectStats, - ProjectSummary, ProjectsQuery, RecentEventsQuery, ResponseMeta, StatisticsResponse, - StatusResponse, SyncStats, SyncStatusBlock, TotalsBlock, TreasuryFinancials, - TreasuryReference, TreasuryResponse, TreasuryStatistics, TreasuryStats, UtxoResponse, - VendorContractProjectsBlock, VendorContractResponse, VendorContractStats, VendorFinancials, + PaginationQuery, ProjectCurrentUtxo, ProjectDetail, ProjectEventsQuery, ProjectReference, + ProjectStats, ProjectSummary, ProjectUtxoResponse, ProjectsQuery, RecentEventsQuery, + ResponseMeta, StatisticsResponse, StatusResponse, SyncStats, SyncStatusBlock, TotalsBlock, + TreasuryFinancials, TreasuryReference, TreasuryResponse, TreasuryStatistics, TreasuryStats, + UtxoResponse, VendorContractProjectsBlock, VendorContractResponse, VendorContractStats, + VendorFinancials, }; use crate::routes::v1::{ @@ -50,6 +51,7 @@ use crate::routes::v1::{ treasury::get_treasury_utxos, treasury::get_treasury_events, vendor_contract::get_vendor_contract, + vendor_contract::get_vendor_contract_utxos, projects::list_projects, projects::get_project, projects::get_project_milestones, @@ -80,6 +82,7 @@ use crate::routes::v1::{ PaginatedResponse>, PaginatedResponse>, PaginatedResponse>, + PaginatedResponse>, Pagination, ResponseMeta, // Treasury @@ -108,6 +111,8 @@ use crate::routes::v1::{ EventMilestoneContext, // UTXOs UtxoResponse, + ProjectUtxoResponse, + ProjectCurrentUtxo, // Statistics StatisticsResponse, TreasuryStats, diff --git a/api/src/routes/v1/mod.rs b/api/src/routes/v1/mod.rs index da4a7fc..93c286c 100644 --- a/api/src/routes/v1/mod.rs +++ b/api/src/routes/v1/mod.rs @@ -28,6 +28,7 @@ pub fn router() -> Router { .route("/treasury/events", get(treasury::get_treasury_events)) // Vendor contract endpoint (the singleton shared PSSC) .route("/vendor-contract", get(vendor_contract::get_vendor_contract)) + .route("/vendor-contract/utxos", get(vendor_contract::get_vendor_contract_utxos)) // Project endpoints (one per fund event; 42 of these for our deployment) .route("/projects", get(projects::list_projects)) .route("/projects/:project_id", get(projects::get_project)) diff --git a/api/src/routes/v1/projects.rs b/api/src/routes/v1/projects.rs index 7eb6633..d233711 100644 --- a/api/src/routes/v1/projects.rs +++ b/api/src/routes/v1/projects.rs @@ -9,8 +9,8 @@ use sqlx::PgPool; use crate::errors::ApiError; use crate::models::v1::{ ApiResponse, EventResponse, EventWithContextRow, MilestoneResponse, MilestoneRow, - PaginatedResponse, PaginationQuery, ProjectEventsQuery, UtxoResponse, UtxoRow, - ProjectDetail, ProjectSummary, ProjectSummaryRow, ProjectsQuery, + PaginatedResponse, PaginationQuery, ProjectCurrentUtxo, ProjectDetail, ProjectEventsQuery, + ProjectSummary, ProjectSummaryRow, ProjectsQuery, UtxoResponse, UtxoRow, }; /// List all vendor contracts @@ -164,7 +164,35 @@ pub async fn get_project( .await? .ok_or_else(|| ApiError::NotFound(format!("vendor contract `{}` not found", project_id)))?; - Ok(Json(ApiResponse::new(ProjectDetail::from(row)))) + let project_db_id = row.id; + let mut detail = ProjectDetail::from(row); + + // Inline the project's currently-unspent UTxOs so callers don't need a + // second round trip to /projects/:id/utxos for the live state. Same + // unspent-source-of-truth pattern as that endpoint. + detail.current_utxos = sqlx::query_as::<_, ProjectCurrentUtxo>( + r#" + SELECT + au.tx_hash, + au.output_index, + au.lovelace_amount, + au.slot + FROM yaci_store.address_utxo au + JOIN treasury.utxo_history uh + ON uh.tx_hash = au.tx_hash AND uh.output_index = au.output_index + WHERE uh.project_db_id = $1 + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) + ORDER BY au.slot DESC, au.tx_hash ASC, au.output_index ASC + "#, + ) + .bind(project_db_id) + .fetch_all(&pool) + .await?; + + Ok(Json(ApiResponse::new(detail))) } /// Get milestones for a vendor contract (paginated) diff --git a/api/src/routes/v1/vendor_contract.rs b/api/src/routes/v1/vendor_contract.rs index d2cfed5..382db48 100644 --- a/api/src/routes/v1/vendor_contract.rs +++ b/api/src/routes/v1/vendor_contract.rs @@ -1,12 +1,16 @@ //! Vendor Contract endpoint (singleton — the shared PSSC) -use axum::{extract::Extension, response::Json}; +use axum::{ + extract::{Extension, Query}, + response::Json, +}; use sqlx::PgPool; use std::collections::HashMap; use crate::errors::ApiError; use crate::models::v1::{ - ApiResponse, VendorContractProjectsBlock, VendorContractResponse, + ApiResponse, PaginatedResponse, PaginationQuery, ProjectUtxoResponse, ProjectUtxoRow, + VendorContractProjectsBlock, VendorContractResponse, }; /// Get the shared vendor contract (PSSC) details @@ -60,3 +64,100 @@ pub async fn get_vendor_contract( projects: VendorContractProjectsBlock { total, by_status }, }))) } + +/// Get currently-unspent UTxOs at the shared vendor contract, labeled per project. +/// +/// Returns every live output sitting at the singleton PSSC, with each row +/// carrying its owning project's `project_id`, `project_name`, and `project_status` +/// so callers can enumerate vendor-contract state in a single round trip +/// instead of fanning out across every project. +/// +/// "Currently unspent" is sourced from `yaci_store.address_utxo` with an +/// anti-join against `yaci_store.tx_input` to ride out the trigger +/// pruning-window lag (same approach used by `/projects/:id/utxos` and +/// `/treasury/utxos`). +#[utoipa::path( + get, + path = "/api/v1/vendor-contract/utxos", + params(PaginationQuery), + responses( + (status = 200, description = "Currently-unspent UTxOs at the vendor contract, labeled per project", + body = PaginatedResponse>), + (status = 404, description = "Vendor contract not yet known", body = crate::errors::ApiErrorBody) + ), + tag = "Vendor Contract" +)] +pub async fn get_vendor_contract_utxos( + Extension(pool): Extension, + Query(params): Query, +) -> Result>>, ApiError> { + let page = params.page.max(1); + let limit = params.limit.min(100).max(1); + let offset = ((page - 1) * limit) as i64; + let limit_i64 = limit as i64; + + let address: String = sqlx::query_scalar( + "SELECT address FROM treasury.vendor_contracts ORDER BY id LIMIT 1", + ) + .fetch_optional(&pool) + .await? + .ok_or_else(|| { + ApiError::NotFound( + "vendor contract not yet known — first fund event has not been processed".into(), + ) + })?; + + let (total_count,): (i64,) = sqlx::query_as( + r#" + SELECT COUNT(*) + FROM yaci_store.address_utxo au + JOIN treasury.utxo_history uh + ON uh.tx_hash = au.tx_hash AND uh.output_index = au.output_index + JOIN treasury.projects p ON p.id = uh.project_db_id + WHERE au.owner_addr = $1 + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) + "#, + ) + .bind(&address) + .fetch_one(&pool) + .await?; + + let rows = sqlx::query_as::<_, ProjectUtxoRow>( + r#" + SELECT + au.tx_hash, + au.output_index, + au.owner_addr AS address, + au.lovelace_amount, + au.slot, + au.block AS block_number, + p.id AS project_db_id, + p.project_id AS project_id, + p.project_name AS project_name, + p.status AS project_status + FROM yaci_store.address_utxo au + JOIN treasury.utxo_history uh + ON uh.tx_hash = au.tx_hash AND uh.output_index = au.output_index + JOIN treasury.projects p ON p.id = uh.project_db_id + WHERE au.owner_addr = $1 + AND NOT EXISTS ( + SELECT 1 FROM yaci_store.tx_input ti + WHERE ti.tx_hash = au.tx_hash AND ti.output_index = au.output_index + ) + ORDER BY au.slot DESC, au.tx_hash ASC, au.output_index ASC + LIMIT $2 OFFSET $3 + "#, + ) + .bind(&address) + .bind(limit_i64) + .bind(offset) + .fetch_all(&pool) + .await?; + + let utxos: Vec = + rows.into_iter().map(ProjectUtxoResponse::from).collect(); + Ok(Json(PaginatedResponse::new(utxos, page, limit, total_count))) +} From 846c856b9e48bc3fe92d8cc5c013d16b7598daa3 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Tue, 5 May 2026 12:54:11 +0100 Subject: [PATCH 19/19] update docs --- README.md | 3 ++- api/README.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ docs/changelog.md | 30 ++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cb6f19c..0dc6ccd 100644 --- a/README.md +++ b/README.md @@ -129,13 +129,14 @@ Interactive documentation available at `/docs` (Swagger UI). | Endpoint | Description | |----------|-------------| | `GET /api/v1/vendor-contract` | Shared PSSC script address + project rollup by status | +| `GET /api/v1/vendor-contract/utxos` | Currently-unspent UTxOs at the PSSC, labeled per project | ### Projects | Endpoint | Description | |----------|-------------| | `GET /api/v1/projects` | List all projects (with pagination, filtering, search) | -| `GET /api/v1/projects/:project_id` | Get project details | +| `GET /api/v1/projects/:project_id` | Get project details (includes inline `current_utxos`) | | `GET /api/v1/projects/:project_id/milestones` | Get project milestones | | `GET /api/v1/projects/:project_id/events` | Get project event history | | `GET /api/v1/projects/:project_id/utxos` | Get project UTXOs | diff --git a/api/README.md b/api/README.md index 7267466..66388cc 100644 --- a/api/README.md +++ b/api/README.md @@ -215,6 +215,51 @@ Get the shared vendor contract — the singleton on-chain script address every p --- +#### `GET /api/v1/vendor-contract/utxos` + +List currently-unspent UTxOs at the shared vendor contract, each row labeled with its owning project. Lets you enumerate every live PSSC output in one call instead of fanning out across every project. + +"Currently unspent" is sourced from `yaci_store.address_utxo` with an anti-join against `yaci_store.tx_input` (same approach as `/projects/:id/utxos` and `/treasury/utxos`). + +**Query Parameters:** + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `page` | integer | 1 | Page number (1-indexed) | +| `limit` | integer | 50 | Results per page (max: 100) | + +**Example:** +```bash +curl "http://localhost:8080/api/v1/vendor-contract/utxos?limit=10" +``` + +**Response:** +```json +{ + "data": [ + { + "tx_hash": "cb923b75...", + "output_index": 0, + "address": "addr1x...", + "lovelace_amount": 79500000000, + "slot": 186056809, + "block_number": 13361422, + "project_db_id": 8, + "project_id": "EG-0001-25", + "project_name": "AdaStat.net Cardano blockchain explorer", + "project_status": "active" + } + ], + "pagination": { "page": 1, "limit": 10, "total_count": 33, "has_next": true }, + "meta": { ... } +} +``` + +**Errors:** +- `404 Not Found` - Vendor contract not yet known (first fund event has not been processed) + +--- + ### Projects #### `GET /api/v1/projects` @@ -298,6 +343,7 @@ Get detailed information about a specific project. **Response:** Same as list item but with additional fields: - `other_identifiers`: Related project IDs - `vendor_payment_key_hash`: Vendor payment key hash from inline datum +- `current_utxos`: Array of `{ tx_hash, output_index, lovelace_amount, slot }` for the project's currently-unspent outputs at the vendor contract. Empty when fully withdrawn. Sum equals `financials.current_balance_lovelace`. - `created_at`, `updated_at`: Timestamps **Errors:** diff --git a/docs/changelog.md b/docs/changelog.md index 391bdb2..eae073b 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -6,6 +6,36 @@ the equivalent merge). Pre-1.0 versions allowed breaking changes; the project is now operating under a 1.x line and breaking changes here are flagged as such. +## v2.1.0 — 2026-05-05 + +Adds a vendor-contract-wide UTxO view and inlines per-project UTxO refs on +the project detail response. Both changes are additive — no breaking +changes to existing endpoints or shapes. + +### Added + +- **`GET /api/v1/vendor-contract/utxos`** — paginated list of every + currently-unspent UTxO at the shared PSSC, each row labeled with its + owning project (`project_id`, `project_name`, `project_status`, + `project_db_id`). Lets clients enumerate live vendor-contract state in a + single call instead of fanning out across every project. Same + unspent-source-of-truth pattern as `/treasury/utxos` and + `/projects/:id/utxos` (`yaci_store.address_utxo` ⨯ anti-join on + `yaci_store.tx_input`). +- **`ProjectDetail.current_utxos`** — `GET /api/v1/projects/{project_id}` + now includes a `current_utxos` array of `{ tx_hash, output_index, + lovelace_amount, slot }` so a single call gives the project's full live + state. Sum of `lovelace_amount` equals the existing + `financials.current_balance_lovelace`. `ProjectSummary` (the list + endpoint item shape) is unchanged. + +### Schema + +- No DB migration. Both features are read-only joins over existing + columns: `treasury.utxo_history.project_db_id` (already populated by + fund events + chain tracing) joined to `treasury.projects` and + `yaci_store.address_utxo`. + ## v2.0.0 — 2026-05-01 Semantic rename pass: split "vendor contract" into the *singleton on-chain

5}7^c38Rbc9v($}#edmn0|M$lhr2Ph zmU?p1fyP{rrDcTlzh9Ksb*_l#4prp@ zgO#H3K5;M4n*L5@>MLj5{??}b{4s)RP;0u85{ms+dmf+bNX~pmJT6RB5)+wr{f6+- zcVud0$k`yu#ma;pHj!BTL_qT!g+tD1JGen7##AJce;gJ_j5q#tuLb%cbxjrU6=}!k z7V_O85SbTYb)I!CSZYc)pveZH-bt9pkmw+cearD45w!V;;*~??iWJ6Rfj}883ix~4 zM+Qe?@8SV`5U5fT#eld*N2b*zbcjq|Blt-Sh@GgKN$e4aH}On%;-U8oAS=Wq6XxLW ziED~*O0WTa;y}Ze8$&7#t9qOm3(;Q&bi^WXzM@-A2$Jps-DPHcCiItejhOfuvj0^yRXEXvFW~AAgl|$9s43HZ?V#!5Q!rBW=A;7OHfM^dxu%r~?0ZH|h zs#roSt76{wZ0_Yn)6wa;RKuE=vd{d9wNg_LcixO%#7(O zqM6ckl+sVAB&<*vO3`AKw;w(_^sX^m>^W&Qk|EZ(1j2X$JK+j zUCTW^%_j#wV0n2OtST}t7U=!H{j|L{jf)LrLD^MB^DSuakb#OhL+=NyMU2SqgwBm= zHBDc7yK$k%h(xbQBqDgav>Nap9~lv7T~KiaB%|SVtOPr!n`+9`YWf3_nT5%aV+1I$3{4{*v^LY zogq`JB+)Ep?!}Z>=w0XLNa-rU_07VN7#2@&tG9W_d3(tbIMYxt-}G;Wi>qnJJGTjM zqW#b@wMqGMckkG?h^OTs<&HeZxq;_eT`?)-%zor$Ao-5GZTN4IYPT+8V*eCCj_sI; z%kuh?ye?0KL{PD=9+ozOBzr_;qSl8OMu(0HD}RXS9upFLV~A^gj@+l%&Jj(aSrK{L z@y9SCHMN!y8+jsm`DyDvz_x4wzfx*QA}$s$O!SsF4K}a_Nm?~bbbUArkL`>be#G`| zbaI@uH`WlKmcyao7{5=BHpafB%G(IAXCsYx3=lhQ?;maP0&*)CUqs-!8(4-^>=IkX z-0!NRGawjvR~uFc)=kMO@2G1VgJfI{|K6&&3(Vwg$MvmP0^DU(L(w-<*r~uLvctkk0Y|VG5|fHwH*9!APZ$LlO52q*OLub^Zs(pPPyNR2n*YzDnC77h`J?-e3ex z@Q(k*Ih&@h>^?N`0Vb&!Z|?0!y*Hko^VpLlaA3%O|@$-?jl!Ci+J!tM#BS@Z!*tjvRksjjcfD1c`> zyO&ryx-E3-AzJ|CI~Kakt;x$Wq6q$30Ji~e*VEp@Ur6bPi5duj{W2W*3N75rpY(Yu zBw{+(NO0L$p^A-W9W{Ch=ElC6X}!=dow`+B7)X8~FK5lmSggtRS$OdP(Fp|->gXag zcV8es+iC~+rUp;BM9hGtOCe`7?CS-WlDDY_&)0Xk-z+yEFS{17k%@_Nd7~tYGE3EQ z#v9Rx4v)%r5pRr0oyvQ+MuIUu&y97D^=V!KB%vxTSc3(9^bJvOxXm;-^p)SK*X~6B zI<%CsA4Coj&;Oh{wJ89MN!rV0x9r&fl8>MRVvS!98)GGu=?xAc|I zyPKU6iCE|SgVb<;v@tz%tfh=nJ z->i8Tpc${Thm^!(c8s-JscV3VB`)F|Cp z;1OHP5fGR_6cA&J+smp|Ge+_G2+#;%ZMZ=0#^glhQ*Lk$!cHJ+4I$;56?^r@u_y=( zXvD}EC697GVa8Ia(~18F_&}8fsqlpncljD(?L*_fvmXeYck_$lv1?eb>8jL$SlIPR zhI;nB#m!e2{~Pk@XBogx87wZ`5BH>vEXxup_*yz;C##14YqqcAE4wq zs$U;=A3p))K3G0E{+5#LwVU?og9qR8y;w+3A8>AhN-CO3Lu9Ck#I}SL%Xpg2R@gTTRw;;^-&4HLnUCw*et>)j&lmHO$vU0OTPyR9 zM>b_{QH~{%dbu1GD@b3Gj1FcGA0=>Fb4<_{0&2YWbAa4YuCZ0e46xo&C>H?yq7C3+l#A(8SYI-S-*R+W-2F0F==^I2!D1f_MB99ohI319T`Q*kyMGk^>ZeBXf8myoWj@d0=k$ zb-Y?F(3JEbVR$lJo_Je2J z&y(u4c)k$;B9OPB9Pv{jz6|>MK?oqOWGunSk60g=ilJzc_Iy}EWa{p4`G@aw1O`@$ zLL-R+;zX_)X)o^y&EU0W$JLjp&wVgUdm#r`?Eda)1qPcok&R827iRXERIoG)S|H0 z9GRw9UQLepb_@XK+QqU5b^~P;p&rDr?qrC7d66RufK*s{PEC|z^31>D?2y8IOvp-lPEbDwWC17}&6-YJ z#QipWF@UPgLhqtRgv8T8SyHPe?=yLrA!79aq!(Y@*{retjyq_hodZGSqX42eS6GSl zRZZna66oIGX-wSn3uaR)<`o{;#1@QZfx$_|ZhPflx*7mwn}9V(kUCMu3G{FKAwNnfz){+BJjq+H4P*=MHU=^u4spjS<8!^)x!D%&K9bfMah8kvFncqw0FllTrP{Z zTk{z}3wq{#XP8Udt?uVOFMmR~=DUmaz15zN2LX3S%VFnqlKxG%-K#wSc|TfqtCV!@ z{nwnn64}&>Mg8aE_vuGq%sc;+F**khNpYszx%;c@!hpNudV=hLeg3v!zlONKCO1E0 zclK`9+b&IVNc4WD+~-#GhnF)uE40q+yk52nP&W4y_~Lsc&b zbQHYSW&O1fm-R*|mz7=Dc5^|2=v_cB#uB~ulqpjOiK_L64O|zj*VtB)J%hxFrB>DA+uNn2Vm%@%j)pR z$;xT^Z9t(*ON4Mzj%0{q=t(Q8yR&&1e_CjUgNd_8(`280oO7M)S>}eRg~6WZ#Sej z3E>aGemjd8@Tiu5s80S@j_P|ZYWoYtn3Vf=2kShvANRq;i*>hmd?7#oUlbvLN{HZB z#@1@(D&pMZ!c0!i|LC~;*!%48qorbYeSm1hOSV0q|KX56)#0pm8U!uV6HKp`dm|6n z-tkn973tq(-LIi%{RB&zT566M8&i2$qg1uh_ zG(FKbLu48!pMH>AUhc7a z&wxs=wT4-J_{UF-%9TeJyirCPT}Ih@15w4Gi_B@A$is$(+_v>QL^dZitiqJy`JC%2 zt3cbhyGc9vZNV%0ifQF3zpO^bVGgwq}^ z2*9}=PQO8QxTjfo(xKo3y2^8LYdLP%<1pl8)3p>1Zgw-WCCHP2Mg7TAK-wI z2P@}j=(nrF!#Y1VdeS}vs@h@V_$0=>Dvn?EK^{#FXqplt=;c{$*bgccyJpU8*La%j9I~`EZH}hE*Hw2qJ9Av|488f~jvFIi)7V(; zKfpoDcn6mLMJyIY@pd+k9_YaF@5Pwbp=7t5(D4`n zXjwP9YM+zdH_$iNiVT|hB)#U^w%e#_%E>DF;z^lJ-#O@D`%;Z^^6f`~rk-z@SH6e$*`{=8H$>mYdaZiiW*MX(oQ)F`qlW`y?G7}Kui?}9Ju0ibzC z6oKaXcgl2vbREp+Yt-4U>=v8ws>S695QoM&-(rvUe*F84={cq4f!P&aMMj(JJ@>A6 zfAaf0tmS0WwWLzp+w%PR4w+u_=iV*L)pUv814m?3b_(w{9Y5j6)`X?a++xq}V1jN0Cr)nuy z@6PNHyL%#zl+rTOXk@V-O>q*aW;A)|Ou?mKiGB9_A#|+Jux8?Aa?W%kH8i^%Ry-A> zQwu9-wVW&kkV4XZj_)i042PuB{<_bJS~w5-vWAj83Nn_xiDg;SCudZ-a!GbT5a19%0}++CK0U&v=IfozjNSH+E~sYr z&wTg$#SD3euL}#-+wscrLqc(6aFDI^%cO@fqp`r*NFeSCA-uX)LLb*D@l49*)o2w) zWQLS2MlgtylIin@N2{umK&_PkcjMc^DYNvsJbx6sG#^*4I-Mb0QW|L}pc5Lf6^{nm%HeDYpENQA0} z$j4qrI#HS*TN2Ye%M*dM@^>+BjLg;T31IHM*8xhj{Y~x4L$Cbl<{{*OxT?0}laSnQJxMJ8J+UiXZDOj7V> z|A>LRcaNguIx(cA<3pU$Q|^sN6syso(*0hIq@LRW_4-|>`7t$}`pM6#AJ(qefIe_u zPcv$3NQeXT=MSJPE+^!Do+g4pV?myb`+(4ycS}vl0fybnM|l{V0{achZ{X@8(ST zhM)R$1!wjstVZcSFP?244(845!Bh3p^mK_K>JRntWtMydfJ!3&s})@?aa+J6UXU`2 z;;>@2_!)EMRt{kJfH+%*m`F9uzSmL&@s}7HSpYKg52b7KHh8uQfH?C`P?isQe=qfI z{9|7HbDWa%Z1@g%4b28QX?7j4OzI};AGi{Hhf_)S)R|jr|K7Z}{X_i3>xKMD@+(Ww=v3Zrgmz6@f_^Tsf6<_v!Us6C|7ySh_UF(Mz! zb`9j{KQ)YU&{1UX!;m}v@U-Jm!NX-QC{hrK$o2PP#pIim9DncnG{D53^O4HN>8fKm znuUPi%o7}Wccy}4z}{8n=g^rKT2|70e%FkGUMex>hjDq}xa2IC<{A9o3v1J@we!`g z%OfZ<`miHW!78b14@uh^H4H}p(j|cviwe#Gcv&IpWk&}0vT<^rFl^GzG=x5!W~Uf0 zCKiUpThxk9wOSVDS9QH5hW8+B)f^+=3426|6;tkjFUUA{Ozs?Y^M=)rp~hhZxFDht z9^c_u$y=%@68{-nR=%OuO&)s zt!Bf=9Z)+}+zv1+r=H=n##7JXLd~zaVJ@_*YSUwMF6>I_H$hJ?HujAQ0TVqUe%q_iy8yFOE$F+>m z-WzrEmBscc`fFMvf_O!XiqD!y>Ip&ffUp99A%X5ASXd}*Q`yc&9z{q9RL*MaGNJ)l zu`Xc&?6VErdb|GwgQu}VCAi#ll|$BW4o@(;c|9Zm)qpY(t|gsNnN5+;+HC(vtZLUACyxX7MD-~c>PfO6FTZ94u0wU8Kz*k%kOyBV_ z-1oqnZ5W6>7AY=i@nj_lK*EyuwE#irUz}_1uY)ZS5Iu(CV&ICMgc{bJO(z6k`11KM z)5(AAwIdN#;Ag8wtOAugNrozT*EMwsk4Rmrxt0Z?omIk7_En;X$R|a5j^wFGh(7_# zT*=Q3G!tQje^N3KQx5ss`>S39+W7SB6cfLoZXkM+8jWOeT*G7&ar*lF2Wmwy@D)9S zv5I9DJ+QudPEJ2+nx3KKs6=xSu_1NlgNT2S;`<7=ijvufNMVPAkmRw(T zUmg{Dy9NB+asNxn(tdtu_NJuC|MRmiQ9rr`-B^H6`eHBohJ5SA_Rho>oLT;`&^!7@ zbkM;Yjg#(!4Y;Akt=BFcmCUb}Ux8D;@1UqO!LW_5Qn=Zgf}3TB(Hrg&?{XGkr)LdgAYk5j<&TM89B*C}ku3iK74rOw}? zjD>iq7+2TA=?HnAGUsstypRhWSWu9Ld%qj>PnVw_8 z?Lx(e<$oxBZm{X^ZoTr`@N1D3V{^-YRgS0! zi8!QP;IR*Evbe|N1AL#r7s*h4!`ecc~cP+%Lwy zWY+-!*LN23q$t+-G0!_M>y@KU=tZ`9Pp=%CHcBVbvW8kM8TwEYn6ZVCY+vF-AJGzS4SsuDD^t6n_FyCl_Lsx;h55 z61ct*P!ha<2FM1)IISVemS-M4JNsioY5VR>n1hbU7?trSL4?P}-l|S?CUXZ%y694!qmHlttMVA=c)sIN9{-tHLoY2fNyXw=woAQoFg!Z@soIdaBO6Lo=NWd; z!AAn=^q@#I=S9g>BFvW+Y8*y;1%^$Rk(bO-ZT^fpnm#_9>1Ydjx0{K7c&U9qL$chA zmli3xU0a^cWH6&QpjRS1+59=aMcg%nj>*A>%L#V`R@$N~8F~OiYo?57H_(CZk|mtk z{kk|0sf{XV;y|(Wx#wGJcDs6Av;4n*)5LKQn#KJF8hOF2-l_Y&o|cm&O{U$EC&{2` z2!Ywt)Fuz!?&0nu0@(Q7VR|JI7Mm?vOp`F|GNo{ZCp53=%deEA?{|KCY!C_6xRMy* zub)zVOXo6hK+k2ABp#KQD=tlhARYJExle3~GqqLg#TqLMy!H!BjIV)g$e^Z}{G+v` z=_y_hW9hj}nJEzmq#?Ps%6)uK9~UNdlU&}rQ)Yu^T?V=@&C3g7lC9QkB$arAy!Kj{ z2(H!pPO3;=+tg_m z3JB-kVV~!#Ke>G?q81=KDm-5|Rei2wgZ9bC*L5S3-9Q5;U;q>+s_Ld<`-&J`SuU7d z%=sOZx@?tM@-CwqS}o>@pm{)!fr6QG{kB%jCvh(fD<}tvMZZ2#^U+k>3*ppxQ0)LI z&j3&B0}H`qHzFy__{{MvmzvK$IZ24CX!`(AAwPL$U=AulRhqPrZ_7EPLt&y$U`-9~ zNaH7tJ~MQ4xXnEvr3xPBxcFMGN-cQDjxY4yGjfzo0AkF+3?Y?Jd`L6`06G4VFOAsko@J2$L25(5rl&GoS zn%5}`Z_^Qg#!jY$e%kTi7|_{Y>fqLIj-7UjnOjS%!sA4YwnGi;I76P)H2`IdlmLnR znBd1DxSHOk3YdpF6wtPjpY%nPkEC~_WQ01p&XrebJX*6r9+0D&-)yrv`G>NuNn6 zcT#Er^Z^~UlcwyaA0QgYQx3H+fj*W}e6wyhhx8Z#GH#Ga5WeUXhzS~_1hrPqBB>OZs{2i1s!v#0Y}!Q0usb2@gMw@KX==S z5fN4~?bN9+k?5-5^;yX2`T#c4p8K8_gOZ5wSZAj?kkW)}AaA)_33mg-_NyT9_rnhR zWa6jf5vGxF%~n=cG%E^l2=6uJ)$9lX2`8ikKBTYCUbIy5%1-rh$O*MJXb4asDX;A> zWvxHvx~9*f5eIlwO;wT12>lp~9URV*2s8lI#SR6$Mt=YuP8bB{f4yM44L&l2gcrUT z=Rg3;z@f;qALjKQpn6>YI?QRO_4~~q0ARB3@q(0Irwd4j*7*w94nKj(;*lN1;RnZ+ zhV**D-2JBBqAYvBDLo0&lY|R`=g)y7I9PrXER)OYHR=7A#H%MRfD3FGEYfsZ;Wg=3 z#p^kFe5|{aCYLu6ANn_n!&nI{<)TS5s@5PJ?DJ%4SOCi6L#rfp!3LP z>O?7hC(tB#>%Vm0bgb8yqH6E#(fES^CF2pP@Ryk_Zi%~usv<$xOSnTps;#_oQX zk5DQS&^)f^bsEy+u9!~tAA9BXFH;q`vwvL5@iXDN9ibH@0Hsm6h}Fz(=5^Cx*uTb6 z{GEys8vy|xxPHg{*DL#(z?MkpyxEVXed-WzeXz?K2pO51V$}rL%L*D?5{_4Zt03AM z&4B78RQ_^bO1`*XM;x%{A*Qw}K(}q3A~j$PQoN4X%68a59;PC=-5;FWT%YMP06 z1<+5;sGjL|9o?HUiS3Wtv`dd?lWzbI!2K9;qr6;0rO^KMdU{A`4MMPv?j$DrXwC%Z z6LH8fcLT{=ME=HKa|!tOz~(3X_>3xM;T40QU+qL?cy}| z>J0UBf2tEr2o0R(hlrRWclP3@Cyr4rVX1LVO@TfNU_G8D=cL&>ZpOlWA5v0gd{2Zh zI+u`j(^``V;E$r_qnGb022~rknwDI+9t46abq#Y!M@6l2R)`BNPhef7q%nWcM-_A> z*K}6AZbE~y0p>+TUz0tOZ+cxDbQp&I4ZuzJFs1krPG1b~2#B53D^A|BGt;Mv20At7 zML`D*eTV#lY~~fd0$^I%Zc>yo!`$T+FUGp}bVfX7cf(S@qRQkSPG5`0+4!d`%@eEu_b6eRgOYv+>+k6i&&HIzqDz3u2D*?R+zr|TL&Ew!Mo#~5 z%mc_u?{;JK!+@Fb`IVWA_tvQrZ<8x0zn7=*h)(yLFPI;~bcn|v!$h))az2Olf z7>LJw>4?YfODoCju3O{%emiWe%~o7xOO<3buhS`5ri?Yie>-ks(jV}Xm`0V5Y5MEx z3iGr_Nx;Xn&#mX0mJz5!HZ5W9_9y}VF>S6J&NiX|!Fd@e){}L7mt=Eh#B-KP0uH!J zpwDxKsc61w+GRxPkM9H35{X1l+VNf9&D`|YigS$Y|Go@rGbOu-*KIMB$X<~JrzOnU z9(8HMZbLu~@g)B>)ZI?UO6ofeZw7W6OYunx?`(wiMn~?dDai&5a_YI* zCD6ZOc23_#ea@#!#%XgHIaFnjIKF{bUASwfi?iFxi$ zPOUxDzVJ#L@qSXuN2KFwtK-w&VoHUj)3(481s1BL-cCbl0sfDi5unfkR(vNJmE~DI zq40@n0RYJr?Kqj6H;6XN{4lU8G(t2DU8kpA)^!&m#n zb*l%$b50 zf8YU8TSBm8%yJtc24VsY|6bwZd<0q$r`(4eT%t#ve@WFF|C!d}H0z#!zS95yy+!A3 z^88#@%JeDJa#1ee4CI-yfIa^%mRAes+++eab$&CmFcbZ}ob)I3=V)PxusFHN*vg;( z+gguo#PWV#%KiWM)~7A$JyOW|e;RZhK0_;>kwU=>ge7$YiL#T@?k9;RiX?*4wXf_p zHY@O^_*r+~kY`D929;<0ZA&p&;ixp6Sm-rMSH{aO0fUon-S$zZQCuuX00gG5QR$3q z9xPUU;ReYuxyAzuxT*LAW__vH1P@Evg_au}B40}J(zdZH`T;9E|5A+0)JpCr%#OXT83o%@WmD=NT*4hdL;XQ-7zJEcu zI({18C%vVOd1Wnf#-~lB^IXZrJHY3(tM>SDAQKhnBEBFv>Ge7sXY{Jt`Rs!M6~HVr zK*}$vXnt7F-(gA6m<8H-B8}Z(qni`17ZaCdU*!h(QIB`V&VO97Ad&xdsIDluLegQq zG8!Ai-ke?Sf;4x}YMlXKZYz}_6XO7B`CXu6AlrY={Dso~LT-#?7kX)mOUR$Y&q>wg zOG3*%mq1g++U(djk#F+9A%Z}dX?|dDV>W-}iZ7T`fZ`dI4K%)$J+Y748!xU=X08l? zQn0jiL#4|@k6J07G_RYGRdA#|XMiF^;()^3ZT)f1 z)2^-{iX|mZm(8njrN~~gn@Q+ECd#EaUT{Elqc(Z>GRdR%0Zq*_g|cd38K2?lrkKr9 z0I{EdD~rpww>$W%`E!YT$1W;MW`hS`-!&o3PUvcxiQEZK1;>h(NKIuJ4n&c#Nl z07|pjLhZvIl;@SPbrnr!Nlm`{iJ4t1d;s*NIzWBt2)itr-27pUmt!7sBaXV}<+{Vw zkt5dj-vxZS`JSnok066p;+h>D$wQMw-@fV&=DHeR%aT3z<=XgDh2-_so{ju#l%Fs|NK54tb!|+Uo_bN8fR={)T70Qd1e3_oPqfKwWwIQ zU`JWdUl5^2=CY}FHPH_vw&V3ZC%DhBv=<%xZI>ysu5cn1G0 z_6T+*>AFR}!JI!Nik@}@HjG?bTq*ipcOGM0GWOU)*H*=*W1W4MHleS7kPhCV7nmD3 z_5v6qPF$j1`<%3!!XtdF0^LNQbS6}NC7Gyk=X<@97kH)UrrK@=+sadQLZukv9UMVu zK?{hS!A#$mw(i8Ge%uGeWe_O+)^?c+oLgNJ#d_Edo*gxrj`p8x?R$eUfHr5CV}KIbzm9(Al*HI(SprvuHQ03YrdOwh47o z$KqclS_op;Tu1N*Y_fC!^9{w*;_|q^!m({2c1^kCk2l`&5KpUUZdm`cMA;HgWcgsC z?72rcH*N!#=zdu>%v$WD2xUq(_f$OO?7r^AH$dCwT<9(1n-~q;Jswaa8oVOI=A7rh z!<%YRW%bTh@Dd1>pjBWOZMjV-+~8&1)d*Ntn6>7SkOu>7wh2uA(PUS^Ot{!%=RjWT zPobmUlz$C0&BaUmTjp23R!o3U6YN_scv(>(WXg|s7ePjbmz#$`jM%~zo`L_I@w&$t z9IzE#7r8~*j356>6f@P?t{!?%5|P#`G$4xw61wu~?%MFmkO6B%q4g2G?nlv#l$zwg z(RUEa;fX&2Vw^%=KEUZI;wxBo1OQ(YsNyA5|E+NBh)zQ3bK(@qNl2Gkd42WFIW7t(!4KE;tSte-T(MQ&gnE2A znoOEDmp4H(oGmx}t|R+xfI+=SveTmmP+b8C67y`+bzq3sbw!ey@vFywI=R2x90$hv z;u{cH1<2xbow!yb#C|zESGtmGI_>%MZ3~kStRnz=3)31aM4hK+!O1OPv*80n@0Ib8l4USCZ zmT8+NVjr~Lr2|clk7%asL&o8pfst>1A8amXfnWS?cP6h#?^*1YrviJFe$@@AUqU*$ zQT7_khCS>@7!q4KOSy07@A1(6$IsUXAYxWTMZEr;(~^2l3k3ik-d zdh@d(#z_DTXrSHfAQ~35EB3#RFmNCxBJ54YkA^9Ti9M4Wrgx(X85NIv+fyfnBI3;P z_ziKR%Fpe%Lb+?F6Hh`=O^5QvLV!JuWE%b`#~tO;BD6eK0@iZjgBOYE*q5xuO+UMW zH>w|l5xbefs`J^K%JiQ}Ef%+eNq^%VU&A;DG7CTNfrq79D*B!Q7x~jefR9B#eGHs4 zi~1K2_fCWffccZvd5%)Qe8B~C-L^w>B%^8okVL^y z2HHpH;o~uNuF_6k`!e-j*^|hx!fMO}gR5Zs!@xTj+%r%N!j0rC#G+t^s!!GvcyQd( zkZp(n;6&n@ar)(jbHFA6HLj{%=ZUYeU$V3c;t4^2{azCoahc0&H|HNKP6Mm=GT75Z z7`Sn&_S7iU7&Cyn^Y_GkTQx~(k;&aW!xI5f;pP8+`l3!1Zbr9 z&u50{1#C>#b8y#u4nZK=8hI+pMZ9{03~G3RHA1t$R#Y(sGd%{Ri=Y{2cj8p4rjy2~ z&+q}It9+O^66TY1T?=`;`r`%2RSW__V^>AVwB`sOAlc(6eyOBDYvCEwm6vT5dAvAo zOia2o^+57AfR<^+(ZVFe6IeB-uL;q0fCl~yM~jkx*gQ4Lv7gUr$+%l6|LnAs#cvq z00AdVtmA}0nxoZ{$QMkQJ$k~n-`D1#YVXAYj~HmYv+~F<4p*39LPm&39%h} z)eP)0lj&-t%7(Kt@EP^t z>7M?#`o>nFeiI;_bADW0jfo#sK^a8>N_v+luBu{a6~y@|?v`v2HDYZ0jt z9a14+m{J0dywts}A)fJMcnjEpiG`hBv}^NHPHn+>p$_e-}v{p zT@D@ZZ7cWd|Ds)0!py5geZ^2tDj?B-7>f5hw&U`aMy)0RbE`O~b8EkH%Z8gY-QPdQ z-?v(>{SG;799=r!|GU}}+Hv-0aL)Uc-_bhgs5j(ymgn3$sEbJ!466R$dTkw={ zYy0e7;OTIwf%hBpyZ<*AKCN?fPyCGe;Q!Z9e}R3G#N2{mH`}YkRWZac{tdWU#8{`V zIO>{1fToxIvMPjl%|;n{RpDc$8(f~b2EZr7oCRwQ{V!yBcXVtvz3m2?{3ecpGJu zV+EQq49d*r7KU{u=Qt^QEt3*kuMn{)qgaVMePr27zHhEl!!(Z_ zgb>$>hY80-Gd}H@d4MJ^O`AfAqJ-GbbyunWjDP4oPCf`60HCFok1RIk%<6iP- z8xFcFmdvQwAC6i&NzZ0IxuCg=Lxq>xV1M7y2+4h%K;f2GgHy|Q#xS$!PJfR8A!a@H zsMwr!)ym#0lf!Lf02$rh%oRD1^OL>oP4A-2#nGzCoB8rV!IWyLgH-69O}{u4v0M3o z14}~j!5Dj@L|6n9d=wv9@pUuz?nAMPlAT?&Y$zAU{D-7k^oL1l`U5d8-%;&(AfeH% z0>LxP=?;F6Y*LC6oWD!CZn2+#nw$d$PnH?+>9N>Hp57zX|bCz{khv+2#cKJ=db~dtcztOaDn34#!1)w6~SrGq^VA1L=&c5`4&$B8|nkttk;V)P0QJskep=_OeNA6KB4E zpDKmFn_w@BNE0tMrcc$rmmp_58<)OV^YVvBd|-=&gi`QV3qs$c(R8NkHP~G#ue2Za z5#5p^)O){S=rA1B!B|0YXC=KlnhFGWn0g5iW zKwG)X_?XVl4PF^fdO@Kvbd{gr^Ta*o)pcS5Fo9PgKsQf`r@5`TL+oRpPwBUuRn$$hk(p`|7BLmP1FxP+q&k1hSVBd!-AZ`0kaoqEPeEvgN--tuItT z*Q}mq@T~W{DYL;0hbxHXyQ&^(u+7P;ViG>V!azt&`N&`jHo`+-K;4FG-(K{v%3*)y z#xccH^e$vO%7O(XRzz&KCioQUq9+VeH@!LZE>m7yS06I)bxo8w)0;36;WHl zG5L=-Q=$!pRUQ}6IH8cID4tRp)<}ad?`J6!1ud$dscovJWz?^K+7s6cqPQRc2Q+(s zpbFBL?A{P@-c36+S^)xS6{=Q5oXD9}BmjKkk7Kb~pV+hZHv0i6{)&Jj0Cp>Gf7AWW zCWQ#JNTuVVaLoB^6;f}1KUv<)crl3p40=<0&Wl{Q2V#HK5A94pN@81xB(Q;%g$%(rN&G z?;W}pBXppuPfc3GZM)KuT+Z}E1J*H>XF%aI1VFoB|vMJp4$ zjbY^@gST++K{=jf1l_9!_RHnptJ#ywBf9W75cGe&(K8h}Y)1TcYl-|^tYZ3Rj1x(h zTh^R%Ab`byoQ}>>yy)bLy+rw4o}DEy=-j6OcO9?2`4w#N)A#1l3dnN*L`f9VdyoRb zMjS>sDaw6MX|6+8VrcRN`;KXiJv`p@xdZKw6E7J%rdqbnKzpghzUB;zbodRJroV7^-2dy?2%zG$jJy!5HBtwwsT%l za>9?sh$ee~LyyS#1vs?72=@-#B7GqjyNT!p$qn^mVMZ9(;ee}58-_h2BSx8Vn z1Y?vu-XzvaT=vbR?R#F3TNRy!iwJg&yD8n8KR9q)s`c;32Y(!!jQ`^o5Y~mm$p=!1 zDr$T@n6GGQdU1uA@|Oz1+^<1L($8^}o=zTcxX>~kVQ0gsV)?R>&Y)7?YLEg1HsGRz z?djRHspW#a3|1Ae^7j4NI#%92 zsg+jmgU`WhR52Lh@R8W6W>zQwK%Eg}E&1KL3_})4LgT|mO0+u+bnIKn$8P%MZ~cCxi}W?v2P!Huy@PMqJ8sVuwJsei>E>oEtm?Iak@n&CKY zoIc5UU)NFh8LqQ>>YqClstgYMO(?`|*8e|B_UeR_7XU@8Cir{c0Y z$fgwkt@wrEY6Ujz#lc2LzSWzT`KFYnI+x$LZ0@??TR_@RV?TaRGCD5Sn%%&2LBb`r z;;lK?KI0yJ!t+PHMf!!$#wWDiA*!IX5(kF|PPKKz&WkolCJw=XR|ARjZ>ILsdc>a} zUB~yCq9v0YN#q>D+imo*yjx7d3JQNaA@5mOomi`GE*~{U_Ofl@*jFVNmS9?jOi6lhJ$Ef*9`)f z%{$^Vu=_L?>2Hl8{Q&T@=^u)7uARi52&Z zsHI|$J(O)!0>uT2i)VOJy}{ma8b|`O%{vFaJoF+PjAobQg_owela0Ed~!C zjAsSEA|!-9@`IEtLl&>u36#(u-xPb(i<*VzFPMU#De+BT2jnm6QFNf(E}$-eMA1f7 zQ9@6TGDPcaYy5ri9C@efag>qfSgrElNjfyyLXX3uq-+v7Fr8FHQ4sOo$F z^b-j}r_)IB>=0Gs(0MuEIb5yx2q-vYsHn<9DknLJk~i+8n|vTuZ_)2+aSOB(KLa(_ zJGT$(NITt}L4N#~m*~!M`0;E3MioXO=P7wrq8sik%BL`TZobCW2`0e)tGBwn#g;nW z_*I12E(?6)NBcV`56Od&noBuGGUmqL4otI_B@1Ki4 zXf8(O-EjfYbuyS+WpCZ;p0!=L)nEO_Hunn9#v~bSYPpB=We(-d8m@cPd7W(ANhVda z?P#xVKQbH3>70M^akSX%p>t_Uqona)QIH@gSZyT={ftL80sj%=mkpIPIAU!7qKgGj zU!xe@W!3LLNv3S?db~#p1DX}6f~v`=UXImrf_hR8d)$44)RcImzD0imV#&}xO&3m8B=GC@(h{r6MI6_Fi|5ZYN{|!0tZ#UcH5bJCl$438x(copQ! zEXcs%8nhHsG;rg||Y3Po>5<8El4&E4Kn$!2Nv`$dvIH{Srk z-5iVD591EvWuF%0X=(aDxGk(YmR#h}vR?6v80zzORAPJGOPe>J_wJvg9glkDcYYOS2G|t4wp@Cu zdT=l}H+X*DH`=k-c5!_0cli(HgxmS{@^f$2sg?()mHy{@*(HrjngyR-AN zd-bQzE6*NZh7Z5>Sb*UD#qmaxWxHGe)SRdF7G11aA}SkK3tt^%n*7kpX-_h(Povb? zU0v_XZ=xj~)z0g)7N~TnIym;@bQmW!UmFY}opsx5_gnInZxOZ?ULb+X&Ha#qu;pM%G#M^d(fb=1*se1#kY^hj z?0b@i3=LDf=n8&;@!y99PigAyGu6djkb!dHv9p{XCTjhus=+FP9F)hT2YcLTVuJ|m z;~OXE#WvH|b7}e%yT+PeZlVpvXvN)W{s6nzz7;rdFGD!n5F; zRD^~5nKuY=TJ2=pfd#Kea}6AsZ(RIq&RYigH$MLQ^(wdJyzj5~{8C$UYvHTDi+Dx? zhM%(!p0cypsV)s1w8|#l;Yq=U4I~V@3A!7QiwPM{*Y^nwrC_Nmvv67*E|@Y*z)iGl0`uD=KszecBF)ThM_rBCd1(NY;Be zgNa6<$O>~4K#8pNabj?aFEfcQ{+LU5Mb&2f!THvcm4`F~WIGiYl9<{cB0VS}D~4oMX^maw=|YS#_8`iM0{y4#3_$2Q=#_q{qj2bC}iNk!QRL zh4z5;q>#p>p~4K8$7eMv2(SFB$_5xht5UkSV$77UflX;ay%ROHKS`SSAv92#STHk6 z+eSqn7kTaGT=TGMmF?gEA>;t;KDDfY!ZkD5m-)drn!~kMRP=u>Ifx%^3e*|`n=Ui) zT@(YtZ~`l23~yu)p4kRfG&;{dEu*CK1DQAkac2yN6^83Zd~+jTwk);f|r=9S?!p)wj^4aR5Q+ ze`wwn`ChprJ#MAH!qQpGLg%P8dZ2I3MX#yu!}o0ziHj!o3(IjW&bIw2!wCtfK>yq6 zgZoJ5#KmM*09=K>3a<{?GaAaJWve6I=D%!kX&&>p$e)tSH@y8>Ov_02+7LWaaL-3J zYUT!p-(xQ&r2(`bAY^K-6Z=e_$#W@(!Khz(5enb{eC8+E}~78>33yKwQ)Y^{Bwzk4234@3dZO3Glb! z1U<=b`fpu*kHwc1EN7no1fT_329vF7L;=sk$Ni(ZP=a^H%ZFKaYO{)6Lfb6Bm2N!V zjJkw&;q_y4rfK4s1Ct%lz!7_XpWZKPKt`3*KsN)32_AJ)CtTWbZ46X)v0aO*(fRGH+GR z*|%Rz`^~r|xAWi1ggLiA8K@@gm4pIUrF$j)C|s)$yN^kw>hESKkL`{p@+RF&PTP)J zelAfND}!$9WGhc$9 z?1A4I zf@RuF5E71N)H0$<_zZOSBz%&j1cjgu0vrJ=BYOIq0!1aD%UG{04jqe;v7gNmPS z2n1gED?g_0jK*i=Tf=Zrk208KShW8zA=UD>K-QAyy7{a zF{6LXjB)YChQYtJ`7DFWBK#&O?}yW@OMr(2^yKe8`9_&Qk7J;U>G0&cd}M~CkTp0| znmtdv4X#=I@yWC%05lbP(pv+AQS$jPfxCpOH}Bt2Bz*am_u7>LRjPY@BGxIK+~C<=%!~PBpWqb$YONfNvA6`Vzl_jU zeb-&GpG|Wkch+zCM1VJX9Or74^l19AZAbHI2j;c}6G@BH>Utwg6Zbz+;8|$NRYbS5 z=DbiSy(nn^p^o|FKcoJ5Gz3UOYnp3y?o1YtH0#IkU}eoJrJ!;7@?rKJ!cqr4pTFFKj*&uVvnnSIDID*f7ZDUq!>H%Gp)CF zKc!rGZjbCb$0;|i!Mr6Z-}={UIFr>^@1}!ga>rp7oRcCl?OGM|3yHE5pa!>t(CGhS z?90QUY{R~v6h%qKzNHxZo-HvvgfSTVmOZjYvSg2v%Gmck`@V0FO@&57s*>ulh=DM%zJb&9cqoP7t(zS-l@MIQq5&}MgJyNQCy5w=w+rxOzsmTDC1p^5bJ>J87C&Q({MvpYL z2-o^}QoHaBk%GjdLzVEF2U_YY@gWXjbJ)PQuS_jaT3zzQ!^C&M1rWLmf_4+X?Mnqb zIRK#62{<#9xc7JE5$SE~6a8LbF~ZWBP)HSaR;>apWV_-keO2tGmn$T1s#yz1$;bAv zcT#Mhg4COZr|xj3Qu+{s3Levwt|cmb8G_U*%;){t!&CPSkXVqr3kWR4iyz>AE3Q!J zKLKD92kNd-^qHAWRTf`ueE$wUS2sTAd^{!V2fQ+j2aI7mjQQ?>;(qpq+rHIpz;V_B zB-DYliBX~P@>MS)%c-W$KnzrVVy(3I1qn3FhWBfm9Js)lQ7+R&cm7=>kwX>EWaN-1I zp(H0-`9o9Carh3n>2;J~NLVsg@bH}$hcwxCh@wTpN{eE!RSXWGih)Pnjs79(_{&{- z7Y8z9O9$n(R){dvIM$uuk*k?tQ9M4XnlB2IQc3xK(M9zdl( zYod9qeipaqE$R11{~W`XLXbX0RlS6oCUd2)EaO{?JFo}CUiSOAm`!oNdkra^A|ri= zoK};Xy<+6in%bPtJg@5#$OQ@Haq00ImJH zZcfFopU`fg{DK5*y=bQ>9Bm*034j31~xRGG!@D1Zcq+ z)_IIf#D(Tt>Xf7~PI)Obd?f5PN49SScVZHXK`VInQr4}8r21RRXkSKPD^?fa4E~fB z7ZbL@`J#SHlSMfbtom@cC&i7|F$?6hz9N9j5M|R{P?8f=P)DO84(p0b0Q-jl*E~}F zioRDR1+CM-bS!j<%)$+xzCekyNHMTuv-kVE;9 z$1I1Q-sbIVlEv64tV0otzVW2y8rZNvD@n}vZFu*ZH!eIIJjJF0#fWlYf5(&3l7Dky z<#Yb$j-?rst7EUdJ}+sYL@^Qjz2>-$A*N>{TWEz*j;mA-DFx={ zAb1>%?8R7$Cl2kj7i18o$>VYp1f~-eZh<0E**Cd7FEb^!;pyYGDGCgID~0!s_Vf5a z%x}p_Wk$=2nZ6>;!K1L1n_y9cX3Udf@gTc--SMfr<75ilJI}!rCz^_QxL}FKc#!to zMTAkOZ3v_%Zr|>jL@~1VFBI9ga0od`9ek8eh<(K299qeI;!V<_RoM6XI|aUu3kB0+ za$k;aIix{;W5c_kveVOEEIo+#hr(*PpTa&VY1`gd{m1TR(qjgYb_DjtPj?j^e)M1^ zpTz#AqDaT!)D}jx#5C0(CVp_-rKSL=fc%zp4KFnCtM! z)7tu1_=XOF$yS+tQSdS0i@viD$xD18xL_M*Q*8h1H^1l^9WeFy{0mIYPf9f8RSn|9 z_ZE_WL%Cfx>I*-jKm4Fu9jo)>x&@`kK(=I4iM82Ud0g=-&$M)uKkl=00w-@~;M9Ll13()8vkq4=ri&C^L(+CCR;< zMS(i!zu+6q&X@th!)ND21&3t!(m z_~RX!ZO5h%)_G-i=jaaz0%6F)=5*R87fG_7ZTgzG?_Sbe7>?G~#W4tjUL`QUC<~j% zmTa1jZ2RV!AOv-*zJ|)lV&dMP`JRK!Gak+zyFxmjS7$F$bU%tn8@&dJ3{uA;>iR{d zL;X(MFOP4isew_VV)kkGa*EURJQF4qpWv(in@5$?a_YB@tYUuSSwxPVQH$$I=NzW@ z`|IyPVa_9yF`nF^-QGXNm6x>`@z=2J=+H*()r5TMGx1SXK18Jsgk!ZI%8$h8KaJ{_ zfaISx$OSubrFvQBlZ~JM9N7Tyl!G{@nsvubfQkJ6^+1y4_OTl#Li5=xuJIX%d zxIudx@i{=m$$%|3u(tTFD2dn;^A!q6;=;TGZY_f4uJpf@4b#pfrNW2S`d@zF=vN1l zs>~2OgmzS_O=BPj`w3ki44SByW=H&*Nlb!kKK?FHSY>dk;8do$)8mL`;Iw@}{ROZy zWyg8eZax=pAhreSuC|oGx-*!7%Yr(dKU)A~psYHZ5$EgkYXG@6@rgf-(g+$Eggz$-YZ8c122g^+!O#pC?bm^B1#bRa09lrNJ=0*n>3Km5$IR*Ipc&3 z#>&@FyzIC27=jX-b}#op<&QJGk}l%zVh%22O6nD!n`A}J-Ys6vn;AzNLbIa46(Adrxj>Q=Kz#6}A#|D}S z0~nZC#DM?P*13FZNi}Y~>h{pCQ9O1=3`*pjZ*9lUudAt7H&kOD;~>HQS!KT)li_LvjQ)Hv;g)(k{To9Z>c4bM7qXyaS%jh#1zq{c#MlQ372#8B{3wiaH1L8pl$TlhfrHNF6)J$giM5&Ehk zKDzu{BH*wMEJA(1#PT_==LDjF$dRq3nite-hL_pT*y0n(4XZZBq+Z1_1>)r_iBXARfLuC%?}!v^RAn}C@J<(-@rm4x-<0V z4U+EP@9{DtHF*7#XrQ*?zk5awIkS{Yl(M?KM4wDZd`j=&1hL-U7#h@=2qMP4N+ktC z8}wDq926IL9*eROnphn?#Oo}cz_n5$#ry=)>LzmgL1=xkIYo=D@b$PXy+)XnCM3?1v3! zt2+aL=LMW{@;^yeFK18_nv|YAz%OW@Xr=z!k+;Pbn*TNK7l8s|)=?~_$+l|f()b7m z9?T8qBl--rA z!^b)R{Gu&oVl?OSee2!75GM!mgm#tbo(KnmK&qCh#f29mWr z)&#S6Ky&{47I1i`1ke(|H!>_ghk^Hyq=kpWDJk}JK7a3K#sW3c6|ftD?1HfE_QFdJ zr34T@8_>KTWnIF72r;E-WOUSOk9gSj^^X$k7gsRMG<9ks>Lu|9)`0i>QS5>DtKx@q z2qaSofhZivNQ4rzI1&Bj$P}o$a)-0`N!?!^{D=X9MzOP4OJ>?q=$q41RgrRw&VLi9?1#mNbH{H5bs~t z9Onxo*+>b8f;T&!1;I9l*#VhYw zQ99%A_WLe9jpH+Jwph6AK>X#4hlovbp1XW4A&cfw{d)*;SAy|*ykK;eBb2;a4jHEa z+hGipF09(TzES{aNTO?-{Uh?TVL!I19!t%LR;|mYST9w#%xF$?$2JgK6R}CtgHD$@ zbS%as>{PNF(x3@|%It8IRd<`3Y^wzD{z;VI5t1J$-yWTO;DtGT57`l~>-C*fjDG|{ zvQDdp%bR}C1V*k(yB7MbvBc0?Oyp&@X-i6s%5MK*$;y|Gs<9>j9NebCs9gPWxOYl@ zVwFxYwE#VNlKxy2Flp&p7BsJf^>CBDTON>XQF+<|Sse73)NVFj-8UOA)DZF<+3S1h z7CxgOEi`ZUiA5;n<!_)^+i3)O!tICuA-%0?(#-+l_>_2~&HkQuL z7FW!+X8ljR&!3)RRzLV1KCN%Ov1U?qMz)J9FVg$`57Kf?X!-clr*g80a+%YiMgzIB zR^;<_|I>~6bThxBKZo^;C*dwcmrgm(mA#vpWKN6EKf>Oj#0$23l6>|zQkY`(Vc0T* zvyDAxiCZK_EFe#wL%#U;p?B9r|HJ`Dhbi@wFWrGD@-BYu&f2#ps6@crf>x{d(Q|iF z0t{{mpv#=r*FFZO{~kk8IwY5M2h7D9!jDAg2{{??Fk&qPiU+WS~IFaeYWYnp@ABVe7L z`9!mk3@_*+Xu9}Zg??cJ=RCf!Xbeg$?o&FkrPp`6S+omhzE`GPFGuQRX9%Qyz7H&e zM!vu8lDM@3(zMQQPPrb`fK8VAL$zdYc81&#Dw=mC9Kc_^Pi#D5?NZH#g)MF`b#(&r z5$v5zR$u3zhZw$0AuTi)H$nqOV`gBJGlFf_yY^VZukyx!%&@Q;u3J1|;!P@sxO^6% z$1n@=RQu$1Eq~nyz#%8KHVsdMgGtc+JK^E}A>dr2i}i#hBlGifdlYIZpIhMJBjVAu zth}bqjRnw$c{~I3a+WAn=CxD*?MwdHMpN+Mk1%eGHNG34_ef{QDY zUKk{@NQGRSG62I#06!W7w@KCArEY{B*;<(B(Qgzhz@sEx!8jrq9t)eA*3n*LI zKt1D%Pmz&di*JLJ@$Afg_bsFcXzb$}{-4I4fP<>_i^)EYIelBX2QDAUhqyRt1p>0( zQLGlB{EjV1vb0t2&A!+eNKgEsR4Y@0B)n=eC(B>`T2sDc`V87x7!87{YT@?RtJ1|DD+8Dw&>zs z&593BuhLY=|D!M%60j7PKlE{q*|xdj_4ZWqCJ#!NBI!@V5uYaHt#n7eF0;r!Kdbq4 zwODpdd@MsBrl8Gi@tsu)vTlJk=P45!9hzFQbjJ|@C1OgxhF92cYaI<6UyvLG>&@g% z%wbJrr~>6DC8y>I2Lb$|7y;!wPWXrKSID-aKd9ns$eCx~&}f}v4^bDebVbtF;sr{6 z4|O7^p-qOaw@U~JpT4xKfONCu6SY2vw;foh&JHCPd90Q!F@<;qVBM3!JoE_&uZLX>9m#REnPZ0gQmIy zQ4<$^xy@k9)hD|!(5&;vd1l9=kDPb!1|q~j0tv2Tl0mm2gV)y#HE=Y?pTbEgj~-rl6oD^G;M?oYlCf!X&=ht@G4)#?D;Vau*8MU1}E z(&n-K`UB}vigz>*=H}b9JCZT<5Qhizpsd>Qc3J9i8W3s6dZa2~BpZfirZyT{y*xzT z)U>aeXJMH-Z3EKcGNu4v)6P1=>5LRgDYDhGw>Vw_9Qil{+a{-23^`5vaGib3;w@F* zQqS1BZ29|PW2x{m$CIUxfo2o(7)j-!I--c;pW?1H9GGO|m$;~N7HC_001y(PO`^A* zS09&ch(Bx4hskTH9~#y6uH1wcAeVD!;crWoex^{K_+oYZ*yVRjmJEv;`@G8Nc)quF z77IRihbQyj4;2*HYB9DhyMjfhc<;DIas2*lQGF+g6;zQlW{phdi`wgidUI1qis37^ zz=Q$m(jh{lFF6@YzjX0CTE6I4qO=<+e*#s0NYNzXBNoI;!x)qiq|9C%w=~!KIByZbTw4Xv3q@zcK3kTV1vxuR}YlpSw{R8#6jQr;lCBXh9 zWZ(|9t^uNiLzLVD+}lHVh<%4O(}*o!vCZ$#4gn0`h7->QX5?iQRxq8!z|xHRfw>}} z(!2I4W$mf2R(rW$H8x_<*cY*AXi{?`Gz{+ix-Yy!@IZI9$EUwncg7>q!D!jv0L5I) z|2!`9rtSqgN9K7$)7i=4lv(=O+ufqIR%V$I-tqd#!_AF-|7QnV{x@;Y+>_@%@8?@- z{yP7&F~69A14paOc(*^s?T9@y3aNYs>kz*%JEqSu<`++c#yd$!oW4 zX?#O#u5&YcE^fP}nP-1v>6!O#i^=TK_(t=_dC-R~fz9{N&ug*cyXpI8>N2Cun|{aM zN1x93xBUIC&>ZuB89(b!p*QhaiBZ`y^jXvHaq4aKD4$#T?sA@gJihbpxy_vSnoHxv z_?CU>7XK!hM?!h|`P!f2^Yn9pVyAPNZ~h-z)U&;tdEA3fHX>)~i_fh^pJg{xX4zO- zkzMpE20|vWT%{718um52GvfEZ#@PW8;>-stX7t(4wVlth;?RdSR5m>c@0fu(I^)P@ zuS<~a2$s+I%GsNn*Y&%08D9LWdDCciKla7;t1i66D4UU@>mQ}+GvC_BAa^5{b}2l5 z|B>+s`{Zk==BHgsM1L9iXL14!MwR((>A)2wsL?(V!bXq6A*Sc>yFr+CEbpVnI3UA) zV4z@~ll1fzs!O~$eR856%td-zj17es+o_v}oUjH#ujdJ>?y*G$V~dcN;7*-01b7)+ zUlYr!H~lC5!5h|rQ}x`=tXzOTzz#cV2L$3V=qMf4Q3{fKez*moEcMp`8Y8OeZr#Hx zRgN9{%2;eT5HvHO`V9~f=4HNuVbD|XS|(#gara4H(E4uwPz-o()r|3`7kj>-m#e1g ztC-2OaV1k>aZh!^t=@qW8aZ$iJV0f+AG-f5Ol3pnA-E4D|9}jX8GdhS)z{r|+82TJ zF~To!FqO;u9*gleM*I+fAIK|wdt{+$Q&At^0YzNvmqI2|;>=t>>f(BAzwxRm8jkogaB z7l$tjtEm))3wHpEC7<5e56BCFJW5fLF51M9-yG1rtG-ZN7-Y9S9FrsH0au6mqBN|y zc1TvWCq@4?RkuoHHSkJMuSpv*h!wljDFwQgt*Yb0Dfd?;;p>inmJyp_bbX@_w~_%aAvt6z2h1^Z#VqVDtu3 zoXqo^+NL`aNWfNcn=YS2po7|kfGhp#54b!05n7TWRlwJf2!fd^Su>M^?taT@v~(A6 z{v=Tn7IanYYp>_6~JnOEs%n@@hH#LIZa zVXR&DB$jPmtsVH~%z&Z1TI5AwxkP4xhgQO{H?6D?mEY9uiaVOWQfG`izBBkWzS zdDh<`?~eQ@>F~%|WIYohK;}Y26Y8Q2LdRImZGH8qpd(j^m5I+tlrE_TwN9p7N3#Qf zl46v1*^1#q`a}@2|FVYWK~$by7Sdxo<=?;TGs`Ib_fg+V%`H{s^nqFR^b54_{hhlY2 zw>5Xg4*T?gjRTAoN#{$>Zrhi|d7ci}Nr1!^P4g;{_Gud)99o?fRh0I4oxnm`UoaJ& z%%IRE-fiBr?z6DbVEP*)-#_)OXc6}YAjKvflLGg+J^00c?EB3tH`bNO`mkum_`0Np z#e#@o5LQtZPEvlGq44!2#}ifVNGLnNgehz{LfkgSYyR^MsNzwVAR(TZg9Sng8;XsB zH_~$%=clh_0b+>BBDv}wf8hpDpW)nRn|}=$D0G~%Oa+OW%gU*^~A1rf-q%$X(Q?yLcat zLRU@ahrN`=V{QY-)?Z1(OA}7xh03z~I524lvNpxpk02ZL0x}j(EhpGnT)CTh>CAyP z@#$4sHg{=xG~p5A%XijX5IAri2BToQV{O%Zm$a?%2ZX(_@!z8a4d5M**QIa4IQK1j zwpmdf?LAI|dN!;&h!GX}NI}&46}}XW*rJ~{gyrU+upGzH*l>+fcfH*!PuQP9XcIs=9xMhYn zhsbx3){@N~L@Xm5NnfYrpM&`X3gGrsP>p2seSI}u^IypBuQJ^|;gQA8len==#SUz( z-~q@!`ul56*VJEAYiLerp=I0~Az!%*(9QCTMPX$0Bcqt}tsw9X03%wDH<5lGS_|*I zc3~NVBY0TW^8VOsERc~$QP{EH?oGy8duBtp!nT8g)U)21EQ=LAQT5EHpFoTykLPa| zCccysn=2mQ`@z3kJ8giyq9{*Oh@Wut7T}&kRV5mMOjSlO=r+r6vco6cM*M_rckDF;a-5l<2%lLiRkB+!K=K>Q2LRo+${-E!?stMScQ zzeG>{8nc^ozJEY2;3ls1x!3W$I067kpbp!Zd5 z8we9XlJQ*lXNHgS)8RW25oXLc&HVpllT98tjr}j4hx8Z_A;{J|8=ihPM)6tvl`~@B zIESIBT;TYlZi+!Pqn|-`Qp9IIx!Gw#(0hFxH9j{?HN|~bt(R>Z4DnN$OGn4&{H)jh zJiC+r6}Y26i3=R@#q4;qD+Ovm?Tc?P>MD#-I8VSdS@GfH4N!a#4`#`?**9g0C_kDy z0RK*z9@cEz?ll~_fyiu+tgiSR2c#r`A0m9Uqtp*W4{{|J*BavG`NULwKSQ*UXt7c7sXtnN2fYf5G-4l zg)>vt)AeOSLk`tfZI31H5if4PZk-HFjmGFC8f4 zz@{OEDbKsTc{gXr99nJW`r{DJ@Gb0q$y1s%cp6_rI=*lSEDPIhCVH+cgvW9Iz5vsUN&f&qJ&>t|$ zG`oHmuUZW8O^R_UAf!{GN#-i{A~LZ&&L{%{;)(Pb&77G9T*d>@C`>m(JG1 zSxjt+5Mdf^Rp=R@bF^H9UhZtG#3n|2&mnCinC_c%oD6s^VKOZ(Al2=%#(<9@2{esS zWr5XsZ3OG7T=*`UNueS9s`rT%x5Ga6V<zVln3evqSjv-w6KLEOHZN{RH{OW!b z`WLTnUd3}osz*6JgOZ=(v&@8ss-I<%!h{u4oI-9AKL7seN_)vRtDsU}tUw;Op|ycH z)Fi5ZytSj%l0-k|OK4)rv4X$f1*ih@M0GMn&V-c`f6QDok;NpCR9+^w|CKyY>C+2t zhH^T%DL0&AAA9G-I0i*5Fhc_4QRx5dO>Ms!08Mqtz@i9AtVTzDzxN^UT%df)M*xl{ z&eOFl_Dr3LrHlAX45rMmA#~V_l=poU6i<*@*ziE$HtPL=t$hY^l{@7@m2QjH(5baz zg&6AuM+FQMW+5z!OFbV3(~-TA+OWsxc-|aAzL4g5i(tbuCv@d3;6i zTcknschxTx{ggOn_$ydiJPLS(n}~y8^sA=EXG~D07$|#5@_yK%+#bg0(E_88Uo;SP zp@&_O`jhm2_}?ND7$c*FFV(sLNocFBI_!RQa*;G_{Lma6Lo%-b25(DgphJ1h+x_xY zh`Mo58s_|ojLiudAu)D;X3`UbC9Y@KVkn^whd=6~z0=B}Nec!9W^rFtY@}dm+Z@l}6B;j|x8uf0lAJ1x2{Ych+%b`nfv zrL*vR%qFLvE{)ivE6q4w($9fvyMz!Xv2gJfxt~Y}ZI!5>ZGPH|KgHg6LxXgG3k;p@rwe_l*i=QM`yA7Oda+S{Pn793DXG)m`<~_99@Tj z^8=)}tHueb;SvdGCS}R+JPb#V&cs8iu$Gb}pAc}w@JWMNBwso%DWt(A`DKD2x(7T* zTOuTFpr~8G5u{&B9nS?H~m?arrx2utJb_QCWG{ za0A{DJEhEsDb8Dc!0>fK;s^dFzU|x(M+i6<8C&Dc+&iqZ^luX}9E^rbby|<`w?MdC zO@QqYjHG+u9h9f8Jbi^!76}i{DHlwSg>w3or-KfyaMaFR$eCCKpwy^Af z+w6h6v1JZ^fVWwQFQj0+Ye)7!cv5`60VNMiM41aUi)j%uIQ<}kgj3AKH>+z@|1hae zi$b>wa9+!aTo;N^ZJLYVX@cw#faD4&BgK?CQl5}Az~03eL~DeWdMno|FW~@FtG0EJ zpq*t-Mj_&uAHqN=3+*-P!$bBOyVs~|B|U)o2$(}KdLySnz;RfH_o~Lj@5PkT6S{uO z{<~X7$%ABw_Ay4U`}jhgHd^U{ID#OrpF-(B+m|4f=H-0^MKL>D!$dc+-mHy%MO6?v z=R(_a-&^?2YJ%KebEJBbvyyL8U-|I+eU1swbUS5VJrSa*CnWihuZ7y72{*c!aD$lj zVW;`G;`c;sQt!D9Jktw1achOKTxsR8bfDo403i%{bUU)R6MZLP{~G}DWCcBM4_&cs zhxz>6yey`S#tm4|FP6U359^Q)SieJv|CK}GKtkUZWu?6<$vIC)*H(3`if+(Uug~CN zkdYD`YR0Nn+>zD}DMU`+yAlyq#WhZ!cxWjP9Act+xY(**{x|KQ!O(!Nd0VJE`o~;c zp%t*MZPg51B9G>N(ya}_JP;nafe{Zq0^)XF8@fFowG3jKx*!G!QiF;+ErX%Y6(s0B zse3hAEX3S_E=f++)}Z(-f-~VqE7viRJA?|1E;8=<67n#h@i?gaqYP0*jMts1GpHK_ zd9rdwH*Z-z0){t}@VC$-pp%F{b}C+WAETF8h8jM;dOvFwsPnh6rSkbg7T<=rTk8dMgrndbeSOKwG(}O+vCj2p9s_; z*{+z+_9jB)PQ5@+6IS;qHLcwIAR{FqQE&$s5SW~6f=&8`4JMzhfM3&`lf!`4tl+cs zkJZepFPmA@61SfkRtSQZ_8fMVT{!{q(ZsD*G`yh#*=R-~A*DaC-3NU5Q#itN?ldSF zS@A?JNtPIVzXB~9G1Vj5cT6U&-T&U5hqk;6Yb@9DCf`57-_Q&@g~&qh&6T1V&Iuu> zilen$$djIbPf8S{n=l!56BI-pToW{A1)Ygpaq3q}|~ z?-WvvoHh&L(0UpNo|QHZTMyZ?ZG&SYc%BpSrN`e^^|i)-pb*zkZ?$N{qrEfGc699;689-k|$de&$ z;R%*>V+CkO0rT1Oeo83a+X0QV>Y*$P^l@9uIg5^GV!1P*MmHR8tqla}B5~pW?n8fV{D+u3u5=`@u8cT#5#C0Esx|e?S?Ia#!zSsBuIyh`#Rz<>`LuHZ3-~S^iJ?*;1S-1Sw&mSr1ftU zvHDdKy=t#)_GgMAwS6JIFaNiG_glqd$w;T3RK zIOVMt-t%C4qGr)9|Mre)MRK#2PkN)B>sRx`&r9d3 zJdWPU{W2l~tx$vOLsw#9!J!K=A7r!48+IzU z-+e+%Irwxs*p4qc#&S+%&lj*C|6pls^0mksiI`=78Blmx)!RNf!19xrF_Rl0_7d{}v0q@G9o?EZCNF%u(rJf^LRzk8ie0nf zvSE;HdV5Tc*CsF63uCYkFabjb2oq|4N&c5&LPO(MX5Y(_42FPpD_%hXJ}uPrM_TvNcEdEW!Dmv*R{WShYq%UZz4s_udZUZH|&73YO%#s9id zoRO7whJNuE8~uT8;WRg)F8jOBU0glM)juR+lk;okH;PIXxvx^)VecV9uO~=Ph*urkWpcwb*871O6P-wPIoq+j z*g7t|yl4g<$f=yUiL6v@^L}!Cm_|~ZE|AVomf+!$d-*Qb_3HH2Nqzg+-(RJEVQkwrub+5l3|mDXw5U zq=PWAk#=#O0BH%e{ERb{neWf+bQbe0zP*8b`q@EG-L#p)YI|?@W?|nW`<`>)$13Mt z=}*eA;WnJNz9FUA{wnCHh<2djQjNXzE54lz9T{L3Vl(Z%Oz|$cJfk}99K?;(rIWz~ zma=!em#@;4Id5TL{-H`GIsl{;i&$!)x*-R4R%b2gl#KkdVTCe#Fe}*)$pH5Qy0^VU za_0Kg9R0pv+q<4+=0N{-LvW7fp$HnWmI~bYelR2`6NlunX;1BTImNGC3BogG9{tBuOo9-9_=X1#m*yoK3|irMe?e+{r~@t9@m5>dU^PI$AoJMQ zv;gUFvX7qU+VM#z;~PrAc69wLlqHMe+Pm=IE2?+RKIZ+_`r? z2wznKLkHl1jwq!9Nmi57{CG{IDg53DW!U#cF#!TF41i4!?w($lPx|Qy{j&38Aae(5 zLBT=`K6iy*gEDR;@6`4dN(3*m)5=4q@A{Sg{y|q*bqv)D zkS)*$ZN|}Q_ER%sSD>jlAUo(|pKDCG&9c)95!-b5Bak*!d0uOOX+3{?neqbEW2`IL zg9sdwyt8@yXS9|{-w4Vc5)W<|H=Mr-?cZQ#?A>JFManp%H+|2Ez(I0L8dPi4p<^R= zb?POo{)Iy3=;&-8;2uS+e;}~-H5E+n4`M((^nSA9vQ#F{!FI+9f@h(un?$v!M)UO8 zZOgjU{-Er%h5{RBbLA9ETHp!X$;(a?t=J#L3kmToM2hG3ik$WE#Kl>Hh}9V zr%|tWZ+yQ5-3EP1N_jt%t}O8wZA%Kxx4FgCMQMnj={z1DTmxkf5S+7)GMCw<%x%Ki zRec2k%{WA#Z{jIMc5kI#@VACMXN4ofRmM^<`1-KXAVZ31@n5pg~dCVCJ z5llH9p;+t0oB6BP} zZ-w(oiV=|d%LL;XHna0LmAe12c-UseV=M@2;rQ=O^J#+t81FnTw?}2$5dJF#2#S;s zycX7RZvV0xxkv~NeQ=wHu1YR^fKw1M+m{p?N>Bxlv}8-z1f)gF(mo)G*r{u z?-Tu5PHKa~AD1c%h2orRmGC(9wz{&fpewMu^3lCLY*AuvYcJ&mvh-Kqp)S75^ z6P|PkRtJeJrabDlV{mkOTi4}Lu#ZxvkM~j-j?|pwT^>y>WJsivc9lsT@AVL24n44^ zycV_by~%A4^arEP+emFo{lJX!>=12~NO zH^qLespBPIVjI5wOn9C_g?Qh3@+b`-;izbPKRa!B4y$*D7l`9adJ}W5U;i~%A%Q_j znLL}fCYw6&t_eEg9{FBnvaL{TgnbnkTfJ8x;`>*FHg8+G>I7N zyev;1TxS|`4wk(|6|~quTBsG*&ukS3$sJ&A9tkL2XX0Z>*lX(ai-`pYb4k28Un4Wa zuNxG?Ib(_`<^Y86kZm*l9j=ESu~af#R3XxYG$8k*OEAGV+iG^Opslz9%!7{IBbKYm z-}z=T0+Fu*n%Dh!-wuyp<;7z4ft5P~3Q&9$%z|7H%e{lwMzf*_wPkPfi+u%VWMZ7! zRlRB-`+m;gc!Ql|B#?d6Q?6T+)nxMis9$tDwfw{hX2LsFnoIa(dV02kKr< z;N-kEWHo6VA_$zhRV&bJg49wbl;=`Ok9YFd7@P7{@Jh0L1_L(>DsQogk~DM~g8Y6k z76jG)tom(QbzOzeGY-hG<`eyI3W9fmf{zK^_WPxY(9Q=qXt!S8yPBFt#XnGaT7iFM z1S(^IKnam8(n?=<@)MZYKU_MVyvT>#@mBO`OvXR7a!7df>qSQ-*8`j|ErYn@)4$mO zI|vtj43pf@NXr>}w8pcPte3h2Rqt}~eT~FVTV3^NPNOq8zT{{kM<3|M&Ihgg0f8=1C5Bmu z&^f<5GI?c)e+wr{-BOP=+~hK#0=B1!+S(8QU3#gDlN}~VXQ7XM>cc-l!(1SB<4!-? z8^&?gi?=>I!=skx3%xMM%nqg?Sq_8~Bcn?Sy@z8Rcd76t!ZlQu6`lPh)%ERRkYL9e z@N9<(Jr)?yt9GjkUqL7lY>+4L7cK3A#L`(EHUk=&LHdQINOmGG8GPnzT@)o+#e3M$ zoq_}pr#*r1)2iSKay7&=f!YiJ>*BCNsWA@GCs+md${{S2zu0vco>we6PPj>j&pUAd z&Z$ZDE7knEktX5@C^lh3DF?P%k{|8k3dL3cXhOIpyE7%0wP}4|t`Vp%D5$n6c%5T$ z{>p8?|0s=Z))tWqR__mjALe7V@K4*xy9n{Kfy&iPC|`xRb{s5;d;uzkaAzt0XvVOm;U4hpcZBNisTVO zN~Z*I#>9ma&2a(d$IYw;=K8&uSS>7ICUEz+3;rl|m1pAd{+XGw!g`F~QfE00DE9ge zJj8a9KtMFkEYGu}2qHEn%vpUeP0sV+7p^D?$hsU?3@ep^VxE*sG?B$urg&6ioyunL zq8%H`0E{U*S$ruBj8|SExCb2nxt|Px(Q-o@5-KE_#Yjp z72;9`h?uYW*Gn~>3htEIwo0`e?d_a(%%uAt|N7mLE)Dd6YgQ)|TYi65Io<@@r<3cL zwKg?R&-tI6tj!!pm~AnawF;e1kTLUn&{#C9h@L(?JJJx1-R2W~zxnRd^^?WL@wcDG z)6agWsE8fSWlR5VJ^Q_l6KM5)elqRshm_d8|3CEiSXgNB-1!49&92@l1J7t?k2u4r zDg;X<=?O@**$-u7G{YsT*0<@s1TA&hS3rn(j@W$mw+Fm|NCW(cPvu;(pi=5|s!dc7 zs10V@t$?r|j(AM#yXV_20fu%yC+AEIAl5_o-3(s3HxG(lx)K;+_719Fcw!=X4TXuA zOi}&#hVyd56VXL&8&2>wdh?K1Fgttq7Ar3bR06d3+44L2j}|3alap;uz@zIH_Gr&E z>sGy@=vDBEE#7~B?a;-DuGo= zo|IS*Ck6-^MvY$nM%6#Q>mYI$u--d>qvCGo_vSv4b4k4o^anP8+5&Dp zlzOS>WHT0sOOyuQz?)qL3=rdjA|v6TN^39I>X?kWR+G0vpI7-o5Pw^-uG*dkY3mF> zn(Ubb9APlH0B(P=!kZ|d?(Fd|e24|`NNF;>$RjNsa7}w+(QcUpJV*Q~1-2TG%}wxF zKCq_<>8gwTAdrj)*)G7n&Fb7wsW8{p;1fbj;U5jO7-Z~gJv@P3zncL?WO^Gs5Rvz@ z{*g=gjQtxZQWe;mTJ&qkxSU*!K>0$A#IWsvs9&Qe%_=7zk%Fv%KH#A1TntW=t!)8P z-nj+5YYK!@Ost^Y!C~32rMZBT6VV(}Ec{+)T?lUdkZh13;82o9^sP?~ou2sAj1fe@ z81{4>ZEv*nUV7Ky|>A=H@e`|GaXY1Fz-Qq{z?Wl*Na`~*4OJ@&uic7Z~7R29Zb zRc$A3fbwdL@=fu;Be6nSm2?cF#)95PM|ZB`%UC5gpP2Ur=RQWH0NuEy24jsgMrvCk zzb@axA2vWQ^jIN`feRlz2MQ12=q6OqgO_r`u%o~DpAajTt@rDYxu*6DyM?AuKl1al z1V_wMVnX-2Z7fJKeE>LvI}dOMS~S0w*`OKKpk3_EyA}U4DBDgtR}iu?pD1zXO=*ad zYzFrO!5tqEEdT6tw&$l={oGFiIn^j9$$tvzxkirmuIP@Ctp*N20{{d*@gx%_BRpVu z+krbgB1}+s1l1=2#&3zc9jznpJQGtuuziRlwZglnWTFcziSMlFCdWR!|98}8k34YGNz#aG|%sR_#cN%v!oSMs|p&=!z@Y3{!aumIM5HBjjRv_NOn3E-kp z6aARv?8H2$Dj?8uX;8X-vftkT}hg{4%`}`^MSg#lQSiaGgVwKC8J!LN#z` z-_~LSGmothyT&Y2Qqaetd=O=kdQ+HjvX~qy&AWpsLHx^s%0uYILE)>HL(e=4uhE)j zWZ6f$h3NpLSJx_+gj0Ou%{0h}xgg&ps-{jmLc)Ccy7CDZF9>)qy+ve3G9r``cq@SIexkR6yxlDX5jwxSE2&#UAFEzN1QG9afl zCS?wu9guOa>5MG$h5sju{+C9~{*nXe!f&wMi&fKGP>>Tf#SsjRioLx8N$b8V6cuXr zi$|IvLDIq8zfn|n2zek{ok?x~d!ABZzF-TM876?HS3v`+9C=_S{*pkIYVwGKQ&sg) zWgQNt2x=E4YkU=TM|VWdCyV{NvIbq9!KI6>(9X!a#U z_`qcUjo_DP6cFIeV!&=@JD@d2(d(w(w*=G?fOcnymUE4- zx~Xmqqd|kfb_*5os)LDa3T&;p&hfPPC}#d6Iqi5~9g5F7?u!hNl-vPHf_@N;LKjBu zu2WIqWfw@2um`;laD*6-6b&LkUwMkbUw2*dLLWb#4!cm zNLW(ITcvZosWlCW|I9TiQ~u0b+(VshJsn0dUs|FhOL5KXy9HRSgEhX5_*x`lwqkJ~JRIoUg61Od=eu?{3c{FqFMzq+*y zDxgwsgHGwe=(K+Y8%kdg&-t<%beh_#$tu}j;(fMDLV=G82QQKTakbu}Jgt0`K6YEt zqK*6aOTGQ+(C-z*mc0>5Dp$oSX_B=y_O8j>Im~tB1TwP(D6B8(?&aMgs!$0T5N8_! z&Wk}9uZ6%UYZ}1H>Z|If;UMAZx=M-Cx=>LX|3bW&I$jWKpCfAkqy|BCwQn2?$DeNJxluhtez!pLEB9q<|nG z-JJpp(n@!Oh%`tkao<_L-@W(0d;es1XLgu*-xJSy&T|Z{WhEx~qH^BQZ-H1l7{Iwn z*PhzPSo^mjJecWTT?IL%y75WWxk~!)|3*q6ElV;N%A*au!@wMx55^eY*@XCngzHM7 zl9eC976fAGJH}l6s}k|4E^UWKf7`etbBzNs-55CE3=?)Db(FA^D#(9UJP#YzSP`Z0 z^WK8OzyOXNn$nbi<fKN=3-iS@M}5k zgBw-mx3c_fRw$S+`%m zw^@byUXMT`2nRb+Kdn!u#-1+)qF+A*LSLhAI`q!pYFDKpGJ4_JDvBNvDivgHA3BJkj{(qy<6vNa3&cS_76n#&-%e}@LkvYiU zjyP4^I`~upsVn4fwux2MR-{$Zbn-PhK6|Bd;Ys*l&5nsnWy?_juv5Q&=#O-rBFNjA&DDO!(wp+5IX-6^ zcgaIrvW~Cj*?8A0QDFVRJY4p&*}h$7qU3ZgWmmllmbxxMdp`ECW}V&N2~xIRra4?c zB21t9td$N;q#rV@cTZqq6TgvR)D464*A`#8d*HLSpZ_FLv(0%XkuL?KW ze_D?I;RqV)!2d&y>EKhFV3_ytbb}Lcslf#zl|sDe0~_eB35gepUy@L*Qq}jnNo8`< z9AQDEG%#E9L8$)YW3qZ!a^^=6ofYU3EHzA3P}n|VbQ-6|bJ0AQjdwMCq6~k~L4fp3 z7aCOQu#+40+^Wbn@qHn!6aa3zr4E)c&=i=#A<7YsjSglqB3R%^e11)r@^EB!IW}>o zj@nMxzW#mMT{OO{1B&;FKZ-iQ(-0fM(HbOi!p4trCO(*rbG2tb5RBGj?poTTU2J>h z5o;~xcfB=rmbJKWb#jL9uynPtkiO*Cn03?Byx)FfnBTPZx}1383%t1L*%4%Q^;&S4agI|UAeZisYYihM#3sHe+>Kb`J-AEE7wWrXdhG;s)yPNe zNR&D6H$~$q6zwBT?6DBC65sA(?i$Omde*V5Sg7z=qwS=m3AhbZQ9JQ6`J7pYt7jYk zx-&GqL%?Nd&Y|qF$IKKRu#U)1)-7=c(|=uHc4#=9b2F09N!F9^2RE|n@?%*l9a~6| zGgol{SsYy;LZpPDkof8LDz_lIz#*L z%pU?HO)jR8B5Ij-sN-IF*`Lb;vq8hW*Iwpx*E@j^=qdV9WPlN<-g03p1GD?fEA){( zeAgmis|YtmvG{5CjPVSNECU5l3@{co_IXVPtKxbwzn`%QP(=kReS%SB>LOdFaOt%P z=yL}LhVmRd%+6OS2CEn)OhBiR9lOFF=S=D^Kjm@&VpuYP5w7Cf8%J1&c6&$u4L4x& z!F87VyPlcJ{byIhcYSXe$Q1%H7+mNl>b4FgIn-A!w z_E?5qtg?2%l9YTRKo`SDf;|CFnKY;*4tBGtdlm;4_^2W-|4|ZI{Ye*bSk63Ji>pSI zEGIu7MIOCMr*}@!)V*~jhHmQ)PZ7JhH2z>5sNU+l_3=JOQ-r*m4MQqB#u(_a-WbS> zHLVFMl+b7*w5fuws|IGPH%AqG7}4`A{7Mi83=t3;F%U;y%qHv3{yGW5#7B?pi6PjZ z;6J9ofw^IenE)yB#BcnShDTp{Nf6xPVR{(Av)AE=YXY!Fh zx_V;zzu@atd0Iw815mhz34Y*CDF)v=%WiC63~`XnYe&;yc3VhOH8|J#B`<)wD|Azm zG#KwQ96r1-zLh(VHr^2bc5*k-C$e-B^?MYU3yco3;)vDG^xk9L9rOI+_qsCb_P1>Z!AQNS4N~q~_?V#h%>>5I zBh76LU>i~zKw^8z1k4qm*|7gKn}pceylW}J{tqazk4?wx>eslm^82~I6we1TiYjJu z2=@+Ee23SgM+e|8l;-*U%s;q^lu8No`|{dHGHZcQ|HVwsF?I{)biY7Wgk@Hg|Kis%z-($%C)+K%W*K$%jUODPPb{ z=C1duV*CngHNPbRJyotwZ?m0-MrRgbIcPebU5WfE1ueWJj32oiPUMH>{*JV-Z0;p~ zA|5M9i+EW7?dicR{1K?lv!<3+GBkohG%VkYeuj|G@-1_I zb5HF0_m+%!?ZiAMAuz4NTGmYdt{xcSTr}#(_z(y?6}LZzA+LrC=RDDr;yC5Vn4Y8* zUeCsVd;JyHQq<`~LO@jbu$`9w8-=hrm)7hF_9KZZ?vbpHpXD5V;%geRd}Ttpoao~y z7osFNPeai)<)33z-~900SL6$Qi(?)s&pS?ZB_Nee6M`gvp(%i(Q9Z-&)p zL+eA*r_!Tsj~{-|U#=C*X$B5EKP|8$=@SD3JNK;G^9-YP2bJlRvST!<~USe`t~r$@orr<`q(pj~wb>{Tt*+{VnImd>}M5@23< z{)e83^?z-+Uz|!LNo9bUL7!^Mpi}A+r)f_Wo`Hsr^Z-ge-dFrX4UKEBqCl_-Owzmo zH$Qpc(F%pRvWM)7SK$?do}4SOwbfj&pS=b!vQu!_LDBqcW-gVN^Ky|;m~_hUmI|ji zzEK;un;=&*B5W z;nnUH@BAl{DD$P(>k$0;bP>}BY`4iOsi?sM^mrrRsecmTAzZT=mYDQ1@jQ09mKJk9 z4a^#Y5n1JOfH-i<59a7#UpeM3HA9;z(G&FPE@|Y-o%$pukyH-b9J&t3=;B~%P3^c= zCg}6G0&R2MO3G)BE@gDjeXj9%Asc)jLBL_5Blnr!AB;=CqI?l>?80g=keCI6;vC6v;gsU*Ikn{b;TsiFEW$3fB}{s8xwRhty(jx6F(hYG0-Uh z`pH(;723Eqpf+PmwyjMLT2i!2Lh|R1co!Oyh}tLnwvJ-=pD7K`l%{MD;)jy@Wr@ zWd?vo1ngnSPMtFsSd(2mw?UvWo)WLmfqOp}_Bd`CSVb+%+{TD$zE8g43Ht1S#bGa9 zNe5oE(upO4_bD}+IiOfg*~6S2BIyJrUk;XVDtpw%o61~@Q<)@X>*k*Y0@ve?jG#G; zKO1xt`50Z`y7llSm<23b2?Jx%Hv0x8Kro1`;a-{X?M^xu`cqt#+Oll&4d^mLc?5E1 z!PKhWAJ5NpF|>l?vZ@UG?=wH2 zbJ*S`6lqT90$D||!oaBtZ z@7sWzB`%Fm4QzXMfU}!l_3uA5EcN?GA`T;FA&LPVd$k7=5(O zG4hmZekqRSux_QVMp8P!cvHYCn3et2t_{qJ!7d z_;Ez}SZbh(Ru-a#RK9!a>`!aH&^Q@IEoqZ4{mDGdl+}Cvy6xNU`_9$H+kb7pbmvaU zXjyiG(F#yxye$AM`(`V}twI_EQ0{x6z?M`cx3|YvGm(jymaOMqu~e;m=lj88Y8OX2 z-^bAfU?pUBK;JN5k<%s744^XLAx0w!Ehv8Dg-B^&gJc4PI(;Hld^#bL$qquyO!KiU zWYuzphh#haVgwc!z~UiEDmJkmJ+78pbV%IQ|JEJ1E*T48+YfdT6Fc$E@B1|LwjTo2 z2}FV*f{-EMvn5aKXXZhLhVmMfuB|VSd-2d5c{6#UWZpDk*>zGOlx+a5(i6i^hBf1F zL*F%%)2Me9kvmk&12Zu8D|%ualb_NnPJ{%k=4w$xcO7Hyj2_Q3`Yg~;^>sFs=fGhY zIs|g>>l7v4Yc+GP*idxapZ2OWksiJsvA=!n3|2fyl6T~X%P7)#U6KSS9N-x1w1HE6DS3H0fNE=ngr3o5bNJR>QtQO2#N!Uo`zK(=xU&WB!rW zA&VhIV46k1_IQTiii>zspMXK)E0`Y1Z1_@x!8e3tNQ%#b-pq0>qo;JU4ehG=`P^04 zoICbD;qI5OVpqSf$C{hludi2jo7-EwkLS3~j+Z>nuFjUQUv!M9V358qc;@HfeX}+8 z2c*n@F0Q^j$B%92xtYe_-`n3yJ>jhX{pn;gw&;}pcIY<2>_?#cEZ7$s%re)cGp#J6gb^M8!i2v{X>*wqvCseQPR&H8pW0U@@40Ub# z9~$`{5BO&ZFs1qXot>TCcz>;?PD@s3GstrD;Ne(V7GPqUFU|W#T5bhr^?N$I?KiN( zf(L`g{DBRZ1NYNzF@BkpAK`4uu3>T?7z=J2lASU-GS9-z$Gv4h3Fz30m5l^vy?0n# zC1RDjJUCpZ!kUCS8`G5VUDb0L>VJZOM<}7Z^^q;9=a0@7C3tD1uPMO-R};W z3kEgdCfSbFqU^86*v=4p4UAh5z=Ch?>VFD3yy?S&54O~)NNBL!Zyo3x=1U3mi3Tg~ z>xUj{Cn^=L%)&xG1?&$sfyKCw5T*AOX?>=`&SRM9 zD5t~k7o_7kLxE?AWF$syA{q+o-MfOxf_6y=GcejR7G!|YjvHkeq?mmPmq2Y4IQt#> zvSD|=EnlqF%gA8NeL*%#F+@6BScvT#!{Xl54rsPwqMaDR6C*PFr86BFwCFw1%dh0W z_b(*wvZNsQmm!+>t{g9Urnbn~y5x`1S1sHt=shR1vF4njS|w!HX^0BiJ%2DF;AYc6 zMVfBW_jks2*R$C6!>zqff3hyx5A$Agoa@%Tw#$bFPbai!iFmq2XlUOLZM-_2(thM3 zY+R$6oQANLB?n?(c3cAA5XbP6e`p??bG;7jI|4q9jd?+?9AA0d!qto`2 zVR?dUa|6pE^Kxx+e@i2S4Bw{wQ)&hPXneL~d*^wGMt3yP?;|fJ`u60NKBsncLeBS` z?3Yn@UTMeitX#wuIcba=$PJe0=oHEeieMA(1vN#-E01bd4ca@q$`yz>>fJ1vYqKmk1 zFa&=VnEfF0Z>)+yu4CnpX})r16CpxnmOzfbP_H}_4K-!m4oEJiL>Ki}c{=$Jq86ka zFu}Tv8^j*+kH9c8%L=<4`I53(O!VdkGjsLM_O~E4^f-|gI7TB1U&8@ENeH6bX#*Kp zRLz|ly!eNjo%_j6J<+gz4MCUo7u^}@s6|GxGC>o@V$@vmT(u)z{tEgh3KGrt>Fk$@NiL5s5{z#*#K7l##;T@QfM^CtoSI1_m_g_xYWzDYax2y5^j zcv%?91RTOYZ-rMeW&$$oXlqa0dXVSSniG3wC~Cw(^u(|4em;(ut|e+|Nl_1y93C)VUyiyV(Tgnur3JX1-20=?-|npY4=*zeOkwMg6Nq zog59UTMHZ(ocsk%1k(>OM?elT{6;tk9nJ2l7f<0UVg3xpyuk{wlhbHp*q7}!lj+dQ zQ_7dY1oYe4I1)pm7dUUyu}vFCfCLmTbY!olJVY<0MYs502y?zq6akRLOTBJi-$>g*2U=-BC-1$*&hvZ7uiMl^0 z=v8BZ6Fps{wG|llG=u#d;l?+){gUP;KMyMI@j)Zb6$i`?!wIVL`2^{ zgfcVo@C6x>$YPcUMeG#SD_@~Rdr?M2&}D6a0}BEz!F!P&o;#!$7#fR%ubzIBkI4hV4GbSaE!bm{h;CAiVE<6+sPgF3XWC& z2dG#!D)+mhfD6u-B)m;-vraa1lHzp?N}YexJVU*ofT{;{Ule_d79u)I8SA(4{~~GT z&V8!c4r2V}&lNA(N)G8gk-G4^EQu^ud7x=8FK?PbYy^=pFyz`mgW`Ow$=ubeHv68_ zaEAsY6~L~fZnmXiqHVl0g4jrpl6sScH;Yp|Z`;LlC8bmW7pogT_$O~@KJo>EFW|2= zTM@Q_?}Z$jc%TB)HR-#0ayS5Rz~KXJ;O|Jc%BET0G5LFiQxHE;WFxE8$#k7=N|omhhGj4i zSNjL*{+^9`0ge$Ae`vFGfI({25l?sCZT=z^sdOb4u_t3}c_vXA(t7m1&DhG$h%A&D zTFT`^z0$?-X90~$!dl?*F4qFchM~9W7;9iVz!9XAQ2XDdsn}`;)=(|bZIGF8Q_~kDk9}kmCPyV z1SP_Jk_#3hU&8b)|1%NG1~p?Xi+Iplb_gY9n`YLl=j$t_MvVSl_n0j-i&3d|t^{D} z7WB^P8mxa15ITf9CHj+adv{}ovC(cE_4wv;Z-4*hER*9E3kDINkr|~^&E=~AfK_U&MM%2g@;IqCTI5h` zP=Va)vGr^9U&9Hh>v|6nn&80e$dCZaS0opYzjz0e0cEPQ7w+AW6_zVpi;K-)guoq z*zlBo$};u7n%Y`4k#Lb^3t@NQ)2tL@_taKXDxVDr%!%Pi9>f$-?g9zU9?Kt-`L^p5 zk9Q&wdGJ)^ut!E(;7-ha;-`jImq}B51-_es*oWJ+)jC&6edGuQ0^jyo>~YRvkyq~z zTJR01YT?DD1?Ap6n#c4CwF$vlIy$3ZhT**5fZf3KdBg@8#XE3fcJ0H2={}}OcEiHI z7;eksVb?{|C(|I-|M5{7F$kkalxy(ffCw*X>T#1(66=C7)y}p?m%;BI-tcTrOoA(G80yc6 zBBr;VP4ErK(H@sw=d%)(e#N}&-5uUO2k>R1}C74?XRHqwM>-mS#@~Cuw z>G+xXCMoQ=Qg$b9ED;4mw-uiC*hNE7{&K!#TmL;qD|g3&y_AGX6CT>@FYQwAcUG(e&qUd<+NQgK{xjN-$=-_&rMej3&FG zVPVM?#~9bk`_0)OdKxYF(=tw;T^aMF5G^2W*GKcRpQYZf6b>BM|)kL4bTm zxhM887vRHR{u>;I0Qm?K;DHFALe?ZOBpXDe$%OTGgAw*sdq zp5`cBqP$Cb9fa9XIA*Lsbq^2IKGsb5b6F4ON1(4{siVXxs>Sv9T^*|OsOMf!;!+e= zf;I9+TtLmcYk+b;?MS6R$pM}puH=dOiT$)9CBa_D_9|W7h=UZQ+KM|7^GiQVD>aHt3c7>d)BkT{#lN{YSo`v|9rwMMT3NEm z01=8QVWPO6zqN9cwTFulU&y_DLU#{I8o~)1J zJy1|{Fg76cT<@xWDrY zo!IYCD@V3N$WLFSFKiqSkhKNT6J$Hqi!vUhlNphqUndhSnQ2zZe*W2#v5`afi(Ht5 z<$J#I2up8f*RZ-M&PRx{5o;PPuqs0pHhF8;s$!sH5Q(IPQA!d0V5;8}Oc(miTYQBM zBtXF`6ne%DC&4-CR@ntN7NBLOAnEd;@=($H>$&sM5xMfYf`&j6R7(76>^)O@5e%Gv zPy7M=mQ=F0Suez?pLQOud4=j9IYHV0PKBvms^J}_Ey`eI)H8d^q z%!<)5#Iy6KFCS6fI`P0UB1xCzsb4Z&%l9aX%HXITFZTHgrs&1L9&0EReHINrrBoX_ zBKI-ve6^R}qq4D=lYKYB&+!*AvElAm*#gNS|Gz$gQ7hXK=EU81!c*r|a|m+TPuAJb zaU*wUrwNxV60$EaQ~$o-@@Sev3%G>-s&&_GE*e{uAu*E^P5E~Rhcx$>^Yfq3%ek7J z9%&hjv5d+XCp||e&RqUE)f02h+dMM^S2ifo(}kJ^z=g{-%fnXgE85K~RLNn3@_y}8 z`UhslcJlQ;WROJJ)M=Op-PN0ByEfj3uS2Z>R6A9;^ysHGyA5k#E9dQx3N8W@_iFRWwLinx?|#**-vl zR|pKAjQb{dhf8iloCkRN5SSR1dJtP0%dC)5U0(_dp35E zC<677QIB~393K%k2j>+$6uJOn>-G-G^;a9G-A$lh8k`Z4yMxH!{_Z;PjP(#?I`^i6 zW+`yLb;FSm;=3XJvm(_JjauyY-xb;)0rDgtG`U~?_wxQmik)M(cllj4Nd6F#Gl`PG zK=f~3^l>Z;C?f;lYF-{M>9=EVBq``~0emQ$z8O+!(pYChL%+sXr8J;xdrXYNgI5$sFixy1WMaL z34D(zr%yJ0{0VgzNIpK>i4b`_<(-)sdV!4DkqPI#$aCD44X9-tzD$qA@{42~CMjF! z6=y4(P2KHaAhJNm&fj$ewT@`C2UfEQsRMb38%fSsAg-opfit|V|5Inplw@zvzqbW{xjp5a?bKse_I51HKFqVi7M)QF zplsx>hqEz3!iec_pOv`CGPsmI*ogr&w;bNo7sC*nJ|3laTHniUczWrip~E!yDky;%P7wsoU2>#G0=xQc^C24Z| zI9{&}_@F+3YKf?irlqLAA20FRw5ZFMQKeZJbw7THg5jxyR}mQ-dSAZznRdq3~h!!E@*e!*WrKzm)$kz*rr1}NE!SkewSo`Fm*x&R@kkYy}y|Ki` zlz|jlQ)bZ(>SM#pL+nY)?1~=xS^UE+mdOND^0Sum!Uzc{eU4IRA765VOQh3Q2E3RMu^A%a!uCMt$WyFWvj;@WC*rZfF<%Bkuj5{!k%f6cwiR- z^2R%*%zU?FmX2Ux2m-O1g-lcNLe#$;H17e;9jqK_A`@*n+s$9$885IwRmCcrbOje5 zp3kN}c%%bb4^aRW?nnEcNCMKv?`SA!kD;*1{>xDJqthU$C;)140)xEX8^-ZcrXVdW zx2fuh&fP=Mh%gIIK(AXDFa^BHcU!s)s1JgnoWFt4aMbiuR!w-qODI{R6y*Kp%tzb@ zbK=ED?KRnkzHf0E14ncLP&N*}ZE5}~TbTAXiXhSxwf>_@&_!UX)dvgY#eyI^cXsYm zYgCO(C`ur*4~+yxZh&M7EErJ#{1^H)A;LW#>A?>Zi)E2(X%Hwy$%bg&4sq6VWmyC@ z)E3v)Q~LO39J&R%Su^PfG;+rI$ZL zRt~TrmTRd}tvON@Y~Hc>qLYIrld>s$b5MTT(XWVg*FADUnQ9TD#sThGAZc3dAyyAE zBEvuNy#^skvOc6EBY^Ivk#9(a00#sQ>c<+ zBm3yE>BJ*A|MPwN`r}X8w)uwzbKkPWlg@INu%wW(8qv^^n(0V2(1Fa ziEjT=RXFh-U|+sW@-K!pVTWkvZ1|l&>__n>t4)76iTB z`ybzG@96XQj@6^GUqPa#$e}@E-EQ2e|G{5J!tl6CDf&kB<3W;PueDPc+al65&H5xe z?yrXwunh9P+MPew#5xK-K|(zlWO~~0#{F)e4AnISKLe&bLVDmd^ zLoB*!)M_6gpA-W_pW4l>4MXmxLZ7F|*c;gw51H#w&krD*dXHU5>ZNSov99!8 zeVBehyLt3NWY*>@CMWe;VG?MO*N4gcGi z2}P7Z96QgW-y0LKp|&3aD*r8yVc|MDzb!4L)#SCj?gEUKy$xWr98Km{ zx<+w29_-4O3eIm7h|cV^MYen+U>P9!0Y%ihiBFBsCWikFeapOY#%vi_uZiB>^cy)R zmXMJn@o43MjE||wmYd~tf_ZO>KiBw&!IMaEX^ys2m6jJf**6{3 zM6UX~4NLoA3&V2+NH=;Y5o&?Ug{N;+Ww5Kuzf4O%2@7v`!kyYV|v8gNIk-JkW%f}kS zuIh`bgtw@Nan5exa)nlqKw(FvES<1})op9xr*D;k&tHp@gs+Xgkr6*)2KsHl&RCH| zFo<|AuB75|IbGbX-j@XHOwFLkl9~qH>FH8ukX2YtPi)Zls*G70`op@rP%+?$VS!ZS zn5LI@j}kN%e5C@&z1I}Mn!-fn+jZp&C|^5dh}W-o*?%r2`4ZGgT+m6`wu#-TWs$*6 zkGVAe+YvD^CUV@;v!hkzD>>!!&XW(iFS9%%9qKgiDz4-LC2&wOP-s~DHtfaKuhLeV z2~>M^*AxKOr*CO1r>lr=9!cb9QUK0ru&AC9mQNEZ!GgdmP}6ICZPlz%rVa;_7xv^y zM7GCXYgZlP)l2CCX>y3=F>hyPr6^0fX}=0>5kHs~c?-p@KMDXm1f&m1eO85Z&0U{*Dl*`o-y6sg!~L;Bo# zUMzv2FH|sR`el~qjX@osX;9JhgX^&HES?-)J?K!i%gBQqpts{O0rD4!IQ5nc z<>CcT_+XaGVo}1vx>kkB3H`D&NDh5tmfB*E=H^U1-R^Dz9=NUEw>o+eXU&5lB za0wXWV48ESaR0m|@s4Z55g9M^f`OZXjwIl^y~J?3`vdCyr*uIw{)XFrA!59M8t?0M zfn}~5ACOd_E{X;0D&vWik8v6GE@lfw)B~Ur2FO7k3}qwjHom|9f2-?}FRt>pHveC& z^T`{)IxnJ>=Z53>v|?T_?TbD0@jKqmGAnEgIglIwx|ZcHdb!yZODlHs*zsDtad6{* z^UfEDl?ZjyumyF$Ts~?ZFssLhEtNd{H1aru_r2;pg72qZRqicbPZ=7$0{h_QN(Qc6 zqAMfgy}we5T)9Bf;Wv;AgvKM``7XiioOF6A2VvEg(E;7)B79l}kqPm@Y`LjN%63H9 zkFP-PGsOOuswUiijaN3Y5YF~i{C3Kk-`{yCz8IsE%?>|9@ii6DY2(9zC$+_qYyJjV$Ekk$LT7^S zDDL;s7GBOc(-s9&CeHht2P^d;n`+;v-R1PTNyjZcW#TfZT7@FkIuZEPF8}8*ET=5& z%091)oEE~}Rno$(Smd?>uu&Z+3pPP|VYE6Td3t`~P)BN%p_$uQn9dH421RJbd!Wqo zL;Y&R4#!e4<)z)v(h`mCX+RYysB{Z27u*pI>{FU}f{F@Cl_sjK zPdTz;{EJel(=KaQ`5xXb!H_bYQ_ zrvsuz%3M%l^&C|b$Ju+~kDg~u0G(Q- zadMz{iQ==n&>$LmATAw1i(l{%GuPaH&=#N^E+)$lL}?|O#1d~ONx|;@O($$Y(bZGw zWz(8IR8+N)ojn(wYs@Czq~wCqi47U>clsf{0=3X?UQ@>mz(nE+^ed{rG(_GRC1bq2A4ADT zlyeNvU(=~{^;hq7*v#pP2wLsL{m!viq{;-Fi3IJSAQAx(L$T%PsLZ@}z~9O!_iIFk zpx{CvTis$4DePqsJrUAy1xvKSQ0@@c!*@vv zW>5_=;amS9i*Xlo4fq(jjFozEcaqZ^3?l)!LHI!n8uBOg8@GVh8z|l;Gf@JAh{6@T zAQqLezL$SJ%upBcs2cN1%^HkgA(cg4vYz-$4ZYDI&xT-_86arGb#`9de9GNLgrmH~tNk|71~{G#uZs{d1zf$M5b0cMaS+D>}Jlf19zbE}N^Dd%SeBh|ox zw@J9EjZ&q;DEI@EWGN~!wf^9Zt1#^e9%)`|#@ZP7Pjc zuf#AW5VvFilmOu-*RgjKMxHnWf=USxW*Ui8V>qZEmCK0%h_4S6$fHU7`edY<#Hppb0^LPiJ-$NNP9vz{;eeoqAWD` zS8kAZV^Jl2;}c0~-F^pSMEPTNDBEU3cnX)LK3Rh8z5fh$SW!t>VcC@P58=V3-0j+; z_wp{K;DwVpeb~rBws$^a9yNH(Z+7#ICloxi7C3!01`Q=;hPcZ7TaXrKMd_E9%BKh7 z;i}}7t}0IeDtF#?ExC>8kBaH7mV9=@H;}ajXwMp}OKnQHIlT-kGvH9`xa`hGYFpStPnu$NLE7PCW~%7fXMn*CnDPb3^%CCHQk#E&{V5#AAAQ|sze z%XJnA$^c(c2B_VLJQjk^F!A8+huzs2{!Fb|0=N0utpjJ!#0e72X+o^B*+Sx-tphY( zR2D_3nAEeaNd!uyP>e1pi9VKCyg(`q0iF;SE?UjSoVi%WU_KT2Mw`+yCx&r@dQF&= z3VSW`FEl5gKUq1p0>fM~=dCi$z7ih**H`~Q4|f1H4)hGuY~M8siJ9ToTTF)EI213H zO2C}HX6sEq))!89KSNG}2NwUnzPcbdLbnK&d;*j_Wl}$nfpA}loDs#1>)mD^Y(W}O z2cZnXeZ>7x1HpvJpIXmCLE)dTR2RAE@mZ=yvn)-a4w*m%lB{leK*FS<`^}SBc;zZ2 zokEnMs{+dCcS;+qnQNb~EQc{O%|^qzAAqiFo`sWHyCcs=i>Q)A~I{CXu zvj6k#5lb1T0i^2?cIEGRXHb%e`A|p~j=T5zH)$ zGR5%TJnc2MA`|aj`CyF1AzlIamYbqca%5sx== zPuz7VX5UX1xeoos1_=L%N2YWq%_as2jhUHr(n@qQoeuBX5b}uW_zwAjGCS0^K>SC1 zVAz{4Bsc6BAXxKpERQSQ_xAbt7orQOhY3MJCV)~(a)Q)Bt^)>-Mb+42f|`_ORQaco z7v`w=h5>WESEDdgXdL{;{tW5BG=`od>kOu4ju5r2$!Z`)Gy~>Hx9N9|B$1TAZ;&WL zDGb>NZ_*ZG(QT92sxhSj6cWx^^$Iu8(U5pR#nk--2o&g7BwZ5>8|NU+SO5?euO_4>N|J^Kp)yg>b0mP=l=*`<@b)j7E@KMsODE*c zG6ZNj)UGfsaweq7NBrf5Q`&9RZ_1du1>OJkfkw{h{B8h>8v;ARQ{}ro>GK~Ki;bv} zXnc^3y_}{4x@RC$FwDSYVSRQ+16>m;AHeqSjgaQHzGo1Q`PVO_J#IK1I#?AG(yhVv0Jrq!-M9(Ex_H~OSaK%Q zlg`8faW|n--M+;}F~J!MY=MB#E-RpB0C7MYU-dsql+t4gWWsoJ+mMpzXx=D|U}JtZ zL07N;ItbH0yga#zPtS2gb>>+uCvps$r^rQv`SG1eQrk7lcfh=+-U}7P&${XMKN;e> zK{uzziB^P8nP+k4bQOemDV7}CIA&=u2#a2Zppjz+Hy<51CmhpTpqyNN%ZUa z%K4dW`pL~?Hwll?1ks`IF%Bj@dZWuY)bkJ2)SAX1JHR=kkfYLY#rz`v$q)%eYGATm3FH+rAUlucndk7=e*y3s(8O<`u}YP z|Dag5P-FQ=`sA={?$7hA#hcTCg|GW!eqJ7z(HCF*Jly@=zm~W+#%5g{ex=naH9*^& z8bZ7AyE$ArPB*%tel^gTD3;^*;O25|MU2+(^8BLy?J-8b#kc=WdjDk9@c3=s(mMRW zjWuvDIPq43Pcyp*<|{WRkz5?Ll)3Fb^|6Ug?il<>&=__XW=^Crg$B zfzq`K?u5I^^`)XFonvC9HY6ow43@8~msX{)5IltGUV`Y&vK@OlblV&;^j@7oulDyy zu`Dyy%$RWv@#BG#26;Msl;ysD_1L-WNgPrJIO)650W;_#-a%5LKA??D6n7DDgLKHN zGs0%GzzhlW8yrJ#qSe`W>rHmNR;7_aAl(g{$_(-d@{$`jWh>9c#x8?z(6Lk8FQXF&IU{^q#s_qcD{pI;(IJN^&+*Txo}pNSp& zuPL>5aJ#i)DXOq0elsw+ly=ERS#Nbu zkZ(lc^{C@JW@Xoxo=nk7N(+o4bAqzsjvjYKEHy^~$eVX~&L+a>LFaZMg5tM)aI(=) zwXnL8jjZ}24w-9Zy_m9xSTEk)R(`Bqj^^$XibDleg@G9@sW(4d zg=B#M3j=_H8;y_RemYS*S2-BNTN-gF?Gi(u)>n%Kc^> z;0lDmK)U?7``wHxhtJXI&OX$M3R)cR>Nzi{-g?lT00H_Pc2YzQO}uk6@-K4|&ALF} z6gNniKL@Ve&QUaKR#N_r1$i$(b&|G&kG43|UFHN?d9Kw$-9@ANB}}Eu9-w`7>~I#u zH-zRhg@IqUP~A#@!)E4YBjkG=;LM;ZZrQi95Tat3p&N=jwIIKY<(mbNtX6qa-M?iR z3hSrotpDs9#^nBWJ(BrlLTg)?mrR21)j|HI$dzMf;29CNYYmz=pUYFSNw!qYMp3Dn zN?JnHdyoUNG@7#T&~*OC*N9YmKp2p!2@4-4fk+bd?#mfZln^d|=<$^HESrXO4en@X} zt}LQt@liJn5H&M!6rkL?ZVVd{;o9EDva<9URTQ1sG8Zx!%!bytAq*{f2dA)q_wUvN z8K|_<0B8ReCK}3l-*YdP<73r2TD1nV+`;;Z3|ip}q~IFG)Bdk18FcbClC#RFVnVw` zOFOsWwUuMFe(`U4%&a=$2jbEHPB2Psd|!2>f|vvS5j87_LFrLZN-5BgakyClNw^Sh zSJYtTOToqjnw9NKjX`6(P!v;6hKzTspU~gVTtOlLdD@4Xu{g7U&K`>3oJt0s=ETAE znqFEgbalv`h!I7y!9(yg51jRYuI`d)G;R38JL~T-%+@{&Ss?Z(AJG#B1AIK^Ehn;p zkwMS^Y!T5D4|84^-ne%mWlIW09hIPQ$I^;OoLQJ!8v5Va6(TtOo3EU??j|98Vo+?1 zn4nP6X$nK5-x8mHadWRatF||_D#tPL*VO@D{JaHbMXz+Oa*s%bNI0cv3k$==> zmxgKX{N&zW1O}2xP%hb7Jq<^Z=q+IajQy<5& zEs!qEpY=-eN9im`xAXx`KltL8E@Ohc?LOw9l+iUjD= zSp?!69IWA(*Py)&@J4P6S7~lbz~JJj_}&i|#XX^R;z=NQ44DFuK1u7Ory9qZCcA)^ zB!7f8a6n~qsT$scpc65RRkx)lF6gHup9><0WjF)~#sEH}f^``K)8|K79SD3#%z0^y zv>Z$qGPC?@v%iIe4+n=oQ;3-IK-|}_b$KrMED&O3jhwl5+ll@!#@;e4s_uOQeN|d& z=mwdgYv@L4hVB-Jkp__x5l~6#8oFWVkPuLilI~VY3|bHr#6t1)tUbKH|EF`E>wILh z_v~0}J=wJKb?H8zEh%Z#E^wW84s2jxp*m{zqqdWQ_QL8k=SrI4} zg(nUtI(=3{(&|#F3p0Z4%D|Te+rd#2LwVjGm9zz-QC))czUV{X zHK8uiyGsZ9%iLmyolxWgxQ;;zOH$uIwfBio;{qU0EAIz69G_Q)RFu)Ynvvipz~f+d zhEFg%T<#k_boekYCu*%U>!4updi`?{Wh{@th=goJ@4}t5DF^yx!TUt1+Lt z&ZM>RXq^>WqzNPT``X9Kc)H<6 zQK98t&9n%Nc*ut68xOY+0d&L^qL45{Gn~$TIxqr=l+%ONDEoMMvZ!5~M&h$-$kll# zb-WVP0f{rflbz*)$+7s^2by}U4)xEJrCLG35Js=LK-o8?_*sj=Vbd@nXfsqD3j98J z*;9mKrS`g@g>}w{M;kcn8PJU?#vETgv5o-2MmMeIBIT(&Nr5zHe^NnC?r5e2qa3oq z(7Q9$z5z3ysH8kMla6wMihl-8dai)>x4Ybe-&^>+jZfYJ%!fHt!8f6x)b6fK|NLW9 z$tO4pHCksuncU>-td#L~_8@Vh2uy97R)I5b$)}C@@0z5&+$QyIoNjBmj=MOySU8Bo zpW&>V%kJYW6esFyms7g=*99I7C4V2Rdy6aFI7uxlVAFus8#&4=t5*49oQNDqgph;f zN7nF~IV0OIwHTCj7zyz|ZRPva82`vcL$lfM4oGE+(R;4a%3AX%z9Jh)8*K8UF;H3-+$8 zw|=QI7hmY`+%J}hkLQft^1z+bZH{mdRz-JY{1_>){wyF~`jGZ$K| zIZ!uwzBCYQ)dfZEfr>|sedb6o)ZQWO9c6d+B-i?R>?Kc7`alZeRN;%A%!=957uE3Y zIw}Nl=+w5c9zlt}n43A^cdb%1)gO2|&8J87tl$N6S!^fd$@4)d5$Y(RIE+(7Y*M)7 zeEIv9it@)me$33@jox27*?%L%SI}g!p|7u#X*OO60#H99=nLN1$9uOvTktzen!|TJ@3Mep?~eopv4;y z$ubgJ9CCfTn%!CGU(VhG_0>a1c2@*rmQzbZ35ISdrDXgx;E%s`oNKooAqz)Se9``| z=JLw(4^#G5>5QFzAZH|7ZOu@8&-KQWmP=te!o^T_8w6@b8@Qg{uc6P_SrZ0AG`MAO z%Ev2C?Hw{=@Z{gNP{hufvADxda>ZR+QR?e|9*0OfaFqnJ=jZK%>7T(sZ&c{eH$5uP z?faGy-|h&ER!fU*(_k6c`UF7nD{(9L)FUIR$Hpwql@dT8zv@>*d;%T*eYI&4JOeB5 zf8)J#QQ34OVTA7W2Iri&?RAy^zoq6EU&a3M&by^(a{uh;`@aiSKYIW8{W$rZQp~~e z5cBV2&bM#gy^;KQ{nJ;_Yi{=H(~Xzx$`@}e<^28qXC!9k_JcqE+&3Qi|Ag=F9?x9m z`1fReB&GNvtK7p9`!=IZzQ3cv-Gx{G+%*#Zmq(9#={B`oZ!L>Zl!FuY_7WP_?~ofb z+ODr3P+;HvBj7Z+GB|zg6cF$G8AXD2npjkQ{QyXC^0+^k*kQrto4ipF;j{#~>b??V zB$c9zYmZkV$`U9)_+P!#)ka1blYdR0!PrPUvv(9|(?78)24ZU3kFpjCe6J{j4~z7q zle&}7Y51)<@sz?4i!*8JL|2Il|9lXXz)V}HT-W0OwzkYiX-^WHXh~{@CUAlN4&*{yRo{4#A}C(}rtn(CLVdDpbT*kDJTWP4`Ao4IQVS%TacZUK%^s6s0M zw2m^8!*FPwm2TT#cx@Ra9ndT4(?^ZCSE7{QnOzK!zttlPkid*?9FHuNe=QKa$L-?S ze_#B12)5s9d&*cTr|t}tEeGK*JUV!dt}@~p3m~td;*~;jlf}zDu;@R7oaU3 z1-4tW%uZ)Ek|GBcDMUeB9s3|l!sGCyr}(lfE2%^e@{5IA}Jfx`w0-*-x(&6aD?s zJ^!qC8z|D0frw!PidL`P2iz7bv-se-OMKO9E{}Ja7Pq$lBXD}J86v2UsSt4IbE}x!IRIeL}SUv`(Vg?Ob zZ8OC_lQh3Jt}Dq|!XpHb2p+gKYPj^RbP?m&KeGWKu^`p6@CAiM? zCdrTpT#)+rSkfC9o6R<(&35rbvF z4z`{~$Xy^j|68h`Kx5HBzE{1A%P!+6Ou<8#)MC<}_#4dx)NwpRp_Rl#`k=tqg%UeE z^l}pJ65Tt9x{11|7${l6Ku7fyv%b z*;n2SFKzdzqW38X@e_`PjOcROhwE*UMT)0fuLOkwdng3#A(?Ap8W+QB_!&y00hY7H zG%*R6voq8H)n7C8lR!_d>||IOehybul;AG_8BK_$CPHNIHILxNuo#}UCY3AU%q3+D1k6`v z3_#m}Cdi5UmgbJtnaXXQGe|{jZAJ8v@-{Ecdu-TXSM|d=db9&ujth+8mB>tD24M`U!ML ziiNBj!I5vHgyQ$Ef7BT~*zX4;8+@q4BFjLHV=(Fz(a~?jXBtINn-_xT3?CDxS^oq+ z^Ic!?Aqt$d<-Nm9egy@wF(BuFVoBjT7&2Dk-+_u9IO>7n@x7_q>OY}jVlVv!3AS2j z<8xoLnI%v9uCpNuc5VVSSbXkEL<_T&L|7|J5&cl9vSY-{>&^aH<5*Ld3+MCMKGTb@ zCDkt*z7O^zK;;dmM;(|p`7fb10;upGKRs$=_-}C_-6SN_^kC+tR8f>wBsWotTZ>&x zY%sJ9P7)vK8)tQxblfd{Jl^M9ANN*&9DtbavOllT&`u^qTdD#QF+-|kwc1rg+ z#N znJc>Q`B0|{%z2j!FiaY?dbw&je2-Bl&;XqxLk~`e?EobI{f+k%&MxCaLRzJ@*t?x9 z*+Bxs?JL}$ZbSK>TBtH$+H%`5hAIWBzdTw^2yke2b`$$nnjPf0(HpVkQtlseqa}TL zMw5;1IdU%B-=O(=&&)TiM;?URhhOlPS9ZRmTMW*i;U1zrC^{HT`oll|@JrzmE03ak z-|^#gTp#4<8vf|)e(%|uB9Oe!M)ggH^v2v#4eqhex{7^0)+8hOleo$TL?GxW3fLF0Hu6O$kE;~FB<*LQER$XYrXonQnDU%ltWk7OzxCG}s3@W7f&HYDD zua<+f5Y(mYizt0==t5A=|1|kLsfdu$Q(W~_{;v-nPI^BIh|i=6?o@#mjh2e#*|#0? z65LrM4-J|@N2s<$JmKMe(aI*;vBAJ2I23RPCVX;pM4E1lKpqPyTw@7FHDq^Z6kP@D zj2Sr3bT304K?wTz<$io$b$gn%$hU`MZ}bvqym#qduPDlD^D4ex*(OB%FW&ja*z)6h zP5j~!qtQ4_)5i4q4Gh-$fd*J}D@OLW#>c>6o{5EHuzKiB>Rmps zv8{+C;Zm=HnvPGJboncaKfY&r>;P?a89?Z~Wr;UK|8=Fz3IFUn=gKAuP(*DZ^;2cXCOjUl6#K+H8zs{=(0oIXq7GED4z1s)Re z@u;MNn4y01LBPXIem*Dsb4!BKky2xYu~JY9ay2}D=%COJ-d%`uCqonuKoyNi%_-mm=6kK;fwEjpp2L|JzQjlKV=W4Lj#Q+5hj5dk*m? zzbHlZL)*5$c?W83ZaW3ya=ArZiJ|130u7`j$owg*la30UBIVy*c)x_OpTKr?5hiBe z0)$|T`}BOCiP!*&-4b?b|j{8zdNK@M?`E z!|6Vn&kC^?myYBb7QO13uO#Eeiw8E zZrZK-HtFw=2R`kbZ+}HTg{0djZM(*MV zP;XP=mO7b?SnE?2NG2WRI<_JTnb!iwSB;<=!R)MviIqgXvY;SnM^BN(_EtKO7=QGt zHuNwYU;ZH_D)rQiM8`o;70QHq*xQabxJX*vzV!QuCK9;apzemEx%kUti4irNKs4{C zUTF8@qPe^i*__cIx}N6qAQxkVvhbh;7xz{Svs9?)#}q2Q2yIseTJiCfmB(80&mZMP zmYfyD(i<4%9I@7eL-yivIf9iGWVN$5K%z9|Ab*&3dt;vB!P?UOwEOYk{d+6gw=Twl zK6UW;b$WqB9}=lgkCYwtgJRdDL`7sL8Tby5k|M)Eao;@n`>vI@&(N3g8I(7;v^bq^ zi-w18=ewQ5Z_QuRAt3yPyP`Y)8U&okzI*n{%|^f#2U7XtWhYW{m>-C(Hd4TSdHj(t z6?cZz2BJx?&i`sNV09ZyD;!SeJq*2vi{fQ(SYSxG_z>3U{D}dni&|zpo68w*r4oq?a3sI8|oAPX`D&txe=ON zsPT&AJLS;=Uctc*z7d!_f2b7Uz%u9Wc18>wZQF(lf|NteCxJi}Dy1f%b493L@Q zO;Yv()8I&cOHN#oOzT+m5C*-E!%ZgjXHIu(mzQIp;>4drAFe-Lc)vzvBUu?`1pDl; z$++3{B(^(df0d|a6{sHo$e$qo+{LxRgai{KM|si_QSR$5-s$lH;Z1y-PL=gc2FP{C zF3~Ncl!mFdyH*A@T<B=(d@ME?v1GwTdhHhYfhf1g=6ajLod1rcuF@0k+f{^KRE9A^1o*nFL; zf7p57y`J--Td44fR^NVY;T*=itKiIWlJ%=&mt`Nsw&?&*G>>FM8t9+d*@GPSCwQB` z{42_i1fV(i@zYDd)|U>XJS*3>o`I-cZ{+ndwD04b=C>mg-gKZ5L_5Q;0{#BUBE}t= zmE9A0nf5^@y-pe0XKp@q94h!Zo=>>5U0n>i2`6%m!H@tbP;f8? zfYO$CDH7~X2RsjJ=|NXvy*~YJ_a+qJ1Ho}=#SpQraFGOjjij+}_evZ=4clACb7EtB z_tmu4`t0CuAXY^=^GQ32l@u60>pW}@qdgFQe*m}^weXv{Hqlp7_!2yE_?6E2NfIXi z^!j#f5~0EH3)4~>5Lmrj#9XIUs1a`RQUp5yFt zj(i~P_^+FZlA!aB;8YP$3gxgl*Pkui%Bsu01VDc;P7k!N1B>-t!i=UW9mLn~8s9{< z`!I@M)>oGPd_*1rh5fS-r?A@9W(4As5r}{3VL_`pk5yf6iyVEk9@?=#JrcEvqLICu zZ<6{%&L-G#V+I2<8mePc({}blz7K)C`e=skRFiRVzY@SM#U3@$g*NiqcUpCCYi%z<*`UH zgJeAjIX+HpR36hP`y03Llpc(Dd>_Kutxu-Wifsh+-ugi2O9L?02 z4JrE-zwi{J@4!+^uwS7kaCL$o7uFviv_a>~v20XBUEQRd7?O@u-tA zh(GQC);r5nh`two+ugyF@%0lZv9n|-IE{J|`_9r%T(EZ_oyLLJSV}7%`!SG(3PW3E z33RVj?ZJU3LV>}hdRM`2vd}C`!AXQ>WNuPX_=XRDRsy;`#5zg#d__@sR}xRM0K)27k1b;yXh935 zf?!391(S3&<=mHnoE1oh20_46DICQXj=yCPOjP@sf2@YDuk3jt8Awb&jKwn%O9a90 zVL*?Q?|ppBIaG?Bs%TjdGu|7mt}m$ny7mYdheoCe;<^b1YqL4D|*%tAD3S&d7?E}eb2h9yBz zN1i5ps6(a6<^&w&ZQliud&Uqb2Ii<`s-G7~CJnj?lp1$??SiuA9B&qoiLM}v7X4Ih zn{i~_KDfFjYyi==W_U9Y zyu0Rgw83@>PmNO$ejMU$CLgsaQQ&_5gg~La{QZ;C;63{-*Ygf!_zI|?^)8q3HCpYD zdPodOxQFEimY-4b`Z7wMM-nCR&GvvK6ov=8hq!+yT(RMpR+Q5O+VwxVn8_UMuyKoJxsl~@ha32EP;G2b zu4=QScR{VSSPQaGI#L~|2Llja2b7hcFz&7k>-)q%Jmbhb&>)|+eR@Kc@K_ixT=xAnRqF>+P<@%fWucEx z4>?3>$GvVI@P8Fijqhf>sRfmH7-SA5VbA?V`KLT~F*Q}T%tX9IMVgJ3JFmD%3h{Xt zrw*@nU?B39&;K;DE0h5_ zgmOYGb{U-j{*Is3zLOZFrbM`4(qBF=*ipx~8L3a$y9FoQmuUW9Itjz zwtgT({j7SXt3jLW4C9~&4dKta>iaqg6d%) z*^ro9HEgM_d{aR86#;ND>@R<|B30(*5+knH^IB*4Tu2{gJDxREPbp!HK?>uWk7#gp zQy_;l6m5m)%kcGhb#+C_GC5XS2>SUV<~qH1Wn`B`p?JJl^KhDmpYrRts{0udl^{=_ z>Ip)JI+#K7W#f?rNUeB1+Z_cC_^lW^J2C1>;7PVRP0K{!FO`rqBTS`6ITC<^2Vi5o zd%0YO`w(^kl;3Om^$Mq6=|t}1IMO0&`_M%unub5m%+gg6)7B1$#zClfxN+M;Ba6<11U}v_4JEKK(0Ie!_aYCr3q1vaKG*LC!Kc$3=ZZ_F($W+- zZFx;8@#EW(!>kp_;_SABRIV)e0@Fy;g>iBx04SP8>sfFh!S)JANi>=<~`n zgNXsveoqc%QrAoAbdtFvsZ`0nn0}GFi*mzj*IQ4V^}a!BQa7hON345Jw&p2lP8vg4 ztAB#k{7%9+EA$fO$?0vIhHlSw?$Ls&t!t5t`4J3|NbG0ZouGMiWo1~`Pi3fY(II3> zqRMkMm(=JG{9u3CH^0N{#I~GnE`pJ`AM@8|`=j1zXMvk=)GbV|ISq1C;y|_izma~2 zOcOU(vI~{`1WXfx!s+L30m-W2aLa;cQnddvYay>|5Ww(+lTz?l5{%KiNwqB*^L>dRYByiIVm6Xb($QpoIgi6&EsxsEGi zm*vGmXzIewFaA+ez#y`se@icRhCp_75o?}xg%ZQMF? z7#CK;Y<#Q(593&3kxl+4egv`Ii^ua1di=Q5(pPyD7(?FaZ+!aH7F?PU*(KL+F@&=X&Nn2TY*!<7u23ws1W#Fc>1a&a^)uYyVYghxrN-)BkUS? zhVn&mK?Bxd0kz+0|9UlrsjH!kxU|aMLsCmd2BsXXceHZ0rUheQ?$0rzWuNqeU)az) zVioJw+I8xZ$FZbEb1K|i+Nu$#TjNpvrzAw`COx5vs+R+WydANOOgr1{Ts8fBzM98A zb7Ntb$b)mXKJ^&Cz0imD$=PX5zZMZi>5|gttGZEY!&~dMsCt3%tA``@Gop*l3Slw& zwUv&8%8MoK(f194blbEeKl?QE(sXq#(i(fxAofJ$9y41uIL+*(vrLP%9wGZ*-kg_? z%w23t&_Q7;pNxmd1Qsvb0<@_ojYG00R&daL>!nIUWDEr5@uMjkH0KW?z#!s`^>@s|r*9*S zw&iUN|MD^qR>Q?YDADTDC)InL zZT)g1Iy5!bnInvLdZzh&^n8kHBEsYs z*WMy={?Mgi{V?~jKV%o-s0_zE90%{>vms&^-!S~64XR5L7Y@M&mZpAf3HN!HcCWI{ zRMxd@Y!7X09h}-IKU^3TVz?1{Oc*=P@$!aLlt+i0yJg+pnSrmu^@hbmNlL1a`-^l2 zFKpfTIIEWIEWfo0UKe?Pym0VrVLRAtrs$_$hT8b8YSzD>#XkN>u$q`!8(2}ZX*K=> zzd_VvxKZ}Gs443ohLN8a)Q)~kB1IdWC3q1(7~|2uGB^5a{{|pK7R)@Q6_ndBPZ85d z27CJnq<5NexvOJ~sdOlp0b$DzVTv6akDV`ZMqjCzWme((`~PUB5Dk<#FYXL*v2CD; zTSm~)j1&$4Gm@a~fdgq#We6G_V3F(#l#9+{U(S2MqyD1hWs z=__|ly~z|He}}?yRjt1{8s)n-chi`QiCkQrPMhrm{JtBzK5}oQWDv=pBek*|8S2Jh z28Oa4N&e{P8!(S4iTQbRzLF=`!Kn-+9bBY{`jVN!%aA8~(ojuFpyqTg6m}~i6E5lh zy5nP?-cEh$DoKXTME4Ra)9u%p=HOHv<|t&Iul zb*hcOlMM3H>qR3!3uXmdc{rq7HXC^>-g%y|uHRbG2}Xk?*i7e&S^cW*BkrV%x6K( zMWQ?34wk;#rC7EM{mRYO$rOmD7ZBaZ55DvLV41^eYEY>ocJK492O@>C`%d>I+II_U|82?ubURl%;1n%{%%3Vx~bm5?#{&lFpX|8*jemA+v2GNUZp$1{#qMP8BT* zGIQv<@4$FRsosq8tNxg0bPML)C$l1=|AnaY0U4a>WkKb<%>3&L9wj0;-o}itB2gxC zM9hZ#MCA@q&@c#njAtgZ;{E<1c>tOsKkn|CGz(7{N9b?S5^$57+m%P69{jA)9`Xy@ z$tjPe*JP1=@H>(@Kq|o?rOyPlQR+J_teL?qLpAl!cQkRjJvPS#MN@*Rlo*eeB9c2h zK+j9c38F4asV{tE?xa*}%U8_VQjBAMg}7ilU_euhjOVjg|eo7bf^dPqg$=no8 z5vi9i8o*rxFIqL$URqat@P3OvBdowdY5J}f?#ck=V?5z?- zt@IDO{udiBaDuPp_QFJDHs#_FjQ3RdDL4foB*5L%+`^>5w}-~oDJ0Ax#wDzrH#yB; z%`&x0iAV;MW2EB9^a4~`tW~#vDdcRq-eD+11>~9~aS^ji!EgsKV5IXF2y{zjX_lL* z9kH(2)`^I@M{%JtG|r{Mos_(Pv?9_Fs}jm@e;&!S-FjZle^oUpb!eYEs^r$0Y}j(O zX;iRMHw)IXFF&Ed8f7xe{N}PN`T}>vO2|(pX?iV3T!?Az3#Sb@Wwv8vgU z=y6SI+!{|4%aW-Q+r#ltmK*+M;noQR>0QUtjl*qpR7p6e+@#xuiWJN+Qr=TR>m*MB zDg*I!ld&5DCA3c%D$6+|H*Mo%JOo9H&#sA4Q<3-mlWsq41+L^g#*QW0lFA>2CF0$*$dEc41xlR$D-*$dxnj=O ziTCYX>sOMsTwWHKsmimF^4|BK_OMS2avK*zp0a(;Fg}vFGI^bdT?^|ol`%2gHZ9NO zp$aTAuvI<-UMddq98Zp~fra7MSTLYN)AzaUso%Rs0Sd3F|J(v8nxBwz8tPyq7_9Ycc z!5qaI(+s9Nblj{0WY^FkQo2D#W%xTJXQ22034HaSMb(!WKIVFt-mpJJJqp#`8BCYs zT0@D=YTg~UjK6?b37U>#lGC9;j=fHbqbXy`oDy_o5>}q;E4NI<4f1PUmymaGjuRew z6j{1W%Bvj7G*m53dpelT-$WZqoc=&_m|u(iOVtzRNX%#mEB@IrFO!cGyPgGdl|+$2 zxM_$VKrrUQ8C31XyI25`z(zav;=yhYg10u?kc-!{+#^tjA#|bkRdL4j>RV=Akyh$A zQ%RsJ3whN_!eOUKetM@VM9x-APD&jdc8TK49^r6wm|-)7LI8~7mXh;h*38H-wnC|$ zJEmBQiQqyWD;?2E^7Nz7nq-|CK5Jsf`FsKO5B3?Xo5eNHN` zj#|Uc$VhokErpTs8al&uUZHlGVOD*y*arj{f;i)PoE)m(B|khS8#r-0RWw1I&x3no zJ2|Lq_4MTd#7qbMMYxXBUYn`P_W+wdZ$i8YiPs<-mL&6KM8}3ipn54Wba5H_b)ogD zq?RctwiW26~O^4t_cCu1jb=;O-@5Ty14$m+C}aS7evpoaRCkp@l>p*`Ia_C${Hm6mgc zGfC5sW$tX6yswC)_l-h*GEHTY#_94()b^T&XLi`-e0`KSSPiT2_Z#PzEzttV(wVwU z%iLiX&SSkG+lR1%)0AmtI2UmLxMZVDkl0zS4sbp=LDT( zAAkpCvw}>(Yo|P%VdXZw8HJs8pMP zb#pKlslRQOKN+zSL(0=(Hj5sNJ+iDF9j>bAquYqW7FoHaUX69KM7i6edIHBpQ0X=o zL4FwX8tDr4hp+#HU*J&=XX2re7&wVT(u8v9BKr|{KUy&faI34?$}qzj>KnjJb4@e{ zM{ZfZvPg;)0mBnYW5p!G&ECSxdiP=@(I5#u#KgpLa+0E~;{9*J%w7$&@^swn?XQOM z@Sr(}Pyw{tC3AFMk1dStMM{Ek7BJ=2!jz;3=d!05oPh`Lj< zr?!a@M~Hxde#`{dk#fz$t+CCsv^H^-;u*D0D>@73f_OT6kMQ##fEg+q$Ow&?;QPRZ zE>ckIMB%Zu+mMq=+jk*K?dO^qTZ^p&A7E5d+q9nUKVOiL^N&4qj7fvrN*b61GueUi zO@d3hzcyMa%d}b@ANAje68)^$L`4i16Ij))&h*g(ByXfizK`QQqX~RfJlAMcWeLqV zMv#6MHl0)lqxTySA(YyZsMd93_i~)SyKraIPa}HGMH_Z0x@c%tAqSAcK3`>=nz#4% z7jdG#@kCOdZxZ~l$NLteiCfGS$|OzqSnw+~SYzl@qP&F*8)o*6y0ccC8#QOC#VH-b zOEi&}8tVS20POmTg^mb4U7LS%930(b5`pSY(b2H_PV#uXifv|=x*U8VAN$m58F^V& zRon}TzY>xBnpegvLLZ|UevZ?EV(I+rX|L}4E=_Em$=v$M%)USgMk zUp-9gGF8FGKKqR924#NPP3frD+DhFhH#C;h0R7%QQ=cV*J5X}sI6Kc42hEoA< z>x#@8&7%MLH;6S&G-LX;{7ChP`+VgjM0{#0!LMEw#bAg_~&AmpJ7Hf`gJo{8EEk zYzOFU#=L)#%m83~tclihCyC+)cKb+Y8CrcmK6#u#7g_k6OmXFrZn(`g5E@|`ar%KH;T8U@MEf z7>8$?@ay7fDUk*gLHuyt;EUq@I*NI}5|&{kp8j}a>M^KZr!NC#EK+0Kq9679~L4HH_V|oigWAt|q zf2I6}>G*8Mg!GnO*KcPAw2juG$3u+&2;O_Id7I>wpYMFV<-%$HM!<9X$FE)4IKKa? z7sv~1n>AE6Y}B@7e}+U$dern3iZ0~`f7h@%Y_EA*>V4MRTmMeXK}6P{%Js6dU*oBE z4|!AJYPSLdg8ilk zFX*y;J{2yEOv~}IPvL-Xg_K9Ggk-Uu2um-V22E!Wym<#uyJIR16OqW~X~xX@Tfqos z2*VmeUUHMS*wQyM z{Q6ZG&nd}ECTE1aAGO_&Bo2s8`KfxIPxH? z=P8}pmfs6`cE|bK2qtCRAF{_!d#K}Wo2)5| z%^B1R4kHx=qig6jLKsKNQ)gi~^rr7Vq7T7{2((Ylp=Jn*HO2fMdh2V^uk&Thmfpvv z9emZMXPfh*Y{%G2Z{fwU%kC3V*frs{&GFHwc3lHlTJ)zsvUps_m7)j2O5j_M65K^E zn?<0!vsQiGoiI-Of1=Yb5ic4q8%Cf$?X-a(16Mk>I2v0Ym0yA4NYIhmhYDpZ6POqE zWXL_q1Pc{F_M406 zL|1b~4e}{EZpfh7>Y9VUhwBLZb!ha1iNrDE>i%?v%4vPQ0|al?bI-`iDxAgu*_A$e z5@CM^uo)RDdd^g0kitchpe#P43r%?cfo+_@}9T{I_iBW&%t{f zkkhkQQ8%V)Psc~gs$ukkPEI#Rb($WTs-e6`rUt2Z*C9I@RQz z8Zt2N9Pp9mGShv-rI|62+g0Epxuz2ES`y6!A(Pmj(E& zD{av@(#c!Tq31LmbS#g3Qa{P(_Ubi7lTj+!4rOGm1`0OPJ~51CVDtK;gQw34AF!FH z89{X~2nwRG!JL*nS_wgJv5__kRf1ll{~@v~V({V<$H%2Ck^ezBhI+b{s48=`YCQ0^ z6oYP%w{1zVR%{}oImd9eU`k!~QKW9?G?}Lbp0D(C{G6 z&7Dhi9kEzj$~qdjR_m0&U%d=8hu7uwwVGNv0IMr65m)!!=O>D0%^AGF+or90>?@8* z(VZSo?AIVv zZ%E$De=E3y?$yQHK2wdTvH`DyYk&J+P@fwzO{La&+y>2;SSI0)Vq4Ddv!F>{qM|1N^M zC@3h6+0q#m$z1V5SPmEhA{`0`+>|C*ecNnuK(G4BMHJ+{M_~efwcDjHOgZpRx)mGa z!cRuWrA)?ifISDm+T{R5guUvMP9=eu4hyt$==aW$tlYC{cLOZJUCS}^JDW?KdHouI z$(b{Wb4v>e#8Yr6+AVP4h81O@4{z z<*bujct#+ClM_0r@x4I-JBQ>6{FzqFgiW6*@HrE4TVA~v zHZ6iyrsu*%p)b#~$mSN_4*#2VDwQVX_agNQ9xiDGjMau>?su3Uu~8!TBJabL4{z}w z8#~igNmC!_;pa=DTVHLcsa8AVF7kXZU&dN;tR609|5=?mEqwS7N@kkEgwm-|Bj;<& zg|Y;-qB|=8N^cW!r@-~UL|RIUCf1gjZoLdpBOy)d1Kxxmx!GS$c5hJuPMnWTO$R}P zXL?iZ5?^NNT9k^FlOm%v@ll>^EsN2XEMCrmmu~#I9nq-bNw49yv>2D%@!jePv9U`Z zxnK}~->4?b-8bC1ImO?U4#G;_Q#roA=Fz-$%&)9Aj^Z8yhr=zgxnE5dx5!=W&@>;h z{u&Bt;g9r7aPqN=2?g=RA@?5V`Wl!<>#rx`4BzX9bm zGM6rq6`k8%Ev42(4~3j?=~Oakelo${j?au_G@Mhfn}O8qhjpp$A`@Opb@V}R!QxW1 zgi##U&DPqOejOX)H3{cwq=mebsfM|Jjh6(89I@V|xxO`L>N&<9@QzBHORX1ve+Cot zfrWEw%D`UF!CDo!6PTy?GN;9CGXx8%`jUULs>W^r@o_=}#v_fB6kUF!wC= zpL->`i^dFt2oDJRC+my|N534Da9gL{_$OT@`ky(5o_GP>)32DXAGr>!Dk3^2xNst& z^dZ|j3r3kj6rYFiPWfvrcGCGJp)N&E2%gd3Ln<*g_3 zn_JVAli-=oQfcSd-?C@&OkI!(CRclF@xK(8<1uep`wgMe?i_q@*SQf>s7cj{a zFq(ljm8^#SS-(zF%@h9U+fiiZfL+cOrDf6ws?W(mD1V{^(cH_8kucsiS5-L6U?(+p z@RAnJTRV*vb2LZr{?0g7J}O&V9eQA(NJTnFc_pTq72C zd*?Vj-B8|8%T~!W8s!q}Tl>Yp+u^DQR~YO}%~Hh{JrXwjC#$;>ACS>j%kL>5XKwmS zfHxuX{UQse0Tth5UcCSb32ch0MobW6#B)fE#-gua%~IqqNoyof{w;$>f~@oEdgE7d1NRx$ZgR{l7OD6 zLl@7tQb{I)RFYNQ9hJ{#R7#MWrK>tu!N5zL)YmL>t&~_nzTKXSGjb3C00wd^VPUG0doYVg!jie6tX8pR3F#pM3Z7q=&S_7pL4UWL2GH2#u*^Umh zGqwV`aEhT(E+_7_fJ}R>H4hKOMpH<^ZXeM(dbC zsKSK1)U14TxUO~*AMQzrO_g9}>QtWZ}I3Fm@< zGUd&eu~?8UtFD*`7dSAPA8`lIrtN0vT&5))^NIwIGo^8K3o@)#walv;7a>-Q(QxOL zq=8?G(*rDO1&NdIy1dfCUA!o3NJ-6PjE&KQ?mGJ+b(hwIRCb^Ynn4wsg1nM~yH|*? z-qj$0r{NA8DVW&tN*@qWJzqYssa(O9W`d55ChaRP5Vu3ipmp#;a@P+t+gC}BcWcr( zip|sdNYk+H3j8&rX~x^(xH9smS|46elb@5ZTe;I!rcW-sehA{7PXXikfJQiNVr!&? zW8u1f+2lCouFIMd8P@ahrX#d znx^SuSgo5n_Ij=$O|I{3j^5pjThCm>V_*<%qNCWEw%=`x8oP~{Mx)Z zeS;Q1wp6-ZTvSv1BiCJIeTNIJLBIT8Z2-Tk`sdUCkJ^CV(0&W51VQyF%HGg-d0l^4 zC|DcNh+qF^$@+?fksPhu1;KhJk&fR#zmm@i*HO;i_Ud)rD`2{YP1;C%!WNVT0MU%; zl_H*OsqUz>U9pQE$i+Uy54)d-9DOAiXO)$Elpd3FrR99HXp)!u#@7ZEI7{t{!F_Hrfg=+2v!{uw74PpL`#}~E)Tpov2?Pf@))k|I zgaG~+crBuZt;X&ZaO)Bk*j)hCFi)9KxFEyaV0%F>i^fRQCl273X)vEpj*b20eH>^V zK}aACq1zmf`%SedeaX2d0E(vS(9my0e{q~urT+<%rqd!Iv6?6O*Ho1Jmn&swHK6B= zZ9{G}B1|(?$(7IYh?&TdWAFiCt#r2`bCs!-XrF6t*2L*WASXAMCm*lYZ5`r+7E4C% z9YRO4YC`?)w>O|IvcB8 zhS!m=+IiQTe^Y6?x*QndxWF-xwr)TL9fYPCol;vwFx-I>KA;GL19JhPDW<-~R4@3U zTC@+bgn+KpHkG&+R`$GmgUMq1SK4z@l-8kSTO?*!vEb{1qdmuQ>bv`~{e8cc^&cp| z?9jv-X%bPvY8O`5%byt!XWB+tCVi%S7H9u(ZZhwVq(D6#_9NyFtbbYdUsinKz>oI$ zhU|)lUwnS6s&|N#zNRwY2{U91Nm9R3&Iab}MD%47Rac(?xsXjC`_J*zQDRia<3Tez zcfHXFnSAzsa~g$(Dky-oIsO_H?Tm@N`)rf7vr06_y?$!#T@m4RLm{VgWdmMQ!D%w-PR&*!WSx zn^&rTS*Nmx;+Kx!ni#iQ7E0^Y=$Tho>m____yG*YMk!NF?Q%s|hY#cpUFp2RS(vEa zaaTB;x?)=Ba0!jE>?cazwzuLuTH?B6K`Io&9T$!C zX!Je)#tDdn7D&RKe=a2dKaIV0P*ndLw=aT(GzyDS5=uz75=*Cm2+}PQQqr-&N;gX= zEl76>N-Zqih;*|80@9tk>^?_7-}%k_{(0t^Ie##3cGw-}ocDdseP7pWQG52Cx4BqZ z26}5b#SQ9!F2;eO)%|>uxK}67@?JiS&Q;+r)wkBM^2n&LyM4#y6aRnxE&JSB1!>CM zY#EM+d>sYfUuZ;)*{faNd6FYwM-MMnOgnu;kv}1)y5S%H?)4pND0?VScJkwO6?Mo! zrqBE=NT~j{hqaXl1wLy@vTj;b0XM|}>$R;yp!`y_SeBahhf0K7s!Tkka)wa0R#FDf z3gv$dUOM}19fs$`-$H>_ROSR-JSCeEf2P({YzOCye^UdP-GFX-oQRV!ob+D>1!e>S zD_@_TmXrl?0=x3xXRWb}DF1C|iIVrvnE&1`3*?a|voL|)5RNqh_?xrX0U5juR|(p&)*0{2u|fhr~INapn` zy!V$|{QQ51^3Pa$*HuDOv^xlJudV-0+EQ5sL))Tbx2070C3rg6%<+2~8547VH+@k- z$?3lgiGA?z*6vOeNk>;W3!F#-pXYa`CjY?W&zFrXl)0j21{U+v>rm8jF%y2S>9D9v z(FuEba-GfBbde$UA80-9*#{0An6vO3>1XG^c#C$=z&3oy9AVJTmK8=rsKqXYa&`w1 zxM|5Pk0KsT$1d!6wmQd0U)hM#wg1L=9~~Fx1fsWo@COLpV`zfD__|X` z>%7qK@vr6GZaDMMV;arq>-l=sS7cZj^9?$mY*l;Yl3jJFK-_J1vD#5aAm```jx zbw1;>&<)mPuiHq+9<=y1Xa7J-uH_t{^|AxYb-y?S$zgJYuaeS%jd^BM&Xl9F9Q(I+Sy^)O1VS^93Cd9;0d818Kl;M&niu(pZr zvzbVK-U*AX-g(<-ixaq7Y4P}JjK(hTRi#)7;#~AoxR01=4s~@~z)Fy$-?q!)X$bZ@ z`8*IYGh{{0yYoOC^O75sowo%iWTLw^&2O1lM(hCC6_Da+6XT8ZoR2ppW@4*?2v+eJ zQ*v3)@St1^_2pFCP|!B<3r*kzQH`d7)I~nCoQ3%m&`;0F5Sy6tGvsTDET}F%*%~D8 zT0QF#Y>&=4Ud-Zkz&4Ex_}v><%=ByH(xf?=*vcIFdZU=#X5qzui_^A{VM?6m6}d-e z3gaKGksd3NvjeD4TR>*Q;C1h4LyhWn1kD$76TB><{TM$}5Y+dqkZFAjHDN6XsVEFjKU3i472Cg{#{!MNdURAFYtW5@LQu+5$6=5&u{HOXf!%&`z!K ziR*#~Uknb%+^0~*2K0<;()U}8DJ7SM)-Xhjd{>^uctbqFL#;%N;6pexxX+k(k+b7n zjD@ty;jQx{iv`pssAY7S5+S$vE{c}V$sbDsn{jJiaN5^X52YiOZ1fJMbp7eAUbAFn za4=MJ|BA2EZPC=Xf#hU?o9gw8k;@Vlr?F~pSH=k4oL%*B+pS{? zw@3Vry3IFl2%sIKhDUp4200q~+IA+(#idB$A;U+P-h9qCdy*3|d1R!9@^AF8KL);* zcG1n;x{q*nb>CY;Vr(f(W2J1RIEQRJYtyvy&`n;2s_ug2$s46NCplI6m~SyQ()Jtd zI+wY`FYZJ*m7d3oZ1#;eie1q@ z2`4bnefydQ_G5ZyC;0oF(AU<)d{#TjLg1I^*ffnzPYFjjM~>F^I@=YmcbK1>3k~8s z1(Z(agNeNo1w58F$qFRZFZOE7MUlN6vBx+*eRo!BwG%wWgZyBgJ3WFr+xyZQ^Z>?nFBkoAvYTZVs8RD*UE-;ytjMb)$cS38=HS9gFBO($_NxH0Ki? z8hWlb<8QK*Z$pydDo9-<$6dD<{~>RC{A{CdD$4xkM(&^~&2e>2Qk7}P^}OIvqEA&Q zGi;PQQwPzQMSbSClx6M{+|l#QM?VcI+v(NWdG}PZ!U1EIdI5fCny?oP;-v=-ila6$ zf<3l@Qdw1CfAi6H=yX3U5qRl{4voO26o!D+#mg+1{NtT<5cNdH4I{WPj(Ci|=1h*Ed{(f5PSK&x#%{VNF!x4y` z;i&WKoAZ=$!MfMqhw25LlNIEe5m+tx_u^+hTeCd@@c{55ooVl!Y;ivK9F56gCrbx z(mOTFpOwDB@2o5^_+VUirPIhz|K+-r6%RPf!j?^V-A-Dbgp<*|m_I%HOv) zq@ETDQ))EXBawz~vL~q)QB7WMQWngdhdrg3S&q7>mmuG-xp)C~{xhwH>=|7ej@V}} zeA3F4szil+N&K5MpZVyh(tOlU5pBz_IWDvYTyBi7qfYM0OQ3jW3B~{ z5p=0F8a=Z6R+F;M$M2dN?cg|z6})^*OuUDF@XD&e6_j+fSS8|c|Ndc!=O>uwdi5+m zj5`JFyJ{P#^TyajGI&|*O+zy=>K)!FA9D(aREU?xC83;eF^vVS{Q)}qVv*Q}kFX)G z4Th^^@?`k$2TgO_{B2ZrJin1Q2ZAX9da~vP1>FN$!c9+5@ zo_#GA=W(|RS7&?JYtZ3Y10C)1qWx77-Q(L&pZ2RFt^ACKd#dHhaLC)k=O6nVye@qi zezazaNzg6k!vd<7D0c%4?lRSx)TqnSTHO}tt~woTsH33dj|ti|9_5NDrVs6kU(Zq! zr2CqMFwSDDhUAUP6Fv%2g4AYR>ob!2i;TSOL$P>mVjvEG7IMwML;skW$9-tHAY#1F zvy@uxvD60*PMCqyT%hmGSNqe8G|Zq4I3}_1A5ju!fz*2VJ?lRf9hD2sM!fbfK-g6C z>4~}MLI;m>U4q|ZQ|$8tl?|lR?i2#_S`IiI(0?)b_~K+qs-h z)ngFM%gn)ha2f#($*gxz{X7E|Ug-K3@J)(dTkHmBi)$pIJ{+yHR%z<~U!Da3)_TVWvXBO_;;F&X&y1;BRC~pEr zU#%}XV3*ewccu^n>(z3LNyv?DMq`(67)6{Jyn$kypCBn4B&g_y1$Q z_*$&d3oKqEmR;5QIV)^Ucggxh+-aKK_RRu;*!tcD4E7;%IbNFr-mF8B=H!tR_kwxq z5N=p!O$1#7l~!t07}xpPoV^pWJ=yAnLC(88j{IDYmFwamS`FyEH`x&_5$Y9W9-l>x zEYLeY+b*_8ml<8QPwJiPQz0H#?^^gvGxxzQ4Sz%%KgTpoTouhQ3Nua%ykT`arpymg zcV+iRj(Si&?31NkEqh42D$|~0)lAPbeL0%)8j0bJCz&Z2Dw|1@{$gl71u2+X5gH-O zET?|H$vg+oH>p%xlGGo{XF51^$C4o3<%(OWJN6H+CL^BAF1lM1x}L<&-IBg2yTi!p zMfa%0sK)$NKzrb2=vl~##4`0}{L{=un<#$oggwan@b#O0xAn>t!Yi#Bd|1QUqjLH> zTg_Giu$likaFgeK7KKh(zDGyKyudoTV*9khZDX$KSO~QnS_Bjfd z1zRHOuWU6+FA#zrkNs6jq5n!k#K-IZjx8LW8m3p<|G%T6{Qvv)|NRH3^kz5kng1V- zfN9RN4HY;45;Ry#EdbTR{dMe-wpuH}W68OGyb{!lQkaTox@X8-(3*9@j<>(czovZ_z{1)@@JyIbXRv%-VrA-OTVfI{iSiv<7ilP3ev^c^$ zL8Mjxb)+#5rQSM%(AX0ZH|dh0iwvGIywG+Lu#(_MPVwq5@s~^Ijv{sIX5lj=dxTr5 zD-oJ!Sh2z>R74f+4CE8IWupF?CPC`OD^%S0_PyH$QW|M`OhH8P_fZA*XG9O(Xth1c z#H#Sdw^=n=YYM3kSSqFEO2o&L=%r{m!XNoR$XTAI{5_kv0HuAqW3+XTwzhrR3C>`z z52Liwtoz!1{RzJlYu4tXi4JaC9Gu_#0fR-$431H&Dr@C zZ-8KC-HAgYe@=#;iueH-5B8V$GC$Lc~SR+C2qekq!_|h;M zb1d2_Mij)nIU&ZQglG{t0!1*_WM_*h8Zv%*{4~s%^wv~=?Ule6WFJb5p=)%(wB~Ta zpSo|gw88L4#!2&~u#YsBQ7S2ikvec)hmjsj$RFzTm7u1_=4NdRHWY=d4_5VFM_Tt> zFofaS#hhHr3)94BT3GUcl1Ef)9^m)#OyBuVa5-~}1B)vPV(w)nxub`!X?%D$Eawk% zisuzhI0ulIEVc8hbM63iMm_FhbhETNA~v#{CxY8{wUIflHTQ~vdO(dRbEur3M9;w` zSr~Dth+eqb%DWU{qh|AL_lacj$-D+C}s2bn&Y7AgR{koX2YdIx#=Vd?I$D)lBq_B6~QaVWdJls<+d+ zIl6~bMx6S4;MkMUbm!{V}bPhn@fjFZ0bo} zg0lzFmxaj|Rbf-pBI0nz4k%xn)SjBBj}a3Hc}aSbXXXc4RL89zMn8W@R+QT_AQ)B| z?dIFRj)nYaJAQJ&bR>@y+gU%g{>DRukAxQ){aCmlAdXgu{3Q3)_fD-;tF=pp?^+HW z${mHQ?ou@#vPpBbd{@|KP@qM#!tYGYbOkpgnA!!?@$O^sEy~k+^)y?^9jT{jmpeDa z`hO%X9A&UM9*q^@cE*&)71P-!_rO*AzPc0-ofT#GEW-S5bB2F-f6&nY>YNEIV4#L` zue7|8QiC9GUccl#nj*s?Y`_;;Zja$y}q(Jy5H}w84v@+bJQb zE+LkFC;=-Gw?^<8M3?Bt+x=MU>3g^+&z6xmkZ?CUtkdydh?pd&fk z5&VtsR1omahd_dplOAqsHa6Ve%)XWcEnehuHUq3Ga83K7{E<+%{6`dim;$lG`d+&Y z4S4Ey^Za5fwcpWk3z_YO-{utFrqhSo3pgo1Iyq2+a1Dipz{>xHRf(9Us~4CF~JrL-z3r(Xe~D@eUZ{v5lG+ znL#+t=gV$NSMx`L`+>K;lJC%>s;S=a!$p0BjOkHR=&6XabaNYh_Mt5R)$pF@4q2gp zk^0_?%5moNS_Docgf4(K(jKQJ12uGG@vNc+C(AoAv9cpMOWZ!R?<(~c2EBHnsL~Rd z&F?~2l`n8$D`O=x8?2nuP0?_l_q;y9_Dncbs!DW-TuXCpX0?Rjk_T1&{muObXk3`` z!a@jwZMJ4>51c{XW4pN(@csB2l%$KZiy>yTk>t)~uLK0@+84&iWi$EPkOJ2Q=Gux@ zL+U^1D>aj9GBDTfa+zh0HYK`^VGS3-ad*EGmK)K}@aRImfGB)7xh{>b34X;<>THp= zWbqMQlLjV=?akla6hf3c@y-hfeje>iG?aK0FYSBN0Zw%PK3ic3^YJFM(8F(?}%!%fHoJ6^~+(sZ(`ZtOHe9fKRYweP6$Zu?5fOXgL)x0s$?Mazp#w8%Y||xX z2zzGN_6+Qtk^?&9lDUKsuk7SV9zRXxiKz~}Zk)ZndLSmn!+3VE<sa86K z{WNTFbPX!qiVn*;|K;6&@!|Yt9hcY^g=y*f)mazVdZPe~?vbQ#h;X2G6)_(U9yCFf zQVM&qXLR!a!E#qqpxH4DVt;sLrBU^lO!}#pOkvQpl~rRGv*o8GKVrr@rUQdb9VIJM z%{BB};j!2y=4-2^`#YHDJFb1}WyZ15$^u1s8kh*XD{G7=3v%l)svq zgPno#xCHWgVb-hoFSrOt2a2L>iMNI@TNR?q7JlQ~rTgV)_Ok+Ap!W*BIh6agH}d1U zW(XJPZ)@*CC*IDhURE%bbim5y!YE(0MtP+JH59e6uEj@;-HbAyi&nM|??u3%l?)M3 zuJ|ha;Z!i3WBLFaxRGP<#Tk{iG{n@jkK|)ghu~I≫rYIj(DywmBeV0P3az40?Wv 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