diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 8fdae7e..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "rust-analyzer.linkedProjects": ["./Cargo.toml"], - "rust-analyzer.cargo.features": "all", - "rust-analyzer.check.command": "clippy", - "[rust]": { - "editor.defaultFormatter": "rust-lang.rust-analyzer", - "editor.formatOnSave": true - } -} diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..cb4da48 --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,85 @@ +# Development + +## Prerequisites + +- Rust and Cargo +- `just` for project recipes +- `mdbook` for documentation work + +## Workspace + +This Rust workspace has two crates: + +- `crates/core`: library code for tokenization, loading, clone detection, complexity and LOC analysis, coverage parsing, + highlighting, and reporting. +- `crates/cli`: the `mccabre` command-line interface built with `clap`; command handlers live in `crates/cli/src/commands/`. + +## Common Commands + +```bash +cargo build --workspace +cargo test --workspace +cargo fmt --all +cargo clippy --workspace --all-targets +``` + +The justfile wraps the common local workflow: + +```bash +just fmt +just test +just check +just docs-build +just docs-test +``` + +Run the CLI locally with Cargo: + +```bash +cargo run -p mccabre -- loc crates/core +cargo run -p mccabre -- coverage report --from lcov.info +``` + +## Coverage + +Mccabre uses [`cargo-llvm-cov`](https://github.com/taiki-e/cargo-llvm-cov) for Rust test coverage. + +Install the Cargo subcommand: + +```bash +cargo +stable install cargo-llvm-cov --locked +``` + +Installing from source currently requires rustc 1.87 or later. + +On macOS or Linux with Homebrew, `brew install cargo-llvm-cov` is also available. + +Then run coverage through `just`: + +```bash +# Print coverage in the terminal. +just coverage + +# Write lcov.info for mccabre coverage commands. +just coverage-lcov + +# Write an HTML report to coverage_html/. +just coverage-html +``` + +Coverage artifacts are ignored by git. + +## Documentation + +Keep documentation in `docs/` up to date when behavior changes. + +```bash +just docs-build +just docs-test +``` + +Serve the mdBook locally while editing: + +```bash +just docs +``` diff --git a/README b/README deleted file mode 100644 index e7cd34a..0000000 --- a/README +++ /dev/null @@ -1,187 +0,0 @@ -=============================================================================== -Code Complexity & Clone Detection Tool -=============================================================================== - -An extensible CLI for measuring code complexity and detecting repeated code -fragments. Designed to be language-agnostic with low-overhead. - -This document outlines: - - Goals and metrics - - Algorithms used - - Project structure - - Outputs - - Philosophy - -=============================================================================== -GOALS - -- Provide actionable complexity and duplication insights without heavy parsing. -- Support any programming language -- Keep runtime fast: linear or near-linear where possible. -- Keep architecture modular so deeper analysis can be plugged in later. -- Produce both human-readable and machine-readable reports. - -=============================================================================== -SCOPE - -The MVP focuses on high-signal, low-complexity algorithms that require only -tokenization—not full AST parsing. This keeps the implementation small and -the performance excellent. - -=============================================================================== -Algorithms -------------------------------------------------------------------------------- -1. Cyclomatic Complexity (McCabe) -- Measures independent control-flow paths in a function. -- Works by building a simple CFG (control-flow graph) from tokens or indentation. -- Formula: - CC = E - N + 2P - where: - E = number of edges - N = number of nodes - P = number of connected components (usually 1) - -Purpose: -- Flags overly complex functions. -- Well understood by developers. -------------------------------------------------------------------------------- -2. Token-based Clone Detection (Rabin-Karp Rolling Hash) -- Detects repeated token sequences across files. -- Uses a rolling hash window (e.g., 20–50 tokens). -- Language-agnostic; extremely fast. - -Purpose: -- Quickly identifies copy/paste blocks and boilerplate. -------------------------------------------------------------------------------- -3. Lines of Code (LOC) -- Counts physical, logical, comment, and blank lines. -- Token-based classification for accuracy. -- Supports ranking by any metric (logical, physical, comments, blank). -- Can aggregate and rank by directory. -- Required for future Maintainability Index calculations. - -Purpose: -- Baseline size metric. -- Identify largest files and directories. -- Track codebase growth and comment density. -------------------------------------------------------------------------------- -4. Halstead Complexity Metrics -- Based on counts of operators and operands. -- Computes vocabulary, volume, difficulty, and effort. - -Purpose: -- Complements Cyclomatic Complexity with lexical complexity. -=============================================================================== -FUTURE -------------------------------------------------------------------------------- -See todo.txt -=============================================================================== -CRATES --------------------------------------------------------------------------------- -core - tokenizer - - minimal language-agnostic tokenizer - - operator/operand extractor (Halstead) - - whitespace, comments, string handling - complexity - cyclomatic - - CFG builder - - node/edge counter - halstead - - operator+operand tables - loc - - physical and logical LOC - cloner - - rolling hash (Rabin-Karp) - - w-shingling and fingerprint index - - min token length filter - reporter - - JSON output - - plaintext/ANSI output - - sorting, filtering, severity thresholds - loader - - config loading - - file walker + globbing - - ignore rules - --------------------------------------------------------------------------------- -cli - - commands: analyze, clones, complexity, loc, dump-config - - analyze: full analysis (complexity + clones + LOC) - - clones: detect code clones only - - complexity: analyze cyclomatic complexity and LOC - - loc: focused LOC analysis with ranking (by file or directory) - - dump-config: display or save current configuration - - flags: --json, --threshold, --min-tokens, --rank-by, --rank-dirs, --path - -=============================================================================== -OUTPUT FORMATS --------------------------------------------------------------------------------- -Plaintext: - -FILE: src/server/routes.rs - Cyclomatic: 14 (warning) - Halstead Volume: 312.9 - LOC: 128 - -FILE: src/server/auth.rs - Cyclomatic: 5 - Halstead Volume: 102.3 - LOC: 41 - -CLONES: - - HashMatch #7 - - src/server/routes.rs:41-78 - - src/server/router.rs:12-49 - Length: 32 tokens - --------------------------------------------------------------------------------- -JSON: - -{ - "files": [ - { - "path": "src/server/routes.rs", - "cyclomatic": 14, - "halstead": { "volume": 312.9, "difficulty": 12.8 }, - "loc": 128 - } - ], - "clones": [ - { - "id": 7, - "length": 32, - "locations": [ - { "file": "src/server/routes.rs", "start": 41, "end": 78 }, - { "file": "src/server/router.rs", "start": 12, "end": 49 } - ] - } - ] -} - -=============================================================================== -DESIGN PRINCIPLES - -1. Zero language assumptions in the MVP. -2. Pluggable architecture (token → AST → CFG → semantic). -3. High performance by default. -4. No global state; everything streamed and incremental. -5. Developer-friendly reporting and clear severity levels. -6. Configurable thresholds - -=============================================================================== -REFERENCES -Cyclomatic Complexity (McCabe, 1976): - https://www.literateprogramming.com/mccabe.pdf - https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication500-235.pdf - -AST clone detection: - https://www.cs.ucdavis.edu/~su/publications/icse07.pdf - -LSH-based clone detection: - https://journals.riverpublishers.com/index.php/JCSANDM/article/download/18799/18101/68821 - https://www.sei.cmu.edu/library/code-similarity-detection-using-syntax-agnostic-locality-sensitive-hashing/ - -Halstead: - https://www.researchgate.net/publication/317317114_Software_Complexity_Analysis_Using_Halstead_Metrics - https://nvlpubs.nist.gov/nistpubs/TechnicalNotes/NIST.TN.1990.pdf diff --git a/README.md b/README.md new file mode 100644 index 0000000..592a132 --- /dev/null +++ b/README.md @@ -0,0 +1,200 @@ +# Code Complexity & Clone Detection Tool + +An extensible CLI for measuring code complexity and detecting repeated code fragments. + +Designed to be language-agnostic with low overhead. + +This document outlines: + +- Goals and metrics +- Algorithms used +- Outputs +- Philosophy + +## Goals + +- Provide actionable complexity and duplication insights without heavy parsing. +- Support any programming language. +- Keep runtime fast: linear or near-linear where possible. +- Keep architecture modular so deeper analysis can be plugged in later. +- Produce both human-readable and machine-readable reports. + +## Scope + +The MVP focuses on high-signal, low-complexity algorithms that require only tokenization—not full AST parsing. +This keeps the implementation small and performance excellent. + +## Algorithms + +### 1. Cyclomatic Complexity (McCabe) + +Measures independent control-flow paths in a function. + +Works by building a simple CFG (control-flow graph) from tokens or indentation. + +Formula: + +```text +CC = E - N + 2P +``` + +Where: + +- `E` = number of edges +- `N` = number of nodes +- `P` = number of connected components, usually `1` + +Purpose: + +- Flags overly complex functions. +- Well understood by developers. + +### 2. Token-Based Clone Detection (Rabin-Karp Rolling Hash) + +Detects repeated token sequences across files. + +- Uses a rolling hash window, for example 20–50 tokens. +- Language-agnostic and extremely fast. + +Purpose: + +- Quickly identifies copy/paste blocks and boilerplate. + +### 3. Lines of Code (LOC) + +Counts physical, logical, comment, and blank lines. + +- Token-based classification for accuracy. +- Supports ranking by any metric: logical, physical, comments, or blank. +- Can aggregate and rank by directory. +- Required for future Maintainability Index calculations. + +Purpose: + +- Provides a baseline size metric. +- Identifies largest files and directories. +- Tracks codebase growth and comment density. + +### 4. LCOV Coverage Reporting + +Reads LCOV files and reports line coverage. + +- Terminal summaries with uncovered line ranges. +- Detailed file and directory views. +- Optional JSONL and static HTML output. + +Purpose: + +- Surfaces untested lines in CI output. +- Produces shareable coverage artifacts. + +## Future + +See [todo.md](todo.md). + +## Development + +See [DEVELOPMENT.md](DEVELOPMENT.md) for workspace structure, common commands, and coverage setup with `cargo-llvm-cov`. + +## Commands + +- `analyze`: Full analysis: complexity, clones, and LOC +- `clones`: Detect code clones only +- `complexity`: Analyze cyclomatic complexity and LOC +- `loc`: Focused LOC analysis with ranking by file or directory +- `dump-config`: Display or save current configuration +- `coverage report`: Summarize LCOV coverage data +- `coverage show`: Show detailed file or directory coverage + +Common flags: + +- `--json` +- `--threshold` +- `--min-tokens` +- `--rank-by` +- `--rank-dirs` +- `--config` +- `--no-gitignore` + +## Output Formats + +### Plaintext + +```text +FILE: src/server/routes.rs + Cyclomatic Complexity: 14 + Physical LOC: 128 + Logical LOC: 96 + +FILE: src/server/auth.rs + Cyclomatic Complexity: 5 + Physical LOC: 41 + Logical LOC: 30 + +CLONES: + - HashMatch #7 + - src/server/routes.rs:41-78 + - src/server/router.rs:12-49 + Length: 32 tokens +``` + +### JSON + +```json +{ + "files": [ + { + "path": "src/server/routes.rs", + "loc": { + "physical": 128, + "logical": 96, + "comments": 12, + "blank": 20 + }, + "cyclomatic": { + "file_complexity": 14, + "functions": [] + } + } + ], + "clones": [ + { + "id": 7, + "length": 32, + "locations": [ + { "file": "src/server/routes.rs", "start": 41, "end": 78 }, + { "file": "src/server/router.rs", "start": 12, "end": 49 } + ] + } + ] +} +``` + +## Design Principles + +1. Zero language assumptions in the MVP. +2. Pluggable architecture: token → AST → CFG → semantic. +3. High performance by default. +4. No global state; everything streamed and incremental. +5. Developer-friendly reporting and clear severity levels. +6. Configurable thresholds. + +## References + +### Cyclomatic Complexity (McCabe, 1976) + +- +- + +### AST Clone Detection + +- + +### LSH-Based Clone Detection + +- +- + +### LCOV + +- diff --git a/docs/book.toml b/docs/book.toml index 81b34a4..6c89a11 100644 --- a/docs/book.toml +++ b/docs/book.toml @@ -4,3 +4,9 @@ language = "en" multilingual = false src = "src" title = "Mccabre Code Analyzer" + +[output.html] +git-repository-url = "https://github.com/stormlightlabs/mccabre" +default-theme = "coal" +preferred-dark-theme = "coal" +additional-css = ["src/assets/css/site.css"] diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index 1baa111..0b8c3bb 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -8,6 +8,7 @@ - [Quick Start](./quickstart.md) - [CLI Reference](./cli-reference.md) - [Configuration](./configuration.md) +- [Coverage](./coverage.md) # Algorithms diff --git a/docs/src/assets/css/site.css b/docs/src/assets/css/site.css new file mode 100644 index 0000000..19a34ef --- /dev/null +++ b/docs/src/assets/css/site.css @@ -0,0 +1,162 @@ +@font-face { + font-family: "Atkinson Hyperlegible Soft"; + font-style: normal; + font-display: swap; + font-weight: 400; + src: url("../fonts/atkinson-hyperlegible-soft/AtkinsonHyperlegibleSoft-Regular.woff2") + format("woff2"); +} + +@font-face { + font-family: "Atkinson Hyperlegible Soft"; + font-style: italic; + font-display: swap; + font-weight: 400; + src: url("../fonts/atkinson-hyperlegible-soft/AtkinsonHyperlegibleSoft-RegularItalic.woff2") + format("woff2"); +} + +@font-face { + font-family: "Atkinson Hyperlegible Soft"; + font-style: normal; + font-display: swap; + font-weight: 600; + src: url("../fonts/atkinson-hyperlegible-soft/AtkinsonHyperlegibleSoft-SemiBold.woff2") + format("woff2"); +} + +@font-face { + font-family: "Atkinson Hyperlegible Soft"; + font-style: normal; + font-display: swap; + font-weight: 700; + src: url("../fonts/atkinson-hyperlegible-soft/AtkinsonHyperlegibleSoft-Bold.woff2") + format("woff2"); +} + +@font-face { + font-family: "IBM Plex Serif"; + font-style: normal; + font-display: swap; + font-weight: 400; + src: url("../fonts/ibm-plex-serif/ibm-plex-serif-latin-400-normal.woff2") format("woff2"); +} + +@font-face { + font-family: "IBM Plex Serif"; + font-style: normal; + font-display: swap; + font-weight: 600; + src: url("../fonts/ibm-plex-serif/ibm-plex-serif-latin-600-normal.woff2") format("woff2"); +} + +@font-face { + font-family: "IBM Plex Serif"; + font-style: normal; + font-display: swap; + font-weight: 700; + src: url("../fonts/ibm-plex-serif/ibm-plex-serif-latin-700-normal.woff2") format("woff2"); +} + +:root, +.coal { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + --scrollbar: var(--sidebar-fg); + --icons: #43484d; + --icons-hover: #b3c0cc; + --links: #2b79a2; + --inline-code-color: #c5c8c6; + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + --warning-border: #ff8e00; + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + --color-scheme: dark; + --copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) + contrast(82%); + --copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) + brightness(98%) contrast(89%); + --mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace; +} + +#theme-toggle, +#theme-list { + display: none !important; +} + +html, +button, +input { + font-family: "Atkinson Hyperlegible Soft", "Open Sans", sans-serif; +} + +body { + background: var(--bg); + color: var(--fg); +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: "IBM Plex Serif", Georgia, serif; + font-weight: 400; + line-height: 1.15; +} + +h1 { + color: #9dbcfb; +} + +h2, +h3 { + color: #c5d2df; +} + +a, +.content a { + color: var(--links); +} + +code, +pre, +.ace_editor, +.hljs { + font-family: var(--mono-font) !important; +} + +pre { + background: #1d1f21; + border: 1px solid var(--table-border-color); +} + +pre > code, +.hljs { + background: #1d1f21; + color: #c5c8c6; +} + +blockquote { + background: var(--quote-bg); + border-color: var(--quote-border); +} diff --git a/docs/src/assets/fonts/atkinson-hyperlegible-soft/AtkinsonHyperlegibleSoft-Bold.woff2 b/docs/src/assets/fonts/atkinson-hyperlegible-soft/AtkinsonHyperlegibleSoft-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c5572a4f9ca4afde20b1910eddfe4840a99136fa GIT binary patch literal 29784 zcmXT-cQayOWME)mD2ZSYWME)mH05DnDEzl`Lf5o6E1cV9&v@lP_NDUyePH zms)JS_Qt3F+f#hD%h+6yU9jT(SB9Ja|JT-frL9F+-tPu)N~A{;r=p)JraSmI(0* z>Po(0ySaro-~aey-HY?pZ$7_&jPK$3d4iREs#-Q((=Tmo*I)DI>-j@-W9P1C7T#%> zpyIvlvDc?3r$2xA*E;ui-J{Nvq5++2u3g>LWNCl?{M++;^F?(g8QyctH8}Qyu`5Kv zqmPF@$gS?E&w)8JSlvGTmFTQ@`@4n7`on+w2Jq z-*NS9JII|&hURjF7vYdS2mCe3zE$wlh*2;HZ94Bxr+h@|U z({@Rp;DnW*KJ2*vUO*|IbK~3D_upEpe7vyX!ZfRp5C^WFO)KT}9N4ZLly;P!^5?mJ zmiX3PStV%|zrOvx8(aT-e=~pDNt2m#`GlnmFN8XGD6nMj-kW?$!C8pcbty}O?1o+P zJy%}7t!=biu%VeFdHb}t*@1gDa2$PLxTv~kACKO{n5AN^8##(^@<>0Mo|+kIfAPbH z7oT3{{ID=wC3`H+BKw)d+rQs`Ye~rVI4B){W%4!R^1tI(l$IsTGHO_~%xFT&>i5$x z%jGSP|D@!w*pfRsDD0Qx3$4P`dG*0(Z~adhn}$yhkG(8gGkCkj*rY6UstgfJdwPnw^pc_}A1D8nJG0Mf zyD!@$bNz&V%vzQ^H}f3xI)e`}mqsyZc00{ANw+;-HTUL@CDtEUKXi9I&kbalB(Jjd z!Efo0_h&wAz5nP`RQ#kTr^*li`&~V0droVdoGY8Al8}nWi4KpKIltrY^XM}F+O_x6 zMwJd0K~AM@d*zPttv@|0kWHw|$S+aQo0X~m`M!03-k9%xUQ&6n`*LJM0u$4zQ*R$x z|Np-HmtdP-(XI7)yE}6|6^>nr2xq=$eQk>$^Xf|LYbPkTX< zr{AaG8IPtcRSMm>Ol|AR_6H_Q1ly84Z3Pz0R0)3glY9F5!--##nZIO@N2_fK6{Cs3$~vLva0{;c*ox%YHN7GQ_jGE zix(_yO5SX=_^|(hP;pPCSptuQH$#j1Nza{9^Lrh16t)CL-hDVLO5nCt!RKO)1I@b| zFDpxxPTcD*9Jh66@wdqE;*V;K!@DQaeJ%N2zYBM3#E6^Sle+W%mHvLcYjeYv_ji5d zi@MT1(>67}*RAiyiz`R}?EWjUEC2hw^XE?R_&C`buV?uG!}#`|DSu>+{ZIg zM_(@%<~hIT)_Z39TKvfN?(eJx#g`I{mVd5%V`wWP9OS>(f0du<-`g2R!GBGQ+SZy| zTt2p0++xj&#*4N0KZH#vcJb|vG1Gfr(6YGZnS$Xy{`MEo^E`EKtv1-3d?c1rVcwO^ zWkMIvB^ceFF!#yo+xPpWzx4i1)|QoDvGM9;8v!f_)9?R2A-w)Uf(vt)L?}SrrE_10%ZHYoP6FzzD<*MTRY`?ZiA{OM>1D&OwTI)>UY@SK zRWp*^#WZ z#zOE=uT_iqbAh}Q0&ymaTQZzq6n6G3$X@q1Z|CFRLahNJ-LEDbD-?Kq?pcd_hi6+! zz+uxD$KG~t?9_MKVd2v$WXNkUW3|aljZGp+nn5m0A}qIYi5}4keY_&jebK#$kjH18 z&F|NkaO>mi-}TTk|cy-xp;ICd_u`TWI}8W2;}RiJyho=`qL45A#Nu z|80IhuX+NzT!HlTOMdS*u91LmlUtGJa>FULHg_=wq<(W42!FN{&CH{S#QTG33C!4*WgUKullS$S^3+u1n zGIu+?Ty5U3xre7^Za%!fGV%Z0k9IO*iuUi+AGkRB%$PIr&W_KCVoD)1?0$JoQHyQ! zaqXI_5xOj9sg`p@sC4Qk&1czLj|838*?!2&Ogg9Jgy-@(-_qmeCwfm53NHKeGrfMw zY=yOsQO1c+zuR3qbl2!r^#`*TOv-|?tfIWK%);EiAInIIwqynH>SkTNnrpLG@0!UW zhLtA2X0B}zb)WFgfxA~*V%v=mf6a?_A6v7g^_EfGw9lKG&Uta|7SGgAj5oWWZFoi6 z=YXO{u(ipRmNlwt58O?WOcUEvXP&+DQOG;hm9^ZlLP}2_D;CUnFpZznYu2J@TkSJJ zkEg9o>&l6^y>|0GHtF17KOCE8JeWJjEOnvVwY)n;{Bg@481K(qlx5($^3?(3zQt*} z*P_z*@|xYcBFFNwX6BTu;UymL6QYfr7yF*|>_bX2K zb1V0CbufDt-O)JO(_S0|EZD3cyhhhx#fH4E z_7=D2UrTn~eCk1(@to9R^%rl9UwoLWtGr;vC7YSovijD}jlIiMu~u?drA+pN^0jj} z*l-@6)1&)h_4)bhy7q^C&wcDCaIb0kyMU{&P42sSIrn_3?0LCPV|uC9miFmOXNcVn zkN@Mcx8%B`Y{N&nS*n=~j})9l3WDW6S%p3LeEq?evWM9>XoQF2e8(T$xOiAdQ8&+h*V^?#{v-0s4QTCg= zSjsLt{k-sEnz`@RhuaR?^0#*!Fc0bwpQw7Rky&3+vIhr2Ilq^#j_JhbqA&Q6Nfu z-LE50dD|XLQ|srsTf4oDW%bp~HFMs_XQ{kx%Gu1E!fH_(lKgD^To@-99u(@ z6!}5v|?B4_T~ zFP_!w{w!H``(}#3nt8HE54GvtTcOLF_fgGc-QCDrlivsN+pImaKfpHjT0+&S)*I(G zcAV;5#+t~H7@)}aymI*+3*%FE;g4699gt49TP6K3`efg%2-Y=U*0yiXnd7+6p_5HD zt}*odCl{q}(XUI^&1kSTD)+6}{<-^7S$w6=-?d&X=?nDl@W%1-%kSwix4#&B`QL)1 zs}Aoy*~`-Y%D${9dXU2^_RHev#4GD|-TWMuG}HC@=A&+EDvP9@Z!N9aq{V-5$?f$& zY(6O+vRqUkD%w@_;dA6^_q_gu z7<%;<|?tpYl?3Bl(uw=uk$PaWfOa5LZj{d zKQW(z|BFUg{C9D3`8%T{q~T7aUIs^_q*g!2r59!&UjFP^(D^>}#=O5zpAsB1t-p`eDchF zsc3rU$BklsVUfE`#=F6wvb)oGUnb@g_hNa@V_D$Q)jJ6D0{b&aYM%2*&#g1!tW(sOLEJX|9J7yrH@H9E-dX&$<#G>*Jd#uDg3S1(f8uO zMvGd3b}QX3O>W=Om^(%aFl z5S7OHM@3R6YSzg~zE^YRgh`*>7%4tmIM3RF^J++dFZb1wfU_J|nHEH8gmgD#6$Y%e z5Aklz5?c|*aP<_^yEU(RP41-_cmGW7Ub2nV#Qs<2ycf45W3Or$1yr57xx8!7v3~y* z%gV~c<@TSOwr;X&w3)!|*!E9v7TaBFUw%6N+>RTyrFNyi&(8b&tY+82#Re8Cb$1RV z?#-L<`>uP(OCwK}Np2kG`}02ku{$|x>lb~@8x_Bv(S4b%mu4lMVO*YVcsgk} zul4f_D{W;RtS0{cSo-gwUVr65>wP^_|F72hR5dF_QmOb(pvSUHXXX{37uQ(TC;K3D z&Z$V}tdsj~i~r8v-#c4J`%KSg%{7)!lW!|7f798n@qat_jyKPa)V3~q`tReFe(nA5 z&F3(QJboPL^f>xX$?p}qPoldHPfz34aol`q*1zH=H&?A)+0TL(-=FiK_}sN?C0^oD zmv*iz;IF*8|4q@es`>739#t6D|KG;{H>H2i%sxqY*Xqwlm$%Ur#^HcNc(9h=%+Yl}a`Txa*2x%byq@&3P) z-)$1te*a0n(ku7tmy`0Ek}8IM@3QT_pPt_|-BwKb{2#V047_1&b@H65dr$3H-WVj6 zU8HZe>Zb6GC32#tctrhvH3tTpE(+7$p0B&q&u`9|79GVvT~5W83Bt@9+)~_cOx(QW z)Qv@a?N7%U!Hm`BnGgV)yv3^Z6Qm zQ}nwfYcdL}8N-ft7cac6QG0X6m9tNu%gz&yzu%SX!+c}UyPL6pFA2u`CIJ7%i}zMpng>-BT%J=r|bVMhkn#w5$r zllnteOlYrCe%WKz)}Q(8)77k{0;|^uB`&vBdb`C zy<^jdun7G=9`m?aGIh@iM0$2D{PezBbzj9}M&oHecW-yT!d`t^Jj>XG&p~Wg`<&RL zHucvx%9}7hUBJsTmtDkUj>?9FuX>tS9^MVDtGV)j;;;X~d~f*PaLe$>aLVw{;hMuc zhdG8NhB1cy4$~b`n+JyHE3Tc6)4Zou%&7isKkv`w=H(|oCmsIzLBsEvdgpxqBTjK{ zk2pWJ{BWvK{HOR&@100_*Y~5plct-^eysoexK2!uil)(1&A_GC3X)A{=B+zAEpzih zv$uRNOgP`3{%5(g<3K@*slj^Y-EtPa5>7Kk-&#(+IT~L63 zhUX3u$yZx%zT{tSv+9pQT=nC%<-A%yW1saUb{MZUuk0v(d+k(W{-2h;U%9{et$)Dq zxPUcD;g7D7qXRd`rCHf}^DA!W2YtWX@agW|I;O6_rW}W&)V{Wq&Xw6;^TX*sH%_zt)HUa!%napT{miT1UM0VZ^XoCr-6FO9)X%8Jw=ad9a4tN4_qvSJ#`RaP zFAnxfdFgUgWAkw)9q#J$e$Ncn@YgY0u)L{i6W;Z3YvxkZ6VKPQykhECt-Wzd`oPhK zKNiv#q!~p%1fDZuIu$78Q`^7gznY1Oos-C{4^t27Z`=K*)SyJ=l;L!nPp9@jIOOf& zRunw%mCuPsg)tw_$#Wf4uxR=4!q0pAw#~8U{erizyno!_q`HUdO0}&^tTUCIPf8TA zS4Jpb$}n})y=J$j)<^rI*4C`G)6E>Cm*|%7evtQeZu31KC(-ES)v>o^3oLY0eCJlr zljPP~b7IMnNlg*KvyUoozrf+5+!XqpZ}x-T)%A0xOxBvjBhMtiHu%cat+rXUXZ*e% z`09P||NIRqfAc^7@4xvZr|Q~2`-J_@o12G%4AiK|^YyraS;#X~C3X2uWB1Tm$UJuaSX9+Q`PY~-4n zwdjOmDzkD}{+y3$Gt>65&f1!_`C8TN+>MtR+hwl3Y%$i``KE35Ki_HjpV(LeghgWJ zpZR)L-}&CVB`fQFRDUit@8Pw->-&0le%%o!D<)BCUheh=VM|r_dtYoSC%)45vKLHp zRrBhJ5xZFw;#qKqgSSmGdB??LvoiW#rp-!iT{G-YpDF~)|+a#1COW#(F7?2qz3PkGHxO_MWA zSbjM_I(eNd=Z;e4PRF0Wrl;4>J(oN~!Pa&{^&W2ThxK^{r>33}RNQe!+-v&VXKi!ZpC{Z|G0kY3i2gb2dl?26uNGf7 zODmWjvuArQ7)Cbi|ke{qq|>(6;| zUVA+2)4J^KA*AU`;ntAo87N^JT&+b8W=d&^Cg z`|2s?y+R=xe(h5lq(p4DEz~{|+aLQ(;#kkdZF{!!Xnu}z6R5SkQtshUde!&l#crMV zJFg^r*;YU9TvGdYqSE%`IbD_K+hc{lU+s=!eR)gSSSj#S;Q~eHgqFX2F~<~a43hjD zc8Drf);pPb7+=|ZlOy0_qi0{fYvt{%13IF<+nh|TVnkw7;>@V)w2-gyG)dEj()_b!I5L?ht)CH|5&qQ*5S@ zmZv-wKBsLge6iVL%@<~2Wy}2ycW&A4FEq$Dz1FpJS!GH}<&w0+0-IjV;9To3Up_s! zc!r)*v`|37aijM_BIj>@iTV7-@B5l7F850&vsD~<{JQa!h`W#TlY@>yQ%}6_kn{+f zI5FbirYT~_*EFo;xo`XB%q-`#ODxrToC-P2mrkudaU!|!oT=QCbhXu%_AftwkEmZ? z)X>!9?Gz7_!skwXtWI!b;BTs-f&Ge@S%(ec}@z?8>) zLa#*byMK0zJ^OvN-bkv_E@90Cr^Hi&Alye zy;o=H(OdPG*k0M*3z>KCHv7KYaW74oeGXdeKAL)Rk<`=2VlAKeACv|zE4CM%wbQ@t zfQ?(Izp%9K?EcFfM?e2mJf6Y1>9|McN0yo0k2FH28Caj1ll}7NzFw6>^QF3@bJj_# zZ~L)Coz34-~BkE=>2V7 z(QhLB>(k;cEA89zs*^hBPFOZSY}v|92`^8`Wr|H)DC*UdyS{63nwi*|Im&fvTr-$A znH1i-ku&A&J+FBMjN+0HUM2a5R=P|&;UTwI*=bsmUgLvV0wUT`K|QM$8;Uo#wNII% zsQdZy_fqceizZtcrzmGRCQJ5bJGJP`OV)%5zOgdkZOr)HY_nudg_m>2--k2f3@SG} zKM#|)|JlAb)N=mQZ%mRo=1(}Jr~iDGa_FkD#_lF2U!&Cv+^z>ab6T`R?#_bECWT>d zx+PK?oH-ZE6h4eNqQX4KtKB$8pitplsLrMXOW8F2A9x+L;=YryHn-5`oSk^f4O;X8h%UPu3Eh3 z&4%j%dAmK@Uj>|Hto2LvIP7)#*0u#T-n*-~pD~o19GxK}D;+CsEB!ZXufqd}7a49U z=Wm=la_-8xHC#{lMEYDkMfPv(&$_>4&%MsxXY0hX*R0CE{!nmpctLIT7wcE^zp=4g zeXYk_#IvA=e-jhWKaPYa=?uO8?7Y#c1Wve_iNEnq&1b>pc!R@xFVOZmjWK z`EAJ*4L8SIuIpXg%-mUb7nv?h?LYUcq%v6Kn<$_2#{+UQp>F4AF5wsbB602Y53NNK zf(p+n@)IT&A2;#p;9!dNs`3xjO1ibh#6!dF&dVt^FT4AuXG~uqq@ogXjDP3*C5vuv znqBZlUTxR**y!+t>3nU|-=$QFrD_CeD|QMm{q}CT=Z>eVU9C7wT*6jAIW%Xw%1WNO zH#*OYD=fW#!%$GtG4cGgGY&kZJ^yBOp0H~XWBagC=yZxe&Pt9KlDhYKibO2*n|>xL zv8BI^^}Ne8_1L-$4Xz!vsn;}?9oVUR(=5}LVYhg}g#|jd7j5dDQFM06wG7@cuC57h z9v$ZQ&G6CDcUhRQIZ`+5%Mn%vt76SduHH%iCZ2QNlbtkaP4DBji2;+gF|9eB7ZLPp ze~tVTfz^f$8+#WAOP-ZaX>3TlWjm$%t>${^BHqX4Cr+-?x)bKw=Ex;}$dTXt(D60f zb_kfMefDhhJ>bm5%iG6LIoq@KfQ_WnqkS7AA1z{!Rpfj!acN|G%Rz5W2iDmw+MA5n zcZBZo;bQssR<3T=(LbeJ9xK|Xd9|z&TbSP5b5h)Y+V6d(9FrwOzv()DIB=2S_VH4M z9lN#TnJ+Imd-Q9;pZsY}2?<(^p+Xj!6Z^i{Tr*NN$#XJn5!CKF&GYXJA7_s_k3h(g z!*(0plZCma1Wx-Ss?53i(1AH2p-xi`wwlFl=-qlIpQl_P&+ur=ySHL*m+f6AZ0vRJ z*Xx-PUi11ayI*pc@@h;qkesTerWM1G67PIZu<1bPoJZU~i5!Y8F1OOIeUmh`Dso$Q ziur?0>=Zvu(>MG#=6`KUuM2QS{0prZ86_M zVReScmHihardPh)?Xqrfo~J-AvzVl}tLG{aSAp3UOBh)v$6yxi(j9%%FB#Uu^c z4}pSPmdZ@<;t`#>#V2OVjw5?^tQXb3EOab~bM>1Em-K{JHJx2QZ`m3jiFdMMdlp9R zIDR5AIJU^;l)2<(r})n=6-@X<9qqPG&c1Ti;??TC`HOZ1f314GV9Qbuqiq~ziWBxS ztP*^^%KVvwi$Z8(PSp8o%iO9`hmdcVTqFa&YQ$U3e)iH+_|E6I9jA8(1RcCo&&zSh zEHuj`ap|%P*YYwhpKM6m8+Vy$j?V>+B-#62PfqK6-@u(4a6|KghPl$Z3~r{U3Ou5{ z0&9Cd-V>U2N$ug&l}Wz6KDUn^%D!xQRmb_z zjCob|xAKjquIAj_;#TlPr_4LUmn-tsq2*Ifzbh$yA-U<^w})1fA7^rfewsTgCZul; zZ)DZEY1^*Yao9*_arS0fMXh30x-%u!O>9<9;*Lqv^QJF4F*&h!Tkn*Wo0Fx>_Bvln zJT>uQm5oy02_FB2tK8+Y%5z+Iyj^|!;M(e{q*Zp2tBv-Aa@DQ*zFX9=ZR-1T8fHhE z{dOGZwGp*p`2HeJS9ZRCvUbDbh@A?dg=^gtSa)vB7EyP1w`l4~**fp=^+n9J>?^lF z;`S~4WYn}ln76@q@3vn}0Y>T}5+Sc5|F8deIXhv$o`3W{#?}*}Cv4{%2=O(od$8%_ zbpxBa3l@2t`u_Y$$$XBHE3Up-U0&nR*7fc5E_weNZ`qjs=AtXa6;XVj^? z&${DN{x%ow@X|9%+#B*-XLBDtVwSMz3v&p|>+Ihl>l2@|G+j|Bs%U)X;4)Qu-HGJ; zuRFJV=;7Ci5m87{^k$wuol{CyQEzJ3r*BMJPH)4ab59Cd2pTxQQ@{82z}^0Ysjq%^ z_stQWV#>GY!3FE@a~`_wP5J0^;*DJIR=zitUN#59o{1f?y3X;1*U?J<#A?~TXvN7< zbp^k@S{ruq{(IrAwd6`&?V0<=ZlP0uZg-j-*W`TH=|{r853vE9N=|p;J6M_{c$wvz zOgtJ{Jgk;YzU8LvDPvTe>aU!9b*h!Go(-C!Ceye`hhVW>clEdCv-u7t@vB z#=5@<$Z_ZJ^V+Ro*xB}BUJ`q*v9Z?Y?AcyNxDzrbuN<+ zTk?Y4b9^?}I@A`UnoqcJX_rTDm5pgQ`DwQ(|9i>iJ4zE( zADf46-CuaSCi2|Qu$wWSRvCVck5u2B<>o7|+3)Eo)f+eaqHp(uD|*K^u6d-_zP3nr zcGXe8Za)Fn#JMjyz8*TymVIjp?-5gbErax{?31m#{#CCwir==_f4So0uuDg0hOx7q zc0cu&WsUlCaUZOO*k zmo?F|eHzQ3v~2ej-owV#S+zN;xiNT_$Sn0b2! zpT+B3utx4s#hJa6CfHBU;dA29W;7~V z`cK_yLt*xnnfc7K4|2s)*mX)t4Me z+mPeVnvlNe_V?r5b;5OiGs4PduGkPAdT|Tu#NzwDveR~+zuB`-ZrcgtNpvAjh;REekKdU{D^*V>(z`%YL?7Rd(euQN@^E#o<+UwO5c>G)Nr z>nl>8u1WGOaJ}1p!|{#g4aXzh{#@OMNG5V+e#;j=L-iF;zV0{34PGi0>DIPvwc-3nE4pKh z&YiOf*xkF(zF1Fj{WA&S$Uud>IDeV4o7NJZ`5~^SRP=)8pKjO8{qk&1$by{R_GdH> z<}oe}pY-Ozhl&|LUw%tkX{9(b=*BIjgDanTdj3t`ZW(dcEAC0dyTi-2tx|Ds@tcs` zYae-B+NZa_DJlHtq+M|fc~c_q`d|CUwmh<+D$v&5?BnE6)xxdE|LZ$U+OoD>rs&0E z+xLPpIePDek9r)93b@p_R%Wha|B0Gj^&clT%dMW!zvtlW=$PlF)9)7;oolt6u~J%i zuk7`zHM7L^rAOu{+xRUw1Mqa>uhf8M%c%hh2Tva`#*huswbu z%R57~_;{K55vJ&$J6nzAFR$J-uacGhL#mYJAtfEVBW0HJ?-_nHf1MWh?Zo-)m2p<~@m8&w0yrz9~5$e_5Fk=c6*P}B}Z%(;qsxr-Hdt>r#)qIP`3*Gwb_Juwc{TW#B zk>O5);cwmv4ie4Jk8rnfJm}?Js8jkgP(EtA+@H|*dNcZzyjr#%Ihqp4@Ws$G*;>6N1^2lh=0` z#b474eO6zkx$5n|kO=dCv8v%xnNjEVPtA4QeErfntF-^SPI+H$HUF&>7ah&CWp8?G z(?y#gUDK6EEjrmu{!c6uD(zUOXSA4U((;V$&Y?Cx{$)S;;{Q(jWn-T~c=mtqwVR4_ zo`vnYv-i&PRm!TqzfyPlM7Uae8(ll{?Wf0o;fVpWg#TQUEB-bAzC+8@^0`@$R9II_ z*k|80t$WzB{rtgmzJ*E*wHxNPFVZQg&%SZ5=HQL8w${(mx$fsqR;`);KKX}F#;R-H z$B%CM;yk_X&6Ac5?1!d%*XzmLj zIlCDP`{pJ-o-f6)Mf!i0E4%GJ*^a&&)6MxeiP|k&+!=4i>biH4!kOtEm*kCSyD~r8 zC2*d6#uY0S!=tfoRA8*{(b@P8unN#$<=SaWG(!$U-JGV zof9kUG&2}E4m~-icrw3nI$M@lU3iqpr6XK3tu~y9)|?*5>C9pDv2~NjWrI7rCS=Zy zo-*Y@$apf+zHS8?768~MO@-gXYW+i+qZ9@-j=^EM>jqz>gmxNR?Ba& z+z?NTQ1Lt^IHm-Dd@nAt;vi8}jRhM`E-CX%lu-C?XRhrA1 zL_@C~J^J4aUwHhvFE!=kX{LL(CTG8ltCnT2(Ej~N_J#gjJ|5Skq{WMcb5G8?u>L-; zZFyGFb8pq|bFF9R%gv6BHoWovb=agQHIqV?nYPuqOD%UW{!x2C@uaoDqNbNO)i?|t zCYxROW^mbE+x5v2W7QYco;4?z-+Or7c%zxNNS>|vNI=AE%spDdsFsznof1KzQsKC_O`HXQ+S`Uy3}dM2&ta?(<&+ zGv2+Jb1gn^)k(vTC(k`wwO?A-UCty@Btx6AL-+o+3QxZSw@bTK{=590#^0{oSHDwW z-<3(HjPfVjM981s<#*wL`h%vFSJEfi4aD3Oi{@-UdDb%8EN1uCJ!bm$E}V&4H`11F z$_tsNJM-ao*(XaE_=FrjeZG&i*SaHN=>iXdbDyVmR15n3cXVA8FNf5guV0p*&^yNLAYc7qExWU=-~Hi4n4|yWR;+Tyj5PBwg7uu-)Y96UfITwrL!`&2_8JD z&wrI+mUzzVuU)NHZ^Y_LBW}daIi$L+(&lm9{^^geOq;e{>1#r3)Wt^y9Faa(Gv-83 zaT8FTc{%Wc*uJ@)@^9*=cJhB(9e8H)^c(4ln{VCC|?7}SRH6k5*His@v`Qd)_Io-_uoJL@y=J#^I{hw6=&}_ ztlV>QyXT!H+{w?Sn*~|=zSKS~aAz%v`-zlc&2CZs=7%r&XfLfMKU=*Pq<&@ven~6ZTJ4;mpR_cw{J7q-q*&;o#W2& ztK&O|V~=HST|<aVs9V%W2b_rIR1^!K)bM5TM zkGqtrv{$Wly)3qBZdAg@=>;?POI|8{cw*Wzrm6!)yC%f1x)^eQZmMhDOPwWe8T=~5 zgtwkr%h&UG$8wf4{aZONiU&Oje>5Rnplg3!HLu^9xAL2nPjoF~-Y8d|c+rTvxcU1x z-PwQtT&jHJn^b({>#@qRmVc5*OH3obTAF_4dV9t`?!n43h6%G?I7DAz7XR_(?5AV@ z%50zdUy&~9F}{D1QD92aku*2;Ta!&M#zf9KZ(FcaOm)V>T@E(pR&mRn*=Ia76|qJ}$hdyK%9;jkl_Y~R3@@v%D_rk${NtBTQ%#fh-w3y?VZC!yN&d58V{2~4sa12!8(&>)Ne_|f z=IgByYWODo(X1g_|I;nT87XC)df(oCV|p-m@9#wmx@W4{m)$hHa_|7(3qBpYhw&vz z)AH1fpC}qWeth7mi(L}iB0s%<8)OgP60fyTe3N2xr1AUWZIVZnIre(463}{7_3cnr z%LBvP+%d8q6Z6w_zbw$V-TC%k@4MYCJ6(!9cjoxt3~TFpx>8uT@~KjH(f!g5hVP#` zEL*xe`&Q38sa>-762v>0PO>$G+?;iL+1uqW(yvcnDEiUp;kq5HvHCMijIO@T|2+8% z!{^h>M2)O_rfZzD{eAv?(~O?xGr7~-@5f&IV6|OJ+kb_> zGwXQX{=TI;Mf_{TC-&t&8~@+@I0xC%iaL zE7Y7|%edVUE0dpN_Trb9cj>{j#S^djPQ95s#e1ch)!d`UoW8!hdt}pA$MCv%{ikQ% zpO}+%+;Ug-u|JycLbZMRlBTZ=Sh(YpvT&~5&Jybb$3Oqkym@Q>`MK{D`VXl5ZFzS4 zXSjU&FE4xJ4}T`U$c+zO`tP6jR&m#fGj_aq_g(*Cz&WAIy}J@JSFT%sGr?y=r+X8} z1Dk}_DULr#9O))CB}x|_ElE&X}) zm8`v?(-&`FG2c#st>@Xlpy|1O7a{^oPS3J`(R9J3XSvP7pvhZ*6`Bg&{L!)3($hM& z+9d169-FT>olSr2{lBfZ>S1Kom1itcb(j6;o8R$$s9+_w@6zwrkXdG+#XSx+AQ z2P(eb7Olyaf4+3@lB*3&Qc^YNrrPSNuRk3*&3bj<@~Pr(`>(Y<%nWgGajdY}k#bF@ z_3?2gce|xwlDcY}FD{&=6YzxfT_J-I&n(qXR_WQ&{@hCcWbBva1syS8|I=o*Zra+v zohqrhw`0`8nqQriIPtgowH#1yFI(LKV0n-Y(Ftg;vnn_0PURw^>7tWrylvm+3n_oTs_f;nH@rUb4yEa{YvcAvOYU=XMp|&c|Qf@!5u=%!c z#m&9fwjZ=)4!P^*-pM^{#nqpD;U{$im)}(n%jY=Wv_3!mQurCm(x_JvQsY+s40Ve2qGpLZl8bt>#K>+IVxt?BG||zM4Llew;fg_gaVS zqpP6_7gh-E?k&>3daP-YQu4%I+XYW8{$_2FHu=PYug+zDn;F}Bwk~X_9lr2+tg>05(`n70yX?w?7aLwwl$Ccl#^$sAL&={_M~W8S(D-NL`q%Ju z#2cMc`T?sowx9Kzy29_I*o!R5tH}%0j=pip`*U1>^0C1171d8qO`e~4CU7JFqbNt0kV=lXfeIB(hH$cHC_U%g$s$)>paQu)0vQug~6_*+RI+$|e;aNWZxGgn+n zofr02-F;znN6W*-(|=eC{;>b>Wpd|7@95HJY5K>O)mv1%FJ=F8>7|3gmk*zp$t~jf z@FVpmtJmCvv*SCyZ7`X1zU!jQ%fg-CivC?Z7<{DOZ=X^1hOPV8tv|(jHu$f}mz4Qi zkKWt5X|Z;AnVK3J{rzzlwY z=-Lc9m0b&(-w4dlHszgKR?D+uO3j>Ug^ka`n{WGfzU-elbx~v1LB?hGwSVZXOtD+m zecYe*sO-t?n!DwbIMww$@DEiJ2eg-^(2(P@p3C3ilw+c^6tW8(#{PqmZM z3VribPAuH(c8BL5?{$CHZ3{mikT&?0GQsgnTiZG7fSHb${5q}Py_)va*H-SSuhHAa zOo2s)=TmA`4*YD7_jh{HKhy4F!|(k?W@7)v1%Bu0O!{)DlyPd}rf%M#UL_U#N6Xdc zvkRnf%t>s`h~340Xm;v+n}0gh!cO1Y4|zCU|M2L?lXj8aS${9SQJt{4{#)&oMcb?_ zD(V-Xu88(mRdsiF@9^<7nf0~9EqAXBhRCXq^_BnR?2``|cLqLvsb{CS0<9`0weR z{aWu;+*aFd_`iUm*3fgF#k9JwDl60epL=c@vs~41_b&mfbjEj=BES(T2jc7JSDKfGK2u{EcP3F3VamPxNCVs4Uj+$9{xmxhsv6a^+UsX4{#b>Z?bI^hf3!J9T`;uE#b9eIJ zoGo_>#XeU@{XT!_PS7gti&2x7pDD<>)p0>hV5;`zob|IOCzgL{F`1-tlIx;t%yj)f zCYRU~Wj)iJGMWq~t4Oy-KCbK#+QT?WhB=NUJ9>xmZ#~25i}+{e@6_BR&iFj5t|ayL znX2aIAb0MJ>k$V+bmBCp9}GFU$Gg(L<>rsXhH3$}K9l{0)>3Z@n?Hv1`h!8Kcv?gP5+lyBl2%Vaz+qZWxfc>FM^g=f8Z-f}iK?4Zb-s{oKiO zn=`Jkd6#XQAGI54C-#A@z@#mjD%C;q6rR_v60>hzqMF}p0Mt=VGIZDf7h{n4|?n*pVER#kO8 zI){W4S-x+(Kj(U)N#NbsDL3yp&#dz43{<_Z^Xuc11(OOT|GwH8wqpMF2&1FR&lpWT zIZM#H_@IwH|1K*JBj1WLjpko(R)u%G_^@~7On$};`)fruUZ*4GYsQpIJ`fZ+XJ~5o zBz96y_6$>@dljm6x1E)Q4(<8N^zj|Lr0=y&hjw)MF8T7=@pfqalLrZXHk(cEMy$D- z@9jdqA6--`rzJBo{(N?$b#_w- z2md4$yZ4hXc?PxA2R6Ew+jGfmOxw6w>am5|R0eC=p5{fD|8z{=U#Ir0``wL{J>4lH zJoAn!j-}aibX4YPgcj1hS-1u(Z zYRxOxo;&Y3{qoE^f~9Hcfafr^#5BkSZe*_e_1>4UzepwYi)mNuzlvnFN{PR7L;P1<^>dGT*yiyv zF7?yS{og-LjH{l~+?_dJ?_&7ubhU`sn>VY(Mduo;9sQpc>SUCs^*Hv+O3)+4U(u3q0)ojUw|)5WyvEBme+L>=1h-D`Ktp7s0%&bSqNUf$YX{@;tHgucAZ zANgZbXKVhsdY1=plcjogq^Pa_$&tIDzx#}l`;^wr6?`170#-Y6RN9o%FaFSVWbA!z zFnKzMkMT9Xbf0NC$0D=CwlSZvp0@w*<%xK?6W({ZWk#n(^N_P;baxcNMri|ZNAKe=kt z%kFqAwolvT!d$J!5TLUBw(!&E_TLyxKFzwYx6S8%c!Ype3HQ8X3BJ63Cigq08>`6O zGG3T@U2#|Iw(vsdD{r@z zNp>ZAP2g?KYt&#m`gTueil?+G?{kIq6DP5#vTmqfq!A!*hE zrmn^r>%5H4Dp<`dF|63p?6;-;j;rJ0!lw;0cbix&W96~FBrxyVx+Rm8F1SAoyuc#5 z{M^#!pOb%D=eAD~@0u_5K4t#9n^&)Gncm*hw&L+$gW^Nm)m453K2y)J{w@6M&oPxt zJ<$g6Hm4X1h>uMw%)hqXi%yOW6}TDd)I8)a$;MJ z?cJPE&9z~nPmEiVip(5dhCKV;Hh1BDE8ne=GuvxlbN+jsBDbl$7H`QXfXOziV41CA`7Ej%~DcZ&F`+rOk&8>=`!TFfaE zxaUsdHt};&4wiSlySb-NnIfhi85Xfvt6TwC;LkKDy17$tkP(|4VgaN&S{B z?o-xqJh8i5|Cp|fm73ZjUp1r+uyQjW<_DQ>iNBMr(m0sJo z^Jd{=mHlhh2fyvvzO#63*i$Z^!ZXuWZ|Yuly4P%vgYm2BYwLD=y2-y?CT8FA7Pct; z`3Y{DlAcMYUEW~n_pyjIIXw36x;8d__sFSzSu1YbyYX!8ynA8uUbVcwRnXTbVRApf zcg>r*Z|3YSy!h_DWX9*;o;fusyPao*MC`rrGA1PE%~Orlm$rAZM&$cXWc{1PSKhKB zQn6W8)JyA`@iXg^kmPl?w@Zy5x31q|^}O)M67fSj&YFidX|(FJsRVl(ZF@bHXSS*H za*YL6%Z_LMJu!v5!%9ciTkg@Bj>^o4iSG_Hc<4z9)K)e;JGw7p;(Q^|PnMqhf)A)# z@Au%i>G|oiZt=Hx++BkSrjk z>@F;KB#34G@ip9x`~OU@yrZ(SNpw+D0juY^);#r=;`2{ZbeLvU|1x~)GgIZ2w{2qL z3;SnhEg}w2;5>RV{ieFyeBD(gH@RN@n#HBJ`Sa!dJrm#E>fdQ)=N+LAzZc?{DR92O|1Qb)4?N|#Pybh0%>BMa z)6(zFN*5E!WuLG6{;N^P#s?AyZ=CwZyx^zr`v1Pn4fAc??wHCgGr~AVe!uD7^`sd0 zg*(I(-$!pyVLQlnkfZ!nA&zWetrDotknl*&Cj^rK76^~z4}5uFwI?X+=La>nN` zpDPoMm8-S1_I9WFCT9rB?az4qVrSsngEwwGK62$l%&&&82X0Vr*73-#?y__pmZivR_m#amz}PjnljDB`{yU-u!5FjQRB^ zuQGqWd-&uGc3rc)^Kj0J{3#)7+wYt(H;n3dvN416|0?aU>t$m6 z&lDf+V*93{ny~*uMEYe0q$k6$SO60j1-FUCG_x^IzJG1nn?}hV}8pt#L{K&(5>dC9_ zN1`t4xbCM3gxz*{#(DLX(6L;n5C2spI(y}mzx7Reazc}j%fIzPuKy{^`D z_8d4bTPd$`@!4{@3%3LVoXg^hqiWKcb(7J8tM3_S#8)l5 zDD&sq($$6+{TJ0oo%xfyHasb5!QF&ui+noNv@IEt7{sj&bMN#Tw}}f^<3Fau ziZTzj>}`HH-C`}X6Z>ZgzFF~B*9E7_UHy1zwaWCrOnqO^r5L`5(QlJa7F&NHZ*NQT z`wh4Ac3iM?5?pW0JE`{n%Djg^*8ZKwiBc`EJuY47JHT*lqQIj`EBCiK zcYJuAd&2kI$BP>_CR<%Rzi_(r=CTInDcRef_3ahNx?y?X+?%c)p_^9SepSxOzuP#( zY9+s=|0K~hWqUtr3P?SA?Ejp}yU$nu=hNqv_x7~B3%TUG_U5ea$fDfJ>$~5D6h2>i z$9np#t%5W1cK?~8;9rn6E3)0S@qEr)sWi@^5zuSi0`e2FIDM0atz;S{HHA zKk1{pQk#L8(tE#|vkWh3?V zF_FGY)yl!ublAj_L&za zv<2s^ukQORJ@MQemLCPI&mZlbqg}IY$ClH(&UJbey*N^Ilb`t)L#P&OUvT_q*6SYE zp6$5A92oPB_rz=8{dLYt^X|Q|c2D4!kep~g<)`79_;1cjnm#fppWFJw=z!_molBpE zR&i;)+bH8Wt+{7^EaTq~UuG3`vhl25+qM5^!#`Q$t{>IwlxKbZ_2I<*mWH4FvYfxK zFT0l3nE3H}=^xegjn^-njxySPU)prvx6d}mea@Y|XsutM9C!QQ1OdbS$^x^tY%!X2 zqPja}X%7GM!oM;`Hi0v^?J^@JPILW~J9Pc=B#tl%jz3qVXKit^6@B;bzoS~<)|Z_Q zU#QTo>5J!g?)sc5n$Y*#Zlz$dvHAMC zrf20B^*0)P))ehpW-<57`Go)8LC?9*2MM>??UR@EpW}9b{n(BZdo{Ozd*@$ne_nUO zKgZZbTKhSsci(+K?dekXk6)Yxn4%~_rZ$O4VE*5^$3ZP<8k%PdgZSU?y~HHv zk-ACO=(j>t!KUjSg`%eAQ@t;q5%$Y@B`$XBy5`C#e;sL-Ek2CT)*ri7nsImbwVsb3 zUs*JMj6B-1=6R3!WVfZRPcLf~I4)B)ev}iL7OA?;@|$see$;Mxu{)u%9bEojuSLCz zk~uO-XTAL9f`t*^QY>6gOP8*Gdwhj}UG#P>xyF)`amEJzL=iJt} z8}`pHFsV4Cqkd@0Bc8hBGuPylEJ@XSmVfZk+KAnAqxf&eh2^*=ZA?vz>K0vGBU^Ww z!|e3gCED(%KS(9c`>%a0>(A`aEob?P&eUnh{oVO;a{8B-lYhOL_swSA`Tl(s&hhtd z)PDW)b6;YENu2IHJs~4jy|3MSb;}H1>E>+A)*px6m?6Pul!s6 zJzhNb=b8OB-SS5~?RVMfKgs*|S@7%T<-*bXdoL~w_Vcx35J~uEE9Q_LurA}TD*xK> zV|Fo}Q*10mD<}5e5uCJ!*}Ju|XraNDkLpbB)4cY0728BAZ{8)zreGRv5qrwx#Twb! zIrV-^8sxJ5vN@}#PP=r{!u;8!E!=tu$Hbz$V~*$E^$sd4Z10#}i@QAQ@0yt* zH7PHb?V1zk(7#E-n63`bC*9gd=qs!S}CjQU#e`g@bmxAw#I$9 z#uWDN_v$BF&G-MkHqE)b(cn$!%g|3-#ooGZ-%u~)yL9)Tf>}`;-!i7PaU*h71P(o`jrmW~oq~c!1G#&--6`uV3)lzGGOyZQ`n?(qJhi zt#m|xkz?$_1zE{SWp9+0BxY3IZN4RZCb~l-wc+Z=Cw#SgS8ktgdq3Isd-Jp7s&}jv z)RVMc))k#G@>kgrRBmtl-}dgc?44WZN8Uew_|tUnV_IK!h=y>z=4%wYsLT3Lb=!om zdp8+;UO44Z-3#VxCi4#j#Ai(Nv0oBu!+TiqRnX=uIgbTG`8Ixde{!eP^M+e)@qMh} zGLvPeXsmsIdyTqZz%jlq&fH@mKHobMSRQn&I(vr!uKi}SOyMEB8 zl&(FjVyUfVn^;$5an7j==T)fM_0*>={f(xghBZ^u1kQ5VKwCj(7cO8%0-n!z0u5OE-e0I;-*7)RaqP>L5g*wF(&mIU#xCjZKxl&Z%vW#!%+HcO%fs9$V zZ=AlE;j>_oNFSSPkK_gi>4lb=iCRU~4_2(4|85JztdFua#_fFtt?fV61pa1bU|ID{kehn}6e)?&jmoj?X<2QOx4hp9_f9}!+Sg)1Sc#OY_>s^`xm zw(~Pd>^{N69RBZY$%&=evghw#)(o5Iy0q+o@wpa99$#HAclCE!iW_AQaZKahdb#1t z;hg<(PF&ON%1U+W|0QhKza-HVa?wh7>lF=S)$EhD9EJyHMx|ca#ym$uZF2I-?;E}D z@AiK#uqNtS+~#nXM4LO^6FWkjdCM9m*Pb)HHvL7y9|oK1J$oeHAGeN5O1W`7Wq)sA zPffdheb4^uPn4fLe8zRYAjbH;z6lK1m$vQ8-x2sI;mK96HSN!KHMO???1{FN zob8d-mFM-8Rq*lwJ?9$@Pp8f`V|+GyXY4uK*z*Y&)F#JwN!&j)hnLJKWZ@-nvCqT=`YCgW;k&cjHW@TvTC>PQ>Y%g^lY=S-28)sI3-x9a8tV2WZd4u8shA@d`#tnJ9 zA9y7SS}kkzGdOU0!m%X>M0Z!b){qZrNC>a|Q28`3;@(j4(>{efNigD?bhL4a?~>_- z9Ixx|#Q3SRhJULwG3Mppef4nNSBuM`o3A#w|M~N*$nIU$_VARwS`WnpnZupevjiJ! z@iBNatZ?Di%-Cb+Dzf-c+U213wnu`sD;raPED=*@x0ra}PxQ*wOU(iM=X`y&DKL%U z_kx{!()dg?0%m4NZR1^fL-CB9#=_iUp7~Qdd#>kh6LXC=(gvpHtS>BW7e+R*zsU$ydam*HR79pl{5n>S5P|kQmuuCNe!48!oV+C7ynkh= z`xN1KYS$LO?6n9o&Oep8^0LCDs`3RZyt=Qfr*Y@{0u7HF0{5jkal^=kg>RU6r=xF)$#UY)+QfxgSzM&(fJAh!GK zPb(ZXcsJAI`ouGn99U^i<&?8&W{>p8eqFVEY*xxq9|`op)fd6#3iJie&Wy49#&&&lSn zz|#Lqcqeb~KVKl1c_lgWpzGDDG%u!xs+~^FHzusuaQP&Alz#1GBUf?5+ypQ6r1Uc? znJSW^tt>A4>|Ey9_kDWN{H4@?(%$uor^5~#m|1N3cr$(O)Tmb+4~|_akWZX=WX|_j zr`H=?J-A@Ox%uatR`I7!kv7*k%f6)8$;jncU;tyYqfoU$kRGPH&;j=oEmPf?h#g5y7u!8UIXE-0#BRoojm)jOv{$Y6dG;$qkYaP?(sr) zn>%ygwyPh0Tf@fucb>%?vp-L3zG{cBiM$yatIK`Fl>2_wsS^h-O}noCTFB8`>grni zJ3Vdt{nMpC4F^i&b)_{CiF&2J@jeQ zxyQ7P>4tWx9&bd?xkoK;e8R47`X2GGNQ@!V!7s5f+I@oLzpBy&Q-pNq3av4+j8@F~ zu~D;qdjqvB`>t>u}E8!SGF7_Oi9JlKlwxp?o^v$vln|4U5?T&%M}hl%l$HrK_X zJnN@dD;#7Kmv)|;y0&R%_z7mdXOiyv3x95iZjHCSvbp`{s++H}_H;g+DqgNW`)f*w z)LIp{i@XT}A|VV%Cf<9X{&kk2#xY~LB<&Q&*oQTzCY<>5wClw+%cF@0Z>%YPf3lNr z{#4Bby(Fn9Db8$8#U}+v-e$CLNv%{3SIzJczo?Z_c2AteYQu3mIYHZi;;nLe|Cx`N zmF8B*w6bP>30u>9M%1P?H=QRX-t^Y;vw?cf@((Z9E-G0o5Z+mFKH=-HeNFN9)qAY& z=Vlsy{8pqhWx@^_^~LS01y-8O{VL(9dFxI8;mIdt!vr#&^$yhiO`2=<>diI* zDaXGoHMne_WZ*1*a#2O$6rF?L-qqGjm0Z5!vYv_XOn%$j>FaMv9_?ved9JKQ(^yuy zVKc`>z1*cY()bnfJ`{ZXG0)cTLA$PRWSgzln$7(0*7`1H+`N8^xMTZc=GOubH^{Oa z`B`%Qxd@Z}f;~e2@94UklIYhnHveWO`0Ks^rWlDWJ-5$5FUj ziKikwP$F3Smzx(yn*6JD7wx%=4!*c%DfG1I<@P7WD+OeWnftGKY)i{u5}8;p#(n2( zYWv3?e&(FJn(R%|kN&?f6?`+%dHs?=r0aOwst!2vJlQ?Dn_!g$I>0Q z*nIH$leo4puVIqC4?`ut9``QePN{ti{BFjl?#Af)B%fP+;m=;?KUX!ca7}U3>(%2u z7IZLbg;3bPsBG4?zj&{4mQ{9LYWS?J?e%uvTFp7Dc}s3CHxr(4Y?kmdZH73^H*CSS( zKDA2p%#BAgSo0$Gm%g|E^gbg(>eGAn*R6AFm={i|;Nf&}kllNcBlY2=jREVA-d{H9 zt4RL4n5BwqV!Eq;pQz@j{JLiItRDZiifw`Mja`!-*?!KoU$l?g|HqYQX)nE(q&gos z{Pyb4S#Hj|T2nKoSiJdB^#4fSvG3n6F1fx-G|RE{+PJQoqMt{|C4>?&zsl1w=F)}uulD6P1m1f>9b)6R$Tm-mc{7^)}6?9EYdc9rqT!TI(%1Z64pX04`x}9Wh;# z>;7j-XYrIu>l)rR%;^0yb4__|ZBq81x6|eK?fv)aSGT`i&HK0Jakab7$EE7`i>GjC z+nQYRnX5AA$oa1M)eSNYN zn<@fs4d=IV-&DGNe&*zvR~*xpIqO7Rog1Fe(ECVeXI;kie|iQ@*9#6O3o(@0Y|5F% zCUNn9wOqm4{}sy}udXr=|Fw5}p8Jko%{az{pp<=l(`E?#oLb)gUaV_=f7jx#suvU_ zA0I5d*?K%h=+HIuqu&+_x?VbXDW>2P|LZTi6L%I(6n7MAKNGN+`+H}@q9tvC7T=6o zqaOa%yR!U{Mf&T8q7>`Tehn{wv)6npbh-2DqOoos;|Z2qf2yv{H*J%#dayO{)Em!L zPwbo?IW3u6tE#4Kk)Aol=lkpmK~>wMk#R4sOQp)+Sz~PaV9WB>vYpSR^u+~N?YX*! zQ@nS9>b6au@0KkS&bfV9>ch?B@Ao$g9$u|)doMQr&9=XdrDhXrJ1XBldLN<0^0;vB zL)XTqQA;%<*rz?6|JB@Tg0g3hwPPFiL&riDj(N;G-q`O;H#v1u!0#yIzCtgdZvCE{ zY;O{@Z@u_kqqVQz!s6@1M?NwArzhP%$vAhB)_eEWdEX`lG5qP8W?I!8^lVdu&8Nz2gU88eLiP|1wacD%OngrK^eJ>%~L)~)5|U2-R7 zE^hw1_Q5XgPn{BNpTC%#IM&p&RN#zbdv@Vr5nKPd=rcLK!mqDM<-|_e;N%~nX1$BM z^1RHQ_8PPA#dji#*e38ACT853weq4s_$CYWP1oL>JR|=8@tW*~q0tNPmPe)EUR<|y ziq>r24Lk3}%zghcw&wVXmHB*u>2vsFk1q>%{uDXIvt9Cg+v<>_Lt;*x=T_d%%_?=S za?Gw+!*L~aQ|08eSNx64;ry+hw+}FX$T;%EHYl6Pg=^KO6;I9v)a+Xp9=B`%;^ z=Q45UqgBfeTt56$&bR(X?tCrHi2JjZ7@LGNPjUUItK}CEo5FeU_9bDx*=b+ryqdM) zTdC=0O}^{@9)7DZWA3p(wtS1v{q%nkqB})SGA`c8uH;_5`)J6`tKJ_k6v&%qE^s$*$3bni9hFLl+=cdy;H?0d+qqOi#08A^LDe`MR^QX7(99a6ZkR&jg742GO~uZt%?R|~$szgvan z#(LlBULDI)jjwK1Wzn5?K#i-bMZMp%ul2}c&-2^cE=KsC=$hrm=se%9@u{Px%?lO2 z_`g^F9bEl>|KDfc`Zl(A?#9g9K6~j&k!8Pgjke8kKJqWz=7|?U1ZMZEEewl?`wE`-N%pr9-Ub+(S6>< z;+niy*RNiEqqq4-SmvMYns;t5)MGRG$P)W>{@icJ#pKU1_XR%D`m^g(VcZu^jmYRF zl6N0IGRg}m5p~Pj!Tdrl;DB7CbIqrnjTJ0OwvrchZ|46n@@l(xPgB9$@9r~?y@4*r zS*E*(E%$ej%?YWRA@_LSW`4y9Y1Rtc?uZ0V4Q9Kr=7qE_SJ3(X=aQX=9D3ZpGkibj z%BmzU`l?XH@fG`x%uB&MueJU?FIrl@AZ|lgQH6EZbDxD(XNud+e=%1@J-?g0V%^$v zB43}(URQi`$;N&~S5C3=?Uz0o9dtj_yTAOY#r^7ws~68-`1G8{!9$h5dwi}4)Z0mCmjF!(7u2xD|-5s z=}Xo>6jL=i-M4L}?`~&@Q+kIRP8?XctoPY9HLXqicztg&cksxXRe)pF^#+$T<&r35skC!d?z<7NIsZpysB?^1%b)=8~SGh6I7>2L`n z)6N4^rtH{1_hE0-s-wLblPVrfbylnVVXnC{zQaIbmGTR_^`$dn{kxTJ86J7~Qs#@v z^u|daSNhD3W6*n%xToxd)a?zEoZ~l&hi`ZuP|;uKzxUd!HP+YMS)b_J9-j1g`mVUF zrJ4)A7X2$Rvt8;wx$&7sw&ItF?~&V2F-9IsZhf)wCku<~e4m{nFQgonf9=UR9XfNj z#vHEZ_q{O!o+dx0Hl$?DX_LMvJV(ELS^mkbvZe=Yc#khz&+qpmtx-|oqvEc`6H=_} zW@bZ4Wn9&f&WvD9`UehFf&h{!DhoiGRr_E+O6!Ir`Q^dI+ z-eM=#WKZe6Cuvreq`N_}wtnx~)z96T_n($W9ck*f{dwfJUEU?(>Z51n_b$^tWtKE)i>OiB*XrFbPwUU0 z|N2Mvzo*~h>b{@7em>r+{^P%}_#NA?Z!lkN<9q6Z~a{38?{S(L&$YU zE!JZnW0D_Tys?Ji$xYq;+Ed&6HZDogzUR^C&2`>j{iib?i*GL3>;1v|Y4S^zpcyxR zKi6Gtn37Q_ucnok#2OwHcImD6qgf$lrw^WOUR~PDu|`H(#&$%rB9Dvf27kO#_F6$-<8s`+m8mg-rE&R5K^;9@F|8Nq>D-UE!MVE_URW zA^-J7Mz1~<{(rf&&~Jt4#n0Q9Oto0ibgP=l;N*+6WWCxL#s)|I6*^_L@%AqZT>`8p z#(X)>y}0)Rck=OD*YxafJ}G&Zl5tT-F_LleoIhbftvnrEJX#n2N*1`EXAoJm^+Wq5 z&r?V0H?E9W(;LH?UggyHuD$Uo!_-gr**Si+Z#|-FtMUHTS(lz=_Gf4BJL(~Ey4&bg zJ6FfW>DJ-_a$K6*+dl^dvE2;`mHauaai0^S~n7PAM;T&7niuv=8+kRu)f8M^q--flO?)2CG zg62~DuXeHQcI&g+E+jTItopt6&7HG`-~P|vV4d=}c1|*v{2wmXr+j?t_dj}WQ#Vs9 z=j@5ooA?q>`#rWxjXacaK{(Edt)Dad)H$KzeFReX#yLFw!d(GRbU#8CWt8trH*Svl9JXoEMe_C*Ef9Pxvb^xU#6n||7KTBQij;Ip2TC^reC{PRhJ(67Aj+tepKhh z)ae564R30%erCegF@NKGkKDFmU8cUPZ8uLmEv)80tf^aLbtv2L%4UN#^O9WunE5=I z@?+_|x`j4ovyN?GYCCB0f+;!q8N=T6ZaM9vdF+tB>Ycvx(~tE|6S)UvSrQm7dv?yq|hn?mRF-`)Pmb!jjWL z6`85ad4+z3zC2Ns*DY@QUSikz+M^SAt*4z&un@PnEA!dciaS2RVh;Cn@8X9q3cQyT zUMk4U`TTI+=1ZA}XMOq4@kGM+MNweFyiI4A-|Z-9XlM-UQ&_;}!%*HR;n9%WXn2Ru zsq46-U|c|ernH>N!n6EsSLSdp<6X?NZH1+n%rWMJzR|r0g-c_2*cr_$x3fy{M!TN0 z|N3g?@9#hESqBI^9(g#yVY>P>g&ET>egC=6VXAkR0N>ryT-T1P{rYftv$&{vzTCdK zO;)_x5prsV*BqqvrA40D9u&%2vfz23oMU&znbrl11x#E^=W=O&*r^%0!R(IWo~kc* z{)K-!A9VlLiTP2k~Qw$9JafZtl-G*0VgTsNE-Vr;q73 zqu(9oa=#x>U~cTsX_HAvUu@?6LF@3s^)ahH?J4#9T*)ion|N%pgVcmsWlz3r`I5l; zp7Fc+6ZxBuGmTT`mfX{wd-TV~wP9%%-&~j#_ug>c@4??Bl_zXmEF=E?lmcG zj|(cE*v*^u^uWx3EZbf3k3A)Je?EHX#EoBzUhy0L&M&ZJTd~7RzHPJD8=gjufUN1Q zcXs?dGaOQ&~dV-TABk}T0l_B>5~tZsOi2e zdRiISrhIbBd>#Ky5leM%p7dNd)#ZrFl9VSRQ)E`2@~-0wnz2Y^xyn*a@11_~HD6YC zg)Gx@PEtMa+$Gn#>+6+WfbW80w>jw+gZnJ#GAEGlm z=q&4HpUY?(D*cJLbu^1kPC!88;>L?iQ}t^_{X`gEznOs$9dpx^B1L zSBa}ft2`sGoo;2Do*aAO!Er6|S-YlYUy_X!a?=P*F4J%xB{q4r? zXRoQ}^ne=E=$-bpOGbpe`JEN zV(E#?IoXN3a}(W-RBwF@bocYtNHl&Yyi26OSo7qxPal_Pt_WVTvcE`f=EO6XVlU{v z;hZyPckHLA3jd5Zzm?*zDBaW55Zs{RA2G*k<&>_K`uX#&Ki#*d@}YK3YHVk5&h~|; zRV8ok`V%?N_JS{uq zXi$?sljX(pcEYdi<$Q`FT~(5wPkOH2oVfpfLH`0lt5qjmryu$!mHJ%rg?~w)l8Sh& z*T?$Thn)A__@6tyV%sqdnIsZBP WO7%5n+xL?d|NCoYvl#j_FaQ9~+-9=? literal 0 HcmV?d00001 diff --git a/docs/src/assets/fonts/atkinson-hyperlegible-soft/AtkinsonHyperlegibleSoft-Regular.woff2 b/docs/src/assets/fonts/atkinson-hyperlegible-soft/AtkinsonHyperlegibleSoft-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b1d41566a4f75feb1ffae4295af598e3e0f5b225 GIT binary patch literal 27624 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 E0DQ3d=>Px# literal 0 HcmV?d00001 diff --git a/docs/src/assets/fonts/atkinson-hyperlegible-soft/AtkinsonHyperlegibleSoft-SemiBold.woff2 b/docs/src/assets/fonts/atkinson-hyperlegible-soft/AtkinsonHyperlegibleSoft-SemiBold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e50843936389734ac162532d4df54179195406e9 GIT binary patch literal 29428 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

o^TX_Fhfwa~WkEW%SY|1Zhxwlb1tL0v+ zQ&QT5*RHKg9mK-@emT#-@%OnB=lSj~j=Y#pe>_y4eXXv3oD$QsE-TLa7O&HJ;}`eU z7O`pc#d_X&uc_3Obn;)T>z|jCCUz`XaAS+Z*%Lx5MD#3oectz_cnK2^>)XUsR*h>% z6eJ%_s+qHF;}yA06Bb1nwu$$s8XTQI$4~X^(QU^{-oJ8N*D&$_!JXL>w*{hp#%llC zA~^ZqEw(S-d${++A3OLu`Sy1yjU$Z-^65L*2{vSYk1116i+$w$=0)?1xqcSx%@&Fs zbqh~a?4K*5_jR|B?!RLw&ho-_*MC1)|NORwcHQx3XY5y2Rtx;sWB>q?0w!hv literal 0 HcmV?d00001 diff --git a/docs/src/assets/fonts/atkinson-hyperlegible-soft/OFL.txt b/docs/src/assets/fonts/atkinson-hyperlegible-soft/OFL.txt new file mode 100644 index 0000000..30bf753 --- /dev/null +++ b/docs/src/assets/fonts/atkinson-hyperlegible-soft/OFL.txt @@ -0,0 +1,92 @@ +Copyright 2026 Namesake Collaborative + +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: +http://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. \ No newline at end of file diff --git a/docs/src/assets/fonts/ibm-plex-serif/LICENSE b/docs/src/assets/fonts/ibm-plex-serif/LICENSE new file mode 100644 index 0000000..10c3093 --- /dev/null +++ b/docs/src/assets/fonts/ibm-plex-serif/LICENSE @@ -0,0 +1,93 @@ +Copyright 2020 IBM Corp. All rights reserved. IBMPlexSerif-ThinItalic.ttf: Copyright 2020 IBM Corp. All rights reserved. IBMPlexSerif-ExtraLight.ttf: Copyright 2020 IBM Corp. All rights reserved. IBMPlexSerif-ExtraLightItalic.ttf: Copyright 2020 IBM Corp. All rights reserved. IBMPlexSerif-Light.ttf: Copyright 2020 IBM Corp. All rights reserved. IBMPlexSerif-LightItalic.ttf: Copyright 2020 IBM Corp. All rights reserved. IBMPlexSerif-Regular.ttf: Copyright 2020 IBM Corp. All rights reserved. IBMPlexSerif-Italic.ttf: Copyright 2020 IBM Corp. All rights reserved. IBMPlexSerif-Medium.ttf: Copyright 2020 IBM Corp. All rights reserved. IBMPlexSerif-MediumItalic.ttf: Copyright 2020 IBM Corp. All rights reserved. IBMPlexSerif-SemiBold.ttf: Copyright 2020 IBM Corp. All rights reserved. IBMPlexSerif-SemiBoldItalic.ttf: Copyright 2020 IBM Corp. All rights reserved. IBMPlexSerif-Bold.ttf: Copyright 2020 IBM Corp. All rights reserved. IBMPlexSerif-BoldItalic.ttf: Copyright 2020 IBM Corp. All rights reserved. + +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: +http://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/src/assets/fonts/ibm-plex-serif/ibm-plex-serif-latin-400-normal.woff2 b/docs/src/assets/fonts/ibm-plex-serif/ibm-plex-serif-latin-400-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..dfe0ebe194a8bd317223ec340919a0099654b2a5 GIT binary patch literal 19580 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 J*)Mqp1_1WFav=Z! literal 0 HcmV?d00001 diff --git a/docs/src/assets/fonts/ibm-plex-serif/ibm-plex-serif-latin-600-normal.woff2 b/docs/src/assets/fonts/ibm-plex-serif/ibm-plex-serif-latin-600-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c39282b8ceb69b113b8d6c47f18b369f2298bb80 GIT binary patch literal 20516 zcmXT-cQayOWME)m2vA`V1kn$6FfjNZf{20ms8}jU`iF%~s|i~ILyI4W3ujZYpa56X zY@f!z9NaAe42)(>D$E@+EDEg6I_w?nJk2)J_UA+|=gwog%NVfWefQ&u9C!HwwC>g4 zz1bmQ#+PvJ+mAQ@-?Ilj+Hf)^$|grUMriswxvcrKrY&B&v~|Mf6?x}gg$kdX_~!bJ z>dk4pH_o`W^mM_s#{xWGf86}GRL*4WMC)BDy}8`ePJi56=MuNLCH8G#d(Lj<{0gDQhui~<7> z{AJ#M_8!02BA#3P8caOg<<+T?k;_)E z-hC@XIy^S_j)n5i$eEFQpZ%Rv_=V*L=Z5$LehqUOsn@?<4xJ94ZU#k5%ZykUAf5YWpgCc|e z#GWks6nwnY?eK)iMJb6Nj+A7VHun z!TH05L$V`b-5l=RO*36u60LwxLfd@Zd?fagx{fdilZ?3qGi)7=^$Ql2YE~#67BMdKo&5j)_0+5LKChRn zzhKU{M|QK~>oW&6=gZ9r-hX`RZr%C!>M#9%Z(qyOq4F<-X_ln2iII?$nw7$Z8(cXJ zz9$sjSq@9d2t7WrY|d&Kt?7Dq^KRzOEsDfkPaduiv}re@pmp)gn=EPMyR? z*FSxxn`dbMoqcI9?=+3wN};I*eyLRm%?NzSXl_eAkeDOUAa7Qm1tcPODw^xsW(TG3%@U zqIppYp|NWPvbCFU^lZ{Op0d?SZB5{#O*-zb9?g>inY|poW~f>nlrLa%QCR)>>EpF8Er>f4JzRc(3jvkNXIWK2td4D>Rs_BU`56aQ2=5)11$;Zdw%?IwfFbZr`NW zEGCmo8j>0Q@f9#0xXh@>WFd0mrg2FBvBj-@f)T4Xotea3^nzj2DVGIWBApI?mz-iV zc#Fzg62hncT%2;j<4^-%X5`|t8e+L60;!40TNnTM&-;iy;6?#Yf}EHZAETAITaMa7 zlVw>+M#pOoPK#8%BbDuPGhuqh?>Q5mO$p|jTN)_H@0^z;83MizyL3*iZ@B`-DDa)3!E*MH4pUj;gk@i< zX3Y?|<^JTyVW-uZD$+XIMOMsxH=AO_N{%dGNM>l#%i~}7OVirgT-0%A>&>S-Lv@p9 z-Z7XSV3*y%n(obWuFvf8HRGG>Miz-( z?Ynk&9^b-vs4}w8Dd6Hck(FO-4_!DkBdX-;WRBeK1;P@ni@IfGuAP;tz2Bg6UfFQx zl(Xh5xTjr{c=uoGV6h|D5rsqQE`|40ZeCiXBhshyh2A+n z*u?O|&GMPThi2w7g*Km1CqBmHE(W1RE7BJ?f18(+q2l*wg7%cFUIs@e#js7{m_PHV zdg}V-O#;OZ0iO<-R&X=CSv~u;o%WLxOkqbf8Rh1$SLrQKD*JoDaY6XI^Sh^ershsm zleY8!E!ft6I}mcAL6;xq!^M+kZ3j1e$rwm*uZ}DeU#- zTG6jF+6G)V7qi;M-Cp(n>y^e6{A{v?Md6Pg3x^y**XD zM?&0~VNH}3Z;bf;o61SW2J?1i7Z%(#+GM73=umg#C;!)NdcI04>R4@hw6i%Xcmv($ zG)C7oHy>6z7ZI-i>Qm@Xp?M;UFFfzMbL{^v<;(-oarEkCdz7 ziyu{gKeCzMLr}xJsXmjiIo0&Wf=)`ZpT1 zZr-|QFu%)7OEl!P-^)uC?&mVjg*U`xbXK+QU9Z|4Yf^n(K+oN5&X#E7wO13nVV2YaY0G=+dWcxfjCS{kKfi3|cy0_xsd^$t(Xvuuf21bx`E>=Yzes zC+04CZeZbfU5`hxU;WFKPs_43=h(h3nxnbUCOcc9Y5un)x6iwb*$#J0MlQOUYh|J+gK@Pw0pU1U#poLe1q*UwGYbEBa^ z`I7l}KWI;2OaB_FYWSh3BfMr#WnFs>gw4et|6fvd%UdLI z)601cWkN>|c>kEbg2yPva#lTWZ(r1@+dFqQh=eXX74T|LeUQwznhjI$Uff#gb2*8> zR$qooW5&D{ChKQi<-XH0%|PH0Tk0nt=?z6oSoDT%&jqeoj@Mpi-qd~N7L~PFGE4Pw!VzO3H~051X8UXkNx7>!>Dl&! zUB$7lV>IXTJrZExyeY$4^kQ2;qruf_?kne6gnBe@`Ea7F&FsXP$&4n6b7hJ*KlDE> z-^sE_=lefDPM@uFpM)|vx5SG-yT;)0GD39rq(Y;f;u$%GeLC(@m#3UQ=%8xu8?L}G zZ+hK?Zwuw#ti0ZOm3LJRN7Qt-PSXpnxD#xudOa+Q5%pwMvM$=O4<6k8GoAh4P#EV0n>Dr_M<;4&B z7AQSC+TFu1YZ=eRV$T@T#PU&4X-e20l`74yA1gz(Z>4OGII}Tq)z@zuZf5Vd>$6yU zEK=Om>4BWU#DxnN2^Oh}Y4^>TA#HB5Z^a#t9g`m|7EUNQDAKPR_h)j##QH0jr-$$z zY;-P6w8`1Hcq!N4CS47q6v25LI8V74m+j~6vK zQAP0QWPy|HOyzvC&D?fsVrGnddUAG*jEZb};dyr|8CEx%sw_EBRm7Db-0^lx16RTn*vbIB52eug@oZ&hbDMma94 z|MbGK!|%@;k>=ym*z|m?uB07`NZP()o6m-FGx;5I^}mwrcSeb&yRQ=BnyB(aB-z(` zqbak{+iCMk=j=Cl&APhGu*AwIQ2t<$$Ts2TO)=fx&X!js`5KjLU8@{;WDf0cN?L1g zojYfi-HmreQ+?m6zx|VBzOf_w?+4X2$N!bR6|*>EKJDMx2UTI;1jL?3lus&SRn9A! zxli*^GebtAWX^g20{>Z$PKpY>ZrsHjaq8Np%k|e^uRG4BH)n(Kp0MXXG7oSzG+%P6 zY_72__S&;Ee(E&Nb??)!en}|nUhFuf#8~yltGF*af`cmNEO#rt`)Bi?1!^KweHX2( z6FbW$VJur4&#h!}Al35YGWD|pVT(<)E`E5riM_MqYOs1vn4yVB(e~-jZR9>&y{yB* zcT4y9(vw>R)=da;zOR+yv3a&9i_yZ$-GThpQ)@Tza@^8cSVCyql&xUhw`~@53v0+TU(v$8*o+xz5{v?$?_9 zn=PAaC-YxWc@_SphxyHaz3l znstvPMZZJ~ryV^pH?5fQ#~zROJ1^^QXfnEY^kE_Qgn(T0pTA#oEb3msP^RWQhdtb| zfqU=ld7t)P&sfUrz4V&1hq2qCt4)5(BcB!SnXvzrtoPf)teyFKwe!B^rXBRJw+@i~ zxc$d;+XZGkB4V2AsSC6OZ`|9&(P+Uc_$U2t!x2x$lzmCFUh8^pTcVJ~_t9j^3%3>l zVg1Jc0W%!?il#D6Rt>TI=C9x^Yx;en$*=8`W^jh8Eet&0!J$~r_kKol%HgsLAN#Y} z*-TR_4k^u?Y7jm*LWV;&reS@b_O*{3Yg_-HwD8tOb%TuRZKcC5!XYj!4-sHm$ zKBp$n3S5w|@sWyl+UI_u)Kj4wieD_>fAgB<<4tDaF<2C$B*)d16{wFt#ibSuywP zyT{(WOUN(Zc*^!nxqPwhfq7ON?l_xQInbKn1cpl<*B==!?PyY2rz&Hw-7dVTNTv!Wi%k=0ja*0(In%>H`qve~QLvJF=g ztabH!Pgcy5Vp3$A9^l*4(-gHLU^|QYRzB~W%#2$PneNklV{>nk?1N^(J`1i#S0*fs zjbdV}dC+}>k;USR!U9$n*;g!fO=UaPBr_ItOU$0hAS;nEbMK8C+AY4UTc=E5vb}P_ z?|tP$o=orH*lsH$oeUig1_y@+UJFGTk8@@=?mWZJZkD9jX&o3|ViYF&)8ymnr1{Bj zx8&`e=Tv{wk^L~6@@#E`k|QbCqml%YZYWL>UfiU=T3vk~>pu4zr<}rI~;oCRUQeqy3J57~gy}5E>hndftri1sxM0r#+)PlCM^VxD_FgiZ=V-edj ztBHj-&~WwCi|a0ycGZ>f8nqcLTBpdg>QvW7fhQqB0p6mM*}k@2b!!Zh{v^5ZV-yF= z92s2`ZPk$Ao$uDRlqK*BScnKP9_NhLZEohVc=a=8r&-3@?jUEy^xn;XL!wuzUY*EY z`=&Bvac^2kcR)MiBDP~vV$u_jbw1(<4dD3z}acv*SNX&+nc{5Cu7 zds&O`dMz)G6}9EAy}sZ=K#xn$=jul+v#&)jT_bo+)l6gd4YOo+&N-qhlb&x3Un=GG zZ}KaRms*mmBsL!Ns`1?!&AdHgLxQ(={z*x3sp<(+f>SwG1{OFZ}!TcmCH>7I1jazuO%BaO&pzbAlJXo;5K`6i?GpJgf8hQuLB( z0mq|1F_q2#-0-2}(t<4&w>;QiD(#(NmpH-biL|iVCm$w8#+@g^76=61>JQ_u+A{O6 z%Gw*DxyH@+=F2R(7GwL$Y1{6`--7%sa-KHlw>FrlOp7=xmz|iqrnz+Ez7qjSEj^Kw zk1ewdla4;U@t(7^?CmofMK{h(R(JO^_KHZ+F`U)A#7k=TcQ2>4ORH8WJv581zoz8m z%$0c}D6}zziBI5%3`Y&8VUNJX+3Y(OTD&ajQf+&=>Z{k>Ydp3BLJU?Db<%V$=6&nF z;+{X*YKva3LZ$cm4?G+e295g@c$7<lyAdyuu|gtZM|j-L^=z-w z*^4jNJJ_#y`IGHaIioHAvu)EC%V_aETeoh$aE>%H6YCsZO-8r9e_ndHo^P9?YAGmK zam0;*v59Z#!OaIQJ)bC_^duflkf?WAlakezrYrkH4|PAy`R}n{8o(00Sc% z#~pL~KVP`HmJ4w0N#pOF>^I5st%)Vij5BU8ek-y>vuT9}G&t2~hh0CJpy+TkRw8`P z#X6_jugtHyi+_4d+m zYcpANv9j{%BnX{b6fslL?S)g{$(78dtMabjZA-8?cHqkFokBuRjw?8L1wC8@J|6l1 zOzY{Hv+4PYFJ3W4G$e>Ay7514ixT`Fk-eW)Jb`!dc>y6Mr)~L+E*0e_b&P7V_I+31 zw=HJ=v;X?f9n2r@uV?sQdry$#fdBL8JA9|b?kub-c$s0 zax7zZC`*_wc~h_L-7foB+mi5frS^!KUQx#ywBgy_Z-)uNrw%g=( z=62g}x1Zau<=bw!xLUSw(OgYGRf(+F1NLd+b2pyj3HH65va9~A$?2NnGp6T-xOF$( z$T_`c(;cqtH6~}WX6J6Ws206u`_;_s+OJ2`@28xcc3R6_F8rd;nnM;xUTgREUiJ|C zyv87Q*1rRP40*Iyu2|`)E1nRl9cFuQmEW4}2mF@*Ht@5~cb_2n{Jr<}AKMlFc^D>4 zk4s`nS$?*oCGO){&D)X}=H6?1vtehU{F}0)YmTJl6h(1gbv+_-$bX~1qL{Gl>9=Qp z9Jw3c9pbBLBzU&q?7Py~PrKIUY!mSeKOHJ6>MHTQF`fD05zi$PU*z^w?Y92-yj@K5 z+o`!n(drr`vCCWL>gONq za5;SGY_s)0k;J~Jn>Jc{62D%(crZhT^Z%(b(*^UG6Lc$=2^W2j+*rt7JY#~o=ho*B zW$N!Ve*O1)g{>^_%lpD*a!v(iCvQAvX86Lu&>+uvVKw_p))(pgC-$@dxZNE7-GG6C zfya6ChB-QwN*@ZIYzUKe60S~}<$veR;S)D)x88IY>%VvTwZU%hBL%w@UQE(7_xRo= z$2mv%dDWS#mk-5lxstV3*r@LA2B+EY5AJPnsQm2n?}M23p{v1@o7&FpPJaKvA^-cb z30DJN)%?*E<4MxKc=T-0qm5IH?%v3}J3Gh4ZPkYKUZw5Vm4khkY}$5L!^&D)?)v1k z{3KP=q)M&bkB>atyln1`-M9X@?JAVe_kHB2ZfYwwr@7?hZb^Bu*0u8<*OafkeztVa zrne7mg2JwcA1i)TcBG2a>d~nS_r8=lmF>{q?-(7K%5N_hRJ8q>zarPbS`3A9W?Pl&m zx^IPTrbs^)tz><~Fkj};MEl+%DG8qA#YJ7N%WvL3uR0@PqCE?vbnPVfE+O&7Ek7oy zNuFku$!F>kRo{O=WP)YVeVNdr)5WJgKDqy`H9>&4{hEJu$9?|HwVqFm^xQlnSh!x= zm^t>|mz`HvthKu}zRhv=QK_G&nfQwRj(jMXQP5l*s`9*eS5f$!K;~A7HE#3w=w>Ys zE>PGj`StS8X)|`+D($`+wtR%ToYKc z)_*mUv#)gG`Cq$v`d=|u4oMGJ(WoOD2^;*nTb9ObSi-6BU~1%#+g0kmnoo0o&p+=S zT$kNFb*AU4jCX87-V=G(B?@I~9Fej1NZK^DSb*_WtLTX`pZm-rTcS?PE!jND&tl%@ z?biy$R$gY>IB`OotY6$7mCm(`ecZaAh#pI6OSq)sk$Y?X1g(t@C&bEnc0IN*zR23$ zn#6fLFZXDsS&5UIfAj5Hy?0BJ_s`0`b@qYt!wnnNHb@-en2_eJDW#*XIr)dtQ|fhRHRHOm}8uHv(jeM(;YWU%+4hAgkLIm@F-9Zbk}%4Blx^{#BByK ztGmuAFH9=*i{u1cw(VniG*e8vY?kb$D@VUxWBU8e*mzF&k7S-8TbGRoJbykB3Z5K! z=A`a6&D)0hc2>&eONG8GIPCUs+0N3OUgc5sYucUKHAjjoKdCY7V0$@PW%>8rYCFV! z*SvmrSm$%mv8{0{W-FRYFy1-$Wn0+N+w-TX?BAoED*5cru{iw;!NJo{`P6ytt9$k@ zt?j3Rt!IIc#l!<`|5$EU7A!rasl19i_VlIdRlTq7JzgUw`$FVvT^C!LkHO78`8Rj^ z&WRl3wkcsbaBsu$rojEiNlQOWJMh}|@Xg25EMptdN+R5V(hA3Hc^tw}R*mojR+UdgNd@9M^^wQo25y;{(RFRU9oohr?2_CI$M{0E?j@M{E4V+f5@C~40-$2 zth?GJ&d2UFnDODoVt?aHOFaKKylZ`b-~Yb!~n z(Z-#YQZln|b8&n;D6LX;TDtW4a@DiTkIy}SZ{}j2ixOQAz1+-CE=*VQf86%^r;o6U zjDnf)-0eH>ADofzw0?7`qwVavkmr{VuJF44m+R96$BEUecHjHGVph9eo~>BGo5N2_lOgdfhPBh~6Ke^dfr~$C1e6lle@4{|z`S!{&Br z!u!*{kxnl|U4kD+_oT0%Q7XON@^V_-9c`P6bF=K0x7S@?D#xt4@x9X~pHnd={j;u$ z_^HJeGduEZxvR&xVXth--4hbit=~_5?7Mw2v-Xr%f=^ObYHd0(<(k~TW}APL&;M$T z@ouy?xUp^W&bx<=x7Ui~KbZTZP>8c#V`i#}7)z_^J>5AEIK|WdKNGFscV6b}alEn0 z%x6Q!#HPlj7p}18xf&l*7hnH-`DQ;I2_43p6UwS)EHLSxP+V?&YgcCX{Fs>>t)(BT zc5?@_S}uOWvEzRf>(eUr+Ayct@O1j)Sid8+KetHygo){O zo$0Ao$A3KRxOL{j=P46Kt5$kx{@QL7mg*qox%0HsFLv2bzMIj1{(YHUyD88pZbm`X z<-9KzWj`&-b|inTIvUO|A{|ubSo=sRt$A9h*Lu^e?&m4i*3XvRzQc1Ue#Zl`8!WvF z(FMk4htz&5G#*Qr(wuz1u!=wA$D138i7GC0zG*ZVPgS=8V-rQZtVdc!P7}YLaw({!9dEc7s z`A_Pu|130bxrvkAZRaZu zV*0*{0_CTLacc90jLhZjKC0A9=?0{)U2K+P^>mwVPa%iw{`>x`*9Y<*oR?o$bo1-! zb2F~}d)R5o{l77uA@6(S`+G6V;#D?Z&B@#nK*5)g7Qvx^FB{XR+m@2I|TaEKH zYx^dzr?>l*RrA_)o;@#Nep~iQCR?|h??KGpkVRdx%-uF-_ogyzSQYDk{-nPyb82d> zkkBTXZ;EGJGt`b9mi4)%*7DoiyLxMQg-7wGAZ_b7xoX4rlHnY>Zx*ugPOeNyQFU9= z^yBk{%o)*N)oqM6rrg!x@7?YYwvxR;JZ7b>zx1DDs&~JL>*eSE+m-yGm*a)-87uTA^$N`;mwgq%U7+QXLBMsH*0pQKD<7! zyFtL)uTgX7*UjgxC+1F>7+1LY;4iMsnwwJTWk;pO}X5vgbSrq6ZD?|vgu)&45;o!|2E6@T3BJX&RS(Nv8~WfnKO31bKRGA`q|u_^D>T3S;_Xj)$MKL<+#`1 z<-Ok9?R1b%TF$UD{hiX5S+l3~{5-y=J@kmeeA}SLjEb~H;`@RFw6bP=vx^N#xU_Fc z&i#ME{lzRgA-{fquPy#BwswY5sC!EL-?^Lixqs=p*Uz=)aPj*7dW%}+*n-(J=RPd| zVfBYuZ}Y^)uI1`yuTDzTV=psU>3*1T(XMsdRCJC`x$lv2YVw|sQ#J) zLF2@;IT80}J1onzTkMi55!QRp`dM;=oGQ!WqWFE+Jl7k~UhA+(ML$$1NGf;P%4NUv z?UsHBJ?wjU_2sE8d1j3#&#p2~_*2!schYM8b;knpjGHVZu2_m>oDJ@j?BAgsYi94T zcGVJlpwdKlsnNc}ot(?u`D>{^kk8?3i`icD;_;_*9~8rEu<5 z(J-Im$wG<8^pzgU7i&!8i*oDT&Y2x0$2w)p%#Pe|x ztG(}8mD4}Z_rJEg`gCSOl-iuiRL*yyKOMpk9GS*)vZ%#=;S6`bOIJ+As@E=jc&SzY z$#lb2NhRf1>Z_B?&AeE-*b^9}FjZGRH__G((Q)-e&g^ooP4vb5NaF(hw$xJHS6 z?`zL#5(j7aO6UIUwwRDr^lw3~eB)Osn~rkbCqIg=W&e{k;VTAi|)=TCo1PdVa|{q!bl_34=W z-}!1+&#^f_^Z2$Y%iUIQYqT zW=h#Z?!G?p8H*c?YHf^vxGBrc*>5^c_r&GvH(!2As+wV9nehE;+u~Jw?<+o->iaZs zi=lB(&M&iQiGzjp-Z{s)zj!R&b+>Wi#B%eM$=6byZ(O*fcr{+KB}mFR<e8iYnkDKKI#kqh7#T?qKh}g3s*jU!N~XzJBz4 z$+mgFzAX&bUHnx%ROqVfUm5S|x3t7huYI-dn3YpeuUdfS3~>(+aW?Phr3ae2?=N(* zx>q#OxEdvsN&&fVJbgRv`N zW<{NeVsu2vE$yw36F)9KToL*s^Ui_j*lSk`wrE|HD5#EIu;;3V;j0;3wY*dQnqGE_ z*?3q*s^IV0zvpH)s8<;t*?53Ej(Zw&%b5~|^eIXOEq;IUdEfOYzHnO{KW&oNgI$65 zZoIp+=e5%c|G)PxYd)yHRQvVd>4O&;7_Tw!ocQByTTFRxpu~afn$kIs<+O8)&rN^* zTjlJ(^WX3IamsDBe(p0(rDLMYzMUbmKP^QT&oO*5$)GrDFZ-i=$7N%epRTWPY0=L6 z6?}L5xeE2iD}s8O@7p|1E&g`8>r@JNlA(~I<@DewQr-5RyQ5}lYisSAJ?r}a&$DCdyw`jXAXVNcKpB(Wcdbzw& zvVDEWucdKG+BuVVb)U-3Je>m`r;V%6r+#y6*d>eM?ifNoqN;OyrvQHTaazy!QTv>mFBMA8wx_a_no5)8<3V zIvCeJ+5M^N&NfNz>BX8xQ#mhJCHS{|@6~8%tbLb!YD)3OC%09~a%-Zu=U%^5zVdT^ z|Mt4{lrMh|hiW;n?Gv>WcsGZCkH@NY?)4{BuiBo`{PiU2_|A~-y5t8xd%s^%oH(mG zH>1h4VryE{){j!<%5n#vo%@^ryDTdC#Y58_H#Qi57YO@(@W4Og?G3*twyhG^-^07w zy8GjO$y&XX^Zqk22WFi)hjwa_nuy_ z(iJWvDzB>{nYsVnElr)IyO~)VuU~sBwXgZ^)}S{!X$fK*zc0Oe{^ghQN0)EcuRHt3 z;PdmnqNm0DV~mVu{baRURasQ-BDiFIdfSz(yd!}Tr{^fDP5A%8Kz#SXOBuIr-P?Fi z#J@7-;SJ~5#wMwdxV_c0=ER2Hzr5z5%Dm~{TP2F?{zsX$?%h^zH~DMR&v#E1b?fvG z-Aw!YF7N#In~!;voE|@E(|Y*3M_QtG>*Irwy&buK_Z^5`-aUDLc$DiNcXOH5!5gF> zeg7KTEydtn_4Pk|n!lc--5@6?xyStNvA=81uFq&TdbhpLWKzhZbDQpjZL*vE z@7T?{XEwT~a(f)C4xicNxc6JJZiai?^l$5vjMwqxK1x+u8xt2`DcPt;qk?$yRsDDi}ij%d5^ib6<<>_y>l{#@s@oH?;|f7qn`T8{1N=jX3qv;OQF*%wz6c=%siYyUs9#bE03=LUL} z$Iq-j@qdr}M5%zaKB{_b`+RTo+&{)Y{o1uF7q~tjTxPvZ?cJW~Rp0ktsXTn&Zoc#) zzWvi>a7>ym=CYAZgKN70nyVY zJIY-2{(LHnd)l^c#fDoq0vdL+Zf(7Gh+Xj0w97k8&-}geuH!FFCfl_e~?Ovy4@G#$kr)ttLzS z(~iuD+ZfSvW16nWqc{0lFTQ-Kv^ci$2=5PH%kB4#mal&Oa9`WQGmj6f-ubxsQrLsL z@y7S6#m=n!+5Yyc*8&$w<)c%Cu4>24F*TpQWYJfn-gx0K&K9P+U7L+Gzj1|IOmy1g z;`WDY`Q^k*dsCjgS^h*p-uu|YmGQgO)=pk%ARs33&{OVu_Bzvyo+iDGH=M01{h92` zFMjE9AI}yYU-SKKBKzd&r~BXBNcFPO)SkTjsABrhlkpQuUYp;uoq0WnXVu2f#drOF z9_xBm*rPntoiB2|`sruiSy3xy0RqJ@zSrmN+vSLBK~B4ziNN$(K-JY&!z@;H**K=@NZqTSpMG08o8Ej zs$N@TPkIEi+_?JYDzn0yB%U*SoVQEq$lB->hgP;;4GVPSWmzFAYj|wcCVQKkmwwLh zYJC}1qV+Xx|MgwL65nJd-g8}lL44CG-faPlJFmsaO3a_X!m;bdnwl9l?zVFNCDGzm z?0+SH6#Sj`L+$g88Inosx4Eg8=}W)!^LVqgFjVO?lPfFt-&EP6-DVCU>z6#wcbs4} zL&j%ez-yaB8{4`zhMx%kynd4Y-otB)QyxnTSjiA$~WqtJ`{O?R$ z^;9qIxpcy$pYkz}KYy~`?e6WZbR{f$>LpvNfTjkeZ#cq{94$?Bg?%vop_2O$|A+sr;gtM|7FE`~8~wvQ>L# zb!we^vfnFl%bpPRbgPIpIZ`ui_-|F-xtqw-x?;MxVSe<9jVV_?MH??VaO3SSWsxam z=H{QLccwirv-EL@y2Z+C^42_Xm)4rBpU2HF_XVH1b7q0^g@@7wjEhB7gTKu?SG9Ci zLv)q$&i{8mZnDW0ENTv1ll=2$-ko%(`Twu=FR=66X%xLy&VQMBtFiS?nZnjD502OF zoNl<-XWh1)_b=~FI$>Q_{joOuQ&v(`pkL`KRdbbV#|{NvocQ&d`JJ-QTZ`EqDQqrN z2(kR0WZErouQ_|u#?`$UaWii?u4}V7>XT_RxQbC69ZT52u55($mK9f_|JNO{EF0AR? z{Omn7E4=awn={w`(cdSxV|#6G>?5{*`|3F>%XS(oh^>1+W67(6aMto=&yO5-eHXLM zXztHfN55YCuEKe8qsy^*Z50<6Gv9Ei&Mcbo^>D+(N!#8pU3GZrtc1Y2J+n0Dr)Tcl zr&Ok$$95;q?m_51wPW^qmnDzQOVcSoD4@9V;q?4T{x_G_eEPbh{bzMt;^Rb@x9b)A zc|ZMmYHDh(owaU$NQU0+Z>x7j{yn|vzg^$!iH{zuFAcjK`C}qeW%}0ogMtR1&+gs2 z#;lHif3Io(Z_5X3^|Tj@K6w9HDmDJ;=dO3#R~D+dyG#*V8Fe|Vc!Ha<$IPJbyEX2{ zb_93K_Q=`ok^l9?6_HEbNB4y;<2+ruYhKKMtJ#H93U0eBd0_cO#6+!Og3QcS405qP z&UF(FmYA%(9r;*ZahmU%!U~ljmV(K}?OY*&weP21l}_4`aX~sBuPoHw&hT2~Pon-$rHuLMW)xR_Dw)(pz zub(7Sef!zpCsF5jMgFO*{4O#%ywc|LCL`~Q^VJv4x|k*Ve%61-q|1vZoQ(S6$M59q zKZ$kovzzLziK_p_cgtHihrgSc|5xmZ-u7f=WlSC}fJlP>6BN-R}oqb!%9j%Y?8`Pr~Pt)jn zk`^MjJ^z7Ksych>il?^c4^>1p2R#-`F`g%W=`j?Kj)dy%DVZQCbxNWLXdBTJs=99NX-o+Rd`N_|GF!7~~ z!s<;W6V~PwP4%vOy4$;vtH5sVw{2NJmVf^xy6#W!{!f1Or@3Ez{B`&K4{fX4P4dmx zvqfgzKePTy<)^!EkGDVgd&i} z*j;_FDv;qDr^53kPCtI#kuZqAv&we8^axu3pt#QWBaJh_Uqz|TS>ofS%#H&sM?x8yPB3gzvr#*C6iYdSDsq^_g!OU zJ=1jKhQHlR9Q)5TNIA#_vTix>X7=Jf=Vafnab3BVYNb^RKBe^Mq+I&ue>U8Jxk`gE z*G;mt@O^>!1)=Gyug?nm%U)ZxWz+KBI}cU9UpzZ`p7AI4+D-SDuMHKH+Q_KZHACyi zv2)&&1*3D)j(0r`Sj#WS!eqd@=%}2Bq4(-%%r52Ymy~$98BO7Am2T$>yycPDZCCb{ zVc`ey#)4!fj?OD?;=ejWzBF*Fyi^rrPU)O6XMe}GLvI~b{@zmf$-l6#`|Z`ZRS#D( zmHd3quj0b48TndF%H)DU_yOK4lkBf;GBEhlvq<*mt4|%Wv26t=4Z*pcHo@tEr?QK# zYPj9ocS2i4J~pObKKapP2mHAIO>0_Z+ZhT<><8u*Zrvv1;kDl@RSE!*R*ro9G zQAgUk!w0iXpK>0sRr_nKqsM;0qfM;c-g&wA-h+EmcU1ct*}B?(Xx?Rzm4x}Il_ z&WGin5>7emmv;yUSS4}%4&7_SxWm`?qV=i2pC-6oJGE!#O-6~34&k6p^WI#{{A+S? z*0rN|4$l^U?Q;6r#_BESCV%0G&&Y_rTN56*LF~veU6Zd$HgPvYr2^W8ekO}nR@(?G znLoR<+9SYa`3^O+Lv9qh3q{Z@Gg8%!8jyguJ$SmVCt z1wc9_hIiw^@;aCyg%x!cxlEYwU?8bk4CA-t&i@WWd1^M{qv_=W;Eb&g9ORwSqPW4B&G-DS8W;Ej$Kdzw$_rm^L5f0KAqA@SSIdB23$R6ePBp<7KIg{RotuRod0&2Bw?U6ZlD zM9tr4^A!X?C^GXTFJiv1o;|O?@wu4UoUb}J<4YITb1qn#R$qk{05n9fgmw54*diNz}J7sU{wM z(tKcZcExjJpU+z++_*C3&gC6TKJrd>R9`CYe!Rjy>0I9%ZI_Z8YinE`8c#%+FKaBE z!jrt1eO{Jr&X30#OT%;}IjW~TOM0~?u4l52%5wk2UiRIgYxMV|tG@rrEIp4UM0^*U z7JpopYjnv9&Ql2)_9=}=1Kha!Cae^;_{}gU{a92VvwG{y{@5~AmVj?h7(DVGSv=_a zyQEY~M*A1L>BtUb;zw zQ3uvmeA(-5=gFV-%C5kjoi}TDe+Aowd3@KVUA?3COsHM#Kv~8WKGTvD31!kQnG+s- zcV5OMbY^1!W7}qdoy!FL1n==(R-B$@(ZV^gdDD}dYQbv{lz#Z=;F!xWSMY$2#qSM) zraAJf?3;gORR}$~u>P-FO`lyK*Bu`Jia%Q2?DO7SaN<4qJ-z+Z4Zg#3(}UZK9Ln;{ zCu_>i`@6vNXo6$+u|?(^0?$}-8CTzV#Kd#`V5eNprvt0rFh}k8Ozm*$GzgWxGhLsj_wGiR-x_Jv{AK6g&eGl|z(*l#ZEHRA9vk8E`CfJ%KsDijoQydlou8P}sTs#x0LMhaRR~6zb(!P_a(b`{@jpm!T>*{hURGxOUomqVU(~&aAtG4r1)7~V{ zj`xrVkIK5WUsWMqc8o(KyOfRcD-_aqIi}^v-M5X3lHf%Gbwd7lbUc^Zt5c!cpyD zv3FDVFPb3VSN~zQs_)yEOAdWHXA*bxzdPT@nJ4FdGtPU|dj8Kd@5>Hhb!Up&o3^rE z;=hBYsYK0>UW zlN(ODOt5>eQ{8acBT?*`{8lTT*>8@k>bP`%I;oVAW_B@Ku(0`_sptB2>tBB0F#az7 zAlK6GTv%x$PTxW{;bOsgv|1K3`w^EOmunjP%uz&m|Kcdp&y6 z_~?evoSwtSw~6RG9D5eA$l1i=Vm^Dl_wzS3b54l%+&|S`z_a1g2fZ8fZ;EbTbg^z< zP(fhFuRX7g@1~e{Yo>j?c*fK=??AM@^|F7m(Mn3 zm?dF~tZN)Emq=zG{Pq5*)8jVf+=bf@`TS17i@ZbY1KUm!#VT9f4rL3^IH4f$|Xe$kG#s|UVbBlDS6g!;U>@TO9X_< zy}r&mC3`3SmgY~Vg8b_tBIZen$K)m#&0Df(LH?`R3>zNUeri7=k?Ghq(Kn>s?b;rW zH(^O@jx@@i>i@FCXyNRGLPAnJYbLOllxbwiG#o5u`{*(w@ms0T6us&`CJCuytIbPi zxJRw^=~%PERd*Y%@bzk0hO!@Xm| zv(Wo{7U?-{TFAnr*6h3F{;!#TauP*ObMfABNLk{w#jqDZ)dP?M_mgdjV%c{@M6P2pJ==)f$-o-~@lCa2a zwf>;$oSPetXTMgh3!2QSt$Y9Up@l+b*EXE-`*_0c;+(4i&c|LzDsSOudw0Kz;fDKx zwZHxpSe-nvE$+dTwBP<$l!6z%wJq4iz^@hYOgqfsdBlWwX?OP=S!}1^lr8trVMT4N zH-qYqwe|~U)~hGm&#*T->i@yX7*{8<`UEurkb&Zkp^*KHp{dg?&{oG?U__;Of7u-Cyd6kkC@0>fiw%^O1 zmi>Q~a!E^{^?{LXrHjGj`OY7&UVQ#Cbn(8MbYxUiE$^RSIK7RbNHCnV` zlK7UEUp$(dE&uJ|6jwVS`ub$`Lfbk0nO$!l*sW-+f0o(0%k|f_;GH`oy$>cXUvlLx zW489JrXQO`bUg1K7j(TBKQUxQi2eF&yPKxYx?Zp_XXWvi`lfS^eUCp^=*z3@`lrCD z=;hwck<(1(bi{5`)L-}ZgiPF#bKlA%|D9#rwwqsK+V@7&N2=CBtGAw>)8!-0VjVQ+ zNano7ueP6gX?onvl{a+ur0S|2e*?VR%WVUGA8K1QVcG&li95!>_WkC`@S0y()pp{@ zUFTGtDJNzfe)i2{nXJU#)}xBtYqLH7o(##@?-c)$>GIX!-BY%1zN%eO_ej!P{H=(0 z<&4yM&ikVJv!1Pbvz^cS)iP%@kH?C2-*@~EZku@i{j4oc;eD;0vT9~;6h3Y^GlhQ* zW6lAYElnH@jJhg0Q=jB~x)r#9A?WV=y^1eQeNLTQn)=B0@~i9JbMEORrA)CtxM|7T z&Kt@(#ij4d&NP0AYBuYiTY2@gWflW_V^NS^#QilFWCA+`47pM=TAU`o{H6b5TH8D& z?>ITZFx@{_|*}&BqJdmsl6Y)oZJI z>b`VP5|!mp(7Y%W~I4{L1|9*VAcBaW{?@Z~rE}d(` zJ?>4qyE)I8G+9`!aus4uhAElOM6q;_%Bg*xzSJlAhAMYS;vt5d%RZ#ZSFO3 zO0DNTAG&GNg8K`b74jRJWB0v_=9{*-m+S4-9mi)$#7z&(khoZ2k&)3b%`RhYrl9j@ zXWsT_?dmeK~rK;x^?Q58^@k*Wd46sZ1!QJnm=)}z4Z}yH&~c6zP+ES`gDHV zvv$QVAB(n{IDb|a&T9Vd`J-rWv!GRj+B8wtd2ikdMn`8@{BDq)aK3w1(7IjiQ+hU( zI_#RSxL*99?H=Rfg>sBvHZ7^!{^yxo#?t*J5#6Se>LLz}Mvs3jntuAwEjgw8AJXpM z-TLj&^ZyFAtpD?JXBfYa3bFZr>rc=}&Hjk8Ycm^C1O%RD&TO3aw?l~~{myLl%#NG? z{Ax~d)$y5&#dXb^-)1{=;+K5JhV(>*Unf1j3Db)`#hNv@mnazks%&sRM_*$+gE91Ae=I?cKL{#=RPjfSG^psPiw4`DA|X zKpexq%9*pd50uY;*s}lpzk83~o4;z*6j6BaRPV~!+}i7f(UyOR7am9pjPZjn8)nQz}t|LN;}Bpq%A z9x+|8MdXi~(6yE*hUjvAzpVyk>lWChzA-t*m-xoK@$u0aQO9bItTXS~YV4={m_zcm z<_d1hm;)BE999 zj$pat|1DOoHR=++mm(**P5M_c$79;j6_H1d&v=^laNf0|$sZV`RTnw8^mr7k3;t^D z8YQuLrrz6mw+|^;iMxjTUR86sx*$4DCRJ?R*`yNhjdGDw>k}RegkIP-e?i*E)uAro z6U(ILpF37JtI|?Ew14WPBO*4ID@(LID&K6VcsYBHarw@7&w|;_y%&y9;jpM+-G%_agL17F7GLNu4{NAf33Qt z;XZX=>{*Ws{zu{#*WP@3dS&ZIwio>Z2mDW*>5`cf(BhGuz-x8o>CLBej>RqZS+xIc zOGohTV+m7BLS|JdpFQJ$W1-ZcnRapZEfTd~T{BKQHmwL+A@ud5ciMAyR)cv$iGPx3 zFgi3bsl_$9curdCF;y+L&F60Xy{RYsH*L_b{_^wmQ-FZtv8^ty*q>FHc!AMxkQswcX>s}uRiBbXWzcwGD5#UtvsUM%X*=P^8{ zzih_i`3(!-O^bUbU2NlS_+{=rn^krK^{bDSBsV|XeIOv~&s5&0TR$BOFkb1HwLxl8 z+p0v>huN(&L+ec)cte`6B$&GJh8_;6IGVd-zy1dS>Ez_bM_TXBHfBwbTJ~%8vq>Mi zc{x&UuV4Rb2CwyL?blhWTdwfO7r)i&yZU~0+p9-G)wS`}SJPWgmX>&k8=Eb0Zp(S+ z-tzRX#j%2}UMwBfORzmxO0G4q=hqD{y^Xn9D*)Zaev+W Sc+H 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 R8FEjaeqmD02M z6^dJI_O!Yh{Ey_{&bIL2>7Sb(Z8g4o=)HyZjx={!Z>_jb7aP~KtV)kr&~!2N#8jCr z*RSlEWW*V%TwN7>W#TH;>GO8)@ZECl(oC7%b9ZkgBX z1ZUm(ZL-JP@}Tz2jF}gr*4RE%l{=I@&uxpsmEwQ>2h0QhcVzBc;Qsvi5y|)8%=w?c zo3qhLa8uH`$6ecBvm@7?z~()PiY=^%yx$vTRHrNLUc7Q?ROQ7 zI8*&@=aJ+2pL5U8Pl;)ja9Q)l`F9oro5=#*q$M??M_IccK2!W+cd=wz*rFxdJJr$| zg5r00NoTG&FLtG2z00B1%pBLh{V=*X^^)XD1yMzrBOwz{PS}65E{EG8IiM(T)!W_Y ztt9^_tn%|om6G%oFW(}$Zdvyvk$DSWG+9l_h>L$^m0+w=GC@IoWuAde*XrZKo!t(M z&N1(`G&j24vyr>o9uwEMt8Auw&3C!4eIdp3Q`$M+wK`ZfFMM2E?#Om=cbX-CwXI>p zWoO2!2tTLie@r_j&sJ$~WmbOe$fqq@=kI#>;JY~H~$Y{b6amlcT6*0a0mIN?!>@88+`0K{|e?|#wUr24={lQ!( zY30Rm`3N&7w}Kg35@9{hG>ZDxFluRJJS}m{J(Ff=vEYr?rx}}q?KgESD?hlia$RS` zgoQbaUi>}z=FX&cjnik$jBI5-nzPKjdDMMUp?1XsFPFNI>UEKpl6%w(Un$QDTjT6s zV11=qf%|qqi|T?YoCQ%%^@}4yjG|YpDYM9!Av;^rby3j8i5mOF&9mLsI9bk+o4$1G z-N>63bMw?Dyy$iDySCFH} zQ%)f(zx;KvzH6f3o&K}uu9AYr$t@aRnF=Rd_Tk}=w|bzzDd*8r)$Kjp(*?VoPaS$E zktVbIsL#`hDw3O+*@~_@*DhhwShVe9l2*;Eu2*)CjB^xYiMotxh= zq`!UtGyLbCo#M_dY=3obg_VmNKbzRa@uY8St?##a_mt#btkP!pD!P}m`Ig1!poJxZ zyXP?Fayvx(6qS8En!kc)JA+-UV1G}-{N2-ae{64M{t@{pP4ZfIf+(j-da!Gh#OD*6 zHG@PtTT2~&T)LI`BkJ7ZLx)}qM!B`_KCZRNzQjiUg<5kVdy1p<$JId{Z5M5C&(>`c zUYh0jz~#Qv&H^_^Db*tkE9KL*t&+E}34D9cVI^t9{50%t`cJK6X?zkK8jmMjVeOdv zmc#0D!e^l)htgGSdy_UAWqSF&yz^Jk-D~?5p4eacHUC}m-9OiB{pWhMe1~Pnszb*T zW}SKbZA$3`rb_|_I^`aXUv7W%zQt;EYB*bJ^%Fn zxkJ#~>GDseyT4<$5LlrbnrdYG%yrK8TcLY?ty*znY1_S|_sz`vclI7xkDD?{MCzD>ec+GBS<5nMk@Eb!MxUmvv^gQS{WX_~9d zPcK)zuubTq+l!c!1#e*5`= z?Tc+rGoMeD^9U7SV3Iu6rSkIcj#y#WMco>j4v`^x%w7U-YvyGAY_YnVcxvwyj*o|C z+h5E-ZT0Ky+MmIB3!~n7pJM!adBz%x?D(HTvSAAg)^vLx*>vOD?~TtcJ&UWqu-%p+ zQ+u|!*nd`L5g!ZB_cIl?JNvwQG%2+F()OL4Y5F?P+6*2oU_auu|4O?qn`l3O&Dx#M zou~c?_$c_%;b5EtbJ#6G#{Fu7U3d5FnQQL%{`Y6u$d2mWi<#=W+$XNCef`?M*7$F0 z<1*Ga7tejq{4KC$!{G@f3L>_rm`vZ?WPMX8m}R`sX)({%XvN1Sd+l=1xAuEEyRgQt zd88k?Q~M$7?5DS+_;xl(l^SVvemc2J;nv%)K0%KpP9>)lU*~oeW&HJpXZ2hA$1R_F zcg0-4DZA@#&-bM}{F1|ORh=wZep8LD^^fVaRGkYMLGI_cUf-VO<>vV?$a{P6g^Tle z`9Eo#JR0pe#pVC6-IDChJcidJ>|6FueR6m8t!B6H-8a*hemKy3kGnpOH&XM@moC;j zU$6X2X1;cKuP7hen)w@bPQB!9Tj=6FdtdiPk${Kmxk-iV)_G@#=o5|OTMYDdo|B=`4yG+R_Clc(#7}c{lBZO zo|or7YkNFP;GgE}7Z&sh%;&G?%~$iB=FoQM*qR42C-h~qybr$Dblt0$aDBP@#D~*g zc?N~<;ZOT_@47YrioZ8E3w-@@-gd{M_rV{J)VngVa+nDeu6QmJ5wVO_&neJHhE-JY zb+=UQitjsR*(Dx>#~27za*cyftz;bQxWa%@Qy8V6?0Zazg}I$H;Iwo6_r=spOk*`_o`rr-OchV*6$u`&ni5YZglwH% zF@MN&@!Q4tGR(oEvAr{dX(d2DZ0HFMIVfd^C=D z!N4x@r~A`e{Sqg!-5c#ZeYK5@18%O{#CcU_{)|)=qc3*?nwMp7Tk%id=5S%BiKFOx znV@s~N_LnmES6Qi_R{s^jl?+>uw$(=uOpT;3;jLPGhhlG%$xcs-|dUq|Cv%7 z6K=C^ihO#>Z?;wD?wd2`T=g%t4sEYg-McgL@}bVUB*kF<>)q0v_k-sy*6uTmUSMOu zUG@HT@G%wt?WY@b_SYRVW}C_IWXqQfuO&OT?KCzwXR807(HCc_yVK;}?AGXR;o2VE zliC~lZJZXYi5B>G$?glAVdFz#gR00Sm*=)t)Mh(xXi0BcmVS{}o;&Hq)ORo4W*7a- z>x^DsbI3ofHOzhEsfxp{Th2D~%xlr}FfuI9t=enkzhLv_tj(KQwa(PfU&TD>Ue8m> zy+VRImGMmLA0<0~I`S+gtXHrjTXtKPp2(WAR4%ulfAYjq%XQK!>+Q}=2Pko+x`qCf0SF@U~3&~!0S(M!uC71KcSW&HT z#pZPrPcQm6>6%o;8xt-*Tkg$zfeD$Lt|@J;l{+APD83*}_3hiGTxYsGr)+Ru@}q+1 z=+{EWN&nsVu$aF8S#BIv`^8Ib?%_w)0ZqB*Rd-)nefYTe(!IWi|DXEXV8{PG+HiM9 zWyaIg@ChO%wmj@wshSGK%cuUG`DN;B;cATyC(R7p{oX8QKM)Za5ZP+XxaQP^C$j3^ zov(ke+Z!>wnH6q3N!;nn3B{Aa2ctWeU6R`Va1*CW_(Z)K_a+#;@wvv#HM@v+{<-_4xqOciu3&g0`?j5zc8Oa+JmkMh83~!We(fzSK@&F%e<$+^sn-d$kigjM(F73ONKdIYkdee_} zQzy7q%hldvuJBsq@vPtB?>w)JBP||B=U3siFTb~l>ziw4% zEZ4;{#`ROA_Aiohy{P-{%--obpBV1Vi4bGSfQ(?{y9T*EUC94y{ntvK0s;a@G;Bdd&}1WPn0G4?fm*|>h!-)XW2UoRG{ zGI%=IHa2#KhAEF<^Owf;N^^B*ESq-1OD89yuHtQ^2@rwGVDw8KP4B?*F>gixYZuwGj_h%T*46IdgXzikHB#m*PZ@* zcdYPOaA;2|`==v(t0!(*U)b?%1zUSfZ0gE~F*nV%?C)JId{;OBUPfviZ}#r1@0`#AmGCaKq-4KHm$*37P*(S!xcx;%8!YWM@*| zRiJCYzeo+aJ=F@^VB@8KKG0V4;$l;i-|s2F_W8RO`X-d zV|8EFtn{hNJ9d{Vf&Ij4uSvU)AK%hFdHIoRXJfa^GVX7>Q{HDgGn+}EVY}*+o&J-z z1#V#EEztDmFX;`Asry{-c4tNEJI&qZf5n+~Z!_h$8DCHQx0d<(_UkvY79Ea0Gn-=v zTaN8v*D#*CA1lSqpG^|eRX^1An@efWo{pC)Nl%n6elgmgwP1};N_}7Jk6C$h?H6_5 zj?y|Tx_S1kYyScm-}qN$nRH)~`l{r6mhFw8M)<0$;^%lBHuOuE<~{0u{^Z=bk3SbG zd{`8JDR@(|om|_r{d3db6uH*j5)fYU`B|Ud0iXS=td2OX*4i=iB6qxLe8Jx)hNF|` z-Fn8A>{|TxV$Pa|5dF`Kr}W-0^ZcqOxq-2H&WC5qwj0EEc3Zkf{Is&X{BvJFpW)-f z)#p6^^)L3Bu5BDOzpJBso{F?tx>(V#mwc&K*LfFkUHeu3fa~d`zIBgR_m`LI1co(u zy%$@veQsw&gz?<9={AWjlO+z@X?#|ExU289EW5|=gpyQ&zEzD36@Lz$@t*O9U2!3M z4C5>Ai;DYq7S(Q63vk|aaI4XkeBou+uDy7%$@9wJvfgznhdzkk=s(J~fTiHO;F%_6 zgB{!t4o^;RI`v!UFWcr{(&zU!yR*LYR@b`z#NpS)>Mpkfk_#-~)x2YS#xDv#4m+QJD-~Y3)UB+c!RrEVc3@`R;Y_^}Jd6%<)*40kc7x|dSohg59N8v0>?<^;wwotBY zxJo#rRkZ63g;EDs~@dpE}oj-x;3n9o2s_{>6uSwT$u1B+%)sD zmEmNAzRgi5G z?QaQu`BClH6yN_#YY%xF-hLQ!>QP?Y!{>c2d9Rlx)?bSKGV8AM+dsSBeQUe6b#Hdc zjRiG~1qH7ks(tQ@)Lp!c;o1G8XGCWwDeJudAfvi^Q&!mId2ibva>Z?%yY5-oW{)*l z>t@;QJ$}kgL@NE+ztZ|kd*8fu(==N#Atm(V9Icn!n`R0emU%b7M(y+0>E$IYN9;as zKKbwA4hiGNKTcWB=has#&0NFNzq7Y7ealQ+p13nm3KB zc!Z_ToW3u4>-yexN@`|ny0}(HnspXDy?bA)+J4fG%axaJa~HgP`O~xYyXBhsuK)i( zf3W=bBL;@Y3@T4F_D=Y>NI>V&r|sufC!N{xg>#m9(_ib=f9J{u&733nV*h%c=%Sq| zUi-vret2$4YTmdna=WI4K~8SRn)6&!*I&LCp3XDXp+#%vS*;KUGhh8G$K|J<<>zL9 z-hS)J?X<+2L!|=Fo)0`~Lz!IUK0evrnRr`g>hc(~^QtE%pZz%HOwf&YomuAbcYJ4G zs`JR7ygEW=YC&Vb*07rj*^?7nBR@udT=r(o=6{^(v#3(A!zpRi&m+V6!vr{COl&*;>GEpL*L@`~P>OOx`W; z)9UV9_Lb+1P-$z_^1`?#f4@nG-{0dpxpCi37Vj(TWUYg?o2Pyb&p74t-8gbvziHFj zDVw*Q+Vpt0y1Hz%(Av){f9w=1oe=j%@5Z}X(-yF=yilmB|9CZX{o1)37|ic(tXx;Q z#otVSpGI3+^T$K+vt~|9>*vV!wz<2?*KWQ;>&=h|oBI(eYy7fJEqH}%4%nv~?w9C( zrLD9r(%!5_h;`9_SH@E_vzNCR2X6X)`uX=d-DuU~6Z7isTJIOWvS-1idPyBGU8z5< zar;&<&OJA|MP6d9=h{xU3C}H;o^QT4X{V!5ds)eu$pv=~*WYp6xh5k#W|_)I|D3$H z<&V7&nO?oBq}9HV=3jRqHDyL=y?pO#-~7V!dYK^%H~To}-Q)@h-=y&Ftoi0W zn~UpYt1D8!slMY0zsb|nYEvfPJf(Tr^vvK3ImPo=&G^+YdwE#lXL*s}(3ph7=jWPx z6z5L+#jtZr)#Zj;C!0?EEaE-A*Kq!_2V2`&SZ@6{Ih9*8nI5Wts!-R>aDk@>5un^o(~#!r9VUw*W&dFAdP z%|JKHxf`6Mx8-+qFZ{r%eJft&;K?ZoxoVrsg3YHNe0wkCw9J+|t&^!!jAD&uo>BbA0U((qru=JM!>-ITK`yE9puJ+lqOa2Pe`g5mG z_>Yev=kv#rlj=2R$SXWk`w+2h?(g+y*?x9^a@=pW=1W)@JCo9$Ev>UUYZMnO3(`#z zygExNbm8{(p(@LwtTu+jeccl<@1)u2u4NqBTzf-4Cvv z(XaDar^(Uv;%R2fikPtQ*{jvRep+02dOzR7g5dj^S}zy&oz;1nwkNoVeYZp5lT9xd z-H6??F;?E|Z+!dg4gT{!_-Z{1*4$?MsNARWh{~)(CZ8&&UN(Fle}(gYXY#@1@445T z9#r11ytx1B-hWXaOe^}^um8OE=xg-4m)p1Hth>9ti}#4v(nEpgOfFU>>c?GpST)%v zKXppubkB>MI+y?PdwK7&&%V58d;e8(NCo)g!I9=E3ANx9YDQEsi zmt37aMNFH^Q6Ky%hg^*A=n%0r#g_?cZ>+Y`yf1dcUQ27HdY$ z6E|zg2ne-sKK<_Dr<@X{!mu~fN;@6qhfn(TQt3^qa7TFRm%aCT_yuoD)+SwA*<2=q=i<%d)x5u|1P7^!$aiMB! zQS)4}Ysc5m%WQtGcIL~&&{?*wAFtHO?F{(6rL&#)#KWf%mZ3K#r!;W6?J!#FylKye zC6~U3OT7Bxtp0xE>$VdU**?E9(pA2!$|d70-Sey8M0}pV`f#(w9zu%zXSOtnONz z>&H6vbNvw?&&R9Z2F?ypP1BKYH{W;A%lYy>o#UIQ8%HupP29nlJmFORP&8-C30DE8fgI$#G;^eb(mfTiKHS2<5M2KfUpt>#CDe zUvur-b$9K4?GG)dqpaMTM8A8Uc*c5u-jZo|>wZ5^YJUGO^!$J6#`5OMb!VR1Hsv|@ zS7h8QTjs`>b2PfSI8IJ(_j_i;6S+s(|CyH_p5W7Ax;a+$=KQ_CK0TCM)v&ukdx2i| z+s`{zH8~2(-KxH%x%=!reT|%)@U_a-H+dYeB-mQ=eawb->rESaeb%x zwXNrqYNxtN9G+Ypyuq6*Ic@UFl4Cp@XYLIREsl12|M}8+1Hlr8+GSH_RC*nc*-`BK zK(_nx+l?6&t@YE3g61DMIc-kwy`_>&S0$#rEVBx^65__CJayH(&Pn&P+3I8#()n@!GAfK52<_r^;U2bx3~kqNwbEW#T&|3gwjl9(~fA)%ZGLyN`(S z0Ty+&UdcI=e>o&B|FNvHYBkq>!OZ)Nlee1s$AoWPvt+9L>`e#GJiPA8{ys*0tFCIx zH}>6&&C2et|93cc`gN_E==dE16?2*-`n(Ial$-WFT6rnt-&y(dPrK&*yJd3v@9q8R z8w(On&iCnmZj>7_WuB4ha~tEg?y3L&`S6r3k+muO=pm5!K11$}tbXT_7Yo?Jx){Sc zPX;c&{E+iocH(lmy~V=vUAJ4fV$KPNNs}&kI7b!EviA(P`a1XP z?Cxobem*?=+}=&Fejs({`j^9B*zDg;ux@B9%m46dke*9%6AJ}bd`3SUD+O0&3NCx$0K->DT>iCK)`ro6F7K><#BXpqB9b`1_aU`(EFF*DA}xeBlN{3i*8LdO?@!0yE2H)&tUKM(^ap(9dJxqY&_%opDi06 zES!+?)T>nZ+rve(*jev9J|%Ez#uGagIqjlG-l zOsG4gq9}Kz)ogBtOLydy)K1*pXnbPleYq?8YkL>*UvHfhQc-mI(u53UWBrbh3Zs~+ zD*ft!^Ywv(8R8-4*Z%*y+3;&|Rh38PocRyq0?t}3+wLAd>z(13dr?jeSHi<~|6k7b z+kXEq(;b`tNVT13aEX`iVLf6WB(YwtdT~qULeY5-Ltn|yZka5&$#s zUv~Bs?)06gBit5dWti*ha{udeyUVH!d&7nPFJOM5l<1g$;70YyEf*xxezYkuG)8Th zF7)l`#%4uX^(G^waE2wukLL1ov1GJ6Y`Np#-wcWk3e#|^g~3v#RkQ>T16)2$%gvy-KxOH@>=U}MaE z$&V(hdY9N6l>U;qqIcy?Gv5h~DF3go+p$0Oq4O%;o7gJ&%CUkSN#rfwBncl z5|!b1u4&D8i5q^l$COGMJnc2^ZQ(jAmmkTrwb(tz=+Qyh>EV1I9|be-IG0(qXQ{op z-#l)gHx=hrO3wO}tHZPH`l_yrn=-PN{5n?Pwo{lp?RxI4i0-l<{jF<1wC1w%Z!;BE za>`kjk|+^iFma<&)5%FGF(;o?+^BFBi-_rW+~||C==E{dJs0vPUC`EwY3=0JK68BH z42L7mho63Rv7CI?NNrPa#Aeabr4P(%nGy~yI{HkiOui>il+$lSwcfZ-NX?seccHNiL!kXe;rPg|dP9;JH%6quCOz^P{ z`1!%0-BNqDT53Pb;t$VOoI7x|{>_HEiZf}q&sg1i{n{Y&@K@*SGu9rRvAQ+DEWTzA zpK<^ByE9f?uROo8x^(Zxlwzh;M-+vU#l_DGPy4XsO@B@ETA`B`8B^Z`^IsG@mg3;* z{POI~7os|~{woh1T`nHBMzn;ndy;76h9IjW%8cdZb9j@!{Cgc4eCXHprVyn=LXk^`PzLlN)M8 zV>2%Q{UN!q^IYx@_V9n#KeC&(utpr}&EpWem8PN+*Lh9tzAY z-c=_5Fi~Qcz|0KR9*M$}-a?wH=U=U{SzM=Qyxr_*E31x2%lb7EO37*~del3aWGs_H zJB{w0mdstYZd*?9p1+@ZayBKVRJ8o&aNO=!BLBI%HtcJdPVUk~)9WevRY8*7R=YK2 zo%ij3;gt2DnE%icx#=BiRvLP2l;XOHtW_`87SvDdYSigXBBJgtdiZmQf>0#m5ps1cD~GUIqqXxC@;6I>B63O zPBBNbI@Ly|9N4wYK~E!r!6sX8!P5k}U2E?Dxo17$M&sFzoO^a|Wi{DMQ~S@{tky_~ z*%o;F&Rdh9!mc}Vi`^0@ta9GI>WlG54GxZ$lHYOH3$%5rMU1+eK3Q-7s@zg&w~g=U zeEFgjqZPlJ=8ONDW{`1um+hA_4UP#nR~$%d-t9N}yoZ#+POU^%7yesb+iXKNeKDNf z^l{740|%yfHL6oZO6VlT>b;%1+>nEqj>i-6m@NxRy;M1NTu z$xi>ZXqE7hJ>TcMJOBPpcgSWUt=3n0a-tl$W{tt%}8Rv$$+_cc|@tD|5tsnN(AcLHVSQj|65HyGD6F{5$2V zzjlKJ@78Jhsn?1mW-K1FbF=iE27TVpKMv^@i89tQ8xEBDxfqnp3}1FFdGFrC%9ph{ zoF`s9G&$XB#lnUkp|YIZ(#{P10!yB7>~UFrVx`=r)DF2{%k7fu^UsGZyLddHbLKzI ziT9suaM){GHSybL{zvZOlY>|0ML54rKOpby_500?!-<)94lVw*>RwJuVE>*40u672 zK5H%(oIT}oW9SsF_7~nCTP&_~Z@%-OGrVZ&(TUo3`|dn*oU!nUQ^nFAC5;zM>nsYF z8r0tGy0P;AIzQ8}_%BbVhKI}7x+;?{LXT&`L>%=A)DtykroKGRv9^u_jOcfyu$e)n%|-a4J- zhPK5I`M8PiCdBu~gugwjv))9VHLmo%I|v}{73RUq~88)GTh!7^Ky=5!S7wcH+LBwW!gQpYR8*Rev$FUd9%)^ zXU*m+lRa{{V0)fvK$MzcQKPkr%p;~Q?{+<($nOS{Q&QgBJ&FCe;&jy9zdm*aAC4D4 zU3dJvinQ+v)WcRm!t%V?gSDKm9h?d!F_Pe~Wv*>kGTW2xQiOhe}ihJ1ljN zH|)8du2<}N>Y-NAr^ipZEjMwhr&&W78I=dP_(iZ#tx! z%)B_dDA&`|GI#gln=4Fr742lSy~U%%SuYFnG%kxnYUh1 z)n9o?z&Rx9+tQU$yHo2Atl(W0^>00Ql(TNepOem4br+{M_!+QHU9Bv@IQM7G&xFou@p=8* z)0B*7T)a84DQCruc(GaRRhx|p*QA+#Wp|tyr?XV`jb5W^qK(%Ljt@MI_cpq;?tg+eRZ)YE&S%y zM#=ZPUlnbde^>0`zB3nd58hjR^6{z}hJl}E>bAPwJ9eUnt;y6UC2-T}X_>8!>if7E z?>v=U^Xu`(q{nNIU*t2IY%--HH|P5stL^<&vj6?HErO?8JkJx_w>f);TfSh9(ns+t z>sBbrbqli@K5*>lJIcDf#|Ik_wDZpy8VKWn6(^|0Shyq(YXA&=piHqRfY`=3>w z*H8MS#-(un$;{Rr3>uf_tX^9(V@5H9S#{0JRl0#E-p<%~QY_negBf%7<_SwDaeVkS z+j#fh} zdf5{S($!DSn0csviAL-w1pZ-X{;r&DnI?=EcA331??Z zWAB?4`nvxOtLC%WyB${biF~h_{p4-_)Ay472d!Na+ur>6xqQK}^lf1W=X|zOSI!jv|xYUptDbn$0xpT5}*2y*Pg3=4huEsd8 z?)1}NDEF+!`{cgq4h=p(Ui#cmW#yV`CbOLP_)7%|Ewcb_h0M1fC#UizIQcbaG)^*Q zVAx<0G2`^MFCiBfH%UnTn*K}j+p5oNSIvDKcvNq@&x|4kgI#I`YKK&PJTjw>8^7-T zIq?x2Q(>IR)>b2(&?j2$LUZb7{hR)@!#t+*E9e2 zaLo>#xM9op4Ufb&%WSn`SsT+B6vZ!?n6~b7*{!tXU7XV02O@5rUE3QldG6M8pAK{Q z$O-kVoapR!{H)jIA4<>H^F7>t)_(P}mZu9M8fJ(-{IJ$GZpZnCg9YjF>zFQnXiQll zU8PXF-d5Gc#dW4p)8fDHV=Sf1?iSzHe9pM$^W9Yp<&#uO&EHM4KXhu+GnR!D+SduM z;hIqryFlcQ;>JZWH}2c~S3a?9=l?oyj_lf!^=z3MJb#?j`+^l1U%C9qdh9e^)WYn-u|QK zs?L3y-TqR3>+Im!670od^Kv7EyPm6PX`0Q`mW=fh(fheHmRHMa!=}pc^>6nbkA0tK zGXL_H>%pSV($lY8F@C|6rqcXe-0avP)8qFqUNC#eeO|3Yf4$`b-To(Kxk-ZAw@y9J zK9`ab>0+YDB^~?NMRU(GF|FnU&wlou@ZKT)O@3|jDer~r{;znh<16JGz`Hher_oGB zuagO#yj>-0PEA}q>BjM%Pk){qn`+7$+RwKB-(U5FpYvD}`eUTmT}Tp`B`Uw$X?tJc znf{$dyicPPHq6>}z{=oMpIp_F)Y)xkH(qEh&q<#>SGN1b-K$4j-e1k*c-!JGBk8j_ z_=BjKMB2T`{~zSutTVb)Wxl?C|NF3CD?Tl?eejxp-&X0YzA(l6^L%9|RIN*q*{huO zGfs0=mOZNI{#uP){Kcf!85+{S#{jsU2J(*rmC^FSZW1F3y;IGq^;bCI)%Di zo+RxvzkImojL@`0^(pb*70yLpF0am=v9!b|XA^@@o&x(t_M&sY9bY_XTc4oh5b(49 zV4#!S&oi%feX-WG*{$kk#CmJ6MuP@EuPZ-d z)}L}%#q4h1PW2gg`y_I93eAvGV|l#PFK^mC^?IG}vFV zwfByBhk6#H+UrY`7qRSeXa9AZl~-0Txp9)fo?lODowmB3UFxOvQ(tQ7Z;6Rj5@~w` zUv1pj9sO8h`-kN(yd2c+Cmue<9$K{XpoLx?&qBc?9ABR>nhK@9SS@#V#rmoMO z*VHvS!}~(#v**{c@3^K}`H9uIqlvA0>yz%tlR8Yx&DMPEFaEbhCgN(HL?M%zb-^Ob zn;YFzZZpb1`5XOFTKCQ|MZc!XT-P&idL`1|N8H{Sc;V6G^5<_G*_j*sAG974ll&~a zzT=w?3c#p-|zVTB%WiA49;y_ zqAam(W~9Qrv{hmff($CM+cF%iEapbsl=zdSXc1+#p2h9IWJvV&@YC_kM@$y(vfJ8z z{rBog>p5dg0^fZ;d+A30y4K%Q-4_cPmu}|GKNlsjqt`hm^37&{n`fUl+UERNHiKJe z#<8Rmx(}BfYxFmIA}HHmvSt6t5im0%E@cH;E3x<6)=Fk3U{eN|#VTb&oCPtPGwwJp$Kc43nP#4~DvwWuJD_6#v z^#4=WFmtY+7kYEjwF{dkYxf5(-{aFiNT0I5w^)Zw=FDrs-Iq45ceT-K?pV-Z9CM&mI)!6X zQjL4_j$FG+G3nOVAxeRptKOfkeAw!Jug>OE1s7MpLfo9gZ7Y5$=7-Wco?SPtdri94k}lMf7Few~bD<&n61(#ok!lb4fqLc+6icTcvTOZZ%>AsgwuDtd2?;_s6G zk8Kt`xvZ}~)z>Iu=>!wkHdq^nO{zLTShgG-<{E@Xjd`|ZFjn&;DkZu(u3_qP|ApgARBMjIQW z4hw5-Lqo$%BMXxa3^54_Tl+uUy>;9m_SSJto%`w@ncp*Wmb|^(snH`T-~8I--Xbfn zdDn9T*2JY|N;QADkg(-f_uA0)bC$DAd~_s0QhQ?9%8x-)PAyNp)9<4zu6oJn=BM4O zLz|6evClWNOno)w=0cBY>@%(#CWOz@%D>Z69GKp;?dftI{*zTV=VYm}F0=a=X&Z1T zBQr4R_Jf&0t}8R2`A2i|OElC4Z@78?pbw*p#DgnJE?q*p$0RmB>Jim{__Jc>mJH*b zvu3|4JNP0}zpUAJ@9O01#=n1EtoiwIxrjo5!0G4Kuingi{o?=r9}!1%nhra*ujtt@ zo4J@N$HZN>_=cc(Ovx?D-6c1>E;t@x(TrGO!)oC)=g5@x_hUY9&DwZ@P5Nw?gNcEw z__7Hz&BH3Z`yY9{*i&gW*T~xH%)txGjz>?55AYnypl6#nS{YT zmdQS57sY~QHXO(f_BB6j!ghDvt~Dp(j(&?=rK0v{{gtWd8fkg1(P;sFf2Qkfo_}t_ zZ@Cp8E-bjZ@xk2hb}hX=0-Zh+C5_z0BnAC+l0{$NIAT_|(frL~|A%eQJC}<^tK3P} ze{}rdX_i7B(L@))E^jE&AsJgT~`u)Esk(Mpnwt4=)iq)S1V(P?6Y($tfpDVl0!pY8g1m?gX=BNhp8HQ7x5QBZsL z-tr?`FQ@96=l|Y)edZq7^BwooO+)jew7Ilh^bUL(%MQ zevbQwV(W)8|7FKAgck0(F)QiFZ^s>cBUpM9r%jqA>*chZWkrzM|wZBvrvYIs!b zbxeVV#GfqbX)li)tY3UbD{m<~U)9NDGRw<)MOlJp?9W`UP#JLd@QKhxk8SGDFMa*3 zeDRONv$np8S#!4c2HWfHN+OjF>Oq%JaZmcV_}kjQcfaLZ-g9cq_e_Z2!#+*-$JO~^ R4mk` - Rank by `logical`, `physical`, `comments`, or `blank` (default: `logical`) +- `--rank-dirs` - Rank directories, with files ranked within each directory +- `-c, --config ` - Path to config file +- `--no-gitignore` - Disable gitignore awareness + +**Examples:** + +```bash +# Rank files by logical LOC +mccabre loc src/ + +# Rank files by comment lines +mccabre loc src/ --rank-by comments + +# Rank directories by physical LOC +mccabre loc src/ --rank-dirs --rank-by physical +``` + +### `coverage report` + +Show an LCOV coverage summary and optionally write JSONL or HTML output. + +```bash +mccabre coverage report --from [OPTIONS] +``` + +**Options:** + +- `--from ` - Path to LCOV file +- `--jsonl ` - Write one JSON object per file to a JSONL file +- `--html

` - Write a static HTML report to a directory +- `--repo-root ` - Repository root for path normalization + +**Examples:** + +```bash +# Print a terminal coverage report +mccabre coverage report --from lcov.info + +# Also write JSONL and HTML artifacts +mccabre coverage report --from lcov.info --jsonl coverage.jsonl --html coverage-html/ +``` + +### `coverage show` + +Show detailed coverage for all files, one directory, or one file. + +```bash +mccabre coverage show --from [OPTIONS] [PATH] +``` + +**Arguments:** + +- `[PATH]` - Optional source file or directory to show + +**Options:** + +- `--from ` - Path to LCOV file +- `--repo-root ` - Repository root for path normalization +- `--truncate-threshold ` - Minimum consecutive ignored lines before truncation (default: 5) + +**Examples:** + +```bash +# List all files from the LCOV data +mccabre coverage show --from lcov.info + +# Show a directory summary +mccabre coverage show --from lcov.info src/ + +# Show annotated source for one file +mccabre coverage show --from lcov.info src/lib.rs +``` + ## Global Options ### `-h, --help` @@ -215,7 +304,7 @@ mccabre analyze src/ --json - **TypeScript**: `.ts`, `.tsx` - **Go**: `.go` - **Java**: `.java` -- **C++**: `.cpp`, `.cc`, `.cxx`, `.h`, `.hpp`, `.hxx` +- **C++**: `.cpp`, `.cc`, `.cxx`, `.c++`, `.h`, `.hpp`, `.hh`, `.hxx` ### Gitignore Support @@ -233,7 +322,7 @@ Automatically skips: - Files/directories in .gitignore - `.git/` directory -- Binary files (by extension) +- Files with unsupported extensions ## Environment Variables diff --git a/docs/src/coverage.md b/docs/src/coverage.md new file mode 100644 index 0000000..b128c96 --- /dev/null +++ b/docs/src/coverage.md @@ -0,0 +1,53 @@ +# Coverage + +Mccabre can read LCOV files and report line coverage in the terminal, JSONL, or a static HTML report. + +## Summary Report + +Use `coverage report` with an LCOV file: + +```bash +mccabre coverage report --from lcov.info +``` + +The command prints a terminal summary with total files, total lines, covered lines, uncovered lines, overall rate, and per-file uncovered ranges. Files are sorted from lowest coverage to highest coverage. + +### Optional Outputs + +```bash +# Write one JSON object per covered source file +mccabre coverage report --from lcov.info --jsonl coverage.jsonl + +# Write a static HTML coverage report +mccabre coverage report --from lcov.info --html coverage-html/ + +# Normalize absolute LCOV source paths against a repository root +mccabre coverage report --from lcov.info --repo-root /path/to/repo +``` + +When `--jsonl` or `--html` is provided, Mccabre writes that artifact and still prints the terminal summary. + +## Detailed Views + +Use `coverage show` to inspect coverage by file or directory: + +```bash +# Show all files from the LCOV data +mccabre coverage show --from lcov.info + +# Show coverage for one directory +mccabre coverage show --from lcov.info src/ + +# Show annotated source for one file +mccabre coverage show --from lcov.info src/lib.rs +``` + +For file views, covered lines are marked as hits, uncovered executable lines as misses, and non-covered source lines as neutral. Long runs of neutral lines are truncated after five consecutive lines by default. + +```bash +mccabre coverage show --from lcov.info src/lib.rs --truncate-threshold 8 +``` + +## LCOV Input + +Mccabre reads standard `SF:` source file records and `DA:` line hit records. Invalid `DA:` lines are skipped, and empty LCOV files produce a "No coverage data found" message. diff --git a/docs/src/examples.md b/docs/src/examples.md index e8e7e9c..16bdedb 100644 --- a/docs/src/examples.md +++ b/docs/src/examples.md @@ -7,9 +7,10 @@ This page demonstrates common Mccabre workflows with real examples. The `examples/` directory contains sample files demonstrating different issues: - **complex.js** - High cyclomatic complexity -- **long.py** - Many lines of code with comments - **not_dry.go** - Duplicated code (clones) +`long.py` is included as sample source text, but Python files are not currently analyzed by Mccabre. + ## Analyzing the Examples ### Full Analysis @@ -27,43 +28,38 @@ MCCABRE CODE ANALYSIS REPORT SUMMARY -------------------------------------------------------------------------------- -Total files analyzed: 3 -Total physical LOC: 215 -Total logical LOC: 165 -Average complexity: 10.33 -Maximum complexity: 18 -High complexity files: 1 -Clone groups detected: 2 +Total files analyzed: 2 +Total physical LOC: 135 +Total logical LOC: 92 +Average complexity: 22.50 +Maximum complexity: 23 +High complexity files: 2 +Clone groups detected: 42 FILE METRICS -------------------------------------------------------------------------------- FILE: examples/complex.js - Cyclomatic Complexity: 18 (moderate) + Cyclomatic Complexity: 23 Physical LOC: 49 - Logical LOC: 42 + Logical LOC: 37 Comment lines: 2 - Blank lines: 5 - -FILE: examples/long.py - Cyclomatic Complexity: 8 (low) - Physical LOC: 95 - Logical LOC: 62 - Comment lines: 18 - Blank lines: 15 + Blank lines: 10 FILE: examples/not_dry.go - Cyclomatic Complexity: 6 (low) - Physical LOC: 71 - Logical LOC: 61 - Comment lines: 5 - Blank lines: 5 + Cyclomatic Complexity: 22 + Physical LOC: 86 + Logical LOC: 55 + Comment lines: 13 + Blank lines: 18 DETECTED CLONES -------------------------------------------------------------------------------- Clone Group #1 (length: 30 tokens, 3 occurrences) - - examples/not_dry.go:12-26 - - examples/not_dry.go:30-44 - - examples/not_dry.go:48-62 + - examples/not_dry.go:19-24 + - examples/not_dry.go:40-45 + - examples/not_dry.go:61-66 + +... additional overlapping clone groups omitted ... ``` ### Complexity Only @@ -82,6 +78,22 @@ mccabre clones examples/not_dry.go Identifies the three nearly-identical functions in `not_dry.go`. +### Lines of Code + +```bash +mccabre loc examples/ --rank-by physical +``` + +Ranks the supported example files by physical lines of code. Unsupported files are ignored during directory scans. + +### Coverage + +```bash +mccabre coverage report --from lcov.info --html coverage-html/ +``` + +Reads LCOV data, prints a terminal summary, and writes a static HTML report. + ## Real-World Scenarios ### Scenario 1: Pre-Commit Check @@ -98,14 +110,12 @@ echo "Checking code complexity..." FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.rs$') if [ -n "$FILES" ]; then - mccabre complexity $FILES --threshold 15 - if [ $? -ne 0 ]; then - echo "❌ Complexity check failed!" - exit 1 - fi + for file in $FILES; do + mccabre complexity "$file" --threshold 15 || exit 1 + done fi -echo "✅ Complexity check passed!" +echo "Complexity check passed!" ``` ### Scenario 2: Finding Refactoring Targets @@ -154,7 +164,7 @@ if [ -n "$LAST_WEEK" ]; then fi ``` -### Scenario 5: Code Review Automation +### Scenario 4: Code Review Automation Automatically comment on PRs with complexity issues: @@ -209,10 +219,10 @@ MAIN_AVG=$(jq '.summary.avg_complexity' /tmp/main-complexity.json) FEATURE_AVG=$(jq '.summary.avg_complexity' /tmp/feature-complexity.json) if (( $(echo "$FEATURE_AVG > $MAIN_AVG * 1.1" | bc -l) )); then - echo "❌ Complexity increased by more than 10%!" + echo "Complexity increased by more than 10%!" exit 1 else - echo "✅ Complexity is acceptable" + echo "Complexity is acceptable" fi ``` @@ -284,7 +294,9 @@ Analyze only changed files: ```bash # Files changed in last commit -git diff --name-only HEAD~1 | grep '\.rs$' | xargs mccabre complexity +for file in $(git diff --name-only HEAD~1 | grep '\.rs$'); do + mccabre complexity "$file" +done ``` ### Watch Mode @@ -301,7 +313,9 @@ ls src/**/*.rs | entr mccabre complexity src/ Analyze only files in your feature branch: ```bash -git diff --name-only main...HEAD | grep '\.rs$' | xargs mccabre analyze +for file in $(git diff --name-only main...HEAD | grep '\.rs$'); do + mccabre analyze "$file" +done ``` ## Next Steps diff --git a/docs/src/introduction.md b/docs/src/introduction.md index 020d57f..8c86c65 100644 --- a/docs/src/introduction.md +++ b/docs/src/introduction.md @@ -1,6 +1,6 @@ # Introduction -**Mccabre** language-agnostic code complexity and clone detection tool designed to help developers identify problematic & repeated code patterns. +**Mccabre** is a language-aware code complexity, clone detection, LOC, and LCOV coverage reporting tool designed to help developers identify problematic and repeated code patterns. ## Features @@ -9,7 +9,8 @@ - **Clone Detection**: Find duplicated code using Rabin-Karp rolling hash - **Multi-Language Support**: Rust, JavaScript/TypeScript, Go, Java, and C++ - **Gitignore Aware**: Automatically respects .gitignore files -- **Multiple Output Formats**: Beautiful terminal output or JSON +- **Coverage Reports**: Read LCOV data and emit terminal, JSONL, or static HTML reports +- **Multiple Output Formats**: Terminal output, JSON, JSONL, and HTML depending on the command ## Design Philosophy @@ -23,7 +24,7 @@ Mccabre prioritizes: ## Limitations - **Token-based**: Function detection is heuristic-based and may miss some functions -- **Language Support**: Currently supports C-style languages; Python coming soon +- **Language Support**: Currently supports Rust, JavaScript/TypeScript, Go, Java, and C/C++-style files - **Clone Detection**: Finds exact token matches, not semantic equivalence (yet) See the [Quick Start](./quickstart.md) guide to begin using Mccabre. diff --git a/docs/src/quickstart.md b/docs/src/quickstart.md index 0e84b73..a566342 100644 --- a/docs/src/quickstart.md +++ b/docs/src/quickstart.md @@ -34,6 +34,22 @@ To find duplicated code: mccabre clones ./src ``` +### Lines of Code Only + +To rank files by logical lines of code: + +```bash +mccabre loc ./src +``` + +### Coverage + +To summarize an LCOV file: + +```bash +mccabre coverage report --from lcov.info +``` + ## Understanding the Output ### Terminal Output @@ -79,5 +95,6 @@ mccabre analyze ./src --json > report.json - Learn about [Cyclomatic Complexity](./cyclomatic-complexity.md) - Understand [Clone Detection](./clone-detection.md) +- Read about [Coverage](./coverage.md) - Configure [thresholds](./configuration.md) - See more [examples](./examples.md) diff --git a/justfile b/justfile index 95923bc..850dd39 100644 --- a/justfile +++ b/justfile @@ -22,6 +22,18 @@ alias cmt := find-comments test: cargo test --quiet +# Run test coverage in the terminal. +coverage: + cargo llvm-cov --workspace + +# Generate an LCOV report for mccabre's coverage commands. +coverage-lcov: + cargo llvm-cov --workspace --lcov --output-path lcov.info + +# Generate a local HTML coverage report. +coverage-html: + cargo llvm-cov --workspace --html --output-dir coverage_html + # Build mdbook documentation docs-build: mdbook build docs/ diff --git a/todo.md b/todo.md new file mode 100644 index 0000000..a771533 --- /dev/null +++ b/todo.md @@ -0,0 +1,410 @@ +# Todo + +## Roadmap + +### A. Test Coverage Ingestion + +- Ingest LCOV/JSON from `cargo llvm-cov` or `cargo test -- --coverage`. +- Render to terminal, HTML, Markdown, and JSONL. +- Support path normalization: `--root`, `--strip-prefix`, `--ignore-regex`. +- Support Git diff coverage. + +### B. AST-Based Clone Detection + +- Compare abstract syntax trees or subtrees. +- Identify clones resilient to renamed variables or formatting changes. +- Require per-language AST adapters. + +### C. Cognitive Complexity + +- Score human comprehension cost. +- Reward flattened control flow and penalize deep nesting. +- Require AST-level traversal. + +### D. Halstead Complexity + +- Count distinct and total operators and operands. +- Compute vocabulary, length, volume, difficulty, and effort. +- Complement Cyclomatic Complexity with lexical complexity. + +### E. Maintainability Index + +- Combine Cyclomatic, Halstead, and LOC into a single number. +- Useful for dashboards and longitudinal tracking. + +### F. Semantic Clone Detection + +- Go beyond syntax to identify logically equivalent code. +- Require control/data-flow analysis. + +### G. Dependency Metrics + +- Coupling, fan-in/fan-out, and depth of inheritance. +- Require language-specific type resolution or symbol graph extraction. + +### H. Hotspot Analysis + +- Combine Git history and complexity metrics. +- Identify files that change often and are complex. + +### I. Incremental Mode + +- Cache hashes and graphs. +- Analyze only changed files and touched boundaries. + +### J. Rich Reports + +- HTML dashboards. +- SVG graphs for CFG visualization. +- JSON with stable schema for CI systems. + +## Coverage Completion + +### Tasks + +#### HTML + +- [x] Implement `coverage_html.rs` reporter. +- [x] Generate static HTML reports as a `genhtml` alternative. +- [x] Add index page with sortable directory tree. +- [x] Add per-file source views with syntax highlighting and coverage annotation. +- [x] Add CLI flag: `--html ` for HTML output. + +#### Filtering Features + +- [ ] Self-check: run mccabre coverage on its own `lcov.info`. +- [ ] Implement `--fail-under-coverage ` flag. +- [ ] Add `--ignore-patterns ` to exclude files, for example tests or vendored code. +- [ ] Add glob-based file filtering in core. + +#### Agentic Enhancements + +- [ ] Add `--output jsonl` for `coverage show`, which is currently terminal only. +- [ ] Add semantic exit codes for coverage gate: `0` = pass, `2` = below threshold. +- [ ] Add `--diff ` mode for coverage delta on changed files only. +- [ ] Add JSON Schema for coverage output using `schemars`. + +#### Build System Integration + +- [ ] Artifact generation for README Markdown. + +### Definition of Done + +- [ ] `mccabre coverage report --html ` produces a valid static site. +- [ ] `mccabre coverage report --fail-under-coverage 80` exits `2` if below threshold. +- [ ] `mccabre coverage --diff main` shows coverage delta for changed files. +- [ ] All coverage commands support `--output json|jsonl|plain`. + +## Clone Detection Improvements + +### Direction + +Keep the clone detector language-agnostic and rolling-hash based for the near term. Improve the quality of the existing `mccabre clones` output before adding AST-level or language-specific clone detection. + +### Tasks + +#### Configuration + +- [ ] Add `min_lines` to `CloneConfig` so short token matches on one or two lines can be filtered out. +- [ ] Add `min_occurrences` to `CloneConfig` for projects that only care about repeated boilerplate appearing three or more times. +- [ ] Add `max_duplicate_lines_percent` to support simple CI gating without introducing a new workflow. +- [ ] Add `ignore_patterns` to the existing file/filtering configuration and use it across `analyze`, `clones`, `complexity`, and `loc`. +- [ ] Add conservative default ignores for common vendored/generated directories: `target`, `node_modules`, `dist`, `build`, `coverage`. + +#### CLI Shape + +- [ ] Extend the existing `clones` command instead of adding new clone subcommands. +- [ ] Add flags: + - `--min-lines/--min-ln ` + - `--min-occurrences/--min-occ ` + - `--fail-over-duplicates ` + - `--ignore-pattern ` repeatable + - `--top ` +- [ ] Use exit code `0` for success, `1` for threshold failure, and existing error handling for runtime/config failures. + +#### Token Pipeline + +- [ ] Refactor clone detection into small internal stages: + - collect significant tokens + - normalize tokens + - hash windows + - verify matched windows + - merge matched ranges + - build report +- [ ] Add an internal `CloneToken` or `NormalizedToken` type with token kind, text/category, line, column, and hash. +- [ ] Keep default matching exact at the token level; do not require AST parsing for MVP clone improvements. +- [ ] Add optional coarse normalization for the existing tokenizer: + - identifiers can hash as `` + - literals can hash as `` + - operators and punctuation remain exact +- [ ] Compare normalized token slices after a hash match to guard against hash collisions. + +#### Clone Group Quality + +- [ ] Extend matching windows forward while tokens remain equal so reports show the full duplicated range. +- [ ] Merge overlapping windows from the same duplicate region into one clone group. +- [ ] Drop clone groups fully contained inside larger clone groups. +- [ ] Deduplicate identical locations before assigning group IDs. +- [ ] Sort clone groups deterministically by descending duplicated lines, then path, then line. +- [ ] Keep numeric display IDs, but make their order deterministic across repeated runs. + +#### Reporting + +- [ ] Add clone summary fields to `Report::summary`: + - files with clones + - duplicate line count + - duplicate token count + - duplicate line percentage + - clone instance count +- [ ] Include a stable `fingerprint` field on each clone in JSON output while keeping numeric IDs for terminal output. +- [ ] Show estimated duplicated lines per clone group in plaintext output. +- [ ] When `--highlight` is enabled, show only the merged duplicate region, not every overlapping window. +- [ ] Add JSON Schema for the full report once clone output stabilizes. + +#### Tests & Benchmarks + +- [ ] Add fixtures for exact clones, renamed-variable clones under coarse normalization, literal-only differences, overlapping windows, and generated-directory ignores. +- [ ] Add regression tests proving clone IDs and fingerprints are stable across repeated runs. +- [ ] Add benchmark fixtures for 10, 100, and 1,000 file projects. +- [ ] Add a self-check that runs `mccabre clones` against this repository. + +### Later + +- [ ] Add `--changed-since ` after the project has a shared Git-diff utility for coverage and hotspots. +- [ ] Add persistent token caching as part of the broader incremental mode work. +- [ ] Evaluate suffix-array/LCP clone extraction only if rolling-hash range extension remains noisy or slow. +- [ ] Move Type II/III clone classification into the AST-Based Clone Detection milestone. + +### Definition of Done + +- [ ] `mccabre clones . --min-tokens 30 --min-lines 5` reports merged clone ranges. +- [ ] Clone output is deterministic across repeated runs. +- [ ] JSON output includes clone fingerprints and duplicate-line summary metrics. +- [ ] `--fail-over-duplicates 5` exits `1` when duplicate lines exceed 5%. +- [ ] The existing `analyze` command can include the improved clone summary without changing its public shape. + +## AST Foundation & Language Adapters + +### Tasks + +- [ ] Add tree-sitter core dependency to core crate. +- [ ] Define `LanguageAdapter` trait with methods: + - `nesting_constructs()` for cognitive complexity. + - `function_definition()` / `call_expression()` for call graphs. + - `import_statement()` for coupling metrics. + - `identifier_kinds()` / `literal_kinds()` for clone normalization. +- [ ] Implement `RustAdapter` with `tree-sitter-rust` as an optional feature. +- [ ] Implement `PythonAdapter` with `tree-sitter-python` as an optional feature. +- [ ] Create adapter registry with auto-detection by file extension. +- [ ] Create `ast` module with shared parsing utilities. +- [ ] Implement AST traversal helpers using a visitor pattern. + +### Definition of Done + +- [ ] `get_adapter("src/main.rs")` returns `RustAdapter`. +- [ ] `get_adapter("app.py")` returns `PythonAdapter`. +- [ ] AST traversal works with any registered adapter. +- [ ] Language grammars are optional Cargo features. + +## Cognitive Complexity + +### Tasks + +- [ ] Implement nesting-aware AST traversal using `adapter.nesting_constructs()`. +- [ ] Add scoring rules per SonarQube specification: + - +1 base for nesting constructs, language-specific via adapter. + - +nesting level for nested structures. + - +1 for logical operators via `adapter.logical_operators()`. + - +1 for labeled breaks/continues. + - +1 for recursion. +- [ ] Create `cognitive` CLI subcommand. +- [ ] Add `--max` threshold and `--fail-on-exceed` flag. +- [ ] Add JSON output with breakdown per construct. + +### Dependencies + +- Requires: AST Foundation & Language Adapters. + +### Definition of Done + +- [ ] `mccabre cognitive src/` outputs per-function cognitive scores. +- [ ] Scores match SonarQube/rust-code-analysis for reference files. +- [ ] `--max 15 --fail-on-exceed` returns exit code `2` if any function exceeds. + +## Halstead Complexity + +### Direction + +Add Halstead as a token-based metric before Maintainability Index. Keep the first implementation simple and deterministic: use the existing tokenizer where possible, classify tokens into operators and operands, and report file-level values before adding per-function breakdowns. + +### Metrics + +Halstead is based on counts of operators and operands: + +- `n1`: distinct operators +- `n2`: distinct operands +- `N1`: total operators +- `N2`: total operands +- Vocabulary: `n = n1 + n2` +- Length: `N = N1 + N2` +- Volume: `V = N * log2(n)` +- Difficulty: `D = (n1 / 2) * (N2 / n2)` +- Effort: `E = D * V` + +### Tasks + +- [ ] Extend tokenizer output or add a classifier that maps existing tokens to operator and operand categories. +- [ ] Treat keywords and punctuation that affect expressions/control flow as operators. +- [ ] Treat identifiers and literals as operands. +- [ ] Decide how comments, whitespace, delimiters, and language-specific keywords should be excluded or classified. +- [ ] Add `HalsteadMetrics` to `crates/core/src/complexity`. +- [ ] Include raw counts and computed values in JSON output. +- [ ] Add a `halstead` CLI subcommand, or include Halstead in `complexity` once output compatibility is decided. +- [ ] Add threshold options only after the metric is validated against fixtures. +- [ ] Document limitations clearly: token-based classification, no type resolution, no semantic equivalence. + +### Tests + +- [ ] Add small fixtures with hand-calculated Halstead counts. +- [ ] Add language coverage for Rust, JavaScript/TypeScript, Go, Java, and C/C++. +- [ ] Add regression tests for empty files, comment-only files, string literals, and repeated identifiers. +- [ ] Compare output against at least one reference implementation where practical. + +### Dependencies + +- Uses existing: tokenizer and file loader. +- Feeds future: Maintainability Index. + +### Definition of Done + +- [ ] `mccabre halstead src/` reports Halstead counts and computed metrics per file. +- [ ] JSON output includes stable field names for counts, vocabulary, length, volume, difficulty, and effort. +- [ ] Values match hand-calculated fixtures within floating-point tolerance. +- [ ] Maintainability Index can consume Halstead Volume without recomputing token classifications. + +### References + +- +- + +## Maintainability Index + +### Tasks + +- [ ] Combine planned Halstead, existing Cyclomatic, and existing LOC metrics. +- [ ] Implement Visual Studio normalized formula on a 0–100 scale: + + ```text + MI = max(0, (171 - 5.2*ln(HV) - 0.23*CC - 16.2*ln(LOC)) * 100/171) + ``` + +- [ ] Add qualitative ratings: High, Moderate, Low, VeryLow. +- [ ] Create `maintainability` CLI subcommand. +- [ ] Add `--min-score` threshold and `--fail-under` flag. +- [ ] Add JSON output with contributing factors. + +### Dependencies + +- Requires: Halstead Complexity. +- Uses existing: Cyclomatic, LOC. + +### Definition of Done + +- [ ] `mccabre maintainability src/` outputs per-file MI scores. +- [ ] Scores are within tolerance of Visual Studio/reference implementations. +- [ ] `--min-score 60 --fail-under` returns exit code `2` if below. + +## AST-Based Clone Detection + +### Tasks + +- [ ] Implement sub-tree hashing algorithm. +- [ ] Use `adapter.identifier_kinds()` / `adapter.literal_kinds()` for normalization. +- [ ] Configure minimum AST node count threshold. +- [ ] Add `--method ast` flag to existing `clones` command. +- [ ] Implement similarity threshold for near-miss clones. +- [ ] Add JSON output with clone type classification: I, II, III. + +### Dependencies + +- Requires: AST Foundation & Language Adapters. + +### Definition of Done + +- [ ] `mccabre clones . --method ast` detects Type I and II clones. +- [ ] Clones are detected even with renamed variables. +- [ ] Output includes clone type and similarity score. +- [ ] Performance is acceptable for codebases with more than 100 files. + +## Coupling Metrics + +### Tasks + +- [ ] Parse import statements using `adapter.import_statement()`. +- [ ] Build module dependency graph using `petgraph`. +- [ ] Calculate afferent coupling (`Ca`): who depends on this module. +- [ ] Calculate efferent coupling (`Ce`): what this module depends on. +- [ ] Calculate instability: `I = Ce / (Ca + Ce)`. +- [ ] Calculate abstractness: `A = abstract types / total types`. +- [ ] Calculate distance from main sequence: `D = |A + I - 1|`. +- [ ] Identify zones of pain and uselessness. +- [ ] Create `coupling` CLI subcommand. +- [ ] Add DOT output for dependency graph visualization. + +### Dependencies + +- Requires: AST Foundation & Language Adapters, `petgraph`. + +### Definition of Done + +- [ ] `mccabre coupling src/` outputs per-module coupling metrics. +- [ ] `--output dot > deps.dot` produces valid Graphviz diagram. +- [ ] `--show-zones` identifies modules in problem zones. +- [ ] Metrics align with Robert C. Martin's package principles. + +## Call Graphs & Data-Flow Graphs + +### Tasks + +- [ ] Extract function/method definitions using `adapter.function_definition()`. +- [ ] Detect call sites using `adapter.call_expression()`. +- [ ] Build call graph using `petgraph` `DiGraph`. +- [ ] Calculate fan-in: callers per function. +- [ ] Calculate fan-out: callees per function. +- [ ] Identify entry points with no callers and leaves with no callees. +- [ ] Create `callgraph` CLI subcommand. +- [ ] Add DOT, JSON, and SVG output formats. +- [ ] Add `--function` filter and `--depth` limit. + +### Dependencies + +- Requires: AST Foundation & Language Adapters, `petgraph`. + +### Definition of Done + +- [ ] `mccabre callgraph src/main.rs` outputs call graph for file. +- [ ] `--output dot > cg.dot && dot -Tsvg cg.dot > cg.svg` produces visualization. +- [ ] `--function foo --include-callers` shows call chain to function. +- [ ] Static and method calls are detected accurately. + +## Summary + +### MVP + +- LOC +- Cyclomatic Complexity +- Rabin-Karp Clone Detection +- Halstead Complexity + +### v1 + +- Call graphs and data-flow graphs +- AST-based clones +- Cognitive Complexity +- Maintainability Index +- Coupling metrics + +### v2 + +- Hotspot analysis +- Incremental scanning diff --git a/todo.txt b/todo.txt deleted file mode 100644 index 730ff50..0000000 --- a/todo.txt +++ /dev/null @@ -1,233 +0,0 @@ -================================================================================ -todo.txt -================================================================================ -A. Test Coverage Ingestion - - Ingest LCOV/JSON from `cargo llvm-cov` or `cargo test -- --coverage`. - - Render to terminal, HTML, Markdown, JSONL. - - Support path normalization (`--root`, `--strip-prefix`, `--ignore-regex`). - - Support Git diff coverage - -B. AST-Based Clone Detection - - Compare abstract syntax trees or subtrees. - - Identifies clones resilient to renamed variables or formatting changes. - - Requires per-language AST adapters. - -C. Cognitive Complexity - - Scores human comprehension cost. - - Rewards flattened control flow, penalizes deep nesting. - - Requires AST-level traversal. - -D. Maintainability Index - - Combines Cyclomatic, Halstead, and LOC into a single number. - - Good for dashboards and longitudinal tracking. - -E. Semantic Clone Detection - - Goes beyond syntax: identifies logically equivalent code. - - Requires control/data-flow analysis. - -F. Dependency Metrics - - Coupling, fan-in/fan-out, depth of inheritance. - - Requires language-specific type-resolution or symbol graph extraction. - -G. Hotspot Analysis - - Combine Git history + complexity metrics. - - Identify files that change often AND are complex. - -H. Incremental Mode - - Cache hashes/graphs. - - Analyze only changed files and touched boundaries. - -I. Rich Reports - - HTML dashboards - - SVG graphs (CFG visualization) - - JSON with stable schema for CI systems - -------------------------------------------------------------------------------- -Coverage Completion -------------------------------------------------------------------------------- -Tasks - -HTML -- [x] Implement `coverage_html.rs` reporter -- [x] Generate static HTML reports (`genhtml` alternative) -- [x] Index page with sortable directory tree -- [x] Per-file source views with syntax highlighting + coverage annotation -- [x] CLI flag: `--html ` for HTML output - -Filtering Features -- [ ] Self-check: run mccabre coverage on its own lcov.info -- [ ] Implement `--fail-under-coverage ` flag -- [ ] `--ignore-patterns `: Exclude files (e.g., tests, vendored) -- [ ] Glob-based file filtering in core - -Agentic Enhancements -- [ ] `--output jsonl` for `coverage show` (currently terminal only) -- [ ] Semantic exit codes for coverage gate (0=pass, 2=below threshold) -- [ ] `--diff ` mode: coverage delta for changed files only -- [ ] JSON Schema for coverage output (schemars integration) - -Build System Integration -- [ ] Artifact generation for README (markdown) - -Definition of Done (DoD) -- `mccabre coverage report --html ` produces valid static site -- `mccabre coverage report --fail-under-coverage 80` exits 2 if below -- `mccabre coverage --diff main` shows coverage delta for changed files -- All coverage commands support `--output json|jsonl|plain` - -------------------------------------------------------------------------------- -AST Foundation & Language Adapters -------------------------------------------------------------------------------- - -Tasks -- [ ] Add tree-sitter core dependency to core crate -- [ ] Define `LanguageAdapter` trait with methods: - - `nesting_constructs()` for cognitive complexity - - `function_definition()` / `call_expression()` for call graphs - - `import_statement()` for coupling metrics - - `identifier_kinds()` / `literal_kinds()` for clone normalization -- [ ] Implement `RustAdapter` (tree-sitter-rust, optional feature) -- [ ] Implement `PythonAdapter` (tree-sitter-python, optional feature) -- [ ] Create adapter registry with auto-detection by file extension -- [ ] Create `ast` module with shared parsing utilities -- [ ] Implement AST traversal helpers (visitor pattern) - -Definition of Done (DoD) -- `get_adapter("src/main.rs")` returns RustAdapter -- `get_adapter("app.py")` returns PythonAdapter -- AST traversal works with any registered adapter -- Language grammars are optional Cargo features - -------------------------------------------------------------------------------- -Cognitive Complexity -------------------------------------------------------------------------------- - -Tasks -- [ ] Implement nesting-aware AST traversal using `adapter.nesting_constructs()` -- [ ] Add scoring rules per SonarQube specification: - - +1 base for nesting constructs (language-specific via adapter) - - +nesting level for nested structures - - +1 for logical operators (adapter.logical_operators()) - - +1 for labeled breaks/continues - - +1 for recursion -- [ ] Create `cognitive` CLI subcommand -- [ ] Add `--max` threshold and `--fail-on-exceed` flag -- [ ] JSON output with breakdown per construct - -Dependencies -- Requires: AST Foundation & Language Adapters - -Definition of Done (DoD) -- `mccabre cognitive src/` outputs per-function cognitive scores -- Scores match SonarQube/rust-code-analysis for reference files -- `--max 15 --fail-on-exceed` returns exit code 2 if any function exceeds - -------------------------------------------------------------------------------- -Maintainability Index -------------------------------------------------------------------------------- - -Tasks -- [ ] Combine existing Halstead + Cyclomatic + LOC metrics -- [ ] Implement Visual Studio normalized formula (0-100 scale): - MI = max(0, (171 - 5.2*ln(HV) - 0.23*CC - 16.2*ln(LOC)) * 100/171) -- [ ] Add qualitative ratings: High/Moderate/Low/VeryLow -- [ ] Create `maintainability` CLI subcommand -- [ ] Add `--min-score` threshold and `--fail-under` flag -- [ ] JSON output with contributing factors - -Dependencies -- Uses existing: Halstead, Cyclomatic, LOC - -Definition of Done (DoD) -- `mccabre maintainability src/` outputs per-file MI scores -- Scores are within tolerance of Visual Studio/reference implementations -- `--min-score 60 --fail-under` returns exit code 2 if below - -------------------------------------------------------------------------------- -AST-Based Clone Detection -------------------------------------------------------------------------------- - -Tasks -- [ ] Implement sub-tree hashing algorithm -- [ ] Use `adapter.identifier_kinds()` / `adapter.literal_kinds()` for normalization -- [ ] Configure minimum AST node count threshold -- [ ] Add `--method ast` flag to existing `clones` command -- [ ] Implement similarity threshold for near-miss clones -- [ ] JSON output with clone type classification (I/II/III) - -Dependencies -- Requires: AST Foundation & Language Adapters - -Definition of Done (DoD) -- `mccabre clones . --method ast` detects Type I and II clones -- Clones are detected even with renamed variables -- Output includes clone type and similarity score -- Performance is acceptable for codebases > 100 files - -------------------------------------------------------------------------------- -Coupling Metrics -------------------------------------------------------------------------------- - -Tasks -- [ ] Parse import statements using `adapter.import_statement()` -- [ ] Build module dependency graph using petgraph -- [ ] Calculate afferent coupling (Ca) - who depends on this module -- [ ] Calculate efferent coupling (Ce) - what this module depends on -- [ ] Calculate instability: I = Ce / (Ca + Ce) -- [ ] Calculate abstractness: A = abstract types / total types -- [ ] Calculate distance from main sequence: D = |A + I - 1| -- [ ] Identify zones of pain and uselessness -- [ ] Create `coupling` CLI subcommand -- [ ] Add DOT output for dependency graph visualization - -Dependencies -- Requires: AST Foundation & Language Adapters, petgraph - -Definition of Done (DoD) -- `mccabre coupling src/` outputs per-module coupling metrics -- `--output dot > deps.dot` produces valid Graphviz diagram -- `--show-zones` identifies modules in problem zones -- Metrics align with Robert C. Martin's package principles - -------------------------------------------------------------------------------- -Call Graphs & Data-Flow Graphs -------------------------------------------------------------------------------- - -Tasks -- [ ] Extract function/method definitions using `adapter.function_definition()` -- [ ] Detect call sites using `adapter.call_expression()` -- [ ] Build call graph using petgraph DiGraph -- [ ] Calculate fan-in (callers) and fan-out (callees) per function -- [ ] Identify entry points (no callers) and leaves (no callees) -- [ ] Create `callgraph` CLI subcommand -- [ ] Add DOT, JSON, and SVG output formats -- [ ] Add `--function` filter and `--depth` limit - -Dependencies -- Requires: AST Foundation & Language Adapters, petgraph - -Definition of Done (DoD) -- `mccabre callgraph src/main.rs` outputs call graph for file -- `--output dot > cg.dot && dot -Tsvg cg.dot > cg.svg` produces visualization -- `--function foo --include-callers` shows call chain to function -- Static and method calls are detected accurately - -------------------------------------------------------------------------------- -SUMMARY - -MVP: - - LOC - - Cyclomatic Complexity - - Rabin-Karp Clone Detection - - Halstead Complexity - -v1: - - Call graphs and data-flow graphs - - AST-based clones - - Cognitive Complexity - - Maintainability Index - - Coupling metrics - -v2: - - Hotspot analysis - - Incremental scanning