From 6f9667c6f22722526d99c377a4816fe0edc834ce Mon Sep 17 00:00:00 2001 From: XriXis <110514249+XriXis@users.noreply.github.com> Date: Tue, 3 Feb 2026 22:31:55 +0300 Subject: [PATCH 01/19] Lab01 (#1) * Complete the python-part * Init rust project * Implement rust part --- .gitignore | 3 +- solution/app_python/.gitignore | 13 + solution/app_python/README.md | 181 ++ solution/app_python/__init__.py | 0 solution/app_python/app.py | 110 + solution/app_python/docs/LAB01.md | 165 ++ .../app_python/docs/screenshots/answer.png | Bin 0 -> 109576 bytes .../app_python/docs/screenshots/health.png | Bin 0 -> 32589 bytes .../docs/screenshots/my-endpoints-curl.png | Bin 0 -> 26991 bytes .../docs/screenshots/terminal-output.png | Bin 0 -> 75665 bytes solution/app_python/requirements.txt | 13 + solution/app_python/tests/__init__.py | 0 solution/app_rust/.gitignore | 16 + solution/app_rust/Cargo.lock | 1959 +++++++++++++++++ solution/app_rust/Cargo.toml | 16 + solution/app_rust/README.md | 177 ++ solution/app_rust/docs/LAB01.md | 172 ++ solution/app_rust/docs/Rust.md | 36 + .../docs/screenshots/curl-output-health.png | Bin 0 -> 24575 bytes .../app_rust/docs/screenshots/curl-output.png | Bin 0 -> 102447 bytes solution/app_rust/src/config.rs | 21 + solution/app_rust/src/main.rs | 32 + solution/app_rust/src/routes.rs | 58 + solution/app_rust/src/system.rs | 43 + solution/app_rust/src/templates/error.html | 10 + 25 files changed, 3024 insertions(+), 1 deletion(-) create mode 100644 solution/app_python/.gitignore create mode 100644 solution/app_python/README.md create mode 100644 solution/app_python/__init__.py create mode 100644 solution/app_python/app.py create mode 100644 solution/app_python/docs/LAB01.md create mode 100644 solution/app_python/docs/screenshots/answer.png create mode 100644 solution/app_python/docs/screenshots/health.png create mode 100644 solution/app_python/docs/screenshots/my-endpoints-curl.png create mode 100644 solution/app_python/docs/screenshots/terminal-output.png create mode 100644 solution/app_python/requirements.txt create mode 100644 solution/app_python/tests/__init__.py create mode 100644 solution/app_rust/.gitignore create mode 100644 solution/app_rust/Cargo.lock create mode 100644 solution/app_rust/Cargo.toml create mode 100644 solution/app_rust/README.md create mode 100644 solution/app_rust/docs/LAB01.md create mode 100644 solution/app_rust/docs/Rust.md create mode 100644 solution/app_rust/docs/screenshots/curl-output-health.png create mode 100644 solution/app_rust/docs/screenshots/curl-output.png create mode 100644 solution/app_rust/src/config.rs create mode 100644 solution/app_rust/src/main.rs create mode 100644 solution/app_rust/src/routes.rs create mode 100644 solution/app_rust/src/system.rs create mode 100644 solution/app_rust/src/templates/error.html diff --git a/.gitignore b/.gitignore index 30d74d2584..32d412c6c6 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -test \ No newline at end of file +test +.idea \ No newline at end of file diff --git a/solution/app_python/.gitignore b/solution/app_python/.gitignore new file mode 100644 index 0000000000..1b78e926d6 --- /dev/null +++ b/solution/app_python/.gitignore @@ -0,0 +1,13 @@ +# Python +__pycache__/ +*.py[cod] +venv/ +.venv/ +*.log + +# IDE +.vscode/ +.idea/ + +# OS +.DS_Store \ No newline at end of file diff --git a/solution/app_python/README.md b/solution/app_python/README.md new file mode 100644 index 0000000000..f55d2314cf --- /dev/null +++ b/solution/app_python/README.md @@ -0,0 +1,181 @@ +# DevOps Info Service (Python / FastAPI) + +## Overview + +**DevOps Info Service** is an educational web service that present simple simple JSON-based HTTP API. + + +--- + +## Tech Stack + +- **Python:** v3.14 +- **Web Framework:** FastAPI v0.128.0 +- **ASGI Server:** Uvicorn v0.40.0 + +--- + +## Prerequisites + +- Python **3.11** or newer +- pip +- (recommended) `virtualenv` + +--- + +## Project Structure + +``` +app_python/ +├── __init__.py +├── app.py +├── requirements.txt +├── .gitignore +├── README.md +├── docs/ +│ ├── LAB01.md +│ └── screenshots/ +│ ├── 01-main-endpoint.png +│ ├── 02-health-check.png +│ └── 03-formatted-output.png +├── tests/ +│ └── __init__.py +``` + +--- + +## Installation + +1. Clone the repository and navigate to the project directory + ```bash + cd solution/app_python + ``` +2. Create and activate a virtual environment + ```bash + python -m venv .venv + source venv/bin/activate #.fish # Linux / macOS + # venv\Scripts\activate # Windows + ``` +3. Install dependencies + ```bash + pip install -r requirements.txt + ``` +--- + +## Running the Application + +### Run with default settings + +```bash +python app.py +``` + +Default configuration: + +* HOST: `0.0.0.0` +* PORT: `5000` + +### Run with environment variables + +```bash +PORT=8080 python app.py +HOST=127.0.0.1 PORT=3000 python app.py +DEBUG=true python app.py +``` + +--- + +## API Endpoints + +### `GET /` — Service Information + +Returns detailed information about the service, system, runtime, and incoming request. + +Example response: + +```json +{ + "service": { + "name": "devops-info-service", + "version": "1.0.0", + "description": "DevOps course info service", + "framework": "FastAPI" + }, + "system": { + "hostname": "my-host", + "platform": "Linux", + "platform_version": "6.8.0", + "architecture": "x86_64", + "cpu_count": 8, + "python_version": "3.11.6" + }, + "runtime": { + "uptime_seconds": 3600, + "uptime_human": "1 hours, 0 minutes", + "current_time": "2026-01-07 14:30:00", + "timezone": "" + }, + "request": { + "client_ip": "127.0.0.1", + "user_agent": "curl/7.81.0", + "method": "GET", + "path": "/" + }, + "endpoints": [ + { + "path": "/", + "method": "GET", + "description": "System and service info about the server" + }, + { + "path": "/health", + "method": "GET", + "description": "Service health chek" + } + ] +} +``` + +--- + +### `GET /health` — Health Check + +A lightweight endpoint for monitoring and orchestration systems. + +Example response: + +```json +{ + "status": "healthy", + "timestamp": "2026-01-07 14:32:10", + "uptime_seconds": 3720 +} +``` + +HTTP status: **200 OK** + +--- + +## Configuration + +The application is configurable via environment variables: + +| Variable | Default | Description | +| -------- | --------- | --------------------------- | +| `HOST` | `0.0.0.0` | Server bind address | +| `PORT` | `5000` | Server port | +| `DEBUG` | `false` | Enables debug-level logging | + +--- + +## Logging + +* INFO logs on application startup and shutdown +* DEBUG logs for incoming HTTP requests +* Log format: + +``` +timestamp - logger - level - message +``` + +Log level is controlled by the `DEBUG` environment variable. diff --git a/solution/app_python/__init__.py b/solution/app_python/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/solution/app_python/app.py b/solution/app_python/app.py new file mode 100644 index 0000000000..c4f8b1268d --- /dev/null +++ b/solution/app_python/app.py @@ -0,0 +1,110 @@ +import platform +import os +import logging +from contextlib import asynccontextmanager +from starlette.exceptions import HTTPException +from datetime import datetime + +from starlette.requests import Request +from starlette.responses import JSONResponse +from fastapi import FastAPI +from fastapi.responses import HTMLResponse +from uvicorn import run + +START_TIME = datetime.now() +HOST = os.getenv('HOST', '0.0.0.0') +PORT = int(os.getenv('PORT', 5000)) +DEBUG = os.getenv('DEBUG', 'False').lower() == 'true' +logging.basicConfig( + level=logging.DEBUG if DEBUG else logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger(__name__) + +@asynccontextmanager +async def lifespan(app: FastAPI): + logger.info("Starting up...") + yield + logger.info("Shutting down...") + + +app = FastAPI(lifespan=lifespan) + + +def get_uptime(): + delta = datetime.now() - START_TIME + seconds = int(delta.total_seconds()) + hours = seconds // 3600 + minutes = (seconds % 3600) // 60 + return { + 'seconds': seconds, + 'human': f"{hours} hours, {minutes} minutes" + } + +@app.exception_handler(HTTPException) +async def http_exception_handler(request: Request, exc: HTTPException)-> HTMLResponse: + """Default page for error display""" + logger.debug(f"Error occurs {exc.detail}. Answer with code {exc.status_code}") + return HTMLResponse( + content=f"
{exc.detail}
", + status_code=exc.status_code + ) + +@app.get("/", description="System and service info about the server") +async def root(request: Request) -> JSONResponse: + """System and service info about the server""" + logger.debug(f'Request: {request.method} {request.url.path}') + return JSONResponse(status_code=200, content={ + "service": { + "name": "devops-info-service", + "version": "1.0.0", + "description": "DevOps course info service", + "framework": "FastAPI" + }, + "system": { + "hostname": platform.node(), + "platform": platform.system(), + "platform_version": platform.release(), + "architecture": platform.machine(), + "cpu_count": os.cpu_count(), + "python_version": platform.python_version() + }, + "runtime": { + "uptime_seconds": get_uptime()["seconds"], + "uptime_human": get_uptime()["human"], + "current_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "timezone": datetime.now().strftime("%Z"), + }, + "request": { + "client_ip": request.client.host, + "user_agent": request.headers.get('user-agent'), + "method": request.method, + "path": request.url.path, + }, + "endpoints": [ + { + "path": route.path, + "method": method, + "description": route.endpoint.__doc__ or "" + } + for route in request.app.routes + for method in route.methods + ] + }) + + +@app.get("/health", description="Service health chek") +async def health(request: Request) -> JSONResponse: + """Service health-chek""" + logger.debug(f'Request: {request.method} {request.url.path}') + return JSONResponse(status_code=200, content={ + "status": "healthy", + "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "uptime_seconds": get_uptime()["seconds"], + }) + + +if __name__ == "__main__": + run(app, port=PORT, host=HOST) + + diff --git a/solution/app_python/docs/LAB01.md b/solution/app_python/docs/LAB01.md new file mode 100644 index 0000000000..ae33fdb9bb --- /dev/null +++ b/solution/app_python/docs/LAB01.md @@ -0,0 +1,165 @@ +# Lab 01 — DevOps Info Service Implementation +## 1. Framework Selection + +For this lab, I chose **FastAPI** as the web framework. + +**Reasons:** +- Async support for high performance +- Automatic OpenAPI documentation +- Modern syntax and type hints support +- Easy integration with Python 3.11+ + +**Comparison with alternatives:** + +| Framework | Pros | Cons | +|-----------|----------------------------------------------------------------------------------------|----------------------------------------------------------------| +| Flask | Lightweight, simple to learn | Synchronous by default, no auto docs | +| FastAPI | Async, auto-docs, type safety. Faster than alternatives. Easear security configuartion | Relatively new, not complete dependancy-injection solution | +| Django | Full-featured, ORM included | Synchronous by default. Overkill for simple API. Heavier setup | + +## 2. Best Practices Applied + +1. **Clean Code Organization** + - Functions are modular (`get_uptime()`, `root()`, `health()`) + - Proper imports grouped by standard library, third-party, local + - Docstrings added for clarity + - PEP 8 style followed + +2. **Logging** + ```python + logging.basicConfig( + level=logging.DEBUG if DEBUG else logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' + ) + logger.debug(f'Request: {request.method} {request.url.path}') + ``` + * Captures requests and application start/shutdown +3. **Error Handling** + ```python + @app.exception_handler(HTTPException) + async def http_exception_handler(request: Request, exc: HTTPException)-> HTMLResponse: + """Default page for error display""" + logger.debug(f"Error occurs {exc.detail}. Answer with code {exc.status_code}") + return HTMLResponse( + content=f"{exc.detail}
", + status_code=exc.status_code + ) + ``` + * FastAPI handles HTTPException natively; custom error handling can be added for 404/500 +4. **Configuration via Environment Variables** + ```python + HOST = os.getenv('HOST', '0.0.0.0') + PORT = int(os.getenv('PORT', 5000)) + DEBUG = os.getenv('DEBUG', 'False').lower() == 'true' + ``` + * Allows easy deployment customization + +## 3. API Documentation + +### GET `/` + +Returns full service and system info. + +**Example Response:** + +```json +{ + "service": { + "name": "devops-info-service", + "version": "1.0.0", + "description": "DevOps course info service", + "framework": "FastAPI" + }, + "system": { + "hostname": "my-laptop", + "platform": "Linux", + "platform_version": "6.12.67-1-lts", + "architecture": "x86_64", + "cpu_count": 12, + "python_version": "3.13.1" + }, + "runtime": { + "uptime_seconds": 3600, + "uptime_human": "1 hour, 0 minutes", + "current_time": "2026-01-07 14:30:00", + "timezone": "UTC" + }, + "request": { + "client_ip": "127.0.0.1", + "user_agent": "curl/7.81.0", + "method": "GET", + "path": "/" + }, + "endpoints": [ + {"path": "/", "method": "GET", "description": "Service information"}, + {"path": "/health", "method": "GET", "description": "Health check"} + ] +} +``` + +**Testing Commands:** + +```bash +curl http://127.0.0.1:5000/ +``` + +### GET `/health` + +Simple health check endpoint. + +**Example Response:** + +```json +{ + "status": "healthy", + "timestamp": "2026-01-07 14:30:00", + "uptime_seconds": 3600 +} +``` + +**Testing Command:** + +```bash +curl http://127.0.0.1:5000/health +``` + +## 4. Testing Evidence +### Screenshots +1. Root endpoint +  +  +2. Health-check +  +### Terminal output +``` +2026-01-28 23:10:54,675 - asyncio - DEBUG - Using selector: EpollSelector +INFO: Started server process [8144] +INFO: Waiting for application startup. +2026-01-28 23:10:54,701 - __main__ - INFO - Starting up... +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +2026-01-28 23:10:57,616 - __main__ - DEBUG - Request: GET / +INFO: 127.0.0.1:52856 - "GET / HTTP/1.1" 200 OK +2026-01-28 23:13:18,963 - __main__ - DEBUG - Request: GET /health +INFO: 127.0.0.1:33174 - "GET /health HTTP/1.1" 200 OK +``` + +## 5. Challenges & Solutions + +* **Challenge:** Correctly capturing client IP and user-agent in FastAPI + **Solution:** Used `request.client.host` and `request.headers.get('user-agent')` + +* **Challenge:** Uptime calculation with human-readable format + **Solution:** Created `get_uptime()` utility returning both seconds and formatted string + +* **Challenge:** Logging requests without blocking main process + **Solution:** Configured async logging and used `logger.debug()` inside endpoints + +## 6. GitHub Community + +* **Starred course and simple-container-com/api repositories** to support open-source visibility and bookmark useful tools. +* **Followed professor and TAs** to stay updated on course content and contributions. +* **Followed classmates** to facilitate collaboration and track peer progress. + +--- + diff --git a/solution/app_python/docs/screenshots/answer.png b/solution/app_python/docs/screenshots/answer.png new file mode 100644 index 0000000000000000000000000000000000000000..023123bb82d5e6e941b1f9495faaf3ea78467127 GIT binary patch literal 109576 zcmb@uWmFtnv@P5~fZ!x(&=B0+EkJ-k(BSUw?h+ul1a~L6ySuwL-bio@?(m9puDmhs z_uXIb2cv6LcUAA&d+oXAoNLh`ax&s5h18KLQD8Hwb%(@KI>g<~Dg#LT ziGm^!nA({t5s&dq!HI6su))E>){Xo7Vzb!($0{Ge-HFTsvsj9gfMJLeo9$;G@3q?G zYpdn=@7{IgkEO0Y5dUdM)5ano7zLsg0~@b@dV8b@KyP4x+nKrIZ4BU8-jiU1p_tRV zrzk;?tH+~j3Wpi=XDKOU!led-)q9l7{Z*u(p03TlZ(J_Vtu3tu+wRLzDeP8~Gx^e7 z?w3@`C36L?ZD-fK`)0(Jz`7Qhnbn$4`2l+uv_UykC!WyjBX<`Shf|DkvE>7@ z1O?Ws&B%L@OlPa*7+1b%JDZ5@Ir&_~KXJmjfhc!+L+=m36$52TCFiRRkjW|$c#!#A zsi>wV0ZCU^9IZxVV O>R*0iW825v6qbLS1RM05LrskQ5YEbTS5grZucW9 ze YG-+_%gX{K07 pMg2WG^{40S>iV*zK5MxbFED)PP^$;q1}hMVtQ xU);UeXE+O*04u(u}238(-9^wVK&r;4ceYDzrf>Gr91 xHzATUKT05MMcb)IpzV@5i(G>MJ)TETam%< zc0WW}$$KP~&XVlj0M51R5o^7i4ilKWF($hjbFP`^ ~8qgf NGmqo4Ul`YZKpA$D&cpG77^^8lxcc-Xn2-xyB!eB)5M! zb_yxc$=oSZkByG*8l5nyGM Rw{A5j1E$3*N3fWdxit0a@y?Vq6z2@&zj8^ zDJ&Z-!b0c`yIhc(p01lcZ^k&eH`SiDqFNs}krd0+fA$1nyhTLJc?A~#<;gDpWL6iV z*a8{Yb=6JgK-3ST(?%nO3I!bTv`RU4H9L8~f4>6|hEee4s15~DKUGRr)?_+vDBSHr zTHxLlI*~yO`Xd`zKmxtGE)y;YJf51oe_vt-V2fh0;*^2Lk3+V}*qgPWo( ocLYbO`vPRFlbEm5-qb9dx7Aw4q_FKP*LvWSb1tXnCd)ipX<7S36 z6E5z{i3fq8H$j>5NPYyq=~U|n3m^4eyQa14+=u&1z42BzPreNdP=?3Ohi0ck_uP_E zlZ yc&-yW8)K ze(+wd2^uHlwY&Yxwp4F629S)^0{!8E{utXoZ(UsWp&Q+O%f}lWi@s|%I}UmAkdu@D zWHp&^)uO;0 !&BbjZtcYY14ZEn_QA2f*gG`nf8Dkdut+ z5*&pj80g313Qj YW|V?P?NU z-@Lsp?$cXS JayNocg?Cz^&f? z_dqm{6nG-{+h%6@yX?9BMrYiR;^GsOzSM?+NPxLrsn+XrV~4?}u6p;_Vg7!8x{ppu z`Z{n;NTt<`i5le3QKoUW5{%QDkp6PTIhw>BD^Du^z3Dr7OiT=Da=$id)EJN5a_{*h zqwRs~SG=YvTMFO6p)2j-Sn*uR{!9y}LcVma!hlR^`;Kq!+!LEzutdYQ z=Jr%}L4(l8MGAjEKium}1<%W~H?QNZ=y(py9f)+(%4f9t9itU=dFcozaET6ba%dVZ z$m*A4x0-%aGB ?psmYWTW&W`Xu-k3S=w#x-sFl!MMX(cizo&hsZI9eeHPrYLtjp{ z+xB>MeLemj^Ygpgifd{{o?`XQ+1$wkWbb~>hxq2|cpwKBaz1)N3aHl6OioUn3jppI zEPOPjBkpNgrY_Qykl7hyHn4y47ISa*Ab9)P(2z{4#c>0m8*K?!I|IaErt^4} zLiIWtdW~A$dl=T0nePe;YR#5v<*O6QC9rMUnOm%}Q;w@Q=bIB8cfG$z2xPvl*Gvc& zI3F*yGHtqL5Iu*3jqYcZpXb4`6w-JX9rPM^+deNan#XIkW*D~V$;}&1e?l6({*Erz z1Ox=2fA}!e7lwm?f{-mGb&b`)*{ta+k?B3$D-pYLc(< qMjKsR>it61Pm13Pu`J@!(1r+S^G#A3D4-Oe(sp|SCMtPde#xg<0!h~MUKWAL$v zJN&izJ%HdB($)QV194&Gb=hv^@BWE|Q>0Tt)DTB24lv6fKYpmvVFUBC>c1i^EWBqA zP6v;@j4raywjOg7E0#+EpZP5re@?6I1MIc651f%x2K_P7(L(us!it7u^3l VbUExFC<4V^SKLl {sG|Jlx#S3xF`I 0Cv^+=OLk!DehM^h?CDZK7<9JN%&CSFao`IWg?$64S*+=vno zd^`R(Yoy-G%16$;fKRZ#xSI*T{-;R6lT8mA@MOA-YpQ_gl*v33$RC7Qo%g*XUAVoV zxIT8!GWYnC>7!cficrz|`2J=M0ye0~Z>T^2BX)QwePurP76D<%PR&lZ``!2N3T6vg zQ25mut8S!+gBVIm{3rg!#pi>$QFZ|B2?+YhY;vNxGk({7x(yvpaK-cL3h{cc1{N1T zUQA38bl?L<4k8w9r3qL@iUPx7cg!K`!^JDsx}49NjixcDYn?4OIo`3*Dwk%d*J*f# zE)oM2$L7&&ck|O#+ub4WLm0PWg>pp1p*Qrpt+1a*(~wH}-}90R7Uxl1ZJ%RyI&7re zfp(>joU}l6h({3`?3AiWJsLtoK|!gODIXX<$-C13r{lN766WW_RXt>Auk)mcK5C4i zUKTk!JL?%gv+wvtOw4|x`{#Q%6VozfAn+EDOdk_-sJ@7c$Hv9Q9rD|c8nXiTY+Ab+ z)=={SD7roXa4IueBZe&R(9wS#);?10Sxp1cU7U5GG09g(D(krl4+9Ooa6e)k$ah8t z !CEU2)tf+6zEHUg5AZE7 zj|H>jFrvj!@L4Q&Oq!nOr~}a3sb+=th2KW&0Ppt>oOTxRsGUEdJ+_)DWZxW+5ebfa z5PQlMj-U%azEA*n-OP_kN=n*d#uMEbO=jh0sKFKvex#`_dHlyhey06jt>ZJ|E5Pur zbl*l)E>j(UWZa$V&=JHGCE?>so1;}}e2MVhiV%*-1*p*IlYTwqqKT9tQWQczc(!;+ zt+2OJ6gyx~Ue~SyhIG7)J%goH`S<58i10Wp*Dr3un#-Qc>~h8Ew5pT%Tb!#r_t9#t z=ZXgt(joOUZ-FhA>g{#fv2iXWBoyxRV5Ll_F? $?5>2!AmF@Z$7j1(neC?niZ* z{_fyc)Oa0Y*V`-)H#R^%ef*g9)xg&efIsQ-bBs;FV$0;}|FFyo6{|jxX81&Q`hs>w zQwLIWwI+VIG|1Wv$Az4+P` JS-fPiqO%D~QE_hsJY zI;|<-4ZHzMauT-z52<*>=It4Vp}MCJnG)bKylOH+UT60g7Ey>Y7!d(M?|zngG>tuM zn^t)`+slJO_Azc;tJ(Hoc3)V>+k3hAV;t}tz}{c6y@Myl{i> DMwG^2e8|Kv1m5k$Q*@2 T)pn0-qQuB&o%kd7gAqolnXzn&X-N?J6WzhBKZ*W{K>#ZNB?|d ztwl|&kx^qZao#iin@p!^Gh?mPOd*BCs(UI|9O)7D!EJw~2pDPx83#v#dYyT-%c+33 zdIM_enDVDXk1K9}m6vWv!|BZ-(cg5H(Kh!rk^gDKtv+$(0NQ7|S?OCX9{m}wbEVTV zN9J-dlVXK7N`zR?tl13It^PQHWMU}ACq6%g0-4<=?}};jI>)vL>sKvOAd|Th^!wYY zOHYS-Jz!uemS{)tdt6srKe+?9Y5X6)*$8u+q9gV7(c;JsfYS^LO)LPTdetCQp_}Ds zorxE_I0rK#Cyk_$ c}#Ki`Bva4@ub1pIW7!0I+m=`}*v@HQ9q4n+_RvM(@)mf5`zLm??9c z1P_Nw71MZOfBr|}(w*N*y}{Y%`s9K5@4)ku@68pj!IC1}<)OHwIpXnhy-^pZ4iL>N zMi3(2K)?yg%6cvCoc$F+gIWV-l+AL%7glG2l8y~iNhz7z0FJ-e1wP9l2o;%NGShs{ z`nTk^ @BCY#OLXq(N^LRD-?tR@;Y z12O){2xI$TYDHAHF4JVK1O_(4?fetGf5E-q?v;k(L)Ilw`jQ5+dYrWzrdc35^oS z0CfU|p0mqX*}pT*PH*7hYxMgh+mm>4QpW;;dIrD<*vw~tMd17Fv 3i|_J %(sUM zg3b=Fk3nfXPAS?qmw!eoc5vKR+_;?%*c9?*43^@C9^KYKhw~LC8#$tyjlZ74r&{Mv zj~l?`<=$Q?4d&7S=VcYl>`PIiHG`BB(yEj}uUB-u>|Ak*!~BX#5uPAg1$03 V6z$tj;l!SJ6 zp4={|J(*thgZdf&!;|0>KTYn^)qQL^wR^m^1893Hhjo_dg)vY?OCPv**XR(fLz4tb ziGvLb3mU5DJvS#e@TdgqiyJ*4!0KQr@qUbkdb)pyp2WY-#z%+j`~CMfJI^t^o82H( zlT033O9b)AMjc|_gs+Z@akATzuTyw5c8`L;H(Nz25`-+4J0*8KuYrJqL|-cB#bLC> zrd+BnF@Q=4kaMk9`(f>7ZC8Lk4t!rG*A5NHtlE~HyIM0dvp9N%{- |l#egyZz2b|` zc y8{?2pWvOS44(WWC~qRs1`33zI7FW-EHOhKO^$4sG~$W1L^H`sl&AW*k9vT;^V zk1SRy)@Q?A&7@av&BG- i$S?=6axV#) zd;w&Iwv~+{T6u?)xaHwir=<6q0_x1?|7^)>wlM;r*nvj)>C>m~r}Wl&8%aqTm6%vJ zhtZ@@5lu|L^Yg167g-V*G?Z7eZ!M<_GFj}V$!_{E07-(MJGDoo@O#c2kWnW;&VYT1 z_xYr#eQn-G{@9;|N-Ow AYV2Bib zFF&~fEac0B#n|BBx6m*!O)u>pi%la=+;;$07s^#Z>!}sA0w6AHXn0*z2Lq3Yag+C- zy#T0_O$y=w2{f)rjwIy4{;GvaED&B?eA!w6528=uEU;XxK7zayJn#ZB^@)xSIbB9P zvE^hFkizi`_wHNNJ0%R7jbESKuU-xPSH*{n+^b*pD x&YYrAE6f6LS 1`4$Df~ks$Dl+juz`;@2?KefVy(Re@u8jP~~JX8m_cH z#^bP3o#=dil2?kKG8kZa+%E`zal)rfc>XNh9eucysiJ|Ekk0FJeny$eVl@5bd7&kU zJPf <$*R2fVuseP>JQxk|O8V=gr9QN8*cV$%b=)z`Hue@JIe!;&{TFKW z+8!Wt&KX>8EM{i=y#Tee;dPnJce1!ypw=PacMeakF=jrCMX+3|%y6>szSJI+B^7Uz zF*JMwNT&X^)fQ8LtW9+M@~V*sQvc6Ttc4m2$}k-7fyastXNZ26f>&D^BxeaezI@fA z7#{UG`LOpIjQm%vF>{p`p)u-g;$;c@UY8DaMD1btj zq9P`sqDSpy(<^qyjV>5Fm=41jgTsT@fkOM8fRz*LJQ!b=*&}CWKR7)658$2rbhpWQ zY;N{u)M^fRN~zLnFVzv14~~qa0F0@@6CdRTU?(x-MF3W7QKQJ28sNMD#gq~7ifJui zHvA8n15Ow#dEK~rr~WK~l0feZ3k%Cdn)7j#k@dJvquk^MXx)*A+vP;Fd 0v|VjnHdL$P0qbc;>`VEM*ukviw)Wrv%H8fvAf$cw$T!T<>TF?|)iAyklO~5zv_O zzqDbvNf%;92ygXAsJ7X|P9Trm=}Olu_7+ByF1FgiX!tCSdYpy>q~`%DB?6Db5D@>1 zK&)?n^LeE{usZ&lK*9iwOdfDjms8NH&5lnWpiF{8Lr0m%z)281))b&&fkek{b QXz{cvJ1b2NaWq)z z2KO~RK@Q@Y1pYuxsvQRId%dNaSjQb42ynmj`)i9HD;+ awUj85F$_MjDNmo1^d z9+Uvs*`CH51fbv_Jcm oXG0GY(6o@0yA*Sx9$F892;^32>iH)+aP zYGQH=UDV)xcwZxyyHUoRy9hK5oKS}2 GO+Y1`ha{HsEjh$0#HspSqmf+{U!H-tM1a zE3)z(%BdVyNgM_|L1>h}l9C1kWCeapAI?*S3U7&_aNC`eU35IBAmK1nTlOIW x1l)YDRX)H; zwdenLts0!K$#=ZH9)QLaht(|^#BX+1u|J10t$Jqe+w8XygPsMxJVp`%lB(+j;++e4 z#X!-$*FsGvjoYiA{}gB_;5wIGi}EvFE2Rb&wmExy1v%8>1xwgf<<|gg6z4S`FyxRB zw;KYW;u;edcjTR!mKF{;Yr0H;CntH%KGS(sS~e+sa R*IplEfK&stoT=VXA zKx{htMAx%3dHMM)E^CQ*p(B~w?&iBCvI>mI8T!}r<7@g1ScGFhOTca&7&3T6%51Ip z-{aS+ai+JJFL&y&0Z1uDZuFdB`I-7Wj=a45t7uXA{+(|vqDB8FBH$Ay7X<3~9JJ?A zl|QMx-Ov&u!r{A?<0h2JG`6?N6yW38i`FavVCkaE W z=8DhOVPM=0E=>tg;h*l;WINh#aK370BzVLZI5WJC^h)ikTOZ#+UG!tU2^ugaayqs+ zppx?4a7!}OJ(UiTv)by -4#m ziWQqqJk-k)Zr0p_j7Ab`j7H}1wb#aS3SW22DdJ|M+(#HJz!H6nfI0+_`2tctJ_7$P zIrK1^_f37JKzCFWVNXuqw}loLVi3?Ik>d=MESpy>+{|}Vm8_W?%ok(k%hZ{7${L`U zlE)lRX5YmwYLYR>_gYP-cCT;%o7rr>76GYUL-pf@2k^XjY}T)KVq>nn!TTuk^QDrC zom&}jOUqy22px-1X_HvoPDx_L=jUw&Rq&SZ555r_pz8(%#^QN#2J|HnK40EPYz0I6 zFm5icBtR^mujcdtT}GI;D8{sd@K){?w6e#ZHN*5f*z_qEfTD|wiumnmNeA?2iQ*|p ztWdO3k6LZDdp!JoIPJIqLws; V2ba^ryIy$=Voc@(b^v_|1QGoi9 zzC8A1i4!@?hDC-BGmqynB_L%i-x+UH?}XtnzIKcp=4!)yE||lXkRrEBz09v{Kmkb9 zX$JqDYd0mQ=9+cG?(Gp!L|zZ$cDOZo@$Q^^DB*EHWpv%S+eJV|Hk>;*x;zC(-Rbyv z8DKRc#PvR@1iys(@iDmaZ5Pa$BOoGvqM~{mI}|=-NCEV<41NXkn`~~m{O#<72Rv=S z*FC>Ah^lq~Go;B-w)i|mXp|_wq6P@4^vTXpNH5fTd9?eFqWO2dwxXsoz$}>e#ZQ%5+M9LP1&mLuMRvDkKJ8xUI|DLu{)Lc;;&!28Sdu@fVl*War4Iy zn1woz8>cg^X2+0*{s@y^hY0|+KS1!eDHJpxD$u)Ifaj&sYPnHFBY0#5heYvRqOZ0% z!DbncrJPLMyxdU&-EQ9iqD viBZh(bRA zEf%}oo7BcFs~c767Z?t}^Z*uifm6$M8n;8f+=0E4o#nsSxXgjTbQ88naJNg`AMQm9 zF*@xy)$WfZ8q1?rNa8ape&7Y_H3I=r0(r{ww>^LoI)6lBd@cS0MdPk%@~|Qe!ErCx zl{g6ufP9c&vsu|4cL=|QV9wfg83@m{TWQ=JUg2}@aL0Cbeg=pU4ufW^H&m#wqa)kU z&=C2~`;E=e#bp4&FUAgx!<)#gW7k%~kCDq~Hg_2{2c6VSzrK}G0t&~!gL7$!I1hQ= z3uBJjWq Y<)kXLfCDfG9K9>brn7a*npO?;pI z8G2jW!}m;#4T=}5nGF7E#if$>^uClD)Dn@m!Y(gO2_)aRZ^1))?U#L2xl5Cyb|+0R zc#v3bZe-ee_exi&>^udwccr9-@o~Q=RlV{T;kd8ul#26?Z29Zm;iCVveSSH29hN0l z_+VwojoAj} F!N=c*N`1i zIL(0bp81GHl@Rvt73KT>=_Z!fzjcn!oCz^+@GHi)=lX{_kw;DVPqTNu Yc{xo34E%V#Qaa+avYTagqq)M z=)sU^CA8d8)Ux22;s3gbMlpW$siX5*2a%cJ^=X4+26q30!hLf2|5yd3X)45}V3s|D zVoVpZ*C7pV0yfc$i4=Q^USl0p(c$j8RLA#~joUBGu62JGXsy9kymgmW=M_ZgWhc1h-S z!Z^yIvpPPVie=2r!PO^bks~IyWSJwV>LsLE+VGCQX}6@>zVxr5aOdM&7yUS^$IhD5 zee!@$AnmwQhS2?x_Q=K^&3igOcA9Cm%Oh_|Vfe_Vv;F$G@{Nd`+4c*a))VelLQaO1 z=o?RKy_yB=*EQl$Z_RnpFLah0*> Nqld_56GeM z9s5-4psp!ar$pmKnUjF0NOvGc=~Qh)$j6f&d^}W9fzF?LH@|C?mN@aN+2|cqM2lYW z)F@%l)g_5bci!IR7nF>Ec28-=Z#&`)PY18Hj4h!ByFJv*+I7N_fATY)JD{=$YnCCHrkGn3alx`U#{Cc5Faj z)tOL5ODMDCIsJI~Q%JQH%9Qs;z+^@}n&0Qgg^3k@?rmgZ%;pOwb`VM1?slnS+&Jjn z&t&n0xatyg9TR;z_Cb;_OLhZuhHY(1Ona+=;8^Ro;62Sn`gF-^2i{`BB4gPM*qxEh z2dr||3;(lrREX@^)tR!69nNIwJwo$EtV(^}XPEis5g`PZ@2-(T7GwyWuP(Wc_CAe3 zWkoSWag<_GW$_T6OjJ}qwyj>h{3v^~vW6PL>>CcF@wQHb8Eh^3`b_iYD4%yu@u5}< zP%5skHNWA@_wx(drU&vptUaweX5qq2!UY)!-k?FDH2aD{i3&}9m<;@4&|%AWdT%VB zjvAvPGo(Xm?wDk40T=4mkNf$)9ffNq_JR}bb@yWy>$g~SZ{OLxU)h&;G%D6F#e>JA z2O`wg`&>>j0vjY!2lvZqY1G~pzdjb;VRY*Nmuw^&V!tBXdG5m3uYsS7D+O$bPVWQs zYb46H{ybAQwF{-yOf7!G!Xciqe55ElaxOKNmq%h53*+{~Q(AV`2v&m@X!OZKe7!d9 zUVB^G4<7S4ODwOj9xd1xBS(!#KOT-5(~cj-%8DggKzW(5i(qQY*}SJZC@B|{=o#nG z*%-xgW7Vlx11nT^pN$gvXL!C(Al^Zp9%L#7buuA*g6Fq&t~Tvl3R3Ee`HL?R1{raY zQlaMIH?1w?{1s4?Y*zk4$T<)n^NMD+)CmESN|=&uOvDdO2AXOQ+{Nq|R<>k?H0J$S zbU`lfXPrNitOmwbS+MuhTp^fF$L95-1(XRa{JPRmRJ;#CIB(YnPN1Jb?Uo1p;$s zau`)$d^^SXnUrk8$@S0@0#>t%1J<4}i!>5-sdQp}#a6#AGT{(7(}~~cmCwLgY!VmN zOZhDchWm9lMG=FP#^~b+*na56x$6mp&UfC)5_fr@eQ95k#wURCWxcZhuRS$EEf|!Z z_wy8e`uM{qVmD&j2s26TXX?nf5w7nH4n}i|e!P5sP0qB6EfKZ!VS@`b^973~3669= zRs)J9 +~f)u5xuh zL{OC8jDQx#pL@1pw>%~DLEt1>QJ9ocpSwQ-Snl7Pj!dHBl6YHR^Xv $v@KH^dq(`SFuE0)3+p7`H$z|wU_+anNM`{{UVv#Hm1MRUzC ?lS81nQ~2?PP)$SvH^^_tW=|d%jI)_{a=j65X{q>M@200(4ZL=RNlzE$EfV{ z)R_&tqXgFD{)%davJbZlnNEZccVEW6_|O%`u(O^f1Onw>FWn!MZwjy@OD7*25W0R1 z0xG xnq&NHd@bel;8Ak)X?3w0`EiJ2j9|O)bb$(Ay^2Ki6o2e2<&0e% zP2(F@!DXO;9gOcXv&JEWj}5~^3X+r~Yu-Cwr`yRuZu_9+=!V&L=;jHWp~_!}POiht z$`NZkC 0J@I<0rgVDOa0#o(VQtv+8nAP48qJ)s>&rY%+V{_^UQa z#~Rs3QEP%!&TzL_4xq+LV=71XcPnh$#*^>m3#C~+0M3A*Q?I)1?&!uZ$)wmdbUR!_ z!_!MvX0QxEP*=P;5mZ5>+n <~P4Kg$p!8_nSvlrb~3naYxp^(0|O5cS$o#lz=o1 zE6wYE%JQbHm9OH88IP&*kiOO$J62Y)bmldmw@BkYT`!L+_igIZGCX?tusq~109L7j zi7e$*hPC8I^So|$E_Jdrm9>z2W=BC$Rado(bIEGT>S`SFjmcg|manR>)n8e6_fgu> zO2&1@oz$H4g)5CH^2OP!;x}pk zk7HEcJ;lq8{V59bwt=`l<$=hyW zZSUw1=ixZmI3|zBG7@t`VZ_ZS1Iyek>yEi-xK?IrX(PD(r+w>^u{>bmQw&i8rQz79 z7Y}D%qtSpCSExfFF_*s0N(G2(#Qw2VIc`hc29vh>ES_pKE)uPbZo7TVrON57sjNL@ zTz!j}+FO21g^yD`#yMeBL0i+*Y}voxTHk!cp%4f?NjL~_#1Gsav;jV-U%ZGcsx%ef zhGjBr1Yp +Gl5-xiJPpI$O(xNDGQ>W7g7P>vtL&AHs zBvfX gtNk{7;8Yrw2o3q-LhNd~wB|o-eQA&lstdsy(Mo<3g(zl6qk2-ClcH2h z$wozuXeL{*p{d(nJN;HHp7vBnD0NRV@Tg&NXfIh}FBqLog^##aiEzQZk;bAzZ{RYP zMEt#O(@ZGd`j^x!QHhyf9DFFd4aQQm;i~wHwqiWCaW1~f {x|H?m&MFVuq*p%` zkKze{Fs)qGBhMA5&|`$lB{Qp>tB$_^o oeMXFoB*yhdu?_!Tjr^;!iTp$*f z>%9C+vr-M3DLw|&oI;|^$3ET{O}q_0lsdm5&It?ebEf$L 0s|1RGdcI#4Pm^ea1h zI8mA59nBptm@mC0ejgZ9> duh+YTP}~iE z{41qtr!ph029vLMMaHOha*{Iss?~3PbCQcS Z=~HvcyTi-$TBJ!ey_z}N?r4{bFV# LmnV&A>JWD4K*CCz3+MPLesBh{3QVoZqMF zOeE8W?B Vu=tu<)z8f%m}%f z)0F>MVj}Lqylcj45`fWDe W41T%j@lP{zzQ!7d(lGHozY)I&WC??jS`&4gXozxJKk9_qnl z#;pEAx%iOd*f$ghdpF~86QaOY?6h3UVFQn}R^z4uHdSHG ?VPKb9r81mo64BZ;w^QcOjuj`@Yz8f zNiA$TZ7vH^A sZAYm9B4IR%T6Rcq z&dQk8wL0P9KM9ws(H{=&>2U^xd(QewEkZmeA{cpCx#syu8B?l( p$kZROPkNakY z=a|A=BdTqnIm*XF%-rqude4ZTH17}C3uYZ@ir-n*S)N4I205BWH6P?Why=wT%)4{c zny_)@65wv4oK%CaR0|~|Ed;UHZ)RL1i-rFlcByKpRnFDNx-}fyzf2}-7UaYkqUiZ| z+b2j|w1v9SgYlKb$FJp~q@BrOc2byq492y`*-b2^k;17GyX;C}My#Bt1M>~EO`Wfv zUCnk6HzyR|5)uCKwpqv-m>v&xt3t3az`wT=aNLHX%5vRP`tGF5xcg=G#TibFL$}o(25~Vp`PGP+@ogHiFRtCGK{UImb_$siwJ>oW# RHH_7Xg-Rce&xCa9Ae6#)q#AqLu&y;HPDPGg{vOo_?$Vk-KTkWNB_4ciy %}F=cHmz^2QOl%n^0e(>EXUmTjdP*ePod zXX4yE_;>Epy)wjY3&ca*9LNFbGU{^VHbpe2YoRa7UR)@KWs!Td_I8zoK9UK`qNh|r zz=)7cR &B@Q{lo#-hWwhd|?B3oHoYv_;uV7Ehn@UKFB!M_`!* zTeK&jVqe00KD3Z*$16?~%etImjZ@8eVP!HNABDu^3Hiv0_xn25CSo~?R~vlq(R6Y# zPM>dG!Y)=5b&(3o+2oNf@~uhpuPvCiHBNV*I|X3ZMu@$n5HJ4n$A`T3w1>vp)-QtG z=`1!CA{e+kPa{B7*k8Sr2hnWr-tE!Okv47_tXIZXpM3+S>!zrbT#r*lS(?1DhcwBe zLAY-D>vDB)IKPD#+DD|83#$L@1vsoFN%6B#zvu>i7t8;}#`vL}3iqYJMQ6XDsg%T2 z60|Ry7k!VMRhXolJgF7?We;tyD|@}raG;X3#pH{FgveyvN8njWubSB6q<;ExLvdTP zX7T214ST4_^`uit;Q0-hL~!yH_S}a3_#<1MrHZMT8>-g=^~7=N-%*BQl_!wuHQ4}U z^ToM2D@;3^MjxxX&aVed@Di-CpY8fST!z@RN$%K;0-x*Ou3*S5&dRfRn{q^R_>I@Y zU_t-m@tLEP;2%EnL_P{Elf@%DS&11fgNacj>7));3@+wLCxvmL{VaK=au(fNc8jb# zXpEwsnXf6a;pQq+8FTO1NG5la y s3n3(ciDCCWseiBmU8ncBV zVq3BX`sItGDzW$&4*nrc3{Be7Y@FrHBn ;C-qDj-SX*7`bb;D-phD7muU zd*OJ|v2gj5PuWPG(&s-1vYz1yuC1xP6AmU!d83%4klMc=48+l|V=(3SpXi%2k}1Tm zt`EumSLlC!5+GP0#`m8ekjRN5%UVLLYRivJcAysfRMS@T3HV^JknSX$qEq6E tL&iLlzLEM60R9_quVq7Rv*Jl2vO=?+=LC0i-^ZuE^9e2-HC(iiG~gBnsT zhkd(okl4m7vTfB*Gg@3IUD;mpe)dDyr#wZz1$|g~h^b%Zd)43mqgh_V6Qx8@%9x<| z;=W>hn6CBP?^cZu52{WEw#w~OHoF9c=fxj2DPT4Hv%8Pa-$)CI#kQ~n$(WA9i8AHw zf|1Oj?IA<&I(TI+VewsJ#Gk7Pc3fDJXd7B}ZDnVi<4u5X(PzS|g^G9nwjNZ5J?!)u zey?+Ys0n{ct3Xb*{;kiJIcU_8{>&?~SL*`xH=4GHs6JW#Xg>iDUWXas&pw|LK0Kmy zCPG%$wCU7|1RQD9!H!ERp>O;k FC+7I8+QC 3Lel+*|oQy4_`@SB$3a>6LN@^JByPh~E8# z8AY`r M9bx=ds6`^O20aywy%X%e(%hk^R`WLr9Y4+gN|%e~3NfRs zeh!?eI_UrIayDjK5YS=`JO8)JFj62Br9m^a<{afc{5VNH_)?N6Jql9xMsYZj<#IE% zN<3Vog*=Xs+-r7mc7iuC>leAhO5ZJt1yf0ozg|}9+vq6_Q}^`(tppd05^H27N-b>d zn;uTPHJ>^YtPj5DN{yN!IB+zn2~t&SwN*OH&DMP%v2+c2uW|9YMStCc>(uK%S>d>0 z1ECEE@I^WH6+5gwrb1KiTZ(X47wGjeHyoQS@!p&NL)Tk|#nEkBqqs{5?n%(#uEBx@ z2yOv_2bYFm!7aGEOCY$r(*$>ScXw_47J2tRXMg9}_isPdC9Bq&bIdWuTqRijTA}M& z5KY@W=W ViLImE)OsGHn|0jxUK_j zIYz)y5AF9svdMjs6J>9CA8{&CJrKR3ddrXRCPwAF8$&=;6)R&L&wD$&Z70>uDG*|H z;H{GdcG?PkoiAz}bfXVz7#41dY+&;>NA^u(EJdD`5z$oU$%}(Lci(ebnf&h)J6{#i zEqF}0xXm|C2g^LknQs%$QgmZ&5(R}O2_IOXj;8ynHnBrFE)fjw>#t>1dh0rS#*Fhb z`wJy7y{kBhA{c{P_Af`Z?Ijdy*SJMk_K%=ta7J*tV)K%&`^8ja9j{wt{W-BNC#3zN zmGr6FKfHis!>u{>%?yFHCj@W$R9m5fvau#-;QZqk|Lp+KzQ)!gs-5aAd>)jA_{@@R zOU`H6$mz8oc^;qnBmds@-9jcXRmbn{CVm^Ii&(Df!!;l%Aaqg5!)At^4sciYsL(p4 z#KjBfA_sHLaUc|2KG7FHo)xU6^tTl+1wobru$B(=*3UThG<0* 3EsE*eVNRa;BP zx4f4`ct5c$6n+`A9<5_KQRlxlwV3)A*~(NiG=cIGZ2B+=6|DBJLx459qNIC#jH;Dt z6AZ;6^g}cNdP6|JGa5(diMS!}1g50I|D?TK21L_(qPT>h(zxi7lht=>!tg*?eZ9hG z)?fLDWo(Phnmxs3VZO_^Fmv=QoKc1kq5n1ks)E_ c|sO89?t3P9?9JQS;l@o58s(bvUJ27gE(RYaXO}PhwO=U%XKcBVJe_3 z&7%q5Rq4L9JM 68_6l{+P5)`YcS!ADW1{c?v|8ZN+?Wj!B8GO9rNQOQRoJ0nPZkUgu(qdQ56XU^S< zT8T_|z&HyE_$814%=Y)qcR%WO1{s?pdh^eIM+j!vH_#7j+`1SkIPae_J0x1N3*P4U zI}T*mjXoqe|2D~xyku9;T6#SP@1*eKG3n`jxe~3Bm*Ue5W^;>nrTPwE^A5?nUJEGd z*0Iq|dlY$85&g)YEr~pZ(poOMi6f$x(^PzYnde%I6t=KLZUNn5vy^tATl;Ez8b=#o zNq5!ve`3pz$t1MYbfrlSrE1LSoL){W(8)h`RI^Noo>rl+-W=O<8A-B6tHPDc^?y(j zkS}J5o`SnI9)0A;DhTdW%vB{M0hjFNBTyU`E__garGiM{44e8SyAYSm{Nx4M%>Ht} z(E!It?2_>1<$@;smZ++AZkXT#C&PTMF>AA;i7baLsn)05G?*68_|g-Vf{+SXqR{SP zt--tKTKef;?KAGucs(EwcV?dUq33tfXl|U8O1QRIPQNI!2!U`a1_9M(yl?)duvz_# zfA%3FV4%$WtJv;RApf()6Oh#lJ#ydKvi0bGcFUl+e_Z^Zgg$YygJ%$e6B}-SDtUE+ z^M;?!Q^kwDiW1E0_bP?38jQEk)DSms=ZPRZWTwu37~I77xo}SBE)li;ajdg;a2; )CtYz5SvYPRSkkcw_0oM!hE+-B@?2t_+^DgpfPiSL(>!?FqXQ*@hYL9pO zQi1Z>BKNTw8UirIv`}=aA*$R6K8(+=*(XGSRF#Ql*EBdWnSSw9WC 6tmdN2qK)o6I&AKdxrb5a P&7po1%xbB&+*+84-b90JNav=;mkuYYUQUG{M+N=w2F8#lSlK(?x7;!Wnb~=H zJ;+47uAVgfZT{(yzbG1!LR<1I46Lq0lQ+@@`WmoO83hrPT;(jyzRJ0!Es-Moz&%)} zucv}Z!?|$*^@CVl8Ay(^5W+8_j)kcMpsx%1YbHi>oz$d3oc1OUxmP$kS_(;P?h_8a z)6@po7=IS({o94e3nq;cuA1MUAdZNOuWx4DZy4Y6ZN-Ce-2CX|@pI;Brt}z5K|=Qq zDcxGhwluC{czz{@Px(+g!iZUV&lBw~G#{pu_6_RwTBfIiw<9jj0uaUU=6J9L-pPxX zFQd;i1__a5U!jV>?nE|+O*O-a@)V;bRfW;T(t0JrS>w*z81tc7K!Al~+7<75J-u%F zmcl*Nmn6{pD&B92DS}}2v)!o^2Fo t&Pi7CV#; z#&?!|be}Ys<_f`Se!M78`{JTZ>Nbysb`PTqzDr3+{k^N6*`d1Spz5}9kG-+Qz(Lpr zk~ybDwm19GA5)c1Jh5ND8(Yd2gUFs{Yl&ywc;;D^5qKs@f%8dJiEJhzNz|64^EYL9 zp9;>}n@iR_u3&vUR6qa;Z#AttZymj!2i+URC%Fq2B$;@fM16p$G~eOIxzi 5#r;Dcpf&aBQ9KlJ9=JOe%-q=(pbFAf@B`>ZJ{_g(7`E^}S zkRb6}0<2NKCb6p=D_yseJX{tbjt)JB62-1sW=d6sNIEA@3{2WojkblJ4oGij#_IUP z+-ubYBL#8sv&7e3%s7Dzfmv?7o;7j18;a{UJ&lZ|bxraEm|B6&=Gn<;-xIci1n{Ul z B|w4`(bFk;fN3b+3vq@;( zT0fn4ZyH0-#b4$$FH>Tg`1_i(l&fjtL^#@9JM}$)?dxt-S;jFBC`eb2kFf3&yy$L* zNS009-Z6{Y+&Iyus{Fp|=P2ykJ@-IpQ;b{H 8?` zNY`MV 0+M>6Z} z-=aHt(0uSXXBfn4@-f3&xMw+J#qJe!pqcA=CU))Q*=KrWETDJ_>lS)=g`@?pj98KY zCe%wt+#j6?3{R0hJHr3sbkqlhcE7!(#SoK3)P8pW7E>5hbbb2p`kqW`Amh1;aY^-N zt=PpkSLiEjtS@QiUiyJTt}Jl7<5eREHp7tEIRIOaeR!5QM?In8GNTri1N(1YD$|AV z5eK0ilnS9A;p8_#)L!3{%3fr6gkwA~9T2vy)F(gK-3U{L->;49xceu8a#&{wP4U^( zjTM$0Zu84KYJW%v%|3kDk{SPEp} 2eM!YR5`*1W0&Ch90I_8$_UJnf3H^hdndm zbtlSpH^SsxElrynhoEMHKWXc)-8m#4T2C9J{IDLd1P-1UhTp$_1S9o5OZ%JQFKo6( z(Rk>RfSfR$d}N0Frt(vLkT{knLz}>on>pz8llyEV%Vhd8 za#y#iYp;bdMJ~dIco6Hw@EqN> Cmt^F z?4_Mtb;UCRU%S5xt_uio)$Xa`cvOTQR!P_oDP-mP`NwTQzA6^ODe#eZdg~GGl{=gC zH~o52Fn6~jdEJ|zvvj^(ndkfJs 8o8shr51G@%f==J2SF9`{%c>Xj` zn;W6Zg@AU{o4mD*bGe(d^O`4e-VW5ZP>$j> n>bP93U<~0(aBW$0ir|CMYbc6GS z^{455l20!xfhB5^Fp3q{(B0-TvTxhAfq4-mh+WWJt6N*ZTh!Rh+%{|K{|CnlcACgn z?>FY<;luWR?YRc%%kKFFzV_A}IawwOij(=m`f6cjzr)-OB4+566?A1ocV;Z|fvs|8 zEI1R_^3(F N z>T!A~Z!V7P1I`^Cg cA4AqjjsMt zg#3~7ve|PER_w~b#*d)y&T&i`uFA_pj)olby6OoxMSu9^M736rNHULV1>0wRYOU*f zKc liSZO& z^`d0~!v!Yy!?D^2`y>;Y>}-Afed_HdJY!~`g;LrUhnvV+qyb%LSQeLQhKY 5>i) qzjqBQn>M&_kNHRhL{(E6uFZ6rk!;S=5(V3c$gznuHDKoH}J kh^Wf6MM!J7a%&OCsoY4x-=MpDSS7| z)FcwuowWAKm4PUJ;207{-036Tsv`A^;^>JsaD0QNrLn)NpO}F6({kfu9=4hM7B1gB zQ*VS>@6BN=dGEQSgRVnCKGM^cnnP|Qfrj5z?bOjD!%xV!*|qruht&-LzkZ7-pfqs{ zp9~!dV3alb@6~dcTCn~~bISaMr r^v kRy*r=53_s`sa}V>p98^TFH-AF%peW;)BJc@Sfpk{!>@o>bYFf0R{C)C2*v z!OxA%Ll)h*8TW5sBW1q!g4jBaqMt4H{0RxAC-mB+@dC6?7S@HRq%&XWWn=xvO=L3P z%+Aqx+NNhx7Z)8L@1(zQixN8bloFMV>U%$5Eewaxe1zwCb|w=YZVWHvO;|7WNEsg& z@5~!S$gFl_WsG>BPNlS4*Eb!Z0-t)IlnG*JPS~%=_YU47)a-o4{J9aGyfe} zDi^Vg#%@tuUoQ(*Q`h|+iQ!b(Zeq}H4560u`C>91=QQ_qPbeF;W@-DG_hL>d!A#p` zE~i56Y6X??0Ujb#i}X^mLb$P6S6e-_txp^U9pFj*$|0bjpCA9=f;!}xBniYHF(Esu zdB!Mh8$`dEj6G5Gx@?u%A@kVhD{L##i6dEBUHwuHsYgoHq}Dec@}Y}4&dJB760Ssc zX;S+_F{I;?coMxCE7FI*!b>F2gt~f l&z9h)yJNPwgy zG$!a7l)7l-Omt!{W}#4mP@sELTtjiKhvP|;0aQbZn!lzAe{cJlg(3J(%D&ee8Hu@n zKF`m3XDgY-*3EFOfCeho?W<~;q&^EscR+TCGszx% _Acb9=j6wP(uJy#hH8Wu+_Yk8hE-~ZYpz|awrkRycuHV_3o*;Oa0_z=fEMoG_s>g9OTe(Dd2k5IzBxv86?`
Rus_Oee z6;8d?9U^`>PACFu hu6A(p)x-4m5JJ;UkP< S 3l*NHf1n>?o^SVk(Al?b_1ox%yT% z7k*$h8P5OgJGwl*JTg5x_JSd+p9}?MF`tSv*yw-mg809o;{Me3Y%~(xL4=TbOl-sU zcXaYuM(uxI1=+H=WW*sdJs&8$J$^jsk8ykSFwZO3PTy36#|;mf@2|GhZ+p(I*eDEP z P~58B`q08QEQZ)fLyUK zpNjmp)|-?obAGJ)!*^^CyT|L{?!4rN;WtmN8a@(-U;d9oWG@0!XhjL${d1J&Cof=_ zJ*M9e{nimq gYXZjFgf zo|f@$Zhn{6`iEO2KU2t@$HPgeMLim)Uq&b=9-sj#(i~`;TL#;mX*@eevk`j|J~o^I z3v4nVzr{Q8Ra2h%l_!t%<(cW$;{%oR;!^u A&hoSA4Si28>24~ z;vPNNJ|FL!TNJ$c+6w!R>eMO1mo?S_t0c5vznnBSDip$mSOe|X&@~KOSimIh=dF70 zMVCJ{3;H6K5h4s1EE#LsN-a6HMW`YY)lB6rXa0SqKkA_ju3HnkW^A{%86fw>)PcGv zXX!OWA2sAV=_qvL(%|}Z`G}W(^!@!wANX{q|6ZapxpQ+wN%M?IZ3yXb4BJLXb6)>_ zeD7?Kn3E8c(L4|RN@l$!78H=|UUSSCMkIMP-3j=7g{^48q<9{8d+@ixNbJpT2@Ds4 z`wY92mO$I`j3SX6-uauN7Ys2`;gB;pw?vV7#sse!MkA(u1~S?ims=oEZI21$dF!t? zKcfuybGxSQTo )D>IX z;3B&^T}MpIJ~3&&n49iklWK*8%CKnKGjH9q~P5$Qx2QW%CvbeGk*?=D%Y|^B*h+ zCU~xRUQz5O6%Rqht7V{-av%f~fB6Rng{rLaFjalgayt<(hLNUTBEbcS638zvk37|v zfQ?gWnkNj1CYyN6k^>LAQR&WjiCiM@<@Zn7ZPge6C;$_+lvgR}8Ls?qFTmOi{!diu zj625WFpD-PDRNr`#)uV(wVJ%%!G@pX=Us`M6uqgZ4%HZ@?zf7Ca;>T8&kk5;tgh;K zOlq3GW@G24vYY8mh}ngu10S3+(ac* z)%DBQ{r*VEC!E{lHf@5FY3^=lA<2hZyz4ie?arB5$?*qTEb2*LPQLuu5J1VpDQJ8r z8aY<)>KutIjAfl5P9Bn}0O^3WmlZxNp!I8@Y8GgggXPb`ombbp)+@acj8z9H=)4zQ z=7s68Cm`Sua>MTS;fF4lJd&CUN>B}#`J4_PV* ^^3f$n9HhnB-qOBNV(xVwITB2v9q|>V1M&{Qlau_zfn{!T@4x?+W(5 z9K&BNc8Njf_9V4$i)1gOaNnHU#256sCMj-IOa!#w8Fw#$_5=n7`gFSNTkoFGJJYW+ zk7dll_e?eTi=XaxFZvkWGL_ xPBwJ{3PU$t~iFiFqld+dF3leAlB^VPTuyn*QRIy zMNXC_rJX7UufM9qx9E-ZMTT))hOxQj!=gpyZ_un8mIf#*;5Hqe%CBXzJ!R7oDc`5M zn|#j~J||oH)!1y=&7s;!<-ew=mGIV7S)t{7 S@f_<$V0W0dQL`(0JRNA$0ilugBT8y PhVTH* z=B=kVnMIOc!#w4ARv6v2Wm`1=SeFNTvqK3tW2z|0`c3r_Gnw*l08f7J5ZT+am=Ms( zC@VUD(dg0$tD#j*s&@b^Fxth!GS>AFk54>pwWNdY
-%fx5ymxd2@sojybmrR zjfIOPrc r*WT>F~()dliDN7*1_zT;Mv;9-?^dB{oiuv$Kg*Q7)qDndJ`OY8U{X|IXT~ z4tN!JeRNXsZ!>)Wk40W7|AYx;tV#-Krj4@1Jn*B* 9wh{PQX+lVka 0 z>Q@DLzdG01;M^D@6BjLuOmLoj$C2zB4~=l1NDoJ0O-YUn=X;j6w8Phv2ymk9cmjZo zdDbejxko#8E_A?1>}1eHT|P{(W{=iL{Xt!!q+>>au$&2aKKnK0sgGMG#AeQiYHX4j z@<$ra-oU8FF1rT-y2mxG`$fx);zbU*lDqjV=}zgrSGQ{^Y>Dkm*+=p9`YZYl_bUJ^ z yX;lg z)z)9+C$ZBnpr(7cXl lQIP8C`r#3y<%6WCSIpy#T<{MWpgD@Nmot+r{T^Pwg3$+?=k zE`nS}ow~N#<5{KFj}Dx6jj$4rd4)3?z%rnTbxZl%>G@wkq?GXA=F%}qSUd&73Y_a< zS3OELSckud2a4#orJskm8NU`CetOS$+9&YnS}DIMsF3hi` eN|GTMg?3uU?!!DI`sLp)$+xu)&?n~;I#F#ml!^Zw zI1L;KaFB_r4tmxNti^y3L+E@IL(sSHJskYv((3dgsQ2nGX9)=H97Gc*q?TZ4xMl5c z0{{%zmQkeDtgZ6Jq=m#9iC~GQYB>T+@cmjIn%4c4NTk*IB4p+`v@)BAyqQa3?&V}Z z32cDjb-p5xa$k3R$gRPN|IpH9co@|Lqu=&-_$#uB>b=Z60>0rdj%~5#+~6sDb|n1> zBga(Xdb!G5ghem;l+n1%$T*G3ml3GwAU@6eXJbggz5kG+5#Hj;>P0M~Q)txu%SA>O z>17@%^;sYsYvmr*VWmC|Fg(>cIli2A3>KD1VM_Zuea+4jnpg5fsqrkX(=P_sH_RGQ zFRp^e@Vyy3>T4l?Ah?KImhFj2M3?|aMDbl#d$dSw&z1qsftNzv>~`Hl;BOl(Lbn%! zit!avXrVq-z6v9NqmX>Oo4<+g2eJc_=@gizW&`k)Db%9-6I%C-Ke`|rN!kj!qFH zo)S-A9yGi>8Y>He{XE=Je47)rLMbetFrr8OM0wze9nW>S&3AdHqwgr753t_y>utQN zuGLQ$WBm>5*q9x~L=wlh0qrwdpNhOT|JZdL5F$ui*#Po5rdORUXO~e3RAA_Q$Sy>* zjl*WyIcWU83@S3wg#iea*NMnL)S&3)d tC0@3M(~pUWm*R*1np;jCA`)1Qm}1*+;3_3J6OJ;Y8L((pQKc&Pu? z?Sgk_r2vD8?B3%H@R*s0v{SnEM4%%?0Pe~U?LC7+%!p6!1Oc{7rBr_=tcwZE)ck}7 z+%jO1O5axo`_ ltsE328#JWGfsk~R=dboo* zmENkXM$LZ+hgLP8P6#@2#R0rsvo;4gEu~d$W?j2GYRoUo3#}OX-!M~*^B 4 z;)>9fgKAcP!4E}AJ86L7#|s>-i7|@#u-1eI@`_zMN(ITR?c6?uu|sQakW+m`O)# zD=#|k(6~a7^{hvrMRXFr+eNieYw7b(0b}s#^(M_k37%V?KLdMq0B9=OecuVKX`Si& z$dmVOI$~6^2OU(G5p(%d_r)o<+s|w5>6IU3B6jWpYjx*!?V~+7DkM4&Jjm;{o_z zpK^S*!}0C?CaIRGeM1b-|^oPk&P=jMv z29TNEg2Pe6DxYZ%6jCs+59dj3T-nm~%b;@ M3dje3wkm* zowuH#=2(7&1^fbD8r;d7A~ed64IuVQpiF3I*m`CqFEWO!IAaey<_udO7mqVCZ ayZtkyPD|(S(sf-hViYn; z1cX@Go2SIgL{SYcRT^D6gZ;BF4%uhZWxvZItZY4BKi$ou{wX(g-x?#!gBM0jf&b#I z3{~=;(bF#%(SuKKi+z2sL@V27VwR!gUP$?Gq+(g1${d$wJxp=hDAAP~*Z_<3iv!+F z(=euLs8`js3T_t~>-S{hk)W*V!!F>gr$p1Q2-$-MQ)T|puen`fbj@VsRvRFnNl605 z1?&-?6zP=_PVg0&r%Ja!KHZ%R$P&3% +9@t_0V{JU+!LihFF`Gr98 z@jWt7B+uKGn(X> (Hlrp@Z; z-{=6SVGX$LtAdr>?GPcaH<@Rio|B#>AGfT gBrR zlZTqh^GE>@8SLm~+f{Yz<;>G?I&g)zcXN(==S8E9qD4xs{VYMU>3((AUE6 Tw8=B-DTD)oydxCDL(0E@od|HP-s7 a06VZv#{?csgOM`4R# zkRT#Ru&%}KuSu8;aMh|tf~f0GTaVJv|K?6>t2*a@JV}D@|06a0%_A?~W7f ^QnggFewEdai;a|p1rJRrGWHl<{hR%#^{!Jn8Hs!YJj`wDB(hF*wY|tQM?4w z;UYw%t~-8xr>RRj%2AecK0 ;+ZUE77$#Gx z21pfekie (ljwwV&tO-9_ilW;O+e6Cer}cvkcn76$^wr z >AOt;Pi0mI*NW=(LJ9Gi&X{L%Mpd|Cr`R9?Z~^D(_LC8~($XL%ypyPr z9q@djlrakP`>~|`Uk8wa@cC+kzDq}2KAD_(_YO2*GR_5 {t z&r+rpzdY2{!p95HFjT7Rd?0*t$~T#y%^eS!G} zt+qv=-F=K^e%TJgmZcKqfU{|!8cIZSW6)+)l%r4zOZ!`PvJ0NQL%hj`A@;^b`C=Md zCZK@`b@$Bby>h264hXLHM-s~jHkhp2$}2igF4J0?wln$rqW>8FhdVl4n?+&>$$aFV ziU8$*tR&)divBuo?0}QkwC-nR_U{P3lso60*Ep4v|0T!%D}4@w{xf~{k~pz?bPx^h zujvtxmJ!P+IrUiqZmAd7iXvy|Wt2(9TK7e{#E}%hO~o#I`t|N2cT#_rGz+VlIEI^( zkfztk{{OM(K +Tl`xWDut#N7X wX89OGcx)p*N^Tubtf3w_pStU;2vd!dRjY;LXtYfys+ zuMirFzOM%S3E=-jaZ~d_b)^($myJ {FH-Lw4?r*?g@_W(v2+j zdC&lk{KEt*;O*wjQ5BZ 7(nv-4OJtbfZ(#qY6@HE z&tD2d>S6aUvWfqYdxLOV`x(AkIrDg3OX|>xW61N4_w0QYU?R_UehS;fUzWEV|LmXY zf!?>57wNu#(|MCFV!QW|==cExDyXlDMe;Cs8X90%2)*>xmjbHx(UYHS&=oL_`$NV2 z9cD6W=NwAr$LcNOCx9r)a{`tI3Uk2JBw-L^vc_G4*j{tXRt5IaQ0?(wDEqb<@#J4K z!84e=2FUjMFC4eajyQmt6>q{8q)0v_9AblW>JQ;xP{Wgd#Axfl9q|Z-Y3Ydq`R&g0 zPc}47*Ew0jzitIMFGvfk>5MRT6SIF4SmtaJrrQP9^PBL#Ndd+l1@o*}1_~JB@UD$_ zwoB6-%l)17Wf1K$8QHPJ9EO=njL3Q|+%2kRg>GFRAWC<(*bYXttEH8W-(|yGzLMQv zr=&xI%^zRG5OdMl2DmU>5GE!_K4Sl(NP!Ce-|me>a-#Yefofc}^tw9YT1sfZ8pp!r zsJ(o=-%#|=>tHd3r7QDLHCg~^MvUBH+^0n(U~jh9Jfvc-v;)Q*x_Go6P3W$i5GdM~ zzb0_#k~6N-x3xXqlj*Lo%l@i>4~*hw^5oA=`*dc%_)>UTQ$uN!3*j8ibIPm^I}ol( zDdOSUKA{)Dsr+DSJZH8vQ}XxL_#a<-rZA$Q+U;XzBE^@9TDXWh SylEH;|6F~uB3>i0NcJ7`e7-?LQ6*pIS#9_MhjFQ#VatSL5lA-uaSggK z( 3l(5}J#H zp?IiNX>1mvJz?+2;sSsd;1ud00-8&fu3 ^nYRULFYX7oqed4>a! za99#_Q^?Smy3 ds=?b9i7OPXA+e54r&N<*=wb_HN}_Tq;tXw zcJ5y4Km$IMlX@E=W^qPS>X~xNJ&WvA@(!m}<&CqQ&qD(|F#e>PQGD6xVKv=tjqHlf zOXmX&!yE~KWo}gOTb;*ft-*kq>T+AJ$oVuG*Pq9b<9>dHE1;-1Sb%h1k;g8(5_%0v zB}4)37W*Ua#84);LSui?qO$7~bI`H#tLxns)`^--&c;zC-hi2M|K3EYZ`)s`w`Wm- zUW~aT2ZvwqXd#z_o)iGo{T*>{&V2qb!ZKpVM8)NSpi1MG7B$24MsRDFEQ3Pe{)5EB zs(#^)&fEsal5Ji+PXI3^NGclQP6ATT0Mu>)>7pW7pLwr0*j$M4HER~6GkU^L>uT>t zBmxC-sh;u(Zp-SjvKtqwpV9@<>$uk<(6r9&iR?dTYu@km)x9Cv*pfS&FD0J%a*_<0 zBHHmP_oJKb%ez${`mxbsE%&Kz>qtfbq~tU<6xw_(75dHL1`+6&+I7mP$D=dpdY$~t z76Eje1bS>sS8Kg%TE##q6M_| Q+)ZffaNplFRS2;sU7CPlS|zXdR ^%`Uf7!{+~mYLIL3uUET?v1 z0z~{%%EsnM-V?!0P8(ND6@E!%J{eZCmYP4)S=dC8E72b{(?#fEL{wj4%r3`cYttbW z!m11lH!P92GJX-2WCtphiMxnf4gpBjQ5xynpAeP1&Kd<(Q*CD=kj(vj-KVQOMghXv zi~sEXTOQ-Fyrx{@`t`?@ %SrGF>VxTNj^xnAiOf?%VB8* z)xP5gfZ6}e%3$|G*>3=8S4f8Cc`WmqmR 4fHO0D1ppS0 oGmoGzHr z#8MY{Lzr=iE(O^1v!o+wnGe>F_M@I%=v5O;_+-idy8W@;xjvo)+R#p3+26*X+JJw_ zwEqLZcXM$&oor`3poHxYmkE-7X*nGI 18B(I Ho(o zj|62gYtqKj_xO0TsSB|SxS$)L=GyyI{EL5syCm;)9;O oNTQ)pjHP*tPSW zeXw^<$=vw7@3`~@2+}#_n xIU0O1sJYhbOzJ1I7K_B{9C1H00OGU)W{cmd_G}{kY zx)t~ldQifshn9@gc74bhm&Z?4c9>Z2%4{*mB(Vu{&&ea_nExWLUXN)366x>nsoLCl zO%IKyckDl|iUN;$8PW2gToc@-;%7$ao6krZN83k3K;2}l7)S96j T(&jz=HYTa6m*PqzPK_Ik;Q;a>#wW(FRWbX zsgX?0c`(p i?JNIp7fpGY4hQuSHlTk8UqM9lBC7dOnR<)9`RuNJQ&iz8Sgz z!EuO=WJrFW5Bf&_g#LeF>?;JPF@an~hjpX43xFZ>>8paWnQ4vSynJ(rwPBj>Npb6U zgPp<=^EOXc^!wfWZ} DI2G5`u?3HwDAs8mcHs{6?k0-(&^On-zO z6Tn2lH$ey<(9wGg+gSrakdB&)!Dk IzjGJmF{Zm;TEvTBRZpS>Ax9{dpzNH!t^iBa{jhYcxHqW3Z^Dsh)GOvbl|=aM z5x;NucLsU0{Rh^R@8LX7 %V_~pifJL_&*_EBbxF|v z;_x_P(BcYMxMD_Fwtwo0K`L2dl>{vfBH0ZMU;+>a>sjHLsR2ijOq&=h6Kgjvt70H3 z3QQ&F^)$5cLCf?CIp^gl+u$V+JB#7+$OXjSK{YL>koZ2$PA=_Yp5kW&p}fKPOxuoR zNPPB#hzg5RGe(9LUdxF4IoAS6D5EViO6BXd&}7Tyn}!S5Nb!Gr0sP8b^NbIW(Fr%w z>J|@(2FomW-yM#X ICv2{+{n_nGR=bwMxgiQI$H6%$7#dJCXWAjj=rf3(dl3f+a6i*wIG}=Fkei? zFK=kDw}qM>eau_*ci~0< +XerXZaBRevSN}DRvPGNv zqr(FnLhOjTQ!|O42bxqUeJ8{!e;W3t8<|?p3Ew^J#(^V(lU0uMlN+~pyyE1tmi$xb zhd(n~zy{@7TXkgZPNQp<&wE`wd-G~vOI}Dn7j3RgHZF#DJgZ-P0wOwxathq9<;si- zME2A2POk(*M_0#wB19m(;oU*r*L6 Ypu7Yy>Y#0?*+Su=LYnTWZ)j^e`G+_uR#u^J@UBBuz*O-JHCTejeAE z!AGqq>P~J$&)zOy{P=5GP{9Hf?vQc8I8g=SyWg$pZ`m195yZ%XGC>nIhD-$@BP1b0 ziL!H;s@;?J-(>@ ?F z>$bkL*2q(k9NyOiFDI$3ENLq|Rr{>$@+1fg)m!#lzjX0JXC{wR!4}?u1p*(FoD+Y} zGJ>}$92ecG)P|;EwE=kb>Y2Lnn{ZtE^PzXC&u(X`Wu?rABif&@) DV1usq+{p&qRBkV@f~Ge_8*XUOU+aq+;A(}&S9RCv;8E!(LQ1% zX~xvdiYA*`)~YVsKc?5zc63{x`ZA@}=W!_=)6*fDA#Fd{mH!1EMf_;ON$ DyU#A?{=Ptp+FQ)X@!#H^)Fm07ULQ~t#RruTG7*# xz6i4iCxT}% z?H%}92gEAG6rq;0_WavnMx+0wL{5{ !Lu@P>5#IW$$(Y~qk*U2WHC(kSZ4i-p{kKIy($zE6uH%$E61qT6 zUo-4u1U1htT QvP;xmh}m1Fh2(|DNW->{c1|qVtv*KVxdNOko|`El`xc4Zj_4_USuAP0w&q*H z6DbKXqngM!Nax2S&F1LE@w(vs?Gu5>)u?RY3D#-GPRJ!T==qN?G8td!;kgqMI%x== zT%^_q#47zEaUwk6ivvaF<(%QFsZK_o?Gz*LnjnmWL-ffllCDa4<*rKZqTU)0hE`-& z`eas$9_|KZ)kCZi+(C~V{;k>+PHLsQiJYAupH*ls6J9~x4ZJ #=g7Hj3?YmGxc;KZmZ53d%sJ1aR`d(LOwHQ!@@{V{Mj{{lg!7CC;ZJgujOI3Zpt z)tz*@R2D+#;ybSJ^u}8>K=D5B*@|^#S87Mu@yW@yQtB&(jO8Nk@9iP#+jG#T&ke0M z>EKGCC;yu{D$kzziYQ>Pn!Qj?$@x-EJMNt4azGo#2Ya?lq7YZiPR pjtun8T=RGonD1=JS_-)wA7bjmfoHta9}lHh9sj_5SZ z&!B4;AIWqv(^IKUwbp~7mfyFuV2E*QveoZx0nu-pys^5M0>#=|ZCpVa9`ILX0w4E> zgfin)qZ7XiY lrq{k2|Aa>1gpiI29CuniQC $(oX*@b!AwWnQ%qd zsN3BrE)J~ cM!Qzd>;4xz3dS@ni z#*Y2Vt^bI7gjYWkM!o?ySo#M94#qv8@?wox^I?&gzOb3xQkbytEPz Aw-b!`{bGIyoAkiKhrYIB3+yKD{V _A9_f%wk$2n*66 zvM@3|9jE$EZ8@f0vvqHvuQKws-ig1(6^hzN>+k7{IT|o_KD5N+E4{DW7(YP>nO7~Z zU*5D_;RJ%pRKyZY>5b=jV*;62%EgZ{TY>4Y!VKN;7@4uh`TIaLa`{Kpn_8Y<**aqZ zmk%Zdu4f)?IXyKuSfmbQeF+|2*9#+vnLCVCtXxbv*L@36%=M^btihERt;)SLYzFT_ zPc=;ktqxAFc#u6$yeB!~D1Pa0>|Vz$1ctYIZKl#dDR{r?Qzv^{XCN44S4zQk&E^9u z38Po6D|S9av&(BpUEuja>a;hexhqKvSXK$6qsmAaf=P$%Gf3zp-gx0LcRl3Lff>A{ zh8r}8Zo3PseD+P}7%!N|!^H6|=1k3; lA}|-t ztJDwn`Lw4j-2}4%^8{-j8ZN$@@^fZ^L)RC|Zy=c?N@^i_IGggE{~ujn9ah!0?!9OP zX$fgWLXc4DmXvN$Qb0<&djZm|gdiYYQcJqKySux)`y1@D&%OKJ@7(9%4}s-kt}(|P z<5%xHtf;Y_1P6{fiPKs7z0gY?X{dH^-Duu@e(wZJ?&KM2;+~*lD=&Eu8yl%)e^!6q z=0xKW+fv>$Pejko8qWTxj`SJd^fW~*VZ+`m(FprFu--(CMokbHOxxR<%Ct0mWmN~Q z^}Dy4c%W^5t%z3?z680(uaa{-c5wjyqI !pP9Ru(!x3pcp%?QKdd;7-lh+ntyT2_v;$LdTDh)tyFC|+Kw?mNS}*YTbTkTY#y zl-V=ch8Hm7$snke&PYXQ3537yrgS^`{h6>%{2+U{#^vSDU^MZ8W&97S+kqi`By31h zDQ<8lq6YfE#$L9R%FJAm5pBmL(^YwI>+MbnZv^0NLVIUF@N()|d=vps@e}o6hk1(g zH}y^o*y7SBl+_2LP3yXOTJILVHE!V75_fCez7@GdhYY07Lac0FBrxTouYYtk+cz}( zAam;1$~2eMKeUBE;(D$+t;z>|;b@WAz$Z9}qDPPNTBkSSN;{~?l1@SH+K%_5g!<=9 zqX2&Fw;Aev!+c{co4Sz~itzJa$kso_Us2EvmTw}?(_?lV8Lb?$9N=TTl$Y=SCP=O0 zw0}P#e{;6 aqR`cJ~_${ zo$_zyf`{tKOGcW?HvDHfY62qA(QCjM0?>R=$?Va_evE=)OY^PunyCw#^YIH|PVZ!L zMQQIyK_XVioM{t?-fFjGHXHA$ioQrUxws;gJ2+St8V*dnp>g0lz_2=>l}#run6y88 zTvBt)o_`3fs6L)>pMoQ0SVq>$Ykt{9{_csoMU%(l@9_!E0wZnZ1-thuJ5Y|!{j5j* zXp0`@K4UK$NcC_o=shh<&u@n~wh`yh^g`Hz;2Ai#z6nlJLe;Dr@SOQ%F2Y0Qk;*bv zbC^ux@mv@Ja^PIQ$wC9fu1KCX6*s$ E4Xr9{d17YJStv{ $@pU^wr~2EJ;Jq2lPCd^p$(cd6y_5F0`xPBm<&&=Uteu;E z+^5c%bzOBIRFn4J =eP}v1aPu etv^G7nkAaCBVpao>TvyFiEvW`9i2`46dPcWT zlmyL0RQ8V1)vt*x;lXGRGxnYIfBLy-dA3aO#KxV)09DpLjBl2WPdCLcI#z=Eg#1FYeU z$vm6n4X#R2+UN6yo$CTVOv^U0y(iV@{PjwWoYs1+)UJL@t|#BL19tZb_OWg|souW` z-SP<8mr-o3Sxx &7CKpKrwQ2#!^D+@cH%6`4IvBg(674sgb@c<8bqI` zYkF5@?I$lCQ7A&ck4GB;mes55=sDf=PG>sR;Y?mq=2E^&=k{2b+n#04|5qNB%?)>p z+_luAU2TopqWjUQ#BcXCIR@rixWm9 uu9K%Mxru1J(7^=dN{#|_E zJhT=TbVn<^7Wa6vyJl>$Lmx+o5d7q7wV}y_E9xCo=kg9yB}`0nv+aU8Q+RxWBtCmR1S?w z)ODkXNrjCMPK}MVMzp|SVQk;*vZcS--dbsQI3Fqb1mfk5X?ZlUM~5iAn7%EbgQQt5 zJ8M^
!V@q2KlcKB3jTlD_6MWK= uL(3f-WIgz-vSy{ zyj`bf&YdNeo`<1!Dhq?@IBnUy{iRodANDVCXs^Uh#kEvk+?pB=kS%V1OCzfQsfv7q z0hJ09n=an0K8qJj{9he;&On^-!8ZSQVI9f8GtuI>3htOGjcJlHm2gZETmz~P2LOrE z4VWP00DU3znthJ+4Svk6XW|>fRJROSjtgfoaoLphke?UVZ2Yo~7KO_7GG;xkh$!UM z >tXl^rd~9AIPpila*E*9!4fu3N!j z)w(fL*ITdr)hFD|zwGDUYZ^SbmT^40%1{?)%LC^(%()*N-J)+BHYX_P`IXk9mo1@f zn_C|RTL8ab9?ozj3;qQ~YP<6NEa;M Jz=-Nk- zJueeEbm*K4t*Dr-=^tjYP5#Lp8#ENn`@BBs`HfrbMy+C=zRb{kXR_r`@Q;8_&FI$h zsqnhmQ;#=n@$bD)PT1};THB)$`rdL}XbnV_yF& B#eV!L9zs718E>4` z=Qt6%PkV&P1DA3AN UfcCN|Y-=S#P1cjI=HAjGA_7n;k-@DtorfS-72pdO{%%@Y}^T76K)o z8+>D(1l+fe7YucKD0mx=Y(K;28ze`Q;dN8#5`qiu*#Rd*^bZr4KY4cFDHsqE2hWu* z==3yeF1}qFNmw-Om(N@pi^Hx%5k>9P#XFbg)S&_ce1h1v!XN=UkAL!UsXMo5q@6o1 z45Um#_lh{_yB@x~Rp<$Zw&&+_J64G}#C7C9$P@G;IElMV>A9BZ5rAg1PcR^=tPK)? zuhsGLI_a{El1fSE1ajs@3J*i7dA}=tMwRA#r40Ew769^sw`<^{&A%G3o2^^#w&`U3 z2lAYG*Q%5He=$>Gi6pu5`-)MG&8F9ZNWz~9dsEir%khuoWh%*a#3)o)g?CC=ikAtM z3mq(IZI+^%syrcWW24%p-!mg)hbs6&{)>>)0jl-=`?>;j@cfU1Io$Mf=oS7*{Tb?S z&U??J%gtA}F&Ebut-VGHUaVm0pST>b_wfs3R)1sZn2h{Qr`U4=hYnkC*>r{TWh1y1 zzRS-uHRZ38`t|ZOMD1285wR!&?T4JfWbi@r2@K&0A75m&!WQz)EoxM72Hsa+8*c zP2&2Lm*S#|6QMTRvf|zqQN_Vp2tWQp6_6_I4c@3 3C}#95+3-;*XpPY}Pb_{) zA61)l89rB_{ahC RF;01_ow)+-l)E*s>u?{7NiMxv)m(4>3ApDj;Lkq26l*+rn#Z3=% z5eVAyw6)2DK`(E#-*8wZYiXCKx$QF(7HM19=Zsp3507-)bp*0W`jOu}F7K^iw)>h< z`h23S-H8}56eLg6I0?u0i{IG0W&TQ+WWauQ*+sqbzK71b&%UKiTij~l-AR#@TP>!+ z_`c<{`Yrw&cg(CKK@a(r6?D+ePs4_BE@SJ?WP+D-af(*;T)z3T=ke*Lhk*YO+w1(D zrN?zR&sqDo)iDIg7}UF&*m!-MYb5tlU#ds@&9+lHs6B?5`-`94(Vq&+q*{&_y7Gz| z`W@z<)OEEHAzUkvP$$qiYGaybiJ!zMx{;jJZXJAN%8-@sUeeg4KCpmru0>qA_)S bSie{osVL zmFF8=_cJ53x3L#Zh!c!=xO_C)78t+s1?(5U3kW9R1R)FCP*%uY7j$El|E<^dgzv2! zvv0A1Jr$N|`0nfjf}8tOF?u@qz&^bK%5u356w01mb<>}g(<#!5QUs(9VQ76-jF~}l zcH4HlAh;e3`_u6&zWqLh!aPQNZ-&py8JddKqJa6iE{^83_KCr~TynyiMqZq>DMmSK z*c a3<{3;Fh7l^o{ z){veQ3{S`m&mr_Xh7117aMMH-O5MkXz)OVq_%V;(1bLKwd8r~Xn8T(*JVSpm#)(XK z`R1siKzgUZukjFuEa}c7wkPe}R4n|#|6>&YH+nldzk8x*oZSBI*`b!Rb@h7|1Lhq0 z+)XXzWB$|Aja$15Ewk=xptxsgUOomr+l?QS3NVaLPI4OXz(ITqawB4$Ran)XNQhX! z4k%_tByv`}Gi>lA2We=MQll40LwAM0+}{+}MsWFYzL!L2FZ)B&cg5q->oBx0ux~Jp zz4AhJ=4f%HX6!W+(ODSh%Ho<-tY1S1oWl9etU203iB-+)`1@|nXtC+kwEYoD_ctOp zS=up4!@Xkjif&jXWW;igC~gIWH+#+>j?Z4?`es-7mgKx&jH*n}bUs%#`K#-I@yIIR zy)lU6RCXgDLYNo_@oG^qc~VwRz{CamvGh{U=0xdqKxj1@6Djp5b^<#cv~65LfDEY2 zZ~ tF8Qm$>b_EnXge0Y @=xKS0#bfEFe5dYVDQ~ z*nI^NLnSRhAmJLNJe);T7guz( DV~P6o*ORpa$Q=zd&x@n&gZDvFQ+A1; z$ItMdnBtbb@Km!7ncfu3p`c6^V<~BqW|C%~By_?)$12_t0hRHbZ8QvW*;af(+S@tw zk$R{5^(syP8+o#r2^A(giT|^q_`-eH)=`-}0Gq_oH%7-Cf3( 9;S9!_=x+WU!xv z487StX7<* Y^I)f|Kcn8d zKV!6fJ(MQjS}HSioJdu@QHs0w8NvK~*nam|)#e}Gr218AJ$hsvv$thnQUeOK$pbU8 z>QyL-ogx9E4mz&eY<%&{E1@Vrg};#JBQ>1=mb)qVFqnM)AU7!iX CYD6dB OzyHP@diP4rO wS=sL$OSj2Si@IhUr?=#T-<2ta^bQqYVfYo3=Q|1QO0QQ`J_Xqh8GzJ)C zIW>2>RXWSPHCn(91!}e7V0zrW#aDj}prxvx6eYTnZG(tFOY++r>oFN^=qBuBW3YB( zA{$R`;b&ITQuF!zGE2W;yU$^UYyrbV@L|vnG)iUJ4;{ni%l;RgnDoGtaNzK|YYqsl z$IZ`c*KX(8($=zDMB+Pbr~6oD#*Ki<`*@!Gt@{34?PV{_qqQ4W(}YB*(==RcWP8uD zXRy%VWzG!RAoy&2;n^*DRPYmJI-W`MCvt_{;Nt}lYQQDuzyu6{gNd$uhs;Xr1_g`O zX@j*W>E_qKK;eb~e}~%*Ef5ePqV1X?TD8$LN6wH3kXJvhn?CQFlFt40OqCe`$43|> z;js3`iBi?if{EUypEX{NkDGd`t*`E56Y~%-B~X?-VXmE>B3@xpTXlT8x%G#807jqY z(;yu$-SFv@=a*{X0}|b+7_ez?&yu7PCEaH>vyM+Kp~0c|SA=SAtAascp?r5-@AEV} z_o4gwUR<_gk(xG#tqFEZfq7chW$8CymItr|^^qt{(tdc~>_9$l@fiNUaI;?TKX5Y+ zF PT~Ef2+k!f9D&8g7l0EF?@bL!+k3{9T{CiTzf$S2;sCMan zQn5#MQ;V_`=Nu*Y&aFwsVa5?dj$_iSvU;188~WPi+*`2`wQ#tuCrn3%hRu!*{8K4g z#H@$LclRa^Nn2>NrxyM|^(<{idLFLfVw{d>n;`n+>CJcu$t&5&xmwqK`yCj|ZD@Vn zNqMS!;fD}SW(}o>vtL>WCBe3xLs5;S$- p(^p$xsLa*f{dl1 zdn!IX_}|>&_ fKIcm)oL2hC{sTu7xe4a6a{ zpw$)W)Bcpq)ovCgcH7PPQ3Pz9O E0P_RW#M)(=q@l*0Z0v!+jLH)O>^`*{5K7Oc}B;K z^R4Yc*viduuAp)DF+8kq(4s<|V7h~#3Uk+t%ps?WUd#3zt-*eW10}Ne=_@_1^4Tj9 zi@Uq?-}$D7`NH5aUP6Cxx_Ye@D=e0iO~*U*p0;Yq`YwlY);$_MYqf}HQX8(-6VNEo zzG7ltnf+FRFt%>)DDjxMr5TIA<$l%{3s!e_ shf)so|);@k(;-?Q$r(eQY>Wg7L%lc_EYc|9PTdY6>+B5CsnT^Tg zvZx_xp8Mjcew_-!-3*<2=*^vD{pz9wx$asX-88!;xaw5K%?Kuy{{#w7+tPe(^_F46 z!9VawUC (#5 zHs0gQxv8uyhCv`=_}yN4&oADXhl$$MaB4;?qUG*R72ajZ@3WuWJb5=9Y&}#;6a7#H zXUDGfIyuLE&!P(f2fzqOjkU Q(DCh&S6_EGRdRB{Krf}eEU>#vHW@8;HQ;EJT@X)6|J9-J$u2`k9!{W=9D zAzvl>46m^Roj~YuE(-TrtUlWQJ>Rtnr0y`^5_}Hsl?Ct0lL+aGlZZAttR&YvB#X=a zdkcEC=5ZrRhhC0HnGZ8I<+p8rb%R!&-p5E3x)2hziNrUKdv`g?oh4SJtH-)@Bq(X^ z^7UWA3bJ!C%K4|PKnzKkYqJ(bDp%o2MoFsYb6{iM+=k6 dp*X z9r7)luinIWM _fe!&xYvVS?vE27xMZmBt!;S7{x};gWRX31Xd~rm`Cj1 zxRWiRs^%F2kl_N4E~jbs7j&B?WvU2j^Na@XI =gxna;Qb%da;-cWU=LBH_@+}nkZW3!&=K&a z1M~vW5wpB;_tf*Zy#X+$(VrJA80{LOTh_HBI%&{=$TDA= 2_=L#Xue0vagHt^S3w6H+ot5DN{)$y0cJsw@B7YtX)|05={xJ;`I zJ?w?hk0Z@W+)86bxLm&w_7=xY;``Nc7&%x?QKL4sh8WHlIIs}ek?%GhUoLs92>t^X z`}DhBSHF%9Tl)G9*ALZYp60lMw`f~Bu0A929zu+{&tI*&^n`XlBpQd@lQ)f7=Hy-G z-l%9o85ec4bj{}%w2mtnQDHZ9AO`YPdn~vmY8(BOb&QDtEqltY_I=%A@icXEQ7}Tz zL< e~NLvb{)! wwvom4y9}DIlf0z0-O7;#s>qG9}x|6M);+(qcd&^y@=H z0VD#P4ES8$JcOFT_u-ZL`c(TfLmq!l$2vy@Z0WiP9|UE{-vN*7@P7Smb0d8-^|v=Y zrf*F{q>H=fOkSJY+61qEU8Cl@_zdeqkO1=L=O0enbZz|!VTFfyIeT|#s^{8bdy(aV z;YmSgY{=*Zrp3Eu#gh)}8C;c7j<-@c0$(0it{!JsoipU@)do#vK|?Cd$u $WRDdT371C^Tv$T+x8sb`(z! zS (jR*% |CL}q?e- =V&%=eCW&nE#~v=)K3&WZD3Bt$DmjJG((~CO+9{;Imfo1JX+b$s zRg~QH>Nu|IN$@h;&M`E32w2pUmGiW0pC30irgcDH!&Ie{D=b9jsy!I-wbh6hcwFy1 zUDi!pOD5Q&%UX|)o*w1S(Q$2vs!)n tSQnh5*7Ak sDX=DNr7glq`kIUY4HK`#QT}HFLLZo( m;IJ9-80^sQS_m(Jhb5}oJfGzRp+60Je7xTC0E(dQ>sp>YWEQIg_*etG_AzYc` zxZiI#@NpySc>scdC<_*sJ5D(+mT&Qs5Bgqxjr8w@eqKO8V^8>3!hvoS?`X*NY-*# zyWCjGrAtxwy0YO@Q3)MHr&)Jx1EwPq0z7gDAj@Y|7=}&wz)}@dW^E0MovWk<0Z;}p z5T*MmOY2Zl5F)8ywkS(%@Wk;6 %hYi_AqyYACRnAaI_{~OPadP zpf$uQwd3-+J-1*6LY5 =Op>3htwoRUxl2@QhR64R)43#n2$ooUR6Y6pX?ECA!TK_szP@9- z>rFW HcTt8dhmV#YN1;qyCU5zn1;96c)sT;=e1EKQBaPhpKJ;ohvx- z_|TMIgf cgx0{W&e`#C z6Am7Qy*43~;AO3EljL}*o09Tho_>Dq+?dstqr (=;T-xGP!^|!ZfKjgX>JDBTTYsFA(e0f0XsouclXW+k|Gz{n6 o0y8BCQxXNf6|GN0PKj04(Ihem?$wjQ)Z2JR< zt!UEpyio8DM?2Mrk)h%dZAVgx!>ZMwI1$B)%1rZ3bxlfRb8|=58#il~9C!He_sf+0 zLsQVmoZ)9PK`*eIt8kDWaV4C){S+k_P