From 9675c3a14869589e18129aec778bcb43ca884264 Mon Sep 17 00:00:00 2001
From: siddath <18748473+siddath@users.noreply.github.com>
Date: Sun, 6 Sep 2026 16:32:40 +0530
Subject: [PATCH] Separate curriculum from the public study shell
---
CHANGELOG.md | 29 +-
CONTRIBUTING.md | 2 +-
PACKS.md | 4 +-
PRIVACY.md | 8 +-
README.md | 38 +-
app.js | 2 +-
docs/AI_ROUTE.md | 38 -
docs/ARCHITECTURE.md | 4 +-
docs/CONTENT_PIPELINE.md | 46 +
docs/STUDY_TRACKS.md | 38 -
docs/TESTING.md | 4 +-
docs/screenshots/README.md | 17 +-
docs/screenshots/ai-route.jpg | Bin 72340 -> 0 bytes
docs/screenshots/focus.jpg | Bin 54029 -> 0 bytes
docs/screenshots/historical-images.json | 18 +
docs/screenshots/import.jpg | Bin 0 -> 56116 bytes
docs/screenshots/notebook.jpg | Bin 67637 -> 0 bytes
docs/screenshots/practice.jpg | Bin 58045 -> 0 bytes
docs/screenshots/reviewed-images.json | 18 +-
docs/screenshots/sample.jpg | Bin 0 -> 48726 bytes
docs/screenshots/shelf.jpg | Bin 64273 -> 0 bytes
.../engineering/ai-advanced-rag/README.md | 141 -
.../ai-advanced-rag/advanced_rag.py | 32 -
.../ai-advanced-rag/benchmark-template.json | 11 -
.../ai-advanced-rag/fixtures/corpus.json | 42 -
.../ai-advanced-rag/fixtures/heldout.json | 38 -
.../ai-advanced-rag/test_advanced_rag.py | 65 -
.../engineering/ai-context-evals/README.md | 97 -
.../engineering/ai-context-evals/evaluate.py | 41 -
.../fixtures/eval_cases.jsonl | 6 -
.../ai-context-evals/judge-rubric.md | 23 -
.../ai-context-evals/results-template.md | 31 -
materials/engineering/ai-gateway/README.md | 26 -
.../engineering/ai-gateway/fake-provider.mjs | 23 -
.../fixtures/provider-responses.json | 21 -
materials/engineering/ai-gateway/gateway.mjs | 14 -
.../engineering/ai-gateway/gateway.test.mjs | 31 -
.../engineering/ai-llm-foundations/README.md | 162 -
.../ai-llm-foundations/fixtures/prompts.json | 11 -
.../ai-llm-foundations/foundations.py | 26 -
.../ai-llm-foundations/test_foundations.py | 76 -
.../engineering/ai-multi-agent/README.md | 102 -
.../ai-multi-agent/fixtures/corpus.json | 26 -
.../engineering/ai-multi-agent/pipeline.py | 91 -
.../ai-production-capstone/README.md | 123 -
.../fixtures/requests.json | 34 -
.../ai-production-capstone/service.py | 52 -
.../templates/ADR-000-template.md | 36 -
.../templates/architecture-review.md | 23 -
.../templates/demo-script-template.md | 34 -
.../templates/eval-results-template.md | 23 -
.../templates/operations-template.md | 35 -
.../ai-rag-architectures/README.md | 169 -
.../comparison-template.json | 10 -
.../ai-rag-architectures/fixtures/corpus.json | 72 -
.../fixtures/eval_questions.json | 44 -
.../ai-rag-architectures/graph_rag.py | 37 -
.../ai-rag-architectures/schema.cypher.todo | 8 -
.../ai-rag-architectures/test_graph_rag.py | 62 -
.../engineering/ai-rag-foundations/README.md | 151 -
.../ai-rag-foundations/fixtures/corpus.json | 38 -
.../fixtures/eval_questions.json | 50 -
.../ai-rag-foundations/rag_pipeline.py | 37 -
.../ai-rag-foundations/test_rag_pipeline.py | 58 -
.../engineering/ai-single-agent/README.md | 99 -
.../ai-single-agent/fixtures/catalog.json | 26 -
.../engineering/ai-single-agent/starter.py | 64 -
.../engineering/customer-discovery/README.md | 20 -
.../customer-discovery/acceptance.md | 13 -
.../customer-discovery/demo-communication.md | 17 -
.../customer-discovery/discovery.md | 13 -
.../customer-discovery/operator-brief.md | 19 -
.../dsa-patterns/BipartiteGraph.java | 8 -
.../dsa-patterns/ClosedIslands.java | 8 -
.../dsa-patterns/DailyTemperatures.java | 7 -
.../dsa-patterns/DsaPatternsTest.java | 54 -
.../dsa-patterns/LongestSubstring.java | 7 -
.../dsa-patterns/MinCostConnectPoints.java | 7 -
materials/engineering/dsa-patterns/README.md | 26 -
.../dsa-patterns/SlidingWindowMaximum.java | 7 -
.../dsa-patterns/SubarraySumEqualsK.java | 7 -
.../engineering/dsa-patterns/TwoSum.java | 7 -
.../dsa-patterns/TwoSumSorted.java | 8 -
materials/engineering/dsa-prefix/README.md | 26 -
.../engineering/dsa-prefix/SubarraySum.java | 15 -
.../dsa-prefix/SubarraySumTest.java | 37 -
materials/engineering/fde-adoption/README.md | 29 -
.../engineering/fde-adoption/adoption.json | 22 -
.../engineering/fde-adoption/measure.mjs | 30 -
.../engineering/fde-adoption/measure.test.mjs | 32 -
.../engineering/fde-adoption/value-review.md | 18 -
materials/engineering/fde-capstone/README.md | 34 -
materials/engineering/fde-crm-sync/README.md | 54 -
.../engineering/fde-crm-sync/connector.py | 15 -
.../fde-crm-sync/signature-fixture.json | 8 -
.../fde-crm-sync/test_connector.py | 109 -
.../engineering/fde-customer-docs/README.md | 35 -
.../engineering/fde-customer-docs/handover.md | 18 -
.../fde-customer-docs/openapi.json | 9 -
.../engineering/fde-customer-docs/runbook.md | 15 -
.../fde-customer-docs/walkthrough.md | 15 -
.../fde-environments/Dockerfile.todo | 7 -
.../engineering/fde-environments/README.md | 40 -
.../fde-environments/chart/Chart.yaml | 5 -
.../chart/templates/workload.yaml | 2 -
.../fde-environments/chart/values.yaml | 8 -
.../fde-environments/delivery-receipt.md | 18 -
.../fde-environments/pipeline.yaml.example | 16 -
materials/engineering/fde-identity/README.md | 36 -
.../engineering/fde-identity/fixtures.json | 24 -
.../engineering/fde-identity/identity.py | 6 -
.../fde-identity/protocol-review.md | 20 -
.../engineering/fde-identity/test_identity.py | 42 -
.../fde-incident-delivery/README.md | 29 -
.../fde-incident-delivery/customer-updates.md | 12 -
.../fde-incident-delivery/incident.json | 13 -
.../fde-incident-delivery/postmortem.md | 18 -
.../fde-incident-delivery/timeline.md | 15 -
.../engineering/fde-observability/README.md | 30 -
.../engineering/fde-observability/analyze.mjs | 14 -
.../fde-observability/analyze.test.mjs | 17 -
.../fde-observability/panels-and-alerts.md | 15 -
.../fde-observability/telemetry.json | 11 -
.../fde-permissioned-rag/README.md | 56 -
.../fde-permissioned-rag/eval-card.md | 27 -
.../fde-permissioned-rag/fixtures.json | 14 -
.../engineering/fde-permissioned-rag/rag.py | 9 -
.../fde-permissioned-rag/test_rag.py | 65 -
materials/engineering/fde-portfolio/README.md | 31 -
.../engineering/fde-portfolio/case-study.md | 18 -
.../fde-portfolio/implementation-guide.md | 18 -
.../fde-portfolio/release-allowlist.txt | 4 -
.../engineering/fde-python-api/README.md | 62 -
.../engineering/fde-python-api/starter.py | 11 -
.../engineering/fde-python-api/test_core.py | 79 -
.../engineering/fde-python-api/test_http.py | 32 -
materials/engineering/fde-python-api/web.py | 6 -
.../fde-security-controls/README.md | 54 -
.../fde-security-controls/control-evidence.md | 29 -
.../fde-security-controls/controls.py | 5 -
.../fde-security-controls/test_controls.py | 27 -
.../fde-tenant-isolation/README.md | 49 -
.../fde-tenant-isolation/schema.sql | 6 -
.../fde-tenant-isolation/verify.sql | 64 -
materials/engineering/job-api/README.md | 24 -
materials/engineering/job-api/contract.md | 23 -
materials/engineering/job-api/job-service.mjs | 13 -
.../engineering/job-api/job-service.test.mjs | 37 -
.../engineering/kafka-consumer-lag/README.md | 27 -
.../kafka-consumer-lag/diagnosis.md | 10 -
.../engineering/kafka-consumer-lag/lag.mjs | 4 -
.../kafka-consumer-lag/lag.test.mjs | 14 -
.../kafka-consumer-lag/snapshots.json | 16 -
.../engineering/migration-design/README.md | 22 -
.../engineering/migration-design/design.md | 19 -
.../migration-design/incident.json | 18 -
.../requirements-checklist.json | 10 -
.../migration-design/validate-design.mjs | 27 -
materials/engineering/operator-ui/README.md | 23 -
materials/engineering/operator-ui/index.html | 28 -
materials/engineering/operator-ui/jobs.json | 33 -
.../operator-ui/manual-test-checklist.md | 18 -
materials/engineering/operator-ui/rubric.md | 15 -
package.json | 24 +-
packs-ui.js | 18 +-
packs/engineering-v1.json | 2562 ------------
packs/engineering.json | 3660 -----------------
packs/starter.json | 155 +-
public-assets.mjs | 2 +-
scripts/audit-publication.mjs | 4 +-
scripts/build-pack.mjs | 19 +
scripts/validate-pack.mjs | 12 +
tests/ai-route.test.mjs | 66 -
tests/content-boundary.test.mjs | 57 +
tests/engine.test.mjs | 26 +-
tests/engineering-pack.test.mjs | 125 -
tests/notebook.test.mjs | 10 +-
tests/pack-engine.test.mjs | 86 +-
tests/publication.test.mjs | 4 +-
179 files changed, 339 insertions(+), 11372 deletions(-)
delete mode 100644 docs/AI_ROUTE.md
create mode 100644 docs/CONTENT_PIPELINE.md
delete mode 100644 docs/STUDY_TRACKS.md
delete mode 100644 docs/screenshots/ai-route.jpg
delete mode 100644 docs/screenshots/focus.jpg
create mode 100644 docs/screenshots/historical-images.json
create mode 100644 docs/screenshots/import.jpg
delete mode 100644 docs/screenshots/notebook.jpg
delete mode 100644 docs/screenshots/practice.jpg
create mode 100644 docs/screenshots/sample.jpg
delete mode 100644 docs/screenshots/shelf.jpg
delete mode 100644 materials/engineering/ai-advanced-rag/README.md
delete mode 100644 materials/engineering/ai-advanced-rag/advanced_rag.py
delete mode 100644 materials/engineering/ai-advanced-rag/benchmark-template.json
delete mode 100644 materials/engineering/ai-advanced-rag/fixtures/corpus.json
delete mode 100644 materials/engineering/ai-advanced-rag/fixtures/heldout.json
delete mode 100644 materials/engineering/ai-advanced-rag/test_advanced_rag.py
delete mode 100644 materials/engineering/ai-context-evals/README.md
delete mode 100644 materials/engineering/ai-context-evals/evaluate.py
delete mode 100644 materials/engineering/ai-context-evals/fixtures/eval_cases.jsonl
delete mode 100644 materials/engineering/ai-context-evals/judge-rubric.md
delete mode 100644 materials/engineering/ai-context-evals/results-template.md
delete mode 100644 materials/engineering/ai-gateway/README.md
delete mode 100644 materials/engineering/ai-gateway/fake-provider.mjs
delete mode 100644 materials/engineering/ai-gateway/fixtures/provider-responses.json
delete mode 100644 materials/engineering/ai-gateway/gateway.mjs
delete mode 100644 materials/engineering/ai-gateway/gateway.test.mjs
delete mode 100644 materials/engineering/ai-llm-foundations/README.md
delete mode 100644 materials/engineering/ai-llm-foundations/fixtures/prompts.json
delete mode 100644 materials/engineering/ai-llm-foundations/foundations.py
delete mode 100644 materials/engineering/ai-llm-foundations/test_foundations.py
delete mode 100644 materials/engineering/ai-multi-agent/README.md
delete mode 100644 materials/engineering/ai-multi-agent/fixtures/corpus.json
delete mode 100644 materials/engineering/ai-multi-agent/pipeline.py
delete mode 100644 materials/engineering/ai-production-capstone/README.md
delete mode 100644 materials/engineering/ai-production-capstone/fixtures/requests.json
delete mode 100644 materials/engineering/ai-production-capstone/service.py
delete mode 100644 materials/engineering/ai-production-capstone/templates/ADR-000-template.md
delete mode 100644 materials/engineering/ai-production-capstone/templates/architecture-review.md
delete mode 100644 materials/engineering/ai-production-capstone/templates/demo-script-template.md
delete mode 100644 materials/engineering/ai-production-capstone/templates/eval-results-template.md
delete mode 100644 materials/engineering/ai-production-capstone/templates/operations-template.md
delete mode 100644 materials/engineering/ai-rag-architectures/README.md
delete mode 100644 materials/engineering/ai-rag-architectures/comparison-template.json
delete mode 100644 materials/engineering/ai-rag-architectures/fixtures/corpus.json
delete mode 100644 materials/engineering/ai-rag-architectures/fixtures/eval_questions.json
delete mode 100644 materials/engineering/ai-rag-architectures/graph_rag.py
delete mode 100644 materials/engineering/ai-rag-architectures/schema.cypher.todo
delete mode 100644 materials/engineering/ai-rag-architectures/test_graph_rag.py
delete mode 100644 materials/engineering/ai-rag-foundations/README.md
delete mode 100644 materials/engineering/ai-rag-foundations/fixtures/corpus.json
delete mode 100644 materials/engineering/ai-rag-foundations/fixtures/eval_questions.json
delete mode 100644 materials/engineering/ai-rag-foundations/rag_pipeline.py
delete mode 100644 materials/engineering/ai-rag-foundations/test_rag_pipeline.py
delete mode 100644 materials/engineering/ai-single-agent/README.md
delete mode 100644 materials/engineering/ai-single-agent/fixtures/catalog.json
delete mode 100644 materials/engineering/ai-single-agent/starter.py
delete mode 100644 materials/engineering/customer-discovery/README.md
delete mode 100644 materials/engineering/customer-discovery/acceptance.md
delete mode 100644 materials/engineering/customer-discovery/demo-communication.md
delete mode 100644 materials/engineering/customer-discovery/discovery.md
delete mode 100644 materials/engineering/customer-discovery/operator-brief.md
delete mode 100644 materials/engineering/dsa-patterns/BipartiteGraph.java
delete mode 100644 materials/engineering/dsa-patterns/ClosedIslands.java
delete mode 100644 materials/engineering/dsa-patterns/DailyTemperatures.java
delete mode 100644 materials/engineering/dsa-patterns/DsaPatternsTest.java
delete mode 100644 materials/engineering/dsa-patterns/LongestSubstring.java
delete mode 100644 materials/engineering/dsa-patterns/MinCostConnectPoints.java
delete mode 100644 materials/engineering/dsa-patterns/README.md
delete mode 100644 materials/engineering/dsa-patterns/SlidingWindowMaximum.java
delete mode 100644 materials/engineering/dsa-patterns/SubarraySumEqualsK.java
delete mode 100644 materials/engineering/dsa-patterns/TwoSum.java
delete mode 100644 materials/engineering/dsa-patterns/TwoSumSorted.java
delete mode 100644 materials/engineering/dsa-prefix/README.md
delete mode 100644 materials/engineering/dsa-prefix/SubarraySum.java
delete mode 100644 materials/engineering/dsa-prefix/SubarraySumTest.java
delete mode 100644 materials/engineering/fde-adoption/README.md
delete mode 100644 materials/engineering/fde-adoption/adoption.json
delete mode 100644 materials/engineering/fde-adoption/measure.mjs
delete mode 100644 materials/engineering/fde-adoption/measure.test.mjs
delete mode 100644 materials/engineering/fde-adoption/value-review.md
delete mode 100644 materials/engineering/fde-capstone/README.md
delete mode 100644 materials/engineering/fde-crm-sync/README.md
delete mode 100644 materials/engineering/fde-crm-sync/connector.py
delete mode 100644 materials/engineering/fde-crm-sync/signature-fixture.json
delete mode 100644 materials/engineering/fde-crm-sync/test_connector.py
delete mode 100644 materials/engineering/fde-customer-docs/README.md
delete mode 100644 materials/engineering/fde-customer-docs/handover.md
delete mode 100644 materials/engineering/fde-customer-docs/openapi.json
delete mode 100644 materials/engineering/fde-customer-docs/runbook.md
delete mode 100644 materials/engineering/fde-customer-docs/walkthrough.md
delete mode 100644 materials/engineering/fde-environments/Dockerfile.todo
delete mode 100644 materials/engineering/fde-environments/README.md
delete mode 100644 materials/engineering/fde-environments/chart/Chart.yaml
delete mode 100644 materials/engineering/fde-environments/chart/templates/workload.yaml
delete mode 100644 materials/engineering/fde-environments/chart/values.yaml
delete mode 100644 materials/engineering/fde-environments/delivery-receipt.md
delete mode 100644 materials/engineering/fde-environments/pipeline.yaml.example
delete mode 100644 materials/engineering/fde-identity/README.md
delete mode 100644 materials/engineering/fde-identity/fixtures.json
delete mode 100644 materials/engineering/fde-identity/identity.py
delete mode 100644 materials/engineering/fde-identity/protocol-review.md
delete mode 100644 materials/engineering/fde-identity/test_identity.py
delete mode 100644 materials/engineering/fde-incident-delivery/README.md
delete mode 100644 materials/engineering/fde-incident-delivery/customer-updates.md
delete mode 100644 materials/engineering/fde-incident-delivery/incident.json
delete mode 100644 materials/engineering/fde-incident-delivery/postmortem.md
delete mode 100644 materials/engineering/fde-incident-delivery/timeline.md
delete mode 100644 materials/engineering/fde-observability/README.md
delete mode 100644 materials/engineering/fde-observability/analyze.mjs
delete mode 100644 materials/engineering/fde-observability/analyze.test.mjs
delete mode 100644 materials/engineering/fde-observability/panels-and-alerts.md
delete mode 100644 materials/engineering/fde-observability/telemetry.json
delete mode 100644 materials/engineering/fde-permissioned-rag/README.md
delete mode 100644 materials/engineering/fde-permissioned-rag/eval-card.md
delete mode 100644 materials/engineering/fde-permissioned-rag/fixtures.json
delete mode 100644 materials/engineering/fde-permissioned-rag/rag.py
delete mode 100644 materials/engineering/fde-permissioned-rag/test_rag.py
delete mode 100644 materials/engineering/fde-portfolio/README.md
delete mode 100644 materials/engineering/fde-portfolio/case-study.md
delete mode 100644 materials/engineering/fde-portfolio/implementation-guide.md
delete mode 100644 materials/engineering/fde-portfolio/release-allowlist.txt
delete mode 100644 materials/engineering/fde-python-api/README.md
delete mode 100644 materials/engineering/fde-python-api/starter.py
delete mode 100644 materials/engineering/fde-python-api/test_core.py
delete mode 100644 materials/engineering/fde-python-api/test_http.py
delete mode 100644 materials/engineering/fde-python-api/web.py
delete mode 100644 materials/engineering/fde-security-controls/README.md
delete mode 100644 materials/engineering/fde-security-controls/control-evidence.md
delete mode 100644 materials/engineering/fde-security-controls/controls.py
delete mode 100644 materials/engineering/fde-security-controls/test_controls.py
delete mode 100644 materials/engineering/fde-tenant-isolation/README.md
delete mode 100644 materials/engineering/fde-tenant-isolation/schema.sql
delete mode 100644 materials/engineering/fde-tenant-isolation/verify.sql
delete mode 100644 materials/engineering/job-api/README.md
delete mode 100644 materials/engineering/job-api/contract.md
delete mode 100644 materials/engineering/job-api/job-service.mjs
delete mode 100644 materials/engineering/job-api/job-service.test.mjs
delete mode 100644 materials/engineering/kafka-consumer-lag/README.md
delete mode 100644 materials/engineering/kafka-consumer-lag/diagnosis.md
delete mode 100644 materials/engineering/kafka-consumer-lag/lag.mjs
delete mode 100644 materials/engineering/kafka-consumer-lag/lag.test.mjs
delete mode 100644 materials/engineering/kafka-consumer-lag/snapshots.json
delete mode 100644 materials/engineering/migration-design/README.md
delete mode 100644 materials/engineering/migration-design/design.md
delete mode 100644 materials/engineering/migration-design/incident.json
delete mode 100644 materials/engineering/migration-design/requirements-checklist.json
delete mode 100644 materials/engineering/migration-design/validate-design.mjs
delete mode 100644 materials/engineering/operator-ui/README.md
delete mode 100644 materials/engineering/operator-ui/index.html
delete mode 100644 materials/engineering/operator-ui/jobs.json
delete mode 100644 materials/engineering/operator-ui/manual-test-checklist.md
delete mode 100644 materials/engineering/operator-ui/rubric.md
delete mode 100644 packs/engineering-v1.json
delete mode 100644 packs/engineering.json
create mode 100644 scripts/build-pack.mjs
create mode 100644 scripts/validate-pack.mjs
delete mode 100644 tests/ai-route.test.mjs
create mode 100644 tests/content-boundary.test.mjs
delete mode 100644 tests/engineering-pack.test.mjs
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 684bfdd..f306748 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,27 +1,12 @@
# Changelog
-## 0.3.0 — 2026-09-06
+## 0.4.0 — 2026-09-06
-- Expand the engineering pack to 40 lessons with eight ordered AI modules and a Kafka consumer-lag lesson in Distributed systems.
-- Keep the previous 31-lesson pack byte-for-byte, with an explicit preview option for reopening its notebooks. New pack selection creates separate histories.
-- Add original teaching material and unsolved framework/capstone exercises; retain the existing FDE route and shared lessons.
-- Refresh the practice screenshot and add an actual AI-route capture with reviewed metadata and exact-byte checks.
+- Remove bundled engineering curriculum, exercise materials and content screenshots from the current release.
+- Replace the former default with one fictional observation sample under a new pack identity.
+- Keep imported packs, browser storage keys and revision histories intact.
+- Document a user-controlled repository-to-JSON pipeline and provide a local pack validator.
-Validation: 78 application tests, syntax and static build checks, publication scans of current files and reachable history, and independent content/privacy review. Real-interface checks covered all six filters, all nine new lesson entry points, AI and Kafka recognition/model gates, 375px layout, keyboard focus, manual reduced motion, and reopening the unchanged previous notebook. No learner exercise was solved or live framework, Kafka cluster, provider or deployment experiment run for these materials.
+## Earlier releases
-## Documentation update — 2026-09-06
-
-- Add four actual-app screenshots with labelled demo data, capture details and exact-byte publication checks.
-- Replace the README overview with a feature table and clarify local tutoring, storage, pack revisions and release limits.
-
-## 0.2.0 — 2026-09-06
-
-- Add an optional engineering pack: 31 lessons, six tracks and 96 exercise/material files. The original starter pack and its record identity stay unchanged.
-- Add lesson conversations with Explain, Quiz and Check modes, saved drafts, cancellation, retry and archival exports.
-- Keep Codex off by default. Each installer explicitly connects their own supported CLI; static hosting provides a copyable prompt.
-- Add privacy, security, architecture, contribution, setup and testing documentation.
-- Publish only explicit browser assets through GitHub Pages. Add automated publication checks and pin workflow actions to reviewed revisions.
-
-Validation: 73 automated tests, syntax and build checks, current-file and reachable-history publication scans, six-track browser checks, pack/conversation isolation, mobile layout, and one live macOS tutoring response. Synthetic process tests cover cancellation and timeout. A model response is not proof of teaching quality or learner understanding. Linux live-model operation and Windows local chat are outside this verification.
-
-The maintainer's contact email is intentionally public. The publication policy permits that exact address in commit metadata while preserving all credential and private-file checks.
+Versions 0.2.0 and 0.3.0 included generic engineering curriculum and fictional exercises that were intentionally public. Those files remain recoverable in Git history and existing copies; this release does not rewrite history. Earlier releases also introduced portable packs, tutoring through an operator-owned Codex connection, themes, focus rewards, notebook backups and application screenshots.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 111b3f1..088839a 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -13,7 +13,7 @@ Contribute a bounded improvement that helps a learner begin, understand, practis
For README images, follow the [screenshot capture and review procedure](docs/screenshots/README.md). Only reviewed demo captures belong in documentation.
-Keep the three-lesson starter stable unless a deliberate content revision is intended. New engineering material belongs in its own pack revision. A pack fingerprint selects a separate notebook; document that consequence instead of silently migrating progress.
+Keep this repository focused on the reusable app and its small fictional schema sample. Author curricula and exercise materials in a separate repository under your own access policy. A pack fingerprint selects a separate notebook; document that consequence instead of silently migrating progress. Do not add private repository links or learner exports to examples, fixtures or screenshots.
AI connection changes need explicit local opt-in, a provider with no executable tools, no browser credentials, bounded requests, failure recovery and independent review. Do not add a public proxy or shared API key as a convenience. GitHub Actions uses synthetic tests and must never require a contributor's Codex auth.
diff --git a/PACKS.md b/PACKS.md
index 59c94a1..3ac7af7 100644
--- a/PACKS.md
+++ b/PACKS.md
@@ -1,6 +1,6 @@
# Study pack format
-The included [engineering pack](packs/engineering.json) provides 40 lessons across six tracks. Preview it from **Study packs**; selection is explicit and its records stay separate from the original starter. The previous 31-lesson [engineering-v1 pack](packs/engineering-v1.json) remains available for reopening its records. See the [track guide](docs/STUDY_TRACKS.md) for prerequisites and exercise materials.
+Keep your curriculum in a repository or folder you control. This public app includes one fictional observation sample to demonstrate the schema. It bundles no engineering study tracks or exercise materials. See [the local content pipeline](docs/CONTENT_PIPELINE.md) for building, validating and importing your own pack.
Start by downloading **Study packs → Download current pack** or copying [`packs/starter.json`](packs/starter.json). The version 1 envelope is:
@@ -18,7 +18,7 @@ Start by downloading **Study packs → Download current pack** or copying [`pack
}
```
-The envelope above is illustrative; an import needs at least one complete session. Copy a real session from the starter file to preserve its required fields.
+The envelope above is illustrative; an import needs at least one complete session. Copy the fictional sample session to preserve its required fields.
| Field | Purpose |
| --- | --- |
diff --git a/PRIVACY.md b/PRIVACY.md
index f01a654..c55a732 100644
--- a/PRIVACY.md
+++ b/PRIVACY.md
@@ -1,6 +1,6 @@
# Privacy and data flow
-Padipps stores learning records in your browser. Optional local tutoring uses your own Codex sign-in after explicit startup and Send. This repository contains reusable software and fictional study material, not a shared account or learner database.
+Padipps stores learning records in your browser. Optional local tutoring uses your own Codex sign-in after explicit startup and Send. The current release contains reusable software and one fictional schema sample.
## What stays local
@@ -22,7 +22,11 @@ GitHub Pages serves only the static allowlist. It has no chat backend and no cre
## Publication boundary
-The repository includes original lessons, intentionally unsolved starter exercises and explicitly fictional fixtures. It excludes private teaching profiles, learner logs, personal records, private curriculum pointers, credentials, local provider settings and private Git history. Public contributor names/handles and retained upstream license attribution are ordinary public repository metadata.
+The current tree and static build contain no bundled study-track curriculum or exercise materials. Authors keep that content in their own repositories. This app has no link or authentication connection to a maintainer curriculum repository. Public contributor names/handles and retained upstream license attribution remain ordinary public repository metadata.
+
+Earlier releases intentionally published generic engineering lessons and fictional exercise fixtures. Removing those files from this release does not erase Git history, old commits, forks, clones or cached copies. We have not rewritten history and cannot describe previously published material as private. The new private curriculum must remain outside this public repository.
+
+Updating the app does not delete imported packs or learner records already in your browser. An imported pack continues to load. The former built-in starter has a different identity from the new sample: import your retained exact old JSON file to reopen its records. Keep the same host, port and browser profile, and retain notebook and focus backups.
The maintainer has chosen to publish the contact address linked in the README, including its use in GitHub commit metadata. `publication-policy.json` records this exact opt-in; it does not authorize publishing other people's contact details, credentials, learner records or local configuration.
diff --git a/README.md b/README.md
index 65e5ffd..66a58bc 100644
--- a/README.md
+++ b/README.md
@@ -4,48 +4,30 @@ Padipps is a study app for practising concepts, keeping lesson notes and running
Your work stays in your browser. Optional tutoring connects to your own Codex account on your computer. The name is inspired by colloquial Tamil around studying.
-[Try Padipps](https://siddath.github.io/padipps/) · [Study tracks](docs/STUDY_TRACKS.md) · [Create a pack](PACKS.md) · [Codex setup](docs/CODEX.md)
+[Try Padipps](https://siddath.github.io/padipps/) · [Bring your repository](docs/CONTENT_PIPELINE.md) · [Create a pack](PACKS.md) · [Codex setup](docs/CODEX.md)
-
+
-*The running app with the engineering pack selected. Screenshots use an isolated demo session; no personal study records or account details appear. [Capture details](docs/screenshots/README.md).*
+*The actual application with its fictional format example. [Capture details](docs/screenshots/README.md).*
## Features
| Feature | What you can do |
| --- | --- |
| Guided practice | Recognise the problem, work through a small model and trace, explain it back, then attempt an independent task. Record an outcome, evidence and a review date. |
-| Study library | Start with three lessons or select the optional engineering pack: 40 lessons across six overlapping tracks, including an eight-module AI route and a Kafka consumer-lag lesson. Filter by track and search within it. |
+| Your study library | Import your own curriculum, filter its tracks and search its lessons. The app includes one fictional observation sample to demonstrate the format. |
| Notebook | Link notes to lessons, search them, mark them Open, Revisit or Resolved, and inspect up to 20 previous versions. Drafts save as you type. |
| Focus timer | Configure focus, short-break and long-break intervals. Pause, resume or reload without losing the timer. Start each interval yourself. |
| Study shelf | Reveal a book after a finished focus timer. Choose philosophy, art or spirituality ideas with source links and reflection questions, or turn ideas off. |
| Appearance | Choose Ink, Sand, Midnight, Violet, Rose or Graphite; collapse the sidebar; use GSAP transitions with system or manual reduced motion. |
| Lesson conversations | Use Explain, Quiz me or Check my understanding. Each lesson has saved messages and drafts, Stop/Retry, and Markdown/JSON conversation archives. In-app answers require the optional local Codex connection. |
+| Local content pipeline | Build a validated JSON pack from two files in a repository you control. Import and preview it yourself; repository authentication stays in your Git tools. |
| Portable study packs | Preview and import data-only JSON packs for your own subjects. Each pack revision keeps its own notebook, focus and conversation history. |
| Backups | Export notebook Markdown for an editor or Obsidian, restore notebook JSON, and export/restore focus records through their separate backup controls. |
Practice outcomes are self-reported. A completed timer records elapsed time; it does not establish attention or understanding. The app does not run learner code or grade mastery. Book ideas are editorial interpretations, with sources, rather than quotations.
-More screenshots: AI route, notebook, focus timer and book reveal
-
-**AI route, Ink theme.** Eight modules in order, followed by two shared API exercises.
-
-
-
-**Notebook, Violet theme.** A sample note marked Revisit, with zero practice attempts recorded.
-
-
-
-**Focus room, Sand theme.** A short break ready to start after a five-second QA timer.
-
-
-
-**Study shelf, Sand theme.** The QA book opens a reflection on Epictetus with a source link. This is a test reward, not a learner achievement.
-
-
-
-
${esc(PACK?.title || 'Study pack')}
Choose a focused exercise, make your own attempt, then record what happened.
${esc(track.description || 'Sessions in this study pack.')}
${list.length} of ${all.length} sessions${practiceQuery ? ` matching “${esc(practiceQuery)}”` : ''}
${practiceQuery ? '' : ''}Try a shorter term or clear the search to return to this track.
${esc(PACK?.title || 'Study pack')}
Choose a focused exercise, make your own attempt, then record what happened.
${esc(track.description || 'Sessions in this study pack.')}
${list.length} of ${all.length} session${all.length===1?'':'s'}${practiceQuery ? ` matching “${esc(practiceQuery)}”` : ''}
${practiceQuery ? '' : ''}Try a shorter term or clear the search to return to this track.
4BNoSv;%Ee zfk!zjkbmg~=ND6xnAa1pWS+~p=x=~$=Rc+1WeI*kOwW=h>o8HUa<^!7Zeed)JZQRYB7TW=-(xF1~b z0{QkGTP(ndLBjgAi!P2Myeq(99Aa8A1hYJpM4HaqMyXILuzc?KJeJ}J1K-5u) s@gA-1v-b=VVywjBPuxMn`reH>ur{c$fZ`MjP)&9TG&W2UGEcR z+XQF?hEa1|F2f5JEgBkb=_LuXB2JtoKe%;SfAF8h2zk+cvMRoWMdhdCzx+;nfUnI2 zmOA_;DncZn7jT;(pVR-LD0yPQ)44_gV(#@yK2Z>S;3zkEX+I^SpF$9Srl({SGfT&p zSmWWvQGLdx?YCn(I;Btbba^3AZf|`q%HUt)@4> 3!a!E6t~m&n9lGklX6i}oMdLb=w$G;-gTv%wBD;g{?yJuuwZkp^8)~N#R3#h zG*#=i9W!m8&od1yfkoQsUhWoJ0M>O%(MCHfyERXE3QB9mPE7c2UJX<12=u}HI<=o3 z&Q?RU2=y*1^>_~&7KJ|L=6)F`!GX8;$g~!<>C6ts)rJjQ_v9dfG)CfwZKbz%k>>7EF=@s*XZV^H5TiLG;U8z7+>`$~tDL{w;pBpYV#EEBTs;YgIU^ z^U0mjPV+_31dpmTT)`6yHayr72vb{j^^oNTploj|i^~muQt9Q}^-tPU`ehuM_Kb z;@J%hv?wBEA1@S 5Eb9u?ew7hQ>TiNLhGxPEqx(ZHB!evK>kQX=p7&Uyp zA&HL-89;5+$8ww L+%7)hj|J=uGae(Q1 zP#C&_5&X{q`(KgCe-Mp^oy-m@rF5}f36c}Axqoz2?W^7->&fB{k8C!RzEq$vi5T{> zMH+rgO+(K_MW@rQ6^h43d>yfIj+=72#@?BdpIeL_Gl}A=*E=j^ <2EsOW0u8}ba z79Y~@&b%X;5%5xk6A@CnmY#jx<#X{{NVB^Zy!5J-L7$;xW{=I;2@?M*FRQRB9>-`# z(TFD@It75{`7^+E&5(36>~3ei`>L_i*snL0h%VB-%QRmlL*zLaovi 9>4OjGl~4u^Z{G~ zvg8T9LO2w@S&ld9xInmnV>z2O?gUP-5p5psw*T&fF-XUYIuvSQENBuVvlhs^It{>! z;cW4MdU0 C9#RYH~MyEBd8LXsTA7Nb=McGh@pA0F2k>A?=v>PZ?$aKkY zz-+Lt88i_1@-;;B0q`;bhrV3fa&4o2<*J{<>3PdX$1EH0d8PEzBlK?zjd)J2(Ns(Y z`Ddm+&F>B^52c6{Bd3K&qHiP>U-;Ig =VxpgXP%uv)AriX{j#ecud&~@?dwz1=HdgMo=en5Dsy?>*iOB* zzF2~6e+p))CrQ+?a_aKHc1OzCm7TztIS!#q!Tr##oPJiluVH9jr)kd~eZo*1Vr$!^ zV_B(a;|}uFm9EH%&FrM{$91h@mltPYrh%L5QvxG!VL|4!G=)vZ$v+ iH#AXF*;6LeP8qd$hF g#ifa z0m3?;t4|u{RNLL*d8q~_;=l&OmiMY6wAqAWk0=Y-34VA4kbD89NOg -n4qZ?H5chL=)H=^t8T{*)fr%PjCD{W;{SI>B9z zWR_iT_*rVA3A=sCm3Kpwv3VuiRO7omH1Er(57VeI)*u==fR2(jzu6-9%)ZC Pwq0bqp+qD5lxM1yexp$utm$O3NbZ6fa z$wm8Ty@k1uXM;_Zp=w=vD5G%Y65|n=d{=m&&!P}zgwxUsWZwC7a(aFVDwHqd7Qa7b z_ Id@xL_>TyK$4lO@|;wVaYDtGN}*pgb* wsmC$T{gH*L5A#lz`x~00F>J<)!-<-!8KSB z+Z3L>v;z5T6K*Zi2cK+II(Edyvsw W8HbqdZoZ`Ow9o6a1S?Vk$-Ipc*u!ucwd(T9 a#}*ONX5d;S$QeywLgCqqje5pXj&^pGP+L3Jo*bMaDCk&Ga~a4}hAog0ie% z7UMQ|nIFOQjrOH0Tl_1EVPvTgeT z0iDr0g}>``*Vn($B}`H}Sp~{b7PJB^1x}_@JUJTEYWrN#HD;0nWegNMoJn7#|M+;^ zPUBr{EwNP=V9p+=rAsbgalkl;rDT#X2HKMqQE?a1y!kC)1FxUr0G^o^m>XYufN&lFL|?ydeGRp} zQODzH;#9}{N-rF(k|hnSUX2w%UxJ*5{|X%UJd<&^F4~sUq6H0mZicGv_TY$?Q&inP ztNwwDI#)J>!8$#~O33qTi;p&=)6Xvl{uP8B)(^(fDPW6p>S>U*Q4MC;8G1T_&PVN)YdM+r9{AipwoYE w zs(d|x`_sC^XEpK{OI6*XpH8i_2SKLw=kaBhNl!!%|U;vg0y(B z%nJ)ro9NiZ%KAYeI%lmo>IXm~71jMV!|z iwAqDudo&U`38E0 zTVM1d)6|7K&%5wW`deLz66CHA X(AsdzO_jRuRZ8@A zobt+=WK<7AT`=aLaaBhAjrOPXh9$$aLGgpruDI8t4ND-&%F+lZ84cO?fv2v)DImqu zu7SOO^x5}T!i57{eONaxQI-~ZC%qo68}iKv`(SF?kWc9Og*7YDRP5WCH~ob>7ADb6 zrU;7z3 NJBrJt&vp+ =!gBnHfS|FGwal}p%1*a%8f~@d@gBa6_hZht?f;1 z|Jvrj!Yf@nXOpuV2cEsJMiZ;Wv)5;Ce(v3Fup1Xfw6Uz>S~a6rOi`3p#2`U)$q%)) zJR@}dnuwzI!{_M`Wl>3}E58-F?hy$tG)eaM&BevYwuEIq5sBb{B|qjTfq48HzO8dI zI; E{_5@a;Rbc_p+SrRJYAu6 mFPy#z<(qhovl03X-~>lPzrCsg_u#Zw(>A>d~rr+<(?!WA|=s9sxdX z+ZpONRi_aSKHf&`n4el!h@T_gY_Z(g`Rq{SWZ+ZUZzwDVEj4MI5~!wxrOC-IPido@ zfs O0>%*S!+lO6r<2*pAJNs} JB<86Q{VK^~ADA^8Y#TR@lkp`rwYg=7O_zFRt3_w&}@H9y<5QhqE6%hP%YLITE zaV3}pT&&hUy;L7bRX&Oh-v1c&ZBiT?qUb6uC~IjPsR1$ @&<4JYj&DL? zjn mPe^bAx^#EYD z&2tvIAd$YN3~jwpM_#1+!C8eM`XNZ}OBdUG5|!|i8=gcuB9!RP>bN;s;b fbetxO-gSkzg+UyTD?i z5#e=mHr~o!t9lg(3hS3|LF)CH-EI6v2k5r44*>tJH5G;#(Wh1;RlTh7>eyTwQ~ZK& zRvM%M0JA#V8b{yKzC;soJUq$2i+}&~G@k#9M*j-5Pb1F_9stMS2f$-AH*9dyw0;jK zIncAd-?S=@t`OYlyJoX*V>foqK7FxEwY_(-Jviv)#d}4;+p^6~Uz%%DS<#@oAxq=j zGe~m7{^7o3G-QRvDa08{ylk6W)3H}zWW`y(utc$NgcN&)TW|W3@!v=uZ2Gc2`ZM42 zF6cY0VR^FlddS((W$&YwHtla(S}k}}?n=f6jzHs5A&$j%6d(9wtoB&jX%+aj 89{iP}9pBj5+61n|g?z_)fjK&ss*L1Z>YD?XHKXTi z($}X9Ub_obmFkcw`&1YRQj+yquW+PBa-MsCFbCi=Is2P4;KR#}&{P@EdV`GeNeLbe zXQHYz72$Qix$T6iK;#-Z7uOMhz9oAtGqFDCG~wx?aZ!F=XzBRAIRO;)7@f@Kjx)8v z^o14=BnV klrFt1aU6EB2ws;^h}eQvJRgg}O0F`J<7m@@b<`m=vWIU`%u#f7t~I-i+){CGlIpiePjf`4akIGW?XOTm6w9}{bB@;VNOpj+@F!*ikHgpe z0mmmgyy;4MR<4+zXU&V=QDRjFKKl?@BQ{i3{^`PH&oRz_Buq+V#AT`OBbrD9Ooujy zlqw;qGf=3OMb5TWzaYEV`$Q+eM8jc ZXVRKjxmO)p=xa}+;9@wKbeq7T5}NNr`V<0HAOUQEZZz0 zJ2W<|V>$h7XCnN7ms_z_OMYL|gzMtc;S@iYvGqhq&9V-@b^97;Mys1NM)u{@Ok<`9 zn)eqL1 )!)pO>~vLQV^dcvK~gpYVsIC(yZ5q!=AX z33|>9oE_$74XX>!5^LUbp?&+JIFpblKhv1kWprF4 1;!61YNn SXgl}y8(nOiK%yznLfAQ7u>^1 *n_C5Bc3m)xiw@tI+B;nd zl^*OXNf|C+m;?KKpV!F9UU9ruuXeJ{0U)ESo#YT}Xt>y0D-!bE#>1e5)r8g9j--6N zcmxp)2q5`yT!(~SuLg*wUMU0~QOjtWw8T>dP3ZAo!Wq`@ySgOua4Jq_2BqzL@)Z-! z)U*hEF%Y&JRHT9FlAnp$*{y2YshAnWhlL!bN=ZBq&68zF)9j{ZPEVyB*{UwxPeHDq zGk&4>*}&coQNP4Gtvag3!!@qIpEXT~WfciaC-_?MM2x2K8)6<4s>pKuTgj_1Z4;!< zWN!TB$C>tu`4cO!an0tpW qvlb(}XKA0L|zJ9rR@!sQa-09igBu9}|Ke^DG- EdZr4_*^ zvX+9Z1v76Ze?LgRn&QxsA4cP=ojCVqja(j=+s2D+3|u+zNEFXAceXGW{Kf(}oJ9Aj zU~mJMmio<-F-k ?|3nwnAxM(=bs*+y@-{d_Vr-@1R~y6s37vQP9%q4}aFuY89*U;lk> zXjWDV_zS_0ePXkMehMi6Wob7&t3hbFXZ{^z_dRK58dJD6wEXP5u7u0nH|xf?*k{a3 z)nH~gOKDzUxrDe33PF8%0KzMv``SiDOhV+2Ga&EVYMFDzV(~nsVg*FD zZXhEQTLZ_q@a9BTHTm6je2FVgfs`w}Q p4Q1I3 z-B_?#w9VNanA1JG=4Ru-X|JD7|3<3cnnMJ+^km5_NF%?g! e`;j51cPXII2 zBE)1N<4~=c_BVY7Z#TwShy3cu23PFHui_=)dAsh30hR{(2Ri8@ifq^c`4bV9Rjm}^ zQ7d0)Tpr~OR3Q-vUv+_qlqCyE8@EA;`cEkEvDkV|4Ty{Z^DzV*s+aos6^v*62U$hl z{DZvp$L&!2VwZ5FPc6itnhOV0Yj2RkK^leFO 4uC_SWbW7YhG(k`>Ujh>a`=eb? zx? Z%TaYN35oHHeMl@hNdg ~}tTkJ#K>$t1}CZw;E4Kf0I1-Sd8W=5ADGrCfweJfA#8hF+H9zkKp |J7%D zB+1F#lqYGoyC8THEMYnMfqAm)?jmv#2<+A6h6Q!KeWoG<5n&KqMzT)?=u0}ZZ%&EE zOBKe1pABKhT{Owe%h?i$R>$9?1eQTJ7z$zSQ-W6rHErwYMY9aTQg5EE24mWkE7{FE zGya$j7m8gW)Nhj6>T;bk3pVc0`?+_6J82JId5v(UKju MsZ6_m&L%rnFWGNSVR>*|CA(CJcxd*9E$guu*M;|N&`@!srHzU3LZ-f|j^f|5F>$ ?KNPeF{8w;#E^o zLGk;(^=5XIb{ C$KJ|)@F^6NT2>g(Qe4TiIaL=i!7>SL~z}Oi|;Ybt$oVrv~4sS zoInEjUG! 92zL$M@kb=n797bK)@Z&)Xymhc&E-XWF?~8VX%jLvTmcsT>WF- zdR#${PNM``Xv`s%6NO@8Gr=8%-2gmo@c*|5LcENh4bWvoExnvnoK<_R=A=yDc3^M6 zbUGD#bfi6QH(e1mNRgGMIhd`MoF_*aD5NgNW>52k+qV`YUN?l_Ws$yZMvzP(PfaN4 zm0QFFmhq18J{u{;x_#05SBR2E?6C5gsauTpBKIO8oD#U#KCxMAt{10J(3X+mEYh>7 z^{6MC7D<-opoQuJY*!0*7wSc4rGMDr1c`p+RNtrW!6p~FJeTI{7?#w0QTtX %CXZ&@#T9aM_m=+r0yK2C9)Ts!svOJiJcR9OCSJi7!+7 z)o8nDs;d5QDlCFp< VXZ(yzUsdF&*@){$u=|DTyL%mv>5cVEh;IWFikNBR zzX_z&wvcTF_pOe*1Yt|8)D(oyLUcgW8X8rx6VeBkT9vX;GMM&`w?4G7UIDujPLV6s z!%x02KR36P$iN2kz;e `XGj riJDBKDaxsa0Xd22v#DEI7a2c zdnG8Xh^$Rk?6KZF|0x`#Cv8Wa=;5P%XLX@Rr%*8Y=v4@K5!3$u3guI_0Qi>^_)Eu_ z9)jFv6|u^XL76{k<@z1~THMz?5jMZ`xxb|BzJBNBbhP(voN?j@eQtHaVB@~=w0%*A zH?4AsC8 s2C0>j+mJ{U(f (0K6R?$Wq>a0}%2+F5(Az0NuNjQ!nX_Z#>8 z;jJ-iQeCsEX3cu#d0yWxW^#y&yvLwMjWEr#F4^q+(bLKbk`knfR;yL$Oel?>!xj?2 z+`i!<`li0b%k#}FGY)YGwg8(4S*t$#%mq@339-0Mqi#2orBRY!ZdkaL9V7zDj1P}B zW=vUmvUx6)Qghv{ADJDPFfsxBP?#vte!jXtkwhBly1n7I?J6ftLQSYMsMB?*Axhp& z7r%vNH^MXOsCGS3MN5H@(dmJ1&EvR0KGF%VKbAcCMC Dq+h0!23IysrPeO| zxT6D8;fZts(J2}ej_daGv2jpBa&a0 qO z))6#Ya{9C2LTlU^3g^sBM ~jTBrPmH8UK8FjZ| r>F-(1>uwC(#jV) z-7l|-z>G!o#7AqLBasiKcB&qPb gLCxju)-6keS4q{wlEUkE+{6raHFI_6%wM8oLnv5 zP?Xfc93cb1#{qS9xp&?cjfKxK8XB8dPbjE#KXQHJFvl%&kLE$P6HiF(I|6R3IRO*f zlBz44f|ZaIU?oh%21PSQySQki=CUl4Iw`L6jku^Kc~nLSPNZ2SZ9vI}9`@*hoXXu4 zZCJ+n^Xw*5qT*|q5|cISV8O>@8oJCR)Mu4+_+b>W7^`)-fk#!Eu2+3~Eb#Q9aBK~A z6fRerU$c)0XDKr=F-)rwi?l9F&EZ{5N HG^%-QU+q%a?M|=dI35WUkO&t-qK{JzF1(i&f$!g zp?32F2i@yhDA1o{EYPrCD1}XzX-`ZeX*f9spf#@Uc)a2_I(IT6$~T{&3rVzTC}HE> zv$p84My^K1cs;Dav1eoiU}onpQP|BXQ^AS3=j^jch{rG_pQ30NfM~h7ZQDUU3M#n_ z1>w!}G#2hPY;ZCI5!NCz*OQYG#M+=KlLg95xmp<*-&79rz||61(U!N0Fct@tL8@EK zf-APD+}Z-pb19j0sD1))8oQ;{#Z?{f(sUG9K0#Npm1he`YpRu-F|4u8D_(%wws$KL zw|;8fY#V-@oLos1R_|?3 `;XyEX&+} zv^_lfhoYTUJE 06|}u+q?S)2-2mZD2@O09uVepoL6&$0 zU2Qb{C=L{5XJh0{I($*Xzuo0@?__o}>W03OTH3}ft%&@`GTR51U<83W0li|UHHtM8 zPa1=E=)K+W-w?ql;zg8Kf_@>@hi>mDAdn&BPobIC>D9V_AMo&pE8_oirN81$FtY<{ zLfA?CjNI~aD@ndn+OFoge|+7IS;2iCB;xU~I*SSy=u4(NN!IO~pXb4QUvcGqKP&bl z_++KIS?Z)QL#(w4*UR~*z-r1^41}hLF7PW=d =KD;Sk}z%?*BY>?z*+MGVqrx3QyRhPH+K z?jP9MY#+H2Xi>cC c5SoSRW;_&39|H_a7e7{%G7_78uy_6}=LX zk%n}))QY38m^>6JSZcG$%W&j>DIwT>ami%Lfnga5e)MjG1+IhRG4sL3kw6ns-tAZj zE25C!FpRVY@AAZawIiheq6?OF4yrM91Q~AIcLDhn*pZ6(_#@5g86%6MQCDawtn8k( zUv3yRFyU!wTi~c+ZS5)r0+jy{ZqW8cxnAu?jVD1{HmFUr{aD@5t&smP)ac1a*~NQp zl=Hed;!WXnUIy1+htHqv?fN=ee;lbwsFBpe7M_+^P_mCh@vUb3K}7oZAfG=ky+KJQ z_#a*>IqFqtbbOGalTQUGzzX$}!bDK)n%D6u^IH;z4P*k9Jej5BXnxXk!e2*FR1qw{ z1S=ti@A|pY(cEInFOeflc>HPZH% y1>v+v`C!&wykNH?Nn)o2luq|Jm066FT_c z+=O^)=E{7hCzm4#gqcI&^Xw`MT}~cbp%NyZP5Xpd<9IqXBK2k>{u<`jMlp46di`1b zhByGgEpV4{L$D4-@qzJ6U^39h{F+6gUxFAKBmwcsxpexj_Dj5ExO>^ZAHP=LBK%7z zLjMb!AW&(QVyc$R8Ikmkqec(Ju%K XnK}MO)G;=D(rm?Zo<9M>dv4Bo zCH1Y-A3*CJoxM5d4~L}Kse0xnvWA<-M>QHc#d1GmN0;IWG5LVgzk2!kJq@~`l_c!+ zI-VcI*Bzgy;@Mhg4aL4iK^Hj%k64yu-l8Hv{1ZQ2l6{Et@EhH{@i@DsHR0+0$9G9= zoxG{P_Q&pX@%H$h*@D_%BzskVgk8KqZ8ej0Yk9YF>rCo(esu8Lg_dLLwA3F@K>j;1 zN2C4>Z-|8?PdhJdo8r8}i1yPJcABcc`*yPA``@RgyIT2CxzLp!jE8>%zBO=Oef3)Q zI)C`;VDAUr|9?9JFQHbpUdC#e-dQT-pnzZ*d>8Fi#HK}Z)*YVX&)IP#B`ZfU_F4um z&C->K8u-1lcxqbq@v!M$I&SY{ 6d407R7k9ewtwXM#}n>ZRz_EZAofuN<>F`$RhNsmw?woLl8CVK zN-bt{bLZ2G&X-F0DkZ&vV=@ZrwrHxV+PLb1u{TDAIO XoAAYH4Xrjq1x#(e(-u)GCZ`t4WO?b9 zg-lJZ%8)I6Wt)m-b_yAlS#h!0ug6u7n1X9WYoo{WaZltWs-3Oo&h2WPPk1JD`Rg>$ zX_QqNWs=VYM;;3bYJO0=3hYA9X!*^oTXzM!G?-yqkBBd_wh0^2YF$^R=5Vch^?mM9 zAIM296g^73hW&Bg*2^g_jTxuGl04JAwF&QsE~~zoa8nSuNA}yO!*rXroZ?nC;~sbw z)TmG*VWi6{us^v-zQeVFMr9o<7MZxKxYy}Y4w^Gb*Jrf@_T4y2q|~{IVnnXh6IQjm zk+V7B!WOs8ZM<9~(bDzePyKFsqYU#bIR I|B z>_WRk?N3lV(=3j9;>|ws+(uLDUo-na5XCO~RgzP?3r{o!zHD0ul;ve8(tL<(8yhUl zI9~-V*lL>2x?Q~KR=?!CIrr~-`ROM4={`R4{ZBx= n%$#Nsdaia$(MlZkVLVTU0+4PL)*qO&%VOYB@Eo0zFOQRmqdn9;E z-o-)JI5?%8Ft$27eKX%a%F|6e$m<~^!>tVs&_X^qC=F3H>!!+Gr@}@DNfSI~V}!~A zdlp|Uw`B<7oOBCyOru!8a7nC&!NtXkw)S+oRBSUnAp*H=ng)93h%zCY!EuZ$#<{6V zyi!La_vs=o1mQPj$Xa8DmK>AnI69Q`J^vkEDde38(0xVS*I9YtGgF-7f~@;Q &b~E_D-cR&XREU-Yx^Rt#YTfFHFJ2K^A!=%NgN1}`X7 zbrW7z7CT&cToC+S>l-l~CeACSgvW@%k8SO5J9=Pb;~D-u* xBck^;9D#Sl9GVS e0Ljev(Px4`?f5+T FjN#e`m_K>hJ+6w5Mu;dQsm?qBSH_4x6q5R6^BG`GA&=|_|dJ7 z%xV_t*k iv49fRZ#wzWp*TkBm6R_$w@8Ph5SI@j+`qZ~BH zDstbS+fY$QzJJc2ct`&8#C8kHsm=?EY)~_i-I!-~9C&^vqv1T#C*Q`ED&o3r(;?2_ zF<5CfqJ65se<($66&DxUz*83u6gokl(dK1GNEd`HC^gI(n{@e=;kLbA-;#(10vJzD zH~hh^$;nyueUFM08$B9*vI|cL<~SnN&Hw^C0fMae5rf*eVwHzIH%|* s? zkqy ^X_)gg|Kx_p!aZLCTTQhx$2 M#&$XefSBeIhY@3h+5d=`3V3od@aan zdLMfI6L7< <5Rn4gv>&Q`M(cvuAf)x1)J&B^ zot|W`i=xr>>ijv$acjsaDGkQa`H9qs`exdPT_d5aJy3qbcyrIx<|k?nw G4rcIx z8myB-uz3XkBK9STr<_WyHuA&uoL*VtQ*K}C8gi;^ckTx2$XFL2cfIQC_LIYT6Xs n<=^#wf9J{e7<#8>XZq=gWrFl=q<*SF}FXdxjSRQv(=5+Ne|c)rFL*9_1XuX zp4Du_@dz(J714E}6A?baWlD^S@Lt3@bBHb07CY2x?Jh*+77(*6GwYIA&e5tjI)6~S z_q}dSLv3 SPyJdQBf_|^Fq7qOxTv2UpZ{nv> s=zx-iI oL03hic8;la(`-rW~@Y>GHuIu67JrYsMb#=ICaOtGe!-h0VL!!$|d zm&c|sb{RkI;2Xtv(EY;(XAA_+%|Rc-aTU^#)0?T?9S4$$d{_=?)Wd_2#pOv2 zQRBI;9*nu&KS}UQ_RQo7%dxOh2;tM{$fphPNDW_6(8jeCwa$A}lcI>%LKP&vvxli| z!)71MiK#U{`uyrsd X98K zg$3Kw-`y8d)HP$stGGH(7Qxniy?CATU6~5p=O8_@)z#6a{uH~~vLL4{Eoe|$9kU%8 zrLtQLQ<|m-ZW$P*aF5T{*#O5!K~b?O(`=N_3+z^WwiZfD;tqutBZc9dpoN;C!l5}f zW8A`O DF74Zbtl`Xp0|KU9;VjBuZ}29*rlhE4R7=;T9oXlIf-$Btjg z^h#ZW?mR1fQsBNbC#!{D;^vybJ)}-i0 6k(~x 0 n@>yy41ZyuY6M&S<4o%4!~u99Y8Ut zmR%HH{$%w>rHS+Y%ipE+v!kt_fX^s8t9gc-HLtJUGQIh?&AmSXo)PB>>!(+ATmBdR zYn?mSFimMrRoNGs9b1nRS|ZKml~dFJw8+BSsM6z}WOae00o!-c$zt9bA$LsD-SPZ- zI-9wrRqPMk5DYLjp-cW_;oytHSb|mnGBM!X=fSft5_j2(nHn{;@7HXXASzG!fWaRN zqCbQ_#9OS*jXs0vsu%8@93lID0uFux$Op*Si-wJS(+xfu^#*IbS1EPCdh8O+zHM>R zTa9Bs1vmj2tpvtJ7yIkBm1Kq=pRnLn?1_u78(0DNV4BpAG6Hkq7^fZCDb@`^Ws+el zor&LnXbL&4xq0{JASNa>!wPK|_;6)iv*jN|mf>;OIKNa&a(CxyNo!M8#auh1!qN3w zEQ@~J;WpT9pEY(CQn@x`lDP3E-7b;c7{{$iLGFQ}5(|OBG*BqEMt UrYLaK)zQsNnBu!3V7JfFX7EPO%INo+RN5yA{YpMJ$nt#9^ zNr^->D}-P*vA}(*43q0|nae_PEzYKJP8eW11FSg~ygQtDKg@H)hPUp3hR{0j1Pm6! zR#KZ*Zlj~zpn0idF+~JjwjU0uaz|W42~bwEE{v6_OyjaQmBSN<%)^sK^0UkFP_uVE z=-HF#m#9xFc*_=BS8b@gVE4tCjv?lG=<=7Ioo_&n7if&W>tsU5Sk%i#R3TU9aCp9h z$_1Qv-@ob1FRktyN!rPiVo!s#HC5-J5S>XS)x0~qBI39ZH#-(C3emGQ{k=pg(VCaA z%rV}v7Ea Oq0~V4Ci@DSE$TDlG(YwW|6!M-Ywl%&9GSJY5Q3 zfd&f?(nQoLwtQk=%2t@46RV(&6WdT;hU=rq3 pX(*swZDBBi~nra
K ${9~&!Z9o!Z4n6fHS2tZ=dmDt%{NtSq{;O1kfcMAy0d zXvcaSyvI1D_WXEh+nF=|X1Bfrs64~|t#^if%^&4`7`^r18vgzh0EI@Zi2M#3_&tmt zWqshx$Dg+Ts$D0PGG)8$%$t>`Uid@pchwb(hR$K`dQ%fFhr(x?&FSBiP~Haq`Nn zjtH=9w{!IjyHL}ea8$9vi61C1vsJK@=?mnpSDxC>K%riId~|p-BK&1qPk}m{>`bLq zBllxh)M>P(qK>g(_oz&9f_RsCpN;gY^J~a(lq+_v+q$Yl6!8IxFnp)Q7|$27&@UO) zN}P%CRoY<^{$Z(g+MF(0Y1)1L>sB0MSuIrf6lv?RJ#3tl{jm?N9cxyRQ_Ai%B{kYv zWT|%mG(6}JJkdXh@A-4WF=98mc)A7WA1#X6DMW-LywZ4`Z}2oRppC$mJv`ek_U$_i z^aS`XK2Qt@%1Qxn7Tu%( 0(1w2dL5=tH)E2Ir z&;TiMc@5OBd1o;I$jNC)GxXYuvSHp=+tAlZsWf76TXU0IY!NpCzRz4js2HFuEG$UW z@NYTP2mm5De;JCuDHla@1R~qKB0M=ndqUr(&rEt`Zcrd5SdPZvXY*_F-E? @JuDL_v zHedxrjeUV~M?V5Y(zK%fGm@|Zb+cQ?EVB`^3$8u((JE8`n@>69Cfc@Tp`hhDXe#Tj z%~n=+PEg{ XO8?k>t|Iq&bA wLmG7kPu zLxP8WwP<>+@R~tOR*nFb+k>12iW yBB F7z0J;#3#&6Vg3M^|`*ZwYXvTAi9 zfj3eve);8?_<#C(Z{xGO7ezFo>&nQtF&&Z)kc-stuLkaQyjfd2y~5uz{It36pF~%- zPe|w|_;wTQ1XAp3Y3;vKbI#Ov#5D~@;1x{p6>Heo((Ymgg*#bY>Oh<{1^RaE4TcE| zNJP%Z3;3&PcS(YvA3vsH4=G~Y0eMHCa4`Xt=pDo(me~TCPT9A>LftIr= f6^z zA^s>`R;?`bhpem#%?N74`E5b|&D?472+l?;HSJ81;oZPcQg(S1xqR%qpf6qhCkgT(;FAqubz#n#&k4kVO zv_+-4awQ=XRjo?9l#|hJYnCKIo>drNB?;AY;m!Ki%LER%Z-22VHUU+CH@Bygz4mk% z8>u~PAL@?Cb1<8=Yz(vA-xJ-hD<=+iS4|vLa>)8D-Oe*qVT~*@I(vRbji-$9>?K|w zFJ7p_Lm#bUB$s<5rJp*1rXh_c%|xPn^VAYvB7JuS^@M|dBN}7nO1YbNTDbeD_BX!8 zkjxTy70o+(C{S7pHtlk3u`|u^3%$)k&ctKt)*=NXuPMw{vORRZ=}pUa{|3>7@C8f= zC-SikD<{?*=M%S 8O#30D!%L zD2mQaH0T;!s|pGU5}qY@BoWGsQKV1YfgE}4B&B~>6jcw} rz_^H;yM`bnj8!4`r)Q*i%&RoLlt#IOIm)c;&1$!R$cd<>22 zfGPf#eS>qpPQAAAUato{e&0Fh9vNAASx07yt9WnBpKDmVoqf}J=Km^wzu#qUC+GUp zBGkojfu+wQ{IBBI)s$-QEs6CD`oCWN{ht4c%6So$-D|1NeG_vpcbO2{IjHpUpE=a0 zX$=F0lj=>$1`G%FQ`1e!Z@Q>|P3`Y9{QJYO{2G BbOId7=9 z_+#JZ{{-*}9v5dlRsVR}Byn3es6dyMbnz5*lo>-I&8==-e~^9m-}XP|^B1XO@Et6@ zJU<=Hju}?| H3tMCgXN>5oUqUu;78pHX>5 zKYqF#A0}G&a~^Dhr&7NOH~G7Y(eEZGFLNP^)u8{!_GZ|zMD@nPq*}D3+|$3S*!sK2 zcXO4!OgB6}*vbFz8W%ebYM}MfS%d!Oqr9i&kPf3G(TFe>+P=~{hNHD!FUPfNgT6Ej zS&e_C8U3L|{9C2}Q^n$Um+ZYDS-Gs`+4og5-smL1fmjM;m`3>Y>|Mp@_~wV+dPhhr z`36yX&T^XXLwbzXy-NAQM!4^BI)Tu{eIUWH`wZ3FISyROnd2HCUlX)$z=oul79E4+ zA@88GS!06GJ*Uy|%q@+}i>X_MlcpPyLOP$^=sa=@OHGX2D2M2L<_}+}x=SHL3Hx zar)`3QCcPxkJj54vV4>-viKsoc%zy1-fCUD1G8m`qS =2oD~4i3?Q#}HfxV&oEfq|;+}0eNh~$dwm^Z$K`jZCf*R;>V6JZ*}AP z*F+QgZg4$2Ak|Gy^-RN+a`|t=IFEZe%11*a%+;n-(c7)0mghvE9WFd`sdXjZ4_3^x z`|Wd+^PblgWJQxl%l(%?Q|_yfM6fsk!u@874+vZL+13hd7rJty3l&ZkErOq?~Xv z-N9QjZwf0dje^;w4wHWpou8tWRRQ%H9mgm*o^J|@GEwDdH$GVwvT^hPD_%BiC#S9| zQ{(wC#LMeZ?~-n~r_dgz6}y=jV`B1I6+%95U;#^PQ9$zHQgoM>I5`HPha~8%D{&p5 zjluOSE}6?9W9FF$;8+mfToC@V#-9MiC#w8J+ymz-=ki_p4 g~Td4OdL&?xMOYxDj!WGbgxM^#hT5a;_{FMM3*+=AL1 z3!=GwMZPh|p8(tV>!_PG#cbzmm2{-@feU)mjQQ jmmjRD z(yUh`vt4;RsWL%iaAGM`4#2Ub0e2 ?{79n>KPGJH`; zHvpiUtzZ6-G`B%ox~mXot%{b1%iGD%W#0^L10gL|cX?7!>x{f6oX@L-h++w)f3nmG zn{q&2ZBZi^BV+yOtS<^N<47?r=fk7MISbw+#`dBH(cZ IqVnisKB+&?hUcVfKfUr!rPXT27&x@(P}nYNtcZ z{qpW@n*e3UiN@~g6EhD&DA)r;q^7X8Fw(6&STUnWGr+j$scKWkV#xJ-*lgJKGRl=} z%{bK{`5SJZq`|z!z?h95>$q`VX=;$v@{!?q&4Lh(@#k|Us&@t&?Nux2O!h@IaLDtC zyL2TzR0Y*)ym)BaRRY_aT*OfYd0ZUK{g3)l2CosBWN9RU^gR+76yd(}ZWLL>%0j&F zs)7#={D!PhIx$Y0`!c;RU8#Wz33@Y#%=ujg{k}>5SJ6%U5$=37kt77nNFoZrepyPb z+TuY=U1_+z|ENE?F!vxp{-9mZQDkn2s408w30v2{;y?Xe%S5S~e+sw#cd`{LXk7B# zpi&z55r>P!bjKW2- >St6Q%^V%b z<*S KVFeyGLVual1dE~6IP|;m!SY*q#Q&h}0 ztpU_9V-Tu!w2F&FD@boB&0>{v_ _r?{7_Pg& E59BEw`JQigsqc^QD z{^WhN;%Fj`6z*qkX)3=nSLGZXxR@vkaX$hJSt0?Fw2OY|)U<~@_(18JDrFiVK!3Iv z-5*LYJ?)tt!Xg~y`>@KUFK)*w<8IrhxL6tJHt9HVwv2RJ>!-dHi+qPz?YhF{`)>?s zRn#K+abVokcuFkJ_4n7D-Qb?~^vN0O8$?}9mPAG56TLxtXWZM2oKDoD^4k;PBWy@f zyTXK6oe3pICP# #guM}qwyvgI)|-_ZW~nz#E U)JiFp zadUyevCynPGNe-Z&sf~9_ (4CT(uTzkc~bNTTY`Z`oTy*Q%_ zl7>8%Y@7L9#PQ6Ai-Uw2rmbC3AsF&TX_s(oRwA~~^vtaj;S|Tl{^k40X {?D;$3)AfbHE)HypPWu L|_lK;cCzc9^E=vzyt z>d9_tU5_kV0>gB|#21S=PCigG^s*Oaz%(7FFA)}tk^@<`;dLxc+CW25J_>Ss=m3f> z>4YTh-trTU_=%A@)>K`qnr~gjf%$mN!uGSb$7(A-0n>&BPlWCS<>)H=));L~xuN({ zBb_}UCXYlE4?0LaeiUo3aZM`OEf*R(nuUkwJ=tD{{sio|N8yd0QQv$(#py2>ul`VY zQ&c-vUS9Va-Q0ORD!{CicJa RPMZVc56vN7VVZdz1`r=BoP1T3qHba|m47eY6Y_rmKvibQw+( zQE*>z44dNgV zg~93sg`NS-+h*&H%MYmH-t9woF1Q-sYumtB`&9E`+|7$t(blAhW}!RWyZmp1?ioEr zGU{7iy%<+V&(8Gac*qT#?#rmH!xKD_2|H)qL)vOMEwjwovNG84-#R^lDRcqIIl){^ zFxrXwdd95gx rPcXCWkLLILqiz_cHgzZ z1OyL+xiHV1_iVHp{@J_6oPuii+0J!oUDoW&siGzBM#Wh^^QU+q^AN*g8oawgLZT;z zy-!Ia{5Z?wXI~c;BEAl0edxP5v2!mG;=hv7QMWd7H5ho@Aadj8*J0 gY*!QFq1iF&)yaLwpDfJq@!WMao!yMa z;b`FjA_?MXR+{WDWWQ1f;}$@dX%_Mk*aVLq1f_O%*GMFL)6xmlr|?b~J%Z^Q()*Bi zl#kfGQI@A1>Z8qxRqSg07V}QkXyPDi-xX1bNQlbZK$Kat>AK?C2M94T5vB!$vzEJA zSxZ$Naq!aulnH!NTzheX*A8pnI?$R|lQUWl;Bi{wB(Bdm#=U$wqEqp8n8Nr`vd%6l zf)8K;z_#5^Z3m`soQ(h39D~&bT+&Bs6c)#!_H}0=z9af%7q&JGsVWBEtP* zaA+^BYfa^1T-rCAMZ@$VE!|Hg3H%u%M8w1cp1gG#!tki2R4KDwgzHrFxGGb8e622a z`(HeLgarSPrR&exi5kT-cR9uHUqKo0;_5|Ep%>@L@;?FI*L@y^@dwV~C}hg-B?!&7 z#r5p+Z`hSzrIb$Zj}m7Wg(!5(uTnnGe4hH(Mm7|9 {H-v7~kf9Msz{7-*zLjCJM|E#t^= 7ATBk+@>E&OWaPw`z<)4S%D zZ!t(#WBb#1=V3a=xL|S2io{)}|GnXV$Kik1!~Z4k#jm~RkKmYp%kcZhwSUS4{2x9b z|5rAE9WYGjhb;t!K1HILS0aVptmwOD^K}#NhQUOvd7o79U9^rSR;D5rLtuOr6+Z#; zo(`({n-uCR5g4x^^s#$Ma#4Cjf;(6n4+Y)Rz7-w4Ryc90Rui809O 8H!B;Ye@ j>d+~KC}e%mBXL>To?fYLi0 z+tI*LnnK0x>)^WQY@&`b^OFK~=%Rq_Atql>3FPN=geiOkA+o|8^KRBDd>lw*=3^fv zV+KZPcF$y!&+YkP@;tTTH7_(f^H3myXOF7Y+CT*)k8|V1mubvlH2qr?);4 A|&fcwS2Ud!c$#7CJ#YT zjygfms#}WOgE`q5Yh8_G_YMB6{5SzOwAy!yin9*pma+MRifopr1w#Ii~e6gmu02oGM3+PfBxR^{%`@#Ga>;prZVajs==|iqF*Vqn;AD^ zwRLnsT7N9f3MYDTDZeOBRZ#DgO|=_q$uJIDAT+2+4n9p3=@=j7l_5%-sIBn?#G%fs zLVi1T0e=BfhiBhNR{E>0F7eSAI%!naj*tqz$7cU{im=|k7AZ-4uwws|LZEVLJyD$> zVn`3;Z40$l4)MW@- WOwECc708+eL@ z+%F!h;EC_ %Ipw9MKL&Jb%g=af+GovGnc z2+IQvHDBT>+H8vV-b2|ONdCbI@1N&W7&=@S>3j#*_`WAxP}fTsP8vqp&pb GUTEfyb)fMs!Dvsn4zM+b(mO^99D|Hpd6Ki)X%`@l822!FhF& z7cwe!)r;E^lm}x?)x66!PQml=L0}hnL=AvUi 8dj;^s=*klc_dw1Yv@o+I2gT_@5d${zMpmgI3Iqs!z0 zbGk(G6~J0fbg86E-eEraA$vpq#H*#xBVcAsWvLL6!Zv-fEC8M@=&DA11^cUY)zSD5 z3IS*KB)fyhKNMViiC>>v`=Y a8N&{UlrjN8(+Ozx8&K{`iFHW_m)b(39GUh?$0vthZ0z@$z>c<+GrB;VU7 z#XmP>P7X=SYk4&pqJ_<`L?s-JXU5!yPJc!d-C1t;+QYDBuot&AKKMfC_;p_HosB^f zf`O5vPI 2zyS6#G{2WyTFaQCVC;;=TU a9 +~S?1Z8Q2 z-o}^V8xqAOqHQ`xpo<5cp3n(Zq@XCyS&^S${44J4@N?;>IJ5h1+6EC^2ohYdO-r{` zzMr-GLo|&2GCS@D_@U}##D#q*Jbpy8#Xero>21>e5ZE-fNpZl4z}|LAie X@W_Vr=3R?xO=T+T<=Gy@8s9U6^%KO6$pVanQ-8o+8h%4sV%){pOMWA^ay zMpHwk5A?;f+o(OhwFR?tkqTuMWybZVmJd?N=+RKvqYfb{qWK=OHL0@$>_=hk)p&x1 zOK$)f`N>(aw7$mx4=12G6IOsCg>d)Q-clQ_RvD4zA+Q))V4Azku8MQYvt>JUF5l`} zTYF9ueRog|`HFc7@9C1s6YU1g=CSWa3}s_hLC<(cmLCLSR5QN7Ab?Eym4hbZ=N}hS z>$e*zQ@_51RF930zU0{(s3kYxh2& Kwf_ZapQNQFf~|w6P)_ z8@oGjPXsi_eAzt47c=spUM&5P?4;}+=VX%XBR^#tIJXPsSq)<9%rc+$+XS^>bAz11 zstlBaL|~81yC|E98?qwu>7w)$+m=pyPW^S07m9)8`+5A1W7Prnr-@d}r!j^mQ7>!T z++iYwGx@Bd6vke@N5$TChvKbst>ZfEmLv}%#Fn>28G(4%*lJl=tJDAyC&dBcxJ$E| zaW7z5z2@j}r%(0RH;g^{Mi$^@TQhdGa=p5`-SC3g$AudIa3`Qn8g2C<4ZL*USGCan z`|9c)Apfd01qFr&?WgDIEJ$fVSn|x{DaXpmp1OjxO`G`%GWk};3FS%)I}e%BnX hinWy7t#XcN}P#J*JG2v;n+rtqMI4;J!61?!fc(f*Yp)KWs9P#=65BhxR z+})JZCH!}!$er%7G);XLS_$+F-&jowcBmBCckBu72NE2wI7RZb?T`UH7&F=N!!Hz| zoMN`-jo(u$Uz!Bts3tFP99BKkCl71K7Q*HZeET*f>TAs2XuZI Y4A7f>5r`#brVAgS~TH6YRrMRc5;P_phk5(_lpb_Y5vrBfLUCtY5uJyj_aw zHZT;MoI#nC11cq Z)ZH2Egs!{=CrKAnW_Kvn^}xCm>HwoqP0n z<*H$1cY8cPA7OWq)UAD$A1b6%7apDFgQ$wD9M{=ewY6`1wSjw_bMyM{m_Wz<^qH@- zjSr5p!7&kXp%H8)r*Zv+Ft%%pEX5g=OSz_UC0pH;ex*Rzfb|C)%)D+G q&B ztKvF-isNt!aQ@7N0Tac-y1+>IvWR!TUi%OyfovbYVtOx#jN9c)zde+ZqYVjZysGL{ z9oM?#UrwVcglFY0`Ir!B_8gpgcSCzcqk+{_ZWx4VqqF{1`EJEf-*O~2K>wi1&Q5WA zqsWg_OOyX=2?`;W9V9^i_H4=KVj;p4{)#Ai vHcRXagx`&$ zgL>sQfUYCuBc1)`{DBm=gWrb#M2H{RDO-wgHH+ ru$}i(bIHDq z^Rimw<*0&&popY&pDiAxo5hNFK%vE=@;B?m-qLyay9i8+hf;PJ!>gg1(826fV;2#Y zv$lFohoks4bm*Lk*HSMtQz9En?B*-1EI>CU;?9P-zpQ&y{r)T2nwhPRiTYHzrS~PU zWUGz=nFsO@AdO1K_GZ An!Ud#J<659{ zb3rngv=A>mNkNnD +`!Qj|r@3S=2S@d8 zQEu56?o@_Q(7!hg9I^$``+d+|RheEQjz&MSG+nGq8lRoj&@ft0^!ldUmNJo+nE}9_ zOSh}fdc1dZ_xG$fTtw~Ni!fGReMV*DP|_5_w>3z=h-CV0%5-|8r<@uvw%!tg_%vl^ zGxVu@W|D7oEkWZUb8R}%(kgE-CWn_$H}inF(Xt0qX%>4!wQmj~;eUu(_}`z7f2;Pd ze!E{P(;oy>|DyCy@=;+%xt3VgP3s!68(nN=`3~57qaX{|$O tRT;u92|790zi F#{Sm+<-O)eL=*weE-j>rVjF zhRP7FPsnxAhl(+6Ik)fyyTnNa4d-McRsP7Kt582(U@0ozW~6&on98B{mCZh4s6wbT zf&1AN ({gi&+^Y#+|s;ZZMYfaj(xv zL^se*+yE~veU0DzgrgDX%2fFE#@*|V*h*(dV$m8N#Z`s_fXcipA$n&e_H$3&g~9hd z%FcUlK$w4VigApoypY@{OR+KwF9t09Jhb5GQa8ZR()?yh uYhF?#v3G;P;un!zPi6%t*g+t$UHLUYRZtOkxd$C`{nf7_qB+(&yflP6uhU zpdAh84BFt0Y{_64iszFvgIQ$r=dRAU!@+@l0`uXOFz10ErK1J5$;Q2myl4%t-vW%b z*;S{%IJ+E*DvHWnR@4n}PT~&y Q}(_B+^D~ebzNGFLS?`k%NcMefZ4`c=~$(l4A|2_RCD} zlXv#rodr(1q}LnP;JGkZWPo$z$WMCSc=;_B_+!#2P^0r=L;m9iZV5;9;@78&q4N#C zXA4w~US-pIGc#{olN-9Pf(*5iV8HQD)@C7d2Vkz|6RG26ROGm#Hxw bxGQE z4(BJblok~!3X$bxRxH7BSo_F0Y;{QQYS>7WGINF4m^~wQ_fmPly- O@bzu@xtj98OMOLv5nTtw8 ze2+@`GG6_NZ06lbn0jAnSmEh7Iqgdl((miq S`;yDq{Sp6S+?!zqS}_)IY0Ht-jD$W*8U5t?3u8W zZ_hC#yy}J5>^TkRh4Io6dl8^oU+q>doi>VDt25AtoY4KZ+M)4hIA3N42=0v6t;4lg zADJ{}vm^Y{qGWxGt5Yg8r{gND+p|s2K%bt`?3G>6Q&T!Sk1Z8ZA{9UUg=PhxVmDmk z>sj%uDZ{>bK#dw>2_|Aj`?nEBiGYe*Tc`CXluKHrzwTq093~-tpHD!-niLXnLla{L zYU-Ct>^76-YV6iD({zfD5+~o4MUXN;5OufP%rNU#4GRt8(MacXj*M-*>M5*EZBMM5 z_20t>rO=u9l89rt@VDLOcpO>g9zkaK(4oe-oTHBfzYjpbKyCf@&?eb*tY5a48=K!j zvtMp>*p0jZlJ7~~**GD4vX9|bh}gBmJwHt6cqH$>tWEy%d(_+qbUa3l(D4n1_XC2& zi%}{v5)I@hTsvnjSYu=df&`HVFR Zx5Pw(f9lP&V`#kb&@Cb~gNs;#`xqk}>i`i?EF5L1h^0iA 6MzIUa*2EX)97=Z)Ltfs zRC_@#dfeV9H`cMR$!raWg3wO1XMH-fDyi`L=3(~7b4#a9I{}~6D;1P|*vd0v%DsB1 z5I6p+u>~@wZAHINTG24W^9tWGXGgzjnJ@k5M5;CxgQJPJ$+fg8XKJVe+(mn0zNbQ# z_9N)Gup=#!rOZdt{A*SUOvKqWB6(_a((&`9oi~^(>#c%Q&W@t?ZbQJ3BjOk@YG^Jw zCw=h55>-~p`-G7Xl@~h2B&^Qr1U{udEOW0K 6*J8hpmYn<>y~|R1hcTYOqV2UtR~ecjtaLu?Y4ohgVm` z)z?jX`Q#*E+_k_EL|~UzS3!6TKe6!axO-^BPv=pN*F*US3cKl{0s`0!QJ|P_qfKCJ zp0g|X7IrREi_&zI8&Pf&9Y>>{OH{4<_2;~ej1sO!^j2Q{s~@Pny`DYsG-b|8wiC{E zOw)J6Wb32PLf?#b6rwajKT*~5Od0us A7()?o!)s4>ht6cd`i<_YU? z9^%lznKA&t2$?n6cB7bORO}YSp=N#exMlU`M<;Q$qeiY6%JRo48M-xkZ=qQPR7pHc zn3T+Vk+s_NG;E7$X@xvBm8x$Ju-u$9V9K0O<#A#rX1UMmYVW*c+7mBm6I8(vEyZek zs<3FtT5DBOUS+sk@;2;1$4Gy_v>7@*lzMsvnZ_3I`wQ!-$U^gLfz {N!wz~7E3C?@j3;ysf&4LP)0?2aQWJ2-Kpgx$EUFYWg3-1!`{@r6+w0r z?IA}_bL-+wO}77Zy(Z(LoDbEUIgptsg1xjum7iFU-`%CUR_-Y?#Nw1+AUa+yTc zuyf>rcwPa%e3+s1(N0;5iqp{>+`#nRpS1^>ec~b&Q+vRolPQHR_do)y9ecD}y{qI8 zk~}oD{~d~G3yaj$5p+$i0wbiu|6-#aHtUu>YkX%O6~Zi_l^8lf`M`{bcADzo#L#nS zMO2lDZUeC%8Dgv-`>!hSfAlB}mDjVs6)UNw_taZuI&Q0!yNdLR`u3%0&|t?%`@+5F z3ol))qZ2b(xPdZqF-<-9rz*PP(7ju 1$G eC;tMy10k zz<+y0A18){zwM>Id#f{*{})z_+oVh#RP}GWasKn!8uqizRSN$8LjL)57T($w9D0A> z?Vryl*urg`^q=t}Qy_8;&`9&9x3KKi_U}?V;ca!${-)obd_O)E_9L88X)pYzjt}X2 z{Oos^z$>MRJ(59gtiU FATo11W9{xzj zy&K`&CjLwnQFcMre;R*=cREIQgd_fEIwIT;7bHLDtN*P1pyd0vK`^xb_dbx}`I6|S z*PEE}KhL2 ^!Yd9+m z$d+`X*Bav}m)tm|v^T^L@=h9NWZFG8$6NP3ycg-9be43i8~r*tn;y|o$&K+J1?Dnd zA-0{IIvE=7Wera{EV8Y3-AeI-?Vq7exVFjwTiRdjy%JrMY*c;n;SB1a5|@H9-*i&4 zVo!Ct<4&is02^za9_m!uqwtDZ`qIdZ%PJX3NmlGA5_xBLaMOUAWOVh(R7+s6Kn+v- zIbcj~>H%K?cr#$hOsGbpX8sRS-zGlvyfs(q0g}Y`Yq<|O@L@)ZRg#HR=5JtSCBcD> zZFSGMbfwT32sy)`*6+T3pT3jq)nu&U6T9dnENVc8(9#prSY{-gLW@(Bz?he?`kfV8 zlq+jH$}bl!OjHd`H;P~R!kPS}o28^rUwGXM9)|IU BHIdHdumz}#bqS@?Zj*TRHi-~DIy8>to+k4XpP+iXfsT$2kXh3bY3Rkm3Ef!4 zf{n_OpR~RV3y;Obd59SSFBF&zWQgS?!!}uVp&ayJ8AvEh)(~UHv$#5G93inmIfkeY zNxOt&{E&(&0OuPJKMC5%UGfp1Y1|Y;Hb^&OOTm4?b2<^S5a0vUcU)udwi| t1>p zKI|GsxoYt zlP;hRi^9rF3Bz!?TJkHa!Zshr_u?3_b8U9YEn})+b2&ig-JF_>8Dk;1-zt+(t-Q{B z>C;XN0dKL78idaR#bRKE3Dq1^G$-sF80;HPxC)zd%rG8m7{uNd5$>CR-o91hB0nh0 z5?;+N5nb;E#;ufb_FplcW>!QD)YXqc&@y%6#D~laLwzNiS>8I0UMrlFbL}H8TQPgu z@Fqlv7^0ExQ0`l@$~8ISp^khV_}mVzQq^zqC4EKjAZB~$1)3q4T~>aOxs;|&IZDer zA4Of9^BMN2xcU2*T)I0TusUhh<;X+R?%S$$mJ!E_?qFS2)2^@r7D!f#C5EC+IlmT+ zWAg5#c3Qexv@`+oIW?Y)6M&qQeTY{vuDH-(@{c|Q(McEQXYhU2;*43gky7^(e=YC$ zM36LzBR4h&H=__ow4i-NYFwGi!5Ujk1QhaVRSaIAXV(v!@a1GwGH;d&n`aiFAuaRZ z^Go0AwzS-fub9H~arNyp7Brz={!Du-GNr|ATNy1QmE%oY-?RMy5r%d;x~0yP9LR%L z5}*o@aN`C{A_(2|(%hEbxK=$b6!&mNk3@XZsBa%-`tz-y{BGmX6Knc4o{BKcbim!R z`K?3_Qivi$9>O%L$!v)ZEeTY4+4+II%gDshr=d^|77$fqMnvF}$(nR86@LTm_oZ|e zP(xj#6_|~dMm0Rj;h3`MfL%PIHJw4;5qFdW!wb26&@^T^7ta>j26QZK8UNF0qPeI6 zifbN|QGkSFE{AbTYyL;o?45SI=pR4h%3>yeHlt=p(Vu4*Pl@8vhFv{H9gJ$>KX5fH zA4ta~Vz>CFVc{F3vN!NlS6t8B5)juVJhKLa!ZXcxn|yE!ACk2Rr2KaT1pofFpg_|4 z7uIW&4=WgMQKnIYd6wUww#vV-S{44n5-)SD9Uj_?c(2j>EwJ84urf09-Tv!7t+7&( z_TEv_D;1b9cI0*(B7UTz?fS~ouvZIc_1uT@k2d!J_Sz}VHtGwlo{@=>HqS9cbQjBw zd5& &QHswmXl1(ZJZ_*s~oT JI`eVC~hWzt`Ub_#(xr)H{n*In6?l*yKrdiM}mCPlu$sk+rYKF|RC`4p)r+<%I zAah=8m2`z**V&4Cgxl$J1r2I(gGs|FLxW-CC4W2D&!g6YU~blRiul?3;<92Cl7_mT zeDuK>rac{%I%--p=6B?5%@lQg3QaOm6vzjWBCA7}6Z^>()#=tSQhN(#oD@ICt!yGt zacP @kEBhgJq& zlWHvg7?Ije{PQXGV%~&n=#NvyE~XC~Mo{ch@Bk*Rm3W-!H#b3m BxR2PjP2V0;$q>8jE00v$VIkT`+EU7}{{;+!6C^9oqgJ@VDu?9su z;WT;z`g2uH3g+pg*ng19b5a}wW16i0T~s W-w3rf_{)4DH;~v- zR~3nhfR?tPpA;9i_q#$P$>vPY)-8Su%BBk%x3(UY8#eTJR0cndG|d+PyPNxnCzrW0 z#gCyzG%6=IG_uZuM4VbQ7~jGg;CxXcNVX!(9sGVS*zcZ3^>@}+uQ^YnmOxefMZww7 z{9;%v9T$o8gHdaI{6^0PpS5G7CpYfDhhN10AvRR9z+jUoDE>t%^{*hCfAr`-2DdTw zLz&E*l^w7PQtIe%Y6 hIgqKpGvEz?` z;+!)JS!WJ6ex=GhYn*i3G`yFpI^_~KQss|?7+WBAu+oXBmK6X!q>L+jJZUE t9}& zvPU;H2Y 7Bz1v@YuYyH1(pN6LXI!g2`3tGE%Y3d-bq7j^_spUfx&ir^KS? z9z`vc<=G}S
WK7w8PQdq??64FT zxv99|Rrb|jRxI1e`0`QYR>kB&ayCh5b<*^aUEzJJF^LW-nhQy>OLpz@u|8!dRlmp1 zH9oPq5`rbbs$Pw|*mut##;;bY*gc!rOJXT9ExJMDknL57%CuLLwtp_8y0cW59qo>X z^=&K@egbr>X;E{u0LX5;Y*4kTLDz|+99O!Tg&&+*T)pD+G!v@MeDu;Wf`%D_`q @vy^|uj}IzP?i)e+MbK;LLWRd)&1&B$jf(#!EQ`8D7` z<~5dw%?V@W^B3v{-lB6+)3ijBW%Crzo9S37vhi8cijuNx!;Gd>Bvfbz=9-Zuo&)^J z@{SMkuq3ef)ryy!%=6)uIlK&mCF`XClGNF2`o8?#cx`X|hblk&-6bvDIr6?#loa?d zh97K^QFb~P7SC)!g@iC6n^6J4<{QCHE_Nu*bA 76o(<&iwa2JYb0nU$FHPO*?tLA<1W55 `2jW(UzY4siedX}pd(KwbjK4Mb FuW+cES0u?{n8pS*b_ l^y!L}9P|`i;c$p(k_9r7&_&RY#5wwS0_rIj94d;wGhCIb-8l?YSC%rwlPp zFulv-0cl8hhwAHQlSK~OifImpn_DScA@vz$`<3oXgHhLv<1oo?BY@^8)u0F$#xqCu zUL$^sbF0x7K8!(HJHG+I94ozy8>BfQ47 68$2s zk_YR+@gJ=dfka~817FoT+zJl@slkAV=^7b^OusIbKJ0XyoRkb^$@irA*2Y&D%X_w4 z3!3kssHr9rp|8wuwtFG{tG_+d%WJZz>3A*3&x52t!U|lyP*FS7CmQp)Rz@_C6@r)D zh?!iJr9j;Bn{#ofYI!utwagm5KGe43gebFpY$cm5& z`2ff#L?a!yQzsiIrAa~I>WA72j3?-d=pyQ+c&bu(>>6E3$g8I*bL-^u-QtKr4(r y;tl_GWUHuxy5VAUES%SJw>}ZSdE;X!Jn{89!I*g6S%f z!hhTUsly2GXJR_1q|V2bry0lGl{69mK|uqK#My6utG}>(!~ZxLFFM(Y>YGT^@T~AN zjaiO(%yn|scYmdq4K!A3Up{Z!K{ih|QQVN%Hn%ia#0vUN`~HP>!m;5O7A)!UXG-qz zJ6`doh5Y%yKjZ$F?OH+-JoRf@%YR|jB}A+eUafq+SNmbLo~!}=M@QkD+IsuR>hJ%Q z`!Bowf9>D}Io}641RClu$2KCfaYS 1Y=7}`+LrWBh^(ixCpLiAPY+ZCR-%@)ojD1aA=!&_VM@B!VxP2N0a_*#b% zlIYD(_4L(`iYflIQo@T2(J55NR_|KN-~7W>81`t8pS7$oSitfpdq%ifg47I}l3=`% zquw)T6kJi@{g|;(M?j>5kgaH9cc331a5@|f9-zm@{<28(hI9rEstg|L;GUT=@GoN~ zkp{8bNOP-$Ibrx7Z`+e@zQ!`*w(JOa)3~7uivfa>_IPQv_@qbIUXmxw!>s4n*fx%N zm9WxtNUjbe!y86Xc}Tl}yFw>Ua(t{tQEDUM(d(bXj0P_c*(X+(m~@H|_W^=devj16 z#A%EuE%^8?u#ic!66XT$j$lEE`5SnXv-DLoa7Fl7tY|aK)h#aV)v32YCIXN(gHMhX z=i7<_E)fhIzv21uaq!K%*vfckXO|C!_U{o+#H7+)!0m*${iPcQFS2Oo>E0+)St!|j z6sa1Js~uK&uv86|!Xl1Gm-0)!&o8bi9jl1eo0FsGv)N|Ga9RmSXKO7P9?$``4;FYl zsHP|NB^n-~%2ExO4V~6O8lU4@S(y^C9NAhCFjCQ)gQmzeU6$Q}o9em_zlxJ7X@9mg z7Y$E^gT(5l@W`zeG+Tv>qt$b8x`vAru998z0IMyz!r1yvNm-LVABxdUIJ+wL&CAz@ zBp`>F9(s-`G+q=r>B``O-FT0#0uz;%s^yTs1>=fH9A5tyI?^?1v;)>w{aexNT|gt) zU_4in*1+K92&Fm_dZ(g>eb?_r{kVhDXKcevZ%=&GO-JAmo|YvbBhLWx_nexJONyWF zxOXryeIo15@U-Y%d8wOXKB|aHMLs5ON=4;;u@^!AnJ=TG^T#^&vSeAjur0 `ltC#N;_MtD9L_Y;nTqXBtu( ziuD#TgcO#xA6>uYjlk2_T&T@Js~1^wlhxm~Z&hWnl|me+d^z1Z`oTF_<;(3cX)>{C z!?Nj%r9sOi?k8+_;axXOZt=a}GN(O#R$(1G;7EuTW|~&YDbD(EI*s!6$?qp#zEtz8 zn}tn3!+Bl!P|fVY N0TG7P?@hQV-n-e8{iGp z;(n#?okpSe70p=EsY_}7K=)IP5Z^p;n0gmII__4Mq+V+mp2J@bBNSgYs|=E?RcUX% z(VJak3#-1G)SojNq%!~6whDa7dYXZ@-3lVkecRRUd13^qEH7-T$;{a!kN0iKO QIE+7_4zFX zXbc6Bm9ZH$`=EMfZ;(1p_E`IU=(tgaUQb=3hFpnrwuTNjpL0VWv0m$EoIP0wuLsz5 zB}G+Qob@5b!Ul%Misp1S!%H_ZqAC@ptQYqU *j}%E z=fvgO`l0&al#0&6u_)h Be%DHd&|6) js;AmEs0J`xlE$hmzKVxJkUDJ(}(Ls6^$+BYQdzklJOKn$| zj>(so=FMSs24SeXdseSTo4eC6l1vs!DbC6vOE0ZputfBEn=by^68- zkt%k StmwEp7Il0VnOPa&I102RMhzCj9j|I!Nh~}PJqaIlQa+5I@0m%XcU-0c+Um{W zdp(5< Rc3Nr3V;g@uEb@4|q$5&~2JSO_+BR+SD!V}Gf?@5VQNuSOrbb|Ns?(eBn zd>`njf{*})-s;}Povp0&oDrYpqrJv_U#9&Zv2av?uP6gtL4R{7Agzj^n3XCLvFAxh zk1eZ)c^$r6nEDS9)Nn_IyE+D5`eKCF%#?PVz^#dSe3_5qEFuo^-U}v72H8t8*H+ z)VS^gDfIOyEGD^Mv(IQ`agTnM!z@qs{V^i=p!Pd8QpYnY!d+7O3~ QH6eSCwoNpovewJ_ik zJ2-T5Htpi(` i*HrA0#*DTP>hDpJ}>RUifS_2qPx zja~kJ{m~qm=^(l^-~Ks7PqzVqMY@fEsV_G&dcSd}eIhH#u_yEVd_wlnK~*4ptpki{ zrTW~T7RI99L4h{$Ilj}QQgL2efz@${J(k3MQn3zNWw%2 |~`E~P? zGgd+rvyWI$6+y@y%FPw7ahZ5+m`W$f_` m zv*Uj(Gk