From 37b205680862c1b599ebeabb51f0af3fcfa3ea2b Mon Sep 17 00:00:00 2001 From: umbra audio Date: Sat, 26 Sep 2026 07:57:11 -0700 Subject: [PATCH] Add UmbraTrans UI prototype and integration design --- ...udio-database-prompt-1-schema-contract.txt | 226 ++++++++++++++++++ ...o-database-prompt-2-connect-and-verify.txt | 169 +++++++++++++ docs/umbratrans-ui-design.md | 112 +++++++++ web/README.md | 20 ++ web/assets/admin.js | 46 ++++ web/assets/app.js | 56 +++++ web/assets/styles.css | 201 ++++++++++++++++ web/assets/umbratrans-icon.jpg | Bin 0 -> 92804 bytes web/index.html | 53 ++++ web/uadmin/index.html | 99 ++++++++ web/workspace.html | 114 +++++++++ 11 files changed, 1096 insertions(+) create mode 100644 docs/umbra-audio-database-prompt-1-schema-contract.txt create mode 100644 docs/umbra-audio-database-prompt-2-connect-and-verify.txt create mode 100644 docs/umbratrans-ui-design.md create mode 100644 web/README.md create mode 100644 web/assets/admin.js create mode 100644 web/assets/app.js create mode 100644 web/assets/styles.css create mode 100644 web/assets/umbratrans-icon.jpg create mode 100644 web/index.html create mode 100644 web/uadmin/index.html create mode 100644 web/workspace.html diff --git a/docs/umbra-audio-database-prompt-1-schema-contract.txt b/docs/umbra-audio-database-prompt-1-schema-contract.txt new file mode 100644 index 0000000..4e397eb --- /dev/null +++ b/docs/umbra-audio-database-prompt-1-schema-contract.txt @@ -0,0 +1,226 @@ +UMBRA AUDIO ENTERPRISE DATABASE INTEGRATION — PROMPT 1 +CONTINUITY, ACCESS, AND SCHEMA CONTRACT + +You are the Umbra Audio integration agent. + +Objective: +Design a safe transition for Umbra Audio to use the shared enterprise PostgreSQL database while the audio system continues operating and creating audiobooks. + +This is not a shutdown-and-rebuild project. Audiobook production must remain available during the transition. The shared enterprise database will become the authoritative source for accounts, organizations, projects, memberships, permissions, project state, source-book analysis, speakers, voices, translation references, audio runs, artifacts, lineage, and audit history. + +The same enterprise database will later be used by the translation/review UI. The audio system and that UI must use the same identities, organizations, projects, permissions, and stable record IDs. They must not create independent account or project silos. + +This is a DISCOVERY AND DESIGN PHASE ONLY. + +Do not: +- connect to the production database; +- run DDL, DML, migrations, grants, or role changes; +- create tables, alter tables, copy data, or change configuration; +- stop or disable the audiobook production pipeline; +- invent existing columns, tables, users, projects, or production data; +- use or request credentials, tokens, private keys, connection strings, or secret values; +- put secrets in prompts, command lines, environment dumps, logs, reports, or files. + +Inputs: +- the current Umbra Audio source code and configuration; +- the current ebook ingestion, analysis, voice, and audiobook-generation pipeline; +- the current API and review UI; +- the current local user, project, job, and artifact persistence; +- the approved shared schema reference, currently the control-plane schema at version 001_control_plane; +- any existing local database, JSON, SQLite, or file-based persistence. + +Known shared control-plane concepts: +- organizations +- projects +- users +- roles and permissions +- user_roles and project memberships +- sessions, invitations, and MFA-related records +- audit_events +- project-scoped roles including translator, proofreader, audio_director, voice_manager, project_manager, and release_manager + +The shared database currently has tenancy and control-plane tables, but you must verify this rather than assume it. Do not claim that ebook, voice, translation, or audiobook domain tables already exist. + +Tasks: + +1. Continuity and current-state inventory. + +Document how the audio system operates today: +- how an ebook enters the system; +- how analysis creates speakers and voices; +- how audiobook jobs are queued, retried, and completed; +- how artifacts are named, stored, and retrieved; +- how the API and UI identify a project; +- how the current system stores users, projects, and job state; +- which operations must continue during migration; +- which local data is authoritative, cached, or temporary. + +For every current persistent object, report: +- logical entity; +- current storage location; +- owner/service; +- primary identifier; +- important fields and types; +- relationships; +- lifecycle/status values; +- whether it is authoritative, derived, cached, or temporary; +- whether it contains personal, licensed, copyrighted, or otherwise sensitive data. + +2. Enterprise identity and project-access contract. + +Design how the existing audio system and the future translation/review UI will use enterprise identities. + +The design must: +- use the enterprise users, organizations, projects, roles, permissions, and user_roles records as the canonical account/project model; +- map any existing local accounts to canonical enterprise user IDs; +- avoid creating a second password store or a second project namespace; +- use the approved enterprise authentication provider or session mechanism; +- support login, logout, session expiry, revocation, and account suspension; +- require project membership before a user can see or work on an audiobook; +- restrict users to projects where they have an active membership; +- use the existing project roles where appropriate, including project_manager, audio_director, translator, proofreader, and viewer; +- record authorization decisions and material changes in audit_events; +- keep human user sessions separate from background audio-worker identities. + +The UI and API must derive organization and project context from the authenticated server-side session. They must never trust an organization_id, project_id, role, or user_id supplied by an untrusted browser, request body, query parameter, or local file. + +Explicitly define: +- login flow; +- session lifetime and revocation; +- project selection; +- authorization checks for viewing, reviewing, editing, generating, downloading, and releasing; +- behavior for suspended or deactivated users; +- service-to-service authentication for the audio worker; +- account and project segmentation rules. + +3. Canonical shared domain model. + +Evaluate, and explicitly accept or reject, models equivalent to: + +- source books / editions / source documents; +- immutable analysis runs and analysis snapshots; +- speakers or characters; +- canonical voice profiles; +- voice casting and voice reuse; +- voice licensing, consent, and usage restrictions; +- translation runs and language targets; +- translation segments or units; +- audio generation runs and voice-cast snapshots; +- generated ebook and audiobook artifacts; +- pipeline jobs, retries, and idempotency; +- provenance, lineage, checksums, and audit events. + +For every proposed table, specify: +- table name and purpose; +- row grain: exactly what one row represents; +- authoritative writer; +- primary key; +- columns, types, nullability, and defaults; +- foreign keys and delete behavior; +- unique constraints; +- indexes; +- organization_id and project_id tenancy fields; +- lifecycle/status state machine; +- RLS requirements; +- data classification and retention; +- idempotency and concurrency strategy; +- whether it is new, an extension of an existing table, or should not be stored in PostgreSQL. + +4. Shared-record and cross-language invariants. + +The design must ensure that: +- one source ebook has one stable source identity; +- one canonical project contains the audiobook and translation work for that project; +- analysis has immutable versions; +- speaker/character identity is stable across languages; +- a voice profile can be reused across translations only when language, accent, consent, and licensing rules allow it; +- every translation references a source book, project, and specific analysis version; +- every audiobook references a project, translation when applicable, a voice-cast snapshot, and a generation run; +- translated ebooks and audiobooks never become independent duplicate source records; +- the audio system continues creating audiobooks before, during, and after the cutover; +- large media files are stored in object storage, with only immutable object keys, checksums, media metadata, and lifecycle state in PostgreSQL; +- every write is idempotent and safe to retry; +- concurrent workers cannot silently overwrite one another; +- service identities are not represented by arbitrary client-supplied user IDs; +- the future translation UI can discover authorized projects and audiobooks without receiving data from a separate account system. + +5. Continuity and cutover plan. + +Design a gradual migration that does not interrupt audiobook production. + +Include: +- a repository/adapter boundary that hides the storage backend; +- a read-only mirror or shadow-read phase; +- a backfill plan for existing local users, projects, books, jobs, and artifact references; +- stable-ID mapping and reconciliation rules; +- a feature flag or per-project cutover; +- a dual-write or write-through period, if safe; +- validation of counts, IDs, checksums, and status transitions; +- retry and recovery behavior for jobs created during migration; +- a rollback plan that does not delete source data or stop the audio worker; +- a point at which the enterprise database becomes authoritative; +- a plan for historical local records that cannot be mapped. + +The audio system must be able to continue audiobook creation during the transition. The translation/review UI must not be a prerequisite for the audio worker to produce audiobooks. + +6. Schema delta. + +Classify every change as: +- ADD TABLE +- ALTER TABLE +- ADD CONSTRAINT +- ADD INDEX +- ENABLE/PROVE RLS +- BACKFILL +- GRANT/REVOKE +- NEW SERVICE ROLE +- NO CHANGE + +For each change provide: +- reason; +- dependency order; +- backward-compatible rollout strategy; +- rollback strategy; +- data-volume estimate; +- lock/availability risk; +- verification query or test; +- whether human approval is required. + +Do not emit production migration SQL in this phase. A separate reviewed migration process will produce it. + +7. Security and tenancy review. + +Explicitly evaluate: +- how the audio system authenticates; +- how the future UI authenticates; +- which database role each component uses; +- how organization and project context is established; +- how RLS is enforced; +- how a human session is distinguished from a worker identity; +- how a worker maps to a project without impersonating a user; +- how service-to-service writes are authorized; +- how audit events are recorded; +- how secrets remain outside the database and application logs; +- whether any existing RLS design can be bypassed by client-controlled settings or roles; +- whether login state can be forged or reused across organizations. + +If the existing control-plane RLS or identity mechanism is not safe for a service worker or UI session, mark it as a BLOCKER. Do not work around it. + +Required output format: + +A. Human-readable executive summary +B. Audio-production continuity assessment +C. Current-state persistence and identity inventory +D. Enterprise identity, session, and project-access contract +E. Proposed canonical entity model +F. Table-by-table contract +G. Shared-record and cross-language invariants +H. Schema delta and migration order +I. Gradual cutover, reconciliation, and rollback plan +J. Security/RLS review +K. Backup and restore requirements +L. Acceptance tests +M. Open questions and blockers +N. Machine-readable YAML or JSON contract + +Stop after producing the contract. Do not connect, migrate, or write application data until a human approves it. diff --git a/docs/umbra-audio-database-prompt-2-connect-and-verify.txt b/docs/umbra-audio-database-prompt-2-connect-and-verify.txt new file mode 100644 index 0000000..33cd6e1 --- /dev/null +++ b/docs/umbra-audio-database-prompt-2-connect-and-verify.txt @@ -0,0 +1,169 @@ +UMBRA AUDIO ENTERPRISE DATABASE INTEGRATION — PROMPT 2 +CONNECT, LOGIN, PROJECT ISOLATION, AND CONTINUITY VERIFICATION + +You are the Umbra Audio database connection and verification agent. + +Objective: +Connect the existing Umbra Audio system to the shared enterprise PostgreSQL database without interrupting audiobook production, and verify that the database is authoritative for enterprise accounts, organizations, projects, permissions, and shared audiobook state. + +The same enterprise database will be used by the future translation/review UI. Both systems must use the same identities, organizations, projects, memberships, permissions, and stable record IDs. + +Audiobook creation must continue during and after the transition. Translation generation must not begin until this verification succeeds and a human approves the result. + +Preconditions: +- the schema contract is approved; +- the continuity and cutover plan is approved; +- the migration plan is approved and applied by the designated migrator process; +- a verified logical backup and restore test exist; +- the enterprise authentication provider and session mechanism are approved; +- the runtime database roles are provisioned; +- object-storage locations and voice-licensing rules are defined. + +Never: +- use the PostgreSQL superuser for the application; +- use umbracontrol_backup for application writes; +- use umbracontrol_migrator at runtime; +- use bootstrap tokens, MFA secrets, session tokens, password hashes, /etc/shadow, pg_authid, pg_shadow, or credential files; +- print or log a connection string or secret; +- store user passwords in the audio system or the future UI; +- accept a database URL, token, organization_id, project_id, role, or user_id from an untrusted client; +- run DDL; +- copy the live PostgreSQL data directory; +- change firewall, SSH, Docker, or service configuration automatically; +- use local SQLite, JSON, or files as an independent source of truth; +- disable or weaken RLS to make a test pass; +- stop the audiobook worker as part of connection setup. + +Connection procedure: + +1. Obtain connection material from the approved secret manager or protected runtime environment. + Do not place secrets in source code, prompts, command arguments, filenames, environment dumps, or logs. + +2. Establish a read-only connection using the approved runtime role. + + The expected role model is: + - umbracontrol_api for synchronous application operations; + - umbracontrol_worker for approved asynchronous audiobook and analysis operations; + - umbracontrol_readonly for diagnostics; + - umbracontrol_migrator only for a separately reviewed migration job; + - umbracontrol_backup only for backup operations. + +3. Verify and report, without exposing secrets: + - database name; + - runtime role; + - server version; + - TLS/certificate verification state; + - host/port classification; + - UTC timezone; + - search_path; + - application name; + - connection-pool settings; + - statement and lock timeouts; + - retry/backoff behavior; + - schema_migrations version; + - expected tables and views; + - RLS-enabled status; + - sequence and identity settings; + - extension availability; + - current connection latency; + - audiobook worker health before and after connection changes. + +4. Verify enterprise login and session behavior. + + Test the real authentication path through the approved identity provider or session service. + + Confirm: + - a valid user can log in; + - logout invalidates the session; + - expired or revoked sessions cannot access the API or UI; + - suspended or deactivated accounts are denied; + - the session identifies the canonical enterprise user; + - organization and project context is derived server-side; + - a user cannot select an unauthorized project by changing a URL, query parameter, request body, or local file; + - project membership is checked for every audiobook view, review, edit, generation, download, and release action; + - the UI only lists projects and audiobooks the user is authorized to see; + - error messages do not reveal the existence of another organization’s records. + + Do not use real user credentials in tests. Use approved test identities or a staging environment. + +5. Run only read-only catalog checks. + + Do not query authentication catalogs or secret-bearing tables. + + Verify: + - the approved schema version; + - expected tables; + - foreign keys; + - unique constraints; + - indexes; + - RLS flags and policies; + - grants for the runtime role; + - absence of unexpected schema drift; + - existence of the approved project-membership and audit paths. + +6. Test tenancy, RLS, and service identity without using real content. + + In a transaction that is guaranteed to roll back: + - create synthetic organization/project identifiers; + - use one authorized test identity; + - use one identity from a different organization; + - verify the first identity can access only its project; + - verify the second identity is denied; + - verify a worker can process only jobs assigned to its service/project scope; + - verify a worker cannot impersonate an arbitrary human user; + - verify the API cannot be made to trust a client-supplied user_id, role, organization_id, or project_id; + - verify audit events are written with the correct server-derived actor context; + - verify an audiobook job can be created and inspected without exposing another project’s data; + - verify all test writes roll back cleanly. + +7. Verify audiobook-production continuity. + + With the existing audio worker and job queue still operating: + - confirm the worker can read its required canonical project and source references; + - confirm a new idempotent analysis or audiobook job can be created under an authorized project context; + - confirm job status and artifact references can be updated transactionally; + - confirm retries do not create duplicate books, analyses, voices, or audio runs; + - confirm a worker restart does not lose or duplicate an in-flight job; + - confirm local caches and temporary files are treated as derived data only; + - confirm the future translation UI can discover the resulting project and audiobook records without receiving a separate account or project list. + +8. Configure the audio system repository layer. + + The application must: + - read canonical enterprise records from PostgreSQL; + - store only derived/cache data locally; + - use database transactions for related writes; + - use idempotency keys for analysis, voice, and audiobook jobs; + - use optimistic concurrency or row versions for shared records; + - reference stable IDs rather than copying source analysis into every translation; + - record lineage from source book to analysis to translation to audio run to artifact; + - write audit events for material changes; + - retry safely; + - preserve an approved rollback or feature-flag path; + - continue audiobook creation while a project is being migrated; + - fail closed on schema-version, identity, membership, or RLS mismatch. + +9. Do not begin translation generation yet. + + Translation work may begin only after this report is approved and the audio system has demonstrated that base book, analysis, speaker, voice, project, and audiobook records are persisted canonically and are visible only to authorized users. + +Produce a sanitized JSON report containing only: + +- service name and version; +- database name; +- runtime role; +- TLS enabled and certificate verification result; +- schema version; +- enterprise login/session test result; +- project-membership test result; +- UI project/audiobook visibility test result; +- RLS verification result; +- synthetic tenancy test result; +- worker identity and authorization result; +- audiobook-production continuity result; +- transaction/idempotency test result; +- connection pool and timeout settings; +- blockers; +- approval_required: true or false. + +If any check fails, stop and report the exact blocker. Do not work around RLS, change grants, alter the schema, or disable authentication. diff --git a/docs/umbratrans-ui-design.md b/docs/umbratrans-ui-design.md new file mode 100644 index 0000000..3b9dab6 --- /dev/null +++ b/docs/umbratrans-ui-design.md @@ -0,0 +1,112 @@ +# UmbraTrans Web UI design + +**Status:** static prototype for review +**Database transition:** paused +**Primary URL:** `https://umbratrans.bdmurphy.me/` +**Admin URL:** `https://umbratrans.bdmurphy.me/uadmin/` +**Prototype listener:** local machine, TCP `8442` + +## Product shape + +UmbraTrans has two related surfaces: + +1. **Workspace** — the daily working environment for a signed-in user. It is project-focused and optimized for reviewing books, speakers, voices, translations, audio runs, and delivery status. +2. **Control** — the `/uadmin/` management surface for account provisioning, organizations, projects, maintenance, audit, and system statistics. + +The workspace and control surfaces share the Umbra brand and accessibility conventions, but intentionally use different layouts and visual emphasis. + +## Visual reference + +The control surface references the existing Umbra Audio Review UI at `umbraudio.bdmurphy.me`: + +- background: `#1a1a2e` +- panel: `#16213e` +- elevated/stat panel: `#0f3460` +- primary accent: `#7c3aed` +- secondary accent: `#a78bfa` +- text: `#e0e0e0` +- muted text: `#94a3b8` +- success: `#10b981` +- warning: `#f59e0b` +- danger: `#ef4444` +- compact cards, top navigation, status badges, and data tables +- supplied site icon: `/home/umbra/Documents/UmberTrans_Icon.jpg`, copied to the prototype as `web/assets/umbratrans-icon.jpg` + +The workspace uses a deliberately different **Studio** language: a slate/indigo canvas, left navigation rail, teal action accent, amber review accent, larger reading areas, and a pipeline-oriented layout. It should feel like a production desk rather than an admin console. + +## Routes + +| Route | Purpose | Access | +|---|---|---| +| `/` | Sign-in and account entry | Public | +| `/workspace/` or `/workspace.html` | Authenticated project workspace | Authenticated user | +| `/uadmin/` | Accounts, projects, maintenance, statistics | Organization/platform administrator | +| `/uadmin/accounts` | Account provisioning and lifecycle | Administrator | +| `/uadmin/projects` | Project management | Administrator | +| `/uadmin/maintenance` | Worker, queue, and storage operations | Administrator | +| `/uadmin/statistics` | Usage and system health | Administrator | + +The static prototype uses `index.html`, `workspace.html`, and `uadmin/index.html`. The eventual application should serve the same routes without exposing filesystem paths. + +## Authentication direction + +The UI supports two account-enrollment paths: + +1. **Temporary local password** — an administrator provisions an account with a one-time temporary password. Only an Argon2id hash is stored. The account is marked `must_change_password`; the first login must change it before any workspace access. +2. **OIDC enrollment** — an administrator provisions an account or invitation and the identity provider completes credential setup. No local password is created. + +The application should hide this choice behind an authentication adapter. Both paths must resolve to the same canonical `users` identity, organization membership, project membership, and server-side session. The browser must never supply a trusted `user_id`, `organization_id`, `project_id`, or role. + +The prototype does not authenticate, store credentials, or call a database. + +## Admin workflows to design + +- Create/suspend/reactivate an account. +- Issue a temporary password or OIDC invitation. +- Require first-login password change for temporary-password accounts. +- Assign organization and project memberships. +- View account status, last login, and MFA state. +- Create, archive, and transfer projects. +- View worker health, queue depth, failed jobs, and storage status. +- View audit history and export a sanitized report. + +Every destructive action requires a confirmation step, an explicit permission check, and an audit event. + +## Workspace workflows to design + +- Select an authorized project. +- View source book, analysis version, speakers, canonical voices, and voice cast. +- Review translation status by locale. +- Monitor analysis, audio, QA, and release stages. +- Inspect job progress without exposing filesystem paths. +- Download only artifacts authorized for the current project and release state. + +## Prototype limitations + +The current prototype uses mock data and client-side navigation only. It does not: + +- connect to PostgreSQL; +- authenticate users; +- issue or validate passwords; +- expose real accounts or projects; +- accept real credentials; +- perform administrative actions. + +Buttons demonstrate intended states and interactions only. The UI must remain a prototype until the database transition and security gates are approved. + +## Local review + +From the workspace root: + +```bash +cd /home/umbra/src/UmbraTrans +python3 -m http.server 8442 --bind 0.0.0.0 --directory web +``` + +Then open: + +- `http://:8442/` +- `http://:8442/workspace.html` +- `http://:8442/uadmin/` + +For production, terminate TLS at the approved reverse proxy, restrict the application listener to the required interface, and define the network allow-list before exposing port 8442. diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..374ebb6 --- /dev/null +++ b/web/README.md @@ -0,0 +1,20 @@ +# UmbraTrans static UI prototype + +This directory contains a local, mock-data prototype for review. + +It does not connect to PostgreSQL, authenticate accounts, issue passwords, or change production data. The admin page demonstrates the intended flows only. + +## Run locally + +```bash +cd /home/umbra/src/UmbraTrans +python3 -m http.server 8442 --bind 0.0.0.0 --directory web +``` + +Review URLs: + +- `http://:8442/` +- `http://:8442/workspace.html` +- `http://:8442/uadmin/` + +For production, put the application behind the approved TLS reverse proxy, restrict the listener/interface, and implement the authentication and authorization adapter described in the UI design document. diff --git a/web/assets/admin.js b/web/assets/admin.js new file mode 100644 index 0000000..0ee80d8 --- /dev/null +++ b/web/assets/admin.js @@ -0,0 +1,46 @@ +const $ = (selector, root = document) => root.querySelector(selector); +const $$ = (selector, root = document) => [...root.querySelectorAll(selector)]; + +function showToast(message) { + const toast = $('#toast'); + if (!toast) return; + toast.textContent = message; + toast.classList.add('toast--visible'); + window.clearTimeout(showToast.timer); + showToast.timer = window.setTimeout(() => toast.classList.remove('toast--visible'), 3600); +} + +const modal = $('#account-modal'); +const openModal = $('#open-account-modal'); +const closeModal = $('#close-account-modal'); +const cancelModal = $('#cancel-account-modal'); +const form = $('#account-form'); + +function setModal(open) { + if (!modal) return; + modal.hidden = !open; + document.body.classList.toggle('modal-open', open); + if (open) $('#account-name')?.focus(); +} + +openModal?.addEventListener('click', () => setModal(true)); +closeModal?.addEventListener('click', () => setModal(false)); +cancelModal?.addEventListener('click', () => setModal(false)); +modal?.addEventListener('click', (event) => { + if (event.target === modal) setModal(false); +}); +document.addEventListener('keydown', (event) => { + if (event.key === 'Escape') setModal(false); +}); + +form?.addEventListener('submit', (event) => { + event.preventDefault(); + const oidc = $('#oidc-enrollment')?.checked; + setModal(false); + form.reset(); + showToast(oidc ? 'Prototype OIDC enrollment flow submitted locally.' : 'Prototype temporary-password flow submitted locally.'); +}); + +$$('[data-demo-action]').forEach((button) => { + button.addEventListener('click', () => showToast(button.dataset.demoAction)); +}); diff --git a/web/assets/app.js b/web/assets/app.js new file mode 100644 index 0000000..c99f298 --- /dev/null +++ b/web/assets/app.js @@ -0,0 +1,56 @@ +const $ = (selector, root = document) => root.querySelector(selector); +const $$ = (selector, root = document) => [...root.querySelectorAll(selector)]; + +function showToast(message) { + const toast = $('#toast'); + if (!toast) return; + toast.textContent = message; + toast.classList.add('toast--visible'); + window.clearTimeout(showToast.timer); + showToast.timer = window.setTimeout(() => toast.classList.remove('toast--visible'), 3600); +} + +function setupLogin() { + const form = $('#login-form'); + if (!form) return; + const message = $('#login-message'); + const email = $('#email'); + const password = $('#password'); + const demo = $('#demo-login'); + + const completeDemoLogin = (value) => { + email.value = value || 'alex.morgan@example.com'; + password.value = 'prototype-only'; + sessionStorage.setItem('ut-demo-user', email.value); + window.location.href = 'workspace.html'; + }; + + demo?.addEventListener('click', () => completeDemoLogin()); + form.addEventListener('submit', (event) => { + event.preventDefault(); + if (!email.value.trim() || !password.value) { + message.textContent = 'Enter an account and password to continue.'; + message.className = 'form-message form-message--error'; + return; + } + message.textContent = 'Prototype login accepted locally. No credentials were transmitted.'; + message.className = 'form-message form-message--success'; + window.setTimeout(() => completeDemoLogin(email.value.trim()), 350); + }); +} + +function setupWorkspace() { + $$('[data-demo-action]').forEach((button) => { + button.addEventListener('click', () => { + if (button.textContent.trim() === 'Sign out') { + sessionStorage.removeItem('ut-demo-user'); + window.location.href = 'index.html'; + return; + } + showToast(button.dataset.demoAction); + }); + }); +} + +setupLogin(); +setupWorkspace(); diff --git a/web/assets/styles.css b/web/assets/styles.css new file mode 100644 index 0000000..25b267f --- /dev/null +++ b/web/assets/styles.css @@ -0,0 +1,201 @@ +:root { + --admin-bg: #1a1a2e; + --admin-panel: #16213e; + --admin-stat: #0f3460; + --admin-border: #2c3550; + --admin-border-bright: #414a68; + --admin-text: #e0e0e0; + --admin-muted: #94a3b8; + --admin-purple: #7c3aed; + --admin-lilac: #a78bfa; + --admin-blue: #3b82f6; + --admin-green: #10b981; + --admin-amber: #f59e0b; + --admin-red: #ef4444; + --workspace-bg: #0b1220; + --workspace-panel: #111c2f; + --workspace-panel-raised: #16263d; + --workspace-border: #243650; + --workspace-text: #eef2ff; + --workspace-muted: #8fa3bf; + --workspace-teal: #2dd4bf; + --workspace-amber: #fbbf24; + --workspace-blue: #60a5fa; + --shadow: 0 18px 45px rgba(0, 0, 0, .22); + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +* { box-sizing: border-box; } +html { scroll-behavior: smooth; } +body { margin: 0; } +a { color: inherit; } +button, input, select { font: inherit; } +button { cursor: pointer; } +button:focus-visible, a:focus-visible, input:focus-visible, select:focus-visible { outline: 3px solid rgba(45, 212, 191, .45); outline-offset: 2px; } + +/* Shared brand and status language */ +.brand-lockup { display: inline-flex; align-items: center; gap: .7rem; color: var(--admin-lilac); font-weight: 800; letter-spacing: -.02em; text-decoration: none; font-size: 1.1rem; } +.brand-image { display: block; width: 2.55rem; height: 2.55rem; border-radius: .72rem; object-fit: cover; box-shadow: 0 8px 22px rgba(124, 58, 237, .32); } +.brand-lockup--rail .brand-image { width: 2.35rem; height: 2.35rem; } +.eyebrow { margin: 0 0 .45rem; color: var(--admin-lilac); font-size: .72rem; font-weight: 800; letter-spacing: .13em; text-transform: uppercase; } +.eyebrow--teal { color: var(--workspace-teal); } +.status-pill { display: inline-flex; align-items: center; gap: .35rem; width: fit-content; border-radius: 999px; padding: .28rem .6rem; font-size: .7rem; font-weight: 750; white-space: nowrap; } +.status-pill--info { color: #bfdbfe; background: #1e3a5f; } +.status-pill--success { color: #a7f3d0; background: #065f46; } +.status-pill--warning { color: #fde68a; background: #78350f; } +.status-pill--muted { color: #cbd5e1; background: #334155; } +.status-dot { display: inline-block; width: .55rem; height: .55rem; border-radius: 50%; } +.status-dot--good { background: #34d399; box-shadow: 0 0 0 .25rem rgba(52, 211, 153, .12); } +.button { display: inline-flex; align-items: center; justify-content: center; gap: .45rem; min-height: 2.45rem; border: 1px solid transparent; border-radius: .55rem; padding: .55rem .9rem; font-size: .82rem; font-weight: 750; text-decoration: none; transition: transform .15s ease, background .15s ease, border-color .15s ease; } +.button:hover { transform: translateY(-1px); } +.button--primary { color: #fff; background: var(--admin-blue); } +.button--primary:hover { background: #2563eb; } +.button--secondary { color: var(--workspace-text); background: var(--workspace-panel-raised); border-color: var(--workspace-border); } +.button--secondary:hover { border-color: var(--workspace-teal); } +.button--teal { color: #062a28; background: var(--workspace-teal); } +.button--teal:hover { background: #5eead4; } +.button--ghost { color: var(--admin-muted); background: transparent; border-color: var(--admin-border); } +.button--ghost:hover { color: var(--admin-text); border-color: var(--admin-lilac); } +.button--wide { width: 100%; } +.text-button, .admin-text-button { border: 0; background: none; color: var(--admin-lilac); font-size: .75rem; font-weight: 750; } +.text-button:hover, .admin-text-button:hover { color: #fff; text-decoration: underline; } +.muted-label { color: var(--admin-muted); font-size: .75rem; } + +/* Login */ +.auth-page { min-height: 100vh; color: var(--admin-text); background: radial-gradient(circle at 10% 0%, #26204b 0, transparent 34rem), var(--admin-bg); } +.auth-shell { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(22rem, 30rem); gap: clamp(2rem, 7vw, 8rem); align-items: center; width: min(1120px, calc(100% - 3rem)); min-height: 100vh; margin: 0 auto; padding: 3rem 0; } +.auth-brand { align-self: stretch; display: flex; flex-direction: column; justify-content: space-between; min-height: 40rem; padding: 1rem 0; } +.brand-copy { max-width: 34rem; margin: auto 0; } +.brand-copy h1 { max-width: 12ch; margin: 0 0 1.3rem; color: #fff; font-size: clamp(2.7rem, 6vw, 5.4rem); line-height: .98; letter-spacing: -.065em; } +.lede { max-width: 30rem; margin: 0; color: var(--admin-muted); font-size: 1.05rem; line-height: 1.7; } +.brand-points { display: grid; gap: .7rem; margin: 2.5rem 0; color: #c4b5fd; font-size: .85rem; } +.brand-points > div { display: flex; align-items: center; gap: .65rem; } +.point-dot { width: .45rem; height: .45rem; border-radius: 50%; background: var(--workspace-teal); box-shadow: 0 0 0 .3rem rgba(45, 212, 191, .12); } +.prototype-note { margin: 0; color: #64748b; font-size: .72rem; letter-spacing: .04em; } +.auth-card { padding: 2rem; background: rgba(22, 33, 62, .88); border: 1px solid var(--admin-border); border-radius: 1rem; box-shadow: var(--shadow); backdrop-filter: blur(14px); } +.auth-card-heading h2 { margin: .75rem 0 .55rem; color: #fff; font-size: 1.6rem; letter-spacing: -.03em; } +.auth-card-heading p { margin: 0 0 1.7rem; color: var(--admin-muted); font-size: .86rem; line-height: 1.6; } +.stack-form { display: grid; gap: .55rem; } +.stack-form label { margin-top: .45rem; color: #c4b5fd; font-size: .74rem; font-weight: 750; } +.stack-form input, .stack-form select { width: 100%; min-height: 2.8rem; padding: .65rem .8rem; color: var(--admin-text); background: #0f172a; border: 1px solid var(--admin-border-bright); border-radius: .5rem; } +.stack-form input::placeholder { color: #64748b; } +.stack-form input:focus, .stack-form select:focus { border-color: var(--admin-purple); outline: none; box-shadow: 0 0 0 3px rgba(124, 58, 237, .18); } +.form-message { min-height: 1.2rem; margin: .35rem 0 .2rem; color: var(--admin-muted); font-size: .75rem; } +.form-message--error { color: #fca5a5; } +.form-message--success { color: #6ee7b7; } +.auth-divider { display: flex; align-items: center; gap: .8rem; margin: 1.6rem 0 1rem; color: #64748b; font-size: .7rem; } +.auth-divider::before, .auth-divider::after { content: ""; height: 1px; flex: 1; background: var(--admin-border); } +.admin-link { display: flex; justify-content: space-between; padding: .8rem .9rem; color: var(--admin-lilac); background: rgba(124, 58, 237, .08); border: 1px solid rgba(167, 139, 250, .3); border-radius: .55rem; font-size: .8rem; font-weight: 750; text-decoration: none; } +.admin-link:hover { background: rgba(124, 58, 237, .18); } +.auth-footnote { margin: 1.3rem 0 0; color: #64748b; font-size: .7rem; line-height: 1.5; } + +/* Admin / control surface */ +.admin-page { min-height: 100vh; color: var(--admin-text); background: var(--admin-bg); } +.admin-shell { min-height: 100vh; } +.admin-topbar { display: flex; align-items: center; gap: 1.5rem; min-height: 4.5rem; padding: .8rem clamp(1rem, 3vw, 3rem); background: rgba(15, 23, 42, .5); border-bottom: 1px solid var(--admin-border); } +.admin-context { display: flex; align-items: center; gap: .7rem; padding-left: 1.5rem; border-left: 1px solid var(--admin-border); } +.admin-context-name { color: var(--admin-muted); font-size: .78rem; } +.admin-top-actions { display: flex; align-items: center; gap: 1rem; margin-left: auto; } +.admin-user { display: inline-flex; align-items: center; gap: .5rem; color: #cbd5e1; font-size: .78rem; } +.admin-exit { color: var(--admin-lilac); font-size: .75rem; font-weight: 750; text-decoration: none; } +.admin-layout { display: grid; grid-template-columns: 15rem minmax(0, 1fr); min-height: calc(100vh - 4.5rem); } +.admin-sidebar { display: flex; flex-direction: column; padding: 1.5rem 1rem; background: #141c33; border-right: 1px solid var(--admin-border); } +.admin-nav-label { padding: 0 .7rem .55rem; color: #64748b; font-size: .64rem; font-weight: 800; letter-spacing: .14em; text-transform: uppercase; } +.admin-nav-label--spaced { margin-top: 1.7rem; } +.admin-nav-link { display: flex; align-items: center; gap: .7rem; margin: .15rem 0; padding: .65rem .7rem; color: var(--admin-muted); border-radius: .45rem; font-size: .8rem; font-weight: 700; text-decoration: none; } +.admin-nav-link span { width: 1rem; color: #64748b; text-align: center; } +.admin-nav-link:hover { color: #fff; background: rgba(124, 58, 237, .1); } +.admin-nav-link--active { color: #fff; background: rgba(124, 58, 237, .2); box-shadow: inset 2px 0 var(--admin-purple); } +.admin-nav-link--active span { color: var(--admin-lilac); } +.admin-sidebar-footer { margin-top: auto; padding: .8rem .7rem 0; color: #94a3b8; font-size: .68rem; line-height: 1.7; border-top: 1px solid var(--admin-border); } +.admin-sidebar-footer small { color: #64748b; } +.admin-main { width: min(1440px, 100%); margin: 0 auto; padding: clamp(1.2rem, 3vw, 2.5rem); } +.admin-banner { display: flex; align-items: center; gap: .7rem; margin-bottom: 1.6rem; padding: .7rem .9rem; color: #c4b5fd; background: rgba(124, 58, 237, .1); border: 1px solid rgba(167, 139, 250, .25); border-radius: .5rem; font-size: .73rem; } +.admin-banner strong { color: #fff; white-space: nowrap; } +.admin-heading { display: flex; align-items: end; justify-content: space-between; gap: 1.5rem; margin-bottom: 1.6rem; } +.admin-heading h1 { margin: 0 0 .35rem; color: #fff; font-size: clamp(1.9rem, 3vw, 2.7rem); letter-spacing: -.05em; } +.admin-heading p:not(.eyebrow) { margin: 0; color: var(--admin-muted); font-size: .86rem; } +.admin-stat-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1rem; margin-bottom: 1rem; } +.admin-stat, .admin-card { background: var(--admin-panel); border: 1px solid var(--admin-border); border-radius: .7rem; } +.admin-stat { padding: 1.1rem; } +.admin-stat-label { display: block; margin-bottom: .5rem; color: var(--admin-muted); font-size: .72rem; } +.admin-stat strong { display: block; color: var(--admin-purple); font-size: 2rem; letter-spacing: -.05em; } +.admin-stat small { display: block; margin-top: .35rem; color: #64748b; font-size: .68rem; } +.trend-up { color: #6ee7b7; } +.health-value { display: flex !important; align-items: center; gap: .5rem; color: #a7f3d0 !important; font-size: 1.35rem !important; } +.admin-columns { display: grid; grid-template-columns: minmax(0, 1.35fr) minmax(20rem, .9fr); gap: 1rem; margin-bottom: 1rem; } +.admin-columns--lower { grid-template-columns: minmax(0, 1.1fr) minmax(20rem, .9fr); } +.admin-card { min-width: 0; padding: 1.2rem; } +.admin-card-heading { display: flex; align-items: start; justify-content: space-between; gap: 1rem; margin-bottom: 1rem; } +.admin-card-heading h2 { margin: 0; color: #fff; font-size: 1.05rem; letter-spacing: -.02em; } +.admin-table-wrap { overflow-x: auto; } +.admin-table { width: 100%; border-collapse: collapse; font-size: .74rem; } +.admin-table th { padding: .55rem .5rem; color: var(--admin-lilac); font-size: .66rem; text-align: left; text-transform: uppercase; letter-spacing: .08em; } +.admin-table td { padding: .7rem .5rem; color: #cbd5e1; border-top: 1px solid #26334f; white-space: nowrap; } +.admin-table tbody tr:hover { background: #1e293b; } +.table-user { display: flex; align-items: center; gap: .55rem; } +.table-user > span:last-child { display: grid; gap: .12rem; } +.table-user strong { color: #f8fafc; } +.table-user small { color: #64748b; font-size: .66rem; } +.avatar { display: inline-grid; place-items: center; flex: 0 0 auto; width: 2rem; height: 2rem; color: #fff; background: #334155; border-radius: .6rem; font-size: .65rem; font-weight: 800; } +.avatar--admin { background: var(--admin-purple); } +.avatar--small { width: 1.85rem; height: 1.85rem; border-radius: .5rem; } +.avatar--violet { background: #7c3aed; }.avatar--blue { background: #2563eb; }.avatar--amber { background: #b45309; }.avatar--rose { background: #be185d; } +.admin-project-list { display: grid; gap: .55rem; } +.admin-project-row { display: flex; align-items: center; gap: .65rem; padding: .7rem; background: #101a30; border: 1px solid #26334f; border-radius: .5rem; } +.admin-project-row > div { display: grid; flex: 1; gap: .18rem; min-width: 0; } +.admin-project-row strong { color: #f8fafc; font-size: .78rem; } +.admin-project-row small { color: #64748b; font-size: .67rem; } +.project-mark { display: grid; place-items: center; width: 2rem; height: 2rem; border-radius: .5rem; font-size: .65rem; font-weight: 800; } +.project-mark--purple { color: #ddd6fe; background: #4c1d95; }.project-mark--blue { color: #bfdbfe; background: #1e3a8a; }.project-mark--teal { color: #99f6e4; background: #115e59; } +.admin-card--maintenance { margin-bottom: 1rem; } +.maintenance-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: .7rem; } +.maintenance-item { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: .6rem; padding: .75rem; background: #101a30; border: 1px solid #26334f; border-radius: .5rem; } +.maintenance-item > div { display: grid; gap: .2rem; min-width: 0; } +.maintenance-item strong { color: #e2e8f0; font-size: .74rem; }.maintenance-item small { color: #64748b; font-size: .65rem; white-space: nowrap; } +.maintenance-icon { display: grid; place-items: center; width: 1.8rem; height: 1.8rem; border-radius: .5rem; font-weight: 800; } +.maintenance-icon--green { color: #a7f3d0; background: #065f46; }.maintenance-icon--purple { color: #ddd6fe; background: #4c1d95; }.maintenance-icon--blue { color: #bfdbfe; background: #1e3a5f; }.maintenance-icon--amber { color: #fde68a; background: #78350f; } +.admin-chart-placeholder { padding: .7rem 0 0; } +.chart-bars { display: flex; align-items: end; gap: .45rem; height: 9rem; padding: 0 .3rem; border-bottom: 1px solid #334155; } +.chart-bars i { display: block; flex: 1; min-width: .4rem; background: linear-gradient(180deg, var(--admin-lilac), #4c1d95); border-radius: .25rem .25rem 0 0; opacity: .85; } +.chart-axis { display: flex; justify-content: space-between; padding-top: .5rem; color: #64748b; font-size: .62rem; } +.audit-list { display: grid; gap: .85rem; } +.audit-list > div { display: flex; align-items: start; gap: .6rem; } +.audit-list p { display: grid; gap: .18rem; margin: 0; }.audit-list strong { color: #e2e8f0; font-size: .75rem; }.audit-list small { color: #64748b; font-size: .66rem; } +.audit-dot { width: .55rem; height: .55rem; margin-top: .35rem; border-radius: 50%; }.audit-dot--purple { background: var(--admin-lilac); }.audit-dot--blue { background: #60a5fa; }.audit-dot--amber { background: var(--admin-amber); } + +/* Workspace surface */ +.workspace-page { min-height: 100vh; color: var(--workspace-text); background: var(--workspace-bg); } +.workspace-shell { display: grid; grid-template-columns: 15rem minmax(0, 1fr); min-height: 100vh; } +.workspace-rail { display: flex; flex-direction: column; padding: 1.3rem 1rem; background: #0d1728; border-right: 1px solid var(--workspace-border); } +.brand-lockup--rail { color: #c4b5fd; } +.rail-section-label { margin: 2.3rem .7rem .55rem; color: #64748b; font-size: .62rem; font-weight: 800; letter-spacing: .14em; text-transform: uppercase; } +.rail-section-label--spaced { margin-top: 1.7rem; } +.rail-nav { display: grid; gap: .2rem; } +.rail-link { display: flex; align-items: center; gap: .7rem; padding: .68rem .7rem; color: var(--workspace-muted); border-radius: .5rem; font-size: .78rem; font-weight: 700; text-decoration: none; } +.rail-link:hover { color: #fff; background: #16263d; }.rail-link--active { color: #fff; background: #1b2f4a; box-shadow: inset 2px 0 var(--workspace-teal); } +.rail-icon { width: 1.1rem; color: #5eead4; text-align: center; font-size: .95rem; } +.rail-footer { margin-top: auto; padding: .9rem .7rem 0; border-top: 1px solid var(--workspace-border); } +.rail-user { display: flex; align-items: center; gap: .55rem; margin-bottom: .8rem; }.rail-user > span:last-child { display: grid; gap: .12rem; }.rail-user strong { color: #e2e8f0; font-size: .73rem; }.rail-user small { color: #64748b; font-size: .63rem; } +.workspace-main { min-width: 0; width: min(1440px, 100%); margin: 0 auto; padding: 0 clamp(1.1rem, 3vw, 2.8rem) 3rem; } +.workspace-topbar { display: flex; align-items: center; justify-content: space-between; min-height: 4.5rem; gap: 1rem; border-bottom: 1px solid var(--workspace-border); } +.breadcrumb { display: flex; align-items: center; gap: .55rem; color: #64748b; font-size: .74rem; }.breadcrumb strong { color: #cbd5e1; }.topbar-actions { display: flex; align-items: center; gap: .8rem; }.icon-button { display: grid; place-items: center; width: 2rem; height: 2rem; color: #93c5fd; background: #16263d; border: 1px solid #2b4363; border-radius: .5rem; }.topbar-admin-link { color: #5eead4; font-size: .72rem; font-weight: 750; text-decoration: none; } +.workspace-hero { display: flex; align-items: end; justify-content: space-between; gap: 1.5rem; padding: 2.6rem 0 2rem; }.workspace-hero h1 { margin: 0 0 .45rem; font-size: clamp(2.2rem, 5vw, 4rem); letter-spacing: -.06em; }.hero-subtitle { max-width: 38rem; margin: 0; color: var(--workspace-muted); font-size: .9rem; line-height: 1.6; }.hero-actions { display: flex; gap: .6rem; flex-wrap: wrap; } +.pipeline-card, .workspace-panel { padding: 1.2rem; background: var(--workspace-panel); border: 1px solid var(--workspace-border); border-radius: .8rem; }.pipeline-card { margin-bottom: 1rem; }.section-heading { display: flex; align-items: start; justify-content: space-between; gap: 1rem; }.section-heading h2 { margin: 0; font-size: 1.05rem; letter-spacing: -.02em; }.section-heading .text-button { color: var(--workspace-teal); } +.pipeline-track { display: flex; align-items: center; margin-top: 1.5rem; overflow-x: auto; padding: .25rem 0 .4rem; }.pipeline-step { display: grid; justify-items: center; gap: .2rem; min-width: 5.5rem; text-align: center; }.pipeline-number { display: grid; place-items: center; width: 2rem; height: 2rem; color: #64748b; background: #1b2a40; border: 2px solid #3b4d69; border-radius: 50%; font-size: .72rem; font-weight: 800; }.pipeline-step strong { color: #cbd5e1; font-size: .72rem; }.pipeline-step small { color: #64748b; font-size: .62rem; }.pipeline-step--done .pipeline-number { color: #99f6e4; background: #115e59; border-color: #2dd4bf; }.pipeline-step--active .pipeline-number { color: #062a28; background: var(--workspace-teal); border-color: var(--workspace-teal); }.pipeline-step--active strong { color: #fff; }.pipeline-line { flex: 1; min-width: 1.2rem; height: 2px; margin: 0 .4rem 1.6rem; background: #2b3c58; }.pipeline-line--done { background: #2dd4bf; } +.metric-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: .8rem; margin-bottom: 1rem; }.metric-card { display: grid; gap: .3rem; padding: 1rem; background: var(--workspace-panel-raised); border: 1px solid var(--workspace-border); border-radius: .7rem; }.metric-label { color: var(--workspace-muted); font-size: .68rem; }.metric-card strong { font-size: 1.8rem; letter-spacing: -.05em; }.metric-note { color: #64748b; font-size: .65rem; }.metric-note--good { color: #6ee7b7; }.metric-note--warn { color: #fcd34d; } +.workspace-columns { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(18rem, .75fr); gap: 1rem; margin-bottom: 1rem; }.workspace-panel { min-width: 0; }.language-list { display: grid; gap: .2rem; margin-top: 1rem; }.language-row { display: grid; grid-template-columns: 2.2rem minmax(8rem, 1fr) minmax(5rem, .8fr) 2.5rem auto; align-items: center; gap: .7rem; padding: .65rem .2rem; border-top: 1px solid #1e2f48; }.language-code { display: grid; place-items: center; width: 2rem; height: 2rem; color: #bfdbfe; background: #1e3a5f; border-radius: .5rem; font-size: .62rem; font-weight: 800; }.language-code--source { color: #99f6e4; background: #115e59; }.language-name { display: grid; gap: .15rem; }.language-name strong { font-size: .76rem; }.language-name small { color: #64748b; font-size: .63rem; }.progress-track { height: .35rem; overflow: hidden; background: #243650; border-radius: 999px; }.progress-track span { display: block; height: 100%; background: linear-gradient(90deg, #14b8a6, #5eead4); border-radius: inherit; }.language-percent { color: #cbd5e1; font-size: .7rem; text-align: right; } +.cast-summary { display: flex; align-items: center; gap: 1rem; margin: 1.1rem 0 1.2rem; }.cast-summary p { margin: .35rem 0 0; color: #64748b; font-size: .68rem; line-height: 1.5; }.cast-ring { display: grid; place-items: center; width: 4.6rem; height: 4.6rem; border: 5px solid #1f4152; border-top-color: var(--workspace-teal); border-right-color: var(--workspace-teal); border-radius: 50%; }.cast-ring strong { font-size: .8rem; }.cast-ring span { color: #64748b; font-size: .55rem; }.cast-avatars { display: flex; padding-left: .3rem; }.cast-avatar { display: grid; place-items: center; width: 2rem; height: 2rem; margin-left: -.3rem; color: #e0e7ff; border: 2px solid var(--workspace-panel); border-radius: 50%; font-size: .58rem; font-weight: 800; }.cast-avatar--one { background: #7c3aed; }.cast-avatar--two { background: #2563eb; }.cast-avatar--three { background: #b45309; }.cast-avatar--four { background: #be185d; }.cast-avatar--more { color: #94a3b8; background: #243650; } +.activity-list { display: grid; gap: .2rem; margin-top: 1rem; }.activity-row { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: .7rem; padding: .7rem .2rem; border-top: 1px solid #1e2f48; }.activity-row > div { display: grid; gap: .15rem; }.activity-row strong { font-size: .76rem; }.activity-row small { color: #64748b; font-size: .63rem; }.activity-icon { display: grid; place-items: center; width: 1.8rem; height: 1.8rem; border-radius: .5rem; font-weight: 800; }.activity-icon--teal { color: #99f6e4; background: #115e59; }.activity-icon--amber { color: #fde68a; background: #78350f; }.activity-icon--blue { color: #bfdbfe; background: #1e3a5f; } + +/* Modal and toast */ +.modal-backdrop { position: fixed; inset: 0; z-index: 20; display: grid; place-items: center; padding: 1rem; background: rgba(2, 6, 23, .78); backdrop-filter: blur(7px); }.modal-backdrop[hidden] { display: none; }.modal { width: min(100%, 32rem); max-height: calc(100vh - 2rem); overflow: auto; padding: 1.3rem; background: var(--admin-panel); border: 1px solid var(--admin-border-bright); border-radius: .8rem; box-shadow: var(--shadow); }.modal-heading { display: flex; justify-content: space-between; gap: 1rem; }.modal-heading h2 { margin: 0; color: #fff; }.modal-close { width: 2rem; height: 2rem; color: #94a3b8; background: transparent; border: 1px solid var(--admin-border); border-radius: .5rem; font-size: 1.2rem; }.modal-notice { margin: 1rem 0; padding: .75rem; color: #c4b5fd; background: rgba(124, 58, 237, .1); border: 1px solid rgba(167, 139, 250, .25); border-radius: .5rem; font-size: .72rem; line-height: 1.55; }.modal-notice strong { color: #fff; }.checkbox-row { display: flex !important; align-items: center; gap: .5rem; margin-top: .8rem; color: #cbd5e1 !important; font-weight: 500 !important; }.checkbox-row input { width: auto; min-height: auto; }.modal-actions { display: flex; justify-content: end; gap: .6rem; margin-top: 1.2rem; }.toast { position: fixed; right: 1.2rem; bottom: 1.2rem; z-index: 30; max-width: min(26rem, calc(100% - 2rem)); padding: .8rem 1rem; color: #e0e7ff; background: #1e293b; border: 1px solid #475569; border-radius: .6rem; box-shadow: var(--shadow); font-size: .75rem; opacity: 0; transform: translateY(.6rem); pointer-events: none; transition: opacity .2s ease, transform .2s ease; }.toast--visible { opacity: 1; transform: translateY(0); } + +@media (max-width: 1000px) { + .auth-shell { grid-template-columns: 1fr; gap: 1.5rem; width: min(38rem, calc(100% - 2rem)); padding: 2rem 0; }.auth-brand { min-height: 0; gap: 3rem; }.brand-copy { margin: 2rem 0; }.brand-copy h1 { max-width: 15ch; font-size: 3.4rem; }.brand-points { margin: 1.5rem 0; } + .admin-stat-grid, .maintenance-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }.admin-columns, .admin-columns--lower, .workspace-columns { grid-template-columns: 1fr; } + .workspace-rail { width: 13rem; }.workspace-shell { grid-template-columns: 13rem minmax(0, 1fr); } +} +@media (max-width: 720px) { + .admin-layout, .workspace-shell { display: block; }.admin-sidebar, .workspace-rail { min-height: auto; border-right: 0; border-bottom: 1px solid var(--admin-border); }.admin-sidebar { display: none; }.workspace-rail { padding: .8rem 1rem; }.rail-section-label, .rail-section-label--spaced, .rail-footer { display: none; }.rail-nav { display: flex; gap: .25rem; overflow-x: auto; }.rail-link { white-space: nowrap; }.rail-link:not(.rail-link--active) { display: none; }.workspace-rail .brand-lockup { margin-bottom: .6rem; }.workspace-topbar { min-height: 3.7rem; }.topbar-admin-link, .status-pill { display: none; }.workspace-hero { display: block; padding: 1.8rem 0 1.2rem; }.hero-actions { margin-top: 1rem; }.metric-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }.language-row { grid-template-columns: 2.2rem minmax(0, 1fr) auto; }.language-row .progress-track, .language-row .language-percent { display: none; }.admin-topbar { flex-wrap: wrap; gap: .7rem; }.admin-context { padding-left: 0; border-left: 0; }.admin-top-actions { width: 100%; margin-left: 0; justify-content: space-between; }.admin-heading { display: block; }.admin-heading .button { margin-top: 1rem; }.admin-stat strong { font-size: 1.6rem; } +} diff --git a/web/assets/umbratrans-icon.jpg b/web/assets/umbratrans-icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13a4940dbc2c28b7ff1ac960d44ac1d0ba7d2eb6 GIT binary patch literal 92804 zcmb4qWmp?Q7w!Tn(gp}nXn;b2BBeORtyn2ead+3^4#nLmZpGc*-HHTvDH4Lax3o9k zckOxZzdPB@vzeKlIdgXAJ!j6o`M31%7XXo#kdgpUP*4C#)A7`m)I|`U;clme|-QRCTcdSF&YXUfQpBLhKKTR0C)`mNXd}W{@;Xx zijEW#0~1+Ff&w7R{-080A^N`+0E~tLphD0f0D$taIK2ZM2myeB3<#<*2n_0_RicK5 zOtFH{paZA?bjtr3FhdGq!<4lx!pF}*`C&`VDr%v!VuV7wLICpTO8^WZ00h9M^g}j+ zhHpd-2MbSe0o$~IUmW$4pDaL+J|W(5Gq5SCw$5enc3?WK$| z5(Xp32u2U;r7#vXA_YLSs1{;IkkloB!k`B-gPyt#_hVy4_XmIwjsXf=Y|0t~e+t|1 zXlgD@159WSAPkm-fGuQyKogCGdq^aWNwK6j<^c{$tR?_e3?JHKfJ#7O8%F#x1n`3Z z9KA)EKTzuO;88R)X}p8+<9(t=31Wtf1}nm-2CD=h4%&fq%V1OhC0;HZ45D5I0SOT7 zAHo4RwG)P_FSpq^rdGsAEPwn*zZA$38KVG0_?Qr`wb98Vn8T#`+vHg>ENV0e*qB5K z5;7}11UA58^Gi2K1T3*JUw;W=14>avUt5q0`@Q}`7_L^=NvJVTy8_{w0c}-ph3!p0)R^rg^PpL7&I_7^_&p^Y{LQC9$|lw2sWzt zXQEkU^T8O2G0 zcJWCwU?gtrv(?G%Y*nvbPdIMd!m5iD?JDW1jSU?()SKKg!-~!ABPftL!bY z-uvZotcXH*qB#=9UP`s_0j7t74j=ru#X5??aYv8RgSIg9UDzFCJf2z4=@@ zF?ZE6Vb_01(CU8GFjP4YlRexkc6GA9>9x!h=Z1vEZF6AZz1Bqwvo42MCj1cY0RgO* zv>agM3MDXX)pRB&u#%Ibrwsx|OHDaF^5y@MEI+i_>iD?&>h+V|f3nBuZ=8S(EU*qO zeoBr%yLNa;Dc#yXN-25B-av5M(kJaT9$-lk<1M6^Ojdd%uT|S*(|u-QsgKEBo>1Q( z&Ztscp^$}8vZ31Iyba(`TX`Xo0m5{Ia0>e)r!*RrzU4TLFAX$ky>r-f>0-?*C;iom zr8xSwcC$HFLg#jmp}JYWun)hHs5U%2;Pt1NX;o^?_|9(HLi6U>ubJ28RkO;}Y?x3K zW(x;3i}H|Hwi8P~)L-k?R(=g7@b*|SuPzwT+-q$^AjtlFf?$^IW*8@Pp`rt*1O@nv~h=oPSdgD&GwkS?PVteUDjfuWn-nnr!I}wW`T5XuS{mM5q5cvI?yZx6_fKh z+jKSxT3HbF0vuY+TA zb#N9ssfS35*pbQ4k;%`H^@f*0DWC%YD1gdu>D>SLZ=KJ{m~ z%#o8$b2z%v9J*qYkw#@H$J@wp$(tmq-Z_gH(5d<+L+ZXVS$4u8T~uAReUds9iL;^L zWe2W^vKHI9%Tp4@f|wBF=i#T+m79^jtjz;=J1&-A9qb5NmFNcMr$?T8|0QGJW%>bz zpv6&QjaZ;+74)zt&UJvRmVf!Y`H0gkmD>5M+^IOlRg!qQS{V;G;7ToiZjr%GCFlBE zAcIalO$L5*s+&!#INk9N_<`7251%wu59c5$KNAqVilY%qnZLSz?IXk7<@x+nFQmhk zcr7_SO!zGa+sodJDrVsysg8rDl(a)})^<)V&*T}n^@dSlDS4r2zPasd*RrqQrL#LlI0L$B&-<`hi zgo&M=Go;;Iv~*^x3EpS!sk%)ZaH{RYLZ|V?KHT``ycpwss{V5H@Yw6hzc(8bD+s?+ z(Iov;fTaW)iKcK$=XB8XAAfR7QJ~p49A7M{^y>atx!j-EFvkRNQJ@s`7y;;L+5;yG z5?Y!9xOx4tpY!1AT~2=GSsF|I;ECgER9#FNAw zB~{zA7h}|qyi?$0uT)zX9JKCyz4YrtRTjmkAV4ox5vFZ87$q{#yyjA|F$M8AmPn91 zJWJ2x4N5i3DVv_6Bbp>Seg50*9CdVws&!w^Z$gzP_aES$bg)M(xz-uRV2D!;g3nE- zS~{=1PH<~ z4+^UD*U{>P)n14iR|jiC7^kr?g``0V0U&9tr10YcrkVED>|7|4oJ=n?NsqVK4@Q3$ zw#Kf3X_P=acMHE}`Hb+WolP6En2n#<97CMNc)olurdUwUqjMZQ$?$2=Sao=jhtDe9 zQX`G|RZgy}_w69OCHnc#PY$)G1(#l7zt*@oxYprl-x8qopv#R{T7k}dPo(W#-!WNa z-1Azw$b6cw!gbU<>GCxYw8Tdi$f=z-9IKFTSh$L{#krduVk)Kdf{L2CTRp|%@RGy0Fdto4NAIJOLy?Nq zSivE!l)X;6S+(HLzBP#~a~;nMyS#>>Qn{UsfSC`XC1Md3a&B$jmFo{C7me2aI{owc z7r&SGwwM5VhHeMzqd%k%=BjFT9Pb&(&tO|8TYW-?HF)#ND?N5f1m_9qj#RI~^h`n3r-AB;Bb z=Vfx5ARDZhGYMX)ILNs>d7foo$yVOi(93TeP00zmD2tjCqg~6cU%&FUALf5pd^2r0 zmP<(+^0V9i;ArEULh_BOwd^(X`@cxZj<*KNlPxKbzC&&#+Y`>|!n z!dho^i>KFCeSxXNu$INMh>Kp%d_IQ{`#bRYQbCgXrV85-&VUMK_xV8{&ZSjY^Yw$k zBL9h^hv1|gd6aSh)!07(y{i-9;_*#Rtq~@%U3%tyE7ZmKc2BU73MHCVI&}(Z9Aw^z zz`qA)C+Flm%DP{BN|3D8WRt<-ABo#0X6#(scx<#ER<+LI{dI-C*SxvA)*qq@_A0Ip zl7}*XuU=?A{`tH2XWo1gyItDCo?aWSS_aQiNoI|`!j-gNthzj)k}xxPr}akBL6&tK*$#!pTRniS9k zV<>eGfDVuGr1h}oOis>0J7C+HKG1nwy~rknC3^C5r_VC2yPuMgn~LG;EjOnr@7~fR zKhW5y91GksFlDi=ug3JxBbM6k1+F*8H}(9SHwDwKT-R){^2J@?m3E$-L{F<@b2)?w zv}v&Yi}OY9gjJ=0Fr8(5B} zYUe*7r+^d)`-N`pjUE?4i!haZ3U~E$phF?r)~@2+l$@YMffarZyuk)_2dZtDkor ztm(z@qr~91C{N4lzAi4ev8Ku}F}IG<4W00Bd%BsiF0QG&o8LP>KPS{Kz7N6cj+wNUtboz1(j6{D!%e&5{qN zMrkiATjEKDC3iDX9e!5f_?WqLIHz^Ql+O(^c1o1xdo{7IEA% zG3Pc7eh`S){FI$>ucqkl%n@dY5%;YPJQ>|k4m)#xWN{)j|>^jN=V-I24$M)W$|9s5y$bav(LqV@>k z_#pV^qo6^sLvxX5>!#bYBf9Vf&XP^tPs0iXDg2k#HZFo!iS0Tr@I#Nl>rR`ist>U_ z4qgHsznu{_cnwswI5;%bEZ^kiydSOqY!v>ERM5U^>$vkQvwS__RPwtE{lAE?K7wxn zrR}A~LW4}xHe-%og?O!czsU^|Brk=j=@k1{JiN+JD6x$;p<~xvvr*H&2^G`xiq(%D z-q(Ap7rm+{Q`DuV4%6Pf`7`SIMb;#}t?P|;_X}6M;$po5W(hK1AKeue#SQqdv7X(Y zcM7A2w^3&r!L@I;;G5XF>MKuyhl6=-qiD7XBag=%x5>}40%x)7)4Mm-ncPR@-}H0N zROLSGS`#X`_4Y6JhpR<4lm=MlvVkom(bKWecgE-$m~6XVO^Y#g8mGwMIO(r=M^2Aa z%sN^bjTal`TkcGE@O8cxieKOPbM7f1y*kBxbxiVbfK=bimF9I%1mlXsW6=hYY7W+& z!utXRJH9R=A3oEj-My!3oM`h+M7qhX)9``T`C7e-5Q}jF($}yZ`>z zmEIfu;8@qFYpcnc=$C4zsfUs1Uc-W4GqpTn7;-Oi=PDgJB2rp^Z5?k9luJ~OLH)zz zf?h{iCM<zDZ!d@Uo`8JgX$G2x}UBNXFUij|>R z=K9{1oPWh|u}fw#f7|`ZrKR7%Wx~tHtr~GxsH!f0u{i;g80;ojVmDXy_5I7Y&S~Ez zU(}(7wRW;{T7EcQ=UFl5%i{jtDIOJW7mIv*Yw7p<-e+q+;jCXXFi1?plGGBwQSp(d9;R=RNyV+J61ItvpL1hH2KpPf3R-XQl8m9DWQVg-u;N36j3uE*>uaseZ)0<1y)zf?anFHY)Eu zcKUEMn;mUAgO|&lK&npcCZs(5z?FC6{G^Ybmw)EY<9UA}Gv~=hiwcn1vC^_ijbQLo z?>g4cZ2o#e$?h7R&}z*5HD6pUQ8`H(T);4R1QTp^b=w_X@7;x!&%8;K&Mxb};d2Wu zymenEM9x`6Fk<$=iOyHWCITf;c>A}v;Dmd{GJFmeD&=-x=q142v>mI~O%k2_JAM5h zAY_a4Mq8hJP4m>e%e!eArt`2czA&CRu`Q4OeO>)|(#MT+HWx=@1*HmPoG$7aM>+%) zm%ikX)SH}qhPy9&bL(q`h@YJ>%qL7=gjNe^$us=qGfwoC%@WY$Z}}6`CJ4SNjh|Kb z&FpWlra_dCA541k9yQXXnIGD}t&9#28m`s2z8;!>y{dJo?*KF7DL+~|KM}NTOewY8 zQFJ)iSn0&)ZM^r9bhkc0v{n6K&E8@BC4Yv|Xe8RJBFv##vxs zc?25rNdrUvet7XeWu0WL5NyQn_1v7#yTak!jZPV9@1LrnH@xdT^xR4EZlrt?SN)~c zG>h{W0-49dF=WAn*n$i>>KJ;gSMUS*qO0aCRE~U&PjhV79*Qjrd7Eiu54XYN*=2tP z)la;ip4jWEgkHMdpK+HSz1n&3_9Ty89$SLXWc42Ho6i@MLF;D-itq+&3FOZPeLDv` z`L#;+)sBn2y3ldD7_AzAqWG;qu&^<0=@{iK%seK3{yhErY8tu3%Tw0^YRzLFGY4gZ zY3n%CCMPCW`n}|3zUA*M@V$?naI->GoUJZx#*aJHos|u(pR}Ip3P86#YNsOwt(ILp zm410$nsziUbjWt{+3BkP+#OvUcI3G^^sb(~6~sG#C_lZ!$$tM2$XeBbUtgOSD+@(= z9K=|GBdPFHT(@VJc$!L&R32R-onhY)H;?zfvhk-fKosb_QUf+}yfW{8ZksS(x7~jf z5xBXXv|0^Sp1XXbkgm#vZ?d*aXH;x?b!ItXe0;_4oAN5m@$QV+#giqm!FkT9wXM9q zA@TSKw!E2)S4=9{N$%dvxeF^2NOo-P{3;kLivQRco9E&&rjeXE&%!b{_(I=!?Rx9S zgI+fs`3crRZ}w9CEJ=q!=1}Ja{L}q2v>k;B!mMQ z=!+j8)tuk#eZ+z{H(d$(6(4$V7YAjI$R(tu*3a3hd94`EZ^EwMD2$xXulEmIyUD+f z22WJkTC+{_+UN?_h;(g;j&t>++7EmZx_#7f*%$nC`JC* zx%iZ|O+~Wd?Cssb*St=vtF7ZT2dfH+j~enJvviE5Gzmzv?s&0pJz;fn$_J z%{2#4+n?V|osr*!CdNyBzt;bRl`Akuu{C^{B`B$f&MK0;2&H-KCR)pqmP;CYx3L*q zxjcx{t1(22ht2~Ehf)9rY|^F^8{W9N*NqG!NBt z9eg9&_=$A&ys_PVo1+8}_74opkd?$Tl*^^Zm)j7){ecwHms(MJ-Xq18prcyXmv;Sf zj;?O>eb(5CN!o-{-HwwE_w{bW-Gh63&H2Vx<-)ucSEtXG6EdVQsxh~$^9O!Qjq77h zlhxOEudl5qZW>v3#&)%vVA=L^q<5&PtuG zC8@N8#(J+?V{0?3uF#@9Sy8YWSGzfeJ~ujCQjwIzvQ&7P*ieavE%9A@b@18l*w?SU z1N5HN947-6PA9PXV(xtF-D&$9k9$uKm1f@brH&>J#DVpg<+b;?kH`Ha+2gEkM%032 z>dzgx=Y^3i7s5&B@e$sJ_|he>?XXwbIB~q8|! z25hIxhbLSC_#@PG3h6y8&fU9C&nt7J!}++Ix2+7b&bYn0bACD< zmtS5V?^UqGY!}#_hat2}ERi%9-(NZic z8k4Hm<{gv#hm6eKUGv8A^4fZ>Yxo2C(MO@|-2SGbh^&f*gXzv{T>bh4%s2o|7}J;_ z&PoJ33?wPqUL1M~hkdm|l(47dUD=JJno4YRWT!3ux+)h)bD4VZd615it7s-w4H-nV zSF?OA5A5D|SkU{<$mgN4aBVu{{j?bKJ4nc((8qSd%X%YOH-DM~zB;Jp{SWw@G_hHp zBhg_Q!r51bH3;AD)T6=pC~?r76X;9I)%A^q`Hbo6Z$nJRN2W)0^2ZcThIIJ%uU`ii zk9H$ySuN5eQGbXQfJMcClJJBbndZpTpPaXL)&uW@t9efb94M9+b7uH`ovOW6yq_37 zTrZstqim9w@kceyW*HZg`-i>ktZ~g>X;-HtnOY0pFCR@r%)vx5+yrG{omFb(QA=HP zbf0k(n`MM5H5Q4y3?qYPQsy^9o13w@an)zrg<{3J2%Q|^ujb* zXI1`mc-iO1?O%sGVS7Lih!usWkpkie;s~K~ZoBW=iS~(2-zMbG;XNMZvB}`mc5vpp zVq9@7j@5uo^8C%g(M6LhT{EqyZ<+8o-r(0lMn!URyLg*I`J7nycZ2g~?e#n#7P+yn zYYuvIBrq4j)*;S8YP==I^NRt9`R(IPL30-Q`p{zMgG(E}hrb{DZ!|s}O6Ns><++H3#BuzbPkc|Wc6Iw*BTss@GL0Gk#Vp&gK0_ttmSJUY5pp{~%n%3f2XA1@u@ zCw*x4&3RR-ag}ey!qQ%x^QE*-^@E2=#U*Eo?B2G^2m2#|-Zh3K+amuPwNmOdFl`8(Sni#TU!kF+t$j^SSa*-5N$T3g6MnFJwcXxT}lfymbp?Go2 zNEjm1JK4~s?}$_qVSy5SRp;kN)FiNX=If*D;J zrMo$Jm$_MWrN^b7ew97$up(us!|+B;B#gIq>FO}=;R%`Hn2ztH!evZb zjk2QeeH5Da9^D2j8m_t&zR`NA*x%w89AKeqlyft8MNW8kJ|C*>bCbOl(ADeWi8Qjr zYDH&7L8AhTg0Q!t!PzO_NY|n^E3VYoE|@(20V)QigZ91Qfiw|zh3>1jSM~Z_&&RsV z5juZ2DsBQyngC#9Ejg+>Qfc14d9)0&nh>JM5klKXuhG__|M~EohU6jV&6K+RP2LJ- zlyG!vJJ+lI*DH<8Sb-T_fAzVXceW02w&U>7lT~Kg&AC!Gtl?IwH`!$GLu+@eoG;NPIttLsMOh;X z>4{_|6tF|=dO_s`)st&JeeGXpowqQX>%6{I?ooTiLo(g?(^_q)#~@dVCP`@MYk6{_ zliERFXM>hmOZq#y=oBIC^)WeVofleMb;Ya}!U-0e3e|+|gy}kSWgII*kb=R^R}~Z3 zWX3l4(W-)9>6EJzDNJR>l(4xlrP%xc3c#$@Ox@w)$p$^Ue$+dI&+&@tT_C5{OuqEg z08ey?2kiiK7$PgaLsaikaD;Hh%63Htyt8qFQ%DXGp3htOQwh35ky;AaX1ifc8>Y8OF!xQ$_5ke$yVEKY%aOzO^6$NC{M*C!>Of zf@TTa-^vWf9ytwB`- zt&nu|9s*LSr02q@fMjw8nMl?t`QPEJ&9O%GPf>tD0u&pVT2rzNKoy=sL!W}a7j1qP z6Q;CC=b-Y-UkAaTs3Z&WZzzBUjbb-oQ?mu2XUK(-NQ*QRX4uf{HK!z>qa)u94^0IV zWdH_2v=O3)L9^BwJ|(R(NvOghGXS)=)(;Iy0a~?ya8rwPA?Wln^@8yl_NZ0hXOUud z?nkM3RultZ0FnqvFrY=V1cm@SxqQOUABw?kMt!1T1?fiUA!SUc#zr=x!bw9X(ve{Y8fRwg+GLfk5U7oFhWo5r7YkBOr#As z;y{WNBD6(OKYGyPD5D^L7651<1G*xK-b)!HJ|l-_3-n0E%Q9hw8N~In3ZtU`hcF^) zENM$&EDTVhftEt1fGI8{QAk8M4i(C^1g$eRQm6U|02FUsKQu=Z20!V%e znye8(09yIJDryqs2Y|p*KL`K|5ElSYpahUe1=_Ox!2bjak1|5_Fi9F$GpTb~o4 z`hl>(5I^V;76)z6>JI|p6-CQHgCH;kJ~|c}5>LSvP*!wcDiuka>M=;A`~js91~NcX ztfCM!0}kFOi=LL}G+_oVAVqXGEnn6eho zSz%UubToWY069bw018%Og(6v7en`ozjJ{-;f74@_IQO6>Un_i!RftxGRW;_=(}wh- ziI!^JW>;rlW(wK~`6M9cgI_9|EyeZc-u+>sEk3w|TnDX>1S?8Y&P*=NvNYolt8P{{X;7PDRTI z3V;p#0ZbA(za``@0g@`mS5CCymS+ifhjC9yR;wMJTe;skHz1l`cNxYOAFe(SE*(}> zb!#q8oC|$*T51#U1s^CQgV3&*9ieZuXPvJshaOKJ37y>kl2^ALZF|W3b~*_i(?5}T z=n;9oR@OK4HCKU+su$Do9+A=q&)|aiyGjLMFLbjoUiGt3@cRtf-p1M|u)Q&q`^JTs+ zyYSdT4cOEjb571hg>WJd0qsd=Y(UDpH9%g#6wFhu_?vGQG z&L%#%dY?lT3P-%W*!I+jy1d;UKm6)uG(dQ;WR*`ndLnl=$tk4^C6AQ$-jh$b#yYp@ z!#YB4dI>82V=4gkFlApHkc#AILXmof`Z)ri22ALsp3vs>uf=HABx{ZP(2uRIo0B84 zLWoQZ(e_s)T2(MNAyPUqs*byuLspfU9H$W<4}b3$u%1J z7cbt4E3AW~O28nF6+mgCtP`n`;_3lVzbp+<{s0a52SnO(Q|$oYZvuw*Se7O z7VxrJdH7?oKgZQ_giyIUu32OxIZ@*rJ@^G*&Khjj18*8~E*=cce|Q|!)T6o6mbJX=HLRi4G>6zu(Is>m2czUE8?NeuL&AstRk zD1c-Y;R8@g4!|EwEGbt+VS!xW!o6$*)C1TYU`bM8>J?H+lp+oQpv6Nn5Dlh6Fl7yb z05H;oLi{jm^Mq5;ps2zC5`&P*pAGAWn5|7GX57hz%P=ZnqC5jrO_hLf9|FL2K3Zvu?2&xzW;lctEixO=qAiZD= zMg!_8{~7>^TL3^{O92`JMTw#0vWgj?iW!kYfH<%$H2|HJml%}&et`Bro1sGQ%>@Pk z|1ii>5R!$;5z>Rq2je5Z{E(+Va`(-O!U{lG0rUYsSz{<3B!~-BiA2;GkTuAst_PWdCLs{krGrVWyh%8DG9AHYEkwjGmW zdy6F9azp+D?r0z^B*hg#a&wVYQBeOwy2ZnXyyV~{Af%wAW@TglKt%PHMp#7ri>Mf_ zf&C{WBNr1%)J1uQ`VTn7_+#`BxDxmWByIiyH5H=9)RUG*PrVc+&6C)VZ=<%eBu$st zi*GIXpBMhf3n|hBiS7870=svl5$MQ^AO9=ozeWG2a^C;G>wmRVN?M9N^;(&dhjox1jQx0llYzy$ND15`(Cp1eSVcOgz9Ldh)s{S~P+3pLY>( z){TJ6%jG!B&^IbJY=Rf07!*NPJZz!_1?$1@4n;6m%u!$|OFPIjh@V_!}Ae&iW> zFU!3$Rv!=g>@XV}T0xC@&pC@%(?N?SOPSy*rZ{^13A^T&#>a4#zA8}h-Ia+is}JOq zVm`B_k0zfzC?xKZk@7Y7TlQ95^&UGC>Iowf6Qft_IHL~zb4wFw7pM-HU|qQw=#Uc$ zoM}66VtMkmjB{q*5 zH&6drKqf`h%c-xJy~1V*FYQ;9mN?@vstkv5jhg!J2nvEpz>lKnjSMyBHNA{8;F(_) z^_*l8SW9!!G)!76c2W-gS`%8mu8!lL*k%MjV#u!V^SHQX-Wquxh%o2Q=xKh`CK8Sh zvR=nAa0RoV@(2Ydzd)6F=9fd1DtLIGAsaATsORl`Y+ESMRptOneXg_*U8fSHY1x+> z_<-R64ygW7z#IOHf;STSV&Ia9yfyom!^Za;icsm?>^{&7Gu=eI*sBSF)WVOr_TOrk zMBZ_~+uCLbpHk4i;@}Cd-96zU9cbv7(oKQ`SBAsyFNocG4&6eOz z(m5iZe=tE)V!kxisI-#8Z0q&jA%Kpo*5!5*O{rnr*e$;9BaAz=aI3QABK2=ghb&ZNiQH!>)|BD+OCt2o7gBjW7`8m&? z0-cqwfQc`j)P$J_-J*HXS`)mE(VT{NPI@+@W-a{_Un9DOPNK*DXdtr|f;APE$~rv3 z-Ns3WWxL65CURVUzM&ZAS&crP*r9Zr!Kg*G$dZ+nqV(@C zOYHL-NxW*&7B0!(3Rb+@%hn^w2x{D^Tb+3~yZ^e)y7as+Y~-|1!d0$9Rn4$Pg$kCbWz>m6cq) z!~EhOU_0>qd!q8*{6}V|TiH7H)i|~|cCdH-y_L~jq z@}r{+CB$}A-3-|Cc2(#P8O%=M=G*<+g?*>a1KP&qf^PLmwZTX0OaUCh>h%2Wp$>AN zJP<@PbFlq6KgU@Yl#U+0&Jk3q=18=BcY?&ln4B?z4kliAZT5>aa0n9o)`DM(_lJ## z-AykAg$lEwY?0%8<8{7SMY1&B->oKxH)ia_;3gyxV85j#`-M%c6B-*?li00SgK}y6((zSvA6*t@qEODBl@j`m~d3im`M)S zmmDmU&4~RW{{j+;__#64Kti>$YSjqq4XdJ3<#|&p)yQ_gK#{=XUw=KE#t4twk^QwJ z`^&02UHxy5*7vt9=?bwV=fRuHA|%l%ugHe7t@ap8tRlAIZ9CMM{-{i8s1#BppC$O% zrqKx=Y{vSO?UU&*d>~w*64<~D_FD>r+cfm?gy!9&l1dM*T3eg9+`uio8N+F;N~1dF zEF$<2G4lG>qw+UWpTX5TE8C^M0=9ibYk`v7Ixc&bcvH=WMgKDDxayb z$xfZGLIkhreMy8U{<`ciU9So;Srpmi>4Q-h|Kxkz^6c|&Lyxo|FO=Z(#y?&XcL1b2o*?#9!uDYx25DpJTAeG&uqJe4ecI2i@Pla%Se3V zOkV%S106nMz!r|Ed21X<`2r%AO&&HL|2}u9F9Y4LzyzCOgcyw}gp_f;Bl8&5lTz#L zOLz(S8d4OG|B8Z9_O#{Occp!ccCC-CKU_bk?8TOLPetBNIjA#y7WI=Kx9mgtfYp>0 zXBsLNjJsm$cZ?HPI+cz~n=EMyFlW!$%vs97lxmCB7)O zeXlPO$qZW^+dqD%Tt4#>nDY`rPW`Gq@P%{NxOs2#=$DmX`TnDbUF#4tZmy^mrXWmz z2oCrjYf%7s}?)8ElzaOkI-$YmPFPw9VkC-{HP4A zl~x+i8pZeTb1JQ04s4x(F$t01cj&OFA_d*#B%kt)*eY+06fi|X4G(21Q*cdysHh}Y z=Aemunj2SGc{sZ?yfd`4xzN0HfQgA}XmmBLX6q2kv?)+&M#K@uAR|ZfIW((DnW?aW zBPOb7MWTux8laP#E1xDohJtFd$_)uWmJ4ced}lkaN-rK>3um=u>N`_>2Dx5UeE(WS zdfYRtmy77G9-GV-@&p9kE4jS`1t9(v171`J!gAJ2WR}2s1FMZ zladTQ-;_S|4P-T|plv^tPsWo(=8dIMDIIxMfE9yP^Ej0@1BnxktTI(V&~b8Me2Dfw zp0TeXIDJlzz~tswa!aFBxR!5xdv)+THs7;9N{KIjhd`R~9IW+tOaM*r%feZpf1;2`O*Bq{8#MrwrqyCB!Dei^Z|0sz?hyZdC z*E#9!uebT(x71VjW+`vKniFly%C}Icy_u+u()=$tNr)W>*5#@(Shi44ws z%0Pq()6xWU0qS9mJt3;UgqE=MvKXauBCaDHpu-&CQ z`Ha@x4U%L8jIUx;Wc&Tpk|tevg+-v5f<2;u$~f28Fk)FLQ#w)3@OE-$0q6M1J8Q_g z4V* zvu8l~5Rp7W%o(tVH9H z)MoA?tVbK;DIFG}GY1r-q9#PgnpuQPEQ{QgOT(F|B@-i~vnG#iQVZeq9H);{V;c-b z&C^{6Xc()#e-1ZOUOfvN8xp0AraoK6OC3Fxz-uzNC$f1Wp84YS#0-ibr zRqgp2MgsJY1ERdJuFqn!Z%bcnJdl=9UDoVU%lKKO10J=JQoGM! z6Ta=poBPG|d!00PeU{EdhdHTdwx;yK+m+D?xhO`TxA=H>Tb~Ymot}Fzt9886xK}la zb4dtQ86#6*9afrPn{x_Pgi(et6iPHUe_V)n2g?lg|JMXOnAQqqyy}~G(!U$-iq*m; z>VH0HKh8ifz*_P7G>{9$4eIK5j1eIPCM&CIs@4fWP&S z-ZGrc?bxJz54HMjOlQpVTUNR2FPUNxe zzOJD4WrnrR;-#siFcepHnq^5vvaZm_-@TQolrvgrwI_$wh!a~Xv~m%DB6QVWA(P5g zolP|8ZO+w*$f>0IEy_QH$5<$@_Vo*EI6;ykndzKElnYpKj>9ZKycqO5bR!kAAS_fh2V zkz*X5bByv4p(Z@`%P2+1v%3g6USnNpQ$r+2GP2%gkPcX+8dWg|=IB!TSg0ctaHGvV8ocem0&%kN-;Ke8~fH9 z;Z-bp$A9(A)8kV^Q+063-sV3*x_E0yr=ltDEpp8p7Dn804i3m(tIaDo6R^o>(W!IJ zN*Di`sUQ-ct#r=o8sBD6(ghXP6l=}!Id{x0Y1eh4N-ntEz_q3k^c!K{o!DJu15CEXym)@en!;26 zyF9k7o5*2W@a#{|6ThZw-Lpm=rjOj8Klt|>^*?eli_c!^%d&#}G4`~0lt=T1KzBY42QYMi!#E1czeTO~-n;R+__(%nES zVG=f-{UMTsjR}KG`)SOi&U0Ju07GEtRoOmC?Kepm5fMH4R|taGn?rbNbxi1~7vkj2 zcj15*Enk~OuJGRN7}drQwa0^U-I)0xQ_=4dnACl;Tt=_6{YR%(Yooc?e|77Abk$mB zn=#>Yr0g)WS^OCXjU=H^{vTYu1zc3k*Eo)af^;`7OLr(OC@f1Y(y88lq_^{pf`c|?(3=D1 zNtf-jCRK*fC#xpa{=d+V@^>2;CaWB&LprCcA0hEW_F8jf_mChP;Aehn1cM$#jEofbOzKK3T&D!69HG(~0djtj|bA|kZ0 z$L1d$xePz+^LM>+7tsG`_BQE&7?3do2e#Qvtg@rGiTXU2zEu1A&TGks@`5CAl^vBs zOW2+hJ#fQQu!qegxh_cETjEoCJSCmTqeIlBeDBpq^KldZLz-b>I(cE{c=}dDqL$~0 z+kQC>iMs<@!xCmiw087l%ZJ_TUy>;-g>w3g;F)|Jm?qz!dHo!4_Qt%BsR;GsT5(F| zjXhI(g7eu^!0WQv7?@g|+3?MhNn?+LXTX{?wZ$Nc4_xT-hD~_y?tOY~9x!e2U9)78 z_fx^F7oiidA-le))kn$X1)b!f&`4df;T1~36{f@qNv}vssTI=ju4R2SW#7vD0pfF`? z!E2ny9wzr*5%Da7&e{%ubuzO<`#J}Dh~pXrXLC~O?Md2q^MA_A%JH13^~I>z@KT{7 z6VHNm$lgz(9*+vs`;gs>yF(Ul3@Ncr$++82o4E*Tm*>N&fh1I@gCJWMg%L%3BQJ{{ z{HP0yC{QNhp$S%p$=_PzHcDN6az{gClYKBPKY7tfIZq4pydZLO(r?MWa8ikzhBhPp z{fbj=@DSP}ho8Fqmsn0fn{2O6V1w;7jy3wkU$I}dc48#F@5~@QbUJa6F*vgB&ATjR z_S@hOOU17o)p$wRZfmgJZKn4FF?|L(wzBE=Brtu2GoVucX%^1HcU-#rc%vYC%?Y;z zULh1=s1!%oyymJ3i}+poxk)aS@YxT7BwCwTZzlv%-@}eNoBUU`#RYUu_ZjYG}@jf+?KIXxjI)m${LnA$nDUy~no_uU}YGit09q9ws zBDBF8Y=rU#W0KE@Xd!r$jo@i(x)Mi!6&evR1fyb?RQ@b_On@iutdY4?iuU$h3505rvR``Ov0 z!T0)N#Glf?@)5ORvSJ)bDso!cju-5 z0Ou|z2L`8KO<7*Fgy>t!bn;NoaewTbjcNxeu)`*+Mn}uaRwzq_LLpA0A(s1WX7&D_R2xf>-nPR1-UK9rz2>6>aGe8r;VYjx#vP~%pw-qK4?O8( z5ArC6_3*>chii!9=krGi#;nN^Jj)l0;`>>KX9^6^uP$`Jd!$;Tad<6)0{W6zmd4NE=qmP#M4LMy#k|!lWgiB0NQ;m@qMx9Q(bd@I!K=qQWns zqX2?y9KxM%)MJW+~QOH>$p&8)}Tza#KB*FG4Vm_~^ z)W4Q%qa#bql8Yue_#_37GP7k;MuTTzwh59F;Le0Krbk+j!#5v?Z|RZ4L+GbH;iyFi>^5E_@&fOE0E9tguCq>Ab5mAGZ6g<8e zzuCYzaT<63#}gULJRf;ahu7whvgu}+liz+7VRrsDSJ+IDX`sU30Ld(hBWil|&WfEq zH@xsrlw`5w(Zyjsbg`O{@BQ#RV$f1Pgg59m8)87d&^f3%?2cm?;e-|F(L48G_Eo|u z@n=;OlG7fwaurASt=vC1`~A35nq6b&6i^FWUZHvxw40y~>E%dFnSD&MI&7J*w2FDn z?0k+!#&OAEo0@VI)GHpqacu`#G-Q7$>XyI`|FB^+_ z>+4<)Y-VH}9&Qvq{fAX>LLVKpL|)vi$?Y!0QU#qDo_w1Hz}uaTejforVhhNWUNZ$B zb_Tj5Qe-{`mXdna<|LA)CaF#J^0zbk%2z9StPueL$=x2~^o^!lGZ?{gWtE5NXXr|6 zVZa?w@cORxbFv(VC$8t_RGTv7$YMpWZdb-N^AR2uV-NLA`hmoEpdN#G#ttGwj5FUj z6+t)>a9l7hk!?ibrJu<;!V4%z7OSQiz4OLHs_&Z+b=>5Ip5gskOAT`V&Llmp?zIaG zgMV?5>3;9>L(G!CChkY~rlpt0OtP2<;f(y>fED4Syys2Ke*!;%q?;Iz{O6AsV~J`L z6hC1EU1v2M$La1#9LCosP@02m`=2=V(btA==e3pm4Q$>7R{kRO6l&viTBmQlN#q0) zYvLy5y@bAViqS&Zm0@}h+b?1-@|EoDE2)hnB`2|CgYk{t9(DPZ#*B8W8~Tbyt&*eI zv8wn6caQx4FH%x+6g@Ub)Zpw<9#Y9b^g_G$bx~p7g#EL}gt(96Kzy0OAUuJBw6S=S z4V%9x&|_6Zjqd*!FZMrp%kwMWF*>bocqzV;l$^hzpvjvbdxXqPwVJt50H1W#G!Yhx zxYq~QM(>W_ljnT)EA*doz3-1N5qEpl!dIEmuj{@JLY{@(nj91g%TzJ`N9biu)bap5|?{_v-8X zK4p>S>+Fu;>IZbcUzwMT9{s52pTgaB&>^1?Wf^&`ajCk>r-}@obYkVD_^EYF5L(+@ z==*K~Y*hY1x%sCvoS;(B-J0bZ$E?jTkRBlQ%HX9S)|)_az&UNm!)A2vY~8wbQtD7@ z$_vELcu|z&Ji;v%^?i#hP}j$`xk|)KsBmmREm&17=(I z^vfAN{<)B$-uv|=UZvQgr1O%U#*wGJU8nPzZdm?9WMr{w%*DFGp=X*}R>Rdl;Y{|Z z%Fc&u6Z7DUiMnx6_^CBmdNc76kGNKI8TqBcx|%5Xp|wVh98khx%;ZMdVWv}gEaL?k zOo6PzG3K+?ui7Znk|x>7@{zlL#urU21iQ#xrvg@53t<*ze`Y(M9#-s;OXUSF>(0Cm zFwM7?Tf~IKPd*ll;wg-QNs#r1J(@DS#(7dqSZu$7`XW8RAE8hEklYEDIQ?L-^^H{M z)hokw!O5#8Qa9EIc)KDGyEK^B9baSNYV%?qjs3b7iyi`Y`M7zTqiJjt z5igPOcv_$zXN$ro5m^{%|6Y@bP-u>7gIKc(q_loQdBw_f-%~s)8}EF*CFS%gwd!`o zCcByZw{~LL0yt9F6f~Qoc#seC1jkwQD81{7r-fx7j*?W=8{2JeQCsKTKAPZ#C6`tw zSdvSAC2ARNA-Y_3SzMsyl{m7@P;Ws>!|9DOv}ww;Uz_lHcTU~^U0Qg^uhLnqZ0W$O zcOjk#XDG$xcDXZ3@bhPj!%2w6r5mPudzpt?HKEkIN(a+fiEr{Gd4qY{D_-QF#yapr(I&e(SERbjRUMz z;sLf2ynXBL?VCLWZ?+2jcdZgB2^mP}?jv$RisvlC&oscAW+Kji*CzoGvbWA$u5qYk z_eHL8CKjidcLGgdXEswZr)LKnN$jwUYn-SgN%*vr7=2v#flK@B8?mf!D+fM*149Y3 zZ)D_`{>CiHJcs>HA^=W%jpGCz$T&OL$#nqm$r@R!eMvhLmY@~Mzs3;_MCX>`UE^fb z)X4@AqW&qBWz3BY5aPbC&ET@0P;OCJp&v-ebm`3&x?ZP+Ct)u7c$$qE zwncW;E@ni~aL-H8bfMJ_@bMz{%&aO6yq9q@aA6(5BTE_6NgXY~2-2r;hW7&OI$zps zq~$IJwZAnKhEK!4SeEg+gHH1I)VpmKMfMC&22yAkV76gb_Y2IH6uT||T= zRqnmH4OEnghqZp1r}nJ=p_p&74r@s)$mZT;Al;Cn*ZWkK<{dv+?o8-V_-V49qblU7 zOHn|vG=69Iu6my)Xqih$dOa$EmCwIro&wteZ%i{>_|^!Pb)~KU`I6`%70tyWoa zx@$?YrfFgn+Doe9yjc_M1*go!CpnL6TgF%;5r#~#Ce{1#jhzP^XVMB`sZzrri$Eh^ zkZpag!p!Q&_6^*<3a~@&4O2Y`wHaHfvCV8+4beAJ<+J^?j-?XC7IW;8$nb>L+NF zUQXrv^<&S$#m{g_>!5|ACEi57&`GE5^QYbQ^-kzf~iM3glai@3rS(s^0Fr~68 z2h#1TB&_i{)6=P|*at?7%7>=2$n(MiDejHYPkHTBKKSebw%H@Xz#esX+2Zj_lKdj| zdsr&@gyDmc3F!l8bFJ@wqd5=NE?k!K{OkG!R0O3J!~L;f)~ir~zqro!D(WMwp8Cq> zvkhOdU-T#KCrfe&yt87Grk{`LM8NGej~sfDLN!Vby-6~)bNer|KSYj7wm`Bs*#u&O z=?i-orwYK@r`eFduN`jtF&$IFlRD_j)t zUh=E9zisa<>b}N_0WWO(zFf-*zyQ7u_Qr;u4e$0ASu4$cuY@~+&1v!FkV!I4 zC+98ldj+|yJChfh^c<6mQ!T!oM!@U&jH@4407lA=V-bc=OOo_;DG0?T9j(hNIhf&0|ULrhJ1-f{Tmma_P7j+&`z7NqsWAE|A-55X_>Ay zQrjNvk{1e?RY-APp+*sEtNRX}>P!Qe#s&w41?d$18egFr%)78O<~}$lASuf=>6KD? ziT0+4QgV4@TugYh#o?u}cl@jlE^vO3bQJJeOSI>7_UI3G(K3WP#l5BUQGxi3K7`7| zoMYb(-BepXtwSSoujFkFisFNSb>@3qB3|ffDB)FQj$UYgxz1*W-&TQ zOH%RKh1+~0xCJj;*u6*^onizvWa;d*F;rlZ|82*;M{Wq;I4MNSUrBbxCo%&a>=T-( zua&C8Cd--%|IhQK>VZpP;kZa(zMkg{$8>l1^P;UUi$F(z&zvVf3OK-~968A70 zFEbat%I08V4J2ifLsYy^vD4q8kEaDit_9hcR^cZof*aHu^+_QX4c{b&y}6Prbuxkg zb#FR}{L8+vSb656&H+oPsHlp<7)kt!f?4CV`%5u)-TUlNDNRuo2}X#$l?HFabE26| zD7HQVw6xT#+YD#Ybo8OJ=&N8Eh&nUHQ$;bc`*AF6t?rFz4zpkpsH;O$w_(QQqkNL9 za8cz{C7&#wa6IQ2CPNv+g--MyQNB41l|eaV(+&QJ|2}UtVRXn|&mt;7d|^)0W_64D zD?^GpLFE!GvH{7Htn6cp+B)Nd2mGyam2>V@d6J&(ZnZQel%y#yNE%VsV>D;m+I82^ zGK(kZdo4x>ibsP@N0Fv_SjEO3pgH#y zcHymTydf+gd;eWE2^nH0a#(eqZ4~o=%AMkokBtqefM@tew^+`_*7kRvvPQEtL|WCM z#gd$qdhVJx$BL#ZB}Z4GX`QgC(XTT4WFc@hD^fqWJ_|3*h{c18w1`tfjwDp+@?Qbf z0h&}dK}^OX!5E~XLTur3j@(@CUA7k5pMAwGC3!ka);VSJAgtOpZ)`HsOL4Q5>=oI9!doV}rMv_Sl8*1;|5nOPKdi!b z{&WKBnjFJ#YqOVJA!dk37OzK#l#n*5#7Tqmt zAxw_Kg`sg)7^#3>t>LZ2aA>xn0A?lsPxo94bc**xteEDDEX;fi0uSXWMR z-kb-MiO$neinr%B)y;J?4wFBq_*ie^Z7U>nCqhidw53s29VzawbZYe?qc)P93*dtl zHzb~=<^M(4eS|r*PkBgdycHQC75#T|(@EtleGFjx8b~o+>>IC`~k5 zch1x7B!99Mh$O!iXD|z^0Gu!IW{mK=@Ga0JNkMBNxKEJ6hg!X;!YG0d!QjG_CFgGB zk}B>d)zsOD%e}8vFh)E3CQOkrs_l@N#lgdsPk7p zbx= zS&|_G8MHPwtD!!m9HFvHeP#-Hcn@dnhW6wwaXI0~A*ubf#G@az!=>j1KV>a81+ zgx0dDPD!KrKDpN-sAl^0l*tsnle<{Cs*y!vL(D(SlV`9`(unG60J8wmZ^O`IPblkh z0T}80QkwK-#;XT;AiEV5v`fHX^`<*r<4^#jF6^3wSsNy4p0vpGIDl7+tMZH7XdHRG zDi4SQ7pjcXq#MoqtV>d&dPhF0fu8gW!=NEu7aG3nCaP;lp@3(%T)*$1I?Lj%_q)!Q zTCztEzI!}@+kZCPX<3y-0yopd$NVOW!sq3${JUB2u|)kOmYG$5w!KNKTWeH0fZ zWYmN4m;s5~phk?%LpgI8WCcAG$>()&%cR^id47;9ei1Y~QOGXOLeE=oh}4Ccv9j`s z1iQwj;+^=-s$K-fk;V@i9{i3(cAzQLzP%=09m0AALIX;U0Zo6{`jTWP3%=F2v|Ds3 z`1tYT7i=l?uatg%uY`G9RtkO3IQhL;w>Q!5qLqM(C)xbGvIK2nX?2FOM4~KTO1vVg z`qm}h`?q6*Lc z2s4sG&hN;Qj*TI);vIA>?i)TD)+a752Kq)nP@_;wfvmnAnUGeD4D62fZ*LcNed!v* zmz8#ps@rs;kz`OowI$`Gs>NCV%djNolG^LfZ-bkX9JTe#zPtzX<|4k_^L&G17$KR>&U?#0W#t1$^exB$uC<7b3XJxez#WaFAo)=Lzs(C8F7H2(E7-12WO*o~yVYF`;;-Os2kA8Y45vJ4C9sNyQz zSQ-$w z>0#tww3T-zNLd7zfRKhktq2Qo z5zSH{e_h|xl;SxW?0T8dvQ*Y!xAd_(B3UXxX|Ae?GO7EMv`DYT9t9u|PKa{2QWkazNbeEaC5yr*|f3Mqq|H{%V} zOdr=`yw};EE(j4%-9AkA0{89-*GB1$eB~+ao!h%`3^w>^#-)0 zPE3iTInz@qDg?~8Ga;hv%t&CbiNgE*MTaw(WpvFea3RRlh>zw79fJE*16vO$(sZFU z(wIpaL7<9Y1l^DiW<9l3)v9f0E{C71E2$78?CzgY0F)xrglPO7BZxJDeZ8j8PUsD| zZP#jttit6rPBhzF0;4%JfKD);AVcJ^$ObHrD3goNICFIpwt5}%8b~?xHU3q5&Z0kF zbTefaIfD1T(~Iqnf!SWx+WcaNWyNL)!!d_#pLS7fZ+*?sAxx*jf9L3Da3i6Iu(hBy zV7?9joe7$C$3S0RvFeV+MMD9dePip0t>YbRKijv8hAv9h_&SLZK~2iX*chl*uYtVGSGbJC%tq2@G-bk1gI;2%l=#wDN;wA7nSwE@rriiPStf)^owV{ZQb#&x}>wSmzHnteWD z*!Axj^#45=@ci`t-=8Js1mO1nT#L=gQ`b27$7lqMW*k?h9_kHtu2jUtt)7zdD8EFu zpDk{o5y$Ys@{JyBl1uw3ZTrme;s~=I?9$*|FXm$6%-QlP9^k0W#p&Tt5nz|N#tDHB zT{^stx-3B>&iLkjmFL{!y%cWY2qv33+D3QK1NI=<1I;CAmMnTC>7l75Y;RU$HpA$* zvimE*#3O&jzFbBx=etbH|K?CkXi&}-E(SNr5UIw6Z6Ia;%uyG&BGb-JTt_O!e|ZTH+)#2vzPy)&JlkB59v~ zwfyv01&>Pclu|y#jD<~@NxOi^WLyH&8J2d2m;%DqXcsxV%8 zl)+hF43FIBpZp9;O*G9Gt9or!Y+8!E3*GJuT2YjXDXOWLA2EsF%%O)rODl$sSD=Z0 zpvt_xFUhk2VZNJtZ%A0$1HH_|Ies5`IYjDgh!xn>zkGO-vG^pY4s+GTbCPuRrOJ`0 zB{~D1>~j0lwtOY48Xz{S!c8X^^HPUy&#-9NhAh2(cuvB*YMkE3Xc>#7t;e)i|1o4h zVVY~1qJdK}a__Y|>90!!W<o1A# z_AIfKZd-l&Q5h)A_?jhfqWo;l%j(W*gR8zpl$5J{%{7ju=d%yS89&2Zc#^1jgTGwk zcv&Tv5_eHY%f%Hvw42q{Lm$3~8>pgJ=0%yvN`M)7$@1NpV-Z~-=m-tRJS`ppjGs$6?)V5MirIdpuHu`-5f3A{fn(>hJ9G&cHoN74@kcH&kOM57T!4l1#=v>!-;+@OW8owr6(V~?4ibF!{4Rxtu$eQ9 z%U}EE?Hl_hU?knyGDF8V3pvmL-I3rWt_<)c@IZ$!Gs$>edCHuh0v_Uj0yh^g{Ier8 ziE3p(AU5;QZ&!tBiagC8X4Hvzb=7;BbpAlMmOFC!Do10TMHefugfi`8^z6}s^*_z9 z$O0RpC^0{Jvn1x;x$0&yWHG@+2=Orc$`4NoNv{llcp$$ILMoSxe2nS74Gr!$zs4CxeQje=icn(l<4O`I5??=C*esLVn^ZVE!ymzFdu71nwz5i= zY{R5;SOdQ@*9&Ng#tK(XM3J(o^X5lBjiH;ELgsTHDwWee>I7ezX4STVlkS}ko8 z&QqO7)A`8G=N?B^2qk8IUUGd?h0FR_!7KKIo7{1)FT@izH()tuTaF^0NodpG?+Eprgbp)2e#4uKWFAgDyq*HZP-ooQpWJ>h+F zo2e@95d`?&9seYiBxDQZD2!A?>3<*+fqLH+v!OlyF7@RNp$zhpod7H2m$k4rz zOg$PbooJe09;~&D1yjiZ+96@V;zZE0on1785}6d2YxEP;20qNIE__NExIT~pF&5+$ zWu4>bC3~f)T_q558+wmC>hpq&pk@AMWQ{DeS19iYpsQYeIQ*t+W-?e12D~v3zE~n| zyJ5~*&6G4Kg|sPPg!mKU47jb9_3UmGP^9=#HA?C~j{t0DNrTj~b;c~))iJ~HXvip~ zkp-NEdwac{MBo!}ow(ew&c;iKejDT^r>(^q`Ay-Y>)aY3LOLgmf6cmNVC~N+efmPsMB5jQf>wn0C1rgRn#r403wMuSPbPd)6(L&b&RGV zjr(A6Dl#sHjv2foZ=Cc<<$YoDi=%puZLF*c-O0F*ZD~y`QYlKAn7}7$u9O7r$2Y+)H0RHgAO?%)zCXb?1lq5uE2zZ}bCH6inba-Hq?OWMkw!gudDp^{ zN@aVJp1u*5Ge9Q{pA?Vtg#7_&3$120IFkNv@<`p6daNAqC>9+^WK;Uya`)|F@<@rC=z5OooS2@=R{{QRk9>}q=@XQTKX}VikIb&7t79t@otD*1|tQHu`yK~nz8OhQZ`Il`# z1AU6nLn5tl|c^`AW|PI%2A?0|3kKLLMu-m#i0~>VPFs%Iji*%!hxL3GoB&k zCZ4lWd+7PUAc=36AVA+3u-_QMKuWOUyeLBwI5KaN5K#o_+<)SJ&JIhGV2HQOl*q>* zSfnFM*@D3=|7k0|c7wFiim`ij-9z-!7De0^|Dc{(w42=HjWaA4n=};GY>YjEL_wUz ziPGo1Cl_s^azrIzI=jO6*W^u~8yRub8r2tu^l``T3+Y&tbZKZ)U@$Qt(#gq(-@_}u zk6U?cCi`9)vM411*{84g5IvhOK(%$H;m4v#v~3D`atZj8Kn#FSrh=!V7ut%;9!wXMI8=DjAG z1dFgkzeSm8VlK(79U_g4*lbZINHGTls*Za#4s|1ofL_>Z3yFS7Z3S0Ip4DWFfeyT- z2>*sOpm6=h@&*Nd9oP#Z<;GZUR_jBc|LswUCb0yCHU1A2xZ+&pAGu(<&AL8tE**xp zFz-jHObD7Og_Q{*<-HY@ttLN(S4D2ZAszo_)l)8<(=`$~`aQCpVmZ-;<#{|_e8!@* z&7CNuB8v)VcAY=N3-$+jNhyhFJxfc=6T6uI=^pe)*4h(QsLl>@W0Gjs&pDc$bFm+w z&@)Sxs5SB&h0QNC8A&XLk6&10Ii3kgeRcn0 z`m0iE)^{gDT`gj4$n4AN;aY%HasHe`WRsGk=R;&nP7wx9SdlOUU#XM0>p&j1{kMJS(bS11QO52tOaV8lg1aOci&+lRktc=(Dma8Ps9=4hN!XY$? z?h6}FZBZCdApjd~bGn5Rs0~C$9t)eYLov0mC7b-VM$G5#2Z-+-DO@qw{&AzUAfU*@ zH(9kyl}0Tkpj2oX2xvC4tiK`Q=^4Ph@3{CD_>MP-A1Wx8=(67T7rsBf7At$kxWL2z z0l78>9c2AT5F5kF10S-MGXR6xg*oSz9;+epx$yywB6+3-z%o@}9?oe2rI2f4NJMxEO{4<1IgIl9*%^9f6xu>Bm0UYf246`H=pEuBd6E8SqyEN#aOAH#&60S@VO|K;X7e!s8Gw|#Z zqkNX|kPVfyI0F$o0S%NiBy!H>a{-n%gGDKdi!5U+Tj37k6*!uK=svECO^tH)uNPX}n=#A23QZP@=e3~xVB4I;>1;Caw;a%rQ2`CHLi zNkeIl&|RiGU%b`v=KmWczBMO({~sXsv-f>SvJs%D6v0T$F=nK9{=f161tI_9{Wo|t zbn{GTEU>(aM=V)bC35YtxJU>EO(|&+TMYl;smRqV(Sx~o?h|0iu_dtW{KxK_r5d9G zb-C{XQ6IMnOqr=kf63y?jznUEKrH&`7>mB)j{-4sJ!c6todINE@~AF`7cBB|$j$}v zpF-l<$`B<@L8+CAt)M`}tyno)(z=8wA(bHuc^j}L<*p?GW_jwV>8YS49hoeiFl$9U zEGk!iqFx2dSPSpXwPYRuCTV&LF7%% zX3w3Qt#?Roma&kq2tU_!aU~ZNF?S1k1b!x`Wr5722(CdtmQTdqV+}#gYiOJOV_Cbq z_n$3zaAj{_nAv>i*yx>8 zn`?oidxV=D9bstTKBeJ`+j*8NHmG37V?7Q_|Bn%bh|N?)ro73n)sv69VHzLw<@;$c zyMWF$PHo+z;()K&xY5m<_+wf-m{Fxgds*Gfv1Bab$pyr26D3=Q^;5r-HTJA$yoIb^ zBR9EPQ-qEFor_5mhc`3%n}UBBWsRvx{1wV@OCet)=Tjiz++(>!OxxB8jBjR|K? zq2PmKBe75R(G>{7ZJKHgEPVh=IlIPhuiFi(X;y!XGtMfhF<(0L4AkAys=|^8=e0C0 zvj0Q_q_NJuF|9pnkz#o9T|n`D#vbEfJKsZc;^gX=1hEUF2z~pB*Q+h)1x|&r=r$fE zN7F8m)lbog)#|>UB)uGc&>ZE0vUrQ_(!j-dB?-={+;Cfzk#^JmYzKs0zN7E-F5jt> zu77+&dFJi0!|fJh)FCMCrMZ^A)oR-;2c?D7iY(j|w8pxlpR4ZrF@B+p59-z6+g@Jy z<}2IA#h9vk<`Yj1uv9^dZafkFPrK^#O6eRiAFxvPpduduO3#JTh}QPNu8k|Qdci_} z*>T^_f59nPgle)lU)`+AtotEk(@5P+D#6UVbfOiso#LbzPIPnu3Do`jm8Tr0c78be z<&S`V(ycC25lhDYv1MYUG4rT#KKjiD3&(<%vwVj7DsHSAW_TcEnP*IBV1+4%NBN(! z9#$mNLcMDZ=k(ErtKO%M@-cbdK#wV^J-asGFo8gF>LY;#maBs8a6MJ^&{Dg1ikiju z+LWGOT1wLc~Ors^U3t=mhBd9JJ&Z9Yz!&hV(Ca;+CA&Ye1Iv(dgplFn>Pd z%pY2}oL7^^;@i~v-eXBs5$n-Uy$7^!TZ$#m3F2^xS0K_+ZH;AO3LU_9jPIwt!Mur) z87kTxLJgf*VSHly|4Y?nl z@L8L=y$AmbTXwOSI1*%Yoa}Z;_*b1tVZ}cqzDKFe80~!f%3Dp+(tRd)*(!bh9XPoB zR@`FQL+@sfuAVEirhRyw%o0sVx+PrBowXq=e7*nGZy7F!nc%!{9EI?Svm zuIZhh>3_}@!~-@2PB1D!Ykt4(yp(RTw~y#CPrk<@$=0QYbDL#SyGXj*U)m5g5<&`H z%4p>-xZ-b~sA}!?F2Cb@)~yz2VXe=PT?^7AL-BVMe)a!qk>dCOx25tvB6Z{PX5TYZ zOeSHC(Q)7hB>+Ug7R^fOR!^U(&*1bLMf8ji3Kj1tiPtNWU z+6cGE*K|>zD>S5*c(J%f6=7Jo&WS3goo?lt(aUD=1V6SM-J(yhd=}Hu0e{t}BauAq z`(^y0MjJ`%t9Qp%CtT6QspIogf41>CGbn%Ad9g1icxqXQ`P%%=q~w%T%Z*|1-%PZe zwRvN*^Lwz(I`3CjJ4$NCm4vo;6smiU)S`yU>Bo8o3QRLp$Aaf=3805on6Mv(_uD$8 zIQlXi6uprF)Ev%l75FEf${t3`D7UZ6K$ic@pjZDgi1X}L2$^jbh09^$g0k9L{)gZA z7wG$sXSUnfZ-4$SYf_e;;{8F!%5Ny~M>VBJcL-Y9x5sYS)^)V_c0KD=p&$S3Yz4BQ z$NmXZRQNBnb*>IapNFxZC3CBUv?F1XHw9G86h^eS3Y>eYpRV>>bDx9bfT5>~HabqB zOEyKNR+i+9_bunVcUjY;;*J;i>-F_BXeoB<>W&}ZZ!b1;_XTq58^)CcalE+13h3Uk z-0>;<#O1tgh8oUPba5S%)vZv>{GRh1-QUzSy{Ee|SM6^vXKs5Q-&{T=-_cxFHzu|- zDmq4~@jxvz^BU(%1YhsHjLO%I&73ma%!-#R?O)zVB9IcY=_^m22fR6dNNb{MavE|^uby0+dszdf)4n&(nkaIWTH1q%b#z$eq@2}R#SX?c9kd_uKL{)@m%c7WjlUV{+}>K z;-?X%4&+L-$s)J4Gw_I>6lOo?DePmlXYi!Q=;bPkEZV%621vA#M5F*Dq7bh{DCr`i z1G%%JF&A?2)=xHZZ5*d{o8MXWqxy{KUi@;;XJwy~VeC*!)GVwitEJasH0b6T`xrY( z?*X;%Yv3z2ZcXEnka;oYVqD5l_NRGIqJ{^mhgPWeM z?DXjC0#)*qqBX@&UfTQy*EpW*+YcrJ<-P@#*$T%=)oep-fOQPjj|V-Nxm}a~HwUNn zlou$xi^g>`6{y@({D@oMJV+%<$>o=Y4Mxv~G%~$cx_lerDx|1rC2PH>u;b!4$XYJg zZHm4lJ^yZik_XSU>xYr6yW&UPD}6r8wru^X*zgNWVu%!K6?{_Ew)ttmD)ij|h0$=^ zH(NC@@!Qo_>LxCyc{ikerqTR|_p5`5cHj`Z$$%cgO=GY?9sJf11%Uub;2F>$LaWH=g5K=d7@*NtQw~*UcxKOK3f+~8WsNZ(K{Mp(Y{KT`B zYn&Fc19RYj2A&UxokJIS2C?H@0n7rv{4S;9qj>vewS;j$cTVKQ)4{P0c5B6t>2b$d zFo^ku>FI#7f}c;f^~F|oAMo3Jnb(Nf_dFDFM3~Q&IDswrqUvorcpBsw$t7PO5A2;e z>CmaqHmH>MTQV-2Cf68?P_k1>u~~x*5|7{M$1;Q>Pvhp@V>^l#Mrw@xh)UP*6_d9X z+CpCM(Fc2~a}jydvA(U##q%jS{oxQ>`&O?yMl@|=pb#oqxkYG+=UL)Q%^68vW4GFM?nVMjg?%J(p!bjo{Jrlv_fxY zbdLF37XRp!@OjK3MyawDi~hX$+50k%yY#MkzTb|*B&?uY5v#OXZk8FnB13kdc~Eky z{jYqr;XL8=E|t)k?q}PRb*lPDr%eChw05=>)inCNWS(j7Q!~dzt9TYPl){C;+T(&m znAEs0)6?r=DqBQ{Zh^QL_mlDJ&ShO%v1^>bljjvw2K@HWu7JkbB@4`sl+_icd35mS zLZx_k+_GjtUx03267hgu&Wj;7c+$fw2NCzh`WPnKPxryqj(fY)t>%%gh>NlYKq6ysW)K^)nIg6#KFZRwRJFDWQm#?^5n7S}_!e)Lf5^zzryE5h2QM-e1Xa zd~bm7cJSC56TUL4lbLaJBaE;^6-M4>@GxC&yo6@ksojmi4*Lf*6>*qY=n8C<4gXi(95sfS!4^|ou5wD_d zBL`Qlux1vs)qWW@xUa6 zt8S0=ds{P$^crdh&`F6Z@b^)j-F|)O>T={uZRqjX=;`-ZL@WD(Zt7@@xVXP+Ve*98 zY%6CF{AFWX^i!_d7ufBpxP{AiSO08xPzQNGkAIRVfVE<9lV$aa{52zN3SRqZZf``$ zt!tXnI`m~r=NNOWv~H~W%}wfyiJbsRNeeJI`&XZ8xM;a@wWO*ofPZ{o5aQOqQ*e1J zQ)1}j**#{rX^INZa#1O>R*Zl(cTa7(@}3S!wVm%}I`PyEo%%q18|g zXQD}L#`<$5A$UjE_ARvn+pjxUcP^7qDfQk1xJUHTDevaOY%DW%u2ixZ?gWRw2^-&4 zf0KULZ-E@RPtRS=@3JE?6dFO2zlZ-nT;qx+;x@TqTKkJK#Q@#AQuTedG%1Noi>D4{ zec+QAk?df_)mwpRuYuk`X zyZ+%l%B1F5he;Wg=f6h(!@d9Z77O6@b*+7Xd+G}w&vu?@AwqFW=zr-7c=R^L(Xt1r zzy4hO9PpH+UmalbbUKbn+oVD|ZT*(UsUVX*680$Xp&;A2d=FewkJCy71 z<^`TmN9w#PouDSz{P2y2cS&vEnq3s5$;u*WQ zW2m^Ih1xX#W%Atyl>mz}a?^|M)lcW;#69N5Qc~UxZ9jt^?l~hg4!loPN;{?~FO-cL z-X;L9X%r~y=t*c+3~&C3lD43n>3 zPGx%TIBGvsux*gp(B5v7ZQTsmsNwnGdd1j(Vv}+K9x2Sc4;_q8;rXVpKuOIVc#lKW za`T=@aPMhyd$iI@C2D;-Zs?4csbdHAXZ&Nw@{WLyU;nIugv!=-S#FAK)Bw{HXE(1< zX4-N_Z*GLxrt1Yn{zsdEKO4;~pU{`kH%5{gZJNNeeRayiMJ7GiQt`Z6ms*@ZT3h*; zIYtb6Nt;!2`D?czXraGrd{ciV*+1$+#Vxv2op$sli@w(L2#myTa;g#Kz;=%FDNsM0bh;vRr!F6Ln=E8uf2lcf%7c!+ z>RhOdxT~*L^iGMrJYQK$mmTPoE#WzU1wgLY#ASBrb;~~R5VwBa{%~Gt+WOF(VNbBGkL zZEA$uQb*-b#xpy5c$M?St#Ml@Nuvd%judW13wNIUV51t!rk9CVSbZNO{O1?1RM57% zdceRgCU*KD!9N6NluRIW+42e*T#t<&pbxo^3W$h*>N=dw~oc|=^WGU?&^?_W1cON zOYl0(dFua_2oLT&_CHdFvpkY?N-ZaAWTMZxX6VQK$&_SB%#u)N`-UwSD;=gPAmTuxU9G1GJ!n5VoX8^wg!J99n#o!{uKC_Ty0t^m^hA^b%DGUDrYxg9~~MmdUScj`Xg zdDyE)!{yLu?{qvo?W4pp`N-UT=%E|JJ209!q2M` zkMx-KvF(-LlWngH$yhw7l(ThtHF{dxO3xc=_og4r9!Szoj%eFUCug7;jePV;g|o^HGMTnJgh+i|09)3Aap;wDV1w+J%w!-Grj={d`Nj{}>J5Z;$$=!*`R;19x_P z*TQynK3ptd$nRnrmgdr3p+eHlL#(43w=sYa%YJHkeMgDTgPL8|gt{)eItq`h+klJDq~-*p1nmZ!IcL*aNI zNxz{OE-CIo|Mr~r8h5}Ie$II}Ndbh$pJk3ai<~}}^C;B)kb1R>VnS~U$&%VByRt5J zNm9!Uc#>~)5vNczf~e}gsBOFr`_t!iz4w#&ymDd+XRbOkI5xcJO26xG8Rd^}QVdVC z+{FK@Mz3ylc~Yr$A>btd)u?OPZ*t{j+CASODyy%7>;DikY0hyIYO97hij7y^F|?eq|D;)LdZYsFyv^?%3;~?@aUi{6@SX!Zu_q9 z=z{&>$YgN%_DoAVbwP#^O?h5vo&=9h43oKYwikO$_51r3oIN|>c$3orXada4yz zPxC(-VJVV=yokke`f4YNgFh2cjectKFvFE0gGGI2yv3^Y*|qpd6ilH>3ib=VNi@eY z;BG4GqzzM%a`@KfQ?V6(1GALC~)J*fUbK*JGBSJjwbJi{cs$lr~cyym=IB{ z21(4i=H)5Hv~^wYDrswEuZ$ZScmxL}6cLLl(!LBT5!n)=<{Og_fu3fi2;`=VMqXC~ zg-GjH)1nZnK_E1KOG)<03rA}z(>Nsg{*#)d;xC}Ku#r?dY|LnW<-)7M|AS+}3tr;6)CL5ZvZUxe9*W_s(T@`!?%6qYd1!)Y4X;BLu+AvUR`>U`1W)rp0 z4?VBC3j}|ajsp!I!ExKO4|XCxf5?VNzLLD9gnTBPKxR)(AC{Xsk<}2ePh96Yl4hPkF7K>%=7d0UP})Q6k5^;${M_pvwr~LG z?i497U5Hm8!rJ#oHaxUj;AdPVtyiiR`fiMSW9)?x&~EB;lM9oO(7&V$aqA+W)@ktxHI6rd5zVTr57kH&5 zxBKinf2GJ+JNi&B1gKmppIid?MEuhB)ZXnZvNJQ_M13>iBsEvpJ}=mFKwQI^Q5CTv zv16=Lz!-}iq+%L=Lv zgyQO6VXAvria;Gu&;TsRFTNtr%qoeV0m$d=u1z016gwO(VrM*Nae)tp6j5Ppybf51YtfeD$^FE4EoOKg4@; zTj?w4{8NoCMO7urch4e-s+i9n9mY1$GI3%o!pBWA_~SvFDqoDCkU~l?utt9oWR9s0 zk~D8POz8We@fr=+k|P?EXJJ2gw`sqeK765%iEWapH$q5AS#2m?TNm& zWw>VAyIv`6VE0FijPimtxT+eM7gzh=tHzRz=P3c|o|VJYvcS_PjPlZjXNTwGsLe>;FgOHmL@aP& z^a^_`SDaiVB-}PHBy8z^PiCEvj~|@H$B9$kZm+kvz8@a_hmf3$bA~oRvdQlcFp}5c z`H-P_!##lapvBXIJ@ZwR+pD*p1B$ewfcFb`^;|56FDO&I?my#(Z2<8VphLc5_2Ie> zPV}5UD~d5LO;^zBs#W$K5AKezec5WV%36x^PInL)8DEinVXqFd$%|x@!^k&iHiDm-V1fs(#oQ|7?eQc9nPKmav2mK%!Acr z9ZKIzG}v1(U-qi&zupn39sGCZz~W_*XA#wQ(Z^`*k1Z;rdv05m`)u=mzj3N^_SWkk zf*-ETo3f6|!(Q~HWF90FK!2?R?|%rr1GkaWBJbpP`<_qrAq`K0V)k;zDPEB56MTNV zMYs9qW!Fl|Z<;)}FAibxs|WM@c6hJgU%}hohy|~2s7{!rWj+q&SIUsC3XPGL8WDJ_ z$|?{sa&dy=>%I`qSlxepgcI+ZcPsV``{fgzuuzG`{!p*J(}9LFTg{gpykb9FajnGr zm|Sd6L>s4au^t6?x1I*6U0D@KOX-(#fmuN|dcW}K`aRnFJlcB~Ko1SGEe(MwvXXYM z6NjzvV{($ZxIxc)$gn3?w-m(p>XE$~E#AP;dx%9+MO~<4#>IY2@ zqV#H(@kPc#1CWmoP&{O-XNSS8jZbscS)+6tveYU4@k-kvT?Z# z7Rbzo;0;{?x6PY>J~%FpO`gOw>)9=!#e>IHaK9%ib%)4d!+&bOYHPt#^=&ma&%5S*KjVa1+MI2GpTQ!E(<7 zl2m~|SwEOunw;y*QDON8Z%;L^|IcbxepE6dCYZ?~snY6vNzrNL0C(&-Bgsme*Zb8S z}1M5`*Jk7s&Ec^+Yc$O7g_WMfxC4@gk&YBDhPS=xU(h_}$;^Bn!P(u4PWo!Ic(h z{cn-_bJO+48Q~_@kZt{rym3x)vL6DqPP?7CQg6+Y9A?6CC!WLr6iD(1g|CAh2~zj4 zaX@&DpvHm;I?yM`+L~;JGS#7*RhZ0@48%qD@dh^JQ*>69ucm)=!E7SSM&PuM32Epu zQ2j7stcB)j5Jhgxys9@@!Zu>|YCA_@sWov^&zfU`feg*0+-q6#6d^mxa1!~OL7VSc z7l)6H#_Ky=TV}j{dWp&(-v)BB#v5)K6E-?`R+#@Kbq(iz(HR1LWX-XoU3Z=YT-~7i zu;O{MJ%z#wi4{)493=H?X8D(+YgpEw45nMSy!${u4F&4|IE^@|ht>a)+Wio>ZY|kB z+Xqig5vbq{Y!Yt5J-OI53;-yh;9j>3c<7rowe7485JTbo?sry^-{(}+{$|~p zE4U20S{i$2y=ypa^H{h3T)%;|V8$uM3(qsXJ_)hfCAB|oD3;wYKR1RMM>umr>iLep zxDjZ3{T9?YoJV>eD%kKvN^dJ`tJh!QqMz~3EM?E%;uTO?s6Y7B6dc5U;yrlv_-H_M zXP|fzN>#_lQFPJdnJrN6ytk9%opFStz1Gld4e#;LO?iYiwsZz?>(2Fm8WiSa$@qG{ zdmn1xe9~gURKI%MFW5XCYG8B!-}7HPqV2m(S%2-w2SLBsSqB>Q<2R@ob{b{fpkHTP z<(yUjf2$a0K&^h6aiV6E_6OxPcFiW)514D9->LOeMta@9&C07fUHh_L=b2Hr_tF1t z@PFFO9hb+DP&Lt(x@z|4O|uCa43lliehL z-5pH%0Qz`PV6$i3^#4~31uWO2^c()C;Qa3e{XoOeOMz4MjCotx^Pv-_7nV_j*^pj5 z`+ED3ovfn}-V-CO>(D<0(AcXL0#1t0rXsM3q2gj}o_Z-G^Tefu2D!R9HIEeL$Zt>v zrdDFVspzkpdHRQ-CnaQ%d3(fxBB~dw^0J0LbI2HIsmnPd^W%*jiM*Qg!Y3z-#}K6_ zpZ+4L_u2wibo~0q$R3rtgNp_^nHETi@9)(?pEUn6dQMp1t-Rey47*$odZ{;J_RG#O zMP>g?eJ8I7>zNe$Wte0zmHQr6*B(oAqthN#)lJ!* z`23M*zZ!|kr>omoKqtVo=0x*aq+njRxAYj(+zzeeqNZgc-~7HhfSLnnrS{E8o*R4fRP{EU(>ypn>C9HKO0^Amyz z#*s_Fy5P>UDaYW663h6}507rj#;h7j>d%qz1ekthXyX!xi<$Fx;L7!?QWO}R!Y*po9))sGliXY{55+54>7Nd8?rOJfk7#XPj z}OXnHaM65whv^1NKN zj>@qVhEI4Pi+-RIp#pYHLur*yy#p$p+1uhvkE8a`)r@5HhL~4}jggNLV9!vU0~7hm z*V8Iqsf+0Q327J@Z%7|hor`P1&N7E(pacxBvRVrK+hI6Wj%l#w+c8ZGFgDC^_n?oi z4yC%vTeJ8lL8O95J|(cZ;V3ol&>%vq;TG=PY2uWIt}t9+QyFidttePzZb`)5OTzmA z!0nk<;DL-w3zoUd$HUnGRd#6{wI1*9*f_#~i#5CB25G)ZBu&0iaD=pW>FwJ~-AS_P zNOFqFnrbDIx_h$YALZcqd?LA5rX;Jzj0A()axfP-AqYPWkrybP8cjKnx8cp}xqDg@ zt-tLgi)%tCXw5Kt_8FQDmZu#WRs4DMnk44C_Z&q`(gcU zAgZ7WjjlZ1jk}tKHk?W!$fgiwD1Zw1>0QL#Y!kV+hiBRnL`eH2%O8duyr9Pf<*5BQ z*bdgmcxC$f_^Yw?s%P1Dxy8mH)9=017`ez0SUHLdIfYaT7(t7L*naeO6d zvu^52w~W_;Ok94@U@kV|^+B2WS*y|(_I@c>+k#tr=JS(GI+lL1H#nFkZl>XWGqxUz+v+N0N&u1Mz$=g?(l6 zle0?%dqVC>82~B4kQrgGkBt<=Hifu3v0usXldV%79T2}0zFw-2eyou8F?1dF;=dmk z#TUlwkw8&oC^1wbkdvcXP5LtX63}hx;yQCPh0?xbon>Ks)2`X>ZpZk_n>o_ptM;-= z1Hd7xhqwYDERhv$z^t}^fT}6$7mTq zS`)D#GNigQhfsy+)LIHdrlkZB+o#iHl2MiN6_#Z-3NWvaDz@XkP4(J!rH>iTJ?4ns zJ=t#dv+@`ysgM4fTYvMS&FVJAV))@Z()IJr*5AxMten>3_ks)$)4?EC0fsZp3 zz^c=(?n+V^TeRZ~;YKk&8#a%2^o~A`#%WE@mYZMoTB{=$!_l!}wS!xusyBs>WjK#t zin9_Zh{(;Ne))%BBiFiZR|fK`y32#_MxqCs_Iwbb_H8k8#6OE#Qo04hvp?{P(AI9@ z+XmCKm*I90VdE$nf2G8jlR5=A8#CsGT(KF?`V|_sT`D=S`lmW^fzuPN5^z$FpCXpz zQ;3&89`D9z_Tn#haE~0giZ4^(X!EACrJ=I6zxSHFz%0ofWm>b=#QFT2Qo+QLeYAso zOPR1d?3O3uvu?d~l?c%sGv16gtm?7+=51Qm%hv<4*g4m9{$O?(+e$mbHbhIogwto4 z{k#ll{$9DiWx2ooQ3dLQ#=OmO#fjgd3`mQuAKJ9e(5_;l=(U*01C&D|f+z}sR|^&1 z=~BSodc0qgQB;B{(hr%EbV(-(z3{l11XNX2R>mL-AoSV?8`*tQye(#}AL<9TX->0s z9>?Yl$}@&W))H7xtU__#yNU-Mkm-o>cci_9)T#FT#Jq8;6KHqJ(ndwZQ)(1N&g499 zZ|OPZ;FOb{(doeJvi%ptZG|x zMmY$B0UgAED&r+2EsrjE8YKOVeR2@YfJ%b$E}Q7Lf=-~R@VGl`DUWD{EkN7pAA;30 zWoyQW6*7Oea+hNevwYlQ@;C6|5R>>pP9R~xsElOs`(Rh75EJ+hP>)jW1%tp0SHn~T z@p0Ln^g^kl<^Yt(09LSKs0H2=rM!9LfwF6@9iu3GoH znvz@qT_T`6FE$P0*MlDk!vIe4!?TOkLuJjDIT$``d+)N=N2r9W!uv7Y{QqtlN!1)4 z3k4@vPzxy5LT;dPy5u_y4;@vqift4#qV<>zu80*=a41*k#sUXK+IK1OVdIYOKwWWG*HHKRxA+wgcUdLUYr;| zMu6<7Bu6YFe|{Bvo>AXjjn6yXU3VzM9Nb=xM#TjdlCjJ z2g@>alchGlon|-z+m?pX^nT-{4sZV2qxty=vtYD>j~NWC=EKmnT$s_YVg3o&aX@rF zSkLgaIU}*q5?+xlP5n?`X&*=6NO# zJ}x4{8-znyVO_O))K z(7o&OEs^$F^KfnW%gQcU0e~Q8U$OpVVvy1D-Q;4?QH$=rk!v?B+6jnwMgxGCb7U2) z2yO@f7W3`Wwf6gymjsG6dr;+OTkD8-AnJSOyp)S0eX)ZZ!y9}eMDk1~-XCL(gq6R) zRUqS-v7_mMiMpGa4&LvUE<~pF)!nAq=QXKR5(pwzrcY<+n%_#CIkv8)uWL4_FR-7t z42Jsi>Z?~?-0Cq@A*H7UtEgSQP7<}Ke+X&!yvX>$&4yfHvSQ8J3XB)DFD!y*Jb*!n zEI5WZsm+n&oL+<(BcZ_FW?1Rd!^h1#OeZH%jzMH=&z|r zyNFwl)9J)GZ}A)T#>(5oB;w4mQ#GlI*0IKzBvl?YzPWP(OcZ2Hrx(XBiZG%W&mWnn zfy|j=Z`;pb!yl~fPT(Y4W-#gNJ;=VxW^$+-_#hQM{RPwZ%;Y9M!bEla#Jh~o$TgER zYOVZfZ%EPKQGfL}?;qxElT^p^(!tI7y7VtE(#X= ze+VN>z(>VTdR?~l#d4P(0OcdxNIX0%^O}X8yuPA|cM$_|*35#{q)5Rc*a64xa-_0V z%?#?diwB`N0;2q#$(B%}Dzb-$JTd}BmQ9GU`A*3~KOXhySOT@qI8>cYb$MEV>2zk- z1f_b%8E;EV@T>d}iUezUuk$MRUW0aw%o_Vc*nL%g)0N2Mci(60MJnAOVZ8nw`dZJA z&E@f2qDfi;`ooJq1`ZUm3;rSS9faysyG6LIKAT?4uCH<>p>Zl$ILPdNvJNv$8i<=v zTfB-llKadUMP)5@A^d$qc(mR^4bAUX!_VNex>MN zA$+o(m3LuL#E`pb9l=C;H{>Lq1i?D}`~!C{J%`s+@`d$+^cW(vYTMko#%JQY6%V@> zWY^lYA9>hQ53+eDh)UOer#nYzQ0Oz3SAx5Z`-2zNDnNso{3o4`&5E2%fF7=VbZudk-p;i%SqF{aq_Pj zN>YUzv4Mw}zQk)?OK_1BtKX*NxdFUeOPcaOY(5o3LR*{Ck9kuYn*(UQGcP|uGSyy* z#>Xzvebx;QTyPiFozQrbGDBHRG}*>%n3xqZJhi8X3fiE)gou*q7@>{0jV%1EKe>~(Ew%qoMBa%t4RM+)l=Hxf0h z&AHF?PJAz5xA;iPRI%g?%f1pBnNOPBR!8q90`aGON*k5b)9TaFjYQEEmj~4d&}Zpy z-&)39PbY0a{DlrAfDD)zyvc_`@BsaovrwnnL`O9;&pX^m@i9?ra*b}^bO3u#XlAzC zl~(TuUy#JM5f1=dcj@i1Jj*0qpgz|2)<9ova(1`eV3(S(Qt7srJq9O{wmrrs9-V0S z-lA>q_6}j2hTWu@-@Bm`|JAt`g_jf$QNUPwIay5ESFRZP;d*&}P32n~)WAslFXVZ4 zw1co}PS+tKbNVz!RXiCIYB(X90Q$N?bxu3UGDB2(&m$`HWRWmj8 zA|oXQ)~ZWBdQtOfjU>db-@sVbp{@Rpfsw1FRkF`5j0dEz_*cpk@>ZU>!_Sz zS2WyYum`w9a=kwdV6F$*Ffk3A^7D8;j}qZ$o4$f{Q8tl6#5DHWl1#zB@B7~dM+4Vz zO?V|N#u!?gO?aj1&T%GTN)6+dBVC0tN*1;iG0IN)W<0O>CKh z9;JMWRTw#i4Xg)wC+3<*LM|u}=W{QadBuyZ#UTbCcf{$t`WwZIE1)Y#G_Bs1Tw~gA z)o|kFEzfxodXs9(nN&Q#UFGn&VHIPfIQG~MA}BES_LlNBBIm2aFVj?fn$r^M>iBzc znc<=lbk#2?sxLLl$l2%x-@;OF;SAx`YI?-swfOa(R)6tLFNWx>Z8e%ha1t_DWg&Wc zaB7C+M;jX-#!J;~*_QLQ#Z`SrPvgeVu3UBNmtYYtJFtEb8xn^3Onia#cGUr>ZXL-) z41Z__L+k-v??GerDBx%2kaWk;=8TZlAD>Dg>0FJ|3||!LAfC$UM$4&@%?NThj`Wp~ zL`^fHrzTK)+VDFHJ%3+evLR)4;p_R1NYk-(3%wAH{MfXK$1b=af(<|6_*;3R<=?o- z6x*r~u_r#HoAew?%G2Fs_^EMiZDvL$UDlTLPaDA6mK<9UeA5_1?95x#-b*et&6T@+ zv$;|v%b%6r$Ya>e#U>5AKk?f|e5U5anIJ+rN!THVdh`Z2@asLEzX)Rh<(Jj|i@%tC z;?bWsXPt}2G3pYif{GPc61DiV+I~4luJBLa;;iLeiemz{aSdJI0#`DPmC<|Q#b12q zkdPvb=1T^6N6=kL-iJRxS$%UT3&Zd6=OwVWwldsC)7&zDXGPOTF7$MP#v4dOH_oKz z-&lUWWdT>U64sas>^S@dlyvQs6W;(lZh>4tmx*XONZf4{O?SW$vS8@Nrd^<}Ib?h; zh=^Plo#P_}nDEI^Q%j{w*HsgIxPqwvuERd(c;;i(3SUh^qSPz_lg7N%KE%=X&$er( z4Y0bj%3TY?7vq;ci;skCGzr=23eg|M`b2s@PF@KDeLgrQObs? zEg!r=H4tp)77y_M`2nOnfdRa=0T|Wh=Hs<`Yh&3|A!jPHnwVXGGd z0{BE4w^ysa{|@o43HV9e9g^VrnGZHkyWd%tmAf?X)T^cz1awPXuegq&rV2k>j# zyWwImBRzqAvu*yhQ^ubt;_!@R3lj_o$r`4<2i`thmLYxll%Q!aT^FT-(x2ozUu?Is^FieuNMUm688LKtm9d@frd6I>8Bdcd~7=#TaiE zsIAoZ;xiLP33rCR7a~NmcpIGKH4qxKb5qeEHxT8gTpKtmaFcCb@T`o!!*J3-7O8(p zrJeWDe;+rn1@gD6OB5hgs2(dlQc(`t-b+CGWQak<&F*63x3ssvBh%S{H zNN#bbX?Vge?nHB|o&}l3&~@#T7})A) zQK=2y9*&-rt8yacW%%c3k!JbR{Z~*ci5&JP;>@VwpOj~M9oI6F9O>DM)U=iHpe2*$ zIVhJ{ECPn}G;9J6i84BuZ*zT5oanp52!=jRC=9KFH@tM>BE5Cw z@g7Ak8bQ1ji*Y@E!N$RsGGAI~w1$;`{X=-8U;&}IRF|uFki9e(+H?*f*TQVnB^eP3 zWvNclDKASpE01F_X)>WTbJwJz zW}i!T#B)X6Y_?#$2PofQY(BX>cyB9r^cs2L7EmB#)N1~4P2kVP-lz&DZd`eR&jW(GyyM0Lwg%x78RwziWD zjxbv}{SveB%Fk(0%ifjl`iwRkLFx=2zQx7Gisk&|^N@4M1gi+BQrp00f3j@hi~>;9 z4t3=VLZ$=zDVQRrmX~@Zi|64|=vi)m)KUwzq_(cv{uW_Qq015j5@K1B?JAe2JSt)# zM0OGAS1!G6YL)6c^oLR_8YhJwFfPnOD^4K<&Pz(wqx zJ*M|BPF{71&5veXw&k}(7t;}$kK^KE1=)ISU9{S*)nBFH481&n)pWu-G*}QRou6u! zczmvQyb_46U8@kzqt84<0P*jds+vI)!;oqg7H1-8rJ2vowQ4_lTPb9JatkD*CNKlw zB9U<8$4f|B$RQ@b|GAd4m`F@oq_lj=Lm0bU1TkVJYi0;XzeS;VO~@S^#|m!Exw9D!!<`#;br%pGioL}=Jes6b=hZ;HBYW;1PUUv29fl%G3 zu*e;|vof_7S!S;QE8I12Z1Cs4sw#j{a6cp|ciLh&`FRWj^TYQH&vI^=GTIMuW0|`d zRl|sK5EIYtTR03}Fv?|z-}ZsY>p6M@5dq6`9#@z!*X z_~6e;!G{A&f72KDZr0JmGWMi4 zCBf`z72^uuQ$Vydy@0#-o^-c%yFE4S?`=%kU~_&EbWCdnvnTX|MD~)infaBEwT^CS zi?RMr$*@P**I~qUn`X9v{I{cV%Knua#dq<(Oy^d>zdE#Skiu_LUg8R)a+#kQyIE$8 zk9#T8)->}A2!->(H#h$B!$};wb3606O$!u)JEcbuwH$5+;`9@9(<_mh(5;A0{-CXA zJdUqr@6s)287f-qemO?Yfpdrm>x7O73T9?*>uAq-gcyV~1fAz=6jCkPfx^4>9ZPTS z4CDjftZT@#^mM<$$Ua6Tiv;0_lw+yB*2?+CEY|;lh(7s zI+;g0_GeFCkwRp5%rN1uJa=YZjF)2k0#PR%3!*Uy?u{rK2X;5V%$0nLjK1iE4eK1o^uzaS>uetH z5Y79y%e*4QYh3m%R+_SPT1H3hWzer{0oa^rz|zW0{%7P>j^|=UaJ}>P*Z7iZzU&DZ z;pL4YYw;8#sb!s&bA|0-AVy)x@&BoL(th7hc$KBZCp#9&a+T#(A2?TT{!`#hV*T z`UmQu4=tKG&SRK)K-{Ta^ufWXIdBuv(msxy;e}4*QrUf1F=?8-5iQsE2t$>QF?MPC z{Yc9$XZ1JEYh~V;PH6=E`G&BQR>9ksZ2j5oH?aA{Tvn5KX7rA@K|6tUKu!qgBr z6O@FmXqQNY>~q^?D_f*D`!Lxz+IS?D+WnYne zr{ICx&+=;Rjd@m}3~ePMU51S|2ZRo6oH?RD9vf?aW6xlNiAw`k40lXs&@ zYmK)Py?2PW{ENyntI)OL?jSWr?qvfxj$iRPU!TP^(eOJNl{8~MDe{Nm(!rVop&D_@ zU$oKUHR!x{@hO{y>Ng zabnzc@8k7l;%7l#a~2nf7P{M2O-EWx64Gju96z_it)}v3Py$oW3U9*jw6E^Nrp;H( zcnMo*W=p>9Y2r=#UnUyZn z@S9#?Q`O6flA6ZGwteogcCzwG%anH4$D=qP__v@qVI1e5&j@8prAY; zdD&DxN$bPVSA{tmP}YemiK?lcP?fyjcrT73#WA0BJYy2!d8@go69E@OOBWelv#8u> zjf2j-JCd~n?aAyCd`IJ_ZSbu6tqdb2+?2IxMJMtAVAK%rRblnLEjAlQ>IPk)7+l`j zu2_Nu7~`#7exO?%3lXz=1n3)5H|^n{9e9~=>>)kzb5efK#U%Ahv5RDr;A9nnUsZ+% zY$_?<5%B(XHX<^K(`C9yn8jtssoeG@ATnzt^8B6NW`{*5erFRH^DF6m0m}(L3B7sT z2^mYd7&$EzT~uy-w!vOPtX|wVTWz&<AWGUtVT}bB_&QX+IHb?q1 zwydCXcVag3Trt{I9)s+8D4trv%C?4#X!=}IK}uMR8C~oZp-H?FX+CC)yl7|gA+BJ2 zg>B|Gb^MMQv{yl;9kcrn$_JUgDLGY8uL9@V0p?;unVdYaa2;lh$C_$CD!ZqwzUuWQ zg9*0}JZpiSeT(KW;EBK$mcD1fU`|DzRI3(-YOrV%5C9);DXu8l=X5haVA&}Z!8a?u ze9dv%CM%>Lps;Jb&3FMz=@Cz&Wa+q(zZBF=GvXTmo#2Kevy1UX{x1(u&~IgYdVq8V z2;+>v>1bW&S=d0VW{zkYaq8I(&t!Y?>b`e${DGP9eQdH=<>zO%JrT0c(pKLz`$|vz zKYIfS&>|!EAJO(1y&>9x>^2^ML8{iyvL0UVq8s&Y*ho%0GC@hYIU@v>?OV7JLWMe= zDldSoS)m7enZG)lTji*&f7@4?mG#xr)4uNy6{DYJRtXvE8&bt zXSmY*#oPc98BS7X3XXcFBTUfDulr>>1 zZRQe6Ad~rN;uhMDOjp6QtSt)%g&1?#e(WM?)m27KEkVAU!9DT;CQcX0n_6c&9Oe?P zfajPo%7EqS$BW=QX4HLhV->Lk*bTFw>6LOmk@lERWzNbvuVI5fD7N}Iv5wPGR*6+T zI|TnWo+T1!O^kKWqOGX*y^5kqKDS1zg2KkiS&s-X4J^y>_SQf?w__(ds@FmzKGx_vD)XtO@)nQ4&M0gZg`4xLG+;K+Pi`^~&hSlp*Y1Y? zZe@$Wnu$@AIh8>n(lp!TY(iwUEH-nx6H08aNKu-_pP>5>VH<^Eg@2}q`)B&GvKYAp zDVTf})z?`wlZ4wFmHG5cu?*QTp3#ubk3jbH$TyxMol&+6ri3h?MK<(!BMVUUK@S;) zYnW>em17(}vq zx#iSUbSh13aWId zT0w$@+M^*_r9y}iqa|Y1D(&;l=ll7d-=Dwxw)lK`Fp z-psjfYZM=Is9!hxTO8?B#h3RVoBgBIp&mx?G%Sst_lW6m!&KNR`NepO#^4Ra_4egK z%Ij$L6lS-n0>yyP5vims>?eQw%(WW_tx{&yxc<`ktG_Wx#cQE@*RAy;Q-acBoNq_N zUxCKl1Uf1%v~5%b{ejkCeyPLR`cf`j$^3*<%}w!e9u3|zwQ|dSaA}PSy*OZIF}x`l zNZPl%a7#_UnK$Cx4nTIP;>&6IP^xjyu{a`B9MuyyqCPvLda+hY^flK08s^!?Os>qK zrrI-y6Bd@1?KQ30WclyXHN8|d^}?}!yg|$(0iSkWo|@!u<9V0%r*Wu1{`J`o zr(^FsDmIMa+PPC0F?eKZ*aW*>+%xk5j6(hU50~!Pyx)zfQYQV)>2tCaY`|4$QaPU_ zNtpMDR%vo?>pr>LmpkNGfi{T@Jg?c%CAlS z<1)d~zcO?>C(u(9dMtUl?RA69zhNDTXq|UjuTqX?R8*~ixBXn=!qxlUS{0nQW-t-i zPyy~--Y$#vlA`(bxKLfOJICiGRsK?T$DeJS9=*5!ITHIfrlI0)FMv8|z1TH-{ z=slMP&2Z$|-MMu#A;tHQq4wwA*{F_T;+y@U>^ARfJv*rrdNnal8kl3{3@+QX!M81w z4U8-Y*14?d^$Z&Zvw2h>od%T01)Mqm{YjdIt}dHM=M<^$)t}z>MAo@buJmJsPY$` zd!%lcomiv6&6x``=B*=Fv+8bDQsWs9f3OY9;ULIL^*zPL!SXLlm0Vj0t8Qu)I-qsDu!)Z8b$;D2uxLeENxHrQxQJ-4Ug4i*>aa1-&)@-5ZU1| zT>hmzawL15A0z-3r*(~P-szq_rL7d$0k^un zSL@$(=Yp0NFp~eZy4!L6qOQG6lvy(0PYH`-nVoUYCw*0Yw#{BpHD`B!**hK~FFW{k z9{~?v9r{&`y!%Q}c;Hdazx_hgOtCR4VL@26MAKzUnqGt01+&p#d}+zE63Xvt2-@@nms`&sGP(f2?1H9s z1fH;$4%PmpoEg>2&(paU{z;(mYgp-h9%uFob029pvuG*a<&E8FnCdjP{CWYmqv1F= zaLGN8xj7?3P^~)Ly#mLX97rIh%1HPRX z_iTV2h=(;(5)aI?@A0j^__6VqK7~n}*U|f0;kBdhUe%qG3i*S!*cbr0-bl`l=oQ-QtoaeHJZL-p z?qY(u*X-?~JMEYl53vWK1+2v7pT!t!<{IkxhqGGNouc8hWxu0SIf|L!fg5JDZe@|NeX?X?S&oFk(|DMPpw04c?_(4nM(YO(N zXtV^!#>f8TI-YA^e@X@2+9N%_f=89^wH%w}KH_cXs0K zcs^C(v=pxx>)f^fQ)i<1wDzIC{MVsb{RtPbxN-0+^&cCi1mRcF*{92quD5Fi1c9zK z?A#W!Z(|eB=GcT`e~5j1@h_)>Os^l}&2KMnuI{4`&Yx4S*V3F{-b+u@Zhzv&ZmBTR zoSm%v;qkguolJnd2e}^j58Ke4petUVz`W_S59@1n#wXvx>I~rpXKyOqNozKycBu$n zJ*xZAvNPvg_gm>vSfMblrupqoBWpBk8o1L z;NP4H9);__TK$t6DCjQpzj#dO55tTagA^OG!YlAd934r|{{HeX+*5$PaHaP6#dYfI z4+kTBw6CY3Zrom}6&nH3J2&pJ8J-PUv)YQg_d4l<$qQ#{Z|6gkC-GvD-!3Wpo3sRF zp5sNNmy0wjI7(oVk$BBv8u%}fv9-AZEML&8Kg z9Cl_BY=*qMxCuc$J{(gfQ~s09S}Focc-I%9g?Ho)E123{3$yPu%CCDJf8`80m^;2B z7m=nhU*rB$Vj)AivY_Dkx-@XD8#b%3WHl%xc^9*oh?Y9uS_L< zf@VDRL{;=bgJnyM@D+g8^M{GD3Eo>tskJG>zD*RzO5D3q&%KKt=ZfDO~=;d@fCxe z&Yj6(*3nPVekH;4@N3c~j)Iv1cK3hy9&shU_;XHqtrZZe)rI*f#`qb4J!JrRcI&Cie z$F}>cF!CQlL)iH$gYe_P%7hOa26)?zZ>eBl3mQ-KN&|e6jm7-K2cE9{eUHyK~^@*iBXU^(TkXeC}qy6u`Rj2a6 zsa)lYCv{-I&mM5Gc(p`l{w9};F5C8%(toGugWuK?Z7Vp>Yh+0O*+BMLXFcN+%M$+q zQc%BD(EQFS@nVW5qVu^(0e5+46kbdBg?JQVt>PXv#B|rf!PSyK$wTCJG2~0@%P3n> znbVxBX(*jsDg$Hsp|s{1cka#MnYpuMMQ==Y++>nW>*{{&8`H#>{3F^ox&+vr>5}Qc zQ{;*%95n_~HL}6%q;03-C(MKTjee1~AQ{=GQET!lL1&Au=t}u`PTe>Ou1mlAsH5I24dFL_BHt**ESmrSL`*$ACN{^ylvX+FY^~*0;Ud~+5S=5O?>J9F9 z8GQpCxt*AAhbsQ{{or=PrO(wD|Lw?PPdg>qJ~h6grPj3bkA`wqZKM^(0N6U!*8cp3 z0QRVBxkto>+uCQcUcpO|`9=C`bef6igM@ES$y8B?J8r0*si0-H*FMn= zGJj=`o3oAq#%HcL_IaP_IGdPv>ZEq)=}waSk({E*;E@d|o84@D9#8!2awhXd9T)uW z`F9^M9=Z?Kg`cwzDhh3+R=WE4)DMKgXZ=*N;*jZy6S^*{$cfJp43WKgPJONaGb3esSxL@lzdKjNY$# zY_X#}4~1h*g~;QWGx^Mp?OYZlK)YYjtjHRJwyQlQ5m+&}a0WQ~jRO-K8!PLSxUe;$ z@=P*eO0C!(L1@;h_}9WrDU3Iw&o=(tL%V&IJ=HwBvzlu6{z6o-N3o~wO|XZY{~vFv zqS*gfQva_p_5XQO+1bQIS>{y5Tb?>W|7%HQeR^3GuWp==%BmTH&}1+xG<%{v1TIu! zJ-hKYXpWt@Q7yMUTTey#fK3&|2Y?4CKSz$h5sWZo00S$)c=`j-8@ayuBKK(W#t@w2 ztx@!*pnGs15iUjy?rE(D!$Ra+bTC}IkNx{w+ma3@7?md_U28c+9V(l0q)_- zHFHDUn5277flRUls;l}aP4x~)d4s@7IS5{Owgsg%M07$SQD{6jK^`?xypGcIU=0b5K&YcGi9i&1CfL1-4R0n`4 zNh%2Xm?j{ZTi_~dKplk9gf#J0h6gF{iSr<87;_s((~G35WDZ8$4V-nmfsxgr4M%WZ z)yG~|GPiJ4Q&1C8jLK6(J7kcS>`(HKbaw`pDqr7Hx48>f?dkHQd;RRJS#4E9!~SFo z?)BnvRHDDU`;d2zLHQ?*sKTSD3o3-M?D)SR^SY%Mzle6^?jt=x5e&bGve`U)>`8uw zY7qZ!#si~Dm#u;zIa67TAQrEgl7c)nOjkD=#Gvix=ywf+YepWu(2mnz{)4PojzvN= z>(!bxT7r9KwDQ~4Do*A6e7T+=tP&=9&~j`|<7DxWley+sj(}}cEJ-Vm;qK@|*)2QC zGHt`#Wih{m_W%pPs#MsvinhklgJp&8%g_Hd{K?wP>{@uTo4~vHFX3|!)N4$-kispw zQS%XxgJTXJD-Jq6@Sp8H&wbZ^iRG>RD|YhM+}21!BX10Vq^gl%X*k*gjZ;Krp&W0s zJW1Dyco{-KU_ftP!fD#C)ofyz?WqR49Sn zBI4ng6nnzuFEEV0=KOcK+S>gd&sX(=IT#=brYh5gD#*t6Kz|fWLtdLJud^JvRl=`6gaL<)o6o}0o4lwFu2*QYir0F^jZU&o^5e;x%u{zUXj|^ zzODHzEU08ugvVIQ_JzgFLNM2}prY`B0Ws2Bmm5Ipd~#wV{B#zBI8P7LAcc_d9o%m6 z0tKk>lurVV#b)T+Jol^oUSDWGkxtOoUvt}%=GJ|GbN>05C$Btt{?ITGD#0MsqgmP4&4(hve;B?qqu1%@2lc8BI7k^LTjVg zRnpXaGwvW4lmh7=H16m`JA0z38j^O3TJ$=BA8rcc8kKjsR^@IQNK_S0VdPA0&w4gx zF_P$$7H$y5fqL_=25t}^8!MB~?N(B?hob?l;e$aK5hp4XALjl#8ZM0*+&MOAxoMk4 zbhdUW*Jac}C#`xC36IV}C1l3d7s9NJG?VY$Mf{@V`Diti3~G%Bnx&p-D;Pq=9*#; zQL#v5|Gt9klb97UC2U8NX}x9IMw_g3KLnUy$%YBZ!Uovg0$aBZyDo?N9|LO5r#RtQ zvcuAjV1?3g3F7(a0sAI&+mIOjj1}eJ7R}@AwTl;E%1NLGlrnfv@(c(y^ zZ~6$804*ip;Ao-{ZrTBNAl&f7y@JGO(Q-Qy@SUj{QwiGvwt#&xMpxWG*KvQkTb(x7 z?&X5J%`y*CbqPj7Kz;G6mzFLj|CB)g3hlZV+?dgWT?*QjbqtuxMhx7mcegqA=W#7o zV@8)j$if@l$9>itg;cifqzfFxkEOhls_T5;iC5FAkZAIPe3zh({ZIZe^L+m>o{%#Z z3Wk}i3U<3j@(MCR*84SbF97rt)q|Jwq~J{Gm#qlqq%f(HHFtZpt6H@?rLzOP!9TmU z{5$_mZ2yX{iI6OH+)#|xmgmab;CXoAZN{F!CU?qvd!Gl~RLs3V17%;(SN&?v6ucWe`#^TCMtCl4BDWK^RMJ0^UbK+Xq1pn~D$+1%F-nG#jiMx^A+InETwjWtJy9tm z>4fSv{Eawfj9!MC!Hn|cH~sX7%BGGnu%X@!mdbEyO7KPrpGRXP#uEDY*L=&)7_DX= z(4jYcVh8}2x$H;PC6Rch?k;B~VV4>)Kg#?#e1{myy3^+Nr@i#JagQHf@c+(H4Oe|D zh$`a^OJy`n^T-&Nr|noOhrey=PKJ!@WWAgCX?j-_L{fSG9~)>5B=8>_9KF{=BFm{z z^)cIw{w*x79@zf_+CH4}Pt;_752?0+jB3SyVeo>- zJ$rae8hCgoaXQOy=WybJ+*fi%#~l3YQRVl!@QNma#sY1s<$Ait+2Mt|>1)XO?_#pL zlM8ezO|Ed@V`O*VBv03UYU4S7(+1ULDG6`jM-EOoN9R)<3Eg5g*PS^$$7A>8ArVw* z6W}Qa*M{HV)`#|0*JaUKMNb$;9tr+4>cQr9$h8e_8<{_=UVB&&96|c{djOw`yfDex z2rT30L`|Lgp}ayF5o!bf^l0$B{P4Pxaje~f;M@|S_7^!-%>Qu*Ke=g81yR^4-|hvv`cCP zmfU#uaeDZ*K77Ml`}Mu|1|?q^STl~$XI{X-Jw8&}1!NdnEYw`PdU`jtCyyE`iLXQi zGTKSV*^FaSWN{e8_n%iozYsvtzb4wAQhSVc+c?|QVANqruWpco0ws`0zpe7mLj z3%2&|@Fi^;7x9kHCii`7*y;*Bwx=3N3qI&#t z4MC6myWRf8;S?#9^h$%9UpApAf1^X$f_SnCHt28;DbG-E9`7rnjs3_zZ^Dr_pJMT} z{*DH?zzO3?;~hQ{r=SOc-(o9j%`D@3#6L5p)6%OU z#CTGzp|Zm~ZcW(}>pONto!L5L=PxrU;>y+hajHl1KHA6+hcJ*P1v01hJJ+K~&EFZ_ zw%f7bKudjogh4Mq!VP*#G~>#`(w1B=%A7b z{r`A3$gi4h^J&dqV{i|Rg=IhE@^!Pdk?*N~b3Yt5Sl0dT_a6;e7Q(GP{s@~6;i7{C z02b)w?G-^5-qbAfEpusYY*i|7>Vl5%sfgm`EtK?J6sm`fA`7eF-BtgAxA`Fjn7j3GVZ&xLm&@L)SK{$xh|+qt4K1s`6ZAI#gB~%Gnd7!P}<?}GL-R-_v6cK zsmT4Kan=0v0K0)IS8q{(X3=G6xhN+e@J;%O!5pq+`x$SFbF5rLioDLX>Fdpuz-1&j zs+mcxHyu!@o=a9>=yy?lF=%&4sA19qJVdILUFy`u^?Z25@|QYSRsj;E^T>SAW+LN8 z-UC^Nwr9eh{68t$9MAqXu8C6RQ_U8qWRX3JIhP0)Kl45Dd2!FwwZk^DHeK67qusZM zBA|%5{$)H-HPW)?AbwXnY|voZc1O0IsyEAoQXgdQN=XK6axIcJ zma8xB1?*Pq?mv*u_CDiym!Sj~l9^JnP9#hhfC%WGXn3|j|8ZAD=@Q-Wz1G9~n!EtFEBfLH;VXrk z#8xd)(#VC22S*PUe7*afvUgnD;=MS(HE9Z){Zp?6rewp)C%LaYHap}~@!u`LBsyws zp7kvA9wd$uh3&s8{fxqg*6<(dND8K^8!vcsTj`@HaqL3bXT1}=&J0|UqX)%z$e+^S zTH}g^bOpMabWPJ3Su&SR3W&m1H2HTj>Eqghq={l4dD|bo2P$-q1h+M!WasRQZg1oJ z)`!w$vYx4hXlqVrcxOt;tNidM31N;3H_)iQ(xoS%ht7S>A8%+=_AoRR_9+|Kn7ow@ zVb5CJ?tI=}7>e)SD&JNl1}#^^_)+O?c&r1kNR?3I)tUg@OkhRu^eA1z+CFEep1s1d zcS9cCvyj=}*#MTBS?$gHQik!{MET(M>wXgCJ+TOEWXGtsK=@n6*tiO~OD!g+u>6b8 zPojaH*Qjl{d__Y%lLVYM5X_6xG<9L=_I6}=cSh61zH%*12{u)~Y#JVPiRkqjg6jGwUr+z_FdmqD1@il{AAxpndRi*c87?|H z2o2Tt9E3J@nW2x{jookGm=AoV@gBc#s>gIg-s-Xm;Q$?}_p}=9R?Sj~Y)5x-uV^xA zMY>GcyIuZ3=4L6w8xmOPp6EWPxUoOzf6sP_3`o$t3m4%~pEB6q)Zl7Wf%Bo}gU?tH zrMKp-VZ_H{##W(EURLX8q(nqKry)e4CJS>VV1Bv5I5{iw(x8F862^JQjXJR*g}!QL z(bEqS!jguPt)*!ajK&nAs?kXGxqODxw#QEJ+SpoG&TQrL;t86G11iq@t_~FRO-WNz z4H#9bBr#r_GYc_4^vx(S3Y?zCxkKQ9yp4uA9{G1;dlzc*k%Yxly`1!fuA2H7Xf6<< zcV~f9{j8pgDvb@uS1dsE2B?Ii>j%drmALJ_wPj;{@oy%wf%=;Cj|+}rU|$9%5E5t; z{;|NG5dn{hoq)h#F4!M4mhjsn7SZRS@BXeG;YH^DXb)?*c~p$YN`m`SgMPm{ zEDL)@QYXPxV7P|-ajhzz4K2u)TC-r_vK4xH3E&AO20{e;n41!6YWuUqCTi08 z+p^9@5Qt~v_=WH%v8+YYov4J)fuNl2xz97zd^Tn?G;696x9poA-vK$-Ov9F$?hINm z$(WcnKA;LPb8+Y9Q0xi{4bsgKPzS=kj`*kR*oy-xIdMkfg}3nh_pjDNcU_PTUR>z{ zM!Z)p$4d95bNWoE>g6%Oa(3Ojn>+yM0HA{AyEP|Hgn~@1JV!Rgio3P_0+blHj|-J< zm)htK{Tyi8$?nAL*FIU0gJP+kIF~0_!<3Te!#W$^l+XK!!cVEn8cTvPNtgm`KlqQT zScYk$M&31NFww8G^z{f9v<}iN1~|QHOgf29CkqQ`RC^OZR3w=ePS#Cfr{QIw#GwoFueo8At| zhy-k>+tb7c*QUHkAit>`>KrEyitt5WMbozIbqCOM$Nfo+vK`8*ADMeLtL`Ar6NZ}` ze1fAwU<K5I_>d!YbFg&V<$SrAkNY-67knYwUthK%kp*b^cM z;;ZJv%^-oS+el=@?@(9S4UeUW3JGN(AFL4{wg;1rM9OcK*oe?qIc70$Fg!9Eauu!; z>T_L(>Xc$_j1*09IarRavdz-OXyWD$b#-6|UEbKyddpoM($UO0lVb0_v z+ON75vDvqWBgXNe#0`Q?wWK&)Kr-hyYj|i8nnJs67;ziOJ>oM_S|SO&wRQ*Ag*^(p zE~B7mwq+*eCoAVRBKb6iWK0K*c42X>eaLM*-#9Vw#a*NGK>PY0$<-arO#<68$FjrR zv1{V{LrIC`&mLNTe^fB~z7Q}ME_`b}c$ml#yX|9D#Y$d`&Zr9|Cko1Gd+{iDXKH#}Y1Hx7#KF@*CZgF}JZ znHkBQq;hQwGrZ5NMbx!P_RoSVN4<1F2YpFz8IR9hRRDoVb;ptu)rtKfiBx=A_+WTo z#Z9@gh>GdVyOi#Wkn+4(&j%U|U|rmoYpdCxqn1}R9twJaY^c&&`r10{X2seb#FX$w zZqz&o09%V$C9X0~wc9jUa^Kf)}XgiazUuy zkR}yYx>z0a@NPcQ&1I`U^ilc)t?lpyJnpHyq2?cjkMz+grlK!y3g;gs0UZS31+hOe zo;S4xwg3yU0_I(_6JZi_Xu(+B@fc`EtyjYFar zPGmQ5AsZOZy|DJ6{hQGz3R@2bKGl;pW@2!p!|=nIKY##PS(K>|ZpVoApI%)i8J=VB zyPOLx>i>^z3)R2<=>+Ug*ArlYcSS?}*EZ#c{CRu^qJ01VNeUg$|3^}s`X7?wbPP)3 zH%NU9HNSR{kxkxRCYFxM;ACZw4=GIY-SrgYpz4}2-7v1b@p;x8`e5nd4oEo6h_Zms z__MKO0zV8VZp!_=Y1~dnQmL8?t1&WjB6s)T>W;Xnp=d0L!~#iIYlV3*Czp2=rcm&C zBj%Ap0%3F2Tk9jedbFSR8MuH*Apo&t#vdZr_@3agZ}z<3l(+X#zTj2g+%9S|!UOCh z?z=HtCEbhgEu#SEzq+7<+NTGIDBpqrBl}Ga;MRRA(u9B=)DzHS3dks8ZDl}%S|TzxvR8*n9%;R@1dy_wS{$xGiu|dxSBM$-YM7RazMhMcjwqhtJF{?ZPNw9C6 z8bhJpynj1)XScQoc`(BX7{l*tw|wn#)z(iIhUL8OX#P_f9lL)oL+zdPU*UJ#yNR2b zbU2d4N&*tD*vF9`Jvzshm$d&|Ox|z^dGAZvwLidX>b}z|-#2@g(+RTad>Y#DkWOYV zS~55k=^Wk~gZkooJvrw{A4!!E9~E>*_YZ*Psu;^mfq44tL5X%ihcs+A55?tj zUYW8_-fjV+T`Pz^t>^77p?jmO1V_86r#h}Chqmn@h{y^UC?dlB0fr%JPL>cx4h#b@ ze>X!YxFv{Y$a$3))P8KtNP{#d?kA-S6{}v=+FThwPr_$3#>oE#AZ_WdbHjtnZuhHS zV#rFmLv&~J`FW@p!z-#UCVZ8RXm@A6GjH{P?hC(b7aeoFtR!V{B%yi*6vA0nN13EDtobfDc6t4Xw$uM~pTy%xrKa zI>LGD0`G7RmbuwJ>3l_VK~h=lGdc_2Lip-QgeS`DfZxZRs7`)0r1E~gpC-?2OpjYG zj0~ET@p)?CZtUe{+`bvncKv|U(o|6OWq+Fnz=z!orBGi#)qcZ-l5CRdS_CUr$-t5{ zLozh#cNWxA918C1`t108qkr|B@7?73eYKxJl_C1L&X$~os8ysJh6C8Bx@NCk z6v@hjCso&ff6CAfGnUNvjWETSTQ)_HEbcrvZYR<=5B0gNsaiWs`*EcCrr3<0YZEli z?*~!P#@;|&D@0RKGMv|1#TB)oVqn*`=ul*wueCV(mc#Cki{cI7W?X2`r0TY*{X0%- z*Q$sNoZf;wXx9kVYeyJoEm1bQFV%-RG!^N&EwR!9<>+;MtxA<%8$b+V$QUc>0Pxwn zAk`9OvnTAS(fZH}+TrFsNC;Eu72N(*LI)D*|FJ2~?|=^y2up`q^J~hs6Dg{Vnm{Q( zAk`!`A$Fv4cuSO1SkcAKM{mg5CvQVtUoErB^BcQP+(zz1u^-rXcgykp6U&dSvc9;j zaDRo%GE%oTQKOi@i^|vX!|?YrzoH9Rbc2y9%~xiVy*%>T(t)gJM5uBMfY(kBZbUS= z_J0einL9u=}%D$fk%>aGsehsvam^c3IUFJiIC*#BdZ@O2~%LejvhI zes*$hwpj~~$xIach+Y*KLX%k$Pj+22W7$h31aI4Gm5Dc^8-R201<%P-{xbbbxDYUp z_G3Bf<@nG9E8`)-0*p^kzLvbTdmZZgu74bJJDkCx-Jqnc_m$d$l@UHHG$~u?mElUb zG#tuM@tbwC3N;~k+OE&2n7Ng!2&gs!Q$wV0G9oo>i?mnFB^&!4gArh2cvpn>f>w6+ z@W2r&#R=e65$Sh}r^G5RgQUPz; zL7VsiZ@BQQZ2$N{#RQ0-1g{pF^Pp+ZlOa^!TXMsjC;aj6#)TJ=an}?`yhq+|BlEWO zedb49A9-4ucN#>l=qw_Mej17M`^Y2l-YwNulTB%iV|Xfd1UslK@QI+cN~jDa+U;pa ze;kKjDmkT0(hv*9sz8l}!8yLl70Nud(Js%K~tTo_tD}|kvNtJNz3%K44y!xgX*H_K! zXsjXxlYa1UZ8m>wH+LByyxqgHN))LJ11f*Q7x(~O5ePSh`4}qPCw1RHJ+WVuDU0F+ zi!y~bE8j3>%R z^GV2@M+%Gd!^XvF1%Z07vAu{aNl6=y8NO104PrBod}#7fP(>{_i71`#5wEvVxs9*d z-!yoHuL{ku%-R~xW9dr=k_(A`OwbWGSke-Oq(;xvL>>kexF~o>Q(j#Y_4VUP@Y^t+ zcEsDd*Ope?3;I^A2P@J*(f@9bZ4d=l!-|ZJA(#N{)p1lWbBMFZv}zs`{bKC?mccI~ zl0;Ie`#Q0a-$^x}tmAg^w2XhI80-*K1k@VFM$_+D0#N!@9oG2}vK@*b*Zebw(f$*A zrty7a_2wzHIsxa1N0l1Kwz;qq#32z$78wmEwnLx>QDp%t=*^D(vHd}w{(AS&|dKZ_qj=Dx@f$M z8%4ECKxrOrvm;i|^!B&!ce4RtFtw16IZIM`8$wa>g5t7yiati+Zo|oD*4t-#c-^8p zoZ!L`a8ORH1c&-)^-cO+vr*ih@FM3^M{weHL7G6{%HGJ${tZrjk;|a2dB%a9O#zyG zykjn+v(=(JMGsr5Y6!!6V_E#&Mta7p^#ojg>LoGGHx+?)v!!}6Jx}~uTcWrR-@1%j zuHU9705quyWLJ8G_*|FSFnN*E4tLjm?y<^Nz zW4pKpO2I#^lSLP_B8{1AB&?7n^LofR_cY&>vWunOag@DK-`N7^J>XVw)Z$)GA3b7N zo6bP_Ydh@#B*vR5$OL%^+G>?Uv!+3W2kmg*QYJz1(ZiS1%{+s>9j~4{ohGOsbh(Op zPV96J%{{!hC^fz>adpv`)J z(QFhPkun}B!NO@$VITgTc*fwAv?8OeVsXJjUXtn(+Dg8gDp?CSw-i?g@4f|p`rsPP z;6FA@eotoy@oJ)Cu;SE6S%5jcnqi;(gVkklA*97NG4XREDjHmFcJtPdqAl!evc&5> ziJ6NZoL}IlqU`tj5qm@08X3Wk=1;?n2E$X3mR0j^HednVw&q7WQzSn9!phK>lJMwn zD!(nGmz5&)ww7b;ymjXiIA{5orxyWw&Sip|?~`#>Zykywfb{Rc#hJ^h!6BG}@Q)@C ze-ce;;%nj$LO-98KMy}pu0xQgiXeU?N5KzGUY-Klfu3a8EoB5eK2TJTRB!*hrPcdL zX6DDj!*FSWMlBCtoWJefNrNWtZ-G+s?J=3bgD9K}MY!hUaCNrwUguh0{mET|sYjO8F zd3>^+8_nw&h%EgSOBG?4#T@r%`$m{7{vEUX>t;2I{rm#$7;HOj(r9)~j$&+QB#?1m zT+6MC_h!a_Y{(96a}JO+eUyf59=IYfIJM3^=N^>li5qzkw|w9}Ube3N85T8?dK zXDB5Y)~Mn6etAm`(_jyH?Lqo}1ZiF71U`g(}8N_c` zR>T}~gc?Y_RUfX;WV)bR$ojR>c+f!m0Na&VJpN>!K6=kO?%8`Y~{|I_Gyod zc*XJ_Z|__Fx0z;cDwTJm9!C|QdI`fe#(%1O+<*1-J5pt}?>MTX$G$7VVRw~BL-Qd1 zNVw&%W9!aY8@a*h`!40>ecTj9G>EsiAk(d7WYw3|iw@Kxzj2unJ=K|$Q9nP%4d2R5 zEa{AYDfQ3NuFug^;%e>FDSsY$Pv=O2>=L`bM}mj7WPUY)0)%>CsUC(~i51HP-5!7a zYkO?*t_x@cX%L13ymj^zSNZ79@Drx_$Kp2S29{Q}L7?4k#vNlEBs?*l001a@>R>FI zAA`>l&>GG|>!xb$l5P!&@9%CjD`*MbZw_?LWL;?iJ+PFx27AS|7#@zs&Jf(RWq;BP zRYomrc(P_irN307xmZUMXj&iJhKoy46|jO##_a+wW`G89`-pplz za`ZfSICQ3xO^V@2XbNUQS#|7}IK`8HqAF~;8!wRXAtHT4(|3fcSKB$WP}EK{qY-;6 zq3T-I{3YMscRW5jVvuIts+#+1*F`5wNy;8%iTydaQbJ{bf2sA0cV;ru`8Y+FI2=60 zJy%E7Q@-z}BTsdds_cyrStBYBn||k)KLo^PUs1jv-))yR{0EiAqq*!H1q9`^;@lh5EzaMtN*_* z)*I|H5r$hbqxMr-2;6~@*yY3%y`ij?%jbAxgo8G)Hm;^}Ei)>FA=syl%?ml3W)Rtk z2%YWRffFJ=vx6$Pg>ZO)^!_!#5{e?Wo|+HHj1NRbbivT!{vte4o2t1$!;GFoxr2BY zd`diRE0=Zaf`&=1GR#6Y$hF}}-DPtN-#DW-=-rAhUA%!cjKz(tg2)e)VI+59VZE5; zjePkB$Yb5mMv3DXvJ0IB?{RF+sU(CHt;uB$VPcky4k;U1Io8yW*aPTOJ#~b*?=lf; z(!bq4B_TY7;kFZ`iu}wriuu}MsViUGx)J84Ly{C~?$HEiPGs1HPvqS+$znikxT>9f zLIbBv23V#KXhZ%nCktJ|_)TF_Wc&e|KYL~|tG^AdMrQ}Dg@94_>PoN}I}Hi&ntDyO@>cQ<3}OnkphpJSlaMmYsf8?LdUMB7Z7tfZ4zXrN{wztd z7g*KGDY-3*SL(e={M^ARi$4?=R-=>}j1xJz7EShLOAEth+OdkI6|EhR*#^!%xd8zA zso{=|k&h93xat&6Cc#W;-z@8fz4RnUh;LTc5M2Z!N0)M64Qc32(Z0!{QQd;ugn5VQ z2ac3jiiAzgxbGbCL_g0B_YRMHOqDG!-#-$swhPj&T(es*UCJU0yW@9f5rmo>$U00U4` zh>EonMn*(!#v`R`ytyoHJwRyDZM)!sA4zawl4D$5fTilvGo6>4JN7hqs%N|ai@3}a zlW_t+vzFfl539RL_hoTH`3){ zRswb=o@G^JA-R*u#!FejEGYS`D9e8Mzt{hW-v6hHiS2*7nEtnliPgj;y0EpasPq3- zF^Qg;59BouyxsS);!$g2(7&4RK!yM4EDHFZS@E?`y#yr&-1_i&cU%?`q;**3UVLJm zBF;Fm>_S{c^KTuaX>V}E*YRaK^?PU7VUcU0soyeh&FBc=og5#*6?E~!8dh3!sA7My zhu-dLxVxrzu$6Q*iQP4=<_+rMjm>|pchWC+v&o-EF zms;O0eMsgvm8j0zKsx5JjM{zwkB6}dsrMU;kht^e@D?ZMnOAIkg>DOJB}YZm29IA) zwL7Z)(qlYT|K4=9UeLSL>-w#lYq#p0dK_m2T2{x|=uo|9D?%%2cO;8)o>n-@b`e(= z|BVqRZ};{|a4x{+bY3|$AFzEBZLo8*JX@;*GD<@S^4nvV$6k}-YtWBA>V~|>o@sHB zdRgSJ_1O7YxPZ1$fEe~8JoQ3_6JA^Aom5fl;|bN~wWH$5HMa`6hI_-+H_6_y%S_G{ zrznfvLgmZ~n{jAG+8g;-wJ)45j0130@uSSUyTfM}A3a?FlRe`CDGz7BLAyGO)x$$W ztT2_*h-dUqPEz5Sef4CMB91iynqr)vgp?#{6rmR=eB1uBmAUQ159F12?5>o5q4%Wu zLZgvgUeJniM7Sn&W_acG+qL^^9Ui~#jI8;Fp3cxfU*HT_SzCC?NUK;FQCytukW3xCU|)8Ypg{h)7!5173o@# z-UIfuf3-B{Pb`IXgE|m}&fCmjaV#A9KF(Ar+VnFaB3@ReIPdpU=~scU^`iWYaM=r~ z=;T)h7%xz=e?ae>H>EHSVYq2t%8d@?CVDTIQ;?_$?2;_7s=3Nh_{8Gvm&0lPiAcWu zjaMmshpDHs}_EC^a<2UzjbWoo*o;dex@ciY}B}0WdHcg%?9viuF(!Gv-j> zV4egLr6e#zJRfic*0qiF@{ zDqCN1DXEtsM{&nQY;<3VU>Y+P38NTW-3mx(`5N!$UzzF|F#N*oV*5#E-MvL{uH#JH zQWf_Si-a<2pvK@=h!={2(+x^=#26{E4HX8@AK?ZR6~w4ncEERc)Dr6Jf;(+8b4vX# z3Ca9Am(yC6ySO&nitY}RJV9xXJ;Lbb`<-GVjD!SvSg08B1Id^(RbJtitIQI%t-*Jl z%-b>>Ck4U)OpnYPbMrE4@2Dw4BiJI)tCno4o|nWI#d(eeHF3F@T+04gqqXq>(HMa8 zeayIHz}552xHVGUoYbIZnBi3vmSQU_1^M+8j8@dl8usPJ80BBRV!T~xalUSNPXC|)DK ziBM5}{{V)3L{6{FM}JVMS!f)?Ky+~)an-Y!P!srNS z>CA8tWk==$Hd~W1rzdj9B6lmp^%^qjGQhTR#I`ia{X{D7FyQ)g2Kehfpj1s(6tFmO zM75>2dHbk7+6?|-Sp%M<@DUWqU2?>tii5ncl#!q=Y_R*8-FvxOTD=iBTJsz>T1JMLQ~u+&VjunoEh6hastAKcaBFuIAq7X+udw)=wdn5??G#lWjo#Pv1I zGRhwi1*hr@6#F}uLWhx1L;nCP^QxSeMbdoF++dx*$@0_`iNQDj04N@(086w`tTu~4 zF)3>YPe9Thb(`h*b8t_02Gin&uMB6zHR`Qr~>nd6k{ohfu_%>(Oa_qp~;ak0-Zay3&DLsyd5lPN*y-| zBsd`cBB8d>d(LCU8-HD>hm-RAzd{mafMEKGd5Bc>L+J)9+uJs|IBfZf6TqOqP_wi& zz_FzFL|st_kpVXzZi?-i2IcO3WSKqhP*K!m`dI4?iCk?Q)4!nBA1<#%ho_2%b(03#d%-KbB2ifOhm06fl})qCAeJVS7e}D z^Bvn!LJcfTEWR$em7SUDEH{XOyNQ=I?gBR75_dV&1_s{$0L5}du!BSWLx78`*Xk*G z2jU`gcFZVKPzO7Oj%9g@gUqb=%m`aluLmqNMJJ?FP37t`r7A@ccYIty$kZIjKbdy$ zU<&^L5kyZz1;nS?G{8S*vV@*N`NgF6ydS8;XvkLmp!Y=p4;qOwa)AhWK4;=qF3c@^ zQJI-C@ryiijS=$YyX}GG#+DWXm%^1xR-CK2QjoFZsD-$eqg3OYQ>YvD_vYt#;6F=*1A%&Tm>2ha5rw@a|#cnAgHim+C_ zL=yQWih1hcWu$z>9EZ!yIs&5vvVppxK4H9!M;>u0P&!lM-2P?K*G@m%`-N(|E%&5u zJ)+U{%59;|`;7Y@QSuXzfgm3YRJ3r9yi03Aq3QK;h!?-%C5&Lgj{FrF6r9?C5CzG} zca-Wij1Er(QibH=S!R8+AlM&Kc(Wz)K%norkuz5t?xkQBBJ$M0c9>r$5L*S4V?;q- zp^)_|%pPtPYZc)V*bCvq>zQL!uf)$nj5KzcDL)FctO@)6@g|)QcwfAw^HnWHM zV(Mq;C3Lg8q`Fmb$$+i$=39j1(Jm^^Tm3*@wh!|b#CG(Jd&T?sm)8lvsHbWbBzEsdJ}!phuD z+rg($qepbZ1WnS~GSE{|D_*!#kET2b@D1?-2KG(-q}-NT0Q}4myA_`%BV3)9pSb0| zwLpGjZS6msarv&y4{3UjG*yMepEH;_I>mnY~^J`lb*cq+-Z%7ORn9YrVW!`VikuZw+AkF8F^(_kzbIMC(wD5 zci|x}!9>qCk1TLXh@sOLZ&ORMoIJo~gu1HxA{KWN8n;tQah=TrdC?PvPnf1b_=#gX zy7L8gHbS3?LbTE?;yB1WBw#E2-|hqyyluzk5|v+q@@^7ibGb$}FyLx(<6W_CZ|IiOiL|D3d(CP-vE2KL z&EFLV6It#ThY#@@`Sgi&Kz&gvg+|fQ%muYuK{DVi3x^O(&DIP(BGL^s;;%>K}^$J*NRnyHKt}Of-F3*72Mg0%sk|HfdtLmD|7I(A))<} zo?&aBnR@gPr$nY_{0LOmwT@$lRn%33U80p-2|;h$_?cizu9c_NMYCC}Z}$(xaOhn& zVQLupHn0@RYY#K@}SflQxrsvA`njSCJm^D!yA zh*m|vh8EX~#lYm(nQfW_nvO=T-XN5|BfUjlh&TTLvu__HGk6a*ENH5(VqIpE4Z86z ze*k^X6rk!HIlS&W{{UtPsM6(+h=i+Oi!#b;FvZEj&}pI#cVYX63*(hm=6^mw4 zXzn$d*{H3s_Dl4(ssmR3c$lu;@ytZ3Y$X8T>QDyp5%c^Y^5fK`Rs#i>7Tt%kWP4#% z-^jzeWCn|}8(eK=J-8%zwUTnk(gMW!|A>^!0er{he$=_S!v&1b` z1d8OwDDGWTQxp~np|N;|)bO{^c!)U%YE^h*rTO1;2MJNPkrNhtD{zr{Zi!$Re8;zQ zLg4o@ zxv?s%u4Pf;yu<+65|LYq7{+^#s(*2+Z6TBAFiq20jw5}{wT(c_6;kjjs(g782jT#u zdqY*)Kdu*YW_}_GG}rUYA}*_j!%>5>iGP->`V4e{M4+CCTZ9fcnZQBrqE2nEa8j{| z$Adk}G0Y{Ymb#g2s@n?rN4u-MyFX9|at6JLq=*{uOR@?*A_e7SGS%-xM(+&tp3wp~+`RMEIn z!W>DC9~u5LBNbf07*=%vU1i-Sp=B*vOWy)ewH#x_wyuI*tbDWg36$h^(Ff4};OB~2 zTf(>&MwgzdvV^j#^(m=aG*|kn{mjBLn~=r|(bObsYahc75*6gkysBz7v4gBl=6ARi zlNA=lvYQrV}3DBLLrnJrU@I%*q#FTn0 z(ZTL3fUCw63s~zH64@!)m?$@oGZwRa$`QV3j5Sv8xlaw7ng^1m5_9?xxM`WYU|#Fg za#oWGZcS88x$`X(XlyrO$tuD{8@x6H#-(LZA|p0%ZTvxSCsa3Awa=Cs+7GS2MP0*i zw*vG30JKF)do}kN>B9ZS34{5GdDbE+!_yi8DAO=xpkS{I7&f}q!AI8eWQanGuj*2A z!};93y0ZO65XIiUVzhn_IhPjkSIoewy~O2C9Yil1XJc#xM^_UEcPR~SUP>*Emfg*a z)Iy<43;zId6=G2+e&>5I)A@gJZ=A(@ig}b0??<9h2BvTaZ(3d*=|~u?Yr{UpdznZ<9w~h zwqfw2T71kCLXsiVOPLJ3sK*XiI_u_a%{R<$Ew_jq-|99SE;+Y;Nz#+|MRRT2987@G zmcFm_MJ^aWF|lyZ1iq@HO2%S4;x$&THUjRtnVeN^*STY3EI+Wm;}WnIb7tcT6U4R* z&yWM$Z>83u8NVJ=m98U+!|JzX9k&cxC@D>wjUsm}A$)3EZ5n`QO~S8(i06okJZzPQ z*_$#Bc!y%J2o5&u_c0t>pNXMom&^)0WgYVKe8EcYJ1TJ%HWs3RSzIx(L8FS5c2okJ z%}2JQ79TMcDgyg_%@2lO9Nc@Z;bh`0&)3YlSc}C^<`KxLY$OW#dSj(oukJ0uVBLC& zOZ!U83Ejno07~j^xQ6fVF}8H-EmirH8g++q;D!aM;np`iSb08T&GO zo7B}uj88H@!GY77=jJ4&R|_8z!$`^Qu^AgVw-IrO&{?<>I%VCD6GQJhgA;3=ph4YB z!W?a27e4FEO2K_(#jeyhn-Sz^3Fp+Ih1@LXufk-tt-IUX=3F}^)YWkS+RBB7@mjc9 ztjtuOGRR`aDcRB^BO^Y>WqBz-bgI<@mxxyBT%Mx|rGF7tJBlcbbpf|yfRD;OT)S}V z8i;qDM+ES)QqCeQ_Z3<(rYQu)Vy;-FcP@pI6}GMqh(MOVx@KJ4=Mv!Px9(WxD9h$r zoRw?L8qa;pp`#jzrxoTOA(bHVhM*_+J1^W;$gCGyA#)XQRxVeh;<%gX=4Mv${L8no z74oC`mD5Z5A*UUG2314dBhi1XIR^*t7_2l{)Y>13Vit}i+HUOnm@PKf4xj|f&iWAR z;l)0~v$9YbfWPLlLj6pO+C0XQ{9qR~#JTc%gU07>T}{g+wcj|2*u-wCqM=ot&B`!! z6}?jqRe9nRE$1YnsUNZ{&O>tGp`?Bxr$a7%N=i?eLBdj{eZ~!Z$}NZ7TT9O75XKG6 z4J*VLG5CbMUL`{QC5YW-q9oRcIkDV&6=|Fi{{RiluQDN>@E?{Vg&J*`XbEU{E^F;(#9 zRBdy<8HDU(^QInVOHeSy-lCIF*_vFfHge39K>r!2~vQ z_yRF5a8Ktj<5ptXFfr_u2>4hTeGLr$Wgy!$fz&a0e0KSkZq&&5fTZLhK9EMse`VY& zqASF>)_NG}qMnjpOp(^=KUElRz=e3s2zdFI$wvyP77s1p_rQDmg*a79Ert>f1~+#b zxXrjamMg1MVE9qt-9?ZAT7>+ZK1OkEyvw6)OD)a$iBMmLD&0Sa71&t*$SBix&%|xB z8ow}PTq3DuEoJ<}VYZ@MtgWS+Ru`D9Tf_@ty-gv{a*Qu5Q;Ow|zY`bcQO@F^D^qJ5 z^#SI}Vzf$F`frrFJb&MzsQvJneSuboQw>vu_X05wT%K>N9s7YbF zD>>9G;z|jT@;byJ47ou-8QFQ2yU3B3|sPNxFj<|$n#R*<+2g8RVO7Hm^5{0ZWIJKMU}4(qnZx?09v{O zxH^|XlD(smnwGJvu&Yhs#7Pfs6KtlNje=Em3i3YS-U}kE$6vslvlaCiY>=?LI`YBI zLclS~@ez`)SK0W*_J%%&V!g*KP;g+1Kj{gMAmBRuZeAYdiR*|C3(@?MS?UgaVS>lt zMX(UY&cBEW9x0TtybDr%#9k`dw~Z+Lh-#DQeKi44n5bV~Pt2-O_k9n3A=yPqX{=JVJ^aYsO;>oERMDCsu!z8+I=&YkupFBI}#ZA?Q9K zGI@wH&61Hfm7Yr9FwwWf!(=MnB9FM3aKYiPBre&w*VZ{A+nIERlX;tI#rTv3eEh^*q2`PQmsl$A#5+qBtEhKC6|BIku*x2WliXo|s9X2^(>S#Dl^sA9 zd8^d2IF`ma#Hq$*&N0NeRw6oEyiI#R4g5l44Ys`e{7dp(N$-Da`HY3K&~azvWtUI+ z>Q?3*1*tMUzfe66KQVQUW%CWx;LGz2t~D{dtZpR5SUF{=SxjD^a5-2yo|gvJ z;-KpdJBe$E->6|`MQST97L=)ooPRKQO9*MV5!nrJd`3J;{AJj$^vnUr(jxb$c$Zh% zu!t*n8hIY+`I?5feD?#0sN05~&fcygn^Y+tk_h_T4dmP*bzmJ=P~CctQ$u8R*Exrg zxvp`DH$l3n=fFa4ved9Vq+EgHAWxI0+Yv^NSpNXQ&`W6UU*f~&BM)_h)!_ZXu4Gm_ z0FDzl0(?fQq;2tK{v|^BjQ7I_rlZ)Hs{Lj@ZOK8N{CwX|G59{w1?CYkZkmzCz(dg2+*@DC{e08W^$DB$IC@zVic z(olz7L&E(_+XoI}v*r?DuHnswR~@OUg>`FMB&T#pWbsMaGU_*0UG!yg_$5hV4PJ8y z6ty!iyj{xrHF}h{h8W>6G(O;?;IHlq}`)gpEjRt_TN3t|0*QRxd64gH|DYUmU(=VP4k@bEy^8sxldPkd!}{v*{@OpCMcq9s$`mA2kk^&jOQlfAq_Y861<6Op2klYQIS=1T^E~O%pk%~xFVuqvIHD-+?+x$f| zBG5}A+GP2cAi*KwH*etR>zfBNgUg zU}J(gT_Cm;FmK1tpAbHF8(m=Ox2VY;du8TeX5RnUfLi(+VsN(vPBPJ`4xT15jGFn0d1bugsjsV<<1=b}8Y-v#ks} z%gfrp_G^265ru7a)2lf7jpk$wi^~2gJk#y-_X5&iMn4nHab!t&WwEQ`xs@<9=Zm52 z(ni*}9dM5cnUqox^ap>DDaC78Tmg8bDzBvQ!3O>ymveD_Kr!9KW~r1M996?rRjTTs z;HQ~WImrAx5jag+Y@j|Mm`P|3b=Cg>5pB-7fagkCM+cmNZGRS7_ucUT=i>fibX;9# zP&lkg1H2(QW2u2#?iy+=*N9RvV+=em@c~(tekImXXT*5(5tEn&<0ygu0NaCy?q7E} z@-n}n5%s@QdfvYSV-4e02;Sqq@aWi10M(;>~6;0S4GpGh%svl{2$4@&PB!FD#ghRJEh1zaDd=6 zdu@=-9YMWQA{BZiu+jd(hlD*L^k!Uv%R~LamDaRf)6C3F1Fhyz!_D}%rRaeX$i zKnXjMT+lR<-Oxwu;lanTn@(F(+Ka3$K_3c+B0KI3q!& zmqeyyt4rpvPR6pA;d2sEJ1v0PMGzL;9IhYH)u%OXt#0zJ}q7E9Gjn2Qpa7HaLOdC~>iMS|OF9 z{{V0Z8T?G%dy41anOEmHZhb2saa5M7D;R(}8alOqLH9qdM5pmFuQUaGLjxgB2F(5< z7IxLMTrYi*PLr5XM=qx$=>?C-+weyawNMQSihkmWdn)9&eG;fy$a&SDNl8H{c6MF} z0Ml0H_qF(&jHz1n3_&h5^dix}Y^@Z64ljrRm70X{<_R@qUCI0Vf{umli!BF zh}*}0OQ*5YLvU`cP9MnG@fHQxB+I&qL5#qPQgcvJ(^AVRmS}McV<42b%%wu>M5`S) z7Qr-OpDJ8&3Mj<1J^|On$zF^AJ8*c3obvgM^vyq+X9j3s`-fUyZ#82 zH?QJSGGQWyO#Y*xS!eSq=*EA!o3XM53f6w%cjxsUl|~x^;%7nLqFU>7R_~n46icJK zaV<0m;*oiHCSWZ-3_orB#0Pf}++dB>57a@crs|dYfEg(d)UO*#I}xczTuTDKskk_C z>IOtH!2bZ~V_1m(nw%-G9^nUDx?{e>p4PdDU#ey1oOEc12DPKW<{#E0>&T8gYFFJk z=Wyii38A4pcI0PZS2Ghm#$jcPgD4Oemj0$Rm?nSol?Ix7T;H>3j8Wya`m5!rjAC)~;Psyj%mB+Bz4Xnw9t%T1+eOT(?sl5CTuB zo@d-9Q;j(r1^vvGD|B#v8v7t5u9&4%!>fo|=zg>D01Zk*?keohd`m(rOap>2@}+{{ zPPt`Pu&Ly)9Y6xB^ON8Ef)FjTym!G1tk}NO{GqacB0N^Z%oQaJ>)h8!3$MCu96Ya+ zh=Wqf^b?h_CHGgkq38udO!B0dRRgkwzy z6Mo>M&F9*@YTCx;L^9?=^hLwDxq7{zWi3XUUE#2c#O02?zi&L*8= zXB|f^yXqMPujV&JJV3cC{{Ujr^%GQT+)a3KUs#Fn{{UF7N~e#RV1*_x#KN56d`*mU zj^kz(1~#qV60}6O9ZFGR{ZE^0L7qa&dJ?BfKIO@KLyOPoOZdTuo=?nEAnE0f-Wfel z>IE0BWT)Vd=fDNne-j3_ql{->cXhu6WN-oD$@_zs@iWSYljQC9+`PcY2c!K=NSuMs zPqrWlh;2AL{{RQMomRE~043sQ(Asq8&HOTbKS|+5x|B{;TsDUJ9;OQRpXl zQ(wQ#G>ZYETzU%Qh4Ml?T*nMCK~@3!sv_;*5mR}?xRF_LNhwh-{6MS<_Y`#I5bVna z`#}Aq9IZKA!=RKm^2(N5Y|q5bjA6fXE-kOjYTWfbc;p1!*gq1pZ<%#338EuRrncMW z2K5|Xd`lYcay5u#UJ1?d1EbBvWo3u+nU+oJVA+49nA1#VID(l6L_ew*(6p@snvDSF z-~C`^kKz2p6Aypwh(yZU{^@d>flLVFQ6}%P0e_}JE-NdE3ESPspVVt1th|FnCu}Ya zTTv5Q{{YK1>>D_zxGbQ(+4vLlan)lE$5#C@@TCOKAo=|Mk)H`9jtsFXr30TDZ!yn@3D z++CDzmn!>!fCno70C;l7`bdJn_}u-I{xMh&kNZK(eRKZ+xSkrBlnxWVkURzLsL(xY z+dumN*F{-aRft@)Q;f`btIT^xYB;PlF;vQM+dcE*H^+x>Yssj=ZrEL5@IZHSec80G zd`+F*=gY&1V^`D-*}_DF%&?V5$8nW#DW4L=w^6ajHvv>R_Yt?QASvQHJi=Q=?eyQM z+Ul{}q{q@ygWJLj6K%TUThWKh$=bO%a~K_w65pQqe8!SgyLo$@Be0a^1IJm0CUg%e zQ&yq8*fc{_>53txT zgye|9QktrPwRx#ZTd&L(uB9bjT}=Y*RtIkfaI52MT>KDAwigG<@jF%$S%`o>GZOrlwH$r~?#PlX4kb}VeBsvJ zb#RK>-ZqQdbx#trV%;h&PN#T@7O_izF?PG(_Cf{2kNRNhG|hjqZu7o@^1w!LrT2;9 z)AzvaE037&<1g-)lBMd6K~~N2EzR>d+^csh{CvxZypZKrainY5t_(TcVOhJe{KAX&i~E3`g<8LJ2y=hd z;}(u;-`u1x-dOy`y|f$xG+%G1b!8TSX$XvA#eCcOnKV7U3;riUXz=Ixlmxy5cJ&>W zKyHipI+*J>au4Mi?55W7b>As*@o%&D-o&P=sZe}n%3WiP8w zgN*(}CEo9uP#CV_Gr(>U5fzo{8ETMo{S85hZF`@)+%c8J)p^Ur5<)(J4xij-s^zqw zC`cHu2cY&eua5{5m&;a|U)2}@%vuXaz!FZC|Rdygu_(Rw5PiBF+!f>}{p zzwC;z9541pnr!m_0Jx3 zEiW&rVATWfsgPb)@61U-Snu3)88v*uhD!H6MiUnJfqrFKFc3@Jyhe~!TA9hX>q)q; zM6WXI%mnJoiU$LaGQ>xPxh(b}&+7rZ zF4<1r$e)ml4@X8SDFT~=iDE5$0nBJ_)Vn`#FyqoM?{6?7c>%Tm0Ce6|&fb^h;w581 z+qYtOnM;EgBN@;uEK{FB`L5;%Y@Il>%)sJPE3${XLjh`pIiqWYD1VssTCtWjbA&RE ze=HCHfWBcv1rBAm#c=?cJj=x~SxA&O(K7}(qY0fEiIt&8e4Yv8o)X2gpq2y zj$!c=W!>zTtuV_oQW^UJl|P0k8-ln$^^QIm3+^AlE^dLpl4X1$wi|zBu)%GwOE#zg zrxkM|AyV<5`lX#KcbkO^n=+^T)JLjV+OjXM)KdUYztBC5R6@5&{{XFV4Cy-I)1;eU zZ9O3c4S;dhar*m;ry1w^f`3i*=Z8^H0t9$r=k$P1N3@V~mK9}P%x0^czwShk8We^~ z`Gd&7HCp>`<~t>-+VLmm5q1WXjXx7B{R_oo^1`!bY@ExU!y{SWxqYo(0Kxi&@@^fp zW6Zd`9UR0RY^bnojTef0lt0>JTC};Cr;N&i(JxPkDYyz!m90LAhg0OqC@(dA%4;`< z3b#?JyDN#1;)WXPbslpavV4%$?5{9shW;Yui)tE;mHUNVSi=bM0gDwd6E3b@8F;Cc zb)H$wmpyu!5aRDqA*H|CN~qv3#JuuA{!lK9n^jAs2OUi+tIQIG(qdG9?8M_q+;^R& zCtq^Yg$yw5!}$0yRjd4+{{WKZvWOLV<~qu3c%?CJ>qjgV`ikBGi+7RoBNQBjUdW2C z-%`j?UQQxd{h>dJcW_CbBk#`Tn{oi1JfE1^?eK444=|dh;4A)odzR@;-TQhRvp4~V z;_1`44E(b6J%=)zeM0i$=;By4ft6)n{>x~KlX&0UF|b4*WLj9H>8hu~eMTD@$GO*LP0Qi8C)Mf#CdWl^b{X?D%OPy+G>5lS_KI1zN)KbvQ zAhfdzx54olVWg+(AsmPBimGitGTh^E9?nvCg4|QnH$-70eU@ zQQP@tjPZz>OtDumUDps|2Mo4yUvXd^?%)jbZdMh?Ul0WjE@lX7ziBY0%2DwXDyhb@ zn$8OsEiZ3STBkPlJbHm*AcLGclwe04CM62fe~Fg!F&r0@ab*Rd*J*Vq`pSK$LE6P3 z%cAH%?bS-7;1+vz4o8ueKTEaci}mkud#}(ypzc|GU3T*wdp2-&(3(7&hgZhpD@7&e z66tM8drh+!ut0Nb5$Kd6ZxGgFO)L0-XL+FNG67mNb$EYGcwZ8@Bm`xmIxk z+Qs)M#o{q*16z)j%MLnwiAV|}8>%~t1<6nYz5dcz%ZiHmmZDO6w2YhCa}vAx8JKZ7`HP5j4-uRNiNvu%&Dy0$X)djXER7iTIud$(EEW` zc696SQ7yYbE&d9wA4!%N(xCaz#mmf}_<7MVX zL#XWc7|;M+=cpM@cwlUXk*oC>H5^XMjHi?FYk|X|i&bO%5qZx|*GI%OZc;`1La#S?jO<>aQPan$x!vJ;+iKJd0qQjF>PF19RkWt>o z37*0DN)pEcpy_|QXx!S)P9v$2tur-CP*h!cgKbuMg=SP?w-SV2Z<(I|01-2&Ga=#> z=I@z{s`mxCZY`Zo0aY@LRIKh#;wFvmZvfrqejyNVpE!eLUe9Te-bVoK)JAZ}S4cEi955@wojE^65pkv2J|8u-lg7-6zLXR2Cz6UBiySigBHFEvLlwR zoETfr+7&Sy{LIh58%yjQ26lddH(epw@9`UYj!~I>2jHSwB%;K=YJPVsv35(5xG&Zo?@?eS9*mD zvQhUOpVXm(ImKK+y4Ngn^B>g{&c*nao{yUdN-a50kGlDmHGl6CvAcMflSi3l`q>9H zgBv-5GjYN9aG7eLAl=Ho2h8$!H?2h7ea{iuMtOn`@y4JnLR#ECkqokqU5t1ltlOJh z^o0FO>&eIBQq|b8))_*&9S$KDkt@tBaGTVXYr`S z9%sW8&(xuHM!1TezmY2AW>0yd_iv{gqgNZ-E0-gvE51?RhMf7Tj`9lHYao)5BE&^tyJ2CF= zU*Zz|Dr2uNnDUB`TqnNZhebiLoJIbS-mYX@Rq6)jDz7{c%_kag9HUg_@f{`*N*cDg zs)Y=pc=p1|)^y7N^BCVU!y?AUD{=Y|7SSW}Vf{7I=#6cAoEN#KW8M#eK{C z5|#~J>*5`YpTI z7oO%~U3r6mNK4rP3RI{$wd!E|8qmk|rTVkQ|N+x}6 zJu?%+cWO#y?DyB=Q|rg)jA7a?pHV{Y8mtft$%$iWZPlG50NzI@FO%iG&8c1w2u0Fqi#Zn4bBEeCLI+#0#J z%&oniBWFPOg1LmSbDXpudYr;80=<}H16nwVc2){1c@7}h3-(I2*M3;s&I<)wwem4+ zT4D^~@eOdLTj~%ujN=F`<@7+`e6jT#0sjCDDP0?WV{5HMwU_2#2Wd@Q#CQ0H87d{% zkYQXW67F;HF8=_=4|#|TSy>_!LaG4QGw@Q)``kc}p&IbU6X1hA(`82x_rs4ykJP;F ztn>2}L2MRZ{kV<+Cb@0@0E9nmh?V*uV>H{#nlz6e5n9%(h*3rZ=&>}Osmd8ZO++~c z&LY+PrRLJjOn5EscD2hYfmTvN^qSuOdnGtUrvh(_)GFsdrN>owsN)-LB!0r47*#DR zv$bE`$IO%d1NRS4bRV+D9?{0Sn`b7dd5#X2vbV(3JgP7x;u~5 zQgsTO{6mlMmUPP-FN&xHvb<_yFNS8}xphu&Nt$N=0FEI>!I-Vi;u}J<{6hIsDppv( z#7Ua*DW`nF>{NP@e{$NfW^09}H?832V+_>AnsABAaNQ(ygF@)1c*XMwagWqxVZ^bo zI*D4keZ^VDFr8v&dS)xE9kPQd^nP438VxW$oFa-sjKjVkWGz2wzddW_IItQ`RH?GR zVqGP=f5IFfI3)zEU6~d6m4&;p{IcB^75Z6D3zdP}A;l2xD~?}@iw(N`E*~zW5m0KxunoDkNj*VfiSe7;@Lh@cnai9Q0S;5QZ z4ri;gi02EwWf+U`Flp^&;fu)xvC3X>%ok^6u-Q#kgSqt_i#(2lf-qL?sh8iGZA-5# zqZd16mbt1Ci|u%xFoSJvU#XH=rXeW2ZTWzq+*K;P#R2?6sY<9QdGiISa^?R3)eaoj zn3tH2u^P7r(E|=~1K`SV8pOz5TqeU$;uYNC9CF0{aj-P=@g21-S{oNwV(fX_1hk%d zQ2=Q6K?U}daI_6stsv8K%b4`fApFx3dsZfcXn2o+#3I^C2zjcQj?Vu8w}A4*bdC6I zndbAmmK#*uO&YEx3AQ>Z#G+bph72i~E*~&Bn}$EKDoufN=yx1wb{2hMjmtA%LnJA# z;Ir_=U&BY#R-W2G`HhF{*-Unie9#|pp#y)SB88oe-^?5UstXS&(J(@d+hByp9`^1GWHD7)D5eX(nfZXpOA3}4y^DR4N;&0}VxBCRh0RPs>#OY5~abyJON zPT7pUZ3pgG;FioFI9>N=1DE1kNS-L*z0^@ua&shJ;yLgEi zZXj;^io9Ccwu{XwB6G7+%bE*dIdMlX#7hT<4vP?XKo*LO{6#~YMpwAd9Ye^flws0t z3zaRdZ^#_=5U>Kupk0)|1i3<-Ks-AZZ7uUCZ8L;wUor5|?>{dNHRt zfr;xfh`7w(xX{xRwqG=Qi5;$S+tUo!VpwpyP;Sfo5r1 zc6fvvYts1ub4IldOeTvPMOc0rCS~&h8Q--$=zb*M^rEhuzZ${%LP$(P#l|bH4+A%ArDCsKB0BE=I+oLysZF`Vn8Dz%XuQnQ!^QmjG_F zh-9@JfWrO53NQPMy<%Cg$F5^LT&$I`?l>ZcOCKU;JbrB^s~iNn^Ke)e@B>f9a~E=J5Ddd0{~pfD+DZSXL9bWO~s{uaHi~XF|)zOYNYZ8XCRkKPCgNhbjjD05CI7L<2RVm%R+XE;hH1pIz2r5Um!5B))UI;ef!UY3|@t5FNHT+8!=mnCe#l=HaE_Pn# z6Stq#N5BcDyUp7S(aqA|h4) z08|=I6x4Qin`TxH9n=@ue9Q97%<{L~y2WF}0W^I|4G`dlJWZNJx`~_SYBVYhkf%J5 zmv02SJouIi>lqNPZ-O`_F!Rk4lG&;eF18ZYiKypyzW{(z2+EXj9gP=2d5 zGF|<}##|WPOSHPy;=9k>qgB5g%aGOOdyIFUVngvi66eJz?5 z;N|2)Y$|o+<8YWaatyyF6H2>QTp{W>0EEAWy0>pRJV(N6C-iUeN8?lUl7zuR@}9-?kth9ahdzkt^5p7cQ`>N;UWGRWD=9qc&2+(7%K;5}me!Tfxc>lTTMRK>Bn72T?xqJi zf<;)>BNmeF)J2f`yN5CcIZ@F^co=tyB!4hJPqv?kP=pkp+ZJ2bL4)8|L`bsv6q(Qs zFTyYLTt9Hei*<3Kd+`FRi_TzW-$%KWt2QPV5c-y>#eXDPaGA`rZJon`Yr(l+NyB&1 z9jw8L`(g!p&FK1v6?Ioic9)VWZY$=aX9Z{#m=%g= z4BXXQOx(!JCJ3OvLzzu-bd?0NU0c5p>&!*NfE_@%FyabRg}UY|V}&7LszdsZW)&G< zgpUnY!-B&Z#89r%6nqS54bc6S z3l-cyE@kt83sdR{w7d#NEHf!@i9{iQ8$MxFA8a0_vIl_2tp>{@)T_?jlmRO6~51^OTRi{VQ#LqW`g0W8)XJ_@t zGhviLZLG9zd|X$O3PeMF8_D<~i;Lnu<>{{#{?b_{nWFxf_*%6WOhV3=2%e73zpzHY64->!FfZ@x;prm((SjX+#yyo zJ;_uXh60AVKH~TqS`5C(_5t~bEd27!8;vHvPy+jk&(z8_^Z1LK!#1?Qhy!#;+<}EN z^HDg`fqsPM1aC}M-eTItG48K$wO)#wW_}VZy8M}g5nYVL1iIal6qL$y)Y??D^ku(d z1;+vx%hU<#=XCYTJW+kw+T?`H6#2~D^G2>>NC4lROkZ_V;_yv(k#PCtnIN_ECr|(w z?!Fun*+(GykVT=<{mnz~++7q_st#WcnUrZmx@KTHrQQh2JhnS-?NrAG;BVE;F$=ms ziDJ2`Z?aRz-Bh>3EKMdFpTyCVbpHS(%^l--C|ajiI7$%cS%UmcaNH3}vTK-kp2nx#v0kp3TwwFHznCJ79#jI< z);CFZGH8F)t9h{oAV=8D&@;}`DRdq&lx$6mR<|rzz%_TYAh%MULMxWNXBcja7y@WB zafFJv6L<`(L~%vTO1-N801$|WSP?+I=Hdl;H@t&x;-8hf^*s0(#|JSC3wf$lK@d0G z5Mi!havjGhfnW!<{vrZI7vShdRSP>_W49#c{6Y8;LVR6lTXM}V)CrtyUdV=vd}NOg zmIx@saFuYn zJiob?DZzFw1r3x1gm8hiE{cd&=;<)ek6h|yEdcQD3n_j9VF=MX~u@mtHY8(ARS~%LfhsnL0|JPTJHtwV9~$qMvhIMk!6*>m&6A5)SsDV z2aA0vfv_*sd3?&IN)h3N@`uhLMYEFC=;f5fxtKki!8PKIs!_(l>G@;XhyE5^s+t&k zUt(Thg2n~w%2qnCmP6>B`!>w)-H+el~QR{A$ zz)&{6CE-W7ww_g)R64#XpOkf0M{?Ox&?1j=>(6sQOKWnGN|$DY?a7?PYf~d_E*dO6 zF-3;o5nAg)IkRMVyKJqJvj8@v9r=L-W4j4)Qv`?UziXDk~Z^#oeuekARbLTb3hKXJ=Av{C(?$CZo|f9?<( z^D*}fN%L(za*PeYK(9t)msaV1Vhd#HVC0K^qgjFkrC$=L%=(s>51N@s{3$P89V|s` z&EQ};WH>C%LQd&%2jDdZe4!b8T*XU$I4~bKHD#8D_z@{dei0QIJAy%;ZDdnJUjXQe zs8)jd%K##T__(&Ne*!eBEY>0cZF#05YVE&L+bqKt)l%#kw=e;Q4c00gUe_6c;%U?> zCu~Yvy39ZUSIi=#dUF-`Ope#M_}H~*e2j9{-vUHIe)3^)gW^%)_=|==s1*SpQpFWM z2+(j>5x}VCl0E_3Dj(Yh8sSxnyub^*_XIS(#6hdmDCDYBoZZ~S{@7Hu`JN0qViYfI z422DahWW4@-%`W$>g}cKd-`_vTPHD@x`hj1g=~g9 zAj@g;R6uF?lv7mWRP`zyCz2kVQ}F{(>f3970t{BZ*>}{#xTa^8U7TVg!(JjrgPD(q zQp^*cWk|6x1G%+aS1@eG2o^??tNaxv8;H|_x}9qQPnms8xlU!!4vLeP=g7az22Wj~ z)$>%#j^3$-e14b$u3spbRr+yhSG=Wd+3?~6&OTqE58 zt%|6fcxCsC*u}5+sw>0jVl5fYP~ywV{{Xm->$`t)x8}-)f0oc=frF5I3RlJAn2DnJ z6jj1}u^Vl!pzL5QSqwHB(>JCq4Z zOD4;5vmG$u=2$~MW{xVRrs9pV$<(SxF2#;YeBxLltae;a!Sx1P*O(*{nUP)(FfYP5 z7SuAly~U-bO-I-(h{Ep2%K@zZbpqDYG39<30mD}ub61ID8J!o8%%No5r7*Y-aR9M+ z?U@8aYU{WRBYrqw1DO?7{mhy?r{mKK74eCq*)8NQjIorzERCKViZ)<05bfJoK2I|} zwL=|2XZcHqE7W-rc-*UtPv%xd!`wrJ`h~=~%mi?`Mu}Fv#@IE?2xWZKZAG^CC^oS& z3qt`IZ2d&1HbV}}>4m9oAwhCx25G2YZ!)8QmYdx40VgHSEZ zPCJ>+4B}m8jb{<%PG#pMupGsF)#@eKlI_R%rx6o}5f)OOUL{1ac#HrixMGxTUBbvI zy)zY7yi{soOJVc_GscqKnG6Neqa;At;vDh_IHIxFWgQ|d-_FQb_;Z#UrWwnR>#yXBXzApiv#WfRw#84aK2^UF$y_8 zW<$Ou()GqAT!s07;57!-p5R5}FbT-SwlfQ1u^ikw7IZ~ZI39=Kv3O9N;gmp40iwo z+qgCkV8tXgHcUapYVJ`}D4B|Chw~QMdDP0MJU|A_;tC?>5RE1MOFi2XR%)e&%<5z) z&vOel{$krzD_b5DSRMu$0xQg=qQl%0sk6)lVfbaoXUqwze&tjaAy-LQ+^XUGm8etZ zVj265SVxP4-LF|?-|Z_JY2}7RxYe-FzjJ`Hv$!RjZ_E^|G2Z47zi3;EVz(6;`$f(D zpqDJeN*BK{YBr;5DXI?h6e{rZE7I1t8p!!(B@k%jV}jSiDYnb*IA_p+o1yK37oV6V z?zO$aFw@P!*LUu4t+KZ=$o<9N?87Y*yMY=CnK?XohB9R~)11Qb@(O^29pCu2ELe*S z5qRzaGCoL}DXNr0==-1aM-41&VayeSj^)~h zoXX&LH9>}@RndMRwW}`Ws1K+I41Y4V1}LUU7GO&k@lP?fbxI9b%Wbq4Va7$7RoU+X0@c|t35CObu383Zz ztv?VnQ!y$xUM5y;T8S3QzE}##YgI8qH^gp<%Q0J?bjGajvLP3?Rz4ZMYnf}>-s2o5 zPFNR;^D*0VBD71(viGP7&hr(ih3YW0uA_F*^9HE1aGMs+F^E&kyMO|kiDlevYp68c z8_cblb1msn5luy`re~13RbasSg@YSnZX2HxuT%Jjr&yfo0~_{#n*74;I7m+1^2D&!e=_scvb_9FZ+@k1zx6QH{LEmy&9R$df!4GDHH`K@ zQuxms6J!>58*ddejwbv-4fTygp~uY0#rcVCyOr&UT|^30j^H+asb;DEBORYp0bM*| zT|m^gE%i8W?guVejb7qaTM=<}7NQ{7Ik+m&LOgZcPz@psZVn+a6iKhOEs)PX#Gw`l4VFi zdZt&Bby;y?2FB%{PT>o(5Xk~BX~^jrOX6hd!#C;$)qs~{#&*kD&L#&5c8ageR>2lzFH+5t zx|AK=^8vsgL{~U{u~ox}TXrzJ$)+fPlKs}AjtcX{R6tn@Sz(~c*u-Gn^(?<{ap(6e zz%f@Ex=&K_;rA)K{Y$!z*h_)G^MB)C;nt?*c$r;7>rqivIv4L<6C?w`f0N2ZqQ-_PigNhA6Bmz138CoMsPWlgSZQDd*fCT`k;L z1o5JNu46}J&zlGCAC6tLc|1NM3Y*{r3+@gw*$(v47*h+ZPX%q5(H7{XrU)RS-CRdy z!C56eI_oTJ(Pec7z)%3&HaWV5z((gpRk(*|o>KzggZN{vmqE6@OV*;SXTiVBB=n#x z@`C;uK|!NmnWV*#Nl_b`%PCyYRao^H8!zBB-M*?d&O{;XOMV#qgxg`+oeWt7lET{E z0SPXu6X~!%3xQE#d!NL#)ZH4mup;Z*2s`Hk6UdoGmDE2xP8W>oTI4kqTFQ3-7X9W} z99%D=r-Cg(qTXYp?Z(Fi}XEseMH?W4sP-D zsAX=$;i&4;mPo&xqL8M?P*7*lqB7QxwgAGqMh+pL4q*7##10i)Wm4&S4kha_;ASm( z>LY?~)gBikEHDeEXs6>0uSGmfQ@q-tEsUGWm_9n;U48*(1UNOVwADgjV<{EuGowjTjw?hVGFRy zn)J(;CKDimLl$!|p=+#7ALcNk$csqPcJDZa09VYrEXH!c=Jgj;>oGwq#GuWUh!x8a z`->Fr8RI|Wa_}LH{6hKv01m(SH5QP{T^k@c2Dy$Hvic|U80mF0VCV61uo`Zl&}YH8 z6oAC8gY#1BiEwsCKwK9J*pCb*NpGycCDvN}Vp|>yFet%!h&j(MH7&!l`Ay3}YE{%) z%wa5IGOy+_tS45puecFhpW6PT)KSduhN6u|jzjeu3RA!Jhf}mDD!41m%qd64vi?xX z4h36%!G04^)o&a|&Qu|9ZvOyd2{C%quIU4H;VpMU9Y}=PjMc>4>Qvz#!$otLtb(wh z>jHSWg4OU z#1}f(nQdJR#TIS7&K&!Xukoa*U*He&>;C|N#6^v)OvOwZDp``tv4eD8W$qm?nKvj? zpv`zl=Bq3oDaXW1siPMR34Z<@D{-z@A`YvXE@4l(k!LM^MQ3+`@QFc&_QUd&XVkIq z8Gcygb6^GpXvUYs1D`R(V!LSYQ7%g>Qu3?XFlWa?Q2L)+j~8A@qVkn4-Hm#N1>DnPeUZ-}cuU%r%%EoUE?(B9Du_~Wu0 zE0Aw%KU27XI{jJum%f5vEh&|GR$pM>F}BV;MP*K6(E%M%JA***N1;8cBqx=|# zrMWj7AO2dDQ<>Zh%C6yjO2(p8qheacSC||*>I^mv^%27TMZrN_)ZvOX6jUwLG~*{S z)lEvfgT=cb#nJeb3JH6n3*v%iuB9ZYzG^-hgvvy8 z(FN~_0FH2$X3bBCiOk>s09AkHo5ZU#D!4zwaTb=MrX0)fFi=v{Wx-cV#8h?S2EeGR z0jWjgYjJageMP%!mRVaGM>c7> zTkCPiryGJjFA|krxr$b~+btXz?hBNAxsi26%cel}2k-nmOf9@|3PXY6hdnUSO&H9l zJuqHKxS;{9=6m1xX?Ons&Hn)NXOW&GDtxl@Ib$-eX*|?b7b=lGLi4)jTFoA!RSn)H z0-uTI+)yswWeNu7STO*x)G&PO#7$;b)YK~PEtB~{dr>eIx`syRl%c&#TSuut4f8E1 zGGb+|z$kKaGSs&EnijcWS*Liaj!JP|N&>L@iEOsG&k~fkh*)ptTJiG$y#yS!hz^a+ z;<%ZteawvhC95o4na4Axh>#;jH^n*TINAb_5oszo+j*Ef+@%^y2~K}-R%r)p+(X2< zd9VKf3`_q2E_DnupXyd4QjRewZ+$|>nCZj;an1tRFDse8WBFrtVrjSaEypv=;%;)O zQ3zFHCyDrlw^$|KpA{N6Dt;xS{M<{!ih^G3?j>ZEt8*JPA9FQqTsr*E8l3xp3_!K) zmp=p=YVIjFKM-TNmgObY{6_%V+^Wspz^^%u!tqlo#YM|@N)>^Pf& zjl*^RM*jfI4F3R)#ltoJ0`K{a4M!v5Ro%dlSl(r3x!f-`#0_~M` + + + + + + Sign in · UmbraTrans + + + + +
+
+ + + UmbraTrans + +
+

Translation production workspace

+

One source of truth for every language.

+

Review books, translations, voices, and audio delivery from one project-aware workspace.

+
+
+
Project-scoped access
+
Shared speaker and voice identity
+
Traceable analysis and delivery lineage
+
+

Prototype environment · no credentials are transmitted

+
+ +
+
+ Secure workspace +

Sign in to your workspace

+

Use your UmbraTrans account. Project access is determined by your organization membership.

+
+
+ + + + +
+ + +
+
Administrator?
+ Open control panel +

First login with an administrator-issued temporary password will require a password change before workspace access.

+
+
+ + + diff --git a/web/uadmin/index.html b/web/uadmin/index.html new file mode 100644 index 0000000..6612786 --- /dev/null +++ b/web/uadmin/index.html @@ -0,0 +1,99 @@ + + + + + + + Control panel · UmbraTrans + + + + +
+
+ UmbraTrans +
Control panelSystem administration
+
OP OperatorExit admin ↗
+
+
+ +
+
Prototype control panelButtons demonstrate the intended management flow. No accounts, passwords, or database records are changed.
+
+

Administration

System overview

Manage identities, project access, maintenance, and service health.

+ +
+ +
+
Active users24↑ 3 this month
+
Organizations32 active · 1 pending
+
Projects11↑ 2 in production
+
Worker healthGoodLast check 2 min ago
+
+ +
+
+

Identity

Accounts

+
+ + + + +
UserOrganizationRoleStatusLast activity
AMAlex Morganalex@example.com
Northstar MediaProject managerActive4 min ago
SKSam Klinesam@example.com
Northstar MediaTranslatorMFA enabled18 min ago
JRJamie Reedjamie@example.com
Harbor HouseAudio directorTemp passwordNever
TPTaylor Pricetaylor@example.com
Harbor HouseViewerInvitedNever
+
+
+

Tenancy

Projects

+
+
DH
Deal HunterNorthstar Media · 4 locales
Audio in progress
+
TI
Treasure IslandNorthstar Media · 2 locales
Ready for review
+
LD
Last DwarfHarbor House · 1 locale
Draft
+
+
+
+ +
+

Operations

Maintenance

All systems nominal
+
+
✓
Audio workers3 online · 0 stalled
+
↻
Background jobs42 queued · 3 retrying
+
◫
StorageObject storage connected
+
!
Password policy2 temporary accounts pending first login
+
+
+ +
+

Usage

Production activity

Last 30 days
Aug 26Sep 09Sep 26
+

Traceability

Recent audit events

Project access updatedAlex Morgan · 4 min ago

Translation batch approvedSam Kline · 18 min ago

Temporary account provisionedOperator · 1 hr ago

+
+
+
+
+ + +
+ + + diff --git a/web/workspace.html b/web/workspace.html new file mode 100644 index 0000000..706fed4 --- /dev/null +++ b/web/workspace.html @@ -0,0 +1,114 @@ + + + + + + Workspace · UmbraTrans + + + + +
+ + +
+
+ +
+ Prototype data + + Control panel ↗ +
+
+ +
+
+

Active project · English master

+

Deal Hunter

+

Production workspace for the source analysis, translations, voice cast, and audio deliverables.

+
+
+ + +
+
+ +
+
+

Production pipeline

Release readiness

+ Last reconciled 4 minutes ago +
+
+
✓SourceImported
+
+
✓Analysis12 speakers
+
+
2Voices8 of 12 cast
+
+
3AudioNot started
+
+
4ReleaseNot started
+
+
+ +
+
Target languages42 in progress
+
Approved speakers12All identities linked
+
Voice cast84 need review
+
Open work items17Across 4 locales
+
+ +
+
+

Language lanes

Translation progress

+
+
EN
English masterSource analysis
100%Ready
+
DE
GermanTranslation and proof
72%In review
+
FR
FrenchTranslation draft
41%In progress
+
ES
SpanishQueued for review
18%Queued
+
+
+ +
+

Identity

Voice cast

+
67%cast
8 of 12 speakers assigned

Voice profiles are shared across language lanes after rights review.

+
MCJRALSK+4
+
+
+ +
+

Operations

Recent activity

+
+
✓
German proofing batch approvedProject manager · 18 minutes ago
Complete
+
◉
Voice cast needs review4 speakers awaiting rights confirmation
Action
+
↻
French translation synchronizedTranslation worker · 42 minutes ago
Synced
+
+
+
+
+
+ + +