From 6f77594b55699c1abe585b5c1f7d86a64da53dc8 Mon Sep 17 00:00:00 2001
From: "Josef M. Gallmetzer" <64498081+galjos@users.noreply.github.com>
Date: Wed, 29 Jul 2026 10:58:52 +0200
Subject: [PATCH] Add PQSetup documentation site
---
.github/workflows/docs.yml | 48 +++
.gitignore | 1 +
README.md | 126 +++----
docs/_static/custom.css | 41 +++
docs/assets/pq-logo.png | Bin 0 -> 16607 bytes
docs/assets/pqsetup-workspace.png | Bin 116173 -> 0 bytes
docs/assets/screenshots/input-review.png | Bin 0 -> 165385 bytes
docs/assets/screenshots/run-plan.png | Bin 0 -> 159204 bytes
docs/assets/screenshots/workspace.png | Bin 0 -> 138763 bytes
docs/conf.py | 84 +++++
docs/getting-started.rst | 97 +++++
docs/index.rst | 93 +++++
docs/reference/cli.rst | 78 ++++
docs/reference/compatibility.rst | 85 +++++
docs/run-packages.rst | 88 +++++
docs/validation.rst | 90 +++++
docs/workflow.rst | 107 ++++++
pyproject.toml | 7 +
uv.lock | 430 ++++++++++++++++++++++-
19 files changed, 1315 insertions(+), 60 deletions(-)
create mode 100644 .github/workflows/docs.yml
create mode 100644 docs/_static/custom.css
create mode 100644 docs/assets/pq-logo.png
delete mode 100644 docs/assets/pqsetup-workspace.png
create mode 100644 docs/assets/screenshots/input-review.png
create mode 100644 docs/assets/screenshots/run-plan.png
create mode 100644 docs/assets/screenshots/workspace.png
create mode 100644 docs/conf.py
create mode 100644 docs/getting-started.rst
create mode 100644 docs/index.rst
create mode 100644 docs/reference/cli.rst
create mode 100644 docs/reference/compatibility.rst
create mode 100644 docs/run-packages.rst
create mode 100644 docs/validation.rst
create mode 100644 docs/workflow.rst
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 0000000..661e44d
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,48 @@
+name: Docs
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+ branches: [main]
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+jobs:
+ build-docs:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v7
+ with:
+ fetch-depth: 0
+ - uses: actions/setup-python@v7
+ with:
+ python-version: "3.12"
+ - name: Install the package and docs dependencies
+ run: python -m pip install -e ".[docs]"
+ - name: Build the documentation
+ run: python -m sphinx -W --keep-going -b html docs docs/_build/html
+ - name: Upload Pages artifact
+ uses: actions/upload-pages-artifact@v5
+ with:
+ path: docs/_build/html
+
+ deploy-docs:
+ needs: build-docs
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
+ runs-on: ubuntu-latest
+ concurrency:
+ group: pages
+ cancel-in-progress: false
+ permissions:
+ pages: write
+ id-token: write
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v5
diff --git a/.gitignore b/.gitignore
index 2a1f6db..854f653 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,7 @@ htmlcov/
build/
dist/
output/
+docs/_build/
.playwright-cli/
frontend/node_modules/
frontend/.vite/
diff --git a/README.md b/README.md
index 728a139..21d67b4 100644
--- a/README.md
+++ b/README.md
@@ -1,28 +1,16 @@
-
- Prepare and validate PQ simulation inputs before a run. -
+# PQSetup - +Prepare and validate PQ simulation inputs in a local browser interface. -PQSetup is a local graphical setup tool for -[PQ](https://github.com/MolarVerse/PQ). It checks structures, guides ensemble -and method selection, builds equilibration and sampling plans, and exports -readable inputs with a fail-fast run script. +## Install - - -## Quick start - -PQSetup requires Python 3.11 or newer. A PQ installation is recommended but -not required to prepare an input. +PQSetup is currently installed from source and requires Python 3.11 or newer. ```bash git clone https://github.com/MolarVerse/PQSetup.git @@ -30,69 +18,91 @@ cd PQSetup python3 -m venv .venv source .venv/bin/activate python -m pip install . -pqsetup ``` -The interface is bundled with the Python package, so Node.js is not needed to -install or run PQSetup. It opens on `127.0.0.1` and does not submit or run a -simulation. +The interface is included in the Python package. Node.js is not required. -Check the local PQ installation and available external calculators: +## Quick Start + +Open the graphical interface: + +```bash +pqsetup +``` + +Inspect the selected PQ executable and available calculators: ```bash pqsetup doctor ``` -For an executable with a different name or location: +Use a PQ executable with a different name or location: ```bash -pqsetup --pq-executable /path/to/PQ +pqsetup --pq-executable /path/to/PQ doctor ``` -The same path can be set with `PQ_EXECUTABLE`. +Validate an existing input: -## PQ compatibility +```bash +pqsetup validate run.in +``` -PQSetup currently targets the stable PQ v0.6.4 input schema. It detects the -selected executable's version and uses PQ's machine-readable CLI when -available: +See the [documentation](https://molarverse.github.io/PQSetup/) for server +options, validation scopes, and complete setup examples. -| PQ command | Used for | +## Input + +| Structure | Extension | Handling | +| --- | --- | --- | +| PQ restart | `.rst` | Preserves atom names, molecule types, and available velocities or forces | +| CIF | `.cif` | Read through ASE | +| XYZ | `.xyz`, `.extxyz` | Reads standard and extended XYZ data | +| Protein Data Bank | `.pdb` | Read through ASE | +| MOL / SDF | `.mol`, `.sdf` | Read through ASE | +| ASE trajectory | `.traj` | Read through ASE | + +Multi-frame ASE sources import the final frame. Structures without a cell +receive a centered vacuum cell. Periodic coordinates follow PQ's +origin-centered cell convention. + +## Workflow + +| Step | Result | | --- | --- | -| `PQ --capabilities=json` | Version, compiled features, external calculators, defaults, and supported ranges | -| `PQ --validate run.in --format=json --scope=installed` | Authoritative parser and setup validation | +| System | Inspect coordinates, elements, periodic cells, and close contacts | +| Method | Configure molecular mechanics or one supported QM calculator | +| Conditions | Build NVE, NVT, or NPT sampling with optional NVT equilibration | +| Prepare | Wrap periodic atoms and optionally perturb perfect crystal symmetry | +| Review | Inspect every generated input before creating the package | -This CLI contract is implemented for the planned PQ v0.7 release in -[PQ pull request #322](https://github.com/MolarVerse/PQ/pull/322). With older -PQ versions, PQSetup keeps local checks active and states when PQ validation -was not run. +PQSetup does not submit jobs or run the simulation. -## What it prepares +## Validation -- XYZ and PQ restart structures, including collision and periodic-cell checks. -- Vacuum, NVT, and NPT conditions with the controls supported by PQ v0.6.4. -- QM and molecular-mechanics inputs with calculator availability diagnostics. -- Optional NVT equilibration followed by one or more numbered sampling runs. -- Seeded velocity initialization and optional Gaussian position perturbation. -- `run-eq.in`, `run-01.in` through `run-999.in`, and a `run.sh` launcher. +PQSetup checks the structure, plan, required files, and generated inputs +locally. When the selected PQ executable advertises machine-readable +validation, PQSetup also checks the inputs with PQ. -Exported launchers write logs to `run-logs/` and stop at the first failed or -incomplete PQ run. +Environment detection reports what is available. It does not establish that a +method, force field, or protocol is scientifically suitable. -## Command line +PQSetup targets the stable PQ v0.6.4 input schema. -```bash -pqsetup # open the local interface -pqsetup doctor # inspect PQ and calculators -pqsetup validate run.in # check an existing input -pqsetup serve --no-browser # run without opening a browser -``` +## Run Packages -Use `--json` with `doctor` or `validate` for machine-readable output. +| File | Purpose | +| --- | --- | +| `run-eq.in` | Optional NVT equilibration | +| `run-01.in` … `run-999.in` | Sampling inputs and restart chain | +| Structure restart | Prepared coordinates under the selected start filename | +| `run.sh` | Fail-fast execution in the recorded order | +| `pqproject.json` | Plan, environment, provenance, warnings, and file hashes | -## Development +Uploaded force-field files and calculator templates are included in the +package. -Node.js 20 or newer is required only when changing the interface. +## Development ```bash python -m pip install -e ".[dev]" @@ -101,5 +111,3 @@ python -m pytest npm --prefix frontend test npm --prefix frontend run build ``` - -PQSetup is available under the [MIT License](LICENSE). diff --git a/docs/_static/custom.css b/docs/_static/custom.css new file mode 100644 index 0000000..9845d1c --- /dev/null +++ b/docs/_static/custom.css @@ -0,0 +1,41 @@ +/* PQSetup-specific additions to Furo. */ + +.sidebar-logo { + width: 4rem; +} + +.sidebar-brand-text { + font-weight: 700; + letter-spacing: -0.02em; +} + +.sd-card { + box-shadow: none; + transition: transform 0.15s ease, box-shadow 0.15s ease; +} + +.sd-card:hover { + transform: translateY(-2px); + box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08); +} + +.content p code.literal, +.content li code.literal { + background: var(--color-code-background); + border-radius: 0.2em; +} + +.pq-workspace { + margin: 1.5rem 0 0; +} + +.pq-workspace img, +.pq-shot img { + width: 100%; + border: 1px solid var(--color-foreground-border); + border-radius: 0.35rem; +} + +.pq-shot { + margin: 1.5rem 0 2rem; +} diff --git a/docs/assets/pq-logo.png b/docs/assets/pq-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2c5d31c4aa08fc156dc68c743fd58762a594bea2 GIT binary patch literal 16607 zcmch8Ra9JE&?O!$Nbn#*gL{zR5ZtXBcM0wioZzm(-KBAYTX1)Ghv4ouH{ZJjyX6O431OS$Z@DGEIHqhoh4+F?edu}
z*xVOiC;KV8Ee1uK^@XZN1_AOy*^Rg^B7;SCDo{BbYRovX6{xe>1?&MU?uFECKZNS9
zmG$X~88yMfp$qw$oZ~ljc;~Oj$av6j!|9DkD0==?swB -iF
zAJ#sd4a6dLf=!pQhYUv_iM2d!zFX$Gln>R=83ly!BrrHD@P9_Y5ASTS34
m;Sq8Ei6{}EpKRBHi6(!zl^1oVhN&mhtzN{sGQNp#<)gJ{Ku3uoi3RhNFsW!7M zeZ$)RxXYj|d%>NK?JB5e;hqmI4)%vGa@ek3G@Q`n1@aWD4k&MHxt+qoREl>F;XCjm z&eQ7_5ursVIVl;a(*`XnxhbpunfsCa29oEvnGfb|V7gLkIsTKdgg%ki?qM_c%&=m$ zNtPNL4(Db;ens!;8*&(r${|SDBqp#UAeiD{M=m$rUp=CWo`|Jz+02)T-FJF<^!N1o z@R$cjWQdIV-1e1~|MH(K{xCXfGNS**u)b8wz}P?m+RPIE?L`Ply zDo_;V)hqmnbUsONbFJk)%q0iw@{;5~$940!+QA`vV^pxyw13RU$B4FoaRwK(lCUqo!4x$Y%tcAZHV z6`9)pX@Vf_+sBTqQD?}XZJviwxGkE<-6~Obau2S5vn?nrym^?hB!xH@4ddNTM#scB zR_uI68P{vczF*N5sM$b%Z5b&tFPRm(XVI&>3PWl`HrK(X^G+L^=@fXvtn=>gd>&g> z)Wmyt5X|mG?(?l+bW+Oc=7bO0QhR7+n_cUVtx%`z0L2zPomRJ$C%(2~4i;KYR^*R) zfZJNL3<-}YaO& +p+Gc~lw@EUZpjq30BQOUgROGj32;e45M$i%>I^SE9j z35i8vNsvOG>V2M%uVP0t+oMO7F0(_J<<5aNN0*79%wYex&v7+jj45J$D%<+A%B!%w z89yrR-;(Frj5DwqycB(XjRd^u#kK7no+~?%7Hh{}cjbq<9cz);OD>Q@5!e17V(`c? zDJdtb!v)!d1=PWm23x?+W8-c$U`q3%-HeRvx|*;e>w_S}e%HoX?HZ%E0)4C>BcJ#t zA0Ka+IwJIhJobiAOL*i`8jLPybypBi0RQPJG`MG;f9Efkmldbc*UJh5z1f%5!4}Q( z&r2HI*S!bgSB;}%9oICqaK;bz@B>^*7qjiXW1SsQSBJK!UpksF?AiL(d%x~(^eg06 z0hL*%v{=M}%W 7Bt0^>^ufYpu;`Dl@(?8AXx#wWo6>{5&=@@)`>?tpn$3+?c3JuzldKwNkGL z&w(aeSbhErOQ_&E;+v>3Y_>UCiZwBQU>#3ve5R&GC`4hMe=c<8o>!K)uG&n50#d?P zb6pN&t#<(3e4nc3n2A#(*esc)OSUEy6>pk8(wG&DqqI{}H88PCjE+xFiYv=1&ws<3 zk&vP9R6lY^p5dE$M~QvnC=$!D{APIPaq#&fhO ;Gwa@LDuROeFO6 zUzPqJMRKMUdJR>zg{Qt7x>9Bm>haB((9Ea4`@w&=iG^)-_IZmjlINelz#ShLaBwc~ z2C0% #r3!PNtx*nAimW82)1r1i6Eb4GNnSePxR`;$2?wuhl3$us3V12tu#dDlw_ zR$P&`sHm9b27?krm{y29wrn8Z>FMIHPqvmQF-YfKjk&J+UD9(*45HK(am%k cd;Qx^!Jwr%0=tnp%alLakPs zy1)_BaQL#MVhc8o`X)WMlQYR;K|<~}DQ>#3EQcb6Nc=5nVWkiJk6%JtoAcojy3@&b zoA2+qQPS20T#ou$3&tHBE|R(JsQ#3o_de|{w^-_=ruzOp-&;go8yv$BBh&sxTu*PM ztB3a;zkm2!Xa4cR(o{r|raYUiShutD z(}dY@EHW@OrdMZ i-YsT3j8vz^O|nldt Vg-FHR(PSJ?-m>YzV`IAd0^P{X0$EszJkk_5=&UrMKnk}b z?^1TM!H$h?_%6tpv;={Q)p_@L$S>}ZFhxZMX!P NP} z(f54(I+PqzcQwSeh&Z!$M@*Tot=wzWuka76)-DXIPqp`-iJ{@{FC2AV5R*YpjEi%f z1zf Bj8`m6jWqhFX$<>QWdf$ ;~97T`UZGWLjK_dY4D}opd+nwl<>)4=t3T6j30S>TCF85WigXu(y|mASoSR} zP&}^xxWIYCtmfNfsd0IbzAmvcuXp!GUpWm=6 5(nh4!ik#&EXn=CYS&eU4{V_A7k`%KQ>CTk29- z<3W7hmJUwa*kSFXqh+}_q PZ^ z7PeSwB 4#FbFIqFecQmjbS8W5hWxRvrzB%<^x9 dMkCAt7pFqkxpKo{kIID+$~-Usqz)$ekyDO(9&fW4Fjn zn(uYPIUfO0sIsJulD1FK6OkU0JJ_21shf%jPWALQH9($Or~cVn|1O?)wv^yCSL`uK zN@W}$8Jij%&+T#ktp4-wqNvHTfQSX@pus_x48a_cusUmNdajqV{*91p#M0U~ZP{U) zqs0MCiK$c fE6{YL z6!Mvzs)@2=SkypQNK1NHE~IUFO$+}o7C`xc{gI6`Fff?q&Yh#C8bU72@BR&$CK=AQ zrKI^JptGP}kdTkueH5yd+#X7jW&W-DK=W(%^3G*~E5RuNJ4UdMgs5IPRbZfk>Vy)Q zi^oLe*K3l2;j>k7=^5RD$Tlww%p{b41*KPS`Gr~5H_XQoLd~$*F`Y`@w+zyWHgcpQ zkiJ-HtacUu&PfVwQ)V59ixsc>xj1g-WM+h6eEga&)pWsJO#&-WXY@a}(6%QaxUyaO z=sm<)p9NF?g)Y(CQwjFVfB2Y=Qwk$yh1u2gVH1xfcV2-pL0l@HpQFv{*x9V=aEA7b zU+}6-O{G~ZVPf7Anb6`(;?6z7QO~>jug}Yx;TxiFr4I7LmKx0Z!VA7UOzd4uR@uWx z55Jk-FGnKaJZav-3D)ydP4dHl&zP(ke{^Qg`?yoF?0J69B|in5Jf4Qql>OEfdlJ!b zaca+c!ULB-&>MGycX*$Rw>hk$p#tfNF!x(!P3fYjl!K0R-31JrUYnT*pV=xx#eCMU zvr{!$&9ckR0#^@$Hnnk03}Lws-d9sTXz<;sp6;W);W;4xAmyq&iQ?FaQBeULfxDC0 zfpP^4kZPIN*40jNaO{O plGXnPB_p;U4L2G1C+Cq|kFmPxxg% z*#~ziY7c0_1aGE)HRH1B*4BID{Qi7eY^y&Kyn~(7Q?QkV>u!%pUut%S6*_jK!B5^b z{srl)VY0IMKYVvj^_TrCIh5oocSk7epY?>l2oAGaUxVJS MR}l5p|)Xc~<)=1CgC%2-3M^nP~@<*-<`tyIXnu6%ag4UC9Xb`lo}@qB%Hr z)4LM1y;-fW C5clzHT+ ztZcXMIpW!v4)jmYz(7&_W6`k2Y72HE0(Q-ruHdw_y{+tN2P7mw-m>oHQIKakks5De zQo9z9f}XSS_s;p~;jr$yMx%nkQYlj7Ym-|_c)WUzKPBAMsx$d=DV|jstfpIySe=H4 zZet6jx4A!_-iA11Ze#FBOUlN44%@~io5)ae52oH>`H*(IbRQ_iERQY2^IDYpO l37$!4)nt}R Xt1e8K7bx1?Qw2PX{Ql=S zlPfBPf2wWq+pWWYK287m)CX@IjZ*m9wzsFRsHn(-&;>85IC(!m&Zk0)Goyb)nvV n|`F{nFg&ob#9WYyOtU_8}!vN5YEh>eEgGF2FXcZTiRaMXc^?y-dT zc(0V{{qSIX_rwx564Q3AZoMEa;=!5z_kpS5#9GMCX#aY3l9*I{n~qh_d~qV}GdhL5 zyw+ylV?Zo}lljtqUIdj;$j_gjL;A4IwpP4t52mZhW*Z6`d^%tWEAIUKtpYADmp|Sy z=r(&PS_`B+5o(t33>5abMC&DwRgzjP7SD zvf|H2XfxNr@hluj(7Jh;dAW>(er)>`IE=S?zRrjjtapx>_>EN9hPlOlSl`lh2+a>( zEN>>JgY4e7<2;)E&i>hzB{@gG_Hqn)nl>ITu%oD;Dc3EX^zdh0y3$rMLBa(^55|#x z;}#VaZ=>feOvB)FMM7=m_+_MhPBG8OxKd3ySeL_()`TC;QbI1PF{>`dBV(rKHG M5aUGl9t;cL4I*yyeC)a+w`39>cXpR9R~YOy(?t$Zx4Ur|*} zbqC4sCsSmd%-!U9kK;j-_M>fO1o_x=x)iA7x^*D=r2nX2k&}xPk;)!~pr1-A3-h>A z?hxfrVsQPtix>JPKJU|yrv!@^Ir(xqHA-+?M|cOqsa#e~+z(--px+pa_+;U2@#W`K z -S*l0!+U@5X>1(;=vpBu$HZbh5tXl$$$4gWedA+Bxsf!%uRS zlZ~JI#f&Br4(D-GGS6G3Da$Wki+(&o?%F8Wq$ls2Iw#S$e0-Iw)SGP;9gQOmUT_i{ z=$Q|U3bu~G09gpia^M4TB|5+D#oG1md)Z6u^X|Y-?JJ75i(Q80-JP;F$216Y@@(}w z@#VN)lYvzxa`=V~ZaCW#h5q Az^0t_@;3rtk&80Kd`grMv{ z^Uvv*%?^+G-CrWdpZVRPE2haRJi5xWdbuHhc=T-)+dBz>4RkBNc66FtF$ JAN^o3XN%Daip7CZ=k33Q8Ye4~0E`^BbJvPa zT)yf_MM+6QSXMZY<#UApEbr&{M?pk0@ro^CrP8hU&jQw`E&LMvx5n??$S4q}%VfcH zuRERTJ-kzMii%B2^ZK8&e8gjZ074cYh6T%Wz9h{hvLx`gtb+1E=7H;4mwbIkA?&i+ z!w6>FN|bCSWwpP^g&U7kMNZQl_w-ivQP Pr?l*w_Y}i(;i+9VWkK~T?S}bv<=yT4p(=5r zWZNs4r^l;>mn-)PSanVwja*ES2Blds4sxVhRPvM$4SN+A_>Y)JXsb+SeU;zot3 <36>;sh8(8Ltd81|F@sOTzPN$ zFCGqVQUTXD0yTL_3 WcHP*2{z^Vh!zBH(oYuP@@7()tPQ zqwxLRzWOv#AG~XF0X+PSj(WT# pU01 gFFwTTK0a; z)&tZ#H|X9ymG;;DE7d?qo2PK}}7KKE3gB&ECif%M00pje)28mMr|`Rk2irJJtB7 zDP;8eqx%cfnyT8Ddc @H#GhwD3d+49pZJ~$fjYl>|Amn=X00Q;wj#Xa>t{8I5JAcZMK?yJMkih z0e^2LivmSy&>hMna{sq&SB-JhqFD+m+&eSXR+R?Zjn@^IOg lE(8q${%ca%;Yy|A6r6#a$Ce|&oC`f z@X^7tS0X5JsbO`O^b&Xqd6m>0Jf A2kB?0yBN8_ztvDnMN{LkWZr4>aKaSv58pK*9tFTfNrIxH@GYZ>ZT zY4oggip@XUMVx8U->{;{sQ&8i(&DrztSEssIm-^Q5>+fo L|cRyQp zny#-~r?<;Ta_aF)$cl;G#pLG~RIJq3_%yJHaGkC>G}Sy?4hlYZa$JHUBUhU bDKSYl9?6anxZ4?t)!VwtRw>Mlx7@>{Ehx#!E-cHI>QBxNk9TKgf->w|1Z@+O z%3#=-XpO%EGhD9~kj>^hjZf<&gj2RS9!~?^2mqfpF|#zsIb68xy42PXu?-LKP9iE@ zc}Yq+SuPG!DU0;ZOXfLG #eBW*J>ZE z;~7_QTRvJxR55;Gy(UVrO%0a|mK~BqUiTGsra#!Iul7q?L+yh#zDgB+0jltgH~M!B z?H5-wG2hxHAPSmpd cd;Ro2bJ93b|xUZF|M*F>=mWyK40Iyod72Kai4n zHL@EVtj9ZBJ4Fl(Cv6_~tG`OH+KWPZ(o0N2Ehg*oaxA|~FfPxFVBuevx)Ytp<2hkF zE?>KeX?wGIJQnIh9zUjdl>;#3BUv5ELaI+vU$={JJLOm8_1X&wE&f_GZXX87Xl;58 zE2W?hGJYz|2Q?wPayxw =&`ogihhfVN nz*DaY&oyo_EToUH5qBsNzY!<1+ny B^MY6`@BVy zlY`~SSxl`pbaBz?>ES>VW^JdF!*NgVFiZHu<~sp8)14^8SPHV;{n1Bb_FkHHZxP5} zdT-{YlK||hx@x1L`qf04Zt&!0ax+o!fn=VEkJRv<_MB^jPj>JNWJerWU4@H>abR#G zKi4q^yu#k__+Knw%eCdI4ojuxLSMXKkcp{SE15p9)*5L48rE8_aEi3AP3M(FwCeHA zR)aObA&PSDM+X)8#TEu8?t9x5)Lvd`(Tw)*X$wB+-P Ol|U}|d0QN$m) zxU)~QZRZpYbK#+Kcg$IT*3Uxb;C7RtMTazullJz)h$rG2WA)B=+t!(t$`RVQR7?zv z7#XtAk ztF%9hT#24^|E^;Lx_@FZXvgx;9&sWEH~I#ur6Lq4%9mRkoF4PJ-Z5W1QGJCXf3(ml zF%`y8GRfSma{TdNm#F?oj=j=8C0qB$Ym0p)J`rJ|y!t9s0srXmIXuy{1jU?n$QY$a z?bh5iJjk{E;J7!68OociHF_dq^XJMqbnSZ#>SMn^l4g5EM7~_Ec^R~p(Yh`|?Zy0? zobo2?s+4Q5rF3P67e@(*&)vtfI86TM0-1ljPTnnpqd)UN>iaM1zwVKZpYT9NW_u44 zMcl)RZPh~1$mI}BbYx~`K&nuE$wid0?$X3>eqsRu!t7|(AZCazhxKXf7z*7nf({4< zm8JqhVG&4}$u%jL+p5Ji-|D0t&`l_Skc_C(i+Mc)rn2I8Gk=`ZzxOteto? mE$8{%Nx$+LbRG;oc22v89JM$Mb0^0joE~jQq^f*>A$WqBB~7!Ex!_-G z!&fV?m-eKUDYQ6!HZQBaLL!{~Vq;_J6TjA3?}VY_G9YfuH|>NvjWH0SopUEbyR5rm zPE(0dvOG4FJYKZaHzl{Q0fW#?<43Y b}Sl6z>98#Tm+C5!+zi9~GB;YOSQEQ;d9j>?z#DBUW|uL#Mm zx2-=(ef J>kb&-}GpLaZbFHa# v u8@6pX?cg> zEOsAn(YB9e-=1OnVF=WXjPCU1(WdO}W0r6SD#THw%?vQD1#`!|H6GiI{W57 VP4~6L<6M6!!z^ggDjM&`L!k*cCdWb)UvH=$_#ui`b(}KvH9x%*c zGf}4>;^6R(l{TV*;hkx2UU7W(Lrm>M=~Hi8hV#(W=$6!+@b6?oVKHocQ92R}(@Gzf zmDUDI%;^UQABul{?*81>ed+9Uz&~qJ@pQ4$L%$;YsEm0eNhKR@26$s6nNW34vS2}l z4s31`@90oNVrxMVRM<8W8a5KlDI%AJCQcS>uhZmZ3*ZS;b059BuC;N=g`M|E?<2j* z?p#i~)UC}X8%2SJ<%|F>eQss|L_OZ>{baE;HPWRs!Dc0k4E0$$ e6eJ4+gH+$`@ z{EJw3E6tD{;Vqon?fTIaC##tUm=1EZPd$)usj| Gnazkf{k?j?nQ!zU`z_JdP<3{A6Fy==90*#}e;Im45V#CtnR08Z(1JtoBi z%6v*lKoF>huCdN!3M&4{A$pG|w49PKKU_*b3E}ygee1_AIjOQLHKn=$V6(i{Ufkx~ zRlwoKCKfUf)?oK7y2}}7BenW^FTF%Jj7v8@ImR &eH* zQlX@*H>M)Z5~1PB$j! dp6?YMoUeXm$`pB5dvLCjJmbVe@ZBC4<0 z;B{e==ZWUsp}akcFRr|MXv}0HpZw+#sst*;GA`_VD=zvZ;vG7P52ESzR++8JqPUpg zE5Rr!z<-I`Lzg+LxeBF^-f?J(Ce3*zuCHX(|ILB@dWIQlrRDDL57nB?{#>Qq`+Ny; z1MdREU^6q*Uy!4fT)eX%5_1ODbB&GG4sbw>>ULkArFqnTj4om-VGj%q$%0j0#ZQ$p zN@C;q+KLug*nKjO%Rvhe46s~JE*Z>w;-5n=i1|7u{^A3>8gD{sOKNpd)=yHArH~yW zJ()EN2B!JN-GLX2pQVjmDN)@lw1$Q-P#2PP4DRV=7|BuavBhan?+kUn(u1GH#73X5 zHO&<_`Mf40op1+oc-NgXn76I~(05xN_>_UCGi_a1Az47A78_SKGD_e69Qo4P(7e2C zu)>Fs6wln;WC%fw`y%3HiHaz)WmWRa_U87KrlcAnA*t)NaI6g{9rH}RCVsD?&n$!G za~w>tntIhoE(2LqcuVaQs%L&L!8zkHqMW~Ww}VC{#1n8Q*=i9DqMc~&?tMSEO^fVa zk!5t~y;n?$ii|ZfupoU!L`gz{Pfn^pCo5}3N(?Gyuky~%%gJtwz0>c_zl>!bNF0I@ z$C^=esbm?~)o~iHGUiMD9{1*uO~&6t1F7 WSjNkA6(Rf6VcqB3VZY zH`)tnpn=-lq<9$B7TVh|x3+HOtvpwHG0(!K3sO$AqJw^9*AEzTJ2({QYX$i^SiOms zLaGvC-0u>l!qkS9lm^CzhULb=s(;Nam=fx(A0o^@s}i6-;S@9-dJlPcm^tvyIQ^B= zy8OpS{lLuJkzf;mn^RmH-R|4fG{A~73VQqpJdXG=BJs$Y?_(e8r*1Ns)XS210xtF% z!q`KSWDyF|vS4L(>G6@T5BE+(0xZi=vD>ctUjcMJJa+>N7qRSEhm%~~Zw;=h;|MZ0 z?JofIEPf Z!taIr UJ938!H>W~Gj}MEesZbJe9w@w;)WOjj(>^M`c+0E zuXSg1$Lz^g;`jaF@eFR`X;zr2e6kW8N(;~@vlN&GplkpZETIjqF=%!F&uX>fAdGV1 z%G0w-+>@qX+_z??)YRq(Y(wIPKaP`(fhD3Cc!nsrS#>!}6~|+zYsC+^S3FOpto)%k zbtIz1TUyDahk4|E{%CxBd{Y`FIeEqwMvX@u>v?3{tw0MqG4-AK*xJO$`XXii{`nT= z?uO2{hc|a)4{a}Q5;_Kk`)O#UwOZyE%!EQS6W)+gy&@g^m*@Bi&$y!VZ9!(HiD7X#gj%oooF2y%93=zgYy#Xw>!OjM{*+Y;j|>T)Ilykd!a0Hs4~=jFbT?(?zX}_6 zyl!qfki_9F43F9M0SJw0Rn6AUP7U$Tsci-ZhQYzXGYr=*X<*;}xnc{@0#eCEHk6c< zx96rmPN;ElsMfHnRalp)Rd6qJT4)Z~Bbo`s#pNdlS{#;s=QwSQ6P7%E7DvloQ@s)( zIsa8_psg`JzYjQkKR-XKIsfeJjla&dbprJk2H%Ymlheoao|G3CN5`ebq(?FEo3`@f z6jbO9501(!NVj?;vn(kj^Z$gWwSP$(wrp=uuCfomst4Q;d}7BM6w%-OxXUJhOZMlt zqy!u2w09D{(rQ^5AZI?GR16YKCV2{?&j_~pl~Z{NR-}K(f451v$s3FjEQ0~{xA4oe zQOj{UEd2nmUZCGb-7((KKdr2(-=C|i$xYhY+Vn%QI>_yIzg~o#p8AnBq>9)!{mQSm z__GTjsX0FD4X=kz&c1x~u_hw}Q+H>WjA{xRLceh%Mm7R)^y=*|8uvKN$&y_gU2I^% z3=KV-o66w)NsNH&qtSZ8DQFO#5N4QtZ3DiI(f#(Qy7dxUsba z2q65DtQ7zhfrrf@$lt2ojwoyG2CO
EWhTQ@gE7y}cB zzlQ5p*K$Av73He_-x0XOcl=k*wVZ0Qs|sAqK*r2eggP-&`XRX||Lx~LigOWxfad|P z*$u5uBLfoWSBY5#D!sX^ (%?ii2wl6T;zIzD~5fDrWe%F2uieqLHU=pU0){spB zc9_0ovsP7znL_@O{c0Q=1d>a#w5!ZB v%Aerj zDR4t^*(Niz`QG9(DuV_p7Bm# B(PSxt`{oElxgc}R=Ni8lmIyEslyR@`tU8A6@_d7rw)HU!H6}7QR zZ>tBG$Uq|)v_-42-G^ND|9#Bs@b|~uaMzHPu&RPWxf{y0{jYoKWq>qP;j0lDmo_>& z&T7Qiq-zWiMz=R#^NHg~%B!ipd}ZkJUo1eBQiB8qq>9A{w|V~WOE^POPWUf#|NlIR z|9_(oNCiqWw14LZv<1V1gGQjC_niETlYQy`p+EcDs(mu6tSbVZRS9+N72&^M{eL4H z_}|R &%>j+`=AE2M^GwOo)mj%!n?{&o0g>8jM9@`HwFGwyJ{qEsfvt(TCE@ zTIWa`kY~znjp8Z@F4W<9r$Eo~kDvmW-qVd?Z;u=m6(5Bf4diREyX4!3znk)df$3kx z#c3WP5s}H35nxRqWq8`BRV*Er1P1*7>%TMw1$$-|Kp!+C$JQTy_#t2JzfYSGACpp& zmEQ-<5#C0!d;fz0AD;amZ3+maPs$@gRTlj8lQMi%X`3Ec@E zQ%6zJC(AXsz5Z^3>ANHFkL>)kJUoh4G@NapK3RFMzn|QBHAbxyOta-Co@Z***FzH+ z_5r&1U0+u%o_f9{Y*{A^ei??1O*&IS$6B#={8x^LG&A7PHTj3h@W2Pd66XJz4Wy=o zI=#m0wbi#^$ qg4@ZYe2MtvH!PXY@0flt}SCd$rr332|4{2Ilrq6= r26WptA4~Gf%Ir{>02E{?z5$W^{j5r4{!|vlppqQ0YP_XGfMrlT9 zz9S$1cY)I%2w&Pwmu!4`BKhgm1B2Id1#RlJEfNI9#lbG{(4doq)OVY*s;GQ3%3RG7 zhjm0M4KWavE!7%rR{++uUhIE;l$4n2aC!XeC?I^MzK(lp4&N&qlg9?861Kcwwdb#N zqHr|-16pS(y)c#=JKcN0?Rarvj^b2X$MUDqad!k25W3J(UT$q|9hH6%>!MZxDkW7l zhULs#hEj8-3KnZd?76B61r0}~`5qjl!ngcy$N_!Le=enN)lVG;rpBUAMAz<>{8zDh z1fT_x@2EMLPQ6}Z&mjry{ e&i(PD>Q*c3*DSo8f5n)|m>_6cFT`;< z0k`ROJ$MmW`FzrMqt2%T0AQHq CKLTAdxs@hONE6^l!CMzvh?L$_DJ6$W1JI#90& z1|w*_b<_QP5w|?)!dERoYxB>=rGQ%7DT*g%t!;_H1(cT5IfltxYx-J$$zBt@B>#+p z1K|#RbDn9}**BFsg$-fAB{qfPVqoLzswtV>)XWL9uG~z19Q{B(zHv5t^hXjUrXP#A z?5tB^(dGPuN6bq3Gi~BuUV7h+ZDgv%%{I}mfUL*+CH~8Y6}mT(dQp}X0X$Dcv!awa zt4VcJ-+gJOiMZDkqmv1ifkXfM$|V zoSvS76`3olpr4|#_mBVqU#f4UlKZ=z#VhQCxeISHDRa#3ir;@bRC#8Jwhhs)44(;g zRU7(W?)^8tomL{mw`=6*Bj ?s?}9q`bXvQueNfWUi7!?Q6x!8 zr2G4v+fCPGP-4A|uICm%KV%4b?M%ja{}6>PYJFF%dWcw!x0%2D8@3vgP$9H@5W-UD zHYg~82GIM`+s@C<-3)E5rE$fmh3zgb{K($W(e0=Xk7-Z%OEsIMAI5RPgUueVX4U1K zFP3W;dc%q9hyHQQO1kfJO|7A4UvHGemCqWEA7HNNlx-M6vir*&3o}#iGy1ii&%8wq z)@#d|V|l5Vyd-G~%39BN)xJ(A=}Q*VJN&lPcDSl93g3p?FmFBE(MHL}uU~fGwzA=@ zcSdo)dB (Z$pl#I`I#=i_b zf^TtY-^^TkHFuye5g=YvcT;F{&&*C+DODU#Iwk k<*`_2?sk{BPTE1` zlK^d9I>1@F_ub?gp$nw!yBhcBvQY;^Vuxo9{@Kn#y{T%)S)Fa92hYT22Gfi>*aZK# zR^Oe-iI5MBb@Oh-9-XQUasRMPBBb>KhVAf>baJ&cZnhS$FEw|E(^YrW)L((JGP_Wo z#oR7fy>WG+>(VNC#Ju3UVXZ1iL+#{2L75g6V`^I}c`&D `xb?g16M E;HL4h&=oaRO@19x`eL$74&>wa%m*Xp@p?xsUfIoY(=yR}+Pg+!* z&7N&L-e+_9JEV%DZP(0vf6t8LXX5t$GWty66C7-3E~wAlkhV%~-v*(u$5D5mZE-Q< zKT-G7C0n_3_m)_5V7LKwP?}3i{U6V}>sx{Fd^9lBQ~f9J!!B1CR-gj!?TE%}yXV%; zm!VI?$!!qf0^=dV%VQ_^*LD>g_q%GrQk2j933Xd~Mo|ir|Kj6IUY)?QP?6n#FSys1 z@09?~A+ylN^j3*|& x0Q@+sG&eRn9`g6^R&K1S;`Lqa2k 4#bl_%X$9%kzW38r=~!!{ad)*4G SUoHh*33aB(Sg|3&*0WpqOD_$r+w}dR-Llu= z@8n{O6k2%*g+O^;(Yl$bX=aJ`a9^^`i@`yk#~O&;__33NSMRp9qc=j|T06x<@is13 zi__-j 1iVj#20g#`xl7K9 *nRpr#PgPLX}j;?*RP#c(I AXWgaQkMwdp@c6wOO(J!R&V_d<|-5?Eg6_`-=+(ccAz6kyNkU@}xJVK>~h2oyu=J zvj}uF-JQv6svUcX y zgnRY|K0EuuXr{KiLV4_e-c**A#=3`9W AU|16zfQ(^0)`;NjV+{*5@iSSUX7^+-F6gqiA zV`<>k;c~WF9=f;gxLGw}`>7}FP0A+6D=jLTB@Z4i@?ln0Q=6GV%sZP8_hD;TFN-P< z3?RI;-MH_}XEQjbMi+{_LQD>^x)euzs3 CP@LbxNGG^!~DA1xP z(Pm9fhI3#2<1;-=o__vSCO<0EPL5AR;pY<#(pR?8(=#y03a)mjis8k;$o5J %(1D%NwFCvDahu)v0{}s=#5*gFbEYJ;xOgpGVCTK(^)Ky_>Ro3oF zxMgDhf6>YRKUAf~ 3;>hD zPcZ%G&z~(Vo bl{v8_| zyOF7^f^?qH#^LViQtpexF(Xj1h-Spb!)MyJ6(9L<_awr^Pd>D^!&zV+0Eh#W7tS9v zTW6>0I?o)5&0PB){5V_e`&mf!YK)n%sf6A5X<58a8>x=SIL+tVLYhLB+H(5M_iq^5 zRY=m&`W_z+PN`_we|| ~q^L7fb55`+g!NA;lAA+7tXH)jqkQqgC5vf9*Yq zO%HuTLlGw6oP)}`+6ct2h%9RJoBgsS0+kWH+E{-wmqUxA+1-YAqRJ{ikEL) ^rypUj$PyCq!Q1F|8ES_ni zgdaYoE%5z88nLoP!1C%J(=7a)%w-{UUE#Sh@z~n0xQkeanK~h-Qbh92yU{GUZJRCt z0X5=rdo)qOkX}7g>bumc@MUV+?s}$ht3UQy!j4b!)qUALZa)@9i`{H!$J&}+x1_0& zNwuP=_~U$I x2c;dPS4}>8RB<%-Q~Xm_JZW(L;s^} zHwf4@nF!ezI2QoqIo=sp8@o{iY7Zw3n!U$tlL;5&eWSH*?egi3>nAjDcb}U}9uy&= zt0HXp<+cKHrfWL(Ng 0=l8z*i{Ip_wPx1L zJ=e_(Mv^1iq0$@i!--PYOI!|bJs-J=C@2^>w)%%OIx=;=KNI1r*XzyHZKZG3+~7Xd z%jmQ`+?R7$B(Y`x*1gUo){P|O#&xbZKbWt`GejNHeY|(Xq2HWty?@Ij(7-_FzC8MH z5w$;Uld}-Vb5H&PRPvSN OzswP-raI%Rll>uCS%)@ime`?=TGDc4bG3G zu~+x@`(O0SmYaACr_($4u)5!b1sc4B4}1K~9`*bc>#B9}PG`?Eu c*||6YS-}6j=GNzHnq(IY42 8KL;0fq`sS4JwJI`ufT?&(o5W6ir8IX-CKKygXq8#Tdw7 z5hdmIa5@HW4LutbIXSuGXPidEYi-9mUovTFsBTGV?3BL+7sXNn-+4XJ fCCk>NdIl*+FzL>yxRKnZWgi@LP?CUP&BLiIKjMk(r69Ox<}(4&k!dB0R_G zX_auo;P5clhlkt6Tq@SXc_zKDp5H%nl{7Y@&oLqVQVHm>{pSRhQDim-&SWO)Sq{~C zF`q{T>Vih|!f@mvzlQC0I DJ!h9s1iatX1+-eh=Lx>P_6G*1>&)z- zrYn2P={+s$z**F>dGL5&TU}^IVYEE1uANrzn7U5Ws)-^Dr?e+zVX(5FxE#8l+=$hY zOpf2_?p;t+KjE?1Fe27lP08Cwx$ hC;NGTNXWY=~+`FQ5!kk&aO8gK`1EEO%5h}W_u%92;a<1@fRA0O4A0; z9B|`Hv_)_|P4-E_Y 8Lr2^q$1d zoLfQ%sq5gR7~tTz;ryN$;b`NNqvDJ*^2x|lnv{18bm(b#d_TSzE0!<-5C+68oX;bK z6jW3@J3GZi1)@nzV1QY>ye H(o)V~Mj=rfR8M2&r(yI@OMWSz|42cr z`>u9RfO)g!)$qSesfY)po(1r>=Lq54S8W?lZQ+S)tE87D7f;R3XG*FUjqy-sBYO$t zJZ9U*TdpH#9#6u;!mPzY?ZYF>aOQD7O6ZM3Iy~$4(hFp(Tfar*w}-n&n?@Gm$oldV z^(!7wR?6ibey5+tJStSEIAX{VJeTjaszKFT=J56~CEe|49~YYnZ>6?PUqHjo@!`>n z-i0XbD()c1qCRa*LFQ=k_q1%pKdT6a{4eBa>X!~#nZk=zOMS=rf#Vb6;|04Ovp2NW zns&DxofGvY8KyMF Bvu5kL+i3;EO%=c3GIsUjV$gB;>Ykuw(SGC4V _&&qRGrH6m>7k3q>rkFk_p zv_7pLYrKU!m)0H`-WYc_6dHbj9=5M|1T!MxJD>+M#UUSd`csUoh>UmbE@=$!&2f^m z+6)ZkGf?cJS=W@C5mxAZGm!uGIJZynF*8H(pfPPQ{cBdKnmw-NeSmC@ZeFpF?#qAT z35+anEQ&Q6qhFz#saj*=qMJvgSY&oVUP)PL9!YOZ86jz=1l=QHi#s7oyor9nOjfuS z8!}nm#dwwN8)t4UL>BlA_1A&x*OJRk;rL5zr4~ZhP{Q>&F%=I&foI+qUfEtM1s~|3 zV+sn&H4LNfP^dt;(!KgjCH{O(TXF7du0k2uol6zM(&jr^p-8@wzU`v}XERu>CY|qV z%gqTtwrfj0cgGhsRYD@4 ($5C&{mWuUJj<@R0C!C-zOWx6T?i?o7U$c z(ww}8 _RU4pDy?t$#9vL0~GmWF%)0HIrIoI+$|IWqadwk7< z5$D?{kDIFf5(nhxU0B$7?q^0TkMZ^reK!XiPYSLh?#SA0ufpDhOW~~45&d^NNa$+5 z#MHdhlpOujzjDe7n;Avq%)eRkvN3W%9cIm#w3y5U%&=z?<8>;ohnaBLAMaI}cn%?( zHJN5tV+oaqJYDNiSqkIdlCjirAg|JRIM`V` Zz{ZjpI-m|QonoENkMNqk zIpDTb)`qrt98QProl<|QS_tOhI^urHm0)uGR?Jz)3g7e^JCSE`?-gcdi-3%P#mqG< z+UC|3pWEeq<^WhXrbn`8#<%l>$HA?FhWy0wv6x44%IlW;+vY~U|J@~H1iD|~aV)0% zzG!&xIj9S_6bg~24(2{U95TOo7QC5cEG*3`kY7)-Yt(f7K*Kc?sw?SGJ3NA; z^NUJx&HCY^K9twJ+7))E9o{hyyH3l~{?g&s_! 9W-8d4$a$NFJUt0l~$*Q4nXJfwJJC48g5H5ENj`OlV|GP zHC;% <6lXc?zb!TWO@pAH#xKNBm*QV&4M_{);%q-m;FE^ +-$j_L1Le*E(&@X+R?@6;-3+ 0H>G2DWZ^yB zn4 vahscNYwwjG~mg~DS>Ps_FC58LJ2%{5+BBFcz!y6uFZ^er5l9Suz z_9ra?D?m0uii#}>7RW#(-rUxoK+-HRv#hb^7ugM|v8j91=_SR~hLatv-0g{8MobZA zc0x@SIXbW7-GsC7q~`Oy9@&_I2&?%+oEhaS{Iw0gDgE2i=a2bc@W&KS#7V}99vQNx zuQL!Qre}REQCj=ITEItNja8F9)%BFd#fL6r?KIaTTxcO;=hY=12J)e>VUCVtsteY; zrhQKVidC%kT~RjV{O`U^vaf6}){52h;I)=gz?y1QP3%Vy*Xo)+LI{>-=i7HBwg@9T z?j${C7bDKUGLgD29$Cq}kIi-&8`Q$E$iy~b#bL5pINj-Z?@EejS4Gczyd^=@=VXB^ z16fSDg;y Axxuab{Rq4%W8?pS{dQ2fe-&e63rX*KqG{ z;aUdDm&@AiBM9bkcCDZ`8LGEZvy%`GIvq!T6#*KmYyB`32SY u6=II@PL9DAsBRkX#JWxW*MWyo zWZ8PdzCM968LMPJ)$gpFh>_E6O5(4Ml1y2{GJgI#!sCpVnvr2@ZhV&RW864mKVu5@ z%~D1IcnzX9TT>c1M?1UySH>JWqut<@`X)Cw&m|adpW y6XF8Kz`)rmm!<2 zjWyKO#(LAz6qIKgm6ccTTun4gh6*T%{Lz+c$C-0{WLWZC$$b4!%#d|A*xJr9%0Xzx zhw<8z1}ZZR0R^eXO{j2xp5`+VdEu;}xRThZ>%~^V>ue1NbbPUp3Gtj4c%TJ#l@33` z IGc6=TqzERnz@_0^mNEchVWIGxTb)MqqMoWe^6PTe{hxcr^8f%Yn`%Y=b3)~ zYe;#vpB59nk2Zbvd4rId!HKh9R`r(cxv8{8Ee NoWugCXo+){;wtIusGW5uE4kujF<)Kio@`@Gtgf;~EF)7vSi;yvH@ zTeU6(_h1MLMP_HI4i=*(OQ}U>m#Cg=ARF2tPHy}SO aP`)H|D>8E1-0pRaec{2#As`JN@{{$MUW3zlmj0 zjizN pH$F%D&T;!Z&ADgINXvDv%^~!|#?LfMdLJ`M6B0?aF!QCK z&*sdVp|ez<&hC+<{=w*h3&P3Qd=^j?C2pi0u8NCyS!z~FaLZ(fhh{M a8$oyTw^k3dtH_aq@~Qz$v@GRm6eiev3559UIR>le7}aT?=1G*t;ijG zugDy3(w~M`Ln#S~YX)-lzd2A*Q9(Z@H6=ARCI*Muydb|^M^)7svg$oJIQV#fRcAJ{ z+@@TL+8a?^Tr4CaGLph_e{3j`FZCoPC&$3Zc(yl1rQaK#9jn>ycsN&`&peuAI#Fk_ z5JYQfXyN{NS9{!sE1^Kh?ff%2dZNtzK9)*lc45J_-GfJW{mI_mUK)=Nr~`A#twzf| z`A|_6;4{8ujC6vsMyBo>;DlxA>j4c_kH0^uus^M|!``$FwPR$?W{gRsiHw+BWnC*i zY;JsVGVTShqJ5|UjjNC}oLlxkswDn7#a}BnLU2Mat2sY295bFT=@g|BP3r%JJ$w z4?`N*wl#gPUhz9NIVovxf4^K6TA!TU?3*o6s$RRbxe1Si(_-6w=JEJ)vPg-Fk}~*> zll$EjKC| dosa>)vZUJl HIe*+!LX>qqdQ|@%Q$YFLx`1aRKTvD9l*+aM1%ZL~7 zFEP1%Tf;6-ydQfJ35!Zfs5znIVaXHF6f({QUx^(o^436Pxx;%TH2m|uVMOuxf8`rD z;*{HN*}+-CA%?9LHx&SxYmO*MZI2ksvA!nsZ|3d(B{Z=tF+>a>d!{5K z?a}S}cp<;ER0?^HF*z$MtL1~FoSdBLXa*56d#08>qSZ>9#d3?E_p^423BDaD3E77x z=gRpS)8gFj >sub^Jrn>+bC2DygDIA*w0^=0LGn!$NIcD5$FZt*Uc zkT~!z&3B`I{rcr{xfe7nKokh+^6`1z;m&*i6SOUcWzDlXhUqx@*;AgT3jy}9s7M^v zV!lpEQC<(GEp5YiL?($rqbHGK8^UYwJ7{Sk*_G8OBgT=Cv&sC>Wv$C)Sb9bpPq(Oj z@206myOn?uN;byuOy SnfG2Y_O$QSZQfXN=v>mYCfm*A2G4uU=kf= zSXnV`=li}i%U73#Ov`|(>n%@NC#;Gn3!b=?JK$FW=CGcUIJyppu(XI&vZZ9>RN0|y zdD?zI`T#{##?LIV=)CRiZRRwT00lCcy!`x`A|(xbsN>;0A(zYM p}>ovw!}~&CjdbpDLHCbFs6Rs6yFFbwosfFr0|qdNl)|tB&t6#4|{I!SOIg))%%d z>L4ZM^@K4R{z{!t^|3! qGE9 z>`bsMWQ9cFu_R@o!aZ}`dw@gmqnaEaPvX2(N%D@1jW1t)LkCl}&|+q#Dws3dXHl$j zbucb=Gdee>`?WkRb-oU2IZl^V&Es}=0A?>slUO66Xn!ak_9X9`T!6qo)ExAnqU7c6 zYifY(ZEo6v(&4lCcfIxXK`BXt2%PWS+F#`5jg;dmGc%J`)vM{e(r9UkK1&EF$f$_K zsi?@|imliJ9K_j~t+0=B0Hw0In;WPT2Sr8(2Qw s~WU`ko0mYDJVPTzbbDXNI-r1&m3b2@|(+Idi%Mk4CdA$QV zH2wi*Je5*O+#3-;E9lp{(tAQtxRg!Jkkh%{x5o{~K!B)zdATceT n-EUm#M9;#E`lGooB}qjndLW3eNVEEril1*Pz5on <&~|c_NbfE@Rz&p$E!eof#FyLQ`m;yd0l zjXG!9<21eEZ!^YTCIfU5PbrT}6-1pDY0c){X RAEh9bYA~Cx z2-$CLP+^*vPz&{ o?AupwW &6kx7LpW?PZGB$aJj;viG%ZU!o<$HPtr&dGHXDh4@hf~DkMkpU z#{}_R)VvV`gY)(kW4Lx?nh_sGmvrLF#mKJz)dFlwUxY;A7>m5Dj8y!XdP@-)6dZJG zc$FUdmV7$#`dU11-F&WEreBee?};V3zOoCwHj->a%X#Zu*! s-hO9VBLY&u%_FvI6{rLlGpL(O*MT3p2;RPNTCdP=A7UD8XE1 z?jS;&JLV_l4SmoJ?s `#RCS8oN2Fr0IA@q?8IRpgO-&(Ntw_R>4QsPIUZq&K)aG`tcn;|X& Z}SHT zAT?LDl+BJrFlU0K#y&bay1I(q^L86ifz;!fce3N*dt5P*FEdw%lA&Qo+-}UCw|rUA zait3<$H9h;jg1~wu$U#9B%G$_d;< FW`MJ3&lgV&@AE*w@ zb0i?V5x6iGGNeRgME@}!W=0mC qeaU3FQq0mij-s{I%v4(3!6a`q#ovHzIt4oIAkL?0_?HjZ&=XL z--Id#UzCm42{GwDkqRNlo+X@~=M cJ!=qz%fJy87sGHD zEqtc%d74JcoDwBomgu~9j9AFndGE5SqT*!lkV_B2Qmgh$4V^rt#W+^wcUrA>wQaZ% zNBgGzRoyqQW_81TI)iw)tkQUCTWZb6H|GyW)G0GR84lMJ>gjJouZkg9V@+?j1j(-a zcHxPgwe0d_(35wxtVQ80bNm_$AzhEX(t+Cjlht-)V~^Fw8|rzI7=w4Mzmfb6KTV_l z)ZmGy;Pas4%(J?-ykecs(tqwFkU&?UurS?e@4Hryf6fx|-(K)f4@@#FOlW~uQd&%x zQWTa=rII0xdr>Gky033AM V@)v(YoKV@R6nBGHU4vAs$YiR?edxHYOfe0JG-R zm^4~dE?VWZsklwe({_$!3e9mrW5$nBF9Q67d2`UqXys= 0)KEF>D0jGB-3gG_cQ5%xjBbGh57h6~0PT zQ`0+ia@-%4E{Py;X|Q|58PihCceL0>$V!mBSexO=`umD9Y7E}6qitc+MtEBVeEfE$ z$dK0~oQ0?)dK{jER?NaMJv~W%rzx}(diQ`0wg+^MZa3G-(v6$n`+j}$42mT*3qFd1 zcwBCfVb}mc<7|}e4pg$;9^QkQ>; a(H_p1E!QZO_`RAB>*O)D(&sVfZ(r8p(nyHSji!n7ZN*o3zmAI1-7`sR zITT(CB#&++!{O;$6gt;||Ah4MsKO7$9g+I08d-T>PA%UUSfC{>Xm~ivH4qX~I=YDM z_pRuMq{>o4xey;cvMIG7v2-nB;zC1_=8 3~ z-$y_7_QYs4d9RMKn}{tbBrE$4*)sUBxBfZX`115NfcMKMCFgD!to2U;@V#2IA(w)3 zztDU;d2-C8VkN^?kQQZ7QBe`3tK3!aZ`q39^beYK0Tn&vo40Pnkk;wnxe`im(G9zM z7Tccq?>=f=A32#VX O4yI{)BR06RQOnFS(DH%UgxYTFq1~}eXDQcR zL%0gKCxB?>9vD77KKWHVX#ANJqSQ7*(QKG~>Au_kV9*MwOpLbSS0G)YVvEtd%#b(z z7TA7L)&0^?K~=RcM!S~%pV!YXI_*;uo~8LlAwl66|B&!5eCy0xMFy?;+SF$IMo7X` za{bleveNk6<>KPvQ1f+gI3R*6rYW3~3a4w;pY`t`M)XF FDuu2b*Ne`-Z?08jHdSlp$+^sx9kslhWM@b#X>eSCj|E~Qj83f2@Xp%$1 zB&B3zq@+-JnVDE9x>)l)J?4;t!eqXRm#hDmnSV0VK)~bZ;TMxu5ko3vnpC_P9>143 zW~3D@@+qMn>{c&%8xp8Vber;U)Fsj#+>j=e^otrDfk~l~0qTAHyGPJ15XDs u}`H(a^+)AqC-!8=@$6Z}a!GdoAVnk16f*ak`LC9orL;**T7p9t$R``ATAXI-h?3 zC#A^e#^5|ZKDEz!G)q! $+(ij4& zfo8>ZAVbzrcsM?<{ht)I1Nu@skWl`WQ@Ed2S^F2v&N|X)1eX2y5)IocgG4wgV{gDO zYrUVAUc3K(>%Pb&EGo $+JHE(9e~chDU#{2~l!aY480% z(Hb4evlFH$z`NBIgNLmB`}ML5%{;A6{pqBiga`mSx0;wXFT)1s;R1D6*^XiW#Y;*K zU}%Afzk&Jg2BdCs@R9NH*PRQ-^XcblZXREjJC@Ue=M1$gJV%bQhzrpkA#-+XU0|)Z zdyVW713X`4UCq1Voi9{;9#?LT(n$9wa|0^bq|z9vx`U$~QT4{nW#((Lxdm0e27769=!}&c(1lTQZZA~_B;nv_m$x<}V|Vl& zK!!`f**w#`iY6f`ZW}W9#T>=LI)pS$v8BcN(0|rrw(8q=uzm^*7R+uSS^GJ*w)W=c zV{sIgX}r?9;+4rZPp1>lR>ClG#S)(j3E@JulTxBSD)X&RrQ#k)V;HVqsGZ)d#(6H( zev^~KZPa^ge|l(EGdBpBE-g?!BD^^QBFU@`)0rg>&!p^(504JFH}}ZcPtlMZEYDL6 znP6oCim`D%V^22oSKZ_*QqZllFbzgpmW>@T1+oWzSPqUx)}yfC;n5PC>=jZellcOo z! ZM{r$5B(Yu9I_q`DJUtTwN3B)-1(fmkD8~t?tf0|2$3IK$PvbDG3T2YP zWAm3{>u<>b<6elshXM(4!R`h!HeuX7jtEe}Je;TH_9h2w(ET5TA!XCOBkd+?_Lo_= z^8H!TNVOs1IkAgPPxQ2z)HKR(lqQ9dc4zWU2rFlf7ndrZGE|#BV+^PLshd`V&TOsi zQ7Ti32m@I#)y@-%@~L1H2z%0Z9@JbVSy>0lBe@Xn3r1L Q3b%BA z5 iIqt=JN s1zpZf# z4SSXfmL~A2^gr1DRQO3|=npntdP5~S5wyQqjw0*dL)=?**@%N#+tWVp_ptX8NygSI z%e_t(`Cn2ay}cpMu_FsniV6x;O(jJ|Z;0nWVt$mu#bWupLQf_k0*`rh{!cb)Z&;?? zC3@8=NUtr^dFHAm$bd^hrBFe^Vxff@ Kv0}rNT_Upw^`UAV2?7yC zxrCHbY@~O19V`CVL-imXfz7X0o*?jK(aZ K0>Pb3y5a&Pt1lQyUOJdyq`1PX1l~;(n~`83&{Ay()j}_~^K} zxR`{fnB^bn$_ooW2l1ZpWK_W|FgQFsB%3Vv)}n+O@$xcJo|2mSZCKzd4?=NRpeP0L zj-afJl5*=%I#-V^>b<=V3OXt() gO(go*h~QrqF}1>2AGkDuNzw!i 9e4a2o;wL9~ y1K_ziqJU>ZYP2q3qj>^)!@dQQIXtjz{q0BW~SR8p5(}%OkX_0fe76b5Q zw4IU9I*5$R7yE{XQke|1T3UW5_ |1VbiE@#HcAGjPffbx31~UB2|UnJkL`T8f69)3M}JN@RurX;R}-V@grd?_IH>p&a=vz{%d^ zt7c4?x0r^AlVNz)?Bt@GrGf3kRDC&K=%A*Q1y&*j6@}cd(`}2df{HbOV;m+n(q}M% zC};CJ2+TGDJt-LBH|h~)20mKk+>}XtC$yqkQbQBjykN*=!2RHok(AeayQaSGj-8Q@ z54hfFiDJ?0AIM552&Cet>&UJWVxi&OW@_WV{AVr=W)*j1YiC3oOMae}rOkklymJS| zAO9eiSyBwqk6%ij;hBh$_V9g9!(_? Vry;}hz+ISC6EL;wA z{xnv;UuM_P?TlHAbm+*~obG%KV=^mEa(!dKMPCy=_O>ay>%P=fqI2^pj54j~R9- zFE{UV$mSb$$WOn_Hf`WT0Bk9!$;mSUcFI@4v$A!tHOSA)H3o>5!r#+dAy=h3rbgz1 z?}fj}pKVrVlW%8WlZN8deOoqPo4>fU2cA#u`k<8Nwl%HQwBmYzmWvB;-$z>YdJh$! z!3gB}lbXzi6`$LeUH`JW>8iO23g%OUw|f76k>5D`;bu+v#px ->HSA$CYp70Z0h@uOY`;8(o(Kh{aozK-1MJnM0y=N z#hwuzV}Ewd0@LF$B7)sLry}s}Gc!|T Qi zjz`*cS0It{wh{5&b)FzGJ2f{G)jpUk1ui3yU!;hO6jZwuXF2~~D+@|HoASyV2+USU zZ3hvt?yRoSO{H_6KmOZEv@JyT&gczaRDHZq8UXnd8n>%9wZY!Gwl4?3Q`^(+rGffe z2ikcStB)x$KNEf ?cEu`#NmjebQ&owv *ip|qqJ9NPJjMduVPv791x36;}G4e=R