From 4f9f110f28a937fe7c05a34ae82033a0ff095d81 Mon Sep 17 00:00:00 2001 From: GiggleLiu Date: Mon, 7 Sep 2026 00:47:50 +0800 Subject: [PATCH 1/2] Redesign website as an autonomous research atlas --- .github/workflows/docs.yml | 5 + Makefile | 27 +- docs/src/introduction.md | 6 +- docs/website/README.md | 67 + docs/website/assets/fonts/DM-Sans-OFL.txt | 93 + .../assets/fonts/Instrument-Serif-OFL.txt | 93 + docs/website/assets/fonts/dm-sans-regular.ttf | Bin 0 -> 48280 bytes .../website/assets/fonts/dm-sans-semibold.ttf | Bin 0 -> 48280 bytes .../assets/fonts/instrument-serif-italic.ttf | Bin 0 -> 64208 bytes .../website/assets/fonts/instrument-serif.ttf | Bin 0 -> 62284 bytes docs/website/assets/site.css | 1799 +++++++++++++++++ docs/website/assets/site.js | 719 +++++++ docs/website/index.html | 331 +++ docs/website/preview.png | Bin 0 -> 295229 bytes scripts/build_website.py | 111 + scripts/test_website.py | 156 ++ 16 files changed, 3399 insertions(+), 8 deletions(-) create mode 100644 docs/website/README.md create mode 100644 docs/website/assets/fonts/DM-Sans-OFL.txt create mode 100644 docs/website/assets/fonts/Instrument-Serif-OFL.txt create mode 100644 docs/website/assets/fonts/dm-sans-regular.ttf create mode 100644 docs/website/assets/fonts/dm-sans-semibold.ttf create mode 100644 docs/website/assets/fonts/instrument-serif-italic.ttf create mode 100644 docs/website/assets/fonts/instrument-serif.ttf create mode 100644 docs/website/assets/site.css create mode 100644 docs/website/assets/site.js create mode 100644 docs/website/index.html create mode 100644 docs/website/preview.png create mode 100644 scripts/build_website.py create mode 100644 scripts/test_website.py diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 7aa4e1bba..b6b58ec6b 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -49,10 +49,15 @@ jobs: node scripts/generate_reduction_graph_layout.js cargo run --example export_schemas cargo run --example export_module_graph + cargo build -p problemreductions-cli --bin pred + bash scripts/generate_doc_snippets.sh target/debug/pred - name: Build mdBook run: mdbook build + - name: Build research website + run: python3 scripts/build_website.py + - name: Build PDF run: typst compile --root . docs/paper/reductions.typ book/reductions.pdf diff --git a/Makefile b/Makefile index ce9056ca2..1c3bbdfa9 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # Makefile for problemreductions -.PHONY: help build test mcp-test fmt clippy doc mdbook paper clean coverage rust-export compare qubo-testdata export-schemas release run-plan run-issue run-pipeline run-pipeline-forever run-review run-review-forever board-next board-claim board-ack board-move issue-context issue-guards pr-context pr-wait-ci worktree-issue worktree-pr diagrams jl-testdata cli cli-demo copilot-review papers papers-lookup papers-download papers-scihub papers-status papers-push papers-pull papers-index +.PHONY: help build test mcp-test fmt clippy doc mdbook website paper clean coverage rust-export compare qubo-testdata export-schemas release run-plan run-issue run-pipeline run-pipeline-forever run-review run-review-forever board-next board-claim board-ack board-move issue-context issue-guards pr-context pr-wait-ci worktree-issue worktree-pr diagrams jl-testdata cli cli-demo copilot-review papers papers-lookup papers-download papers-scihub papers-status papers-push papers-pull papers-index RUNNER ?= codex CLAUDE_MODEL ?= opus @@ -21,6 +21,7 @@ help: @echo " doc - Build mdBook documentation" @echo " diagrams - Generate SVG diagrams from Typst (light + dark)" @echo " mdbook - Build and serve mdBook (with live reload)" + @echo " website - Build the research website and documentation" @echo " paper - Build Typst paper from checked-in fixtures (requires typst)" @echo " coverage - Generate coverage report (requires cargo-llvm-cov)" @echo " clean - Clean build artifacts" @@ -93,11 +94,23 @@ doc: node_modules/elkjs/package.json node scripts/generate_reduction_graph_layout.js cargo run --example export_schemas cargo run --example export_module_graph - bash scripts/generate_doc_snippets.sh target/release/pred - mdbook build docs + cargo build -p problemreductions-cli --bin pred + bash scripts/generate_doc_snippets.sh target/debug/pred + mdbook build + python3 scripts/build_website.py RUSTDOCFLAGS="--default-theme=dark" cargo doc --features ilp-highs --no-deps - rm -rf docs/book/api - cp -r target/doc docs/book/api + rm -rf book/api + cp -r target/doc book/api + +# Build the product website with fresh atlas data; API/PDF builds remain in doc/paper. +website: + cargo run --example export_graph + cargo run --example export_schemas + cargo run --example export_module_graph + cargo build -p problemreductions-cli --bin pred + bash scripts/generate_doc_snippets.sh target/debug/pred + mdbook build + python3 scripts/build_website.py # Generate SVG diagrams from Typst sources (light + dark themes) TYPST_DOC_DIAGRAMS := $(wildcard docs/src/static/*.typ) @@ -121,11 +134,13 @@ mdbook: node_modules/elkjs/package.json @echo "Exporting module graph..." @cargo run --example export_module_graph 2>&1 | tail -1 @echo "Generating CLI doc snippets..." - @bash scripts/generate_doc_snippets.sh target/release/pred 2>&1 | tail -1 + @cargo build -p problemreductions-cli --bin pred + @bash scripts/generate_doc_snippets.sh target/debug/pred @echo "Building API docs..." @RUSTDOCFLAGS="--default-theme=dark" cargo doc --features ilp-highs --no-deps 2>&1 | tail -1 @echo "Building mdBook..." @mdbook build + @python3 scripts/build_website.py rm -rf book/api cp -r target/doc book/api @-lsof -ti:3001 | xargs kill 2>/dev/null || true diff --git a/docs/src/introduction.md b/docs/src/introduction.md index 8b79aaff7..c38db6d23 100644 --- a/docs/src/introduction.md +++ b/docs/src/introduction.md @@ -1,6 +1,8 @@ # Problem Reductions -**problem-reductions** is a rust library that provides implementations of various computational hard problems and reduction rules between them. It is designed for algorithm research, education, and industry applications. +**problem-reductions** provides executable definitions of computationally hard problems and reduction rules between them. The library is the foundation for an autonomous research infrastructure: a system in which AI agents investigate useful connections, challenge candidate constructions, and expand a reusable atlas of computational knowledge. + +[Explore the research website and problem atlas →](./index.html) ## Reduction Graph @@ -45,7 +47,7 @@ Computational complexity theory has produced a rich body of polynomial-time redu Our goal is to build a comprehensive, machine-readable reduction graph: a directed graph in which every node is a computational problem and every edge is a verified polynomial-time reduction. Given such a graph, one can automatically compose reduction paths to route any source problem to any reachable target solver. -A key enabler is AI-assisted implementation. We propose a pipeline of `algorithm → paper → software`, in which AI agents translate published reduction proofs into tested code. The critical question — can AI-generated reductions be trusted? — has a concrete answer: nearly all reductions admit **closed-loop verification**. A round-trip test reduces a source instance to a target, solves the target, extracts the solution back, and checks it against a direct solve of the source. This property makes correctness mechanically verifiable, independent of how the code was produced. +A key enabler is AI-assisted implementation. We propose a pipeline of `algorithm → paper → software`, in which AI agents translate published reduction proofs into tested code. For witness-capable reductions, a **closed-loop test** reduces a source instance to a target, solves the target, extracts the solution back, and checks it against a direct solve of the source. These tests provide evidence about finite instances; a general correctness claim still requires a mathematical proof. Aggregate and Turing reductions have their own contracts and require corresponding checks.
diff --git a/docs/website/README.md b/docs/website/README.md new file mode 100644 index 000000000..c92a2f82e --- /dev/null +++ b/docs/website/README.md @@ -0,0 +1,67 @@ +# Research website + +The public entry point presents Problem Reductions as infrastructure for autonomous +research. It includes a searchable problem atlas, pages for every registered +problem variant and reduction, and an interactive vertex-cover / independent-set +example. Current implementation capabilities and future research ambitions are +explicitly distinguished. + +## Build and preview + +```sh +make website +python3 -m http.server 3001 --bind 127.0.0.1 --directory book +``` + +Open . `make doc` also builds Rust API documentation. +The deployment workflow builds the PDF and API and combines everything in `book/`. +The fast `make website` preview includes the guide; API/PDF links require those +additional builds, as in deployment. + +For CSS/JavaScript iteration after the registry exports have been generated: + +```sh +python3 scripts/build_website.py +``` + +The builder overlays the website's `index.html` and `assets/` onto mdBook's output. +Existing documentation URLs, `introduction.html`, the paper, and Rust API paths +stay available. Running `mdbook build` by itself restores mdBook's homepage; run +the website builder afterward. The GitHub Pages workflow does this automatically. + +## Design and data + +- Deep forest surfaces, warm ivory text, and pale lime form the dark visual palette. +- The header, footer, and favicon use the original `docs/logo.svg` artwork, recolored + at build time to match the dark palette. The canonical source logo stays unchanged. +- Self-hosted DM Sans and Instrument Serif include their OFL licenses in `assets/fonts/`. +- The graph is a generated SVG based on actual registry edges. Its homepage view + groups variants by problem family and does not imply that arbitrary paths compose. +- Detail pages use exact variants. URLs encode problem names and variant keys, + rather than transient registry indices. +- Counts, schemas, capabilities, and overhead expressions come from the same + generated JSON used by the documentation and paper. Nothing is manually counted. +- The five-vertex example is illustrative; research activity, novelty, and live test + results are never fabricated. A reduction's registration does not imply formal proof. +- Navigation, filters, search, clipboard actions, and the example are keyboard + accessible. Layouts adapt to mobile; motion respects reduced-motion preferences. +- No frontend framework, third-party runtime, or external font request is required. + +The static website does not yet provide agent execution, an experiment database, +or live research telemetry. The research section describes the intended loop and +links to the existing agent workflows. + +## Browser checks + +Build the full documentation with `make doc` so API link checks have their targets, +then run these commands with the preview server running: + +```sh +uv run --no-project --with playwright python -m playwright install chromium +uv run --no-project --with playwright python scripts/test_website.py +``` + +Set `WEBSITE_BROWSER_CHANNEL=chrome` to use an installed Chrome instead, or +`WEBSITE_BASE_URL=http://localhost:3001/` to change the preview address. The suite +exercises search, filters, exact variants, deep links, keyboard navigation, +clipboard actions, the mathematical example, legacy docs, and mobile overflow. diff --git a/docs/website/assets/fonts/DM-Sans-OFL.txt b/docs/website/assets/fonts/DM-Sans-OFL.txt new file mode 100644 index 000000000..a0eedfbf0 --- /dev/null +++ b/docs/website/assets/fonts/DM-Sans-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2014 The DM Sans Project Authors (https://github.com/googlefonts/dm-fonts) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/website/assets/fonts/Instrument-Serif-OFL.txt b/docs/website/assets/fonts/Instrument-Serif-OFL.txt new file mode 100644 index 000000000..e1801b959 --- /dev/null +++ b/docs/website/assets/fonts/Instrument-Serif-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2022 The Instrument Serif Project Authors (https://github.com/Instrument/instrument-serif) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/website/assets/fonts/dm-sans-regular.ttf b/docs/website/assets/fonts/dm-sans-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6c789eadb84764a2d7f75fc989ccb78873ec1540 GIT binary patch literal 48280 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 P;`?OOSMq<&12z8xwzf~F literal 0 HcmV?d00001 diff --git a/docs/website/assets/fonts/instrument-serif-italic.ttf b/docs/website/assets/fonts/instrument-serif-italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..25d2a821941d47d480d3f614c4e9da8040466ece GIT binary patch literal 64208 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 Q;YL9Fy`URvs7liR1LQ|ty#N3J literal 0 HcmV?d00001 diff --git a/docs/website/assets/site.css b/docs/website/assets/site.css new file mode 100644 index 000000000..3abb763fa --- /dev/null +++ b/docs/website/assets/site.css @@ -0,0 +1,1799 @@ +@font-face { + font-family: DM Sans; + src: url("./fonts/dm-sans-regular.ttf") format("truetype"); + font-weight: 400; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: DM Sans; + src: url("./fonts/dm-sans-semibold.ttf") format("truetype"); + font-weight: 500 800; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: Instrument Serif; + src: url("./fonts/instrument-serif.ttf") format("truetype"); + font-weight: 400; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: Instrument Serif; + src: url("./fonts/instrument-serif-italic.ttf") format("truetype"); + font-weight: 400; + font-style: italic; + font-display: swap; +} +:root { + color-scheme: dark; + --surface: #162119; + --on-accent: #142016; + --graph-node: #83a570; + --diagram-selected: #c4dda6; + --diagram-line: #88a079; + --diagram-label: #c4d5b4; + --paper: #101713; + --ink: #e8ede5; + --muted: #a4b0a5; + --green: #c4dda6; + --line: #2c3b30; + --lime: #d5e9a7; + --pale: #1a271e; + --serif: "Instrument Serif", Georgia, serif; + --sans: "DM Sans", Arial, sans-serif; + --mono: ui-monospace, SFMono-Regular, Consolas, monospace; +} +* { + box-sizing: border-box; +} +html { + scroll-behavior: smooth; + scroll-padding-top: 100px; +} +body { + margin: 0; + background: var(--paper); + color: var(--ink); + font-family: var(--sans); + font-size: 15px; + line-height: 1.65; + -webkit-font-smoothing: antialiased; +} +/* Route changes focus the content container; controls retain visible focus rings. */ +#main:focus { + outline: none; +} +a { + color: inherit; + text-decoration: none; +} +button, +input, +select { + font: inherit; +} +button, +a, +input, +select { + -webkit-tap-highlight-color: transparent; +} +button { + cursor: pointer; +} +button:disabled { + cursor: default; +} +button:focus-visible, +a:focus-visible, +input:focus-visible, +select:focus-visible, +summary:focus-visible { + outline: 3px solid var(--green); + outline-offset: 5px; +} +::selection { + background: var(--lime); + color: var(--on-accent); +} +button { + color: inherit; +} +img, +svg { + max-width: 100%; +} +h1, +h2, +h3, +p { + margin: 0; +} +h1, +h2, +h3 { + font-weight: 500; +} +h1, +h2 { + letter-spacing: -0.055em; + line-height: 1.03; +} +h1 em, +h2 em { + font-family: var(--serif); + font-weight: 400; + letter-spacing: -0.025em; +} +h2 { + font-size: clamp(38px, 4.1vw, 57px); +} +h3 { + font-size: 21px; + letter-spacing: -0.025em; + line-height: 1.3; +} +p { + color: var(--muted); +} +.wrap { + width: min(1280px, calc(100% - 112px)); + margin-inline: auto; +} +.eyebrow { + font-family: var(--mono); + font-size: 10px; + font-weight: 400; + letter-spacing: 0.11em; + line-height: 1.5; +} +.site-header { + position: sticky; + top: 0; + z-index: 30; + background: rgba(16, 23, 19, 0.96); + border-bottom: 1px solid var(--line); + backdrop-filter: blur(16px); +} +.header-inner { + width: min(1392px, calc(100% - 64px)); + height: 84px; + margin: auto; + display: flex; + align-items: center; + justify-content: space-between; + gap: 24px; +} +.wordmark { + display: inline-flex; + align-items: center; + gap: 10px; + white-space: nowrap; + font-size: 20px; + font-weight: 600; + letter-spacing: -1px; +} +.project-logo { + display: block; + width: 252px; + height: auto; +} +.site-footer .project-logo { + width: 224px; +} +.brand-period { + color: var(--green); +} +.site-header nav { + display: flex; + gap: 32px; + align-items: center; + font-size: 13px; +} +.site-header nav a { + color: var(--muted); + transition: color 0.2s; +} +.site-header nav a:hover, +.site-header nav a[aria-current] { + color: var(--green); +} +.site-header nav a[aria-current] { + text-decoration: underline; + text-underline-offset: 9px; +} +.docs-nav span { + font-size: 12px; + margin-left: 3px; +} +.search-trigger { + display: flex; + align-items: center; + gap: 9px; + background: transparent; + border: 1px solid var(--line); + border-radius: 6px; + padding: 8px 10px; + color: var(--muted); + font-size: 12px; +} +.search-trigger kbd { + font-size: 10px; + color: var(--muted); + margin-left: 20px; +} +.hero { + display: grid; + grid-template-columns: 1fr 1.15fr; + gap: 40px; + align-items: center; + min-height: 700px; + padding-block: 74px 76px; +} +.hero-copy { + position: relative; + z-index: 2; +} +.announcement { + display: inline-flex; + align-items: center; + gap: 9px; + border-bottom: 1px solid var(--line); + padding-bottom: 12px; + margin-bottom: 29px; + font-size: 9px; + color: var(--green); +} +.announcement > span:last-child { + margin-left: 12px; +} +.status-dot { + width: 6px; + height: 6px; + display: inline-block; + background: #a3c879; + border-radius: 50%; + flex-shrink: 0; + box-shadow: 0 0 0 4px rgba(122, 153, 86, 0.09); +} +.hero h1 { + font-size: clamp(60px, 6vw, 84px); + line-height: 0.99; +} +.hero h1 em { + color: var(--green); +} +.hero-description { + margin-top: 26px; + font-size: 15px; + line-height: 1.75; + max-width: 430px; +} +.hero-actions { + display: flex; + align-items: center; + gap: 25px; + margin-top: 29px; + flex-wrap: wrap; +} +.button { + display: inline-flex; + justify-content: center; + align-items: center; + gap: 23px; + min-height: 46px; + padding: 12px 20px; + border: 1px solid var(--green); + border-radius: 5px; + font-size: 13px; + transition: + background 0.2s, + transform 0.2s; +} +.primary { + background: var(--green); + color: var(--on-accent); +} +.primary:hover { + background: #d7edbd; + transform: translateY(-2px); +} +.secondary { + background: transparent; +} +.secondary:hover { + background: var(--pale); +} +.text-link { + display: inline-flex; + align-items: center; + gap: 15px; + font-size: 13px; + font-weight: 500; +} +.text-link:hover { + color: #dfedce; +} +.hero-footnote { + display: flex; + align-items: center; + gap: 8px; + margin-top: 25px; + font-size: 10px; + color: var(--muted); +} +.tiny-node { + height: 7px; + width: 7px; + border: 1px solid #96aa8b; + border-radius: 2px; +} +.atlas-visual { + position: relative; + min-width: 0; + padding: 0 0 68px; + margin-right: -15px; +} +.visual-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + padding: 15px 0; + border-top: 1px solid var(--line); + color: var(--muted); +} +.map-scale { + font-family: var(--mono); + font-size: 8px; + letter-spacing: 0.1em; +} +.hero-graph { + height: 427px; + position: relative; + background-image: radial-gradient(#30432d 0.75px, transparent 0.75px); + background-size: 18px 18px; +} +.hero-graph svg { + width: 100%; + height: 100%; + overflow: visible; +} +.network-edge { + stroke: #698b5c; + stroke-width: 0.85; + opacity: 0.47; +} +.network-edge.featured-edge { + stroke: #c2de9b; + stroke-width: 2.4; + opacity: 1; +} +.network-node { + transition: opacity 0.2s; +} +.network-node circle { + fill: var(--graph-node); + stroke: var(--paper); + stroke-width: 2; + transition: + r 0.2s, + fill 0.2s; +} +.network-node:hover circle, +.network-node:focus-visible circle { + fill: #d7edbd; + r: 8; +} +.network-node text { + font-size: 11px; + font-family: var(--sans); + fill: var(--diagram-label); + paint-order: stroke; + stroke: var(--paper); + stroke-width: 6px; + stroke-linejoin: round; + pointer-events: none; +} +.network-node.major circle { + fill: #b3d191; +} +.network-node.major text { + font-size: 12px; + fill: var(--diagram-label); +} +.network-node.focus circle { + fill: #d4eab6; + stroke: #446239; + stroke-width: 7; +} +.network-node.focus text { + font-weight: 600; + fill: #d4eab6; +} +.graph-caption { + font-size: 9px; + color: var(--muted); + display: flex; + justify-content: space-between; + align-items: center; + padding: 14px 0; + border-top: 1px solid var(--line); +} +.graph-caption > span { + display: flex; + align-items: center; + gap: 6px; +} +.legend-dot { + width: 5px; + height: 5px; + background: var(--green); + border-radius: 50%; + display: inline-block; +} +.graph-feature { + position: absolute; + left: 11%; + right: 3%; + bottom: 0; + display: flex; + align-items: center; + gap: 14px; + padding: 16px 19px; + background: var(--surface); + border: 1px solid var(--line); + border-radius: 6px; + box-shadow: 0 12px 35px #00000024; + transition: transform 0.2s; +} +.graph-feature:hover { + transform: translateY(-3px); +} +.feature-icon { + font-size: 25px; + color: var(--green); + width: 37px; + height: 37px; + text-align: center; + background: var(--pale); + border-radius: 4px; +} +.graph-feature .eyebrow { + font-size: 8px; + color: var(--muted); + display: block; + margin-bottom: 4px; +} +.graph-feature strong { + font-size: 12px; + font-weight: 500; + display: block; +} +.graph-feature strong span { + margin-inline: 6px; + color: var(--muted); +} +.graph-feature > span:last-child { + margin-left: auto; +} +.stats-bar { + display: grid; + grid-template-columns: 1.4fr 1fr 1fr 1fr 1.1fr; + border-top: 1px solid var(--line); + border-bottom: 1px solid var(--line); + padding-block: 27px; + align-items: center; +} +.stats-bar > p { + font-size: 12px; + line-height: 1.6; +} +.stats-bar > p strong { + font-weight: 500; + color: var(--ink); +} +.stats-bar > div { + border-left: 1px solid var(--line); + padding-left: 32px; + display: flex; + flex-direction: column; +} +.stats-bar > div strong { + font-size: 32px; + letter-spacing: -1.6px; + line-height: 1.25; + font-weight: 400; +} +.stats-bar > div span { + font-size: 10px; + color: var(--muted); + margin-top: 5px; +} +.stats-bar > a { + font-size: 11px; + line-height: 1.7; + padding-left: 26px; + border-left: 1px solid var(--line); +} +.stats-bar > a span { + margin-left: 16px; +} +.section { + padding-block: 98px; +} +.section-heading { + display: grid; + grid-template-columns: 1.2fr 1fr; + gap: 80px; + align-items: end; + margin-bottom: 44px; +} +.section-heading .eyebrow { + margin-bottom: 20px; +} +.section-heading > p, +.section-heading > div > p:not(.eyebrow) { + max-width: 405px; + font-size: 14px; + line-height: 1.85; +} +.problem-showcase { + display: grid; + grid-template-columns: repeat(3, 1fr); + border: 1px solid var(--line); + border-radius: 7px; + overflow: hidden; +} +.problem-card { + display: block; + padding: 29px 28px 25px; + position: relative; + transition: background 0.2s; +} +.problem-card + .problem-card { + border-left: 1px solid var(--line); +} +.problem-card:hover { + background: var(--pale); +} +.problem-card .eyebrow { + font-size: 9px; + color: var(--muted); +} +.problem-card h3 { + font-size: 23px; + margin-top: 17px; + margin-bottom: 11px; +} +.problem-card p { + font-size: 12px; + line-height: 1.8; + min-height: 44px; + max-width: 290px; +} +.problem-card .mini-art { + height: 112px; + margin-block: 18px; +} +.problem-card .mini-art svg { + width: 100%; + height: 100%; +} +.card-bottom { + border-top: 1px solid var(--line); + padding-top: 17px; + margin-top: 22px; + display: flex; + justify-content: space-between; + align-items: center; + font-size: 10px; + color: var(--muted); +} +.card-bottom span:last-child { + font-size: 20px; + color: var(--green); +} +.section-bottom { + display: flex; + justify-content: space-between; + gap: 25px; + margin-top: 24px; + color: var(--muted); + font-size: 11px; +} +.research-section { + background: #1a3023; + color: var(--ink); + padding-block: 85px; +} +.research-section .eyebrow { + color: #b4c7ad; +} +.research-section h2 em { + color: var(--lime); +} +.research-section p { + color: #b5c5b2; +} +.outline-badge { + display: inline-block; + font-family: var(--mono); + font-size: 8px; + letter-spacing: 0.1em; + border: 1px solid #496445; + border-radius: 3px; + color: var(--lime); + padding: 4px 8px; + margin-top: 16px; +} +.research-cycle { + display: grid; + grid-template-columns: repeat(4, 1fr); + border-top: 1px solid #3a513d; + border-bottom: 1px solid #3a513d; + margin-top: 55px; +} +.research-cycle article { + padding: 29px 25px 27px 0; +} +.research-cycle article + article { + padding-left: 25px; + border-left: 1px solid #3a513d; +} +.cycle-number { + display: flex; + justify-content: space-between; + font-family: var(--mono); + font-size: 11px; + color: var(--lime); + margin-bottom: 30px; +} +.cycle-number > span { + font-size: 18px; + font-family: var(--sans); +} +.research-cycle h3 { + font-size: 18px; + margin-bottom: 14px; +} +.research-cycle p { + font-size: 12px; + line-height: 1.85; +} +.cycle-artifact { + display: block; + font-family: var(--mono); + font-size: 8px; + letter-spacing: 0.05em; + color: #bccfa8; + margin-top: 28px; +} +.research-note { + display: flex; + align-items: baseline; + gap: 12px; + padding-top: 25px; +} +.research-note p { + font-size: 10px; + max-width: 690px; +} +.research-note strong { + font-weight: 500; + color: var(--ink); +} +.research-note a { + font-size: 10px; + white-space: nowrap; + margin-left: auto; +} +.featured-result { + display: grid; + grid-template-columns: 1fr 1.2fr; + background: var(--pale); + border: 1px solid var(--line); + border-radius: 8px; + overflow: hidden; + transition: border-color 0.2s; +} +.featured-result:hover { + border-color: #7e9e65; +} +.featured-copy { + padding: 41px; +} +.pill { + display: inline-block; + border: 1px solid #4b6240; + color: #c6dcae; + background: #22331f; + padding: 5px 8px; + border-radius: 4px; + font-family: var(--mono); + font-size: 8px; + letter-spacing: 0.04em; +} +.featured-copy h3 { + font-size: 33px; + line-height: 1.18; + letter-spacing: -1.2px; + margin: 23px 0 17px; +} +.featured-copy p { + font-size: 12px; + max-width: 335px; + line-height: 1.85; +} +.featured-copy .text-link { + margin-top: 25px; +} +.complement-art { + display: flex; + align-items: center; + justify-content: center; + border-left: 1px solid var(--line); + padding: 25px; +} +.complement-art svg { + width: 100%; +} +.infrastructure-section { + padding-block: 40px 104px; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 70px; + align-items: center; +} +.infrastructure-section .eyebrow { + margin-bottom: 23px; +} +.infrastructure-section p:not(.eyebrow) { + font-size: 13px; + line-height: 1.9; + margin-top: 23px; +} +.terminal { + background: var(--surface); + border: 1px solid var(--line); + border-radius: 7px; + overflow: hidden; + box-shadow: 0 10px 25px #00000024; +} +.terminal-header { + display: flex; + justify-content: space-between; + align-items: center; + gap: 10px; + padding: 14px 20px; + border-bottom: 1px solid var(--line); + font-family: var(--mono); + font-size: 8px; + color: var(--muted); +} +.terminal-header > span:first-child { + display: flex; + gap: 5px; +} +.terminal-header i { + width: 6px; + height: 6px; + border-radius: 50%; + background: #556e4c; +} +.copy-button { + border: 0; + background: transparent; + color: var(--green); + font-size: 10px; + padding: 4px 7px; +} +.copy-button:hover { + background: var(--pale); +} +pre { + white-space: pre-wrap; + overflow-wrap: anywhere; + font-family: var(--mono); + line-height: 1.85; + font-size: 12px; + margin: 0; +} +.terminal pre { + padding: 26px; + color: #c0d7ad; + font-size: 11px; +} +.terminal-comment { + color: var(--muted); +} +.terminal-prompt { + color: #a1bd87; +} +.terminal > a { + display: flex; + justify-content: space-between; + padding: 13px 22px; + border-top: 1px solid var(--line); + font-size: 10px; + background: #19271d; +} +.site-footer { + border-top: 1px solid var(--line); + padding-block: 36px; + display: flex; + justify-content: space-between; + gap: 30px; + align-items: center; +} +.site-footer .wordmark { + font-size: 16px; +} +.site-footer p { + font-size: 10px; + margin-top: 8px; +} +.site-footer > div:last-child { + display: flex; + gap: 24px; + font-size: 10px; +} +.site-footer > div:last-child > span { + color: var(--muted); +} +.skip-link { + position: fixed; + top: -70px; + left: 20px; + z-index: 99; + background: var(--green); + color: var(--on-accent); + padding: 10px 20px; +} +.skip-link:focus { + top: 10px; +} +.toast { + position: fixed; + bottom: 24px; + left: 50%; + transform: translate(-50%, 20px); + background: var(--green); + color: var(--on-accent); + padding: 10px 20px; + font-size: 13px; + border-radius: 5px; + opacity: 0; + pointer-events: none; + transition: + opacity 0.2s, + transform 0.2s; + z-index: 50; +} +.toast.visible { + opacity: 1; + transform: translate(-50%, 0); +} +/* Atlas and scientific reading views share the same spacing and type system. */ +.page-header { + padding-top: 65px; + padding-bottom: 40px; +} +.breadcrumbs { + display: flex; + flex-wrap: wrap; + gap: 10px; + font-size: 11px; + color: var(--muted); + margin-bottom: 29px; +} +.breadcrumbs a:hover { + text-decoration: underline; +} +.page-header .eyebrow { + margin-bottom: 18px; +} +.page-header h1 { + font-size: clamp(42px, 5vw, 65px); + max-width: 960px; + overflow-wrap: anywhere; +} +.page-header > p:not(.eyebrow) { + font-size: 15px; + max-width: 680px; + line-height: 1.8; + margin-top: 20px; +} +.atlas-controls { + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; + margin-top: 33px; +} +.atlas-search { + display: flex; + align-items: center; + gap: 12px; + border: 1px solid #42573b; + border-radius: 5px; + background: var(--surface); + padding: 12px 17px; + width: 420px; +} +.atlas-search input { + min-width: 0; + width: 100%; + border: 0; + background: transparent; + outline: none; + font-size: 13px; +} +.atlas-search:focus-within { + outline: 2px solid var(--green); + outline-offset: 2px; +} +.atlas-search input:focus-visible { + outline: none; +} +.result-count { + font-family: var(--mono); + font-size: 10px; + color: var(--muted); +} +.atlas-layout { + display: grid; + grid-template-columns: 180px 1fr; + gap: 40px; + padding-bottom: 80px; +} +.filters { + border-top: 1px solid var(--line); + padding-top: 21px; + align-self: start; + position: sticky; + top: 110px; +} +.filters .eyebrow { + margin-bottom: 13px; + color: var(--muted); +} +.filter-button { + display: flex; + justify-content: space-between; + align-items: center; + gap: 10px; + width: 100%; + padding: 10px 12px; + border: 0; + border-radius: 4px; + text-align: left; + background: transparent; + color: var(--muted); + font-size: 12px; + margin-block: 3px; +} +.filter-button[aria-pressed="true"] { + background: #2a3e26; + color: var(--green); +} +.filter-button:hover { + background: var(--pale); +} +.filter-button span:last-child { + font-family: var(--mono); + font-size: 9px; +} +.atlas-results { + border-top: 1px solid var(--line); +} +.atlas-row { + display: grid; + grid-template-columns: 1fr auto; + gap: 24px; + padding: 25px 20px; + border-bottom: 1px solid var(--line); + transition: background 0.2s; +} +.atlas-row:hover { + background: var(--pale); +} +.atlas-row h2 { + font-size: 21px; + letter-spacing: -0.04em; + line-height: 1.35; + overflow-wrap: anywhere; +} +.atlas-row p { + font-size: 12px; + margin-top: 8px; + max-width: 650px; +} +.atlas-row-meta { + display: flex; + gap: 15px; + margin-top: 13px; + font-family: var(--mono); + font-size: 9px; + color: var(--muted); +} +.atlas-row > span { + align-self: center; + font-size: 24px; +} +.empty-state { + padding: 60px 20px; +} +.empty-state h2 { + font-size: 30px; + margin-bottom: 14px; +} +.empty-state p { + font-size: 13px; +} +.empty-state button { + margin-top: 22px; +} +.reading-layout { + display: grid; + grid-template-columns: minmax(0, 1fr) 290px; + gap: 70px; + padding-bottom: 90px; +} +.reading-content { + min-width: 0; +} +.reading-section { + padding-block: 32px; + border-top: 1px solid var(--line); +} +.reading-section h2 { + font-size: 27px; + letter-spacing: -0.035em; + line-height: 1.2; + margin-bottom: 17px; +} +.reading-section > p { + font-size: 14px; + line-height: 1.85; + margin-block: 15px; + max-width: 730px; +} +.reading-section h3 { + font-size: 18px; + margin: 25px 0 13px; +} +.formula { + background: var(--pale); + padding: 27px; + border-left: 2px solid var(--green); + font-family: var(--serif); + font-size: 27px; + color: var(--green); + line-height: 1.5; + margin-block: 23px; +} +.formula small { + display: block; + font-family: var(--sans); + font-size: 11px; + color: var(--muted); + margin-top: 8px; +} +.reading-aside { + align-self: start; + position: sticky; + top: 112px; + background: var(--pale); + border: 1px solid var(--line); + border-radius: 6px; + padding: 25px; +} +.reading-aside .eyebrow { + color: var(--muted); +} +.metadata { + margin: 21px 0 24px; +} +.metadata > div { + padding-block: 13px; + border-bottom: 1px solid var(--line); +} +.metadata dt { + font-size: 10px; + color: var(--muted); + margin-bottom: 4px; +} +.metadata dd { + margin: 0; + font-size: 12px; + overflow-wrap: anywhere; +} +.reading-aside > a { + display: flex; + justify-content: space-between; + font-size: 12px; + margin-top: 15px; +} +.reading-aside > a:hover { + text-decoration: underline; +} +.reading-aside p { + font-size: 10px; + margin-top: 20px; + line-height: 1.8; +} +.variant-control { + display: flex; + flex-wrap: wrap; + gap: 13px; + align-items: center; + margin-top: 25px; + font-size: 11px; + color: var(--muted); +} +.variant-control select { + max-width: 100%; + padding: 10px; + border: 1px solid var(--line); + border-radius: 4px; + background: var(--surface); + color: var(--ink); + font-size: 11px; +} +.variant-tags { + display: flex; + flex-wrap: wrap; + gap: 6px; + margin-top: 18px; +} +.variant-tag { + border: 1px solid var(--line); + border-radius: 3px; + padding: 4px 8px; + font-family: var(--mono); + font-size: 9px; + color: var(--muted); +} +.relation-link { + display: block; + border: 1px solid var(--line); + border-radius: 5px; + padding: 17px; + margin-bottom: 10px; + background: var(--surface); + transition: border-color 0.2s; +} +.relation-link:hover { + border-color: #89a76e; +} +.relation-title { + display: flex; + align-items: center; + justify-content: space-between; + gap: 15px; + font-size: 13px; + font-weight: 500; +} +.relation-link p { + font-family: var(--mono); + font-size: 9px; + margin-top: 7px; + overflow-wrap: anywhere; +} +.relation-link .capability { + font-family: var(--sans); + font-size: 10px; +} +.schema-table { + width: 100%; + border-collapse: collapse; + font-size: 12px; +} +.schema-table th { + text-align: left; + font-size: 10px; + color: var(--muted); + font-weight: 400; + padding: 10px 10px 10px 0; + border-bottom: 1px solid var(--line); +} +.schema-table td { + padding: 13px 10px 13px 0; + vertical-align: top; + border-bottom: 1px solid var(--line); + overflow-wrap: anywhere; +} +.schema-table code { + font-size: 11px; + word-break: break-word; +} +.table-scroll { + overflow: auto; +} +.code-panel { + border: 1px solid var(--line); + background: var(--surface); + border-radius: 5px; + overflow: hidden; + margin-top: 20px; +} +.code-panel pre { + padding: 22px; +} +.evidence-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; + margin-top: 25px; +} +.evidence-item { + border: 1px solid var(--line); + border-radius: 5px; + padding: 20px; +} +.evidence-item h3 { + font-size: 14px; + margin: 12px 0 7px; +} +.evidence-item p { + font-size: 11px; + line-height: 1.8; +} +.evidence-item .eyebrow { + font-size: 8px; +} +.evidence-item a { + display: inline-block; + font-size: 11px; + margin-top: 12px; + text-decoration: underline; + text-underline-offset: 4px; +} +.demo-panel { + border: 1px solid var(--line); + background: var(--pale); + border-radius: 6px; + overflow: hidden; + margin-top: 25px; +} +.demo-toolbar { + padding: 16px 20px; + display: flex; + justify-content: space-between; + align-items: center; + gap: 15px; + border-bottom: 1px solid var(--line); + font-size: 11px; +} +.segmented { + display: flex; + background: #111c14; + padding: 3px; + border-radius: 5px; +} +.segmented button { + border: 0; + background: transparent; + border-radius: 3px; + padding: 7px 12px; + font-size: 10px; +} +.segmented button[aria-pressed="true"] { + background: var(--green); + color: var(--on-accent); + box-shadow: 0 1px 4px #00000020; +} +.demo-panel svg { + display: block; + max-height: 290px; + width: 100%; + padding: 20px; +} +.demo-caption { + display: flex; + justify-content: space-between; + align-items: center; + gap: 15px; + padding: 16px 20px; + border-top: 1px solid var(--line); + font-size: 11px; + color: var(--muted); +} +.demo-caption strong { + color: var(--green); + font-weight: 500; +} +.notice { + font-size: 11px; + line-height: 1.85; + color: var(--muted); + border-left: 2px solid #799461; + padding-left: 15px; + margin-top: 24px; +} +.reading-content details { + border-bottom: 1px solid var(--line); + padding-block: 15px; +} +.reading-content summary { + cursor: pointer; + font-size: 13px; + font-weight: 500; +} +.reading-content details p { + font-size: 12px; + line-height: 1.9; + padding-block: 15px; +} +.page-enter { + animation: page-enter 0.3s ease-out; +} +@keyframes page-enter { + from { + opacity: 0.5; + transform: translateY(6px); + } + to { + opacity: 1; + transform: translateY(0); + } +} +@media (min-width: 1600px) { + .hero { + min-height: 770px; + } + .hero h1 { + font-size: 91px; + } + .hero-graph { + height: 465px; + } +} +@media (max-width: 1100px) { + .wrap { + width: calc(100% - 64px); + } + .header-inner { + height: 74px; + } + .site-header nav { + gap: 20px; + } + .wordmark { + font-size: 17px; + } + .search-trigger kbd { + margin-left: 4px; + } + .hero { + gap: 18px; + min-height: 620px; + padding-block: 60px; + } + .hero h1 { + font-size: 66px; + } + .hero-graph { + height: 380px; + } + .hero-description { + font-size: 14px; + } + .hero-footnote { + font-size: 9px; + } + .hero-actions { + gap: 18px; + } + .graph-feature { + left: 2%; + right: 0; + padding: 14px; + } + .graph-feature strong { + font-size: 10px; + } + .section-heading { + gap: 50px; + } + .reading-layout { + gap: 35px; + grid-template-columns: minmax(0, 1fr) 260px; + } + .infrastructure-section { + gap: 35px; + } + .site-footer > div:last-child { + gap: 15px; + } +} +@media (max-width: 800px) { + .header-inner { + width: calc(100% - 40px); + gap: 14px; + flex-wrap: wrap; + height: auto; + min-height: 108px; + padding-block: 16px; + row-gap: 15px; + } + .site-header nav { + order: 3; + width: 100%; + justify-content: center; + gap: 35px; + font-size: 12px; + } + .search-trigger { + margin-left: auto; + } + .search-trigger kbd { + display: none; + } + .wrap { + width: calc(100% - 48px); + } + .hero { + grid-template-columns: 1fr; + padding-block: 50px 40px; + gap: 50px; + } + .hero h1 { + font-size: 74px; + } + .hero h1 br.desktop-break { + display: none; + } + .hero-description { + font-size: 15px; + } + .hero-copy { + max-width: 600px; + } + .hero-footnote { + font-size: 10px; + } + .atlas-visual { + margin: 0; + max-width: 600px; + width: 100%; + justify-self: center; + } + .hero-graph { + height: 360px; + } + .graph-feature { + left: 15%; + right: 0; + } + .stats-bar { + grid-template-columns: repeat(3, 1fr); + gap: 20px 0; + } + .stats-bar > p { + grid-column: 1/-1; + display: flex; + gap: 5px; + } + .stats-bar > p br { + display: none; + } + .stats-bar > div { + padding-left: 20px; + } + .stats-bar > div:nth-child(2) { + border: 0; + padding-left: 0; + } + .stats-bar > a { + display: none; + } + .section { + padding-block: 65px; + } + .section-heading { + grid-template-columns: 1fr; + gap: 25px; + margin-bottom: 30px; + } + .section-heading > p, + .section-heading > div > p:not(.eyebrow) { + max-width: 550px; + } + .problem-showcase { + grid-template-columns: 1fr; + } + .problem-card + .problem-card { + border-left: 0; + border-top: 1px solid var(--line); + } + .problem-card { + padding: 25px; + display: grid; + grid-template-columns: 1fr 130px; + gap: 0 15px; + } + .problem-card .eyebrow, + .problem-card h3, + .problem-card p { + grid-column: 1; + } + .problem-card h3 { + font-size: 23px; + margin-top: 12px; + } + .problem-card .mini-art { + grid-column: 2; + grid-row: 1/4; + height: 120px; + align-self: center; + margin: 0; + } + .problem-card p { + min-height: 0; + } + .card-bottom { + grid-column: 1/-1; + margin-top: 20px; + } + .research-section { + padding-block: 65px; + } + .research-cycle { + grid-template-columns: 1fr 1fr; + margin-top: 35px; + } + .research-cycle article { + padding: 24px !important; + } + .research-cycle article:nth-child(odd) { + padding-left: 0 !important; + border-left: 0; + } + .research-cycle article:nth-child(n + 3) { + border-top: 1px solid #3a513d; + } + .research-note { + flex-wrap: wrap; + } + .research-note p { + flex: 1; + font-size: 11px; + } + .research-note a { + width: 100%; + margin-left: 18px; + } + .featured-result { + grid-template-columns: 1fr; + } + .featured-copy { + padding: 30px; + } + .featured-copy p { + max-width: 480px; + } + .complement-art { + border-left: 0; + border-top: 1px solid var(--line); + min-height: 230px; + } + .complement-art svg { + max-width: 550px; + } + .infrastructure-section { + grid-template-columns: 1fr; + gap: 35px; + padding-block: 15px 65px; + } + .terminal { + max-width: 600px; + } + .site-footer { + flex-direction: column; + align-items: flex-start; + } + .site-footer > div:last-child { + flex-wrap: wrap; + gap: 22px; + } + .atlas-layout { + grid-template-columns: 1fr; + gap: 20px; + } + .filters { + position: static; + display: flex; + flex-wrap: wrap; + gap: 6px; + } + .filters .eyebrow { + width: 100%; + margin-bottom: 5px; + } + .filter-button { + width: auto; + gap: 15px; + font-size: 11px; + border: 1px solid var(--line); + } + .reading-layout { + grid-template-columns: 1fr; + } + .reading-aside { + position: static; + order: -1; + padding: 20px; + } + .metadata { + display: flex; + flex-wrap: wrap; + gap: 12px 30px; + margin: 10px 0; + } + .metadata > div { + border: 0; + padding-block: 4px; + } + .reading-aside > a { + display: inline-flex; + gap: 20px; + margin: 10px 20px 0 0; + } + .reading-aside p { + margin-top: 12px; + } + .page-header { + padding-top: 40px; + } + .page-header h1 { + font-size: 48px; + } + .page-header > p:not(.eyebrow) { + font-size: 14px; + } + .atlas-controls { + align-items: flex-start; + flex-direction: column; + gap: 12px; + } + .atlas-search { + width: 100%; + } + .atlas-row { + padding-inline: 5px; + } + .section-bottom { + font-size: 10px; + } + .section-bottom .text-link { + font-size: 11px; + } + .desktop-break { + display: none; + } + html { + scroll-padding-top: 135px; + } +} +@media (max-width: 420px) { + .wrap { + width: calc(100% - 36px); + } + .header-inner { + width: calc(100% - 32px); + } + .wordmark { + font-size: 16px; + gap: 7px; + } + .wordmark .project-logo { + width: 208px; + } + .site-header nav { + gap: 25px; + font-size: 11px; + } + .search-trigger { + padding: 7px; + } + .search-trigger > span { + display: none; + } + .hero h1 { + font-size: 61px; + } + .announcement { + font-size: 8px; + gap: 8px; + } + .hero-description { + font-size: 14px; + } + .hero-actions { + gap: 20px; + } + .button { + padding: 11px 16px; + font-size: 12px; + } + .hero-actions .text-link { + font-size: 12px; + } + .hero-footnote { + font-size: 8px; + } + .hero-graph { + height: 310px; + } + .graph-feature { + left: 0; + } + .stats-bar > div strong { + font-size: 28px; + } + .stats-bar > div span { + font-size: 9px; + } + .problem-card { + grid-template-columns: 1fr 85px; + padding: 22px; + } + .problem-card h3 { + font-size: 21px; + } + .problem-card p { + font-size: 11px; + } + .research-cycle article { + padding: 22px 16px !important; + } + .research-cycle h3 { + font-size: 16px; + } + .research-cycle p { + font-size: 11px; + } + .cycle-artifact { + font-size: 7px; + } + .evidence-grid { + grid-template-columns: 1fr; + } + .demo-toolbar { + flex-direction: column; + align-items: flex-start; + } + .demo-caption { + align-items: flex-start; + flex-direction: column; + gap: 4px; + } + .section-bottom { + flex-direction: column; + gap: 10px; + } + .page-header h1 { + font-size: 40px; + } + .variant-control select { + width: 100%; + } + .formula { + font-size: 23px; + padding: 20px; + } +} +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } + *, + *::before, + *::after { + animation: none !important; + transition: none !important; + } +} diff --git a/docs/website/assets/site.js b/docs/website/assets/site.js new file mode 100644 index 000000000..c5875c11a --- /dev/null +++ b/docs/website/assets/site.js @@ -0,0 +1,719 @@ +/* The site is a static client of the same registry exports as the book and paper. */ +(() => { + "use strict"; + const data = window.REDUCTIONS; + const main = document.querySelector("main"); + const homeHTML = main.innerHTML; + const baseTitle = "Problem Reductions"; + const repo = "https://github.com/CodingThrust/problem-reductions"; + const categories = { + graph: "Graph theory", + formula: "Logic & formulas", + set: "Set systems", + algebraic: "Algebra", + misc: "Other structures", + }; + const aliases = { + MIS: "MaximumIndependentSet", + MVC: "MinimumVertexCover", + SAT: "Satisfiability", + "3SAT": "KSatisfiability", + "3-SAT": "KSatisfiability", + }; + let filter = "all"; + let query = ""; + let toastTimer; + let focusSearchAfterNavigation = false; + const escape = (value) => + String(value ?? "").replace( + /[&<>"']/g, + (c) => + ({ + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + })[c], + ); + const nameOf = (name) => + data.schemas.find((s) => s.name === name)?.display_name || + name + .replace(/([a-z0-9])([A-Z])/g, "$1 $2") + .replace(/([A-Z])([A-Z][a-z])/g, "$1 $2"); + const variantKey = (node) => + Object.entries(node.variant) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([k, v]) => `${k}=${v}`) + .join(","); + const variantLabel = (node) => + Object.entries(node.variant) + .map(([k, v]) => `${k}: ${v}`) + .join(" · ") || "Default variant"; + const problemHref = (name, node) => + `#problem/${encodeURIComponent(name)}${node ? `?variant=${encodeURIComponent(variantKey(node))}` : ""}`; + const ruleHref = (edge) => + `#reduction/${encodeURIComponent(data.nodes[edge.source].name)}/${encodeURIComponent(data.nodes[edge.target].name)}?from=${encodeURIComponent(variantKey(data.nodes[edge.source]))}&to=${encodeURIComponent(variantKey(data.nodes[edge.target]))}`; + const schemaOf = (name) => data.schemas.find((s) => s.name === name); + const description = (name) => + schemaOf(name)?.description || + "Explore the registered variants, reduction contracts, and implementation of this computational problem."; + const apiHref = (path) => `./api/problemreductions/${path}`; + const moduleName = (edge) => edge.doc_path.split("/").at(-2); + const sourceHref = (edge) => `${repo}/blob/main/${edge.source_path}`; + const families = [...new Set(data.nodes.map((n) => n.name))].sort(); + const variantsOf = (name) => + data.nodes + .map((n, i) => ({ ...n, index: i })) + .filter((n) => n.name === name); + const edgesOf = (name) => + data.edges.filter( + (e) => + data.nodes[e.source].name === name || + data.nodes[e.target].name === name, + ); + const featuredEdge = data.edges.find( + (e) => + data.nodes[e.source].name === "MinimumVertexCover" && + data.nodes[e.target].name === "MaximumIndependentSet", + ); + + function notify(message) { + const toast = document.querySelector(".toast"); + toast.textContent = message; + toast.classList.add("visible"); + clearTimeout(toastTimer); + toastTimer = setTimeout(() => toast.classList.remove("visible"), 2800); + } + + function graphArt() { + const width = 630, + height = 430; + const highlights = { + MaximumIndependentSet: [310, 242, "Independent Set"], + MinimumVertexCover: [452, 155, "Vertex Cover"], + Satisfiability: [145, 162, "Satisfiability"], + KSatisfiability: [220, 74, "k-SAT"], + MaximumSetPacking: [449, 314, "Set Packing"], + QUBO: [158, 335, "QUBO"], + ILP: [330, 370, "ILP"], + Coloring: [92, 249, "Coloring"], + }; + const positions = {}; + families.forEach((name, i) => { + const angle = i * 2.39996323; + const radius = Math.sqrt((i + 1) / families.length); + positions[name] = highlights[name] || [ + 315 + Math.cos(angle) * radius * 287, + 218 + Math.sin(angle) * radius * 191, + ]; + }); + const seen = new Set(); + const lines = data.edges + .map((e) => { + const from = data.nodes[e.source].name, + to = data.nodes[e.target].name; + if (from === to) return ""; + const key = [from, to].sort().join("/"); + if (seen.has(key)) return ""; + seen.add(key); + const [x1, y1] = positions[from], + [x2, y2] = positions[to]; + const featured = + [from, to].includes("MinimumVertexCover") && + [from, to].includes("MaximumIndependentSet"); + return ``; + }) + .join(""); + const nodes = [...families] + .sort((a, b) => Number(!!highlights[a]) - Number(!!highlights[b])) + .map((name) => { + const [x, y] = positions[name]; + const isFocus = [ + "MaximumIndependentSet", + "MinimumVertexCover", + ].includes(name); + const label = highlights[name]?.[2]; + if (!label) + return `${escape(nameOf(name))}${label ? `${escape(label)}` : ""}`; + }) + .join(""); + return `${nodes}`; + } + + const cyclePoints = [ + [150, 35], + [231, 94], + [200, 190], + [100, 190], + [69, 94], + ]; + function cycleSVG(mode = "independent", labels = false) { + const selected = mode === "independent" ? [0, 2] : [1, 3, 4]; + return `${cyclePoints + .map(([x, y], i) => { + const next = cyclePoints[(i + 1) % cyclePoints.length]; + return ``; + }) + .join( + "", + )}${cyclePoints.map(([x, y], i) => `${labels ? `${i}` : ""}`).join("")}`; + } + + function complementArt() { + const graph = (offset, selected) => + `${cyclePoints.map(([x, y], i) => ``).join("")}${cyclePoints.map(([x, y], i) => ``).join("")}`; + return `${graph(15, [1, 3, 4])}${graph(305, [0, 2])}V ∖ SMinimum Vertex CoverMaximum Independent Set3 selected vertices2 selected vertices`; + } + + function miniArt(name) { + if (name === "MaximumIndependentSet") return cycleSVG(); + if (name === "Satisfiability") + return '(x₁ ∨ x₂ ∨ ¬x₃)(¬x₁ ∨ x₃ ∨ x₄)'; + return 'min xᵀQxx ∈ {0, 1}ⁿ'; + } + + function hydrateHome() { + document.querySelector("#hero-graph").innerHTML = graphArt(); + document.querySelector("#problem-showcase").innerHTML = [ + "MaximumIndependentSet", + "Satisfiability", + "QUBO", + ] + .filter((name) => families.includes(name)) + .map((name) => { + const variants = variantsOf(name); + return `${escape(categories[variants[0].category] || "COMPUTATIONAL PROBLEM").toUpperCase()}

${escape(nameOf(name))}

${escape(description(name))}.

${miniArt(name)}
${variants.length} variant${variants.length === 1 ? "" : "s"} · ${edgesOf(name).length} incident reductions
`; + }) + .join(""); + document.querySelector("#featured-art").innerHTML = complementArt(); + if (featuredEdge) { + document.querySelector("#featured-result-link").href = + ruleHref(featuredEdge); + document.querySelector(".graph-feature").href = ruleHref(featuredEdge); + } + } + + function atlasPage() { + main.innerHTML = /* HTML */ ` +
+ +
+
`; + renderResults(); + document + .querySelector("#atlas-search") + .addEventListener("input", (event) => { + query = event.target.value; + renderResults(); + }); + document.querySelectorAll("[data-filter]").forEach((button) => + button.addEventListener("click", () => { + filter = button.dataset.filter; + document + .querySelectorAll("[data-filter]") + .forEach((b) => b.setAttribute("aria-pressed", b === button)); + renderResults(); + }), + ); + } + + function renderResults() { + const search = query.trim().toLowerCase(); + const alias = aliases[query.trim().toUpperCase()] || ""; + const results = families.filter((name) => { + const schema = schemaOf(name); + return ( + (filter === "all" || variantsOf(name)[0].category === filter) && + (!search || + name === alias || + `${name} ${nameOf(name)} ${description(name)} ${(schema?.aliases || []).join(" ")}` + .toLowerCase() + .includes(search)) + ); + }); + document.querySelector(".result-count").textContent = + `${results.length} OF ${families.length} PROBLEM FAMILIES`; + document.querySelector("#atlas-results").innerHTML = results.length + ? results + .map((name) => { + const variants = variantsOf(name); + return `

${escape(nameOf(name))}

${escape(description(name))}

${escape(categories[variants[0].category] || variants[0].category)}${variants.length} variant${variants.length === 1 ? "" : "s"}${edgesOf(name).length} connections
`; + }) + .join("") + : `

No matching problems.

Try a broader term or explore another input structure.

`; + document.querySelector("#reset-search")?.addEventListener("click", () => { + query = ""; + filter = "all"; + atlasPage(); + document.querySelector("#atlas-search").focus(); + }); + } + + function relation(edge, currentIndex) { + const source = data.nodes[edge.source], + target = data.nodes[edge.target]; + const outgoing = edge.source === currentIndex; + const other = outgoing ? target : source; + return `
${outgoing ? "→ " : "← "}${escape(nameOf(other.name))}

${escape(variantLabel(other))}

${[edge.witness && "Witness recovery", edge.aggregate && "Aggregate value", edge.turing && "Turing reduction"].filter(Boolean).join(" · ") || "See reduction contract"}

`; + } + + function demoPanel() { + return `
Unit-weight example · five-vertex cycle
${cycleSVG("independent", true)}
No two selected vertices share an edge.Maximum size: 2
`; + } + + function bindDemo() { + document.querySelectorAll("[data-demo]").forEach((button) => + button.addEventListener("click", () => { + const mode = button.dataset.demo; + document + .querySelectorAll("[data-demo]") + .forEach((b) => b.setAttribute("aria-pressed", b === button)); + document.querySelector("#demo-graph").innerHTML = cycleSVG(mode, true); + document.querySelector("#demo-description").textContent = + mode === "independent" + ? "No two selected vertices share an edge." + : "Every edge touches a selected vertex."; + document.querySelector("#demo-value").textContent = + mode === "independent" ? "Maximum size: 2" : "Minimum size: 3"; + }), + ); + } + + function codePanel(command, label = "REPRODUCE IN YOUR TERMINAL") { + return `
${label}
${escape(command)}
`; + } + + function problemPage(name, params) { + const variants = variantsOf(name); + if (!variants.length) return notFound(); + const requested = params.get("variant"); + if ( + requested !== null && + !variants.some((n) => variantKey(n) === requested) + ) + return notFound(); + const node = + variants.find((n) => variantKey(n) === requested) || + variants.find( + (n) => n.variant.graph === "SimpleGraph" && n.variant.weight === "One", + ) || + variants[0]; + const schema = schemaOf(name); + const incoming = data.edges.filter((e) => e.target === node.index); + const outgoing = data.edges.filter((e) => e.source === node.index); + const mis = name === "MaximumIndependentSet"; + document.title = `${nameOf(name)} — ${baseTitle}`; + main.innerHTML = /* HTML */ ` +
+
+
+

+ ${mis ? "A simple question. A rich search space." : "The problem"} +

+ ${mis ? '

Given a graph G = (V, E), choose a set of vertices such that no two chosen vertices are adjacent. Maximize the total weight of the chosen vertices. With unit weights, this is the largest independent set.

maximize ∑ wᵥ xᵥsubject to xᵤ + xᵥ ≤ 1 for every edge (u, v), with xᵥ ∈ {0, 1}.
' : `

${escape(description(name))}. The fields below define the instance accepted by the implementation. Consult the paper for its mathematical definition and the API for its full contract.

`}${mis && node.variant.graph === "SimpleGraph" ? demoPanel() : ""} +
+
+

Connections for this variant

+

+ These are direct registered reductions for + ${escape(variantLabel(node))}. Changing the + variant can change which connections are available. +

+

+ Reduce this problem to + ${outgoing.length} +

+ ${outgoing.map((e) => relation(e, node.index)).join("") || '

No outgoing reduction is registered for this exact variant.

'} +

+ Reduce other problems here + ${incoming.length} +

+ ${incoming.map((e) => relation(e, node.index)).join("") || '

No incoming reduction is registered for this exact variant.

'} +
+
+

Instance structure

+ ${schema?.fields?.length ? `
${schema.fields.map((f) => ``).join("")}
FieldTypeMeaning
${escape(f.name)}${escape(f.type_name)}${escape(f.description)}
` : "

See the API reference for the instance schema.

"} +
+
+

Explore from your terminal

+ ${codePanel(`pred show ${name}`)} +

+ Install the CLI with + cargo install problemreductions-cli. The command + shows the problem catalog; reduction availability depends on the + selected variant. +

+
+
+ +
`; + document + .querySelector("#variant-select") + .addEventListener("change", (event) => { + const selected = variants.find( + (n) => variantKey(n) === event.target.value, + ); + location.hash = problemHref(name, selected); + }); + bindDemo(); + } + + function rulePage(sourceName, targetName, params) { + const edge = data.edges.find( + (e) => + data.nodes[e.source].name === sourceName && + data.nodes[e.target].name === targetName && + variantKey(data.nodes[e.source]) === (params.get("from") || "") && + variantKey(data.nodes[e.target]) === (params.get("to") || ""), + ); + if (!edge) return notFound(); + const source = data.nodes[edge.source], + target = data.nodes[edge.target]; + const complement = + ["MinimumVertexCover", "MaximumIndependentSet"].includes(sourceName) && + ["MinimumVertexCover", "MaximumIndependentSet"].includes(targetName) && + sourceName !== targetName; + const vcToMis = sourceName === "MinimumVertexCover"; + document.title = `${nameOf(sourceName)} → ${nameOf(targetName)} — ${baseTitle}`; + const capabilities = [ + edge.witness && "Witness recovery", + edge.aggregate && "Aggregate value", + edge.turing && "Turing reduction", + ] + .filter(Boolean) + .join(" · "); + const testCommand = edge.test_path + ? `cargo test --lib ${moduleName(edge)}` + : "cargo test --lib"; + main.innerHTML = /* HTML */ ` +
+
+
+

The construction

+ ${complement ? `

The target uses the same graph and vertex weights. ${vcToMis ? "Solve Maximum Independent Set on that graph, then take the complement of its vertex selection to recover a minimum vertex cover." : "Solve Minimum Vertex Cover on that graph, then take the complement of its vertex selection to recover a maximum independent set."}

S ↔ V ∖ SA set is independent exactly when its complement is a vertex cover.

For weighted instances, the two objective values sum to the total vertex weight. Maximizing the independent-set weight therefore minimizes the complementary cover weight.

${demoPanel()}` : `

This rule maps ${escape(nameOf(sourceName))} to ${escape(nameOf(targetName))}. The implementation and paper describe the mapping, its preconditions, and solution extraction.

Read the construction `} +
+
+

What the rule guarantees

+
+
+ SOURCE VARIANT +

${escape(nameOf(sourceName))}

+

${escape(variantLabel(source))}

+ Inspect source problem ↗ +
+
+ TARGET VARIANT +

${escape(nameOf(targetName))}

+

${escape(variantLabel(target))}

+ Inspect target problem ↗ +
+
+

Target size bounds

+
+ + + + + + + + + ${(edge.overhead || []).map((o) => ``).join("")} + +
Target parameterBound in source parameters
${escape(o.field)}${escape(o.formula)}
+
+

+ Registry overheads are asymptotic upper bounds. Read the + constructor for exact instance + sizes.${complement ? " This construction preserves the number of vertices and edges exactly." : ""} +

+
+
+

Follow the evidence

+

+ Implementation, mathematical reasoning, and test evidence are + distinct parts of the record. +

+
+
+ 01 / IMPLEMENTATION +

Executable Rust construction

+

+ Inspect the transformation and its extraction contract + directly. +

+ Read source ↗ +
+
+ 02 / MATHEMATICS +

Definitions and proof

+

+ Read the mathematical treatment in the project's compiled + paper. +

+ Open the paper ↗ +
+
+ 03 / REPRODUCIBILITY +

Inspect and run the tests

+

+ Tests exercise finite instances. This page does not report a + live test run. +

+ ${edge.test_path ? "Inspect test source" : "Browse the test suite"} + ↗ +
+
+ 04 / RESEARCH STATUS +

+ ${complement ? "Established mathematical result" : "Implemented in the library"} +

+

+ ${complement ? "This is a classical reduction, presented as an example of an inspectable result." : "Registration establishes implementation availability. It does not establish research novelty."} + Formal verification is not asserted. +

+
+
+ ${complement ? "
Why does complementation preserve optimality?

If S is independent, no edge has both endpoints in S, so every edge has an endpoint in V ∖ S. Conversely, if V ∖ S covers every edge, no edge can have both endpoints in S. Since w(S) + w(V ∖ S) = w(V), maximizing one objective minimizes the other.

" : ""} +
+
+

Reproduce the implementation checks

+

From a checkout of the repository:

+ ${codePanel(testCommand)} +

+ ${edge.test_path ? "The command filters library tests by the rule module." : "This rule uses shared test coverage; the command runs the library suite."} + Check the reported test count and results. Tests support the + implementation; they do not replace a general proof. +

+
+
+ +
`; + bindDemo(); + } + + function notFound() { + document.title = `Not found — ${baseTitle}`; + main.innerHTML = + '

RECORD NOT FOUND

This connection is not in the atlas.

The link may refer to a different registry version. Search the current atlas to find its available variants.

Explore the atlas →
'; + } + + function render() { + const hash = location.hash.slice(1) || "home"; + const [path, search = ""] = hash.split("?"); + let parts; + try { + parts = path.split("/").map(decodeURIComponent); + } catch { + notFound(); + return; + } + const params = new URLSearchParams(search); + const isHome = [ + "home", + "research", + "infrastructure", + "featured", + "connections", + "main", + ].includes(parts[0]); + document.title = `${baseTitle} — A new route through hard problems`; + if (isHome) { + main.innerHTML = homeHTML; + hydrateHome(); + } else if (parts[0] === "atlas") atlasPage(); + else if (parts[0] === "problem") problemPage(parts[1], params); + else if (parts[0] === "reduction") rulePage(parts[1], parts[2], params); + else notFound(); + document.querySelectorAll("[data-nav]").forEach((link) => { + const active = + link.dataset.nav === parts[0] || + (["problem", "reduction"].includes(parts[0]) && + link.dataset.nav === "atlas"); + if (active) link.setAttribute("aria-current", "page"); + else link.removeAttribute("aria-current"); + }); + main.classList.remove("page-enter"); + requestAnimationFrame(() => main.classList.add("page-enter")); + if (isHome && !["home", "main"].includes(parts[0])) + requestAnimationFrame(() => + document.getElementById(parts[0])?.scrollIntoView(), + ); + else window.scrollTo({ top: 0, behavior: "instant" }); + } + + function openSearch() { + if (location.hash !== "#atlas") { + focusSearchAfterNavigation = true; + location.hash = "atlas"; + } else document.querySelector("#atlas-search")?.focus(); + } + document + .querySelector(".search-trigger") + .addEventListener("click", openSearch); + document.addEventListener("keydown", (event) => { + const typing = + /INPUT|TEXTAREA|SELECT/.test(event.target.tagName) || + event.target.isContentEditable; + if ( + ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === "k") || + (event.key === "/" && !typing) + ) { + event.preventDefault(); + openSearch(); + } + }); + document.addEventListener("click", async (event) => { + const button = event.target.closest("[data-copy]"); + if (!button) return; + try { + await navigator.clipboard.writeText(button.dataset.copy); + notify("Command copied to clipboard"); + } catch { + notify("Select the command to copy it. Clipboard access is unavailable."); + } + }); + window.addEventListener("hashchange", () => { + render(); + if (focusSearchAfterNavigation) { + document.querySelector("#atlas-search")?.focus(); + focusSearchAfterNavigation = false; + } else { + main.focus({ preventScroll: true }); + } + }); + render(); +})(); diff --git a/docs/website/index.html b/docs/website/index.html new file mode 100644 index 000000000..f8e9dda7e --- /dev/null +++ b/docs/website/index.html @@ -0,0 +1,331 @@ + + + + + + + + + + + + Problem Reductions — A new route through hard problems + + + + + + + + + +
+
+
+ TOWARD AUTONOMOUS DISCOVERY + +

+ A new route
through + hard
+ problems.
+

+

+ An executable atlas of computational problems.
+ A foundation for AI agents to discover what connects them. +

+ +

+ Open source. + Executable mathematics. Inspectable evidence. +

+
+
+
+ THE REDUCTION ATLASPROBLEM OVERVIEW +
+
+
+ Implemented connectionsOpen atlas +
+ EXPLORE A REDUCTIONVertex Cover Independent + Set +
+
+
+

A growing body of
executable knowledge.

+
+ __PROBLEM_COUNT__Problem families +
+
+ __VARIANT_COUNT__Concrete variants +
+
+ __RULE_COUNT__Directed reductions +
+ Theory, constructions
& proofs +
+
+
+
+
+

01 / THE ATLAS

+

One problem.
Many possibilities.

+
+

+ A different formulation can unlock a different solver. Explore the + connections, understand their cost, and follow the construction all + the way to code. +

+
+
+
+ Graph theory, logic, set systems, algebra, and beyond.Browse all problems +
+
+
+
+
+
+

02 / THE RESEARCH ENGINE

+

Knowledge that
builds on itself.

+
+
+

+ Our ambition is a continuous research loop: agents choose useful + questions, construct reductions, search for counterexamples, and + turn surviving ideas into reusable mathematics. +

+ RESEARCH DIRECTION +
+
+
+
+ 01 +

Find the frontier

+

+ Identify missing solver access, costly constructions, and + opportunities to improve the atlas. +

+ QUESTION + BASELINE +
+
+ 02 +

Build a hypothesis

+

+ Explore the literature. Propose a mapping, its assumptions, and + the claims it must satisfy. +

+ CONSTRUCTION + PROOF +
+
+ 03 +

Try to break it

+

+ Challenge the construction with independent implementations and + adversarial examples. +

+ TESTS + COUNTEREXAMPLES +
+
+ 04 +

Grow the atlas

+

+ Review the evidence. Integrate useful results and use what was + learned to guide the next question. +

+ REUSABLE KNOWLEDGE +
+
+
+ +

+ Built today: agent-assisted implementation and + review workflows. Next frontier: autonomous + question selection and persistent experiment records. +

+ Explore agent workflows +
+
+
+ +
+
+

04 / OPEN INFRASTRUCTURE

+

Give your research
a place to start.

+

+ Use the atlas from your terminal. Connect an agent.
Build on + the same models and constructions. +

+ +
+
+
+ YOUR NEXT CONNECTION +
+
# Install the research toolkit
+$ cargo install problemreductions-cli
+
+# Explore a problem
+$ pred show MIS
+
+# Search for a route to a solver
+$ pred path MIS ILP
+ Connect your agent with MCP +
+
+
+ +
+ + + diff --git a/docs/website/preview.png b/docs/website/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..df6573d0e66005b686ff655dca877c38137b188c GIT binary patch literal 295229 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

j#~W;tGB+(qiwEKtd4BxPMXONRyTXKfZYL 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

*g;wH=zh27 z*c?%d2KAAhUb^|-_fI4vKXgsyENcXu#z$Ns_huKtZso(22z(fin&ri7A|#VsER>f; zA1>v5M?|-NF6|KWfb?XP=)1n>^L6@2v8xx{YsQs`e8H9G_pyKnkq?9r8x*T9clAQpZtparaj`)1SmzajR=#|KXSA@9!DNLsD#oXjM#J*MFzmH4$NvY^+& zi(TD@q+c&E?FM)|?Z4@I5%1q%vo_xm&Zyt9nLpzT==P}D0Tlt^Uk@T%gP4r@(2_-o zVthPp;nDpi0FVe?@g15^0q{7|n=b1tmVg>94tMmYhhXhsvgG0vgYP28dHl}fVZ~5z zjE(Mg+P3($wf#Q$BmlSP@$xwHi>P86(p@kZ)7hbliHj+3hHxmrD97B zLgaQKWM6^lC>Ixa1J*2ry$q>1Zb%rGFFVAG=*ju+5fA> zwcajn6m_TP=w0yhov^+}f2N_K<+$&98)=gMW=$NUW^WV|W|`mL-v8u7!0FB2Uzi{~ zj?YY;C3E{v-Vk41q~hA#(){vXK|t~R*z5JYh5BnznhZH*z8?aZ(q^Ns%ZMliiFzrf zyEdqye`yk-=1P@niS6m~Cz_Q+Y19+&7?c<@#W-+eJSc)@^Qps;Sg(q0R-?73Dw%1D z`%_d%Q~wS3j5GaV`-^@GJqVrg-TSv|C#rAvVFiOvc)U$^&9(x@ib*sVq?8g}#-i?` z4#!lK7!8s)Nx~^833uEif^ye%4XnuG;rzy7fM`fex!F;o^qWJ8lgeAq8e7t1JiC3lK@&@KmX=Fx!m>o5b@j!NHo;LZ$sdF3<7x!%+i}Ej< zofT6tC~$}ZFt%>?dUG{X{124v56a|R|0hXOazA?mir19*E>R`YckmFoBEgp&Q);nb zDKArTaW4JQ5oQD{CAnj~>i;sjq7S?y?0MhU=r}5xQ0#s##x(G_cTELQuT*6JI|255 zZc7sAb$b7D@mi7*H`|$BSTCGZTZpw5blQ^?boM04g8=j+zxQ7Ie6|t-ijPrGBYyvM zjF>%M3JiQnYeg8NN{q^U)2-Ah0~a{WXUk!F*Rh`~=#=ijTW$_!K?&1WH@{-qrzO8V zoAX`n~S{^5YU~Vt$9S(scb)5;KQrV-;X2@~jvAF^+ooD>_q7C~GKW%t_833xP z>j9r90uO;Nz4iSuJbv;ZMLgt#@RhOo2gdhrBcqfQxzmxbdOO@#AZU%bFBp0IHkHxP_bC-|nlyc)_X#Aq-wqNQBYAe- z|D!egu=sT{UB7+%WEIA~FfuwS=nlZV0nYTIMZGKLYwEw{(d)iYuFAw3Ndb@BdVxo_ zy>_=xh_{Y&!#5BIT-Se%adWJc{d=d(bSqLC*{^Zs)F&sZ1$^wR!`U;XfR|;w=DeQ` zr0>->a zGJiUJV;i+u%J+ER^Z0z9sLw{UYf4aG{a35FcWG-qOSX&jL%G&>xqvn&g2BOsa?Czh z{=i-QcR!EdsfQhs_rWYIyE1e(r$ulwqfRjPmnOju3!jkKt5J1&2L-?X8~)uT?mDa6 zW~8K2pRik+^j%kig1mHeah!gtv^mx8YL6?XfeSAIjhdAy9gjLe^wJ;mlQC;X`=O8g zFHoT^Ys?v|fgd|$<;S8%17#LNi|hXp-FvXp`doQ@}Nxp)7+#{-N2Enr^jl;NIYlM&KkT$b%=J3!; zn@(BM@%w4G_07 zsDj3N^o+=}!Aex$vd84}t6>5_7!?|~ImB(4RmUP$>&NIt?tN9FU1<+TCG=oaI3>ED z@rZKHIE;tzzumCmzqRMZUTPIFmmmJtS^r(hN4xurp9?FC-I&E>4cCD!o%*|WU*LSv z@Twl`p~EIAD5#sACEi6x$a~pMlr4iOx`a)oMWJ$zme%K6!Ff}Bo|zqS%nFE=L|=ZtTb$6?bm{e zLYwJP_k{efes(G7l!1WIn=r5p{qal;;8dhbh3ZT7PoB$5N% zqYY~^VtI}y+35(QpT|kJyFi>^{omtDMSWl%C83|^$#Z2mVyQ~rxXDRO6T*5hiU_=( ztxPK3X^0UD78r>gGaE{CuLdlo9Izx>J0RzeL}`M47^GNgRO#n5C;cuIH1uEGbB|r_ zaxU+mvARX~#~b{>_m{R_=Yt$a68O*oWPg`xEjm9?UMTzORSM``aOi9Fd`Qa&e5O0s zxp}@E-B@)EcC4%zzMRcS6g&G!?tTD9vhA=5@Bt$$J?p>PjN`c1_ZoO}!yieQK{xi+ zlKKnjXP?j4J0p7;?xIkNUB?>?=g#9+M?Qh;W8$R9YI^T|3k>k1m)jjaOoZ_3l=Avx zhQ9y{(Tx{m!Mpw()dzhh=`0AeAcA~Nfy}T4s7=?GX9@m%rUb&hU&y-G8Z2#_R&O_* zJ?T&CxowwH(i!wH($;#<`|k*5%XDmVVOh20dLf;)eB5|-nDG+eTfrfSIo+j}Lud#* z=3`co#0eHbSiE#`ocb zC-=B`MV~%d+W%wa=75hPdau*)Jeuw2^I%W2xV!puc~_)u>wSd~aDVamC!6!y2+CXZmywSmX@*b4<`BT7L{-3LR&3AS>I z|8H?Phgef4)r!ppy!3xs0QOLZ^{V82ij@gXH-z(mg}*?2c;y#WBxc0hyNy03!Q{C2 zXpl~F*2rRvqzXKmh0Bi5fHgciJ@*Y&Rsr7Go`YoJct_MI;6yaZjy2VLq2HCf;eOlP% zK%^k**MJvQIM~zV@11Y^a?A`C2hwt9yZ-(ZhFcv`K6Vyw(c)soyq6Qr-~R;FJEaID zjk7n~oL9&?;6bEGQU6LLU7XN=Xlc-qE9>;Df_crR?rP{X)11eDP>8(hfO)gDSk&f@ zfS?!R3#47sY)xz*b7}$Hvp@Ri|Lj^#!NzCX3s^6qW{@BvcXquBg%?-uh&#$d9CM8Dd&)}YI0n8p6lW> zeelaCK>7V-%inv5`?`=zv|Mw?oswo?s~y2`Aw)J1E)cU)g>6m@4G)Bdxw4dBqdqV3}Y-!?qzqCl}Ul{o8aS_ z?Coi*>0q8YfiCApV|eXZy`$qgALcID&-UZu1&kWN-U*PJ4fEamtST>y-t|mKGQPOF zZTJAL#@o?*O0vR6KJYHY>-cSSmv^tnpKprI99|3R(e)sO7IZc}Gl3yBKvU(n3ec*t zIsXbf+W`?&*~r9P^*e}FWk76(pTd19K52)}p-T2=%nRQzsKnMI21;>)Fkg?`W`W+SAn<`~AnpwO+3syxXAl$+K|B22^^^U2?YnOX-ZyjU*=k z<6DTGp7UbV4&Xj+#&>@M_%dgo=RRlo_tb_wUi@H{GJ9$-r}yn`r%$o~5|f_TPyo8v z?&zF+hVPDKE14m^0J@(vE%^rmh>KuaT)dDofhLEfKWzSuhtT`?vA<0pBH}U59k}8n z!E(=O1cPK-q!=OAv#r0Wg-f{e#)P*7Ob%$AxiAdEiP!pKSJDwm45GgDSTilC|#05POG%nuqsC5BlU&Mi|`ut zsc}@fMg>q_;yiasLY`?YpUyUZ%3{Tn37IgN$0dpuQ=&PEgMIfxQ{&-+A1o`Ztx+M) z{B5pS0#RxB#(EgJuLt&tWNV6@BD}WmhC1xUfW$a9k!_<2{$yp2;L*1 zj3w3PF00OsgV)9t3~fg2$1N2qQ3-4lH%k7~q_(~2Y%cI&p zKwU-}d?lFaC~t#IdDY*8`MS?hlP;?M9_rJrjs7S$>fQm(89PcUE!n1RzXTR7cX`*K zz-DEWNJ}1I2qv+MA0UIp*Q$^#Ls{?bn)2YA&-W3Qz3n}hN;yj(4|ov|RdKtF4BrD} zp5Wu&hOTsX0d9-ae2ynHftMfd0o0e9%DR+M-{Yt%#&&wI#w+`Kz&cmUJI-Z9w?>s-i(UoEEo3SK*+vogCj^DzH zpC-tGDn8L+@z2u=>z0wP*~kIYksF2${NQygb?1G1#m{}4oD#eyAR}Y41HF2z>ULq8 z+soqR+w*51C4<26YwAiju*{mVTew=)|A?2ctQ>+znqpqC(&=Laa^hyY=X)Fs@2R z|J#nBLLvMjcbto!yF;KsCbvs^P0iCw`x$2b@tr5gTU7XV*$O&@PX5+sCXjSzxJIKyPJM5?bFt`TRfpm*mobj;2Q2w{7Mg@N`=ccSXej9zRIbu z*}CnI?=A0a^BwH4t>A9#*J#>=l)+V95O%}*6@5LtO0KWjLAhrn^ zj~xh3YR&RdVD*=m?n{a;?V;XsgTt7cRo2`P$Ph#LOUvljUsiVgoFFf_8pN|g4pBizy7YW zq=_aZia%hK`Q30XgTF|=cx90 z$8X(F34UJn==wQqJh=m}=AP=WE9_#$=(K-IMQ6z|=zDqqhMWDa((;nglK@T z6QVzj^A@HByhfJ`lNEFyR(6u`Y$fqKMeG-IT>BjnvmgeA=KGFvl7 z3Wl_X(+!3&Crpv4>@cq(bi+|9>fX)z!NwE~CrL~(n*)S@c{CXDHhHr)<0-M|gw=5D zAJF0ej>sa5+6!>)VL+Kc*_Mie50}&W&L1-?tAxPEbm#!cvXzTxNCzQ5|7T}IizK_< zkN2doNRd3>=XT0`E4Q!q-;rYbl7b!ox3JKPkB9UzCyC!qnE88~$$Gb+nX#|GVVgfU z7r$9=*pVpUpuP=ApPEIOKZ1Ol|Mi&;@<}e(@Uns0OzaE8^}zD9b9xX!=}!0KOEKY) z2z2h3CiY99*TeQHb56;$(CaQa-)k@6C0@U67|S`gUN+>NXJ9s5HGkXXI-6woDD%1B z<2i6U`=?_jRt>!2%{R%S8wt_~)Xg7QjK+_Re@84~0 zfkZ>atY(qsBXl7#;T&OR7|o6tneBAhuCSpNu~r3M zXFmL&s&#>0Ah9IJd#=*|ZHxa-Yk%H7fAC=Dyzb*tmC;_W*LJvy9MiySTESMSl|-M81%JrvdN~ zBmb)KXJK}sBXU}hlLLt27@DnzfS*8)gg;0=el)2U`fF)1=3wj&MDS=N$=+S`{APGu zO@mP2X)z;##H+V(I7$c{HKK4?t+hMQdnrasD1%8RiDD4|;vy*|&19PF$*M;uV+l98E@CN{&gW z>NFx(_iw1I-Yc_WG^vv{T(F2-Q9nUW(jpMRVGDO8YsEt%90L)T5?qx%Ndc9WW$^f0 zY;OHoc!h2fq5Uj8FHr0?x-86U zCpuPiUAV|-VI&$3w^mrd42b`7P_}@j{@4TQBaB;=VC&1Vc|7+EBD9~lfZ(+)i2D(v zMP~=~Y1Go`_d5g?__5I29Gy()C8!#3c$8K(+9mYfZRrI*GbgG^1)K7{@2&$s?!Dvr zEmPNuM!myw69;-XIIapm1OcnnevH}~8dPW(3gNQ=aG6u$S57<*D+({%Lt~F8>jL4?-VY(b#nQo${axQ$m^tQ8dO|$hyYt_spCm6H|syu`X_OK^gKKEar z7ROuV@ErxhWb1z^87uMw_UxHu<%XHgzW zX6%i!nipnxtIQ^Z_;~`%zt<|fUH+_}L3oQapV}68b;1gqK)ANyP`((@2n1n*x*-vf zhy2W`E@K1Pv9#t^V}#}R+WGe5g+(|EaEXXQeT+E#g!Ou0x)V$;y8xSpR~}>YR1^Qx z0wVn1dt5VMM}640ezRfMz3rB|m_{v`$x$S=>-Ch^8!xQoVParuWHWSNy|^}~ar82C~1BlI{B17!X{;7E!>$6-H>Y!3q{wOa+F zlEG^>x++W{L7O7|<>NlhT)o2HIg3hS%dD(Bit8C%pJNnh6f#%AzSP0V2xc>5<8L1w zG=6<%a3=4h8RG6)qOB9666H$@ajVh`eQF@$)zqj2D^@d42KNtiS;=I}bRjr^8ro!6r-@$ZXMhSD12XnfRuXWczxdHTsapS^;B^AF&-iIft$m)|XXOd6x#0c0o4 zNEnPXM6RacX4ErUQzN}b&AH&oz)zCB_4**K5V30hneieVpVDy+_P z$P?9@n0mjLK?C>Oi50-%)=Hl5tFmkrG7wY~>@gpt<@-OM9%vFcPBz(Z-$%kT@O#co zH>$BTn+{&n)^T^bD}P9r*K^;m9)Swb7yu#QMkm(*P|2tl+N3-d#EDwDdW8V$dc3ZO zDczo0IWBrt&1PAQdAC-(eH#%yELv}vVicK%GCj5aqx%lBQGycjHYHz=hf23TFq%so zaf`rSorFdMgA%iqd0u{F1WjIcG*JGVi*3tvB*3%J8a{~pFQ{OR(Ybxgs>Q2S@yUyy zRdEBfRT$0Kv-tT1@a;wvkS|{Vg(2WI8>UT}<@;X0InQu=x8iqnbY_UI=G18$7d*dk zSpCUd{>3j9Ts>*Y*!?L(^+#~LZL^MhGe~H8lK|QIm&VTkNGE*3`4yiKrCR@;x5G)I z!zH&>lor}PT*$buQv3-`#fud08;_=OhhUY=*H=}|C7T*q7^N?3##b*ko$^Cp+4azc zg?r`fOb9m)-CG(22WmAg?{XY8keOCvW8FMZqIOxFJ&e+o@24oF+~qR{P8s(sj=EC( zw6I~Y@2L~4UR$VsU6TAvBj}Ij!e17` z*1v-qCo<4c&0}bSu?9GaDKKUhp(OBnGumcn^+%vojfVfRPqnuj@S!MhKVS%SKyKxG z&8KAWThV^m;YG(&E=&?0ys=KxL)rhi39fpb(J+j_?Lr|PkTf|WI<6KYw*{jYlx7eu zMHchzxwND|y=n&?yaIw7A|5P&3JH^VVosF}ih|-W6$g8TW$e@~6zXh04FCKAtjFgsEsIk;KjJL; zzI5HLPw*idbi0=)Nb^Eb6&DZIG5Xz85&|#Lf8qUo;jG!XyJ7@HCBZvY<@+5gy6&VUkinL9^P^E?@uNd| zfaiOD{rRxI!{eQSfYm4eFipgIbvK%C1IA^8$OtIY4NfHm0DR>ZC{QDL)-NPm`dDK( zx`B8`7t3bFtczL*atw(|G^x#31q*~!yM6Wgz$D8S0$jIzkZ{igT0z${!I zxi9eSdwpkO@KNWsx7SmChO*CHW~`huG#gQ>{DYSCkm>>HQ#B#%$_z}qjRf>htyw}( zP*w`4t!PjO6LgCE03qE#hX@5UGkwkcKg++J9m!D{SRrx4E<2Na^*=O~Tz~k9m6+cD zkm3RDj7;g_$lxZA#1TCBK)#CNZ@FC$9>m3Wy+rHemL&mQubk`m#N9vEG5v&gKEE{GzpfNtqK1k*=*we&P5&j3aL<`4X=h`nhw;o6Fjs-S-6I2Nw?}KPpy$2*(89 z(Hq66)TOTUDRNNpz;7Xxz|MKn$#I}{&{&@>m$ifGWF14(@z(g8jCUC8_2?0~M3uP6 zQX_fy@!_=sp;57Cqbe~b&}ZG-AF&v~r(!Ndir_&|sbrZTbtULrZT_aINP?1A9nR*48<2zL%VD50 zXE3*f*Zqomt?z)EdFr4%tS~(?Aqb;?sVWGl4v-uTp(Uj&oAb6KpPoFKAjWcvUElv- zmh$jXyvh-CB}ugur7~2qLJy!`74BnkM+FZ-^b{(TNJ9^|beqn(XWt}xvmuxa${Zfk zkxhzCt$c>Mjf0Bipr>Kk_%2ER>XX-Bh9NtAiq@_E6P}Doyk1FG`thgxx7FyncVT-7 zf3?37!$j5-2->}a4Q~R<>mAb0{d6jhLWuO&e+zh{%Aife+=YrD9cFzSAPs8u(-i%m znu_D{ow7Xk#;4rBzF;#oqRd7sX0cLj0UQntU??<6{b*Kot}iy3V zMqO1e?FWj$;piUZ*8xKR8}}3$Plo*R>ip~86U(mCazWtN&Rtde5NH$vnzB#Lp8F6m zCa-Zq3>L1IZ@=(|s(=#wsuqU)jz!zl2;<`Iy7t<3fXjsBD$G;g;XmeG+gKi$H{oBe z2Qq|#`_KJKh21fC&hMs@&$VRnZWHm>{rG@+*StTj83C!;+PR#J**abtEg4XZ zXt2TUdNii<-)8pAdUt&(=RG7O^I9+K1wEMZc?+0Ga`3JG&*=I2<$1VM#jH69>r>mR zjl2=neSdBZddID7{|J~`oCZ(?hD+j*J2GJ*WK3DGXpG_7BQ~wp>9r5owRL7W_izFJ zs9IKBWgb7h!G!{VBmxbAC)e3qp5}tk2C=SBEsGvZ1fHKw2MQF(w#b_R1mB|Esavj= z{aZ^@>&u?Gc{}d+A@n6(jxL_rSJWl9_jbt@o3(aZlb${MbOMc0>66HC16!8b`5;ZB z0FV}dZGM^KMw3X+fZjcnN}8P0QBKrdU|a}bg48QE#&#QC`)B;F(DjRb`(~T(`8L;D z9tl71^+7&-CmQPKtg(_dmwNKod}>DG>wLv*Y*c8_RG56N0U1lSDT{X3^UZ39+xU_B z4#+c9r1tyD^vpUVv*zkNf`H~T1=K!bM2C4 z81cIc4V)OrD44K#NKnI=VjCE1Iid?vsx*n-~lVvNh=!-|!EL z!88tjD7@irS+!LN6Z$KOoZ2#NAqOGFS)|Li;cZ7$Ysgs03gND6=}mCYQ56`Iw^bx} z-QJ~jqk%)u*y(iY^Ah(;=@Jn{rxZrCZ=1>%PeAh*UzkA!=o!dRl3)yVv-Lg0C*IP?g>^N68 z%vh3y_eF_z+@K}7?hYVuC5Gf>Xv7oSUwa@>5B_uGYk{IeKgNRyr)Yvd8;=vJm-q|# z84&8i7k+}*T2w6AG;YSGi`dUx&jeOVLZC35raJ3J<>LfolAJJ)X6WtqX^r|P;Yv=- zuBI{_=V8xoqxPaXFG0_TDO%dEjGS)3mm{&^WUj{rKZeE?&DjeOzxnF3c2P;r9kaU6 zHuQY$xxw2lsxHNGTEj$QaW=sYf^CkeE#r}Z(p5_rK#A1EedXpz(z_m@D?jyJuxW)L zp}}QqnL6=WVoHS7^Dnk1^uB~0HXS>{GO%|NEA7~9a>jq7j!-B+G78E+fe*8nv%ziEnz24{ zI~_Mbm)N;&O?T0wM&5E(YUG9u;p=>Mhc?9HcX7M~i?`cwk9YMMYu?S>*|cd|Mb8)M z1(P&FoFZB3#QAC`k0D2^X)*@(Md;g~e*o8nRU62;g_Bk{c23ROby|!wg z-<>lFG^Uc_{rove=JXn?JsPJSU}>vjq)dT@Y_5Qxqd3}p9pHOkg_7~T;YUtre?_%4 z_${3Bw?Ass8pIHXTf%k?#CNG`6zXGT_mYIUW_`MD$a2?&*y}h6II~&YQY1O^7VJ)u zFaci0YYCbfU=v=(0Gbn4CR!#bLGIQZnd|Q^2z1|cg!#r0JFpNwA{JW^fFu|w9$RBE)4a7DerGksOK?3rLu1d%8IE1)1IH{!JOS*t_# zKMxjsptVm}i)H*e;TL>a?(KN6ju*}9bArfV#$^_1gSr@C8H9H%t68!%QI&+;WX1x+ zw2YTUKo4zwjWO31n8>Fpp{;Wr|MRcTIpzmJKL*P`nmkA{ZO4$2VEqH^1c-KDTYv73O#2vQc zk%s$ty~(@%^ic1=x4q5qeYoR`I^&TQw@qm;axau|W9JJNSuWeY)@$OT&Jft;*SLqQ z+lquGpKGd(Ea2JXt|Kp-7fbyJ8`tw#st+begsnK%2v}$4Yov9aBLL_fImOe17aORF zrlsxjjY7dOVWrHgbC9SCv76&fV|LI&HiK{MET=A_WUP zyoLL`nuV#*Up$a;N3`fD)s8d z#&VqCSDK!#M*7%=TLtCL{E{QSoBnje^RtjCUf=?>?nZDnVO4A5D&)&E;Acgd5v8un zBBaPJ^(9zadLiNjX}V}P(EM`UJX2v-z_mzXj=%h#=jD~R6q5a8tarPCOAgHP>uSt3 z=oll;B^4`ArE&m!ny3){u&0VngIP0AE}AXYKx{?3`t^vT#2nyrr#5853YNOZo`iC6xI{W@uq1;C9oRCcqoiha1=0Wg zv$a4XF~6yf52iefoEnoB@<8Bw)-9hID8W6^*nljn*seAEb>*lz=(ABSf-+e8u|1$P z2>i^^pw^&zsj^*aj#y~x*ZLxRL|*%>kEmVr;N&$%_L;sQ@ZU=J71VuOcpe|%hOpb$ zO-2ksIQ-)7ezcmr@K8QbdygnrSZ7hteb*galjy&SI6P8pX1v~1eb1WA<*Jq}5Y z$7Om4py%y#@UY0R;HeH5y1?@y!b^x8ORvE2%?FVl3q~h(YtF74psx+7>-DJ!VU0Cj zuC`VW!{%(lS?T@1x9+^+(2$MZr&Rd#gDWDg<1$SzHL|T{|A8}sdbyiGN(H?H(L^YN z-L#dh2ET;zxEWdoiDk|R@t%jLaJ1}XT7giRQXbzX!lJeGo*YV=Sh%5}37lVL3)T-& zh>VRA-JYM7YxpY>4Rj5oi+kdIDw+jdWDt9h#LDEa4}utgU9sZ3-l=fpgW?|7!L~?3o?xTILpIMTo|U4+qHFE z)`Xa&gS3S8)J=~!Ob2XR39Phrs~vw21QemOmW{Nj`sJ8)7nOZE;sF|qersv+CRU}3 zU`Ysz>>k94rRgZzZIBBgT)N%lh9gB84=57H2-CsWj^XL%XpQ_c#YS(X8^M$KgHWS< z{HKc$1{0}#%eC6N0%4Z9cCFpR>b3A`fEpX6Iu?EKpziHt402bcg{z3LY=8t4nGl-8 zv=1>##_Mvmq(d-miCDH%A<2uIXYvhhX zxgE+UhVmLTjzN`^gg29=>{(CXa#T5KnFZTLDOu$fZ0FA>h#1l7l!qp_tK*Z20ky*ic2C+^aGS(9cMx zD})-p&hy)QuS{uVM`(aZ+xZ`d`r$~^ROEGHWw^To+pnsO*a>M)9xS)1@jFvIA{c-2 zj_Yqw`Ib3jLuvf^j3al)Zlv}F4PGjJjGySNw|9~q44(FG^>9Gy9fjlAX& z)9noB{(u&m0@xOg!}BWA1dqeqadI7{%&wpEoQmc3 z2~>E#daN9doj2r6(!ZdI5mDrO-ZfjRrWFi5fKLbI;H3BPe9^1f$`sW7Pbd<;t};AOC9A(kUERtzskV}sZ6orGS% z==%9i;nIZ52*8YwL{cNIpL9yqs(xxfn1v)B@P%Vip-+o?9{hm8)99tuj;nr$QY-ZyF?8 z%bOhEClvx?a0a71Sk6>$RavDLb&8C#3ve5h00jH<5nhEMJ6?;ZC+)U-_2mt z!ix836#{cpqL)@>aJ*z6>-A+?b-D8CpV*^%e8HC$W4!nF;@Y&k-r3KcG~ zJNDjfS9bo0ejVoB@Bzkqd+D>&SWW3jPKk&~T&hy5Chf*p*!JQ>Rkdt%Ag&T1tYYEJ zQ&CHoLDTDr1?wMh8sXGz*W%qZzZg=}R}t-tV(FdUuBLQI(PyG&iSum@swM|`Iv|m> z2<*q+st9{gUjH%yAW>9dM`WI7#H4z;npUT{AO=S$}0Fq+f#1ak3z1szotCbsNAEe)zRWU2k1 zz|jk3y|B|Kuj-|F<6s95Rq-=M)dKIgR299X&#N8Z*RYHFjV9BYQ4UZB#m+W=7g}~2 z?@h;twc$tDz9)_TAZLQT|J8snVgi)Tm1nf8!vO?d&80m4IDX4}@r!+w_HO%?zRJux z61SU$j$>kzv*C#kVf#%cLFMq(eT`h<4pA#3CS!5uFmnH9Vzjj$U~|WMVq17u%!az% zgNAMa+oKm8S&3km8Sh5_pjy%m3LWuiaSzH9lM8B2Z?Gi3j?A0Q{+d~&?|I&GHsa^A zku7tiAl|KUYi1vT=mum|bS7qmg(pSFi+D28pF!lj>sO3JWIb5hyRZ}Ei%x|<@jpT+ z!krLopGGz3=`X(pfFH!(;13L6-L8r0NcQPauaxB(fR*ioh2x^8Vv1!3GtBMwoms8X zdG+A1Bek`33IC46lU#r>^D1stsflt4Q09E?QnrP#9(6;UBs8=fZtXMdleX=3lRLJ{ zAOb`8fIc=iDDeG($%?avoyGH)sB?-~__f40Qh1S~+Mp`BGN;Q+>yOf0g+nl}kH#u? z<*%qF$YWuZ6gc&p0#*BYX5Lx_{vP`uLBXV~yxr2g-Y(dEl^V3f(=`n6c%saP(0jW0 z$G4kZ!$vIHk37xG`waog$~Zjs!4F=UXbR$b|r;CM9 zHW~KfkSWcL2$ym6>M~f)e^N*0YdEn!Z>Nc(Gh#948*7H`esi1HDVR`(iv5z+jQ7>N zKqrRQ2p+byTKv{DWiB%-r^OhtMF%C>fcf=l!ZopEL%jSMDdaVSa zw%g(H-VJqa>R?^>p*PrX3G%sGINEa0Rb{oaHA4r6Qna(iTz}8Jgsyuu({JR%@0UtK z*%L^4`_3ivCraV(zuB38a({;HF8>-KKx*-!jAV2NGdw3b3;kj^{5@#zwd&F4JWbmmL0L z_V2mTGKg+st^P&tC^QpU9I$FG+kD;`?Zfp@ySA^UiUd6Ga6e4b;o(Su#in&%T5*PH0K5Ji*SE3h! zy{qTw!Gi+f&8&Jyft~ppHVS$0s;9DsdG#d45Xv{s9nIEFQW-N*(6kiM!XZw7pg16t zZ?l4wb?@+l@-m|O9Qz{0(ti%iRvE8YL^yzfy@6zb6Q=}(xEI+8wr}j@#n_!2^Qop_ zOH3ED8TPIM%ehf;{252r9n`qUZ$5;(!%*%BQ8N*QOyLrL&M zhaz3MPO*Sd6n5xy%16k+dC9|1w!wS+U0kM;F`sQ|h@$dVuE_PVVqm-8aGT1|BUKgP z%`#^{D&zRXHi+nNT`aA~auZNbf|Ns>pP~I*r&8yZf`hW8xWe*-a~69|ttW%AQr&8& z0bXO6AyfxT{{55Z6S>up4;vaL$Yv!isV-pftc~3Yakgd>KjONixv}37xY=kLfg7xC zp5D<226U0gRVY`sOld$yidTQlN%s5;tyXRmH3>BbocAb;r5#liQ;CTZ%$!K$H`Cze z`>89?ZRVQwOTy+_$BKTCra{HW^|i3_Im5?B?y){KYD}nUa99lEXM%hNCycuX9qqzg zTAp`APRQ>j9BjxzT9bd37G=3rLdq5h2sen_Z<%qE^`pXgL``jvn_rH=lj2|-~ISJ{+##TYrWRm>4>Yq zFhs9mg96GtfJAGh=aAN-W_kwGt_-^>e&&N-lr^Qkglj-K%-e+gUwafk26z-m}&>~EX89qVJGoAzP3HJo!gJ+T^%W- zSLa0MUt77ycZR{8wFL1(>|H8hd?y}1xe@!Z@o5=GHM_pw^!DE_KFkO;XTwNAWc97r z%RFI9M^NJ33-IFq;j8~P>}8P2ZGpxzE-@5Kni21jas#ml?J7kytY4XTMFB4?_V;BtM6w&K`02PS z5-a*lW8+$#VK~~qDI(#z57JDu>LlcWxP}nJZsb}7YXrs+g%nO?Sy6`&>+eV*##j^L zaSbv@W_?WE&#H1fM?c3yu>i)b&&00djB8lhy8Yq}0uY8v|5m0Tr~IFH>1OEi;x9>H zu!4=(kw{Na+Utn_+8DMs=$8pPz6DXD<)FqO3|hJUp|JGZM@QMQM(ywZgL{A~)7uam zgre|_kNl3Yfb0rk2L04e+84iIGwCWwnC#suuH6eCITyd!t_v{a$FV43MDe-BNo(+= zM|ObffH~8oOI+N4g)*GJ}cw&l~9Jm=`m4NQ!JANf52&(-?tLz}UXu#fptMq&J z%kz>shkBHTCLhHE7KVA+_hov8DQ=6bQJh+~W=~$X8y}kW@%(;N+a7o9Zi}nID7h|^ zLoi-6)_#Z5-Uw%BQzr=-X92YJA8UgmA~c};OOCei56OtRz$#tKbQo$B z|5U%HoDc$!Mpylth|l?cIRF^I!pKOQ+hf|41uw(zgSJoD`Sv)>-Ef^Y+V`l0DzplK z7+%WBx#&H`%9^`mFbvr5bxen98Ar0gtHhimKSy#DyzdHmP_$eSAyf-AQMoT>0foRy z?tbCBC1Lpy%5rizpc56aMeH1Wv(G@shi6RbK*Kzy`WM+0E!HcjZ*fctuLCmQx-oNK zX+rjaUBdw5`ABNY1HtZ=Z6~gel|>sZazCQQl#163kRLWh%Pwh*FN(y#p;C?-`b8bu zHBB@h%F+L#E<OJL|s9>VPN+L|y`|nX9{1 z$M^xG-U>%^e z60D!A^;&ZgqEs!QX;^&!ZLjG4?~A&{tkLt@2l7QPG>zu5nR62zCs{C;t#q3ndWgw` z9@1oO>KrT#FW!UZrL-rJ3X%&O>gjyq){s+Y2(#oIBl{YpfFq{Zxw{-Js1 z7B^wo=c~e*t-_EY(2{d_%2h&LDO>S({2>&4Pa^MW`({i?v*UDRzjXbwC%o3(*%<|o zMaJdja#3}X^&+@BDteEYfO*}3g)m$ddoq5C1%5s0##fMcO{c+va`d|e3m!$Ns2E7w zwo5l$Uhy}F0gF4|KbY7^LWlBTb{;I(2K>aioQ)yh$c`X~5fqu^bG*%GQfj~8LY8!j zt}k(b>NV1vw}C|Y%9Pv8<<9oumUA>hrEhTX@Z4*{*lVn*B`x|MmrYUQ=%w?wq@d55 zsBtX+_0JCx;fLKGkkuvMyvwmpQjSkc<+bkXju3o(1`>$+vcm#!_dazQ-j1{5`C?OZ z+=4}7avrz)IPF#RCr?L1U)GiXQt5NT2JBLF>OCL=Chx&z1n+uAZ6f&Bcf9qvJFTFp zQt$!^7B{P3=(Fl?oGhbLfH?=;a`b1uhcjLxUg}P zY!E~+(dgz-a#KF<21x@NW}|*%P6xM3Ub0s}LCZKPLZ9yP@+Tde&}KgT+xe|@-@GcDCVZg&2pB=d!us&Z!FhQhNtfE64j0L%0 zDBZs3C|1s@?ONRC0-a#(n2j%JReK0yf!AH{Qw70c{0)5^ zt6svT$ds?wkO4@W%y<^XRof+w_%r<>UzLvMOp#LKwNX@WWdrxVW)@nfs#mHOA6tT& zWLh>>ex(=7^`K#>cZQEAvag6E14SXgR>tvj&`U{Kltmhr8}1#tD3!hs35+Np_eU5w zXHX#AEX)Jh(+5#V$3#n)Zw6>aO2nlcuxB{~-<`|Hyi<`VTA;Z0WQPwJA!Hv_X)WUz zAq9q?P~)x;#b_IYtq3S=r5ZuXvZ!8L5U705qoqfI-PbRZJfbx>i_g`4;Eabut+fIv z)96n*#0=&ter+Vc`UJg%NFO3(#ZMA&E739V895%U?Wz{$anIE~uh=Fvjd>1RJ*TyV zTFOh;7Mhg>{#jJO9R)+Yy4&d-JXN0E+F6nihyZK0g*>gOx9xBRlVua}tohJG=27e( z7&IV-X>l0P;}Wc(_q%kLYdabUcVzYDN8RACEV_ z3e?x!m~B1m2V~2?$kj}j(nTR#kkY@DS|HC5X{LLfx)#~!oOBEJfJaDM&85N`(CFPk za#!!ycJBv((Mvh#wQ+9`R=B`pbMm3|$Dq##E?kJ%5Y_0p;TyqFanz*s$3f4>`QY<^ z4xl#U*6n78FesG8u$(pFxbMhT z8Ybmu5vENZBi?GYk`2GP@ZnQami;XYPqmP`bHWzdeSa9P3n4D}1O%Xx4K^Tl9!L;< zrr#K&OxP?D5DjzeMAQ^{FMl~&?V`mAK~I(8!3%{faDTRC?;!sahChQDt{eRkYXIwt z_$`Ft3(MfoKZx~Q*|7_vOatq|yKP^I#L69m*5wOljrsHKRgBE|U}5K9qn-*{B?uXk z5K0%Vajdvm_Y8C6nmMQo4&@5z3Nf;)`3sjsE{@{x3~+nyq_JkY)}V|Fu79;Hy<%lA z<&t6>V8*gKQCniZC=e0k|1~=&kv^4nq2CiT(bcCj?A6vzJ=7KD z6)r~^LS7ByrNV^Yc-D_)jh=#7lN+`aXO0W@A{;MJE2`>S22$n$kGZ}X|!X%?tY5!U$V`wrJUUyMH&ncJ(b;p%>&#-=z5a=c)?4ZK}ebXt?M7) z9TPzaG1wO=cWpMT0>XWwW|CnDOVp$w{Zue@^(mvsd^oAQ#AO)`T+{^z_>)HZVnpR5 zQ6&ulLl&|!F1jKA%()7vG_&=v24{}U1lNba=hS{nMc~8Dv>)593RyiNQhd>cME%J| z5T+kebBo%3zzKNtgpa`$kQ5;f{pI~#t?2GHp^qz+VAvg1)WjUKjl=^}_B*$ux80xi zkt4lvPUc_T8-zNHS6>zIJ9LGKy*@Ro&*fQ8v51bpC0{P4;m^b=31@6v2tBd)OdPV`VoX=#tsdQ11)W(Q&@NDR_V zU|EWDV!G14{^GD3$Ph!~W8p3I&$DmxZRT;$cIC9*z0A-4wf|SRMfC0P7Lb0+_snct z+sM1w1~M+aQ?=14R;EJ`z4AKG`D9cri^bP1L+!aG;Q89de#L3=;ds?@nJk6mKXJz2 z6Lzrmqhi*^s6Dy#^4f3zyI{58tHZ(dB@=yYov-od1-RX8Ofl~>|7>jbi@y}#ed>jgTrNa0!8R;FWkP2-RlB0 z0jm~PPsPx^q6=iw34Ffc`ooP6RkXb-f`z#GZpGTa&>HZhsM3<4_x+nyel7HF7D24z zml{cmc0QwMU3dHfh$AL}7Phy-lzgsM*rDYmRd)bj`(w79lMp53R^dTS<(e!vw90sv z0dsg3^$l=HuMLJ%TaPodJZ@eFw)xCmvd9B>sF86umjKfFQe+{|^!OOjC->|54)llm z=VY~769|5H?@7p(wT*3N42<~5DesbMfCcAH)lhm%o^zMcPW|FJbM9V@6r^0+ia=nV zo8apS=RinXubdkk3V#Mz$wd_Mh9$s`M5ZrJ!6@{Awd^UUC*swhvPMQSzVZ1Wljr#?DKYzXjbKo7kTpwDv&fL) zdr{b+O*ZTbD?x&?v0I`)1*Ah+xP=4;TIs>ofU226$B;=J<6s;8A$3i?HZgTskQ)3^ zo#;q(;$@I4MIJ66Bi9m?bl7DZ%s+QDO*yV&OsKLpgpNk^@Za^kie?>fH-?VBKiWsB zZ7ze8>J()ZWN~ZkIdr{2&o$rv7vJvQ6NLMmepD=4QzzH0+7jA<3+Gm7cy;emYd$^Dg3U}#-#93|c?v577KLk;kAZ8KkCN>8k(ERHPOFJ`B8uQy_qCg3 zdrRL-C13`Jh_{Bwb{U+7BYJ<^>4Il$o^obNTr`BqV07>~W~k(zzaJgyun)Lc{@gLR zH2SI9RvbDd=cz!0epj1G6X#mK(IzZ%csd-M*lDB|w&rgf@r@3l`y zblnnvIS!Qf^bHt_-y-V))jjp>kp_T}(gTUiZ&8BR<(*}aNhZavbMv7&p}5aCPhft> zqZyqsCj79!K}XAk3h%XdeMk$DcJzqmkM^!w=x&S-#LFSkBd2lxTn|x$IZ5s3^z558 zSM%z;YW={Q7Wu)ZWtbEBT1-+_rCZSjs|%@rKPV)l^2=(WgB?%ke&+jApp6qfMSjZW z@900L5f@=ijMcwlRVQzQ44vzwn|~=OL1Y#0L-`y7fBr!YU8rt)V2XQ9vk2UKv9(Nt z>_ql{MCHGY9Z!K#R+QXWApDOdWH)u!7vgvGoW*ess- zL>nJlb72qcF9+6Z1zw?}BRktsvDI11Qt%=&_n@$DbZ5|lcAKi12KlhxhrqMp3HXw6 zJe(TYYmaADf!Vl%x@2gKr#|HH$rM4YiyL#)nZ9tAz|P2^3pAE+T8*Y1vIAN@MWCMX zW4eg@vV6b+f3g(l{)0xf&ZQYK9-^H5%qB2)KJ@UkNpt4+j~Wd*A_X&I@N%q$k8F#2 zujcay0)Z$@s&L-83_K(OEIjn)HrFDWE#n$#kwpbKVbdo*vs!>O>IBUOfXK$gy4xMS ztT(xDTZ`^{|I)c%a=%@ z*69(zI!2qGP|1(dbt`CuxQ?s#3)~C-$I1P(y zl+k*Dwnh|f` z-PfGZ=~2UPzfS3S0wd#nQ;nVse5MO&;@k#6EZ%LjDFQy;#R=D#qTN2keNH=(lZMoY z<($%BJRz??;1jr@gp(G^ zKb-84=qr=S`;*JptzWey>eme!u3M!qh?5o+wV{AL+@woiIg*pH&yr_|l}eX77WYC; z`K#C6lNq&Q!)+g?mDU5drPfb4Sy(`4;7s54LzcI2tL&##+P8l3gP|C2+$olzAUL^D zcIMaK2zVu~4s9Z7jOAKXg8}<|9(9;%cW*n@q+nW{FQ|i)Q<3%GgD$1cHOqYfeP#Q= z`mz$0#H=0a!c|vJU_XyxY=sw`6*u<251fuS~I9< zsncn^KEv3`Ihv;MUonkYvPL*yyZPT|u%`m(Vx^{O&~Z=Af6ylc(OKEiVI3qFW9+V9P>hf^db(!DCRzKvYPO8aTJ;XW`XE-8he1<`R5wtN zV4DNtZ<_p(PP9i4Xwkv{E&4!>$b0X;inIf4Ex6b{Xj2wS1-$OS7GT?{62l`9R}-gw zk2BfLOoiehqMnuEM(O*FVkS<|rC9_OI-k9XQ!7T_l+_r4iCC($WTzG1PmO$yAg7h> ze6}NKgGT_Y?{-E-T07cVf$P9?DL#=)qH<}i`bw@Aa(ZH*73?MU+UxZaW}q){$2JQ( z(2%f+zHKUY`HfmR&*aeIZ@P^BZS6A8pEVnOGr0AI6K67bVJ4g^utWu*v4QeTG*O`^8og!J(%ppzFIFs(N4sf6gtjY4B7pt`l*X2+`$p{NJyP|kJ5p) zoARS(f6qXexI88A*zNq)S?s?V{yQT9;dcGcLWh7`JmH(F^`7MECm$4qQFC^WO+Tf0 zaU68qyyxYB&rqZH)X7?LO~4@~>1T)Cdh_E7b@me9kAN$ytVc|WPMkP-~=jxgYzganDC_573) zUa5v9Z4;S?hEi{e!MCHa7B^a7Qt7vRZvX8-L;My9dF^B+e;7N?ww+zp z==E-ZqPK17O<_$W!^Y$^S~JF9BJxtAv02JwBH0FZLfE^}Q+g&@vI=!n z{?L67tTu8_IbxDoRqVJzSe(G%iZ88Em{ z=m<5AVO@2iu&HZPB@;`h7Nx2$!5|6M~{da$BlW0uU z00edu1qC$R`a*c0yieglIMn{+Qeik^h{2+O==qqHDgB9MI&}CI=CL37f*C1qXZH!E zefXf0FxlS88s%d=<#)Xu88sl+tJpMSrWI{r68n#>Pp32<1~UA8Sb^Vb0%JG1hhTOT z5?MtmT)E~iNiHI38@EhtnVPvTl(j#Hd(XG1w7)>ySc=?TikFlLN?0!p^_(-)x*w0M zM4n{NsShfv&o}`Yp1Lk`czk@_Lp@n(MeTf#ZE_S>1<3`huMOI;8mCP%DjAHAcP_=K zl6ETs5B{eGP=)`U{`Z7xsy<{}u3ur1H0#^W+H4cJm@VA6lA4bk>&-`YfY*pUs79`) zT9KM9`&YGjkJ6ZDCs((Fhe|gnoi_WF(=2a82+SP$`7=ZfB@N~DSss#ARTkX(Nfhh< z+&$n6j)z|+G-~n~UhKc+U_J7AQ0m+P`@TKuWmH4XqGo+85$F{Pb-LAnCi?1*(T@RT zG|a-aa-IxPeLdOxYWk?l(b65}F@y{{U~q@+bsIypl>;YXXioxzjiZV9?M1+>JMzP< z0NQv?-~oS=69QQ&e$`l)+uK|^c&yK@th_&y+kxj=#6rX;}tnYKO!rJsNZ{p=0WB#EW=(en3j~`~f2Q zl6YQF+^J!w^M^_o-qxY{eJ3wrU8@s|rxSebH36H#ckh@a(IOx;5B-m%%lt%{E8fPJ zJ02#;iXalF6?;j;zzAHW&|CL@{hNcFb9_doz>G4%GpMsc&7^05UxAH9qlZ_VJ4Vpg z!wQcX*yqH3#v;~F7ZLLvRTaj3OBcj^B%08jK-h>0nl&Jm2?LpFAahntjB*;i>5XTt zBRz6p-=#?H&~hc0=JE894(rh$pNbI8D^+KPR~*{vHdV?-8c9`!)~FW0b#@IGx?}*Ogk_!x7(WN}Nspa>=|jM7pwf zjp!iZhuB%8A1j-!Ajj)R?xw4d%3qgmVC%Mw_|=~)VI2`wno2+8RJic%D@>Cn6Nj=f zUl~f=X#Z`n2tg(?cxD~x{>#+8a_7~@oBuO*I9THw#jhDMfdaNAJl0jiafsvrMycBr zar|YWlT2cU^BFgTu{8+7=;m$)x>)I7PddaTgk~Yqqn0ViaQ1OSd)O;URxNyIi-e7V z>nqNx%q!$BR5=CMkWlO?#k30C`==p53LsUk3`YWW2$nx!K+wna<-!72JFA*aEk?`&-k5Yn z3dXevF{Wb0y`y)nVH64%YR6&m1b-7_PuTI|7Wj@|>EnZ;!&vIJYqs8rSx{OjYhaRX zI}zEs)GB}TJ?;%x-@bwjUM=FHR7J^Cc#Dgo5D)>?8!71CzsS?>LN=Z^`u_TsyP>$m z=#6>44R(i;MGlf)?zjEqi`q^(M`iyJJ4R#@r>i8Cu}pLP_o9z_T(_SyIe59mqf~c1 zW={LQssVvW3;;l)kjHr3r{Lf2l)4EAls@bYu~%OarhVV>7V@WuF3MaLT-a9KC# zJ(fowL=*4|UK^C$unWUxJr5b|y}-e~zE^tY?+VoOS=;yjw$?jeHEIqt=u_i~guKD& zwbS`hJY2l=v@|WPfvV0_P*A_xLYx~0k&ZAUVeWU8v?@+qT5<`Lz6Dc%v!6 z&wuR8(9lS+;x3_4r^9Oz!sO;Vw(97`Y{+~RSfGEQ%I`Q_Z91`5owYR-|Hff8DRR&+ z@6~sM*b1S{A4oKVqo?>_tO`TUj`J9njpY*#;S7FqqhF%mRCXlCODQ4Ha{8D&68v62 z_uuT-=xLAy-Iq;LjNl5VD45jyw@-xag&(6FD#lQJooXpnJV?S=;1->Ey5R_% z0#s)$oHw~d+tkUPmCGoR2(j7#b?r!^X%XfGhvQjgI@U3DBIF+grsO2(`RE;1tO`VP z#DcCp(tAf`Uy)lU@+**(qov61^s{c@vbB3l z*etT-p;#th&BO^hw}&K$GV^&k`k!}mfOSTj*B=PcsK6pJqo@^VO> z(DUj?PTJNYGH}dJHV`t=eGiS@R|Vje;m6Q2V36hjC$T*YJg#(Ru^d^yHcqZ&`|Fw0 zskA<;Jso;6`UUR`dhG;-Cyl1epPqEBj*PI@Jmmei$%AAth!9|gV|lh5FS)dywrs(g ze83AH=z99|I!_dtiHSLA7;Jfa;>Su4QGZJweP45UcaQH4@3?MzLh}cCuzdA$TGV*! zdE7P%R{WEZlatBc)!Dgs>j?)ZzTW(!ebavEXT**04WKj9u%A`93?N~4>gsLBL=Y!w zEXexT>o$)}S>`p#NUAL(Uhw2hZsaz9KcgvgAi4YLA!^0|OGDos4S5P4`Oy zmV@8NL)C(^XgVUW(ThbVe4$p~UQU&=zt7%1=R{2^?j~Lnzvk&YG_!!Piag+a&>(mB zi6=|AQ&*s>^>}d}VR8mkLsChUK)oaoAzI$u!-S0cbJ3U>mTXv|N_~W#%_*`&4WK(2 zBjh;Gc?y)$))(=L8w}JMH{)n6Y&BaNr%c3I7uS_bQgE0~(np>;*UaoiXrAwOVPj=# z226{PA>jVV#bb)rRZi(E7aF0k}a-^hWLJJ>kouJqO+GD9tjE=fZkCD5uX> zdc0nOv#9KU?zbQ<`7?j2HwlP!rr>-mP@P{$X5;hqKpg@0CF$4Qoj|lR`QYP4&f&-DMiCy8ad#?zG<-NoZ z9nG`nhO(`Q^c*;6C)UIT@xQMNYFhjz(fS;&?s8PO$x`mG-4VccE#opp*$5d=GB_Tj0tO!~W5frBYL~p)$ z%ia_H%8ndDU-;KXiWH_&8gkBc^49(n-fNw6W;A|!{va- z%+Q)jb0w4(cZ^ISTC$}=RzhV}uUgSoS>o||mc=mkZ>2VmbZPoyJ!kuUZ@@i1^>BO; zXr)?9X(?IJbKcUBiOx?SNfq>$Pd*<(Sk`~KJJmY&NrMEwp0CVs1g>=E38;83j7HY{`wS#J}1@={dUhUCQhnG zCQgnROndC|UJNgl+W9Vc>Xl4VanW&HT+epWU1{ehnEbv^hc8V3ef*H(+n<-$oj{uH z>XY#!7=)*+o|m4U&nA}j%SR;p%2}(h@Gwt0X4U^z0xLgYihB_8^Fa^jcp9`ZP0LO0 z-Q_?0c-iUgkTz;@-MT+T`Zn7_&rLpLdi$TmAMl|SuvI8)hgK)g&gVsPU!@6%7kpjG z@z{d(o9|GYKx?|#SjV5O9lb#bCF2z&&VyK92l<`?YBsw93RKJef$~qIdEb`mpt(D| zJ`#n5he0nLPlPeA>g;d3ARn7^mzHb6;KBy@T)BrWBhTdb&qvVJ9ISNd{11DPctRmB z*DF(iXLVliriqHJAZ#w4$bEnVQ;uK#t*tlW_Ujom_}wpNv7@lQSR|}^jm}Ccp=eHG zJc?1J4fij^M&s-Cd0cTuk^EK+kW5eR(yMdD!PwbpMwb04<8(Ylq^GLi3Bl1z2p*Ad z#5)IA5YHhM(FuT11>OT+Z$@XD^Yvd;Kg}Ok5Y>mkfxFg_wtWWTY&Zuz5kU0x(^TgK+7OIzfUnL5 zy?$?|w_>IVr~V+5$S0uHtwz(W;mHxUq0VUNi$vx-Uwpl#u~_0T9c{W8i6b+E>!m3y zkPIC%xyp<)cgt{WZaIqnB4!d%@E20gR%ZqJUQxwbtJ9Gk`7Lm6M_)OD_V|>QO|VJz z@C%<*e)lGfpE7-llpShmn@|KanII{5k;aGuWC_(pgY3E+kMt#E7 z%BMDk$s#E{ntaD7InhjBuVQ!s*m-u^GrBSCPP#>Q2zr)eWib z#wr)9M&XISe43=I>uVyb*1{C1Lsj|JJWsAH?LStC6E$uZ28(G*)kQH~8yVK>^>_kIo4{y7 ztmY(k>o;@7VS;X`k0> z+a?*8CU&V15VFS2SqU{Q3M*NnX(z}MTV!F`8&so>isek|zZNfXjM**6n0gkxho>mH zmZaP5D|kjex6Il$i>ns>CT{xid#iSQaBJ83?;yp2niO}&1`oE5tg!=bczIJD(LX2# ztqB}UrAo%!ICVhQA;KSBPvJEALn>9JV|-Wa2Jk7x@q|j$wjo=Ud&9OOVQOb_#I&&X z){^|iR_z0cV$;>Po|k(ro@?5p@hAVwFERMhXSxXGEPmikAm^@JY4f#&r@PO(iT1Ug z?~4otIy&fP77d_IKh!{$_gbUmQN^@I4!WNv^;u*vV&ms8XcfN;_?!lD5yWPF<4w5U z^Z@B?J??{U649Pca(z?^7Ojo$_V8|BMFQSs;=xkD_WNacd|qp-ei$j@YTMHsk|PY9 zz?Znc7(Lk$K^Gks=kNhfG+r)GEhHhO2_h*RifccYyKig!AFm#j{Ba zqxOfXYPFpYOOcmL%>)FzU+{k$X0h`#z>#2Vzf*amDMVg)-{3+Gr`vu?0fZ%DS5!Ns z!QzF~M~7HkIzK;V>V_}8i;%JfIOBJ)XCAJp3W8cp8dB|1hCWXE3R&h=+0;zNPcYuBlJ$|!F`T@LO#|s zU;KiccSj>v?s0UV$Wat8 zR=|;o`3L)(Z1cCM5Nf0ZREBvQvNN!S++xI&DVq*enCr^9KHHR{5{X(VOo&9I`!7t5 zxu=Q}QU=%2!N*V2qEr*0OsT9)%^PD8ve5`@0Utx}W{U%u#y_0OFBA~(CbuNllNMpc zK1?+))=u=oZyShM{1u#F$_LiI#GoO=q{QU9a4lQQEmHOv&#D5Ea#V(E*7p`Nv+*e9 zWHqf%wWk;{O$v4%FP9xu09?xS6KureQ1ObIh1pQhMl-h9%BXT?wiG@2%FKrhm$Q%% z&K={XoTnwI%#F?{MI?2b13W9a4tzD)I8?`y=4+Kdn9(VD;{t{J{fpO0Kg!d)KKxp& zilR7x4K~}KXOvHy{)QQX$iGhS3DTkew51vh%?NIPJIy94!2yqpc5448Cjzd=AIkQ*Y+8)NlArcY)47dcedAFg+`Bf2H$A z?>RBxd05GJFF9+qRi7F3N%}rp>hLkmQ158;w#H)*dh{^7FUVrHt~oqRC4Gy`1MBog zPaM}i*I>~;is75!mrd7sr0(}(LSf+QwBJ4HCtZ4nqx=mi#c3I;-O~y^7}U`q!$PscURO<2}GQJ&xYst`IIX-&Jk^Y3_$J&;Wn*H>bwH7-xXZ|Tvq`;_NXHmM7z(_z?AyOoGIB4QGW@;ob!2Ix- zGTn?>ub1RleLC9XY0fq9WpWt{$zevY8w|B zZB`%Y;=gm_H{e<;Jq{&BrL+Nq)+I?DXQXV{d}MP|6FBsE!ikKN%I-Ikzgq=~9r_`9 zxI-VVEB=MCZ{rq6X(VwPTlB7s05Onw9CH=y!DXb2uVUABI$kX(coi0O>Q*gKYL@O= zMWIMK61lJ~E#TCS+s0y#~8Z2M5RFBFT$YGV43;&+2IcWJaQt5jklH`D%yvHM`OEuM

    |$$$P(`Ug!s25DyfR8442UCTIgN-HVez>EZX)YI@P&uFYkihc_Frr< zy5Xu332DJy&82oVF5v%Baf-zESnw+hCTnbg9fA+{L1=!@ls%s|JAL%nGFT)aK! z^|e0ky9qV5E}!P6@m=T~MFl^|aPSp-qhaYjv^KoV+weG6Q*uC0ud@Mp>BzR( znw&ist6!e}fr10kkiLe>6jzX5s_{DC+~Zs?e;^(hsPu=9d1;{>efxGD3mq zzFf3!37ZPTs}KE#;~XkC^xcPXhzK`G=p~Ls0AQV5U59S{ZFWGBydMKxi8{bHWJrr_D>V{MQdodL2I5P zRj-YUUKLi*NgSjVs-Y@<5Y)kR0x#VkT*Jta%4|}OZ9~KRiNs=rIPb2}0yMja{gN>8 zVBQ^xdt^PfIuG7F2DvI#+x$bYZEz-LGgGEsvDjAjqsHllShrBKN_9+!Q2DFUmKzMq z$H=2Gw@R-ZKF#mYGF#KRQJC-(ja~Ne=I7_M5aZt&p4~WE^9j6o%8k+tj*!;JLn%3i z3?b&KUoqQ%);s&DfohRz&%U(b{-_**$H-uz7Sih@x#XeZZJ(9+6L^8pPNr zC_}9t&$rUgqb!4cIc=_I7FVh>4|A5{MUaTFB8g_*y-KvW@ zB9DTwQFhddKDBL32!d+4rpQ1~wwXD9q3#-mX3E?I_GIix%HxtCQ&f@PeuJLrI*ae6 z{|d@KG$?B&m4YJ;!U#n?rneid3zt#fX=3w(&WFh?@c|_Axq1>7+2eJ;=oOTWz&?afU$IhHD_DMgT zmuoz^H@kf*KawSsa@rf|bI(g56oCclMvL8(iO{8>gBIcDTqb^RtJlMtuI}MJC8CV3 zhy511*Ew)456*T1VUN{SlIqwplJR~8p569S@b{6pj_$kXJ6ChcU8ju`ZGIe*Ew(^=mEaf$K3%Jg=(KlA66NF#b46)M&%a{1)q#rkU0+-v17Sjg4ZQkb zA#N&Bv24}pj4BKo4K>=4zaKNcIvXJU|OM8 znRE4FWyC02L#B$$S+~=0_jnz|Tqy;_8N(5-5;BJzRkvM|!k$y9zTkn)P!y5ignU2WB01j&%dcp$&Cx1K>@8HJSD7RSl zhF)hrg_8=P6q4gXLK=h|$_+)$B9|&N9gjOZLNeQz7}pW@`ASEl5}_)QQ*Wq4lu=>cdr*VN0}ngb_1P~_&rh=0bJCRQ0u}5s z9=%65UrdW}Zm2wn_vD^_X9sU4XbaSo4easJ*AXI?XSeD1C*#A08T?5wHn;sJ-%;9^ z>gXFs_ViU8uwv*4W-kea(i@i43o!eg{-*`Vrt%Kn{>%))o5y}|6qb_>V0<-%~I1p-7uMpe5dxZ%-~kJ5joU3E0QX?sX0T=aDMD6`&O8; zqMWLbTsDZEMR!wpT+!_ezg__?oyhW72-AI zoh;tH1w02_bpoqh^2{5COr4Ue49&gf3Ab<318yz5Xh@X470jN@?BuW7YU+2|t~Wmn zkiKT+y}cYu{8nj!A{xfd!bK>r@qMj+`k0G%{dny2LG^u}wl@IrNeU1R)_iUWEVoFg z$@UHWXS_8>CAp8BsooPBwf`SjyX;VyctGlVL&{!$MP_ab?o66%32?r-m1nHz#};yEYDj`XFR$s>sv}NQ*IuK;pnHboWn?9xCKJ|lq9*1! zjiRwa_N&eJ&R&S;n_B>MWR-pL-d+=1Cr58js4E@sQRKuhp`DmXF9*gjId7b{%zLMx z_?5Ut79GxIL071n$(6C*BXan0p{P?Ee^19AYQ825pCp0 z|9-^nDj(!zA`=&x;Y{a+!v*w$%3o$fi@B){y%%tRRefvxF}x-bN(@I?Pc z9gqN8FNbi+;s z6(fu2`M;ih!3~gZyHAEWvBguGIe~BXsnja6gMGcNE&A2eTA`+W1Hn5pzYbJJ#bB6w zCV5U!?QVGmajD1I=5OD*YF3=)37<#u|P{Cva4YzYH*|)5^cyE_JB|vx_-S)aq!WBLskc+BA*7^welrW z`C5pZ&xvsi#gq+AHX;^%P%&PO(kR^1F8^N7z~A^Eq-X>KOg%-XvlG+cbJJzT{p{-f z*Zz^!odY$O{QJ7ikguZ`bw8=AXUpP5xS=(BUJnHVCxOG7%p=z$KRqBHZ)Egpa3(cN z(3rj94Q?F~2e%%-;8ZAI|Q|wr$(4$#&CJ(`0M1H5rp_ z+qRo*PMB=>U+>TF{@#y!)V8f_t@AvN*K6OglF{FxR!w=#&_P{OL`knuShpwQ3@-&= zyILvRdK2d=C+x!p<0;w>AkE&i(2@>@hHZ!uKOedq#twC{Y+c5S-uXSkGHJ522{y44 zJ`ai;RWCF<1daU|avFfsftMV2#;c#-hqm8!s$YZUV|9kT?-UP8h(s5vwL9-o`-vNoE2lngiqNDs02&LINne{U(5`=Df-;@*L{=y_9yi`NVF z-Q*Q1qTPy|u8fkE9IsD;b&-R)^MA&zk3Apv%`x@Nm)-Ad+3bGrzqU5(bVfi*pSRn- zb?%Nz;gG58OK8ji8-B~`pEoVW=F$Y`qd~sH+MN2+8~iEQOT?|O{(EYN+4dqvRZG6N zzx?EXb}QSMy4~-Syg2>hr;elWd(kKP%=q=b)>~Wi?woC98YTQlvc2UaFb2c{JXv^A z?xk%jcK5K*L{eFfpwqH*)><}>{=oSrgCH{MD2?% zVPn{p@tAuE8~sqA8Z8>MHK3vW04pZ>3G;$*Wv% zr?v2PLzuG4@_Vv@W#aoEi|JgVbTr~*xqU=DHs6=qtP0KM`y`WYu%ZS!n^7$f-nwO{ z4TdgozA!3PU4sUpgDWtt>$NkT(+w<2p^OOCEobX;)owx8ylkCJVCfK;jh;{$q_7aj z(VAHwlPF?7RBh*Lb9)0v0JwJNZk;b_!qQUuS<>-hC33-OaXd#+eZ;4t=~^gg;tyJk zhMn9)7*4}sl{WH#i`5`4X9)^ZJ!i5SP)m!=GG=VnE4M~oTgr)PernMQvk4O>tMbGSOe-u?dB>37=w)v$tQ#ef_aO5M@Rw%3BzKNdNcTBaF#PKTe2+`zn) z#fhyQ+>qHejn1=JD^>2tY+b#D_ty_|+(j&>qIAm?w@ps6d>D=LDJWNqqWnDUk~tf$ zi&kF+GcM$sR5|Q}T56Ne!S3DURV(rhPmy@%%K3cm$kLSlDxhYpmsz|M9tKd&C=LjO zerP((c?QNVt{%T=z%K9g^IOo6ok4%eIe0#yBWC*+}BBu zn$FQX7vU0ul{&fV!1{SI(Ll|gby1vQ#LCZ3h>lK(3x^ym?$g>CSb4L3!(MY3M(oR( z+$QmrHSftqo6XWR=d&W&`Ck?03{DgC& z8=+PL^QCfixB~*>Z=R>UZ(gVqC!Imld1GKMkXKyY2@s9}4|ODOr~lS3dae8R;RtD6 zdp95Vs=`RJ6BO!zw7Nyi28o9KY_mAhlaJ3ODFr4U1#!inAK&0(1qHe4g~I(Z()G^r z2TB)Bjned(aOl@-i1yQt3ymtK2z8B6K3dN3GKJb1)zPIJXmikXqfw$?kABtk5;|Ht ze4NcC-^USXa5pGne$n5iVP_tPTMnYRN znJ1WR4}kY;(t!N#Y#k4)LEB>N$l^P+1%&sx0>E)Dqe5=}OYS$b2vx?F`<}Hs8Wb!N zc79SSfDIb*)|I!$wMu}J#pz%ntX%TpXeAQLz;$bb=d#48FOm?X9phMwvW}i?4cJZmw<(u6wOlhfvswQY_0SvQ^(y8MV{xN2yd<_r?wNI~`_hKvc5I zsk*<#cN6R#3E(&4Xsp6uxO8Kjl#YpAonLPtfmrWcYPSJifb??*(08vkPL?lP?!Hi} z*sa|&JMepdoB3F)@pUM$uUI@)Vrl2gIH#EZZ{Pj1?WX_h%T6#$eHyKKwc<%k%GKxv zi1%@Ww~yjx-<R7 z)V=NL{3BIg#$(j`2HgFn!?B&=84U&p=3iK6Pd>a(^9A)0eL1IFlN+?gRscSMh4?_d&!-t$_eo zWnrh0ym8&dv2oY;7Zc?I-!ID=$5Qwh?U~`E`iBjm)yj4z@bIhcTf8K z1YB}VS_IMZBu15Y8&g#aJ!Vag%}P6S88}yHX~Am;`3vsI_KA@CDGRS#<<8@wma{~j zj(^QGraTGP&Pz?V?M$_*h%{1N=*%m}PU4PatG-jXi9$b3#Oz{0Y)1r`-|?$-h+7F- z{g36*HA^*t2?e&k7_th1A~HGTh0Vh#`)9LuQ2??kXGX-RCyu?t0;H}3b(@^Ev-e%y z_uQL<>b%s>YXjTMp3n0cvvd`#TJPDc;|3=(H7r&X=pa{JL+lG&w^Zm(WVwJ-fX}yC z$F_txqc)0}d+SB0e!+tz19L>nl{(e(M3=^^-P_Dh&|%W_HEJ_BHKd}YLwCQUmatHm4&VF#=HlKx?m2tphbJW{XX`EQ<{m)JM6hr3 zdQ+fa?nq7``G3#8=NCDv$v;~bdkB&K8z=q!8o0^=SIT!<8WmvTox7^U8*nLLQVTp* ze0@OzvdKptW4R|GzW+B1;M;CpxuAC-CpGQG9j%pF9wUZOJjB9v3>sX+!$#F((@%Oe zYreT%g_)c=GVJPh`b6u7hzojtALu`{NW>+{0>d&n6_K$x)nFL)E4*%K<;vZ%ZI@UkVc{ovg`%N0~ZfM8n;w9u>!I1lWJj(CY^GL4-RVo z@uzJ>77SHF4WF~$=Y1;8@_l_V$TsU11x+VT5hk>hcj)E&l^RtylP74cV&Tq^reRReit04G6wNC(~oW z;T`rG_0c+-U*<9p%wTal1nHlVC%}2kDA1c(Cy)y>I%p~eoJc@{sqfCMq28o-Q)aEH z&UI1MPj&;Mg&b{5P|&(M9Z@oU?Es1fY9U}~j*>2GCS8PU5xn67HsHdzGC^Y zVS!{0sD`UO&1U543ZfSMe7V4i%Z#mYnybwZw|~@}%ShAHgtD-_t8F5j9tzL1L2-xm@@)%V{)GWOyXgG-Ekqu zHkdkaF>Wp_n5b+8Nc8hScLJD)1Rev|#i-`%(8UeGk-nzI^M6LHL}A;qJk`@H!gjhmyGocNkbtQo1e)_p?qjXN<%YIB74t@d{r{U0j8)Ckyz zRQo^qY>B)DZLgOKo!7j-*jLwF)Zs-)E^XaV*l!)L!;<(|Sy*WO_lx=O-JjndRC!e( z%}j-Co(KW=U5pD1tC$i*uCtTY@j0XhG66H%ml{y2{4!LEJl$c=oGkXra zsF(ZUJj-=kQ*`1iTshmg>p?8g(!ZFwhbU=2(g~Iyf^oUUzt2#R_adm%!NZmi!Nv@T z)iSHoXTzQ*AwnQQuI%6!XX|=At%qg5ZPksc5teFIaJl3cS!ouj)Jt1reD`!i{t!3$ z)f!&i(lG^gdF+G^@PqgrgnL_m3?fwYKBy1?*9$m^%UpeWc+>tm`{s<53Lz+>tRIc| zPne-C#0nhl$HYO&=dVBC?&# z(QyC;D;i9MWw%m0lMBzFR897>i!#Vp(~}@Oz2PFmBqmVPB~#w*R@i z`}s6tUy{HVg~?BuS}JKz9lvaXx~lkNHJ*rU+Pkk3%3?|{%(CE|4i`9WxRKxF1ydJ= zT%okFt&RF*p1)HNho}Kag4)Ppb5JS%lslMV#(K1A;}6AHx%iUk&HBK!qJ?WpB15Gw zXT)Z2KKHZkATj%nTz_d$-m4hiYqfd{v($Cy`-W zc;dLHbc`NH1~YAjeCebjV~IwEAz8=74;gy{Hr#n?M5A0DfCwEyB>vuO;*@Bxtz8`^ zdd*7Qh*lDeQgKmuvdtM@NJo;D@N>s1u)` zb6(S9x`kYh(~rcm=Kg=Le0b$~!LmoI)h8QS33D|}N!pQcSW+}&Iq(T^KJuimkSw$& zkbW$^NDHu)@WBzXMFkV5RT7aO_o{tY6V4}0bez)dkvKqHTzM^P9 zKQXIdIV*S0dJ6_qviuj%0qhOzE5&+{3cOxCJvn}oc#=5=bjF{-=!AGAW`o^od)oPH zMvpObEGE9He7th&@AUn7OW29{S)pwJhF=q1gI?2Q60!Ds6CzqXT!eU&0rY*|%DoM! z1ZIeDLu+FJXozynDf4JgYhN7*bde(kG=RmJ>uAy^of|PQ!U&Ff6=_Cle%2BkGkA^g zPeqe7p1`l|%12ueJsI>`l;()zRZSD>LVOnJbMJ2lM1WDlTK0tnkhKhaP5$LMqfIOm zK)7^KmsUybk4=lnJ@S_w(YkCEDkUg?E}GDG5DJ#&EmGR~Z&-j1RRc8$km-_kZmV|Vt-9KzaJac6}=4_5}AS$n3GV@--}I`^Qq zTOzd zmTc14YJKDO5XA;4J)rO>9@Je)2JOj4H>qE;Y~p&3MEzp!4P>Is)zP;s7MqPZA~kbK z7Q&y!aCHsyUD!I&Qx!cf_QqRUf+-}ZnX`2?Wdpct^TB*|Q4E{yxb2_k{*f&o^wc8Y zj*b6Cz;z_oA<)t-4=pfC&X+pSi8kjo98Ikgn#uix;UGFuPs>#%JPnP)fII1<`{lO; z7GtCy(@G0sefvdj5Ch^*Cum2hVCgPG8oV|Kto3d|nZj+U|K9Kr?5wD3#}x(_^Cw$2 z+<@p?vG{`V;E)FU0r)EriCYVy@yHIkK4S1iB@eu9pi&-kl3~)uWHb&J!fes2(Opfe+ z=ZTL-uk~4|{3AKpw)DU8v-s;$cJ*;#kHJPMCLvKLqJg7t!z*;+7I>v}+xyP?z2fM#8hj?Asd1|k;1Ca!X5}|mFl9KDYtq9JP4_<#iIq`j%<&wX zpSMeMbDb)2LNac*`$2ipqKz#`;enDjl(5U8`%9A;q*57(l$r6XinYoHUOS%-y|+KM zQYWSs1|}l(MchUp-HG)4$lHkEXJoj4Q6-LIvr84TB%iAwJ-^Lz{)mDv?)(6U*VHi> zzOwNt5JVJK9&z?cWad5X>(#Qz*P#gOkL+z>wbPN3P4c1xN@e%0hEtN$FgUD4CEHu{ zUI+y=kv$6pxU7h7j5he5#$f04 zDQnI)Hy)yzd9DpXhk<)vOL4YB6-*o+NI^VtYNMgZt$y%e){JL5*hwa{ES~LvI>GVd zs{qV_2$`J*KG%MaiIn+VE%&j1D5|OYiTKEa71r;dRBJs+Sx2ru7!d96OroY>p2_Majr4+J;|!LGCPU2mo4S{Xs|MWJkbN7{H$3P7 z*bRLVX~4x0qLciC;6OnO!MMhz$Hz#;`IkfQ-ll-(xHq%@%Xrc0PA~~?371v*Q2C-M zQ1A!mn-yiZBuj?=KDd^@cc=!<9*qh9u=v}4rOJwyKODYc(~9%N|2V&VRF_;7qC%-* z3KNTs$P=cw6RNi%3IZcp4SCA{njaflgRk3L_Vj}R0%1~%qWd^Gy=hcD->6K$2OH2C z-TKc}&M16i*D+4tHXX`St%sk}#6cd>N_6^(D(Xt79jYrU-5^?DoP+=lJ#e9jJmXWP zwrI7W*k?XhU>S;RJisgE&@EP?5h084v&D;nJYDLP3}PMzl0eaGlK8Q8z!Ey=hl^gi zTRabpHsZ%Oy0&hMQ_qQ!RSLW=qetM}+y&6L0AehAu;l((X}%uXW}r^g137iHj}QCZ zZO==wzL7Tdrp!Igm*L8M3SlYm*xcA>Dt3B(_D#;XTsIm7mq z_Z>X^aJcCu{5>L!BJ6UrlE{%6OAw+}!E8sU8zkqTbU5!>Ox>cqW~H!%hH)5*np_Ui z&}}gNLDoWBwPxc)U}Hqf9JC%K+ZAyriDHt2tiGF%o!Z%$;{w36xU{K;St@WoQW+Wx z_`VotzXB^H;DKi#)r$I7fQjYHVrgNiob?;%HgrBK*{_82hylQ-Ppafoj`9CK9xqPN zlAQRc>F0RFSy&=gXqtTUQnl5(2!}iFk_W;z25K6Vp@oRKpwHSXEMrVD$UO*l@Eil- zij7xb*nQUS+fU#$P5_v3OD+Vu|Ajg>Y=Z6g(s02a75b;nAz9I6j0Y8E`T9&)^P+)h z`#I5{0ru-KV}e0Ba*^KZg#=7e{Wt9z_FVi-5!PMUmYrr>GUvZWWebGFQ3JM+Sk4Z$ zsE`2p=oyEw2>qOL=3fE00XRmp;JRq8c>5?X`0aCpO{~W5A_I?_*x0!%Pa3pV-eS~M zSSXk_qdd5ZVFlNj9ftrY`gL$v9!&)v3&Q*c)LQ9QFkL9{F~}GcP$a7z^?$PfIurgI zCs`p$NoCk$%398}IB=SxUOZ7QdEzZJHM-;wjw0;Ew8AlqT7Jc2d3qLd7wCRWIt>^m z;@3WS5`UH47k>(NlAH|@1LlYuLRLC|TQ~3_JSLbp?ljwX~?Q_h`je~4-$eeu0Q-D_H`NO0Bh93uL>PfH`PMm zpFC{HL1DpsfkCpetk_kvqw-?j2LOfh|NvK82bg5zX;pZCTvi&t0O}^fmnEHv! zQFEVVz{Srso}^Bu!}5SUlQZUci`+))e(-H5O{!%sP6%z9vH-`ptmz+rE?Wi zsW#$VO#ewe`u#sc-ywo*m7e#d_jbcv%d&y<{c`uiz1j8NX>_~6^skTiuo!7z(V6ia@1kteK#8=k`i0Ce$$^LCQBZlg3rjcC9EMBqp zvYOvM7^#`VJh@f^Z-H{FTF_d?!Us%&*v><4_|PvfCNSlW+25Rdb1c`GWo_}zQQE}w zT?NICo~p%o@!?`0=0g?bi&PzTM2p>LhYY0Mko-l+RLm3{V~i@)0KO(;L+RpaEz0@5 z61asKm>UIud;!wRCZp8x!at?q26jjW4W8BLd>rXA{yIx5NBa3}(ZVI`r<8l>8g>ip zA(J`C`QDUoXvQYch2S>ttfR-%T#>OJ}U+TJXzy3r9`Tczke;<+LVTYhO~j z20T7=p{;&TQ4aTy8#>=kFXbS0>(CB#Tzm3oGyNUc;rea5#NxHMW&9jOvh6p;n{ik_ zr0nwqcu*f(sLV3j!H9%2Hsmln)P87I*~vtA#$hQ1&YD{@O|+>HS+nWgL+*d5)kXK~ z(#3oUjtuA0L{LYH_R@(u&`W^~9hMaC?~l-I(rdc^tr|<3x({BIdQ0v@(HW;hq5!Qw zB5RHy{8rlq#7lYpf!-%xpKMI^w5Cj*7EbyYh!W`BxT;QbD#wXySJs<`y zFq9|V7B&wU9o*^;&AXYX74rEahkWqJVV0!n@UPu^UQA{W;NsUp)I<*S3QOT`gJ3nv zp)6IC^~M@4mN6OB5+afxIK=yMPu21epy?1i5!k<}FG>gmN5%d_3{-Xyl}-aa?zEz; zTSbai-S$iCsBr!U?Og>qzZ7cBt@j6ZAhbO1A;{7!HES zZTF*f(^~cR@95#>&X+}HVIWJ{zDjU-b#>+UenbNa{wYo1^UPq}b+mQ)zw91xK~H5O zCHMJD^x+qhr10w!4TVf{fQkpdlkj_p)2Jrjf_0PM=#VTof?aB67a#Wn)cF-xQ&b<) zjy~ug0qQ-w*{+5;9k@K7r`5-Yy9u*med`OpLj2afwDmvGMlgK-NIcho*sP`7a zzqRm$$jsDu6S{>Oo^*Sn{}9%6J7Qb0q@%v#H5U>69ZN`E%|wf*16#7iO8SOS3UULR zZ1{Gx^XunMGKGFnM>WAn4vC>$^DsQF1vUU}RMl4E9AP5y^TEd)IR)#4%-^?%9)|6W z{@^1WEf;zKpZ#~I#{_aNQiDWAcp+u9&c(bf${Q24p@I)=T8WXT>xa03ATFWk-@ag9 zwnk2Y#}1|NE?nvalFD61h#27C3cxM3tdZdFKs!g#fwsDqNTpv2)F+bRauw1*57hJ^ z%nAoJNmOVSaN3|_&z!OXU!N!I-wM&*;_L}2^{$dxhI~E} zlGlapk{)ba&67olfVQPdwds`0B)*nyj@@(g8|R6(MFGzGCf+&SZ*qQV%*|+v z=Rb!neP)Ux4ZZJqKNXS}zETm)xW}xbN!dadvPdLH3RlX1lj#i7a9?T#B#h<_=zNGs z%n`3();NyL-~!EsYV>)~hZGZCk*yvXF&ytdY?+-+2B(G)7sHGCh75d__`bkK(WJ$i z8`;mpN^e49_%{ZDWLOroS8&Q`m=O{_?7uh}fMbRWt9h1nE9K5=a{^t@^J_#ai{16aik z?qAz9B3D-cG5u}1lGkUt|96^d1MCFn;g+keLKMvx1fI(^Js&`x&FS^51oUoVO`L@@ zPUiaJ^6dWs1GXj2cVrU^yDmc6-{bw5e2i*R3-;ZJVPqtv!-F44JOTFMfHW|8$e8&# z!e}Vi8A}Ax(#VA_Xyvle$zMnLQSiA$JKXiCkaJ^23}CER&~`nLJB4%BqG!xCi>K^A zn()JnHQd0;#iV81aHR{RPCVJ56xqFgF?KgHdSp-Y>0#$i4Jau@XO z0kl+rn~CAv6}d@GinVkEa=>i7wdslqbuRwo2K_~D+!ORDMRAV8UowhDm|gSGORyD* z;#_Bw>?vDEM4#+{{y1>_g9$GMurslx(Qu+t-I@ic0V*|LdLYYc!!=E8XyN#bTG6Wv zl7|9khpswi{BtIsW18qpqs5DVbzjXQloI_7KYv#$YuA)4`t;Dg^`XS~x=EipP&$aY z6Srr-nI^|;4>R<)(gC-wFpN_Bn_IDN9Cj2Bkrkn0#!Pl99$U9JTo+Rg_8ePhfNy_4 z$F+|Q)euzHO5Qdo$X{3!p9%_=`6nE&>YBQBIAl(O++Uk73g&Fg^KMJ<)&~Z;?hf~B zW@^JTjIc|AA487l`Js# zg&}ByDW7?MY21fgJUG+B$iO9kX;S_)lE)~yUb}wxxz#|In)UQBF=N|hN|R+Rc2)5L z&q)8v@Bp1^zl4KZzG;dN{OFiWGzMa7`Pkn)7M5lKP2+5e`OEzO?$vnDvtc4P^{HEv z9D~vXR!wUyorhDM=n)5ddwXvX^`i{wiXaq}n3xzlJOYAscI>NH0r}LLRDdes?&~Y| ze_ISe@Fob0l%h`m*cyMi8qX2L!$%D7P&dPt!_oaektA`l$XXsZZoLqID(mSXtobDX z*6@8STw}E147triEex%7=PQ4YfL9{um=^X*KoBAt{K#pn|1Cl@Zl+&jg}?=(giN@X z30QJ!mmJ&0jkZ*Pb{g3mLe(3)WT?%OUaBC-%qr+I29hEV4}_a$2?>?#XSwe3Hz2Qc zB2P`cA-5ytkq=K}f5^N`FjpD9b?$kF>XvFQ_M%Lbs$#a$F6Tk6Ag8UJ?!)bay{jsw zdM^+`4JeB=K4nCBTE~4Z@^v=|AoFo+=pDA4fGq(ha`le#ai1-?vMft zUB=#zHa~HJN_8buukWbp7Hc`yVsPb)VU8ds$zvlKNaP?Y{L4rM!7u>9N051K}kfhj|vg(ln_W z?5Kt)fyAI6$d=^F&|C#tbO&G7u_IK@8>dSDr@dyY5I4o-}lS8 zDGYvXiP3~kjWcH%smrqAC%#Jk(M3Y32uj#VbCOL}M!4Kle(<{fR}&h;|1x-YcAZ=e zPH`4kbdrzXu?!e{DeJpWmCEdinW{Qc8{E`)VPY}^0<+Sxl zD{l92+Ta}y68`q>E3zq3=obNd4<0_yQJeM7x%bac)d5B6aH$-R`FHKVi*X^{ZYBpx zqN#-%De$LRpCms5v%bCFWG47R$pBaGZ4nYz~3OZj0C+;MPu>w9gCZ@MtP@E#0@ddsNvVp0$74&v(g;7<_jCEgFM8P6; zDT07Y=oV@ASzpYFmD@M&anpber`Rs78ZLb#Qom$1c=91-L~auW6A=TL5+J+Jw89cd z%}y16U$ESaFBfI@s1=)leE^a;BWPOp?+~YTw2e<%tHd z2=BRnkl%|IXks~IWvNCzrk!w@Z1w(RMTF5x#4lh+b01ah+h3!c7`1jBKs&wih_B&kkfnAD&_K&H*G{KF|3f!vc7GOBQU$eT;y za|WtWDhzwFQDc@9s!NIQ80+2NX_7uCwG_6WV~gaVLPxOrYV`x`MS`A=9A8J24Ghhb z_1L8TjlzyM*9PXRM(Y2~0?5N4Nw^}NBHSnvL;j&5lltGm*m4`Xv{rGK(A8rek(Rk? zG960O=i5uEv#Qh@unG*UOQ>jASrlyLSCQAhMTuvE3xGVAQZ*Cl2ng>1_HnXamY}}K zH;2i`?9cn(K))8dWWu@$7e$2cJ%&XXGp1PbJ4}dGYY^xwgB<2DjwTJu?3siHQyqRk zqT{G=h+4cdPKO;eJB8#uEbIb`W&Ewy>AkcI6+H4>;5F^|NfTgOIQWftDE`fn9zD5! z5f{Z~bheo^l4~{Ex~g2Q(rxI#3T#Wvti#Mn0aQukVP8jZ6k9dgq=(Cqy7>1sjh2#` zg7s8tQ4#Moo@EyhS|Lc?-sMTD#`2^uXVNWt7CW$1!hUu?TN*XHUa~G`|OkM{RLQmy(<$B$?*Tq{>@&?~yy&m}j|5bbd$L zuzxwYfyM@iIW<^uu7H+XhjPf)@23rpB!M~hL2Bo$8j4;S>PcKwPEb2$RN?UiO3?qi zwnvWbQpgy6zAWo9Vh=S?13;1zzrRP8mX<)^@qZ)U35;2dHkB{7v(sQbIb&vVv+-aG z+wb!QqVmM!eznztW%M$A7wEc_b%%vtYIY+!x0V2%Z7$jPb0otK*h2#{M}7O`Q=JfG zep^r}mrnUkPH^YW_iP$p(WFee-rKHYRrVc?ipBm2BB!fLl*!PB9V-YCg>^`!U7Q{K zLTnfWyr3}yBsjcTsze!DurC>5V+ws0i% z3eN%QFJCH$Y$X=$Q7)!(g)Co0-<$-jTl}lVn@csy-qcQ1NGs;7{ng{ECBD{zHU^_kF%9(z8?#)k%z6=j1J=qQcZsb=k+zhJo_dS^a^5DK94@B# zcmJK>bWu-8WEnKMj z$4wD@d0|Cqkcbc;X~g6elh&$aE!WW&@puSJ`=6!iXPcQCV@mgXmVljCUkvdt{cA?J zo>r2#WMjX*v6BCBF@TZp1P0%*aC_2*736cBhpTY2V1wIHDlzm;1kDcGFIuCtPhp|o z?#az6Aa`N?U@NdFh-oRh@mn(ZbzJ{D3!$$tj6j3yhRh*W=0TE|Dm8`{hn}EKO-ct` zFl61VIl}>B0$J>UySlYliUR$+aU=LRv{(fCPhWu}2!zOLhO)p7X31b&4Qt=s9;U!g z@EGpYB2{~vg=uV~-qU)p2B~mlXGI(`fl5%+zz<#iuF!vrW*pN*#^5y&(VF;J)0(4E z02Ku+)2L#UaWqwz#RU+mSmf)f!crO!Gfb577W)lCnqx(9+eO*W!q>Zo5ORk_^xcw; zgrUtwY}b+-M<^`p-g89W=9z-m|-jT9;K}!xqQG<=F@2< zJiLhwL2bZ%jsvF-3KjEBy*iIX1Hqn(7OQEVyb9krpuyqgjH|5IJggk}FeoD6@TBQt z)?>L!45nPEm$tOQ^Zx=L1)w1@FqR~!wv2a02A-q`&s8EnM;Nvos^p`^uAlvSUTb_m zITUVHJz2^mD`rF0OAQ&&9GVb@(*s)RB$h;lIR9ncyUf8W%G3Xj_j2aV<-;e?xG+%z z)%*vkcpX7PuP}sY(%5Uis>Oc$N8~U?q;E0tfNUTp)20$qo+i@$d+;cS&URD4+Fd8* zC?6?^LEL^JkL@z9!l1fYmR1_HKQNx{<78B(hGdI)vwL&5CgoVb+@rLY5$yHNVo>0i zF!O4_&gB@Y;w#YrB0RI)8M4G?{a4g%*^h?^?^tSX>hf0Pe3CS@g;B&Ri$n4(3iK(} z(?Y&n)mlv*|0x{9P#phd(Pu)p6OAyMI3G*`M&)Dbl*-{e@f_qT#E4sW0+C!J4EeHtGNxMrHhtf=d8Q?vWAoDvl}|B%KI z6aTf;>-EK5>5A)iZb6dW5uv0vE#OA(Y4Y^;n4jqGR-GDJWs9>IwUE*o!Z~zPM26C;opX4cNdC5O1I(i!IJm6f z-E>fcL`>vxx+whcFGIG`U0d*D^o1X_xRs#W@jLt%$>)6hz1%vu4VxHr2<5o<|COH;~;b7cTxavDYys z4(Y%S1mQZD3O1LRB$E+<&kfWy*&zR(20bS`YN3~|%V4C~X52uEdY*7^eaI|=dv(yA z2c#W{&Q)`{MgQ)u;^JeZX6XKkj1}Sf>aO1=n%#c+bTWWQz?Me5f?NP<&d(Y`H4)a{ zL%`x3sm(a4tt9nKq2}G&orb(`mXj9$`|CiQawE4^KZz8}dF-pbPL?|oOdLgpOg2}>ix^K=GUUTXY*f4ODdts`0|+&T;$SJi5kKhG0CuL%Ge96)CMf8UIo%=o!YG7|}Frq_X{RJZ|R$9>t2 zQgf4E&Rm5_uKr<4H>^Bsf|J`}p1a9ihqlYcw+Tc$w5m{fD)Hb~vsxmU{_+LHt7uR$ zkakiJ9U9AEh4eJptP8WjI3or5WNU$}AxbZaczIiefRiygk%;g2nuxIv!~V!mCQ zP!R;7)G&8F123@p3yZpn@gl+1pmbI_}gEGzbF@%O4I9IO&Y| zM!Z-sqD~KJWfudzg(S<5du6g@`h>VB9*NeKlHaIWvqFuNYh-?`n^f(i7`osKh zTH3wCPwB!LV^b_*Yk@fGoJChD&ezYi#Gn?}hvRy`1!xp#R3)i~G*nn9nkaHop^SdF zrmf}A6{VWjc!IznyF}HT@NeB7|GH3w9eA@QTgo#V9|C(ylPbVWSUD;nSD~=)g9)!> ztgyUfk84+xEUbYgQ8-jsF)b%SwsJ3q=@^k19;vkl_-E(u4epsU7)ekhG46k))V{_=~+!7%GDUw!vDam#bDSO4?xT zj}fh-{VGy4&l>S|00}3FlURj_3MA(@6%P&qRwYoBtC)uHz*-Gs6RbpVyq4t7q_wNn zi}_mPkfqP32}ZgkzH}LdRp(C-gm$`)4lWJ=DoUtNT1~{izU#zyWYxv;$nTZYl4KEt z=o7=6q?{**@;z$qs+e$e1LRI4Iyu_pm&pp)raYwey5mZj@@LR3t?WcYW^7=L0s4{h zbm48poiivW_J=4ncO9kw4Tz0$DgW~i`d$MbF@Ugk-5_%Nr^EeH%^;yrt?WNqDo4)q z2GHsL|DVgSS!?}9v2^7PzJU83LuN07$ANN?@4|CBW$L;ZsCd`6@3t}|3dpAhMGj!R zE2}84HG-7=r$k+@2Ij&_uHOTTu9@7kNGBoU;CY2O@xrSqd93^EjXYjpolxu%V=s`1 zyltdEQ2D`h;ADw$9|L^!P{l7K=&ZwwZv@{9oK-stjdFY~>e5)ogv3Or0jTUwDS@B2 z%n$g21s4qE?}*s-09{FN=7f=Zf2l&|i!j$Rv0`?t<-hw-t&%3*=tJ@38tnSrpThc9 z8#FxfCdQ~8fFC4%P)Z;gALY&mRMOi+A0r?2YFGh-mN#S08>8G!scFQjchBhPLlx43 z#|;0aknYeW)5puG*n*U3gY0M}c6M_2n?>Y@<132NQKO{+FJvvcV~Rmcpp7 z0us67!GjCoJAryc+%&AGbO+<`Wt1fwFQ!)WBM-Tn!;`Y~RCBAG&6vNcieYKq+c15U zVm(so>{qSOanRv{(z+r@dl7usODCRpUM@Y5_v|?2l7j%sj=rM zW96 zUycqGN&KPv1gdo}SklRki6o|44^;HAB_qavlu1R`%UZ*7(2&m$hc^$~C=Q^g^)Ax^ zV2+$Q$1!@Udh@mcARWOr`X-shTAvtcNKSx_!6YlC_AN0KCQyP7E6oCdw4CSIKMKrs z6of{JE;le3FcR7VJF}ELX}ik7>+XWrr10^;n2UeUoD<7R7j2iQ9jRC4_4sQ1zU02i z`005ty1^s-xKr>*82=gk2|>f*#Mo!Xqjy$ZuF)|ka3J|Lx-Dqe3^EC&X^^?{39pi& zh{MEpx9w@8?r`@!AOyp7Vd#Q9litL#!G%-(J0jnz<0kGKgpa|$eyAMS5y4*HS+3iV zfGpp~)_0bT;n$Atx0UM>i}ay~f0Bwa!iG8k zdWk(cy|3Z$EdmP!0{k;wT69`S)Lng*e=_b6BCwOjVyiI=d28gy?gM=f$ZS`IM!T7` z>ZtNptUorY6bsbDhJDWF`%iuLQcl5tAg`^c)h{YYO(USy5oEya2Il$OM=F@p;t**k z(vmQ6v2I!6X!n97RGBqaQV;*F6_itL2&!UQY(&xr64vn!K~oJGVKE0p47+TKsj`+n z4oyqN3`?SKBtP-Z_J+4jX5!DYQb@%#`7xBt(Y@TfC;YD!=wm!&!wvi9o00ViU$<6C zUBH$sKeQjgn;<)AcCA)c_tBKBQHI=+SwZdkyl@59vXVe(P{Kxfu|9%VF z_kEuE4?jHWv|*KkpdXH&T#mm&kkhlMV;`OmLkfiodK;3SquQa(1%<^h(ePZlN(Ssm zH;42ltWbPD_qKopeIMhOTEJZAZoaaCB7!KA@WhN7 zFMaPP+`y<&L^u~;%xxb17fmf1+}=2NcOOyO2x9ob0I)se&=jE|bCer>J_>W3&5J{g zqO$7JwapkL3=$?v>~kZGk`G@<3(4r(p85_xsrt?@Qi>HPj~}dPa=WZyq*n6DVk^Wq z5N~+8ioGgGUtS#dX(+xw;Yg`Fp6+z!V#U?~W0`0Xtf^d0Bm5ZoDl92N>1ODnyI@>g zB&f762V`P9e}TZP{Infv*O#a5S#z*EkGBXsZlm9kqhAL`CyL5PEmo$J5X-fR6<0X^h3I@nIV zWFn=AO^)b$s0vQbTkuw%H7qZRy^bUK^q@y0 z8fB%$c$sFEj?$GZa)Vb)DiEDgx`i}BqCS$66(**cPx6&0jwcgSamX(l(l- zXIGe+kFohHOU&L@T%mIosv@|JgZi$xPJNue$&bDn`^z`)Cga9~zf}JSiT`7d=V9M{ zPG1M3hjSG`3BuVXv796 zYeD1vHfX4a>jGd}H;JMT=P~RC1W~^|V;iQXfBl2>y&?ki4H}tavz4ueEj>i*0l(3C zn5z}*ydh0CUec`Hk?O@}`b1{$o^4*<9hokq9j86eE5H<2{U^>%oNmn`6#s7=cJfJSnk|VAYBPtRqGG&C*jMe}Z4_F#U>yH0eHyZ3SlsT8bRWWe(rio$ z+@miRI;yyxR=_gS!x03sgiy8v?WjRIrF?0Be8g#(I_8K*R(V_kJ|@`=sj;qp)QP%O z?uH)oLDOv18^dEcU)1t{021ZAhv@zpQI~Tyn&;x(HyH(fU1~9SNkl6U_4pA=yVl8} zLm&!{ph9}pDoj|6xwW}=h}>l+51kfi!?0BM(%{<60gP+bj~V^I{R*ch9Vyrq!Jn^( z#-9V$#ka^JK2yy}f&aMbsQNddsuhH|Jq4|bHMSix^311drD%fJ^iO-YqD*@}TOz|Xw zs=yMpq?QaW^g)%jU9Fl0%ZeiqxtwBRoyW3~1m9z9h~U;#BiNB28;@|+L?GuLRj^HO zdf`kK4wzZ<wSbZ$7?B~ZmfRi!%sJO$=xn>Y zQDEn-#D;_B*ESkr^w3Rzx#Vdi#FJ{%X!fstmFSlr^Pe6Hpry&B!T?o;FKGvV$^Wxv z&ZIH=dEfDI*!Sh{K!>tD(Z|dxnYxhR-9P^SepkS|v{%OB-#dj&K*TL!eV@QxX;RyJ zOl`PeE~1!8hWmLf+vVSbXE)K%Zj)|yLZ@y5CZqw%T^Xey9<}=5B#n7{us^E1KBGoR zomVW{jT|B6WgsS>dq#c+LFz)CI@5EU*~7tD~>nuEVIPY;t|ijD%znrZYLA$c3O#rVb8*Z(h5q#AiTa zmz`6CaN<#vUy8yS-}in&F!i*jdEcx2#LkeRuxz7GuP)1O%YX#8%rNAHIGwZEFjP!2 z8gtMamjx^Fp~Y}Q%!EVYaf}R(wt3`<KYx|i@y61gM`(mF4tQZSLk*7}p2SdMNf z)0|(pb=)LB;%9?XV~-~?ZW_aK9w+;4m;sHJcgmajPek_TILMeqjkX=F?=7CU z?~;3!C{ExbF08?S`1<(|@PBWUCrvlINErz%qXo-^1kF);(Xj}jy4QE>_Ks?S?wn|w zcrNel3_(?38!0jPS{$U^^NEWL4FmNP(rzH~Q5NtekTF9+dc_2*)t7l(lIe&%st})Fwd+`~p)@Ef*_dFAqiCkIM24B>I-8fXOgJ1reX2vf)*JBsDhZ@@|L||D;iqMXQ1wuvB7p&iISW7iS9+!ppIU(YM8--`ZATvk5EWb3~ zM)hnouxP}hDJ%wuwIpZ5Pz%q=q5Dt=-8`44&@PVNuw^MdL?UYx)6!^}DmBl=rN8ZS zz}Ncq&wC+6&#Im*UcCB0_z}P$U(q(Ma`Yh{x29VCC7G+~Hey#;*wRmJ7RzqATa<3e z^Z02t4--hCM3l>b0cykn@lnr+nDCgqUxQ^6Qhh>h^^XXGgQx~l| zqu-pdgb`JujK=jICmw#o5;40F8=+f=Vkyu2>Xsa*Tq<3-!)=8d#@>D{d61Vy*&QK z=Oq;#u^mF^X31mQMD$&xXUU4@uRV3$_~6oAHs+Ns>6=*NpW8!-Qt^ZaV)-`2Rx6jB zex82U^}Wpi^!IGN@3_*VM6Tcn203DFuzFb%Q8<*C{^vwglXjIvcqeoMIEjKzRdM{n zY~ohlGZCcV{#93AG&AcDEyO2ydmux>m|kcF78tNQKd`kI$4A|YgQB*^|3>!>h1)mH zgHDn45}qvK%00LHA{wo7Vn?1t0ll*|u@_Us#R>r#Oz*E1#S{!tcD-_u~*D&NET zMbY)5y5Kc=bt-T<`00{8Ten+~AvuE%lw_TDS7?ZOaAi(n>Ap(2RCD5_|L#Dl0;gS^ z!^a_`MewqvUUtHH{BPGHDB9NUxZq!fGv1Kch4VG-+ia?`TK6t{u@TPfxhM@j_m8aJ zXN~|>#;^I_H^bJSk26Q%ZaNr}6{<0t#2MGMHXf`Eztf`Bx_8*?LM+3w*#;uSiU@JhcBns* ziy&a`l!S`tLK~tp)HhRUJ`9CT=xyj~f>On9b{_Y7-V1Qj?r?^L*!0#yvdLz^1V*iF zQFgVtQwhZhjUxz*lexP+A}nLGBvr$p8ogD(Jc7g+ePNAS&Svc-d<(dq8f0N7Uw( zOl!19ON(LpRQEMe^eY%sz~kdL<{D?UH8ItaQn|)rur$Zg>+{ev>-;P6nlP@O_UGRb znaNp^U)y+6VA{i^6*br4zka9pm->GP0^dDL91@Ip9vib;hy}Uo{#VmKST0gN59%2E zUH>H)a=V90e2v^1F+j*E(F@Sdcg!~N7D4U5LFob`2>rRYLg4CDQ5%av#cFmTe=L#L z17P0&h~A#6!^XfQK$D47B6QNj`R@K1E3;pX)x-!N_fH;Ah=I6KM1eu=JwY+L&}NE> z(BxXWYC=^8tYl!3i+0ro=~bX2cO8B-6k=D*c3+I%p1Rszy~K#8Vcsk=amO1moog)F zR<#*8$9mbHK$xhMtdt(CzaB6JRo)*P)v1u^bsirH=EfW^oN-pB1T*Kw6{Z%+eR)y! zyyQfhXIQarhAm1<~Vc^ zo#AVh$~8(JFOjP09|>kRz94TDcZRTym$xNnRLus}B(s*FK#^cJQDBe;xeQVO;TlP|C{J|_PW zQ(GOX)VN5)T1BPj`6J82FWIoZCjYh!hM44Te^7F1vwST{UfSyT;&HxKyj@PVA*|XE z^TAqN5iM`oO339q&sAZD-NeZlUp@bQcMd+pJd`qx11>V<-w;b7-|;^{L-{|!^hI#@Udho;>F?&p`N(4A;t>AqJ*wF?v+35hBz+nn7}{&< zcf?nUAbmvwV%e?Q_Ev{t-Tn@fW1``y`2C+YAH=m?pnyP&J5G?m3ab8mE$?AC=@!O< z4Yy2z$o=r7t(o$&JdX77DOH6Ulm*<^2XK>7Ey#m*;^gv2GHn;zYo?tT#a1%R&C@!* zP-dy%>8`ORV@rmr@`tHPm+H2~mXcb#)i@1ra}_R=2Aov3RvL24FA#+t55YvRNLSP5 zM>d@C^9p+?@I8&pNuJ2tLt} z`Qs6NzEj{6#Z{6)<3Gfb9p1B5@K+=JXr!U@Sm}#ri(a3ppt}%$!OQqp!d%(SzPy&S zn0?^%vE}#w3BbSI_2T9CLJ#HdMT@GXnb&&N^*w*X3c}5|$U7lNNrDIzQTSpZBw>xk zpQ@z^0coi2x;g&YpO=&6f_2*{9!4h znjv2|x+BPU1wEGo1dw;=*H7!#i_vpQ(MYRxVxOY!LM|gciIp;P`G->K8HsR@6Tbs` ztI`;S{%shPx20o;q9yoHL_lze+V$x^PeE&hsIZ?2iP43wp0|axpevb&(L!1ki$+iy*0C;@`5#mIKf2hFe^V5uwdlz{GMEuwRxQk9R~EvMyV2 z2wH|cE@#OSS~DWiu%58L1s&_ez(koIhv0yHMwnM|TqY_~Ba&2Pge7EQ;M<{kcuK3$lmLBq zQYE;I7E1>D6s(h+!xUp;kyAT5hN22 zJ2OJD?;-H-$%84RJEL;!6?%0d-R42d#yJVt%_G_=*w$pf2~9$^!!;{rt=w`<-{!KI zOz`;0@#~iRyJHP-)TTy$g%qo!ivW-@=BNMzU-liZ5ro^_l8{WFPF zum^3=<9z`u5>5CH&P$WTK2)n8787xMYgn9rEIH-@v~a=nj37;0>MrGyz%U!K}Rke=D%vPV$#TQyu~$+1{VG=5r#?(1@v6U(`9$jH|19u26o5@ zG|rw${uiW7j$XIKnRJtMa2Ai!kM;oJU=*;^MCFU~KDgg`NNd^mYS0wAWLvKcBR_Fs zGBcz4DJr3T$dPZ%sziZVeF}5i)Pu#SMnoS79Sd(g9A}bEg>j~3 zNx0?t%V6j;vCz#+^bnj1-d))M#uwyoe*xebtLwg91}BpaPiS)9y8QZW#r(fLY5&nC zJh=HBPMwy|;4{bKaDI`Uargb4L`6_e3|VW`@9b!yM#O@OQ%Tj%!ABWO$ZKd5>g!gL zQ_8HUmLG7W4Z&OxXxD|~pdeNF1n&V^Lz%$@QPhf6fE9#zD!7i^%39q0D2_#jnPqg*+=Iq2HTs z=J8jng!hLlS|eE@(qQ1*53B(-+2D!yTO5WjN4>?!ah%<0X|~~n_zPAB+@fCbnvCM^ za|Th99+Z6)ksu^WpLu>Tg;GjOpienLzbefx8U!E&d5HYSNH>I^CQoAr!nf$9dt*)qf@@wZnxta}Y8KNlV_pamfKamAFAGu%NFZ*^x=8V`iZ3z~W z>OxwOy2ok-AD8?&QUGtwTxXTLVkVo1gT$T9x^}H_xZDG6{8C~{xH*sFQdTtsoV!p$ z(2^ywa`re$Ky^((-d-2J4vDd_?Jcsv#R37lO&0fckVKjnGyIckGtHlcGj4(-@u>c~ z+88||k1qP--|A+d1!ESiBSs=1B-41fjYn3KZJ!)j_6}P(dbOWimNF}9uW5%558GSXjK&$~6iEc%@Z>Rvw`v+a^}GGi+gjEnWONDvk7&uZNl zn=yOLGJwof&HEhbCn9t!L#yE!csVreH5phc2fqNwG_2d){*xICTZn zgV_8LfpT3sD+C_N;rI%hO_0QSnvc>93_DZND{xuxgucVjyuA<$gS`O%mG{j} z5XIYX_Z?As5Gg@iH%B6P#h--gxj6Yj1FrRj&<$rTX^GP+5{p$a2jCar=AM{GnFMKyvF+O??PUuq-lPr7y1V*@_Y znjjOyJ`k>Bn3>P9nrs|5H%j+^#VEe!lABRc^I$4q1gbPZnm{1Z?3#A?nm&m$0{8qk{H+iJGiYp(WmaasMmENAhF_K{5dKqW6kt0EfFw zDA}!4va+UlO|(Wl8zfPs8QpmAnjXr@wo{l}G=Yu40zySaqr_9RyrDll#p3j?fTR5; zAK$E3ZPR93$RUyPeoq=lL7N_vM);#z%xx>boSex zP)VS%uM&K%cA+76@E@;fQOn&xY#6ozPvb!aBbICeJX27f{3JXzG{&dfc(}DMQ>lvu zpTokxyxV2MzFg2(m#xKt@7R)dMCo_14ZnM?VfA&RZv5lU*p%y`AR47hCdv`PU>QQ7 zbT@em1a2e&RPlTzr*XNtOO6zRTmgzsERI&08H+!dy^7mHvxbPy;VT;xR44$i(dt#V z1fYYuajdZxtjn<_9k%Xpvg&O#bdHP#t%V+YJ~*{%EUYJG`+4 zXk?igS8o@6SxZRTF3c6^{Eqn)(tthD@OG_BU9+T{4_{oc6@In?WDiRbWRMAs8G^q zDdLBV4lEFPRQ+FFhxST|wi2@N>=4tZ5IJP83{|bbbUP$#50*Fkxe0^nHGF}+eDq|X z!F=XP(1V@x!%=ZrH%sTm8t2y^PbbeO|9`uc9d#EO&N16|S0HrFxXd`>Mk|yR`Eeso z{8?T3<(!9Zr8#`6Mg1T4M+jBuTPfFHO{B=yYS$Z8R1O$SWCxT{?Nq~Dk;alV^ZhBg zE@nd&YJqA+0688b<~c;`ZVg;-aPuxX1a-XF3HZtefe+gJvL6u_BrhxF=D&})X6uX? z-W(LpXbBpoDlrbiRfG(Z#7+lsNpa6P6B=20`=Oua%H=U+5Bvm_pejb0lTr4Ytb`g? zB(nSo+~e`Fr$d{9gulg9Kwu34ftK--G>(p>@ntzuSgc}QLvgH@1Z9mRnXqAt`i<)L zsgmR=Cq!L8LfwMG$@Pe=N+-@oOCPJV23OTmew3E}52u47xz4Ld-saj>=huS88SI3E@Cnj+Y{RLVdJD5lsmY1(@NA8=Al)GpbuC;eHwhr!6OP@Xp z7sHPE7|>I)5HZ>`a1JvV3dd*`9nud4g^t+r$UcBF?Kb{4Adxez$ z0zQ`DF|+!wf7H}(Y`>-c9T^jOC}T3>t2h8|s(g9!GCqHq{+|OQIIAU*hFQ7hxlDhZ zX}x;&dVWx-O&lRwKjBs$0xq&Dh3SUi2p)#uoE=3Y9y9%DJlx;k$Xr{iSK|U_ze__Zs-v2P ztxCf=@@wkF z20@WOE<-Z(UIK9b6ivG732jpCttvV^G+ZKN|wRG)PD_!$*4Jy1L`3xp!l zC2J<5Dk=1al(guWLH+vAzZC&@4%)H0AF1(lV={kuF6Ixuv$w?A`Y;k2Vt=!~%NDOv zO|On&Y!#@RH#4~crqY4D-t47oAcz z4Hx(Hn61zQqj~lY9W^S#bm#O#6faJ%996zX``zqS=d!D-j0YcVunMl4zWk&aAznodV9xvp4_>;w)I( z?OURbWuu}R!37x^;GAjKFB3S1m7!D>oK;*bJipXoWH3nNPLmHjNeljUC6geUD)u4p zfMzGEphrJ2g|#ek;CXw5EYM#_1j`bs$r)k&-=BE}hSMkYz0Xw#z?O=yF|)zc=l@AD zf?4fu2Ht4}!cFh(W77#GfB)VHA->~p?!%2te>Ye^br0f7 z_T6oQk(NsM237b0Ok0N&Iw?~{O-jsrqX=Y)bnUl$DaD5oNzO?r=ZKzBMZGcdHfoh5 z_VLqaKu@} zLlpED`18_y z*yzGSH1XRYf)v9z!)q&jOq+7QlOl;&B%~%B+s6BL>!%_m5hcyK@uZd5vGq>dm{CW| z5}v}k8s!_AzxRJxIwf<-EM2H3mpeA|8sY=CUr$C>ps`+cS|L;a!jSKBjU>~TY*?D* z#Gfmyd~Wg{r9itP$$J=r?*}_O`cbo(0oRQ^A|%l=3&js-y2Rry;L|n$@H18E$fdWT zU^3VEbK;Tg$L?DV8mUNtYc;3q$`$tsrj*Y&!RqY1`MAkq^%}MBQj~bwc>Dg8fiyDf zQO(WigvfZUnOhDkpb&Z`+k_Sh&m;BypvxJYx+KJ$@q*l1=?tBGs}i-zVafE2Ib74j z%YBqCYXuwS=!VX~+#!77r8a+o5Iv*&r(Efd$Te0zU~%?}HYONFm*d(SG{%TUqg?e_ zIou-K<>d;M9~EkI=g{{%Xv^e)b0=@>QZdI!<51;@k(-ZXh6SFrEG4-=LQ`@{qRjvZ z{adQez-Fbnx{GHz1fs53rT#*phJE0HB3fC9ds2>olujv@hRMEF*b8~yRkkV!u%)=K z6WRYLD&!JvNwcrzNJ0Z#G$lkqZS3?9XqtDEm-~uZz?}&M<|9A%6bo7ZM|d3VhuQg^ zY~NQ#9?Xg#kH57%5Dot?-jRoaL&rAo4F>hrWiFguuB^0T@b*x@|1tFAhYOG(M9)t6(io@sebfJok^jcn*D}-R1P)8{J8Cl>+ z=b!oyi?&?R)yp-=f)_U*D-`@8mMOb$cL~duM#(xjm2d;x*i3oh1N~qlvg-W4CVqNI zhnPkZQe4+JuX2N_%uO*FZ+6rY7%P^U`~#5cR~d2$II_GO7kYka08Kx^E8u&}m?YVL zkUE0qBEHK}&Fxe!@GU(X|3wLP)bys2EsmM=EX9XigvYE!4|~gEY~}V5+#1_&+NN9f zqdi@{D6WVxoue2}cH4r751I#19%@k~hD?9;zEFY;tu^&sCt!cuT=lDOs5V`h%mBwy zu96zTuqmQaR9V>5_$p5R?dGZp&e z)K?-_lH5tF2CL^FsYqIAgKNq|YQtgsMi_X8R=SCuygk?)XJUNnxKMiC>d}FQ!2t5r z7@yrAAUC9G$fEK^J3>>8i}|4LYHo;Goo4wMq##zTDmmujy{TXvYXtb$K&6%6$F0at zXr=qQGtIt0+S6W0I^Wy?tK{cOcjwKW1y9hD-`$*0%`7~4vr>V^@^C5`TaC{tX<_d( zgq_<0C`azU9dQF!x2ZDtNoQhK=3Eeds67-u>Z~1KfeS=q$ohi+WR_FS3JHXF@#MxI zEjB5PkL-?4Mi(A-vRJfd9tBPBNunE_fp}7fH)|HzAB0Fi8)c0EB|#CpkO5^IPCzUu{wfF`1qRcjpBmbCHhI02Rf z9=3kFLt$QN#q4%yOxe@FQoS-}J*IfRRrZJujH~p8#wnqMVB7u4K#$hniux^#C*NITFW5ISmtYd?6tN!U9CR)w_T0f=Xmhz;^gG|f3&wxehur=@kNQoUM5 z88C#@e)YE*v0k-7b^2ubt2t9|=J)%mHlS6+E3>jxIqFnJv94?+*l*%rO+Qz=L#u25 z-Fy(c@tbx`!G77YooNqa2$rq|>nL;ux}maY6gW!)Cg=wvMnEwCpD$qD89m8ehbjZ2 zXOGCUDs4iO3!2QdJsW&LQ`Bv}T&`|nmvonlD68T*jLE;@BkYs5Ui$rw2Nj8Xh!)mq&aeY$@W5&U2}xt*A&0@k=Yolahe0_>=AjD!w;Ymjw)+B5zMh zKF>cy*Ds~Urmg?$)t7=n4@VLvklWbA1=Fl|NYJ}WevVqo|MOoc)!x94gu;c=w!{>G z^fR!!QFJ_b`J;dZLJC6p&$34E`6ejbeVRyx-9u~5a03EO z1bG7DXUIe!Xza*3^q1*MOHE>HAI4@OtYGvezgp#n$IlioQs)H2<$sydCEGn*eX}!9 zhJITP&ajJuMG}=1VPLBc8VnS5YZxiH=3;LA0Ib*MA48|>#lNy8+cJdH??0dW4C|y9 zre+8~s7=1ldJFsBZ-0Bv_q$sB`){V}1pG$RB&$eLGhsyImjzl&A4`#o{!CPx{BXOU zh(dnDMJhA#Jk{rEW8=oY+?tOu*3(RyX61NnHGkF{s!%Xz>w3U~adbPN`-)#D;K=9~ zafFqY62s_@s=ecG$}5rTgPw)q9rlBSBsdy9mB#XPobNrPya)}%!AB5&#lC@(j|bu&2FBU& z-nn?HO$2sPv-q;e>RO!~J*mf$&55)-EKmD~m*%QaOZqkf9_Dan*UxTrB2bkQh`(z` zF*33UgvvFP)2*b@^X5)RTF(wTM#)e8Ns6etYXc|&j)Kz{Bm^MtWA#Q=rU-$)Ua{~! zL6BjbCPB=E4YL1oaRnR6XI$IVpVE+q@Z{7pGwDuJUO!=z*p&?RXG zxfn(o_y^*S%<<`xGg2|zlFW48QwDqCPTh#EVP75{>^?uN1Cd64q3ej@JNLa@6eKSp zBoKnvn>(+;U-P}@rN0|-@(A6BI&Iz!m&o9FB$tNlMuqJMuSe}CGUIsd;qJY99NE?@ z7@n(VcEA5BHE&sC67hW540-uTG#JShNQxlaw)1Jibvdp$$o{cO6B^&@r$Asgc=#6)ASFi%%$a zrBGKdrCHgQ@H;L&k%xAOThUo17`idm)Tu~YV`_CM+r@+5Q@-`_!>r9YK01KmsIhEOvkF4?VV6yu3quiqW zPRo`DUC7rAWFDx})^;iET>54rkUu$mH-}ZHiVz&OU942WIrO&z<`<2rW~9oYOPC&` z3p=45_s-X}I>&*SBT2pj!4j`z*5_r^1uYaId-7$AZ1XBa(0`*wZYAcJ8-UZmo51OzKn{$N6X^E zDoh#b0JS;s%1C*lUQoRpNiG3ct!F8uxJxg$IFR#MUcfA8?%3g)THtHdI2Fb@V}bFo zK~VxCQtUvgnp(J*X)-C#AWrwRKxjsykTCTRD&yoYpxr?hF8{meTg2na@+g@+b(m`J z4U$$cN=tF_E8->HVs}0w>(SR=iKtULR=gHx#2}G&FYJXbA+qy=$Bu2Xf7PEY>U4az z<48s>M~e-D#vgrN5*v@Ky{*d5X{8+8qn`!+G1WawSk6mjEFM(~h95tp3`SHL8EsN* zP|?R1$h5U_Klg@y3O4@TrZQuF9;8gTn6qCx=L&^5D6)`}j>w@D^nu^p|i;7cL(#hIcE(C+0TcMzr1Jt!;uxUwGK zV>>wMmub-j`CNUn!y(TLMZp*K>(&gp!>~x>WpX@~^y+28k?oi&S@xe%fiJtzbT;it ztcbED2FHhzn!Ac>zUI32rDMy;V!IArknjq!415GOWFQXwwh_HWYFGalm^_5op>cY| zVlL@sYyFL1eda;*ZwQGH&ah95K65!jh)u?F6MrF^2LCJ(;yf!2b6}FLOwcgm%PMs6 z;;8Uy!s<>b{Nn5MWH%1dQj>ML`z9zL&N(j~Z$efmC3&|by*xGEJ7sKv(XDB25Z7HchQz;b<2gq=bhfb#fQ1eNc(YnanVN8+iG(pR7{aE& zb&~qHzZ6?LG8|`W=0wC;1-@QvTsHh=`nhTta1&9mi66ZZ6r~+0)xgA7IcKl9txX*yIrRzQF!CR_n1OR+~-DQt9p3JF!$D=aN3r(D}Wj8nox-WP_kARrvWfbFur%$;-2|bb!-D8f(VWR*dQhok%5S zIMOW5**lfeTcG>_>l&O|wu#%W=(<;X2{^Fqq8a=ZuJ?;d=Noz;n>z>%XFxW_L4%Dc zeE$+u>d-&NUyB_;-e@rGxhBdFhf-mKqL-?5or3sp{LG_Fl1^I9o+e8Nt!JJbkuEy# zhY*cUNJu2dxjhS~Cz0S746(XA25gL0UQZ*B8tW3Xf|dwo7UCxb*#G@%j9oT;p}AyP z=70A0`r^`t<(tsW@GrEFtxRkWHF|s0d$fSRzwW4ZUS^Fq-|u&rJ}T9}WrEAA={mL^ zl8XQPg#tfZp9LXsXdHw4T+wDs$(m9=v2@JJ$(Y3$s?!QWtXJN-KG(*dH7z&gzQ97( zF4F4#L<*=`JeXY=vH6;(_z!VMm%GC}0~gU4%Q=C6+7NE2l9~o9*<5FmjxMHZX{54N zVi9He5UvnSuEk3HeP(tItc3EX4}^s#wCTA-Na;H{_b%!EllpaH(4+&8H`$ zLp+H$M6o#uzrinX-HIJ8wG$_q%am0re^UA;dQe7QZ%QQGoTeevY-f@|` z^Q?okt2DVh{D$)r4nwAX=3$hH*DS7Wg(N{aLar5>XsXvKd*zZWjeVn1e;cw8N)_x= z``NW|;NU^(Ytfii5u_}T>u{#y>HPUp9_w4^C!MIA?g*t1nPa=NOU5sRVnNbbXm>fz z1zk$g=+&+*^j>erTc(LG#Id7Txi zeei_pjDoz}D#Qh*FF4F5hE};4biJC;^eGA_MQp?($$nB!m^e8D?_5Z+74tTTNU&Ua zG39RSP>2?BI<$yh+#8K5$G(d+!Yx!q_Kd6T185CJ%T;J!I7<0)`yB?l`qSB1xfV8$ zTsj0$zX;K@(+VV`$u35TiGQ1rvqjg0nWnghH*r$K)~;jxl(L7o-DnhEIiReK)MUs` z41p0t3}M2ML6o}OIp=^Im8h|N+Jm%gCjvQpav{5v*sB&Bk@6*X5%vg?lbsR8QV8KO zIVDX#0+m2vB4W+jglTk~3^ml^r}6a?}IWG6V;@6*r;w2<|X{e*$hLWsw9p6*62 z2~b03_d1=1-n0NW_hlrnCL>f4j?T}41Efcb;=p`$6%IWH;0*82`;oFi+41Y^HMg7S z)R=C1Y(ZAy&iC{0M>38t$4*p5Zb;OEHF;ipqcJ`H&o#Vb<_uE*9rVC&(dQQ_ailIu zK9t{k+=ia1AA2L(K@xn+D6}LZa_~^wA4O{RER%N&3%<>_q3DvfDxoW@$1vl}@9cMp zEOH~P$!0FmPbF>$b!rC}?$B$cdep_mFnO@pXyY>0OAwl(W|XEUW@-$G-=bEj`R4&a zj2Lof(*g`3edJ|C^xk^JH}LC{j=r6k&WLj$Zi@vZR0d8du>}Bc%H~g>t5{zA94dm@ zVt;;K#J+Sy{~Qlm5=RSsg7=|TEc!_vTS%(7T=I-pkvqg@nZP5$AHH{pNx&wU;L8B( z3U~_jmRecv9hWOgS}5U>^+#@0f*Ps&xAT9yfY~^fOodnwVcy+QLuW;tsf~@hzw7gM zXyVm&;N`F?hgPodq$E;nuXE0$1QC5kG=xsEMRqltVEhlBj_t}|)GUJU)=Q#xRfSdq zpm{N@ems0&cSHn02e4GbmmBp>QDO2%LNSWB#sq9G{WL#o5l}=lHQ7hw8pD zHm1*5>5IVTRA$2#!a)S-gZg{2BtqFK-By1$xyUi?;I7YQk^)efbESU1+F>Cd!#*Ep zZz$ls(#vOm*#2bHDxomY{<_vuM0CbCw7#eboCa;_%({AtR|@?*s#-3Ny=k~au(ZuH z=IWxm9aNHp*@h4FZG5X*s8^T-<)(+^>(VaRA2(rLI=sIizkH#=aDZ)UvLxUPWeFzl ze=6kJ?KMz`#bWppm4E{yF)*i!+ES>_AY7+h3rkxjR(83)DUR0WYx-+>Bvg6UFF6uF zCzC3r`Ap;QmTJi_M~kw43bWZ_t_Ez3V@H=l=Y&ZY6&jW})Em0g5%ipd(V_I`ln{ny zC|=Ww-#JNM@EB&jx66olyfQ?Nn_ry*_A)0Y0}pLI!9S%r z@{*(B-1)duis}BpDUTW|uRjpgez$Muid~;r`p4-ZLzbU$Yyw^L+I*+yt0iDvn{9WDn_O9{mXj5eer zJEE#&0C*#)X6ca)@q~$L55ur`4VxMj(jZS$0?nyITuzm!eZ>ar^(rXEKKc4fRwGm2 zda2BuAa*f}&yWiDXbuIedm^1_lbMdlOvn2fTeM0smI;@F$hgQW{z22u&$gLE#!;5Y z@ZkJf;JCkVZ08)|0Au9~ji7R6LLCdO6B-^bd+IaY(a}!5XMTvogpom2@)c}m_n+BTmpdRj@zS>5w$I0 zEe{-l?sW98{fII^30lUD&bTQK^Cp$$_F$CS?iV_s{GjwcNho!bM9ICLs zV#_Et<)FBrT!}K=Tu5~YJ7h&k@s`^cfB6-JJXwKk1?h$4_0DMrsAZYZ=zd8)K7zf- zBP*9|E?X^*{NO#aIDx+QZzTn{9L7NXfok}WLP&Yoe@vwlV2KqBmP^h_P^w|`CMk~# zfktC5P3!782)Kk?x(3y_hc`Oe45?b^Sip{DkRS*)Fp?>ED*X;LXg5a&(Iqrb>7yhR z+ubUFf-Be#V8bCPhev8h=tC4WM%nJ0-5NKuahx_}TlkJIk{Xhq9x|r66895b zOSag?ikP%zT&OzD**}J663LuW2Ph;gS-t8lJu_0H zBQ-~qF~rCjl_QU;c1oSw(2lEiKJI8Cm%q3oUcb*yQ~k-p%&EM>rx{BOOBI8QcTuMP z5m%<{tT~}IyV+)G?ev&A4FUHp-yQYO4!~hz zudTZ^!V@>wol(z*S&YQ8m23%8pJ{#V&7*!Sy6YbE#C-5osUndN7wD>q@QBia6#Ch-l$ zHC`uM)BEq^DYP7x=}nGx-BU;#iJi{8y;T6LNvy$gG_$$I=1Z%lE+1g)wGOq00SV;} zC3!i%*Fe?rE1B4+Ds}yQL&Mm<3l1?+-h2Ma2qH7!5(KXiqE(?D$gQ;wH<&4ka{L`# z9EGs)YGFhx=RwPmhVB3d5xO@(x3+vZzLbvGdSQ^(2MaGf)I&HSg&;PiV33%rcELKe zSu4Ket29F})RdGD5^{kuShkl-Q9`q0ZA$fn>5m~{JGKd^&PNySVpTygx6~J9s)Q9$ zbMx4-Ba+nSIHl3j%9M>cF+t(2oZQ$+7xJ#mB_@o5JUsWl&hF3f2ZJsod2#28ls7VV za~v&vvqfLh7->#+yWu465a|%Bs?#bJb~_|9torIu8A<~o#ZfA8vk)gsG-L&#$Suib zRQakQ{t+q)@bg0UE3%eJGROnt`kx$;I%K6eHo=jXyeX0KKM+B|4SU&P@^uRY%Q0>k z*n;oF$f=YgWH9y_U}O!ntYasWOzeqmV`5EgYhv5R#I|kQ zwr$(CI?3(-oO_=8rC;{mYt{OyDj{r=%du-rL%$JBOtdctIF@pPx6!j~(l|FPY0 z)0{zo#|_MtZs|P}s7WN`^3Y$}%)!*@ehRATv^ZF%=lU5>@i96!R^xqrQh{i9q@%gw zp3)FLW#cnuS-sU=(NnawLAlhDLWUOk`MS}9nl;ODy4QsHXimZKh|?!NUZ+Ar80uF5|<;)g`(ZsO(hi++Sv4B2ePWQdz$a9-i<& zf0l*i?rR?gOtAA`tv_sZ0OTFKP?Dp?h3wPYFOtP?y1ZWqe_t2>ulS=FuaxSwr#ns(fGO)f&S?w*}2 z8-#PP#KE@{1?L5CRL>FvmICkH9W)rghb3~)t?U)HIHdo8kZIS-ViAs8=3@{6f$;a* z)SvSYdd1YIeO|g?J8A>Lc!&_-@lBy%BuE}m-wo?ElF=cc^h;kyP(qC7d+N?oS>mV@Ax?r%&e^f_5Q^ zwf!UlJOaW`$ClNTlKi4~p3H@gF7N%r%t`Hk#rYZZ*U89DlOhTwI zA|G4^*XK@`Xa#sV7Dyhfxktc8K^teT8O+-a7 z)9jbjDHs(6wK&|@Od+zwTU@++tY-yvN*IRGp~K~q)0mJP8@uU>t&}*1(*FgI(~kP& zX$%fNa^ekN3gQc`&7JJG7!twiE;XVR)yl;l zvT>KbxHlzwf{8|-Ut0jYxA6Nm^#F%#ht^WXvQD3q<%f4*n_Y=#MyCGUlgQs+UnVOh zJTL4cu>jA7|$4bJWjSpV#L)P$atsp?t(9N-n!KsBJMkQwwmGTx4b@T2&tDH zCcqp1%58ttacBb?t=U5$b(1O1!UhV0gn(5c7OdylU&|NSp7w@@B#(Xb^X;|Q#Z@{h zd?)+&B>W%S_>K#C;R|@O6CZqcE51*`rXF6=^L%n~L~GXI&OZopO1lfs=`oWC-{x9u zGk%DmpHO-|bOD@a+-^p8YTd)0DXj~eIgG(s-=zw}pAw(P|zUn`$1zesM53pWa zI?_qH!;O#7Fr#orzSc>J=L;%8Dk;O#(eL#EJzl2})P294RU`!!%e->yTc%J_LlZZ_ zIS2YQ5r}alES!js{3%K6I%!Mvmay6E{uYQA_YMclNSgcwjgLdqM!*XhF#LP%K-_N( ziUZRG@9P-?KLrf&J~l3+bbwRWAy164#U?I(EQi7*316g*_{}50cFX_1w=g#%DvPiD ze_DXpFITg0SJ4hRQVyn6BKzr1Uj3Gp&cpn#tA3T`^}QS%SX!DH8^$&x-J)4abmA&- zVFnt=a%Ib*#Ihy}v60q8I#_Pdm@GIYTx=RHV}2{$UB#&>O^z zkbLif!#N70Uu5uuGyi0+W-Zz8?eWH5GhH*|N>)MERO0v>D02nRF zXs!VBdoNnjoLZqc69(KO>R3IRkK#G3Wir8d-XB`-)wH!cJ9cLmz)%%XkNDD2rSum?P-QGk<3ASbX$S1YarfDa z`E?M!zi?bUu7@A|w}GhfJuK9GpD^6M?Ytg%612O1?|BEJ7Bp1h^Sv1nAa8lospBF@pz=0IX*mRUw+YyPmJ-&ItBpD-2bzi~oisbkhV=-kbOzzVCF>l&W`OFWwK9IiG7?JsVMN+kl3T z+C6xBVD@~b<|R@JI>y*_?WNCa=>M1h>uvU`(o@X0hwRPo_mS-OHyC~C=kUPfsfKKV zj98UEDfZ-abzR&lJ9j3`Ay;e=hyADhPCKn-dqD`*Xw*T1LFt752-MtGB_{p+Gbr@O zM=I(sv8UoGbQ=1o4qvALC)6R4joukXoS$>Z zK}~h;lfC@u)Imj~V6uT5V2;l=)&=0L5tT>@+xZ#6gmJ`rAdQ`+pqN?l44M^7q{L-V zWz=-vLRo&9GO8re_BKW?SOR&(=0Peywt6i|%a2`acV6$XPh)mP2G1Ju{AabL*Ngww zdD8WYp8j}cC?%}j?+-XF9L15R?T?s>o=S0P3f&f4C~fZqK;&M>o7x1<$Me%4Cr9%$ zA-Vk%DdqYg&M~WZ+pqh>2)I<2AT!p)=?+}8346-?fW$&-7PR$0&DXas7{6qt zOip5EgSu07r|AYtJrq_9De9n{{VdQa6fN)7PgJR zd#cOA&7uYm2xa6{@16anW=kJ-qr9?dZYyMFLdaYZZHJy>;`tfiXLf!2XvOzX-SM4= ziVg);GVIW++{yqyvT*Fs!WqrSJgLvbj*&HFZp3LQZh9bCjM~`|pT1Q+I)bjWwTt&aiX{|}Pd|YS279`K`zjSLT*9zf(YLv-u>I49xm(xxO ztVXym@v&@^kU!(geeEE^p`Vg#0f~mjah4Blop>%H9D^7{&INsi1F0HkicRJy?|mo| zVqC?-vD&JAX8KYFPh<{?cLz`~XwpcYffLC8M(h24V(N4pz4?AV>ZsZD7sl}N^%wS* z+`?#1>CrT^HF2tQN{2{R1(;@Lz?@`TEo$j}(H6?u!Q8QP{Wmprf7xcMP1yiWwOYI% z;Cm2eMvNk-JR*Wof$LewGt$@fafp57%VW#%U~C-R0NN?(X5-*fPt^fc~-GRmxR zzOUImf4Z!0pe9+-wq)q4$(hfY(Rt}SbK872*)O(Mn`u*djM=@LSct7w4FyBW3CDq3!OhMjqvo24Z>cQUl z+ieEBKS=ypobO@TpAJ|HY}1ft`#$!2=_a7Y>)^@ubpul$){!L-sO9?e_&kL6tQkA1 zOH$m5_&oXtE}@%t`i%THd0y!lkRT{eF!pu1aIzt{9MgOB1bE#=yP{Jq= zXZ&W^A(qhE$60oFmMu2}fskBUmm`|P^Ft*g4IRtJoWnCM;BwQzbe4|Pw5?G3Qh!IC zHth|p7z0M$Kx!aQK$MW|QpU9#;IFj`xH=#RIi`#pHyag6B8D&I;gNTM3S|7D1LlEx zz|*?FKg?KO-Ps4gY%*TR5nwUUqH*Y~CWV^VJ&cc`fM7+u6^TWS0}D@~@%eCjb?Ha^ zOt{%u1$AL!?EjWEJ_V!XVYoI7oHamD6x0iej0$)NDyzpTmvd$zqsfo2)OkVN2Nn0~ zpdT3QbDrL&-#H(=rEKw@#V z+CLXsnc$_(ov;dNW?Gj4u%>@I=!TY?y*#|rH-d8QTt)AfW~0Q7kF#&&K+$BV(7ZxybHCTxz@4;?gDldl-N#i5uVDs&LYbS3HeN#nEbJ#JQHU)qe1*iKbVo0OgLo;885$-IX2a4S8?euOX;ktlTf3X>6PHcyDg0xuBx0RnMNWuFnp#;+M<)zT zUhDe?Q3?mFgj_$Vxeux)@5tOlQ!xyYMtl~2@q3AdJk=l_p$pf}mhI6o8mv7#k|xB_ zA+bdM7c-p-mJK3kUZC{UdI;zaK+6b|`~g8C)-QyCE{8!w2#NR7)TWP6vEv3AGQT%1 z<+)t`J-(05BR=V2LnPE*7-c>&bd)ytrp!vB=AWm*g%ce#BcTB1J1%LNDFvc(&rXQW zPwZywEbAOft_=^6W^E$s%S9%y| z``&>m#LavE0lswdAoF$|(=BVlaST2ea=mtPzs}HMA^yfyh5t2wlfviy(V*+Z)gw>? zl6p6D;8tVSz^m(L+uG83F*M_Swje3q{gu=6IyK{~x0Nt7v`@i*TZQZM087=bcsF^X z=P`5Du_Eg%crrng@k?Aad#54qi6qB6V^g0Jx$CUtrQhK8-f7E`!Dpk})TyH!@&sZZHN@|{7&j;6q_ z7=IR7y6SfCoo2^bsGB)woShW35ZpF$Yk77_2F;%}L=mJV-&3(q%ZY1xc>B4uuP@)k zOp<$L^+N^B%Vx$>!V|OO`47&AX)CpGp!{KXZo>i#1Y>cWev}tr4;G&IW+ZB_O8sr%u2OHK&qUfu$k7!*njoO*RU#=h|5j+ zob+g8i)t>DZ@TY-`!vfPk$*b5X2v65p=dNR%F~HROjDw`wt4UuEls&ur&iyc>l+>h zBUU>f(~(AxK|!s6a>OzC4+I6K2vb~9`k3l05xmCs6__w9KYmjO9U|gzF@22Kg4OY-sT%gqI?cF7bZ^@ozSkYOu=JKxT|t6e^2OdRTFO``r(Gr zU!n`SrV0&ddiN0~8GQ@KXiI%$=5H;=2 znu%Lk(Y?D)2&{8;cL$EV-DsBM`J>Bq=Z2_B;g5t-h~ZF0Ll(5(sM1W@M9m?H0=!Kx z9|wC*yiVmH$vrVP z8~E>*H6h2@=}VdNdjcNxWYc9KaK`-({a(D!05D;>1E}|nQZ2%VJh4q+*V}abILOsl zbG%=(?e-ifj-Kb58!f9q5ZluFz9R#Gk^0*rbff3sG*~6pI#iPI%RkF?P*W0r>Job+~X)B z=iOfBMOjoMp_n}eFfnYsRpU0m@@DL0_AYz_aNs5HHg{+PNa-~MiV~ z^n4C|>V4PfC2GS-Bhn?tkA~wmwbOXqzYw~qh|94!-Z6aNF5UO$7>0;ZPg_|$Rf^f^ zx7dDtVE#Gm+TY%A{gIQYSV;{0$Ca78SiD;OEB||kpYRYF%q+nWkq=&g(3aaz!| z{yB@1iXe==S~!?rk(GcvM6y7GgU?#1#&~^>~`=w`s9d_uH__yBjK~zG;Pn zAC=CPfq_08|LOI?*vYiha+rok5oobk zJ{&!{duns>AcqJ!&h`UdzRNL{3v7A{0ouPff#M{eJ+Nb~nyu8|T~Rj0?74ytak!wNYiqhNc{p+S zOh_~N>FBcMG9A_5he3e3V+{XNWJI_l=0OZv@XEn_h*V5bwx4(5kjWTts`yaO?I>bY z*it8ot!J1-B&Y1lmJjNw5sF0Umx5M;n%bItT40>1xj|NWf|4E6wcd&jGL@pin-043 z(^FIIE!dsbjpw4na0>SBcm6xqT>vf~t`i_TeD~EUk5MdW87nUpF?6eaC2IPjdFE(- z*DrTe@6L%|N_kn^wsB?cc-R2R%JLfz@M-&;ZyiaPo{N^%Cq7hP8pFeeq2KM{+86?E zKdJInkr>*6cYr3jTY)liC?e^#`xcZg0~KKk5ViN(#>Mr%W- zn3-?-isVl4*Ju$~e1*8O+1#g>Se=ytL$U0|nG2l-v&tpffA2Mrts#?85@@`PEZu+B z(!cq4NtRHxQM+5~T-#V zJry?Q5joHrp24|d^vC(lF{OmQZ_iF+=i`p!cH+jy=e0xclTFt4))cbO{&9EIBmI4@ z#irvPyF;=M%}cBERb>S*gXyc{6Fp?&@pe(IB!T_A`?idbKIacc)4oiRi25w52h8K= zVn{ccI7B3(3?Ua|r@5Bv+ncBCi9ASaGPES#CeQ2BHz3GB#{KatkSyS!f1>#{L#Lsl zDBs2mrrh>p;I~g}(v@9+s=;bbjXO z>Kbs6i=FU&GVEy3y)GX(R-Q(FFIKGT^&CLnDv<;#5xR|}>~5J{0|(NJ(wOI|VRrRa4fNbx=YpKvW zcV7&eZ?tJE2$5nPtSFeLUmBE6N~95(;$MkrXgXY4kJ%MM%K75c$@d6;BM+Ya5W_`)eiY@3Po@&s3yX3SM{wFhi@WhXa07dNUUjBZ5`)W?cV> zx6C?ADH@DE!7kAgYuEewx!F~DT8x(+U&RVF4p&dn%?ic8u3Ap`rxrvR)57|KcmhFo z49J{n*w*ijlouVOAnqX*weo&M;nPEThIW1haCv`Xeoes5H<4$|L2tzOP3S>1MzqKj z{nXD)n6H=60$(JKIE0A)a&jliaNtrAGnLfWOpv*;bhUKiRxi0bU;*}Uotbn4x$+uU zAL?*&T($sfjmezf)=^_Nk(1$Qq`l_8B{a+waGS{(iC%gL!sW$rKO?HQ$dJhEM_yun z+ke{!C1!)KTfXk5?P`odLeZSWm30>kBAio1=TOU2!eM1NJE3n!nLxkD*cpAGe|Ekg z5vKoJkF^Zaud57QtCK%Y922B2Wpw^pZ|JJ}MYbM`Yc%|O3aJ=8DVrTvLBxe^tDj1L zo>vizBzSTDz#pS*Is&u^EP{x|5{_#^?oF@gkPXNID`z#jnum#|L>jBty0l;y1h8<+ zXomU1m-wD&o=QmkNnoo{Pb`#fo7D{I|UtLWYO(cn+Ny2gL@xMb^CQ&33aF4*vQw}g{5*MP|up+pN1Y1 zaM7tZA1FrB#pL_kyGdL{6kURVG$lD&c$t3bnKxo*tjc*ib){L28WvN5Oz3Ya+5z%O zx*zO+8F#+MWtOo2aJOgBL?^P(DNhW^ZK%F`dl`w299Zm22qOUt61`Q?Vto9492_Isc_mOD#Q%~^+E;aov-axJPbR%ZyO9(J$G6! z(Re5|*sYFt><5M^7p}Q)eV?cx`oV;$Ff~lXu~_OjKK~RLS%VJQb5QN^2zIMWKal^N z%)1xW?*-3n<+FvxLfb&dF!IxNFBfGZ$vSCe)hQ01%Z15+;xb%Pr*2Ej ziF$)Hcj(I_MRwjkmTtx=U= zfpqWBKh;|}wCaJ1X|jiYP11df@*we$$q>1^+##-NCZODMe4#%@IK!qW71L-LpobN5 zn+8=SC|CuULNjSA{@HSNCXb#KV&%tY?U45?CnrCNZJoxM`v^^rgL!BBU z9nX}gzWO*42t)!Y&olP`C@*VS1%%Q_4Vo}b$tfD!^?m~dk_Ew$03}mh@uOY*r!qu_ zsN1}vPX^|xKG+O~v%ew+o>Gz!AGAyTn3`GX=&W|SnD6d@>w%*M5okBNziQhqYShU{ zGeapU(?rlvXc+^RCK#ve+)SE?yvcF|>UU5Ppu*M?cap114(xFQ&2RYORc#~SD;f&) zCG@^`_lev24kxy1%Eegf*nGX^1ib8d>N$8kysBRc1uC}uJw1tvebBr995KT_q#91@n-6@khbohj&?@rIB zGZie%{ekTcK}^T{mL-)U)K%(N0d<-?+6+AWlQ*C{pK<3@4=`u*H(t6YM1*U~ycAxdQYFUfZg{tW-- zlcw8@u+wxWioaW2fo$uO4#?Y%|E!QZjn=`H?1`w{wHya%7mC8%ZuZf`@nXXUy#l&X3h|*M&fK6L zt7A8N5UEl4Ksf4t>40H@ukGh9n`P;*oW=bzgzmLnol`i6?GX+#Lp%?Plo$s=&Nl{} z;}uFd#ZTDRF4VEX4THwxsvzbX&r$&bgpRX^g?ImytVlNKQt`gt+l3Ecn|LN7b)T|Xc{Bnqyp|4`I3bPq5pgxcRkmTv>_L5&JxjX8 zfs2cyupX2fT!foK6gBbK+ub~@Lg4u95X?)YO^yJh?JVD>*Fxm7ZS;Nh{h&BOWfAdKpdjz&H#SPp6dU!fPvn_7^(bSSq%1ANYNLNVW@=d>n6eF(LDl_5X#=k zElVirF)BmJ4t9Nx!}<~S7JDDb!c4z=zrShtu!2R9!z9-jT8=d<3&;JhsBvh*1glG9 zrRJc`ND0Bu+~{@-@bDD)NpfmPz!Q&qHbM$A5H`p)^BF>An>;r z&FeynLv`nLcDqlQ2G@Oqzf;7P6V;gUH%jMG$_vdh#h6GjgsZd1)bZ8t7(Tn&cUDfc zmGSmwvhzLs8*j)RjyQRM5+Pu@-1)dXfJ%~s4wJ+6Zgo5cPeU96(Q3$(|0{UD8J^W^ z2j6p$GhfmQQc%s6qmAuiufct#z|T3_k-3FE;WkI1x{gqv`ZxLA z#N{Hu!btUh@#CbRm$Qd#KKXaIJvOcA-%Rg?@Us3PZ+kLZ)cU>&p~o;K)Z^phyE4a| z)bt|_)a69kBn$-ol}dPJ;Lq_W=&*f~V~#ffNayUsOJ zjUf}ce`njs^4wu2YNZqdxUr=T(ICBnW$J2b506yGQaAX8;t{~d#-l{xWhegSI)IZA zbsP(7_9rhEK&AT~gmEY%T|$M%q?;73<%m4V<)+UJghD8oRZB+YYh$TSqXM`UfJdJu z3p7f_u4HV+%=C^SE*^|RemlNZpbh^!fS&10erUF@Y+l`{H^vk1v~;HQ9s+MBe1k(PO5x zC3joE1S+IAnG_8_OvK!5Zm75-g6VCqh!H)#=>>?tVWZ+)EY6LU)7V}E6op(@$yiD* z-Xtz5LkO?_KY3@+GrV9H4vb(w{WYOmW5xOD+%`^i4--IA$7BesW>rriKv?yJw)x$@|#2nOWu|Z)Rvi`4+3;=lfG+dG_S+QV~!;9o~N~Li$3>X!yXM%>F@6810Iu6R|9! z+~=a=zq7JI75TxUm>u6t?^^~mRLjB&)Hxn?`#F~HFcF3(n{voYuqhqs-PUP)e?kK8 z7jC|)_seBA)F5bk1NW7EH#+nrdH%bLoX$4xTY)k6oQ78&iRX%9tYndKV#}pCBGT7X z9h+yA|Fj#$7OU}|7R_*dycPXui`l9j){P%-2tvq z!4-j(iCe63UA4eXUD?HNysn+@3O6I1pQMuXTB*z3@9|Uyy$EU{G+^)MBQ)JNbPZL z;WCSq1?^wpdkOt`{k&0;mafi8#y&x*>ZJZp8KzjcmVmo}9Yyl54^wZUaw_=nNqUNQ z`#scz!IpND%(ieD?x{=rd#@{+~|=x0>~1+GX-_3#P&fes)b_Y#v6zj=S&( zCZCJ5;o-cIuJ?!9Zsf}y1&EfWLKM+cwY}E#s8Rycm3=hcN+G41%q;8-;?bcFC8|1Q zoc2MX2GziBbLE!OVw2?XiBxPcdef*XzP_`TFuRhy+|lj%YidbjCw0ysfQM_TAX|I- z6{9Oq@pUkBG2>oeKQZ>p=bqe;|J6iV4zca8Az+(V4?~^`j}^OQLs6j<}ck)`kkl#@&%*ex4b9c$qSO#2!8;G;P6ifiIyYS);rUz@q4Vr zC6CxEzhKzyIDy{j6t!pXley!#@zHogxxRlD4ne<2hEwgos$1c$GI&6u?LD21oGbJl z06u~vdY`A+;GVLSs+b8HdhR=#&eG83SpIDB+2amxOFXXHb|!(tGW>0(4puf%5AM5s zSM3iIF`GbQ?-hghW+6oBAb)*(Ec-@Ov6fswg zYC1eR{Y~Wf{EU#_8hF8X+r92$V;Dqpra|?s%+pnWxQ|iezvu_L1~$^k+>GP?V2FDA zO8(EMyOOvwh2LdmuR4m(B*Q=E<@*>GFNv;87c_x5&5HY_P-{2^>9~&q7Q>-s)xKKD zF>w{Htvh(Zly2uzz?7ip#BQgVJxk<>-)@30H)6}QPniCL+FzodA9iYw89to^X)12C zCK`9BI_j?0Y|t8X&EX2iT;4MLP-AJpCec&L=)BOdz<0vfJ0Y-v*$I<0Ix#8mg(la^ zGKZfP7qYDhb~77NCv-nWSTL%2ZtK$Q?8!J`ZEX&@7o9j458oaK2D%sO`o57{Z41;kD{(!MD;iQDlW@Tjs ze17P9zg)!-YZx8 zVaJFEhIQ$TgoB0-LM~#_7us+H<_J-D9>u0vrco3V5h77_EZXFh#uAlpnP#(goKaJ)o!5+x-g|lr$t-9+A zAzMf@QJl=ToyWojq2;3d=p&#L!hP%DHOa6yuT!V)2}e1f;-(eZhWi%>M3UPTSW;n> zUR+yAsqL1qw78+t*c{y8lGt6_PD%`mtZ5MzHqHe!7KA}NRxF&cj;uN=irz}89MnZb z33Ex>P+pQ~o)Xc9(o!)3xw~B#uUZf@cZM2HUHN@pD~-ZSc~ECK0nH{A{ztSS?Tp^D z1pq#KW_fi^L-cJ`Q|j!bq#3S&b@{)i0s010*-Gkg5t<^7ts)lL=l`ah-y;5FXC>LI ze-_sIgjJGqB8X+J7PU1xJvE5D4%_-D6c}6-Thrh@0THZ}o@;Es+YTFdR+WQlYOWtmzCb!oxsrIp^(n>o z@M`b$yvacd1-o7#i}&FzWqI;~NQ&F}{Nns@j_H3r_kh3ibs8d3QTW+!@Ewv>O5PW! z9N|t-V|Xy20+he1w@xjZ{g;hGZWZm{#sxLd3Fe82a6{Y+tQ)gcYjrc_5io=S1Tgd0le7%}cQ)_@y;64cl-Nd;>kk@8|2 zrhJlj$xpw80_hp58*Q>2v`UGYIA&U~?z2(0mK=hPl{pFdAv3?^uakA}<5nHt;1DVw zt-fx?w97xjG2spL*_2f9)9;sGZEO#7w!1chZ79Z}pCY}I8sbWT!k`G00UhQ+pdiT| z-o+sk6I&aa_H7R+o6IafADi0HCWr+|#B(JC%vy_8EL4O8hZe}or6LKlri?M{R3qeF zsK`tiaR`31FL2EcrXeaOL)f9=fwmuYM`4Ga77kM{PA?)tFK>D#r8w>+Xt6f>c@at*p-lU7R;?AH4Z^5ZrH(LtpOjTskN&ASkCLusWp_He-e=`ddEk#qk6rBK)Y|o~d4kH=tfT&_* zas482K++iVy}9Mbbx!VvzBx!I-V_nKTvMM-V$D?iQ~&QbZXM#Ck@GhyD@AIVzpFaL zS(!k8M*Hxrv@}W4+o3-)Ea|UxC#a}=LF}xkk%@Bon$O4pi^1cRBI1!F7sYnC;OHQ{ zc*%|0Nl}jjW!VZf;e4iiVC<0Zx9u}KEBmOuk*PO<5Y@e%U(H=JS8J9cvqY6(l`@qi zn-luH7^(Zmj~SYdjZMlTBqQp-4oW2pKe8?y33LN<{3F^m-+31T1$`JGZ!%TB6nmbs zH&wn(iv$%g|4;+27Et@14$o*);A(h4uxO`ds-@UX=i8uf*3`Ux)ONyUnACJzF1Q%l z0w{c($wMvnxV|nib##3o{(XP&kd2za!K^PplGk9|M z_yE!cQc=pT)8a4qSbnixQ;$7ZN8rdEJf%k3%iJXKcj&$0RG5h z#+cRZx>hb-2Q4wmdi8Y}Ck|^%JntONh4E=QJ})jq)XcR-4ZM#9PFEG%r02*xj|ZMK zp`f3F6Fj90WXXD^C2G{a?-=*7pP|(T*f*XPUJ1;P`@i*{YsY z;etlEKw}M)i$sRrxXwHAOwpA5eI~f;8A$c(F+q)=9gV2zG9rGeP)=)~N))v`GS2cT zTXwRN=#-tY9O87J{4G34D$*a5*}fRY22;9u z?9aIQ0qn4?*bM|}F_1d)if-2AwmL?E^_A=OuSUdPmSM;NVz|$B(Xxpzc2Xn67V2Z*crA@2ZNZd=q%F20lF#bV_8Jbo_|Q)8+w~tJKKC zw7y2|PF0MeRrGv_tB~?}6(d*_=0C1qq;^eDXE@SBQk@^@WSFOnG4|G1acAbt2v4{_ohx(Fz zS-*rjgfUv1w5x4w2`DZO0jrFgmXWFQ=HqfI71hL32lFE@&{s#;c zdNv?T55uVn_#s4*Spdu|rJ#_T92WtHnB6zH(~d~8<70u(u&O=X6L^59p%3By*9ywU z`r^hbj4phoK&9YYbgE}S8#&W zomWcT;!jJ*py#rLlnvax-_4xkxEL8{`tC{Y3DUNH5T;@2Smp%Ls__}Bxif+}yi~7_wc$j)_hzGBtf43=B&!f5L2`ZQEN6o0B>KW2 zrRZ1?MT_o*J#!J4pai^Q(zjYU(xwC65M3)>^0srYHdb|g4tui`!r6{q_vRkx*VW%g zJ%@RAzQ<#_KP=hglGkFx=GMY%V*iH*aQ}IK*!kOcSq)gxzTcz{O#9i4Z+TD_7@5CM z=vWz}7@QXOD#0iz^A03rL{N-Jjjl#fQD{$r!MNS9x;CIqj2CX&Gw{2Mt5O3!V>4&c7~D=KT}{cNQBtw^u)SZ3zPI;4W{UQW;d*FnGB z*UFCV=6qKz5NwDZk!sO0g}?b+;o$p#%s1N&46%7#_x*Yd+4-vSa_3FouR6$|X!(8L z>+gBv2H0MpQ;XT}`hG7y$IuS~=-9OKBU4eLX&IdP7tze}ER$KPRH#AA{*zpuI8sf4 zMbmL)0G3tR!hxF$YY181JJ>Yi8u~-vNq#`-0fR^Eq=#6Rl5cFBDU&wqLjN$9%(8mk z@KK-Ng#N=6jU==T5s(&H7!sP>xDMDVjYi82fl8R(*~54<-mmCZ?{Di}>$4dZ3VkS`>!#!Q&TgFY~=c+bky3VER>;z>t8bd1X83j66l&64uH9d{yxsJI23Y=ZOawmvvD4coSw2C8`cX2V6=CLNTfGUG!*eT_$0`5$!Jgih zxY&%}j(%J#Rtjf-#M4km15rlda7VNQ$@T8ylOB(UX}zw!G`XH@ud?Y0nQ&(bHCyA~ zadG8H2rjwRNPoPnM=gXi*F3*lyR06^5|Y`ln#^Zp;aK_;pB9)w_cQDhI6J0 zSD|JR2&7zl-9`;{fnER=*ntqriy=?d?vb_q)u+|sATI@OIp86$2`UZ?Lzi5_XrwRl zPnjvNpVk|AH(uY&s-X_yc z8k+S4uQ2*1_I&VIA+-KsV5zB24YsX?P~ohew)e+uC7>G7DhxljO_wcMEfKWuZJ)HA z-l{cJG2Qn%xCnK|JQy{+@6q@?P< zP6T*f@d|taLdVUnramQ6_wMPP;8Wz4)2%P@?MZcqPQ^l++|Oy>1Ae5<_9rjRu06@E z)`J|u+a*8nl6NXzM(k}lsVLg&b`Whbwzn0Jmi0%Et{c^_=f$sOUvIpJSDojnCHv5m zwCq0td*fdRO$IqDY}qnq0(Uo8x}KvcnO7ey%~X2&{81V7=wkFcbQ*cH<>@!Y3Laky zn=@+e&4UZ3Xj1|8agh?W*hspNN2#_FWuY%DH$z(W&d4Bm|B|1oA}WgnY$*N!lkM(Z zB%04~-3flBh6qhPtSrRDkfF?31V#y`rB-2 zt2})u>ywzEHW@Xgdv@gtLD64Pix&g;8e))pS}uEMoQ@27&ylEoygFCOUU~w4=(l)n z{bSo+%ccV->Yb&6awGKHO#_#fO&oL8TRjT9H#sJrsJI9%et5@jFvUHr}k*ns|)aL_Qd6j%&Crkq4>ufDL` z$cTTFoXir!t9X^3_Tp`QYZ_iWB$k;|S7&NN}tRB z{bCI^O#O~hc<1SFOkYn{uIx5}d5LIu`wPn8sYHi|`i;T~&fdd@{;FNq-Q-_2|fgLj z8tSAty3Oo8KqE*#4L2(~Ts1#mCVtqI7eI#_hFh4hwN$DBPH^szMRqB)R{X>DG{>T* z#}}Dc5Ndj3-X7n{)Nhtx_=I`dKj3ku?j5i9H({!T>re6tFaQ49Wcx1Yj!2)!{|m20 zc|HW5LMVP42V{R;47&|#sxNZ3rj-2qAtlO!#o@lMs-~l{c7D-m@+O9K3fpe$$3?q8Y0?zj{*Ct4W ze9n%gs@{|Bz*PLS)d^K9=xV&%E%4y?!j`Sy{?UOzU$v>(@%bawpplhO{<6(7@x4UH zp)Kc5kr40g)*`^PF&&b_!)|rcgzbcY;XlthUqB*UpUn|OiNfc}lS2-6=Eu#GJ;atX zum0aA+pBg!Biw9$Tkh?o?0$nhB%R@Zv8c$!^NYW&>BM0asL|dJ~7<2v9fX7 zi1!H*S8zyW-4y7p%uWmD3pawKAQ3gVd)+H7R8|UIpju$6#fQw5B&nK;msu-SDOpgg zJQD^>uGFzgkL3IllN!ZknbKu=-Y^}F5)2!%y9a&W#f!pze+HeS|Gv@gy7AtVczj*n z-4l&lDc?c|PlF%}wE_gZ|9eVmYA!rjBFdp2*M8JEwu@|hv++{efPG6||6GM_i=`T8 za5EfS*lh!PT}{f4_jS}{+&A&}h$iK+4pnqKheb-#1iQr8A`;57AMz9K;Jy{axMBk6 zcp>6n*885XR&v7el*OO=Gto&MWUv-Jd#xJfYR$Q^~q= zbQ$my5;RwJDtMBJmEugmE$uy0^(yn-_0WeC zRbjrPCO9YqJAJR~6O;3O#IJj;N=wg>ljd=tkAJktD8Q*dyFy(r!R+mYmL-O8Q_yuW zzuUL|69}4iUTiSZ3yw^5J?%L>4|DoAWkd*n{U1wjoJi3VaXgdvdR_Y*(jrlwruDbJ zN&M(4*e_Wz2~dnlJ;HVm5)yJTU79~d3iOwf{&E_fx}wYiIY}R*u8e$Wdj&Dz2fAq$ zjgU5hM>tGZ*HNVi#IaMkC{~Qt>gJ#XWrb{6Hup4%6NFp*r#3DP4=;J(VvF%|0^K!S ztbEnBN}j7(CxueW%$%5z3PQ*Gpkc8IovjNizPubS}O!dWXz z43luEs=X~ImZ;WPsQhR=ocD=V@hWGMIbq|TyPNs!?SF&9*i|=T!Yz9@XUt}>_{Y`a zz=VTUT>$m?2b&-xg_V7*ImDS}AFk*L^Ta;t7OePaRiyFW;k;wF{LcSEY#s>W`OskUwUjNULs`k=Rk9Gc$oLk}+w5tdCB%=PibcW&eCl514s)Bm`9{ zZ7t29XBDFAT3}A|v8}l>||!OPQ|-8K%W8Hgsqj6m2uKwBgj!i z!qR%aia&QT!`M0^r6SvKIM=9>vc+uU_eT3+!dwiIG9f-{$ zgK!Z?{K`2~pGDrCNM3}wjFHn3U|495FmSs zf-gb?9cL0g#SJQ{6JEV5<%+RPC#x8MCtI{jT-ggSTMM+pZFOKmFjNi^2f1Z@O1gKY z__SY;PtNVih=omG7UC~yj-VHRH7Vp6nPrWPk|mSCYbNOOl)+I9krD-UlKknWP3=)t2hO;vf0q}PY?p$eE$y@d!R_3E{55` z?`7<6RSV713)M1(9FxJ~WQ=H=i1tE_%gf2pnsL71fVl8G%AzDZB-heW7#8MY zuRNQNc^FG~SSV3+m9|!!tOgZ;zZf!D$`?kJVkC;dfiMkKXoXM6i^W|Kg0dr>pWa5I zBCV>Cg15lNg!^4EFj*9|fj)8B-=Ufs&zEW8LgqCt!I9NS?9sUO?~j7~xsGy#{~^>T zWS~T}4O@er6%|NxfZId7pFW#AYYlQ1Y_Uy7Y|~Tpyl^yhbfHfRGQD*mjKNCQ`+3LX z_zXm5TXJ#SEID|1IT$IazqPWv`4Gn|p>u)_oXWQy5-KA@`41gzO9(@8FFE~xU}%hl~6`o_C? z7bV8$c78pQ=SS(X64r$H^+~CqWm~M-ebZW|c2R|#?s_>AB&@L9Z*;9L1pitxvX@E6c*2|LE>zsq^9GKYyav$5b@K+RvREil$X68tp*q-g74#;mw`9 z)KXYl$&D)a%yGIa?m9p%8#g{exyI&+#0eKR924W&Jh3!n!T%Ep(5K5y6w*`wPSS7a z=rHrO;LFK6%z10$>kiV47h<)*su88d1isfgdj8!X8_1z(AMxhpN5@|0ytHpJYG!c) zlGzteR`wk?=wY0z4-^cb1B9YnIWb) zkiR9uJaVw32W~KFyLlHpB3uQ0y6F47$bKEJR_M1>P_UGbe^CQ7Fe!w&_+?}P)KvO5 z_OeQ(RsWsM&R5h0QXQY?^rqbF`N8oAz5UXdGo|m%_Niu8f$Ke+I(``i7l++hc^9&^ z3BQ}ZY3q480fuCG^A|iY`lh6$#1RpySCRscmuvRcv3S16?Yz@}&kVkRKjoD%$E)I8 zC3lj@cdwb~GrW3$^eoCC(4|ajT!a?^0pVJM{i!}l_Mw=twann-`fsCwCCy_AF_e1_ zIcPXt%%x4virvOe)xnG8|1*phF$91mAXh?H#D)FlvI3adA>SHaDen~U(;^&6 zj>8rMNhkRUiP1dIE3twzfQO+G)U`>73SCJ8U`Qn<>Tl1dM);$qNeCbQBB!VR;>`8Q)+X5jE))dz&(v5gbQ<*m*ROhq zT+v^dgI1wjrBag&(Nc10+8{G?=vjy#l>*^9fj&2PAy%N8Ei(lEnesC1b!m+GRJx6U zo7^zo!Z2q4;OZf?Hla0VxI7=p&6zmU-y!EltPof7Z5Ys3o(IJ$iDzmMJeIG_x6G1`3E-y`yW zN)`Ge*!ke{^%5H(;BUIWvz0@$@HAi|xp|kj6mWF(b$G-5b#jrTqcuW_b`tQqHm&z~ zPr$kHG1&a^G4AkwvJteR&RrJZHJwVf^PJjs7xeW$;8Npb9f$oa%g{w8`i)RcZ1WSlOk+G#uZ^qX5e{! zW%mMCslJp@^6u_qCT9FWQA6^`cwsTsEcI~Q=`;tBEzv}DiDL*4d!kYwP7$%5jaEFCfykpfjtx3(YhHLSW|4`fXcRreQz zMWvYD`C6(iSwHUFT9l~cvrp$JNgpD&hD24&nNw0z`dDjsLK0fHf_Z|(Z zZ34!C7&=WH{<4d6_TNC~ljFanT;=Zn;BBjf9seVj94rzfx(~7+spEScZ;nN^Vvrye zg#5E9+yPu37!mv^vIK%^qd#>WPY#>AkIahlneKv)k3JvXjs`%hQotUIbJi25tJMQS ztLLmul%()Pr`o1x#O066; zN>9gz-A_7@pH3Y$N>altyw%Gf?_BrG#GhKr;m+k?x=?X_ope!Lhp@y{0!;|dPCXLA zF!+Zclzg=qZbFM>f#f5>cBxNp@N9S!DE6S4Jykc{d*q9!^E0rQ=8|mKl2#zfVQO$_ z-eA8=i>BeU=oO1WEQBp66sBmtSF`+eo=J+B&WWNs)a<~LUQ-vFi%lV948&3CUjm4r zwz-0+Mh*B#l#{59Bs7+xzZ>8sFxu6eUv~2e)diiVXX9e!+2S~&WW~)fDZ5JsFH==) zXDSBYjmv9B)br_%>x}LBVr&S4r4>Se%?UT@OtoWXoKe`ys1Wr79?#Y zwNbln|3ISle$;q!St~5-xcoK<!vh66nd3t_U~kGqi5(Af~aL8%cGF8sCOjQ+rty@oK3NsC&{b?4+g8am7? zx=pk2NBKQ|%67Z7G8?g6I(Nle>mj!(7=}@%hM?q`2E{Q`nAr$b(wqN>I++qT{cE^ zhzwg)WIIm8O`06)|K^8o#DWEYCA6Gp8Z%Uqi{I1S&$Vm$Er8XK z><@Zi+E2RsPt>JJLxmjzcsbd?{%42XIe0NCgM?#wXq8$7V=g7@^!M!u0jHqz;#lRH zCgR058s*Xzj;Q~$V6!cMw?qG!Erol@LH1R^!SL1_!vE&k08x;rTuc9+HqwC}2iXYz z&69;&88v7j#5hp~{Bd$8Y9hd=nk69=CpC>CtsWBY47z;-ZVc%0LSliW9swt7)entP zD#SDRTkp@+Jr~!Abx&)%xn|?%TBY-%?+ZICX<{yEZyv6t^EA4Z?Dfu-lGiH=(p~ES zsHS8~djt!7kEG)UZTP6iq(h{Py}XOSZq)NHzSQ8hI4zw6VkX!vg6w4mP1zh>&`c<#|p zbC4dDRQzJ+=%6ap+1tjyF9WC5U|r$9Wp+g>wbV)Ak}j-*rX zTZ=6Ws)~^tR;y>=lFTUXtavUJoBx%Uu5kWz9nyuTCcqkuuSGVWIYkdsI~D?9>grY( zH&c<=zs$J7BiaXX;D!!t#OKzPP*p=un9{_;u-F3GfqIo^uqq9|hiLZ|y_CJTA;Q)> zL!0h^?f0o`U3jwnAHo6KGROMj`QZ}s1Hf(pXngs7B@bdsIc# z_F$qub1~)#>!j}+@s8Ua_W4E?m#0C?JHJT^8b{U2> zD7muiblr#uU*XnE3OGc9j;9@3?&7xiod3@M6nPc+YwnJ2j5OQD zUaX!XzvfepbbI>JzLiDpTTrwyehh>lv<$%Fes9mbO-OdV4PJFMH(+U|z%gz)f50*L zp{j@eZ!#4F^|%4o0v;jAuy88U^Ys!&RD~ZDLc9){Cf-z3KHUe!Am2eE5e*V^xkXL} z*}JcLXk1PpMh)zGUg+xaU{CnFiq?3&eIe^|0VYgC82od^Kd9ix#98=ltq$ z$QP4}!$QfPT;*gJ2kYMqXQhZqG;=GJ4)?dSN(S>5Y-R$c7dfVeW#L1oik*@1iB(qd zx!Gc;xWj$K4^heAIb03%11u!39v>5ZhEJH6z_xqm04u`_=FhT(jgxh4g&`6$eQE^C zXYPLd9c(Cn8-!EHBB9^T`vKI|B@&cPf+LLia^Ik6Z}L>m(~H;xc^t3~;(l#?JnlGS zWzXgt{8q61<(za_=QU-Kb}%}HL)^CODNgv$Ip{|CSRKY0{5nbH=Ta1_)i+oNt6C~N zNFhCk8HsY;%lzW%t)YjT2x9cHHLJ5H$wOm0gcp5J*4gD*oMYBR`9iVU_R0Kvi3LPD_%yH7$;?PmJV(q;_oHVR6f-6R z4J7E|cpVoC!3h@8ke@yFB#ce^b9h;Cp%w*N(JNM=-oH{@U@QKabgmAamQ zq~IgZub*WTq<4QdruHd0IxeYalJ-9D42RPrips_ZjFY=-ahzM2b7|%2uu*HZI-;r+ zR4p~rrQfXLu*vkHL5j1N-XKmkE;?*%_=?(Q(CwQqgT$UY!?IrPl6 zPFrC2UZP5B-wPf)FQ4|FJpg$|W$$^q|Kz76?7Hgl^EmfMU2`|Jy13Rz9Tc`VfRe1K zT`d0N*B%dLKK1)&6{)W%33Qwr`8E~SzyQH3#aQ}-rrKqy1+ zICgH=9?WNpY z)o27VTJil){A`C)cVNeZE5KI9dBUMTuLqJl#PSQhR_QlRWH>~RD2yC}61Q(#8kGY} z$lLJS^x5&s;t(S&b%WTLayioEz<9lKuwbT72S@5Mjv5a%8%r8DYYKlA+iH4FTxp}V z5F-_??;m-3N0@hLeVdsw;9>eCtPI}X7K^zt(<@!9bAI+i`!Lkm|EQkmOW}nH^uke; zEPSwnpw#*8A175RMy;c@`FCh#ax_|yTSwx<+ZE5==!qfO&N?4DWGd$erELB2V`9dh zO%QDmKKlOc@8vWe9M-r#O%0a!r;-k6qqA+C%@gujUN4}jV7JLMW&%3U(*s-xZ?kw1 ze!r9HaPCL^4nSf@6J1CLL$;cJjo+1&^#-mOjZk2TNgoc9vLW!8D!bZQxp_{8`6fu? zCv&hdGsHzp6*;nC%0$nN(C}hLQ>4p73kl;y1%;je_?y^n1F}1`(7o!`p%NA7pXk5M;emX3hhb%qBfG9PAaFb7+TQ zpd4(_IyBWl)0-Q`fXVf_E#qATipcPYuGZuQx1s{^?KZn7MFEtsom}YH*+qV$iwe+~ z=y6b{;0SMfQYlsa@Ez4r*UwLVc9GpCL(L(8%gMAd-}%(qnCX-T*2#<&&c@V7Ti#u- zt!#G$Kr>=6|6S1f$n$xsuJ?qkGg1v7KB5x51>XM^jMXi0$bPXpY9%{rQbq)Tl5rD` zcvm0r6dAUjNH?zeI|F`x;P~9z)+G6y#==5^1{(1^&zo`Ddq3~(@#{9+qx)H1GnFWG z#AhM%&%?rhA-@0T;d6WGCUI8RWa4vJ;L3tXiHm57S(t*70#TL`1|~Ah&+(?m6-SF z;GR^7@%?YBs{n4y(Ne34cv+x+0ym0&PmHT@7yUx&0#GbER;M%J%%-g_NGc4p~%O9 zBzGRBNgfnQpk_e9zaKMZT-fUE-K09mRNGk}0;IZxj0DLJC0ca^*+JERc`BSK?HL1` zL?z4w)01&g>kXDFkPU2bM}tTi4Xtv2&D$l`pf&p%A)^%z`}P4Zo6nn@^LhV;px5(2 z7jqc24@#?uyhi7&dC$)SJn02>+}%7^L){680esv<*@?cX&?94Kq#Xf}cYMwtZpiv_ z8ZRkSwmKB8=&14_3BmzP^FT3!X;h`JaL>aV@gPv|fsL32T{$_^3$xOXBr5h5YtAoY z^O#1$Ml!`zl|ZJ-ucLjC5*{xiNX_mYTe32>i_6EP5U>iBk!H3kHtLEx^i5&x6qTMT z83EaMId9iiL{Y5n&*1LRq znoj!Uj4K=A-yK;ra!r17AV2-vLdj9(8ly*ls%@QiaY&Bvnv*duS*+T+*po(weuk= z_W7nZWA2>X zxP(l0-YSJw8!dEZ=tl4?{%4~tP9>?PfDNO+8+);QiE>QX@lmw5fC|VJ@H*RE#iVtb zIM;L>t*$;Z>YhN)HJ^h=X0)tqtOQ2fu}OS_2uwund|pFn_XRXM`=>vS>{S(`!*=5b?4g6wP(lgTGR+;e~tU9W4uyX!c|+f_GP4 zi^;p2|4^XuUBwm0)IS#aLqZ3IJK&xA{gNzad^&FEkJzQ$JSj_L8@;0ise5tM#xIf1 z2>_Wr{>yshdmSx!7yf|O_}Bk-0s6IiMM2vFj;$~WJTh4lf*eda$tS5KD2 ziN6+f>zZSAMnD}RT7sM->8)fas@uy}atTkbaxc4F++;TUs7M$<#~8bg&GCEku*tfz zbJi%-Hsl7#$O8Y3w%c0mgm&_^%W@y!v~~G?KLxt#mdjVHZLOYCh@=Np-aLpjD-}KW z_1qt#KB$>c7EqAkOU%gmU2P|+U@|w7*0*ndmJB1;bEb#wKa+eC2yOJ+czaNDXHPrty}G0 zIZ1YAJBQI!h1vj$4w6n<<~#2%XLpdaJlQr5PVfffyw$Z^&^hPN*(L;ekhDhrTI0L% z6A`NxIo3#3r5{2jMb2BDl8gbp3PQxk_PYagGRSUJg~)!6+0B#5F@@J{d#%a+TF+ST zFfU-0dKX|46nyZVotbyj@|E9a&CndBmv?J-Lqod6PGV^Bh zd9(8TZe?*s?#Jo-i0M73jtrU>RhJjUS{vHyXJT_6gz7Rv{=0Vc2A$j{{3$3PNS}IN zGxk0qm_mih3K5Y!0V3b#!P;cPa>So?c?gvn%96qqCt`5pCbq!7oH-&-fUXLDOD4Y39pSYQcB zTvN`EUmQw^Zkv{=RYh~N=pbNQb7V(PQJP*x3NweOhJeP&7R4pU+~lnxv2k$FNxdb{ z;F{vVJzOX;qn&E_S2k0nU zZ8yR85(%>Ox%yHm_lYva;IX8)H5AUkSBQBho`T(BZS~^@y6-nL9!1hhC}r}41_Mhs zh+>{+9qI4*s2Gln@tk^>VKY+n*K(}O*F{PP?F%FIQ@p1z-ynI+NI{l|U$Nb6|8YSp zzoJelkJ<#q3zQAIP=`bl_=yUL&}9=eyM8b!<>MZl@&Td>UBs$*P6HedpI_teY9n93>&| z}1Gk4-(E`0r`Ywv2 zFW(c1!BbS2!R~t^!B3!{M$P~FcZuEGsfEAx`&VLO+5eR<(`#oR0`X|7lC3RIe=M$x zytSw5n@Kl{+Z6&jz(*0&{iS3Z3N$i+S(t*+}2=( z2@TbQ%R<~XY8QCE#^D{?5SV$`w&SFCq##|5(@4rqyMKZIBOV-2(Lj30G);^KH4Uo$zpTi6hy5(B-S{FVE?wM+te+tEMJE zh-U(0A`9l3wW5Fmulf+Um$pb_saS)Tu`oB;NgB6Nry1;uM1_^7th;&nj@(?fL0^v- zvF7m9OFmdBc{L9FI>uj1 z!$S%IJn{nG1?K(~6j$cEu|QgEYI?j zsdUAdEh0WP9sJ%L?QIQRHaG5Bu1Qp5vq4VRO{G(~J2py4ZXyK(`K?UTOsDc_Y+fVo zs!mdc<*&7ue}`t&Izi)?0tH7Mm`$|B8axH)7Y&9k(ePOL61D}fA-y9-b&U|*?Zdl$ z`S_?|pzRqKbdN%Y3sq+-*m1ZB?HQF}Ly)#wPM3YLV!2BGwS0+G6-e1fEO4$vmmIQ2 z8oR>Zv4qO(#Te~mG6)ghgZyPQNa;t;f70nNoO@k2eJnH<)i94xXvx-E(Po&Rrly>d z;02`LCQ)#;y=p&WQVTlY_q3wmYYM*g!2(-~?tr7!h1GJHxbUluYOQ9q{&ULzlBMg> zv~ll;7TwicDtZ$8pY1eoxs?>Y{hhlA({zF?o&foJV?B0F0~tT&Z<`wZ?bK6eenH90 zl3=^$IXZo!>3h}_tiJ2Z;*G>t@D4>mUSXY`3kC)ye2+8$WVB->sk!AE@ROJGCH!HE(?)J(d66u;0N5 z8FnNF$b*g^I%dX$ut97$M}o>$OclPlN^yZglVHSQh^sGNhtqziL*PV#`Ch4jhG^01 zF5OCmkqb5iQZzmi71vueaELa8U)3p4Ya>*_un)(woupUCkt#id->AYA*n5m^*z${3 z_a#`5eq-}wb{oL3Fibxwyw)w=fzBq?oVFk zOSv&&h1W$q0MT+bV#sXvsha&qm2J=Z%`q2RBPVXmub??*%93?|u2qc=FAct6qKn`H zzB`E_v=zi1OhCAg09+nG+&kF=k^?=1s%XK8+gMKA1;K{1vV&@P<{eSz9dg>gf2T21 z*-;jt8`;aO9FD@2Ab65&N8m5ouN`tck}_(Doz|zWWU6Qms>2?X&gTD9qL^sXB0RYO zKsP-ddPZA^D=KBjX!&&U9Yy9JxLTugrO>RFNiCMg3Bwn^-Ifu0U{t}8vZQFc8$-Ca z-trs9!^LgMVtzDOr>w_=?%2;8{<$6LOxj{)w1)A)q<1YTzd=}~VCRlqq5x@_twca; zW6h-0Nf0A$fp-3L*)DX0;V}AO#YJo@t2jNu5W-@h!(`OC75OL!C zkR#t3mc>0?n7BuVufyabIiPKzVh;jR1GC^D^J?VtVKMbT!;f9|=bYppmamW2oF%?` zW7wI1htK9ud4d`|087gSN%MLCJ#7iddGdU2)O)9ATAN!KyV~>r1YKCr=dk{RU8TJ1oN4%eydU-vM z6!yE&)IMF$mbr`>QkEe70^^Y*COta&O{;{IUt^qE&r=}W2*TI1@E(|I*^79MSYikY z;?{$wyMoca3o4t7WoR@kR4?9Vs02>hArb}4oc6#GpOk4L@PqZ=cf-Bgqw{qJZZ*Ap zp8i|#?hVRerx}G>r6iAGA)!Jvi&D%k*j9*UxXFPS%#iASc3;cW5wiYC{yzYdx<^?8 z_NN$3pAl_7{XJWo>m+r$%xrF>BFpy>m7(>0vMJMt1l~>SB@{|t(C-JuO1D1_Y6pZ;mq8%9=`ov z!F$Lr)GFM#Hy$l{BrQ$fz`*lMqoCvvdH3djj5q3G_Ra=I32nPdILs)>yx|&3H|Z}@ zq6SNO!5UgnKv_7QPsfEtff zX!OeFT~)3O1JPq(bT3A~DV9QnVzXVVrB{4ytK0OgWEwL)*3H4{fZczqb2nBB9WQ0~ zH%-T%e5tDOO6U@ftR<5B4i8t7L{4o4dj3D@J6@QGCg?kYjlVY{j7u3<&mlPnDVUpX z=~|bu>nB1rs0J2nmrmG&%Ant~H%os=9n}iGL!e$jCccbb|497SPnIj47HmnZ z%&)(Uwv7K1{;4-cs6Y8}X0}tly=~_K@rsaP@QMlczUdF?icQ3F#1YdR`T3oPpx3^a zgD37Gr?;*57I=xiYdWzq_Mp*#d)n?x`mqXs)JqwOqFu1b!Dj?;CyC~1HS>L$DON9s z-BdAdG`PQaOL5n-)QVFfXX7GKEz&2vv{0>VI6|IUOeJi4PDNLjayh%GKmW|9$v(R2 zFOZcz^QO9Xe5pv@!E4^Q-;N|RS+KYjpZm9@?O$jPhRD6S|7XqPOf#iXl&&$V^)JcV z)YTP%rJ%Q=C*W&nbSWp}S`<~GD!kypzzg{AAO|_@X12VKd}@Ci4oi((ic23=<;C#A z;-l^Dt>pjQ271eQ6O|SlS-ya_MIhz-GAy|uy?4k4w7jI5kopKl1_Z%& zUyz`e%0MhwP_SxA$Jvaukc>w?L564pD?^mcKtWkt5Jl|YTH&hGjamQaojm6!_Q^l% zf}70+*{MCbYDV9=a2_M{STD=+KsJ6^c-gDj8m1G%=8`(*W?>gm)zL?IfJi|pMsHBH z{G1=jqi!Ko%rx<*k+JyssMzrMc0Z&FgIfX#KB))LEQwTsjapF@NBW*(46_+{I}fMc zYGRT*c3xCu0(XdV`&rv0y`MnthOyD8<-(B)94Wz&RU9O^VNKdVtzSX=6+c)4fM*M( z+R5UmU891vF-aT?h(bo7rj@kX##p4?48l#CL&Vt0hw|!U8#RJcDUMP7CMloE$vYwB z>ewRp4SVtxHA>=wBb7RHYUKm7rc-2WBR6z`h5@jD08;WXjc5-SiRA4HSaoVur~YS# z>`}J7hFsAvo&Bt0g(p;ZEv<&A3;MXc57nYygVHJx#m)k0>&qE5V-%Ol}OO z^KStG#!j`+dLrYaQZj!R&uu(Lb(m-xdfRGR9ZLRyz70G$yb^_jlxbeGTv@l>263zr1o&;jr1RrDa<9qI*$Ceda|t#|4*?W0r8l z#m|Xyxjc^!JJ5AKEofXfLsN`cVeB69jflykf}G@UK)}b2=0{F)2}f@&3;BMn3(Qte z^ylv-T^;}ZzdD3IK)>o@S2>Tl>DHyoIQi%v8LCVRUsD~~5%QoR)9GK|!@sv=s%X9K z_I?e!Yz5K=3FmtwpCp5?`>$B~i<@o~zd(O|0ncdpN!B;WRocLhgmUWKeob8$!h+8a z0v{RXEb`jw?`cysj6PLqbvh2dj*V#8ZV>hTRY2*pUZV+zUBv{Y^VOAmHRX=DI2a-W zcSp6#8sOpA?>6x!r3$#B5&IS{QH$96a`cpphOf~s{XY!}4Ymb(9Xj(GYLP`v3Xk*| zW^#x_cgCs)yKWR>$HYKepoG{3CmkH=I@fzm*ST&KR*~fwj9hRyP75vH&ggkC`c=)Z z9}!_H#E<_joxHFDVYvJ#$_9*`oT+Bky=X$Xy1}`EytZ+)Voc?-C^(4O%E!P58zCQl z3l+i@1)K!-=1+gGL#C1>!n41)d$6|&VFc+1@uPR&Yh>({>UwNTHFy`yX+fEReost@ zDeYK0iTk!2sF<6LybGR_MwT1%WWU&dP;CZQ(w%bKN_7Sw(NCrrb%IWgLiD4YBk(F+x54t=X{nx*zF$`E_!r@ zm}Ac~_T=h}>o*DrdS+_xdVBZxq<;WIYrD_PYA?pO?w`e^8Ju}0VTH+1eH6svAdoq1 zb-W*m@x>h~X0;{(5`+~UK2q1Z+4j$Mivrc#frop4DKZyxcfz8CXTjQDa{}6HJG)^> zVfKvZW?xLV;^KP5phaqGYM^r>WJ-Q2*5bW{iEz6pYx5#I))$aK6W9;WC;j5vFhQvm z8Za0SZMD37G*-YCm2LKruEo!YS{(R_4%?mIUVm3JUBmFB-w-HR0kNYz3Mg}O_D2Ed zSc$zA`?p{=cpE&kR)&U+;u6cxiYx`SX!RgZVzX~OsT7OhVKmrVcB9#bKnAHtg=GhX z(t%oVvjP@^@usI2Gk0*nt%XC+W64x$<9?qtUQG3UnyLX}-GCz5S} z#R}^~OQo!W(BN6;;C@r)%CA+6?qla{e{uW)O#z@5YdF7qP~B;Nn6BfWf1%O?SM_wej!02Za|GEf(rpXcIM zhZ41fBQG!mh}smDO{U%pk*8JB>if%K`tki{c(Ll`Am-6b+_1$;mKRk`P_b9@rgfOW z;o;i3U%S?$6(gJ(`{jd86ak|E^2q7ds(49Y;o9RP#KPp}Zo0V?nW?9I$pMAm$LMMw zyhkMg27~Mzvb<+_+sF&x3rEKa@krNm7xH4wh`GeK zQnf;S<$CgL zWa+L>4#@l2Dez!s=+&<9v0;Qj^m}51-KpzpXW(TkR{dBEMI_qdU!1@AnGwWTa7XtQ zHHih8h=^xtsU~y6BnAycuD-Wl9r81Jov~*L4HI_m1*&7w>rWGb<*OO+5XH;8oF>yw23q6EX%`Awa&iPj;Ly0Es3|H8qf*+6H zu!;5QzAgmGxH=EDS=oxckXu6X`f%%Jh5y3;JGF7K>KOb0#*u1~a&79&=X1Q8&ToI^ z<|Teh2|=c!$oLK1VEJvj6ZiOCw}H;}#V+sPI&{IK_Jm(VO3Imr<2&%t$lJGL9y_F2Y;m?Ir!t?(z z^-ke+wPCwYN+ji2pv6IHOZQE#U+qTu%Y0#$0Ki+SxZyo>6+?l&`j&VQNbKU2; zF6O#`G>}Xz>gvhpq9lzZjF<5SdMKK!~ zw4CHGQ^D=6^w8Yk1`@CCbv||%x+*$gWN11lZlL19Sju2#0MCPV1pF+8l{nZf6Xoze z5Rzcyi-%xK8EjEl)?ymeSy4x)>2RBTrwDj38^~)V0NQ^VoH!AtY-B_h zK{7;cWh$)#xp(uM<%iR~G)X(4l&sRx>m%1#4F8swLS3koeyZXdc5(>4IW=b=A`3t2 zdVWX>lN~+=B|~Fez41_pA?yVA_$(=z8!&a)Z2cskC@SLJD?3h6eym&8B&y*e`wOcq zPB_b4tIUudF@grY291}5teJI#c#F40Aud`NTPx~QMDim_-+Z|O&Ba`! zON-38)`2}b*fy|VCXXuf+93vJpN9`zmnzuf*U&fB^(op7&SzQkVWd| zS%pr3yfw4nSlQSJv>%YA9I9Hzsvm?pv1vF3KSPV_X)4}F@BTOQ+nAQ7%}X8j_!=EX&uNDdCJqHwUO(GOtA0VDN`1( z-|)HsjrGmhx%ay|9ve_TInb4UF?`_c6pfy1f;JdT!qK9!B!-NdQSHN=ME)o{f#e@14`qW;uI3FXE`x z(a*sPFUFkgsZLWajt-N)7zYBefXAmd`M*Xmuz`~%L?kTmXTRX<-G;hkAR4c6RX_AU zae{!5v@zG?LGRxa@~0pf-oe3*?!WqgFPCnPD&X%tbA&X^Oz7RmEV*s2mZH{^5`Da{&5ppu}aE1J!d=^NS6*Dx@N!fHV2@#ole+JW|m z`NppmLV~7ef(;7Ez!10rD~!{nSh+&B*3IBBDlf%f=kV=O8s*c|KDYdE2dPuzRH6<= zn>5rQWdMhJG6ggfZy|545_BId)IutlKB7EVfEWIlM0=m7gg#~>a*%~Igkt0FZhw>2 z*D6_Q$ocukYX08jr1F2W01GS&X>qo3ROAA$3~=*m4aDAUJ!JvbIR*%-At!=Dw=U|8 zs8MW0A~(<4!r9Hi#PhQY9RH*vv8}4=M5pUUKQn%2VNLU!jXhP}Ns^bMe<@zpuh9J- z_V&12%wnoa=mas3zl@$0pqT(znS49+r>MgYfbJpGXXPYKD*i+T#xAem)*Di-#c;TQy@JigUnkbPtzSoDOPc2v$jQ1cMs;1cMRa1cYdE z`@2EW%^o&epmi33qf5mMnlHP0>1|0;Hht4U1m-Bu9wqxIKEeU8k~4dcaLZzV8z3e( zwpi&93x#e-n?nCj;L4Ca78)rS7gizv2>LWlUfnG@fV|n6L5{Xpx0n@&yOQ;m2%ZYO zf_BtYRW))&ia1JTY3XWs1@~=7=6keAdepKdI#;0v%YY6`;~3Zbf*VE?g4#83Uo8MI zedo+)*&weNa*C7W4D_$1BDoX<^)+85lw?Mb|BSn>qXS*6iue`Scy=^I>NV%Qqi@8X zX(bF!2OiwQAO9M@+y$|b>@FCTk*ayd|InU#_>LM0H$zk~uKoC~8K~d+vWcB0^r-bP zs{D_p53Uz2+Xz)CBeE=GKK){N|LAiZxxf6G6)idd2%wv#CHj^nJ2JMa69(S@XMidT_-Zs&?EDPN`1X4S{_XqCQng+lR9ESTjHeJ+mmKFN+@_AE z&-YjHtF3|~$NC*aj#f2f-?QG6Rk9xwfHpg0+KgURqmB@0Q%m@Gt1pQ$1^lcwK)Rlc zG4fN?uMp0g5pek$bPRYer&jgs_&+zzkNq^88caO6V@7;}1Q4Eqa0ZH8qfHxONDirj zGicq1V~~0`$!U@xP&p58`Ko;n0NlI|^e*VO#!Euf_5%dw#xUs@iWE8KJXHy<|AA0o zJmfmrLd{6?fa!e_6fki0>LMeA*vpQ)f(WRNP~_54TA|R;w2F{_L>+?2nIKMq#u^wv z*}0m}v$Tv34Vki~889@->6S_C{)L3R}N0_e1mUs*jxuEi?S-UD%P^x6yW|@TQO*=qM{N!`Z|9Aoub;3eU>)<%~;`>PW z6Q3k%dZX70)0u%tgp~-2vJk#2-5D`tc64Y-H59>d$2o}+$#)7k@t8+f>vH2F0WBGf zPdn$xqYe|$<5ip0A!|+X2as3i`=M>HP$_uCx8r+cf*`Qelb9fiy_)StY z9kFqi#V8fLG}HET2?}o&u7L@eLzav8&C2e{TYK~$t^;GYSmUOK8tf)+AQrsF5sN{& zho%c5yY^6?@;-cc0MnemKxkoO!^v(wGq)xgy&MXB1E(KnwkvDV%ac?F(H{@5*sZ&2 zIqowHBS*co6gKtLa!@X-p)<kY#6+85cfx%(U9PE(wBYJGB16*OQJmJ7OBTDY~ry6tQQi z=d!oOH0HD7hm;lb5C%#_TgoV?WSqG~3(gHnmMO?DqR`W#gelObtlV)9EBw*pw@H z{{V!~K;belXkEzy*6r&ra$mK;<%zygr*&Lv<>3Jw5vf<(J>u5aLB*a18H38N{@%Ns zBu-dzBX!E3^L0B1uK+ncYu7pp4|&IR`*vxNnn=+5lwFHL)^DrzECBGN)He#B2g`H! z|Nh2&m?3>9{5G&#bDJT`Wp`<1XKAf_7d+NUjW?3FRmuWv`?e|Kr?HJ>A_ zU7N93{XZkMFny5L06qhDJfz)Ih!Gye!i8h_F$fdi$l9xlH>SIIiRQ6;enIpE^+6TX zj80xTuw)wiE3)))bI9iPbljX>XBW#KVit9JVh1`=`Py8U1}2-lw~*WB$OQE8Z4XbF zYj_s78$>#0s}?^Os6O^geHkl{U~IYfOomgJCzP8cHJ;(Z$h zCV;X@lPc0}P9RuFM#jM)}PyCDIMxN4y3YQw{$ zuF9rcl}QBq#<$B$yAC_cgc*~Fu{Z!nB)TUSmh^gi9w=0Z>It1Q?)Ll;CG|u6uLycA z;xp)|Uz>Nd?CylFNnHFY9IGMDGiT z`%S!dB^7{8ft?HK`7#Ij&W}G8uW3X_0E?Wj_j}mKKWIZ(A|}6{Q*GoO01v#zBP>8X z|9u`Jq^=hps<-zH7`!QyWhmK+ea|xHvx$bbPilG8l$`!E2zmcumspF!@B7?-j3av8 z?`$tlZBS}>|F4$STpFpj`0hm*UJXA|pHe!IPDlSpfG22+ zsI3d!UQJbTZxHZWUja@s=%u2%Cj~D&3>~86=4=s)w978-mF}_!v~JbpJw$tLxyAom z@yZZp1~mo`8lZTTMzt2k#pUNh{J7d%tF}^k^!tV?OBZub?ZNY~lYSXXQwjq{@KX&p zm<-A0JVA{!)CP1iFw%4o!l}M&-L@^}+L*-hqvpaKiP^!mUE0nkNe3;-gft3Ukk{W= z3WZgQ(0F6_DAb6iH^&(hL{q7o$KMx=OVn~jYad%c*xk+IZ6I{mY}ZY-ebRIwCLg9O zTJ1cjc@nN*_z7*BuLNdcO_~UPE`UtAwY^X z>TtQY1gEF3rza(Ui^YHI@w0Kbn~WJp0xHnyin14IjnJ4My%})O=um5vCK`faKgoLz z1qBTFSUW~<6b}hw3WZ1KOMpF;9W~9`Lbg0PpWL_PW@E4gr%T4A9l2bDVMXx1W%aQ( z4?~xWR0Fi$Yfwg6eI>XH&#_xp$Bk9%r%Y8yD=aJ#+l5p+ko=lj{9*+;D$-;gvDa9l zd^m;Z436b%%4*T0?@FwAHnf!xOtPx-5@7K|#d0Od(^EJzf7E`4 zXive1EFBnp5Y_`on}yOjlCIER(G(NoX?fFiaW6^DuvEM6ogD-?$l@Aa+uz(9R*jc{ z$ci@!w|(pix2;`=CYCVEB*?DkCqEBrlyvfYn54Imo0I9$34>IOi8zO+9w7>@Z)!!X z?3qWcJcd2%g>kkNl5!D!#eTTxAAX6&bQgDU#;B8$C)r+I=BDAX=Gx%aM!sut^$cjZ za8|8me5u}(9?$}gJe0fnVlU@8E z9;yHPF=SpMk^n(CvXaUC86J~pPGTT%viJ91C2(TFt__}3oW)Ugq672M5uGaJAR?(f zEdv%IqI5eZ__|dyT2E=^oa}0=&nH7XZ%Uz5@Eg3Baovyew~4o^`Q&bcOTgO)NW}ru4hlx zS8tO)>HHQJQ_!aPiIY&a_tkDhAmILTl3^G?Ip_>nMt}perSg-H&|??&N7}@p_t!UN z0k{3=XzE15{*J@?X!!QK%dd9ko|0VJ!n{0eB;VVBy?;F!g5O95%Z1;AzId;&O5vd3 zD6jW>>rryrl!!Uh-;>7I+l3(~E$BQj`v6wj)w#99-J`hu$8dzv?DojW`HsDs^|lK@ zwx`qts$aJ4Ut8@0(x0boIYfN^o-H5B>jD*A!b|OJ`ZoV_3%znWFDZfw2BdMRdLhSL z*}un$iL(f^BFN7-RzhoxEP0MGK^B8R)Ya0WFQJ0QlSIJKNK+<)uCjedn6-WbE=~~Y z+<9IQYvU*}xeZolUo3@sZW|LUCk$*XI5veLNeZs{3KudoL)gUT7UZ`&rl7Awyi_z_F_gf>pl2sR5z}y}DC4G!?-+D%AyB7F*@It|NV%|A63x|P zP#u8-5|y^Lwq&UmFmP2oR@NEOVq1L>BBvP(3J@dt^HGoOJANjjD=1}9y5|{>>6lA~q!!WIgNNcNpFv3DLj$m7XWuOoDDnTz0_I_u+CK>i?`bpB za|y9f{Ow*RCVP)X{30=!Kof!0OEi8fGFqw2=WR>rU4kXp!=qD3xK zqMgXS;P+WBKZeZQ^jg)%Xb!oS_`T8`0tAhdyF^H~`qq7DP>A(#$fbaceTyG>ML%A4 zeXdVFonw|eZUB8m@uh7i+}_9~i;0p7)aehkLc8p)9TdK4Nl7QRsp`pc*BZ!!T1Ev2 z!U0P2AIQ_0_ zWQWZ~b@szxz)-%-Z{)dZ-Oi=l+u(O=>9PMO6Oe*fitA4%F-`aFo*4+28T>~PZNJ+h zNqJru_&c=i;O*p1rsIsH`~;{(w$Mf-{ojYX`(Img)>A$ne--S$=3*O>-q{op(jc6N zN4tvrzWeuvFZY+Kd<^_Qzvp9vDWO^({PCsbx5#Aqzg9SN*ut9Rolx1p0MOu3TU*d% z;(Ep%@R=k-<9{@fIevD2ZO`PP=69GPT&v4aZlF;e{;8OEDjiRNQ*S|RBliPh_Vx!l zLBtEILM|pZ^`%3mOP{eSyczsc*|M zIRL&MVy6GxT3t4Hsy1-=_FnLR6#`#ZU=Uze>Ch=qW8%hlqrtR9a)VZHr9EgatFnbW z4Tu&Is3L|8SSd*gZ0S(nK7r@)xsdp@Mck0+R~q4j4qJ za&;%LCFCY3CFKjSnfVqZp)>&A5W9)Ud5%Ho5RgJ9II|2=qL4xRGaIH$K*`0_3($&$ z-J62TEaSFdMSu!KiIK3mdB?@Re+2-wCeqePu=Er;n@r*PN2E zD^*q=A^afu!sCaA22y-r$`Lt>&K5K%oObT2SGe4v1dk?#2M%%qQGVaKcg3)!RM~-L zQaI2i!+b^{@o3-3g1-*hmz3QqS&r3Cm4l@KjH2_gp*%wx)g;_2bP@9w7~S|Tk3vbl z4oSSl-(isWYSp43Qp$RTTadvbI1{JCob(!1B#=q$Jt-^c8Bp+lb}HC>BR?Rn%$+`& z9!BvThBy_2z(FiNhf<%RjPY{L-k@z($t29PjCC6`=N@P+W!FtvWpTgOkd?O!f9;L# zMdk=LnU-|d^XYL5iI4JSB}0-)(a)+!dosIaLHN}LfCoIe#!{o4TVqN~ohb9M_~Ej0 zU?w-str*E4zOy(i&?D@uU$%J7RM`Bh#2qazC+aAS32JsK#C(I4 zkBnH`Y64_{yJEpB2070th|?MxeEEp8W0~GvdWMahs7l0$2_mbUuN}IN>f&VKGNeiQ z?$34$3oek3V%j$jNm8LvgL+nQtD=fSQ8F80qs+5yz+aSf!%4@*9wQx} zP-YZBjbQ7m8h4XK$<;J5{m|{NbSwXjh5IiCm1y7b-*`r}<+I#oQ?my^kRkits^NKU z2-K#9KQ7uGcnEz#!5L;ch&waw~>E+0Q>7FliN8dGg<`i%tY?t@{T)+LF7rj?AILUGrZhVT?XOh6~3a}KM zA--Q>`%;%zA^KR??|qO0SU>sDTj@#@(`)J*cHo?;xH!}PO>}?pW7ML~kI5r| z_g_yDV&=qRfPG!*@%uUvmkAHT4US2k)o>1?1-n@F`7pL>wG}XALex?021%GZ9d+J&3 z{lz%%HOy}~fGw=CIR5#L|6q0cO4Fu_>Pa^3=PY5{#$h9p~Az2Q@(4 z0n717i9GPq#y4mY2p8z)r69zE6-ccXft4Q1<#*Sn)u%7UzWC#hB)l5me3*hE2CnrF zF}OfM8!E^Ho({_XpEQ@%Z?zWPv;z1Q)J`aG?}S1zS`~-R?S}nKTP}n4 zUD_nOprsS%u~d?F&1TD7g3=zo+|Yi)%?`eEK44C86->9kc>kcfnK>6AfTms!=o%~p zLqA-wGw`R6iO%DfQqGb28l)M?M@><(Tq_3cWUJSz;L<}h6^=AS%!H6)%CrC5eBQr1 zVZaV~A%Qfqv2>Ng!wP?nsUMq>_SgnP!fk*|EiUieFd7W=4OCCwi_DGZ1s_i{aKoHq zc$$ z3Wk^Iv??rIy#`-B_+_d4gUkDSa@#5l!oKNiYp2yu9UX;8c1>V|3u9CQxNl1Zb`+s* z1ILQ2SrB$q;X8+VQe7}Z?L72{)biGoEzZ-HEkn>vB!G^JRaTOiK1+_-xJ4G8OqZRv z=r0Id7x{*aqFIFb_TTTkT)s}pA$d9a08>p#fOTp>|8I_t#)W6Sz!<1|2sUFE+~UH* z28){$+ErSUOeTOPujHf?S^_XOS8Q8}DIQHzB}6GxD<@E>btv?#2aVy4JO0 z;doYrMiDW8v7SZ`S}J2092IiXG7F~vBF!V;7FJGnayl^hQf5Z zseGuCsq#6skeu|~<94GaNN@0M?puB|g!KMc{FRZD?r-NlqI=I*2P<$=NB;i1u!bHW zi|M%at;6sFeRx>D+j}Te{>Ou-%N)*}kzrp>N&b$iPwg!>QY06t{;(l{U>A^#h3Xqp+nBwDlUcH_z<^p&j0 zA*RmHgcI0l{4(EdMZRB!@J0UhwklJHHc@x8w^zMO6EaTS_pb~;V=Yg&{C{(EGOdV< zA79S~k+JCx%zM9p_A%wWFiQ5_H~@zL*bvzn;PoOo1I9no0mQidV_a7vzfaqbFbL0q zFBU?*-mTpukV@C_Y>dfb30Dl4m_8+JM_p6s(0XSJb0I9b-~f5Il(HX zmmws;U`49BH<`Yhqewa-Qsr%$j0iJd{>pZ{@RUluSK&Hn3U=h94-E}pu)%q+srp-AMY2D zb}0uoJn<6>cDj)?gSITz)z4Fi#h;`1i zT@!x%9Z``FP|~F_2Y}`_BSIl5CaNOXY@=pDzYo@CFydyS*f_AxlRFzxmPxmTS%^L( zN$EOK)ost)#BFiDaWL^vxGnX<1F4%jliE1vbm$kMU(J;VMVK1y}=I*X(=2?;~dH0=_RvG8*EFfts?64mw}e?-E8I<}+r>l8oO8^GFmykhphl#X~s z7QDDb+i9%1)5umfz!H9cu?LiZw4cVfe5~&icgQX7e*}dh_6o0VZ9AW*ZqB}Oh@74B zH63h!eYE5I|JmIiC7YyP{6tS6fW&Y2;Le)yer|TQ1?)5Sx7!;It~zg5_mfq3zVGGC z|NbUWueURn8K?{`JjiWSWWW9$#XXK;_4yM6=pV*@Z{xgmp?|pDxfSg*g=b%%AM@*zu@gfg0){@5 z0_KPC2irz{u)!rqCj)kGYxu+h9j_-xrb)7At!kt^LG&&LpUmT9(|8j zcmG~zYy4yh_&K~6m)mrw*e1lX{2sygkJkPdrT%5V=_~3X{YA?SW&HcW2Pp#uUdisK zn>klK_vOF~XLAuaH3(OrIO+l_+697$q5-6?2>;cCjuY%eiY-3ArV2&i;VGr$tRq1O z!WM+oQ7ANc2&3d}IEJAcNKU0<&OBrA!yF1nSn;F-!t7WfdnzKLR83KlXjFSveRi#P z?nmb{ZWrhtL}{F~Ui^tAh7heg_#L19QF=R%V$$Zuvy4h=u~pNdE~s%1;epLytU^A5 zM6mP67>Inh`e9yq%{|6}c`t^injpu|VyT88g9E0bs)-e+h12#W^h)Bcy!Z@f0#{f! zrs{&3v5ur_)leCc5fG}N<-mCbm!hia;f%j{7dX?9gkUS6H(V948T<$;f5Xcs2YFQs zJxo+zKH%A5C>BB{siu+wKQwL9rY)DxSF;c7R0ZHf_`jjxX*^Clxu;PGoqH*C!GVyrm+s??{m=^3j;~GPYB9;?ZNL?uW zv4EF+YDy)-)M%qg0|V-%dU6nN@aH1eK|v>aBV%HMTxWbOcujbw_){^HBZYeNGwjQ; zHRd9s3W5_v?!^_#%H)nGP5;j|Dx?)K#-Z&S058^J>5NC}tkdRXpBTs}D3qEWTLyk? zl5|4Wf4PNSyZOjA1KD%9^~2KdMu`ZrCA_{ch(ya%JuQX?lA5fH8cm9lTEB=L0k^pM ze_$lhH1>uSN3>MLe-gNjfaS=gaVwsOG3)@20%o_@c0Nw3YcZ2;&T=)jayK#-F|03Vy1n_De6^FR>_eJiPLcXMrT?cn?b$;-|w zEQlLw3b2I~9wKD#!rOqbuP(q9I>G1J7x0)N7Gw&nV=?uZ*393vY$;YrP;n6R|2#YS z6deERX+k-y+GuI@S$?_wj3a!|fur035bKt+AY?F)SlGVmmdY`+4nv!x3WFDb@Fal{ zFQ}jA%FlUP04TJTKz`r=9F*OM9O+9))BoYL$Q zckx2qIhfrgvI0{Pd`odXkO)i?A(?=$+0KnFH!GqbLC>7!Hn8G@ld@moxYtg~6)OsT z1mS4={Z|g~_JSQ~QDvpMx*klq|EW6=Ut+GaA4?*z2fY5T+cYOX4Y|BmT<%Sbo1P8D$moHcDIc2T! zRfTdge2{n{Ggtw5{pt^Uds+qz6Pio}5O+GmDw^im`x$M6tu-Gy%dZc+=QE>j^*YUV zH=lv0$mcoHVq$~E9262oqVjy^eZ+mVP1?Y>ON9w~~>Dji5B7 zI_QDR`q`QE;k%Wp zW~%3*@Bol|Vv!%aAzpwETVupjTjp=+lt+UxZ}0Z@8~PKN^zfF#__}^Z=x0f#n*h2Y zC1r#{zG<{YL=tCmYP8h!ztE{9`?O;#GzHStETuEo-=1+@AFQWUG5~*hO6ZBhW7#&0msyWEq3fig3|BW<5bQS*x8N4+G<$iJ1HhRjX+yG}RQC2!XGW>zP zYbf}G1dn0_=$9Io9J`fP$$Bgyp!fiK9hS}iHjak@-P1)oGh4u8HR%k^|DFFqh;RqI5- z-vuvmF$sfZ{e32EfBZ82=QLsbHE#F!(>R8ligG9FRB#ZWbdK`Rbfc-BivEnW_j!QP(kf2ICw;4wRb5&D^EyEa&nSjc* zWOau5niZ!4K|!NW9g8Xbt?dE}Ks|_53)&321a>?j;n%jVa)`1l-EgR%MV)LUBP4xO zq&WHUOcik{4PixZX4t?h+RI#i>Xc(Qm3Q=LFqo>ohmGP^4aj-fsyNOd(T4?K%9HWV zO@F=cy(`zIHu%3;I;olZX!jjFZ`L`anCjZ0Ma@t$C?y553*cM&(Q09PhjrSxk)>Gi zs&A6K@x&NtLkh+m&BBLW6b4fyTYg46#C1LmklhLc8+PcLF z>TgGjJz0wutxd7~x2Jdbn7UoOwDimCp{4=APIVgzyB(cxPG_(EALQbHaq9$F8i;#Z z3N76yH$-A!!oP=ZWMXeOnHMGb>u~r&wRp?GeHJ{=#qYk5NYKz=OKVIDi5V|E6N^|N zdL@$3nYzfcq`~jUn+jr{)z0BHt8vE073;ySPpS2IjO@J1?#hb@7EKMOa%LR)}03nDSE7sKZ1lmbp8)InpnT{$(rnk&wy7VfA}js2D?P%BWO!Eg63PC7^+SiO~rXO+VerWd7(@RX2ZU*L3Kg z00|r*^4wG%3dli}RBGgQt(q>fzd6oI`YtCNKwT zNS>@nM5kR`)Rhdk*^SEYB|T#D7DYh=ZwQHMHl`XGS}InfqDjjnk_jB|UgHSzE!+j{ zl|Xpa!NXFgBVoX#pb0Q9zA-{s*yu(}CE4pkY{^(-UlXaGx;c;uaN-1#-?#9QR`XOy zxDK%939x|TkLHRM?mRS0yKD-8I+y7F$OX1 zZtCAdnmYCE*t3YTU)!P-X%b-+u&NVZ=Q?r-7wm&3;oOG@Db-L32!`dPUcWYc;6JgHi3CcViE_ng zNP)G+eCI^QzPtcZUuA__?cy}Pqat+NOz41XEL>kPCKyJwW}Vfez_DpL114Q1cT1dS?fwKLMRe7eVa;@ME$T;Tu z?M8<%o+nRn>(ObgbCxH8MA4T3@L1? zsik5?Di&BSPkaA;_{y!)GlOo+x%pwHvYpxvpWUeQ4BV6=27UHBReVByMUL?uk=WVB=;Z zxfltRuRWS7?R_6ybs14HPMp|<_plOtw9wB^Nb#D4m!+}y)o)2|I7E>_d6p(3awGn1 z-%>=-mV)tUkcrZGh=TE1yjm9ZOQJ6&%7Tk@N_Iyt33GLd+_X7@XgvJBqCXR06`167FvlFPBV&sMCTS6pe0j6g*Qamz>6sbURls z(DJGx+Oa4+86=!qX5Fih+s;T1Zl3nWqFZTtlX>(`{Hq7%e+YG;)OyZOrZU_Z`p@Fc zkP1K4ny7EHF;|1LdkxP z1SOyoVJWxwTb*`w{)xbz1C_aC9Xa9eZ|}O#N=w8=+vS!o0WHP)_PTYm?M)I4}pF=Yg569`^JL>>=g=q?ki7$}Z39KDMou$wxdVNsuF)!`hXev7R+1y9xV!Qy)t zgyb;OVIj7rgwPa~+pGA$siK@oj8x}%?j`8EdQH37_|T=~&r-hgmIf-yB%oy(!>84fW`s)S+-__I$8XwMXn-pvU~p9 zSDZ-0jg?*pYAT&>GY<IO0JveoWZ(N?tO+)m7KlErHC$pDPTl%BGUEzx#}DFrUWTDV`7nx z26ujG5XO*ZlCy9VE)J-)aU#q0yVZ|KO=|L-;aDsw+J;p#XQP!gU1qx;=0E%6aZBHC z#S#cQ9fRhwH-sPpfam2{n-qx#L4L|zr8SL6L@?GPRl>_Y%CJj__Y`GMUc;O8`bq&&q#j-_HW#>|nx->31Uhd( zK!J5_PX8tcr-r^N@8$XjJ5dFhL2MVNh78oT2Hc1~KlTUNQFy4qUS#vG-P6b8HG;p{ zgsxeUSzLBgq7n(S$-9TS~%;Q}>KjES^SWYQ?Q+pCl;v-Q={!1M(e(DTjB-%sMl$D%V zCGSJ6&mf(JI)>lN%Lp^?<;nHNGdYB>1j~=Ud`+KlL@K~(Fua@nt9H>^093ktJ#V|2 zkLOI)t7H{}6+6tuT^B`+M!7Lb$jH8cF=Y6Fu6c99D)R-909p z&u_z;naV_EkJ5j?Q`pFr)B`e|k_7;?CRKR#Zju2fd!P1N#nnhh4t43I`1-?L3_ zbivF&*cF~X2TPLNc0}1o48&2`YLprrmQyw0bfb7_o6f&En(k4hnd_h^J;jvhV8@0a zu_|u7Rk7)XHRq>|%902V#mq8EkB_$eh%m!Q*Df zMvrYP+|_W}=-xg$EmquUWw2EV57%l{cYegT?M{Skwu*Hx&l1SnDLjXyE7e=M%0q~>xllMbXM(`3 zNJF?j=%2caa#!Nukg*+B1@R(_yWN#8xrQ*T=)t<*J$yl7oEN!eA zNAK{k)5n-n=hZT63H%WVKLEpnL4$}Q(*9`BKp;Qi)39VqrkptYeb43Hvt%)Qzgv%S z4X1@HtnMwn=&uun>O!*7flLxt<~|F88NtM`OFil+IFr~ggJnd8cy~h%XxPL<)cl9v z#6jrXy*vmtiwuq`dq(^#U+;#P90G6q>fBvKWXd1nUdM;peoN1(4tVO^F`oSVukw#0 z!{4c`71#$(U3QB}17qaUNDP%2>I$r*|MS5#Gjjc~xbZxP-sJuu6U%FEIAd0`Qhhqi znsh9e`Svn`p9C)PLEXRqRyWN2n5HFZ0ry_`M*B~>49}o6>670p3dX{E;R&$|sp}B2 zOEplhZVdD1w6;vU=Ue`x5SVU(G<9&EyV2@ZLFFo}dokWZDyX>V^{Tw7ql`uC0TO=+ zdQeKDr0?`eV)^d(a&J$*joNnGvMz$L;($kpnn(yzEt^1p9?*-u>X<0+QdOsotLIG> z^`GJKI;)OHU>Jl$%1Xpo1eJLeqTR$NhTkpqcpwb5ilYNgHg9yzU4h2}1= zFz9b7{NYQDzNEjMnh?y{O>;VL2Xh6IYbhp`QZ?;pkDoVCx@Jz8iQ`x|=X~zreou}) z)>%YMd2HpaZc+peSh41&e}kMDifz&Pmdp???e{onP(5+4vZ|LF9&?Y(+1||OHPEHD!yWP&_I*HRepJdubK=h;@WGAqnD2KC0;L=ft%|<2P8NCs7grbk* zw7w%gEtNvbmGLaSD*|C&9Se>!yy_yzb0qo2ox|AaU1m3G&b5HzWsRIc9tBFQ(!Ajd zw-*!;>dk#=n^vyXFq#5T3unF|kQ8}$4xYNbPQ-#kt5JFr%^06NmYW2I$>u- z8dOu8>AXesrVT|Q2t8w)!JRGJ{^XS_*U6I#8TNuYx+}S3GG$1yt%{eEBZ99XkhZF<8ZEUy$k&tpGU!0xf#;IhfJN zD6@#vRvUeVl`4~}LY+A$-vj)W0Y)0U2|*xHzG9kbwBX{)^Hj0RX)FKNiQ``5!$idA zLCWi{mrB|Ho&Te0-A&4uuj>5{9XtlSeD5BwKQVOzFV9Q{g6})}GieLb(|?o{@n!l- zkxzQZ;+lm_27d5AwCeq4(dLEKGM5@^d1*FuexJErw5xvm_tjOSR(K$jWj|{WhpzrBrluCWYSPqQ>t~G&za&33ZtdiK zL-S?R$Rv)BqUyAgqci2+y_-^6-mrQlMs8R>QbpnVi{|X0Qdy#eX7y-#GZ`ZQ!V`kD zSc#@Rog+y|$6**b+HVlQo+ulkeio1(7kIGH$-PIzFvGPvXMzut+7|WD4GM@IK}w z(9Kfx{l_j`l*7f;D5@qk=J)q5^Sg#fQv6;&j9vB)YwYr`*9JAq9ic|E4qaPkf@-O} zq>kh55>C|EW;2g%yjBY!XRI#x9VhI2kK2zT5-FbA<$nvVveT%a{h)`2SwtBzUwg~!J z|EzQ}Tj^=qh4Je$=T8M&sqtoI~ z#|4Sajm1P_p@a~~0k5)*{XCltgZ}Sln#(;=v42o!jQ)%y*x+mRJ96;W(mqWpxRvY$ zVbAzacWUPu;z!F5(Nkts7pf-3yKE`B(K3MWn7ZmOH-1=m3P86#Wh-)E83*0Q%~lM6 zn(0SWmr0q@hPcElLC`>;)-T)c2t_~#n=NDo$18Pn2Na=^&;< z(kgi*>aDOOXShR^q2b(7$I^AmumasDTVrV|`>gMe+@>S>a?!W>4UPbF!Zni7PK+~o zcn$?pS`;cZqgxV^B+-VaPy$n2Nh1-mJkbhvD?};3k|pz8b$YzHu)Rd|o9LHx$Jcv= z-sb?0^z2A@#V&>VTwVH1JF2l9?(2iTSoDXUXX1FoB;^bcJ~G{^S)7z`Y0sH$8xLDk zTp9SbQI(<)o(eL`eN2J;JNmjE;#1Z#9F*Cs_eIiY4e<*^A51a#i4 zf1CLi{XNnKv_VwFslWs60dr5_cViN-#Cv&>kprC9cQK|oEkdIys&oKh@1kWk(EnDq zKK$JRxz_iuYkNUj$iOeSs>hMJBKiE@)=Wlb0)uI4;&?i;@c_g)FKZs<^xTcGeQ;3J zpHd#ARq@M9QkXf-l#XfM0%NYvzxD%A`wcw0gFz>zFa(PV{^WV>qs0lZ5A&YTXCy%6SEZ+F-NUjwgm-QK{ObVOX*d;i0wkJF6J8;JpuJ&b;e8&-a}7C+xNM+WWdMrVurKxjg)KtDTG0 z5it!I%I8Ww?d-yC%-R#oGo2koFZW5b!AJBmKgAGR5%ZGzcqVBe+UNbAfD3n#y(Jm? z8_7g~tqxdoi`v7X;Q@4NzL<-HSi}~Wj-JsJ=AZGyJ$%!sm>qd4V(c^P@W1j#qQIkg zkVa6mk(6|4Cx_*&4-T8Qu$9xLZK44fTfxd#5;s=2o z2HTLC*=2DBt{#i)KH1KO`Jc9@kI^Zc}od8WOH%?xzNbKpCc z*3M(cqI6=wrXYixTEO@0WP)VknQYEoP86r}J5nGWr{ABADm@@9 z?$<^rR4EI+ zFt80NiGHtLKdTXiP0|Tb6ele^idM{XX=!(5D-&2S_~Qx?G*z=&t5!b5`zVh2h=ZnM zm@f>ah!iWqJiKCFfxPsEtPvG$Ark((^-Axlb+vO$FbL05$Jwxv9GbOOXFuw$7#`x{ zkWDDMd|>r>y9H%O?_Tfr99_25wV$Ha&ai4V%q6^U22U5FE407E@F(nb3?vmn96eau z%1&e$>VqleBkmQHzV}$JeOh_4tEEb`Jsw@iDnv_r5^URnY1(R-NPNffueUYJJ52`$I3``${% zQn4UD%e$fC7uj-w_AkDmajihszCe*XRPnX*lvREr^XL;kcB2VxPqrlEY2Fg9Ztti1 z8e5Vp;jeFduT!k7zK*9zRQG_LnA5l`UeZs|Vy*}YUsx$pK$^AzWRRHMW{)F3?tX{k zZ-L?zA?B?>=qg>fIrHo+jyy>q_DDtqa*W{EiG=L30` z`-KW+Po#xieyz#bvGF203m3y=ujotag{uqRpr7#BXRNe#(>C(`jfsW0=<}S_-$?8E74?BEYT*T zDKO@xQc)Ur#J?mh>cKfD3>AQN{3^!$;(!dmmg#X& z%@g!t{J#ymdidWM=eL^?Ex+m&+>LSSd@@*FIyC$=0&Y~RJJ|^$Pm$_RA~MnJmMl`M zTPg!itSdk+pGEVe*fGONVT^CK&#UQ%_ih4=Iw{qkbRz5=qxY~! zIJgV??9U?q-1~fUQNZ|a_eBaI8f}8~duY&WEb+rtN{4DRfPLu>FH1wph$07zGQbTr zB|>VRF%~CjAc>e|AmEDi+izT-mPHv?Fo3iUt2Ba(<+SF*-^ac-mEpr?v^7g!U;28p z4#lR|5VVmqz>$8=*g>)x=bN<;_=bOgatkXA=b8p<{KC}V&zG%|@X%fLGwT<;L^cZA zwv@UUmb%$gZrmn)Czq=q2+T{4tgybwo(D82NZ$C-u>|c+kmsdhFII6ULhK3dNHi_f zaWn;BCGA@khI3kI#WN`$P1(Xk%t5E{*O#Ci`y`!nB*i{Yu0NsVxjJQpE;8T3uq@=B zu@GX5McO%+D%+?N&OFYzak`6^heNm;{*0}g&$bCg`8kYFz<-boe9um23R5|8?LVk( zk|4epSs<)cQGke8JOM19QTF#9+mM%Ow&D zfN_ZGA+l4D#M5rYgBDMZ)Yd)Ip(=g6u7C8OOiCx#p{-Z$%|>xtMD-6)DV^&-%eDJ zLarV+?F8cik;OK+NlR$B_N&9n$g-Fs2~)DG;*vtfO^Y298tDEMCbu@w z4P2MjMN69=-mW~-T?$sE5X)q@3%LaP^#@c=XwB`MH3pvV!c>z8^Re&(HXFfblU*3a z?%TZuy(+;uO=s+=a7e=DDpZb+{b!LjQi+cdp33PYj{v@M$Vt(rtS5b2#Ng_o# zcPtlJLjgy1n?*TGspQ+Xt?<8|Vv-g6xD-EN5Lu#a+|j|i3~Q7Z0zvl3_+K#hN>(AY zN!2=8AJk*lrcpt=71yjLs80q1fU~;1$<0X0hiu$G%(PM(=U+UI$_rwsK#$ zS2;hXc{5pZE7U<4@qrKDI9pwotK2*OU=mV#Eukn~7~j(>BHQHFcV9_e2>t_Xg3Gh> z{-+|w?PR=Z!0E073@##ApxF zdvo!~M7%k;Z!c_|MF%1nNce6i^JfMh#xG;Q4sJV}~Mk@^-D?S9xPG@j3Y(_;V8+FXHt;1)pn-T(V_9MkYvSjXRs!I5`MQ=I>DSU>pr zp{IG^#d+XWpy%*u%l1yjt4{Y%CHyQnqGv$du>0RU+`n^EQsKSaD{OCUandaRg5gh@ zHb$!0rZ3xs$vMHhaj&&t!*mB$U8i)iM_E+lk~>w`4YtA=)8_*5gvsBsj1hD4ojSZW zUD_3uWC^wN5RDq79DFODcEQjiJh6&Bn=R7L161)}cxS zW%DP{(YDMGTLC-_b;N&8ShX(xyQE(if}*$|>MB2$?PTq%OR}{1{Uy?N$aCs> zEnm)y+M`DdgLnW2o6+QToPWG=e5H*OOmEhk;>8u_JE)uEF-9*3s?ca3KtZ2;(6K*WF>u-HvcO7pT>W1 zg$V}knnEz{Z=dgQ{d#beBJLVRXFYxyR0h>J(7mjVGr)tWcyb53PH=NB{qjU88dj- z&@A_pn>YT<5GUM1^xskYXKp!xz5?Xah4kTN+LqZ7`lOiiRR>I|^8~T5g8C00l4;Br zMWQe=2hqJ+(R&XFdC*%ZE)~?>DpiPQ`3fg%z!M%Q=dwW^WGG68jG>*j?AnlaHTjY^ z=u~vZCs(X^5-;iwwzKbBQmTs;qzQ`xIH9%VW@3%gsEC!icrtNB5V^E!TBD`0E>o~| z{kkH3`xGeZanb+A|F!0TdIyk-tZghzCYNlxM(o`krcvOj_0eCDI|FXjg#7DtOoNJ7 zP*fiEPnI8^jpjiEgAK>vhK=9fKHO(WPk3w@nD}T&J6x|Sv>6+)UT6J>w`!^=E7s1o zs7LG87Mr(^W{HOPe}SX_Ay{T_H8N~D0SazCa7R!s-I6^nKELH^F)o!snZ)l!!PCPp zVQgbN3Z8%^NMVgG)<|3sCmY*|Jhs~WxMfNpe+Db6W`FHAV8 zs8LNOU;FW7S}E<3kf~|tSV~126`qD-<{2qJFV2R1m*C6_;oq!zpR1Mb#-}xU&rz}r z#hf!lW?n#?26+LhH9n&}Uvp9-RtF;GYMM>U+a-FJ+woW#;f4Ol$wWC$+=0L>6Vm_$ ziH?l_p#(;U3tdSz{NGB9GfJMOz1%WwxLuoGss@h-vEMH_yA@6F-2S)UpRd8)CIg|y z+jdLHQGJuA9EKK_+>WheC-3ipISF!RSI=T+_vrRw7xHn0xzlK81IyM`e=qcn8HkXx zF<-wnMxyXeGA;-k!tbv+)|vLg$VdmNT1wxXNgsk|an)sT$lx3lKE2(fI+OOJ%+amp1vT)ZD+4T z`33yVZD5qWotWX2-f1V{J!>aSb70VZEK2a!R}mr1O!=|j&rD&oJSV40Oib?i!2pt) zurk`$sk25mS}*vLx>+VWT=mjY2n*h7$pp*JPen;j;5X*Sb{?ougbAwy6Pd3UGD`fhd*iZg3H|Z)+;1eCpulvJSLx&ckFF?k7()qf#6mPT-FvN) zYH}n6vnfUnd$MFw-M%U!4a3lx=V~Vi+1wr=WooBtzQsXbg3d1zfXACQeC@Jx4PD^# ztAE3!mqRc`U=I(Ab4`4N2|XEL{Edbekg4X6yT|wu$}oc!*Gac)T4JcbT<&=|J6k$s zjhHbXABZ0HsY){nV=HxVE`3nd3`bG+sK4ooWo6pt<~(royK((@o7s0s$^CnE-|wx( zwR`BYz0faV)}`xlE1%nM78BYb;ZYxS<`OmSZTG!b<^QUI1iCk@mZ2_jZw{x5MdUM< z^fe1q=ZOiQb7+~9tdzh{%;^$|F;%ZBa#NU#0Ho5>I1qU#Q0*TucZLvLi$esj<59$> z?WpELz26e20I>diGH8-mJHupUA5UYelb<>)d-kHOb)nfaouQd2K!zELsT_Gx(j;d8 z@L>tXI(p4PxMxxM+XUy5;AvWgW zZa77aqukDG$TH}6Mm%99!_mTB(~Fp-XeDg-I!F*u0T+ylJDJks=d5JyM~RR^CFa(T z1OKJzd5p5r_6V_0+xBzT!v{F3DpAAkdAF3MQeaZ^aBgU0A`;rNQxSkq8n?=$TM{WU zFJjzDP#dmKqFr#P1N1f=`Ae6VOuXxhAt#%8c{{3o6v1qRLGh=G5jxCxUs6IHj~sVd zQz;E-0IK~7dF@$2&T6LySOxBCzHy#2lITr9GZ$;+a>X-}Xf`8GmKkBge$7;p0SU^$ zRP}C15PE6eQ7kUH!oOyEmpUH&PQ2)<&tPDu@#7+{lgv1>m^1yUzQeyUK&1djWCAv%v2g2 zwx?+843#4&*a^NDrUNRpAH|-yd~;>M;2iQFWhh(etjnXm?oSX)UBy~1ZvAD_{ze|xs+}ywLMkwrPt;+$;$JN&RKqI4L+W_ z_WnEN+COsa@kk?iG?{n&L(HZsb!1Y$eiBq`kYt4^?C~od$yiUy!&eN(NE&vI z+EnuQ!BJQTm07+j3Li+wR~Cx^S9d)5Gxei_4V`TLFXyX%w)QM8uyjFtRsOIYbJy6`*;D>(SL82(+w{kUUzgJt}~M-1N=M z!UU&6j7deusZ8(MdipIodLN?j?+em=0VbU54^(K>c_Riq9F;P>A06_^gk)pW4x@|= zZ)|8}ounePkUyn+=!@3g3`7bcK4cmGv{;y;HGq@b8)ziooG0kpbzZxC@lUO%YfMIY zS-SQnm6c?DX00qSt*o1eNYGa3DIXsO5Hp0@aM(;^V0Xgg%NEM==22}gA`<~}HX0qB zxnu%H&Ei0_4#cQhyE5Y=?X;yEMHWaMgWPucn+_=PZ{SP!mQ9-tL*Lr5z&P8e_4;M| z%)~KGRf^IS?*xPrs(TQVnZS0OX^Qcrdk%{Jann((N`HzO_dU|9?C6RyrZAy>%CBlz zQ(drAGZHIpG?~>JPO(FGoEhu)n5!xBcFBLI2Bt4Fw}X|;g!95z=YblSI{v!{l^wfw zwx9@|AM!$U3UFaKB9)n9xF4pA1?&V_>i+LLK0mERZ098(5glo0 ze}eP?H)n%_l-vR0{26T|G-o|gaA6h9`usF~hAwOq^G2VFYJsNbD1g=A~UOKJ~(+Xa3K#vnwSvFS(berGy;M4u8<&m+FVX_ z3!jkXpwX;mEi3F6?|0Itho@VWsgtrnXKS)hFa}Q~qN}0%_2yyP#1t>IhfY}N%{U0l z&OYnJx?y(ox;+X>wNP}8lT10pwbdq7c=r3Cv19!@Ul93zV5Bk&qn08*0J_%5Y4LXn z@O5bv-Z`f6+q0;N?N2Uoi60J4MCMaB-QM^-pu+>>9#*`s(JxpEl0Jj>befIhNHUgr zB7yB1r7gY;?YwEF3Z-4|5Mt}~r?=J(=qyzxhb{XsfAK5G=6H%;VJpE==rk4Jf?UQ@ zHr3|-7m0MH%h$`|aOo z$4ezBD?Ix?ArJEogJ5w+%_RFa%zwBk$&QiuP?xOVBvLt^WN5B5IZZc`%Giw327~sB zJTTxZmp3f$t^@Z`Mz~C0^qI*yikPO$#4FjpjTtfSV3a&e`TSYb0b*RY<@t;9x#4%^ zRGQ4HuJw_h%0OzDulC&+)NaxX${^^q;@x8@aMgz7Y$I5x9_x6@$;LyIGc)=9ec9l) zKhXa``hI-;@6~j`_k78^9@0ZorEI!s_aBFirE$^;@K`Eu4x$Fhm$?MY8)$AJ{W3*J z+5luEQMgUR{ET`SH?JZjGsxQ`eaufMy7(re5oOjDQi-;y;ejFY&zR~6I6$cS)B-Z< zEHGPtaknxGv7B1#gQn#|JE-5Is2wusVJs!TurKETw1r zHC^At)dK??%FDF8SS*S%{d}Jsf(96ILV&LWNx)Y&!CO~;N`8C_{~KG=2JrZKYm}e^ z7$%ef(rLwU|6`W8Y2yQ3p^*L+!@?kSR(K1JT0hpgLUXx-SScaT>{H_)DbL(iq?rgTfx75dEWk3>!XAWPwM7xDg9Lj32T z?{Yn0W6MYClMpFkqd4+R{splS+Q30_Z$8e%YR&pn?Uy2CQnZD-yCi(OQ1Z`|Ej!VE z$(XHr#9$YJa}!T`y>5kg|1y>nmgbf$+%9`0Uh7Mg>W?!e0X3BmBRXSOe7Q4Y#t>Fl zx}+2z2l0ITmIwDKZ18Luu!?-i2FLSzFiJ?qm{1gJFDqvhEU$b;D0DPy&Wo>-kP;!+ zZf!g70KLbp99WUxWmTI+_*wcAE;B9G>(;k~3)tzq_;1r!yG}cT`S$_L)Oj)V(_H7x zpWh>usi!O+DG&VAWIswo8nsO5M|XryituzYN88=0?Ks_Je{u?gC;Ti}t==rztcK;c`_MUcFENtf&ZsCjp@1kBI>^SRC6|yZT*0#+}H|nNXqf5hpy3=`xzJQ4| zzy0+)z`*pIvt@_Q1mpZh;5POTthLVzG49e@-C<*Enl_@i;}9qAHV68yoH~`uR6ml@ zyL9aaV+dS?RoSYVEth#p*!0w|IW?i>ksq|ZGT+G|gw!}_tWTc_t&j@EoS&3F$_BkU zTOlEDvi^G>m0IE#?{|(qj~=fJRB^+^EzRVG0Xs?cBU;Bw=HJ?j0T}!n z^Psc*TSZAfQ9Me2eXfi~gG|k7U1M9H_q8=L<+4?rg>L1B-sY3&H`-BcQ_y#XzW835 z@iF4%nbu+APpYWjk7~76r-r#p8u(2PAJH<4NH-~})2?d9 z@yIRlTjf#UX{*EN3nuf2#rn9~vuvtK855y7opeyX*aiiW`3j=v#K_1NT9d>e`{VQ! zu0SW{5mEll^Y$kkzFZO8r?MHc-cUI+!~o0Q`(Q#BuYX_@1~R2~VJcj>H<-oK8h zKF#M?=n1vfZ+xLaWFa(B?Ok&(*2p%+BTHY3U{E>K=H{`pV?%K$uKpXXXs2PXvVZGC zqf2Ue;lZW`z7WKXA95(Furd}HaL5zwW;Df{P!3e%uzmkizx2|a}>r$wqzrQ!S+U9GZtr$#s*?kS9}@sc+)6y(lxQ5a4$p^>2uqiVIK zI10)mm`fl{4@A+G#t(C#B<#b^!!aeygp)cwH>1=o-A&jhexdEyE915Xpy)L0zg>TQ zZRYPu&&dS09Y+CaWqiXdBCij8_;QzHb`-G2kX%WOmm)a^=SIv@8n+J#Wu!$W49-bK z;Y<6FN;PWMwMFiub9}@k8&LwQS4H+upAFna9ouuqIuz~2C1sHpr56&TeM~BKLn(58 z&Twe(In||;P5mVprOIUumivERV+*@=_QD=`I-0N0CPD07@8{YsWBnyD4>#$y9hNfH zYUUv=7qa+BQsd$e)KS^aOv$z@RxD-HHo3_$K7Nv+N*b3<^|R%#89$XM`^*wC6qM-4 za5e@lxQ7hQxPuwwvWj;W#)@&dTLxKX{M*ts3;Ior#tF}O=m#mT5%x+MZ@n!g;rOgy_iHhlB*&9J(yGMJi#$qM4r*1O|1O7 zEAZ5A=dQ_rR0petA_bn>IG@O8VNg-y%!Gk@Jo#rM$yJxO*_Edl3zDh*o02I4g0uHY z?SKHRP_jCK3`4Zr0T%!L%#3OrjLRY{?25{Z%g;QNTK1B7v4wwhqK+f#A;zo?Y;_uS zynpth)sU`qh;$sl9N6*xB=B!~MhJF|u`hhG5L>{2YIN8{Z;dvT!M`euC(hok;B)`_ z`E24$iB{j@j$~YdvAig`_&?!w1U6^u< zCC~L~aOn#0j8bP}8(pPLB_#Rtk#+p*f4G2u_i9-=#QdkLn^qv+VL1zYM+J#jtstB^ zFVWq>jZbl(f6itmkaLci_GTrsDNx?Sq@Qn|b5#KBaksyY9NT}*`xZ?Qu$2QR@*kRz zceH?QjNpAiUOK2S;q)B4j@EOO3!63lSiu@EW67l8gT#2LpkCC3?@>FD+ED~MJ?#ga zU<9ztMXjLp`9%5qKvE{EcPm#n7}cAB;+!XOHccG!v#*nql#vs5oVx@p^AS-MDiLae zKZJ+$Dz)X}$3mrM9dOc!`6Mr&g}08Ng-7J1j=&KfmT4&`ZG`FTtE$%4FB+bxvVYDl z?E6bUOq;_^t@fk@t`x^h7Avp(fD38p`e|jtH)t3El@clBMDWuv`btLpSvf%ZM%*Qv znyPieDxJmp6@H!*QoA6vhV^@V=NSR2sN$l#lZSyqVSGU z8)zs-$#V)<{USymL#QL7FulZ$DLCx?z&lW?TQpCV0EW&TL)&1$Mc|S#+1#s>^MK)< zSLDc1FK1I83Vm$W(fw0{mI3sezV=^e2@6oNI2GbGT72E|`DoQ?m@njd7Fo~Ogrc%} z@$u$E`}1mMzMESXh3a+6!xZ6i3liHKnXb|QoY!=r)~OM6d{T}?j+0Bkq0L(COsp<> zBXwHUp{HbD_&jSYP7mOhv5y-6V;rC3`Y^C`xIx2F?<5lbq;5kWhM5tvqN%iP7O3rG zB~i3mT@@2OQ@zMw;6XmT8T_%;KY!M~817y~R39@qn3+)ww@3<+m6;uzvXA~JS^nMQ zR>Rl7cP-x6zZcsie^O)uKca^F&@ELg)45_F8as^A;G*hwe(VFlBbwNoY0=>YZS%a! zkh~5aHgQlGhD8WM0-H#@O6@U3>on*UuTBR~Ix+CAQ&TkqHb2J9IRiH4${a^FqICx5+ zHU$o_^wbbs61B1YRLAmV-iMhJOMZf)Vdqn>mnlm%3UDkDF0X@nE9TS5rJ%O50Ev6V zPYv$anwX$FuU{M7(0Mi83QMs*p!J9(Yr9}urNd#cJ?4c@%y z)O5*~H}kqgZ{TY?(h}n;so9kp7h{A?khyPRC7Z}=VQ`PaDdK!ANP_>P9N`E-D#%QP#-Nh0Gimm;g6z{MYA&2X2N4%d0v^g^oJbm3C5V9FjQR{tT+ z0f)IFNG9k7)np;2>P`lvPm}0oNy|ILq0(|%TbFI7o_x|CM_|(2<+zk{Zxl;b$?>;f zf>;6`1Ywx~`iflHA|SFFg0e)D^Z&^6jEI@6>tEztni%C{8x9}0Xt3OqP(+i_O5sFR z_R}GF0~7)XF{&RDoKeAQbW2DG#~v_OjIdlOkS*W?-lF1yJ{l-;YgSd1wb_C8b`i^j>^(K(6iahV}Qkni=g z7!R6e?5ayfYOxj^=cx&q=uP_ZU$S75VKI^#ZSKSCw&Bdi- zK9r=ERfDDYkEXw2+0=B4%VdvU)$G2C?@KskacOsx@cmBG^IvbRN74ecHM%K5q8>~@ za#d%b@fvCRlA`6frTe5VRUME&ot3SaK1q&1CD)V07-G?}R&)ziX9RJIsbE;7X1Ig3 z+2UbvY-9vU97%sL?1Sl7>Gv8N?m3b2s7x!U%ZI*YICk7 zS*cZEJEPI4%-33on#*Z`cM65*bvL62fGzYMXvr>?D{}BAZA9;l@MY12i-#!Mxx+Jx zFyTrNBS+C*;J+kAEP%4y+$p9%8slWIFa}+J9wZlMUhNTVO&^iNd{h=mWIrAy@nts^ zB#?877OHhb5yr=j5RU@6(qlMdw)CBd)Dl~zCbhptwLcc3W01SOs*Q$`B` z*0J5H$t&_{B1Q)Bw>%@cD;n2w9-}z1Ql&3!q3hlOk8C7OKSwO6_VA747(R$3T;rj0Xw9+LPinB=cft9|sb;gvauEH9(o;u(eLCh(^}17H>;@0T0#;F8PAU^AykWq%_i^qg z#T{sZa~pz>y&FW(2>4>h$5IV+HuF3!Uq;&A`(^X(*|nomerQ+Az&ILV_n=&0mfTw# zGx<*5Y}wO+CA%fTtO;kB6V&g^kfGS2Lqh`oanv+4X(qMq3KJ-cN^&y^;?Hqn!UZy! ze2$a-0St zm7D@$>L`uvrhFa``<%QOGAuqyKyrs{sY1Q(SLpA-4G;isEJC+88YsH(<)luar|bgm zar0;00LbMe1;jA%U&9DVE7kX-x6fL6Qn4wMUQ(PMx6qij7w0QIE5?P|1?iX#sLRr=llX5Y|@Z*;pP7<<&~g@1WaVciI>xbMVaX0yDakZF_p|Wp5~&8 zb>5PMYaciaOYM^2J2e+AxJTTj$pY1bnsREfbRmWnO(GO2bj}LshH34Is@0o~HI`QNpjJ0G_1Fxl1IqGgpOQZ5!ACUr}6IsM%q`WaJHiR?8#ZNO9WZmVhWM1JDZE;Gc5a|>$Py#4Wv z#3@&4=B&k$PnfGp=%Mc?80CwRx#Wr2aWFKH6%~u=o2LSuZP#Aav3#@3(-=v`2+#tn zpbbqiVni-x-ya0NXEFmAaO_*j1$k#&-sZx72hMI60%lJ=Tz(Di{d?W`>3dA=-7w2k z$y`^2DnaH(L>2OSglMf>A_t%|wEv>jrd44sgftZFa_@AOa=!Cd;XKry11oja<>;X{ z<9b?g?bO`JJ=UmWfAQM$sh^MLvDKX3lfB_ky_hpI;XIWQiK+mhd|_I=zF-&CHn;UFDlyDzA+kK@@{vc-(msGi7TT_hRLI`>kVrE=fKxyo)3U^my8BPuHWN|-xwkF3%VW%1<|Ff zr(X|gSY%w6*3sHxJ`O*OszG;{5|Q8gsQM!)w1;2bPO^Pf5#}hKUI1%&g7TlB26gk1 zKDSStg=|>f)Hl8Ux`CpY`BgDx{P7RB!_!b8f{FE@eEBIOVdQ>zB%v50*K{9_{kg~2 z&AHU=bmrR3`(e){5lNvp>aO7Xi+?T`83godBn5l^y*~(PptU~<4a3jv?`uZorpu1c zug{So6Ty}%)Lpjq>$*_V8}38~6Kj`$K06TI?h{H#CDx84^RHQA+(qTQpdOU%V(pIY z-N0&rZcz?CA45#BQW;D??H6dHgFa!GMjcWekbSiF_C8L!|7tY@SmXUh=_x5tk=9VB ztP)^}MtdJVL6BNQR;M7k%+srk5cpzP^#QB+-c*ODc{z}aAZTDy=8ze@M8uD)!o+uY zj+wKn5Y%*!HJc{Yl#B&Cj z8N}Ol%oBf^M+#&AT)b*spGl4Z;90ZR#OHszC!qSx-*6g}Q4~oEGGrG#Ap0$`{+F04 zux1(Lkv;040m=`^e=t!MZWcWu{^i-sK7Qmb_-e;PzEsmS_?UX3r^A#1qcy2 zTvbd$389^6%PvNki25{bUN8#O{#%h^$xc@h!E^VVv&2LoF|5eSuc{l2Xa9Gf3$N$L zX-P1*ntUdo^#oi=4u8u7onrFO3kw!_btMjK$O%(WB0+U3`h52gV6R_$a(w_TIHhf~ zY?Ez>-8h1Ti;NSg8sYDSa+B&}2h^H-nNOcYDfRaP{4))m4#1vLQ01CAPa9#tG8}i( zJem;K$ezoBrH*)&PGr70!qB@xDEsB2*1f5{sl^lNqwfwkM4hlqxlVsw{t8W82?dFF zf(v8tL1E{zjY1ER2%qYOcJu*;mvtZYKU{zd?DK;8;}i`Pv2&HsUqr;ut~&_KOrocK z;w_3N4O)OrPWx$fqih_@kDiT&iA=QclG+owN@uA$N$#1&!Nk_ypOm11Oxk4J=l$Xf z_uX&!&KM#kLFtZ|?~Z_v6vKTLc{WgeVMjJWIjRvmn;h6JufIKO24an`>1q?c8A-1$ z*kEh(6k$pNnz#9ijFB9~;LsWfl7)@ZApBSqNvFOE|AcXj=AR9Gq9D|Pn3ka2knEE| zkO3PB{jm>>DSy*6Q1$776i`)cCXfD#=9HmeM`~nVt#{yK?BRjY zy3cw|{6c3TZi?}=@~=e%lB3^F)mgFU*GtV<37ru6M*pyOoyw(_7nNg)VmE94?YN_A z3+#__lhA}i%*D3~sZ9*#1&nW2Bvjbuj)G__gr7yr+XU-v**)S~DSeQJ@{MLa%>K7XRBw;(7vZ1$*w&}In4sBho zZ_dX#(NDSDS4-Dk={l4#(PK{t`4nl#BA{VinKHp@?5-3^!GGxd9cmoonS3mgv{LX` z$^4KSSqA!$lL$gRah{X*E>5zxaHYAdW}CH4{$zcHR4PfErtEIKUv9rNltp7yY-LHl zM0mf1=Yjr3Bsu5=>%gkWZ=hcdXRE#Z)OQ$wWy|q+jpkF_Q)GfGvH#Pb_4HvI!@Ffs z!H@44Gp6Y84kcfxO07z@U|R~*r4^%uf613-@tso9_GiP+TVJ0#Zp=VkGG690M1&G6 zF?GhneK z-IBL)Zp(DZZbke{`-(%*0R?THdSvs)KJ8Eg+)yMF+)lC-*(O0KU)rO-7-ck!N|6tV z@8YC%>0TM&KGeIVj}2(pdP(Ey-oiALCY$dzaTst8Xir;pVl_DpZ`%ytVabBCjGJpV zRNpn*XQ+EIEYytM=#V1M%$h;E>+u&Th#?gEk&m%Own~&2(UfdB#lsU>E_dO^+dYN( zJ5?^5S(Ut}Aj}PIi}Ctvo?NE7QzG90&KvaC{5&)^0Fg*}4ey7FpOl>eclYqXP@$l;cOw3QG?02g`k6+~&5>cL>ao~b|uSGID9pZyP=yQ>;6J7XKC02^Jdlkd=a zYWop7aY=kU} zAb%2SjE*>M^=qs~Bw-_g8(b$m!%r{OqZ5oF|2lTcMkif5i~%b%6-x-q0^!%ut1i=H z70CYagOQXKFL@)*0h(tkAV@E(U8r%-R^u+^6t7D#)gR%^Jf>bi;*t$MWDX~F#~n>K z4(lRFo;{ol=00%}6qDsGz$D>SPQX*Bj)@06v4&0392p_y0XrD`a@dKhdGftmwq1O* zjwigrlx;m^1Uz3&D|h-QK7g9DJ1JxwJz{_NOt>q+VH$vIS%T_IP<`cGmx^ngHTd22 zH2m>Mf6AbtWj_vZ%C?Ek2+ZELeI^6x>>&(Nh|@@0S+cHosnV+F@1~dFJTbKtIG`&R za!keOZPjtTRArJs+NF6E8B>%msu!QA%u#xhAW-x61PaZaFwwS|NIpc{@8lkteia9w3*SGYF4va^wr;X04o>~r0lwc%_m+kos{q0 zfv7&G=iwlz*mUZoKZeF4oh&tMX(G`I+-c0Gs+x2XRpBdS!(31h%ivbd2F~>&KK+Q6 z9N~e+Wf0P%gA`C;U6KMTs-%pxv|%sCM%GwR;EMx{9Z;L{%Jj|!N=FaIu@xiDGhWq^p;XS3o%>c{z^TJ$61~9qUt=&U=tzh&qNbt6WTa9S|{*wC+(SZ~^SdFq3 z%U+$%BCxM;mLcY-UKh$2pb^0MA^Xlz z21qev=+@i7Y7bKk7IrTQY@zJ4OjI%NqFCJH?3=iq&B4^YL`-C)gr^EZRunZTZV99{ z;Qfeaq|J^AGy6PusM9X-)y>(CZ@|t}qBS8elBxIfr@2Uzmz^(Pr~Uaw-v=or#*aZJ zfxM|7NPF>##wZ^!3d|)lf~B3d-WIpID2?7Y3;x zpl&p+xt)Ifu3OXQYtr0;f8Dlf&eUe+YG95bqEZx^YG9&ELgycE0l${Lo1c1@Z9DeY zC?}&d`QDma^*YFZ;#^RXBPDvrv*WU1i9exqji3-OVyiB61nrX(2y&E7ZOSJ%vC*AH zew1L+lcIN~wJ1Aua2;V3QdTx>^xI=3r<;mXbV58*pks_Zphu+IR-9=biDzmDyeNFi zpxV-BU)8;SXqY9+_bQghPO<(m}Q|%>!l&5EaWI8$pmXfw(S&zVj|RSF}_F< zGzXeRn9A$2>`Iz!X^HSu|O?ExsR^>7a`x);E+EA;Hxw6W1URIvj%J;IO1ta{nCXB4cG z&be@~_zpXS-lro4=wTYhk*TTWr&U)QYxnO?c!GCsCaVsxW#wFC7BhL-h;nt>^yXi* zg*Ck2Z}YJ6iy=apq}8FV?L8bq6^M&20_2otH7X3St8_A>HX%7ECXP*{hk|tQcHPhx zr}MI4RuHpZ1v%+YZpv6vwQfsnu1R)tpe??;1n&E&@X3@)uAKuUa@i776X_hgcIo?H zT5KKaH5$IgEw!G8?Bp7iC@v}^Vsw4I>Ik{(N16N01y2~wt9WCVcp7M!Xfhq+1-9Ic zKE@^bHkeYM0x8+G_`wfUnQ;r2hMN z%K_=O$cnH(1rxV)4edCz0HIpYfHs{*6fmrY74wIH7`}~!F7Kz?|}Gkw{{C9K%N?#=7I$rtLh5?(uqBx@=D) zb?u@24st(t>scIQ9<*q9t<$Lvpm%AUPBj-C4Ql$|7#M(0%Q+6nid@3)e#@I&vhDxf zJgC^ZIb|waKu_qn$gYl%n$!a;{xnc2m9N1LGRq)SlcJ}b=MPhH7Qe-6#y=&Zcqm^B zrwMm?g_x4CyaD?dUA<)Hqm?oo2!8@P%u%+IFn19rJ|X!YyW^oL&P^KQW)oBVm^j1` zZbpKYsU7q0k|DPz@J~quq0dK3tS4h{B8vf?)`AktRf$dF)KrG}lmN znZmCwwTN5>nR@wJ)Oc3Cin%{D&XB?;O!=FqAwzUAh;A!dJMm|U<=+QR?Kh&dZ|6Ts z>2u{YzLlm`E!9DLZ84 zuluUp{Vq??o*G;1+68lW98(RVgXT43F}z=XoC!sb&*gdFvYFTMiOQO@>X;0g8^2BX z7MWG?qcHwnFYe*C>dAxVkN>w$IHwg%%ldDWCUOYh#$j~^aI9uMU3mBRFeDxZu(qLu z;wkksMkf{qIQc(Zy#-rb;kK;_!Ge?E?hssq6z&AK0KtPpu;8x2Ex5Zo1lPjd-QC?C zs@J~fIemNgf2jJ_m~)Qt4t+b<^25r`>fodKT4t5WZ)L0mU*pZhdP|GzlYcqEo%*80 zb2uzh0Q~C6ctd9pXsd{zSbjfp>JP3z7yO)qY>7a)nJi(bXx_dn%0C{lB{awkO3vI_OTnmIl5t3Idakd5gv#qmQ*%-sz4cCBM3^&t5-lDJEPV;ua489Jy>`Rt7iEljhjw$q9>(bw?I zVjN*dGPUdCeyU|!18v&b&neo}F(6bmd zz%db?FL%`O}e@Kwl>=N9C2Eh%M2M2aXY9$ zaT*waH<%8yX3n*&;wvWvi&{KYUS9&^ipB~p^%rJdi`X=IMR15mw(D7z{$#8O*aYNx3A@-*vk@ga0aKb(U4YPn5Y(b1XS6eb|> z-;XD+SjE-CYf38$2{@+&C%U|~%~`EiK#0GZpHOJw*yWG7suq6KwKxvNb&TW`BKhFd zmU{q>Cc7qlv^R{|Ey%DUxR0&@rRnt^aNchFY6X#z5yaeHiwHxBJ}Boz`W;1p8aJZQ zgbwK4YZ3}00mjiWC}94K?^C`QmGhZn21#1FnRt2}?#Rv_qFdY#MK?k-aEU`8-IaZh z6-VyhJ{g=(`(knls@AKAmrEEBH@br_%YmR1o_v1ME8;i#`|p=I@*6=L33SPDwI-xFG(H zYGevkxg=b)O7uT$+yx_>QtQ5$B|;tsa|V+YEL67d!(N%bGX`8()6^iF>SB>oWh7oQ znR*p5G!uf1Tl8-NO^#Gt1_E7wFOE-`3Gu^mt_vi^n(Ef9Tv`Rh`G~vz@>v&OKOUmE zKSAFjv?b{@7&$V^kn@!4@d@msQAIh6?3vS5LaCu{@7t`f)w-SR4o^RC?v}_KY3Mo( zoz_Ss+zw6<>$IP|yzHY_6!eN|gtD0JrEO!--@{I$($jr#+e{iz-tWh%d@U*^Bx*AdY?y3 znnU#1%zcNBxu446XM|tR%^N~dz8-fB@7LJR)Gtvf6gCv|?a$qm*aP7PT`10Y6bsQP zib24nr1qg}G==MvyI5o?qY3?bH6fgWyi#{bJrQ^8d~7-iaUx|l0!Apts9>w~htvvR z;Z6*I>sFFbE_D2@YR~hh3!ApJ8Ue{CG*y`SDf3y-C)_;r-C=4O7|ZR;5ML~ch!8Bz zE=*??>mZ!Q5Cu5jueUtjgS4`kE5XmD-d2JFZFJ`Bgq8_~r3<(v!XEV5DDmP2>XEkL zmmi5bY;&~AJwz3<`*)+ZI>f2f%~ZwWpeK{NvXfj=r5$?~a2$K|nAMu|h77S}Keq_T zI0UClhC?s<86m`Kqgf-<+CQIRiB>#Y&K-MFG{iUXj7I$RMz`;c&gAbe_A#FwcMSra%56*gv-@)`$zZJ#T+6P|oHxp1HHaycuBFT36p8iQ!)IeaV7 zi9;NOV$t)SJ6~wqqAoDR7rZWP1W%thTzDK__LuF7Q&BWYmU$4Y?JOUSVWO|L+S*YO zA)-b8K|d3s@yU->gON+o9P8%E%*Pwj zv(XYH@;F+_a=UWU?&p$f&;`{%&X>+HiQ&K3=sW)R&vx)tjKr9#MfT1(waym&fM=}G zK3%6NKe#Vf?z=4!Ny*;V+oZ)5tLkoLPW$y{Mb)o>@^{&q=bbz*Ff4Ff@oN$E@quj% zzWj!sGx|#R_NQ#gJTq}lf`tjhb3z?ZaIvaUwE$dw**O>+(ya!I{r%}>$sYo6Bh*kc1 zR7a@tUz5doUJ_*=47x;LE+|G<67WHzy#LyDOyGb zU$u(scXpqtO3AEx5-%akbMWe!Y0@)K!DOu?CkP+5Q_&532uiuR%~`(}72dx&q?5s0 z%8+gB@bf3RHFeuT#4lTQDjh9**WYTAq#_)+&$ZIzLka{8G3D`Dp;cK^P}Z|KI%0?V zktp0O8`wL%zOZlEe$}dZ!s;we#>RY^4J#v)iuvtRwDkM&REZuGAA>j!M9qME_hMvM zu{KY2qCoQm92Y|CR+MwJM8*8*neMq`OB`P?u}!#E0eqkms-_(C4}bm6d~toLwKYAK z`b4vja6zj(D?zuCZ_8J`$5z*MQ214DJK>~FwvYwz?OQuKF?&h`T9KEx^N;so)5eAs z^qVG^j+csosL_Lefsskk@+jJj`-B^k0)W=?g%#A(13&nUBd;_@nS;i$zAF=(y7b&SeZz8y`_TMxK@dB^Id;`{-+O z+WM9}V??_CdD-y_Ps{5_y8Iuxxj#{*;hi}V&o&x}y{2udc*A}PmPC&)vyMj&2=s&-Co9sZH@DzL(C6ZP`_)meC%tf?siBT)!(>d{hO=F>c?svfgpN-aM~v zJYJ)Byzh~EURL?|%p?vycx`4B7(T6mpSo(%)CS=`P8f4VDgp#U0b7_r*Y?V2$c|5^ z;N!gsU_9x^T~jKX*RHr1f@Jw<>&v1rd+zo&qMfcgv+IaBW z(EAal>%7MdB_*iw+UWsFJhtAbe_Ffnl44HV_-CCeD)@55;(fy)q$VIZb6j`3xk-6( z0U64n<+3VS>~}hz(Pd(Qmcr&+!|KfWe?heO@vOZ4#-8K_?!$y13!?!Kf~{v?0v}5j zyEe**L+FZk^}}P%+@fKj-Y?3RMqLmaPZph5*$l-QzJ=hs_066YoIur7aZFzETUjRf zW}2|U-tz@pb>nS<4}f_QjJZS8J6bXc)o&N62jNaD8dtAbi%rfC%Ln|hbwA%!@7Mj^7E`sKZD$y*hs~G5Q+J5n$9IQxny>zj+z2IUsUV;8pIhcAtKoF$JXWhScA-RY2f`{o?e#HkU}Bl(zHnUIGV^SnSVEz-J%?e=|t z=5SG=2tgjo3?*#Za_+5TQ3{6ev!AqLsZza`$;0Ax2?cXKFH>fAK49f!#!u5N~>9u452vtg6$u}OIDH`%Fd_P1*k8fB~MkF9msHpy^prvrxhvWo(ZBt7 z(D_yH@g4lDUg1Y|t<%fx1>`>1{1HL$I@3(xg5dbR41CoBez}AQc-q~kOnCM0Y3SZQ z9tFvWKOg!Zxv6x|jf`!m#q^ z_Lp^rg?1(TTR%|9ovyB9=Y2!x@%>HKoEO)17dU&mzLz2^S?@m9{r;WEJ|G{yWXlY) zPxypdqS*T!Wjtlf)t|&+ltww1lbYU1QJ?q_qEQg5on^(D*V6tNHp*e(1PMkj8$?9_6dU9p)K)2$Ba z%Co(HK_l_&b1WgduRTOr4n0#2pOeO&wUlq2iPagud-e+I9o%PiIcfl@H%jPn_uA1L z4@ZD75J?xJXfamoiFs7lg<-S5RqO$-@k6yvD-QLMNIeZIHhe1j+;;!FN2^Dn=F~pK zm8#VIl$s|sAcLU9%deh}P8|a?tS*cCNi$zLmc{m~b{3?u%5%@B!(r}g(rXtfq~FKq zoX}<68FD-Nh^=w9--lRl>9sPR!qME{*(Ug4qH%7+l?GJ0t+!sdhEPIo8?)TbBNqfu z+%&>JvWOXO4D==0fbSALvI#vsE_6LyhZgkQ?)oOY-@n?r?_H!fq`gT@>07EI?-(TR@-qdI|LKPOWDs>K$UW#VdHY;WR zRL`7ByGrp0orDNXUqr~c1x`X^lx?IxFTD!XM>mJw<#K5Z9T73D7F>FiB#$z%bAMe zo93LC_i0(h>lg`5UO!(Pn}NsN>57Wox7jgu+qvF8K*4rSOQC8F_ik1u(!Sv{5iyfl z-#MWx>U(s=OKRjeaCr7SJKPUhvxd7h#!<=i4am$zd(Dq7bVk#*qB+#GVv{ctCMBrf zA1tiq+np?)b$C&iX+9o8TFfRfEkooLYE)!gOp>Ee*4$3Kvj6bedI$^pai`qk*Er>8eEl~@to=MYAPBkSw!GW$dY$NaFSzh|NNa?O z&UDzRw;WnNt1W(pd5MZrM7iiNUJ-ENcU{&RnYJ>~RUW)d*o1=PW+`*UnA|LF`J;b1gCENXeebW5DIU7iStQ?9=q( zUpZ2>;yzzh>Avp_g>X{_A9udEzSo1!oa_B*!tc|CuRg0;L^<{^HaYlPFyA4pSsnEf zqRW?qQVOBsPW&~83NvV;Vkb-9@k4a5>jd(KBPz&q>+)H5W20!g*xC*$32sV(SFUzp zM0e-kfG>s`UA!^jqCXa6b zfSF_>A~|{1K?*T)N+$b6230%u<%63{p!AZkBAzf(asJ$|ri}G$>vWwi=$y^M(K-#J z1fXOn(5i3i-?3BbQ((ML?~H{L6s8uPJ;H;(4pE1hh@PS_hX8p|-_PzIyI@B~mc+#J z{coBtwJ#V}d#CHEnQELuR(zr%p9!Fq22wvhOM%?LBW1AO48o|QQAdL#54 z9R1q!BHQ<`jc;FP|Hfne{iF)0!}dh#tZ5+75Xf;h<pp zuSCf(Mj)U@7iC%oXUV({6Dp#*5Ami{X1_PiHTqITTnv)wtEh#|BPB@+XO zV3x6C{KNx6l}B*JO;a4vM~fOM8nWHZyZ(Odlk=NYC{A`s87xDip$vDj5Sl`QfxM>^!Cf&rLT@;`$y3zInE4;#f!9=W@Vp{!o0E*xl=>5@f|Je zTq$+vX2I_%S$3fcRhT#Zx(U)nsTE2lbzfB9n0>N0&c2Tr$_I~%@4m}0?Y;J7rY@G+ z$#`Yc7w9D5%8}3}{Wd%st>1;FwaD6<(L(3aL=Flof zwMO#juG~Rq3Qea2YB~|rk&jdgl;A8M^K9C`WoZrNPPpiBtetJQNE(kODV51S0V9(8 zVIjA!m|vjPQ&$#=GaON=qlM82f>cFRXq5!f9!jQdUpT77e}GS%-gI~pAyNTmC) zFiozz|HDpYf}{9^uaa+qOGZV4L~l@&;xOdTy*pYY%SyJ0$~tI1t@^D(VWqrLyyZvP zr+-jiba-R`J{bC@_)}))9AV_$U#{K2hyS!+!KnXWxf@%cb1fdP)G|bDXRp9Tlj|B` z8=h=UQ?D*xRWT8+#DhW-te6ii*~op&l-JkkD_5~+j;xTU%pkQh9Yp+-6cRk~zLoVl z?=;btJ7=jH34Xtc25vBs7yM#&@g`L2piPq@+dF;nc*f1hR31q2e&M;Z&jNXH8F%`3O{m>`j642c z(`YSMyRs1HCp^zTzgg=$EFOxb*Oze+b^7{Uud1+gMH!yg%-7MT6+?DooeWTv5VUG2?(vT#JhEz4t zu~d#E!q;{?&5xS zCj;1Y_N5t3j|d_XLHt1Ilxg_IP;Gkl{W`{#OPOHhGxI^8N>q4OJ)Apxt54tgzv%?5 zCcz|2$+h>85i7QS92GU}Y88gLsn;B~Dw(`gp|*P;p-YqSwRm}~*B(7BEWG>532N@j zoleB{zrUW$Jx>xa0kbBXYKaD6cCfep+5O7XM`J)O`$+*ntvQ)Zv9_X(Y6*!vTx~TV zA8-o|KN|xTJomFOHc~5&BqD-i`DM&qs$ypUvl~4kB)9c9rH4%UoGDZ&=}l6=G$ccCnX4u}9L8v!bjS?5URx1xU+PZdIqD;4!x0sgxIF6;N5 z1{=ej-p@O&ZbQUX9Ofp{wE)0yQ7u zq{+c4d>yy*3ms|P46-LKYs@y}4meBRk89d)@)HpYfD&>&dEpW5dw)ZQT#i+}7tisV zos$FKfG%7%2}5%eSGIJTCzl6BYQK-xjw+qSynobRLRzxF^*c28#?9MlLoSvj`_I$ZEY zYwp6nx%0PY2K<^;l#muv_4`jFPNa;Uto>__2?qSRysVqR7af~?3GzqyNnt`@TO;N&F;soJZDw7+7;*R-2=gmXo8rYrsK0CQj}VAhj@eY^>3DBq zNtsz4D9B>j7Id6g9h3_RqSbJi?#_OnR6D$EzcE~hl@xFoYU(kHN&Hl@B|?_JD4MDj z2ozZ4=@m@H|J!peOVb;HlWJ?rwsG*#_)XU-D$Y?)AOKD4Yv3hFXPEs++|;gYYc}s- zzxF7`_rJRU1GJVNOh+DZo21XMR3LoECZ=XJx{lAVi(4^F%kU$@0C4-M&uNL+)I+_ILx9f&l*|@J`IW5 zI%rK=tpAPsW;**-b;(?VZp{L6kZeyKM=!YZgHM6abs+k|=fvk+m`FvyEh}Wu;J7v~ zI8r@e<>C@H!xxGGZu=91Gzr~j!1evZ*1^qGAWLUlnoyAwtr6RV5YIk*F?YHY^H34e z9V>Dx?#I;mC%Gl*b5}PXMVvRy@pr;|brh5sBE0Klt3s=C-&xzQ%Z`|}4(C@U`c3WWRl*qCvKH&Am~l(e`Y^xjOv%5KtYINVxfWxWBUE>bz|R3aB0jTY zWT8x^6h?w^b5!=N{m55+b)#vQlIEierHvxAw`-SWO!!0p74d%D;$WdoZ)S|TMlc!ke5|3kF<*ZkqyHHl3z$BczT_M`f>>nOoN|6|n zK0qCPbqxPP75(`Y$n<9|8aV%}IvMLhh!T3}|7Ghs&e19NAKfs2f(mq*z5Pr6=f9IQ zze>{Bv!$u0C3w;}lUBH0<65BdT_DGl9bald(kyyH06(#WBm?B-8sl*2 zZw-OoLLvyzxc@|P9z)Ol^|QnFlH~B2dz5SRE1L-U|u+S&$o(m z_>E2<+mGp_qU*O?faJFi!ZhJOjU6=0tt}k0Mc>IEhNqg=^GP=dL?)_;!U2EgEHnua zS0L*q2W;k|mftsyF}9QepW}~HNpV*in(O2s$@XH$)l8l7mJevsf3@;HyGhQAhb=KB z$?tNQNE(tlT|ZA9?Ax2+Y26eO;BN~ z)w6SDq~wS(t@YY?Kv&A@tTwY8VBMAeV{>%Jeg&WzD`tM>5Sq5utR2qNqqg7y;B5g* z7tPNjDFu{lk7&|;q<4?O0+MkZf05IQMLhLN4AQ?Lajb|Anhy8smIew9DPV)0h>0`K1 z`+iHAE%**?jwMgmYm6h)XXfUj>1@2#`(=RC6*4?6!=9odkb@H{xqcIT(XlrmbmW-H zi1t>f@77bM|3L54>2tC6P~z=&W_{s$@_nLdTW9Sd`Rp}s`}Z>8#;g1D-e3-;nfDzB z9^U_92Y^FpC~TbF?Ky*`IR6kmCpJF>4Wdw}BW1^grTmkwUOpEAZNf=2&JyQh4KdBT zCl}O{sH_gq8dXTqXM*ouJbbP*5NzM)VIVhELW2KnzX>v{6ztQR+wX!nwm2`hnm)G+ zQv9VM8!zD(YCWq|I2HR;hOQ$zM0h9Jp6-16>SU@wfKlztj|ewN9WECuhAG;UIVj$V zDQZJt!SnSiC$^HsZ1LfB5GO+seqeY+?T;=NVeIt~ z*+Qla=c4bns#eWP65io++(1E(gRc^{1-}214bry}YEZ@aaSfGY0P~6S%Pkp!w-eXW z(XAx6lq7es#o+XoQ#1MD!L8-E6~_tHI5xo*JDx9YH6jM0J4q36{Z&s&d3eN0ShsXq z_2%1!Gi3u<0&c=qlj&T=68nbs+OFu%IpiIGkuQF`(P zn@|I)_Ym(rE#@lGw5LXx%&EKlv$4%NRVP`IpqSu_MB|LMb6n6Q;Uxce}L>T_dYg(om zCm#6e&bB1;LxaUlA#U5{6XezfQvRHR2f5Vo9O{Ey)Moh{`U#Zk!?s?IKS#Q}KW8+q zxfwu2o_2g7V93-_0$%6;051gmhX|P!(lRBqyFcy*k_^hWt_*v8wFECoo;Z`Bon7^o z-+kGoH!DfjR8;SV~I7`1Yntjfn};2Hp1n@v?Q{%kc(=mZz6gR`>V{8o1DkDSic>XMS%iR5_o zI4@17p$+G`i2B4oRpx6tnvMLE>Apx3K;9mX)oV`+}Ug@$Y9g z$ZNe3%dxkDe>OM6DJ<9k0jC zCcr(Gk!Sm7rxglj9+0<0@OY*#mSq9oPWp+#=f!ZJ{Mt}^+fJT1IC0LRpV?$in%S}| z_Ev}g%Z`T{_?m}Id+$((d{M5H3|2-7h<@_a`(Mo(Jv6Q$P-oe`#d(~QgsE4jWu4-l z4dGKfM8o| zc~m29iYGO?`d9~De#<(7kw8#}^w9a=@YX|#)xVWfXe%=6tN*93)T;rFQp>| zteB;j#TVCR)@gio1o-H79qZYEc8_fKEtM6@nQm`|pvU3@LEL3Zd+x5v-73pg(kYz7Q z0c^U#njh_s`t;wsH6kQ?#KHS(|lY?ZQIZthZG&c?Efz&!HX{9T(#(7oZ!WqLFXJh1~KBzv{&h z(0%S?^#fYL@A6eE4PFfLu8^#bBnQFg7*%_l6Gu>L!^^fVS!iH$AItkhQW#v#Xt?X0W> z013t1d}`=^8N30R%5Yh|J6`CpKRC~*w|tw=TBYZ^xn^ML8H#_3O#&~HUb2j{tb4Cy zc{|DAFO*F2t>3TtUc-wg=bCdp(Yqmba8j=MMAD@vpmL5 z^dxGoT(?j3pZdFB{dFSCDm#vY%yciVS~N7~0gu>4Cap2zUfWZJ?fa?Odq7aMVw5VI zj^howZQ@JdetAVDTM#~#Q1erf+M-P(cz2H_b&0V#xGWwKccHEwy$@l^6_ig%0!?s%p|PBH;{Fa` z+D9*!KgXjtp=XVc#VX;fNl*BtHyZy5ax}Mkxo<~ytjC*aKCcCjxtROwVNv}cwzMN; zH0(fotWu6m?Xw`Jh2e`p^BGR7+a}T`+(W$wV_7X?Q)q~C>0I$FeejAqP~m;pe_8l< z#;oEy0Z+d2FMFwXs8G2_5smuTOFKbb9LAmtpinsxEga0?`KiV|@Kc)37`}W^=U-$` zVa(ll(77+MVD5PtP}418nr3m4F#t5wvhplPqL~j_a$hkPa~@lEbX^9yG{Hn^75reB z=lQ`{Fr>i{j*bom8bAJg^0f&ANj=`b4W$EnB+zqyGh||`9@-19tY%4#CbLK|zyXT+ zVa-$ej)T(nWU1GGHD2|qBpFR!8F^yKpfhA0%xu()3#D;vUW`=+n7IdQOG zzihnaD3p0zjp)^}Hu}=9yEc~tQKs#Mj_bQe_gCPbM@mX6=1cy2<8dF@x-FY80;b@+K8^zYu$Y zVhHpkasC@3MjwkAx5MXbgCM+mKeOU}y_1zJSE$jkkIgVr_7BbH9XS(0N18^JGOq`G z#|L(Uc%gg0q-_8^Viwn_$d4YdXZ`orX>VRW*TEr+EUyQ+(L{p&_xG*>!RW*#>h$md z>wES&J<+5BnKFgx3IlTsdh%=L#E(WJ4PzlHAw%;6Rk?`hY&}02@CbI1cfAGk2|LYD$H*k z+xmhbD7%5+f{yFHsyaUF(w4gF_-|%hwo9IOP8vHCq;H!8AMMkhN*6i|-7J6sGjJYI1sZip$z>-0a;a zZo!92zH^(#l}>-|wj-xox}L@JYVh`4mFwm^!pR*dj{<}x5Vj?d{{fGVn=;s!*gi!ywI-8!C&DwTNSl-VY!H^kk?_)cjPJgmm z`;v&btfy1LQ?!93@MD58zuQ}F7uh>pM>-(!wCu zRP)sTsgkLYvZdX2=Trzi@!Q7c)dA7&xHpOGpu0@^^4C$34w;z((Qz6v z|JXJ*=I2z+M7wS)@c|k(}gXj6Vn+6uGk*T z!`Hw_d(GomqfGx?#mE=C=VD*ns^#V9$`Fwn>iT&BfZSq%1~X6%wfkn~4$%-55>^@a z5j9!?%O1n(GNxmsO{ksAVT9(K$}egSd&~OaZ47*842ZO2jdHh*Or@y^e~vOKJK!`o zF^s0?U3~;2LnB6oeei%KlCDYdPEG+unV_MM z_=CrF6Bbc2V;y+e2E&z---5=iHkwgmyESmi_BgWMAB?2L>8}g=OsGy|_1|NA5YTNI zF|_0d>Q<% z1yAbw_}~q3nQRpH3s4CO0|fDKl5L#`sSoef5DfLI#DrJy+{JXxn{uFO?N) zm&zfp(WD!PqyG`UW~jwac%X31%MP#;KrN@sA@JfuJyw{77sSp zlj>bih&CsIU(V~p0Ys|fbwlv&qE9sDCrob3Y1qj7@q`csi$TrI)RwJsH}cTn@tQFcR@g&3WK$DA`2*OmCq7InltA07}D9}ga? z(Bu&S8qTehz@F&XQGI~bF5Fl9lR5%a>2GK`z;+CAbwIUQ#59!u6+ z1TNVO_aO^}C68Yj54S@Zh%#>ATi?QoxG|Ms93d)*-P!=Om*ICJQAnd=l zB|L8fl&XoMOwe~=EX}GBAcjUD@P6oP6@0kJN)lrK_CBluHmrWurT(+jQ*CtqsKbiK zU-4(EM%lDzY9fI0bz3a@Y^4@L%MH2Bm1TC{Acg$oCjlQYle0(-NHtR$|FpBO&^s`O z8d!W>e0}w2#QGjP{XSasu1kHUt*l$kRy6hp0?fY9GRZ#a-BTeEw(LIMPY|^(9PE*9 z-UMt_`RoyD=z8rHBEA!V zxhy?i9p}U&&8QPpG|LzvnId#>puNwuBZz>RgxPG`Y2a(PSiHa1Xh+GX@E<*K6a-(q za)YWNottl4V!=-?G0OBtA;8QPpd7~Wdt{Sx$JoTe#L!*`o+vwOcqoCG1(`d-wMF>e=z)qm!d0l z#t>s(t90{+h%&9`$-&H^9V1UhO>P-OnFrCN^jgE7Mhmm8$7oOB`A3u*$bfs$>JWa~ z{mIO*V41nqSH6luX*0^{>_z!DVHB({4H{|$ zWPqvbblxg>5 z{8^iJ_0yQ5+R>aiojjL+m5-FKfPpeibf#4j05oPR=cfC% zCu9Glq1f?8x=4Fjl~AzjS?iNQZIl+{Yoo){A2!~GJ03Ddv4Ku<4M6+y4b1Rwaj<@_ zSON22J_VO8X{;yn&y4euL|QKj>xKE>QS?IX7MQv6=&LF6FS(9qb}MQ|2`tMje%LA2Uu_kQqKJDkugw|8F!ILS5N~nyuaPI;{kLE&m5Z>uv^2fzy%2mC6vcvsn-djaaQ-)0CvgBW~V<4kO^g>nxfPtRaP_{?4b1J zG?Mi4SamZLg?%py@@uV>(L$9P$4d87?o|z+bKc_=CJyks_C?dleQR24g2(^v0{)(y zDIC~m*a$Odo!v{qLoYyavaYp%vOBzc?tAKsoJ$kn@>q5ZTlqHdg{C)K`nMl16pA>$R5xsuIv0)ox{UEb{(6krZl`WW zfZE@|NqzgsccOD2vc4FSyL{F#8mo8NO=#*+P!_ujWr7dAzo@lO(9@W z&{@}Z>TwXQ|Far>(QEj+RXqyr$qav9Da{NWv01!eWmO-1$e)^lY|vDqmY0||=nj>X zk2b9^b`f94{$>1Zvo@*iR3huW7d%{M^*{Xxd}TSS%+1~-n>*ACwz?pKi#v}D^@pLf z{XN@I_X3ae*Z4QjQox=lAc6oQ$_VZFEorC;?m><&y>J;@M}+}AigT2`Th^m;Fb9I zX&m^nwcY3@@#Wd+(58ICyg&aBS8o{=R~L0_k`PGn5Zr@11b26LE8N}P6Wrb1-Q5Za z?(P;6+@)~q^WNKE_wD8fgTX%-b@pCot~sBH7~paU=}@mci|vTt1`1h6*f`Eo6juC~ z9UJ@6uU7yG<1cL<)a0)IjdIJHOt=ZHdS-d;IU~M~yH_? zG%kQ5DQ^B7I7lJ{vAyEEu|jbnpk(nde@V=P%3^^ukL@Iq1dre6eyu#bI3JPHY|flo zjxRxt^&cUjgwvGpfW2yA%1~0VaY!HEMRe<^S(`u{yb5))BQBys9J$%Xo*6VUb2pkT z@?Zb%$FF_$N6q*vFgn2sP)td^twwlLMilKSt{yfUdzHBzkH?vABCK~?j!k;j?Jq5Q z8a5+irQ;1EyP922ap;~%2taCpU+A-o7yUWB^s0#qw_LkofBnWi6UqYRH1CJuTbXm$Y5e~tq6eS})ovzQ3SfEie z=!|Vy_jM-FJ8f6u4JkHi^KW1s_Hv(@HZCy&AD z^6_(Zx7C$#*V5B7fM3)Y8$s33Y%%upD(AQUroS%?92R#*DV zTwhD?^}MzFzQ^zN3>X%Y|8EQPl=&51FGBGJQ7o?3Qvg&)fJr-(OW06RjV`+ zu~6{>pw!i4hRXwa3@#+`1Ut?c$|Q%_xL@IV`)p7U%hGK7kSEkdDD*Ca@Oue<$T6wS z-tTY{&_G8Ng#1a!Pgg8mJ-Y1}ZO-a5spF#G0Mi9TCH+S86Mg=h-@Iphb=hWbLNVc@ zOsx^fx+oJJTv+c@K}KJH6`oebUN{Iq@67k__I?p0@`R|(O`sv}QR;W*qSh={0@<(GdKsfnWzayDTQWK?Mdq*CdEB@6f?<`pVDT4owm1u5t_@YN;< zPLvVM@PwH0`*o?lDs{=q{5oqzX*%(G+{yOKTB}*?G?L!-@nr`ybedw6v9B9j#qw zasVm$$j)Qww&%XbUxHq06^wFr>j9qj@4I1506!En1~saVVZ7Dr>uPl#AJYOdC3)WZ zZAj=zh(+!eD@J&bWu$b5E{X(+DzqgMkUR|0#aPtfSyrt6qv+i3=3>?7li zxzDHRlbLNBC$}%>-dnD#u#Yr&y}@IoUTVUy3OdfOY=O1P<*dm;rh=I4dcRe9-whPx z6w1lOo+31Qbdc$U=l|0qm%HBBoHjni4mMl+h;7f82U_{uTP~?1A()UH^Lcw?2w?qV$j{mor z!L}oTeaX~YwsVic=SE!#mUbGjYrQ!G{!}`H?aevy>R&qyF%B_ZDhbQw)XOBH`OzVge$hfR;Z$lTle+=oARx|#j)z5m(K@4GIRcQ3!D>efH6PWwMF z{@R&6#Pi?V>uSFeo9^1-n#LxK)&VFM{tpA6bDslFcF~}Sa$h#Kc@JQg*9cl#Uydu^ zjuMF)RtL8cUv`?fGXWTCxjuAW3WrjKQx%s>4xmgK$p~+B4`)#$Ev%;)I}MUeAAzxBh;ZipgBA^ z6g2=cLwHVOc*;#3Xx0i}x9Vd5i&u7=(u7xp){V%(R_uk0TbBZrx=aMLWGT#Tv_E!* zTv?3u85W|{RSLHNyaqIp&eO&jkX01!EnU98-}d<`p0`v106~a9e*FyAYjtqQcH1$` z(yv?+Vprt>*7DE2A3H}L|EAEQtl~CBeI?AT^$GMfO%CJ?A7hv+Ju!4T1L&1NI z;cqtj&gJV?tqx7oz)ANrL>+AFn(<4>gU#r_#Ngkor+TWD=^?p~R#-jT@#-&SP00YKlD zj7^byhK;w|&qvlz=hQMBsz#3?x+QoGkEC{hNs$kHX4x8Gye!6(ZZAL+9D$FWcq~f_ z$Z@{Yf!+*7Uz-l!UsouVv>3gP5DYORZzA8HMyDNKl571uX_6C2dEOu?+Kk zG5yEC8t;3#0#_~iugNI>5JoONnq+~i>D(kWUy8)n6#>7OXnW7s8@)>%h=B8&(;wyT zrx*X11AFiZ2md9O|C$Z^Mb|3>S7wM!>$cl4WCHTvq8NpM`=#9f5%S+=q5i7A=dBZ^ zb^YwN`Sw4-Z@ncu% z<%Z1p6Yl2z?TYA62Oxdj*7`typz~+r;Bg1`I4^7V-G$p1uYDI_cL%9z_2<9-{zt(6 zW>rT2$|#6RzU^p`V^rVwPG8`;#l7p+9@w!C5C(ajZ411v&fA63^1r>mj%)khYVbpL zP%4Vr5OW`QdnTvp%ciWU4*VbA`L9x1dmaH_GS-U-M(ptWw)uOb>Ngpc`}5U%f%iwT z8R%`NH9(?$zY%zoxuv2BP z{$zA=NbdVv?&nGwznA{Z4}3&#>pcV0tFm|70yjiA=0&Bi*I3=xz{daSzZDW9A}mjn zQVfCjFZJ5Rt6ktwiRJ(wic15A)_CYD9j{07SG|kAXQKa+1wx4T1#a_e0le9QlYM_j zyIyUq2aigRuGe4LApVAAv4X?xS#?=oB4)A^wK z{(T>?7)oq+PM$cw&*t`=^bb*m+3{Y$WoYumb(EDTOU zv()DZ5&k3G_N}&wCYCwXX|iLNmBAtCI0T9as@$wlQ!>?tp)zcKr=F?5o{ULFJ~ASQq=W>UEgBGBkIF!!MbJ2)Wa#mS&kw4ii;bn6_> z&>72+ZeBEYd>FZu_3&j_y%SOEzInVgJ*K>i!M8FuxA!3v&g4n3+Li_(k9%W`J&7y4b=k+b)VaLHt_;(NoaUrwih_ zeiW}>s3wU{`$%IDDM0!NFA!@N4Vd@~QRx0*`Y+hJf@lUS2CeA!X@FqVrk%i#Q$vHa zVol1UTiy|9U}xegNjF#C^02O4sYd#+msdTPQc%I$i%m?jSgFGMFC`IDH9LNvHpTzZ0%nl@e0-N~%_#l+$*7_WXeqvH$r`Rwr`7b!X$an8vk{ z!%L#KS)$%j?9sL|opK#XS#QwnnHz5Oe!Bi_J8WUT$JUgo&7aX1Ql#-4?85jSV_0I< zT~9G`(v1H~CsxpmF8nTd?#{S;#!-mmX$fOK@k2P?p9$>W`cu2FAAiN&&l3qSsnz)| z?{k1}_b$BeCAMy#?FIZ?^kDIq1y05eHeFtc-Yl+d+lrg*)oj^tsI>e&7Ff+iaBlkpql;oP$E^*oe&OPZ(jH;uWOPc4;=6Qx z$R~Q!G3cKSvs6~VxSv7PKBYTAn4r$d|$*iJxr`bK@%&NUFxLG+HQ|=r;V~a0CX9~b-{#!4=&8EO(1hk4Ygf!CbEU9V} zd#`o2L6i1bn~TSzc=Ij`jy>#2@gJchamuy_Mlgw!P~z?PpFgwfvlIVKZdpINHS%KP z>Gu7C-r&SrzG(e|dVg%g+#N@_O$ZQEl;O4alOe-IAn9Rvmx5IWx57V_vQ=@BSoHEN zpVh3?3g`0N4U`2jqd|kgZGb>>R}7YkqSBL#-)K{PJB$a@N(9}DlB;2>)w2J0Q zXDQ*dN`G+*mEh*(n`5CGInRlPZrV$lg*# z-{n;5!(*LJJEyNudBm@b90BbjoH0Gy8d&(Q1-U7F6W#^5;*A?r~8C$#mze zSV`ym4%_^XM!3@eIHUX-_MOZJiU~~8FVx*h$O;eAM^^0WLDWqk#h(?Mwkpyh%2~|03H$ID*SoRDL8Jwj-W4yRc$ve=}6cA!`yk zfGx(wT(q11(n!2+MI+P^JoyuC{BtCg!(x1br)!IEVp zQ0x0$An}~pRd%8O#&RW*SdO6(i&=C6>)CRG**{UH{j2&QT5LkJIn&mvZZmPNW!E~O z#(XOX=S|8$y<;(N!vZ9|XMY*B50B>VPz%gI#~vcdi=P*~0Gq|eMXGtERRGvKe9uUF zh9pkllu?lpg81iIhytWXvM1dga&U5M=Ea8c6JYA@IM#v+QPddz^ODi`D5@VO@0s^0PAA0nUPPU}TLkBAk%9QaNLgG5H<4YbJR(&_Rg$AxN*}Y)?n6a(OMwV+h9am-XSK z7r25EGyfF3p|dJUM-mfdyHjxQ89aX=_EWBW5kF?rYtN){i`QW|>v(o$`d+L1Ytz-r zIa>pHlIBSFj=SAJv=4rU2d2dZ>W9#4ZOD-W(4qIgvdpnI&v&QVdLZ@J1Q2)fV-L~$ zf@Qh${}#Btxz}e!8rR*X@cB7`W(@wzo%@$n?{^eczy_3!^JYQWMK%N3W>`g!Z4oQ%s`1i0oQeQ|JAVo~=c?1FJxy9n3 z7PDB$sY5#thN*o}gJhJ?NH#8wmC8(7Rgxa~tk!W9#nEV2@1N-TGQI3=5fSO=%L;Mm z`0^r#@v+AQ!h+_m zkpu;6mrHTK!l!N2Gtrc$TNQG!z8@dBEZaCr)g2$4H5-p z@1LZ|JxKNov`F%o5`1wm)gAKuo_h)6fm*40ZaLiO4&vL?MYG>K zC(cLN%d*yNxD^^Ss-dL;iii(Mla?jYK#vSiSB3$nPu@}Q;-Opg6?vta#44mXj^-#D z)HwN#@ak4nIE%t0XzP=+AfE#;VRKLZ!LHvcQk1F1YE$y~&B2XUf^{twPX@!OJjQ?h zq{T2z0dJ55*gNF|8On3yOBO9XG(E7J=L(0Rsrq@+?MC(yI%OUuz~8i(2K~%R2L9i( z2{0p|BLu(t-}-MoU-`ephMo&J^gGu)-MWL@)yqH75w_X)^jp3^n7-y!w`{`%zL?(P z^7gs9dB00Ws0am_^oiPeipVRBXwffO?Um#a!_wn_82Ys~O&)Raa@oH+Bk-E4zlh^v zF1P8GVOvD_2Pzv968@T)FRL)bYU|qe@6yHL)`Nr_)#r|ukwZHQ*r8mCv=Su$Lv^U` zvk`QH#(gNCwfsXsk4n`^Jru=#hD79j^6*EG2ZC%F8LH>m};bzRH4+KS~$s@bN zPUa45DwA<%;(F^^#do-oAQFX3_+8%T!S+4u;0*nA8Cg5LIUHAtNTCoOokL_!06L5$ z_d&&`iMBiK!-)$>H(7koK^uts1#*eAhkhW@WY7zvFOgHXK=?CECPLKvxoO;nO&RRe zU2+_mSLecn^a*2C$EkL$1r<$u*ijLrIa6%?37>fpR2xt z`lrZ$ewP1z(bdn}y7(OWzb>7K5DUPYo6vb3_A+tZ!nHgn*!BS8|B^LQ<>YlD(Kh)! zJk&72vZ_$65J#2ld>HkA>&oJSDZ5(lxnG)GFR4hzRerh4-MHV*eeO7(#asT(DF_Ah z6S75Oi#vw*q7klZzuiZ|mioT32prvc|AhV;n1?tQg1RLc$A!gY{2+PN56><&*Zz#UuG=mg&W>rHh?nMm!nM&-hYWTF=1Z&_BJ zGU;XzhW=RZN5$EuFNfa^LdUHdaB{RSjfO7|_b&ql_`4qe zUXABAM?1yvwt0*%pKrUqQdn6xU`MWApLQpM>bq~&((5O83Q_0*G;K4iZS@?K=14*f)}NqT&}ZQsp(w@TY2&@kL_cZG7zJrDS>G6^#SFO~~350>83PDf7T4ThCkw^jxhB$4Y(=)4kdF7}YQC2VJ zWlraV80iR#Kq6QsP9vG4;S23Sbnol`qZJuIL}qWgaMus@*|omD_5jzE--$@MiP>fH zyeT6FEf!}xJ&D~~wbR_{urW!e)l7Kz7HG+f~PmNk;VMOax%=$f`+Pk+yV#Di+}DC4bGZK?_@T_ zH_NlVkIIUq_TN_-UREnl-_TwpJA~k6S`w;~AY%}cgRE|l3Sg@8B{2)#G=(vD5dF z#V7i%QtUbUnbS6%M#AK#iRBvK8C?@6u`^}lPVoyuuJ)oB$^NEUEm(n-a%C`e`FTv0 z4V>6CWK&I|#f|<)3-D3;#g2=Cs=EjTCm|W))sqTVTXC3yc|$_H-%D+}pkC|SC%VJd zsn5O@grEa;wE{bp^i|5j`V|9m-XC3YRA2oh2K+r2v>tQ5{!>a&4Bp=*WWX`85KY2| zGtUaA@0g2^f#}_8Zjv^Xg(0#@V`2>E9G5^L|3Ak7Fz@zl5Y{IasC!FK7XmDQBHY7jh|TaO3&?r`Av0gn#3TK z7GMT1ol z4<|r>+{C>njD%IJ;SA&$d9!q;IKg*rr81Vu!n&tP^>~iF1|;r@HZB#T3ixj zcE0PY`sHZVPm-&`s>~cZ9;e(%TQ3X1GCA! za&-w021$y}l`TP7!DVrV=z?8pB95;vc)g*p!9G6>7&* zQXpcbC_QuN@dwXpd?nd>ef0kmXP#!%Be@U9rR&$ZQaoqD@)&zOE`8B&-0jq@PR(zK z`gL}PJ6lu1@W+W9rVx?fH(gYrg4kpAdo|f2XnxU&$c`0P5=r>ro(Ua(ZnN1_KS|z#d@_PGuCrWvZty^A6KZKupXKpxp6l^uJcz$Tr>;k>F`18 zZhN~kEQI&$XaBbv*yY7`0g4Xs)@UT9CG9Y&t!P8Zn(kdQe5E ztHK+-N_K9xblN_u0`yOkDY1=tWu(tm&1);l9eS24+3GW5m0L?+8uE`_pAF(aZdo*y zJ2b1JQG-~Iuc~K(iWdrCd3CjCBQb`BmJTsD3LcyOu||ID4-i)^FR%KvV>jNiL#KlA z*h@&`MLg^fgFb*03JrL>;Qx_L8Hi?^wgZlBgzekpgcug^cv7q02J+Jr7}e<}Qn3Q!H`RQxWO>fUad62#G08;^ntSPSlG+ zN25lm%GIM59w!|{uo6)=WSLe@v|)n3V>2hKv8B;45g|GOZhTZ5dxD)biv*1^Y=9Ib z*R!68D^%t2MDH;YD?UUQg5{dNJQS(@|t>e>Wmp~FjPaQbXiR-6H| zWr4G4bVI#itqHYhbY|`|$RR&D50Oa1;an}$wY}~5S^(w&a;zFTakyEvl-y7&61fIT zA2H*XlFjq5yo%eFd2`x>3P~?{YmR(uP(6L|^7Igb(R`c`N}iI;sLDeN$SNsPEiJy! zhRT!{x%GC?zCC73hadC(spl0afaP=%b@@%CKZe*a%DWnJqkng2j;sK)7pwogtgUXA zh|e3SAC{K`*7NUgh};TUAS3B5m2Ciq$9l^C{}b3%vZAu7n2?8*EtDyPKE2Q+Dc$Yr zQH>k@^pJzGm}uFH?qYMi@l0ycPFoy;;jIUuK)r^}GW>BY`a`u@`XiB1VZ@~AC)C_KL)blNR;q9@}N?ZBWVv?pjYI*cB~{hha9&n1TJ)z~I!2 znmS!GYZR9jlE;E7#!TpzO|@0=AF3G7ar)@%6u~Y&3Gs z;*llxSF?5>O@PPI;pZ3kxzh@^3O@xH!TiT)F95nV_q8r^)~f5@2@3e^l@Vrs|A_b3&*#a48Ze|H6htR z99PuH;M#U@t?9#jE48SvQ zLC`P6g-F=&WH1JOc*$Mi;??4=9Jusgy@(%1OlcD#R`q)Hi^a`kwqGPA=-Mo-zY|~v zuA0pqvReHKTQq6OJY`@Rbm`QM+@vGfg^gR}-%B)6n{ zQ@yHdSFL@OQ5cYhiJ93oYu>bLoI#YvJ4|E@#V?7!c-aCcNh#5iF6A3PXhVRz@|%(vOuL72+EGdl+f&~nXA?}(Z+g5)0i*X;bp~L2#qQ?J1)k(qmfC#| zuh-8QPM(C1C%WV8DrRkeVtq50(h`7hysHS_=btW6<`gDH0xa9rkc zk`Uw+A~*IDd>X!B)^kpD{cF3oKJu(p+f^>wy}zGs!Wf{L6Tx1}%!^l)cOt0gwe>r=ySs1y>`Ut%G6>u` z|L;rPqFlxOp8f1zp~gf@x%4vr?y(vnbzF-fbpt#NzSrX(#51bj?PmC!WfKAx6_(SL zOYoAc@Yt0;adw~*{rbg2CkMAb<$baE-g2ix$={NeIGxp}rl@|J&XrI@W-jG(>V8>a zE&0qs-Ul|;Hmx~a^4WYx1%^%;hRXO2y&wrLv5uxOL@|1#H4Tntrlb-)S@jT2%xuNF zgseDemO{@xlRdIQN|iVvM_77CFKKZvCs@~U8Y9Ij<0AtrgQ}B%gh>fWB^$63TN&{i zF+tWA#B&Qf!$IUD9J|#1Jl}%X%m2EOLG59Gj3KeGvdqZL92^=z-Iw`$<#C7X*3Iv? zx=LPVWNvItfQOfwl{AqAgM@_SjNtqPMu9^%%{$ec0ZopEe~JAHA8fX7_U88%HTLbx zLyKF>mL9(aQDqukH605JOCd=iHWU;Udjus!E~1-43`Y!#Vkw~mV?mA@N{mc(p)_n) zMn}a!Wt5kKm!CYpZ71?$O-Dv_Wc&Mb+_z}4BiKEdgb*&4Mr!vNmW3F^m_mrq+V1CA z+e1|mCt^5)B}Yqhddr;zFi12jQ%36}42o8W& z_}|szVj=MP|jVjJ%wL;rW!0Mf1foAdHK|8Z#LQ}E*_E2njL*Z_}O=|%~ zlllf(@1j|(5ET~<2@YY>Pl%7-In6cO1Uoa5@)f2PDxSZcT=ZN%cHLj_rcH}?_7NRS z+s$>soxSk#@&Cvz)eGzpc;!x22YG0=RUO3b1a4Y&g8gno$_<_%7sj^6XKzDb(~}GF zC>+1%q3o(EI&n5FO^}a(`F^xDhfLCdnn_?NGAldN9aSVFHI$%OUUjLZnYrlT#ijD* z_dxj85Hl|+$MW{MbxpFtVuytV*($^`URmmWf_|=OH{d!zRmwP*+A%(SHvcMKsNV2RDc?^?iP$lm zY1C5cC_P=PNqC_M$@2@FX9p~(DJPg)7@m%b(ZC6N^p-TiO_rR)A-_&USxPjMaV9AU zSJ?K0DM|a^4G3!l?*Q)c1{Mcz;$IbzTLqt^9ixb`uG=ak+U10!HX|Wv|3nHQ#Y`i8 zDqU*muLF*wI&w8_4~NjN9K)Tr*_~grO<4(Uf^&^jfq6~Bb6#PJPVU%p1o<(ND$9b} z)0)G*qRS&XMdo=TSMV?#=(dt6B($LkSh%TM8akpMVd6 zEcVgzjFio3Xta6o;=9Af_dp;mbXCKAt6QrpN4QALmr)-U3RxWg_o>%bdonqx`ELKg z2DSS7Ts02m5cnG4p}H}fR*IiU zXLdSR(yc|=DlgZ+$T`~%yUSj?@_b<_onod5Ru+g5dIv$=ot)s1^ z%xH-EY>+ddb5613``7CgycuZ*-PzqncfWY{!cj%>UbTaLNg`LVwFFE7t_1Dgfgs8t z7}29ctC+MkDNo{1`QyveZgW)!8&!*d5LgZh65B`DULKc@E4W)fTeX=;S3v)$n zow9RCwzkzYYP3Xa{%za6-NN}l=&K>aRHl-Kix{DjMWvOM<4M_3QBkoUh|(j5M@A&+ z)WNt!Yin!hfpg_O-=ftb=#ikHu4|<7uP=u!_HT+P&A&81T(@%OD|hVLRl%VSIQJ=tGF*TxwRc8_ z8ZH4t8=ON*@82z>)tECsiNLrea6P+}$Qo#6P&2%|YhGe{jB6odgm5&-Snd?<#cUcn z$tn6bD?x7+;$LcB#%HC6((=3&tigEhk@UCw2UM@>%FjSQTkGX&-_uJ+{@mqqnPC>n zX`11F@Y9{mVhOqH#PgoSJ;%jV4u5G$$x^*@=rLR6Nw^DGz(b$cKOJmW?36s_65w@v z&DP-9lgn~*TJF51x8?hEj|`7EH@j%NQA8X}U8@h=QoEnLXGv4X&o-J9t)s2Dxw&1` z-(Bb1V=a=H{z-tn zuAWxs527Fu$v#-Me*Ip+HFmMN?S48pJ20>^y=?!!6$mc`Tg*!;j$*uRVRp2R>$-Ht+u$b2MYnS&&VA;&lBXt*3h#1GF2c+!@ioknS_*tXv2G@ zTje>U*^1xmGK@MYM>1ADsWH+SWOdAQe@_{clT=OegkG`iP>goO-NB8zgKBAc^#0PE zrDwI#q!bu(J4rv`>-%b_1Kv5?QyJlzbYH~D#74p1*d7|<=Hz_n14}3n38-mS06-*F z=jw{;Lb;Qm90uKMl(P`aCtIE-M<=(4@EFg>zl+V|%h$dVF;g+s>rF*{1%-w7dOhSP z`sLE(Pf_ZxjT!M-rGIaUR%)%9X{1I+n+$b0z2i5(SpF+Av}#jZUYhm1Ii7s&yfZ zEF3_-4BfbXFlJiG!a`n(DjrR6b$<3-SNG$N6p!8M3wUxQtPD86yga??RqEX9N|S9Y zZKYm`w){u*-f#cCtfD*Y?(WZ2LiFxVH!ABoY|d=fn(Y6bo}%O8-W?Cp;>z6l(piw= z^V(dV6L>!%9g55&A|MF3zOedk$SP@jcV{ByE3{kRGbD`_mzMT;Jw8oUcaBPp%4M*b z`F|*x%o4`i-GP>P@p-jOJX|Y`{FUGLS%EPlphy4b3*M-^jIqAen=Z>!A@S8;E7Am{Z032Eg_oxi5#H638iyMeH12xgnL{FHk}JYUHR>dKO#Jw;)malzWT!X}hd@Kr9tjzRxRfkn=GpjN>fC_j_gy+8 zDU^_E*WdDg=aoDep1=FY<FMf7cZciAD(~t1~{MZ!s$k=sSZh|d6ypf@va%(p;bbB=EjtG?`4PzTv zsBD@F8+}Z);{Ah$rb1?UN>yFSPK1@5d~j>_*IX#HH!|$QXEF*3BwX&F5hqDHis|!n zV-?P=@~RASGIEVA&2|e#JHUtE^q=zME^ywXqQQQQfPM16*|DQcY%7Q|X5|1+dLrB0_JeAvixU-{Gs2+{W zreg_zZO=}s>-5aPR00Qr#BzkPPa#FT#%>#E$|8EGmM0|xYBG)$?4(l zS3<%o$fz?-2zBk&)~grT_jPG_U81N|CU}T4_PPO@CTF$?eeF*kzq5ai2+TNe#(8wz zTP)|(PX^ek1(p0$9(^3?GgeJ2ou=iYHod6vRn;s`FmEN)Wz6byIT@nY)zyU;qQcC7 zg8{2>^W}9N0}li)5thU{6ox7Fk;l_Ry0Bbg(yj@if(Y3+r9Z+j9uYQWyb*sHdoy%jbW5EJrh^Le6XYy|O??!#wsH&9g_XI@C>rMCt`O zKmW5^XFg0wV>W*viHF_EOkEe}6H_|P*YTdlAMZx6zS-lP3%>$0nVnMSx}MSyz*>zD zg31VvuD&g@L_1PN$inA^+KPdG}U#sX|tGWaPzMwTig7*`HxSukyO+I%~?$5}!dVDCc~6 zn)$w=E$C&YrluGT%~(yVUq1Ofbx~P!dY+>DVj|(PIXF4x$;GrtJ)!17ez8MIy9o;m zlbRlVG?V+ z6BSB%m5RTor;xmj%oDdv;&H<*}9Ghq%T>|8BIS3{az*ovdWDb`fkXcIl_CmqO!OZRu(V^^Y@ zss_?bo^eyylP8t`&NI(RJJ1VuU(m9UYJcB_YkII8JsKp6{L=i0PKmC1E8ye*Jt;^*2juf1{HLz5m5%|Vfg4RBc=B5M2@0dS=46TwwgKF|V53b2RS% z*1$~8(OLY7Oall;{Sce`RKcl1m$Ff;cAc7@O%A5CGXtgkO0VJ8=VPW~r{{`ZN^7d0 zTPWfjHDzQqeG)v1Ka&rW%TF#LpNm3LSYTS%wJHmK5}g?mjF)gS!sXk4B`=v3RlXsd zx6FWC6_ZQ7A<~QC3g2G-#2zzU@$M`tH7O~bF%%MqbuBVeUh3zUes5r&W3hyjvqAg> z>N<>TlRdI^Z=7pvB)f+cw_YA8czxFACL5nZZ}e}<&sfE=I)=AUnyf~mCy-sikYw@l zoMtKg!-M~C8P?br!PvKv#sVp(wY;L5k`uHIN7RT4Q_Ne6%0QAIgf zxkK6OzuWId2tleo*;oCnG;xYrH6yEMtM#c7F)j_M(t)Z_JpTJ1F^OwMwDHlgCm0gCeq+T>9m{}D!s45j zgot0mX8S#P3B5r%7-(oR^EPW;;WlHNUap0|F|x>SbaeYu2tPGE+& z#>YRqzu*$woX!Q?EVf`^P@tiqrGGpOhw$?80>2x{F$2zBW>frOWTH~LW!#$7Dg6=+ z@)L)HEjzx>dNzcPyF=-AD7=7~VG~PBA(-ER&&U`Mc@-6940QqmlC+HU4X`fL>S%d38w_l2a1OTK;69mW;l5yUQ;#TSn93VVgE(Wo>otM-q>s@bFS- z0hf9WXti0KjizIs6_4Fg@>l$|+qh)LfrY{&YG?l3v$VW)flny^_Y6s5JYpn=gMEUQ z^KW~M{tUV%#^(L(yIM0#dNXDs+l;ohwpwBsPl{gmXHuEurpiroWhlX@r$bV-=}v;u z4i+(#vAM_vVsq$oOXS{+W7@cpTjRh8HDJW#D^5`|#E?v@q~Pq#(z<2`yuy~ED>r~2 zpBVKz!df296>?@(q=S*q1Y}8-eY8sLY$NIqqVJW=u*(f-8QWKZ;IgjPmWjGlp zQr|vEF{LGvP8D+q>n6F+&>evf7PlT;2Bo*q({vnDIBDr=wX;au^Q#~VS=k~i1yV3x zLE**jgogSwFZ4Yg55x=<;YP^8Z`7kl(?os-8V#_q<~tVncsYVHPj_o^33>wq6sF|h;+S7946L=K9NRpq&CJYLv-5bA zxnYj)SU=|~!ajV)0Bu+;Z!|g+JtvKYf}igSzPawSf{PmDgoO)ET{zB+%2q`7I7+De z{N5UK1bFNALONb@sO;+=!1{7}dL|8#xBS~`zmKEF+!3RFNHi_H=c-_m+~HKpRV7uK4}u`aYDZy}i$9?s-CuPrGhf3#3cN)Jnp z0OX4YE$4!_0$!dAs$(`UBR0PH`uMCOgN&QNO6&u$_>XqbI7c`zw(O9@lM~AEXN$m% zZd3E_NL*}eQK`eMTr;rm+4Sm9S5%jP#iZbz1#B?a-lU1o#RBUgB$>jJ^>x76WN@pVq7^ ztsSUYQE^Tj_>p?I{DYjJoq0%)bV1I=!B$c~gqS{M50&y!xT-Y7y_WYt)N9&Z*wyA> zlT2`<)=Gl_?L4|te$S_SckNqE2CPCfVR7rvNhvAWRIZE{4cip;jwh+)W7Xa6O{1d`TbUTH{_zu2iLYF{@;iHXHJXXTib2 zX=q4+L=5pJfKl$ZF=+h*I9O<9|uQo3vxMW@vKAo z(Q7UTWgah>C9yQCXUgHwF{xQd6H|25Cx!e1;4_*nq{UQPHsOVXt>Eq8;W%AfT=%DP zMFzRJr*l(M>}-vJ7xUh3mw(66v;QQN`jY()E7fX;mf&{~$m}DS5wyaSj0kY+i!LAw zSMy1>vvAJRCLOnjz$Mp0q7aS%6A%^U?>^L|Jw7#+Qf-36AItcEvGvwrQGH+dD2jlB zfJ(P?Np}lK*TB#z-5^~_jm8}-1+M~b7s!oXP>>- zUh7@&dXEq;dHr*m41?noHCyb#r?g7W1nFTS-s)D@!||@Ogcr|+HJ@Fn(;6KD3W-GQ zMr|kL)Vq@<2RF+xrA#?lS!+joOx_3~S4g&VSz5vwpTB?rIIX!^C(c48UC5Jo^-1yl zYD!W{gR*@+-OQ?F$fAx|rJ(gxT(L5~komq}BRY*hU;l7fc^PA<8nW;aJqJg|1d*7H z|LMwyIaX!_EBF8_&gWV0S+dlToS~Phj9PMI=nvYCyYoddwZruBWnqy_4Mom3DL;*j z$FrqdM)pmqpPnh!en5#S$BvCl6Z5VtnA4cENCn>A2M5=J=QzF8JqNtQW#f#KnTJJg z<&%VcM(oe)$xc=qztpoLuNM!4N>R(bA48GX5X7(u>v!Mr%o!NcdoC1Xn+Hb+5}Yap zE7-wnbsGBxD+uI~zKH8NLvEDXZo^y`R@I4`!&OR_CgH-hsiW9mN4nC;PJsb$lhzJ!z@+`{AMJN#E}QIML5& zhQG^Yu*ROp4qk6Fsf?sjk1{jIEpAa!@u#P^xbF*iw{JNM;43>-QAsGy4kmrDi}W&2~&!`x6v6J`kIf@^ReXLVYhi zZ`n0;$PbuT3itQhlUd`s$Ox;w_aY_Jw^Xp!zD#jU8dZzcJ>ezBaP2+i6B}sUlinn5 z+`=FswWob4+ioI*I8EX{Ju{i%@z`1|rPw~F1!RbXPJ1(XN~!mGln+Q31?d4ugpXd& zn(r>MW7;Y!Lz;7%TQfGYeXi@c<>cf<$vYCwq=;nL*uZ@%p#jMExMoIHxj8v8v9VX8 zTdSX$JgV)g#9<@apDnk}uA78Kk$QEr^*&YKAMSv9f5(Zan{i`(I5;@aZHAMT!ae(^5kBW8 zDGtqZ6ulw9#}~iz*;6Y=@_KEM5RTmN?D3i4vK#d=t!Up6Z39`xeKAJxc_I7b#uzwx zE1(LeCyZpOP>Ouh$Ilu5)H20Hde2wj*RZ5*ys(@9sdWC&?q6fNoVcD}0hkdvJZ{uz zkLw5QWOyCG8qa64jnB~17Qk)7Roim~LGkgb($dQ?^+uc0!rtx7woH*NdEe&;R%!G+ zV0DMJMKNbMJ=>K?5_sd8EYSDd0)Ryqr8ueC?+IX=_9WD%Jk}D}tXD)%iz1?iO6mT~0f9R-Uv$%_dHpmx3s_(R7&y z{`N^oSHw!73-epf3KnBM1p>I$r*9#h;qz04cRDJ&HuHT4tI0C2D*9;c#{xgteb-6; zg-yg`LD+@D#hvP%VZRY%ltG*Ou6}NgM;Wt#jE143wP2ezuD3r5H6}rIV@v!+*LWKl zhE6i*LjV(HJtZ=hr*-P!tfL?FVBxr904^$uQ%&@paiP@HcJKFgln}n$Ie+zNIV0Fh zcDK2t=sFR6O-Xl|vXt+Wt#4o(m{-e%rv~Kj7zo3FRMQ4HveMvlJ~iuj@WYX{&GQGc zn$qi|=9fHSA7wsU(PndDk;D~#p?_1u5kj$JZE2qNvf33Q*Af-*jcHU8sKX=N*V|cc zsq{}Y(!9y92?TOs(N!pf5!|i0qDp>L650)o^^%MT23l5|lJtQ;-v)2kr!?)7MqBxp zYDUjIfwA71OP|v2U&p%NbJ6s1vFpdYT6<-X%cD@$1V=$k6!p?~~S*s+_BzNGC_4C`CE*MRo|xr%6Zw69iN7iUj%Dw&>; zAtlXH{$xH;b}|JS|tglMyyk0$^{6ND?uPj}Yx90D5OwfKYpIQ1Zk{_g)TF2AHf#0SkTJadW)fA^6}SAtn|O=+DE=<9M*VIo>rO z7NK72MZ^mmsTpp|zF7PrR>ga(cc&9eY|o zGi8E0L6KhX_9*hM$RA|`uf3SER9Ma~h+^enIG$XD4U3tJa@0h3t0yT@H^z9rW}= zWW*!zgrktPF#Nmm1ubynx;INmH$qhv2bO(rKD6@Q*${RY&c!MynV1)T9N~}ioI9(sb5=ik+-dt_F1hq zzWd#wn;M%a7LS*j&a7-P8HI#DkFuC5(dBmueg=1~8eG-MLD1Nnu3EZxe7?oE(7%gI=R|BtZmK#v_KV`rv_IiQ`bg28znxM!V;qY|8PKsLTIaKj&JWS)ZsWqApuK&=i5b3$-#8if8hS2mwWFT%@kBhk1$uVSra zcY5KJtd^B?j^iRgbMd)9A~zx;v6N3Kc~iNNE;=C&a_jshPcC9Zg*nQEOuOEK3d(|2 zUMy*2A|9_p8G2i)V;-T|(0)kXy3l-XwN|YOr>qu$!fi2KEW9a2C)anCJ28CjAZ%J{ zTo4tfh-d$hj0)tOo;**UyGtAA9;CQj-%2J^<*{|})$9}U8c42Fg^!OZ^FaFm#VF={At(c)X+(|`Q7igy;Yg=zMjNLD9mXYRt~2LDg;0g zLcIj+&U5b{Bv3S(#(BKXDFVhPyc5Oi(c{$0b(*~%`oqb3vL!`sEMj3J=`$sIwV6JC z(mUtG-l;+AYUa&HAMo<+(=k)Mx9ze_J+8eP`!988%$lI)L)=J72p#346jG z`6cF8u^qNHG_JS~Wfd`1m*P>iitbm6WRQ|y2FRTbeeAtZAWT+}M??N%M+3wMggp>sHS}hmKq6{TI zXkECdsyb_G?gEGet~n2+BRQP?K`7x-SVBZ!U*E&!z|=3W9VSnCjLncT5oScWo4}-N zZf=Q=$C9W7@8sl!?=uYteocHtX>HwfHz|p^C@Qk{2*`-d8iF*_C#Z)(&U4LbwXN6>a$2kPY&ZZtKw>YW z;Frhw@yWtHXVaghXeP7#(|NsjtOJKh=aT{kMhs`!l6I=9j8Q5*PxW=#&6Lbch^+E6 zxJSK0iuly;#kM~N1oK`9pC-gIhSDW6eM~FREivEBPg^W(l#-}jPbo)&yfnt4V#)$N zasB)}fjlQ;6%-uqYmIgGX(ya#gJ6Adkn~g0^#8Dc{&(KH@wQ=XJc6ah?(w<43cNmU zB<;GfiW~OQ$s;s-#n^UHuWI5xM6WB2gJr(BBz`>(;D=`uU`)WkBUA(N{eY?wojEA@ zG9Nux(j=`N=AT(DLGlnwT)+=N_=Hoy``Y?dv_}pEU+H~wcxX)vg;jQ3YJ7AQX??Vq zy(b#jo;G-g9OgX36%P#pROQaPS0duJr+M^Z*&{zEDjjqi&!`tYco>I&AdA`{$B#zU z5>;xXjWRSae@~!jlnc(DCxI&tAZO(;%A_d#LHPzbc7PO9eALZ}H%B)+<8?BA8g@kF zi0KC)%^EfsHu+Vnk!I|7T*QW4@TdN(Q3eO-th;-Iqr0B-5AaYm9l}SUp_?RzCOmxn z`ao$k6b+)D^R2+D(+AB1)}3vM6FKKJVH%+1KqTuuY1RwWroPdI8<8$}IG;)bbK7yxNf!|YFCWwG zowQoPGk=I3Xve*CzpMdqejj|qa9L`8ym> zu#OIV>FhUu|Lyi-ezW6AiThbOHN8;J+x_Xgo|$EQExZ?Q0hYVSLkD4Gg5uQFu`SJ5 zx9@3=-dLO>X!6e^nL;e8a;`}OvWkcqvi5g^OS$d^L=us^2fNLV!y>G>JTXQN>;2-n zGn6*fnwc~Ny$eK;#QB6fm88*!0U8*hJpT;*h6#P)R zEAtY>^9vpt{c>|KHDpNgR2!6x?dIc*LaturOVM5xxTM)ODBjm6n6dPOLNLMh2%gx+ zjc>6l=P=n|*_**P`=|=K`IuljNiMk61)Sd`^(QkqyZn9O^erL{!rNg^N+QJ{Rwd;n zija;5qt-7UneTn(I6^liBdL9?IOhvBCFwZl&gxU&n z^-YC-v|-$2Clu5w$;M}hM$K6SMG+-=@jxkEPM^grW=|PPl@X02MUb~|{9!y^8ii*e z?slbtI=I5vEjXn3Tc|8|%}%nVXHVz#q=ecs4K(~YC_NJq36evzl*sOsom8Jx5R`i` zQan}MMzPP0p{GFU2NP*&alws80QQ%lxO0 z&WwsT{jLyHDR7OMCwxE03&LYL2YY9B4z{7bKGb_$+;`e*yBN>m;6CpBEH!72zH>HuxI_;zjI=cTj%p8xh)8HI6gpXyd+e`os-#*zC#t0X=w+m zT$uHbA`;>P`cdFE@t&gr0|)1mZNBpgRqlcn$Y5>JuyVb{+cDdHDe{nW>KR8p$z06| ztg6o~uK@@aw_1Kv)J&%v$ zyo-d%r8>$C?BrK_zJJgBa-&%rd!0CkN8L@?BM~phXBY6s>~yxD=sb~pI7+84I>}d+ z8m?cc?4wo;Kn4T4C1PxBMBPboc8zc1EH29kz7`|gDM|w92Nv4ZVfT#R*Iuz-C*SAR zv6j)3iXwQR1&IdBu3gB{d}XO-QJz^9N9>Zu&M(~a5xZ?@{gCXnyPbC%zNlGae!qIi zc9Za^&P&Zs(cU|oX*p6eq{ZR-1(u|qic=2S6_znDqxx;}W#D+Y?j~C{NY%?;!~&wM zlx(C+2!MA0;qsB@4m1NY4bq3p2&r{Q|@P2($opUzIMHJhP^ALoX+5W$ts7o8*KPald zFY14rgh>!J;<>m^hQUB2=ZFf$IwS?&OuF%{)wR^Ovo2QKTtB@>t-zjdlXV;<&O}d6 z-%Fo8xRASg!fr9;G&Kq;UsLVsp0-~K(dqBl*w_fXl}K8^Pg2MGgqW~tJtIRQ;okS! z;{h$GLtl$}ifs~z+XsgS<0**7Jt~dXor~d$5ug3B7H}VFyCkS6d!)+LD~gQd@sPBH zKkCY=H`V(|Stun#8quR=lsolu@_l+irW=tq&LdJbBFS-!8*t*Y|*v5viwd8R+| zhQTvqGtn2yU>K$@F=GtnU|-+V_)RV8>n!Yy0Tp`tA579-y0OT?Rb5+`-Gpcb*M@O6 zx_JaZww{lLGa#PrSQOW@uJ2XRF1|Loj3?Mq)PW!e(Yo03cfDWbiU0DQtf9fLC_7o?N2kHi8C05Kh4Ii)hn)PvE&xoSDG-}r}|56(1v3fMY5 zEi>(K=9n!gCvi_$>%w%xpH#0lCtdJ77+(syN@t_Q!Fp$EM9S*IjE4U0vD@-vZ>?g# z;`*f32AM~2Nm)0JMW&OIkL@!FBa7a@t$v&vo5bEu*-^|&GeGO3M1O5)mftf4SR5(M zX{bGCC~}1Howp*tZ(ve&R#Z~&2ss5M%fW&bLwlQSWDmH&>f2X8?N?j$KaxfO-mbtF zEZxfGo8HC=!_3$_q_$e0KSb=m?PTtQ?6_z-14@QDDp*$S>vw4Jiu!gC$9u`y1Y}k| zQIm3R(obro+O#e>Wg0U-_&;4=mB|7> z0OaX**S=Dt2_@FwWbZT`OMzj6-7#KYcrqdL;bL{-oPHn-6LJrXQz?DZ;zRuuOAQJa z3Ar!zezvORPfhOk}EFlf4nrhUU5hMqXWPRe$t7*+fl2UFHF z#kap$@>Qd|pZPtI8Irxjh4YCP{kNEoIgCtNiufAe$7wTp< zrsm?hT1_5cXm zC5`%%xwZCB7Bc{F;kB6&=HFYk%w%n9H7$%UGqI5$-V0i`C3f?!a^a-?R@Q>8&>ISv zZUChhAdD&^{d;S0dI$=czt+Cc?1Q?f=&b2eBoKS@DNUK-;8uvWvjOh_4(|BED8FPQ z4UD_fMGI_we|)@@yuT|F4h}Pb)r)D~EwSd*)N{sHGhwwJGGQ(wyIR0PY&);r&ILgZ58S^ z7Q%siGg1G#2yneYzD2q@&Kz~S+6+4Sz{KJvM1zMrM*VM$;cnjG?eq#^y>xpG*T(fa zp%CcFNAuZw%~3-i51Q_Fb=;Ds2&`=^#yvFjFnO6inql?46r4Zb1LUwh|-c!7}3R(^XnWRaIlpk>DT`++<);#6PzO_g+Zb$tHpucy0;6J=A0&{3 z1aO&TqrEhLe+CCv$p7M>iGYL4JpFGNfZ^%?UytG7=*quxvfk=6HUPA!YA5LD%=YVT z0(ZxwDJ`{hmVZ|P9ezQWPnJbs^D@cs>R7-_!D9wReS7U_F_h@T1meL>^>1qbWjAsooF`g zr2BI~wXaRdm52NVy-OVz#ZdnPko;p-4Z#1uhV##;{2A4JGM=l?3_zwbp&JYk9R7T0 zBtZWbF>w6JTGz6Ub=!Ub8(OJm-cbGwm_FwA$Olz!XjEev6_irb2I)59y z+k8?2kIS&To0v==SdJtzt%u6r?{v7F*h#&<#|i3S;pCj2ocyq(ZoL5IWaCirDzeX$ zUTSb&vzIwr$~B)Z(F#(uv$5gegWC4Q65aX$bvwWZ2+zL6$~xD$8nxkXXLCt>C6jM_?Xn8Fgn7$(gdjd~*zurokJHL4e#ljrB+;$r1jy>z^aXZz**c5p_F zK2?bzKxj)VyP&}3>heNg6e+>%g9K7gwWX?jD!2SiUIfts(}PDvAYwW9L`7|F3AizS zf2XOwDhQRJy|C`t!|h|sv08rEYhw1*`?;7?%U6H<*G~!krHJo+&!(YOU}U=Ano5nn zbhP4rv;I|4Rzv2S!lPHa(49Pk$)oq>QQhj^!%_8$9ZRqE`cB4j zs1+3zD_TnBvG*1a%LDv z+s@c7YG01nSE#c_VGpH*8h&nRbGi2t-1mvBpGa`BP4uYA~nisd`^k1ZqXpH z>-F(icuEa(UR-iAuX(?tJ70-fX(kUbFU0>}ly&+tp)eLP51sh%ai1gr#W^D01UnGP zMJGGq(wYypZDp))EIZZ~cZM#og786C!1~vCu7GUi+pMg9U-?3~+^0R~VFI=ySRXkT@rpOS&|7JCUPo)C`s4?u z(4Ok2SkF{mdxyhz#nyYC!!EOx(Wo=TBzMqXebHoPw&72VX&RP3=`g?DIy8uyA>h?&vJkm1!}B{8?=0};i|B65 zmM8P=L|>F{xjQae*OSSP_IZEl{YjlhuegY%Tq@Wz}?cmdHz2~N&8Smd(!Dd`=vH|FW`DIyU<>l+UTl;H=YNdfW6-9z+ zP}71BOe?-sRb5eQ73bWp$_3G!O`5s>*Bg2!rM62I!Z6~Yno^-(kd7D6A1BS(;QhYZ zEH*i9P1+$dr3-qB3yXhp_0Pz7x()`@w1aT-)JBL6DqOdJMzK^>#6k#p95Xemi^HJi zgQ^UzTBkGPkMIK;^Fw}8k+rAVG$9;T>7kX%w(*mR|u^Q z+~i1{I%m;?bIS|4s5T9__&=RB8g!~ff4 z_+A3@;O<5g3t;jW2;9}qLvOcZHQ*6M1Q%kyqH`|2zYT1_6n}y62{-B6tl*;{snzec z%4#klhkMQiYirAHXUI89XmCgdw^fuC^Nn)$`)TJbtDwB_olt7xFlc|@5WPYqQCcZKNlNb0h6}pT1cU!Iecm^4krDQ zN(TMqRnuG+sySC}oP%6UJUmI`sJq9fr^9`HEG(SahxHDyktg%RF>)jW!}SP4fg0x} z#2dw8<+6=~bWaK%>8gL2QFuR71>)Yo z9~-|#A}cB?*l!!EORgb(Go*}+x|}{gNW+R%C~ae?x>`;y2srx!rKF^?9Q~rY8376w zWix6>P>^X3)zIeM%NOk`^iOv7j)?-M#Qy?_&9~1ZDx=aETHH?*_s~$wQoTouJq36z zlnK8 z)|VE!LCfL1-10=Mww^1~ZRwa0DSPyIIwwJzDW;~KW4tru0{?^{<#XlPX5Q^Zp8y51 zT#Q0D9>0bKsIe>P*VytX3IK4`4v)W>EeCmHq2@Caypo#Q)&1&JvndG}BWA55NFG<{ zvM;9K@bJjU4*>y*%VO3C(eMm`k58+{TT+rnU^tOyuYbyN-_a~Czo3AAP+niaG_*=+ zNTBw5g4DdoJOI7CprF?3CM3Z7L$O}@a<&lmBfs}@CTWNH=Pb}{X=AR%JL?^Me13Nv z=uo*XP@uLuT48CRG@h=rFt?|AY7!gImDBc7>Yb5^$?b{Zdna})kPton-c4vi7{$>W z`XAlzvc@*au|iy@OCJV)EqhIF+W}j$@n81}fcgjsjn}tZ=%;H;z^3SvQxk#?``8O? z3>@pdE%fzD9<^x>MFu4$1(XDNCe{fqwvahzE(61NjA_k!traEhMx_UXxM&V{w+_45 zrlB~)OPw`EqzXov7=*Y3 z8=u_Vmn4joYn~|7sHeItV481HIy`jCMM*;KZ^paB35HTxO2y7hti1Jvgy?P*GC1?( z4>X5TxEftx-O*j%G_t9PKWl36`CZ>@9gyjDCCS?blCVIwmlnA2C(DmuM;VEUy;Lq- zHjDQ5j;ZW+kT|+HoQIaCmIf$H$ldLy@t{vPYF#BIs>S_xq*4gH6)|^2=e*kGKszD+-&>mP^C7-c{nS(40T- z?!@!-PONKcfhL8~m7yuVtuRFV(A$r#wUF4q^37jeGi5N5&!{WIqkh+7$2@82uG(s` zDZf3;j1lEAy>9n4Po)iF{DP(<~ zvO*oQe;o{L`xeLnmCuIL8b2Fa%bf@>)L7r&-=h-=vSxYI*X?R$kV7ff-f&`oRaljU( z2$oa@8yu9Ch`<#zKJE1P_pd+my1cy1dZbq?{o})0sxc~Q+h6yNIa@E#jnHs&8{K!( zwlZBiJ+&;2jg0|LEVtb$CV0BRWzRrgp9Rv1JAzK~UpUtKf1}AWmBq%3)89#V-erk^ zU;r&P%*+BA8J|^=O`~CY2A*&L)!i3=R%L^i;rLHdfZKkdR@O1`1IvtrT}9P&*_& zTAq4k?FP~k5rMY(_Ef-}jhU4-JN*=;ysXT|$_Vo<9Ia>*wVadkf4$8O50NPfv1fC^ArsQ-84kFr8$i0+0I{V;G>w2&$`T8=EFW0!oPpUQw^oy;>WG#Tm2~=?Uyg% zWI!Ql8|}>mDj5dV^i6Fok3Nq`rbGburJcEfaI+Zfzs=3Cgr~hFAs;Is`-lwxgK%vnz=d^%_3r=Vk z3kyqM-_!ER{CI!1$B2!i(arFKz|hz9adrp1tp~nHtr^?;Dd#GepE*?)WKqjCLwr_N z)*Bh)?OaxiATP$~qKohH2TLB2F2wMN=)FTjZYTT3K*1gUzzS2Q#L*%4*4Ftl`higF z_wU?R8>3JtyC!Gk6*10;j>S@$%BFN2D=VAx(X5Ou03Z6;mnK_IwfVFya2fvFOQ9hTwPaaxSTrN-P@KBHF zgEw<(mXkl^JpmN6T)W}+*SeokB)I;aoN!IgD|D0sq1{Ycm&56#p7pVaFh#quq-SVmL^F<~_;e0E=b)b<60&bn0O)mVKpke2 z!@?m4{WPbUvcmf}v$J!5$a-_pn*w*|b*_(Oas@XoLwGx53qVohborblMpldrdv#r1 zU3JNHPY*RWFRymP7oHF7kh5C`AP6p-DpBf*M_mAlErrQ1cV;ZFA_UmUI=*ZqRJpV+ zdpI8~K)pgE%FxoJa>VAV999B32+~psWrt*M_|qdIh5@Edxo*pHp`BViznislgXlUtU*1j;nAMKwYGBNvu`qJVbC#o8a#}CdmFfi5 zoI~Z8c(u4Tt9r7S^W^S0gU|`}`w{+Pw?6GZcLMEeS-qd&++V+Xb#WEr=pX1G@+q1x z-=pcuh{8043|d`1N4m3JT5LJ>%M^m9MwKqU#l-z2s)UqgoZSQP-pnnK zi~M@lgMwsk?{2Qg3<2hP9(AQgidG^(E5sADpm7SVsxrT=e=Qp9=XgjAER4zL7XiaQ`kfh>ueeSXk6E%Zba1dgTZbYhWuzrC+B0M+C=#FQ4RZ9m zm{?d`Y$Cs7=bMT|#F%|Zxpot)-LC8WdMdxOG-p^+y~b7gQjPU8Y3!lJz_b5`)wKa> zW1%$6+UYCW7_dGlhV~y&I7I5RXsK=Nm1bfU=)@$s@IM{;2)?C>IXZ^jrMR%;%AL(m5wLSGCX{4l zk)||SwO9~xn3w&kn{r;4u9y+hQcng5rG0WjYP?V08RKV7_4|vBE?19xGd6Ux;U*HE zlT-C>G8riZ7+8ijHu6gi4Gl%KMf=Ztm(z@78C`}#oQ@V(IIPBf0Aq1FyfD!Cr)YmK z%f?)wMH7%T3ZuwR*#BS_X<}g_V%KVfQ|}>kU}K}(DAp)B|BQD34%d7LWj=g=xdJxk zCt*e697MAR)SCZ_DCGl+9;B)aueeJR%ALITmJ7{AopAvgXxpy`mxI}u`1tNvoc|1k z#@)=b8&2-T=o0O&t}&_cAKg0`rbYs`%XI=K?Pk1%(z250=f@w+7G+>e7X-6hKx8AM zWjRx`)DJ(p^P>Wzdw<2lNB%1+o}i?b1Z>Q+FKc--RIOWqIOY5I-t`l*Toobp1STCK zHZM#$W)6;vsZcdXamz)2mSCyiogF-Y&^t6ZnD})}m>Q4Y>iy8>iC@notbfxorzbpC zE`0bWDzRW98U;o!^@J|JH;?OVrf>Y#E#hsz6FbfR7klR)+IjDY40Kz*B>fpeMqawx z;R6rox}=oU)cAOl-2s({*sIOe4so=%F9Sx1g+}`O8=TIDw@-4ASH#4{KmB2{GDb74 zR+ZZKI)4jeH;Rl1!Q(c9YnE;lnP2B_-U-}RgoqBq|gCc%m z_bH#!?6QfF`~QuxU(?Yz);T`f8z?E6i08MmPXkWZ|q@qdf#9XK0=_Tu=e3EO@WT`7t;fWb`mo`4_p07ga#7`rC?sg*NSg1x&J*+J&=6FMjhSCJ3)_T7VzsXDK1FmVVj`;V^^Rx;3xo}%=@A*&w9q1)xgmM z3gi_arSqK$&bGg&;6C28W0_g9VoCYf7G_1I$Cc7X7X12%AiC2X9;y&=)Y|>OpDC?9 zM?1YAyW9T8En|rh<%pWig>9lZ>P zKJWisH50Br?TWR~&Q2lWuL5g@Vdt+oI3gliY@|h4 z!4*Y+eO|0MpxIOgc{%w%p{+9ZL9dyMI3Gv8!N24fmI`A|QBGWZh$C=WW#WTjvjWv$ z3w7du^Ql-0HoElZ_z+ZRBQVUHaDUEH?ev${)t-v{`@!qORb=3dZouN)--MM<2t{oh zHPBEo6W7Wx^1qa`GA@wK1ZG7^9bORc-`>C7*qT59?t-|&gI8XcI;iOVzcdt`&!R{p z@bCVBMM#E9BGJEe7tN7<=p6c=q}XPBrmfq*r$866_;e3k3`DFlE6)9I2`vxw#R?Yb*$ds_Opw9@R0uI&kAY2+W?mfP#SZF{7t!KrnWyQ0qveDf0HKs zJ4rseT_P~auYKVLw2mU?arg~mQ-G|%aNm%aIM8UG@Ev-Dy(!N>Y66IO6Z`as6{z9Y z6zC~?C(ww|!Xmoz}g9Y@%$NBb9Z+a2mwMISU7%lqr(;NqY!r%*|jc@tk0w-@XvEF z(|x`4psF+9%?$UjC$zi-Z48GkdJyiTMKXodMm7EtH=>p@4Pmt2L=SZ8(_C6Sa|- zS2hAziqIl<^XbIpP{_zhOb;M##7j>f`V0<4+Evz)Wm=dJ9ors@d_|8PNjonX7*%?Je3D=kiHy6*@G2$DZAD72JUhVq*1n_(EnaEEbE!!UqqupOnkua`lR(W_?9x>7CpKulAr9A3PPm_Cmh0g7A_%*2> zFK(k~WN*e+o34JcMC2f$W_O&G>}fcYn-n2OhsvUX?Q;9di5~} zP#tjEo=m^&1jGrb^7E-9((YGJeAB*xz}!}yZ|3t0dmC(LyypFCY!>?SDp8s@9=jh7 z4?LW9r?6kXxH^(9rj||R)nCXzV26_k2bkaZ#`NxF0?Ccse0;pTTN@Q%_J(!{is#iJ zAUHM(ArXRzPy?AOpw8kBb-yGpuMg*C1PPDuk+Pm%>ygj0WBNBV_Xr|hRX}blAOMd! zw>7w^Z}ycTV`^h!bn2ovNJ!j0sS}XyU}Ix-;|~Yw6?b=citV^1(1`N_j9@Y)BKqQ1 zPttKZ_?$Lv>nCzUvOsLLv;X^(Ei)_GF2K}fS4pmeP6yuJu))kb5mEO5jkU3)>;ar| zvtz(}a{$v86#?;nRt`zP1+&*_U12W`FFoaOpWDN!6UR)kJJ}c@ezhGIlT&2~V`8(!butMAO7(I8cdH49XBvn zpHBMoN^Z)uHWgBrHJfjp*s3ZI0im?VG$e+1L_%Yc3A-BSdB-%VeR9dNOdsR*BZ zajYnsA>?ra_;oi}zhQeLHcn8Y)9d?`8JmVyPin2iuQkY;=st9~CU7qBC-V;aM@N0O#I($TXe(o6;0l9~%lv~U-}Ycie9d$OL*wt? zzs)S8R=CX>Z@jkQ;Pe&~Y(3W(3Q9|tD!@T)k-j4tt)K5e?^w)F{R2=QzoQyjnl7|> zHg0Sf)$|9xCMwCz%b#0VXoj3br;nr8`85k1wBt&}j^;YRjU=Ar6voQ)*+xlz+VrN2A9-*a_PDxY zf8E^RIUvvGFySkT*#8`j?#(!{JFI3Yu0(ZuVuFK}v(n|~LY*^4xMZFjUA2ovnw*YSI(*rhT^)PArt14@8=)hU1lmemMeNjQuDMUyev+WClu8 zY7|LkcBgD~TQ@I$H7dr4%O!K>+w{|JGfZe!LMws#r`~>V)vEQHy-`(QNqD0YM^3ke zHuiZ$(*o=)6_3@GyDwgsT6a@x*H8(#w=4>ogkL(|iNs$vkx^Kcn@ zy+PP<7`={mPx|U5)un!|{dp!!9ZynbPR8pQqjrC`{-FFpuN&!sIg& z3?A zRQz?8ibPcoy5pnm+3CXzbL=cq{n$ee%Q2|bS$6`H_Rd6k!hN?!NsU$u2`^mRj8c|D zJJ`x@cf%YI?*gRH^jh8JJT;+aUiY)X)7F|g^{EMyfC!n=_Q&AX_PT@l8XnKvAFUZe z#@j6|UeJW|i-D3Am!oA*cu`S6z+aa|QTdFex1s0fzcDB{Dq^Cex6|@-b3ud( z5*p`pDK2lMEl$(STaFHg_P9K6&-*)7lHfp(aSPIfW|~FJQGlG=XxtHis^MbM7ClG? zh}WQ}1r=bthnAPFsrn%=Pg3*J1%~WR3R9|!M+biby(UfhTF`^Uhtx>RMn&C8J*r`Y zKLbwo937q=m1w)~%bHj)^Ef%F`1~+J%Fa)$7ln%@P0Xy0{9`SKjfmm++q*m6 zpJY@4>0H7*f=S^4DFI_qx)I6l6(*l$e5^@8HrY(4Vttoj8|fN}yPkXO7RF2%<>=WT z`Z6-p(U14*b3Xv5PEHotycp5776uzG)B>u^SW;S}xhj(d-bZ0!vM4e#ys!>tUt}Ow z?mTOzzROA#pyZ)+I-8f1<^?3(-mN}G(I&Q2d!3Jtl`S>Cd~q*Jr$;G`o$p`MJjwd1N8aD#IdbQ;w>-2ku&^SODHTKI?Ch*ktn5V@E(B~fghWI;Q-pSCT`wkK zK<12y&-sf}X?#q|fa*#ixPbEj6hSD+>p1&nURZMXP{ls$j6?$v6RrZIac@gz$}i31 zFli&Bp_xw>>W3$D&hL1K1%JzC@duv8v^x8Adi_tQ4JU*#HOAO|2_lH@)EsHvoh~K8g^}r7Y5EoGzKMwV3_^#G*bHB5jJewzed^ z>vBjh_9@diEL0WbrA-DxBIF|!h^3r2i!NO#bT8ea)6TxJ&3#?^>k~#=LiOel6`FME%GxCgzifUhdKX)59 zKt8ObsAw#Gp*oO0j$c%?19NMjMRSxd8+;oZyg%R4XdT3<#c6eMyDFA9p~j>;)&yYv zpWp#eMa8-|I0O;}hk)e5JB)Xj*nw1xmiA3f3)5j3a_w`E^_1>C2IJVjbq5+2>g* zs2*e+!q8B>9@En0(*>p0h$`AeIu4C5t}I1YGygcC}K~fSTsc&Q2)Qah?JIxoDrnqobn%y)-kA97BoQ zk0`eZws_%{WMN#;Qgi1+^2oloWC<4+k zgtT;n)F6%W1(c4VJBN_&Mv(6A?i{*?xC{OLUiY4R&L8KG``5YipWB&X?>%d;wVvns zeBRF@qA{xT%z1x-@>;Q-qLEo2nZWO)!#S?xqH z$ex#wF{u4C#)ygut+F(miDPn3qCf4yFcnxyeGn|x>u+KazW_$ z;XyK(E7O1n`4B51Dz3s6nRJ7SRHBUN`>Ie=Y>%`)rA}24G13N_WyAL)U|(nomo~|5 zmwPU1R1G}o7-sSGe0;_$F^jB&c=w*~O}l%^c_}P9H^UCJn8xSThWZFX`YixmQa0iK zx9{Koxv&KrMp}gweP=fxRaAsOB)3LNo;9d0%A=ao3Cc)3`Pm0<(0o5G=U^}mx_!74OHl?OSVANq`zy11^ z-9&c2@ob@cof&Mgr8jX}v51JmMKLsz04)>jp*FVzuy+JsY1*w4;ct4w$Fqy67~e3O z1}pyq7Xrj5bQ}^xV?A*QFjbD%C3I=z5r_I|jQ9=Ns_bsP2>`2_nd{qf zQQwb^jV*h3=fzFtbYH^59iWfY?Yu}cQh+SWAU(`oG~#~hDZe(602`CQF;LPl-KMv@ zh9ndA>kO>f0?+U&{<~6;9?gbSMpXp&l{1VRm4AM$K~i=-)8Opdbu7ujSARCk|7x5| zxbF7z@wsASpXQ6keZNyOVlF${#KR>s(;`kO|EmX)+;TpOw6h=2*KHbmL90uyc5Jj!eARr^lSp; zA<(ZS-_-ks1nUIq0YP3NR`%vJ*5Re#Yi@Yx@Au%wMD*czoQ{P*wYOVw%6^wxltN;n zuo>nHS8{4NV$AmW{%(K>hd!|@q;>shwXlQHP|sBMkmCzR;ZQB4N+~Oa2tRlZumO$j z>}(NpYF8)BPxk3xbXQ|=2cSQYs$eN2pEy&wij>**yD?B(11zh;OA}6sDX;9S4Y2~x zSU0tQ81c!5=$Pf-T6ohmuOCfVNMgXRcnK~Z(c2^(ro;5_p1k6js~ftQ@={qt(+3dx zErFnKI>hYN619C;fc1j7ruSCEGIwJP*JcIk)TeP#$?{@*dWsf1nVFhaXb1n{KBecoV3CJ&e3>-KWbevgrRcEV8 zPr?kaNZC=S@t*2*(GP%}n^txyNC@UO^^7=dhEsQ48yFav^v9p6$Ol9f5|jNWrKXsf z;LW^XlwksLr3zsgCWZp8H(CuL3NM}y6jDTYkB*H62Lu>2_}YCb$M}<$qxDm!UddMK zEs%0Vde<_sgOBO`Zf`FHg4a`6`*OZ|@k=)Pu9=>|i^DEkc2e^{$=s{k1nv4F6g`5pl;+L z=~+=pNqyjqMng)C%dIEvj?WKn?%k77rxQaZSs?>}Q$Ap=Hz&lR+`N@&cJSA)wl-fnMo!Lh1YDNi zY3X+hzf)fl59>M-;ppHHQ`k2*w+FvC>gf%b)|x*FAT%ou;NAZ^TU!g=Y<6SJj8D`I zB1S_)!w?j6afu(xcXdO|rSm&MZRV}b^_4pCgzTkJyqaa>1!6r4UdzNTt?u?-&BH2@ zdFg-dGK~B7Y`MI}wQxY!*4H6#`EZybePYj@pDBSC>UUwuZ9Uu7(_=ZDI~uh+Jt?%S zQHlKs%hB_!fG7P{z-h0&sp(+=0c+;rc$yev9H(ZDzKw+j7G#JCic4Fubzn0|1Fv9->Ru@qDjih zHQes&f%`BC2ie$pP8*Mdl9et(pz$-3j+&{4S|QhZ%gx6!gs@LfUx$$9tgclUbVn(+ z_}OUGR@CHKOpoQ~z%53BHuPoF7#7K%R%3(yrV^E?s1;-WbuAQ&L?9+?ZalOtj>DtQ za;!~UoNTHbiA?qctJK9@%kqxTV|&k=*eD5FyrH~;(Oj!kN$uLxeqB!@DF(s;*lYQi zrr_yv`*j0!oT1RJ$DJQ6SO;K)j30}(l0E%PpZ(T9xN%3nE0Ng_J&=%)$eJ(}PvnPc z)#|s-l5j^c>40qEuT#Wu9$|ijv`PQz)|@t1QASPI@n&>?BEQFmLLs@}M3QiC>`_Y~ zk-bTOgXhs&LB8hpXbz;KDOnhxlLy-0FAp`b!{suuFPtPOi2Pa}g?!&XKHM6tMD#x< zD7wZMGTKV7qec;#OnY&@x(#6OL&L)s+?LM?3EM@?{*(()&V?CT9K6MB(Gs&OOUg3# zd{4HwH#W3t?0lr^7@`>Sl&TLa68Wpm%^mK~165G}IzJ!JPpz7f-xEB1G;5>r+-94b zVTy_&$wIO+Qf!>8>ZSS*6E~)-UAcp*>?TWAV6bkrLb+I;!I>V*iBQUsqm3W9B^Rm% z%0I}>UX}=*Q3!l2hgxZ9#QpfuSrf^Cb$k+%%%=i}T6NKxIt!tpL6Hsz4_66`ZEb-> z^X@J)@fIiZTc{4V1+_G{Ja%3Np@H>4kq}a?@ojzRKxja)DMX9eLbf|IwP5 zn1ry~@pl5Vjg+?|rRothjXm+vp`o8aRy!x+HN^Ngwt(YM#yxi=Ilpal%kWX<#gW-T z_UrsuN>uc*Ld~;@&IoaF@ndL@jO=6L^CJ_ufKOmg4As4HOyZs>-@qnu6g{LrfhqB?N5>0ebGmAe=j?F?$;#<$tpiPwY@TZE>7Lbe zR#0+dV{~PucfEUl9H(C}@yTUxd@0BtHGU~JOBZ*bN%n2@*dC(@AOtxMo9QUDb7_sP z-EnwGjc?ls5qowI>Hfj;)@nB$$E4?m!dZd#?fGsc@n~M*WDzAjy%d)&u30=b5aDzM z90R+<%dqS-uX{i`Z8O)9DLHtkRqc^zytuQ1hexW_s8es$9X&lcMbEs_$!=nbq3lb+ zrvHFZlG3KmC=UUmFBoz>M{|03ID#(8q(AAJNt*;Vt_-+3!Q`_wiUjP?p$yPf#^18S za-s=)vQ)E@ak>&hAUey$#6-sLP<6I&&k=577)Z>`Bt*G55JpAVpI|myLY-gs4ejP? zl1@gieQ!2zybv*(-adJ>j?bi+x{!VwN?F=?>v0vs+Tw?Kannv=cF7pWt#$+Bwwk4H zq(MC~ej_4XU0oL-1j+nI z)K-a!i83{HCtqYHb39@AH?wy2GYX3NIx`4`t}d42$u_qQFi)vDQ%(k>hmhkZS$`0p zDb|P1}VcJ<8;+f=wc#Qz&#K zEbDW-g4|qnBhZch`}=o+plg?oq?}}`M4Y9i<%|i>u3`nYMgK%#V56 z0!b&+)JqQ_S?}M!S9q!|E6e!$b^AoecO8t7?>SCm-%oCe>!QQ^xQ0u2t0vL!@~Y^6Yj_V_{`(K{yCaSXJ;MJXtu5D&nuV2%WgIF z%AX745=OK(&v*|-g!-?Y(#vjR?ivY_-KEBT$5;D{2A^J>9PA&<$jOnjeNIuJ-5JcE zZY?!oWPAgYz{Gl-r&4OX?2A>-!I>=Jnw6J6oM~@DY_zvCiG=Q^v9UiSz|-rA&bVeF??o9yBg)bI7Dn<6*OViQSgj|iM)tmb<8b|7%uCK$a%j@ zS#P}3b+XNAF=9GgvO2mw9?%#nmS(88QAAk*g_3Yv1_uV}3-vF<<$;n^_{%~QeI&!} z;jp}=ygx}&*KZV>wmh2%hUikd-NS+-~x?mP_Chlh3&Y z4~&OyU6tl~Upo$2T95t`jLtGB5PV!IEw!-Fb9b$GiP#dFC_?_*hKWb}lFTM7>x>yHwDu_gg^~ch+vE6BSf1&}>)x~-Av!ft%|5Lnb zepJE7UtAaJ19uCjQFV3o@!OFc6^o-9$HVK}oAqQho4KEw)rT{k5qK~Ksn!o9YYOME z$vlIV$_L=V!vFj}%lB@p>y_JmeU_|WPC-xBG1W@L#_^2~-!Td82;a!WnAPZCsfr&z ze()x1e5QSt*bhf}sXFB*{%9=?-d-V^%0kzr1w*nY*N1kMm6a(OMr*(x3MF?T>t1DQ z`h)q$$jHRRtp;Yi>yQ6VwwD!`W`Gz_fRw&G#z6JF*^&B6!+`hCvuC)gu2FjsG%p+f zA3kQG(HUJjw!}oM9k-e~OcJ6be;l~@0YAk>SXbB9qS9vKZT#Ox(96~Qg1J#fMq1Up zWy^peUlX#VyUm-~6-Vc0lrl8P(D@`~B7tkRf$l%v*RGxjlm3-yY9QY!MEj#~MG=Xe zbX`CJ!OAVpfBe_rZv4ls>NV7H9eB#zxatf7l5E<)N{h@esvDQomhl8aaM%3*N);4{ z!Hr+~xx=ho`7Mh%R@%DQ+WqleV3Hc92)-^mln0NTC0R1u)-Zrbyaya{qvDbA`7e6_ z1WNz2v3OPXVL`&(ca$C0q`&_oh**8p4CDu1`t&yZvVYD+feE(s0!!~7P$yx>ceVNc zzt*MvzkR=6cK`HRfOA;MBSpM?dM9fU;r0G}7p{F+{p|GP&zE#Pes$*|rdDczCjO1M zmb$t+h8E0Nz)|{Os7V>bfS&8`NeJPuXDCZ4`71!~cqxSMOX6@EJ%o7?E#_9zbA zDX?3c=voK8?ObAiQsQA~%^uV#Ik^iNncrce(SMmOyBK#(Z zgC{wjANCeC9kT=n4CAe%aG#P+Y95T+DCxg9EbV+IVY!s}xzT_nxUI0B=$ePp)jod* z2Xm$rX+nRY#MdYwy;%sLPyhHbIRMh-y72Yy|Ccj|*>+^T_AUa0N=QOo0tcUE_S0V# zjhNCHk>Az7k(4LkGK_SEOtTfR0{-KrU)A<-Mq6iC!7;T5A8g>0dvqDa{U;C?scxq$ z0}n%r*1`(%XY<1Q=r`R z6Xe)`o_FO}30KK4mcbv#Z>8H%Z=J6E6DxROWGw`uvfd4#C)h(lxBpQfk?P;+eb9^e zTmERlQts>H+_zs%USGQf!lb53Kgfp=3{r;|3*hU#{Qc8IZCNl_(Y-V7&Yn8qB~oSQ zzr*i-H=JG~wI7U_8;U1Zc>hrf?fVnjvtYP`qYba*Sasi)9X$H;1EJ6bzjFz@b)?7e z3+vzqm;Ljz)B)cR7Vn>nLlL5TISevVm_{8!;L6oIaUZP^xBmTUL?mylY-lOu)(Cj- zriyS{Sx)Rvf1@E_-Q)>gDRqxeAL-LS3+@=XlW+ccDHv6~2Rghzum1u6@OKo0 zc z&PS)anrD@Jdq8666HL7^QtVw?8c|*zSy2J~@Zp1k!hZQSx0{<=?6X|$+9)7Vbo|%X zcdix$*|g-KuGW{xr(C#au5U^Dl;~nDh~KIfAt+ERFQRvplU{_bT@tszXm;icx8D!G0yRx>%hLX9ovN2I@FM*Ek>K@k7 zJ}!Tlj%=IlpKlBe${m^3Bf3#V1?kO)fB8w-Gz_n|KPA6dvq+`d(dMs+jd{*+EH5XQ z#N#|Q4DW|YfDGPpTQE77!}o@U4~x`%BMl%b_Q%h2zrKoDDlRJGvEO=528En~nE16! zT$h*mWmmj)Ez~NC8L25MDw^6DQi#}KU8Z{ZGEyRz%kePd$1=b%CU8S%GS1Jx_}s+B z#aXE4n@*J#AJXEb2PU)d($o9j!#|6x)I3~HP^Xf>gzR~49!5^uuhF&JXU<`FpH>os z6+pM@zLhN4d~&s1B2)gEG#Uh z^98-YjJ&*zYuI96ZQjUyW%YYMbtEw<>0o8E6di{Gbni7YH`_9`h>wdYvz%ONJBjb4 zqbpG~h0NF4YA?58O~M_9kaP7&qF5qvU*ED>ViJ;aoAJ}rME*yQ9${ve6jsmL@g&T9 zTsv=sz8y)7h*-Yan*}L`($Z2o{j8v_&d$N!{IyYw@m2OZ4Tx8xwRF$Z)efSzIy%4 z+gmj1x^xNnflG>M;pcj5$3SkW-~^;}0JcC&LFY!av9ol>4j=yN0rD!DAW@q-)G(DL zt@pqxS@~T+U?8!OU6~~^<7gBDmx*KXctce`lVgRHD|swG!5GA+)8NL5YTW zKrSMQTKuq5_l^jeu30Rwr<2nn94%Cb2*1|Y%+*~ZDLj3B{7RVzH;-?wFMDFIQSnvj z2zG=&vqbU|DX8m~qP6d+&xeq6e&Zt-auERSKz~R|T6$idXx17VEsKZaE%!{?+k0I7 z*uCYQ)|>qMI6NgLdWb@+G2c*6H=7dd)5u%{z4pEGnZe_Dqg(7BmUOl^4UhgQoXBMo z5|i_R7m#_o)e5>o@Sp74ZXF}e5W*cFa2h||D0X$~7`Xz z=_c@)KG$s61gN|~Nt*2lIjN@?p8N}Yce=Q-r^m$d&rq1B=~{b^lKuQ{1BjOopeBK3 z9ZoA7wySC(WZm29>Ec)wqA#BGBymQB5l{g)z0QEjyysQ*3b4|TC>H8y^C_8Nym+!7 z%^0Djzp%Jj4Sf4(DPOX8)GFnywyNyU=3H^)ebjRBoUVRLR@90IZ2?yBk77^*8L?e# zZjFg~?xP5-KYO#$99Ghq?+FP_Doh%M>WMb9gb;AulG4&h!sX-GQm4I{bdWc!En)0H z!7ETq_kEWd%7;xZ@N?#0`*-h}M=iLYo8_m03`nt{bR}8Tt_>#&%GEsO!uiq$X>@Eg z9fW>rO5^hKQYL3WCUQE0fkwj^^zaM&5ONQNPFni0i`&tuRYT#>WGg@eY_V{%>LEES z#zrPS4iV5jdPk-rCkfUPa`XU_2p=EMz{Qap$tWuA_sB@<>4P=doA`n^ zCoG)3(+(G)1k&oMXuG$NN_7$ZGOy~Fwg2ViOIKHZD1k##0$r20UkD(FJrt~Q0zcNv z%FUW}{w7x(oQjqaWxMYxTf0S;o_Y5`OM`-?IT|QXE5gQrUeo8InU*ew(`iiJe$B+# zkd1mpwKl3eX!Mu6Uraa&Cv*i^q(oQD2?=%2bY_8?+-`L!a$R1R1qGixa)U-Tj6?DX zliIraJN|r!=0KU*@-J^RrS>ir zi_dxQXu}p3LIEU2!LPE?sR6a)uw-JQPL`XNHYPtv_eq7+2avH8X_DAt;pR3$Ho9DA zg%;~Hdh|j$%w|mIZ%{EsQVX+RJp~{uszg{&*uD=zt?sbk@}FC4z>M!FfR;?4i_w0!q^PON%#L2t$Km z8rkP&sbPZR%rl9#PMayQeF@`vn(KS@$V28I@6)I~Z{9w7%-B>g>q_Jm4%T5>w_(T6 zMJD`nHMQ)mEaofUHOgnQ4f^MSK-N0_d3H`Tv6?<0Doz)@2_Xj))6FhzKOMthi8vL z%T6nE^R3itziT(@NJ_FqGUO@30IYjCnMC9SwreY~+=aK0=qk1Oq?4`jAbH-7xp#}x?#l7O$Cx<7JO5 z-sLta8~rY{s_IKt*`I+XD#mWLwQ_l~O+-YD;nSS5u&`gWuWr8vQ0)17%WHxDDd~^t zsqpM1)mSCqN}X##+h{ms>I%4AD7xx*ZDfJBk2$H)<=~3ik+yNlNd$p%8v;Z}*R7?5 zFbJ^D#)b!jwq-zIiGD_wR(Mb)xlB89zC12gs8a`e4!yZ96O#~A%Te`d%X|Qg8ETmt zMv_iO(N$GE!Etdpu`BQIscF}{^lpvRgWieE$&JK9QbXUlcQZh@7su0)Nnt{!;DDfX znZ-n;>xECMDV4;V8;imDO6wUSUT9UAgZxaolM`rRd0l>W9=7a`ep*~!nwex>ZeC$F z?*eqB7Hav0I>V7^K-oa6T`M|Rm~6t!c+j|GuFm7A-$$B_jm*10M8eJOs#i1IRY^govjXyjkU}kiu7k;vm4hP`F<)wO z2HkyiMssB_sDB!D55?#^hM6{>Q%0~vNbb?8VQ)w9KbHnt}jFw zi-=2U>^qgCR)bq)*xV=mmG4(J;qNlL5E?6F#{utOeidm#aq|V(gNdmrh4xMed{QWL z8oPU|l9)b)(_$Qlh);ibjggQ^Ck7Y9h zps?fd0ne?g=YB;=$;g8d_Ge8HvJO)l-xfg z;Oyj})_IqJWO&3z`S$onDPFI_REg)=y*R>?Rz7dU-rTcAnMyc#L|Xm6ZxGi zXR1=&`WdGy;F*$4rwJ!5J)IFWw1GnaYZSCSKESlu8W4@yWRfmg<@4Ah6 zgZu9m$#~@5Tfrg{*tn{On8+u8hC!r152Mr?Un9th##C(2q#q%fe_;Sdy1q^}o3Qm$?~UOZlz^AZC+%t%zsL`enci@;ZcE*u`{W z;Fo1Gc(wm1G))6}g!eT@9E~h-um4zUSXg;WE{|6=BmRbHvZ5}6=*2By)Wp)#p z?U5W*#_3?I_(@=&-+W)lWi#f`y@mx=YG_v(it?6XQcm**`suFmx~4z19!i%6XwYUp znh&<_iaB=F7*ybCnaPO8?S71n0gSuA7NlB_=IHHxNW6)8>u@>J+{MOmJP*myqtqi% zC9ot&$Wut?ZHH1WI_!Me%KU7uEvJOMPvdx#iuhn zZ@mnE%ga6m(TVh}hD_r-2dS0Hhn_4bMpl4%W@(?=9-K(Kl6GLb{JPwHSZ`rLukog0 zzaz|`?96PiZnAKG zw#}3?mmC}WV~i+ugom_mUYg*?`|zQ0fWR7BOxVd(vh+*7)x>%caynIp+?&a4pSwl} z+@_?2oU1dNt_XJlDs+pO*jUG{ zq2<0=*WIb|!LTH^-J$A;S|q=ZD>(#ZFif0+$63+9C!El^jRx=E3Q_};nC2r^mpkG za&l`&&LtfYhuEjE`-z?dqr*n7N~Z6GODxYK{N&9?b5=E4M(2fJTr_e=$bXj~z`ZuP zEGflBQFx_IM#hIOw@FF%xYj}YK~^52UV;6$WgP8G=Q3>CZVDq^M6)25cg-);1G5= z|4{S3t!OcQuFkO#0v}74kOx+`9GPPK@uaohqXHRW=PgWp9RXpt?}7dt?40h1#mRJ6 zHUA152%9b9>tQouvR3%bn>X`qrZAH@#58jr^}TZ${DLq=&;kvM+-7d)!m|7yrs&!) zlP~F4Uc2$Fq}{v3-Y9i#Cr9AS0TNDE{^i4mXprY-7A8lmF9td~1~N;!L5CM`fbbgq zwB8u|DGlec($LgYUuCOy5Kp`brV#Gr+Sg;6?Q5ZW`P@rsb1L)b zC&jDvf9Gpz`xCi^=k=t@$UN3;IKA%sGfohjgEWezJ4FF#(SpdB_*SF#Q;Up%Sp4;i z;o(E`;!JqvBOd_6XkUztbsqhOP0m*b?d@_x2m+)W3_+bihu77oTH=G(`9N4DApOTb z=gvW-t)6@)k}Z(Q^-P12 zozUd_?v9n#b3&FQESD-nBO?NK3#Jar94By*_Y!LB-tFjHS+K7SD>|)J5WLoxWhT3` zg#gt%I5fuRvGRKw$PQOqOQVnJ$)twzfYr_j4w@Y8vEqsYK#rHvVsyW*p!*ff1t1rU zHoj9nzPVy#U}xar`FNvB$89sS$DI-qQd!tMQ(y09JzK}_I)`%{@H4Azwg`#~){vCE z^ip@^+Eziq2-vIEfUE~SrbzoR3{q92Iy^QeCnv|`W{yR|^@(3VupR&!OB$mG`rlbv zf?7Eo&|xC|){m(DWRIz+Tt~;pan3$|T}nCftA$z)j}t0ZTZ7z*u*aK&-KP1P#(*C| zoE$9KCz~#IvA;83Nv&?kJHG*PDP8ofFE>{YQ5EcFYaO*q&T;shMR{9)OAfCv%PA_P z?G}wRj$(?i&eS=_%TWxyy^l}i5yN{ub+QfMfg2O4*C746F$&VGLawJWda#9sC;nUn zSEolqMhwr*YO9a!83Tk(kDO8jR5?v2l&Rvi<2iq?}=i-$W z&uuNBR*)eQ4%*GSDcLI2?8`1*0suZ zS#Lyz7E&%sO0zazQS*waS_Ss;{`^>@lug(3p+EE_BNzyV71nYKQsvkqbw5ox&(~ik zSH2MK?As-&G*il25i~(2XqOWD6o6Y@_j*9u$5&H(au7%4E#NuU z*|!t$eag%?YU@##PZCgh?j<+IcxgcCSk>rSX}`Yb_WB(%j<8?1%xb!AW=2a*tuh8* zWNR$HH>uz4@R$x&;hmt1gJ#`^lVr_P0xtcLiH!}@EM-__i_)zsJ4);RdU&I1{yE&K zFv-|BYZ|(P7hoTp%%fiKQtpjB8!&sME9`k1PVn&f2-(dnEa*mS#$(f)i!Xhnv9-P4 z-tgWQh0J4TvRsgpF{rPjL@i)vrrhy=k18c8s(SPrwPu7qI(n7uCsBG?k;B-SXf5u@d%kn3Ha|i2kH9?6@NkLYMKW3or4>&FYyh z0pmFY)Ol&qefCs8r3({mb>P;{Z=J zeb@!8AdnSjyK`gr>)ohh#P}JYIYVlmK7Y>RwleW;FIKze?-QC0yY0?m5M38jQi2%v zUa*G8#e{1{6h#-%#`79zynp}utGC}~*=iP+g+z!-9mA6#x#`?1kK~3IK>H~vDRxz} zwH@&6*|Q@nQ&F7;2qekupq=p~90m5yC-0ZyD?Xxfqn0sa#yH@p_Vttasa|{kAEjK7qUDpj7WPf6s@x?WVq#uFCE7%4cUU zX=gVU1!D*-U&6N^Kls7RLgIPMwvN6bCN3Af)$%p0fkJImTYJ7{eKYBEXht=1ac2jzwEZDR@slue9`!hup*zt`2&)AGf=)g8k)jJ4(~K*>KHhNv1StI+l2i z)H@B~wwYscI~OLrbv!+O#CLtT&3t4AD_!qnz!Z7gxi>rQ=t#{iJXLKW|0#534rE5qyrg$3BHiBnyF$1#hJ)pFHkp$zAk0scs0`8EHE!DB{DJ12ncEK#l_37 z3LYl@YdKyKlxI;sG4YYlF!f9G;Gk{C!dK7R6L|5luMZA|pia?#$d08gE1@q&UfC;U z89}&1^m_$-U6bKV_OA@l%)9f2%#Oo3h*s&S+?*WzvQ6WFQm|nI9zl8)JKLg4_!6~M zW!cHlCeM^Z&dfxOiZnf6&FIg!kfW=8y<5VNXLLl&m-o9>Lstr*{FwIettd(sx`W0!^`WzqP3jG2bwyXi=h(zS_jy`tXMt|e! zZgiQ2G-byQg>f(`uh!`^BhnJh5L{j1#z(kt+L^{8dpNe|ZTUxS!9ru&$X7X4wA(u8 z?P*jO<(cTYt9kKc3CXEF4lG9H(7w zgat9)k>5m`3N_08vy6-PibT5=GVOpE`0r>ol{@1J z7QbuciJrew&o8N8zkV(LE^ZmkRi*1|s&_r%`SJ+|NOSIVc^g|>Y`QUki$l`;&}&Jg z=^zt`c->v0oYphn|L7OI?0z>lFRlEblD@q>Iv*6Jp=s-h{MlnzLeG!w=4OXH`H=%SSA;c&+E=X6>ZgM2-wG4Oe@M*ziM` zkP6y)d8Cq(k(xqf<2Zysa;cu58#I8RipOSrB)dM+nGSA>VFtH9+*(R6+jZEtoI}8s zunBPCgULD5_D97woZLXUIfP&oqDbx)KQ$E;` zxaHyZja=K1E+ zZ8qNL+r3`%(Ofo^RWTn1D<#$>sWtG6O_n&u6GzwT&6?BaA*MZ34E&(VJn;Khp})Mb z$%Ldt>2bvMeot{SfDNz1&cq}7Q7}%x?kn1bkC(4&3l30g@$vCS#&@=`Z%LqBB;ax! z!*_YQDQLa30h$|VH`+$r$5wx#1b`K5y>Uqb&Qrf9Ou;UQqvUF+F9w+Oo9+P`zU%GW z@|jQLU}zU2TNDX3Xb+sKJrhw@#?x&A!2QtG8*e|#R6V?$k)P_`zIPIV?64M_nL4s( z&!ifS=F3g@R(B!QN}#&mSGF?mKHfZ9u0c&ms7;obB}5qL+Yxz=7rvq(7AfQcHc09TvPi2>X*$BjUhb*-)s3 z!jp+eSdZ z5qK|q68ZTlDZk$T4%i^TV?&E`dN`Wr;DiJU|s6B<(UN-biU0 z4sXuZuKUVrR#=8z{iB+@GgNKg&hLci?C%&GGj2XFM#m=4+IT+(n47cwPP?FCOoJ=Z zC1`7uPAi3)_sc%Zb%G+P{nbXQj-abd@`b33rDYH?C%}Y)?7!K8X&7L6+S}PB3%MH` zS*dhvxm>RW#cRr5%4Rr8;AZGrRg`0QN%N4Fw@Tkg$@gyz)@y3Ld#A6j-=8!~A>>x} zY4N4_5Hu$R^zC3!EinEwktq`-PNW}w@4i*%Ggy0bN+%)9$j2Aw9@)Q+voVkGQ@1zn zj|H{q-BE^Ur_C|QR4F3Fetr1B4OsK|oOVRoCwO^zUCA@@`GF2ivpv< zXIe;k$0JD2SEM%9-q{&Ou9mMe4R?~aXJ_wX#vp#f2=orL08Q)vj^O%&kgA?T&f`*f zq2HjnG&cZ0JOv|)l(eTW+UNr&W<(Q6xcTrU33@KBBl=aBzTD1v%fXZ+j*Mk-NcnmQm^L^}0@h@c1zl-|hC##f%b9v7 z&(oiXUKv>77=xI^|m(WN(-I?F=;~qv4hUk|}T51H2SNL&FXYVK!DSjK?_e;Pwy- z910;0Uf$LH#dJIp9MXy8_I1TA#g#3)NFBI|wY7LECNfGGi&S>=@b{x-B?!a`F)1P3 zyMrg>ftkR4OE}3922gl+LT>Y+jDw5Egy1n+zdhXEQeo&z;M-f?Mvl#Dd&B@XuxBkm z@o;i({=+Lo`E@rvGn1O+g&?CWZN@m~aK`JW>cENjPB!)G0T3e0ra6}qFvj)9aFv6x zU4nWOJ~S}!vDO%$ESrMoOUyl5CweUsQpB9Af+L=fL3OhMwLN+59b*9X>rV5%^rlVLnM)V@d-CSGw2Wj;tss7)3iqm{?e} z^wA0lef4Oas<6_o41Prb^6ru{QW%&RfOGLk>{ZDsD>pmR_7o?QzWR;U{^Q>5gJsX7 zhZsPj!3`R37=g`n((Xucdh>K@ayN)ZMGO1l`Qa&*GQyrA$pU12hM#-mI01=c z;-~sBh-;N@{X)pWbP0z4H5mJax{ZTFBbNnYM}9*Dq8Pf`K=_4=i@V;NsGVM85wfRU z>(Hl}3o<>!%fCAz{7#z(XG5M7Nuc0lHjttd*%i5=jhL&px{()V3pb9{xaL4e{Mk&2 zj6OhrSgV@X_5r)p{uCj+v9z?ay$xpx%*f|Ac`a_oH1Ip$xVO^g7S|IjrfCL#rJu?t&VtUlhQK6-7WGV-`fhf7yc0eERH* z*CD)lbRlIxZ{}Y~P`d%_=2ftJjm#T6KR++ft>hDUsoy=e3!_tTzU~($z$O)tab_WQ zKc0AW`{sJPE7LwTHTCw5?ypm=8qm67RXT)>_rt+&pcI?bi~#b%0?kIVofyU5I4;LL zZ5uET2HakOdbb1&d#1r&twI3wI|6g$UPo999b1Zm*E6h(%tX%Zc1{b`Bw<(oEa+NK zbp%|Fp^*wyZW?cNPNxfnAs^l@+BP6uK%T@xt&pe4MqX8QZP1{-(rR8((EHoBO>NLR zbO=Ew=zef$RA1w$b5$9Z;ig7-k}P0!sVjXWV0VrpHV*8BhzZ3*)N8G&f~~d_3p(hJ zfB>Y~O(9;ig+Du2s(r! zw%0w+J6N}Pmyzn-QA|Gqf^avt`>#B>G$|6q{ANInR|0!iUP=xd10yXWOU6v`?F%X@ z(Nl-@0>QySR!kA+Ur%FI2Q(?Rw*xl(vO4ZV8@vJYj@m8vQyX~VhX)50H*&nXBWGN= z=;<|X#{G>94e>}w0MPQb8O+q6?Mx=zgeBQ8OH|kd%wRH|tF`1CyTEzh>B0n>p%oPD z{rdwlGCHbO@DW(j*xd~0+|4;TIR1T?dd1A2U;J&3S>ynyW6_Z?4+@<9+i$Xj%1(qQESI1^^;^ zdO84u2YPX+GAXUDbcjmz7Y{p{`9x+V4}fh`=)8qehQHy6t(b&FH+Ky>imt3r zZ2$&JQ#2JGhS*EN3n5bM_K_YK9U~~vr^`E~GSL`p3Z{x(0+~TdK>=t-)GzW-T=Ru% zP^A*aUvPpWr>jsbEsJ>v<$JV7A~MO z?IL?*`|^Q!2+7IDujOEEzLm8VQ!_J8v$6AQejKz0R$aYe>RA_u-GS;v3#@V9AQAxk zZYL}}$az-$hvlhgEl}%liL*ucj8qEuja^4cA~W9b_@s4oq59gwC*4B5dX4f~pr!%< z9-~G}>NxDxx~(mM^?o^}Y6BoFM!x_QQbv-8mw$LXm#49yjF5$e~g%Icpw3kiW#dg!IPsCe&{(5 zD!x)Ffh=b^2lz;>^K}#zddTVCctFb{i&4JQe3H?5=0v%bli_eX z>xiKB&`0{_LEf!p3Aq7h;myepCr2iI$csy`+yu*6f)&x<-cF~{O}n=|H|c}Jc~e-( zJqozHuw$=(`HoEf&-^XUY}dmHI^qI)E+)sB76+&$`SdEFq?a2RhJVH^ZBRDjohc{LdTsIleS6Ju>- z;t*Q5&$ol6ulpy|rQ10h?G){F^TQ0p6L?(GjPv7;UlRmuYTB=lX=|Va6T{;yI5nDq zYAZ>|);BC^!#Kma=MFl_#wH#}E(gEkN@!J|UyXL?tk@7!y2J0z5(^92vsprri^G^(IBXa_9=T_=VEm7m0OSiM}u<|qPMa@~L^ zrLemW91cA$t4ed%;po^zMNZ>F#Pxu#mskT8@Lc=m?cKtB#BEbIqVWA>^q`yYTBHK{v zG&=Ilhn`j_^URdk#wR5eSax!9jFgvg&{=H`RA1+=TKt~W=gTe7X^9N3+eC5y%Vf-2 zG|PET>$H(BFDn}C9}g zf4)>?qOUFatIrJaOciS92OLZ>#HLG3Ol;Am=2P(8Y5xh#dRd|}e+g*fWu2ed+$7h$ z0yq|z!Rk*T`h-jQHybuDZC=OY6XI*pLGjzLBANG_JTOuF*s!(Kjgt?y!cmi2m6es* zUzc-nsgl@&aAA8_fm7|E31t|cj+*H_rujTE(?8HjZ6MHYs)*q} zOP1*C?Ym9Ofqu)djz?AGDrn!7O!Cp-6FamZdO~~Lt1LCv6x(hW-72h5C4dQDwCGQ2 zWpDzvE7tBexgn!qw}zk0E>tCmzRhfmqVyrQ6{}a-CB`)2hQJ0*24hG~*)R-}-b5uN z26Z*4&(OglfEu;swkE?bZz29VS%5G3ryKp>&r)_2r&svtRof}7sit}HYyztfZ z*+9pN6fAV5di$r?c2L9Y=`86hutz~(&c+%zItHf zl8LdiZ&rd9=Hv{J_g2=cN6^&%L zufL3jj;s_iTrixss(+63U~{@WzBWFb_A%&QJXA5`5DP$iq3cV-F(V-M@o2oTouhxY zFQ*BKQR#IZJ#`?N1tf5H5BI{y6A?$dE&)!mmV&y7&?7UpJ~{FpVsI3>Ru{X6)>-S@dnKjPN|R<8_KFGrwW*IzB6m+pb68vwG| z%SqfsSSW_IG5+2hl>CRzY#Q=qoRt-BfW_cclF;^tP8c>r3K7ALV2s@&5V%%ijP#u` z-8)P?qYiYyfIyuoD2!D&ZFtgv)ybwd2P$+w1Ag)5(s1x-FA7?x<*V=BBh@M@D%ACk zY6hnL@Y~NYMFH5Fq|~?MdI@rH~#ok+w07z7hC?I)Q9!wds1=tku}cYN9uBr zra?`QZ8J5mjH=lC`ulqY26mj`@y_mi z2zEDd2Y4}Z0_{-Zl)j*P*wfx9AwAtZ-X(~fspt2iqxvx$bp$F!)#0Bcx>3N2fAX^Z z=`^&nzGTB{H8SqqlTBtVtvP&iPduaFlF2vVA3LE%4#-T&=txqK)rN--XA5f?l?PeI zY|GCb;UIuOAly!Rzc*V%Y}l-4vN~OLRFTqaus1;Pmk8gCmT`LUNwO7kmMv2C`eaCs zOv+0+8Tn)Pyn&oSX+LwCvDGE>xz0lAYv&JL$@xvq@A;I-;$~{-LBRvWxk&FQs}TAV z%yF~8mE>`<4BZa44f^;v3RFSk*QiM+_eDq+7Ct}x04D&BS} z7_bI5#=A!|J8RF0&C3SA>prLw`K{7axwwUHnu)H*eChcXynQr#t3W0r#U%`l&{>E! zzaR9qij>d~598JeX)!7o&HM4c2CL{vr*AnLn{1`yI)@i~~0VNBO7E zx%uo*=&k*W{~!bXf79jq?`@bv>Ea#TT^auvH1*Zpmo3MK1SA9nByLEhyw%)m`4B2i z#*BB}9{g^ku4`j=YJWV{D+~6&?n5TMfB;qPldJas7ysP>xd*pmZ%=WkBmjO0?{{iK Z0;s=Tzby06=MelOV1B{Iw8Z3k*dKceWQza* literal 0 HcmV?d00001 diff --git a/scripts/build_website.py b/scripts/build_website.py new file mode 100644 index 000000000..9a55a073a --- /dev/null +++ b/scripts/build_website.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +"""Overlay the product website on mdBook, using its generated registry exports.""" + +import argparse +import json +from pathlib import Path +import shutil +import xml.etree.ElementTree as ET + + +ROOT = Path(__file__).resolve().parents[1] + + +def build(output, graph_path, schemas_path): + graph = json.loads(graph_path.read_text()) + schemas = json.loads(schemas_path.read_text()) + nodes, edges = graph["nodes"], graph["edges"] + if not nodes or any( + not 0 <= edge[end] < len(nodes) + for edge in edges + for end in ("source", "target") + ): + raise ValueError("The atlas requires nodes and valid edge endpoints") + source = ROOT / "docs/website" + output.mkdir(parents=True, exist_ok=True) + shutil.copytree(source / "assets", output / "assets", dirs_exist_ok=True) + # Preserve the original artwork, adapting only its colors for the dark website. + logo = ET.parse(ROOT / "docs/logo.svg") + palette = { + "#5c6bc0": "#c4dda6", # Sage lettering, nodes, and outline. + "#ced3ec": "#243a28", # Forest polygon fill. + "#7d89cd": "#89a673", # Muted green graph edges. + "#4a569a": "#e8ede5", # Ivory numeral. + "#ffffff": "#101713", # Dark separation around nodes. + } + for element in logo.iter(): + for attribute in ("fill", "stroke"): + color = element.get(attribute) + if color in palette: + element.set(attribute, palette[color]) + ET.register_namespace("", "http://www.w3.org/2000/svg") + logo.write(output / "assets/logo.svg", encoding="unicode") + # Reuse the original logo's polygon as the small browser icon. + logo.getroot().set("viewBox", "0 0 107 107") + logo.getroot().set("width", "107") + logo.getroot().set("height", "107") + logo.write(output / "assets/favicon.svg", encoding="unicode") + # Keep mdBook's original introduction reachable from its sidebar and search. + # mdBook already emits introduction.html alongside its index.html alias. + html = (source / "index.html").read_text() + counts = { + "PROBLEM_COUNT": len({node["name"] for node in nodes}), + "VARIANT_COUNT": len(nodes), + "RULE_COUNT": len(edges), + } + for key, value in counts.items(): + html = html.replace(f"__{key}__", str(value)) + (output / "index.html").write_text(html) + # Some cast rules are covered by shared suites rather than a dedicated file. + # Only publish direct test links when the file actually exists. + site_edges = [] + for edge in edges: + module_path = edge["doc_path"].removesuffix("/index.html") + test_path = f"src/unit_tests/{module_path}.rs" + source_path = ( + "src/models/decision.rs" if module_path.startswith("models/") + else f"src/{module_path}.rs" + ) + if not (ROOT / source_path).is_file(): + raise ValueError(f"Missing reduction implementation: {source_path}") + # Rule modules are private; rustdoc publishes the shared public contracts. + contract = ( + "rules/enum.ReductionMode.html" if edge.get("turing") else + "rules/trait.ReduceTo.html" if edge.get("witness") else + "rules/trait.ReduceToAggregate.html" + ) + site_edges.append({ + **edge, + "source_path": source_path, + "api_path": contract, + "test_path": test_path if (ROOT / test_path).is_file() else None, + }) + # Decision is one generic Rust type, not a struct for every catalog name. + site_nodes = [{ + **node, + "api_path": ( + "models/decision/struct.Decision.html" + if node["name"].startswith("Decision") else node["doc_path"] + ), + } for node in nodes] + payload = json.dumps({**graph, "nodes": site_nodes, + "edges": site_edges, "schemas": schemas}, + ensure_ascii=True) + (output / "assets/atlas-data.js").write_text(f"window.REDUCTIONS = {payload};\n") + print(f"Built website in {output}: {counts['PROBLEM_COUNT']} families, " + f"{len(nodes)} variants, {len(edges)} directed reductions") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--output", type=Path, default=ROOT / "book") + parser.add_argument("--graph", type=Path, + default=ROOT / "docs/src/reductions/reduction_graph.json") + parser.add_argument("--schemas", type=Path, + default=ROOT / "docs/src/reductions/problem_schemas.json") + args = parser.parse_args() + try: + build(args.output, args.graph, args.schemas) + except FileNotFoundError as error: + parser.exit(1, f"{error}\nGenerate atlas data with cargo run --example " + "export_graph and cargo run --example export_schemas first.\n") diff --git a/scripts/test_website.py b/scripts/test_website.py new file mode 100644 index 000000000..5d8e3f567 --- /dev/null +++ b/scripts/test_website.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 +"""Browser checks against a built, served website (see docs/website/README.md).""" + +import os +import unittest +from urllib.parse import urljoin + +from playwright.sync_api import sync_playwright, expect + + +class WebsiteTests(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.playwright = sync_playwright().start() + cls.browser = cls.playwright.chromium.launch( + channel=os.environ.get("WEBSITE_BROWSER_CHANNEL") or None + ) + cls.base = os.environ.get("WEBSITE_BASE_URL", "http://127.0.0.1:3001/") + + @classmethod + def tearDownClass(cls): + cls.browser.close() + cls.playwright.stop() + + def setUp(self): + self.context = self.browser.new_context( + viewport={"width": 1440, "height": 1000}, + reduced_motion="reduce", + permissions=["clipboard-read", "clipboard-write"], + ) + self.page = self.context.new_page() + self.page.set_default_timeout(3000) + self.errors = [] + self.page.on("pageerror", lambda error: self.errors.append(str(error))) + + def tearDown(self): + self.context.close() + self.assertEqual(self.errors, [], "Uncaught browser errors") + + def visit(self, route="home"): + self.page.goto(self.base + "#" + route) + + def test_alias_search_and_reset(self): + self.visit("atlas") + self.page.locator("#atlas-search").fill("MIS") + expect(self.page.locator(".atlas-row")).to_have_count(1) + expect(self.page.locator(".atlas-row h2")).to_have_text("Maximum Independent Set") + self.page.locator('[data-filter="algebraic"]').click() + expect(self.page.locator(".empty-state")).to_be_visible() + self.page.get_by_role("button", name="Reset search and filters").click() + expect(self.page.locator("#atlas-search")).to_have_value("") + self.assertGreater(self.page.locator(".atlas-row").count(), 100) + + def test_search_text_cannot_inject_markup(self): + self.visit("atlas") + self.page.locator("#atlas-search").fill('') + self.page.locator('.wordmark').first.click() + self.page.locator('[data-nav="atlas"]').click() + expect(self.page.locator(".empty-state")).to_be_visible() + self.assertIsNone(self.page.evaluate("window.injected")) + self.assertEqual(self.page.locator("main img").count(), 0) + + def test_keyboard_search_from_home(self): + self.visit() + self.page.keyboard.press("Control+k") + expect(self.page.locator("#atlas-search")).to_be_focused() + self.page.keyboard.type("QUBO") + expect(self.page.locator(".atlas-row")).to_have_count(1) + + def test_variant_changes_connections_and_survives_reload(self): + self.visit("problem/MaximumIndependentSet") + expect(self.page.locator("#variant-select")).to_have_value("graph=SimpleGraph,weight=One") + expect(self.page.locator('.relation-link[href*="MinimumVertexCover"]')).to_have_count(0) + self.page.locator("#variant-select").select_option("graph=SimpleGraph,weight=i32") + expect(self.page.locator('.relation-link[href*="MinimumVertexCover"]')).to_have_count(2) + self.page.reload() + expect(self.page.locator("#variant-select")).to_have_value("graph=SimpleGraph,weight=i32") + + def test_reduction_evidence_and_complement_example(self): + self.visit() + self.page.locator("#featured-result-link").click() + expect(self.page.locator("h1")).to_contain_text("Minimum Vertex Cover") + expect(self.page.locator("#demo-value")).to_have_text("Maximum size: 2") + self.page.get_by_role("button", name="Vertex cover", exact=True).click() + expect(self.page.locator("#demo-value")).to_have_text("Minimum size: 3") + expect(self.page.locator('#demo-graph circle[data-selected="true"]')).to_have_count(3) + self.page.get_by_role("button", name="Independent set", exact=True).click() + expect(self.page.locator('#demo-graph circle[data-selected="true"]')).to_have_count(2) + self.page.get_by_text("Why does complementation preserve optimality?").click() + expect(self.page.locator("details")).to_have_attribute("open", "") + source = self.page.get_by_role("link", name="Inspect source problem") + source.click() + expect(self.page.locator("#variant-select")).to_have_value("graph=SimpleGraph,weight=i32") + + def test_clipboard(self): + self.visit() + self.page.get_by_role("button", name="Copy installation command").click() + expect(self.page.locator(".toast")).to_have_text("Command copied to clipboard") + self.assertEqual(self.page.evaluate("navigator.clipboard.readText()"), + "cargo install problemreductions-cli") + + def test_unknown_record_has_recovery(self): + self.visit("problem/NotARegisteredProblem") + expect(self.page.get_by_text("This connection is not in the atlas.")).to_be_visible() + self.page.locator("main .button").click() + expect(self.page.locator("#atlas-search")).to_be_visible() + + def test_decision_wrapper_links_to_its_public_api(self): + self.visit("problem/DecisionMinimumVertexCover") + api = self.page.get_by_role("link", name="API reference", exact=False) + self.assertTrue(api.get_attribute("href").endswith( + "models/decision/struct.Decision.html" + )) + response = self.page.request.get(urljoin(self.page.url, api.get_attribute("href"))) + self.assertEqual(response.status, 200) + + def test_reduction_links_to_a_published_api_contract(self): + self.visit() + self.page.locator("#featured-result-link").click() + contract = self.page.get_by_role("link", name="API contract", exact=False) + response = self.page.request.get(urljoin(self.page.url, contract.get_attribute("href"))) + self.assertEqual(response.status, 200) + + def test_research_anchor_and_back_navigation(self): + self.visit("atlas") + self.page.locator('[data-nav="research"]').click() + expect(self.page.locator("#research")).to_be_in_viewport() + self.page.go_back() + expect(self.page.locator("#atlas-search")).to_be_visible() + + def test_legacy_documentation_is_reachable(self): + self.visit() + self.page.locator(".docs-nav").click() + self.assertTrue(self.page.url.endswith("/cli.html")) + expect(self.page.get_by_role("heading", name="CLI Tool", exact=True)).to_be_visible() + self.assertNotIn("{{#include", self.page.locator("body").inner_text()) + + +def responsive_check(width): + def test(self): + self.page.set_viewport_size({"width": width, "height": 900}) + for route in ["home", "atlas", "problem/MaximumIndependentSet"]: + with self.subTest(route=route): + self.visit(route) + self.assertFalse(self.page.evaluate( + "document.documentElement.scrollWidth > innerWidth" + ), f"Horizontal overflow at {width}px on {route}") + return test + + +for viewport in [320, 390, 768, 1440]: + setattr(WebsiteTests, f"test_responsive_{viewport}", responsive_check(viewport)) + + +if __name__ == "__main__": + unittest.main(verbosity=2) From 0612a6829d076e01f2356a6f7f8bd83842777052 Mon Sep 17 00:00:00 2001 From: GiggleLiu Date: Mon, 7 Sep 2026 01:28:57 +0800 Subject: [PATCH 2/2] Organize agent documentation and add a real CLI showcase --- book.toml | 6 +- docs/src/SUMMARY.md | 56 +- docs/src/agent-find-problem.md | 29 + docs/src/agent-find-solver.md | 26 + docs/src/agent-pipeline.md | 31 + docs/src/agent-propose.md | 24 + docs/src/api.md | 10 +- docs/src/cli-automation.md | 37 + docs/src/cli-catalog.md | 22 + docs/src/cli-completions.md | 16 + docs/src/cli-create.md | 26 + docs/src/cli-demo.md | 35 + docs/src/cli-examples.md | 42 + docs/src/cli-inspect.md | 31 + docs/src/cli-paths.md | 34 + docs/src/cli-random.md | 13 + docs/src/cli-reduce.md | 31 + docs/src/cli-solve.md | 37 + docs/src/cli-variants.md | 20 + docs/src/cli.md | 446 +--- docs/src/contributing.md | 15 + docs/src/design-paths.md | 32 + docs/src/design-problem.md | 23 + docs/src/design-reductions.md | 36 + docs/src/design-serialization.md | 14 + docs/src/design-variant-registration.md | 66 + docs/src/design-variants.md | 33 + docs/src/design.md | 332 +-- docs/src/getting-started.md | 208 +- docs/src/install.md | 29 + docs/src/introduction.md | 90 +- docs/src/mcp-tools.md | 31 + docs/src/mcp-walkthrough.md | 30 + docs/src/mcp.md | 112 +- docs/src/reduction-graph.md | 35 + docs/src/rust-paths.md | 35 + docs/src/rust-reduction.md | 30 + docs/src/rust-solvers.md | 27 + docs/src/skills.md | 37 +- docs/src/static/asciinema-player-LICENSE | 201 ++ docs/src/static/cli-demo.cast | 267 +++ docs/src/static/cli-demo.html | 2404 ++++++++++++++++++++++ docs/src/static/docs-theme.css | 362 ++++ docs/src/static/docs-theme.js | 125 ++ docs/website/README.md | 48 + docs/website/assets/site.css | 115 +- docs/website/assets/site.js | 37 +- docs/website/cli-preview.png | Bin 0 -> 247510 bytes docs/website/docs-preview.png | Bin 0 -> 196748 bytes docs/website/index.html | 40 +- docs/website/preview.png | Bin 295229 -> 291665 bytes scripts/build_website.py | 65 + scripts/test_documentation.py | 154 ++ scripts/test_website.py | 6 +- 54 files changed, 4717 insertions(+), 1294 deletions(-) create mode 100644 docs/src/agent-find-problem.md create mode 100644 docs/src/agent-find-solver.md create mode 100644 docs/src/agent-pipeline.md create mode 100644 docs/src/agent-propose.md create mode 100644 docs/src/cli-automation.md create mode 100644 docs/src/cli-catalog.md create mode 100644 docs/src/cli-completions.md create mode 100644 docs/src/cli-create.md create mode 100644 docs/src/cli-demo.md create mode 100644 docs/src/cli-examples.md create mode 100644 docs/src/cli-inspect.md create mode 100644 docs/src/cli-paths.md create mode 100644 docs/src/cli-random.md create mode 100644 docs/src/cli-reduce.md create mode 100644 docs/src/cli-solve.md create mode 100644 docs/src/cli-variants.md create mode 100644 docs/src/contributing.md create mode 100644 docs/src/design-paths.md create mode 100644 docs/src/design-problem.md create mode 100644 docs/src/design-reductions.md create mode 100644 docs/src/design-serialization.md create mode 100644 docs/src/design-variant-registration.md create mode 100644 docs/src/design-variants.md create mode 100644 docs/src/install.md create mode 100644 docs/src/mcp-tools.md create mode 100644 docs/src/mcp-walkthrough.md create mode 100644 docs/src/reduction-graph.md create mode 100644 docs/src/rust-paths.md create mode 100644 docs/src/rust-reduction.md create mode 100644 docs/src/rust-solvers.md create mode 100644 docs/src/static/asciinema-player-LICENSE create mode 100644 docs/src/static/cli-demo.cast create mode 100644 docs/src/static/cli-demo.html create mode 100644 docs/src/static/docs-theme.css create mode 100644 docs/src/static/docs-theme.js create mode 100644 docs/website/cli-preview.png create mode 100644 docs/website/docs-preview.png create mode 100644 scripts/test_documentation.py diff --git a/book.toml b/book.toml index bda4b2cf9..5c64bdbd7 100644 --- a/book.toml +++ b/book.toml @@ -9,9 +9,9 @@ src = "docs/src" default-theme = "navy" git-repository-url = "https://github.com/CodingThrust/problem-reductions" edit-url-template = "https://github.com/CodingThrust/problem-reductions/edit/main/{path}" -additional-css = ["docs/src/static/theme-images.css", "docs/src/static/reduction-graph.css", "docs/src/static/module-graph.css"] -additional-js = ["docs/src/static/cytoscape.min.js", "docs/src/static/reduction-graph.js", "docs/src/static/module-graph.js"] -no-section-label = false +additional-css = ["docs/src/static/docs-theme.css", "docs/src/static/theme-images.css", "docs/src/static/reduction-graph.css", "docs/src/static/module-graph.css"] +additional-js = ["docs/src/static/docs-theme.js", "docs/src/static/cytoscape.min.js", "docs/src/static/reduction-graph.js", "docs/src/static/module-graph.js"] +no-section-label = true [output.html.fold] enable = true diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index 35b5a14fa..c9ce4eece 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -1,18 +1,54 @@ # Summary -[Introduction](./introduction.md) +[Overview](introduction.md) -# User Guide +# Start here -- [CLI Tool](./cli.md) -- [AI Agent Skills](./skills.md) +- [CLI in action](cli-demo.md) +- [Start with an agent](skills.md) +- [Install the CLI](install.md) +- [First solve](cli.md) -# Rust Library +# Agent workflows -- [Getting Started](./getting-started.md) -- [Design](./design.md) -- [API Reference](./api.md) +- [Find a solver](agent-find-solver.md) +- [Extend a solver's reach](agent-find-problem.md) +- [Propose a model or rule](agent-propose.md) +- [Implement and review](agent-pipeline.md) +- [Connect with MCP](mcp.md) + - [Tool reference](mcp-tools.md) + - [Example session](mcp-walkthrough.md) -# Reference +# CLI reference -- [MCP Server](./mcp.md) +- [Explore the catalog](cli-catalog.md) +- [Names and variants](cli-variants.md) +- [Find reduction paths](cli-paths.md) +- [Create an instance](cli-create.md) + - [Input examples](cli-examples.md) + - [Random instances](cli-random.md) +- [Inspect and evaluate](cli-inspect.md) +- [Reduce an instance](cli-reduce.md) +- [Solve an instance](cli-solve.md) +- [JSON and automation](cli-automation.md) +- [Shell completions](cli-completions.md) + +# Rust library + +- [First Rust program](getting-started.md) +- [Apply a reduction](rust-reduction.md) +- [Discover and execute paths](rust-paths.md) +- [Solver contracts](rust-solvers.md) +- [API reference](api.md) + +# Internals + +- [Architecture](design.md) +- [Problem contract](design-problem.md) +- [Variant system](design-variants.md) + - [Register variants](design-variant-registration.md) +- [Reduction contracts](design-reductions.md) +- [Path costs and overhead](design-paths.md) +- [JSON serialization](design-serialization.md) +- [Reduction graph](reduction-graph.md) +- [Contributing](contributing.md) diff --git a/docs/src/agent-find-problem.md b/docs/src/agent-find-problem.md new file mode 100644 index 000000000..8b5feff57 --- /dev/null +++ b/docs/src/agent-find-problem.md @@ -0,0 +1,29 @@ +# Extend a solver's reach + +Find source problems that can reduce to a solver you already have. + +**Before you start:** complete [agent setup](skills.md). Specify the solver's accepted model, topology, weights, and practical size limit. + +## Prompt + +```text +Read .claude/skills/find-problem/SKILL.md and follow it. +My solver accepts: [exact model and variant]. +Its time complexity and practical size limit: [details]. +Find incoming reduction routes and rank useful source problems. +Show the assumptions and composed size overhead for each recommendation. +Write the findings to docs/solutions/. +``` + +## Check the direction + +A solver for a target can handle sources that reduce **to** it. For example: + +```bash +pred to QUBO +pred path MIS QUBO +``` + +A route in the opposite direction does not establish that capability. Confirm each candidate's exact variants and measure the constructed target size on a small instance. + +Next: [reduce an instance](cli-reduce.md). diff --git a/docs/src/agent-find-solver.md b/docs/src/agent-find-solver.md new file mode 100644 index 000000000..1e54b9b82 --- /dev/null +++ b/docs/src/agent-find-solver.md @@ -0,0 +1,26 @@ +# Find a solver + +Map a concrete problem to a library model and a usable solver route. + +**Before you start:** complete [agent setup](skills.md). Describe the inputs, constraints, objective, and expected instance sizes. + +## Prompt + +```text +Read .claude/skills/find-solver/SKILL.md and follow it. +My problem: [describe inputs, constraints, and objective]. +Typical size: [counts and ranges]. +Available solvers or hardware: [list, or no preference]. +Check the exact model variant and current reduction paths with pred. +Separate implemented routes from suggestions that need new work. +``` + +## Expected result + +A solution document in `docs/solutions/` with the proposed model, assumptions, reduction route, size overheads, and solver recommendation. + +## Check the recommendation + +Ask the agent to construct a small instance, solve it, and evaluate the recovered configuration on the original problem. If several models fit, resolve the modeling differences before scaling up. + +Next: [first solve](cli.md) or [inspect a route](cli-paths.md). diff --git a/docs/src/agent-pipeline.md b/docs/src/agent-pipeline.md new file mode 100644 index 000000000..7c3e757e6 --- /dev/null +++ b/docs/src/agent-pipeline.md @@ -0,0 +1,31 @@ +# Implement and review + +Move a prepared issue through the repository's agent workflow. These commands act on GitHub issues, project status, and pull requests; run them in a configured maintainer checkout. + +## Implement one issue + +```bash +make run-issue N=42 +``` + +Replace `42` with the issue number. The task follows `.claude/skills/issue-to-pr/SKILL.md`. Model and rule skills define the source, tests, examples, and paper changes required. + +To pick one eligible Ready issue from the project board: + +```bash +make run-pipeline +``` + +## Review one pull request + +```bash +make run-review N=570 +``` + +Replace `570` with the PR number. The review workflow checks structure, quality, and user-facing behavior, then moves the PR to Final review. Maintainer review controls acceptance. + +## Evidence to retain + +Keep the mathematical argument, constructor and adversarial checks, closed-loop tests, canonical example, and review findings with the work. A passing test suite is evidence for tested instances, not a proof for all inputs. + +For exact workflow rules, read [the repository instructions](https://github.com/CodingThrust/problem-reductions/blob/main/.claude/CLAUDE.md). diff --git a/docs/src/agent-propose.md b/docs/src/agent-propose.md new file mode 100644 index 000000000..c936b496c --- /dev/null +++ b/docs/src/agent-propose.md @@ -0,0 +1,24 @@ +# Propose a model or rule + +Turn a mathematical idea or published construction into a precise proposal for the atlas. + +**Before you start:** complete [agent setup](skills.md). Bring a definition, a source reference, or a candidate source → target connection. + +## Prompt + +```text +Read .claude/skills/propose/SKILL.md and follow it. +I want to propose: [model or source-to-target reduction]. +Reference or construction: [details]. +Check the current catalog for existing models and exact variant endpoints. +Clarify the objective, solution mapping, correctness argument, and overhead. +Prepare the proposal for the issue workflow. +``` + +## Expected result + +A model or rule proposal with explicit assumptions and enough mathematical detail to assess usefulness and correctness. The skill guides issue creation. + +For a rule, distinguish a construction supported by literature from a new conjecture. Record proof gaps and counterexamples explicitly. + +Next: [implementation and review](agent-pipeline.md) once the issue is ready. diff --git a/docs/src/api.md b/docs/src/api.md index 3025182bf..e534bb8d9 100644 --- a/docs/src/api.md +++ b/docs/src/api.md @@ -1,9 +1,7 @@ -# API Reference +# API reference - +[Browse the Rust API →](api/problemreductions/index.html) -Full API documentation is auto-generated from source code via `rustdoc`. +The API is generated from Rust source with rustdoc. Start with [models](api/problemreductions/models/index.html), [reduction contracts](api/problemreductions/rules/index.html), or [solvers](api/problemreductions/solvers/index.html). -**[Browse the API →](api/problemreductions/index.html)** - -If not redirected automatically, run `make doc` to generate the API docs. +Run `make doc` to build the guides and API locally. For short runnable examples, see [first Rust program](getting-started.md) and [apply a reduction](rust-reduction.md). diff --git a/docs/src/cli-automation.md b/docs/src/cli-automation.md new file mode 100644 index 000000000..b2624f6be --- /dev/null +++ b/docs/src/cli-automation.md @@ -0,0 +1,37 @@ +# JSON and automation + +Use structured output for agent tools and scripts. + +```bash +pred list --json +pred show MIS --json +pred path MIS QUBO --json +pred solve problem.json -o solution.json +``` + +| Global flag | Effect | +|---|---| +| `--json` | Request JSON output for data commands | +| `-o, --output ` | Save JSON to a file | +| `-q, --quiet` | Suppress informational messages on stderr | + +Check the process exit status before consuming a result. Preserve `type` and `variant` with each instance; an alias alone is insufficient to replay an exact endpoint. + +## Pipe instances + +```bash +pred create MIS --graph 0-1,1-2,2-3 | pred solve - --json +pred create MIS --graph 0-1,1-2,2-3 | pred reduce - --to QUBO | pred solve - --solver brute-force --json +``` + +`-` reads a problem or bundle from stdin. In shell automation, enable `set -o pipefail` so a failed earlier command fails the pipeline. + +## Registry exports + +```bash +pred export-graph -o reduction_graph.json +``` + +The docs build publishes [reduction_graph.json](reductions/reduction_graph.json) and [problem_schemas.json](reductions/problem_schemas.json). The graph includes exact variants, directed edges, capabilities, and symbolic overheads; schemas describe model fields. + +Use the [Markdown index](markdown/index.md) for task instructions and these JSON files for structured registry queries. The exports describe the website's build; local CLI output describes the installed version. diff --git a/docs/src/cli-catalog.md b/docs/src/cli-catalog.md new file mode 100644 index 000000000..47c53cb53 --- /dev/null +++ b/docs/src/cli-catalog.md @@ -0,0 +1,22 @@ +# Explore the catalog + +Use the installed registry to discover models, accepted fields, and reductions. + +```bash +pred list +pred show MIS +pred show MIS --json +``` + +`list` reports names and aliases. `show` describes the resolved variant, its size fields, input schema, and incoming/outgoing reductions. Use that schema before constructing an instance. + +
    +Example: inspect Maximum Independent Set + +```text +{{#include generated/pred-show-mis.txt}} +``` + +
    + +For machine-readable catalog data, use `pred list --json`. Use [names and variants](cli-variants.md) to select exact endpoints and [path queries](cli-paths.md) to explore their connections. diff --git a/docs/src/cli-completions.md b/docs/src/cli-completions.md new file mode 100644 index 000000000..a5ee8f3f5 --- /dev/null +++ b/docs/src/cli-completions.md @@ -0,0 +1,16 @@ +# Shell completions + +Enable tab completion by adding one line to your shell config: + +```bash +# bash (~/.bashrc) +eval "$(pred completions bash)" + +# zsh (~/.zshrc) +eval "$(pred completions zsh)" + +# fish (~/.config/fish/config.fish) +pred completions fish | source +``` + +If the shell argument is omitted, `pred completions` auto-detects your current shell. diff --git a/docs/src/cli-create.md b/docs/src/cli-create.md new file mode 100644 index 000000000..51318def0 --- /dev/null +++ b/docs/src/cli-create.md @@ -0,0 +1,26 @@ +# Create an instance + +**Input:** a model name or exact variant, plus fields from `pred show `. +**Output:** a JSON problem file containing `type`, `variant`, and `data`. + +```bash +pred create MIS --graph 0-1,1-2,2-3 -o problem.json +pred create MIS/SimpleGraph/i32 --graph 0-1,1-2,2-3 --weights 2,1,3,1 -o weighted.json +pred inspect weighted.json +``` + +Vertices use zero-based indices. `--graph` is a comma-separated edge list; weights must match the model's expected vertices or edges. + +## Use a canonical example + +```bash +pred create --example MIS/SimpleGraph/i32 -o model.json +pred create --example MVC/SimpleGraph/i32 --to MIS/SimpleGraph/i32 -o source.json +pred create --example MVC/SimpleGraph/i32 --to MIS/SimpleGraph/i32 --example-side target -o target.json +``` + +The first command loads a model fixture. The next two load the source and target of a documented reduction example. + +CLI fields follow schema names: `universe_size` becomes `--universe-size`, and `subsets` becomes `--subsets`. + +Next: [input examples](cli-examples.md), [random instances](cli-random.md), or [inspect and evaluate](cli-inspect.md). diff --git a/docs/src/cli-demo.md b/docs/src/cli-demo.md new file mode 100644 index 000000000..b7e90437e --- /dev/null +++ b/docs/src/cli-demo.md @@ -0,0 +1,35 @@ +# CLI in action + +From a graph to a checked solution in six commands. This recording runs the real CLI: discover a route, transform the instance, solve, and verify the result. + + + +[Open the player](static/cli-demo.html) · [Download the cast](static/cli-demo.cast) · [Download the offline HTML](static/cli-demo.html) + +## Run it yourself + +[Install `pred`](install.md), then run in a fresh directory. The recording uses `./pred`, a local build of the same executable. + +```bash +pred path MIS ILP +pred create MIS --graph 0-1,1-2,2-3,3-4,4-0 -o cycle.json +pred reduce cycle.json --to ILP -o reduced.json +pred solve reduced.json +pred evaluate cycle.json --config 1,0,1,0,0 +pred solve cycle.json --solver brute-force +``` + +## What to check + +The recorded route goes through Maximum Set Packing and a weight cast before reaching binary ILP. `reduced.json` preserves the source instance and path so the solver can recover a source solution. + +| Check | Recorded result | +|---|---| +| Solve the reduction bundle | `Max(2)`, configuration `[1,0,1,0,0]` | +| Evaluate that source configuration | `Max(2)` | +| Exhaustive source solve | `Max(2)`, configuration `[0,0,1,0,1]` | +| Command exit codes | All six returned `0` | + +Different configurations can have the same optimum. This cross-check validates this instance; a reduction's general correctness requires a mathematical argument. + +Next: [JSON output for agents](cli-automation.md) or [find another route](cli-paths.md). diff --git a/docs/src/cli-examples.md b/docs/src/cli-examples.md new file mode 100644 index 000000000..f2b9cf90b --- /dev/null +++ b/docs/src/cli-examples.md @@ -0,0 +1,42 @@ +# Input examples + +Create small instances for different input structures. Use `pred show ` for its schema and `pred create --help` for flag syntax. + +## Boolean formula + +```bash +pred create SAT --num-vars 3 --clauses '1,2;-1,3' -o sat.json +``` + +Clauses are separated by semicolons. Literals are signed, one-based variable indices; `-1` negates variable 1. + +## Quadratic matrix + +```bash +pred create QUBO --matrix '1,0.5;0.5,2' -o qubo.json +``` + +Semicolons separate rows; commas separate entries. + +## Set system + +```bash +pred create X3C --universe-size 6 --subsets '0,1,2;3,4,5;0,3,4' -o x3c.json +``` + +Subset elements use zero-based indices into the universe. + +## Integer factoring + +```bash +pred create Factoring --target 6 --m 2 --n 2 -o factoring.json +``` + +## Check an instance + +```bash +pred inspect sat.json +pred solve sat.json --solver brute-force +``` + +For other models, start from `pred create --example ` and inspect its fields. Brute-force cost is the product of variable domain sizes; use tiny examples. diff --git a/docs/src/cli-inspect.md b/docs/src/cli-inspect.md new file mode 100644 index 000000000..4dde633bd --- /dev/null +++ b/docs/src/cli-inspect.md @@ -0,0 +1,31 @@ +# Inspect and evaluate + +Use `inspect` to identify a problem file or reduction bundle. Use `evaluate` to check a specific configuration against the original instance. + +## Inspect a file + +```bash +pred create MIS --graph 0-1,1-2,2-3 -o problem.json +pred inspect problem.json +pred inspect problem.json --json +``` + +Inspect the resolved variant and sizes before choosing a solver. + +## Evaluate a configuration + +```bash +pred evaluate problem.json --config 1,0,1,0 +``` + +This selects vertices 0 and 2 and returns `Max(2)`. Selecting adjacent vertices is invalid and returns `Max(None)`. + +Configurations follow each problem's variable domains; they are not always binary. Check the model definition before constructing one. + +## Read from stdin + +```bash +pred create MIS --graph 0-1,1-2,2-3 | pred evaluate - --config 1,0,1,0 +``` + +Evaluation checks one candidate. It does not establish optimality; compare with [a solver](cli-solve.md). diff --git a/docs/src/cli-paths.md b/docs/src/cli-paths.md new file mode 100644 index 000000000..740350dc5 --- /dev/null +++ b/docs/src/cli-paths.md @@ -0,0 +1,34 @@ +# Find reduction paths + +Choose source and target [variants](cli-variants.md), then query their direction of reachability. + +```bash +pred path MIS ILP +pred from MIS +pred to QUBO +``` + +`from` explores outgoing routes; `to` explores incoming routes. `path` finds a route between the supplied endpoints. Search defaults to witness-capable reductions. + +## Save and compare routes + +```bash +pred path MIS QUBO -o path.json +pred path MIS QUBO --all --max-paths 50 +pred path MIS QUBO --cost minimize-steps +pred path MIS QUBO --cost minimize:num_variables +``` + +`--all` is capped (20 paths by default); inspect the truncation indicator. A saved single path can be used with `pred reduce --via path.json`. + +The default cost minimizes steps. Size-based costs use reduction overhead metadata; inspect available size fields with `pred show`. Overhead formulas describe scaling bounds, not exact constructed instance sizes. + +## Multi-step example + +```text +{{#include generated/pred-path-factoring-spinglass.txt}} +``` + +A discovered path does not imply the target will be inexpensive to solve. Measure the target size and solver behavior on representative instances. + +Next: [apply a path](cli-reduce.md) or [understand overhead](design-paths.md). diff --git a/docs/src/cli-random.md b/docs/src/cli-random.md new file mode 100644 index 000000000..c421a655c --- /dev/null +++ b/docs/src/cli-random.md @@ -0,0 +1,13 @@ +# Random instances + +Generate a small graph for exploration: + +```bash +pred create MIS --random --num-vertices 10 -o random.json +pred inspect random.json +pred solve random.json --solver brute-force +``` + +Use `pred create --help` for generation options supported by the current build. Random generation is available for selected input structures; it is not a constructor for every model. + +Save the generated JSON when reporting results so another agent can reproduce the exact instance. Use [canonical examples](cli-create.md#use-a-canonical-example) for stable demonstrations. diff --git a/docs/src/cli-reduce.md b/docs/src/cli-reduce.md new file mode 100644 index 000000000..48071c9a3 --- /dev/null +++ b/docs/src/cli-reduce.md @@ -0,0 +1,31 @@ +# Reduce an instance + +**Before you start:** [create a problem file](cli-create.md) and [find a route](cli-paths.md). + +## Choose a target + +```bash +pred reduce problem.json --to QUBO -o reduced.json +pred inspect reduced.json +``` + +The reduction bundle contains the source instance, target instance, and variant-level path. Keep the whole bundle to preserve solution recovery. + +## Use a saved path + +```bash +pred path MIS QUBO -o path.json +pred reduce problem.json --via path.json -o reduced.json +``` + +The path determines the target; `--to` is unnecessary. The input must match the path's source variant. For a weighted input, find a path from its exact weighted variant. + +## Solve and recover + +```bash +pred solve reduced.json --solver brute-force +``` + +The solver solves the target and maps the result back through the bundle. Keep targets small when using brute force. For JSON output, the `intermediate` field records the target result alongside the recovered source solution. + +Next: [solver options](cli-solve.md) or [pipeline commands](cli-automation.md). diff --git a/docs/src/cli-solve.md b/docs/src/cli-solve.md new file mode 100644 index 000000000..6afd49824 --- /dev/null +++ b/docs/src/cli-solve.md @@ -0,0 +1,37 @@ +# Solve an instance + +**Input:** a problem JSON file or a complete reduction bundle. +**Output:** the evaluation and, for witness-capable problems, a solution configuration. + +```bash +pred solve problem.json +pred solve problem.json --solver brute-force +pred solve problem.json --timeout 30 +pred solve problem.json -o solution.json +``` + +## Choose a solver + +| Solver | Behavior | +|---|---| +| `ilp` (default) | Finds a witness-capable ILP route, solves the target, and recovers a source configuration | +| `brute-force` | Enumerates configurations; use for tiny instances and cross-checks | +| `customized` | Uses exact backends for selected models; inspect `pred solve --help` for supported models | + +If ILP reports no route, inspect `pred path ILP` and try brute force on a small instance. A model's presence in the catalog does not guarantee every solver supports it. + +## Solve a bundle + +```bash +pred solve reduced.json --json +``` + +A bundle requires a witness-capable target and path. Its result includes the recovered source solution and the intermediate target result. + +Aggregate-only problems produce values without representative configurations. Do not assume every successful solve contains a witness. + +## Verify the result + +Evaluate the returned configuration on the original instance using `pred evaluate`. For a tiny example, compare its objective with an exhaustive solve. Different optimal configurations are acceptable when their evaluations agree. + +Next: [JSON and automation](cli-automation.md). diff --git a/docs/src/cli-variants.md b/docs/src/cli-variants.md new file mode 100644 index 000000000..0f8cce33f --- /dev/null +++ b/docs/src/cli-variants.md @@ -0,0 +1,20 @@ +# Names and variants + +Aliases such as `MIS` resolve to full problem names. A bare name selects that model's declared default variant; `MIS` resolves to `MaximumIndependentSet/SimpleGraph/One`. + +## Select an exact variant + +```bash +pred show MIS/SimpleGraph/i32 +pred path MIS/SimpleGraph/i32 ILP/bool +``` + +Slash-separated parameters select graph, weight, or other variant values. Use `pred list` and `pred show` to inspect the registry instead of guessing a variant. + +`One` means unit weights. Providing non-unit `--weights` when creating a default MIS instance upgrades it to `i32`. Specify `MIS/SimpleGraph/i32` explicitly when a reproducible endpoint matters. + +## Common aliases + +{{#include generated/pred-aliases.txt}} + +Next: [find a path](cli-paths.md). diff --git a/docs/src/cli.md b/docs/src/cli.md index e94f4456e..6a7282587 100644 --- a/docs/src/cli.md +++ b/docs/src/cli.md @@ -1,449 +1,25 @@ # CLI Tool -The `pred` command-line tool lets you explore the reduction graph, create problem instances, solve problems, and perform reductions — all from your terminal. +Create and solve your first problem with `pred`. [Install the CLI](install.md) before running these commands in a fresh working directory. -## Installation - -Install from crates.io: - -```bash -cargo install problemreductions-cli -``` - -Or build from source: +## Create a graph problem ```bash -git clone https://github.com/CodingThrust/problem-reductions -cd problem-reductions -cargo build -p problemreductions-cli --release # builds target/release/pred -cargo install --path problemreductions-cli # optional: installs `pred` to ~/.cargo/bin +pred create MIS --graph 0-1,1-2,2-3,3-4,4-0 -o cycle.json ``` -Verify the installation: - -```bash -pred --version -``` +`MIS` means Maximum Independent Set: select as many pairwise non-adjacent vertices as possible. This graph is a cycle with five vertices. -For a workspace-local run without installing globally, use: +## Solve and check ```bash -cargo run -p problemreductions-cli --bin pred -- --version -``` - -### ILP Backend - -The default ILP backend is HiGHS. To use a different backend: - -```bash -cargo install problemreductions-cli --features coin-cbc -cargo install problemreductions-cli --features scip -cargo install problemreductions-cli --no-default-features --features clarabel -``` - -Available backends: `highs` (default), `coin-cbc`, `clarabel`, `scip`, `lpsolve`, `microlp`. - -## Quick Start - -```bash -# Create a Maximum Independent Set problem -pred create MIS --graph 0-1,1-2,2-3 -o problem.json - -# Create a weighted instance (variant auto-upgrades to i32) -pred create MIS --graph 0-1,1-2,2-3 --weights 3,1,2,1 -o weighted.json - -# Create a Steiner Tree instance -pred create SteinerTree --graph 0-1,0-3,1-2,1-3,2-3,2-4,3-4 --edge-weights 2,5,2,1,5,6,1 --terminals 0,2,4 -o steiner.json - -# Create a Length-Bounded Disjoint Paths instance -pred create LengthBoundedDisjointPaths --graph 0-1,1-6,0-2,2-3,3-6,0-4,4-5,5-6 --source 0 --sink 6 --bound 4 -o lbdp.json - -# Create a Consecutive Block Minimization instance (alias: CBM) -pred create CBM --matrix '[[true,false,true],[false,true,true]]' --bound 2 -o cbm.json - -# CBM currently needs the brute-force solver -pred solve cbm.json --solver brute-force - -# Or start from a canonical model example -pred create --example MIS/SimpleGraph/i32 -o example.json - -# Or from a canonical rule example -pred create --example MVC/SimpleGraph/i32 --to MIS/SimpleGraph/i32 -o example.json - -# Inspect what's inside a problem file -pred inspect problem.json - -# Inspect the new path problem -pred inspect lbdp.json - -# Solve it (auto-reduces to ILP) -pred solve problem.json - -# Or solve with brute-force -pred solve problem.json --solver brute-force - -# LengthBoundedDisjointPaths currently needs brute-force -pred solve lbdp.json --solver brute-force - -# Evaluate a specific configuration (shows the aggregate value, e.g. Max(2) or Min(None)) -pred evaluate problem.json --config 1,0,1,0 - -# Reduce to another problem type and solve via brute-force -pred reduce problem.json --to QUBO -o reduced.json -pred solve reduced.json --solver brute-force - -# Pipe commands together (use - to read from stdin) -pred create MIS --graph 0-1,1-2,2-3 | pred solve - # when an ILP reduction path exists -pred create StringToStringCorrection --source-string "0,1,2,3,1,0" --target-string "0,1,3,2,1" --bound 2 | pred solve - --solver brute-force -pred create MIS --graph 0-1,1-2,2-3 | pred reduce - --to QUBO | pred solve - -``` - -> **Note:** When you provide `--weights` with non-unit values (e.g., `3,1,2,1`), the variant is -> automatically upgraded from the default unit-weight (`One`) to `i32`. You can also specify the -> weighted variant explicitly: `pred create MIS/SimpleGraph/i32 --graph 0-1 --weights 3,1`. - -## Global Flags - -| Flag | Description | -|------|-------------| -| `-o, --output ` | Save JSON output to a file | -| `--json` | Output JSON to stdout instead of human-readable text | -| `-q, --quiet` | Suppress informational messages on stderr | - -## Commands - -### `pred list` — List all problem types - -Lists all registered problem types with their short aliases. - -```text -{{#include generated/pred-list.txt}} -``` - -### `pred show` — Inspect a problem - -Show fields, size fields, and reductions for a problem's default variant. Use short aliases like `MIS` for `MaximumIndependentSet`. Use `pred to` or `pred from` for variant-level neighborhood exploration. - -```text -{{#include generated/pred-show-mis.txt}} +pred solve cycle.json +pred evaluate cycle.json --config 1,0,1,0,0 +pred solve cycle.json --solver brute-force ``` -### `pred to` — Explore incoming neighbors +Both solvers return `Max(2)`. The configuration `1,0,1,0,0` selects vertices 0 and 2 and evaluates to the same value. Several optimal configurations exist, so the solvers may return different selections. -Explore which problems can reduce **to** the given problem within k hops: +The default solver discovers a route to ILP and maps the solution back. Brute force checks all configurations; keep instances small. -```text -{{#include generated/pred-to-mis.txt}} -``` - -### `pred from` — Explore outgoing neighbors - -Explore which problems the given problem can reduce to, starting **from** it: - -```text -{{#include generated/pred-from-qubo.txt}} -``` - -### `pred path` — Find a reduction path - -Find the cheapest chain of reductions between two problems: - -```text -{{#include generated/pred-path-mis-qubo.txt}} -``` - -Multi-step paths are discovered automatically: - -```text -{{#include generated/pred-path-factoring-spinglass.txt}} -``` - -Show all paths or save for later use with `pred reduce --via`: - -```bash -pred path MIS QUBO --all # all paths (up to 20) -pred path MIS QUBO --all --max-paths 50 # increase limit -pred path MIS QUBO -o path.json # save path for `pred reduce --via` -pred path MIS QUBO --all -o paths/ # save all paths to a folder -``` - -When using `--all`, the output is capped at `--max-paths` (default: 20). If more paths exist, the output indicates truncation. - -Use `--cost` to change the optimization strategy: - -```bash -pred path MIS QUBO --cost minimize-steps # default -pred path MIS QUBO --cost minimize:num_variables # minimize a size field -``` - -Use `pred show ` to see which size fields are available. - -### `pred export-graph` — Export the reduction graph - -Export the full reduction graph as JSON: - -```bash -pred export-graph # print to stdout -pred export-graph -o reduction_graph.json # save to file -``` - -### `pred create` — Create a problem instance - -Construct a problem instance from CLI arguments and save as JSON: - -```bash -pred create --example MIS/SimpleGraph/i32 -o model.json -pred create --example MVC/SimpleGraph/i32 --to MIS/SimpleGraph/i32 -o problem.json -pred create --example MVC/SimpleGraph/i32 --to MIS/SimpleGraph/i32 --example-side target -o target.json -pred create MIS --graph 0-1,1-2,2-3 -o problem.json -pred create MIS --graph 0-1,1-2,2-3 --weights 2,1,3,1 -o problem.json -pred create SAT --num-vars 3 --clauses "1,2;-1,3" -o sat.json -pred create QUBO --matrix "1,0.5;0.5,2" -o qubo.json -pred create CBM --matrix '[[true,false,true],[false,true,true]]' --bound 2 -o cbm.json -pred create KColoring --k 3 --graph 0-1,1-2,2-0 -o kcol.json -pred create KthBestSpanningTree --graph 0-1,0-2,1-2 --edge-weights 2,3,1 --k 1 --bound 3 -o kth.json -pred create SpinGlass --graph 0-1,1-2 -o sg.json -pred create MaxCut --graph 0-1,1-2,2-0 -o maxcut.json -pred create MinMaxMulticenter --graph 0-1,1-2,2-3 --weights 1,1,1,1 --edge-weights 1,1,1 --k 2 -o pcenter.json -pred create ShortestWeightConstrainedPath --graph 0-1,0-2,1-3,2-3,2-4,3-5,4-5,1-4 --edge-lengths 2,4,3,1,5,4,2,6 --edge-weights 5,1,2,3,2,3,1,1 --source-vertex 0 --target-vertex 5 --weight-bound 8 -o swcp.json -pred create RectilinearPictureCompression --matrix "1,1,0,0;1,1,0,0;0,0,1,1;0,0,1,1" --k 2 -o rpc.json -pred solve rpc.json --solver brute-force -pred create MinimumMultiwayCut --graph 0-1,1-2,2-3,3-0 --terminals 0,2 --edge-weights 3,1,2,4 -o mmc.json -pred create SteinerTree --graph 0-1,0-3,1-2,1-3,2-3,2-4,3-4 --edge-weights 2,5,2,1,5,6,1 --terminals 0,2,4 -o steiner.json -pred create UndirectedTwoCommodityIntegralFlow --graph 0-2,1-2,2-3 --capacities 1,1,2 --source-1 0 --sink-1 3 --source-2 1 --sink-2 3 --requirement-1 1 --requirement-2 1 -o utcif.json -pred create LengthBoundedDisjointPaths --graph 0-1,1-6,0-2,2-3,3-6,0-4,4-5,5-6 --source 0 --sink 6 --bound 4 -o lbdp.json -pred create Factoring --target 15 --bits-m 4 --bits-n 4 -o factoring.json -pred create Factoring --target 21 --bits-m 3 --bits-n 3 -o factoring2.json -pred create X3C --universe 9 --sets "0,1,2;0,2,4;3,4,5;3,5,7;6,7,8;1,4,6;2,5,8" -o x3c.json -pred create MinimumCardinalityKey --num-attributes 6 --dependencies "0,1>2;0,2>3;1,3>4;2,4>5" -o mck.json -pred create MinimumTardinessSequencing --n 5 --deadlines 5,5,5,3,3 --precedence-pairs "0>3,1>3,1>4,2>4" -o mts.json -pred create SchedulingWithIndividualDeadlines --n 7 --deadlines 2,1,2,2,3,3,2 --num-processors 3 --precedence-pairs "0>3,1>3,1>4,2>4,2>5" -o swid.json -pred solve swid.json --solver brute-force -pred create SequencingToMinimizeWeightedCompletionTime --lengths 2,1,3,1,2 --weights 3,5,1,4,2 --precedence-pairs "0>2,1>4" -o stmwct.json -pred create StringToStringCorrection --source-string "0,1,2,3,1,0" --target-string "0,1,3,2,1" --bound 2 | pred solve - --solver brute-force -pred create StrongConnectivityAugmentation --arcs "0>1,1>2,2>0,3>4,4>3,2>3,4>5,5>3" --candidate-arcs "3>0:5,3>1:3,3>2:4,4>0:6,4>1:2,4>2:7,5>0:4,5>1:3,5>2:1,0>3:8,0>4:3,0>5:2,1>3:6,1>4:4,1>5:5,2>4:3,2>5:7,1>0:2" --bound 1 -o sca.json -``` - -For `LengthBoundedDisjointPaths`, the CLI flag `--bound` maps to the JSON field -`max_length`. - -For `ConsecutiveBlockMinimization`, the `--matrix` flag expects a JSON 2D bool array such as -`'[[true,false,true],[false,true,true]]'`. The example above shows the accepted shape, and solving -CBM instances currently requires `--solver brute-force`. - -For problem-specific create help, run `pred create ` with no additional flags. -The generic `pred create --help` output lists all flags across all problem types. - -Canonical examples are useful when you want a known-good instance from the paper/example database. -For model examples, `pred create --example ` emits the canonical instance for that -graph node. -For rule examples, `pred create --example --to ` emits the source -instance by default; use `--example-side target` to emit the reduction target instance instead. - -Generate random instances for graph-based problems: - -```bash -pred create MIS --random --num-vertices 10 --edge-prob 0.3 -pred create MIS --random --num-vertices 100 --seed 42 -o big.json -pred create MaxCut --random --num-vertices 20 --edge-prob 0.5 -o maxcut.json -``` - -Without `-o`, the problem JSON is printed to stdout, which can be piped to other commands: - -```bash -pred create MIS --graph 0-1,1-2,2-3 | pred solve - # when an ILP reduction path exists -pred create StringToStringCorrection --source-string "0,1,2,3,1,0" --target-string "0,1,3,2,1" --bound 2 | pred solve - --solver brute-force -pred create MIS --random --num-vertices 10 | pred inspect - -``` - -The output file uses a standard wrapper format: - -```json -{ - "type": "MaximumIndependentSet", - "variant": {"graph": "SimpleGraph", "weight": "i32"}, - "data": { ... } -} -``` - -#### Example: Bounded Component Spanning Forest - -`BoundedComponentSpanningForest` uses one component label per vertex in the -evaluation config. If the graph has `n` vertices and limit `k`, then -`--config` expects `n` comma-separated integers in `0..k-1`. - -```bash -pred create BoundedComponentSpanningForest \ - --graph 0-1,1-2,2-3,3-4,4-5,5-6,6-7,0-7,1-5,2-6 \ - --weights 2,3,1,2,3,1,2,1 \ - --k 3 \ - --bound 6 \ - -o bcsf.json - -pred evaluate bcsf.json --config 0,0,1,1,1,2,2,0 -pred solve bcsf.json --solver brute-force -``` - -The brute-force solver is required here because this model does not yet have an -ILP reduction path. - -### `pred evaluate` — Evaluate a configuration - -Evaluate a configuration against a problem instance: - -```text -{{#include generated/pred-evaluate.txt}} -``` - -Stdin is supported with `-`: - -```bash -pred create MIS --graph 0-1,1-2,2-3 | pred evaluate - --config 1,0,1,0 -``` - -### `pred inspect` — Inspect a problem file - -Show a summary of what's inside a problem JSON or reduction bundle: - -```bash -$ pred inspect problem.json -Type: MaximumIndependentSet {graph=SimpleGraph, weight=i32} -Size: 5 vertices, 5 edges -``` - -Works with reduction bundles and stdin: - -```bash -pred inspect bundle.json -pred create MIS --graph 0-1,1-2 | pred inspect - -``` - -### `pred reduce` — Reduce a problem - -Reduce a problem to a target type. Outputs a reduction bundle containing source, target, and path: - -```bash -pred reduce problem.json --to QUBO -o reduced.json -``` - -Use a specific reduction path (from `pred path -o`). The target is inferred from the path file, so `--to` is not needed: - -```bash -pred reduce problem.json --via path.json -o reduced.json -``` - -Stdin is supported with `-`: - -```bash -pred create MIS --graph 0-1,1-2,2-3 | pred reduce - --to QUBO -``` - -The bundle contains everything needed to map solutions back: - -```json -{ - "source": { "type": "MaximumIndependentSet", "variant": {...}, "data": {...} }, - "target": { "type": "QUBO", "variant": {...}, "data": {...} }, - "path": [ - {"name": "MaximumIndependentSet", "variant": {"graph": "SimpleGraph", "weight": "i32"}}, - {"name": "QUBO", "variant": {"weight": "f64"}} - ] -} -``` - -### `pred solve` — Solve a problem - -Solve a problem instance using ILP (default), brute-force, or the customized solver: - -```bash -pred solve problem.json # ILP solver (default) -pred solve problem.json --solver brute-force # brute-force solver -pred solve problem.json --solver customized # structure-exploiting exact solver -pred solve problem.json --timeout 30 # abort after 30 seconds -``` - -Stdin is supported with `-`: - -```bash -pred create MIS --graph 0-1,1-2,2-3 | pred solve - -pred create MIS --graph 0-1,1-2,2-3 | pred solve - --solver brute-force -pred create MinMaxMulticenter --graph 0-1,1-2,2-3 --weights 1,1,1,1 --edge-weights 1,1,1 --k 2 | pred solve - --solver brute-force -pred create TwoDimensionalConsecutiveSets --alphabet-size 6 --sets "0,1,2;3,4,5;1,3;2,4;0,5" | pred solve - --solver brute-force -``` - -Output is JSON. When the problem is not ILP, the solver automatically reduces it to ILP, solves, and maps the solution back: - -```json -{{#include generated/pred-solve-ilp.txt}} -``` - -Solve a reduction bundle (from `pred reduce`): - -```json -{{#include generated/pred-solve-bundle.txt}} -``` - -> **Note:** The ILP solver requires a reduction path from the target problem to ILP. -> Some problems do not currently have one. Examples include BoundedComponentSpanningForest, -> LengthBoundedDisjointPaths, MinimumCardinalityKey, QUBO, SpinGlass, MaxCut, CircuitSAT, MinMaxMulticenter, and MultiprocessorScheduling. -> Use `pred solve --solver brute-force` for these, or reduce to a problem that supports ILP first. -> For other problems, use `pred path ILP` to check whether an ILP reduction path exists. - -For example, the canonical Minimum Cardinality Key instance can be created and solved with: - -```bash -pred create MinimumCardinalityKey --num-attributes 6 --dependencies "0,1>2;0,2>3;1,3>4;2,4>5" -o mck.json -pred solve mck.json --solver brute-force -``` - -## Shell Completions - -Enable tab completion by adding one line to your shell config: - -```bash -# bash (~/.bashrc) -eval "$(pred completions bash)" - -# zsh (~/.zshrc) -eval "$(pred completions zsh)" - -# fish (~/.config/fish/config.fish) -pred completions fish | source -``` - -If the shell argument is omitted, `pred completions` auto-detects your current shell. - -## JSON Output - -All commands support `-o` to write JSON to a file and `--json` to print JSON to stdout: - -```bash -pred list -o problems.json # save to file -pred list --json # print JSON to stdout -pred show MIS --json # works on any command -pred path MIS QUBO --json -pred solve problem.json --json -``` - -This is useful for scripting and piping: - -```bash -pred list --json | jq '.variants[].name' -pred path MIS QUBO --json | jq '.path' -``` - -## Problem Name Aliases - -You can use short aliases instead of full problem names (shown in `pred list`): - -{{#include generated/pred-aliases.txt}} - -You can also specify variants with a slash: `MIS/UnitDiskGraph`, `SpinGlass/SimpleGraph`. - -When a bare name (no slash) is used in commands like `path`, `to`, `from`, `create`, or `reduce`, it resolves to the **declared default variant** for that problem type. For example, `MIS` resolves to `MaximumIndependentSet/SimpleGraph/One`. - -If you mistype a problem name, `pred` will suggest the closest match: - -```text -{{#include generated/pred-show-typo.txt}} -``` +Next: [watch the full run](cli-demo.md), [inspect the path](cli-paths.md), or [save a reduction bundle](cli-reduce.md). diff --git a/docs/src/contributing.md b/docs/src/contributing.md new file mode 100644 index 000000000..1c7eaa2ae --- /dev/null +++ b/docs/src/contributing.md @@ -0,0 +1,15 @@ +# Contributing + +Propose a model or reduction through the [agent proposal workflow](agent-propose.md), or use the repository's [issue templates](https://github.com/CodingThrust/problem-reductions/issues/new/choose). + +For implementation, read [AGENTS.md](https://github.com/CodingThrust/problem-reductions/blob/main/AGENTS.md) and the canonical `.claude/CLAUDE.md` instructions. Model and rule skills describe required code, tests, examples, and mathematical documentation. + +## What a rule contributes + +A useful rule includes exact endpoint variants, a construction, solution or value extraction, a correctness argument, and overhead metadata. Closed-loop tests and independently checked examples provide concrete evidence alongside the proof. + +## Authorship and license + +The project's authorship policy adds contributors of 10 non-trivial reduction rules to the [paper](reductions.pdf). The software is MIT licensed. + +Next: [implement and review](agent-pipeline.md). diff --git a/docs/src/design-paths.md b/docs/src/design-paths.md new file mode 100644 index 000000000..101cde4c6 --- /dev/null +++ b/docs/src/design-paths.md @@ -0,0 +1,32 @@ +# Path costs and overhead + +`ReductionGraph` searches a directed graph of exact `(name, variant)` pairs. Registered reductions carry capabilities; natural variant connections reflect graph and weight subtype relations. + +## Choose a cost + +| Cost | Purpose | +|---|---| +| `MinimizeSteps` | Fewest reduction steps | +| `Minimize("field")` | Cost based on an output size field | +| `CustomCost(closure)` | User-defined edge cost from overhead and current size | + +`find_cheapest_path` accepts source/target variant maps, an input `ProblemSize`, and a cost function. `find_all_paths` enumerates simple paths. Use bounded enumeration when exploring a large graph. + +## Interpret an overhead + +```rust,ignore +#[reduction(overhead = { + num_vars = "num_vertices + num_edges", + num_clauses = "3 * num_edges", +})] +``` + +Expressions refer to getters on the source type. The macro validates those names at compile time. The metadata describes scaling bounds; it does not promise exact target counts for each input. + +For a concrete instance, inspect the constructed target. For a chain, `path_overheads` returns each edge's expressions and `compose_path_overhead` substitutes them to obtain an end-to-end bound. + +## Keep costs separate from solve time + +A shorter route can produce a harder target. Compare target sizes and solver measurements as well as hop counts; do not present symbolic overheads as measured runtime. + +Next: [execute a path](rust-paths.md) or [download the graph](reductions/reduction_graph.json). diff --git a/docs/src/design-problem.md b/docs/src/design-problem.md new file mode 100644 index 000000000..1e5b25ca3 --- /dev/null +++ b/docs/src/design-problem.md @@ -0,0 +1,23 @@ +# Problem contract + +Every problem implements `Problem`. The associated `Value` type is the per-configuration aggregate returned by `evaluate()`. Solvers fold these values across the configuration space, and witness-capable aggregates can also recover representative configurations. + +```rust,ignore +trait Problem { + const NAME: &'static str; // e.g., "MaximumIndependentSet" + type Value: Clone; // e.g., Max, Or, Sum + fn dims(&self) -> Vec; // config space per variable + fn evaluate(&self, config: &[usize]) -> Self::Value; + fn variant() -> Vec<(&'static str, &'static str)>; // e.g., [("graph", "SimpleGraph"), ("weight", "i32")] + fn num_variables(&self) -> usize; // default: dims().len() + fn problem_type() -> ProblemType; // default: registry lookup by NAME +} +``` + +- **`Problem`** — the base trait. Every problem declares a `NAME` (e.g., `"MaximumIndependentSet"`). The solver explores the configuration space defined by `dims()` and scores each configuration with `evaluate()`. For example, a 4-vertex MIS has `dims() = [2, 2, 2, 2]` (each vertex is selected or not); `evaluate(&[1, 0, 1, 0])` returns `Max(Some(2))` if vertices 0 and 2 form an independent set, or `Max(None)` if they share an edge. Each problem also provides inherent getter methods (e.g., `num_vertices()`, `num_edges()`) used by reduction overhead expressions. +- **Witness-capable objective problems** — typically use `Max`, `Min`, or `Extremum` as `Value`. +- **Witness-capable feasibility problems** — typically use `Or`. +- **Aggregate-only problems** — use fold values such as `Sum` or `And`; these solve to a value but do not admit representative witness configurations. +- **Common aggregate wrappers** — `Max`, `Min`, `Sum`, `Or`, `And`, `Extremum`, `ExtremumSense`. + +Next: [variant registration](design-variant-registration.md). diff --git a/docs/src/design-reductions.md b/docs/src/design-reductions.md new file mode 100644 index 000000000..4141a9757 --- /dev/null +++ b/docs/src/design-reductions.md @@ -0,0 +1,36 @@ +# Reduction contracts + +A reduction connects exact source and target variants. Its contract determines how a result can be recovered. + +| Capability | Contract | Example | +|---|---|---| +| Witness | `ReduceTo` and `ReductionResult::extract_solution` | Solve a target, recover a source configuration | +| Aggregate | `ReduceToAggregate` and `AggregateReductionResult::extract_value` | Solve a target value, recover a source value | +| Turing | Multiple target queries | Optimize by querying a decision problem at several bounds | + +Search defaults to witness mode. Use `ReductionMode::Aggregate` or `ReductionMode::Turing` for the corresponding graph queries; do not replay those edges as a single witness mapping. + +## Register a witness reduction + +```rust,ignore +#[reduction(overhead = { + num_vertices = "num_vertices", + num_edges = "num_edges", +})] +impl ReduceTo> + for MaximumIndependentSet +{ + // Provide Result and reduce_to(); the result owns the target + // and maps a vertex-cover witness to its independent-set complement. +} +``` + +This is a schematic declaration. Read a [complete implementation](https://github.com/CodingThrust/problem-reductions/blob/main/src/rules/maximumindependentset_minimumvertexcover.rs) for the result type and constructor. + +The attribute requires overhead metadata and registers witness/configuration reductions. Aggregate and Turing edges currently use manual `ReductionEntry` registration. Keep one primitive registration for each exact endpoint pair. + +## Check correctness + +Prove that the construction and extraction preserve the required result. For a small witness example, solve source and target independently, extract the target solution, and compare its source evaluation with the direct optimum. + +Next: [overhead semantics](design-paths.md) or [implementation workflow](agent-pipeline.md). diff --git a/docs/src/design-serialization.md b/docs/src/design-serialization.md new file mode 100644 index 000000000..53f314ca5 --- /dev/null +++ b/docs/src/design-serialization.md @@ -0,0 +1,14 @@ +# JSON serialization + +All problem types support JSON serialization via serde: + +```rust,ignore +use problemreductions::io::{to_json, from_json}; + +let json: String = to_json(&problem)?; +let restored: MaximumIndependentSet = from_json(&json)?; +``` + +These helpers serialize typed Rust problem data. The CLI additionally wraps data with `type` and `variant` for dynamic loading. Keep that wrapper when passing files between CLI commands. + +Next: [CLI JSON and automation](cli-automation.md). diff --git a/docs/src/design-variant-registration.md b/docs/src/design-variant-registration.md new file mode 100644 index 000000000..851429d43 --- /dev/null +++ b/docs/src/design-variant-registration.md @@ -0,0 +1,66 @@ +# Register variants + +## VariantParam trait + +Each variant parameter type implements `VariantParam`, which declares its category, value, and optional parent: + +```rust,ignore +pub trait VariantParam: 'static { + const CATEGORY: &'static str; // e.g., "graph", "weight", "k" + const VALUE: &'static str; // e.g., "SimpleGraph", "i32" + const PARENT_VALUE: Option<&'static str>; // None for root types +} +``` + +Types with a parent also implement `CastToParent`, providing the runtime conversion for variant casts: + +```rust,ignore +pub trait CastToParent: VariantParam { + type Parent: VariantParam; + fn cast_to_parent(&self) -> Self::Parent; +} +``` + +## Registration with `impl_variant_param!` + +The `impl_variant_param!` macro implements `VariantParam` (and optionally `CastToParent` / `KValue`) for a type: + +```rust,ignore +// Root type (no parent): +impl_variant_param!(SimpleGraph, "graph"); + +// K root (arbitrary K): +impl_variant_param!(KN, "k", k: None); + +// Specific K with parent: +impl_variant_param!(K3, "k", parent: KN, cast: |_| KN, k: Some(3)); +``` + +## Variant cast reductions with `impl_variant_reduction!` + +When a more specific variant needs to be treated as a less specific one, an explicit variant cast reduction is declared: + +```rust,ignore +impl_variant_reduction!( + MaximumIndependentSet, + => , + fields: [num_vertices, num_edges], + |src| MaximumIndependentSet::new( + src.graph().cast_to_parent(), src.weights().to_vec()) +); +``` + +## Composing `Problem::variant()` + +The `variant_params!` macro composes the `Problem::variant()` body from type parameter names: + +```rust,ignore +// MaximumIndependentSet +fn variant() -> Vec<(&'static str, &'static str)> { + crate::variant_params![G, W] + // e.g., MaximumIndependentSet + // -> vec![("graph", "UnitDiskGraph"), ("weight", "One")] +} +``` + +Use `declare_variants!` in the model file to register concrete types and their dynamic load/serialize/solve metadata. See existing models and the [repository instructions](https://github.com/CodingThrust/problem-reductions/blob/main/.claude/CLAUDE.md) for the current macro contract. diff --git a/docs/src/design-variants.md b/docs/src/design-variants.md new file mode 100644 index 000000000..d177566a3 --- /dev/null +++ b/docs/src/design-variants.md @@ -0,0 +1,33 @@ +# Variant system + +A single problem name like `MaximumIndependentSet` can have multiple **variants** — carrying weights on vertices, or defined on a restricted topology (e.g., king's subgraph). Variants form a subtype hierarchy: independent sets on king's subgraphs are a subset of independent sets on unit-disk graphs. The reduction from a more specific variant to a less specific one is a **variant cast** — an identity mapping where indices are preserved. + +
    + +![Variant Hierarchy](static/variant-hierarchy.svg) + +
    +
    + +![Variant Hierarchy](static/variant-hierarchy-dark.svg) + +
    + +Variant types fall into three categories: + +- **Graph type** — `SimpleGraph` (root), `PlanarGraph`, `BipartiteGraph`, `UnitDiskGraph`, `KingsSubgraph`, `TriangularSubgraph`. +- **Weight type** — `One` (unweighted), `i32`, `f64`. +- **K value** — e.g., `K3` for 3-SAT, `KN` for arbitrary K. + +
    + +![Lattices](static/lattices.svg) + +
    +
    + +![Lattices](static/lattices-dark.svg) + +
    + +Next: [register variants](design-variant-registration.md). diff --git a/docs/src/design.md b/docs/src/design.md index 7f709edfc..203d7e52c 100644 --- a/docs/src/design.md +++ b/docs/src/design.md @@ -1,10 +1,19 @@ -# Design +# Architecture -This guide covers the library internals for contributors. +The Rust library stores problem definitions, executable reductions, and their registry metadata. The CLI and MCP server expose that core to tools and agents. -## Module Architecture +| Location | Responsibility | +|---|---| +| `src/models/` | Models grouped by graph, formula, set, algebraic, or miscellaneous input | +| `src/rules/` | Reduction implementations and solution/value mappings | +| `src/registry/` | Concrete variant metadata and dynamic dispatch | +| `src/solvers/` | Exhaustive, ILP, specialized, and decision-search solvers | +| `problemreductions-cli/` | CLI and optional MCP server | +| `src/example_db/` | Canonical model and rule examples | +| `src/unit_tests/` | Tests mirroring the source tree | + +## Module map -
    @@ -23,317 +32,4 @@ This guide covers the library internals for contributors.
    -## Problem Model - -Every problem implements `Problem`. The associated `Value` type is the per-configuration aggregate returned by `evaluate()`. Solvers fold these values across the configuration space, and witness-capable aggregates can also recover representative configurations. - -```rust,ignore -trait Problem: Clone { - const NAME: &'static str; // e.g., "MaximumIndependentSet" - type Value: Clone; // e.g., Max, Or, Sum - fn dims(&self) -> Vec; // config space per variable - fn evaluate(&self, config: &[usize]) -> Self::Value; - fn variant() -> Vec<(&'static str, &'static str)>; // e.g., [("graph", "SimpleGraph"), ("weight", "i32")] - fn num_variables(&self) -> usize; // default: dims().len() - fn problem_type() -> ProblemType; // default: registry lookup by NAME -} -``` - -- **`Problem`** — the base trait. Every problem declares a `NAME` (e.g., `"MaximumIndependentSet"`). The solver explores the configuration space defined by `dims()` and scores each configuration with `evaluate()`. For example, a 4-vertex MIS has `dims() = [2, 2, 2, 2]` (each vertex is selected or not); `evaluate(&[1, 0, 1, 0])` returns `Max(Some(2))` if vertices 0 and 2 form an independent set, or `Max(None)` if they share an edge. Each problem also provides inherent getter methods (e.g., `num_vertices()`, `num_edges()`) used by reduction overhead expressions. -- **Witness-capable objective problems** — typically use `Max`, `Min`, or `Extremum` as `Value`. -- **Witness-capable feasibility problems** — typically use `Or`. -- **Aggregate-only problems** — use fold values such as `Sum` or `And`; these solve to a value but do not admit representative witness configurations. -- **Common aggregate wrappers** — `Max`, `Min`, `Sum`, `Or`, `And`, `Extremum`, `ExtremumSense`. - -## Variant System - -A single problem name like `MaximumIndependentSet` can have multiple **variants** — carrying weights on vertices, or defined on a restricted topology (e.g., king's subgraph). Variants form a subtype hierarchy: independent sets on king's subgraphs are a subset of independent sets on unit-disk graphs. The reduction from a more specific variant to a less specific one is a **variant cast** — an identity mapping where indices are preserved. - -
    - -![Variant Hierarchy](static/variant-hierarchy.svg) - -
    -
    - -![Variant Hierarchy](static/variant-hierarchy-dark.svg) - -
    - -Variant types fall into three categories: - -- **Graph type** — `SimpleGraph` (root), `PlanarGraph`, `BipartiteGraph`, `UnitDiskGraph`, `KingsSubgraph`, `TriangularSubgraph`. -- **Weight type** — `One` (unweighted), `i32`, `f64`. -- **K value** — e.g., `K3` for 3-SAT, `KN` for arbitrary K. - -
    - -![Lattices](static/lattices.svg) - -
    -
    - -![Lattices](static/lattices-dark.svg) - -
    - -
    -Implementation details: VariantParam trait and macros - -### VariantParam trait - -Each variant parameter type implements `VariantParam`, which declares its category, value, and optional parent: - -```rust,ignore -pub trait VariantParam: 'static { - const CATEGORY: &'static str; // e.g., "graph", "weight", "k" - const VALUE: &'static str; // e.g., "SimpleGraph", "i32" - const PARENT_VALUE: Option<&'static str>; // None for root types -} -``` - -Types with a parent also implement `CastToParent`, providing the runtime conversion for variant casts: - -```rust,ignore -pub trait CastToParent: VariantParam { - type Parent: VariantParam; - fn cast_to_parent(&self) -> Self::Parent; -} -``` - -### Registration with `impl_variant_param!` - -The `impl_variant_param!` macro implements `VariantParam` (and optionally `CastToParent` / `KValue`) for a type: - -```rust,ignore -// Root type (no parent): -impl_variant_param!(SimpleGraph, "graph"); - -// K root (arbitrary K): -impl_variant_param!(KN, "k", k: None); - -// Specific K with parent: -impl_variant_param!(K3, "k", parent: KN, cast: |_| KN, k: Some(3)); -``` - -### Variant cast reductions with `impl_variant_reduction!` - -When a more specific variant needs to be treated as a less specific one, an explicit variant cast reduction is declared: - -```rust,ignore -impl_variant_reduction!( - MaximumIndependentSet, - => , - fields: [num_vertices, num_edges], - |src| MaximumIndependentSet::new( - src.graph().cast_to_parent(), src.weights().to_vec()) -); -``` - -### Composing `Problem::variant()` - -The `variant_params!` macro composes the `Problem::variant()` body from type parameter names: - -```rust,ignore -// MaximumIndependentSet -fn variant() -> Vec<(&'static str, &'static str)> { - crate::variant_params![G, W] - // e.g., MaximumIndependentSet - // -> vec![("graph", "UnitDiskGraph"), ("weight", "One")] -} -``` - -
    - -## Reduction Rules - -A reduction requires two pieces: a **result struct** and a **`ReduceTo` impl**. - -The result struct holds the target problem and the logic to map solutions back: - -```rust,ignore -#[derive(Debug, Clone)] -pub struct ReductionISToVC { - target: MinimumVertexCover, -} - -impl ReductionResult for ReductionISToVC { - type Source = MaximumIndependentSet; - type Target = MinimumVertexCover; - - fn target_problem(&self) -> &Self::Target { &self.target } - fn extract_solution(&self, target_sol: &[usize]) -> Vec { - target_sol.iter().map(|&x| 1 - x).collect() // complement - } -} -``` - -The `#[reduction]` attribute on the `ReduceTo` impl registers the reduction in the global registry (via `inventory`): - -```rust,ignore -#[reduction(overhead = { - num_vertices = "num_vertices", - num_edges = "num_edges", -})] -impl ReduceTo> - for MaximumIndependentSet -{ - type Result = ReductionISToVC; - fn reduce_to(&self) -> Self::Result { /* ... */ } -} -``` - -
    -What the #[reduction] macro generates - -The `#[reduction]` attribute expands to the original `impl` block plus an `inventory::submit!` call: - -```rust,ignore -inventory::submit! { - ReductionEntry { - source_name: "MaximumIndependentSet", - target_name: "MinimumVertexCover", - source_variant_fn: || as Problem>::variant(), - target_variant_fn: || as Problem>::variant(), - overhead_fn: || ReductionOverhead { - output_size: vec![ - ("num_vertices", Expr::Var("num_vertices")), - ("num_edges", Expr::Var("num_edges")), - ], - }, - module_path: module_path!(), - reduce_fn: |src: &dyn Any| -> Box { - let src = src.downcast_ref::>().unwrap(); - Box::new(ReduceTo::>::reduce_to(src)) - }, - } -} -``` - -Each `ReductionEntry` is collected by `inventory` at link time and iterated at runtime, making every reduction discoverable by `ReductionGraph` without manual registration. The `reduce_fn` field provides a type-erased executor that enables dynamically discovered paths to chain reductions automatically. - -
    - -## Reduction Graph - -`ReductionGraph::new()` iterates all registered `ReductionEntry` items (via `inventory`) and builds a variant-level directed graph: - -- **Nodes** are unique `(problem_name, variant)` pairs — e.g., `("MaximumIndependentSet", {graph: "KingsSubgraph", weight: "i32"})`. -- **Edges** come exclusively from `#[reduction]` registrations — both cross-problem reductions and variant casts. There are no auto-generated edges. - -Exported files: - -- [reduction_graph.json](reductions/reduction_graph.json) — all problem variants and reduction edges -- [problem_schemas.json](reductions/problem_schemas.json) — field definitions for each problem type - -These JSON assets are generated during `make doc`, `make mdbook`, and `make paper`; they are build artifacts, not committed source files. -Generate them manually with `cargo run --example export_graph` and `cargo run --example export_schemas` when you need the raw exports locally. - -### Path finding - -All path-finding operates on **exact variant nodes**. Use `ReductionGraph::variant_to_map(&T::variant())` to convert a `Problem::variant()` into the required `BTreeMap`. - -| Method | Algorithm | Use case | -|--------|-----------|----------| -| `find_cheapest_path(src, src_var, dst, dst_var, input_size, cost_fn)` | Dijkstra | Optimal path under a cost function | -| `find_all_paths(src, src_var, dst, dst_var)` | All simple paths | Enumerate every route | - -Use `find_cheapest_path` with `MinimizeSteps` for fewest-hops search. - -The `PathCostFn` trait (used by `find_cheapest_path`) computes edge cost from overhead and current problem size: - -| Cost function | Strategy | -|--------------|----------| -| `MinimizeSteps` | Minimize number of hops (unit edge cost) | -| `Minimize("field")` | Minimize a single output field (e.g., `Minimize("num_variables")`) | -| `CustomCost(closure)` | User-defined: `\|overhead: &ReductionOverhead, size: &ProblemSize\| -> f64` | - -`CustomCost` wraps a closure that receives the edge's `ReductionOverhead` (polynomial mapping from input to output size fields) and the current `ProblemSize` (accumulated field values at that point in the path), and returns an `f64` edge cost. Dijkstra minimizes the total cost along the path. - -**Example:** Finding a path from `MIS{KingsSubgraph, i32}` to `VC{SimpleGraph, i32}`: - -``` -MIS{KingsSubgraph,i32} -> MIS{UnitDiskGraph,i32} -> MIS{SimpleGraph,i32} -> VC{SimpleGraph,i32} - variant cast variant cast reduction -``` - -### Executable paths - -Convert a `ReductionPath` into a typed `ExecutablePath` via `make_executable()`, then call `reduce()`: - -```rust,ignore -// find_cheapest_path returns a ReductionPath (list of variant node IDs) -let rpath = graph.find_cheapest_path("Factoring", &src_var, - "SpinGlass", &dst_var, &ProblemSize::new(vec![]), &MinimizeSteps).unwrap(); - -// make_executable converts it into a typed, callable chain -let path = graph.make_executable::>(&rpath).unwrap(); - -// reduce() applies each step, returning a ChainedReduction -let reduction = path.reduce(&factoring_instance); -let target: &SpinGlass = reduction.target_problem(); -let solution: Vec = reduction.extract_solution(&target_solution); -``` - -`ExecutablePath` holds a type-erased `ReduceFn` per edge. `reduce()` applies them sequentially, producing a `ChainedReduction` that stores each intermediate result. `extract_solution` maps the final solution back through the chain in reverse order. - -For full type control, you can also chain `ReduceTo::reduce_to()` calls manually at each step. - -
    -Overhead evaluation - -Each reduction declares how the output problem size relates to the input, expressed as symbolic `Expr` expressions. The `#[reduction]` macro parses overhead strings at compile time: - -```rust,ignore -#[reduction(overhead = { - num_vars = "num_vertices + num_edges", - num_clauses = "3 * num_edges", -})] -impl ReduceTo for Source { ... } -``` - -Expressions support: constants, variables, `+`, `*`, `^`, `exp()`, `log()`, `sqrt()`. Each problem type provides inherent getter methods (e.g., `num_vertices()`, `num_edges()`) that the overhead expressions reference. - -`evaluate_output_size(input)` substitutes input values: - -``` -Input: ProblemSize { num_vertices: 10, num_edges: 15 } -Output: ProblemSize { num_vars: 25, num_clauses: 45 } -``` - -For multi-step paths, overhead composes: the output of step N becomes the input of step N+1. Variant cast edges use `ReductionOverhead::identity()`, passing through all fields unchanged. - -
    - -## Solvers - -Solvers implement the `Solver` trait: - -```rust,ignore -pub trait Solver { - fn solve

    (&self, problem: &P) -> P::Value - where - P: Problem, - P::Value: Aggregate; -} -``` - -| Solver | Description | -|--------|-------------| -| **BruteForce** | Enumerates all configurations. `solve()` works for any aggregate problem; `find_witness()`, `find_all_witnesses()`, and `solve_with_witnesses()` are available when `P::Value` supports witnesses. Used for testing and verification. | -| **ILPSolver** | Enabled by default. Solves ILP instances directly with HiGHS via `good_lp`. Also provides `solve_reduced()` for witness-capable problems that implement `ReduceTo>`. | - -## JSON Serialization - -All problem types support JSON serialization via serde: - -```rust,ignore -use problemreductions::io::{to_json, from_json}; - -let json: String = to_json(&problem)?; -let restored: MaximumIndependentSet = from_json(&json)?; -``` - -## Contributing - -See [Call for Contributions](./introduction.md#call-for-contributions) for the recommended issue-based workflow (no coding required). +Read the [problem contract](design-problem.md), [reduction contracts](design-reductions.md), and [variant system](design-variants.md) before extending the library. diff --git a/docs/src/getting-started.md b/docs/src/getting-started.md index 5afc10916..06f077157 100644 --- a/docs/src/getting-started.md +++ b/docs/src/getting-started.md @@ -1,206 +1,28 @@ -# Getting Started +# First Rust program -## What This Library Does - -**problem-reductions** transforms hard computational problems into forms that efficient solvers can handle. You define a problem, reduce it to another problem type (like QUBO or ILP), solve the reduced problem, and extract the solution back. The [interactive reduction graph](./introduction.html) shows all available problem types and transformations. - -## Installation +Add the library to a Rust project: ```bash cargo add problemreductions ``` -## The Reduction Workflow - -The core workflow is: **create** a problem, **reduce** it to a target, **solve** the target, and **extract** the solution back. - -

    - -![Reduction Workflow](static/reduction-workflow.svg) - -
    -
    - -![Reduction Workflow](static/reduction-workflow-dark.svg) - -
    - -### Example 1: Direct reduction — Set Packing to ILP +## Solve a small set-packing instance -Reduce Maximum Set Packing to Integer Linear Programming (ILP), solve with the -ILP solver, and extract the solution back. - -#### Step 1 — Create the source problem - -A small set system with pairwise overlaps gives a direct binary ILP. - -```rust,ignore +```rust use problemreductions::prelude::*; -use problemreductions::models::algebraic::ILP; -use problemreductions::solvers::ILPSolver; - -let problem = MaximumSetPacking::::new(vec![ - vec![0, 1], - vec![1, 2], - vec![2, 3], - vec![4, 5], -]); -``` - -#### Step 2 — Reduce to ILP - -`ReduceTo` applies a single-step reduction. The result holds the target -problem and knows how to map solutions back. The ILP formulation introduces -binary variable x_i for each set, constraint x_i + x_j ≤ 1 for each -overlapping pair, and maximizes the weighted sum. - -```rust,ignore -let reduction = ReduceTo::::reduce_to(&problem); -let ilp = reduction.target_problem(); -println!("ILP: {} variables, {} constraints", ilp.num_vars, ilp.constraints.len()); -``` - -```text -ILP: 4 variables, 2 constraints -``` - -#### Step 3 — Solve the ILP - -`ILPSolver` uses the HiGHS solver to find optimal solutions efficiently. -For small instances you can also use `BruteForce`, but `ILPSolver` scales -to much larger problems. - -```rust,ignore -let solver = ILPSolver::new(); -let ilp_solution = solver.solve(ilp).unwrap(); -println!("ILP solution: {:?}", ilp_solution); -``` - -```text -ILP solution: [1, 0, 1, 0] -``` - -#### Step 4 — Extract and verify - -`extract_solution` maps the ILP solution back to the original problem's -configuration space. - -```rust,ignore -let solution = reduction.extract_solution(&ilp_solution); -let metric = problem.evaluate(&solution); -println!("Packing solution: {:?} -> size {}", solution, metric); -assert!(metric.is_valid()); -``` - -```text -Packing solution: [1, 0, 1, 1] -> size Max(3) -``` - -For convenience, `ILPSolver::solve_reduced` combines reduce + solve + extract -in a single call: - -```rust,ignore -let solution = ILPSolver::new().solve_reduced(&problem).unwrap(); -assert!(problem.evaluate(&solution).is_valid()); -``` - -### Example 2: Reduction path search — integer factoring to spin glass -Real-world problems often require **chaining** multiple reductions. Here we factor the integer 6 by reducing `Factoring` through the reduction graph to `SpinGlass`, through automatic reduction path search. ([full source](https://github.com/CodingThrust/problem-reductions/blob/main/examples/chained_reduction_factoring_to_spinglass.rs)) - -Let's walk through each step. - -#### Step 1 — Discover the reduction path - -`ReductionGraph` holds every registered reduction. `find_cheapest_path` -searches for the shortest chain from a source problem variant to a target -variant. - -```rust,ignore -{{#include ../../examples/chained_reduction_factoring_to_spinglass.rs:step1}} -``` - -```text -{{#include generated/factoring-path.txt}} -``` - -#### Step 2 — Create the Factoring problem - -`Factoring::new(m, n, target)` creates a factoring instance: find two factors -`p` (m-bit) and `q` (n-bit) such that `p × q = target`. Here we factor **6** -with two 2-bit factors, expecting **2 × 3** or **3 × 2**. - -```rust,ignore -{{#include ../../examples/chained_reduction_factoring_to_spinglass.rs:step2}} -``` - -#### Step 3 — Solve with ILPSolver - -`solve_reduced` reduces the problem to ILP internally and solves it in one -call. It returns a configuration vector for the original problem — no manual -extraction needed. For small instances you can also use `BruteForce`, but -`ILPSolver` scales to much larger problems. - -```rust,ignore -{{#include ../../examples/chained_reduction_factoring_to_spinglass.rs:step3}} -``` - -#### Step 4 — Read and verify the factors - -`read_factors` decodes the binary configuration back into the two integer -factors. - -```rust,ignore -{{#include ../../examples/chained_reduction_factoring_to_spinglass.rs:step4}} +fn main() { + let problem = MaximumSetPacking::::new(vec![ + vec![0, 1], vec![1, 2], vec![2, 3], vec![4, 5], + ]); + let solver = BruteForce::new(); + let solution = solver.find_witness(&problem).unwrap(); + println!("{:?}: {}", solution, problem.evaluate(&solution)); +} ``` -```text -{{#include generated/factoring-result.txt}} -``` - -#### Step 5 — Inspect the overhead - -Each reduction edge carries a polynomial overhead mapping source problem -sizes to target sizes. `path_overheads` returns the per-edge -polynomials, and `compose_path_overhead` composes them symbolically into a -single end-to-end formula. - -```rust,ignore -{{#include ../../examples/chained_reduction_factoring_to_spinglass.rs:overhead}} -``` - -```text -{{#include generated/factoring-overhead.txt}} -``` - -## Solvers - -Three solvers are available: - -| Solver | Use Case | Notes | -|--------|----------|-------| -| [`BruteForce`](api/problemreductions/solvers/struct.BruteForce.html) | Small instances (<20 variables) | Enumerates all configurations | -| [`ILPSolver`](api/problemreductions/solvers/ilp/struct.ILPSolver.html) | Larger instances | Enabled by default (`ilp` feature) | -| [`CustomizedSolver`](api/problemreductions/solvers/customized/struct.CustomizedSolver.html) | Structure-exploiting | Uses problem-specific exact algorithms | - -ILP support is enabled by default. To disable it: - -```bash -cargo add problemreductions --no-default-features -``` - -## JSON Resources - -The library exports machine-readable metadata useful for tooling and research: - -These files are generated when you build the docs locally. -- [reduction_graph.json](reductions/reduction_graph.json) lists all problem variants and reduction edges -- [problem_schemas.json](reductions/problem_schemas.json) lists field definitions for each problem type - +The optimal packing selects sets 0, 2, and 3 and evaluates to `Max(3)`. The witness vector is `[1,0,1,1]`. -## Next Steps +`Problem::evaluate` checks a configuration; `BruteForce` enumerates the configuration space to find an optimum. Keep exhaustive examples small. -- Try the [CLI tool](./cli.md) to explore problems and reduction paths from your terminal -- Explore the [interactive reduction graph](./introduction.html) to discover available reductions -- Read the [Design](./design.md) guide for implementation details -- Browse the [API Reference](./api.html) for full documentation +Next: [apply an ILP reduction](rust-reduction.md) or [read solver contracts](rust-solvers.md). diff --git a/docs/src/install.md b/docs/src/install.md new file mode 100644 index 000000000..11db6abd4 --- /dev/null +++ b/docs/src/install.md @@ -0,0 +1,29 @@ +# Install the CLI + +The `pred` executable explores models and reductions, creates instances, and runs solvers. + +## Install a release + +```bash +cargo install problemreductions-cli +pred --version +``` + +Rust and a native build toolchain are required. The default solver backend is HiGHS. + +## Build the current repository + +```bash +git clone https://github.com/CodingThrust/problem-reductions +cd problem-reductions +cargo install --path problemreductions-cli +pred --version +``` + +The website catalog is built from the repository. A published crate may have fewer models or rules; use the source build when reproducing current catalog entries. + +## Optional features + +For the MCP server, install with `--features mcp`. The CLI also exposes `cplex` and `lp-solvers` for separately installed solver backends; consult the [CLI manifest](https://github.com/CodingThrust/problem-reductions/blob/main/problemreductions-cli/Cargo.toml) before configuring one. + +Next: [first solve](cli.md) or [connect with MCP](mcp.md). diff --git a/docs/src/introduction.md b/docs/src/introduction.md index c38db6d23..85eee55a6 100644 --- a/docs/src/introduction.md +++ b/docs/src/introduction.md @@ -1,83 +1,29 @@ -# Problem Reductions +# Documentation -**problem-reductions** provides executable definitions of computationally hard problems and reduction rules between them. The library is the foundation for an autonomous research infrastructure: a system in which AI agents investigate useful connections, challenge candidate constructions, and expand a reusable atlas of computational knowledge. +Use executable reductions to connect a hard problem to a solver. Explore the catalog, transform an instance, and check the recovered solution. These guides are organized around small tasks for agents and their operators. -[Explore the research website and problem atlas →](./index.html) +## See what works -## Reduction Graph +[Watch the CLI solve a graph problem →](cli-demo.md) - +A real terminal run: discover a route, reduce to ILP, recover an independent set, and cross-check the optimum. Six commands, about half a minute. - -
    -
    -
    - Graph - Formula - Set - Algebraic - Misc - Variant Cast -
    -
    - Click a node to start path selection - - -
    -
    -
    - Click a problem node to expand/collapse its variants. - Click a variant to filter its edges. - Click two nodes to find a reduction path. - Double-click for API docs (nodes) or source code (edges). - Scroll to zoom, drag to pan. -
    -
    +## Choose a task -You can also explore this graph from the terminal with the [CLI tool](./cli.md). For theoretical background and correctness proofs, see the [PDF manual](https://codingthrust.github.io/problem-reductions/reductions.pdf). +| You have… | Start here | You get… | +|---|---|---| +| A problem to solve | [Find a solver](agent-find-solver.md) | A model, reduction route, and solver recommendation | +| A solver to reuse | [Extend its reach](agent-find-problem.md) | Reachable source problems and size overheads | +| A candidate connection | [Propose a model or rule](agent-propose.md) | A precise research proposal | +| An approved issue | [Implement and review](agent-pipeline.md) | A tested implementation for review | +| An instance to run | [First solve](cli.md) | A solution checked against the original problem | -## Our Vision +## Give an agent the right context -Computational complexity theory has produced a rich body of polynomial-time reductions between NP-hard problems, yet these results largely remain confined to papers. The gap between theoretical algorithms and working software leads to two persistent inefficiencies: +Start with [agent setup](skills.md). Every page has a **Markdown** link for direct reading; the [Markdown index](markdown/index.md) lists all tasks. Use [JSON exports](cli-automation.md) for registry data and [MCP](mcp.md) for tool access. -- **Solver underutilization.** State-of-the-art solvers (SAT solvers, ILP solvers, QUBO annealers) each target a single problem formulation. In principle, any problem reducible to that formulation can leverage the same solver — but without a systematic reduction library, practitioners must re-derive and re-implement each transformation. -- **Redundant effort.** Problems that are polynomial-time equivalent are, from a computational standpoint, interchangeable. Without infrastructure connecting them, the same algorithmic insights are independently reimplemented across domains. +## Research scope -Our goal is to build a comprehensive, machine-readable reduction graph: a directed graph in which every node is a computational problem and every edge is a verified polynomial-time reduction. Given such a graph, one can automatically compose reduction paths to route any source problem to any reachable target solver. +The long-term goal is autonomous discovery of new reduction rules. Today, this repository provides executable models, registered reductions, solver routing, and agent workflows for proposals, implementation, and review. A candidate rule needs a mathematical argument as well as tests; passing finite examples does not establish a general proof. -A key enabler is AI-assisted implementation. We propose a pipeline of `algorithm → paper → software`, in which AI agents translate published reduction proofs into tested code. For witness-capable reductions, a **closed-loop test** reduces a source instance to a target, solves the target, extracts the solution back, and checks it against a direct solve of the source. These tests provide evidence about finite instances; a general correctness claim still requires a mathematical proof. Aggregate and Turing reductions have their own contracts and require corresponding checks. - -
    - -![](static/workflow-loop.svg) - -
    -
    - -![](static/workflow-loop-dark.svg) - -
    - -This library is the foundation of that effort: an open-source, extensible reduction graph with verified implementations, designed for contributions from both human researchers and AI agents. - -## Call for Contributions - -> **No programming experience required.** You contribute domain knowledge — we handle the implementation. - -### How it works - -1. **File an issue** — use the [Problem](https://github.com/CodingThrust/problem-reductions/issues/new?template=problem.md) or [Rule](https://github.com/CodingThrust/problem-reductions/issues/new?template=rule.md) template. Describe the problem or reduction you have in mind; the template guides you through the details. -2. **We implement it** — for reasonable requests, maintainers tag the issue `implement` and AI agents generate a tested implementation. -3. **We present it to you** — all issue contributors are invited to community calls (via [Zulip](https://problem-reductions.zulipchat.com/)), where maintainers walk through the implementation — documentation, CLI behavior, correctness — and you provide feedback. - -### Authorship - -Contribute 10 non-trivial reduction rules and you'll be added to the author list of the [paper](https://codingthrust.github.io/problem-reductions/reductions.pdf). - -For manual implementation, see the [Design](./design.md#contributing) guide. - -## License - -MIT License +[Explore the atlas](index.html#atlas) · [Read the mathematical manual](reductions.pdf) · [Browse the Rust API](api.md) diff --git a/docs/src/mcp-tools.md b/docs/src/mcp-tools.md new file mode 100644 index 000000000..a61dd8044 --- /dev/null +++ b/docs/src/mcp-tools.md @@ -0,0 +1,31 @@ +# MCP tool reference + +[Connect the server](mcp.md), then use its advertised tool schemas as the runtime contract. Tools return JSON strings; pass the returned instance or bundle as `problem_json` to the next operation. + +## Graph queries + +| Tool | Parameters | Description | +|------|-----------|-------------| +| `list_problems` | *(none)* | List all registered problem types with aliases, variant counts, and reduction counts | +| `show_problem` | `problem` (string) | Show details for a problem type: variants, size fields, schema, and incoming/outgoing reductions | +| `neighbors` | `problem` (string), `hops` (int, default: 1), `direction` ("out"\|"in"\|"both", default: "out") | Find neighboring problems reachable via reduction edges within a given hop distance | +| `find_path` | `source` (string), `target` (string), `cost` (string, default: "minimize-steps"), `all` (bool, default: false), `max_paths` (int, default: 20) | Find a reduction path between two problems, optionally minimizing a size field or returning all paths | +| `export_graph` | *(none)* | Export the full reduction graph as JSON (nodes, edges, overheads) | + +## Instances + +| Tool | Parameters | Description | +|------|-----------|-------------| +| `create_problem` | `problem_type` (string), `params` (JSON object) | Create a problem instance from parameters and return its JSON representation. Supports graph problems, SAT, QUBO, SpinGlass, KColoring, Factoring, and random graph generation | +| `inspect_problem` | `problem_json` (string) | Inspect a problem JSON or reduction bundle: returns type, size metrics, available solvers, and reduction targets | +| `evaluate` | `problem_json` (string), `config` (array of int) | Evaluate a configuration against a problem instance and return the objective value or feasibility | +| `reduce` | `problem_json` (string), `target` (string) | Reduce a problem instance to a target type, returning a reduction bundle with the transformed instance and path metadata | +| `solve` | `problem_json` (string), `solver` ("ilp"\|"brute-force"\|"customized", default: "ilp"), `timeout` (int, default: 0) | Solve a problem instance or reduction bundle using the chosen backend, with optional timeout | + +## Prompt templates + +The server also advertises `what_is`, `model_my_problem`, `compare`, `reduce`, `solve`, `find_reduction`, and `overview`. Inspect each prompt’s declared arguments in your MCP client. + +Creation supports selected models and uses MCP parameter names such as `edges`; CLI creation flags are a separate interface. For models outside MCP creation support, create JSON with the CLI and pass it to the instance tools. + +Next: [example session](mcp-walkthrough.md). diff --git a/docs/src/mcp-walkthrough.md b/docs/src/mcp-walkthrough.md new file mode 100644 index 000000000..b1ff2d747 --- /dev/null +++ b/docs/src/mcp-walkthrough.md @@ -0,0 +1,30 @@ +# MCP example session + +**Before you start:** [connect the server](mcp.md). This is a reproducible task specification; the [CLI recording](cli-demo.md) shows a real execution of the corresponding workflow. + +## Ask the agent + +```text +Create Maximum Independent Set on the cycle with edges +0-1, 1-2, 2-3, 3-4, 4-0. Discover a route to ILP, reduce and solve it. +Evaluate the recovered source configuration on the original instance. +Cross-check the optimum with brute force and report both evaluations. +``` + +## Expected tool sequence + +| Tool | Key input | +|---|---| +| `show_problem` | `problem: "MIS"` | +| `find_path` | `source: "MIS", target: "ILP"` | +| `create_problem` | `problem_type: "MIS", params: {"edges": "0-1,1-2,2-3,3-4,4-0"}` | +| `reduce` | Original problem JSON, `target: "ILP"` | +| `solve` | Reduction bundle JSON, `solver: "ilp"` | +| `evaluate` | Original problem JSON, recovered `config` | +| `solve` | Original problem JSON, `solver: "brute-force"` | + +## Check the result + +The maximum independent set has size 2. Both solves and the source evaluation should return `Max(2)`. Valid witnesses include `[1,0,1,0,0]` and `[0,0,1,0,1]`. + +Retain the original JSON for evaluation. Passing only the transformed target loses the context required to check the original problem. diff --git a/docs/src/mcp.md b/docs/src/mcp.md index 05913595c..d7adec2d2 100644 --- a/docs/src/mcp.md +++ b/docs/src/mcp.md @@ -1,107 +1,31 @@ -# MCP Server +# Connect with MCP -The [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) is an open standard that allows AI assistants to interact with external tools and data sources. The `pred` CLI includes a built-in MCP server that exposes the full reduction graph, problem creation, solving, and reduction capabilities to any MCP-compatible AI assistant. +`pred mcp` exposes catalog queries, instance creation, reductions, and solving over a local stdio MCP server. -## Setup - -Install the `pred` CLI, then configure your AI assistant: +## Install with MCP support ```bash -cargo install problemreductions-cli +cargo install problemreductions-cli --features mcp +pred mcp --help ``` -**Claude Code:** - -```bash -claude mcp add --scope user problemreductions -- pred mcp -``` +For the current checkout, use `cargo install --path problemreductions-cli --features mcp`. MCP is an optional feature and is not included in the default CLI install. -**Cursor / Windsurf** — add to `.cursor/mcp.json` or `~/.codeium/windsurf/mcp_config.json`: - -```json -{ "mcpServers": { "problemreductions": { "command": "pred", "args": ["mcp"] } } } -``` +## Configure your client -**OpenCode** — add to `opencode.json`: +Register a local stdio server with executable `pred` and argument `mcp`. Clients using an `mcpServers` configuration accept this shape: ```json -{ "mcp": { "problemreductions": { "type": "local", "command": ["pred", "mcp"] } } } +{ + "mcpServers": { + "problemreductions": { + "command": "pred", + "args": ["mcp"] + } + } +} ``` -Restart your AI assistant after configuration. - -## Walkthrough - -A complete Claude Code session showing how the AI assistant uses MCP tools behind the scenes to answer your questions. - -**You:** Create a weighted MIS problem on a 4-vertex graph with edges 0-1, 1-2, 2-3, 3-0, 0-2 and weights [1, 2, 3, 4], explain the result. - -> **Assistant:** I created a Maximum Independent Set instance on a SimpleGraph with 4 vertices, 5 edges, and integer weights [1, 2, 3, 4]. Each vertex has a weight, and the goal is to find a subset of non-adjacent vertices that maximizes total weight. - -**You:** What can I do with this problem? Explain the result. - -> **Assistant:** This instance has 4 binary variables (one per vertex). It can be reduced to 5 other problem types: ILP, MaximumSetPacking, MinimumVertexCover, QUBO, and other MIS variants. You can solve it directly using either an ILP solver or brute-force search. - -**You:** Check if selecting vertices 1 and 3 is a valid solution, explain the result. - -> **Assistant:** Yes! Selecting vertices 1 and 3 (configuration [0,1,0,1]) is a valid independent set — these two vertices are not adjacent. The total weight is 2 + 4 = 6. - -**You:** Reduce this to QUBO, explain the result. - -> **Assistant:** Done. The MIS instance was transformed into a 4x4 QUBO matrix: -> -> ``` -> [-1.0, 11.0, 11.0, 11.0] -> [ 0.0, -2.0, 11.0, 0.0] -> [ 0.0, 0.0, -3.0, 11.0] -> [ 0.0, 0.0, 0.0, -4.0] -> ``` -> -> The diagonal entries (-1, -2, -3, -4) encode vertex weights negated for minimization. The off-diagonal entries (11.0) are large penalties on edges — selecting two adjacent vertices would incur a penalty that outweighs any benefit. The reduction path is: MaximumIndependentSet → MaximumSetPacking → QUBO. - -**You:** Now solve it through the reduction, explain the result. - -> **Assistant:** The ILP solver found the optimal solution by solving the QUBO, then mapping the result back to the original MIS: -> -> - **QUBO solution:** [0,1,0,1] with objective -6.0 (minimization) -> - **MIS solution:** vertices {1, 3} with weight **6** (maximization) -> -> The QUBO objective of -6.0 corresponds to the MIS maximum of 6 — the reduction correctly inverts the sign. This confirms that {1, 3} is the optimal independent set. - -## Available Tools - -The MCP server provides 10 tools organized into two categories: **graph query tools** for exploring the reduction graph, and **instance tools** for working with concrete problem instances. - -### Graph Query Tools - -| Tool | Parameters | Description | -|------|-----------|-------------| -| `list_problems` | *(none)* | List all registered problem types with aliases, variant counts, and reduction counts | -| `show_problem` | `problem` (string) | Show details for a problem type: variants, size fields, schema, and incoming/outgoing reductions | -| `neighbors` | `problem` (string), `hops` (int, default: 1), `direction` ("out"\|"in"\|"both", default: "out") | Find neighboring problems reachable via reduction edges within a given hop distance | -| `find_path` | `source` (string), `target` (string), `cost` (string, default: "minimize-steps"), `all` (bool, default: false) | Find a reduction path between two problems, optionally minimizing a size field or returning all paths | -| `export_graph` | *(none)* | Export the full reduction graph as JSON (nodes, edges, overheads) | - -### Instance Tools - -| Tool | Parameters | Description | -|------|-----------|-------------| -| `create_problem` | `problem_type` (string), `params` (JSON object) | Create a problem instance from parameters and return its JSON representation. Supports graph problems, SAT, QUBO, SpinGlass, KColoring, Factoring, and random graph generation | -| `inspect_problem` | `problem_json` (string) | Inspect a problem JSON or reduction bundle: returns type, size metrics, available solvers, and reduction targets | -| `evaluate` | `problem_json` (string), `config` (array of int) | Evaluate a configuration against a problem instance and return the objective value or feasibility | -| `reduce` | `problem_json` (string), `target` (string) | Reduce a problem instance to a target type, returning a reduction bundle with the transformed instance and path metadata | -| `solve` | `problem_json` (string), `solver` ("ilp"\|"brute-force", default: "ilp"), `timeout` (int, default: 0) | Solve a problem instance or reduction bundle using ILP or brute-force, with optional timeout | - -## Available Prompts - -The server provides 7 task-oriented prompt templates: +Ensure the client can resolve `pred` on its `PATH`, or supply the executable's absolute path. Reload the client and request the server's tool list to verify the connection. -| Prompt | Arguments | Description | -|--------|-----------|-------------| -| `what_is` | `problem_type` (required) | Explain a problem type | -| `model_my_problem` | `description` (required) | Map a real-world problem to an NP-hard type | -| `compare` | `problem_a` (required), `problem_b` (required) | Compare two problem types | -| `reduce` | `source` (required), `target` (required) | Step-by-step reduction walkthrough | -| `solve` | `problem_type` (required), `params` (required) | Create and solve a problem instance | -| `find_reduction` | `source` (required), `target` (required) | Find the best reduction path between two problems | -| `overview` | *(none)* | Explore the full landscape of NP-hard problems | +Next: [tool reference](mcp-tools.md) or [example session](mcp-walkthrough.md). diff --git a/docs/src/reduction-graph.md b/docs/src/reduction-graph.md new file mode 100644 index 000000000..8af87ecad --- /dev/null +++ b/docs/src/reduction-graph.md @@ -0,0 +1,35 @@ +# Reduction graph + + + + +
    +
    +
    + Graph + Formula + Set + Algebraic + Misc + Variant Cast +
    +
    + Click a node to start path selection + + +
    +
    +
    + Click a problem node to expand/collapse its variants. + Click a variant to filter its edges. + Click two nodes to find a reduction path. + Double-click for API docs (nodes) or source code (edges). + Scroll to zoom, drag to pan. +
    +
    + +You can also explore this graph from the terminal with the [CLI tool](./cli.md). For theoretical background and correctness proofs, see the [PDF manual](https://codingthrust.github.io/problem-reductions/reductions.pdf). + +For exact variants and structured output, use [CLI path queries](cli-paths.md). diff --git a/docs/src/rust-paths.md b/docs/src/rust-paths.md new file mode 100644 index 000000000..3812533b8 --- /dev/null +++ b/docs/src/rust-paths.md @@ -0,0 +1,35 @@ +# Discover and execute paths + +Search uses exact variants. This example discovers a witness-capable route from `Factoring` to `SpinGlass`. + +```rust,ignore +use problemreductions::prelude::*; +use problemreductions::rules::{MinimizeSteps, ReductionGraph}; +use problemreductions::topology::SimpleGraph; +use problemreductions::types::ProblemSize; +{{#include ../../examples/chained_reduction_factoring_to_spinglass.rs:step1}} +``` + +## Execute the route + +```rust,ignore +let factoring = Factoring::new(2, 2, 6); +let reduction = graph + .reduce_along_path(&rpath, &factoring) + .unwrap(); +let target: &SpinGlass = reduction.target_problem(); +// Solve `target` with a compatible solver, then recover source bits: +// let source_config = reduction.extract_solution(&target_config); +``` + +`extract_solution` walks the intermediate mappings in reverse. A discovered path establishes a registered transformation, not an efficient target solve. + +The [runnable factoring example](https://github.com/CodingThrust/problem-reductions/blob/main/examples/chained_reduction_factoring_to_spinglass.rs) discovers the SpinGlass route, then separately solves factoring through a direct integer ILP reduction. Run it with: + +```bash +cargo run --example chained_reduction_factoring_to_spinglass +``` + +It checks that the recovered factors multiply to 6 and prints composed overheads. + +Next: [path costs and overhead](design-paths.md). diff --git a/docs/src/rust-reduction.md b/docs/src/rust-reduction.md new file mode 100644 index 000000000..4a4d56472 --- /dev/null +++ b/docs/src/rust-reduction.md @@ -0,0 +1,30 @@ +# Apply a reduction + +Reduce Maximum Set Packing to binary ILP, solve the target, and recover the original configuration. The default library features include the HiGHS backend. + +```rust +use problemreductions::prelude::*; +use problemreductions::models::algebraic::ILP; +use problemreductions::solvers::ILPSolver; + +fn main() { + let problem = MaximumSetPacking::::new(vec![ + vec![0, 1], vec![1, 2], vec![2, 3], vec![4, 5], + ]); + let reduction = ReduceTo::>::reduce_to(&problem); + let target = reduction.target_problem(); + assert_eq!(target.num_vars(), 4); + assert_eq!(target.num_constraints(), 2); + + let target_solution = ILPSolver::new().solve(target).unwrap(); + let solution = reduction.extract_solution(&target_solution); + assert_eq!(solution, vec![1, 0, 1, 1]); + println!("{}", problem.evaluate(&solution)); // Max(3) +} +``` + +The target has one binary variable per set and excludes overlapping pairs. `extract_solution` maps a target witness to the source configuration space. + +For types implementing `ReduceTo>`, `ILPSolver::new().solve_reduced(&problem)` combines these steps. It returns an optional source configuration; evaluate it against the original problem. + +Next: [discover a multi-step path](rust-paths.md). diff --git a/docs/src/rust-solvers.md b/docs/src/rust-solvers.md new file mode 100644 index 000000000..1a2a62263 --- /dev/null +++ b/docs/src/rust-solvers.md @@ -0,0 +1,27 @@ +# Solver contracts + +Choose a solver by its input and result contract. + +| API | Result | Scope | +|---|---|---| +| `Solver::solve` with `BruteForce` | Aggregate value | Any problem whose value implements `Aggregate` | +| `BruteForce::find_witness` | Optional configuration | Values supporting representative witnesses | +| `ILPSolver::solve` | Optional ILP configuration | ILP instances; requires an ILP backend | +| `ILPSolver::solve_reduced` | Optional source configuration | Witness-capable problems implementing `ReduceTo>` | +| `CustomizedSolver` | Model-specific exact solving | Selected models with specialized implementations | + +The aggregate `Solver::solve` contract differs from the inherent witness-returning ILP methods. Counting and other aggregate-only problems need a value, not a representative configuration. + +## Feature selection + +HiGHS is enabled by default through `ilp-highs`. To use the library without it: + +```bash +cargo add problemreductions --no-default-features +``` + +See the [solver API](api/problemreductions/solvers/index.html) for exact method signatures and supported specialized backends. + +## Verification + +For witness results, evaluate the recovered configuration against the source. For aggregate results, compare values according to the reduction's extraction contract. Use small exhaustive solves as independent checks. diff --git a/docs/src/skills.md b/docs/src/skills.md index 98b26fee2..d382df1c4 100644 --- a/docs/src/skills.md +++ b/docs/src/skills.md @@ -1,19 +1,30 @@ -# AI Agent Skills +# Start with an agent -AI coding assistants ([Claude Code](https://claude.ai/claude-code), [OpenCode](https://github.com/opencode-ai/opencode), [Codex](https://github.com/openai/codex)) can call `pred` CLI commands directly and use interactive skills to work with the reduction graph. +An agent can use the CLI directly from a repository checkout. Skills supply the task procedure; the CLI supplies current model and reduction data. -## Quick Start - -Paste into Claude Code or Codex: +## Prepare the workspace +```bash +git clone https://github.com/CodingThrust/problem-reductions +cd problem-reductions +make cli ``` -1. Clone https://github.com/CodingThrust/problem-reductions, -2. Build the pred CLI with `make cli` in the root directory, -3.1 Run `/find-solver` skill to help me find a solver for my scheduling problem. -3.2 Run `/find-problem` skill to help me find problems that my QUBO solver can solve. -3.3 Run `/propose` skill to help me propose a new problem or reduction to the project. + +This installs `pred` into Cargo’s binary directory (usually `~/.cargo/bin`). Confirm it is on your shell’s `PATH` with `pred --version`. + +## Give the agent this context + +```text +Work in this repository. Read AGENTS.md and .claude/CLAUDE.md. +Use the built pred CLI to inspect current models, variants, and paths. +Read the SKILL.md for the task before following its workflow. +Report the exact model variant, commands, results, and unresolved assumptions. ``` -The prompt 3.1 is for users who have a real-world problem and need help finding a solver for it. -The prompt 3.2 is for users who have a solver and need help finding problems that it can solve. -The prompt 3.3 is for contributors who want to propose a new problem or reduction rule to the project. \ No newline at end of file +Then choose [find a solver](agent-find-solver.md), [extend a solver's reach](agent-find-problem.md), or [propose a rule](agent-propose.md). + +## Read without a browser + +Use the [Markdown index](markdown/index.md) to retrieve only the relevant task pages. Code includes are expanded in those files. The [graph and schemas](cli-automation.md#registry-exports) provide structured data. + +An agent with MCP support can instead [connect to `pred mcp`](mcp.md). Repository skills still require access to the checkout. diff --git a/docs/src/static/asciinema-player-LICENSE b/docs/src/static/asciinema-player-LICENSE new file mode 100644 index 000000000..15258081e --- /dev/null +++ b/docs/src/static/asciinema-player-LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2011-2021 Marcin Kulik + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/docs/src/static/cli-demo.cast b/docs/src/static/cli-demo.cast new file mode 100644 index 000000000..cd9afb3e8 --- /dev/null +++ b/docs/src/static/cli-demo.cast @@ -0,0 +1,267 @@ +{"version": 2, "width": 88, "height": 22, "title": "From a graph to a verified solution", "env": {"TERM": "xterm-256color", "SHELL": "/bin/bash"}} +[0.0, "o", "\u001b[90m# Discover a route to an available solver\u001b[0m\r\n"] +[0.45, "o", "$ "] +[0.75, "o", "."] +[0.798061, "o", "/"] +[0.831401, "o", "p"] +[0.852611, "o", "r"] +[0.899118, "o", "e"] +[0.946418, "o", "d"] +[0.98372, "o", " "] +[1.023524, "o", "p"] +[1.046874, "o", "a"] +[1.089336, "o", "t"] +[1.116966, "o", "h"] +[1.138829, "o", " "] +[1.181915, "o", "M"] +[1.212605, "o", "I"] +[1.251057, "o", "S"] +[1.2893, "o", " "] +[1.31446, "o", "I"] +[1.340586, "o", "L"] +[1.36479, "o", "P"] +[1.566199, "o", "\r\n"] +[1.746434, "o", "Path (3 steps): MaximumIndependentSet/SimpleGraph/One → MaximumSetPacking/One → ILP/bool\r\n\r\n Step 1: MaximumIndependentSet/SimpleGraph/One → MaximumSetPacking/One\r\n num_sets = O(num_vertices)\r\n universe_size = O(num_edges)\r\n\r\n Step 2: MaximumSetPacking/One → MaximumSetPacking/i32\r\n num_sets = O(num_sets)\r\n universe_size = O(universe_size)\r\n\r\n Step 3: MaximumSetPacking/i32 → ILP/bool\r\n num_vars = O(num_sets)\r\n num_constraints = O(universe_size)\r\n\r\n Overall:\r\n num_vars = O(num_vertices)\r\n num_constraints = O(num_edges)\r\n\r\n"] +[4.246434, "o", "\u001b[90m# Create a five-vertex cycle\u001b[0m\r\n"] +[4.696434, "o", "$ "] +[4.996434, "o", "."] +[5.031063, "o", "/"] +[5.07908, "o", "p"] +[5.101888, "o", "r"] +[5.138038, "o", "e"] +[5.172084, "o", "d"] +[5.209925, "o", " "] +[5.233415, "o", "c"] +[5.270627, "o", "r"] +[5.299175, "o", "e"] +[5.335755, "o", "a"] +[5.374805, "o", "t"] +[5.409274, "o", "e"] +[5.440221, "o", " "] +[5.468197, "o", "M"] +[5.515335, "o", "I"] +[5.54903, "o", "S"] +[5.584875, "o", " "] +[5.606415, "o", "-"] +[5.641642, "o", "-"] +[5.662804, "o", "g"] +[5.687829, "o", "r"] +[5.722069, "o", "a"] +[5.753634, "o", "p"] +[5.776151, "o", "h"] +[5.813602, "o", " "] +[5.839194, "o", "0"] +[5.875799, "o", "-"] +[5.900838, "o", "1"] +[5.948083, "o", ","] +[5.99067, "o", "1"] +[6.038464, "o", "-"] +[6.063419, "o", "2"] +[6.09297, "o", ","] +[6.115078, "o", "2"] +[6.143828, "o", "-"] +[6.187411, "o", "3"] +[6.213376, "o", ","] +[6.238704, "o", "3"] +[6.286436, "o", "-"] +[6.311764, "o", "4"] +[6.356113, "o", ","] +[6.378262, "o", "4"] +[6.410075, "o", "-"] +[6.440864, "o", "0"] +[6.471432, "o", " "] +[6.515293, "o", "-"] +[6.549619, "o", "o"] +[6.59254, "o", " "] +[6.626723, "o", "c"] +[6.670609, "o", "y"] +[6.716293, "o", "c"] +[6.749602, "o", "l"] +[6.792471, "o", "e"] +[6.836284, "o", "."] +[6.865563, "o", "j"] +[6.890032, "o", "s"] +[6.916229, "o", "o"] +[6.949439, "o", "n"] +[7.153784, "o", "\r\n"] +[7.304369, "o", "Wrote cycle.json\r\n"] +[9.804369, "o", "\u001b[90m# Transform the instance and preserve the way back\u001b[0m\r\n"] +[10.254369, "o", "$ "] +[10.554369, "o", "."] +[10.590203, "o", "/"] +[10.634427, "o", "p"] +[10.669013, "o", "r"] +[10.712909, "o", "e"] +[10.752288, "o", "d"] +[10.791237, "o", " "] +[10.821907, "o", "r"] +[10.862582, "o", "e"] +[10.90626, "o", "d"] +[10.931661, "o", "u"] +[10.978084, "o", "c"] +[11.006626, "o", "e"] +[11.031961, "o", " "] +[11.076495, "o", "c"] +[11.117658, "o", "y"] +[11.160878, "o", "c"] +[11.194385, "o", "l"] +[11.217367, "o", "e"] +[11.249433, "o", "."] +[11.27177, "o", "j"] +[11.300782, "o", "s"] +[11.322846, "o", "o"] +[11.358034, "o", "n"] +[11.381488, "o", " "] +[11.428607, "o", "-"] +[11.46919, "o", "-"] +[11.499066, "o", "t"] +[11.546527, "o", "o"] +[11.569382, "o", " "] +[11.59759, "o", "I"] +[11.620634, "o", "L"] +[11.65357, "o", "P"] +[11.680223, "o", " "] +[11.712329, "o", "-"] +[11.753066, "o", "o"] +[11.798911, "o", " "] +[11.833926, "o", "r"] +[11.877845, "o", "e"] +[11.90896, "o", "d"] +[11.954003, "o", "u"] +[11.989424, "o", "c"] +[12.030092, "o", "e"] +[12.055983, "o", "d"] +[12.093349, "o", "."] +[12.122799, "o", "j"] +[12.166559, "o", "s"] +[12.202521, "o", "o"] +[12.237509, "o", "n"] +[12.460162, "o", "\r\n"] +[12.611677, "o", "Wrote reduced.json\r\n"] +[15.111677, "o", "\u001b[90m# Solve the target and recover a source solution\u001b[0m\r\n"] +[15.561677, "o", "$ "] +[15.861677, "o", "."] +[15.89805, "o", "/"] +[15.928395, "o", "p"] +[15.953061, "o", "r"] +[15.991547, "o", "e"] +[16.038457, "o", "d"] +[16.083043, "o", " "] +[16.105996, "o", "s"] +[16.136104, "o", "o"] +[16.157151, "o", "l"] +[16.197043, "o", "v"] +[16.235915, "o", "e"] +[16.278136, "o", " "] +[16.303288, "o", "r"] +[16.330365, "o", "e"] +[16.363482, "o", "d"] +[16.405111, "o", "u"] +[16.43191, "o", "c"] +[16.475949, "o", "e"] +[16.507623, "o", "d"] +[16.553103, "o", "."] +[16.600984, "o", "j"] +[16.637033, "o", "s"] +[16.683823, "o", "o"] +[16.71664, "o", "n"] +[16.936828, "o", "\r\n"] +[17.089047, "o", "Problem: MaximumIndependentSet\r\nSolver: ilp (via ILP)\r\nSolution: [1, 0, 1, 0, 0]\r\nEvaluation: Max(2)\r\n\r\nHint: use -o to save full solution details (including intermediate results) as JSON.\r\n"] +[19.589047, "o", "\u001b[90m# Check an independent set of size two\u001b[0m\r\n"] +[20.039047, "o", "$ "] +[20.339047, "o", "."] +[20.38376, "o", "/"] +[20.428246, "o", "p"] +[20.451846, "o", "r"] +[20.480135, "o", "e"] +[20.512622, "o", "d"] +[20.557641, "o", " "] +[20.58639, "o", "e"] +[20.610575, "o", "v"] +[20.642085, "o", "a"] +[20.669073, "o", "l"] +[20.710128, "o", "u"] +[20.747578, "o", "a"] +[20.770048, "o", "t"] +[20.815616, "o", "e"] +[20.848952, "o", " "] +[20.891705, "o", "c"] +[20.917334, "o", "y"] +[20.946955, "o", "c"] +[20.970008, "o", "l"] +[21.002068, "o", "e"] +[21.035078, "o", "."] +[21.075196, "o", "j"] +[21.109624, "o", "s"] +[21.141839, "o", "o"] +[21.176222, "o", "n"] +[21.205097, "o", " "] +[21.236444, "o", "-"] +[21.274258, "o", "-"] +[21.301027, "o", "c"] +[21.336556, "o", "o"] +[21.383587, "o", "n"] +[21.417394, "o", "f"] +[21.457107, "o", "i"] +[21.496583, "o", "g"] +[21.54002, "o", " "] +[21.581336, "o", "1"] +[21.620835, "o", ","] +[21.644739, "o", "0"] +[21.676005, "o", ","] +[21.719239, "o", "1"] +[21.742064, "o", ","] +[21.766985, "o", "0"] +[21.813335, "o", ","] +[21.850799, "o", "0"] +[22.079244, "o", "\r\n"] +[22.220535, "o", "Max(2)\r\n"] +[24.720535, "o", "\u001b[90m# Cross-check the optimum by exhaustive search\u001b[0m\r\n"] +[25.170535, "o", "$ "] +[25.470535, "o", "."] +[25.512635, "o", "/"] +[25.561514, "o", "p"] +[25.590875, "o", "r"] +[25.631085, "o", "e"] +[25.661342, "o", "d"] +[25.708829, "o", " "] +[25.738055, "o", "s"] +[25.764502, "o", "o"] +[25.808302, "o", "l"] +[25.837115, "o", "v"] +[25.873068, "o", "e"] +[25.91093, "o", " "] +[25.94144, "o", "c"] +[25.971798, "o", "y"] +[26.001788, "o", "c"] +[26.030278, "o", "l"] +[26.072549, "o", "e"] +[26.110047, "o", "."] +[26.146398, "o", "j"] +[26.190474, "o", "s"] +[26.218674, "o", "o"] +[26.243513, "o", "n"] +[26.265307, "o", " "] +[26.287353, "o", "-"] +[26.336092, "o", "-"] +[26.384359, "o", "s"] +[26.424024, "o", "o"] +[26.472762, "o", "l"] +[26.508201, "o", "v"] +[26.541368, "o", "e"] +[26.576796, "o", "r"] +[26.599728, "o", " "] +[26.641996, "o", "b"] +[26.671541, "o", "r"] +[26.712087, "o", "u"] +[26.758553, "o", "t"] +[26.785702, "o", "e"] +[26.820824, "o", "-"] +[26.860112, "o", "f"] +[26.903819, "o", "o"] +[26.943936, "o", "r"] +[26.974207, "o", "c"] +[27.011004, "o", "e"] +[27.216555, "o", "\r\n"] +[27.358887, "o", "Problem: MaximumIndependentSet\r\nSolver: brute-force\r\nSolution: [0, 0, 1, 0, 1]\r\nEvaluation: Max(2)\r\n\r\nHint: use -o to save full solution details as JSON.\r\n"] +[29.858887, "o", "$ "] diff --git a/docs/src/static/cli-demo.html b/docs/src/static/cli-demo.html new file mode 100644 index 000000000..f47b16c75 --- /dev/null +++ b/docs/src/static/cli-demo.html @@ -0,0 +1,2404 @@ + + + + + +From a graph to a verified solution + + + + + + + +
    +

    From a graph to a verified solution

    +

    6 command(s) · 6 passed · 0 failed

    +
    +
    Recorded with how-to-demo-cli · asciinema-player 3.8.0 · self-contained & offline.
    +
    + + + + diff --git a/docs/src/static/docs-theme.css b/docs/src/static/docs-theme.css new file mode 100644 index 000000000..780566ba8 --- /dev/null +++ b/docs/src/static/docs-theme.css @@ -0,0 +1,362 @@ +@font-face { + font-family: "DM Sans"; + src: url("../../../assets/fonts/dm-sans-regular.ttf") format("truetype"); + font-style: normal; + font-weight: 400; + font-display: swap; +} +@font-face { + font-family: "DM Sans"; + src: url("../../../assets/fonts/dm-sans-semibold.ttf") format("truetype"); + font-style: normal; + font-weight: 600 800; + font-display: swap; +} +html[class] { + color-scheme: dark; + --bg: #101713; + --fg: #e8ede5; + --sidebar-bg: #131c17; + --sidebar-fg: #adb9af; + --sidebar-active: #c4dda6; + --sidebar-non-existant: #87968b; + --sidebar-width: 264px; + --links: #c4dda6; + --inline-code-color: #d5e7c5; + --theme-popup-bg: #19241d; + --theme-popup-border: #334337; + --quote-bg: #17221b; + --quote-border: #789566; + --table-border-color: #304034; + --table-header-bg: #19241d; + --table-alternate-bg: #131c17; + --searchbar-bg: #19241d; + --searchbar-fg: #e8ede5; + --searchbar-border-color: #4a614d; + --searchresults-header-fg: #e8ede5; + --searchresults-border-color: #304034; + --searchresults-li-bg: #19241d; + --icons: #b5c2b7; + --icons-hover: #e8ede5; + --content-max-width: 800px; +} +body { + font-family: + "DM Sans", + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + sans-serif; + font-size: 15px; + line-height: 1.75; +} +.sidebar { + border-right: 1px solid #2a372d; + font-size: 13px; +} +.docs-brand { + display: flex; + align-items: center; + gap: 12px; + padding: 9px 18px; + color: var(--fg); + text-decoration: none; + font-weight: 600; + border-bottom: 1px solid #2a372d; +} +.docs-brand img { + width: 204px; + height: 59px; + object-fit: contain; +} +.sidebar .sidebar-scrollbox { + top: 78px; + padding: 14px 16px 28px; +} +.chapter { + line-height: 1.45; +} +.chapter li.chapter-item { + margin: 2px 0; +} +.chapter li a { + display: block; + padding: 7px 10px; + border-radius: 5px; + color: var(--sidebar-fg); +} +.chapter li a:hover { + color: var(--fg); + background: #1d2a20; + text-decoration: none; +} +.chapter li a.active { + color: #d4e9ba; + background: #263725; + font-weight: 600; +} +.chapter .section { + padding-left: 14px; +} +.chapter li.part-title { + margin: 23px 10px 7px; + color: #e2e9df; + font-size: 13px; + font-weight: 600; + text-transform: none; + letter-spacing: 0; +} +.chapter li.part-title:first-child { + margin-top: 9px; +} +.sidebar .on-this-page { + display: none; +} +.chapter li > a.toggle { + padding: 7px 3px; + width: 18px; +} +:is(#menu-bar, #mdbook-menu-bar) { + border-bottom: 1px solid #2a372d; + background: #101713; + padding: 0 24px; +} +.menu-title { + display: none; +} +.menu-bar .right-buttons { + margin-left: auto; +} +:is(#theme-toggle, #mdbook-theme-toggle) { + display: none; +} +.docs-tools { + display: flex; + align-items: center; + gap: 18px; + height: 50px; +} +.docs-tools a { + font-size: 13px; + font-weight: 600; + color: #b9c7bb; + text-decoration: none; +} +.docs-tools a:hover { + color: var(--links); +} +.content { + padding: 0 38px; +} +.content main { + padding: 42px 0 30px; +} +.content main > h1 { + font-size: 36px; + line-height: 1.2; + font-weight: 600; + letter-spacing: -1px; + margin: 0 0 22px; +} +.content h2 { + font-size: 21px; + font-weight: 600; + line-height: 1.4; + margin: 34px 0 12px; + letter-spacing: -0.25px; +} +.content h3 { + font-size: 17px; + font-weight: 600; + margin: 26px 0 10px; +} +.content p { + margin: 12px 0; +} +.content main > p:first-of-type { + font-size: 16px; + color: #c0ccc1; + line-height: 1.8; +} +.content a { + text-decoration: underline; + text-underline-offset: 3px; +} +.content .header { + text-decoration: none; +} +.content li { + margin: 6px 0; +} +.content strong { + font-weight: 600; +} +.content code { + font-size: 13px; + border-radius: 3px; +} +.content :not(pre) > code { + background: #213025; + padding: 2px 5px; + overflow-wrap: anywhere; +} +.content pre { + margin: 20px 0; + border: 1px solid #334437; + border-radius: 8px; + background: #162019; +} +.content pre > code { + display: block; + padding: 18px 20px; + background: #162019; + color: #dfe8dc; + line-height: 1.7; + tab-size: 4; +} +.content pre .buttons { + top: 6px; + right: 6px; +} +.content pre .buttons button { + background: #233429; + color: #d3dfcf; + border-radius: 4px; + padding: 7px; +} +.content table { + display: block; + width: 100%; + overflow-x: auto; + font-size: 14px; + margin: 18px 0; + border-collapse: collapse; +} +.content th { + font-weight: 600; + text-align: left; + color: #dfe8dc; +} +.content th, +.content td { + padding: 12px 14px; + border: 0; + border-bottom: 1px solid #304034; +} +.content td { + vertical-align: top; +} +.content blockquote { + margin: 20px 0; + padding: 8px 18px; + border-radius: 0 6px 6px 0; +} +.content details { + border: 1px solid #304034; + border-radius: 6px; + padding: 12px 16px; + margin: 18px 0; +} +.content summary { + cursor: pointer; + font-weight: 600; + color: #c4dda6; +} +.content .header:link, +.content .header:visited { + color: var(--fg); +} +.content .hljs-comment { + color: #9cac9b; + font-style: normal; +} +.content .hljs-keyword, +.content .hljs-selector-tag { + color: #a9c9e8; +} +.content .hljs-string { + color: #c4dda6; +} +.content .hljs-number, +.content .hljs-literal { + color: #ebc897; +} +.content .hljs-title { + color: #d8cfac; +} +.content .hljs-meta { + color: #a9c9e8; +} +.content :focus-visible, +.docs-tools a:focus-visible, +.sidebar a:focus-visible { + outline: 2px solid #c4dda6; + outline-offset: 4px; +} +.nav-chapters { + color: #b5c2b7; +} +.cli-cast { + display: block; + width: 100%; + height: 490px; + border: 1px solid #334437; + border-radius: 8px; + background: #0d0f12; + margin: 24px 0 16px; +} +:is(#searchbar, #mdbook-searchbar) { + padding: 13px 16px; + border-radius: 6px; +} +:is(#search-wrapper, #mdbook-search-wrapper) { + margin: 25px 0 0; +} +@media (min-width: 1200px) { + .content { + padding-left: 56px; + padding-right: 56px; + } +} +@media (max-width: 700px) { + .content { + padding: 0 22px; + } + .content main { + padding-top: 30px; + } + .content main > h1 { + font-size: 30px; + } + :is(#menu-bar, #mdbook-menu-bar) { + padding: 0 12px; + } + .docs-tools { + gap: 14px; + } + .docs-tools a { + font-size: 12px; + } + .cli-cast { + height: 345px; + } + .content th, + .content td { + padding: 9px 10px; + } +} +@media (max-width: 380px) { + .docs-tools a:last-child { + display: none; + } + .cli-cast { + height: 285px; + } +} +@media print { + .docs-tools, + .docs-brand, + .cli-cast { + display: none; + } +} diff --git a/docs/src/static/docs-theme.js b/docs/src/static/docs-theme.js new file mode 100644 index 000000000..3c11dccb7 --- /dev/null +++ b/docs/src/static/docs-theme.js @@ -0,0 +1,125 @@ +/* Small additions to mdBook's native navigation; content remains usable without JS. */ +(() => { + const root = window.path_to_root || ""; + // mdBook 0.5 uses a label for this control; expose its button behavior to keyboards. + const toggle = document.querySelector("label#mdbook-sidebar-toggle"); + if (toggle) { + toggle.setAttribute("role", "button"); + toggle.tabIndex = 0; + toggle.addEventListener("keydown", (event) => { + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + toggle.click(); + } + }); + } + const page = location.pathname.split("/").pop() || "introduction.html"; + const legacy = { + "cli.html": { + installation: "install.html", + "ilp-backend": "install.html#optional-features", + "quick-start": "cli.html", + "global-flags": "cli-automation.html", + commands: "cli-catalog.html", + "shell-completions": "cli-completions.html", + "json-output": "cli-automation.html", + "problem-name-aliases": "cli-variants.html", + "pred-list--list-all-problem-types": "cli-catalog.html", + "pred-show--inspect-a-problem": "cli-catalog.html", + "pred-to--explore-incoming-neighbors": "cli-paths.html", + "pred-from--explore-outgoing-neighbors": "cli-paths.html", + "pred-path--find-a-reduction-path": "cli-paths.html", + "pred-export-graph--export-the-reduction-graph": + "cli-automation.html#registry-exports", + "pred-create--create-a-problem-instance": "cli-create.html", + "pred-evaluate--evaluate-a-configuration": "cli-inspect.html", + "pred-inspect--inspect-a-problem-file": "cli-inspect.html", + "pred-reduce--reduce-a-problem": "cli-reduce.html", + "pred-solve--solve-a-problem": "cli-solve.html", + }, + "introduction.html": { + "reduction-graph": "reduction-graph.html", + "our-vision": "introduction.html#research-scope", + "call-for-contributions": "contributing.html", + authorship: "contributing.html#authorship-and-license", + }, + "design.html": { + "module-architecture": "design.html#module-map", + "problem-model": "design-problem.html", + "variant-system": "design-variants.html", + "reduction-rules": "design-reductions.html", + "reduction-graph": "design-paths.html", + "path-finding": "design-paths.html", + "executable-paths": "rust-paths.html", + solvers: "rust-solvers.html", + "json-serialization": "design-serialization.html", + contributing: "contributing.html", + }, + "getting-started.html": { + installation: "getting-started.html", + solvers: "rust-solvers.html", + "the-reduction-workflow": "rust-reduction.html", + "json-resources": "cli-automation.html#registry-exports", + "example-1-direct-reduction--set-packing-to-ilp": "rust-reduction.html", + "example-2-reduction-path-search--integer-factoring-to-spin-glass": + "rust-paths.html", + }, + "mcp.html": { + setup: "mcp.html#install-with-mcp-support", + walkthrough: "mcp-walkthrough.html", + "available-tools": "mcp-tools.html", + "graph-query-tools": "mcp-tools.html#graph-queries", + "instance-tools": "mcp-tools.html#instances", + "available-prompts": "mcp-tools.html#prompt-templates", + }, + }; + const redirect = legacy[page]?.[location.hash.slice(1)]; + if (redirect) { + location.replace(root + redirect); + return; + } + const sidebar = document.querySelector(".sidebar"); + if (sidebar) { + const brand = document.createElement("a"); + brand.className = "docs-brand"; + brand.href = root + "introduction.html"; + const logo = document.createElement("img"); + logo.src = root + "assets/logo.svg"; + logo.alt = "Problem Reductions"; + brand.setAttribute("aria-label", "Documentation home"); + brand.append(logo); + sidebar.prepend(brand); + } + for (const frame of document.querySelectorAll(".cli-cast")) { + frame.addEventListener("load", () => { + const content = frame.contentDocument.querySelector(".wrap"); + if (!content) return; + const resize = () => { + frame.style.height = `${Math.ceil(content.getBoundingClientRect().height) + 2}px`; + }; + new ResizeObserver(resize).observe(content); + resize(); + }); + } + const menu = document.querySelector(".menu-bar .right-buttons"); + if (menu && page !== "print.html") { + const nav = document.createElement("nav"); + nav.className = "docs-tools"; + nav.setAttribute("aria-label", "Documentation resources"); + const links = [ + ["Markdown", "markdown/" + page.replace(/\.html$/, ".md")], + ["All pages", "markdown/index.md"], + ["Open atlas ↗", "index.html#atlas"], + ]; + for (const [label, href] of links) { + const link = document.createElement("a"); + link.textContent = label; + link.href = root + href; + nav.append(link); + } + menu.prepend(nav); + // Resource links replace duplicate repository, edit, and print icon shortcuts. + for (const child of [...menu.children]) + if (child !== nav) child.hidden = true; + } +})(); diff --git a/docs/website/README.md b/docs/website/README.md index c92a2f82e..ed2ef0f6e 100644 --- a/docs/website/README.md +++ b/docs/website/README.md @@ -65,3 +65,51 @@ Set `WEBSITE_BROWSER_CHANNEL=chrome` to use an installed Chrome instead, or `WEBSITE_BASE_URL=http://localhost:3001/` to change the preview address. The suite exercises search, filters, exact variants, deep links, keyboard navigation, clipboard actions, the mathematical example, legacy docs, and mobile overflow. + +## Documentation + +The guide uses short task pages grouped in `docs/src/SUMMARY.md`: start here, +agent workflows, CLI reference, Rust library, and internals. Keep one task or +contract per page and link prerequisites and next steps. Agent prompts name the +actual repository skill file; instructions distinguish implemented capabilities +from the research goal. + +`docs/src/static/docs-theme.css` supplies the restrained dark reading theme; +`docs-theme.js` adds Markdown access and redirects old section links. Native +mdBook search, code copying, and sidebar navigation remain available. Both +mdBook 0.4.37 (deployment) and 0.5.2 are supported. + +The website builder emits `book/markdown/` from the same source pages, expanding +Rust and generated-output includes. The Markdown index is the entry point for +agents. The builder preserves the Markdown index URL after mdBook’s HTML link rewriting. + +To check the complete assembled documentation, build the API and PDF first: + +```sh +make doc +make paper +cp docs/paper/reductions.pdf book/reductions.pdf +uv run --no-project --with playwright python scripts/test_documentation.py +``` + +The checks cover task navigation, search, clipboard, Markdown links and includes, +legacy section redirects, mobile layout, offline playback, and replaying the +recorded CLI workflow against its expected optimum. + +## CLI recording + +`docs/src/static/cli-demo.cast` contains real PTY output from six successful +commands against the current CLI. `cli-demo.html` embeds that cast and +asciinema-player 3.8.0 for offline playback, with autoplay disabled. The bundled +player is Apache-2.0 licensed; its license is alongside the recording. + +To refresh the recording, use the `how-to-demo-cli` skill from +[qude-software-skills](https://github.com/QudeLeap/qude-software-skills/tree/main/skills/how-to-demo-cli). +Build the CLI, create an isolated temporary directory, and place a `pred` symlink +to the new executable there. Record the commands in `docs/src/cli-demo.md`, using +`./pred` in that directory, at 88 columns × 22 rows with `--theme nord`, +`--typing-speed 35`, `--step-pause 2.5`, and `--no-autoplay`. + +Retain real output and exit codes; never substitute a simulated successful run. +The checked-in HTML adds the documentation palette and a compact embedded mode +to the skill's generated wrapper. Preserve those wrapper styles when refreshing. diff --git a/docs/website/assets/site.css b/docs/website/assets/site.css index 3abb763fa..62442056f 100644 --- a/docs/website/assets/site.css +++ b/docs/website/assets/site.css @@ -142,11 +142,10 @@ p { width: min(1280px, calc(100% - 112px)); margin-inline: auto; } -.eyebrow { - font-family: var(--mono); - font-size: 10px; +.context-label { + font-family: var(--sans); + font-size: 12px; font-weight: 400; - letter-spacing: 0.11em; line-height: 1.5; } .site-header { @@ -236,19 +235,6 @@ p { position: relative; z-index: 2; } -.announcement { - display: inline-flex; - align-items: center; - gap: 9px; - border-bottom: 1px solid var(--line); - padding-bottom: 12px; - margin-bottom: 29px; - font-size: 9px; - color: var(--green); -} -.announcement > span:last-child { - margin-left: 12px; -} .status-dot { width: 6px; height: 6px; @@ -345,9 +331,7 @@ p { color: var(--muted); } .map-scale { - font-family: var(--mono); - font-size: 8px; - letter-spacing: 0.1em; + font-size: 11px; } .hero-graph { height: 427px; @@ -460,12 +444,6 @@ p { background: var(--pale); border-radius: 4px; } -.graph-feature .eyebrow { - font-size: 8px; - color: var(--muted); - display: block; - margin-bottom: 4px; -} .graph-feature strong { font-size: 12px; font-weight: 500; @@ -530,11 +508,8 @@ p { align-items: end; margin-bottom: 44px; } -.section-heading .eyebrow { - margin-bottom: 20px; -} .section-heading > p, -.section-heading > div > p:not(.eyebrow) { +.section-heading > div > p { max-width: 405px; font-size: 14px; line-height: 1.85; @@ -558,8 +533,8 @@ p { .problem-card:hover { background: var(--pale); } -.problem-card .eyebrow { - font-size: 9px; +.problem-card .context-label { + font-size: 12px; color: var(--muted); } .problem-card h3 { @@ -608,26 +583,12 @@ p { color: var(--ink); padding-block: 85px; } -.research-section .eyebrow { - color: #b4c7ad; -} .research-section h2 em { color: var(--lime); } .research-section p { color: #b5c5b2; } -.outline-badge { - display: inline-block; - font-family: var(--mono); - font-size: 8px; - letter-spacing: 0.1em; - border: 1px solid #496445; - border-radius: 3px; - color: var(--lime); - padding: 4px 8px; - margin-top: 16px; -} .research-cycle { display: grid; grid-template-columns: repeat(4, 1fr); @@ -642,18 +603,6 @@ p { padding-left: 25px; border-left: 1px solid #3a513d; } -.cycle-number { - display: flex; - justify-content: space-between; - font-family: var(--mono); - font-size: 11px; - color: var(--lime); - margin-bottom: 30px; -} -.cycle-number > span { - font-size: 18px; - font-family: var(--sans); -} .research-cycle h3 { font-size: 18px; margin-bottom: 14px; @@ -662,14 +611,6 @@ p { font-size: 12px; line-height: 1.85; } -.cycle-artifact { - display: block; - font-family: var(--mono); - font-size: 8px; - letter-spacing: 0.05em; - color: #bccfa8; - margin-top: 28px; -} .research-note { display: flex; align-items: baseline; @@ -711,9 +652,7 @@ p { background: #22331f; padding: 5px 8px; border-radius: 4px; - font-family: var(--mono); - font-size: 8px; - letter-spacing: 0.04em; + font-size: 11px; } .featured-copy h3 { font-size: 33px; @@ -746,10 +685,7 @@ p { gap: 70px; align-items: center; } -.infrastructure-section .eyebrow { - margin-bottom: 23px; -} -.infrastructure-section p:not(.eyebrow) { +.infrastructure-section p { font-size: 13px; line-height: 1.9; margin-top: 23px; @@ -782,6 +718,9 @@ p { border-radius: 50%; background: #556e4c; } +.code-panel .terminal-header { + justify-content: flex-end; +} .copy-button { border: 0; background: transparent; @@ -891,15 +830,15 @@ pre { .breadcrumbs a:hover { text-decoration: underline; } -.page-header .eyebrow { - margin-bottom: 18px; +.page-header .pill { + margin-bottom: 20px; } .page-header h1 { font-size: clamp(42px, 5vw, 65px); max-width: 960px; overflow-wrap: anywhere; } -.page-header > p:not(.eyebrow) { +.page-header > p { font-size: 15px; max-width: 680px; line-height: 1.8; @@ -955,7 +894,7 @@ pre { position: sticky; top: 110px; } -.filters .eyebrow { +.filters .context-label { margin-bottom: 13px; color: var(--muted); } @@ -1090,9 +1029,6 @@ pre { border-radius: 6px; padding: 25px; } -.reading-aside .eyebrow { - color: var(--muted); -} .metadata { margin: 21px 0 24px; } @@ -1241,8 +1177,8 @@ pre { font-size: 11px; line-height: 1.8; } -.evidence-item .eyebrow { - font-size: 8px; +.evidence-item .context-label { + font-size: 12px; } .evidence-item a { display: inline-block; @@ -1499,7 +1435,7 @@ pre { margin-bottom: 30px; } .section-heading > p, - .section-heading > div > p:not(.eyebrow) { + .section-heading > div > p { max-width: 550px; } .problem-showcase { @@ -1515,7 +1451,7 @@ pre { grid-template-columns: 1fr 130px; gap: 0 15px; } - .problem-card .eyebrow, + .problem-card .context-label, .problem-card h3, .problem-card p { grid-column: 1; @@ -1609,7 +1545,7 @@ pre { flex-wrap: wrap; gap: 6px; } - .filters .eyebrow { + .filters .context-label { width: 100%; margin-bottom: 5px; } @@ -1651,7 +1587,7 @@ pre { .page-header h1 { font-size: 48px; } - .page-header > p:not(.eyebrow) { + .page-header > p { font-size: 14px; } .atlas-controls { @@ -1705,10 +1641,6 @@ pre { .hero h1 { font-size: 61px; } - .announcement { - font-size: 8px; - gap: 8px; - } .hero-description { font-size: 14px; } @@ -1756,9 +1688,6 @@ pre { .research-cycle p { font-size: 11px; } - .cycle-artifact { - font-size: 7px; - } .evidence-grid { grid-template-columns: 1fr; } diff --git a/docs/website/assets/site.js b/docs/website/assets/site.js index c5875c11a..651bd079e 100644 --- a/docs/website/assets/site.js +++ b/docs/website/assets/site.js @@ -184,7 +184,7 @@ .filter((name) => families.includes(name)) .map((name) => { const variants = variantsOf(name); - return `
    ${escape(categories[variants[0].category] || "COMPUTATIONAL PROBLEM").toUpperCase()}

    ${escape(nameOf(name))}

    ${escape(description(name))}.

    ${miniArt(name)}
    ${variants.length} variant${variants.length === 1 ? "" : "s"} · ${edgesOf(name).length} incident reductions
    `; + return `${escape(categories[variants[0].category] || "Computational problem")}

    ${escape(nameOf(name))}

    ${escape(description(name))}.

    ${miniArt(name)}
    ${variants.length} variant${variants.length === 1 ? "" : "s"} · ${edgesOf(name).length} incident reductions
    `; }) .join(""); document.querySelector("#featured-art").innerHTML = complementArt(); @@ -200,7 +200,6 @@ -

    THE EXECUTABLE ATLAS

    Find your next connection.

    Explore ${families.length} problem families and their implemented @@ -219,14 +218,14 @@ autocomplete="off" />/ - Find a reduction path

@@ -264,7 +263,7 @@ ); }); document.querySelector(".result-count").textContent = - `${results.length} OF ${families.length} PROBLEM FAMILIES`; + `${results.length} of ${families.length} problem families`; document.querySelector("#atlas-results").innerHTML = results.length ? results .map((name) => { @@ -311,8 +310,8 @@ ); } - function codePanel(command, label = "REPRODUCE IN YOUR TERMINAL") { - return `
${label}
${escape(command)}
`; + function codePanel(command) { + return `
${escape(command)}
`; } function problemPage(name, params) { @@ -340,10 +339,6 @@ Home/Atlas/${escape(nameOf(name))}
-

- ${escape(categories[node.category] || node.category).toUpperCase()} / - PROBLEM -

${escape(nameOf(name))}.

${escape(description(name))}.

@@ -395,7 +390,6 @@